Internationalization 将Gettext和ICU MessageFormat结合使用是一个好主意吗?

Internationalization 将Gettext和ICU MessageFormat结合使用是一个好主意吗?,internationalization,gettext,icu,Internationalization,Gettext,Icu,当我读到和时,这两种方法总是被描述为与本地化方法相反 但我认为,将两者结合起来将是一个有趣的想法:使用MessageFormat进行格式化,使用Gettext根据语言选择正确的模板。大致如下: setlocale(LC_ALL, lang) output = MessageFormat(lang, gettext("There is {number 1} Foo in bar."), [1]) 这种方法有没有明显的缺点?我是否遗漏了MessageFormat中关于如何选择翻译模板的核心部分?您

当我读到和时,这两种方法总是被描述为与本地化方法相反

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

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

这种方法有没有明显的缺点?我是否遗漏了MessageFormat中关于如何选择翻译模板的核心部分?

您的方法的明显问题是如何处理复数形式。尽管ICU内置了对的支持,但它并不像gettext使用的那样简单灵活。

基本上,在gettext中,翻译人员可以根据需要添加任意多的复数形式,并且受.po文件头中的选择规则控制。与使用CLDR规则相比,这种方法更灵活、更正确(根据CLDR版本的不同,可能不正确)。

在字符串中有多个参数的情况下,我质疑这种断言:
X monkey(s)peel Y banana(s)
。这正是这种情况,当Gettext导致
if
/
else
地狱,而MessageFormat可能提供一个sop解决方案:@Boldewyn:嗯,使用MessageFormat和ICU的问题是,这些规则完全不可读。更糟糕的是,大多数翻译人员都不熟悉它们,解释它们的工作原理也不是那么容易。也不可能修改复数规则(它们是给定的),而您可以使用Gettext来修改复数规则。最后,但并非最不重要的一点是,你提到的案例是一个很好的例子,说明了需要避免的事情。不仅仅是因为复数形式,还因为语法格的困难问题。通常有很多方法可以避免这种情况。谢谢你的回答!我要求一个目的。基本上,我的基于Gettext的代码目前看起来是这样的:本地化非常好。(甚至不可能用非英语的语言进行本地化。)我正在本地化工具中寻找解决方法,例如,利用MessageFormat的选择机制。我也想尝试Mozilla的新L20n方法,但是目前还没有PHP实现。(顺便说一句,我是Gettext的超级粉丝。)“在Gettext中,译者可以根据需要添加任意多的复数形式”——我对此很好奇。你会需要比CLDR更多的复数形式吗?用哪种语言?但我真正想说的是,我们的翻译人员正在为这类事情而挣扎,所以我怀疑我们能否教他们如何编辑po文件…:(