Internationalization 为全球应用程序设计国际翻译/语言适配器

Internationalization 为全球应用程序设计国际翻译/语言适配器,internationalization,translation,globalization,Internationalization,Translation,Globalization,我将为Node.js(服务器端Javascript)实现此功能,但这个问题是关于如何解决此问题的一般方法 有许多平台支持国际应用的翻译 例如,其工作原理如下: printf($translate->_("Today is the %1\$s") . "\n", date("d.m.Y")); Android的系统对每种语言都使用一个strings.xml文件,其工作原理与Zend的相同 这些适用于大多数西方语言。然而,许多非西方语言需要不同的语序,甚至从右到左而不是从左到右阅读 因此,上

我将为Node.js(服务器端Javascript)实现此功能,但这个问题是关于如何解决此问题的一般方法

有许多平台支持国际应用的翻译

例如,其工作原理如下:

printf($translate->_("Today is the %1\$s") . "\n", date("d.m.Y"));
Android的系统对每种语言都使用一个strings.xml文件,其工作原理与Zend的相同

这些适用于大多数西方语言。然而,许多非西方语言需要不同的语序,甚至从右到左而不是从左到右阅读

因此,上述翻译调用中定义的指定顺序对于“外语”可能无效


这就引出了我的问题,如何设计适合任何语言的翻译系统/适配器?

直接回答这个问题其实很难。这里有很多用例。如果我设计这样的系统,我会记住以下几点:

1.翻译后,句子可能需要重新排序(您已经提出了这个问题)。这就是为什么我们使用像{1}、{2}这样的数字占位符和一些格式化消息的方法

2.有相当多的语言有不止一种复数形式。也就是说,若消息包含一些数字,根据数量,它将以不同的方式进行翻译。例如:

中文:发现1种病毒|发现2种病毒|发现5种病毒

波兰语:Znaleziono 1 wirusa | Znaleziono 2 wirusy | Znaleziono 5 wirusów

这不容易处理,但我真的很喜欢这样做(有一些表达式将决定使用什么表单,以及支持多个表单)

3.此类库的用户可能希望有命名占位符(请参阅I18n标记中以前的问题),例如“这是${location}中${name}的消息”,并使用它,例如:

printf($translate->_("Today is the %1\$s") . "\n", date("d.m.Y"));
var formatted='这是${location}中${name}的消息。格式('location=Warsaw','name=Paweł')

虽然这带来了一些i18n问题,但我非常确定它可以在JavaScript中完成(尽管传递命名参数(aka参数)的方式可能需要不同)

4.Java倾向于在MessageFormat.format()中格式化特定区域设置的数字和日期方法。这不是理想的行为,它会带来一些问题,特别是在JavaScript中。好吧,首先你需要知道的是,当前用户的区域设置是什么。如果你这样做,它容易吗?好吧,不。有很多可能的日期格式-Java将它们列举为:完整、长、中、短和默认。不幸的是,dur没有区别ing格式-始终使用AFAIR short。当然,可以将其格式传递给占位符,如下所示(AFAIR):{0,date,yyyy-MM-dd}。这带来了另一个问题:翻译人员必须始终提供格式。这很容易出错。相反,我将使用默认模式进行格式设置(如果没有提供其他信息)并允许传递模式名:{0,date,long}

对于数字,它可以是任何东西:货币、百分比或简单的数值。您还需要支持这种区别,例如:{0,货币,符号:$,long},{0,percentage},{0,number,long}。猜测我的意思并不容易,但是对于大数字,您可能需要使用分组分隔符(1000000.00$),我们称之为长格式,但有时您会像这样打印数字:1234。这不是一项容易的任务

5..Net有用户界面区域性(CurrentUICulture)和格式区域性(CurrentCulture)的概念。第一个用于确定用户界面消息的适当语言,而第二个用于格式(数字、日期、货币等)

6.不同的语言倾向于使用不同的顺序,即使是同一种语言也可能使用两种(或更多)不同的顺序。我不确定它是否适合这个范围,但至少需要注意

7.可能需要(也可能会需要)对不同字符的支持。但是,您可能希望将资源文件的编码限制为UTF-8。它不会覆盖所有可能的字符(例如,请参阅),但很接近

嗯,我肯定我忘记了一些重要的事情,因为您即将完成的任务是非常艰巨的。而且我对Node.js了解不多(就像目前支持的那样)

编辑


8.当然,我忘了提到,随着软件的发展,只有很少的用户界面消息发生变化,因此需要合并旧的翻译(用L10n术语称之为利用)。通常使用某种翻译记忆软件(例如POEdit,GetText文件格式编辑器内置了此类功能)。TM软件通常仅支持某些文件格式,因此最好坚持使用现有格式,而不是创建自己的格式。这可能意味着从列表中删除一些功能…

您的设计应考虑

参数的重新排序

正如您所确定的,翻译人员可能需要对参数重新排序以适应不同的语法。因此,无论您使用什么系统,您都需要对参数进行命名或为其提供索引

格式化程序

我想你可以让开发人员在替换它们之前对它们进行转换,但在某些地方,人们会希望对数字、货币、日期和时间进行与区域设置相关的格式设置。你可能想将其扩展到多元化,但这可能是你不想打开的蠕虫

唯一键

查找键必须是唯一的。使用未翻译的字符串作为键存在风险,因为相同源字符串的翻译可能会导致错误