MFC的多国语言界面的实现

本人在此说明,以下的方法我没用实现。不过我采用的是自己写代码方式来实现多国语言的支持


中文软件运行在英文系统下,程序支持unicode,但是仍出现乱码。
解决办法:
1.控制面板 ——> 区域和语言选项——>语言——> 附加的语言支持 ——> 将“为东亚语言安装文件” 选中,然后系统自动安装语言包,再次运行程序,显示正常。另:泰国、越南等需要将“复制文字和从右到左的语言安装文件(包括泰文)”选中。
2.程序内部设置区域

 使用SetThreadLocale函数设置运行区域:


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

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

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

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 here

          static 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

 

8. 相关函数和类型

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

 GetSystemDefaultLCID

GetSystemDefaultLocaleName

GetUserDefaultLCID

GetUserDefaultLocaleName

SetThreadLocale

GetThreadLocale

 

MAKELCID

MAKELANGID

LCIDToLocalName

LocalNameToLCID

LANGIDFROMLCID

PRIMARYLANGID

 

LCID

LANGID

LANG_CHINESE 0x04

LANG_ENGLISH 0x09



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MFC(Microsoft Foundation Class)多语言切换可以通过以下几种方法实现。 1. 使用资源文件:MFC支持使用不同的资源文件来存储不同语言的文本、图像等资源。首先,创建一个基本语言的资源文件(例如英文),然后创建其他语言的资源文件,并将其命名为相应的语言代码(例如中文为zh-CN)。接下来,在代码中通过加载对应的资源文件来实现语言切换。 2. 使用多语言库:使用第三方多语言库可以更方便地实现语言切换。这些库可以根据当前系统的语言设置自动加载对应的语言资源,并在界面上显示正确的文本。常见的多语言库包括GetText、Qt Linguist等。 3. 使用资源文件字符串表:在资源文件中创建一个字符串表,其中包含所有需要多语言切换的文本。然后,在代码中根据用户设置的语言代码来加载对应的字符串,并在界面上显示。 4. 动态加载语言资源:通过编写一段代码来动态加载语言资源,将对应语言的文本赋值给相应的控件,并刷新界面。这种方法需要提前准备好不同语言的文本资源,并通过代码控制切换。 无论使用哪种方法,都需要在代码中添加逻辑来切换语言,可以通过用户界面设置、系统语言设置或其他方式来确定使用哪种语言。在切换语言后,需要重新加载相应的语言资源,并刷新界面以显示新的语言。 ### 回答2: MFC语言切换的实现方法主要有以下几种: 1. 使用资源文件:在MFC应用程序中,可以将不同语言的文本信息存储在不同的资源文件中,然后通过加载不同的资源文件来实现语言切换。每个资源文件都对应一种语言,通过读取不同的资源文件,可以获取相应语言的文本信息,并将其显示在界面上。 2. 使用际化库:可以使用一些开源的际化库,如gettext等,来实现MFC应用程序的多语言切换。这些库提供了一些函数和接口,可以根据当前的语言设置,从对应的语言文件中获取文本信息,并将其显示在界面上。 3. 手动切换语言:可以在代码中手动实现语言切换的逻辑。通过在程序中定义一些全局变量来表示当前的语言设置,然后根据不同的语言设置,从相应的语言文件中获取对应的文本信息,并将其显示在界面上。当需要切换语言时,可以通过用户的操作或者设置来改变当前的语言设置。 无论使用何种方法,都需要在应用程序的各个界面和对话框中统一使用资源文件或者函数来获取文本信息,从而实现整个应用程序的多语言切换。同时,还需要注意对齐文本的布局和调整控件的大小,以适应不同语言的文本长度和字符宽度的差异。 ### 回答3: MFC(Microsoft Foundation Classes)多语言切换可以通过以下几个步骤实现: 1. 提前准备好多语言的资源文件:对于每一种语言,创建对应的字符串表和对话框资源文件,并为每个控件提供相应的文字和提示信息。 2. 在MFC应用程序的初始化过程中,根据用户所选语言加载对应的资源文件。可以通过读取系统的语言设置或者用户自定义选择来确定加载哪种语言的资源文件。 3. 在应用程序的实例化和初始化完成之后,在每一个窗口的初始化过程中,调用相应的函数来切换语言。例如,可以使用 AfxSetResourceHandle 函数来设置当前语言的资源句柄。 4. 在对话框或窗口类中重写虚函数 OnIniDialog 或 OnInitInstance,在函数中调用对应的语言切换函数,例如 SetWindowText 或 SetDlgItemText 来更新窗口中控件的文本。 5. 如果需要切换界面语言而不需要重启应用程序,可以在对话框的响应事件中或者菜单项的点击事件中调用相应的语言切换函数。例如,可以使用 SetWindowText 或 SetDlgItemText 来更新当前对话框中控件的文本。 6. 使用资源编辑器,为每个对话框和控件设置唯一的资源ID。然后,在代码中使用相应的ID来获取和设置对应的文本。可以通过调用 GetDlgItemText 或 SetDlgItemText 函数来实现。 通过以上步骤,我们可以在MFC应用程序中实现语言切换,让用户能够根据自己的需求选择使用不同的语言界面。这样可以提高用户体验,使应用程序更具际化和多元化特色。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值