PHP PECL扩展intl给出了瑞典序数的乱码结果

时间:2010-10-21 20:52:34

标签: php localization pecl intl numberformatter

我正在使用PECL intl模块来本地化PHP项目中的日期和数字。在我正在使用的所有其他语言中(40),本地化序数很好。然而,在瑞典语中,我得到了奇怪的输出。它似乎是用于生成序数的模板常量。

$fnf = new NumberFormatter('sv_FI', NumberFormatter::ORDINAL);
echo $fnf->format(1);

$snf = new NumberFormatter('sv_SE', NumberFormatter::ORDINAL);
echo $snf->format(1);

返回1:e%digits-ordinal-neutre:0: 1:a1st1er之类的内容。

除了一个错误之外,我唯一的猜测就是我错过了一些额外的争论,例如相关动词的性别。

1 个答案:

答案 0 :(得分:1)

如果输出基于规则的数字格式化程序规则$fnf->getPattern()

%digits-ordinal-masculine:
    0: =#,##0==%%dord-mascabbrev=;
    -x: −>%digits-ordinal-masculine>;
%%dord-mascabbrev:
    0: :e%digits-ordinal-neutre:0: =%digits-ordinal-feminine=;
%digits-ordinal-reale:
    0: =%digits-ordinal-feminine=;
%digits-ordinal-feminine:
    0: =#,##0==%%dord-femabbrev=;
    -x: −>%digits-ordinal-feminine>;
%%dord-femabbrev:
    0: :e;
    1: :a;
    2: :a;
    3: :e;
    20: >%%dord-femabbrev>;
    100: >%%dord-femabbrev>;
%digits-ordinal:
    0: =%digits-ordinal-masculine=;

您可以看到私有规则集dord-mascabbrev只有一个规则赋予该值:

:e%digits-ordinal-neutre:0: 1:a

您将在1之后输出,就像您在问题中描述的那样。

这不是PECL INTL中的错误,但基础规则是格式错误的,这是ICU库(that rule there)的一部分。大约三年前,sv数字格式化器规则是针对丢失的分号而修复的,看起来就像是一条线滑过了。

这些规则从Unicode Consortium的CLDR(公共区域设置数据存储库)进入ICU。我打开了bug report there,因为除非在CLDR中修复了这个问题,然后将其放入ICU,否则它无法使用PHP INTL扩展。

替代方案可能是手动修补ICU库(版本4.8),然后针对修补的库构建PECL包。