编写国际化代码时的一般考虑

无论使用 Visual Basic 或是其它工具,开发将要本地化的应用程序时,都必须估计到语言间的差异。指明需要本地化的字符串,允许字符串变长,避免字符串接在一起。

硬编码的可本地化字符串

“设计国际化软件”中的本地化模型介绍了数据块和代码块的概念。在创建包含所有本地化字符串的资源文件时,应特别注意只提取需要本地化的字符串。对那些部分或全部都不需本地化的字符串可以是硬编码的。相反的,应该确保所有需要本地化的资源都放到了资源文件中。

缓冲区大小

在根据字符串或词的长度声明缓冲区大小时,应确保缓冲区可以适应更长的词和字符串。关于翻译字符串的平均增长率,请参阅“设计区域识别的用户界面”。在 Visual Basic 代码中声明的缓冲区必须适应这种增长。

例如,Visual Basic 为“确定”这个词声明一个 2 字节的缓冲区,但实际上西班牙语中,该词译作“Aceptar”,这将引起程序溢出。双字节字符也要考虑这些相同的问题。关于 DBCS 的详细信息,请参阅本章后面的“双字节字符集 (DBCS) 的特殊问题”一节。

字符串联接

可以通过字符串联接来缩短串的长度。该方法允许把一个资源分解到几个字符串中。但是这样做有一定的危险,请注意以下的示例:

英语 法语
字符串 1: one after the other 字符串 1: un après l'autre
字符串 2: The controls will be deleted. 字符串 2: Les contr鬺es seront supprim閟.
字符串 3: The forms will be deleted. 字符串 3: Les feuilles seront supprimées.

单独看,字符串 1、2、3 很容易本地化。代码执行字符串 2 + 字符串 1 或字符串 3 + 字符串 1 的合并操作,结果的英语含义很正确。但本地化字符串的结果却可能是错误的。比如在法语中,字符串 3 + 字符串 1 是错误的,因为在法语语法中窗体 (feuilles) 是阴性词,因此字符串 1 应变为“une après l'autre”而不是“un après l'autre”。类似的情况在其它许多外语中都有。因此只有把字符串 2 和 字符串 1 及字符串 3 和 字符串 1 合在一起保存在资源文件中才是避免此类错误发生的唯一办法。

在上述示例中,组成句子的词序对英语和法语都是一样的。但通常对这两种语言或其它许多外语,词序并不总是相同的(例如,德语和日语总是把动词放在句尾)。以下示例列举了这种情况:

英语 法语
字符串 1:DLL 字符串 1:DLL
字符串 2:Missing Data Access 字符串 2:Accès aux données manquante
字符串 3:Missing OLE 字符串 3:OLE manquante

当代码执行字符串 1 + 字符串 2 的操作时,本地化版本将出现错误因为两个字符串组成的信息构不成一个句子。一个解决方法是把字符串 1 分别与字符串 2 和字符串 3 组合保存在资源文件中并去掉字符串 1。

以下是另一种解决方法:

英语 法语
字符串 2:Missing Data Access '|1' 字符串 2:'|1' d'accès aux données manquant
字符串 3:Missing OLE '|1' 字符串 3:'|1' OLE manquant

此时,本地化版本可以识别占位符 '|1' 并在资源文件中进行必要的调整以构成本地化语言的句子。

最后一点特别要注意的是在英语中相同的词或句在本地化时可能要翻译为不同的词或句。请注意以下的示例:

英语 法语
字符串 1:Setup program 字符串 1:Programme d'installation
字符串 2:String1 did not complete successfully。 字符串 2:String1 a échoué。

在英语版中,字符串 1 可以作为安装程序标志,也可以在字符串 2 中作为错误信息的一部分。在法语版中,字符串 1 作为单独的标志是合适的,但要变成“Le programme d'installation”才能作为字符串 2 的一部分。