文章目录

  • 前言
  • 一、新建工程
  • 二、添加多国语言的资源
  • 三、程序语言设置
  • 四、语言切换
  • 五、字符串处理
  • 六、MessageBox的问题
  • 七、相关函数和类型

参考文章

前言

  目前很多软件都是要出口到多个国家,多个地区,因此,为软件提供多国语言支持就成为了一个基本条件。为软件提供多国语言的支持的具体实现方法有很多,但基本原理都差不多,就是实现代码和语言包的独立,代码根据设定的语言选择语言包。

  其中,MFC的资源文件就提供了对多国不同语言的支持功能,如果使用MFC开发,直接用资源文件自带的多国语言支持,可以省去不少的麻烦。

下面就介绍给MFC程序添加中英文的支持,开发环境为VS2022。

一、新建工程

新建一个基于对话框的工程,工程名称为MultiLanguages,默认语言选择是中文“zh-CN”,如图:

二、添加多国语言的资源

  在创建工程后,工程会添加默认的资源,如主对话框,都是“中文”资源。现在我们需要添加相应的英文的资源文件。

为主窗口IDD_MULTILANGUAGES添加英文资源的方法为:
1、打开资源视图窗口。
2、右键IDD_MULTILANGUAGES,点击弹出菜单中的“插入副本”菜单,如下图所示:

3、弹出窗口资源复制语言选择窗口,选择语言为“英语(美国)”,如下图所示。

4、点击"确定",即完成英文版对话框的添加。完成添加后,IDD_MULTILANGUAGES就对应于两个不同语言版本的对话框了,如下图所示。

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

三、程序语言设置

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

设置线程语言为“中文”的代码如下:

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

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

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

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

四、语言切换

  窗口在初始化时候就导入了资源文件,在通过SetThreadUILanguage更换了线程语言后,窗口的资源并不会更改,必须要通过代码来重新装载资源。因为窗口中存在多种与线程语言相关的资源,重新启动软件一种叫快捷的更新语言环境的方法。

例:通过菜单来进行语言切换,切换语言后重启软件。

1、为程序添加中英文菜单选项ID_LANGUAGE_SWITCH:
中文菜单:

英文菜单:

并为该菜单添加消息响应函数:

其中,m_bRestartFlag使用判断关闭窗口时是否需要重启程序的标识。代码如下。

ON_COMMAND(ID_LANGUAGE_SWITCH, &CMultiLanguagesDlg::OnLanguageSwitch)void CMultiLanguagesDlg::OnLanguageSwitch()
{// TODO: Add your command handler code here// 读取当前线程的语言,并根据当前线程语言进行语言切换LCID lcidNew = GetThreadUILanguage();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函数中创建对话框之前设置线程语言,代码如下:

BOOL CMultiLanguagesApp::InitInstance()
{//SetThreadLocale(MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_NEUTRAL), SORT_DEFAULT));// 如果一个运行在 Windows XP 上的应用程序清单指定要// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,//则需要 InitCommonControlsEx()。否则,将无法创建窗口。INITCOMMONCONTROLSEX InitCtrls;InitCtrls.dwSize = sizeof(InitCtrls);// 将它设置为包括所有要在应用程序中使用的// 公共控件类。InitCtrls.dwICC = ICC_WIN95_CLASSES;InitCommonControlsEx(&InitCtrls);CWinApp::InitInstance();AfxEnableControlContainer();// 创建 shell 管理器,以防对话框包含// 任何 shell 树视图控件或 shell 列表视图控件。CShellManager *pShellManager = new CShellManager;// 标准初始化// 如果未使用这些功能并希望减小// 最终可执行文件的大小,则应移除下列// 不需要的特定初始化例程// 更改用于存储设置的注册表项// TODO: 应适当修改该字符串,// 例如修改为公司或组织名SetRegistryKey(_T("应用程序向导生成的本地应用程序"));// 判断你是否存在配置文件,如果存在,从配置文件中读取语言设置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();SetThreadUILanguage(lcidThread);}CMultiLanguagesDlg dlg;m_pMainWnd = &dlg;INT_PTR nResponse = dlg.DoModal();if (nResponse == IDOK){// TODO: 在此放置处理何时用//  “确定”来关闭对话框的代码}else if (nResponse == IDCANCEL){// TODO: 在此放置处理何时用//  “取消”来关闭对话框的代码}// 删除上面创建的 shell 管理器。if (pShellManager != NULL){delete pShellManager;}// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,//  而不是启动应用程序的消息泵。return FALSE;
}

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添加设置线程语言为中文和英文的代码,然后多次点击按钮进行测试。

中文版本弹出的提示框如下图所示:

英文版本弹出的提示框如下图所示:

六、MessageBox的问题

此处细心的朋友可能看出来,我们弹的床Messagebox窗口并没有随着系统改变,如图:

由于MessageBox中的按钮的语言是跟操作系统相关的,我们可以使用MessageBoxEx函数,代码如下:

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);LCID lcidNew = GetThreadUILanguage();MessageBoxEx(this->m_hWnd, strPrompt, L"Tips", MB_OKCANCEL | MB_ICONERROR, lcidNew);
}

