Раз нельзя использовать API Инструментов переводчика, то решал поработать с Google AJAX Language API, чтобы обеспечить минимальный набор функций по переводу текста с помощью Переводчика Google. В целом, компонент для Delphi получился небольшой (как и сам API), едсинственное, что пришлось использовать из не входящих в стандартный набор Delphi библиотек — это библиотеку SuperObject для работы с JSON, т.к. именно в этом формате (и только в нем) приходит ответ при работе с AJAX Language API. Так что, если хотите воспользоваться компонентом переводчика, то сначала придётся скачать последнюю версию SuperObject здесь.
Ну, а теперь, всё что касается непосредственно компонента.
1. Свойства компонента
У компонента Translator всего два свойства:
property SourceLang: TLanguageEnum read FSourceLang write FSourceLang;
Язык оригинала.
property DestLang: TLanguageEnum read FDestLang write FDestLang;
Язык на который необходимо перевести отрывок текста. При этом перечислитель TLanguageEnum содержит идентификаторы всех доступных в Переводчике Google языков. Однако следует отметить следующее обстоятельство, которое относися непосредственно к API — не все пармы языков SourceLang/DestLang поддерживаются. Если невозможно перевести текст с SourceLang на DestLang, то API вернет ошибку.
Если Вы не знаете на каком языке написан исходный екст, то в свойстве SourceLang можно указать значение Unknown — в этом случае Google попробует определить язык оригинала автоматически.
2. События компонента
OnTranslate: TOnTranslate; type TOnTranslate = procedure(const SourceStr, TranslateStr: string; LangDetected: TLanguageEnum) of object;
Возникает после того как получен положительный ответ от сервера (с кодом 200). Возвращает следующие значения:
SourceStr — строка текста для перевода;
TranslateStr — переведенный текст;
LangDetected — язык оригинала. Удобно использовать, когда необходимо опеределить язык оригинала текста.
OnTranslateError: TOnTranslateError; type TOnTranslateError = procedure(const Code: integer; Status: string) of object;
Возникает в случае, если во время перевода произошла какая-либо ошибка (в JSON-документе содержится код ответа отличный от 200). Возвращает следующие значение:
Code — код ошибки
Status — текст ошибки.
3. Методы компонента
function Translate(const SourceStr: string): string;
Основной метод компонента Delphi. Переводит строку SourceStr на язык, определенный в свойстве DestLang.
function GetLanguagesNames: TStringList;
Возвращает список всех доступных языков для перевода. Удобно использовать, когда необходимо заполнить ComboBox доступными языками.
function GetLangByName(const aName: string): TLanguageEnum;
Возвращает идентификатор языка по его названию. Например,
Translator.GetLangByName('Русский')
вернет значение lng_ru, которое можно в дальнейшем использовать в свойствах компонента.
4. Пример использования
Создадим небольшое приложение, как показано на рисунке:
В Edit будем записывать строку, в ComboBox’ах выбирать языки, с которыми нам необходимо работать, а в Memo выведем результат работы компонента. Напишем следующие обработчики событий у компонента Tanslator1:
procedure TForm6.Translator1Translate(const SourceStr, TranslateStr: string; LangDetected: TLanguageEnum); begin Memo1.Lines.Clear; Memo1.Lines.Add('Исходный текст '+SourceStr); Memo1.Lines.Add('Перевод '+TranslateStr); end; procedure TForm6.Translator1TranslateError(const Code: Integer; Status: string); begin Memo1.Lines.Add('Ошибка '+IntToStr(Code)+' '+Status) end;
На OnShow формы будем формировать списки ComboBox:
procedure TForm6.FormShow(Sender: TObject); begin ComboBox1.Items.Assign(Translator1.GetLanguagesNames); ComboBox2.Items.Assign(Translator1.GetLanguagesNames); end;
При выборе языка в ComboBox’ах будем сразу передавать эти значения в свойства компонента Translator1:
procedure TForm6.ComboBox1Change(Sender: TObject); begin Translator1.SourceLang:=Translator1.GetLangByName(ComboBox1.Items[ComboBox1.ItemIndex]); end; procedure TForm6.ComboBox2Change(Sender: TObject); begin Translator1.DestLang:=Translator1.GetLangByName(ComboBox2.Items[ComboBox2.ItemIndex]); end;
И, наконец, по нажатии на кнопку «Перевести» будем переводить текст из Edit:
procedure TForm6.Button1Click(Sender: TObject); begin Translator1.Translate(Edit1.Text) end;
Теперь запускаем приложение и, для проверки, переведем «Hello World» скажем…на персидский язык. Вот результат работы переводчика:
.
Скачать компонент можно со страницы загрузок нашего проекта на GitHub. Замечания, предложения, идеи по дальнейшему развитию компонента принимаются здесь.
Книжная полка
Описание: Рассмотрены практические вопросы по разработке клиент-серверных приложений в среде Delphi 7 и Delphi 2005 с использованием СУБД MS SQL Server 2000, InterBase и Firebird. Приведена информация о теории построения реляционных баз данных и языке SQL. Освещены вопросы эксплуатации и администрирования СУБД.
|
||
Название: О чем не пишут в книгах по Delphi
Описание: Рассмотрены малоосвещенные вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные режимы их работы, особенности для протоколов TCP и UDP и др.
|
Определение Свойства destLang в статье проверьте — для чтения и записи используется поле из sourceLang.
Упс, очепятка вышла :)
Спасибо, Deksden, текст подправил.
Попробовал использовать данный сервис, тут же столкнулся с такой проблемой: невозможность перевода длинных текстов, вышло что-то порядка 389 символов чистого текста с пробелами, знаками препинания на русском языке. По сему есть мысли как обойти данное ограничение или как возможно разделять текст на нужное кол-во символов? ведь на середине прдложения оборвать нельзя текст и предложения могут быть длинными :(
Обойти…использовать вместо GET POST-запрос — ограничение снимется само собой.
Класс TTranslate не находит не в Delphi 7 не в DelphiRAD2010. Просто кидаю все содержимое паки translator_pack в папку translate_demo + superobject.pas туда же и пытаюсь скомпилировать. Может подскажете в чём ошибка?
TTranslate никогда в жизни Delphi не входил в её состав. Он находится в файле GTranslate.pas в папке source. Скачивается оттуда же, откуда и пакет translator_pack (из исходников)
Эм.. ну дык я написал, что скопировал файл GTranslate.pas в папку с DEMO программой. Вот тут вот и проблема, файл есть а класс не находит.
Укажи еще эту папку с файлом GTranslate.pas в опциях среды—библиотеки—пути тада должно пойти
Отлично! А если переводчик через прокси должен работать? Как из этой ситуации выдти?
Подскажите версию дельфи. При компилляции GTranslate в D7 получаю ругань на всех строках типа
function *****; inline;
А в дальнейшем (при //inline;) выход за границы Integer вот здесь (SuperObject):
class function TSuperAvlEntry.Hash(const k: SOString): Cardinal;
var
h: cardinal;
i: Integer;
begin
h := 0;
{$Q-}
for i := 1 to Length(k) do
h := h*129 + ord(k[i]) + $9e370001;
{$Q+}
Result := h;
end;
Nick, используется Delphi XE
Nick, Taron — не заморачивайтесь над переводчиком от Google — этот API будет отключен в конце года
Лучше возьмите Bing API того же переводчика — проще работать т.к. используется SOAP и отключать не собираются
Здравствуйте, пожалуйста помогите мне с установкой этого компонента. Мой скайп: stalker_agg
Мой емейл: stalker1995s@mail.ru
Спасибо!
stalker1995s, переводчик Google в настоящее время доступен для использования только за деньги и только через консоль Google. Используйте переводчик от Microsoft
Нормально собралось установилось, но демка при переводе вот что выдаёт: The system cannot locate the resourse specified.