Я, конечно, не собираюсь делать онлайн-переводчик с нуля. Да и зачем, если есть замечательный сервис от Яндекса (так называемый «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, но это уже относится к настройкам сервера и выходит за рамки данного поста.
какие функции вписывать не подскажите ?