FireMonkey 的菜单条的汉化,以及多语言

TEdit 和 TMemo 在界面上,运行期,鼠标右键点下去,会出来一个弹出式下拉菜单,里面的内容是:

Cut
Copy
Paste
Delete
SelectAll

都是文本操作的常用功能。

问题是,它是英文的。有人问,改成中文怎么办。有人回答,直找到 FMX.Consts.pas 去修改里面的常量定义。这个办法我没测试过,但多半有效。问题是,这样直接修改 Delphi 的源代码也点简单粗暴,而且也不支持多语言。假设你做的程序,需要支持多语言怎么办?

FMX 本身支持多语言。TLabel, TButton 等,都有一个 AutoTranslate 属性,默认是 True。

如果使用它的多语言功能?我之前有 Blog 写过,地址。

假期有时间写代码:FireMonkey 之多语言(TLang)_pcplayer的博客-优快云博客

这里再次简单说一下如何做。

如何让你的 FMX APP 有多语言

1. 首先建立语言文件。假设你的程序里面,在写代码阶段,都用英语来写(因为上述弹出菜单就是英语的,所以,没办法,我们就用英语来写),比如:

ShowMessage('Please Login'); 
ButtonLogin.Text := 'Login';  
LabelUserName.Text := 'User Name';

我们创建一个对应的语言文件,内容如下:

Cut=剪切
Copy=复制
Paste=粘贴
Delete=删除
SelectAll=全选

Please Login=请登录
Login=登录
User Name=用户名

把这个文件保存为一个文本文件,名字随便起,这里我起名:MyCn.txt;

同样,你还可以做韩文,日文,德文的文件,就是把等号后面的词汇替换为对应的语言的词汇。

2. 程序里面,需要切换语言的地方,加载对应的语言文件。假设这里就是加载中文:

var
  SL: TStringList;
begin
  SL := TStringList.Create;
  try
    SL.LoadFromFile('MyCn.txt');
    LoadLangFromStrings(SL);  //自动翻译完成
  finally
    SL.Free;
  end;
end;

上述代码,LoadLangFromStrings 函数,在 FMX.Types 单元里面。如果你用这句话编译通不过,就 uses FMX.Types;

LoadLangFromStrings 调用完成,你会发现,你界面上的 ButtonLogin, LabelUserName 显示的文字,瞬间就从英文变成中文了。

再改动一下 ShowMessage 的代码:

ShowMessage(Translate('Please Login'));

如果这个时候执行那个 ShowMessage('Please Login') 你会发现弹出来的框里面,显示的是中文而不是那句英文。

3. 菜单条的汉化

假设设计期,你有一些自己设计的主菜单,或者 PopupMenu 的菜单,菜单条你写了英文。执行完上述操作,你的菜单条仍然是英文,并没有变成中文。

你在属性面板里面看,会发现,TLabel 有一个属性叫做 AutoTranslate,但菜单没有。

其实它是有的,只不过没有 Published 而是 public 的,因此不会出现在属性面板里面。

所以,必须用代码来设置。比如你有一个菜单条是 MenuItem1: TMenuItem;

MenuItem1.Text := 'Cut';
MenuItem1.AutoTranslate := True;

那么,默认它显示为 Cut,执行完上述语言切换代码后,它就会自动变成“剪切”。

4. 重头戏来了,TMemo, TEdit 的那个默认的弹出菜单怎么办?

这里就只说 TEdit,TMemo 的原理是一样的。

读 FMX 的源代码,发现 TEdit 内部有一个 TStyledEdit,这个 TStyledEdit 内部有一个 EditPopupMenu,这个玩意,就是鼠标右键点下去的那个默认菜单。

TEdit 本身有一个 PopupMenu 属性,你拖一个 PopupMenu1 到界面上,在属性面板里面指定 TEdit 的 PopupMenu 指向  PopupMenu1,则运行期鼠标右键点下去,弹出的就不是这个 EditPopupMenu 了,而是你给点那个 PopupMenu1。设计期指定的这个外部的 PopupMenu1 其实是挂载到了 TControl.PopupMenu 底下,而不是 TStyledEdit.EditPopupMenu 底下。

问题是如何通过 Edit1, 拿到这个 TStyledEdit,通过 TEdit 的公开的方法,确实没法获得。

在源代码里面,TStyledEdit 的 EditPopupMenu 是在 Protected 底下,而不是 Public 底下。

有个高手给出了一个【Hack】的方法。代码如下:

  if Edit1.Presentation is TStyledEdit then
  begin
    with TStyledEditHack(Edit1.Presentation).EditPopupMenu do
    begin
      for i := 0 to ItemsCount -1 do
      begin
        Items[i].AutoTranslate := True;
      end;
    end;
  end;

执行完上述代码,就是给那个默认的弹出菜单,每一条,都设置了自动翻译属性为 True。

执行完上述代码后,如果再执行切换语言的代码,你会发现,TEdit 的默认弹出菜单都变成中文的了。

通过这个方式,可以实现这个默认弹出菜单的多语言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值