您需要了解的关于 Locale 的所有知识






4.84/5 (15投票s)
关于区域设置的所有基础知识。
引言
很久以前,当我在微软 Windows 部门担任高级开发人员时,我被派往远东地区,协助发布 Windows 3.1 的远东版本。那是我第一次接触软件本地化——基本上是被扔进深水区,并被告知要学会游泳。在那里我了解到,本地化远不止是翻译。
注意:我们遇到过一个有趣的问题——臭名昭著的蓝屏死机 (Blue Screen of Death) 会将屏幕切换到文本模式。您无法在文本模式下显示亚洲语言。所以我们(这里说“我们”,其实是指我)想出了一个系统,我们将屏幕设置为 VGA 模式,并在分辨率下存储 BSoD 消息中使用的字符的 12pt 印刷体位图,然后以这种方式渲染。你们今天的孩子们太容易了 J。
快进到今天,对于我们读取或写入的每一个文件,正确设置区域设置都至关重要——如果区域设置不正确,您就会写入 12.345 而不是 12,345。
区域设置
好的,那么回到今天。什么是区域设置,您需要了解什么?区域设置基本上是程序运行的语言和国家/地区。(还可以为国家/地区添加变体,但这种情况极为罕见。)区域设置是这两种组合,但您可以任意组合这两部分。例如,一个在德国的西班牙国民会设置 es_DE,以便其用户界面是西班牙语 (es),但其国家/地区设置为德语 (DE)。不要根据语言推断位置,反之亦然。
区域设置的语言部分非常简单——这就是您希望在应用程序中显示文本的语言。如果用户是西班牙语使用者,您希望所有文本都以西班牙语显示。但哪个方言的西班牙语?西班牙和墨西哥的西班牙语差异很大(就像在美国我们拼写 color,而在英国是 colour)。因此,国家/地区可能会影响所使用的语言,具体取决于组合。
所有支持区域设置特定资源的语言(如今几乎所有语言都支持)都使用回退系统。它们首先查找 language_country 组合的资源。虽然 es_DE 可能从未被使用过,但经常有 es_MX 和 es_ES。因此,对于设置为 es_MX 的区域设置,它将首先查找 es_MX 资源。如果找不到,它将查找 es 资源。这是该语言的资源,但不特定于任何国家/地区。通常,这是从该语言中(经济上)最大的国家/地区复制的。如果找不到,它将转到“常规”资源,这几乎总是程序最初编写时的母语。
这种回退的理论是,您只需为更具体的资源定义不同的资源——这非常有用。但更重要的是,当 UI 的新部分被制作出来,并且您想发布测试版副本,或者您在所有内容翻译完成之前发布时,翻译过的部分会以本地化形式显示,而未翻译的部分仍然显示——但以英语显示。这会惹恼其他国家的用户,但确实能让他们更早地获得程序。(注意:我们使用 Sisulizer 来翻译我们的资源——一个好产品。)
第二部分是国家/地区。这主要用于数字和日期/时间设置。这涵盖了小数点和千位分隔符符号(美国是 12,345.67,俄罗斯是 12 345,67)到使用的日历。处理此问题的方法是使用运行时类,这些类可用于在与用户交互时对这些元素进行所有操作。存在用于解析用户输入值以及显示这些值的类。
在用户输入或显示给用户的值与内部存储为数据的值之间保持清晰的区别。数字是 XML 文件中的字符串,但在 XML 文件中,它将是“12345.67”(除非有人做了非常愚蠢的事情)。保持您的数据强类型,并且只在向用户显示或从用户解析文本时执行特定于区域设置的转换。以特定于区域设置的格式存储数据迟早会让你吃亏 或早。
中文
中文没有字母,而是有一套字形。中国人民共和国几十年前大幅修订了字形的绘制方式,这被称为简化。其他地方使用的中文字形沿用了原有的方式,这被称为繁体。它们是完全相同的字符集,但绘制方式不同。这就像我们既有印刷体 A,又有手写体 A——它们都表示同一含义,但绘制方式截然不同。
这更多是一个字体问题,而不是翻译问题,除了措辞和用法之间略有差异,部分原因是繁体中文和简体中文在方法上的差异。最终结果是,通常您需要两个中文语言资源,一个 zh_CN (PRC) 和一个 zh_TW (Taiwan)。至于哪个应该是 zh 资源——这是一个重大的地缘政治问题,您得自己解决(但请记住,PRC 有核武器——而您没有)。
带有替换值的字符串
所以您需要显示消息 Display ("The operation had the error: " + msg);
。不,不,不!因为在另一种语言中,正确的用法可能是 Display("The error: " + msg + " was caused by the operation");
。每个现代运行时库都有一个构造,您可以在其中有一个字符串资源“The operation had the error: {0}”,然后将您的 msg
替换到 {0} 中。(有些使用的语法不是 {0}, {1}, ...)
您将这些字符串存储在可以本地化的资源文件中。然后,当您需要显示消息时,将其从资源中加载,替换变量,然后显示。这种方法,加上数字和日期/时间格式化程序,可以轻松构建这些字符串。一旦您习惯了它们,您会发现它们比旧方法更容易。(如果您使用的是 Visual Studio - 下载并安装 ResourceRefactoringTool,这会让这项工作变得微不足道。)
阿拉伯语、希伯来语和复杂脚本
阿拉伯语和希伯来语被称为双向文本,因为其中一部分是从右到左,而另一部分是从左到右。阿拉伯语/希伯来语文本是从右到左书写和阅读的。但当您遇到拉丁文本或数字时,您会跳转到最左边,从左到右阅读,然后跳回到起点,再从右到左阅读。然后是标点符号和其他非字母字符,其规则取决于它们的使用位置。
底线是——这非常复杂,您不可能在不将此作为全职工作的情况下学会它。但不用担心,大多数语言的运行时库都有处理此问题的类。关键在于,一行文本是按照您阅读字符的顺序存储的。所以在计算机内存中,它是按您阅读(而不是显示)字符的顺序从左到右排列的。这样,除显示文本和确定移动光标外,一切都正常工作。
像印度语系这样的复杂脚本有不同的问题。虽然它们是从左到右阅读的,但有时会出现某些字母组合堆叠在另一个字母之上,这样当添加第二个字母时,屏幕上的宽度不会增加。这通常需要小心处理光标移动,但除此之外没什么特别的。
甚至在英语中也有类似的情况,ae 有时会被渲染成一个单独的字符 æ。(当人类发明语言时,他们并没有考虑计算机的友好性。)
不要过度强调
听起来很多,但实际上很简单。在大多数情况下,您需要根据您拥有的最接近的资源来显示文本。并且您要为所有区域设置(包括您的母语)使用数字和日期/时间类。无论您住在哪里,大多数计算机用户都在另一个国家讲着另一种语言——因此,良好的本地化可以显著扩大您的潜在市场。
如果您是一家小公司,可以考虑为翻译您产品的人提供免费副本。当我创建 Page 2 Stage 时,我提供了一个免费副本(标价 79.95 美元)用于翻译——我获得了 28 个翻译。在此过程中,我还认识了一些非常 nice 的在线朋友。对于企业级产品,其他国家的 VAR(增值经销商)通常会以较低的价格为您翻译,如果他们看到良好的市场潜力,甚至免费翻译。但在这些情况下,请先在内部进行第一次翻译,以解决问题。
我发现一个非常有用的资源是 Microsoft Language Portal,您可以将英文文本输入其中,如果该文本出现在任何 Microsoft 产品中,它将为您提供 Microsoft 为特定语言使用的翻译。在许多情况下,这可以为您提供高达 80% 的程序程序的快速高质量翻译。
Удачи! (祝你好运!)