Делаем простой онлайн-переводчик (ActionScript + PHP)

Я, конечно, не собираюсь делать онлайн-переводчик с нуля. Да и зачем, если есть замечательный сервис от Яндекса (так называемый «API Яндекс.Перевод»), который возьмёт на себя самую сложную часть работы - сам перевод. Нам лишь надо предоставить Яше два параметра:

- слово/словосочетание, которые надо перевести (но учтите, что щедрость Яндекса не безгранична и существуют ограничения на количество обращений к сервису и на объём переводимого текста);

- направление перевода (например, "ru-en" или "en-ru").

Кстати, одним из явных преимуществ переводчика от Яндекса является то, что он умеет полноценно работать с русским языком. Дело в том, что в сети хватает сервисов (в том числе и бесплатных), которые предоставляют возможности онлайн-перевода, но далеко не все они умеют переводить на русский / с русского (иногда они умеют переводить на русский, но с русского - нет).

Итак, начнём...

Пользовательский интерфейс нашего будущего онлайн-переводчика будет создан во Flash, на языке ActionScript 3.0 (хотя можно реализовать и на старом-добром ActionScript 2.0). Кроме этого, нам понадобится написать небольшой php-скрипт, который будет выполнять роль посредника между flash-приложением и API Яндекс.Перевод. Скрипт довольно простой...

Код PHP:

<?php /* проверяем наличие всех необходимых параметров, полученных с помощью Get-метода: - str - строка, которую будем переводить; - flag - направление перевода. */ if(isset($_GET["str"]) && isset($_GET["flag"])){ /* Если все необходимые данные получены, то отправляем запрос API Яндекс.Перевод. */ $xml = simplexml_load_file('http://translate.yandex.net/api/v1/tr/translate?lang='.$_GET["flag"].'&text='.iconv("cp1251", "utf-8", $_GET["str"])); /* Разбираем полученный от Яндекса ответ и выводим результат. */ $code = $xml["code"]; if($code==200){ echo $xml->text; }else if($code==413){ echo 'Превышен максимальный размер текста.'; }else if($code==422){ echo 'Текст не может быть переведен.'; }else if($code==501){ echo 'Заданное направление перевода не поддерживается.'; }else{ echo 'Неизвестная ошибка.'; } }else{ echo 'Недостаточно параметров!'; }

PHP-файл обязательно сохраняем в кодировке UTF-8 под именем translation.php (попутно замечу, что у меня данный скрипт помещён в папку applications, и, следовательно, при обращении к нему я буду использовать относительный адрес /applications/translation.php).

А теперь переходим к пользовательскому интерфейсу. Как я уже сказал, он будет реализован в виде flash-приложения (я воспользуюсь программой Adobe Flash CS 5.5, но можно взять и другую версию, поддерживающую ActionScript 3.0). Чтобы облегчить себе работу, я воспользуюсь компонентами из библиотеки MiniUI. Просто помещаем библиотеку MiniUI в одну папку с нашим flash-проектом и на главной временной шкале проекта пишем код...

Код ActionScript 3.0:

