前段时间,因工作需要,本地化了一个英文版本的产品。

  在网上查阅了若干资料,在此进行一个简单的整理。

  在MFC程序中,实现多国语言的方式很多,我们选择的是使用配置文件的方法。

  在通过配置文件方式实现多国语言功能时,主要的工作是:

  1、将需要在界面上显示的文字保存到文件中。

  2、在使用这些资源时,不是从rc文件中获取,而是从文件中加载,动态显示。

  在配置文件中,需要保存各个资源的ID、各语言版本字符串的值。需要某个资源时,通过其ID查找到资源所在节点,获取相应语言的字符串值。

  有一个问题是需要考虑的,资源的ID都是UINT类型的,如果在配置文件中以UINT类型的数值作为节点的ID,标识一个资源的话,不容易维护。

  为解决这个问题, 我们可以借鉴.h文件中的做法。在.h文件中,为了易于维护,为每个UINT类型的ID都定义了相应的宏,例如:#define IDS_DATA    1001,而在rc文件中对该资源的定义为:IDS_DATA        "Data"。这样,在程序中使用时只用IDS_DATA来代表"Data"。

  在配置文件中,可以借鉴此做法。用一个XML文件来定义IDS_DATA与1001的对应关系;用另外一个文件来定义IDS_DATA与"Data"的对应关系。而维护资源的内容时,只需要修改资源内容的XML文件。

  MFC程序中,主要有三种资源:Menu、Dialog、String。要根据每种资源的特点,来设计相应的方式保存这些资源的文字内容,便于根据资源ID获取相应的文字内容。

  可以为每种资源封装一个公共方法,动态显示该资源的文本内容。

Menu

  对Menu类的资源,可以封装一个公共函数,遍历Menu中的所有Item,为每个Item设置显示的文字。

  如何从配置文件中获取Menu Item相应的字符串呢?需要根据配置文件的结构封装相应的方法。

  在遍历菜单,设置各菜单项文字内容的过程中,需要的主要方法如下。

  对于Popup Menu,设置Menu Text的方法:

  ModifyMenu(hMenu, i, MF_BYPOSITION, i, menuStr);

  对于String Menu,设置Menu Text的方法:

  ModifyMenu(hMenu, nMenuID, MF_BYCOMMAND, nMenuID, menuStr);

  获取菜单子菜单的方法:

  HMENU hSubMenu = GetSubMenu(hMenu,i);

Dialog

  对于Dialog类的资源,可以封装一个公共函数,遍历Dialog内的所有控件,为每个控件设置显示的文字内容。当然,还要设置Dialog的标题。

  获取各控件字符串的方法需要根据Dialog资源配置文件的组织方式来订。

  遍历Dialog,设置各控件文字内容时,需要用到的主要方法如下。

  设置Dialog标题的方法:

  ::SetWindowText(hWnd,caption);

  获取Dialog第一个子控件的方法:

  HWND hSubWnd = GetWindow(hWnd,GW_CHILD);

  获取Dialog子控件下一个控件的方法:

  hSubWnd = GetWindow(hSubWnd,GW_HWNDNEXT);

  利用以上两个方法,可以遍历Dialog中的所有控件。

  判断子控件是否为Window的方法:

  ::IsWindow(hSubWnd)

  通过以上判断,可以获知遍历是否完成。

String

  对于String类的资源,配置文件结构很简单,只需要保存资源ID和各个语言版本对应的字符串值即可。

  可以封装一个公共方法,根据ID从配置文件中获取字符串的值。

  使用字符串资源的方式很多,例如:错误提示信息、Status Bar显示信息、ToolTip等等。主要的是,根据各种使用场合,如何修改相关代码,改为利用公共方法,从配置文件中读取字符串资源。

