自動複数形化
@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はこれらすべてを正しく処理します。
仕組み
- コンパイラが数値を含む補間を検出
- 複数形検出のためにテキストをLLMに送信
- 複数形が検出された場合、LLMがICU MessageFormatパターンを返す
- コンパイラが複数形対応の翻訳を挿入
これは自動的に行われるため、コードの変更は不要です。
設定
{
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が表示されます。
次のステップ
- 手動オーバーライド — 複数形を手動でオーバーライドする
- 設定リファレンス — 複数形化オプション
- ICU MessageFormatガイド — ICU構文を学ぶ