如何将日期区间格式化为文本(国际化)

3
假设我有一个日期间隔DateInterval,例如"P10DT1H53S",我希望将其格式化为易于理解的字符串,例如:
10 days, 1 hour and 53 seconds

现在,如果你只打算使用英语进行翻译,那么这是相当容易的。但我正在寻找一种干净且国际化的方法来使用gettext进行翻译。
不幸的是,gettext一次只能处理一个复数形式,而不能同时处理多个(年、天、小时等)。因此,我无法使用ngettext来实现我想要的效果。而且,复数形式在不同语言中差异很大,所以不能简单地迭代并在需要时添加"s"。此外,我必须将它作为一个整体构建,因为我不确定每种语言是否会使用逗号(用一个“and”代替最后一个逗号)来分隔天、小时等。

我所知道的唯一可以很好地处理这种情况的机制是 Perl 的 Locale::MakeText 模块,而你可能没有轻松获取翻译的途径。祝你好运,我期待着答案。 - sarnold
2个回答

1

最新的国际化数据存储库是由Unicode Consortium托管的CLDR项目。区域特定的复数规则是数据集的一部分。

存储库数据以一堆XML文件的形式提供。有一些工具可以操作这些数据,包括生成符合POSIX标准的区域设置文件的代码。

我不确定在PHP中使用这些数据需要多少工作(这不是我的专长),但从长远来看,这可能是值得的。


谢谢您提供的链接,这看起来确实值得使用,但似乎不是我正在寻找的;我只需要一种格式化时间间隔的方法,而不是翻译数据(我打算使用.po文件)。 - Artefact2
使用.po文件可能适用于文本片段,但您需要使用存储库的复数规则来选择要使用哪个。http://www.unicode.org/cldr/data/charts/supplemental/language_plural_rules.html - devstuff

0

您可以多次调用gettext而不是仅在一次中执行。这应该可以绕过复数限制。


怎么做呢?并不是所有语言都使用逗号来分隔名词,并在最后一个名词使用 _('and')(或者我对此有误吗?) - Artefact2
你也可以使用gettext来分隔符。但为了简单起见,我会像这样做:“10天,1小时和53秒”,我认为人们不会介意,而且更容易国际化。 - krtek
gettext() 在这种情况下表现非常糟糕,因为正确的复数形式取决于确切的数字。在俄语中,如果数字以1结尾、2,3,4结尾、5,6,7,8,9,0结尾或处于11到19之间,复数形式会发生变化。根据特定数字单词可能有四种不同的复数形式。 - sarnold

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