2

ICU メッセージのフォーマットがうまくいかないようです。次に例を示します。

$n = 22;
$f = MessageFormatter::create('ru', '{n, plural, one{корова} few{коровы} many{коров} other{коров}}');
echo $n.' '.$f->format(['n' => $n])."\n";

22 коровは出力を取得しますが、明らかに取得する必要があります22 коровы。いくつかのubuntuサーバーで試しました。

言語: ロシア語

php-intl バージョン 1.1.0

ICU バージョン 52.1

私はそれに固執しているので、どんな助けも感謝します。

4

1 に答える 1

3

これは厄介なバグの 1 つであり、私はほぼ 1 時間かけて解明しました。52.1ではICU(おそらくそれ以前も)、次のようになっています。

set34{
    many{
        "v = 0 and i % 10 = 0 or v = 0 and i % 10 = 5..9 or v = 0 and i % 100"
        " = 11..14 @integer 0, 5~19, 100, 1000, 10000, 100000, 1000000, …"
    }
    one{
        "v = 0 and i % 10 = 1 and i % 100 != 11 @integer 1, 21, 31, 41, 51, 6"
        "1, 71, 81, 101, 1001, …"
    }
    other{
        " @integer 2~4, 22~24, 32~34, 42~44, 52~54, 62, 102, 1002, … @decimal"
        " 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …"
    }
}

ソース: http://source.icu-project.org/repos/icu/icu/tags/release-52-1/source/data/misc/plurals.txt

したがって、2-4、22-24 などのケース ( 22 коровы) は修飾子に該当するotherため、ケースの正しい構文は{n, plural, one{корова} few{коровы} many{коров} other{коровы}}. few新しいバージョンとの互換性のために残しましたICU(この場合、実際にfew修飾子を使用します)。

于 2015-09-01T09:38:36.153 に答える