在VC工程中添加多语言支持[转]

随着贸易国际化,在软件开发过程中,常会碰到需在现有中文版软件加入多语言支持的情况。由于不同语言版本间的差别通常仅是软件操作界面的不同,为实现多语言支持,使用纯资源DLL是一个不错的解决之道。所谓纯资源DLL是指只包含资源的DLL,譬如:快捷键、对话框、字符串、菜单、工具条、位图、图标、版本信息等等。

具体做法是:利用VC可视化编辑环境为每种语言制作一套资源ID一一对应的资源集并编译生成DLL文件。应用程序初始化时按预设的语言设置选择合适的资源DLL调入,使用资源时依据资源ID进行访问,这样即可实现软件的多语言支持。当然了,应用程序退出前,注意将动态调入的DLL文件占用的资源释放。

现有一个心电图查看程序,工程名为DispECG,语言为中文,现需加入英文支持。下面根据这个具体实例来说明在VC中加入多语言支持的具体实施方法。

(一)建立纯资源DLL

a)打开DispECG工程,在当前工作区中添加一个工程。方法:使用菜单File\New…

b)从弹出的对话框中选择“Projects”页面,选择“Win32 Dynamic-Link Library”,工程名设置为“DispECG_ENG”,DispECG工程的工作目录为D:\MyProject\DispECG,DispECG_ENG工程的工作目录为D:\MyProject\DispECG\DispECG_ENG。选择添加到当前工作区(注意Dependency of前的框不选),然后按OK。

c)建立一个简单的DLL工程

选择“A simple DLL project”,然后按“Finish”。此时新建的DispECG_ENG工程中会建立如下几个文件:DispECG_ENG.cpp,StdAfx.cpp,StdAfx.h以及ReadMe.txt。注意没有后缀为*.RC的资源文件。

其中DispECG_ENG.cpp中文件内容如下:

// DispECG_ENG.cpp : Defines the entry point for the DLL application.

//

#include "stdafx.h"

BOOL APIENTRY DllMain( HANDLE hModule,DWORD  ul_reason_for_call,

LPVOID lpReserved)

{

return TRUE;

}

(二)为DispECG_ENG加入资源并编辑

a)使用Windows资源管理器将DispECG工程下的resource.h和DispECG.rc拷贝到DispECG_ENG工程下,将DispECG工程下的res子目录拷贝到DispECG工程下;

b)使用Windows资源管理器将DispECG_ENG工程下的DispECG.rc改名为DispECG_ENG.rc,将DispECG_ENG\res下的DispECG.rc2改名为DispECG_ENG.rc2;

c)回到VC编辑环境。选择工作区中的文件视(FileView),选择“DispECG_ENG files”,单击右键,选择“Add Files to Project…”将DispECG_ENG工程下的resource.h和DispECG_ENG.rc加入到DispECG_ENG工程。

资源文件DispECG_ENG.rc及资源ID定义文件resource.h加入工程后:

d)修改编辑resource.h和DispECG_ENG.rc

d.1)将文件头的注释“Used by DispECG_ENG.rc”修改为“Used by DispECG_ENG.rc”

d.2)修改资源文件DispECG_ENG.rc,将

"#include ""res\\DispECG.rc2""  // non-Microsoft Visual C++ edited resources\r\n"

"#include ""l.chs\\afxres.rc""          // Standard components\r\n"

"#include "" l.chs\\afxprint.rc""        // printing/print preview resources\r\n"

修改为

"#include ""res\\DispECG_ENG.rc2""  // non-Microsoft Visual C++ edited resources\r\n"

"#include ""afxres.rc""          // Standard components\r\n"

"#include ""afxprint.rc""        // printing/print preview resources\r\n"

需要说明的是:MFC中含有一些预定义好的资源,不同的语言版本保存在不同的目录下,英文版保存在MFC\Include下,其它语言的版本则保存在Include的子目录中,譬如中文版对应的目录为l.chs,日文版对应l.jpn,韩文版对应l.kor,等等。

e)使用可视化编辑环境编辑对话框、菜单、字符串、版本等语言依赖性资源,将中文版翻译为英文版。当然,如果对资源文件的结构非常了解,可使用文本编辑器对资源文件直接编辑。方法是:使用“File\Open…”打开文件对化框,找到“DispECG_ENG.rc”,注意打开方式选择“Text”。

