`

MFC的多国语言界面的实现

 
阅读更多

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

其中,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));

 

注:在新的系统中上述代码可能不起作用,比如我的WIN7+VC2010系统中,设置语言应该使用如下代码
SetThreadUILanguage(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_CHINESE0x04

LANG_ENGLISH0x09

 

原文地址:http://www.cnblogs.com/xianyunhe/archive/2011/09/02/2163842.html

分享到:
评论

相关推荐

    MFC多国语言示例

    首先,MFC多国语言支持通常基于Windows的资源文件(.rc)和语言资源文件(.res)。资源文件包含了程序的各种非代码元素,如对话框、菜单和字符串等。语言资源文件则包含了不同语言的字符串翻译。在MFC中,我们可以...

    mfc 多国语言制作

    本主题将详细探讨如何在MFC应用中实现多国语言,特别是在不依赖动态语言库的情况下。 首先,我们了解MFC中的资源管理。在MFC中,资源如字符串、对话框、菜单等都是通过资源文件(.rc)来定义的。这些资源文件可以为...

    MFC多国语言实现方法

    总之,MFC多国语言实现涉及到资源文件的创建、编译、链接,以及运行时的资源加载和UI更新。理解这些基本概念和步骤,开发者就能够灵活地在Visual Studio 2008中构建支持多种语言的MFC应用程序。

    【MFC】多国语言工具栏.rar

    本资源“【MFC】多国语言工具栏.rar”似乎是一个关于如何在MFC应用中实现多国语言支持的教程或示例代码,特别是针对工具栏部分。 在MFC中实现多国语言通常涉及到以下几个关键知识点: 1. **资源文件(.rc)**:MFC...

    vc多国语言动态切换的一种实现

    在VC++编程环境中,实现多国语言动态切换是软件国际化(Internationalization)和本地化(Localization)的重要步骤,使得程序可以适应不同国家和地区用户的语言需求。本篇文章将深入探讨一种基于Stringtable的VC++...

    VC实现多国语言方案汇总

    本篇文章将详细介绍如何在VC++中实现多国语言支持,主要依据提供的"VC支持多国语言解决方案汇总.pdf"文档。 首先,我们需要理解“国际化”(Internationalization)和“本地化”(Localization)的概念。国际化是指...

    vc 多国语言 方法集锦

    总的来说,"vc 多国语言 方法集锦"可能涵盖了如何创建、管理和切换多语言资源,以及如何利用VC++和MFC的特性来实现国际化和本地化的全面指南。通过理解并应用这些知识点,开发者可以创建出能够跨越语言障碍,适应...

    C++(QT/MFC)多国语言库(VS2015++)

    本文将深入探讨C++中的多国语言库,特别是针对QT和MFC框架,并以"VS2015++"为开发环境。我们将分析标题和描述中提及的关键知识点,以及如何使用XLanguage库来实现这一目标。 首先,让我们了解一下QT框架。QT是一个...

    win32多国语言vc源码

    在Windows平台上进行软件开发时,实现多国语言支持是一个重要的考虑因素,特别是在全球化日益普及的今天。本资源“win32多国语言vc源码”提供了一个实例,展示了如何在Win32 API和ATL(Active Template Library)...

    创建多国语言中英文界面类,支持MFC各种资源字符串,不同语言配置不同的本地ini文件即可

    MFC(Microsoft Foundation Classes)库提供了一种机制来支持多国语言界面,而这个“创建多国语言中英文界面类”就是针对这一需求的一个解决方案。这个类利用了MFC的资源管理功能,通过配置不同的本地化ini文件,...

    VC多国语言版本编程源码各种方法以及动态链接库很多实例教程源码

    本教程源码集合提供了多种实现多国语言版本编程的方法,并包含丰富的动态链接库实例,帮助开发者深入理解相关技术。 一、多国语言版本编程 1. 资源文件(.rc):VC++通过资源文件来存储应用程序的各种界面元素,...

    语言国际化示例--INI及资源两种实现

    语言国际化,简称为i18n(取"internationalization"的第18个字母),是软件开发中的一个重要环节,使得软件能够适应不同地区的语言环境,为全球用户提供一致且符合当地习惯的界面。本文将深入探讨两种在Windows操作...

    多语言界面解决方法含源代码

    本教程将深入探讨如何在VC++中实现多语言界面,并提供相关的源代码示例。 首先,理解多语言界面的核心在于资源文件(.rc文件)和国际化(MFC的BCGControlBar库支持)。资源文件存储了应用程序的界面元素,如字符串...

    visual c++用VC纯资源DLL解决国际化问题_多国语言版i18n

    本篇文章将深入探讨如何利用VC++创建纯资源DLL来实现多国语言版本的应用程序。 首先,我们需要理解什么是DLL(动态链接库)。DLL是一种可执行文件,它包含可由多个程序同时使用的代码和数据。在i18n的背景下,我们...

    VC实现多国语言切换,状态栏编程,仪表设计,高性能网站建设

    在本文中,我们将深入探讨如何使用Visual C++(简称VC)来实现多国语言切换、状态栏编程、仪表设计以及高性能网站建设的相关知识点。这些技术对于开发具有全球化支持、用户友好的界面以及高效运行的Web应用至关重要...

    KQGLS090911.rar_多国语言处理_Visual_C++_

    在现代软件开发中,多国语言处理已经成为一个必不可少的功能,它使得应用程序能够适应全球化的用户需求,提供多种语言界面,提升用户体验。Visual C++作为Microsoft开发的一款强大的集成开发环境,提供了丰富的功能...

    Radmin自动登录器v3.0-多国语言绿色版-Release1-20150615

    用户选择某种外部语言便可以动态切换到新语言界面,无需重新启动程序,用户的语言选择将自动保存到RadminM.ini文件中,关闭程序后下次启动也会自动使用用户选择的新语言界面。 用户可以参照English.lng语言文件的...

    MFCDialog.zip

    在本文中,我们将深入探讨基于MFC Dialog的编程技术,以及如何实现各种增强功能,如多国语言支持、右键菜单、对话框背景图片、图片按钮特效、菜单栏添加、标题栏图标修改以及窗口最小化到系统托盘等。这些功能在实际...

    MultiLanguage VS2013

    描述中提到,这个实例是一个MFC多国语言切换的范例,这意味着它将展示如何设计和实现一个可以根据用户选择动态改变显示语言的界面。这通常涉及到资源文件的使用,尤其是字符串资源,因为它们是界面中需要翻译的部分...

    MultiLanguage_Source.rar(此版本为Unicode版本)

    在这个项目中,MFC被用来构建用户界面,并且与INI文件交互来实现多语言功能。 INI文件是一种简单的文本配置文件,通常用于存储应用程序的设置和配置数据。在这里,每个语言版本的信息可能被保存在一个独立的区段中...

Global site tag (gtag.js) - Google Analytics