Delphi FireMonkey 多语言
版本:10.2 Tokyo
Delphi FireMonkey 有一个控件:TLang,使用它,可以做到多语言。但是,这个控件设计得很糟糕,难用。
其问题:
1. 设计期双击 TLang 控件出来的界面,可以输入不同语言对应的字符串,是 key=Value 格式。但是这个界面很难用。而且它的 Help 里面的说明附带的界面图和实际设计期出来的界面图,完全不一样。要摸索一会才能搞懂它是什么意思。
2. 设计期增加了很多语言翻译后,它保存在 Form 的 Resource 里面。可以另存为文件,但另存的文件是二进制格式,无法打开修改。
3. 设计期如果导入另存到二进制文件,发现之前增加的语言选项莫名其妙没了,但 Key 条目还在。
总之,不好用。另外,它的官方网络帮助里提到:
http://docwiki.embarcadero.com/Libraries/Berlin/en/FMX.Types.TLang
There are special cases where switching between languages does not work as expected if the language that you switch to is English (en). As a workaround, we recommend that you use LoadLangFromStrings instead of setting TLang.Lang to switch between languages at run time.
也就是说,它有 bug.
--------------------------------------------
经过摸索,发现根本用不着这个 TLang 控件。
FireMonkey 的 FMX.Types 单元,已经提供了两个最重要的功能:
1. LoadLangFromStrings 函数。这个函数的参数是一个 TStrings,也就是一个 Key=Value 格式的语言条目。这样,仅仅需要不同的语言,提供几个不同的文本文件,每个文件的内容,都是 Key=Value 就可以了。因为是文本文件,完全可以脱离 Delphi IDE 来自有编辑。因为可以加载外部文本文件,因此修改语言或增加语言,完全不用重新编译程序。
2. 更妙的是,LoadLangFromStrings 这个函数被调用后,界面上所有的文字(Label.Text 和 Button.Text)都自动被刷新了。根本无需代码!当然,TText.Text 不会被自动刷新,需要自己写代码。
3. 另外一个函数:Translate,也是声明在 FMX.Types 里面的。一旦使用 LoadLangFromStrings 函数加载了语言文件,调用 Translate('Key') 就能获得对应的语言字符串。比如 ShowMessage(Translate('你好')); 这个 "你好" 是一个 Key,就可以获得它对应的语言的翻译。
由此,无需 TLang 这个难用的控件了。
版本:10.2 Tokyo
Delphi FireMonkey 有一个控件:TLang,使用它,可以做到多语言。但是,这个控件设计得很糟糕,难用。
其问题:
1. 设计期双击 TLang 控件出来的界面,可以输入不同语言对应的字符串,是 key=Value 格式。但是这个界面很难用。而且它的 Help 里面的说明附带的界面图和实际设计期出来的界面图,完全不一样。要摸索一会才能搞懂它是什么意思。
2. 设计期增加了很多语言翻译后,它保存在 Form 的 Resource 里面。可以另存为文件,但另存的文件是二进制格式,无法打开修改。
3. 设计期如果导入另存到二进制文件,发现之前增加的语言选项莫名其妙没了,但 Key 条目还在。
总之,不好用。另外,它的官方网络帮助里提到:
http://docwiki.embarcadero.com/Libraries/Berlin/en/FMX.Types.TLang
There are special cases where switching between languages does not work as expected if the language that you switch to is English (en). As a workaround, we recommend that you use LoadLangFromStrings instead of setting TLang.Lang to switch between languages at run time.
也就是说,它有 bug.
--------------------------------------------
经过摸索,发现根本用不着这个 TLang 控件。
FireMonkey 的 FMX.Types 单元,已经提供了两个最重要的功能:
1. LoadLangFromStrings 函数。这个函数的参数是一个 TStrings,也就是一个 Key=Value 格式的语言条目。这样,仅仅需要不同的语言,提供几个不同的文本文件,每个文件的内容,都是 Key=Value 就可以了。因为是文本文件,完全可以脱离 Delphi IDE 来自有编辑。因为可以加载外部文本文件,因此修改语言或增加语言,完全不用重新编译程序。
2. 更妙的是,LoadLangFromStrings 这个函数被调用后,界面上所有的文字(Label.Text 和 Button.Text)都自动被刷新了。根本无需代码!当然,TText.Text 不会被自动刷新,需要自己写代码。
3. 另外一个函数:Translate,也是声明在 FMX.Types 里面的。一旦使用 LoadLangFromStrings 函数加载了语言文件,调用 Translate('Key') 就能获得对应的语言字符串。比如 ShowMessage(Translate('你好')); 这个 "你好" 是一个 Key,就可以获得它对应的语言的翻译。
由此,无需 TLang 这个难用的控件了。
更进一步,APP 可以通过动态下载新的语言文件,增加其语言,而无需更改 APP。当然,要让 APP 知道新增加了一个语言文件,还需要另外一个语言文件名称列表清单文件。这个文件同步更新就好了。
俺写了一个例子程序,源代码上传到 csdn 里面。