企业网站建设项目计划书,成免费crm软件,怎么找回网站后台密码,深圳搬家公司哪家好文章目录前言 一、新建工程二、添加多国语言的资源三、程序语言设置四、语言切换五、字符串处理六、MessageBox的问题七、相关函数和类型参考文章前言 目前很多软件都是要出口到多个国家#xff0c;多个地区#xff0c;因此#xff0c;为软件提供多国语言支持就成为了一个基…
文章目录 前言 一、新建工程二、添加多国语言的资源三、程序语言设置四、语言切换五、字符串处理六、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, LTips, 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