Этот пост – попытка систематизировать всю имеющуюся на данный момент у меня информацию, касающуюся локализации приложений.

Пока мы пишем программы “для себя”, то о локализации, интернационализации и пр. заморочках мы как-то и не задумываемся. А зачем? Врядли кому-то в здравом уме придет в голову мысль “А не перевести ли мне свою утилиту на иврит, чтобы потом с такой программой работать?” Совсем другое дело, когда программа “вырастает из коротких штанишек” и на неё появляется спрос в других странах. Тогда, если спрос достаточно большой, можно (и нужно) взяться за локализацию – найти подходящий инструмент, нанять переводчиков (или переводить самому) и работать, работать, работать.  Решение типа “Сделаю INI-файлик” вполне может подойти для небольших программок, но никак не для серьезных проектов с развитым интерфейсом, большим количеством форм, русурсов и т.д. – в этом случае стоит подыскать подходящее готовое решение. Собственно, основные цели поиска решения для локализации, которые были мне поставлены – это найти решение, которое позволит:

  1. проводить локализацию руками не-программистов
  2. работать с собственными словарями для перевода
  3. поддержка XE2

ну и, как обычно, решение должно быть удобным в использовании, дешевым, по возможности, простым в освоении и т.д. и т.п. А так как я все равно решил пройтись в своем поиске по всем возможным вариантам (а точнее по максимально возможному количеству вариантов), то решил весь найденный материал систематизировать и оформить вот этим самым постом. Здесь Вы сможете узнать и о существующих компонентах Delphi и о библиотеках и о программах – в общем о всем, чего только душа пожелает. В общем, если Вы тоже задались целью отыскать во всем множестве предложений для локализации то, которое придется по душе именно Вам, то читайте далее :)

Содержание

 

TSILang components suite

  • Разработчик: SiComponents
  • Официальный сайт: www.tsilang.ru
  • Цена: от $259 до $399. Пакет за $259 не содержит исходников (только DCU и OBJ)
  • Наличие ознакомительной версии: имеется.
  • Дата последнего релиза: 05 мая 2012
  • Поддержка Delphi XE2: имеется 

Что говорят о своем продукте разработчики:

TsiLang® Components Suite позволяет добавлять поддержку для неограниченного количества языков, а также, создавать полностью локализованные версии продуктов, основанные на базовой версии проекта. Автоматически находятся и заносятся в список для перевода все необходимые элементы интерфейса пользователя, предоставляются удобные способы сохранения и управления переводами, и конечно, переключение языка интерфейса осуществляется “налету” как во время работы приложения, так и в режиме дизайнера, что позволяет тестировать интерфейс даже без компиляции и запуска приложения.

Мой тест.

Для тестирования TsiLang я скачал и установил последнюю версию компонентов (6.5.4.7) и создал простенькое приложение на котором разместил Button, Label, OpenDialog, добавил ресурсные строки и константы.  Специально на OnClick кнопки был создан такой “кривой” обработчик:

procedure TForm19.Button1Click(Sender: TObject);
begin
ShowMessage('Привет, мир!');
end;

Локализация с TsiLang проводится следующим образом:

1. Запускаем TsiLang expert из меню Delphi: Tools ->TsiExpert

Здесь отображаются все формы проекта, а также компоненты TsiLang, расположенные на этих формах. Теперь выбираем в меню File->Languages и редактируем список языков для нашего приложения. По умолчанию все языки имею названия типа Language1, Language2 и т.д. я переименовал их так:

После того как была нажата кнопка “Ok” на главной (и единственной) форме приложения появился компонент TsiLang:

Теперь находим в эксперте кнопку “Save Project” и сохраняем наш проект. В TsiLang используется два типа файлов проекта:

  1. *.sib  – бинарные файл с переводами. Этот тип файла разработчики рекомендуют использовать, т.к. загрузка таких файлов происходит значительно быстрее, чем при использовании второго типа файлов
  2. *.sil – текстовые файлы. Преимуществом этого типа файлов является то, что мы можем передать этот файл с утилитой “SIL Editor” другому человеку для перевода.
Я сохранил свой проект в файл test.sil. 

Теперь, находясь в эксперте дважды щелкаем мышкой по названию формы в списке – откроется окно редактора перевода:

В левой части окна (в дереве) редактора содержатся группы переводимых свойств компонентов и строк и, соответственно, справа – таблица для перевода. TsiLang может локализовать не только свойства компонентов типа Caption, Hint, Text и т.д., но также и строки из диалогов, например, на рисунке ниже представлены все строки для перевода из различных диалоговых окон, которые могут использоваться в приложении:

Начинаем переводить все строки с русского на английский. При переводе каждой строки редактор в отдельном окне показывает нам длину строки оригинала (в пикселях) и длину переведенной строки:

В принципе, назначение этого информационного окошка понятно – можно контролировать ситуации, когда переводимый текст не будет вписываться в границы компонента. Хотя, как по мне, так было бы удобно добавить в это окошко ещё и ширину самого компонента – что б было с чем сравнивать ширины строк.

После того, как все строки переведены снова сохраняем наш проект. Теперь sil-файл должен содержать примерно такой текст:

последовательность символов [email protected]#$ – это разделитель, который мы сами можем определить при сохранении файла. В процессе перевода строк в редакторе можно заметить, что TsiLang ни коим образом не учёл, что в pas-файле формы есть и секция resourcestring и const и даже строка текста в обработчике OnClick. Чтобы добавить эти строки к переводу необходимо выбрать в меню эксперта TsiLang:

  • File -> Source -> With Form – чтобы выбрать строки из секции implementation модуля,
  • File -> Source -> With Form – чтобы выбрать все строковые константы и ресурсные строки

В итоге откроется окно с результатами поиска в котором Вы можете добавить строку в список исключений или заменить её на вызов функции TsiLang:

Жмем в этом окне кнопку “Modify Source” и получаем такое сообщение:

Открываем pas-файл и видим следующую странную картину:

