Практическое применение функции может может таким: пользователь пишет сообщение на родном языке, а сохраняться и отображаться оно будет на языке конференции.
Перевод производится при помощи 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
Естественно, если встраивать функцию в 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;
Посмотреть коды языков можно здесь
Опять же, если писать "правильно", то языковую пару надо также вынести в настройки.
Google Translate умеет сам определять язык источника, но экспериментов с этой функциональностью я не проводил.
Из недоработок:
Кроме перевода Google Translate пытается исправить и ошибки пунктуации: прижимает знаки пунктуации к предыдущему слову и вставляет после пробел.
Соответственно, портятся ббКоды и смайлы.
Надо писать постобработку, или существует стандартная?
Все было написано на скорую руку, поэтому просьба камнями не кидаться.
Что еще добавить? Пример, который использует JavaScript работает заметно шустрее. Оно и понятно. Но:
1. очень не хотелось заморачиваться с передачей информации с клиентской части;
2. посмотреть ключ на клиенте не составляет никакого труда.
Тем не менее, это тоже тема для обсуждения.
Что скажет Сообщество: стоит развивать идею, или оно никому не нужно?


