Использование бесплатного Google-переводчика
Клиенту нужно было переводить названия и описания товаров. Был использован бесплатный Google-переводчик, доступный по адресу translate.google.com.
Функция ПеревестиТекст(ИсходнаяСтрокаДляПеревода, Язык, СтрокВПачке = 5) Экспорт Т = Новый ТекстовыйДокумент(); Т.УстановитьТекст(ИсходнаяСтрокаДляПеревода); //По 5 строк ТекТекст = ""; РезТекст = ""; Для Инд = 1 По Т.КоличествоСтрок() Цикл ТекТекст = ТекТекст + ?(ТекТекст = "", "", Символы.ПС) + Т.ПолучитьСтроку(Инд); Если Инд % СтрокВПачке = 0 Тогда РезТекст = РезТекст + ?(РезТекст = "", "", Символы.ПС) + ПеревестиТекстСлужебная(ТекТекст, Язык); ТекТекст = ""; КонецЕсли; КонецЦикла; Если ТекТекст <> "" Тогда РезТекст = РезТекст + ?(РезТекст = "", "", Символы.ПС) + ПеревестиТекстСлужебная(ТекТекст, Язык); КонецЕсли; Возврат РезТекст; КонецФункции Функция ПеревестиТекстСлужебная(ИсходнаяСтрокаДляПеревода, Язык) Экспорт СтрокаДляПеревода = КодироватьСтроку(ИсходнаяСтрокаДляПеревода, СпособКодированияСтроки.КодировкаURL); SSL = Новый ЗащищенноеСоединениеOpenSSL(); Таймаут = 30; Соединение = Новый HTTPСоединение("translate.google.com",,,,,Таймаут,SSL); СтрокаДляПереводаЗакодированная = КодироватьСтроку(СтрокаДляПеревода, СпособКодированияСтроки.URLВКодировкеURL); ЗапросHTTP = Новый HTTPЗапрос( "/m?sl=ru&tl=" + Язык + "&hl=ru&q=" + СтрокаДляПереводаЗакодированная); ОтветHTTP = Соединение.ВызватьHTTPМетод("GET", ЗапросHTTP); СтрокаОтвета = ОтветHTTP.ПолучитьТелоКакСтроку(); Если ОтветHTTP.КодСостояния <> 200 Тогда Сообщить("Ошибка перевода, код состояния: " + ОтветHTTP.КодСостояния + " Текст ошибки: " + СтрокаОтвета); ВызватьИсключение "Ошибка перевода"; КонецЕсли; ЧтениеHTML = Новый ЧтениеHTML; ЧтениеHTML.УстановитьСтроку(СтрокаОтвета); Построитель = Новый ПостроительDOM; ДокHTML = Построитель.Прочитать(ЧтениеHTML); ЭлементыДокHTML = ДокHTML.ПолучитьЭлементыПоИмени("div"); СтрокаПереведенная = ЭлементыДокHTML.Элемент(9).ТекстовоеСодержимое; Возврат СтрокаПереведенная; КонецФункции
Использую тайм-аут и разбиваю пакеты по 5 строк, длинные тексты иногда не переводятся. Кодирую символы в URL-кодировку.
Вызываю перевод так:
&&На Клиенте Процедура Перевести Наименования(Команда) Экспорт Перевести Наименование Eng(Неопределено); ПеревестиНаименованиеLit(Неопределено); ПеревестиНаименованиеCh(Неопределено); ПеревестиНаименованиеTr(Неопределено); КонецПроцедуры &НаКлиенте Процедура ПеревестиОписания(Команда) Экспорт ПеревестиEng(Неопределено); ПеревестиLit(Неопределено); ПеревестиCh(Неопределено); ПеревестиTr(Неопределено); КонецПроцедуры &НаКлиенте Процедура ПеревестиEng(Команда) Экспорт КомандаПеревести("Описание (Eng)", "en", "Комментарий"); КонецПроцедуры
Коды языков можно посмотреть в адресной строке на translate.google.ru, выбрав нужный язык.
Пример работы:
UPD 2023-12-14: HTML выдачи изменился, поэтому переписал функцию получения перевода более точно (изначальный код получения Div по номеру был не мой):
Функция ПеревестиТекстСлужебная(ИсходнаяСтрокаДляПеревода, Язык) Экспорт СтрокаДляПеревода = КодироватьСтроку(ИсходнаяСтрокаДляПеревода, СпособКодированияСтроки.КодировкаURL); SSL = Новый ЗащищенноеСоединениеOpenSSL(); Таймаут = 30; Соединение = Новый HTTPСоединение("translate.google.com",,,,,Таймаут,SSL); СтрокаДляПереводаЗакодированная = КодироватьСтроку(СтрокаДляПеревода, СпособКодированияСтроки.URLВКодировкеURL); ЗапросHTTP = Новый HTTPЗапрос( "/m?sl=ru&tl=" + Язык + "&hl=ru&q=" + СтрокаДляПереводаЗакодированная); ОтветHTTP = Соединение.ВызватьHTTPМетод("GET", ЗапросHTTP); СтрокаОтвета = ОтветHTTP.ПолучитьТелоКакСтроку(); Если ОтветHTTP.КодСостояния <> 200 Тогда Сообщить("Ошибка перевода, код состояния: " + ОтветHTTP.КодСостояния + " Текст ошибки: " + СтрокаОтвета); ВызватьИсключение "Ошибка перевода"; КонецЕсли; ЧтениеHTML = Новый ЧтениеHTML; ЧтениеHTML.УстановитьСтроку(СтрокаОтвета); Построитель = Новый ПостроительDOM; ДокHTML = Построитель.Прочитать(ЧтениеHTML); ЭлементыДокHTML = ДокHTML.ПолучитьЭлементыПоИмени("div"); СтрокаПереведенная = Неопределено; Для Каждого ЭлементДокHTML ИЗ ЭлементыДокHTML Цикл Если ЭлементДокHTML.ИмяКласса = "result-container" Тогда СтрокаПереведенная = ЭлементДокHTML.ТекстовоеСодержимое; КонецЕсли; КонецЦикла; Возврат СтрокаПереведенная; КонецФункции
а почему не полноценный АПИ?
Потому что он платный, требует авторизации и т.п.
https://cloud.google.com/translate/docs/reference/rest/v3/projects/translateText
Если что я про это
Я видел. Но выше уже написал, что клиент хотел бесплатно.
Ты реально целую html страницу грузишь и парсишь ради перевода куска текста?!
Я работаю по бюджету клиента, 1С не напряжет получить целую страницу, тем более что HTTP-запрос все равно выдает страницу.