【问题标题】:PHP PECL extension intl giving garbled results for Swedish ordinal numbersPHP PECL 扩展 intl 给出瑞典序数的乱码结果
【发布时间】:2011-04-28 20:30:59
【问题描述】:

我正在使用 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:a 而不是 1st1er

除了错误之外,我唯一的猜测是我遗漏了一些额外的参数,例如相关动词的性别。

【问题讨论】:

  • 听起来像个bug,也许在pecl-dev邮件列表pecl.php.net/support.php上提问
  • 如果您告诉您正在使用的 PHP 版本和模块的版本,这可能会很有用。
  • PHP 5.3.6-13ubuntu3.3 和 Suhosin-Patch,国际版 => 1.1.0,ICU 版 => 4.4.2。
  • 还有我一年多前提交的错误:bugs.php.net/bug.php?id=59366

标签: php localization pecl intl numberformatter


【解决方案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 包。

【讨论】:

    猜你喜欢
    • 2014-03-17
    • 2023-04-08
    • 2018-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    • 2013-10-19
    相关资源
    最近更新 更多