delphi利用ini文件实现界面无闪烁多语言转换

来源:互联网 发布:数据还原精灵 编辑:程序博客网 时间:2024/05/16 12:49

  越来越多的程式使用了多国语言转换,虽然DELPHI自带多语言包的添加和设置,

  不过那种方法在转换语言时界面会出现闪烁,而且实现起来非常麻烦,这里我介绍给大家的是利用INI文件来读取界面的语种文字,

  用这种方法,不仅简单易行,而且在转换的时候不会出现界面的闪烁。

  我们从一个例子出发,看看怎么实现语言的转换。首先建立一个新工程。放置如上图的组件:

  MainMenu1: TMainMenu;

  File1: TMenuItem;

  Exit1: TMenuItem;

  Label1: TLabel;

  Button1: TButton;

  CheckBox1: TCheckBox;

  CheckBox2: TCheckBox;

  Button2: TButton;

  Label2: TLabel;

  ComboBox1: TComboBox;

  Label3: TLabel;

  由于要读取Ini文件,所以在USES中加入声明IniFiles;

  然后将Button1和Button2的ShowHint属性设置为True;

  其中我们用ComboBox1来显示可供选择的语言和用来选择语言。

  我们在程式的目录下编辑如下的Chinese GB.Ini文件:

  ;///////////////////////////////////////////////////////////////////

  ;

  ; 翻译的一些规则:

  ; 翻译前,拷贝 Chinese GB.ini 改名到 yourlanguage.ini

  ; 仅仅翻译符号=后的文字

  ;

  [Translations]

  ;

  Label1.Caption =文字1

  Label2.Caption =文字2

  Label3.Caption =语言

  Button1.Caption =按钮1

  Button2.Caption =按钮2

  Button1.Hint =按钮1_提示

  Button2.Hint =按钮2_提示

  CheckBox1.Caption =复选框1

  CheckBox2.Caption =复选框2

  File1.Caption =文件

  Exit1.Caption =退出

  ;

  [Messages]

  ;

  M1 =信息框测试

  ;

  ;//////////////////////////////////////////////////////////////////

  同样的方法编辑一个名为English.ini的文件,将“=”左边的文字改为英文。

  例如:Label1.Caption =Label1

  程式运行时,我们查找当前目录下所有的语言设置文件(*.ini),

  为了达到这个目的,

  我编写了如下的函数搜索目录下所有的语言设置文件的文件名,

  然后将文件名去掉ini扩展名保存返回:

  function TForm1.SearchLanguagePack:TStrings;

  var

  ResultStrings:TStrings;

  DosError:integer;

  SearchRec:TsearchRec;

  begin

  ResultStrings:=TStringList.Create;

  DosError:=FindFirst(ExtractFilePath(ParamStr(0))+*.ini, faAnyFile, SearchRec);

  while DosError=0 do

  begin

  { 返回的文件名并去掉末尾的.ini字符 }

  ResultStrings.Add(ChangeFileExt(SearchRec.Name,));

  DosError:=FindNext(SearchRec);

  end;

  FindClose(SearchRec);

  Result:=ResultStrings;

  end;

  在Form建立的事件中添加代码,将目录下所有的语言文件名加入选择列表框中。

  procedure TForm1.FormCreate(Sender: TObject);

  begin

  ComboBox1.Items.AddStrings(SearchLanguagePack);

  end;

  程式的重点在怎么转换语言,在ComboBox1的OnChange事件中进行转换操作。

  这里我写了SetActiveLanguage过程用于实现这一操作。

  procedure TForm1.ComboBox1Change(Sender: TObject);

  begin

  SetActiveLanguage(ComboBox1.Text);

  beijingkaifapiao.dwcxa.com;

  beijingdaikaifapiao.dwcxa.com;

  shanghaikaifapiao.dwcxa.com;

  shanghaidaikaifapiao.dwcxa.com;

  guangzhoukaifapiao.dwcxa.com;

  shenzhenfapiao.dwcxa.com;

  shenzhenkaifapiao.dwcxa.com;

  jinanfapiao.dwcxa.com;

  jinankaifapiao.dwcxa.com;

  jinandaikaifapiao.dwcxa.com;

  qingdaofapiao.dwcxa.com;

  qingdaokaifapiao.dwcxa.com;

  qingdaodaikaifapiao.dwcxa.com;

  nanjingfapiao.dwcxa.com;

  nanjingdaikaifapiao.dwcxa.com;

  wuxifapiao.dwcxa.com;

  wuxikaifapiao.dwcxa.com;

  wuxidaikaifapiao.dwcxa.com;

  suzhoufapiao.dwcxa.com;

  suzhoukaifapiao.dwcxa.com;

  suzhoudaikaifapiao.dwcxa.com;

  zhengzhoufapiao.dwcxa.com;

  zhengzhoukaifapiao.dwcxa.com;

  zhengzhoudaikaifapiao.dwcxa.com;

  shijiazhuangfapiao.dwcxa.com;

  shijiazhuangkaifapiao.dwcxa.com;

  shijiazhuangdaikaifapiao.dwcxa.com;

  hangzhoufapiao.dwcxa.com;

  hangzhoudaikaifapiao.dwcxa.com;

  ningbofapiao.dwcxa.com;

  ningbokaifapiao.dwcxa.com;

  ningbodaikaifapiao.dwcxa.com;

  xianfapiao.dwcxa.com;

  xiankaifapiao.dwcxa.com;

  xiandaikaifapiao.dwcxa.com;

  changshafapiao.dwcxa.com;

  changshakaifapiao.dwcxa.com;

  changshadaikaifapiao.dwcxa.com;

  zhongqingkaifapiao.dwcxa.com;

  zhongqingdaikaifapiao.dwcxa.com;

  fuzhoufapiao.dwcxa.com;

  fuzhoukaifapiao.dwcxa.com;

  fuzhoudaikaifapiao.dwcxa.com;

  xiamenfapiao.dwcxa.com;

  xiamenkaifapiao.dwcxa.com;

  xiamendaikaifapiao.dwcxa.com;

  tianjinfapiao.dwcxa.com;

  tianjinkaifapiao.dwcxa.com;

  tianjindaikaifapiao.dwcxa.com;

  kunmingfapiao.dwcxa.com;

  kunmingkaifapiao.dwcxa.com;

  kunmingdaikaifapiao.dwcxa.com;

  chengdufapiao.dwcxa.com;

  chengdukaifapiao.dwcxa.com;

  chengdudaikaifapiao.dwcxa.com;

  hefeifapiao.dwcxa.com;

  hefeikaifapiao.dwcxa.com;

  hefeidaikaifapiao.dwcxa.com;

  wuhanfapiao.dwcxa.com;

  wuhankaifapiao.dwcxa.com;

  wuhandaikaifapiao.dwcxa.com;

  dalianfapiao.dwcxa.com;

  daliandaikaifapiao.dwcxa.com;

  shenyangfapiao.dwcxa.com;

  shenyangkaifapiao.dwcxa.com;

  shenyangdaikaifapiao.dwcxa.com;

  haerbinfapiao.dwcxa.com;

  haerbinkaifapiao.dwcxa.com;

  haerbindaikaifapiao.dwcxa.com;

  changchunfapiao.dwcxa.com;

  changchundaikaifapiao.dwcxa.com;

  taiyuanfapiao.dwcxa.com;

  taiyuankaifapiao.dwcxa.com;

  taiyuandaikaifapiao.dwcxa.com;

  lanzhoufapiao.dwcxa.com;

  lanzhoukaifapiao.dwcxa.com;

  lanzhoudaikaifapiao.dwcxa.com;

  jilinfapiao.dwcxa.com;

  jilinkaifapiao.dwcxa.com;

  jilindaikaifapiao.dwcxa.com;

  nanchangfapiao.dwcxa.com;

  nanchangkaifapiao.dwcxa.com;

  nanchangdaikaifapiao.dwcxa.com;

  guiyangfapiao.dwcxa.com;

  guiyangkaifapiao.dwcxa.com;

  guiyangdaikaifapiao.dwcxa.com;

  nanningfapiao.dwcxa.com;

  nanningkaifapiao.dwcxa.com;

  nanningdaikaifapiao.dwcxa.com;

  haikoufapiao.dwcxa.com;

  haikoukaifapiao.dwcxa.com;

  haikoudaikaifapiao.dwcxa.com;

  jinhuadaikaifapiao.dwcxa.com;

  wenzhoudaikaifapiao.dwcxa.com;

  yangzhoudaikaifapiao.dwcxa.com;

  wulumuqidaikaifapiao.dwcxa.com;

  qinhuangdaodaikaifapiao.dwcxa.com;

  cangzhoudaikaifapiao.dwcxa.com;

  xiningdaikaifapiao.dwcxa.com;

  huhehaotekaifapiao.dwcxa.com;

  cangzhoudaikaifapiao.dwcxa.com;

  cangzhoufapiao.dwcxa.com;

  cangzhoukaifapiao.dwcxa.com;

  zhangzhoudaikaifapiao.dwcxa.com;

  zhangzhoufapiao.dwcxa.com;

  zhangzhoukaifapiao.dwcxa.com;

  zhenjiangdaikaifapiao.dwcxa.com;

  zhenjiangfapiao.dwcxa.com;

  zhenjiangkaifapiao.dwcxa.com;

  zhongshandaikaifapiao.dwcxa.com;

  zhongshanfapiao.dwcxa.com;

  zhongshankaifapiao.dwcxa.com;

  zhuhaidaikaifapiao.dwcxa.com;

  zhuhaifapiao.dwcxa.com;

  zhuhaikaifapiao.dwcxa.com;

  huhehaotefapiao.dwcxa.com;

  huhehaotekaifapiao.dwcxa.com;

  foshandaikaifapiao.dwcxa.com;

  foshanfapiao.dwcxa.com;

  foshankaifapiao.dwcxa.com;

  huizhoudaikaifapiao.dwcxa.com;

  huizhoufapiao.dwcxa.com;

  huizhoukaifapiao.dwcxa.com;

  jinhuadaikaifapiao.dwcxa.com;

  jinhuafapiao.dwcxa.com;

  jinhuakaifapiao.dwcxa.com;

  taizhoudaikaifapiao.dwcxa.com;

  taizhoufapiao.dwcxa.com;

  taizhoukaifapiao.dwcxa.com;

  luoyangdaikaifapiao.dwcxa.com;

  luoyangfapiao.dwcxa.com;

  luoyangkaifapiao.dwcxa.com;

  qinhuangdaodaikaifapiao.dwcxa.com;

  qinhuangdaofapiao.dwcxa.com;

  qinhuangdaokaifapiao.dwcxa.com;

  quanzhoudaikaifapiao.dwcxa.com;

  quanzhoufapiao.dwcxa.com;

  quanzhoukaifapiao.dwcxa.com;

  tangshandaikaifapiao.dwcxa.com;

  tangshanfapiao.dwcxa.com;

  tangshankaifapiao.dwcxa.com;

  wenzhoudaikaifapiao.dwcxa.com;

  wenzhoufapiao.dwcxa.com;

  wenzhoukaifapiao.dwcxa.com;

  xuzhoudaikaifapiao.dwcxa.com;

  xuzhoufapiao.dwcxa.com;

  xuzhoukaifapiao.dwcxa.com;

  shantoudaikaifapiao.dwcxa.com;

  shantoufapiao.dwcxa.com;

  shantoukaifapiao.dwcxa.com;

  yantaidaikaifapiao.dwcxa.com;

  yantaifapiao.dwcxa.com;

  yantaikaifapiao.dwcxa.com;

  yanchengdaikaifapiao.dwcxa.com;

  yanchengfapiao.dwcxa.com;

  yanchengkaifapiao.dwcxa.com;

  yangzhoudaikaifapiao.dwcxa.com;

  yangzhoufapiao.dwcxa.com;

  yangzhoukaifapiao.dwcxa.com;

  wulumuqidaikaifapiao.dwcxa.com;

  wulumuqifapiao.dwcxa.com;

  wulumuqikaifapiao.dwcxa.com;

  chengdedaikaifapiao.dwcxa.com;

  chengdefapiao.dwcxa.com;

  chengdekaifapiao.dwcxa.com;

  dandongdaikaifapiao.dwcxa.com;

  dandongfapiao.dwcxa.com;

  dandongkaifapiao.dwcxa.com;

  dongݸfapiao.dwcxa.com;

  dongݸkaifapiao.dwcxa.com;

  dongyingdaikaifapiao.dwcxa.com;

  dongyingfapiao.dwcxa.com;

  dongyingkaifapiao.dwcxa.com;

  ganzhoudaikaifapiao.dwcxa.com;

  ganzhoufapiao.dwcxa.com;

  ganzhoukaifapiao.dwcxa.com;

  huludaodaikaifapiao.dwcxa.com;

  huludaofapiao.dwcxa.com;

  huludaokaifapiao.dwcxa.com;

  jixidaikaifapiao.dwcxa.com;

  jixifapiao.dwcxa.com;

  jixikaifapiao.dwcxa.com;

  lishuidaikaifapiao.dwcxa.com;

  lishuifapiao.dwcxa.com;

  lishuikaifapiao.dwcxa.com;

  liuzhoudaikaifapiao.dwcxa.com;

  liuzhoufapiao.dwcxa.com;

  liuzhoukaifapiao.dwcxa.com;

  loudidaikaifapiao.dwcxa.com;

  loudifapiao.dwcxa.com;

  loudikaifapiao.dwcxa.com;

  mianyangdaikaifapiao.dwcxa.com;

  mianyangfapiao.dwcxa.com;

  mianyangkaifapiao.dwcxa.com;

  nantongdaikaifapiao.dwcxa.com;

  nantongfapiao.dwcxa.com;

  nantongkaifapiao.dwcxa.com;

  panzhihuadaikaifapiao.dwcxa.com;

  panzhihuafapiao.dwcxa.com;

  panzhihuakaifapiao.dwcxa.com;

  pingdingshandaikaifapiao.dwcxa.com;

  pingdingshanfapiao.dwcxa.com;

  pingdingshankaifapiao.dwcxa.com;

  rizhaodaikaifapiao.dwcxa.com;

  rizhaofapiao.dwcxa.com;

  rizhaokaifapiao.dwcxa.com;

  tianshuidaikaifapiao.dwcxa.com;

  tianshuifapiao.dwcxa.com;

  tianshuikaifapiao.dwcxa.com;

  weihaidaikaifapiao.dwcxa.com;

  weihaifapiao.dwcxa.com;

  weihaikaifapiao.dwcxa.com;

  xiningdaikaifapiao.dwcxa.com;

  xiningfapiao.dwcxa.com;

  xiningkaifapiao.dwcxa.com;

  xianyangdaikaifapiao.dwcxa.com;

  xianyangfapiao.dwcxa.com;

  xianyangkaifapiao.dwcxa.com;

  yinchuandaikaifapiao.dwcxa.com;

  yinchuanfapiao.dwcxa.com;

  yinchuankaifapiao.dwcxa.com;

  yingkoudaikaifapiao.dwcxa.com;

  yingkoufapiao.dwcxa.com;

  yingkoukaifapiao.dwcxa.com;

  zibodaikaifapiao.dwcxa.com;

  zibofapiao.dwcxa.com;

  zibokaifapiao.dwcxa.com;

  zigongdaikaifapiao.dwcxa.com;

  zigongfapiao.dwcxa.com;

  zigongkaifapiao.dwcxa.com;

  beijingzhusufapiao.dwcxa.com;

  beijingcanyinfapiao.dwcxa.com;

  jinancanyinfapiao.dwcxa.com;

  jinanzhusufapiao.dwcxa.com;

  hefeizhusufapiao.dwcxa.com;

  hefeicanyinfapiao.dwcxa.com;

  suzhouzhusufapiao.dwcxa.com;

  suzhoucanyinfapiao.dwcxa.com;

  ningbocanyinfapiao.dwcxa.com;

  ningbozhusufapiao.dwcxa.com;

  wuxicanyinfapiao.dwcxa.com;

  wuxizhusufapiao.dwcxa.com;

  nanjingcanyinfapiao.dwcxa.com;

  nanjingzhusufapiao.dwcxa.com;

  changshazhusufapiao.dwcxa.com;

  changshacanyinfapiao.dwcxa.com;

  qingdaocanyinfapiao.dwcxa.com;

  qingdaozhusufapiao.dwcxa.com;

  zhongqingzhusufapiao.dwcxa.com;

  zhongqingcanyinfapiao.dwcxa.com;

  chengduzhusufapiao.dwcxa.com;

  chengducanyinfapiao.dwcxa.com;

  shanghaizhusufapiao.dwcxa.com;

  shanghaidaikaicanyinfapiao.dwcxa.com;

  haerbincanyinfapiao.dwcxa.com;

  haerbinzhusufapiao.dwcxa.com;

  changchunzhusufapiao.dwcxa.com;

  changchuncanyinfapiao.dwcxa.com;

  shenyangzhusufapiao.dwcxa.com;

  shenyangcanyinfapiao.dwcxa.com;

  zhengzhouzhusufapiao.dwcxa.com;

  zhengzhoucanyinfapiao.dwcxa.com;

  nanjingzhusufapiao.dwcxa.com;

  nanjingcanyinfapiao.dwcxa.com;

  hangzhouzhusufapiao.dwcxa.com;

  hangzhoucanyinfapiao.dwcxa.com;

  kunmingzhusufapiao.dwcxa.com;

  kunmingcanyinfapiao.dwcxa.com;

  dalianzhusufapiao.dwcxa.com;

  daliancanyinfapiao.dwcxa.com;

  wuhanzhusufapiao.dwcxa.com;

  wuhancanyinfapiao.dwcxa.com;

  fuzhoucanyinfapiao.dwcxa.com;

  fuzhouzhusufapiao.dwcxa.com;

  guangzhoucanyinfapiao.dwcxa.com;

  guangzhouzhusufapiao.dwcxa.com;

  shijiazhuangcanyinfapiao.dwcxa.com;

  shijiazhuangzhusufapiao.dwcxa.com;

  xiancanyinfapiao.dwcxa.com;

  xianzhusufapiao.dwcxa.com;

  shenzhencanyinfapiao.dwcxa.com;

  shenzhenzhusufapiao.dwcxa.com;

  taiyuanzhusufapiao.dwcxa.com;

  taiyuancanyinfapiao.dwcxa.com;

  nanchangzhusufapiao.dwcxa.com;

  nanchangcanyinfapiao.dwcxa.com;

  guiyangzhusufapiao.dwcxa.com;

  guiyangcanyinfapiao.dwcxa.com;

  guangzhoudingefapiao.dwcxa.com;

  shenzhendingefapiao.dwcxa.com;

  zhongqingdingefapiao.dwcxa.com;

  nanjingdingefapiao.dwcxa.com;

  qingdaodingefapiao.dwcxa.com;

  shanghaidingefapiao.dwcxa.com;

  jinandingefapiao.dwcxa.com;

  shenyangdingefapiao.dwcxa.com;

  haerbindingefapiao.dwcxa.com;

  chengdudingefapiao.dwcxa.com;

  nanningdingefapiao.dwcxa.com;

  suzhoudingefapiao.dwcxa.com;

  changchundingefapiao.dwcxa.com;

  beijingdingefapiao.dwcxa.com;

  hangzhoudingefapiao.dwcxa.com;

  ningbodingefapiao.dwcxa.com;

  xiandingefapiao.dwcxa.com;

  shijiazhuangdingefapiao.dwcxa.com;

  zhengzhoudingefapiao.dwcxa.com;

  wuhandingefapiao.dwcxa.com;

  tianjindingefapiao.dwcxa.com;

  taiyuandingefapiao.dwcxa.com;

  haikoudingefapiao.dwcxa.com;

  nanjingdingefapiao.dwcxa.com;

  wuxidingefapiao.dwcxa.com;

  nanchangdingefapiao.dwcxa.com;

  kunmingdingefapiao.dwcxa.com;

  guiyangdingefapiao.dwcxa.com;

  lanzhoudingefapiao.dwcxa.com;

  xiningdingefapiao.dwcxa.com;

  hefeidingefapiao.dwcxa.com;

  fuzhoudingefapiao.dwcxa.com;

  xiamendingefapiao.dwcxa.com;

  shanghaishangpinfapiao.dwcxa.com;

  shanghaihuiwufapiao.dwcxa.com;

  shanghaiyunshufapiao.dwcxa.com;

  shanghaijianzhufapiao.dwcxa.com;

  shanghaiguanggaofapiao.dwcxa.com;

  beijingjianzhufapiao.dwcxa.com;

  beijingshangpinfapiao.dwcxa.com;

  guangzhoujianzhufapiao.dwcxa.com;

  guangzhoushangpinfapiao.dwcxa.com;

  beijingzengzhishuifapiao.dwcxa.com;

  beijingkaizengzhishuifapiao.dwcxa.com;

  shanghaizengzhishuifapiao.dwcxa.com;

  shanghaikaizengzhishuifapiao.dwcxa.com;

  shanghaidaikaizengzhishuifapiao.dwcxa.com;

  guangzhouzengzhishuifapiao.dwcxa.com;

  guangzhoukaizengzhishuifapiao.dwcxa.com;

  guangzhoudaikaizengzhishuifapiao.dwcxa.com;

  shenzhenzengzhishuifapiao.dwcxa.com;

  shenzhenkaizengzhishuifapiao.dwcxa.com;

  shenzhendaikaizengzhishuifapiao.dwcxa.com;

  wuhanzengzhishuifapiao.dwcxa.com;

  wuhankaizengzhishuifapiao.dwcxa.com;

  wuhandaikaizengzhishuifapiao.dwcxa.com;

  jinankaizengzhishuifapiao.dwcxa.com;

  jinandaikaizengzhishuifapiao.dwcxa.com;

  qingdaozengzhishuifapiao.dwcxa.com;

  qingdaokaizengzhishuifapiao.dwcxa.com;

  qingdaodaikaizengzhishuifapiao.dwcxa.com;

  nanjingzengzhishuifapiao.dwcxa.com;

  nanjingkaizengzhishuifapiao.dwcxa.com;

  nanjingdaikaizengzhishuifapiao.dwcxa.com;

  wuxizengzhishuifapiao.dwcxa.com;

  wuxikaizengzhishuifapiao.dwcxa.com;

  wuxidaikaizengzhishuifapiao.dwcxa.com;

  suzhouzengzhishuifapiao.dwcxa.com;

  suzhoukaizengzhishuifapiao.dwcxa.com;

  suzhoudaikaizengzhishuifapiao.dwcxa.com;

  shenyangzengzhishuifapiao.dwcxa.com;

  shenyangkaizengzhishuifapiao.dwcxa.com;

  shenyangdaikaizengzhishuifapiao.dwcxa.com;

  end;

  其中SetActiveLanguage代码如下:

  procedure TForm1.SetActiveLanguage(LanguageName:string);

  const

  Translations=Translations;

  Messages=Messages;

  var

  frmComponent:TComponent;

  i:Integer;

  begin

  with TInifile.Create(ExtractFilePath(ParamStr(0))+LanguageName+.ini) do

  begin

  for i:=0 to ComponentCount-1 do { 遍历Form组件 }

  begin

  frmComponent:=Components[i];

  if frmComponent is TLabel then { 如果组件为TLabel型则当作TLabel处理,以下同 }

  begin

  (frmComponent as TLabel).Caption:=

  ReadString(Translations,frmComponent.Name

  +.Caption,(frmComponent as TLabel).Caption);

  end;

  if frmComponent is TCheckBox then

  begin

  (frmComponent as TCheckBox).Caption:=

  ReadString(Translations,frmComponent.Name

  +.Caption,(frmComponent as TCheckBox).Caption);

  end;

  if frmComponent is TButton then

  begin

  (frmComponent as TButton).Caption:=

  ReadString(Translations,frmComponent.Name

  +.Caption,(frmComponent as TButton).Caption);

  (frmComponent as TButton).Hint:=

  ReadString(Translations,frmComponent.Name

  +.Hint,(frmComponent as TButton).Hint);

  end;

  if frmComponent is TMenuItem then

  begin

  (frmComponent as TMenuItem).Caption:=

  ReadString(Translations,frmComponent.Name

  +.Caption,(frmComponent as TMenuItem).Caption);

  end;

  end;

  M1:=ReadString(Messages,M1,M1);

  end;

  end;

  在这个过程中,我们遍历了Form中的所有组件,

  根据他们的类别和组件名动态的从ini设置文件中读出应该显示的语言文字。

  用遍历组件的方法比一个一个写出具体的组件维护起来要方便非常多,代码的适应性也更强。

  其中M1为一个字符串变量,这样提示消息也能转换,比如在Button1的Click事件中

  procedure TForm1.Button1Click(Sender: TObject);

  begin

  ShowMessage(M1);

  end;

  就能根据不同的语言给出不同的提示文字。

  好了,整个工程就做完了,你能运行测试一下,是不是转换迅速而且无闪烁。

0 0