А почну я з того, що перекладач Google досить динамічний сервіс. Крім використання кнопки «Перевести», переклад, що вводяться в форму даних, може здійснюватися і автоматично, тобто на льоту. Кожен такий переклад, це запит до сервера. Таким чином, можна сказати, що наш запит не створить особливої проблеми. Проте, зловживати цією можливістю, мабуть, не варто.
Для отримання результату в форматі JSON параметру client треба привласнити значення x. У параметрі q передається текст, який треба перевести. Параметр sl містить ідентифікатор мови з якого здійснюється переказ, а tl - ідентифікатор мови на який здійснюється переказ. І ще, результат буде в кодуванні UTF-8.
В принципі, нічого складного, а ось і PHP-код функції:
Звертаю Вашу увагу на те, що функція gtranslate () поверне об'єкт з відповідними властивостями. Таким чином, функція виходить досить гнучкою і динамічною.
Нижче я приведу приклад отримання значення рядка перекладу:
$ Gt = gtranslate ( 'приклад використання машинного масла', 'ru', 'en');
echo $ gt-> sentences [ '0'] -> trans; // поверне рядок: example of the use of engine oil
echo '
'; var_dump ($ gt); echo '';
У випадку з наведеними прикладом, Ви отримаєте наступне:
object (stdClass) # 1 (3) [ "sentences"] =>
array (1) [0] =>
object (stdClass) # 2 (4) [ "trans"] =>
string (32) "example of the use of engine oil"
[ "Orig"] =>
string (69) "приклад використання машинного масла"
[ "Translit"] =>
string (0) ""
[ "Src_translit"] =>
string (38) "primer ispol'zovaniya mashinnogo masla"
>
>
[ "Src"] =>
string (2) "ru"
[ "Server_time"] =>
int (1)
>
Зверніть увагу, що Google перекладач повертає результат розбитий на пропозиції (англ. Sentences). я б назвав фрагменти. При великому обсязі даних, ми отримаємо цілий масив таких пропозицій. Обробити їх можна, наприклад, так:
foreach ($ gt-> sentences as $ sentence) echo '
'. $ Sentence-> trans. '
';echo '
'. $ Sentence-> orig. '
';>
З урахуванням того, що в моїй функції тепер використовується метод передачі даних POST, проблем з великими даними виникнути не повинно.
Цікавим тут є і параметр src_translit. яке містить транслит фрагмента, в даному випадку написання російського тексту латинськими літерами. Втім, для цього краще використовувати локальний варіант, см. Php-функцію translit (). Правда остання заточена в більшій мірі для створення ЧПУ.
Повертаючись же до Google перекладачеві, варто ще сказати і про параметр dict. який з'являється при перекладі одного слова. Він буде містити ряд додаткових словникових даних, на кшталт визначення частини мови, варіантів перекладу і т.д. але тут дивіться самі.
На цьому у мене все. Дякуємо за увагу. Успіхів!
Залишилося лише зрозуміти, куди це все присобачить.
@ Максим один з варіантів - генерація ЧПУ. Звичайно, можна використовувати і локальний транслит, але я думаю куди як результативніше розширите ключового слова за рахунок ЧПУ англійською. На blogger цього звичайно не зробити, я сам, вручну, перекладаю в трансліті потрібний фрагмент і прописую постійне посилання. Якщо ж мова йде про своєму хостингу, то цілком можливо робити переклад заголовка і генерувати ЧПУ англійською. До слова, тут буде не зайвим використовувати Ajax, тому що сервіс може бути і не доступний.
Коли пропозицій кілька, чомусь видає тільки перше. Використовую таку конструкцію: $ gt-> sentences [ '0'] -> trans;
Як отримати весь текст цілком в одну змінну? Дякуємо!
2Ya для того щоб відповісти на Ваше питання потрібно розібратися, що таке об'єкт (object) і що таке масив (array). Або все таки варто почати з того, що таке змінна?
Я розібрався, спасибі. Просто не сильний в php, тому вибачайте. Дуже шкода, що великі тексти таким чином в автоматі перевести не вийде. Перекладає тільки короткі.
2Ya. да, GET запит невеликий, але можна використовувати POST. Для цього знадобиться трохи змінити функцію, а точніше значення змінних $ filename і $ options:
Правда слід врахувати, що Google Translate розбиває великий текст на пропозиції. Ось варіант виведення пропозицій перекладу і оригіналу:
foreach ($ gt-> sentences as $ sentence) echo '
'. $ Sentence-> trans. '
';echo '
'. $ Sentence-> orig. '
';>
Костянтин, спасибі, Ви мені дуже допомогли. )
чет не працює
2Деніс Сташук що саме не працює. Перевірив, ніби все приклади працюють.
Дивно як здорово все працює. Думаю gtranslate () і справді буде на багато корисніше для чпу ніж translit (). Спасибі вам величезне за вашу роботу.
2Siren DS так, тема цікава, але залежність від онлайн сервісу теж треба враховувати.
У минулому коді транслітерації вирізував пробіл перед словом, що починається з Е | Е ось виправлений варіант:
function translit ($ string) $ string = preg_replace ( '# \ s + # is', '', mb_strtolower ($ string));
$ String = preg_replace ( '# (а | і | про | у | и | е | ю | я | ь | ь | \ s) (е | е) #isu', 'ye', ''. $ String) ;
$ String = trim (preg_replace ( '# \ s + # is', '', $ string));
>
2Назір Гебеков в моїй функції translit () буква "е" теж врахована. Тут просто не потрібно забувати, що код залежимо від кодування через кирилиці.
так я використовую тільки utf-8 кодування це і так повинно бути зрозуміло бо я використовував mb_strtolower а не strtolower.
І ще в цій функції враховуються моменти коли необхідно використовувати "ye" а коли "e" замість російських "е" і "е" що власне і робить гугловський транслітер.
Щодо різних кодувань що заважає використовувати iconv перед застосуванням translit?
2Назір Гебеков згоден для трансліта зійде і локальна функція, а ось для повноцінного перекладу все таки доведеться використовувати сервіс, що і робить моя функція.
2Александр Гентера на жаль і ах, при великій кількості звернень з одного IP йде блокування, тому що функція не використовує офіційного API Google Translate. Як варіант, можна спробувати використовувати проміжний сервер, який знаходиться на іншому IP для отримання даних.
а у мене чомусь ця функція gtranslate () замість російських букв видає суцільні. (((Як з цим впоратися?