Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #53, АПРЕЛЬ 2005 г.

Программа-полиглот

Islander (islanderx@mail.ru)

Спецвыпуск: Хакер, номер #053, стр. 053-072-2


Названия секций в файле заключаются в квадратные скобки, регистр символов не имеет значения. В каждой секции присутствуют параметры и их значения, которые разделены знаком "равно" по формату param=value. Полезная возможность ini-файлов – поддержка комментариев. Все комментарии начинаются со знака ";", после которого ты можешь писать все, что заблагорассудится.

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

Я рекомендую использовать префиксы для всех элементов управления на форме (например, для кнопки btn, для метки lbl), а для сообщений, которые будут показаны пользователю c помощью MessageBox'ов, использовать параметры с префиксом msg. Для всех прочих строковых меток будет использоваться префикс str. Что же делать со строками, которые логически не относятся ни к одной форме? Например, сообщение об ошибке проверки контрольной суммы exe-файла на том этапе, когда ни одна форма еще не создана. Все очень просто: создадим еще одну секцию, назвав ее, например, Global, и будем сваливать туда эти строки. Можно поступить подобным образом, если какие-нибудь ресурсы с префиксами msg и str используются одновременно в нескольких формах: запихнем их в секцию COMMON.

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

Некоторые разработчики, например, Кристиан Гислер (автор небезызвестного Total Commander'а) дают параметрам менее говорящие названия, например:

0="Нет доступа, или файл\n%s\nуже используется."

1="Укажите шаблон(ы) файлов (например: s*.doc;*.tx?)"

2="Создать новый каталог:"

На мой взгляд, в наше время такой подход неоправдан. Лучше пусть lng-файл будет вместо 30 Кб занимать 45, зато и тебе, и переводчику будет сразу понятно, что к чему относится.

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

Procedure TranslateFormComponents (Form: TCustomForm; LngFileName: string);

var

I : integer;

IniFile : TMemIniFile;

S : string;

begin

IniFile := TMemIniFile.Create (LngFileName);

for i := 0 to Form.ComponentCount - 1 do

begin

if Form.Components [i].name = '' then

Continue;

S := IniFile.ReadString (Form.Name, Form.Components [i].name, '#__ERROR__#');

If S <> '#__ERROR__#' then

begin

If Form.Components [i] is TLabel then

TLabel (Form.Components [i]).Caption :=S;

Назад на стр. 053-072-1  Содержание  Вперед на стр. 053-072-3