MFC多国语言——配置文件的更多相关文章

  1. MFC多国语言——资源副本

    此随笔主要参考了http://www.cnblogs.com/xianyunhe/archive/2011/09/02/2163842.html 为软件提供多国语言的支持的具体实现方法有很多,但基本原 ...

  2. MFC多国语言——资源DLL

    此随笔中主要内容来自http://blog.csdn.net/china_hxx/article/details/10066655,原出处不详. 以下内容基于VC 6.0.要实现界面多语言化,必须要先 ...

  3. WinCE6.0多国语言软键盘

    N久以前写过一篇<WinCE下自定义的大软键盘>,这个自定义软键盘就是为RM905a+项目来做的.RM905a+的系统分辨率是640*480,WinCE原生键盘小的太小,大的又太大.所以就 ...

  4. 引擎设计跟踪(九.8) Gizmo helper实现与多国语言

    最近把gizmo helper的绘制做好了. 1.为了复用代码,写了utility来创建sphere, cube, cylinder, plane, ring(line), circle(solid) ...

  5. 引擎设计跟踪(九.14.2j) TableView工具填坑以及多国语言

    Blade的UI都是预定义的接口, 然后由插件来负责实现, 目前只有MFC的插件. 最近加上了TableView的视图, 用于一些文件的查看和编辑, 比如前面在文件包的笔记中提到需写一个package ...

  6. 使用 .toLocaleString() 轻松实现多国语言价格数字格式化

    用代码对数字进行格式化,显然不是逢三位加逗号这么简单.比如印度在数字分位符号上的处理,就堪称业界奇葩: 印度的数字读法用“拉克”(十万)和“克若尔”(千万),数字标法用不对称的数位分离,即小数点左侧首 ...

  7. Visual Studio 2010 SP1 中文升级补丁ISO完整版下载 (含多国语言)

    最近事情比较多,差点忘记了这个VS2010 SP1的升级补丁更新了,程序员们赶快更新吧!这次发布的SP1包含了下列语言:英文,简体中文,繁体中文,法语,德语,印度语,日语,韩语,俄语以及西班牙语. V ...

  8. Vnc自动登录器-多国语言绿色版

    推荐:介绍一个VNC连接工具:iis7服务器管理工具.IIs7服务器管理工具可以批量连接并管理VNC服务器.作为服务器集成管理器,它最优秀的功能就是批量管理windows与linux系统服务器.vps ...

  9. 解析大型.NET ERP系统 多国语言实现

    实现多国语言有许多种实现方案,无外乎是一种字符串替换技术,将界面控件的文本标签替换成相应语言的文字..NET Windows Forms实现多国语言的方法有以下几种: 1 .NET的方案,使用资源文件 ...

随机推荐

  1. jquery修改ajax的header的字段origin方法,均被浏览器拒绝

    一.方法一 $.ajax({ headers: { Origin: "http://targetIP" } }); 二.方法二 $.ajax({ beforeSend: funct ...

  2. FL2440 rt3070模块station模式动态获取IP地址

    ---------------------------------------------------------------------------------------------------- ...

  3. sqoop操作与使用

    sqoop只要安装到集群中的一台节点就可以了 1.上传sqoop到节点中 2.安装和配置 在添加sqoop到环境变量到/etc/profile中 将数据库连接驱动拷贝到$SQOOP_HOME/lib里 ...

  4. 解决防火墙限制远程连接MySQL(导致错误10060可能之一)

    打开windows防火墙,打开高级设置 1. 入站规则设置 ① 选择入站规则,然后新建规则,选择端口,然后下一步 ② 选择TCP,选择特定端口,然后输入端口,如有多个端口需要用逗号隔开了 例如: 33 ...

  5. 修改git的author 和 commiter

    点击:Add Entry

  6. Tomcat:IOException while loading persisted sessions: java.io.EOFException 解决

    转自:http://www.blogjava.net/apple0668/archive/2007/10/12/152383.html Tomcat启动时如下错误: 严重: IOException w ...

  7. jQuery 创建html

    jQuery 创建html

  8. lodash 工具库

    lodash是一套工具库,内部封装了很多字符串.数组.对象等常见数据类型的处理函数. 1.lodash的引用 import _ from 'lodash' 用一个数组遍历来说明为什么要使用lodash ...

  9. C语言循环中降低推断——————【Badboy】

    为了让编译器更好地优化循环,应该尽量让循环中降低推断,方法之中的一个是将推断语句整合进表达式.还是这个样例: for (int i = 0; i < 1000*10; i++) { sum += ...

  10. hdu1509(Windows Message Queue) 优先队列

    点击打开链接 Problem Description Message queue is the basic fundamental of windows system. For each proces ...