none
如何让应用程序支持中英文两种文字? RRS feed

  • 问题

  • 我要做个小程序,现在里面的菜单,按钮等资源上的文字都是中文的,

    我想实现如下描述的效果,

    这个程序有很多菜单,其中一个菜单里有两个选项,分别是“中文版”,“英文版”,

    当选择“中文版”的时候,程序的所有资源里的文字都变成中文的,如菜单上的文字,按钮上的文字,
    当选择“英文版”的时候,程序的所有资源里的文字都变成英文的,如菜单上的文字,按钮上的文字,

    我的思路是用读取配置文件的方式,但是不知道具体怎么写,

    有没有这方面的源码,或者有没有别的办法,思路?

    谢谢!嫌分不够,可再加分,但是一定要给我解决喽!
    2009年8月21日 5:25

答案

  • 1. 制作两种语言的资源文件
        可以采用资源DLL方式
        或者采用ini,xml等配置文件方式
        采用的方式没有特别的好坏之分,根据个人需要取舍
    2. 根据用户选择斜载当前资源文件,动态加载选中的资源文件
        DLL使用LoadLibrary之后LoadString
        ini,xml等则根据自己的需要读取文件
    3. 可以采用SetMenuItemInfo,SetWindowText等方式逐一更新菜单和按钮文字
        或者删除当前按钮或菜单,根据当前语言资源文件重新生成,设置到窗口
    • 已标记为答案 Tim Li 2009年8月31日 3:08
    2009年8月21日 7:57

全部回复

  • 我用的是结构数组,结构形式如下
    typedef struct _tagMultiLangLabel
    {
         UINT iCtrlID;
         char[X][Y];
    }MULTILANGLABEL,*LPMULTILANGLABEL;
    //X为多语言的种类数量,Y为最大字串长度.

    //定义数组
    const MULTILANGLABLE g_langlabel[] = {
          {ID1, "日", "fuck"},
          {ID2, "操", "shit"},
          {-1, ""}
    }

    //查找算法
    char *FindLang(UINT iCtrlID, UINT iLang)
    {
          int i = 0;
          while(g_langlabel[i].iCtrlID!= -1)
         {
             if (g_langlabel[i].iCtrlID== iCtrlID)
             {
                 return (char *)g_langlabel[i].szInfo[iLang];
             }
             i++;
         }
         return NULL;
    }

    just learn
    2009年8月21日 7:06
  • 1. 制作两种语言的资源文件
        可以采用资源DLL方式
        或者采用ini,xml等配置文件方式
        采用的方式没有特别的好坏之分,根据个人需要取舍
    2. 根据用户选择斜载当前资源文件,动态加载选中的资源文件
        DLL使用LoadLibrary之后LoadString
        ini,xml等则根据自己的需要读取文件
    3. 可以采用SetMenuItemInfo,SetWindowText等方式逐一更新菜单和按钮文字
        或者删除当前按钮或菜单,根据当前语言资源文件重新生成,设置到窗口
    • 已标记为答案 Tim Li 2009年8月31日 3:08
    2009年8月21日 7:57
  • PS: 只有中文和英文切换的情况下,可以使用多字节编码,也可以使用unicode,
          但是如果以后需要加入其他语言的话,最好使用unicode,可以省去很多切换代码页的麻烦.
    2009年8月21日 8:01
  • 1. 制作两种语言的资源文件
        可以采用资源DLL方式
        或者采用ini,xml等配置文件方式
        采用的方式没有特别的好坏之分,根据个人需要取舍
    2. 根据用户选择斜载当前资源文件,动态加载选中的资源文件
        DLL使用LoadLibrary之后LoadString
        ini,xml等则根据自己的需要读取文件
    3. 可以采用SetMenuItemInfo,SetWindowText等方式逐一更新菜单和按钮文字
        或者删除当前按钮或菜单,根据当前语言资源文件重新生成,设置到窗口

    Genofu的回答很全面,
    我们开发的软件也涉及到多语言问题,为了省事,用的是Genofu说的第三种方法,
    封装一下调用字符串的地方,用英语或者自定义的字符串为原始版本,也就是key,然后程序启动的时候枚举所有子窗口和menu,将key字符串设置成对应的目标语言
    这样做比较简单,但是每次切换语言都需要把窗口删除中心创建(因为只有第一次创建的时候原始资源和key是对应的)
    2009年8月21日 9:20