Prompt
i18nで煩雑と思う点といえば、やっぱりキーを定義しなければならないこと。
これの対抗策はないの?
i18n(国際化)における「キーの定義」は、開発のテンポを削ぐ最大の要因の一つだよね。「本文を書きたいだけなのに、なぜ別ファイルの JSON を開いて WELCOME_MESSAGE_B みたいな名前を考えなきゃいけないんだ!」という君のストレスは、現代のフロントエンド開発において非常に一般的なものだよ。
この「キー定義の煩雑さ」に対する対抗策は、「キーを抽象化して隠す」 か 「キーそのものを本文にする」 かの 2 つの大きなトレンドがあるんだ。情報工学的なアプローチで解剖してみよう!
1. 対抗策 A:本文をキーにする(gettext 方式)
伝統的な GNU gettext に近い考え方で、「デフォルト言語(例えば日本語や英語)の文章そのものをキーにしてしまう」 手法だ。
-
仕組み:
t("こんにちは、世界!")とコードに直接書く。 -
メリット: * 意味のない
JSONキー(HOME_TITLEなど)を考えなくて済む。- コードを読むだけで、どんな文言が表示されるか一目でわかる。
-
ツール例:
react-i18nextなどでも設定次第で可能だし、i18next-extractを使えばコード内の文字列を自動で抽出して翻訳用 JSON を生成してくれる。
2. 対抗策 B:型安全な自動生成(i18n-ally / Typed i18n)
君が Next.js や TypeScript を使っているなら、「エディタにキー定義を肩代わりさせる」 のが最もスマートな解決策かもしれない。
-
i18n-ally (VSCode 拡張機能):
JSON ファイルを開かなくても、ソースコード上で直接翻訳を編集できる。エディタが JSON とコードを紐付けてくれるから、実質的に「キーを意識せず本文を打っている」感覚になれるんだ。
-
TypeScript による補完:
JSON の構造から型を自動生成すれば、キー名を打つ時に強力な補完が効く。「適当なキーを打ってエラーになる」ストレスが激減するよ。
3. 次世代の決定版:i18n ライブラリの「ゼロ・コンフィグ」化
最近のトレンドは、「ランタイムで解決するのではなく、ビルド時に解決する」 方向に進んでいるよ。
paraglide-js (by inlang)
これが今、最も「キー定義の煩雑さ」への回答に近いかもしれない。
-
特徴: ライブラリ側が「型安全な関数」を自動生成してくれる。
-
体験:
m.hello_world()のように呼び出すだけで、定義がない場合はエディタが警告し、クイックフィックスでその場で文言を追加できる。
4. 見落とされがちな視点:AI による自動命名
君が「名前空間に名前を増やしたくない」という美学を持っているなら、「文章からハッシュ値を生成してキーにする」 あるいは 「AI (LLM) にキー命名と JSON への追記を丸投げする」 という自動化ラインを組むのも手だ。
-
コードに
t("保存して閉じる")と書く。 -
保存時(Git commit 前)にスクリプトが走り、
save_and_closeというキーを自動生成して JSON に放り込む。
これなら、君の手を汚さずに名前空間を整理できるよね。
豆知識:ICU Message Format
キーの定義以上に煩雑なのが、「{count} 個のアイテム」 のような複数形(Pluralization)や変数の埋め込みだよね。
これを解決するための標準規格が ICU Message Format。最近のライブラリ(FormatJS など)はこれに準拠していて、キーの中に論理を含めることができる。キーを増やす代わりに、1 つのキーを「賢く」することで、結果的に管理する名前の数を減らせるんだ。
結論
「キーを定義するのが面倒」なら、「デフォルト言語の文章をそのままキーとして扱う」 スタイルに舵を切るか、「i18n-ally などのツールで JSON 編集を隠蔽する」 のが、現状のベストプラクティスだよ!
次は、「Next.js プロジェクトで i18n-ally を導入して、JSON を一度も見ずに多言語対応を進める具体的な設定」 をやってみる?それとも、「本文をキーにする手法のデメリット(文章を変えるとキーも変わってしまう問題)とその回避策」 について深掘りしてみる?
Would you like me to recommend a specific lightweight i18n library for your Next.js project that minimizes manual key management?