i18n - 国际化的最佳实践 - XLIFF、gettext、INI等?

33

编辑: 我真的很想看到关于这些格式的总体讨论,它们各自的优缺点是什么!

编辑2:悬赏并没有真正帮助创建需要的讨论,有一些有趣的答案但还是缺乏对该主题的全面覆盖。六个人将问题标记为“收藏”,这表明对此讨论有兴趣。

在决定国际化时,我认为最困难的部分是选择存储格式。

例如,Zend PHP框架提供了以下适配器,它们几乎涵盖了我所有的选项:

  • 数组 :不行,难以维护
  • CSV :不知道,可能存在编码问题
  • Gettext :使用频繁,适用于所有平台的poEdit可用,但很复杂
  • INI :不知道,可能存在编码问题
  • TBX :不知道
  • TMX :太大了?没有免费的编辑器。
  • QT :不太普及,没有免费工具
  • XLIFF :未来的标准?但没有免费工具。
  • XMLTM :不行,不是我需要的

基本上,我被限制在了这4种“粗体”选择中。我想使用INI文件,但我正在阅读关于编码问题的内容……如果我使用严格的UTF-8(文件、连接、数据库等),那么它真的是一个问题吗?

我正在使用Windows,并尝试弄清楚poEdit的功能,但无法做到。网上也没有教程,gettext仍然是一个选择,还是一种濒危的物种?

关于XLIFF,有人用过吗?有什么工具使用的技巧吗?

对于这些技术的任何想法在Eclipse集成方面都有哪些建议?

10个回答

16

POEdit并不难理解。只需创建一个新的 .po 文件,然后告诉它要从源文件导入字符串。程序会扫描您的 PHP 文件,查找与 _("Text")gettext("Text") 等函数调用匹配的内容。您甚至可以指定自己要查找的函数。

然后,在相应的框中输入翻译。保存您的 .po 文件时,会自动生成一个 .mo 文件。那只是 gettext 可以轻松解析的翻译的二进制版本。

在您的 PHP 脚本中调用 bindtextdomain(),告诉它您的 .mo 文件的位置。现在,传递给 gettext(或下划线函数)的任何字符串都将被翻译。

这使得保持翻译文件最新非常容易。POEdit 还有一些很棒的功能,比如允许注释、显示更改和删除的字符串,以及允许模糊匹配,这意味着您无需重新翻译已经稍微修改过的字符串。


12

总有一种 翻译工具包 可以在我看来支持所有提到的格式,首选 gettext (po) 和 XLIFF。


与Translate Toolkit相同的项目,Pootle(http://pootle.translatehouse.org/)允许您为其他非技术背景的翻译人员创建网站以帮助您。PHP INI或数组对于翻译人员总是一个问题,因为它们倾向于在不应该引用引号或双引号的地方引入这些符号,从而生成需要仔细检查的解析错误。真正重要的两个是Gettext和XLIFF,我也不确定哪一个更好。从结构角度来看,XLIFF是XML(可能更有效地解析但不易于阅读),而Gettext主要是文本。 - ywarnier

1

我使用自定义设计来进行数据存储 - 所有显示的文本都存储在数据库中。

我有两个表。第一个表具有标识值、32个字符的varchar字段(在此字段上建立索引)和一个200个字符的英语短语描述。

我的第二个表具有第一个表的标识值、语言代码(EN_UK、EN_US等)和一个用于文本的NVARCHAR列。

我使用nvarchar来支持其他字符集,尽管我目前还没有使用它们。

第一个表中的32个字符的varchar存储类似于“pleaselogin”的内容,而第二个表实际上存储完整的“Please enter your login and password below”。

我创建了一个巨大的动态值列表,在运行时替换它们。例如,“You have {[dynamic:passworddaysremain]} days to change your password.” - 这使我能够解决不同语言中的单词顺序问题。

到目前为止,我只需要处理阿拉伯数字,但是对于需要非阿拉伯数字的第一个用户,我将想出一些解决方案。

我实际上每隔2小时从数据库中提取这些信息,并将其缓存到每种语言的XML文件中的磁盘中。广泛使用CDATA。

有很多可选项,为了提高性能,您可以为每种语言使用HTML模板 - 我的方法效果不错,但在运行时需要大量使用XML DOM来创建页面。


你们为翻译人员提供哪些工具? - dolmen

1

我在本地化方面使用了两种格式:TMX和XLIFF。它们非常相似。现在TMX更受欢迎,但XLIFF正在迅速获得支持。至少在我上次研究时,有一个免费的XLIFF编辑器:Transolution,但现在已经不再开发。


1

如果你想的话,可以使用INI,只是INI没有办法告诉任何人它是UTF8编码的,所以如果有人用编辑器打开你的INI文件,可能会破坏你的文件。

所以这个想法是,如果你能相信用户使用UTF8编码进行编辑。

你可以在文件开头添加BOM,一些编辑器知道它。

你想要存储什么?用户生成的内容还是你的应用程序资源?


我希望ini文件可以存储语言字符串。然后,每种语言和每个模块都有一个ini文件,例如default.en、default.de、default.fr... - markus
如果您使用简单的INI文件,只需在文档中声明翻译文件需要采用UTF8编码即可。如果翻译人员没有遵守这个规定,那就是他的责任 :) - CiNN
我做了一个变体(例如每种语言一个INI类型的文件),并将其加载到自定义哈希表中。它很快,工作得很好,除了在C应用程序中解决一些自制OO问题。 - torial

0
这可能与迄今为止发布的内容有所不同,也可能不完全符合您的要求,但我认为我应该添加它,即使只是出于不同的方法。我采用了面向对象的方法。我创建了一个系统,将语言文件封装到一个类中,通过将它们存储在字符串=>翻译对的数组中来实现。访问翻译是通过一个名为translate的方法,并将键字符串作为参数。扩展类继承父类的语言数组,可以添加或覆盖它。因为这些类是可扩展的,所以您可以更改基类并使更改传播到子类,使其比仅使用数组更易于维护。此外,您只调用需要的类。

0
一个相对简单的方法是使用资源文件和资源脚本。像MSVC这样的程序可以轻松地编辑它们。它们也对其他系统(以及文本编辑器)非常友好。您可以为每种语言创建单独的字符串表(和位图表),并标记每个表所在的语言。

0

对我来说,这些选择都不是很吸引人。

如果您要将文件发送到多种语言的翻译中进行翻译,则需要确保编码正确,特别是如果您的团队中没有人会讲这些语言。有时,很难发现外语中的编码问题,如果让操作系统“猜测”,很容易无意中破坏文件编码。

您真的需要一种声明其编码的格式。否则,翻译者或他们的翻译工具可能会选择除UTF-8之外的其他编码方式。对于我的资金来说,任何一种简单的XML格式都是最好的选择,但看起来您需要在Zend中自己创建。XLIFF和TMX肯定过度了。

像Java的XML资源这样的格式是理想的选择。


为什么需要自己编写代码?你使用过ZF吗? - d-_-b

0

0

我们只是将字符串存储在数据库中,并在应用程序中构建了一个翻译模式来处理不同语言的字符串添加。

在应用程序中,我们使用各种技巧来创建文本ID,例如

£("btn_save")
£(Order.class,"amt")

系统启动时或手动触发重新加载时,翻译将从数据库中加载。£ 方法负责根据用户会话中指定的语言查找已翻译的字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接