'собственно сама функция - ей передаются по значению аргументы:
' 1) текст для перевода
' 2) язык, на который нужно перевести
' 3) исходный язык (опционально), иначе - автоопределение Googl-ом
Function Translate$(ByVal TextToBeTranslated$, ByVal resultLanguageCode$, _
Optional ByVal sourceLanguageCode$ = "")
On Error Resume Next 'игнорирование любых критических ошибок при выполнении кода
' переводит текст TextToBeTranslated$ с языка sourceLanguageCode$
' на язык resultLanguageCode$, используя сервис переводов Google Translate
' Application.Volatile True 'форсировать автообновление формул
Set ADOStream = CreateObject("ADODB.Stream") 'создаем экземпляр объекта ADO.Stream
' часть ниже преобразовует в UTF-8 без BOM (хидера) текст для перевода
With ADOStream
'кодировка - UTF-8, режим работы - adModeReadWrite (чтение и запись), тип данных - 2 - текст
.Charset = "utf-8": .Mode = 3: .Type = 2: .Open
'записываем в поток текст, обновляем, устанавливаем позицию курсора в 0
.WriteText TextToBeTranslated: .Flush: .Position = 0
'переключаем тип на бинарный, читаем первые 3 байта (таким образом игнорируем их)
'читаем в переменную остальную часть, закрываем поток
.Type = 1: .Read 3: ByteArrayToEncode = .Read(): .Close
End With
' Эта часть пробразовует текст в URL-Encode
For i = 0 To UBound(ByteArrayToEncode)
iAsc = ByteArrayToEncode(i)
Select Case iAsc ' переводим текст в кодировку, понятную Google
Case 32: sTemp$ = "+" 'space
Case 48 To 57, 65 To 90, 97 To 122: sTemp$ = Chr(ByteArrayToEncode(i))
Case Else: sTemp$ = "%" & Hex(iAsc) 'Chr(iAsc)
End Select
txt$ = txt$ & sTemp$
Next
' формируем ссылку, по которой Google выдаст нам файл с переводом
URL$ = "http://translate.google.com.ua/translate_a/t?client=json&text=" & _
txt$ & "&hl=" & resultLanguageCode$ & "&sl=" & sourceLanguageCode$
Set XMLHTTP = CreateObject("Microsoft.XMLHTTP") ' скачиваем файл
' Отправляем GET-запрос
XMLHTTP.Open "GET", Replace(URL$, "\", "/"), "False": XMLHTTP.send
If XMLHTTP.statustext = "OK" Then
LocalPath$ = Environ("TMP") & "\google.txt"
With ADOStream ' перекодировка файла
.Type = 1: .Open: .Write XMLHTTP.responseBody
' сохраняем ответ сайта во временный файл
.SaveToFile LocalPath$, 2
.Close: .Type = 2: .Charset = "utf-8": .Open:
.LoadFromFile LocalPath$ ' загружаем данные из файла
Translate$ = .ReadText ' считываем текст файла в переменную Translate$
End With
' часть выше написана ущербно - можно было обойтись и без временного файла
On Error Resume Next
' вырезаем нужный текст из ответа, находя параметр "trans" и "orig"
Translate$ = Split(Translate$, """trans"":""")(1)
Translate$ = Split(Translate$, """,""orig")(0)
Translate$ = Replace(Translate$, "quot;", Chr(39))
If Translate$ = " null, " Then Translate$ = "Не переведено"
End If
Set XMLHTTP = Nothing: Set ADOStream = Nothing 'очищаем объекты
End Function