Я не знаю, лучший ли это способ интернационализации приложения, но для меня это сработало. Это нечто домашнее.
Я создал файл xml, который представляет собой словарь, содержащий переводы, но вы можете использовать любой другой формат, от json до xls (возможно, это лучший). Затем реализован класс, который читает переводы из этого файла, и способ регистрации процедур в случае изменения языка во время выполнения, что я считаю хорошей функцией.
TDictionary = class
private
fOnChanged: TSignal;
fLanguage: String;
procedure setLanguage( const Value: String );
public
procedure loadFromFile( filename: string );
function getTranslation( id: string; lang: string = '' ): string;
property language: String read fLanguage write setLanguage;
property onChanged: TSignal read fonChanged;
end;
...
function TDictionary.getTranslation( id: string; lang: string = '' ): string;
begin
if lang = '' then
lang := Language; // use the default lang.
// read the translation from the file.
end;
procedure TDictionary.setLanguage( const Value: String );
begin
fLanguage := Value;
onChanged.Execute;
end;
TSignal - это класс, который регистрирует методы, и если вы вызываете Execute
, он выполняет все зарегистрированные методы. Возможно, в xe2 у вас есть что-то встроенное для этого, в delphi7 мне пришлось создать этот класс самому, но это интересно реализовать.
в форме createForm:
procedure TMyClass.doTranslate( dictionary: TObject );
begin
with dictionary as TDictionary do
begin
caption := dictionary.getTranslation( 'myclass.caption' );
button.caption := dictionary.getTranslation( 'some id' );
end;
// or you can go through Controls array, and automate the assignment.
end;
procedure TMyClass.FormCreate(Sender: TObject);
begin
Dictionary.onChanged.register( doTranslate );
doTranslate( dictionary );
end;
procedure TMyClass.FormDestroy(Sender: TObject);
begin
Dictionary.onChanged.deregister( doTranslate );
end;
Как видите, это не рабочий пример того, что вы можете копировать и вставлять, я просто хотел показать вам основную идею. если что-то непонятно, прокомментируйте это, и я могу расширить свой ответ.
Некоторые примечания:
- Я думаю, что важно иметь переводы в формате utf8.
- использование xls облегчает жизнь локализаторам, да и вам тоже, если они испортят ваш xml файл (Если переводчик не проф., может случиться так, что вы получите обратно свой xml файл в формате microsoft word)
- вы можете поместить файл словаря в ресурс и загрузить оттуда.
Плюсы
- Таким образом, вы можете изменить язык выполнения
- если вам нужен другой язык, вам просто нужно отредактировать файл словаря.
Минусы
- Если у вас много форм, соединить все метки, кнопки и т. д. будет кошмаром, но вы можете автоматизировать это разумным способом.
- Это немного замедляет работу вашего приложения, но не сильно, если смена языка приложения происходит не так часто.
person
balazs
schedule
22.01.2013