怎样在程序中利用C支持多国语言

本文以emule为例,探讨一下多国语言支持的实现。选择emule,因为它的多国语言支持实现的相当好,可以支持动态切换。而且最关键,它是开源的,可以直接通过源码来研究它的实现技术。 emule是利用动态加载资源DLL来实现多语言切换的,每一个资源DLL中包含了一份对应某一语言的字符串表。在源码的srchybridlang 路径上可以发现一个lang解决方案,其中包含了差不多40个项目,每个项目编译出来都是一个单独的DLL。这些DLL在程序安装时拷贝到指定的目录中。每个DLL里面都是一个大的string table。emule为每一个用到的字符串(大约为1400多个)都指定了一个固定ID,在不同的DLL中这个ID对应了这个字符串的不同语言的翻译版本。这样每当需要这个字串时就通过ID去获取,在当时程序加载的某一特定语言的DLL,就可以取到相应语言的字串。 英文版本的string table编译在主文件中,这样当某一语言不支持,或DLL文件加载失败时还可以使用英语版本。 下面我们就看看具体的实现。 主要实现代码在I18n.cpp文件中。入口函数是 void CPreferences::SetLanguage() ,这个函数在在 void CPreferences::LoadPreferences() 函数中被调用,即载入了程序的各种选项后。当程序第一次运行时,在选项文件(即 preferences.ini)中没有内容,SetLanguage函数会根据系统的本地语言设置来加载对应的语言DLL资源,所以我们第一次安装后就是中文,无需设置。这一点我们后面会说到。 另外在 BOOL CPPgGeneral::OnApply() 中也调用了该函数,即用户在“选项”窗口中改变了语言选择后。 在 void CPreferences::SetLanguage() 函数中,首先调用了 static void InitLanguages(const CString& rstrLangDir, bool bReInit = false) 函数。这个函数主要是通过遍历“语言”目录(即我们前面说地的,专门用于存放各种语言版本DLL的目录),来初始化静态“语言表” (_aLanguages),这是个静态数组,其中的每一项对应一种支持的语言。凡能找到相应DLL文件的,就在表中标记该语言为支持。 然后调用 static bool LoadLangLib(const CString& rstrLangDir, LANGID lid) 来载入相应的语言DLL。这个函数比较简单,通过查“语言表”(_aLanguages),如果要载入的语言是支持的,就加载相应的DLL文件,并将DLL模块句柄存到_hLangDLL中,这也是一个静态变量。我们可以看到如果是英语,是不需要加载的,直接用模块中的资源字符串表。 如果调用LoadLangLib文件加载指定的语言失败,程序会尝试判断本地系统的语言集,并加载对应的语言,如果加载也失败就使用英语。 语言文件加载成功后,程序会尝试从中加载一个字串,如果失败,说明可能DLL文件损坏,则再重设语言为英语。英语字串是内置在文件中的,所以是最可靠的。 至此,加载成功,句柄保存在_hLangDLL静态变量中。 最后在需要字符串的地方程序通过 CString GetResString(UINT uStringID, WORD wLanguageID) 或 CString GetResString(UINT uStringID) 函数加载相应的字符串。这个函数的功能很简单,就是从_hLangDLL指定的模块中加载字符串资源。如果_hLangDLL为 NULL就是从当前模块加载,我们前面已经看到了,如果使用英语这个变量的值就是NULL。 在emule的源码中,几乎每个对话框都实现了一个Localize(void)函数,这个函数就是通过调用GetResString来设置对话框上所有控件的文字。在 BOOL CPPgGeneral::OnApply() 函数中我们可以看到,在调用CPreferences::SetLanguage函数切换了语言后,会依次调用对话框和窗口的Localize(void)函数,重新设置UI的文字内容。 最后注意一点,如果你想让应用支持多语言,在设计对话框时要把对话框的Language属性设为“非特定语言”。在“资源”视图中选中相应的对话框节点,再切换到“属性”视图就可以看到这个选项了。如果不设置会出现乱码。

