英文、中文的就不浪费大家的时间了,我的问题是关于西欧字符的。一个丹麦人帮忙把软件界面翻译成了丹麦文的,结果后来他说界面有乱码,凡是北欧字符都是乱码,并截图给我看,弄得我莫名其妙,我不明白怎么北欧的WinXP竟然可以显示非Unicode的双字节?我昏!http://cn.textrush.com/image/messy.jpg经仔细询问,他说对话框、按钮、工具条按钮甚至菜单的Hint都没有乱码,西欧、北欧字符都显示正常,单单菜单中的凡是ASCII码在127以后的欧洲字符全部是双字节乱码。而且他说Ini文件里面一切正常,但显示在菜单就有双字节乱码!我明白简体中文操作系统上显示欧洲字符是有乱码,但我没想到简单的Ini格式的语言文件在他们的机器上显示会有乱码,而且仅仅只是菜单,其它的都正常!今天通过一个欧洲华侨的法文WinXP也确认了法文也有类似的问题。; 法文Ini文件的示例
[Menu]
DeleteBackupMenu.Caption=Supprimer les Fichiers Sauvegard閟
DeleteBackupMenu.Hint=Supprimer les fichiers format閟 sauvegard閟
SplitMenu.Caption=Exporter vers Fen阾re Coup閑
SplitMenu.Hint=Exporter code-source format?ver fen阾re coup閑{ 我的语言转换过程 }
procedure TMainForm.SetActiveLanguage(LangName: string);
var
  Cmp: TComponent;
  i: Integer;
  Fn: string;
  Ini: TIniFile;
begin { Set language }
  //Get the path of language file
  Fn := ExtractFilePath(Application.ExeName) + 'Language\sf' + LangName + '.ini'; 
  if FileExists(Fn) then
  begin
    Ini := TIniFile.Create(Fn);
    try
      with Ini do
      begin
        for i := 0 to ComponentCount - 1 do //Loop all
        begin
          Cmp := Components[i];
          
          if Cmp is TMenuItem then
          begin
            (Cmp as TMenuItem).Caption := ReadString(sfMenu, Cmp.Name + '.Caption',
              (Cmp as TMenuItem).Caption);
            (Cmp as TMenuItem).Hint := ReadString(sfMenu, Cmp.Name + '.Hint',
              (Cmp as TMenuItem).Hint);
          end;
          
          if Cmp is TToolButton then
          begin
            (Cmp as TToolButton).Hint := ReadString(sfTool, Cmp.Name + '.Hint',
              (Cmp as TToolButton).Hint);
          end;
        end;
      end;
    finally
      FreeAndNil(Ini);
    end;
  end;
end;另外主Form的Charset是默认的DEFAULT_CHARSET。期盼得道高人拯救小弟于水深火热之中,感激涕零!!!