Мне показалось странным то, что TsiLang прекрасно определяет строковые константы в pas-файле и даже изменяет самостоятельно исходник, но почему-то “ленится” сам определить var – ну сделали бы доп.опцию в настройках проекта перевода типа “Определять VAR для констант со строками” и “Изменять настройки компилятора”. Но это ладно – окно с сообщением есть и то хлеб. Вот, что мне действительно не понятно, так это откуда TsiLang нашел в моем проекта непонятные иероглифы? Думал, что это может быть по причине того, что pas-файл сохранен в ANSI, но нет – сменил на UTF8, а проблема с иероглифами осталась…В общем странно это.

После того как строки были помещены в перевод можно снова открыть редактор перевода и провести перевод группы Strings (благо в редактор строки попадают без искажений):

После того, как все строки переведены, а sil-файл сохранен, можно организовать переключение языков в своей программе. В TsiLang каждый язык имеет свой идентификатор типа integer. Например, в моем случае идентификаторы были такими:

  • Russian = 1
  • English = 2

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

siLang_Form19.ActiveLanguage:=2

Это приведет к тому, что TsiLang подгрузит из sil-файла строки на необходимом языке.
Что касается работы со словарем переводов, то TsiLang может передавать в словарь (предварительно созданные) только уже переведенные строки. Для этого можно воспользоваться все тем же редактором переводов – жмем в редакторе кнопку “Add All”, которая предназначена для передачи в словарь всех переводов и получаем вот такое окошко для выбора необходимых опций передачи:

выбираем здесь файл словаря, жмем “Ok” и получаем все переведенные строки в свой словарик, который, кстати, выглядит вот так:

Впоследствии этот словарь можно будет использовать для автоматических переводов строк в своих программах. Ну и, как я уже говорил выше, для работы с SIL-файлами имеется отдельная утилита под названием SIL Editor, которая предназначена для переводчиков. Для чистоты эксперимента я скопировал папку с SIL Editor на флэшку и запустил программу с виртуалки “Windows XP Mode”:

SIL Editor позволяет производить переводу по словарям и вручную, а также, если необходимо, добавлять новые языки в перевод.

Другие возможности TsiLang:

  1. Импорт словарей из doc-, html-, xls-, csv-, po-файлов
  2. Импорт ресурсных строк из исполняемых файлов
  3. Наличие собственных компонентов – диалоги открытия файлов, метки, списки и т.д.
  4. Ведение статистики по переводам

Довольно большой получился обзор, но инструмент того стоит. Подведем небольшой итог:

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

  1. Просто подключается к проекту – бросили компонент на форму, вызвали 1 метод и интерфейс переведен
  2. Удобный редактор перевода – все строки разложены, что называется “по полочкам”, можно быстро ориентироваться по дереву в поиске нужных строк для перевода
  3. Поддерживает как бинарные так и текстовые файлы с переводами. Создали sil-файл, отдали переводчику, потом пересохранили в sib и все готово – и программа быстрее будет работать и никто больше в перевод не залезет.
  4. Наличие инструментов для переводчиков (SIL Editor, словари)

Недостатки:

  1. “Корежит” русские строки в pas-файле. Пусть они и заключаются в комментарии, но, тем не менее, факт на лицо.
  2. В процессе работы обнаружились непонятные ошибки при работе со словарями. Например, при переносе переведенных строк в словарь через раз появлялась ошибка выхода за границы диапазона.
  3. Небольшие проблемы с окнами TsiLang. Они, конечно, жить не мешают, но тем не менее, не хорошо, когда ты вызываешь словарь, а он какого-то лешего сворачивается в панели управления.

В принципе, указанные выше недостатки (за исключением второго) не такие уж и критичные.

DKLang Localization Package к содержанию

  •  Разработчик: DKSoftware
  • Официальный сайт: www.dk-soft.org
  • Цена: бесплатно
  • Дата последнего релиза: 25.12.2008
  • Поддержка Delphi XE2: нет

Про это решение для локализации я не могу сказать ничего кроме того, что оно просто есть, т.к. даже не стал загружать архив, не смотря на то, что компоненты бесплатны.

Во-первых, настораживает дата последнего релиза – 2008 год – не факт, что компоненты заработают в XE2 без проблем.

Во-вторых пакет требует дополнительной установки компонентов Tnt Unicode Controls 2.3.0, которые в 2012 году уже как бы и лишние – юникод и так поддерживается.

Поэтому, если у Вас есть, что сказать по этому решению – хорошего или плохого – отпишите в комментах, а я добавлю отзывы в обзор.

UPDATE: Отзыв про DKLang Localization Package.  Кратко и понятно.

UPDATE 2: работоспособность DKLang в XE2

EMS Advanced Localizerк содержанию

  • Разработчик: EMS
  • Официальный сайт: www.sqlmanager.net
  • Цена: 2 900,00 руб.
  • Наличие ознакомительной версии: имеется
  • Дата последнего релиза: 13 января 2012
  • Поддержка Delphi XE2: имеется

Что говорят о своем продукте разработчики:

Advanced Localizer™ – это незаменимый пакет компонентов для Borland® Delphi®, позволяющий добавлять языковую поддержку Вашим Delphi® приложениям. Широкие возможности пакета Advanced Localizer позволяют быстро и просто локализовать свойства компонентов каждой формы, создавать языковые файлы с текущими значениями свойств компонентов, управлять файлами локализаций, а также назначать компоненты и их свойства, подлежащие локализации. Язык приложений, использующих Advanced Localizer, может быть переключен на другой непосредственно во время работы без последующего перезапуска приложения. Advanced Localizer также предусматривает возможность написания приложений-потомков, использующих языковые файлы, заданные пользователем.

Так как “незаменимых” у нас нет, то я провел свой небольшой тест этих компонентов все на том же маленьком приложении в 1 форму.
Мой тест
Скачал и установил пакет компонентов в Delphi XE2, открыл проект. В палитре компонентов Delphi появилась новая вкладка – EMS Advanced  Localizer. С этой вкладки бросам на форму компоненты:

  1. TQLanguageSource
  2. TQFormLocalizer

