1. 導入:なぜIntl.PluralRulesが必要なのか
Webサイトやアプリを多言語対応(国際化)する際、最も頭を悩ませるのが「単数形と複数形の扱い」です。英語では「1 apple」ですが「2 apples」のように名詞が変化します。これを単純に条件分岐(if文)で書くと、言語が増えるたびにコードが複雑になり、メンテナンスが困難になります。
Intl.PluralRulesは、言語ごとの複雑なルールの違いをJavaScriptが自動的に判別してくれる強力なAPIです。これを使えば、どんな言語環境でも自然な文章を生成できるようになります。
2. 基礎知識:Plural(複数形)のルールとは
言語によって「複数形」の定義は異なります。
例えば、英語は「1(単数)」と「それ以外(複数)」の2パターンですが、ポーランド語などの一部の言語では、「1」「2〜4」「5以上」といったように、数字によって3つ以上のルールに分かれることがあります。
Intl.PluralRulesは、言語コード(’en-US’や’ja-JP’など)を渡すだけで、その言語がどのグループに該当するかを「’one’, ‘other’, ‘few’」といったキーワードで返してくれます。
3. 実装:使い方をマスターしよう
使い方は非常にシンプルです。
1. `new Intl.PluralRules(‘言語コード’)` でインスタンスを作成します。
2. `select(数値)` メソッドを呼び出し、その数字がどのグループに属するかを取得します。
4. サンプルプログラム
以下のコードをコピーして、ブラウザのコンソールなどで実行してみてください。
// 英語での例:1個と複数個を判定する
const englishPlural = new Intl.PluralRules('en-US');
// 日本語での例:日本語は常に「その他(other)」に分類されるため、形態に変化がないことを確認できる
const japanesePlural = new Intl.PluralRules('ja-JP');
// 判定用の関数
function getAppleLabel(count, lang) {
const pr = new Intl.PluralRules(lang);
const rule = pr.select(count);
if (lang === 'en-US') {
// 英語の場合、1なら単数、それ以外なら複数にする
return rule === 'one' ? `${count} apple` : `${count} apples`;
} else {
// 日本語の場合、常に「個のりんご」とする
return `${count}個のりんご`;
}
}
console.log(getAppleLabel(1, 'en-US')); // 結果: "1 apple"
console.log(getAppleLabel(5, 'en-US')); // 結果: "5 apples"
console.log(getAppleLabel(1, 'ja-JP')); // 結果: "1個のりんご"
5. 応用・注意点
注意点:
日本語のように「単数・複数の区別がない言語」の場合、Intl.PluralRulesは常に ‘other’ を返します。これはバグではなく仕様です。多言語展開をする際は、必ず「その言語で単数・複数の区別があるか」を考慮してロジックを組む必要があります。
現場で役立つヒント:
ReactやVueなどのフレームワークを使用している場合、i18nextのような国際化ライブラリが内部でこのAPIを利用していることが多いです。まずはAPIの仕組みを理解しておくと、ライブラリのカスタマイズやバグ調査が非常にスムーズになります。まずは小さなメッセージの出し分けから試してみてください。