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 への追記を丸投げする」 という自動化ラインを組むのも手だ。

  1. コードに t("保存して閉じる") と書く。

  2. 保存時(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?