什麼是國際化我在Delphi編寫應用XE2最好的方式?
我見過stringtable
資源,但我很擔心,因爲我有這樣的感覺,即實施可能很耗時且費力。
有沒有其他同樣有效的方法來做到這一點?
什麼是國際化我在Delphi編寫應用XE2最好的方式?
我見過stringtable
資源,但我很擔心,因爲我有這樣的感覺,即實施可能很耗時且費力。
有沒有其他同樣有效的方法來做到這一點?
也許不是翻譯的最佳工具,但我使用GNU Gettext多年。 的過程非常簡單:
更新:
1/GNU Gettext的包括在JCL/JVCL庫,你只需要啓動在啓動該選項。
2/Gnu Gettext可以翻譯庫中的所有內容,如VCL,JCL/JVCL也可以!它不僅限於你的代碼!
我不知道這是國際化應用程序的最佳方式,但對我來說它工作。這是一種自制的。
我創建了一個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;
正如你可以看到,這是不一個工作例如,您可以複製的內容粘貼,我只是想後面給你看的想法。如果有什麼不清楚的地方,請發表評論,我可以延長我的回答。
一些注意事項:
優點
缺點
有一個叫Sisulizer的產品,它的工作原理後,你必須建立可執行的外商投資企業,我認爲。還沒有嘗試過,但我讀了很多。
將應用程序國際化總是很費力。 :( – balazs