◉RORK LABEN
●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SDK 58 — Beta が 09/15 から。stable の案内はまだなく、Expo Go でのプロジェクト実行は 09/03 からログインが必要です●WIDGET — iOS のウィジェットが本番ビルドだけ真っ黒になる原因を追った報告が出ています●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SDK 58 — Beta が 09/15 から。stable の案内はまだなく、Expo Go でのプロジェクト実行は 09/03 からログインが必要です●WIDGET — iOS のウィジェットが本番ビルドだけ真っ黒になる原因を追った報告が出ています●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…
記事一覧/開発ツール
⬡ 開発ツール/2026-07-13上級

「{n}件」で多言語が崩れる — CLDR複数形カテゴリとIntl.PluralRulesで数量表現を設計する

「1なら単数、それ以外は複数」という前提はロシア語やアラビア語で崩れます。CLDRの複数形カテゴリを地図として持ち、Intl.PluralRulesとi18nextで数量表現を正しく出すための実装を、個人開発の壁紙アプリを多言語化した経験からまとめました。

Rork585多言語化複数形Intl.PluralRulesi18next

✦ プレミアム記事

壁紙アプリを16言語に対応させて公開した数日後、ロシア語圏の方から「お気に入りの件数の表示がどこかおかしい」という短い報告が届きました。手元の iPhone を日本語と英語で確かめても、何も問題は起きません。

原因にたどり着くまで少し時間がかかりました。私は件数の表示を n === 1 ? "1 item" : n + " items" のような書き方で組んでいたのです。英語と日本語だけを見ていると、この分岐は永遠に正しく見えます。けれどロシア語では、2件と5件で語形が変わり、しかも21件はまた1件と同じ形に戻る。三項演算子の前提そのものが、その言語には存在していませんでした。

数量表現が言語ごとにどう分岐するのかを、CLDR の複数形カテゴリという地図で捉え直します。そのうえで Intl.PluralRules と i18next で正しい形を選ぶ実装を、手を動かしながら整理していきます。個人開発で作ったアプリを世界に出すとき、静かに読者を戸惑わせるこの落とし穴を、公開前に塞いでおきたいのです。

「1なら単数、それ以外は複数」が成り立たない言語

私たちが無意識に持っている「単数か複数か」という二分法は、英語という一つの言語の都合に過ぎません。世界の言語を見渡すと、数量の語形はもっと多様です。

日本語には文法上の複数形がありません。「1件」も「3件」も語形は変わらず、n を差し込むだけで済みます。英語は1のときだけ特別で、あとは同じ。ここまでなら三項演算子で足ります。

問題はその先です。ロシア語やウクライナ語は、末尾の桁によって三つの語形を使い分けます。ポーランド語も同様に複雑で、アラビア語にいたっては0・1・2・少数・多数・その他という六つの形を持ちます。「それ以外は複数」という一本の分岐では、これらの言語を一つも正しく表示できません。

つまり数量表現のバグは、開発者が読めない言語でだけ静かに起こります。手元の端末では再現しないため、レビューでも気づけません。だからこそ、言語ごとの規則を自分の頭ではなく、標準化された地図に委ねる設計が要ります。

CLDR の複数形カテゴリを地図として持つ

その地図が CLDR(Unicode Common Locale Data Repository)の複数形カテゴリです。CLDR は各言語の数量規則を、次の六つのカテゴリのいずれかへの写像として定義しています。

カテゴリ意味この形を使う代表的な言語
one単数に相当英語・ドイツ語・スペイン語(1のとき)
other既定・それ以外日本語・中国語・韓国語(常にこれ一つ)
few少数ロシア語・ポーランド語・チェコ語
many多数ロシア語・ポーランド語・アラビア語
two双数アラビア語・スロベニア語・ウェールズ語
zeroゼロアラビア語・ラトビア語

大切なのは、これらが数値そのものではなく「その言語における語形の区分」だという点です。ロシア語で21が one に分類されるのは直感に反しますが、規則を暗記する必要はありません。地図の役割は CLDR に任せ、私たちはカテゴリ名に対応する文言だけを用意すればよい、という分担にします。

日本語のように other しか持たない言語では、翻訳者は一つの文言だけを書けば済みます。カテゴリを増やすかどうかは言語側の事情であり、コード側は同じ呼び出しで吸収するのが理想です。

✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦ロシア語・アラビア語・ポーランド語で三項演算子の複数形が壊れる理由をCLDRの6カテゴリで説明
✦Intl.PluralRulesで正しい語形を選ぶ再利用可能なヘルパーとHermes環境でのフォールバック
✦基数と序数を取り違えないための実装と、崩れる言語を先に潰すテストの置き方
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

⬡ 開発ツール2026-10-15
EXPO_PUBLIC_ の値が、開発では読めて本番だけ undefined になる書き方を、変換結果で見分けます
API の URL が開発中は読めるのに、ビルドした途端に undefined になる。原因は process.env の書き方でした。babel-preset-expo の変換結果を開発・本番で並べ、置き換わる書き方と残ってしまう書き方を表にしました。
⬡ 開発ツール2026-10-13
リリース前に、書き出した Expo バンドルの中から自分の鍵を探してみる
ソースに鍵がなくても、出来上がったアプリの中に鍵が残ることがあります。Expo SDK 57 で実際に expo export を実行し、バンドルの中身を grep と 60 行ほどの Node スクリプトで調べて、見つかる鍵と見つからない鍵の違いを確かめました。
⬡ 開発ツール2026-10-07
日本語の見出しだけ太字にならない — Android で fontWeight が効かないときの切り分けと直し方
Rork で作ったアプリで、iPhone では太字なのに Android では日本語の見出しが細いままになる症状の切り分け記事です。原因の見分け方、fontFamily を重みごとに分ける直し方、確認用コードを載せています。