i18n - 国际化的最佳实践 - XLIFF,gettext,INI,......?

时间:2008-11-11 07:41:25

标签: internationalization translation

编辑:我真的希望看到关于格式,它们的优点和缺点的一般性讨论!

EDIT2:'赏金并没有真正帮助创建所需的讨论,有一些有趣的答案,但仍然缺少对该主题的全面报道。六个人将这个问题标记为收藏,这表明我对此讨论感兴趣。

在决定国际化时,最艰难的部分IMO是存储格式的选择。

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

  • 数组:不,难以维护
  • CSV:不知道,编码可能存在问题
  • Gettext:经常使用,poEdit适用于所有可用平台但很复杂
  • INI:不知道,编码可能存在问题
  • TBX:没有头绪
  • TMX:太重要了?没有编辑可以免费获得。
  • QT:不是很普遍,没有免费工具
  • XLIFF:即将推出的标准?但是没有可用的免费工具。
  • XMLTM:不,不是我需要的

基本上我坚持4'大胆'的选择。我想使用INI文件,但我正在阅读有关编码问题的信息......如果我使用严格的UTF-8(文件,连接,数据库等),它真的有问题吗?

我在Windows上,我试图找出poEdit如何运作,但只是没有管理。网上没有教程, gettext 仍然是一个选择或濒临灭绝的物种?

XLIFF 怎么样,还有人使用它吗?关于使用什么工具的任何提示?

Eclipse 集成任何这些技术的想法?

10 个答案:

答案 0 :(得分:15)

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

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

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

这使您可以轻松保持翻译文件的最新状态。 POEdit还有一些简洁的功能,如允许注释,显示更改和删除字符串以及允许模糊匹配,这意味着您不必重新翻译稍微修改过的字符串。

答案 1 :(得分:12)

总有Translate Toolkit允许在我认为所有提到的格式之间进行转换,并且首选gettext(po)和XLIFF。

答案 2 :(得分:1)

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

所以我的想法是,如果你可以信任用户使用UTF8编码进行编辑。

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

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

答案 3 :(得分:1)

我在l18n方面使用了其中两种格式:TMX和XLIFF。它们非常相似。 TMX现在更受欢迎,但XLIFF正在迅速获得支持。我上次查看时至少有一个免费的XLIFF编辑器:Transolution但它现在还没有开发。

答案 4 :(得分:1)

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

我有两张桌子。 第一个表有一个标识值,一个32个字符的varchar字段(在此字段上建立索引) 这个短语有200个字符的英文描述。

我的第二个表包含第一个表的标识值,语言代码(EN_UK,EN_US等)和文本的NVARCHAR列。

我对文本使用nvarchar,因为它支持我尚未使用的其他字符集。

第一个表中的32个字符varchar存储类似“pleaselogin”的内容,而第二个表实际存储完整的“请在下面输入您的登录名和密码”。

我创建了一个巨大的动态值列表,我在运行时替换它们。一个例子是“你有{[dynamic:passworddaysremain]}天更改密码。” - 这允许我解决不同语言的单词排序。

到目前为止,我只需处理阿拉伯数字,但必须为需要非阿拉伯数字的第一位用户提供一些帮助。

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

有许多选项可用,为了提高性能,您可以为每种语言使用html模板 - 我的方法运行良好但在运行时使用XML DOM来创建页面。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

这些选择对我来说都不是很开心。

如果您要以多种语言发送文件进行翻译,那么您希望能够相信编码是正确的,特别是如果您的团队中没有人会说这些语言。有时很难发现外语中的编码问题,如果你让你的操作系统“猜测”,很容易无意中破坏文件编码。

你真的想要一种声明其编码的格式。否则,翻译人员或他们的翻译工具可能会选择UTF-8以外的其他内容。对于我的钱,任何一种简单的XML格式都是最好的,但看起来你需要在Zend中推出自己的格式。 XLIFF和TMX肯定是矫枉过正。

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

答案 7 :(得分:0)

这可能与目前发布的内容略有不同,可能并不完全符合您的要求,但我想我会添加它,如果只是一个不同的方法。我选择了面向对象的方法。我所做的是创建一个系统,通过将语言文件存储在string =>转换对的数组中,将语言文件封装到一个类中。访问转换是通过一个名为translate的方法,以键字符串作为参数。扩展类继承父语言数组,可以添加或覆盖它。因为这些类是可扩展的,所以您可以更改基类并让更改通过子类传播,从而使得比数组本身更易于维护。另外,您只需拨打所需的课程。

答案 8 :(得分:0)

我们只是将字符串存储在数据库中,并在应用程序中内置了一个转换器模式,以处理实际为不同语言添加字符串的问题。

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

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

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

答案 9 :(得分:0)

您可以在http://www.myl10n.net

上查看名为iL10Nz的l10n工具

您可以上传po / pot文件,xliff,ini文件,翻译,下载。

您还可以在youtube上查看此视频 http://www.youtube.com/watch?v=LJLmxMFxaxA

由于 奥利弗