このページとあなたの好きなAIアシスタントを使ってドキュメントを要約します
バージョン履歴
- "Init history"v8.13.02026/6/5
このページのコンテンツはAIを使用して翻訳されました。
英語の元のコンテンツの最新バージョンを見るIf you have an idea for improving this documentation, please feel free to contribute by submitting a pull request on GitHub.
GitHub link to the documentationCopy doc Markdown to clipboard
next-intlからIntlayerへの移行
なぜnext-intlからIntlayerに移行するのか?
巨大なJSONファイルをページに読み込む代わりに、必要なコンテンツのみをロードします。Intlayerは、バンドルとページのサイズを最大50%削減するのに役立ちます。
アプリケーションのコンテンツをスコープ化することで、大規模なアプリケーションのメンテナンスが容易になります。機能フォルダ全体を複製または削除しても、すべてのコンテンツコードベースを確認するという精神的負担がありません。さらに、Intlayerはコンテンツの正確性を確保するために完全に型付けされています。
また、Intlayerはi18nエコシステムの中で最も活発に開発されているソリューションでもあります。問題は迅速に修正され、新しいフレームワークアダプタが定期的に登場し、コアAPIは実際の運用フィードバックに基づいて継続的に改良されています。
AIプロバイダーのコストで、お好みのLLMを使用してCI/CDパイプライン内で翻訳を自動化できます。Intlayerは、コンテンツ抽出を自動化するためのコンパイラや、バックグラウンドでの翻訳を支援するウェブプラットフォームも提供しています。
コンポーネントに巨大なJSONファイルを接続すると、パフォーマンスやリアクティビティの問題が発生する可能性があります。Intlayerはビルド時にコンテンツのロードを最適化します。
移行戦略
既存のアプリケーションに推奨されるアプローチは互換性アダプターです:@intlayer/next-intlをインストールします。これはnext-intlと全く同じAPIを公開しますが、裏側ですべての翻訳作業をIntlayerに委譲します。
既存のuseTranslations、getTranslations、NextIntlClientProviderなどはそのまま保持されます — 変更するのはインポートパスのみです。呼び出しシグネチャ、プロパティの形、コンポーネント構造のリファクタリングは不要です。
将来的には、オプションとして個々のファイルをよりリッチなIntlayerの.content.ts形式に移行し、ビジュアルエディタ、CMS、コンポーネントレベルのコンテンツスコープを利用できるようにすることができます — ただし、このステップは完全にオプションであり、徐々に行うことができます。
目次
クイック移行
以下の手順は、コードを変更せずに既存のnext-intlアプリをIntlayer上で実行するために必要な最小限のステップです。
依存関係のインストール
Intlayerのコアパッケージと互換性アダプター
@intlayer/next-intlをインストールします:bashコードをコピーコードをクリップボードにコピー
npm install intlayer next-intlayer @intlayer/next-intl @intlayer/sync-json-pluginnpx intlayer initnext-intlはインストールしたままにしておいてください — URLルーティング (createNavigation、createMiddleware、Link、redirect、usePathname、useRouter) のために引き続き必要です。互換性アダプターはルーティングレイヤーを置き換えません。Intlayerの設定
intlayer initコマンドにより、初期のintlayer.config.tsファイルが作成されます。既存のロケールに合わせて設定を更新し、syncJSONプラグインがメッセージファイルを指すようにします:intlayer.config.tsコードをコピーコードをクリップボードにコピー
import { Locales, type IntlayerConfig } from "intlayer"; import { syncJSON } from "@intlayer/sync-json-plugin"; const config: IntlayerConfig = { internationalization: { locales: [ Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH, // 既存のすべてのロケールをここに追加します ], defaultLocale: Locales.ENGLISH, }, plugins: [ syncJSON({ // 'icu'はnext-intlのICUプレースホルダー構文 {name}, {count, plural, ...} に一致させます format: "icu", source: ({ locale }) => `./messages/${locale}.json`, location: "messages", }), ], }; export default config;sourceはロケールをそのJSONファイルのパスにマッピングします。locationはIntlayerウォッチャーに変更を監視するフォルダを指示します。format: 'icu'オプションは、{name}や{count, plural, one {# item} other {# items}}のようなICUプレースホルダーが正しく解析されることを保証します。利用可能なすべての設定オプションについては、設定ドキュメントを参照してください。
IntlayerプラグインをNext.jsに追加する
既存のNext.js設定を
@intlayer/next-intl/pluginのcreateNextIntlPluginでラップします。このラッパーはwithIntlayerを合成しつつ、next-intl→@intlayer/next-intlのエイリアスを登録します:next.config.tsコードをコピーコードをクリップボードにコピー
import type { NextConfig } from "next"; import { createNextIntlPlugin } from "@intlayer/next-intl/plugin"; const withIntlayer = createNextIntlPlugin(); const nextConfig: NextConfig = { /* 既存の設定オプション */ }; export default withIntlayer(nextConfig);createNextIntlPlugin()はwithIntlayerをラップし、WebpackまたはTurbopackを自動検出して、コンテンツ監視や辞書のコンパイルをフックアップし、最も重要なこととしてモジュールエイリアスを注入します。これにより、既存のimport … from 'next-intl'への呼び出しがビルド時に透過的に@intlayer/next-intlにリダイレクトされます。next-intl/routingのエントリは実際のパッケージを指し続けます。ソースファイルの変更は不要です。通常の
next-intlayer/serverのwithIntlayerを使用したい場合は、辞書はコンパイルされますがエイリアスは追加されません — その場合、インポートを手動で@intlayer/next-intlに変更する必要があります(ステップ4を参照)。getRequestConfigやloadMessagesは不要になります。next-intlでは、リクエストごとにgetRequestConfigを介してJSONメッセージバンドルを読み込むsrc/i18n.tsファイルを作成する必要がありました。Intlayerはすべての辞書をビルド時にコンパイルするため、実行時のロードステップはありません。このファイルは完全に削除できます(引き続きcreateNavigationを使用する場合は、ルーティングの部分だけを残してください)。
これでクイック移行は完了です。アプリはすべてのnext-intlのインポートとAPIを保持したまま、Intlayer上で動作するようになります。
型付けされた翻訳キー — 自動的に。 Intlayerが辞書をコンパイルすると、
useTranslationsとgetTranslationsは実際のコンテンツに対して型付けされます。キーはIDEでオートコンプリートされ、無効なパスはビルド時にTypeScriptエラーを引き起こします — 追加の設定は必要ありません。tsxコードをコピーコードをクリップボードにコピー
// クライアントコンポーネント — 'about' は登録済みの辞書のキーですconst t = useTranslations("about");t("counter.label"); // ✓ オートコンプリートt("does.not.exist"); // ✗ TypeScript エラー// サーバーコンポーネントconst t = await getTranslations("about");t("counter.label"); // ✓ 型付け済み
完全移行
以下のステップはオプションであり、段階的に行うことができます。これにより、ビジュアルエディタ、CMS、型付けされたコンテンツファイル、AIを利用した翻訳自動化など、Intlayerの全機能が解放されます。
インポートの明示的な変更(オプション)
オプションcreateNextIntlPlugin()ラッパーは既にバンドラレベルでのnext-intl→@intlayer/next-intlのエイリアス化を処理しています。ソースファイル内で依存関係を明示的にしたい場合(および代わりに通常のwithIntlayerプラグインを使用する場合)、手動でインポート名を変更できます:テーブルのすべての内容を表示テーブルをモーダルで開き、すべてのデータを明確に表示
変更前 変更後 import { useTranslations } from 'next-intl'import { useTranslations } from '@intlayer/next-intl'import { useLocale } from 'next-intl'import { useLocale } from '@intlayer/next-intl'import { NextIntlClientProvider } from 'next-intl'import { NextIntlClientProvider } from '@intlayer/next-intl'import { getTranslations } from 'next-intl/server'import { getTranslations } from '@intlayer/next-intl/server'import { getLocale } from 'next-intl/server'import { getLocale } from '@intlayer/next-intl/server'import { setLocale } from 'next-intl/server'import { setLocale } from '@intlayer/next-intl/server'import { getMessages } from 'next-intl/server'import { getMessages } from '@intlayer/next-intl/server'実際の
next-intlからのルーティングのインポートは常に保持してください — 互換性アダプターはURLルーティングレイヤーを置き換えません:tsコードをコピーコードをクリップボードにコピー
// ✅ これらは常に本物の 'next-intl' から維持するimport { createNavigation } from "next-intl/routing";import { createMiddleware } from "next-intl/server";import { defineRouting } from "next-intl/routing";または、
@intlayer/next-intl/routingからdefineRoutingを使用することで、intlayer.config.tsのロケール設定を自動的にマージすることができます。AIを利用した翻訳自動化の有効化
オプションIntlayerが設定されたら、CLIを使用して、お好みのLLMを使用し不足している翻訳を自動入力することができます:
bashコードをコピーコードをクリップボードにコピー
# 不足している翻訳をテスト(CIに追加)npx intlayer test# 不足している翻訳をAIで埋めるnpx intlayer fill.envファイルにOPENAI_API_KEY(またはお好みのプロバイダーのキー)を追加し、intlayer.config.tsを拡張します:intlayer.config.tsコードをコピーコードをクリップボードにコピー
import { Locales, type IntlayerConfig } from "intlayer"; import { syncJSON } from "@intlayer/sync-json-plugin"; const config: IntlayerConfig = { internationalization: { locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH], defaultLocale: Locales.ENGLISH, }, plugins: [ syncJSON({ format: "icu", source: ({ locale }) => `./messages/${locale}.json`, location: "messages", }), ], ai: { apiKey: process.env.OPENAI_API_KEY, // provider: "openai", // デフォルト // model: "gpt-4o-mini", // デフォルト }, }; export default config;利用可能なすべてのオプションについては、Intlayer CLIドキュメントを確認してください。
移行後に削除できるもの
@intlayer/next-intlが導入されると、以下のnext-intlのボイラープレートコードは削除できます:
テーブルをモーダルで開き、すべてのデータを明確に表示
| ファイル / パターン | 不要になる理由 |
|---|---|
src/i18n.ts内のgetRequestConfigのエクスポート | Intlayerはビルド時に辞書をコンパイルします。リクエストごとのメッセージロードはありません。ファイルはcreateNavigationルーティングヘルパーをエクスポートしている場合のみ保持してください。 |
レイアウトでのloadMessages() / getMessages()呼び出し | @intlayer/next-intlのNextIntlClientProviderはコンパイルされた出力を読み取ります。messagesプロップは不要です。 |
レイアウトでのlocales/{locale}/*.jsonのインポート | JSONバンドルは、syncJSONプラグインを使用している場合にのみ必要です。.content.tsファイルに移行したら、JSONフォルダを削除できます。 |
さらに進める準備ができたら、Intlayerはコードベース内のどこにある.content.tsおよび.content.jsonファイルでも自動的に検出します(デフォルトでは./src内)。about.content.tsファイルをabout/page.tsxのすぐ隣に配置するだけで、追加の設定なしでビルド時にIntlayerがそれを取得します — インポート、登録、中央のインデックスファイルは不要です。これにより、ページやコンポーネントとの翻訳のコロケーションが完全にシームレスになります。
TypeScriptの設定
Intlayerはモジュール拡張を使用して、翻訳キーに対する完全なTypeScriptのIntelliSense(自動補完)を提供します。tsconfig.jsonに自動生成された型が含まれていることを確認してください:
コードをクリップボードにコピー
{ // ... 既存のTypeScript設定 "include": [ // ... 既存のTypeScript設定 ".intlayer/**/*.ts", // 自動生成された型を含める ],}Git設定
Intlayerによって生成されたディレクトリを.gitignoreに追加します:
コードをクリップボードにコピー
# Intlayer生成ファイルを無視.intlayerさらに詳しく
- ビジュアルエディタ — ブラウザ上で翻訳を視覚的に管理:Intlayer Visual Editor
- CMS — コンテンツを外部化してリモートで管理:Intlayer CMS
- VS Code拡張機能 — 翻訳の自動補完とエラー検出をリアルタイムで取得:Intlayer VS Code Extension
- CLIリファレンス — コマンドの完全なリスト:Intlayer CLI
- Next.jsとIntlayer — Next.jsの完全なセットアップガイド:intlayerwithnextjs_16.md