Pull to refresh

Быстрый переезд с Google Translate API v1 на Bing Translate API

JavaScript *
Итак, позавчера Корпорация Добра все-таки закрыла свой бесплатный Translate API. Автор до последнего момента надеялся, что они образумятся и не станут уподобляться остальным так поступать. Поэтому не чесался и ничего не делал. Но вот гром грянул. И в CMS одного небольшого 3-х язычного проекта отвалился переводчик. Не страшно, но неприятно — раньше админ на форме редактирования контента 1 щелчком мыши переводил все поля еще на 2 языка. Переводчик я написал по своей милости, потратил на это минут 20 и не взял за это ни копейки. Тем не менее, клиент звонит, грозится физической расправой над любимым хомячком, просит, опять угрожает. Пришлось закрывать баш и искать альтернативы.

Под катом список (4 варианта, никаких откровений / открытий) чего нашел автор, а также рецепт Javascript-перевода от Bing.


Вариант 1-й, платный

Вроде как самое простое и быстрое решение — взять Translate API v2 от той же Доброкорпорации. Но что смущает — нет простого JS примера. Опять-таки — вопрос секьюрности — мне в js нужно будет добавить API key. Т.е. любой человек, догадавшийся открыть исходный код страницы сможет найти там ключ. И переводить на своем сайте за счет моего клиента. Не слишком интересно. (Каюсь, я не разбирался, возможно там все предусмотрено. Но напомню исходный посыл — суббота вечер, разбираться лень, хочется пойти читать баш|пиво|соседку)

Вариант 2-й, криминальный геморройный

Как подсказали вот здесь, почему-то работает перевод. И даже дает ответы в JSON формате. И еще Гугл сам предлагает юзать Translate Widget, который наверняка можно препарировать и посмотреть куда он там шлет запросы и как его эмулировать.
Вот тут встают вопросы — сколько надо времени чтобы обработать эти варианты? Есть ли уверенность что завтра (через неделю) лавочку не прикроют? Удастся ли получить от них JSONP или придется в очередной раз обходить Same Origin Policy?
Не много ли вопросов?

Вариант 3-й, мифический

Вспомнил о любви одного российского поисковика копировать сервисы Корпорации Д. Пытался нагуглить «Yandex Translate API». Нашел только упоминание о существовании такого сервиса и о том, что он слабо документирован. Наверное он не задокументирован никак, поскольку в момент отключения переводчика от Д. инк. весь рунет должен был бы пестрить ссылками на этот сервис, примерами использования и выдержкой из документации. Ну вот ни в жизнь не поверю, что это я один такой не подсуетился вовремя, наверняка есть еще потерпевшие.
Это только предположение, поэтому не пинайте сильно, если обладаете информацией — добро пожаловать, в комментариях ссылки только приветсятвуются.

Вариант 4-й, предательский

В процессе поиска API от Yandex был несказанно удивлен! http://msdn.microsoft.com/en-us/library/dd877846.aspx Нам дают халявный! работающий! переводчик с поддержкой JSONP! И кто же такой щедрый? Microsoft! Забегая вперед скажу, что переводчик действительно работает. Правда уходить от Гугла к Microsoft — это как-то… Противоестественно что ли? Но тем не менее…
Ссылку на пример использования я дал. Пример, мягко говоря, громоздкий, но слегка документированный. Да, кстати, после беглого взгляда на код ясно, что потребуется какой-то API key. Но его достаточно легко получить — идем сюда, региструемся и добаляем сайт. Интерфейс слегка подглючивает, но в общем добавить сайт получилось.
Да, кстати, переводчик у меня с тем же ключем работал и на другом (локальном) домене, в отличие, например, от Доброкарт. Код быстренько переработал, с использованием jQuery он получился чуть короче и читабельнее. Если Вы не любите jQuery — то либо Вы и сами можете лучше и быстрее меня решить похожую проблему, либо Вам все равно придется его подключить чтобы эта функция заработала.
/**
 * function for translating using Bing's Translator API
 * @param String text - text to be translated
 * @param String sl - source language code (f.e. 'ru')
 * @param String tl - target language code (f.e. 'ru')
 * @param Function success - function to be called when translate is complete 
 *        sucessfully (will be given to a jQuery's ajax success parameter)
 * @param Function complete - function to be called anyway (will be given to a 
 *        jQuery's ajax complete parameter)
 */
function translate_bing(text, sl, tl, success, complete){
    if(typeof(complete) != 'function')
        complete = function(){};
    jQuery.ajax({
        url: 'http://api.bing.net/json.aspx?JsonCallback=?',
        dataType: 'jsonp',
        data: { 
            'AppId' : 'YOUR_API_KEY',
            'Query': text.substr(0, 5000),
            'Sources': 'Translation',
            'Version': '2.2',
            'Translation.SourceLanguage': sl,
            'Translation.TargetLanguage': tl,
            'JsonType':'callback'
        },
        success: function(response){
            success(response.SearchResponse.Translation.Results[0].TranslatedTerm || '');
        },
        complete: complete
    });
} 

Комментарии я в код вставлять не стал, уж не обессудбте. Да и документирована функция наверняка с какими-нибудь нарушениями чего-то там. Но, на мой взгляд, что-то понять можно. И главное — it works! (Если у Вас не работает — милости просим комментировать, желательно с указанием браузера)

Да, и еще — качество перевода по сравнению с гугловым — отстой. По крайней мере направление RU -> UA.
Если у кого есть что-то получше — добро пожаловать в комменты.

И под конец немного розовых соплей сожалений — похоже пора прекращать любить Google. Я так понимаю, что ребятам приходиться начинать зарабатывать деньги, поэтому оставаться добрыми и пушистыми они уже не смогут. А жаль. Это было как-то… волшебно что ли? Хочешь карту — на. Хочешь переводчик — на. Сколько я должен? — Ну что вы, спасибо что используете наш сервис. Блин, прямо сказка какая-то. Закончилась.

Все, я ушел пить пиво к соседке.
UPD: ах да, мы юзаем JSONP, т.е. отсылать будем только GET и естественно при переводе более-менее длинного текста (не разбирался, но при 520 символов кириллицы истинно) словим HTTP 414 (который в данном конкретном случае почему-то обзывают 404)
Tags:
Hubs:
Total votes 76: ↑61 and ↓15 +46
Views 35K
Comments 36
Comments Comments 36

Posts