複数形と select は、1つの原文文字列だけでは足りないケースで使います。翻訳内容が数値やカテゴリによって変わるためです。@lingo.dev/react には、扱いやすい2つのヘルパー(l.plural と l.select)が用意されており、内部では ICU MessageFormat にコンパイルされます。そのため、翻訳者には標準的な構文がそのまま見え、実行時の挙動も変わりません。
複数形#
l.plural(count, forms, { context }) は、count とロケールの CLDR 複数形ルールに基づいて適切な形式を選択します。
const l = useLingo();
l.plural(items.length, {
one: "1 item",
other: "{count} items",
}, { context: "Cart summary" });
// → "1 item" (en, count=1) / "5 items" (en, count=5)
// → "1 Eintrag" / "5 Einträge" (de, after translation)ロケールごとの形式#
forms マップでは、CLDR の複数形カテゴリをすべて指定できます — zero、one、two、few、many、other。どれを使うかはロケールごとに異なります。
- 英語では
oneとotherを使います(1 とそれ以外) - ロシア語では
one、few、many、otherを使います(1、2〜4、5〜20、21、31、...) - アラビア語では6つすべてを使います
- 日本語では
otherだけを使います(複数形の区別はありません)
指定が必要なのは、ソースロケールで使う形式だけです。足りない分は、翻訳者がターゲットロケールごとに追加します。
{count} は、どの複数形でも自動的に補間されます。values 経由で渡す必要はありません — 最初の引数から取得されます。
他のプレースホルダーと組み合わせる#
件数に加えて別の変数も含まれる文では、各形式の文字列にその変数を書いてください。ICU にそのまま渡されます。
l.plural(notifications.length, {
one: "1 message from {sender}",
other: "{count} messages from {sender}",
}, { context: "Inbox header" });あとは呼び出し時に値を渡すだけです。とはいえ、l.plural のシグネチャには { context } しかありません。こうした混在ケースでは、ICU の複数形構文を使って l.text を直接使ってください。
l.text(`{count, plural, one {1 message from {sender}} other {# messages from {sender}}}`, {
values: { count: notifications.length, sender: user.name },
context: "Inbox header",
});# トークンは、件数の値にそのまま置き換えられます。波かっこでの補間を使わずに表示したいときに便利です。
Select#
l.select(value, forms, { context }) は、文字列キー(性別、役割、コンテンツタイプなど、任意のカテゴリ)に応じて形式を選びます。
l.select(user.gender, {
male: "He uploaded a photo",
female: "She uploaded a photo",
other: "They uploaded a photo",
}, { context: "Activity feed" });フォールバックとして other は必須です。一致は完全一致で、あいまい一致や大文字・小文字を無視した一致はありません。
Selectordinal#
序数(1st、2nd、3rd)には、l.text を介して ICU の selectordinal を直接使います。
l.text(`You finished in {place, selectordinal, one {#st} two {#nd} few {#rd} other {#th}} place`, {
values: { place: rank },
context: "Leaderboard",
});
// → "You finished in 1st place" / "2nd" / "3rd" / "4th, 5th, ..."コンパイル後の形#
l.plural と l.select はどちらも ICU MessageFormat の文字列を組み立て、それを l.text に渡します。コンパイル後の形式が lingo extract によって抽出され、ロケールファイルに保存されます。翻訳者が直接編集するのは ICU 構文であり、JS のオブジェクトリテラルではありません。
たとえば、l.plural(n, { one: "1 item", other: "{count} items" }, { context: "Cart" }) は次のように抽出されます。
{count, plural, one {1 item} other {{count} items}}つまり翻訳者は、ソースにないカテゴリも含めて、ロケールごとにカテゴリを調整できます。たとえばロシア語でも、コードを変更せずに {count, plural, one {...} few {...} many {...} other {...}} にできます。
使わないほうがよいケース#
- 単純な「1 かそれ以外か」のブール値。
ifの下でl.textを2回呼び出すだけで十分ですし、そのほうが翻訳者にも見つけやすくなります。 - ユーザー向けではないプログラム上の列挙型。 plural / select は、アプリのロジックを分岐するためではなく、カテゴリ付きメッセージを翻訳するためのものです。
次に読むもの#
- useLingo —
l.textとl.richの基本的な意味。 - Formatting — ネイティブの Intl による数値、通貨、日付、リストのフォーマット。
