Если разрабатывается более менее серьёзный проект, который рассчитан на широкую пользовательскую аудиторию, то рано или поздно перед разработчиками встает вопрос о локализации проекта, т.е. адаптации интерфейса программы, документации к новому ранее не использовавшемуся языку. То есть грубо говоря, надо перевести все строки в проекта на новый язык и сделать программу мультиязычной.
Ранее для локализации проектов мы могли использовать сторонние компоненты, например, dxGetText, TJvTranslator из 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 — сохраняет данные по локализации в файл
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 указать необходимый нам идентификатор. Можете проверить это самостоятельно — у меня без проблем заработал дефолтный русский язык, вторым — английским.
В целом, что могу сказать по поводу компонента после недолгого его осмотра:
Достоинства:
- Простой
- Достаточно удобный в использовании
- Даже на такой мелкой программе как в примере было заметно, что компонент «думает» над переводом строк, несмотря на то, что вроде бы железо у меня стоит не самое слабое и «тормозов» таких быть не должно.
Очевидно, что буржуй-нет значительно сложнее и насыщеннее Рунета по части любой тематики — будь то IT или продажа подгузников, а следовательно и SEO там стоит на другом уровне нежели у нас. Если Вы планируете продвигать англоязычный сайт, то загляните на http://seo4usa.net/ — 5 лет работы на англоязычных сайтах в области SEO — это что-то да значит!
Жуткая картинка в начале статьи вызывает ассоциации с людоедами из Африки…
это огненная обезьянка =)
а vclForms с TLang дружат?
utmost80, не-а, только в FMX этот компонент (FMX.Types.pas). Для VCL dxGetText подойдет, правда он сторонний
Ок, очень хорошо.
Самому (что ли) попробовать? :)
[…] работы именно с TLang в FireMonkey. Статья называется "Локализация приложений Firemonkey. Компонент TLang" — в ней же Вы найдете достоинства и недостатки этого […]
Делал по примеру на оф сайте. не работает, и по этому делал все так же, не работает.
Написал в QC по поводу языка по умолчанию:
http://qc.embarcadero.com/wc/qcmain.aspx?d=121760
этот компонент глючный. не советую использовать
Сработал и под виндой и на андроиде.
Rad Studio 10.1
Спасибо за статью.