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

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

Islander (islanderx@mail.ru)

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


If Form.Components [i] is TButton then

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

end;

end;

IniFile.Free;

end;

Function TranslateMessage (SectionName, MsgID, LngFileName: string):string;

var

IniFile : TIniFile;

begin

IniFile := TIniFile.Create (LngFileName);

Result := IniFile.ReadString (SectionName, MsgID, '#__ERROR__#');

IniFile.Free;

end;

Мы имеем две функции, и это практически все, что нужно для перевода. Создаем в классе каждой формы приложения процедуру ApplyTranslate, в которой вызываем TranslateFormComponents (self, ‘Имя_нашего_lng-файла’), а также переводим все прочие статические элементы управления, которые не могут быть переведены автоматически. Не стоит также забывать и о всплывающих сообщениях(MessageBox’ах и т.п.), которые переводятся очень просто. Например, если тебе надо показать сообщение о том, что выйти из программы в текущий момент невозможно, пишешь вот так:

ShowMessage (TranslateMessage (self.name, ‘msgCannotExit’, ‘Имя_нашего_lng-файла’));

Если такая запись покажется слишком длинной и громоздкой (а мне так и показалось), можно сделать проще. Создай в классе формы новую функцию TranslateMsg и используй ее:

Function TranslateMsg (MsgID: string):string;

begin

Result := TranslateMessage (self.name, msgID, ‘Имя_нашего_lng-файла’)

end;

Вывод сообщения при этом примет такой вид:

ShowMessage (TranslateMsg (‘msgCannotExit’));

Красота! Теперь при переключении языка интерфейса не забывай вызывать ApplyTranslate у формы и добавлять в lng-файл новые строчки по мере разработки проекта.

Перевод с помощью "зашитых" в dll ресурсов

Допустим, у тебя есть картинки, звуки и прочие мультимедийные приблуды, которые в ini-файл никак не засунуть. Что ж, придется запихивать их в ресурсы внешних dll-библиотек. Редактировать файлы ресурсов не так удобно, в "Блокноте" их особо не попишешь, поэтому для этой цели одни используют встроенный редактор ресурсов в Visual Studio, другие – старый добрый Restorator, а ты, может быть, найдешь еще что-нибудь более удобное.

Логика работы с ресурсами в dll почти такая же, как и при переводе с помощью ini-файлов, но здесь присутствуют некоторые характерные особенности. Например, если хранение строк сообщений и динамических надписей (msg и str) ни у кого не вызывает вопросов, то с хранением форм будут проблемы. Можно в design-time создать форму, перевести на ней все надписи и запихнуть ее в ресурсы dll, а потом читать оттуда. А можно оставить все формы в ресурсах приложения, а в dll поместить только названия элементов управления, что и было сделано при работе с lng-файлами.

Подключать динамические библиотеки с переводом нужно, естественно, динамически. Делается это элементарно с помощью функции LoadLibrary.

Рассмотрим разницу между реализацией перевода через ini-файлы и ресурсы в dll.

Если ты собираешься помещать в ресурсы целую форму, то функция TranslateFormComponents тебе, естественно, не пригодится. В противном случае нужно выковыривать строки из ресурсов dll. Это не самое веселое занятие, так как ты не сможешь разбить строковые ресурсы на секции, а каждый строковой ресурс в dll должен быть уникален. Итак, в TranslateFormComponents ты должен сначала загрузить dll-библиотеку с помощью LoadLibrary, а затем получить нужный строковой ресурс функцией LoadString. В конце не забудь вызвать FreeLibrary.

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