уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Если разрабатывается более менее серьёзный проект, который рассчитан на широкую пользовательскую аудиторию, то рано или поздно перед разработчиками встает вопрос о локализации проекта, т.е. адаптации интерфейса программы, документации к новому ранее не использовавшемуся языку. То есть грубо говоря, надо перевести все строки в проекта на новый язык и сделать программу мультиязычной.

Ранее для локализации проектов мы могли использовать сторонние компоненты, например, dxGetTextTJvTranslator из JVCL или же воспользоваться, давно существующим в Delphi инструментом ITE. С выходом Delphi XE2 мы получили ещё один компонент для локализации своих приложений — TLang, который предназначен для работы в приложениях, написанных с использованием Firemonkey. И сегодня, по просьбе трудящихся, я решил посмотреть как работает этот компонент и написать небольшое тестовое приложение, которое будет «разговаривать» с нами на нескольких языках.

Так как мы сегодня будет изучать работу компонента, искать его достоинства и недостатки, то программка не будет делать ничего полезного — обычная форма с несколькими компонентами, каждый из которых содержит или выводит на форму какой-нибудь текст.

Я создал вот такое приложение Firemonkey:

Теперь бросаем на форму компонент TLang и начинаем разбираться с его устройством. Первым делом делаем двойной щелчок по компоненту и открываем редактор:

Принцип работы компонента TLang схож с локализацией приложения с помощью ini-файлов — есть идентификатор (строка-оригинал) и есть значение (локализованная строка).

Как видно из рисунка, компонент автоматически просканировал все приложение на предмет содержания в компонентах строк и определил эти строки за идентификаторы.

Первым делом добавляем новый язык. Пусть это будет английский. Для этого в самое верхнее текстовое поле мы должны записать идентификатор языка, состоящий из двух символов, т.е. в нашем случае «en«. Заносим, жмем «Add» и переводим все строки на целевой язык. Здесь же мы можем добавить и другие строки для перевода или удалить ненужные. Для добавления/удаления строк используются кнопки «+» и «-» справа от таблицы.

После того, как все строки переведены мы можем сохранить все данные в отдельный lng-файл (кнопка «Save lng-file») и впоследствии загружать их снова в таблицы («Load lng-file…»). Также мы можем создать шаблон для перевода в виде простого txt-файла.

Теперь посмотрим какие свойства есть у компонента TLang. Их не так уж и много:

  • AutoSelect — True означает, что компонент автоматически выберет язык из списка доступных для локализации приложения и локализует необходимые строки
  • FileName — имя файла в котором хранятся ресурсы.
  • Lang — текущий выбранный язык.
  • LangStr — список строк определенного языка.
  • Original — список строк-оригиналов
  • Resources — список доступных языков.
  • StoreInForm — True означает, что все данные для перевода будут сохраняться непосредственно в коде формы приложения.

Также у TLang есть несколько методов для работы с ресурсами:

  • AddLang — добавляет новый язык в TLang;
  • LoadFromFile — загружает данные по локализации из файла
  • SaveToFile — сохраняет данные по локализации в файл
Вот, пожалуй всё, что мы имеем в распоряжении при работе с компонентом TLang. Теперь попробуем реализовать наш «коварный» план по локализации проекта. Вначале устанавливаем свойство AutoSelect в True и в обработчике кнопки «Сменить язык» пишем:
  Lang1.Lang:='en'

Запускаем приложение. По идее, приложение должно запуститься и быть на русском языке (мы же на нем первоначально все строки в компонентах определили), затем после нажатия кнопки язык интерфейса должен смениться на английский. А на деле всё начинает работать совсем по другому — программа сразу же запускается с английским интерфейсом и никак не реагирует на переключение языка. Спрашивается: что за дела? Мы просили русский интерфейс по дефолту — где он? «Секрет» кроется в том, что TLang почему-то полагает, что языком программы будет в первую очередь английский. Проверить это довольно просто.

подход №2. «По-правильному».
Переписываем весь интерфейс программы на английский язык. То есть на подобие чего-то такого:

Теперь в TLang вместо идентификатора «en» добавляем «ru» и переводим все строки на русский язык. А на событии OnClick пишем:

procedure TForm2.Button2Click(Sender: TObject);
begin
if Lang1.Lang='ru' then
  Lang1.Lang:='en'
else
  Lang1.Lang:='ru';
Label3.Text:=Lang1.Lang;
end;

Теперь запускаем программу и проверяем работу компонента. Программа прекрасно работает и переводит с английского на русский и обратно. Вот такая особенность работы компонента, которую, думаю, стоит учитывать. Не не стоит думать, что это какой-то баг. Недоработка…ну может и недоработка, но и не баг. Дело в том, что TLang может хранить любое количество языков. Мы можем определить, скажем 4 языка и все ресурсы будут храниться в одном файле. Для того, чтобы программа при запуске загружала сразу необходимый нам язык достаточно просто снять «галку» с AutoSelect и в свойство Lang указать необходимый нам идентификатор. Можете проверить это самостоятельно — у меня без проблем заработал дефолтный русский язык, вторым — английским.

В целом, что могу сказать по поводу компонента после недолгого его осмотра:

Достоинства:

  1. Простой
  2. Достаточно удобный в использовании
Недостатки:
  1. Даже на такой мелкой программе как в примере было заметно, что компонент «думает» над переводом строк, несмотря на то, что вроде бы железо у меня стоит не самое слабое и «тормозов» таких быть не должно.
Вот, пожалуй на сегодня и всё, что есть у меня по TLang. Если есть дополнения, комментарии — пишите :)

Очевидно, что буржуй-нет значительно сложнее и насыщеннее Рунета по части любой тематики — будь то IT или продажа подгузников, а следовательно и SEO там стоит на другом уровне нежели у нас. Если Вы планируете продвигать англоязычный сайт, то загляните на http://seo4usa.net/ — 5 лет работы на англоязычных сайтах в области SEO — это что-то да значит!

0 0 голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
10 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
Андрей
Андрей
10/11/2011 12:26

Жуткая картинка в начале статьи вызывает ассоциации с людоедами из Африки…

utmost80
utmost80
10/11/2011 20:12

а vclForms с TLang дружат?

Всеволод Леонов

Ок, очень хорошо.
Самому (что ли) попробовать? :)
 

trackback

[…] работы именно с TLang в FireMonkey. Статья называется "Локализация приложений Firemonkey. Компонент TLang" — в ней же Вы найдете достоинства и недостатки этого […]

rrr
rrr
04/05/2013 03:11

Делал по примеру на оф сайте. не работает, и по этому делал все так же, не работает.

Роман Янковский

Написал в QC по поводу языка по умолчанию:
http://qc.embarcadero.com/wc/qcmain.aspx?d=121760

Alexey
Alexey
22/02/2016 17:25

этот компонент глючный. не советую использовать

Михаил
Михаил
27/04/2017 21:36

Сработал и под виндой и на андроиде.
Rad Studio 10.1
Спасибо за статью.