现在的位置: 首页 > 综合 > 正文

关于软件地域化(Localization)中的一些问题(zz)

2013年08月21日 ⁄ 综合 ⁄ 共 2915字 ⁄ 字号 评论关闭

//zz from http://xiaogi.nease.net/article/translate.htm

随着中国经济势力的不断增强,对外开放的逐渐加深,
中国软件业正面临着前所未有的挑战和机遇,要想在这
次挑战中把握机遇,中国的软件必须走出国门,接受世
界的检验,同时国际软件必须引进国门,以刺激并激励
我国软件业的发展。在这个过程当中,软件地域化是个
颇为关键的环节,因此也越来越引起人们的注意。

笔者曾经用很长一段时间参与将NEC的一个商用软件JMSS
翻译成英文,做过软件地域化方面的工作,因此很想就
这个问题与大家共同商榷。

不过软件地域化范围大了一点,它的含义比仅仅翻译菜单
和对话框的文本或字符串要多得多,它还包括使软件的位
图,图标,甚至加速键符合当地的风俗习惯。这远远超出
了我的能力范围,因此今天我只想谈点简单的东西--如何
翻译VC++软件中的资源文件。

在VC编程中最先碰到的语言问题是当我们选择新建一个MFC
AppWizard程序时,VC将询问我们选择何种的语系。如果
我们需要生成支持双字节的软件的话,必须使用支持远东
语系的DLL。这些DLL在缺省安装时并没有安装,需要你自
己手动安装。这些文件在VisualC++光盘的/Bin/IDE目录
中,具体如下所述:

日语 appwzjpn.dll
简体中文 appwzchs.dll
台湾中文 appwzcht.dll

如果你想在你的软件中支持中文,你必须把上面的
appwzchs.dll复制到你安装Vusial C++的目录下的/Bin/IDE
目录下,然后选择中文的AppWizard。否则,即使在中文环
境下,你的软件也不能支持中文。

那么,选择中文的AppWizard会有哪些变化呢?有兴趣的朋友
可以在文本状态下打开资源文件(*.rc),你会发现其中有这么
两段代码:

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
#ifdef _WIN32
LANGUAGE 4, 2
#pragma code_page(936)
#endif //_WIN32

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
#ifdef _WIN32
LANGUAGE 4, 2
#pragma code_page(936)
#endif //_WIN32
#include "res//New.rc2" // non-Microsoft Visual C++ edited resources
#include "l.chs//afxres.rc" // Standard components
#include "l.chs//afxprint.rc" // printing/print preview resources
#endif

其中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

有些朋友从网上下载了一些原代码,但发现即使将菜单,字符串等
翻译成中文也不能正确显示,就是由于没有改这些语言属性。另外,
直接在文本状态下改资源文件比类似一个对话框接一个对话框的改
Chinese(P.R.C.)要省事许多。

BTW,要把中文Help文件变成英文也可以在文本状态下打开*.hpj文
件,然后将Chinese (P.R.C.)改成English (U.S.)。

改完语言属性之后,再去改菜单及字符串就不会有问题了(当然
还要小心诸如双字节的%或╲等字符的正确翻译)。

上面讲的是在能得到资源文件原代码的前提下讲翻译工作,
那么要是没有原代码怎么办呢?其实没有原代码翻译软件在
Windows下并不是一件不可能的事。当然,这要归功与Windows
设计人员高超的思想。

大家知道,VC++编译程序时将资源文件单独编译成*.res文件,
然后再与其他的目标文件连接成可执行文件。这就使我们可以
通过某种工具将可执行文件中的资源单独提取出来。例如,
VC++中的资源编译器,就可完成这个工作,不过必须是在
Windows NT下,在Window 9x中只能编辑,不能保存。

有兴趣的朋友可以利用VC++打开一个exe文件,但注意在Open
对话框中的Open As组合框中选Resources,而不要选Auto,
这样打开之后,你会发现出现的即为该可执行文件的所有资源,
包括菜单,对话框,及字符串等。不过这时翻译时的语言属性问
题不能在文本状态下改了,只能一个一个地改。你可以在相应的
资源ID上单击右键,然后在跳出的上下文菜单中选属性,接着在
属性页中修改Language。

有朋友可能会注意到,如果一个应用程序将它的所有字符串都放
在String Table中的话,通过这种方法就可以将该软件彻底翻译
成另一种语言了,于是便会情不自禁地感叹:怪不得weizhenjiang
经常教导我们要将所有的字符串放入String Table,原来如此。:-)

从上面所述看来,一个软件要利于地域化的话,最好将所有的资源
均放入*.rc,但我觉得,其实最好的方法是将资源单独作成一个dll
文件(如resource.dll),然后在程序运行时通过如下方法载入资源:
m_hRC = AfxLoadLibrary(_T("resource.dll"));
/*remember to free resource library at exiting,
such as:
if(m_hRC)
AfxFreeLibrary(m_hRC);*/
if(m_hRC)
AfxSetResourceHandle(m_hRC);
这样你就可以象利用可执行体自身的资源一样地利用所有resource.dll
中包含的资源了。

这种方法的好处是显而易见的,以后将该软件地域化时,只需改动
resource.dll就可以了,很省事。一个真正优秀的软件就应该做长
远打算。

以上只是我对软件地域化或者说软件翻译当中的一些问题的一些
粗陋看法,肯定有欠妥之处,我很希望朋友们指正。

抱歉!评论已关闭.