Использование бесплатного 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.ТекстовоеСодержимое;
		КонецЕсли;
	КонецЦикла;
    
    Возврат СтрокаПереведенная;
КонецФункции

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

комментариев 6

  1. rzd:

    а почему не полноценный АПИ?

  2. Филип Воронин:

    Ты реально целую html страницу грузишь и парсишь ради перевода куска текста?!

    • Я работаю по бюджету клиента, 1С не напряжет получить целую страницу, тем более что HTTP-запрос все равно выдает страницу.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *