アルファ版
Lingo.dev Compiler は現在アルファ版です。安定性は保証されておらず、本番環境での利用は推奨されません。API はリリースごとに変更される可能性があります。
Lingo.dev Compiler は、JSX テキスト内の複数形を検出し、自動的に ICU MessageFormat に変換します。言語ごとに複数形ルールを手作業で書く代わりに、数値を含む自然なテキストを書くだけで、Compiler が LLM を使って適切な複数形を生成します。
仕組み#
Compiler が数値パターンを検出
AST 解析の過程で、Compiler は補間された数値と、数によって形が変わる語が並ぶテキストノードを特定します。たとえば You have {count} items には、数量に応じて変化する語の隣に数値変数が含まれています。
LLM が複数形を判定
小型で高速な LLM(pluralization.model で設定可能)がテキストを解析し、どの語に複数形の変化が必要かを判断します。そして、各対象ロケールに必要な CLDR plural categories を生成します。
ICU MessageFormat を生成
Compiler は、対象言語で必要となるすべての複数カテゴリに対応した ICU MessageFormat 文字列を生成します。
例#
元の JSX:
<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}}ロシア語向けに生成される出力(複数カテゴリは 4 つ):
{count, plural, one {У вас # товар в корзине} few {У вас # товара в корзине} many {У вас # товаров в корзине} other {У вас # товаров в корзине}}CLDR 複数カテゴリ#
言語によって、6 つある CLDR plural categories のうち使うカテゴリは異なります。Compiler は、各対象ロケールで必要なカテゴリだけを生成します。
| カテゴリ | 説明 | 該当言語 |
|---|---|---|
zero | 数量ゼロ | アラビア語、ラトビア語 |
one | 単数形 | 英語、フランス語、ドイツ語、スペイン語 |
two | 双数形 | アラビア語、ヘブライ語、スロベニア語 |
few | 少数 / 少量 | ロシア語、チェコ語、ポーランド語 |
many | 多量 | ロシア語、アラビア語、ポーランド語 |
other | 汎用 / デフォルト(常に必須) | すべての言語 |
英語では one と other を使います。ロシア語では one、few、many、other を使います。アラビア語では 6 つすべてのカテゴリを使います。Compiler はこれをロケールごとに自動で処理します。
設定#
複数形変換はデフォルトで有効です。Compiler オプションで設定できます。
{
pluralization: {
enabled: true,
model: "groq:llama-3.1-8b-instant",
},
}| オプション | 型 | デフォルト | 説明 |
|---|---|---|---|
pluralization.enabled | boolean | true | 複数形の自動検出を有効または無効にします。 |
pluralization.model | string | "groq:llama-3.1-8b-instant" | 複数形検出に使う LLM モデル。検出は翻訳よりシンプルなため、小型モデルで十分です。 |
複数形変換を完全に無効にするには:
{
pluralization: {
enabled: false,
},
}複数形変換を無効にすると、Compiler は数値を含むテキストを通常の文字列として翻訳します。そのため、複雑な複数形ルールを持つ言語では、すべての数量に対して文法的に正しい訳にならない場合があります。
複数形変換が適用されるケース#
Compiler は、次のようなケースで複数形パターンを検出します。
- 補間された数値変数を含むテキスト:
{count} items、{n} messages - 数値リテラルを含むテキスト:
You have 5 items(動的 UI ではあまり一般的ではありません)
Compiler は、次のケースでは 複数形変換を行いません:
- 数値への参照がないテキスト:
Items in cart(分岐に使う数値がないため) - 数値が、数量によって変化する語と直接結び付いていないテキスト
JSX には自然なテキストを書いてください。複数形の検出と ICU 形式への変換は Compiler とその LLM が処理するため、ICU MessageFormat の構文を覚える必要はありません。