/* импортируем классы */ import flash.events.*; import flash.net.*; /* подключаем компоненты */ import sliz.miniui.Button; import sliz.miniui.Input; import sliz.miniui.RadioGroup; import sliz.miniui.Radio; /* переменная, в которой хранится направление перевода */ var flag:String = "ru-en"; /* функция перевода текста */ function translate() { if (inputText.text.length < 3) { inputTranslate.text = "Слишком короткий текст!"; } else if (inputText.text.length > 100) { inputTranslate.text = "Слишком длинный текст!"; } else { inputTranslate.text = "Обмен данными с сервером... Ждите..."; var urlRequest:URLRequest = new URLRequest("/applications/translation.php?flag=" + flag + "&str=" + inputText.text); var urlLoader:URLLoader = new URLLoader(); urlLoader.addEventListener(Event.COMPLETE, onComplete); urlLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError); urlLoader.addEventListener(IOErrorEvent.IO_ERROR, onIOError); urlLoader.load(urlRequest); } } /* функция, которая сработает при удачной загрузке данных с сервера */ function onComplete(event:Event):void { inputTranslate.text = event.target.data; } /* функции, которые сработают при возникновении ошибок */ function onSecurityError(event:SecurityErrorEvent):void { inputTranslate.text = event.text; } function onIOError(event:IOErrorEvent):void { inputTranslate.text = event.text; } /* поле ввода текста */ var inputText:Input = new Input(""," В это поле вводим текст... ",this,funcInput,50,50,450,110,true); function funcInput():void { translate(); } /* кнопка перевода */ var btnTranslate:Button = new Button(" Перевести текст: ",50,170,this,funcBtn); function funcBtn(event:Event):void { translate(); } /* радиокнопки для изменения направления перевода */ var radioRuToEn:Radio = new Radio(" RU >> EN ",200,170,this,funcRuToEn); function funcRuToEn(event:Event):void { flag = "ru-en"; } var radioEnToRu:Radio = new Radio(" EN >> RU ",300,170,this,funcEnToRu); function funcEnToRu(event:Event):void { flag = "en-ru"; } var radioGroup:RadioGroup = new RadioGroup([radioRuToEn,radioEnToRu]); radioRuToEn.setToggle(true); /* поле вывода перевода или ошибок, возникших при попытке перевести текст */ var inputTranslate:Input = new Input(""," В этом поле выводится результат перевода или ошибка... ",this,null,50,200,450,110,true); /* кнопка для помещения текста в буфер обмена */ var btnClipboard:Button = new Button(" Поместить в буфер обмена ",50,320,this,funcClipboard); function funcClipboard(event:Event):void { System.setClipboard(inputTranslate.text); } /* кнопка для очистки текстовых полей */ var btnClear:Button = new Button(" Очистить ",250,320,this,funcClear); function funcClear(event:Event):void { inputText.text = ""; inputTranslate.text = ""; }

Результат:

Вот и всё. Конечно, здесь представлен самый простой вариант реализации онлайнового переводчика на связке PHP и AS. Можно (и надо) внести некоторые дополнения и улучшения (например, я бы добавил в php-скрипт проверку входных данных на корректность и безопасность), но это уже дело личного вкуса и целесообразности. А у меня на сегодня всё.

Ознакомиться с Пользовательским соглашением сервиса API Яндекс.Перевод можно по этой ссылке.

Скачать все исходники к данному посту можно здесь - скачать исходники (под Adobe Flash CS 5.5).

Важное дополнение!

Недавно заметил, что приведённый выше пример переводчика перестал работать. Оказалось, что с «1 июля 2013 года версия API 1.0 прекратила работу. Начиная с версии 1.5 доступ ко всем методам API будет осуществляться по ключу. Получите ваш бесплатный API-ключ, заполнив простую форму.» О, да! Яндекс обожает делать сюрпризы! Правда, как правило, неприятные...

