vc 国际化的资源文件处理
MS Windows操作系统是一个世界上广泛使用的操作系统,对于不同语种的国家MS Windows有相应语种的版本。在不同语种的Windows平台上应该运行相应语种的应用程序。也就是说程序的用户界面(如菜单、对话框、状态条)中的提示文字应该使用和Windows操作系统所使用的语种一致。当然英语用户界面的程序可以运行在其它语言平台上,但比较复杂的程序或多或少都有问题,如对话框的尺寸不对,特殊的ASCII字符显示为文字,输入字符串可能会导致死机等。如果不一致却还想使用,则需要动态翻译软件。例如,在英文Windows平台上运行中文版的MS Office就需要像中文之星或四通利方这样的中文动态翻译软件。
当前国内使用的MS Windows在语种上划分主要有简体中文版和英文版两种。为了让开发的软件能在这两种平台上使用,提出了三种解决方案:第一种解决方案是仅编写中文界面的程序。在中文Windows上程序可以运行(这里的运行是指程序界面不出现乱码),在英文Windows上依靠中文之星或四通利方这样的中文动态翻译软件也可以运行。第二种解决方案是针对中文版和英文版各编一个程序,即在第一种方案的基础上增加了英文版,这样做有两点好处:一是英文Windows平台上运行英文版的软件比英文Windows平台上运行中文版的软件稳定,因为没有像中文之星或四通利方这样的中文动态翻译软件的参与。第三种解决方案是自动根据操作系统的语种选择相应的界面语种。也就是说,同一个软件在中文Windows上显示中文界面,在英文Windows上显示英文界面。这种方案相对于第二种方案的好处在于:程序不用做英文版和中文版两个版本,只要一个版本就可以了,对于用户来说是很方便的。在这三种方案中,前一种是后一种的基础,后一种实现了,前一种也就已经实现了。下面将从易到难介绍三种方案实现的步骤和要点。
解决方案一、自动生成中文界面框架
Visual C++6.0版本中可以使用APPWIZARD自动生成具有基本中文界面的WIN32应用程序。使用APPWIZARD时,在自动生成的第一个步骤中,将资源类型选择为简体中文就可以了,可参见图1。其余选项都不涉及语种问题,根据应用程序的具体情况进行选择即可。然后在此基础上作进一步的软件开发工作。
如果你在一边读文章一边上机实际操作,可能会发现一个问题:不论你怎样设定VisualC++5.0的安装程序的选项,资源类型仅会支持英语、德语、法语、西班牙语和意大利语这五种语言。于是你可能会怀疑你所用的Visual C++5.0版本有问题。实际上并不是Visual C++5.0版本有问题,而是需要从安装盘上手工拷贝一些文件。所需文件在Visual Studio97软件包的第三张包含Visual C++5.0的光盘上。在目录DEVSTUDIO/SHAREDIDE/BIN/IDE下有几个以APPWZ开头的动态链接库(扩展名为dll的文件)。在这些动态链接库中,一个动态链接库提供对一种语言的支持。其中的APPWZCHS.DLL就是支持简体中文的文件。将其拷贝到安装Visual C++5.0的硬盘上相同名字的目录下即可。重新开始自动生成步骤,在自动生成的第一个步骤中,在资源类型选择中将出现简体中文支持。
解决方案二、支持多种语言
没有必要从头开发一个英文版。事实上,在现有中文版的基础上生成英文版并不复杂。工作量在于修改资源,程序的代码不用改变。
图2左边的ResourceView窗口中,同时存在着中英文两种资源,在中文资源的后面标注有“Chinese(P.R.C.)”以示区别。为了保证程序代码不变,相同界面元素的两种语言版本下的标识符必须相同。例如,产品介绍对话框的英文资源的标识符为IDD_ABOUTBOX,中文资源的标识符也应该是IDD_ABOUTBOX。可以用COPY操作对资源进行复制,然后修改语种再修改标识符。 (在资源中用InsertCopy COPY一份资源)
ResourceView提供的管理功能并不全面,还需要直接编辑资源文件RESOURCE.RC来完成全部任务。经过对RESOURCE.RC文件的研究,发现文件中使用编译控制开关来实现多语言支持。 ......
//////////////////////////////////////////////////////////////////////////
// Chinese (P.R.C.) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
#ifdef _WIN32
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#pragma code_page(936)
#endif //_WIN32
//////////////////////////////////////////////////////////////////////////
// Dialog
......
/////////////////////////////////////////////////////////////////////////
// Menu
......
//////////////////////////////////////////////////////////////////////////
// Icon
......
//////////////////////////////////////////////////////////////////////////
// Bitmap
......
//////////////////////////////////////////////////////////////////////////
// Toolbar
......
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
// TEXTINCLUDE
1 TEXTINCLUDE DISCARDABLE
BEGIN
"resource.h/0"
END
2 TEXTINCLUDE DISCARDABLE
BEGIN
"#include ""afxres.h""/r/n"
"/0"
END
3 TEXTINCLUDE DISCARDABLE
BEGIN
"#define _AFX_NO_SPLITTER_RESOURCES/r/n"
"#define _AFX_NO_PROPERTY_RESOURCES/r/n"
"/r/n"
"#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)/r/n"
"#ifdef _WIN32/r/n"
"LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED/r/n"
"#pragma code_page(936)/r/n"
"#endif/r/n"
"#include ""res//sample.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 ""l.chs//afxolecl.rc"" // OLE container resources/r/n"
"#include ""l.chs//afxolesv.rc"" // OLE server resources/r/n"
"#endif/0"
END
#endif // APSTUDIO_INVOKED
......
#endif // Chinese (P.R.C.) resources
/////////////////////////////////////////////////////////////////////////////
// English (U.S.) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#endif //_WIN32
//////////////////////////////////////////////////////////////////////////
// Dialog
......
/////////////////////////////////////////////////////////////////////////
// Menu
......
//////////////////////////////////////////////////////////////////////////
// Icon
......
//////////////////////////////////////////////////////////////////////////
// Bitmap
......
//////////////////////////////////////////////////////////////////////////
// Toolbar
......
/////////////////////////////////////////////////////////////////////////////
// TEXTINCLUDE
1 TEXTINCLUDE DISCARDABLE
BEGIN
"resource.h/0"
END
2 TEXTINCLUDE DISCARDABLE
BEGIN
"#include ""afxres.h""/r/n"
"/0"
END
3 TEXTINCLUDE DISCARDABLE
BEGIN
"#define _AFX_NO_SPLITTER_RESOURCES/r/n"
"#define _AFX_NO_PROPERTY_RESOURCES/r/n"
"/r/n"
"#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)/r/n"
"#ifdef _WIN32/r/n"
"LANGUAGE 9, 1/r/n"
"#pragma code_page(1252)/r/n"
"#endif/r/n"
"#include ""res//sample.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"
"#include ""afxolecl.rc"" // OLE container resources/r/n"
"#include ""afxolesv.rc"" // OLE server resources/r/n"
"#endif/0"
END
#endif // APSTUDIO_INVOKED
......
#endif // English (U.S.) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
// Generated from the TEXTINCLUDE 3 resource.
#define _AFX_NO_SPLITTER_RESOURCES
#define _AFX_NO_PROPERTY_RESOURCES
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
#ifdef _WIN32
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#pragma code_page(936)
#endif
#include "res/sample.rc2" // non-Microsoft Visual C++ edited resources
#include "l.chs/afxres.rc" // Standard components
#include "l.chs/afxprint.rc" // printing/print preview resources
#include "l.chs/afxolecl.rc" // OLE container resources
#include "l.chs/afxolesv.rc" // OLE server resources
#endif
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#endif
#include "res/sample.rc2" // non-Microsoft Visual C++ edited resources
#include "afxres.rc" // Standard components
#include "afxprint.rc" // printing/print preview resources
#include "afxolecl.rc" // OLE container resources
#include "afxolesv.rc" // OLE server resources
#endif
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED
以上代码中在 #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)宏定义后面为中文资源,在#if !defined(AFX_RESOURCE_DLL)|| defined(AFX_TARG_ENU)宏定义后面为英文资源。应该保证中英文资源中都有TEXTINCLUDE段和#ifndef APSTUDIO_INVOKED段。 这样MFC(Microsoft Fundermental Class)缺省资源才会被包含。 对于中文资源来讲,这些额外资源的路径应加上l.chs目录名。
在编译生成可执行文件时,如果生成中文版本,则在Project Settings对话框中应按图3所示进行设置:在Preprocessor definitions编辑框中加入AFX_TARG_CHS和AFX_RESOURCE_DLL的定义,并且Language选择框中应选择Chinese(P.R.C.)。如果生成英文版本,则在Project Settings对话框中应设置如下:在Preprocessor definitions编辑框中加入AFX_TARG_ENU和AFX_RESOURCE_DLL的定义,并且Language选择框中应选择English(United States)。
其中AFX_TARG_CHS与936定义了资源文件的简体中文属性。
英文属性中为AFX_TARG_ENU与1252,
日文属性中为AFX_TARG_JPN与932,
繁体中文属性中为AFX_TARG_CHT与950。
翻译时必须改成相应的语言属性。
注意下面两句也应改动:
#include "l.chs//afxres.rc" // Standard components
#include "l.chs//afxprint.rc" // printing/print preview resources
英文为:
#include "afxres.rc" // Standard components
#include "afxprint.rc" // printing/print preview resources
日文为:
#include "l.jpn//afxres.rc" // Standard components
#include "l.jpn//afxprint.rc" // printing/print preview resources
繁体中文为:
#include "l.cht//afxres.rc" // Standard components
#include "l.cht//afxprint.rc" // printing/print preview resources
还有一点需要注意,就是所有在代码中显示的文字串都应存储在资源文件中,而不应该在程序中使用硬编码。例如,以下代码就是硬编码:
......
MessageBox(_T("文件没有找到!"),_T("错误")) ;
......
这种提示仅限于Windows简体中文版,而在没有像中文之星、四通利方等翻译软件的Windows英文版平台上显示的将是一堆乱码。正确的方法应该是:
......
Cstring string1, string2 ;
string1.LoadString(IDS_FILE_NOT_FIND) ;
string2.LoadString(IDS_ERROR) ;
MessageBox(string1, string2) ;
......
在中文资源中,IDS_FILE_NOT_FIND对应“文件没有找到!”字符串,IDS_ERROR对应“错误”字符串;在英文资源中IDS_FILE_NOT_FIND对应“File not found! ”字符串,IDS_ERROR对应“Error”字符串。
三、不同语种平台的自动选择
实现这项功能的思路是使用纯资源DLL,把应用程序中的资源都放在纯资源DLL中。这种DLL仅含有资源而没有可执行代码,也就是源文件中仅包含RC资源文件。应用程序中中文和英文资源可放在不同的DLL中。例如,中文资源DLL名为CHINESE.DLL,它放置中文资源;英文资源DLL名为ENGLISH.DLL,它放置英文资源。程序启动时根据Windows平台语种的类型,加载相应的DLL。以后资源就会从对应的DLL中读取,从而能保证使用正确的资源.。
为了实现这项功能,需要在应用程序类中加入一个变量以存储资源DLL的句柄并重载应用程序类中的InitInstance和ExitInstance函数。
在应用程序类声明中加入代码如下:
......
protected:
HINSTANCE m_hLangDLL ;
......
在InitInstance函数开始处加入代码如下:
// Get the primary language identifier
WORD wLangPID = PRIMARYLANGID(::GetSystemDefaultLangID()) ;
// Load the language resource DLL
switch( wLangPID )
{
case LANG_ENGLISH:
m_hLangDLL = ::LoadLibrary("english.dll") ;
break ;
case LANG_CHINESE:
m_hLangDLL = ::LoadLibrary("chinese.dll") ;
break ;
}
if( !m_hLangDLL)
{
AfxMessageBox(_T("Unable to load resource DLL!")) ;
return FALSE ;
}
// Tell the application what module contains our resource
AfxSetResourceHandle(m_hLangDLL) ;
......
在ExitInstance函数开始处加入代码如下:
// Free language resource library
if(m_hLangDLL)
{
FreeLibrary(m_hLangDLL) ;
}
......
操作系统所使用的语言由WIN32函数GetSystemDefaultLangID取得。宏PRIMARYLANGID又取出主语言标识符进行判断,选择应该调用的DLL。DLL的加载由WIN32函数LoadLibrary实现。程序中所使用的资源库由AfxSetResourceHandle函数指定。程序退出时用WIN32函数FreeLibrary卸载。
还有,在编译资源DLL时别忘了在连接时加上/NOENTRY选项以告诉连接器这是一个唯一资源的DLL,不包含程序执行的入口点。
vc 国际化的资源文件处理的更多相关文章
- struts2国际化---配置国际化全局资源文件并输出国际化资源信息
我们首先学习怎么配置国际化全局资源文件.并输出资源文件信息 1.首先struts2项目搭建完毕后,我们在src文件夹下.即struts2.xml同级文件夹下创建资源文件.资源文件的名称格式为: XXX ...
- VC释放EXE资源文件
原文地址:http://blog.csdn.net/wangningyu/article/details/4378378 今天有个朋友问到VC能否释放多个EXE.DLL或WAV等文件,我便做了个实例给 ...
- asp.net core 之多语言国际化自定义资源文件
先说说 asp.net core 默认的多语言和国际化. 官方文档 一:基本使用方法 先要安装 包 Microsoft.AspNetCore.Mvc.Localization (依赖 Microsof ...
- [转] 解析Qt资源文件使用
解析Qt资源文件使用 转自:http://mobile.51cto.com/symbian-270121.htm 本文详细的介绍了Qt文件的使用,和大部分GUI框架设计工具一样,Qt也引入了资源文件系 ...
- 【Java EE 学习 35 上】【strus2】【类型转换器】【struts2和Servlet API解耦】【国际化问题】【资源文件乱码问题已经解决】
一.类型转换器 1.在动作类action中,声明和表单中name属性的值同名的属性,提供get和set方法,struts2就可以通过反射机制,从页面中获取对应的内容 package com.kdyzm ...
- [原创]java WEB学习笔记69:Struts2 学习之路-- 消息处理与国际化,概述,配置国际资源文件,访问国际化消息,通过超链接切换语言
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- 在VC资源文件中加入声音资源
本文介绍如何在VC资源文件中加入自己的声音资源,使自己的应用程序可以播放声音. 1.首先用文本编辑器(如记事本)打开资源文件(.rc文件) 在最后加入自己的声音资源,如下IDW WAVE " ...
- Springboot 使用 JSR 303 对 Controller 控制层校验及 Service 服务层 AOP 校验,使用消息资源文件对消息国际化
导包和配置 导入 JSR 303 的包.hibernate valid 的包 <dependency> <groupId>org.hibernate.validator< ...
- c#使用资源文件完成国际化
路径结构如下 namespace UnitTestProject1 { [TestClass] public class UnitTest1 { [TestMethod] public void Te ...
随机推荐
- gdb篇
转自:http://www.cnblogs.com/ypchenry/p/3668572.html 1.gdb的原理 熟悉linux的同学面试官会问你用过gdb么?那好用过,知道gdb是怎么工作的么? ...
- objective-C学习笔记(十)协议
协议 Protocol 协议是类的合同约定,只描述外部接口,不提供具体实现.所以,协议其实可以写在类的.h文件中,不去实现就可以了. 协议可以包含以下成员: 属性 (编译器不会和普通interface ...
- 不直接用NSLog
公司中不直接使用NSLog,而是利用宏定义自己的打印函数,将该打印函数写在项目的.pch文件中.调试的时候往往用到好多打印,但发布的时候确不需要.(一下是在公司中的一些处理) 自定义NSLog 一,固 ...
- 空类的默认函数—— SAP电面(2)/FEI
定义一个空类 class Empty { }; 默认会生成以下几个函数 2. 拷贝构造函数 Empty(const Empty& copy) { } 3. 赋值运算符 Empty& o ...
- IOS 取值控件(UIPicker)的使用方法
1.简单地取值控件示例 我们要做的一个UITextFiled,当点击UITextFiled,出现一个UIPick取值的页面,可以选择性别,在viewDidLoad中写下 //sexPicker UIP ...
- 编写EL函数
1.建立java类的静态函数 package chapter4; public class ELFun { public static String processStr(String s){ s = ...
- 转: angularjs学习总结(~~很详细的教程)
1 前言 前端技术的发展是如此之快,各种优秀技术.优秀框架的出现简直让人目不暇接,紧跟时代潮流,学习掌握新知识自然是不敢怠慢. AngularJS是google在维护,其在国外已经十分火热,可是国内的 ...
- Baby Step Gaint Step
给定同余式,求它在内的所有解,其中总是素数. 分析:解本同余式的步骤如下 (1)求模的一个原根 (2)利用Baby Step Giant Step求出一个,使得,因为为素数,所以有唯一解. (3)设, ...
- 关于SpringMVC中找不到<mvc:resources/>标签的解决办法
在springMVC中我们经常会用到<mvc:resources/>标签,但是有些编辑器中的schema过于陈旧.导致找不到<mvc:resources/>标签. 经过试验,有 ...
- C语言数据结构----双向链表
概括:主要说明双向链表的基本概念和具体操作以及源代码. 一.基本概念 1.有了单链表以后我们可以把内存中小块的空间联系在一起,并且把每一个小块都存储上我们想要存储的数值.但是单链表只有一个next,我 ...