manager
Заметки по локализации программ на Delphi
[Другие статьи автора] [Субъективный взгляд на электромобиль] - Чем отличается программист от шамана? В те давние времена студенчества, когда я жил в общаге, случилось, как-то раз, написать таймер с обратным отсчетом и поддержкой скинов. После того как таймер несколько раз спас мою единственную кастрюлю и ужин, программа таинственным образом обросла функциональностью, хелпом, инсталлятором, получила гордое название SDATimer, и прочно обосновалась в Интернете под шареварной лицензией. Уже тогда, прочитав в "Кулибе" Валентина Озерова статью о локализации программ с помощью динамически подключаемых библиотек ресурсов, была сделана удачная попытка перевода программы на родную беларускую мову с помощью Resource DLL Wizard. Окрыленный успехом, не долго думая, поместил в пакет инсталляции файл localization.txt, с перечислением всех надписей в программе, в надежде на добрую душу добровольца, желающего иметь интерфейс программы на родном языке. Много воды утекло с того времени и вот, в один прекрасный момент, такой доброволец нашелся и прислал перевод интерфейса на испанский язык. Как часто получается при программировании в Delphi: "Меньше думай, больше делай" - гораздо быстрее склепать предварительную версию, немного с ней поработать, потешить свою душу ощущением собственной крутости, а потом переписать заново так, чтобы к старости не было обидно за бесцельно прожитые годы. В соответствии с этим принципом был запущен Resource DLL Wizard, определена локализация как 'Испанский (международная сортировка)', в полученном проекте все надписи были изменены, отрегулированы размеры элементов под длину надписей, все это скомпилировано. На выходе получился файл SDATimer.ESN, который и был помещен в рабочий каталог программы. В Панели Управления (вкладка 'Язык и региональные стандарты') были установлены настройки локали на 'Испанский (Испания)', программа перезапущена, и, удивительно, все вроде бы заработало - все надписи поменялись, интерфейс стал подозрительно испанским и функциональность программы полностью сохранилась. На радостях SDATimer.ESN отправлен на окончательное тестирование, и тут, как всегда подкралась незаметная мысль: "А что, если бы...?". Сразу же обнаружился небольшой облом: при изменении настройки локали на любую, отличную от 'Испанский (Испания)', например, на 'Испанский (Гондурас)', интерфейс программы менялся с подозрительно испанского на другой, очень похожий на исходный английский (что на самом деле и было). В попытках понять, что произошло, и почему не поддерживается гондурасский, был перелопачен Delphi Help, Windows SDK Help, Delphi World 6. Несколько раз проект перекомпилировался под разные локали, но поддержка "единого и могучего" испанского языка не получалась. В конце концов была вспомнена та древняя мудрость, почерпнутая в "Кулибе" - загрузка файла локализации происходит согласно расширению файла динамически подключаемой библиотеки ресурсов. Тогда, собравши остатки интеллекта, еще не полностью угробленного учебой и работой, все быстро соотнеслось со словами в Delphi Help о том, что первые две буквы расширения файла ресурсов отвечают за базовый язык, а третья - за конкретную локализацию для данного языка. Исходный многострадальный файл SDATimer.ESN был переименован в SDATimer.ES, и, как не странно, интерфейс стал испанским при использовании любой испанской локали. В качестве лирического отступления хочу отметить преимущество метода использования динамически подключаемых библиотек ресурсов для локализации программ:
Так как "бесплатный сыр бывает в мышеловке или в мышке ловкой", то и при применении динамически подключаемых библиотек ресурсов приходится решать проблему большого размера библиотек локализации. Одним из выходов является использование инсталляторов с поддержкой архивации, причем при архивации размер библиотеки уменьшается в несколько раз (в случае с SDATimer, размер файла инсталляции вырос на 50Kb, при размере SDATimer.ES в 179Kb). Хотелось бы закончить данные заметки хэппи-эндом, но в результате поисков найдены исходники Demo RichEdit, поставляемые с Delphi, в них те же самые динамические библиотеки ресурсов подключаются принудительно из меню самой программы. Так что хэппи-энд будет, но уже не в рамках этой статьи. Как иллюстрацию метода можно скачать SDATimer здесь: http://sdisle.com/sdatimer/sdatimersetup.exe |
||
Copyright © Дмитрий Спицын, 2006 [Другие статьи автора] [Субъективный взгляд на электромобиль] |
- просмотров: 9921