假期有时间写代码:FireMonkey 之多语言(TLang)

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 这个难用的控件了。


更进一步,APP 可以通过动态下载新的语言文件,增加其语言,而无需更改 APP。当然,要让 APP 知道新增加了一个语言文件,还需要另外一个语言文件名称列表清单文件。这个文件同步更新就好了。


俺写了一个例子程序,源代码上传到 csdn 里面。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值