完成文本的翻译是一项费时耗力的体力活儿,请耐心地仔细地一一做完。

f)修改工程设置,调整编译后DLL文件的存放位置。

由于按照默认的工程设置,DispECG_ENG.DLL的Release版自动生成在D:\My Project\DispECG\DispECG_ENG\Release下,Debug版自动生成在D:\My Project\DispECG\DispECG_ENG\Debug下。为了程序的处理方便,资源DLL最好和应用程序的可执行文件存放在同一目录。为做到这一点,请修改工程配置。

方法:操作菜单“Project\Project Settings…”

在“Project Settings”中选择“DispECG_ENG”工程,再选择“Link”页面,将输出文件名由“Release/DispECG_ENG.dll”修改为“../Release/DispECG_ENG.dll”,这样编译后生成的DLL文件将保存在D:\My Project\DispECG\Release下。

调试版也作类似的修改,使得编译后生成的DLL文件将保存在D:\My Project\DispECG\Debug下。

g)编译DispECG_ENG工程,生成发行版和调试版的DispECG_ENG.DLL。

(三)在程序中添加多语言支持程序

a) 定义资源名称

在DispECG工程中的StdAfx.h中添加:

#define CHINESE          0

#define    ENGLISH              1

b)定义两个全局变量,一个表示当前的语言选择,另一个为资源句柄。

UINT nLanguage = ENGLISH;

HINSTANCE hResourceHandle = NULL;

c)添加资源DLL载入程序

在完成应用程序初始化的BOOL CDispECGApp::InitInstance()中添加依据语言选择资源DLL的程序代码。

nLanguage = GetProfileInt("SETTINGS","LANGUAGE",ENGLISH);

if (nLanguage != CHINESE)

{

CString strFile;

strFile = "NewDispECG_ENG.dll";

hResourceHandle = AfxLoadLibrary(strFile);

ASSERT(hResourceHandle);

if (hResourceHandle)

{

AfxSetResourceHandle(hResourceHandle);

}

else

{

CString strText;

strText.Format("%s not found!",strFile);

::MessageBox(NULL,strText,"Error",MB_OK|MB_ICONERROR);

return FALSE;

}

}

d)添加资源DLL卸载程序

CDispECGApp::~CDispECGApp()

{

if (hResourceHandle)

AfxFreeLibrary(hResourceHandle);

}

e) 添加语言选择菜单和命令实现代码。

同步更新各种版本的资源,编辑菜单加入语言选择菜单项。注意同一菜单项不同语言版本的命令ID保持一致。

使用类向导添加命令响应:

void CDispECGApp::OnSwitchVersion()

