Перевод сообщений "на лету"

Форум для авторов модов для phpBB 3.0.x. Здесь можно попросить помощи в разработке у коллег.
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ-3 (phpbb3) | Как задавать вопросы | Как устанавливать моды

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
TomAlex
phpBB 1.4.4
Сообщения: 117
Стаж: 15 лет 7 месяцев
Благодарил (а): 2 раза
Поблагодарили: 20 раз

Перевод сообщений "на лету"

Сообщение TomAlex »

Функция перевода сообщения на другой язык была реализована как первоапрельская шутка
Практическое применение функции может может таким: пользователь пишет сообщение на родном языке, а сохраняться и отображаться оно будет на языке конференции.

Перевод производится при помощи Google Translate API.
Работает достаточно шустро, бесплатен (пока по крайней мере), но существуют ограничения на темп (100 символов/сек/пользователь) и объем (100000 символов/день) запросов.

Чтобы использовать Google Translate API у вас должен быть аккаунт Google, к которому следует подключить приложение:
1. входим в аккаунт.
2. переходим на страницу управления приложениями: https://code.google.com/apis/console/
3. активируем Translate API.

Для запросов к Google Translate нам потребуется ключ. Его можно узнать на вкладке identity в консоли.

Далее пишем собственно функцию запроса к Google Translate.
В моей реализации это так:

Код: Выделить всё

function _translate($s_text, $s_lang, $d_lang)
{
	$url = 'https://www.googleapis.com/language/translate/v2?key=здесь-должен-быть-ваш-ключ&source=' .$s_lang. '&target=' .$d_lang. '&q=' .urlencode($s_text);

	// инициализация сеанса
	$ch = curl_init();

	// установка URL
	curl_setopt($ch, CURLOPT_URL, $url);
	// получить, но не отображать
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

	// получаем страницу
	$body = curl_exec($ch);

	// завершение сеанса и освобождение ресурсов
	curl_close($ch);

	// надо бы проверить код возврата

	// декодируем JSON строку
	$_json = json_decode($body, true);

	// упрощенный доступ к переводу
	return $_json['data']['translations'][0]['translatedText'];
}// end of _translate
Для работы функции требуются модули curl и json.
Естественно, если встраивать функцию в phpBB "правильно", то ключ стоит вынести в настройки.

Собственно, сам вызов функции, файл posting.php:
Найти:

Код: Выделить всё

	$message_parser->message		= utf8_normalize_nfc(request_var('message', '', true));
Заменить на:

Код: Выделить всё

	$message_parser->message		= utf8_normalize_nfc(_translate(request_var('message', '', true), 'ru', 'uk'));
Предыдущий пример будет переводить все отправляемые сообщения.

Шутка, о которой я писал выше, переводила только сообщения в темы связи с администраторами, и с вероятностью 60% и была реализована так:

Код: Выделить всё

	$_tempstr = request_var('message', '', true);
	if ((($topic_id == 606) or ($topic_id == 2458)) and (rand(1, 10) < 7)) $_tempstr = _translate($_tempstr, 'ru', 'uk');
	$_tempstr = utf8_normalize_nfc($_tempstr);
	$message_parser->message		= $_tempstr;
ru -- язык на котором пишем; uk -- язык на который переводим.
Посмотреть коды языков можно здесь
Опять же, если писать "правильно", то языковую пару надо также вынести в настройки.
Google Translate умеет сам определять язык источника, но экспериментов с этой функциональностью я не проводил.

Из недоработок:
Кроме перевода Google Translate пытается исправить и ошибки пунктуации: прижимает знаки пунктуации к предыдущему слову и вставляет после пробел.
Соответственно, портятся ббКоды и смайлы.
Надо писать постобработку, или существует стандартная?

Все было написано на скорую руку, поэтому просьба камнями не кидаться.

Что еще добавить? Пример, который использует JavaScript работает заметно шустрее. Оно и понятно. Но:
1. очень не хотелось заморачиваться с передачей информации с клиентской части;
2. посмотреть ключ на клиенте не составляет никакого труда.
Тем не менее, это тоже тема для обсуждения.

Что скажет Сообщество: стоит развивать идею, или оно никому не нужно?
Аватара пользователя
Nekstati
Поддержка
Поддержка
Сообщения: 3365
Стаж: 17 лет 6 месяцев
Благодарил (а): 37 раз
Поблагодарили: 1454 раза

Re: Перевод сообщений "на лету"

Сообщение Nekstati »

TomAlex писал(а):стоит развивать идею
Частное мнение: Google Translate выдаёт текст столь ужасного качества, что понять его может лишь сообразительный человек. Но сообразительный человек и сам наверняка умеет пользоваться Google Translate, да и по-английски с большой вероятностью понимает лучше, чем Google Translate. Так что…

Если же речь не об английском, а, например, о китайском, то всё гораздо хуже, т. к. Google осуществляет двойной перевод, и от оригинала не остаётся вообще ничего.
TomAlex
phpBB 1.4.4
Сообщения: 117
Стаж: 15 лет 7 месяцев
Благодарил (а): 2 раза
Поблагодарили: 20 раз

Re: Перевод сообщений "на лету"

Сообщение TomAlex »

Частное мнение: Для той простейшей грамматики, что используется в сообщениях на форумах, и для тех явных языковых пар, которые я просмотрел при подготовке этой шутки, Google Translate показывает неплохие результаты.
Сложные тексты -- не знаю, не использую автоматический перевод; видимо, отношусь к сообразительным людям :)
Но хотелось бы привести один пример из жизни: есть у меня знакомый японист... Так вот, пару лет назад он все свои словари отправил на антресоли, и черновой перевод сейчас готовит, отправляя текст прямо из Word на сервис Microsoft Translator. При этом сохраняет свою репутацию неплохого переводчика; шлифует тексты потом вручную, ес-сно :)

Кстати, что там с API у Microsoft Translator-а? :)
Upd: Все хорошо с API у Microsoft Translator-а. Чуть более замороченый вызов, но зато заточен под большее тексты. Есть даже метод Speak.
И оживленная дискуссия на форуме msdn.
Аватара пользователя
Nekstati
Поддержка
Поддержка
Сообщения: 3365
Стаж: 17 лет 6 месяцев
Благодарил (а): 37 раз
Поблагодарили: 1454 раза

Re: Перевод сообщений "на лету"

Сообщение Nekstati »

Судя по тому, что статьи на сайте Microsoft, на которых стоит пометка «Машинный перевод», вполне понятны, а статьи на разных сайтах с пометкой «Переведено Гуглем» (простейшие технические тексты) непонятны совершенно, — у MS Translatorа, наверное, и правда дела неплохи.
TomAlex
phpBB 1.4.4
Сообщения: 117
Стаж: 15 лет 7 месяцев
Благодарил (а): 2 раза
Поблагодарили: 20 раз

Re: Перевод сообщений "на лету"

Сообщение TomAlex »

Я где-то читал, что сам Microsoft поддерживает только 5-6 языков; сложные языки они перенаправляют на сторонний сервер.
Upd: Ага, Systran, обеспечивает им перевод на редкие языки, кстати, на русский тоже (информация 2009 года). Да, умеют бизнес организовать.

Когда я устраивал эту шутку, почему-то даже не задумался об использовании MS Translator.
Если у Сообщества будет интерес к теме перевода, можно и переделать. :)

Вернуться в «Для авторов (phpBB 3.0.x)»