Статьи

Использование Google Translate API с PHP

Примечание: расширенное продолжение этой темы доступно здесь

Если ваш сайт обслуживает посетителей из разных стран, возможно, вы уже перевели весь его статический контент на несколько языков. Но что делать с контентом, ежедневно публикуемым пользователями в комментариях, мнениях и рейтингах? Поскольку это может быть столь же ценной частью вашего сайта, как и статический контент, вам следует подумать о том, чтобы найти способ перевести его на другие языки. Один сервис, который может помочь, это, конечно, Google Translate .

Прочитав это руководство, вы сможете получать переводы из API Google Translate прямо из своего приложения. Вы узнаете, как получить доступ к API, как его использовать и как обрабатывать ошибки в случае их возникновения.

Создание аккаунта Google API

Чтобы получить доступ к API Google Translate, вам нужно будет создать новый проект в консоли API Google, для которого требуется активная учетная запись Google. После создания нового проекта просто включите Translate API в списке всех доступных API, нажав переключатель.

ценообразование

Поскольку Google Translate API является платным сервисом , вам также необходимо включить биллинг в настройках вашего проекта. Для этого нажмите Billing в левом меню на консоли API Google, а затем включите Billing . Вам будет предложено ввести данные платежа, такие как ваш адрес и номер кредитной карты. Различные способы оплаты доступны в разных странах, но оплата кредитной картой должна быть признана во всем мире.

На момент написания этой статьи плата за использование составляла 20 долларов за 1 миллион символов перевода или определения языка. Это означает, что перевод пользовательского комментария из 300-400 символов обойдется вам в $ 0,006 — $ 0,008. Естественно, если вы хотите перевести текст на более чем один целевой язык, вам придется платить отдельно за каждый перевод.

Если вы боитесь, что за переводы, которые вы делаете, будет выставлен слишком большой счет, вы можете контролировать использование API в своем проекте, устанавливая максимальное количество символов, которое можно переводить ежедневно. Вся конфигурация доступна на консоли API Google.

Получение ключа API

Для доступа к API Translate из вашего приложения вам понадобится ключ API, связанный с проектом, созданным вами в консоли API Google. Чтобы получить ключ API, просто нажмите API Access в меню на странице консоли API Google. Вы найдете нужный ключ в разделе Простой доступ к API .

Доступ к Translate API из вашего приложения

API Translate предлагает 3 метода:
перевод , который переводит данный текст с одного языка на другой,
обнаруживает , который обнаруживает язык данного текста,
языки , в которых перечислены исходные и целевые языки, поддерживаемые API.

Все методы вызываются через GET-запросы. Обычный способ сделать такой запрос в PHP — использовать библиотеку cURL , которую мы будем использовать в примерах ниже. Параметры, передаваемые каждому методу, должны быть закодированы в URL, что может быть достигнуто в PHP с помощью функции rawurlencode () . Помните, что при каждом вызове вы должны передавать свой ключ API в качестве ключевого параметра.

Результаты каждого метода Google Translate API возвращаются в виде строки, представляющей объект JSON. Для его анализа мы будем использовать функцию json_decode () .

Запрос образца

Перевод и обнаружение услуг платные, но мы можем использовать третий метод — языки — просто чтобы проверить, может ли наше приложение соединиться с API. Для этого мы сделаем запрос по следующему URL: https://www.googleapis.com/language/translate/v2/languages

Весь код выглядит следующим образом:

 <?php
    $apiKey = '<paste your API key here>';
    $url = 'https://www.googleapis.com/language/translate/v2/languages?key=' . $apiKey;

    $handle = curl_init($url);
    curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);     //We want the result to be saved into variable, not printed out
    $response = curl_exec($handle);                         
    curl_close($handle);

    print_r(json_decode($response, true));
?>

После выполнения приведенного выше кода вы должны увидеть массив всех языков, которые могут быть обработаны API Google Translate. Аналогичная таблица доступна в документации . Важно просмотреть эту таблицу, потому что вам нужно будет указать коды языков, указанные там при отправке запроса на перевод конкретного текста.

Получение переводов

Основная функциональность API Google Translate доступна через метод перевода . Он доступен по следующему URL-адресу: https://www.googleapis.com/language/translate/v2

Метод перевода имеет несколько параметров. Наиболее важными являются:
q — ввод текста,
source — исходный язык (если он не указан, Google попытается определить его автоматически),
target — целевой язык

Если вы хотите получить переведенный текст, вы должны изменить URL-адрес запроса из предыдущего примера. Остальная часть кода выглядит очень похоже:

 <?php
    $apiKey = '<paste your API key here>';
    $text = 'Hello world!';
    $url = 'https://www.googleapis.com/language/translate/v2?key=' . $apiKey . '&q=' . rawurlencode($text) . '&source=en&target=fr';

    $handle = curl_init($url);
    curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($handle);                 
    $responseDecoded = json_decode($response, true);
    curl_close($handle);

    echo 'Source: ' . $text . '<br>';
    echo 'Translation: ' . $responseDecoded['data']['translations'][0]['translatedText'];
