internationalization - 设计用于全局应用程序的国际翻译/语言适配器

标签 internationalization translation globalization

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

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

例如,Zend's Translation Adapter的工作方式如下:

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无线网络| Znaleziono 5wirusów

这不容易处理,但是我真的很喜欢GetText做到这一点的方式(有一些表达式可以决定使用哪种形式,以及对多种形式的支持)。

3.这样的库的用户可能想要命名的占位符(请参阅I18n标记中的先前问题),例如“这是$ {name}在$ {location}中的消息”,并像这样使用它:

var formatted ='这是$ {name}中$ {name}的消息。'。format('location = Warsaw','name =Paweł');

尽管这带来了一些i18n问题,但我相当确定可以在JavaScript中完成(尽管您传递命名参数(即自变量)的方式可能需要有所不同。

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

对于数字,它可以是任何东西:货币,百分比或简单数值。您还需要支持区分,例如:{0,currency,symbol:$,long},{0,percentage},{0,number,long}。很难猜出我的意思,但是对于大数,您可能要使用分组分隔符(1,000,000.00 $),让我们将其称为长格式,而有时您希望打印数字:1234。这不是一件容易的事。

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

6.不同的语言倾向于使用不同的Collation顺序,甚至同一语言都可以使用两种(或更多)不同的语言。我不确定它是否适合该范围,但至少应该知道。

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

...?

好吧,我确定我忘记了一些主要的事情,因为您要处理的任务是艰巨的。而且我对Node.js的了解不多(如当前所支持的那样)。

编辑

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

关于internationalization - 设计用于全局应用程序的国际翻译/语言适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5611808/

相关文章:

php - Laravel - 为多语言指定默认/后备字符串

asp.net-mvc - 根据浏览器接受语言自动设置uiCulture

javascript - 希腊语和文本转换 :uppercase

windows - 如何在 Delphi 中使用 Windows IME?

unicode - 中文 <-> 英文翻译/字符含义数据库

wpf - 在没有 LocBAML 的情况下本地化 WPF 应用程序的最佳方法是什么?

ajax - ASP.NET MVC 中 MicrosoftAjax.js 的脚本全局化怎么样?

java - 如何国际化 Java 中的应用程序?

php - 我如何分析为什么gettext不起作用?

iOS : mismatched translation