Данная VBA функция позволяет перевести текст с любого языка на другой Добавлено 17.10.2011
В данный момент функция не работает для большого числа запросов - Google недавно ввёл ограничение. Решение для обхода этого ограничения сложное, потому пока мной не реализовано (не было необходимости)
Добавлено 07.03.2012
Исправленный вариант функции вы можете найти в конце статьи. (теперь снова можно выполнять автоматизированный перевод любого количества фраз на любые языки) Алгоритм функции немного изменился - но это и не важно, главное, что перевод снова работает. Пример использования перевода на листе Excel - во втором прикреплённом файле Sub ПримерИспользованияФункцииПеревода() txt$ = "Привет! Это функция перевода текста на иностранный язык" res$ = Translate(txt$, "en", "ru") MsgBox "Результат перевода на английский:" & vbNewLine & res$, vbInformation, txt$ res$ = Translate(txt$, "de") MsgBox "Результат перевода на немецкий:" & vbNewLine & res$, vbInformation, txt$ End Sub Список кодов доступных языков для перевода:
Код функции перевода: Function Translate$(ByVal TextToBeTranslated$, ByVal resultLanguageCode$, Optional ByVal sourceLanguageCode$ = "") ' переводит текст TextToBeTranslated$ с языка sourceLanguageCode$ на язык resultLanguageCode$, ' используя сервис переводов Google Translate With CreateObject("ADODB.Stream") .Charset = "utf-8": .Mode = 3: .Type = 2: .Open .WriteText TextToBeTranslated: .Flush: .Position = 0 .Type = 1: .Read 3: ByteArrayToEncode = .Read(): .Close End With For i = 0 To UBound(ByteArrayToEncode) iAsc = ByteArrayToEncode(i) Select Case iAsc Case 32: sTemp$ = "+" 'space Case 48 To 57, 65 To 90, 97 To 122: sTemp$ = Chr(ByteArrayToEncode(i)) Case Else: sTemp$ = "%" & Hex(iAsc) End Select txt$ = txt$ & sTemp$ Next Set objhttp = CreateObject("MSXML2.ServerXMLHTTP") URL$ = "http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=" & _ txt$ & "&langpair=" & sourceLanguageCode$ & "%7C" & resultLanguageCode$ objhttp.Open "GET", URL$, False objhttp.setTimeouts 1000000, 1000000, 1000000, 1000000: objhttp.send ("") Translate$ = objhttp.responseText Translate$ = Right(Translate$, Len(Translate$) - InStr(1, Translate$, "translatedText") - 16) Translate$ = Left(Left(Translate$, InStr(1, Translate$, Chr(34)) - 1), 255) Translate$ = Replace(Translate$, "quot;", Chr(39)) If Translate$ = " null, " Then Translate$ = "Не переведено" End Function (добавлено позже) Видоизменил функцию - теперь перевод снова работает (пример использования - во втором прикреплённом файле) Function Translate$(ByVal TextToBeTranslated$, ByVal resultLanguageCode$, _ Optional ByVal sourceLanguageCode$ = "") ' переводит текст TextToBeTranslated$ с языка sourceLanguageCode$ ' на язык resultLanguageCode$, используя сервис переводов Google Translate Application.Volatile True Set ADOStream = CreateObject("ADODB.Stream") With ADOStream .Charset = "utf-8": .Mode = 3: .Type = 2: .Open .WriteText TextToBeTranslated: .Flush: .Position = 0 .Type = 1: .Read 3: ByteArrayToEncode = .Read(): .Close End With 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") ' скачиваем файл 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 ' вырезаем нужный текст из ответа 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
|
|||||||||

Комментарии
В связи с тем, что прежняя функция Translate давно перестала работать,
внёс в неё заметные изменения.
(см. исправленный вариант функции перевода в конце статьи)
Во втором прикреплённом файле - работающий пример перевода текста на разные языки, с использованием сервиса Google Translate
С октября 2011 Google Translate ввел ограничения на машинный перевод через API-Google v1 и v2. На примере, приведенном выше, будет переведена лишь первая строка. А остальные - "не переведено". Они захотели денег. Теперь есть расценка за определенное число переводов. Нужно получить КЛЮЧ от Google, который необходимо добавлять в ЗАПРОС (в URL-адрес)...
Кто работает через прокси-сервер, не запускайте файл примера - ЗАВЕСИТЕ ЁКСЕЛЬ НАДОЛГО!
Ёксель не будет реагировать ни на что пока пока не окончатся выходы по 10-секундному таймауту для каждой из 24-х функций на листе.
Пример использования этой функции на листе Excel - во вложении к статье.
Используется формула =Translate($C$1;B5)
Скриншот результата:
Всеровно не разобрался куда вводить текст нужно...
Отправить комментарий