Программа-полиглот 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. |