|Labs
デモを予約プラットフォーム
React (Lingo Compiler)
Alpha
React MCPReact (i18n)
旧CLI(v0)
非推奨

概要

  • @lingo.dev/react

はじめに

  • クイックスタート

リファレンス

  • LingoProvider
  • useLingo
  • 複数形と select
  • 書式設定

複数形と select

複数形と select は、1つの原文文字列だけでは足りないケースで使います。翻訳内容が数値やカテゴリによって変わるためです。@lingo.dev/react には、扱いやすい2つのヘルパー(l.plural と l.select)が用意されており、内部では ICU MessageFormat にコンパイルされます。そのため、翻訳者には標準的な構文がそのまま見え、実行時の挙動も変わりません。

複数形#

l.plural(count, forms, { context }) は、count とロケールの CLDR 複数形ルールに基づいて適切な形式を選択します。

tsx
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 にそのまま渡されます。

tsx
l.plural(notifications.length, {
  one: "1 message from {sender}",
  other: "{count} messages from {sender}",
}, { context: "Inbox header" });

あとは呼び出し時に値を渡すだけです。とはいえ、l.plural のシグネチャには { context } しかありません。こうした混在ケースでは、ICU の複数形構文を使って l.text を直接使ってください。

tsx
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 }) は、文字列キー(性別、役割、コンテンツタイプなど、任意のカテゴリ)に応じて形式を選びます。

tsx
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 を直接使います。

tsx
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" }) は次のように抽出されます。

text
{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 による数値、通貨、日付、リストのフォーマット。

このページは役に立ちましたか?

Max PrilutskiyMax Prilutskiy·更新済み 約1か月前·1分で読めます