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

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

  在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. [Android Memory] Android性能测试小工具Emmagee

    转载:http://blog.csdn.net/anlegor/article/details/22895993 Emmagee是网易杭州QA团队开发的用于测试指定android应用性能的小工具.该工 ...

  2. python中下划线_的用途

    Python 用下划线作为变量前缀和后缀指定特殊变量. _xxx       不能用'from module import *'导入 __xxx__  系统定义名字 __xxx     类中的私有变量 ...

  3. Windows 2008 R2

    1简介 Windows 2008 R2是微软针对windows 7所推出的Windows server操作系统.为了使企业减少操作成本和提高效率,Windows Server 2008 R2对企业资源 ...

  4. spark完全分布式集群搭建

    最近学习Spark,因此想把相关内容记录下来,方便他人参考,也方便自己回忆吧 spark开发环境的介绍资料很多,大同小异,很多不能一次配置成功,我以自己的实际操作过程为准,详细记录下来. 1.基本运行 ...

  5. Android Volley框架的使用(四)图片的三级缓存策略(内存LruCache+磁盘DiskLruCache+网络Volley)

    在开发安卓应用中避免不了要使用到网络图片,获取网络图片很简单,但是需要付出一定的代价——流量.对于少数的图片而言问题不大,但如果手机应用中包含大量的图片,这势必会耗费用户的一定流量,如果我们不加以处理 ...

  6. 倍福TwinCAT(贝福Beckhoff)基础教程7.1 TwinCAT如何简单执行NC功能块 TC2

    TC2的程序是在TC3的基础上稍作调整,只说明不同点,请先看TC3的. TC2中的一个原本是AXIS_REF类型变量被拆成了两个(PLCTONC_AXLESTRUCT和NCTOPLC_AXLESTRU ...

  7. FBXImport

    using UnityEditor; public class MyEditor : AssetPostprocessor{ public void OnPreprocessModel() { Mod ...

  8. null和undefined相等比较

    在==(相等)判断中,null和undefined相等(它们也与自身相等),除此之外不与其他值相等. 示例代码: <!DOCTYPE html> <html lang="z ...

  9. MVC你是怎样理解的?

    近期的学术交流会议都在研究MVC,秉着好好学习,天天向上的心理,时不时的就去蹭会.说实话,原来也有看过MVC的一些相关资料,可是仅仅是浅尝辄止.并且,由于先学了三层,所以再看MVC的时候,潜意识里的就 ...

  10. 《windows核心编程》 18章 堆

    堆的优缺点: 优点:让我们专心解决手头问题,不必理会分配粒度和页边界这类事情. 缺点:分配和释放内存块的速度比其他方式慢,而且也无法对物理存储器的调拨和撤销进行直接控制. 什么是堆: 堆就是一块预订的 ...