У TQFormLocalizer в свойстве Source указываем TQLanguageSource и приступаем к работе.

Первым делом создаем файлы для локализованных строк – делаем два пустых файлика с расширениями *.lng (расширение по умолчанию для EMS Localizer) и называем их просто – rus и eng.

Можно и не создавать эти файлы – они создадутся автоматически при переводе

Теперь дважды щелкаем мышкой по компоненту TQLanguageSource для вызова менеджера языковых файлов:

Жмем единственную активную кнопку и добавляем файлы:

Теперь, по идее разработчиков, в списке менеджера должна появиться новая запись…однако её нет. Вот значения, которые содержатся в свойстве Languages компонента:

Однако список визуального редактора девственно чист. Ну да Бог с ним со списком – пробуем перевести наше приложение. Дважды щелкаем по второму компоненту (TQFormLocalizer) для вызова редактора перевода:

В редакторе мы можем помимо перевода строк также добавить новый языковой файл, отредактировать имеющийся язык или выбрать язык, используемый по умолчанию. Как можно видеть на рисунке – в редактор попадают только строки, содержащиеся в свойствах компонентов, а ресурсные строки и константы остаются незамеченными, что можно записать в недостатки этих компонентов.

После перевода всех строк можно добавить в программу опцию для переключения языка интерфейса. Делается это примерно также как и в TsiLang – указанием индекса активного языка:

QLanguageSource1.ActiveLanguage:=1;

При этом, если используется язык по-умолчанию (отмечен как “Original”), то у него индекс равен -1, а у остальных – начинается с нуля и наращивается по порядку в списке Languages.

Другие возможности EMS Advanced Localizer:

  1. Загрузка переводов из базы данных

Подведем итог.

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

  1. Компоненты просты в использовании – на то, чтобы разобраться что и как работает ушло от силы минут 5.
  2. Достаточно дешевые
  3. Есть возможность хранить переводы в БД

Недостатки:

  1. Нет поддержки словарей и, соответственно, авто-переводов
  2. Проблемы в простеньком менеджере языков
  3. Не поддерживается перевод констант и ресурсных строк
  4. Нет инструментов для сторонних переводчиков

В целом мое мнение по поводу  EMS Advanced Localizer – достаточно удобные компоненты для работы с небольшими проектами, но для более менее крупных проектов где требуется поддержка многих языков, работа нескольких человек над переводом и т.д. этот набор компонентов, к сожалению, слабоват.

Korzh Localizerк содержанию

  • Разработчик: KORZH developers tools
  • Официальный сайт: devtools.korzh.com
  • Цена: от 149.0 EUR до 649.0 EUR
  • Наличие ознакомительной версии: имеется
  • Дата последнего релиза: 23 июля 2012
  • Поддержка Delphi XE2: имеется.

Что говорят о своем продукте разработчики:

Один EXE-файл может поддерживать несколько языков. Дополнительные языки могут быть добавлены без перекомпиляции. Нет необходимости создавать множество exe-файлов
Строковые данные могут храниться как в стандартных ресурсных DLL, так и в специальных языковых файлах
При локализации код программы либо изменяется очень мало (буквально пару строк), либо не изменяется вообще. Localizer не меняет проект приложения, т.к. не используются какие-либо дополнительные компоненты
Локализованный проект можно запускать на компиляцию без установленного Localizer
Localizer переводит как ресурсы из VCL, так и любые другие ресурсы
Поддерживается хранение переводов в стандартном Хранилище переводов (Translation Repository) и их повторное использование в будущем
Поддерживает все сторонние компоненты и пакеты (например, DevExpress, TurboPower, ElPack, RX и т.д.)
Процесс перевода можно осуществлять с помощью встроенной утилиты Language Manager, свободно доступной для закачки переводчиками
Простой переход из Borland ITE (Integrated Translation Environment — интегрированная среда перевода)

Мой тест

Скачал триал, отличие которого от полной версии заключается в том, что Localizer переводит только первые 30 строк из каждой формы/файла. Установил После чего в главном меню Delphi XE2 появился новый пункт:

Выбрал в меню “Start project localization” в итоге меня попросили выбрать основной язык для проекта и указать папку для хранения языкового файла:

После нажатия “Localize mu project!” была запущена перекомпиляция проекта, а в dpr-файле проекта добавились необходимые модули и вызов методов Korzh Localizer’а:

uses
  {....}, LocOnFly,
  {Form18};
 
{$R Project16.KLR}
 
{$R *.res}
 
begin
  LocalizerOnFly.InitReg;
  {...}
end.

Также, сразу же после информационного сообщения о том, что мой проект локализован запустился Language Manager:

В диалоге выбора нового языка для локализации есть замечательная опция – “Try to automatically translate via Google”. Однако опция эта в настоящий момент не работает:

Связано это не стем, что разработчики там чего-то не так сделали. Причина кроется в том, что Google перевел API Translate на коммерческие рельсы и, если не ошибаюсь, сделали доступ только по OAuth 2.0. Так, что, видимо в следующих редакциях Korzh Localizer’а эта опция пропадет либо будет использоваться для более доступных API, например, для Bing Translator API.

После добавления языка для локализации в Language Managere появляется таблица для перевода найденных в проекте строк. Помимо того, что непосредственно находится в проекте, Korzh Localizer также позволяет локализовать и строки, содержащиеся в других модулях Delphi:

После перевода Localizer может показать вам статистику – сколько строк переведено, процент перевода и т.д., однако и тут обнаружилась ошибка при переключении на вкладку “External Items”:

Мелочь, конечно, но не приятная. Далее мне необходимо было проверить то, как Korzh Localizer умеет вытаскивать из исходников жестко закодированные строки. Для этого в главном меню была выбрана опция:

Помощник (назовем его так) предлагает выбрать модули для сканирования на наличие строк, а также, предлагает два варианта хранения строк – в ресурсном файле или в pas-файле:

