Delphi XE2 之 FireMonkey 入门(18) - TLang(多语言切换的实现)
一个小小的 TLang 类, 实现多语言切换, 挺好的. 它的工作思路是:
1、首先通过 AddLang('语言代码') 添加语言类别, 如: AddLang('en')、AddLang('cn').
2、每个语言代码对应一个 TStrings 列表, 获取方式如: LangStr['en']、LangStr['cn'].
3、可以手动填充这些数据、可以通过 LoadFromFile() 方法载入之前 SaveToFile() 的数据(*.lng)、还可以在设计时提供的界面中操作这些数据.
4、切换时修改 Lang 属性即可, 如 Lang := 'cn'.
5、它的作用域是当前工程的所有窗体及控件, 但不包括绘图控件(如 TText)、控件中的文本和窗体标题等.
测试:
1、先在窗体上添加 TLang;
2、添加三个 TRadioButton, 用于切换语言;
3、添加 TButton、TCheckBox、TLabel 用于显示测试;
4、激活 RadioButton1、Button1 和窗体的默认事件.
unit Unit1; interface uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.Objects; type
TForm1 = class(TForm)
Lang1: TLang;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
RadioButton3: TRadioButton;
Button1: TButton;
CheckBox1: TCheckBox;
Label1: TLabel;
procedure FormCreate(Sender: TObject);
procedure RadioButton1Change(Sender: TObject);
procedure Button1Click(Sender: TObject);
end; var
Form1: TForm1; implementation {$R *.fmx} procedure TForm1.FormCreate(Sender: TObject);
begin
RadioButton1.Text := 'English';
RadioButton2.Text := '简体中文';
RadioButton3.Text := '繁体中文';
RadioButton1.Tag := ;
RadioButton2.Tag := ;
RadioButton3.Tag := ;
RadioButton2.OnChange := RadioButton1.OnChange;
RadioButton3.OnChange := RadioButton1.OnChange; {这些标题应对应着 TLang 的相关设置}
Button1.Text := 'Button';
CheckBox1.Text := 'CheckBox';
Label1.Text := 'Test';
Caption := 'Test'; {添加语言类别}
Lang1.AddLang('en');
Lang1.AddLang('cn');
Lang1.AddLang('big'); {Original: 这个原始的 TStrings 可有可无}
with Lang1.Original do
begin
Add('Button');
Add('CheckBox');
Add('Test');
end; {en 作为默认也可以不设置}
with Lang1.LangStr['en'] do
begin
Add('Button');
Add('CheckBox');
Add('Test');
end; {简体中文}
with Lang1.LangStr['cn'] do
begin
Values['Button'] := '按钮';
Values['CheckBox'] := '复选框';
Values['Test'] := '测试';
// Values[Lang1.Original[0]] := '按钮';
// Values[Lang1.Original[1]] := '复选框';
// Values[Lang1.Original[2]] := '测试';
end; {繁体中文}
with Lang1.LangStr['big'] do
begin
Values['Button'] := '按鈕';
Values['CheckBox'] := '復選框';
Values['Test'] := '測試';
end;
end; {切换}
procedure TForm1.RadioButton1Change(Sender: TObject);
begin
case TRadioButton(Sender).Tag of
: Lang1.Lang := 'en';
: Lang1.Lang := 'cn';
: Lang1.Lang := 'big';
end;
end; {语言数据保存在 Resources 属性中, 它是嵌套的 TStrings 类型}
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
for i := to Lang1.Resources.Count - do
ShowMessage(TStrings(Lang1.Resources.Objects[i]).Text);
end; end.
Delphi XE2 之 FireMonkey 入门(18) - TLang(多语言切换的实现)的更多相关文章
- Delphi XE2 之 FireMonkey 入门(45Finally) - 结题与问题
Delphi XE2 之 FireMonkey 入门(45Finally) - 结题与问题 很喜欢 FMX 的一些新控件, 如: TExpander.TArcDial.TComboTrackBar.T ...
- Delphi XE2 之 FireMonkey 入门(44) - 控件基础: TTreeView、TTreeViewItem
Delphi XE2 之 FireMonkey 入门(44) - 控件基础: TTreeView.TTreeViewItem TScrollBox -> TCustomTreeView -> ...
- Delphi XE2 之 FireMonkey 入门(43) - 控件基础: TStringGrid、TGrid
Delphi XE2 之 FireMonkey 入门(43) - 控件基础: TStringGrid.TGrid TStringGrid.TGrid 都是从 TCustomGrid 继承; 区别有:1 ...
- Delphi XE2 之 FireMonkey 入门(42) - 控件基础: TComboBox、TComboEdit
Delphi XE2 之 FireMonkey 入门(42) - 控件基础: TComboBox.TComboEdit TListBox 有两个兄弟 TComboListBox.TComboEditL ...
- Delphi XE2 之 FireMonkey 入门(41) - 控件基础: TListBox
Delphi XE2 之 FireMonkey 入门(41) - 控件基础: TListBox TScrollBox -> TCustomListBox -> TListBox; 其元素项 ...
- Delphi XE2 之 FireMonkey 入门(40) - 控件基础: TMemo
Delphi XE2 之 FireMonkey 入门(40) - 控件基础: TMemo 值得注意的变化: 1.其父类 TScrollBox 的许多特性也很有用处, 如: Memo1.UseSma ...
- Delphi XE2 之 FireMonkey 入门(39) - 控件基础: TScrollBox、TVertScrollBox、TFramedScrollBox、TFramedVertScrollBox
Delphi XE2 之 FireMonkey 入门(39) - 控件基础: TScrollBox.TVertScrollBox.TFramedScrollBox.TFramedVertScrollB ...
- Delphi XE2 之 FireMonkey 入门(38) - 控件基础: TPopupMenu、TMenuItem、TMenuBar、TMainMenu
Delphi XE2 之 FireMonkey 入门(38) - 控件基础: TPopupMenu.TMenuItem.TMenuBar.TMainMenu 相关控件: TMenuBar.TPopup ...
- Delphi XE2 之 FireMonkey 入门(37) - 控件基础: TControl 概览
Delphi XE2 之 FireMonkey 入门(37) - 控件基础: TControl 概览 { TControl } public constructor Create(...); ov ...
随机推荐
- Vue 中如何定义全局的变量和常量
Vue 中如何定义全局的变量和常量 我想要定义一个变量, 在项目的任何地方都可以访问到, 不需要每一次使用的时候, 都引入. 尝试1:创建 global.js 并且在其中定义 let a = 10 ...
- 吴恩达深度学习:2.1Logistic Regression逻辑回归及其损失函数
1.Logistic Regression是一个二元分类问题 (1)已知输入的特征向量x可能是一张图,你希望把它识别出来,这是不是猫图,你需要一个算法,可以给出预测值,更正式的y是一个概率,当输入特征 ...
- 什么情况下会出现undefined
1.函数定义形参不传值,2.预解释,只声明不定义时输出变量3.对象取属性值,属性值不存在
- 生成EXCEL文件是经常需要用到的功能,我们利用一些开源库可以很容易实现这个功能。
方法一:利用excellibrary,http://code.google.com/p/excellibrary/ excellibrary是国人写的开源组件,很容易使用,可惜貌似还不支持.xlsx( ...
- Docker守护式容器的创建和登录
创建守护式容器 如果对于一个需要长期运行的容器来说,我们可以创建一个守护式容器(后台运行的容器). 创建(-d)并运行(-i)守护式容器命令如下(容器名称不能重复): docker run -id - ...
- linux NFS 实例
为了证明是 Allentunsgroup 组起的作用而非用户 [root@NFS_Client ~]# useradd scott1 [root@NFS_Client ~]# passwd scott ...
- 搭建jumperserver堡垒机管理万台服务器-1
搭建jumperserver堡垒机管理万台服务器-1 1 Jumpserver堡垒机概述-部署Jumpserver运行环境 2 安装Coco组件 3 安装Web-Terminal前端-Luna组 ...
- Saving James Bond - Easy Version
题目来源: 浙江大学在慕课网上开设的<数据结构>课,陈越老师.何钦铭老师主讲,课后作业的一道题. 题目描述: 题目思路: 这道题目本质上讲就是列出图的连通集,但是这个连通集的起点是有约束的 ...
- 浅谈C++ allocator内存管理(对比new的局限性)(转)
STL中,对内存管理的alloc的设计,迫使我去学习了allocator类.这里对allocator内存管理做了点笔记留给自己后续查阅.allocator类声明.定义于头文件<memory> ...
- gremlin语言语法--学习笔记
学习gremlin语言的目的:测试图数据,支持gremlin语句,所以必须系统学习一下!!!! 一.基础查询 g.V() 查询所有的顶点 g.V(3) 查询顶点id为3的点.字符串id的要到引号V(& ...