Ладно, делать нечего. Идём на страницу Яндекс-переводчика (http://translate.yandex.ru/) и находим на этой страничке ссылку «Разработчикам». Переходим по этой ссылке и получаем так нужный нам ключ.

Допустим, ключ мы получили. Но этого мало. Теперь нам потребуется внести некоторые изменения в PHP-файл...

Код PHP:

<?php $key = 'ВАШ_КЛЮЧ'; if(isset($_GET["str"]) && isset($_GET["flag"])){ $xml = simplexml_load_file('https://translate.yandex.net/api/v1.5/tr/translate?key='.$key.'&lang='.$_GET["flag"].'&text='.iconv("cp1251", "utf-8", $_GET["str"])); $code = $xml["code"]; if($code==200){ echo $xml->text; }else if($code==401){ echo 'Ключ API невалиден.'; }else if($code==402){ echo 'Ключ API заблокирован.'; }else if($code==403){ echo 'Превышено суточное ограничение на количество запросов.'; }else if($code==404){ echo 'Превышено суточное ограничение на объем переведенного текста.'; }else if($code==413){ echo 'Превышен максимальный размер текста.'; }else if($code==422){ echo 'Текст не может быть переведен.'; }else if($code==501){ echo 'Заданное направление перевода не поддерживается.'; }else{ echo 'Неизвестная ошибка.'; } }else{ echo 'Недостаточно параметров!'; }

В flash-приложении мы ничего менять не будем. Теперь, скорее всего, ваш переводчик заработает. Оговорочка не случайна. Некоторые проблемы могут быть вызваны использованием HTTPS, но это уже относится к настройкам сервера и выходит за рамки данного поста.

Автор: admin

Дата добавления: 2012-09-25

Просмотров: 19509

Рейтинг поста: +23-

Правила перепечатки

Социальные закладки:
Комментарии:
Комментатор
Комментарий добавил(а): Юрий
Дата добавления: 2013-03-10
>Это особенность используемых в данном примере компонентов.
Input в MiniUI?

>Можно, конечно, сделать форму так, что текст будет отображаться в отформатированном виде.
Все-же, нельзя ли сделать с переносом?

>НО: Flash поддерживает очень небольшой набор html-тегов.
Перенос поддерживает

>А если вы про перенос строки, то он вам и не нужен, если текст разбит на абзацы тегом P
Вы попробуйте в форму вручную ввести

black "нажать enter"
and "нажать enter"
white "нажать enter"

и перевести. Будет без перевода, ибо тег переноса не отработает и яндекс будет переводить "blackandwhite " слитно, в строчку, без пробелов. Такая же ерунда и с копипастом текста в форму. Изначально отформатированный текст выведется после перевода в нижнюю форму в одну строку, где тег переноса строки пропадет и абзацы сольются.
Комментатор
Комментарий добавил(а): edapskov
Дата добавления: 2013-03-10
> то теги не срабатывают, а просто отображаются, как есть

Это особенность используемых в данном примере компонентов. Можно, конечно, сделать форму так, что текст будет отображаться в отформатированном виде. Но есть одно большое НО: Flash поддерживает очень небольшой набор html-тегов.

> И еще непонятно, как из входной передаются теги.

Ничего не режется ни в форме, ни Яндексом (к моему удивлению, Яндекс даже не стал пытаться перевести теги). А если вы про перенос строки, то он вам и не нужен, если текст разбит на абзацы тегом P (Flash поддерживает и P, и BR).
Комментатор
Комментарий добавил(а): Юрий
Дата добавления: 2013-03-10
Тем не менее, в примере, который я привел, идет разбиение на абзацы по 2000 символов по точке и перевод абзацами. Все прекрасно работает (даже с исходным форматированием). Можно перевести целую книжку :) . А тут дело в другом. Если в выходную форму передать текст с тегами (абстрагируясь от переводчика, например, просто произвольный текст в тегах вместо $xml->text), то теги не срабатывают, а просто отображаются, как есть. И еще непонятно, как из входной передаются теги. Хотя-бы перевод строки. По моему, режется уже тут, ибо в принимаемой от яндекса xml-ке строки слиты.Не силен я в AS. Но, думаю, и там можно все передать. Причем, достаточно просто :) Но как?
Комментатор
Комментарий добавил(а): edapskov
Дата добавления: 2013-03-09
Юрий, не стоит и пытаться :-) Яндекс накладывает ограничения на использование своих сервисов и при этом оговаривается, что "Яндекс оставляет за собой право устанавливать любые лимиты и ограничения, включая далее перечисленное, но не ограничиваясь этим". То есть, даже если вам что-то и получится, то совсем не факт, что это будет работать в будущем. Но для каких-то скромных целей вполне сойдёт. Тем более, что найти хороший переводчик на русский язык - чрезвычайно сложная задача.
Комментатор
Комментарий добавил(а): Юрий
Дата добавления: 2013-03-09
В форме не отрабатываются html-теги. Например, теги переноса строки. "<br>", " " вот так и выводятся. Соответственно, весь переведенный текст в нижней форме выводится в одну строку без символов переноса. Строки просто сливаются.Как это подправить? И можно ли сюда приделать перевод больших текстов? Как пример: http://habrahabr.ru/post/138563/
Комментатор
Комментарий добавил(а): edapskov
Дата добавления: 2012-09-30
Где именно вы получаете такой ответ?
Комментатор
Комментарий добавил(а): Yura
Дата добавления: 2012-09-30
А ВОТ ФИГ! Я получаю вместо перевода RU>>EN херню! "РћС Euros Pyr±РєР Degrees" - это перевод слова "Ошибка"? Давай по-новой, Дима, всё фигня :D
Добавить комментарий:







[ + ] помощь по форматирование текста

Идиот-тест

Если все обязательные поля (отмечены * ) заполнены необходимой информацией, то нажимаем кнопку Добавить комментарий.

Страница 4 из 4: 1234
Меню
Подписка
Рубрики
Метки
Последние комментарии
Рейтинг постов
Реклама
Друзья
География гостей
Статистика
Яндекс.Метрика