Я оставил все настройки по умолчанию. В модуле было три строки – одна в секции resourcestring, вторая – в const и третья – в обработчике OnClick кнопки. В итоге Korzh Localizer определил следующее:

После нажатия “Next”  IDE выдала сообщение:

После нажатия “Yes” в uses был добавлен новый модуль, содержащий секцию resourcestring в которой находилась одна найденная строка. Также изменился и обработчик OnClick кнопки, который стал выглядеть так:

procedure TForm19.Button1Click(Sender: TObject);
begin
ShowMessage(SIgeaaoIeg);
end;

В Language Manager’е строка не появилась – может предполагается, что такие строки переведутся и без менеджера, а может они как-то хитро добавляются в менеджер – с этим я не разбирался детально. Мне осталось только проверить как происходит локализация. Для того, чтобы проект “заговорил” на другом языке достаточно было выбрать в главном меню необходимый язык:

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

Другие возможности Korzh Localizer:

  1. Создание/импорт/экспорт репозиториев. Импорт и экспорт осуществляется в XML или TMX-форматах.
  2. Поддерживает несколько языков для локализации – на каждый язык создается отдельный файл
  3. Умеет работать с EXE- и DLL-файлами.
Достоинства:
  1. Не требует наличия на форме каких-либо компонентов – все, что необходимо Korzh Localizer сам подключает в dpr.
  2. Есть инструмент для переводчиков
  3. Есть возможность создавать/импортировать/экспортировать репозитории
Недостатки:
  1. Пока работал с инструментов обнаружил разного рода недочёты типа ошибок (см. скрины выше), недочёты в интерфейсе, наличие неработающих опций (в то время как Google уже давным давно закрыл доступ к API, а релиз локализера был относительно недавно). Все это создает ощущение, какой-то заброшенности проекта.
  2. Ресурсные строки не попадают в Language Manager или как-то так хитро, что сразу и не сообразишь куда надо нажать или что куда добавить.

В целом я бы пока оставил Korzh Localizer как запасной вариант на случай, если не найдется ничего более подходящего. Помимо описанных выше недостатков, одной из причин такого вывода послужило время, которое потребовалось, чтобы освоиться в работе с инструментом – из всех выше рассмотренных  инструментов Korzh Localizer отнял больше всего времени.

GNU gettext for Delphi and C++ Builder toolkitк содержанию

  • Разработчик: dxgettext.po.dk
  • Официальный сайт: dxgettext.po.dk
  • Цена: бесплатно
  •  Дата последнего релиза: неизвестно
  • Поддержка Delphi XE2: нет

Несмотря на то, что поддержки Delphi XE2 нет, я все-таки решил скачать и попробовать в работе эту библиотеку. К сожалению после подключения dxgettext.pas к проекту посыпались ошибки – где-то вместо ansiString указали string, использовали методы, помеченные как depricated, использовали неверные параметры методов (может в Delphi 2009 такой код компилировался, но в XE2 – нет). В общем много чего повылазило… А жаль. В Lazarus я использовал эту библиотеку пару раз и, надо сказать, она мне понравилась. Конечно, для уже существующих проектов внедрять в работу DXGetText будет довольно проблемно, но для новых – вполне сносная и удобная библиотека. Есть несколько утилит для переводчиков, память переводов и т.д. В общем, если задумаете начинать проект на Delphi версии до 2009 и потребуется бибилотека для локализации и интернационализации проекта – попробуйте DXGetText.

i18n Packageк содержанию

  • Разработчик: Kambiz R. Khojasteh
  • Официальный сайт: www.delphiarea.com
  • Цена: бесплатно
  • Дата последнего релиза: 19 августа 2012
  • Поддержка Delphi XE2: нет (согласно информации на оф.сайте)

i18n Package v1.10 for Delphi представляет из себя целую библиотеку компонентов, предназначенных для локализации и интернационализации проектов. Несмотря на то, что официально поддержка Delphi XE2 не заявлена эта библиотека без проблем установилась в Delphi XE2, поэтому я решил немного её протестировать.

В пакет входят свыше 30 различных компонентов, поддерживающих локализацию, однако меня, как Вы понимаете, интересует другой момент – можно ли эту библиотеку использовать для локализации уже имеющегося проекта с кучей форм, диалогов, ресурсных строк и т.д.

Итак, работа по локализации с помощью i18n Package происходит следующим образом:

  1. Бросаем на главную форму компонент TLocalizer
  2. На все остальные формы (включая и главную) бросаем компонент для перевода – TTranslator
  3. Для локализации диалогов также необходимо уложить на главную форму форму компонент TMessageBox и указать в нем необходимые заголовки, иконки и т.д.

Теперь надо создать файл с переводами строк. Для этого дважды кликаем мышкой по компоненту TTranslator – откроется редактор в котором необходимо выбрать свойства и строки, которые мы будем переводить:

Если необходимо сделать интернационализацию проекта – не трогайте ничего в поле “Property Value”, т.к. добавление новых языков и перевод строк осуществляется в отдельной утилите

После того, как необходимые элементы выбраны преходим на вкладку Export, указываем язык на котором наши строки написаны (т.е. Русский) и экспортируем строки в файл *.i18n:

Файл создан – можно приступать к переводам. В папке Bin библиотеки находится специальная утилита под названием i18n Editor, которая и предназначена для переводов.

Программка довольно простая в использовании и, думаю, Вы с ней очень быстро освоитесь. Скажу только, что i18n Editor способен “обучаться” – для этого программе необходимо указать папку в которой лежат уже готовые файлы *.i18n и программа автоматически их просканирует и вытащит из них новые для себя фразы.

После того, как все необходимые строки переведены возвращаемся в Delphi и указываем в свойстве URI компонента TLocalizer наш файл с локализациями. Теперь добавляем на форму компонент TCultureBox и в его свойстве Localizaer указываем Localiwer1 (если компонент не переименовывался).