中文如图:

英文如图:

七、相关函数和类型

与本地化相关的函数和类型如下:

GetSystemDefaultLCID
GetSystemDefaultLocaleName
GetUserDefaultLCID
GetUserDefaultLocaleName
SetThreadLocale
GetThreadLocale
MAKELCID
MAKELANGID
LCIDToLocalName
LocalNameToLCID
LANGIDFROMLCID
PRIMARYLANGID
LCID
LANGID
LANG_CHINESE 0x04
LANG_ENGLISH 0x09

C++如何实现系统语言切换功能,MessageBox的确认/取消按钮语言显示如何跟程序一致相关推荐

  1. android locale app内设置,Android app应用多语言切换功能实现

    本文实例为大家分享了Android app应用实现多语言切换功能,供大家参考,具体内容如下 1.添加多语言文件在不同的 value 文件夹下(例如 value .value-en.values-zh- ...

  2. Android实现app内的语言切换功能

    我在目前所在的公司负责一个app项目的维护,最近需要对这个项目进行国际化,适配10多个国家的语言,在实现国际化过程中,遇到了很多问题,最麻烦的就是翻译了,得一个个将翻译从excel复制到资源文件中,还 ...

  3. html怎么实现多语言图片切换,JavaScript实现--中英语言切换功能

    最近弄的项目是面向国际的,所以老总说要有语言切换功能.第一感觉好像不难吧 网上查了下,感觉实现方法就2种: 一:2个版本的HTML.至于怎么切换,方法也很多. 不过这种方法,除了笨,我实在不知道用什么 ...

  4. uni-app项目使用多语言切换功能

    1.下载安装(vue-i18n模块) npm install vue-i18n --save 2.如果项目中没有package.json文件,在根目录下新建package.json文件,并把以下代码加 ...

  5. api接口通达信系统怎样开发量化回测及K线的显示买卖点程序?

    api接口通达信系统怎样开发量化回测及K线的显示买卖点程序如下: import numpy as np; from matplotlib import pyplot as plt; (1)# 主要是能 ...

  6. Qt之Qml 国际化—实现简易语言切换功能

    目标:实现一个下拉框,具有切换语言的功能 GIF展示: 版本Qt5.14.2,版本不能低于5.10 qml控件 1.在QML文件中把需要翻译显示的文本用qsTr(" ")包裹起来 ...

  7. Android app应用多语言切换功能实现

    最近在做一个多语言切换的功能,类似于微信的语言切换,搜了下资料基本上都是以下这种: 1. 实现的效果 和微信类似,在设置界面打开切换语言的界面,选择语言后重启 HomeActivity,语言切换完成, ...

  8. vue 使用vue-i18n 国际化,语言切换功能

    最近项目中要使用到语言切换这一功能,遂百度一番,发现使用vue-i18n即可以实现项目国际化. 1. 首先安装vue-i18n npm install vue-i18n 2 在main.js里面引用 ...

  9. Android学习–Android app 语言切换功能

    功能: app用户根据自己的语言喜好,设置app语言.语言设置只针对本app,并在下次启动应用时保留前一次启动设置. 更新语言: public static void changeAppLanguag ...

最新文章

  1. adas--智能驾驶辅助系统
  2. python递归详解_Python理解递归的方法总结
  3. 剑网三通过VR来进行游戏快乐,是不是会加倍?什么时候用得上?
  4. 在河北当中学老师用不用考计算机,河北省教育厅出台新方案 师范生当教师也需考证...
  5. nlv sqlserver_SQLServer数据类型
  6. php新窗口打开链接,wordpress如何设置在新窗口打开链接
  7. Url有值怎么使用get传值
  8. C#4.0 可选参数和命名参数
  9. 2018年python工作好找吗-2018年Python发展前景如何?Python就业有哪些方向?
  10. codewars033: Duplicate Encoder 重复编码器
  11. varnish运行机制及管理优化
  12. centos6.6装mysql5.7_centos 6.5装mysql5.7
  13. java 反解析cron_Cron表达式解析
  14. 原生JavaScript使用和jQuery使用
  15. 测试用例设计方法————正交表法
  16. UPF和POWER Domain
  17. css 实现对话气泡
  18. Android常见公有方法(隐藏虚拟按键/隐藏软键盘/获取屏幕宽高等)
  19. stimulsoft入门教程:报表与页面上的图表(一)
  20. 即使不提供被告身份证信息,法院也必须受理立案

热门文章

  1. P6035CDN打印机 kyocera_京瓷ECOSYS P6035cdn驱动
  2. 【小邢随笔(2)】淄博烧烤,旅行的意义
  3. 原型工具axure7.0 正式版免费下载
  4. 十进制数转化为任意进制数n,采用变量N、数组A[]进行存储两种算法实例
  5. SAP最佳业务实践:FI-导言
  6. log4j实现发送邮件功能
  7. 这款开源的 Python 老照片修复工具火了
  8. 百度深陷点击欺诈纠纷 当事各方说法不一
  9. 【电路】驻极体麦克风前置放大电路
  10. php怎么设置浏览器提示错误,浏览器怎么显示php错误