c 程序多语言,怎样在程序中利用C支持多国语言相关推荐

  1. 威纶触摸屏中如何组态设置多国语言进行切换?

    威纶触摸屏中如何组态设置多国语言进行切换? 如果我们在做一些出口的项目时,需要在触摸屏的画面中显示其他的语言,那么如何进行组态设置呢? 我们举个简单的例子来进行说明: 如下图所示,我们新建一个项目,然 ...

  2. Qt / Qml 中支持多国语言

    [缘起] 最近找到一个看起来比较好用的开源工具( 然鹅不太会用 ),但整个界面都是英文的. 不过由于是 Qt 写的,所以就尝试自己做些汉化. 然后了解到不少实现多国语言相关的技术( 以及一些坑 (‾◡ ...

  3. 在你的项目中使用Crowdin处理多国语言翻译

    在你的项目中使用Crowdin处理多国语言翻译 前言 一.Crowdin平台操作 1.创建仓库 2.翻译文件 二.本地项目操作 1.安装脚手架 2.上传源码 3.下载翻译文件 可能用得到的 前言 Cr ...

  4. Android支持多国语言

    1.如何让App支持多国语言的设置? 为了让以后方便代码的管理维护,推荐将一些尺寸,文字等都使用@string/xxx的引用方式. 为了达到目的,我们先需要知道国际中的各国语言和地区语言的简称,如最下 ...

  5. oracle支持几国语言,Oracle数据库多语言支持

    二.使用Unicode在需要支持多国语言的环境里,使用Unicode可以轻松解决数据存储问题. Oracle中支持以下几种Unicode编码?AL32UTF8 使用1,2,3个字节进行编码,扩展字符集 ...

  6. 柔宇发布“手写神器”柔记樱雪白特别版,支持7国语言手写识别

    深圳2018年9月26日电 /美通社/ -- 9月23日,柔宇科技在2018北京国际设计周期间首次对外发布柔宇科技的"柔性+"办公教育类升级新品 -- 柔记 RoWrite S 智 ...

  7. Make uploadify button text support multiple languages(使uploadify的buttonText支持多国语言)

    uploadify 控件的按钮不支持多国语言,这里介绍如何修改后使其支持多国语言. 1.jquery.uploadify.v2.1.4.js文件 70行 原代码:if (settings.button ...

  8. 字符编码转换类(支持多国语言)

    头文件StrConvertor.h /* * 字符编码转换库,支持多国语言. */ #pragma once #include <string>class CStrConvertor { ...

  9. java聊天室小程序论文_在Java项目中利用continue与break制作一个聊天室小程序

    在Java项目中利用continue与break制作一个聊天室小程序 发布时间:2020-12-08 16:03:27 来源:亿速云 阅读:98 作者:Leah 在Java项目中利用continue与 ...

最新文章

  1. 【LTE】LTEMIMO系统的MATLAB仿真
  2. no.4 数据和C 07
  3. JAVA和C#,武当和少林之争!
  4. 无代码火了,短板有哪些?
  5. JAVA 调用NetDraw((*^__^*) 嘻嘻……)
  6. Java代码审计: ClassLoader应用
  7. R语言——相关系数图
  8. 文件删除如何恢复?电脑数据恢复,4个详细方法
  9. 如何参与淘宝活动?活动怎样做才能快速爆单?
  10. FOR ALL ENTRIES IN
  11. 我的科幻杂谈1:不读史,无以言
  12. linux下将多个文件去除文件头合并_Linux下把多个文件合并成一个文件 - 卡饭网...
  13. 【GAMES-202实时渲染】1、软阴影01(Shadow Mapping、Peter Panning、PCSS原理超详细)
  14. 俩个PC机通过串行口互联,实现件的无差错传输。程序必须用中断方式来完成任务
  15. Laya Stage
  16. Unity移动端游戏性能优化简谱之 以引擎模块为划分的CPU耗时调优
  17. PyTorch中使用LSTM处理变长序列
  18. 5款优秀的开源克隆软件
  19. 不要只是分享自行车,你可以在逸管家互联网时代分享人才。
  20. mkdocs - Config value: ‘plugins‘. Error: The “minify“ plugin is not installed

热门文章

  1. Cinema 4D 办公楼建筑效果图表现
  2. mate10如何android,华为Mate10怎么使用NFC功能?华为Mate10手机NFC功能使用详细教程...
  3. cuda10.0配置pytorch1.7.0+monai0.9.0
  4. 2018计算机考研国家线预测,2018考研国家线预测及数据分析
  5. C#ObjectArx Cad插入一个实体
  6. Vue入门基础(一)
  7. 家用汽车维修4:修车工具材料
  8. 制作一个播放器(一)
  9. 【快速上手系列】保姆级Layuimini与SSM的联合使用教程(数据表格操作)
  10. 小曾WRF自学日记(4)渐入佳境 ——WRF实例-运行WRF