Теперь можно запустить программку и убедиться, что перевод интерфейса происходит успешно:

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

  1. Очень простая в использовании библиотека
  2. Для своей цены – $0.0 достаточно качественная (в Delphi XE2 работает отлично)

Недостатки:

  1. Парсер не обнаруживает resourcestring и строковые константы, а обнаруженные и переведенные строки из кода программы все равно не локализуются.
  2. Для каждой формы/модуля необходимо использовать свой TTranslator, что не совсем удобно. Логичнее было бы сделать небольшой сканер всего проекта на наличие строк как это сделано, например, у DXGetText

Общий вывод по библиотеке можно сделать следующий – для соотношения “цена/качество” замечательная библиотека, позволяющая практически без проблем сделать мультиязыковую поддержку в небольших проектах. Немного портит впечатление работа бибилотеки со строками не из свойств компонентов, думаю, что если проект живет (а судя по релизу – проект вполне себе живой), то эта досадная проблема решится.

Kryvich’s Delphi Localizerк содержанию

  • Разработчик: Kryvich
  • Официальный сайт: sites.google.com/site/kryvich/localizer
  • Цена: бесплатно
  • Дата последнего релиза: 7 января 2012
  • Поддержка Delphi XE2: имеется
Ещё одна бесплатная библиотека для локализации и интернационализации приложений Delphi. По заявлению авторов проекта, с этой библиотекой локализация наших приложений должна пройти без каких либо проблем. Проверим, так ли это на самом деле.
Первым делом нам необходимо изменить опции проекта. Заходим в IDE: Project->Options->Linking и устанавливаем Map File = detalied
Теперь собираем проект и получаем три файла – *.exe, *.drc и *.map. Теперь запускаем консольную утилиту kdlscan.exe, которая находится в папке с библиотекой. Утилита запускается с параметром:
kdlscan [project.exe]

где [project.exe] – имя нашего exe-файла. 
Сканер проходит по проекту и вытаскивает ресурсные строки и строки из свойств компонентов и укладывает их в файл с расширением *.lng. Этот файл – обычный ini-файлик, поэтому смело его открываем любым редактором и переводим все строки как нам необходимо.
После перевода сохраняем полученный файл, например, с названием english.lng.
Теперь приступаем к работе над проектом. Для поддержки локализации добавляем в uses главной форму модуль uFreeLocalizer.pas, также бросаем в папку с проектом модуль uStringUtils.pas  и в любом удобном месте программы пишем:
FreeLocalizer.AutoTranslate:=True;
FreeLocalizer.LanguageDir:=ExtractFilePath(Application.ExeName);
FreeLocalizer.LanguageFile:='english.lng';

Первые две строки можно записать в dpr-файле и там же подключить модуль локализатора. Все. Можно запустить программу и проверить работу.

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

  1. Очень простая в использовании библиотека
  2. Компактная

Недостатки:

  1. Нет словарей
  2. Сканер не определяет жестко закодированные строки и константы

В целом библиотека вполне подойдет для проектов с небольшим количеством строк для локализации. Всё-таки работа через ini-файл даст о себе знать при большом объеме данных.

JVCL (JEDI Visual Component Library)к содержанию

  • Разработчик: JEDI Project
  • Официальный сайт: jvcl.delphi-jedi.org
  • Цена: бесплатно
  • Дата последнего релиза: 11 апреля 2011
  • Поддержка Delphi XE2: имеется
Кто не знает проект JEDI? Эту гигантскую библиотеку знают, наверное, все, кто хоть чуть-чуть работал в Delphi. В состав этой библиотеки входит компонент TjvTranslator, который позволяет локализовывать приложения Delphi. Судя по отзывам на различных форумах и в блогах, компонет довольно удобный и пользуется популярностью, но ставить весь набор JCL+JVCL ради того, чтобы взглянуть на работу одного чудо-компонента мне как-то не улыбнулось. Поэтому достоинства и недостатки искать Вам придётся самостоятельно. А я перейду к другим компонентам.

CnPack Component Package (CnVCL)к содержанию

  • Разработчик: CnPack
  • Официальный сайт: www.cnpack.org
  • Цена: бесплатно
  • Дата последнего релиза: 5 ноябра 2011
  • Поддержка Delphi XE2: имеется

Ещё один достаточно разработчик, получивший заслуженную популярность своим продуктом под названием cnWizards, предоставил нам набор компонентов для локализации приложений. Эти компоненты входят в состав отдельного пакета – cnVCL и распространяются бесплатно.

Сразу отмечу, что на текущий момент последняя доступная для скачивания версия компонентов помечена как Alpha, поэтому ждать от этого набора компонентов безупречной работы не приходится. Но, тем не менее, небольшой обзор компонентов локализации я зделаю.

Итак, после установки пакета cnVCL в палитре компонентов появляется сразу несколько новых вкладок:

на влкадке cnMultiLang расположены 4 компонента для локализации. Три из них: TCnLangManager, TCnLangTranslator и TChHashLangFileStorage или TChIniLangFileStorage должны быть размещены в приложении.

Надо сказать, что Alpha-версия дает о себе знать. Чтобы по-быстрее разобраться с работой этих компонентов я решил запустить небольшую демку, которая идет в комплекте с исходниками компонентов…она, конечно, открылась в Delphi XE2, но что-то уж как-то совсем странно:

Ну да это, в принципе, терпимо – исходник-то, вроде бы не сильно “покорежин” и разобраться с тем, что и как работает более-менее удалось. Суть работы такова:

1. Бросаем на форму приложения три вышеобозначенных компонента (я выбрал TCnLangManagerTCnLangTranslator и TChIniLangFileStorage)

2. Теперь выбираем TChIniLangFileStorage и добавляем в коллекцию Languages новые языки. Выглядеть это должно примерно так:

3. У TCnLangManager в свойстве LanguageStorage указываем наш компонент CnIniLangFileStorage1

4. Делаем двойной клик по TCnLangTranslator – откроется редактор для перевода строк:

