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 的默认弹出菜单都变成中文的了。
通过这个方式,可以实现这个默认弹出菜单的多语言。