自動複数形化

@lingo.dev/compilerは、テキスト内の複数形を自動的に検出し、言語間で適切な複数形化を行うためにICU MessageFormat形式に変換します。

機能

コンパイラはAIを使用して、テキストに複数形が含まれている場合(例:「1 item」と「5 items」)を検出し、ICU MessageFormat構文に変換します。

変換前(コード):

<p>You have {count} items</p>

変換後(コンパイル済み):

<p>{count, plural, one {You have 1 item} other {You have # items}}</p>

言語によって複数形のルールは異なります。アラビア語には6つの形式、ロシア語には4つ、英語には2つの形式があります。ICU MessageFormatはこれらすべてを正しく処理します。

仕組み

  1. コンパイラが数値を含む補間を検出
  2. 複数形検出のためにテキストをLLMに送信
  3. 複数形が検出された場合、LLMがICU MessageFormatパターンを返す
  4. コンパイラが複数形対応の翻訳を挿入

これは自動的に行われるため、コードの変更は不要です。

設定

{
  pluralization: {
    enabled: true, // Default: true
    model: "groq:llama-3.1-8b-instant", // Fast model for plural detection
  }
}

モデル: コストを抑えるため、複数形検出には別の(高速な)モデルを使用します。デフォルトはGroqの最速モデルです。

シンプルな複数形

<p>You have {count} items in your cart</p>

変換後:

{count, plural,
  one {You have 1 item in your cart}
  other {You have # items in your cart}
}

ゼロ形式

<p>You have {unreadCount} unread messages</p>

変換後:

{unreadCount, plural,
  =0 {You have no unread messages}
  one {You have 1 unread message}
  other {You have # unread messages}
}

複雑な複数形

<p>{days} days and {hours} hours remaining</p>

次のようになります:

{days, plural,
  one {1 day}
  other {# days}
} and {hours, plural,
  one {1 hour}
  other {# hours}
} remaining

言語固有のルール

ICU MessageFormatは複雑な複数形ルールを自動的に処理します:

英語(2つの形式):

  • one: 1 item
  • other: 0 items、2 items、100 items

ロシア語(4つの形式):

  • one: 1、21、31、41...(оди́н элеме́нт)
  • few: 2-4、22-24...(два элеме́нта)
  • many: 0、5-20、25-30...(пять элеме́нтов)
  • other: 1.5、2.5...(1.5 элеме́нта)

アラビア語(6つの形式):

  • zero: 0
  • one: 1
  • two: 2
  • few: 3-10
  • many: 11-99
  • other: 100+

コンパイラは各ターゲットロケールに対して正しい形式を生成します。

複数形化の無効化

アプリで複数形を使用しない場合、または手動で処理したい場合:

{
  pluralization: {
    enabled: false,
  }
}

これにより複数形の検出が完全にスキップされ、LLM呼び出しが削減されます。

手動の複数形

コード内でICU MessageFormatを直接記述できます:

<p>
  {formatMessage(
    { id: "items", defaultMessage: "{count, plural, one {# item} other {# items}}" },
    { count }
  )}
</p>

コンパイラは複数形を検出しようとせず、指定された形式をそのまま使用します。

パフォーマンス

複数形検出にはわずかなオーバーヘッドが発生します:

  • 数値補間を含む一意のテキストごとに1回の追加LLM呼び出し
  • 高速モデルを使用(デフォルト: Groq llama-3.1-8b-instant)
  • 結果はキャッシュされ、後続のビルドで検出結果が再利用されます

コスト: 無視できる程度です。高速モデルはリクエストあたり数セント未満です。

よくある質問

すべての言語で動作しますか? はい。ICU MessageFormatは200以上の言語の適切な複数形ルールをサポートしています。

AIが間違えた場合はどうなりますか? data-lingo-overrideを使用して、正しい複数形を含む正確な翻訳を指定できます:

<p data-lingo-override={{
  es: "{count, plural, one {1 artículo} other {# artículos}}"
}}>
  {count} items
</p>

複数形検出モデルをカスタマイズできますか? はい。pluralization.modelをサポートされている任意のLLMに設定できます。デフォルトは速度とコストに最適化されています。

バンドルサイズは増加しますか? わずかに増加します。ICU MessageFormatパターンは単純な文字列よりも少し大きくなりますが、影響は最小限です。

ネストされた複数形はどうですか? サポートされています。コンパイラは同じ文字列内の複数の複数形変数を処理します。

複数形をマークする必要がありますか? いいえ。pluralization.enabled: trueの場合、コンパイラが自動的に検出します。

デバッグ

検出された複数形を確認するには、.lingo/metadata.jsonを確認してください。

{
  "translations": {
    "abc123": {
      "source": "You have {count} items",
      "pattern": "{count, plural, one {You have 1 item} other {You have # items}}",
      "locales": {
        "es": "{count, plural, one {Tienes 1 artículo} other {Tienes # artículos}}"
      }
    }
  }
}

patternフィールドには、コンパイラによって検出されたICU MessageFormatが表示されます。

次のステップ