5. Выбираем в дереве необходимый язык и жмем “Gen All” – должна собраться таблица со строками для перевода. У меня она оказалась вот такой:

6. Переводим необходимые строки, ненужные строки – удаляем, сохраняем полученную таблицу в файл. Получаем в итоге ini-файл, который надо бросить рядом с exe-файлом нашего проекта.

7. Пишем в любом удобном месте программы одну строку:

  CnLangManager1.CurrentLanguageIndex:=0;

В итоге это действие приведет к тому, что программа будет “переведена” на язык, который в LangugeStorage имеет индекс 0, т.е. в моем случае – на английский язык. Скрин приводить не буду, просто скажу, что компонент сработал.

Что можно сказать по поводу достоинств и недостатков этих компонентов? Думаю, что пока какие-либо выводы делать не стоит – всё-таки Alpha-версия и тут неизбежны всякого рода баги, странности поведения и т.д. и т.п. Если работа над компонентами продолжится, то скорее всего мы должны получить в свое распоряжение простенькие и легкие в использовании компоненты для локализации и интернационализации проектов. Пока же использовать эти компоненты в серьезных приложениях очень и очень рано.

TLang для FireMonkeyк содержанию

  • Разработчик: Embarcadero
  • Официальный сайт: embarcadero.com
  • Цена: входит в стоимость Delphi
  • Дата последнего релиза: 03 сентября 2012
  • Поддержка Delphi XE2: имеется

 

Про этот компонент и работу с ним я рассказывать подробно не буду, т.к. в блоге уже есть статья, касающаяся работы именно с TLang в FireMonkey. Статья называется “Локализация приложений Firemonkey. Компонент TLang” – в ней же Вы найдете достоинства и недостатки этого компонента. В Delphi XE3 работу компонента не проверял.

Multilizerк содержанию

  • Разработчик: Finnish technology company
  • Официальный сайт: www2.multilizer.com
  • Цена: 299 – 2900 EUR
  • Дата последнего релиза: неизвестно
  • Поддержка Delphi XE2: имеется

Несмотря на довольно не маленькую цену продукта я все же решил посмотреть, что из себя представляет данных продукт. Multilizer – это специализированный продукт, позволяющий локализовать  различные типы приложений, файлов, dll и т.д. Также в комплект поставки входит набор компонентов для Delphi 5 – XE2. Компоненты я устанавливать не стал, а вот само приложение Multilizer решил испробовать на своем приложении.

Все начинается с тог, что мы создаем новый проект для локализации:

Выбираем первый вариант. Следующий шаг – выбор парсера:

 

На третьем шаге Multilizer просит нас указать ему файл для парсинга (указал exe), проводит парсинг и выводит результат сканирования:

Следующий шаг – это определение нативного языка приложения и добавление новых языков для локализации:

Multilizer позволяет также определять язык автоматически, но при этом почему-то просит логин и пароль к аккаунту Google 0_O (хоть не ключи от квартиры где деньги лежат). Эту функцию программы я проверять не стал.

После того, как проект создан, открывается окно редактора переводов, которые выглядит вот так:

Надо отметить, что редактор этот довольно навороченный и в течение 5-10 минут разобраться с ним будет сложно (скорее даже – невозможно), поэтому отмечу только то, что мне запомнилось. Например, визульный редактор, с помощью которого можно посмотреть как будет выглядеть переведенная программа:

Также довольно удобно организована работа над самим переводом – можно использовать память переводов, сразу же на виду вся статистика перевода. Также удобно “на лету” смотреть как выглядит переведенная программа – для этого в Multilizer есть опция “Run Translated” (запускается знакомой нам клавишей F9). В общем впечатления от работы с программой остались положительные. Подведу небольшой итог.

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

  1. Удобный и понятный интерфейс (с основами работы разобрался быстро, дальше просто не полез)
  2. Есть память переводов
  3. Проекты можно группировать и автоматически переводить более новые версии программы, основываясь на переводах предыдущих версий
  4. Удобный визуальный редактор с возможностью просмотра форм приложения без запуска exe
  5. Просмотр переведенного exe “на лету”
  6. Есть возможность работы с Google Translator Toolkit (работу не проверял – просто видел, что есть такая опция)

Недостатки:

  1.  Недостаток один, но, критичный – цена. 2900 европейских рублей за программу, пусть и такую замечательную – это, по-моему, слишком дорого. Тем более, что есть и более экономичные аналоги.

SDL Passoloк содержанию

  • Разработчик: SDL
  • Официальный сайт: www.sdl.com
  • Цена:  1840 EUR
  • Дата последнего релиза: неизвестно
SDL Passolo – это ещё один комбайн, наподобие Multilizer, предназначенный для перевода строковых ресурсов различных файлов – от XML до OCX, EXE, DLL и т.д. В сравнении с тем же Multilizer’ом этот инструмент выглядит скромновато, хотя и может быть использован для локализации приложений.
Проверим работу этого инструмента на все том же многострадальном тестовом приложении.
Как обычно, начинаем с создания нового проекта. Для этого запускаем Passolo и выбираем в меню слева “New Project”
При добавлении источника (exe-файла) появляется новый диалог в котором необходимо задать настройки парсера (их у Passolo несколько), язык программы, кодовую страницу и т.д.:
После создания нового проекта Passolo создает необходимые записи, объекты и можно приступать к переводу:
В списке дважды кликаем мышкой по записи, содержащий проект локализации (Target). В моем случае – это запись для английского языка. Откроется новая вкладка, содержащая строки для перевода:
Переводим строки и собираем снова проект. Для сборки проекта возвращаемся на вкладку Project, выбираем строку с целевой локализацией, вызываем контекстное меню и выбираем там пункт “Generate Targer File”:
В итоге рядом с первоначальным Exe-файлов появится ещё один с приставкой eng (ну или другой, в зависимости от языка перевода). Вот в двух словах процесс перевода с использованием SDL Passolo.

