ファイル形式・標準規格Read this article in English

ICU MessageFormat を正確に理解する — 複数形と性別を正しく扱う文法

「You have 1 items」のような文字列は、単なる誤字ではなく文法のバグです。多くのコードベースが、複数形の扱いを英語の2形ルール(「1」かそれ以外か)としてテンプレートに直接埋め込んでしまっているために起きます。このルールは英語固有のもので、他の言語にはもっと多くの形があったり、逆にそこまで意味のある区別がなかったり、単純な個数以外の基準で形が決まったりします。

ICU MessageFormat は、ICU(International Components for Unicode)プロジェクトの一部として定義された構文で、複数形・性別・その他の変化を含め、どの言語の文法もコード側にハードコードすることなく、言語ごとに正しく分岐する1つのメッセージテンプレートを書くためのものです。

引数 — 基本の置換

最も単純な形では、MessageFormat は波括弧で囲まれた名前付きプレースホルダーを実行時の値に置き換えるだけです。この部分自体は特に変わったところはなく、一般的なテンプレート構文と同じように動きます。

{playerName} defeated {enemyName}.

plural — 生の数値ではなく CLDR カテゴリで分岐する

plural 引数の型は、数値そのものではなく、対象言語でその数値がどの CLDR 複数形カテゴリにマッピングされるかで分岐します。CLDR(Unicode Common Locale Data Repository)は言語ごとに最大6つのカテゴリ(zero・one・two・few・many・other)を定義していますが、ある言語が実際にどのカテゴリを、どんなルールで使うかはデータであり、メッセージを書く人が決めることではありません。

各分岐の中では、# が実際の数値に置き換わるので、分岐のテキスト自体は読みやすいまま、数値だけが自動的に挿入されます。

{count, plural,
  one {# item found}
  other {# items found}
}

select — 任意のカテゴリで分岐する。最も多いのは性別

select は汎用の分岐形式で、引数の値を名前付きのケースと照合し、other を必須のフォールバックとして持ちます。最もよく使われるのは文法上の性別で、主語の性別によって文の動詞の形や代名詞が変わり、英語には対応する区別が存在しない場合です。

{gender, select,
  male {He picked up the sword.}
  female {She picked up the sword.}
  other {They picked up the sword.}
}

selectordinal — 「何個」ではなく「何番目」

selectordinal は plural と見た目は似ていますが、基数(cardinal)ではなく序数(ordinal)のカテゴリを選びます。「3 items」(基数)と「3rd place」(序数)の違いです。英語はたまたま3つの序数形(one・two・few、それぞれ -st・-nd・-rd に対応)とその他すべてを表す other が必要になりますが、そのカテゴリと意味もやはり CLDR に由来するものであり、メッセージの書き手の想定によるものではありません。

{rank, selectordinal,
  one {#st place}
  two {#nd place}
  few {#rd place}
  other {#th place}
}

ネストと offset

メッセージの引数は互いに入れ子にできます。select の分岐の中に plural を含めたり、plural の分岐の中に別の select を含めたりできます。これにより、1つのメッセージで性別と個数の両方を同時に正しく扱えます。ただし、ネストこそが MessageFormat を翻訳しにくくする要因でもあります。深くネストされたブロックの中で作業する翻訳者は、目の前のテキストがどの条件の組み合わせから生成されたのかを追わなければならず、ある分岐でのミスはレビューでも見落としやすくなります。

plural の offset 機能は、カテゴリ選択の前に一定の数を引きます。「あなたと他2人」のように、表示される数と言語ルールを駆動する数が定数分だけずれる言い回しに便利です。

{count, plural, offset:1
  =0 {no one else}
  one {you and # other}
  other {you and # others}
}

このリスクは理論上のものではない

ICU MessageFormat が存在するのは、複数形や性別のルールが言語によって本当に異なり、英語の原文から推測できないからです。しかし、その表現力の強さこそが、この形式の主なリスクでもあります。2段階以上ネストされたメッセージは翻訳者が正しく読み取るのが難しく、閉じ括弧が1つ足りないだけで簡単に壊れ、レビュアーもすべての分岐を実際に動かして確認しない限り検証しにくくなります。文法が許す限り個々のメッセージをフラットに保ち、ネストは本当に必要な場合だけに限定することは、後回しにする話ではなく、最初から意識して決めておくべき制約だと考えるべきです。

関連記事