【问题标题】:Is it a good idea to use Gettext and ICU MessageFormat combined?结合使用 Gettext 和 ICU MessageFormat 是个好主意吗?
【发布时间】:2012-12-05 23:46:19
【问题描述】:

当我读到 GettextICU MessageFormat 时,它们总是被描述为对立的本地化方法。

但我认为,将两者结合起来会是一个有趣的想法:使用 MessageFormat 进行格式化,使用 Gettext 根据语言选择正确的模板。大致如下:

setlocale(LC_ALL, lang)
output = MessageFormat(lang, gettext("There is {number 1} Foo in bar."), [1])

这种方法有明显(或不那么明显)的缺点吗?我是否错过了 MessageFormat 关于如何选择翻译模板的核心部分?

【问题讨论】:

    标签: internationalization gettext icu


    【解决方案1】:

    您的方法的明显问题是如何处理复数形式。虽然 ICU 内置了对 CLDR's plural rules 的支持,但它不像 gettext 使用的那样简单灵活。
    基本上,在 gettext 中,翻译者可以根据需要添加尽可能多的复数形式,并且由 .po 文件头中的选择规则控制。它比使用 CLDR 规则更灵活也更正确(根据 CLDR 版本,这可能不正确)。

    【讨论】:

    • 如果字符串中有多个参数,我会质疑该断言:X monkey(s) peel Y banana(s)。这正是这种情况,当 Gettext 导致 if/else 地狱时,而 MessageFormat 可能提供一站式解决方案:pastebin.com/yBf6AR8M
    • @Boldewyn:嗯,使用 MessageFormat 和 ICU 的问题是,这些规则完全不可读。更糟糕的是,大多数翻译人员对它们并不熟悉,而且解释它的工作原理也不是那么容易。也不可能修改复数规则(它们是给定的),而您可以使用 Gettext 来做到这一点。最后但并非最不重要的一点是,您提到的案例是要避免的事情的一个很好的例子。不仅仅是因为复数形式,还因为语法案例的困难问题。通常有一些方法可以编写消息来避免这种情况。
    • 感谢您的回答!我问一个目的。基本上,我的基于 Gettext 的代码目前看起来像这样:github.com/Boldewyn/Codepoints.net/blob/master/codepoints.net/…,而且本地化几乎是不错的选择。 (甚至不可能本地化任何非英语的东西。)我正在寻找一种方法来解决这个本地化工具中,例如,通过利用 MessageFormat 的选择机制。我也很想尝试 Mozilla 的新 L20n 方法,但是目前还没有 PHP 实现。 (顺便说一句,我还是 Gettext 的忠实粉丝。)
    • “在 gettext 中,译者可以根据需要添加任意数量的复数形式”——对此我很好奇。你会需要比 CLDR 更多的复数形式吗?用哪种语言?但我真正想说的是,我们的翻译人员在这类事情上苦苦挣扎,所以我怀疑我们是否能教他们如何编辑 po 文件...... :(
    猜你喜欢
    • 1970-01-01
    • 2010-12-28
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多