Другие возможности SDL Passolo:

  1. Поддерживает глоссарии перевода.
  2. Поддерживает несколько языков для локализации
  3. Авто-перевод на основе базы данных по переводам
Достоинства:
  1. Простой в использовании
  2. Можно подключать различные аддоны, расширяя тем самым функциональность программы
  3. Есть проверка орфографии
Недостатки:
  1. т.к. программа практически универсальная и работает с уже собранными проектами, то соответственно, парсеры Passolo никак не реагируют на жестко закодированные строки, константы и т.д.
Общий вывод по работе с программой у меня такой – удобная программа для быстрой локализации проекта, когда требуется в кратчайшие сроки перевести GUI на другой язык.

Radialixк содержанию

  • Разработчик: Алексей Головин
  • Официальный сайт: www.radialix.ru
  • Цена:  от 500 руб.
  • Дата последнего релиза: неизвестно
Чем подкупает Radialix, так это широкой поддержкой всевозможных файлов для локализации. Здесь есть поддержка и практически всех рассмотренных выше решений и работа с пакетами для Android и ещё куча всяких форматов о некоторых из которых я даже и не слышал. Демо-версия Radialix также достаточно демократична – все функции доступны, но при сборке локализованного файла к некоторым строкам добавляются произвольные символы, но имхо, при цене в 500р. – это мелочь.
Итак, что представляет из себя Radialix. Radialix при запуске встречает нас русским интерфейсом и предлагает создать или открыть проект локализации:
Создаем новый проект. После добавления в список файла для локализации (я выбрал снова exe) появляется окно с набором опций проекта:

В Radialix есть возможность “выдирать” жестко закодированные строки, для настройки  которой предусмотрена целая вкладка опций:

 Я создал проект со следующими настройками:
В итоге Radialix создал мне проект со следующим содержимым:
Также в Radialix есть удобный просмотрщик форм приложенияв котором можно также и отредактировать положения и размер элементов:
Про перевод, думаю, говорить особого смысла нет – в Radialix перевод и сборка проекта осуществляется аналогично SDL Passolo и Multilizer о которых я уже говорил выше. Остается только добавить пару моментов по дополнительным возможностям и выделить достоинства и недостатки.
Дополнительные возможности:
  1. Память переводов и авто-перевод
  2. Проверка орфографии
  3. Поддерживает локализацию PE32, PE32+ файлов и файлов ресурсов RES, сборок и файлов ресурсов .NET Framework 1.0..4.0, .NET Compact Framework 1.0..3.5, ресурсов WPF BAML, строк и ресурсов в коде приложения, текстовых файлов (ini, lng, csv, tab, isl, glo, php и др.), XML файлов (XML, WXL, …), PO и MO файлов (библиотека Gettext), TS и QM файлов (библиотека QT), SIL и SIB файлов (библиотека TsiLang), dklang и lng файлов(библиотека DKLang), lng файлов Korzh Localizer.
  4. В качестве памяти переводов можно использовать файлы GLO, QPH, LG3, DIC, DIX и DAT.
Достоинства:
  1. Удобный, простой и понятный интерфейс
  2. Подробнейшее руководство на русском языке (более 300 страниц текста)
  3. Поддерживает работу с жестко закодированными строками
  4. Есть память переводов
Недостатки:
  1. У меня в проекте не обнаружились все жестко закодированные строки. Очень вероятно, что это произошло по причине отсутствия плагина RDMAP.
Общий вывод после знакомства с Radialix у меня сложился следующий – отличная программа для локализации приложений. При цене в 500 р. за одну лицензию Radialix имеет функциональность на ровне с тем же Passolo.

Integrated Translation Environmentк содержанию

  • Разработчик: Embarcadero
  • Официальный сайт: www.embarcadero.com
  • Цена: входит в состав Delphi
  • Дата последнего релиза: неизвестно
Этот инструмент находится последним в списке описания решений, но не на последнем месте у разработчиков. Как и в случае с TLang для FireMonkey я не буду рассказывать про этот инструмент подробно, т.к. это уже сделал Александр Алексеев в статье “Локализация проектов Delphi – родной способ (ITE – Integrated Translation Environment)“. Читать статью советую вместе с комментариями, чтобы получилась более менее полная картина относительно ITE.

Другие компоненты, библиотеки и программык содержанию

Кроме перечисленных выше библиотек и компонентов для локализации интернационализации ваших Delphi-проектов в Сети есть ещё достаточно много больших и маленьких компонентов для решения этой задачи. Я просто приведу список с перечнем компонентов и ссылками на официальные сайты – вполне возможно, что среди этих решение найдется именно то, которое окажется для Вас наиболее удобным по цене и качеству.

Название Разработчик Цена
1 DC Form Translator и DC Form Flipper Dynamic Components $249/$149
2 ICU4PAS crossgl.com бесплатно
3 IniLang2 IniLang2  бесплатно
4 JKCaptionReader v.1.0 Torry’s Delphi бесплатно
5 LangMan v.1.2.0 REGULACE.ORG бесплатно
6 Precision Language Suite Precision software & consulting от 36 до 610 EUR
7 DeLoc deloc.narod.ru бесплатно
8 Sisulizer www.sisulizer.com 359/899 EUR
9 Lingobit localizer www.lingobit.com $695/$1950

Часть этих компонентов живет и развивается, часть – находится в полумёртвом состоянии, но, вполне возможно, что заработает под XE2. Вот такой у меня получился список решений. Сюда можно было бы добавить ещё ряд компонентов/программ, но, думаю, и из этого списка можно будет выбрать что-нибудь стоящее. Что касается лично моего мнения, то проведя этот обзор я бы склонился к следующим вариантам:

  1. Для интернационализации программы я бы выбрал TsiLang – достаточно мощные компоненты. Хоть они и не без греха, но работать с ними вполне можно.
  2. Для локализации готовых программ – Radialix.

Ну, а чем бы Вы воспользовались (или уже пользуетесь) я бы хотел прочитать в комментариях :).