解决方案 »

  1.   

    你說的我不太懂!
    但真正支持多語言, 我想還是要用到unicode!http://borland.mblogger.cn/aiirii/posts/1624.aspx
      

  2.   

    多语言只做过中英文的,基本是INI实现。不妨看看ARI的
      

  3.   

    aiirii(ari-爱的眼睛) :他们就是打开Ini文件里面都没有双字节乱码,对话框,按钮也没有,但是软件菜单有乱码。而奇怪的是用的是同一个方法...Okay,我试试把,把Ini转换成Unicode试试。不过这个问题百思不得其解.........菜单为什么会有乱码?
      

  4.   

    我想是因为你的Ini文件保存的时候用的中文的本地编码,
    最好保存成unicode,程序调用的时候,再转换。
      

  5.   

    我曾经在程序中使用ActionManager的TActionMainMenuBar控件来制作菜单,但是发现它的ParentFont属性默认为false的,导致我的程序菜单部分无法正常支持多国语言,后来将ParentFont设为true就好了,你使用的是什么菜单控件,可能也是这样的问题
      

  6.   

    to tonylk(=www.tonixsoft.com=) :XPMenu,难道是他的问题吗?我去试试。谢谢老大提示。to aiirii(ari-爱的眼睛) :老大,上面的评论说还是有乱码啊:评论
    # 回复: Delphi下实现UniCode 2004-5-31 12:31 Ryo 
    menu还是显示乱码 # 回复: Delphi下实现UniCode 2004-7-4 23:35 amai 
    但是在ListView中只能显示列为多语言,item显示不出,请问是为何 洋人就是打开Ini文件里面都没有双字节乱码,对话框,按钮也没有,但是软件菜单有乱码。而奇怪的是用的是同一个方法...Okay,我试试把,把Ini转换成Unicode试试。感激列位老大!
      

  7.   

    to flyforlove(为情飞) :Ini 文件用的是文本模式,用Hex编辑器看没有任何多余的数据。况且洋人已经说过对话框、按钮没有乱码。
      

  8.   

    我做过多语言,你试试这样,把系统切换到你想要的语言环境下,(local 和语言支持默认都要是你想要的语言)
    然后再打开翻译的那个语言,写到ini 中保存之,如果看到的不是乱码就没的问题。我做过多语言的帮助,还要公司的软件是多语言实现。一般好像这样解决。你试试?!
      

  9.   

    //洋人就是打开Ini文件里面都没有双字节乱码,对话框,按钮也没有,但是软件菜单有乱码。因为菜单是调用的系统默认字体,我想你也没有办法设置菜单的字体吧,我想这就是只有它显示乱码的原因。打个比方,如果ini文件是保存成的丹麦文的本地ansi文件,那么程序运行在丹麦文系统上,
    应该是不会有乱码的。
      

  10.   

    >>menu还是显示乱码 
    如你這麼說, 應該是INI在保存的問題了! 而不是控件顯示的問題!
    如果方便, 應該在相應的語言操作系統中, 重新寫一次正确字符!我感覺不用再關注控件了, 要檢查 ini 保存的文字是否正确編碼,
    讀取的過程有沒有問題! 
    如不行, 試下 widestring 呢???
      

  11.   

    XML保存数据试试(XML中可以指定编码格式)
      

  12.   

    使用WinXP/2003在系统语言设置中指定使用法语字符,然后再观察问题的所在
    因为XP/2003是多国语言支持的建议不要用Default Language,直接指定为法语,这样尝试看看效果如何起码Ini中的内容要能显示正确,否则都是百搭的
    用NotePad打开看没问题才行
      

  13.   

    看看XPMenu中的这个函数:procedure GetSystemMenuFont(Font: TFont);
    var
      FNonCLientMetrics: TNonCLientMetrics;
    begin
      FNonCLientMetrics.cbSize := Sizeof(TNonCLientMetrics);
      if SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, @FNonCLientMetrics,0) then
      begin
        Font.Handle := CreateFontIndirect(FNonCLientMetrics.lfMenuFont);
        Font.Color := clMenuText;    //if Font.Name = 'MS Sans Serif' then
        //begin
        //  Font.Name := 'Tahoma';
        //  Font.Charset := DEFAULT_CHARSET;
        //end;  end;
    end;我觉得你有必要自己修改一下这个函数。
      

  14.   

    这个问题可以绕过去 hehe^^ (实在不行的情况下),必尽窗体其它问题是没有问题的,我的意思你明白吧你可以按 tonylk(=www.tonixsoft.com=) 说的试试
      

  15.   

    我倒是做过韩文和日文的,不知道你的Font 的CharSet属性设置对了没有,当然 Name属性也必是相应的内容,应该是不会有问题的,至少我做的过程中是这样解决的
      

  16.   

    Okay, 谢谢大家,方法我都来试试。有结果了告诉大家。:)
      

  17.   

    问题解决了。非常感谢 tonylk(=www.tonixsoft.com=) 和 minjunw 老大的提醒。这是一个很弱智的问题,很抱歉耽误了大家的时间。问题和Ini文件无关(和我之前的猜想也一样),开始添加XPMenu时,XPMenu从{$IFDEF VER130}
    {$DEFINE VER5U}
    {$ENDIF}constructor TXPMenu.Create(AOwner: TComponent);
    begin
      {$IFDEF VER5U}
        FFont.Assign(Screen.MenuFont);
      {$ELSE}
        GetSystemMenuFont(FFont);
      {$ENDIF}
    end;处获得字体属性,不论是否是Delphi5,得到的默认字体都是"宋体" 9号,默认Charset也成为GB2312_CHARSET了,而无论你主Form的字体是什么,ParentFont根本不起作用。手动改XPMenu Font属性为Font.Name := 'MS Sans Serif';
    Font.Size := 8;
    DEFAULT_CHARSET后问题消失。在法文和丹麦文WinXP上反复折磨都没有再出现乱码。之所以会在欧洲Windows上显示双字节,我想是欧洲版的XP至少带有一个双字节的字体,为Unicode服务。当Charset为GB2312_CHARSET时且宋体不存在时显示。否则无法解释欧洲Windows上出现双字节的问题。所以以后大家用XPMenu做多语言要小心。切换语言时必需用代码设置XPMenu的字体属性或者干脆运行时即时创建一个XPMenu控件。还有一个问题,TIniFile类在Win9x下无法访问超过64K的Ini文件,大家有什么比较简单的办法吗?
      

  18.   

    使用XML保存数据,呵呵,数据访问和储存很方便(通过XPath查询),强烈推荐
      

  19.   

    我曾经贴过一个可以在Win9x系统下使用的读取超过64K文件的Ini文件类,可以看这里:http://community.csdn.net/Expert/topic/3151/3151612.xml?temp=4.546756E-02另外,我所开发的多国语言控件,可以选择使用ini文件或者Xml文件作为语言描述文件,可以看这里:
    http://www.tonixsoft.com/index.php?mmenu_id=0003
    和:
    http://www.tonixsoft.com/phpbb2/viewforum.php?f=2&sid=c8b6b6c27ed54dc2a680e060d36d880d
      

  20.   

    感谢 tonylk(=www.tonixsoft.com=) 和  Eastunfail(龙子龙孙)==(恶鱼杀手) 麻烦看看这里:http://community.csdn.net/Expert/topic/3227/3227090.xml?temp=.6004907