比如在启动软件后,有一个界面是提供语言选择的,其中语言有:中文、英语、日语、朝语、阿拉伯语、法语、等等,选择相应的语言确定后软件就转换到相应的语言显示界面,我现在开发的只是中文版的,怎么改成支持多国语言?请高手指教,谢谢!

解决方案 »

  1.   

    通常的做法是,用INI文件把所有语言条目提取出来记录,并且将INI翻译成多份(多种语言),程序启动时从INI文件中加载语言。
      

  2.   

    用INI文件把所有语言条目提取出来记录,这个要怎么提取?程序启动时如何从INI文件中加载语言?请详细一些,谢谢!
      

  3.   


    我的理解是:
    软件中出现汉字的地方都不能做死,必须从不同的Ini文件中去读取。
    而不同语言版本对应一个不同的Ini文件请高手明示
      

  4.   

    下载了一个[Tony's Language Master]是一款供Delphi和Borland C++ Builder使用的VCL多国语言组件包。
    从现有程序升级到支持多国语言的程序
    CSDN上有朋友问起如何从已经完成的项目升级到使用多国语言的程序,相信很多朋友也并非从项目的一开始就使用TLMPack的(也确实没有这个必要),下面我就简单的介绍一下怎么样将已有的项目升级为支持多国语言的项目。 1。在Delphi(或BCB)中安装TLMPack标准版,关于如何安装帮助文件中有比较详细的说明了,这里不在累述了。(当然安装标准版的前提是你使用标准的AnsiVCL控件来开发的程序,如果你使用TntUnicode控件来开发程序,那么相对应,必须使用Unicode版的TLMPack)。 2。打开你需要升级成多国语言的工程,在每一个Form(以及QReport,Module等)上放置一个TtlmController控件,这个控件的作用是自动改变其所在Form上所有控件的显示文字,一般情况下只需要将该控件放置在Form上就可以了,不需要作任何设置。 
     3。Form上的控件现在已经可以自己根据语言设置的变换而自动更新了,那么像MessageBox()这样的函数中显示的文字怎么办呢,答案是使用TtlmController的Translate()函数,这个函数可以自动到当前使用的语言文件中取得文字资源然后作为返回值返回出来,假设已有一段函数是这样的: 代码: 
    procedure TForm1.Button1Click(Sender:TObject); 
    begin 
      MessageBox(Handle, PChar('Say hello to the user!'), 'Message', MB_ICONINFORMATION); 
    end; 
    那么你需要将文字的部分使用Translate函数包装起来,包装后就像这样: 代码: 
    procedure TForm1.Button1Click(Sender:TObject); 
    begin 
      MessageBox(Handle, PChar(tlmController1.Translate('SayHello', 'Say hello to the user!')), 'Message', MB_ICONINFORMATION); 
    end; 
    前面的‘SayHello’是对文字的标识,通过这个标识程序才能从语言文件中找到正确的资源,后面的文字作用是当语言文件中不存在需要寻找的资源(或者语言文件不存在时),该函数默认所返回的内容。 
    另外,Translate函数还支持同Format()函数一样的参数显示,如这样: 代码: 
    procedure TForm1.Button1Click(Sender:TObject); 
    begin 
      MessageBox(Handle, PChar(tlmController1.Translate('ComponentCount', 'ComponentCount = %d', [ComponentCount])), 'Message', MB_ICONINFORMATION); 
    end; 
    4。以上的MessageBox()函数是出现在Form中的,并且该Form中已经有TtlmController控件了,所以才可以使用TtlmController的Translate()函数进行文字的转换,那么如果你的工程中有一个直接从TObject继承而来的功能类,它也需要显示Message,或者需要记载Log文字等,这时候该怎么办呢,最简单的方法是让这个功能类去调用某个Form中的TtlmController的Translate()函数,但是这样的缺点是程序可能需要为此做较大的改动,另外语言文件中的文字也将变得混乱不堪。那么这个时候最好的解决方案就是使用TtlmObject类,该类同TtlmController类一样,也有Translate函数可以使用,但是区别是它不会侦测所在Form的所有控件,不会对它们进行自动转换。 
    以下这个类是个小型的功能类。 代码: 
    interface uses 
      ....; type 
      TFunctionClass = class(TObject) 
      public 
        procedure ShowMessage(); 
      end; impenmentation procedure TFunctionClass.ShowMessage(); 
    begin 
      ShowMessage(nil, 'Say hello to the user!', 'Message‘, MB_ICONINFORMATION); 
    end; end. 
    使用TtlmObject类后,该类被改造为: 代码: 
    interface uses 
      ...., TLMObject; type 
      TFunctionClass = class(TObject) 
      private 
        FtlmObject:TtlmObject; 
      public 
        constructor Create(); 
        destructor Destroy();override; 
        procedure ShowMessage(); 
      end; impenmentation constructor TFunctionClass.Create(); 
    begin 
      inherited Create(); 
      FtlmObject:=TtlmObject.Create(self); 
    end; destructor TFunctionClass.Destroy(); 
    begin 
      FtlmObject.Free; 
      inherited Destroy(); 
    end; procedure TFunctionClass.ShowMessage(); 
    begin 
      MessageBox(Handle, PChar(tlmController1.Translate('ComponentCount', 'ComponentCount = %d', [ComponentCount])), 'Message', MB_ICONINFORMATION); 
    end; end. 
    这样每当使用该功能类中需要文字显示的函数时,真正使用的文字就是语言文件中记载的内容了。 5。TLMPack是从外部语言文件来加载语言文字的,由于完全手工写一个语言文件是一件比较枯燥的事,所以你可以使用向导控件来由程序,如果你打算自己手工来撰写一个语言文件,那么可以忽略该小节。 
    所谓的向导控件是指:TtlmIniGenerator和TtlmXmlGenerator这两个控件,它们会在程序运行时,将所有原本需要TtlmController和TtlmObject读取的文字,反向输出到语言文件中,你所要做的就是在程序的主窗体上放置一个TtlmIniGenerator(这里假设你要输出的是Ini格式的语言文件): 
     然后运行程序,程序运行的过程中会首先出现一个设置对话框,询问生成语言文件的路径,以及字符集格式等,一般使用默认的设置直接OK就可以了,可是在单击OK后出现错误:EFOpenError系统找不到指定的文件
      

  5.   

    尤其是,比如在相同的位置,一个Label.Caption的位置吧,汉字可能只需要两个汉字,翻译成英语或者其他语言就需要留出更多的空间以容纳这个翻译后的语言单词或者短语。