3

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はのようなものに対して返され1stます1er

バグ以外の私の唯一の推測は、関連付けられた動詞の性別などの追加の引数が欠落していることです。

4

1 に答える 1

1

ルールベースの数値フォーマッタ rules を出力する場合$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プライベート ルール セットには、その値を与えるルールが 1 つしかないことがわかります。

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

質問で説明したように、1の後に出力します。

これは PECL INTL のバグではありませんが、ICU ライブラリの一部である基本的なルールの形式が正しくありません (そのルールがあります)。約 3 年前に、sv 数値フォーマッタのルールでセミコロンの欠落が修正されました。1 行抜けていたようです。

これらのルールは、Unicode コンソーシアムの CLDR (Common Locale Data Repository) から ICU に取り込まれます。これは CLDR で修正されてから ICU に入れられない限り、PHP INTL 拡張では動作しないため、そこでバグ レポートを開きました。

別の方法として、ICU ライブラリ (バージョン 4.8) に手動でパッチを適用し、パッチを適用したライブラリに対して PECL パッケージをビルドすることもできます。

于 2012-01-01T03:41:39.583 に答える