1.新建工程

新建了一个对话框工程,工程名称为MultiLanguages,默认语言选择是“中文”。

2.添加多国语言的资源

在创建工程后,工程会添加默认的资源,如主对话框,都是“中文”资源。现在我们需要添加相应的英文的资源文件。
为主窗口IDD_MULTILANGUAGES添加英文资源的方法为:
(1)打开Resource View窗口。
(2)右键IDD_MULTILANGUAGES,点击弹出菜单中的“Insert Copy”菜单,如下图所示。
(3)弹出窗口资源复制语言选择窗口,选择语言为“英语(美国)”,如下图所示。
(4)点击OK,即完成英文版对话框的添加。完成添加后,IDD_MULTILANGUAGES就对应于两个不同语言版本的对话框了,如下图所示。

使用同样的方法,也可以为其他资源添加多国语言版本的支持。主要需要多国版本需要支持的有对话框、菜单和字符串。
添加多国语言的资源后,要对这些资源进行不同语言的定制,根据资源对应的语言,设置对话框和控件的标题等。

3.Locale

程序的语言选择跟操作系统语言(System Locale)、用户设置语言(User Locale)和线程语言(Thread Locale)有关。程序运行时,是根据线程语言来选择资源的。如果程序中未对线程语言进行设置,线程语言默认采用用户设置语言。设置线程语言的函数是SetThreadLocale。
设置线程语言为“中文”的代码如下:

SetThreadLocale(MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_DEFAULT));

设置线程语言为“英语(美国)”的代码如下:

SetThreadLocale(MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT));

设置线程语言要在对话框创建之前,否则无法更改对话框的资源。可以在CMultiLanguagesApp::InitInstance函数中的对话框初始化之前添加线程语言设置,分别设置为中文和英文语言,就可以查看到对话框界面的不同。

4.字符串处理

程序的多国语言的支持,不仅包括界面的多国语言支持,也要包括各类字符串的多国语言支持,如弹出的提示信息。因此,在弹出提示信息时,也要为提示信息创建多个语言版本,并根据当前线程的语言来选择不同的提示信息。

例子:实现不同语言版本中按钮的点击次数的统计。
(1)在String Table中分别添加中英文的IDS_STRING_SAMPLE资源,内容如下表所示。
中文
这个一个中文提示信息。\n点击次数:%d。
英文
This is a prompt message in English.\nClick Times:%d.
(2)在主窗口控件中添加一个控件Button1,控件的中文名为“提示”,英文名称为“Prompt”。为该控件添加一个左键单击消息响应函数,该函数的内容如下:

void CMultiLanguagesDlg::OnBnClickedButton1()
{// TODO: Add your control notification handler code herestatic int s_iClickTime = 0;s_iClickTime++;CString strPrompt = _T("");CString strFormat = _T("");strFormat.LoadString(IDS_STRING_SAMPLE);strPrompt.Format(strFormat, s_iClickTime);AfxMessageBox(strPrompt);
}

(3)分别在CMultiLanguagesApp::InitInstance添加设置线程语言为中文和英文的代码,然后多次点击按钮进行测试。

5.语言切换

窗口在初始化时候就导入了资源文件,在通过SetThreadLocale更换了线程语言后,窗口的资源并不会更改,必须要通过代码来重新装载资源。因为窗口中存在多种与线程语言相关的资源,重新启动软件一种叫快捷的更新语言环境的方法。
例:通过菜单来进行语言切换,切换语言后重启软件。
(1) 为程序添加中英文菜单选项ID_LANGUAGE_SWITCH,并为该菜单添加消息响应函数,其中,m_bRestartFlag使用判断关闭窗口时是否需要重启程序的标识。代码如下。

void CMultiLanguagesDlg::OnLanguageSwitch()
{// TODO: Add your command handler code here// 读取当前线程的语言,并根据当前线程语言进行语言切换LCID lcidNew = GetThreadLocale();if (LANG_ENGLISH == PRIMARYLANGID(LANGIDFROMLCID(lcidNew))){lcidNew = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_DEFAULT);}else{lcidNew = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT);}// 把语言设置写入配置文件CFile file;file.Open(_T("Language.ini"), CFile::modeWrite | CFile::modeCreate | CFile::typeBinary);file.Write(&lcidNew, sizeof(lcidNew));file.Close();// 关闭窗口m_bRestartFlag = TRUE;PostMessage(WM_CLOSE, 0, 0);
}

(2) 在关闭窗口时,重启动该程序。即在窗口响应WM_CLOSE时,重启程序。代码如下:

void CMultiLanguagesDlg::OnClose()
{// TODO: Add your message handler code here and/or call default// 判断是否需要重新启动窗口if (m_bRestartFlag){CString strFileName = _T("");GetModuleFileName(NULL, strFileName.GetBuffer(MAX_PATH), MAX_PATH);ShellExecute(NULL, _T(""), strFileName, NULL, NULL, SW_SHOWNORMAL);strFileName.ReleaseBuffer();}CDialogEx::OnClose();
}

(3) 在启动软件时,根据当前软件的配置文件中语言来设置线程语言,即在CMultiLanguagesApp::InitInstance函数中创建对话框之前设置线程语言,代码如下:

// 判断你是否存在配置文件,如果存在,从配置文件中读取语言设置
CString strFileName = _T("Language.ini");
if (PathFileExists(strFileName))
{LCID lcidThread = 0;CFile file;file.Open(strFileName, CFile::modeRead | CFile::typeBinary);file.Read(&lcidThread, sizeof(LCID));file.Close();SetThreadLocale(lcidThread);
}

(4)通过点击菜单来测试软件的语言切换。

6. MessageBox的问题

由于MessageBox中的按钮的语言是跟操作系统相关的,要想实现MessageBox按钮的多语言化是很有一定难度的。我现在还没有查到好的解决方法,很多网友的建议是抛弃MessageBox,自己建立对话框。

7. 源代码

源代码的下载链接如下:
http://files.cnblogs.com/xianyunhe/MultiLanguages.rar

【MFC进阶】09多国语言切换相关推荐

  1. html多国语言配置方法,jquery多国语言切换特效

    这是一款实现多国语言切换的jquery特效.在这个示例中,通过简单的js代码,实现包括中文和英文在内的7种不同国家语言的切换效果. 使用方法 在页面中引入jquery和style.css. HTML结 ...

  2. MFC默认的多国语言实现方法

    关于MFC多国语言的实现方法,网上给出的主流方案是: 一. 自己实现 从ini或者xml文件读取字符串,根据需要动态填充到控件或者菜单中. 这种方法通用性好,甚至可以实现动态切换界面语言,但实现起来比 ...

  3. 2.4 Qt多国语言切换

     如果要实现qt程序动态语言切换,最简单有效的方法是使用QTranslator类,首先使用QTranslator对象加载相应的翻译语言文件,然后用 QApplication::installTrans ...

  4. Android开发应用内多国语言切换

    看到微信可以切换语言,切换语言也就是app国际化问题.我们也都会想到通过改变系统的语言,让app是自己跟随系统走,但是每一台手机系统设置中支持选择的语言,就比较少,比如小米2a:就只有 简体中文,繁体 ...

  5. php 多语言cms,帝国cms模板实现多国语言切换

    语言包解决方案(中英文为例,其他可自行添加) 1 .复制gb语言包,放入目录:edatalanguage中,重命名为:"zh"; 另加入语言包(除gb语言包以外):针对模板的中文进 ...

  6. C# 多国语言切换(三)

    备注 :代码为借鉴,目的为方便自己做项目 首先需要在主窗口界面中设置 1.Localizable( 可本地化 ) : 设置为TRUE 2.Language(语言): 选择自己需要的语言 设置控件文本T ...

  7. iOS中代码支持多国语言切换的实现(Xcode5+iOS7)

    时间2014-03-08 22:14:13 CSDN博客 原文  http://blog.csdn.net/gisxy/article/details/20577881 为了增加程序的用户使用数量,那 ...

  8. IOS APP软件多国语言切换,国际化app

    转自:http://www.lanrenios.com/tutorials/advanced/2013/0406/1033.html App Store 中很多流行的应用程序有多种语言版本.虽然这些应 ...

  9. C++多国语言插件库(适用QT/MFC)

    简述: 此 库基于VS2015++ win10sdk 开发封装,用于QT/MFC平台下的多国语言切换库, 需结合poedit进行编辑语言资源,使用起来极为简单,支持中文简繁体: typedef enu ...

最新文章

  1. mac下没有设置 SVN_EDITOR....错误解决方法
  2. Ansible — Modules
  3. android编译产生的apk或so不安装 .
  4. upload-labs-master文件上传靶场第七关详解
  5. vue 计算属性和data_Vue计算属性原理和使用场景
  6. emwin之在中断服务程序中创建窗口的结果
  7. using 语句中使用的类型必须可隐式转换为“System.IDisposable“
  8. python列表split_Python-split()函数实例用法讲解
  9. 前端学习(1152):let经典面试题2
  10. spring mvc学习(30):sessionatrribute存储session数据
  11. centos 程序 mysql_Centos 源码安装 MySQL
  12. mysql 表2符合表1,MySQL:表tbl_2_1_15已满
  13. 将ping命令结果输出到文本
  14. Linux系统简单实验操作rm
  15. java编程测试题_Java编程测试可帮助您评估求职者
  16. proteus中ISIS软件的各种器件的添加
  17. MFC 激活CPropertySheet 的应用按钮
  18. openGauss助力中国移动获 “ICT优秀案例”
  19. map取固定key_Map获取key值
  20. Unity + LeapMotion 识别食指伸出以及食指与 UGUI的 交互

热门文章

  1. 三、IPSec(Internet Protocol Security,互联网安全协议)
  2. 交通诱导信息发布系统服务器,基于TTS技术的交通语音诱导信息发布系统设计
  3. .NET破解之PDF编辑器
  4. discuz数据库结构表
  5. 林轩田机器学习技法第五讲-Kernel Logistic Regression
  6. iOS appstore无沙盒账号登录选项
  7. 亚伟计算机速录测试软件,亚伟中文速录软件
  8. 计算机office Word④
  9. [Python]调用adb抢双十一淘宝喵币
  10. 河北科大校联通园网破解(调教)教程———保姆级