【问题标题】:NumberFormatter::SPELLOUT spellout-ordinal in russian and italianNumberFormatter::SPELLOUT 俄语和意大利语拼写序数
【发布时间】:2023-08-23 03:21:01
【问题描述】:

此代码适用于英语、西班牙语和德语序数,但不适用于俄语或意大利语序数。

'ru-RU','it-IT' 也不行

例如,我在俄语中得到 2 -> два(这是基数),但我想要序数,这里是 2 -> второй。

例如,我用意大利语表示 2 -> due(这是基数),但我想要序数,这将是 2 -> secondo。

更新:

我找到了一个解决方案,其中包含法语、西班牙、德语和其他一些语言的作品:

maskuline 序数:%spellout-ordinal-maskuline

女性序数:%spellout-ordinal-feminine

俄语和意大利语版本不起作用,我已经尝试使用 -maskuline/-feminine

$ru_ordinal = new NumberFormatter('ru', NumberFormatter::SPELLOUT);
$ru_ordinal->setTextAttribute(NumberFormatter::DEFAULT_RULESET, "%spellout-ordinal");  

【问题讨论】:

  • 我打电话给format(42) 结果是(按顺序):“сорок два”、“cuarenta y dos”和“quaranta due”。这是预期的输出吗?确保您已安装 intl。
  • 42 的序数,称为“сорок второй”,西班牙语为“cuadragésimo segundo”,意大利语为“quarantaduesimo”
  • 是的,我测试了它$ru_ordinal->format(42); 返回 сорок два 而不是 сорок второй。这很奇怪
  • @Rizier123 我想要俄语和意大利语的序数,在您的示例中为second。我想单独翻译这个数字!
  • @Rizier123 完全是意大利语,我得到 2 -> due 而不是 2 -> secondo

标签: php icu intl numberformatter


【解决方案1】:

NumberFormatter 正在使用 ICU 格式。

您可以在这里查看:http://saxonica.com/html/documentation/extensibility/config-extend/localizing/ICU-numbering-dates/ICU-numbering.html

... 俄语 (ru) 有以下可用格式:

  • spellout-cardinal-feminine (scf)
  • spellout-cardinal-masculine (scm)
  • spellout-cardinal-neuter (scne)
  • 拼写编号 (sn)
  • spellout-numbering-year (sny)

...和意大利语(it)

  • spellout-cardinal-feminine (scf)
  • spellout-cardinal-masculine (scm)
  • 拼写编号 (sn)
  • spellout-numbering-year (sny)
  • spellout-ordinal-feminine (sof)
  • spellout-ordinal-masculine (som)

这就是为什么您将无法为 (ru) 和以下代码设置序数格式:

$nFormat = new NumberFormatter('it', NumberFormatter::SPELLOUT);
$nFormat->setTextAttribute(NumberFormatter::DEFAULT_RULESET, "%spellout-ordinal-feminine");

var_dump($nFormat->format(42));

将打印:

string 'quaranta­duesima' (length=17)

就像你(可能)想要的那样。

编辑:

有关使用的格式以及对 ICU 的引用的信息:http://php.net/manual/en/numberformatter.create.php

使用 PHP 5.4.x 和 ICU 版本测试 => 51.2; ICU 数据版本 => 51.2。 你可以使用shell命令:

$ php -i | grep ICU

检查您拥有的 ICU 版本。

对于最新的 ICU 版本,您应该适当地安装/更新 php-intl 包:http://php.net/manual/en/intl.installation.php

编辑 2:

我已经为 NumberFormatter 创建了扩展名(到目前为止使用波兰语序数)。随意贡献其他语言:https://github.com/arius86/number-formatter

【讨论】:

  • 谢谢。不幸的是,我的主机最近才更新到 PHP 5.4 和 ICU 4.4.1。我在phpfiddle.org 上检查了你的代码,在这里我得到的是基数而不是序数。
  • Phpfiddle 使用 PHP 5.3.29。我在 5.4.12 上对此进行了测试。我添加了一些额外的参考。我认为这个话题结束了,事实上现在没有其他答案,所以我希望你将它标记为已接受。最美好的祝愿!
  • 再次感谢,但我已经知道其他参考资料。它也不适用于 5.4.36-1。这个 PHP 版本在我的网站上使用。
  • 给你,我的服务器上的工作示例:private.arius.pl/test/example.php?number=12 - 你可以随意更改号码。更新您的服务器区域设置以使用正确的意大利语值。
  • 你能给我看看 example.php 的代码,比如 example.phps 吗?我不知道,如果我可以更改我的服务器区域设置。我不使用自己的服务器。 ist 是否也适用于 %spellout-ordinal-maskuline 而不是 %spellout-ordinal-feminine
【解决方案2】:

只是一个建议,我不确定这是否可行,或者在我上大学的时候是否打开了 Apache 服务,但你是否尝试过将 ru-RU 用于俄罗斯。在 PHP 中,我个人将我的语言代码设置为“en-GB”

http://download1.parallels.com/SiteBuilder/Windows/docs/3.2/en_US/sitebulder-3.2-win-sdk-localization-pack-creation-guide/30801.htm

这是我在互联网上找到的一个列表,其中一些可以帮助您。

【讨论】:

  • 谢谢,但我也试过法语的 ru-RU 和 fr-FR,西班牙语的 es-ES,意大利语的 it-IT,它只适用于英语和德语。
最近更新 更多