?>

Пример ответа, содержащий переведенный текст, выглядит следующим образом:

 {
 "data": {
  "translations": [{"translatedText": "Bonjour tout le monde!"}]
 }
}

Что произойдет, если вы не установите исходный язык?

Если вы решите не включать исходный язык (параметр источника ) в запрос, могут возникнуть два сценария:
1. Google удастся определить язык самостоятельно, поэтому ответ JSON будет содержать дополнительное свойство детектированное обнаружение ресурса, содержащее код исходного языка.
2. Исходный язык не будет успешно обнаружен (например, если исходный текст был слишком коротким), и Google Translate API вернет ошибку HTTP 500. Это приводит к следующей части урока — обработка ошибок.

Обработка ошибок

Если ваш запрос не может быть обработан, Google Translate API возвращает HTTP-ответ с кодом, представляющим тип ошибки. После выполнения запроса с использованием cURL вы можете получить код ответа сервера с помощью функции curl_getinfo () . Если код ответа отличается от 200 , это означает, что что-то пошло не так.

API Google Translate может возвращать следующие коды ошибок:
400 ( неверный запрос) — в вашем запросе отсутствуют некоторые параметры или вы передали неправильные значения параметрам, присутствующим в запросе (например, неверный код языка),
403 (запрещено) — вы ввели неверный ключ API или превысили квоту,
500 (Внутренняя ошибка сервера) — Google не может определить исходный язык вашего текста или произошла другая ошибка.

Кроме того, при возникновении ошибки API Google Translate возвращает ответ JSON, содержащий описание ошибки. Например, если один из обязательных параметров отсутствует, сервер ответит следующим ответом:

 {
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "required",
    "message": "Required parameter: target",
    "locationType": "parameter",
    "location": "target"
   }
  ],
  "code": 400,
  "message": "Required parameter: target"
 }
}

Поэтому лучший способ обработки ошибок при обращении к сервису API Google Translate — это просто совмещать проверку кода ответа HTTP и анализ ответа JSON с сервера. Что важно, curl_getinfo () должен быть вызван до curl_close () :

 <?php
    $apiKey = '<paste your API key here>';
    $text = 'Hello world!';
    $url = 'https://www.googleapis.com/language/translate/v2?key=' . $apiKey . '&q=' . rawurlencode($text) . '&source=en&target=fr';

    $handle = curl_init($url);
    curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($handle);
    $responseDecoded = json_decode($response, true);
    $responseCode = curl_getinfo($handle, CURLINFO_HTTP_CODE);      //Here we fetch the HTTP response code
    curl_close($handle);

    if($responseCode != 200) {
        echo 'Fetching translation failed! Server response code:' . $responseCode . '<br>';
        echo 'Error description: ' . $responseDecoded['error']['errors'][0]['message'];
    }
    else {
        echo 'Source: ' . $text . '<br>';
        echo 'Translation: ' . $responseDecoded['data']['translations'][0]['translatedText'];
    }
?>

Несколько переводов в одном запросе

Вы можете перевести несколько текстов за один запрос, что, несомненно, более эффективно, чем выполнение отдельного запроса для каждого перевода. Для этого просто передайте пару параметров q , каждый из которых содержит один текст для перевода.

Тем не менее, здесь становится немного сложно:
— если все ваши исходные тексты написаны на одном языке, вы можете передать параметр источника, содержащий код языка всех текстов;
— но если вы хотите перевести пару текстов на разные языки, вы не можете передать несколько параметров источника . В таком случае вам нужно пропустить параметр источника и просто дать Google угадать, на каких языках используются исходные тексты.

Также обратите внимание, что вы не можете получить несколько переводов одного исходного текста в одном запросе. Если вы хотите перевести один текст на разные целевые языки, вы должны сделать отдельные запросы.

Вывод

Теперь вы знаете основы подключения вашего приложения к Google Translate API. Более сложные реализации API могут включать автоматическую выборку переводов, когда пользователь отправляет некоторый контент (или когда администратор сайта одобряет это), и сохранение переводов в базе данных. Мы расскажем о таких продвинутых примерах в следующей статье (часть 2 здесь ).

Если вы планируете использовать API Google Translate в своем приложении, не забудьте прочитать Условия предоставления услуг и требования к атрибуции, которые содержат несколько рекомендаций о том, как отображать переведенный контент на веб-странице.

Если у вас есть какие-либо вопросы или комментарии относительно статьи, не стесняйтесь оставлять комментарии ниже или свяжитесь со мной через Google+ .