{

WriteProfileInt("SETTINGS","LANGUAGE",1-nLanguage);

AfxMessageBox(ID_SWITCH_VERSION);

TRACE("%s\n%s\n%d\n

%s\n",m_pszAppName,m_lpCmdLine,m_nCmdShow,m_pszExeName);

}

(四)修改程序代码,根据资源ID调用资源

如果原先的程序未考虑到多语言支持,在显示提示信息时可能使用如下的语句:

AfxMessageBox("文件无法打开!");

此时应该将诸如"文件无法打开!"此类的字符串添加到字符串资源中,其它语言版本同步更新。同样,注意字符串ID的彼此一致。一个好的习惯是,各版本的资源同步更新后,使用VC开发环境自带的WinDiff.exe对各个版本下的resource.h进行文件内容比较,以确保各语言的资源ID彼此完全一致。

修改完毕后,改用根据资源ID进行资源访问的函数。在实际编程中,最常用到的是对字符串资源的访问以及提示信息的显示,所以下面这些函数在需多语言支持的应用程序中会常被使用:

int AFXAPI AfxMessageBox( UINT nIDPrompt, UINT nType = MB_OK, UINT nIDHelp = (UINT) -1 );

BOOL LoadString( UINT nID );

void Format( UINT nFormatID, ... );

void FormatMessage( UINT nFormatID, ... );

...

至于其它资源,比如对话框、菜单等,通常由系统自动完成加载,无需程序员在软件中进行特别处理。

(五)编译调试

...

转自:http://blog.sina.com.cn/s/blog_470eccc601009uxl.html

时间: 2024-08-04 03:40:24

在VC工程中添加多语言支持[转]的相关文章

step4--->往工程中添加Spring框架---->修改maven的配置文件pom.xml,向工程中添加spring框架的某些模块

1.本文内容: 本文介绍使用maven向自己的项目中添加各种框架的方法,即如何配置maven的pom.xml来让maven帮助管理这些框架(包括Spring.SpringMVC.hibernate框架等等). 2.使用maven向自己的工程中添加框架: 2.1概述 若想使用maven向自己的工程中添加三方框架(如Spring.SpringMVC等),需要先确保你的工程是maven工程,如果你还不知道该如何在myeclipse中建立一个maven web project,请参考相关教程. 2.2使

step4----->往工程中添加Spring的子项目spring IO Platform------->通过maven添加相关框架(pom.xml)

添加Spring IO Platform的目的: 避免自己的project的外部依赖(external dependencies)之间产生版本冲突问题.更多详细信息参见:Spring IO Platform概述 具体操作步骤: step1,往自己的工程中添加Spring IO Platform 编写project的pom.xml,添加如下代码,引入Spring IO Platform <dependencyManagement> <dependencies> <depende

WPF - 为什么不能往Library的工程中添加WPF window

项目中添加一个Library 工程,但是却无法加入WPF window, WPF customize control. 调查了一下,发现这一切都由于Library工程中没有:ProjectTypeGuids <?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="

工程中添加工程依赖 Xcode iOS

有时我们需要在一个主工程中添加其他的子工程,用来对子工程进行编写修改或者是利用子工程中的库文件等等操作,这时候我们需要用到工程的嵌套. 步骤:(看图说话) 1.新建主工程,名为TestTTTT,新建一个static framework 工程,工程名为MyLibrary.把两个工程文件放到一个文件夹下,如下图: 2.在TestTTTT中执行下面操作:子工程左下角"+"里面执行Add file to 找到MYLibrary中的工程文件添加. 3.添加依赖: 4.添加路径 5.大功告成,现在

关于在工程中添加新文件时的LNK2019错误的一个解决办法

我这几天一直在研究Qt的串口程序,在读懂了官方给出的实例程序后我决定把其多线程的串口监视程序加入到我自己的工程中,便直接把问价复制到自己的工程下面,在Qt中加入到自己的工程中,但是总是出现LNK2019问题,问题提示是新添加的文件链接错误.我在网上找到一种解释: 在pro里 写 qt+=widgets 表示引入 QtWidget这个module,qmake会在帮你生成makefile的时候,设置好include path 和 lib path,在link时候设置好libs.而仅在源代码里 inc

体验 ASP.NET Core 中的多语言支持(Localization)

首先在 Startup 的 ConfigureServices 中添加 AddLocalization 与 AddViewLocalization 以及配置 RequestLocalizationOptions (这里假设使用英文与中文): public void ConfigureServices(IServiceCollection services) { services.AddLocalization(options => options.ResourcesPath = "Reso

OpenWRT中添加新设备支持

这里还是向OpenWRT中添加对小度路由的支持向 target/linux/ramips/image/makefile中写入新设备 image/build/profile/mt7620a_CLZ=$(call buildFirmware/Default8M/$(1),$(1),mt7620a_clz,MT7620a_CLZ) $(call image/Build/Profile/MT7620a_CLZ,$(1)) base-files中的一些可用配置: base-files/etc/diag.s

iOS在支持arc的工程中,导入不支持arc的第三方的插件

首先将插件导入到工程中,然后点击工程名,在targets下面找到相应的条目,然后选择build phares,打开第二行compile sourses,然后找到不支持arc的.m文件,在后边添加上"-fno-objc-arc"即可.

从XCode添加File的错误Multiple errors occurred while copying the files分析Cocos2d-x在XCode工程中添加文件

1.Multiple errors occurred while copying the files问题 关于这个问题,这里有解决办法 大致的意思是 1)添加文件没有全部添加,但是有部分添加成功,再次以文件夹添加之前的文件时会报这样的错误. 2)解决办法:先clean工程,点击上步需要添加文件的父目录,show  in  finder,删除之前添加的文件,重新添加. 这是一个解决办法,但是出现这样的问题还有另外一个原因: 勾选上了1的选项,导致出现上面的错误,直接去掉就可以了. 2.讲一讲Coc