이 함수는 EGTools에 추가었습니다.
네이버의 파파고 API를 이용하여도 번역을 할 수 있는데, Google API와는 다르게 API를 사용할 수 있는 권한을 등록해야 합니다.
여기서는 API 권한신청과 관련한 내용은 다루지 않으므로 네이버 API 관련 도움말을 참고하세요.
신청이 완료되면 아래와 같이 Client ID와 Client Secret을 확인할 수 있습니다.
그리고, 무료 사용의 경우 일일 5,000자로 제한이 있으므로 할당량을 다 사용한 경우 사용이 제한됩니다.
파파고 API는 "POST" 방식으로 진행되고, request Header에 다음이 설정되어야 합니다.
- Content-Type: application/x-www-form-urlencoded; charset=UTF-8
- X-Naver-Client-Id: {애플리케이션 등록 시 발급받은 클라이언트 아이디 값}
- X-Naver-Client-Secret: {애플리케이션 등록 시 발급받은 클라이언트 시크릿 값}
EGTools에서는 Client ID와 Client Secret을 Code에 등록해서 사용할 수 없으므로 InputBox로 입력을 받고,
매번 입력을 받을 수 없으므로 PC에 저장한 다음 사용할 때마다 꺼내 쓰는 방식으로 적용하였습니다.
getURL 함수에서 Header Key+Value쌍을 Chr(7)로 연결하여 처리하므로 여기서 연결해 줍니다.
Header = Header & IIf(Header = "", "", Chr(7)) & "Content-Type" & Chr(7) & "application/x-www-form-urlencoded; charset=UTF-8"
Header = Header & IIf(Header = "", "", Chr(7)) & "X-Naver-Client-Id" & Chr(7) & Client
Header = Header & IIf(Header = "", "", Chr(7)) & "X-Naver-Client-Secret" & Chr(7) & Secret
"POST"로 오픈한 이후에 아래의 파라미터를 Body로 전달합니다.
- soruce = "xx" : 원본 언어(source language)의 언어 코드
- target = "xx" : 목적 언어(target language)의 언어 코드
- text = "xxxx" : 번역할 텍스트. 1회 호출 시 최대 5,000자까지 번역할 수 있습니다.
sText = EncodeURL(sText)
sText = "source=" & sl & "&target=" & tl & "&text=" & sText
request에 따라서 API의 결과 오류인 경우는 아래와 같습니다.
- {"errorMessage":"NID AUTH Result Invalid (1000) : Authentication failed. (인증에 실패했습니다.)","errorCode":"024"}
- {"errorMessage":"NID AUTH Result Invalid (28) : Authentication failed. (인증에 실패했습니다.)","errorCode":"024"}
- {"errorMessage":"{count/quota=10213/10000} : Query limit exceeded. (쿼리 한도를 초과했습니다.)","errorCode":"010"}
나머지는 GTranslate 함수에서 사용한는 것과 동일합니다.
최종적으로 구성한 함수는 아래와 같습니다.
Public Function NTranslate(Text As Variant, Optional sl As String = "en", Optional tl As String = "ko")
Dim svcURL As String: svcURL = "https://openapi.naver.com/v1/papago/n2mt"
Dim Cell As Variant, sText As String, rText As String, ll As String, iPos As Long
Dim sXML As String
Dim Client As String, Secret As String, Header As String
ll = ll & ",ko,en,ja,zh-CN,zh-TW,vi,id,th,de,ru,es,it,fr,"
If InStr(1, ll, "," & sl & ",", vbTextCompare) = 0 Then NTranslate = "ERROR:Source language Code invalid": Exit Function
If InStr(1, ll, "," & tl & ",", vbTextCompare) = 0 Then NTranslate = "ERROR:Target language Code invalid": Exit Function
If Not IsInternetConnected Then NTranslate = "ERROR:No Internet connection": Exit Function
'// 언어코드 교정 '
sl = LCase(sl): tl = LCase(tl)
'// 한국어를 kr로 입력하는 오류 수정 '
If sl = "kr" Then sl = "ko"
If tl = "kr" Then tl = "ko"
'// 중국어는 zh-CN과 zn-TW 처럼 대문자가 있음에 주의 '
If sl = "zh" Then sl = "zh-CN"
If tl = "zh" Then tl = "zh-CN"
If sl = "zh-cn" Then sl = "zh-CN"
If tl = "zh-cn" Then tl = "zh-CN"
If sl = "zh-tw" Then sl = "zh-TW"
If tl = "zh-tw" Then tl = "zh-TW"
'// 상호 번역되는 쌍인지 확인 '
ll = ",ko_en,ko_ja,ko_zh-CN,ko_zh-TW,ko_vi,ko_id,ko_th,ko_de,ko_ru,ko_es,ko_it,ko_fr,en_ja,en_fr,en_zh-CN,en_zh-TW,ja_zh-CN,ja_zh-TW,zh-CN_zh-TW"
ll = ll & ",en_ko,ja_ko,zh-CN_ko,zh-TW_ko,vi_ko,id_ko,th_ko,de_ko,ru_ko,es_ko,it_ko,fr_ko,ja_en,fr_en,zh-CN_en,zh-TW_en,zh-CN_ja,zh-TW_ja,zh-TW_zh-CN,"
If InStr(1, ll, "," & sl & "_" & tl & ",", vbTextCompare) = 0 Then NTranslate = "ERROR:Language match invalid": Exit Function
Client = "esNE1q9ytPHsEIFIioPh" '// 등록된 Client ID를 입력 '
If Client = "" Then
Client = Application.InputBox("Papago를 사용할 수 있는 Naver API Client를 복사해 붙여 넣으세요.", "Client")
If Client = "" Or Client = "False" Then
NTranslate = "ERROR:No Client or Invalid": Exit Function
End If
End If
Secret = "tCGGW000mh" '// 발급된 Client Secret를 입력 '
If Secret = "" Then
Secret = Application.InputBox("Papago를 사용할 수 있는 Naver API Secret를 복사해 붙여 넣으세요.", "Secret")
If Secret = "" Or Secret = "False" Then
NTranslate = "ERROR:No Secret or Invalid": Exit Function
End If
End If
If TypeName(Text) = "Range" Or isArray(Text) Then
For Each Cell In Text
sText = sText & IIf(sText = "", "", vbNewLine) & Cell
Next
Else
sText = CStr(Text)
End If
sText = Application.Trim(sText)
If sText = "" Then NTranslate = "": Exit Function
sText = EncodeURL(sText)
sText = "source=" & sl & "&target=" & tl & "&text=" & sText
Header = Header & IIf(Header = "", "", Chr(7)) & "Content-Type" & Chr(7) & "application/x-www-form-urlencoded; charset=UTF-8"
Header = Header & IIf(Header = "", "", Chr(7)) & "X-Naver-Client-Id" & Chr(7) & Client
Header = Header & IIf(Header = "", "", Chr(7)) & "X-Naver-Client-Secret" & Chr(7) & Secret
sXML = getURL(svcURL, "POST", False, Header, sText)
'// Error Code처리 '
If InStr(1, sXML, "errorMessage", vbTextCompare) Then
If InStr(1, sXML, "(1000)") Then
NTranslate = "ERROR:Invalid Client ID"
ElseIf InStr(1, sXML, "(28)") Then
NTranslate = "ERROR:Invalid Client Secret"
ElseIf InStr(1, sXML, "count/quota", vbTextCompare) Then
NTranslate = "ERROR:Query limit exceeded"
Else
NTranslate = "ERROR:" & sXML
End If
Exit Function
End If
'//결과값 확인 '
iPos = InStr(1, sXML, """translatedText"":", vbTextCompare)
If iPos = 0 Then NTranslate = "ERROR:No result": Exit Function
rText = Mid(sXML, iPos + 18)
iPos = InStr(1, rText, ",""engineType""", vbTextCompare)
If iPos = 0 Then NTranslate = "ERROR:html error": Exit Function
rText = Left(rText, iPos - 2)
NTranslate = DecodeHTML(rText)
End Function
네이버의 Papago 번역의 경우 일별 사용량 제한이 있고, 경우에 따라 사용된 셀의 수식이 재계산되어 불필요한 번역량을 사용하게 되므로 사용후에는 가급적 값으로 변경하여 이를 예방하는 것이 좋습니다.
Google 번역 앱을 이용한 번역은 사용량 제한이 없으므로 이것을 사용하는 것도 검토해 보세요.
https://egtools.tistory.com/entry/Google-Translation-Service
'Excel - VBA' 카테고리의 다른 글
특정일이 공휴일이면 이전/이후의 근무일 찾기 FindWorkDay (0) | 2023.07.27 |
---|---|
대량의 목록을 한 번에 VLOOKUP 조회하는 mass VLOOKUP (0) | 2023.07.26 |
Google 번역 앱을 이용한 번역 함수 만들기 (0) | 2023.07.11 |
VBA에서 Web 정보 가져오기 (Web Scraping) (0) | 2023.07.11 |
VBA CreateObject("htmlfile")을 이용한 URL Encode 및 HTML Entity 제거 (0) | 2023.07.10 |