30
Оставить комментарий

Пожалуйста, авторизуйтесь чтобы добавить комментарий.
19 Цепочка комментария
11 Ответы по цепочке
0 Последователи
 
Популярнейший комментарий
Цепочка актуального комментария
15 Авторы комментариев
РоманБублик ВиталийСергей Сериковrrrparadox Авторы недавних комментариев
  Подписаться  
Уведомление о
Александр
Гость

Влад, респект! Я обалдел от объёма материала.

ildvild
Гость

Влад, спасибо за обзор, очень интересно. Хочу написать по поводу DKLang Localization Package. Насчет XE2 точно не знаю, но я использовал его в 2010 версии, где он встал без дополнительных компонентов. На него мой выбор пал ввиду его бесплатности)), но по возможностям он не уступает TsiLang. Есть ли возможность извлечения ресурсных строк или нет, я точно не помню, но присутствует возможность создание словаря, а также импорта переводов из файлов *.lng. Ну вообщем он мне понравился, достаточно прост и удобен.

Александр Божко
Гость

Хороший обзор.

Таки, не я один такой умный.
Многие думают “в сторону автоматической локализации” с помощью сервисов перевода.

Алексей Тимохин
Гость

Молодец, Влад! Большую работу проделал. У меня на работе вопрос локализации поднимался года 3 назад. По некоторым причинам (трудно было выбить деньги на покупку, не разобрались с ITE), мы решили делать движок для перевода и редактор самостоятельно. Ещё один нюанс был, в том, что мы решили делать перевод по словарю. Т.е. собирались все строки в словарь и переводились. А при загрузке перевода, программа искала перевод для нужной строки в нашем словаре. Словарь, к слову, должен был храниться в БД (но это сделать – раз плюнуть для любого движка). У нас уже был написан готовый парсер DFM-ок, который парсил проект и… Подробнее »

Алексей Тимохин
Гость

Ещё замечание по статье по поводу бесплатности некоторых решений. Для некоторых вариантов, бесплатность весьма условна. Например, в лицензии CnPack явно запрещается использование их кода в коммерческих продуктах или продуктах с закрытым исходным кодом, включая плагины и библиотеки для таких продуктов, без формального согласия команды CnPack. Разрешается использовать только в OpenSource проектах. You may not use the CnPack source code to develop proprietary or commercial products including plugins or libraries for those products without CnPack Team’s formal authorization. If you need the authorization, please contact CnPack Team. GnuGetText и i18n явно разрешают использование и в коммерческих продуктах. JVCL распространяется по MPL,… Подробнее »

Alextp
Гость

По поводу DKLang. Использую в проекте SynWrite text editor, есть плохой момент. При динамическом создании форм, если создаем более 1 формы одного типа — баг – не локализуется вторая (и 3-я и тп.) форма, локализуется только первая. Это может раздражать. В целом нравится, все работает. TNT оно требует только в Д5-Д7 версии. Еще один минус – саппорт DKLang сдох, обращался 2 раза по тому багу и не было ответа.

zdm
Гость
zdm

Огромное спасибо за статью Влад. ООООООчень и очень актуально для меня в данный момент. Попробую все варианты, отпишусь.

Alex
Гость
Alex

“DKLang. Поддержка Delphi XE2: нет” . Есть. Я только что собрал XE2 проект с DKLang. все ОК

Alex
Гость
Alex

Vlad: есть- берем D2009 версию 4.0. ПО ФАКТУ есть

wassail
Гость
wassail

По поводу DXGetText и отсутствия поддержки в XE 2. Она есть, всё работает, правда на официальном сайте лежит старый файл.

trackback
STRINGTABLE и работа с идентификаторами языков в Delphi. | Delphi в Internet

[…] в прошлом (теперь уже) году публиковал я статью-обзор "23 решения для локализации и интернационализации прило…" в котором я рассмотрел различные инструменты для […]

Igor
Гость
Igor

Использую давно DeLoc. Отличный локализатор. Есть версия и для XE

rrr
Гость
rrr

Если есть на компьютере, скинь пожалуйста версию для ХЕ а то на сайте автора битые ссылки

Akella
Гость

Как я локализовал своё приложение на Delphi
http://forum.vingrad.ru/forum/topic-346917.html

Мне пришлась по душе программа Radialix. Недорого и на русском + русская техподдержка. К великому сожалению, как потом оказалось, автор не спешит исправлять баги программы. На среднем проекте (по моим меркам) программа показала себя не очень – интерфейс постоянно дёргается, перерисовывается. Автор на замечания не реагирует.

Akella
Гость

Почему-то автор статьи забыл про Lingobit localizer.
Lingobit localizer и Radialix схожи.
Но Lingobit localizer шустрее, значительно шустрее.
Меньше настроек и проще.
Я бы использовал именно Lingobit localizer, но цена….

paradox
Гость
paradox

через TJvTranslator как переводить resourcestring? Вообще это возможно?

rrr
Гость
rrr

Поделитесь пожалуйста ссылкой на DelLoc 3.00 для Delphi XE если у кого есть, а то на сайте автора ссылки мертвые.

Сергей Сериков
Гость

“Поделитесь пожалуйста ссылкой на DelLoc 3.00 для Delphi XE если у кого есть, а то на сайте автора ссылки мертвые.”

http://delloc.narod.ru/dlcxeinst.exe

Бублик Виталий
Гость
Бублик Виталий

Вы можете опубликовать рисунок для Делфи – тот, что был выше, embarcadero-delphi-150×150.png – в виде иконки .ICO
Может также есть ангалогичная иконка для C++ Builder ?

Роман
Гость
Роман

Кто-нибудь может объяснить, как сделать локализацию для языка, отличного от русского и английского? Например, для греческого – как ввести строку с греческими символами в любой из описанных утилит?! Особенно меня интересует древность вроде Delphi 7 – я даже “фирменной” утилиткой из комплекта поставки не могу этого сделать – одни вопросики вместо символов видны!!!