2011-08-21 41 views
4

我决定使用ResourceBundles来为我的php应用程序提供翻译。尽管ResourceBundle(http://www.php.net/manual/en/class.resourcebundle.php)功能非常新,但我更喜欢它通过gettext工作的方式。ResourceBundle编辑

我的问题是,有没有好的ResourceBundle编辑器?具体而言,我正在寻找能够扫描我的所有源文件并生成需要翻译和/或更新的消息ID列表的程序。

此前,我已经使用POEdit为gettext生成翻译文件。它能够扫描我的源文件以查找诸如_()之类的函数,并向我发送要转换的消息ID列表。

我已经尝试安装一个eclipse插件(http://sourceforge.net/projects/eclipse-rbe/),虽然它有一个很好的GUI,它不会扫描我的源文件来生成消息ID列表翻译。

任何人都可以推荐任何资源包编辑器?

回答

6

花了大部分时间尝试了大量不同的工具,而不是什么,我已经设计了这个工作流程,而且它会很好地帮助其他人。

ResourceBundles对于PHP来说相当新颖,并没有太多的信息。令人惊讶的是,虽然资源包已被各种语言(如Java)使用了很长一段时间,但我无法找到任何可以通用方式处理RB的工具。

SirDarius建议尝试RB Manager是一个好的开始。这是直接使用,但有一些问题:

  • 要扫描您的源代码,您需要设置扫描仪使用xml文件,这可能不直观。
  • 更重要的是,扫描仪将报告未使用的密钥和新密钥的列表。这些仍然需要使用RB Manager主应用程序手动添加到您的资源包中。
  • 最后,由RB Manager导出的ICU文件被破坏。在内容应该作为内容本身导出的地方,RB Manager以某种方式将它们转换成ASCII代码的十进制等值。这使得该文件不可用。

我已经尝试过不同的工具来转换格式,即XLIFF格式,但我发现生成的XLIFF文件通常格式不正确,下一个软件会拒绝处理它。

对于那些谁在将来可能会遇到这个问题,这里是我做了什么:

  1. 我假设你有一些类或函数环绕MessageFormatter和资源包类。在我的应用程序中,我使用类似$translate->_('text');来执行翻译。诀窍是使用POEdit。 POEdit将扫描您的源文件中的_()并获取密钥列表并删除旧密钥。请记住,在MessageFormatter中,只能使用消息ID,例如system.warning.reason,而不是完整字符串“您的操作被拒绝,这已被记录”。

  2. 然后,您应该使用POEdit来编写您的翻译。处理复数有点不同。你不应该设置任何处理复数的规则。处理复数是为内嵌的翻译字符串完成的,这非常灵活。有关示例,请参阅:http://userguide.icu-project.org/formatparse/messages

  3. 一旦您的翻译已经完成,我写了一个小PHP脚本由poEdit的生成到相当于ICU files.For解析的.mo文件的.mo文件转换,我用了Zend_Framework gettext的适配器。它还包含了一个抓取所有消息ID和消息的功能,这非常有用。您然后将这些数据转换成ICU格式像这样:

    root { 
    
        // message ID {" Pattern "} 
    
        system.warning.reason { "Your action was denied. This has been logged" } 
    } 
    

一旦做到这一点,你需要从下载ICU包:http://site.icu-project.org/download。在bin目录中,您会找到一个名为genrb的可执行文件,它将资源包编译为供PHP使用的二进制文件。

该命令是genrb inputfile.txt -e UTF-8注意到输入编码被指定为UTF-8。您可以将其更改为输入文件使用的任何编码。

就是这样。我相信这是为PHP生成和翻译资源捆绑时最简单和最具生产力的工作流程。

如果有人想出一个更好的方法,或者甚至是一个完整的独立程序来处理这个问题,请发表评论!

+0

为什么要转换.mo文件而不是.po文件?你可以做简单的文本处理,而不需要任何Zend的东西。另外,如果你在消息ID中加引号,你可以像使用gettext一样使用文本文本,'genrb'不会抱怨。 – DanMan

0

你可以试试这个:http://icu-project.org/download/rbmanager.html

资源包管理器上的PHP资源包类是基于ICU项目编写。

+0

我刚刚尝试过使用rbmanger,但似乎无法找到一种方法让它扫描我的源文件并选取消息ID /键。这是正确的方法,还是我希望手动记录我使用的属性文件中的每个密钥? – F21