このページとあなたの好きなAIアシスタントを使ってドキュメントを要約します
バージョン履歴
- "Solid の useIntlayer API の使用法を直接プロパティアクセスに更新"v8.9.02026/5/4
- "initコマンドを追加"v7.5.92025/12/30
- "履歴の初期化"v5.5.102025/6/29
このページのコンテンツはAIを使用して翻訳されました。
英語の元のコンテンツの最新バージョンを見るこのドキュメントを改善するアイデアがある場合は、GitHubでプルリクエストを送信することで自由に貢献してください。
ドキュメントへのGitHubリンクドキュメントのMarkdownをクリップボードにコピー
Intlayerを使用してViteおよびVueウェブサイトを国際化する | 国際化(i18n)
目次
代替手段ではなく Interlayer を使用する理由
「vue-i18n」や「i18next」などの主要なソリューションと比較して、Intlayer は次のような統合された最適化を備えたソリューションです。
Intlayer は、コンポーネント レベルのコンテンツ スコープ、リアクティブな翻訳、および国際化のスケーリング (i18n) に必要なすべての機能を提供することにより、Vue と完全に連携するように最適化されています。
大量の JSON ファイルをページにロードするのではなく、必要なコンテンツのみをロードします。 Intlayer は、バンドルとページのサイズを最大 50% 削減するのに役立ちます。
アプリケーションのコンテンツのスコープを設定すると、大規模なアプリケーションの メンテナンスが容易になります。コンテンツ コードベース全体を確認するという精神的な負担を負うことなく、単一の機能フォルダーを複製または削除できます。さらに、Intlayer は完全に型指定されており、コンテンツの正確性を保証します。
コンテンツを同じ場所に配置すると、大規模言語モデル (LLM) によって 必要なコンテキストが削減されます。 Intlayer には、翻訳の欠落をテストする CLI、LSP、MCP などのツール スイートも付属しています。および agent skills により、AI エージェントの開発者エクスペリエンス (DX) がさらにスムーズになります。
AI プロバイダーの費用で、選択した LLM を使用して CI/CD パイプラインで自動化を変換します。 Intlayer は、コンテンツ抽出を自動化する コンパイラー と、バックグラウンドでの翻訳を支援する Web プラットフォーム も提供します。
大量の JSON ファイルをコンポーネントに接続すると、パフォーマンスと反応性の問題が発生する可能性があります。 Intlayer は、ビルド時のコンテンツの読み込みを最適化します。
Intlayer は単なる i18n ソリューションではなく、自己ホスト型 ビジュアル エディター と 完全な CMS を提供します。 リアルタイムで多言語コンテンツを管理できるようになり、翻訳者、コピーライター、その他のチーム メンバーとのコラボレーションがシームレスになります。コンテンツはローカルおよび/またはリモートに保存できます。
Vite と Vue アプリケーションに Intlayer をセットアップするステップバイステップガイド
GitHub の アプリケーションテンプレート を参照してください。
依存パッケージのインストール
npm を使って必要なパッケージをインストールします:
bashコードをコピーコードをクリップボードにコピー
--interactiveフラグはオプションです。AI エージェントの場合はintlayer-cli initを使用してください。このコマンドは環境を検出し、必要なパッケージをインストールします。例えば:
bashコードをコピーコードをクリップボードにコピー
Viteバンドラー(Vite bundler)とIntlayerを統合するためのViteプラグイン、およびユーザーの優先ロケールの検出、クッキー管理、URLリダイレクト処理のためのミドルウェアを含みます。
プロジェクトの設定
アプリケーションの言語を設定するための設定ファイルを作成します:
intlayer.config.tsコードをコピーコードをクリップボードにコピー
import { Locales, type IntlayerConfig } from "intlayer"; const config: IntlayerConfig = { internationalization: { locales: [ Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH, // 他のロケールを追加 ], defaultLocale: Locales.ENGLISH, }, }; export default config;この設定ファイルを通じて、ローカライズされたURL、ミドルウェアのリダイレクション、クッキー名、コンテンツ宣言の場所と拡張子、コンソールでのIntlayerログの無効化などを設定できます。利用可能なパラメータの完全なリストについては、設定ドキュメントを参照してください。
Vite設定にIntlayerを統合する
intlayerプラグインを設定に追加します。
vite.config.tsコードをコピーコードをクリップボードにコピー
import { defineConfig } from "vite"; import vue from "@vitejs/plugin-vue"; import { intlayer } from "vite-intlayer"; // https://vitejs.dev/config/ export default defineConfig({ plugins: [vue(), intlayer()], });intlayer()Viteプラグインは、IntlayerをViteと統合するために使用されます。これにより、コンテンツ宣言ファイルのビルドが保証され、開発モードでそれらを監視します。また、Viteアプリケーション内でIntlayerの環境変数を定義します。さらに、パフォーマンスを最適化するためのエイリアスも提供します。コンテンツを宣言する
翻訳を格納するためのコンテンツ宣言を作成および管理します:
src/helloWorld.content.tsコードをコピーコードをクリップボードにコピー
import { t, type Dictionary } from "intlayer"; const helloWorldContent = { key: "helloworld", content: { count: t({ en: "count is ", fr: "le compte est ", es: "el recuento es " }), edit: t({ en: "Edit <code>components/HelloWorld.vue</code> and save to test HMR", fr: "Éditez <code>components/HelloWorld.vue</code> et enregistrez pour tester HMR", es: "Edita <code>components/HelloWorld.vue</code> y guarda para probar HMR", }), checkOut: t({ en: "Check out ", ja: "チェックしてください ", fr: "Vérifiez ", es: "Compruebe ", }), officialStarter: t({ en: ", the official Vue + Vite starter", ja: ", 公式の Vue + Vite スターターです", fr: ", le starter officiel Vue + Vite", es: ", el starter oficial Vue + Vite", }), learnMore: t({ en: "Learn more about IDE Support for Vue in the ", ja: "Vue の IDE サポートについて詳しくは ", fr: "En savoir plus sur le support IDE pour Vue dans le ", es: "Aprenda más sobre el soporte IDE para Vue en el ", }), vueDocs: t({ en: "Vue Docs Scaling up Guide", ja: "Vue ドキュメント スケーリングアップガイド", fr: "Vue Docs Scaling up Guide", es: "Vue Docs Scaling up Guide", }), readTheDocs: t({ en: "Click on the Vite and Vue logos to learn more", fr: "Cliquez sur les logos Vite et Vue pour en savoir plus", es: "Haga clic en los logotipos de Vite y Vue para obtener más información", ja: "詳細を知るには、Vite と Vue のロゴをクリックしてください", }), }, } satisfies Dictionary; export default helloWorldContent;コンテンツ宣言は、
contentDirディレクトリ(デフォルトは./src)に含まれている限り、アプリケーションのどこにでも定義できます。また、コンテンツ宣言のファイル拡張子(デフォルトは.content.{json,ts,tsx,js,jsx,mjs,cjs,md,mdx,yaml,yml})に一致している必要があります。詳細については、コンテンツ宣言のドキュメントを参照してください。
コード内でIntlayerを利用する
Vueアプリケーション全体でIntlayerの国際化機能を利用するには、まずメインファイルでIntlayerのシングルトンインスタンスを登録する必要があります。このステップは非常に重要で、アプリケーション内のすべてのコンポーネントに国際化コンテキストを提供し、コンポーネントツリーのどこからでも翻訳にアクセスできるようにします。
コードをコピーコードをクリップボードにコピー
または、必要に応じて
installIntlayer(app)を関数として直接呼び出すこともできます:javascriptコードをコピーコードをクリップボードにコピー
メインのVueコンポーネントを作成し、
useIntlayerのコンポーザブルを使用することで、アプリケーション全体でコンテンツ辞書にアクセスできます。src/HelloWord.vueコードをコピーコードをクリップボードにコピー
アプリが既に存在する場合は、Intlayer Compilerとextract コマンドを使用して、数千のコンポーネントを数秒で変換できます。
Intlayerでのコンテンツへのアクセス
Intlayerは、コンテンツにアクセスするためのさまざまなAPIを提供しています:
コンポーネントベースの構文(推奨):
<myContent />または<Component :is="myContent" />の構文を使用して、Intlayerノードとしてコンテンツをレンダリングします。これはビジュアルエディターやCMSとシームレスに統合されます。文字列ベースの構文:
{{ myContent }}を使用して、ビジュアルエディターのサポートなしにプレーンテキストとしてコンテンツをレンダリングします。生のHTML構文:
<div v-html="myContent" />を使用して、Visual Editor のサポートなしでコンテンツを生の HTML としてレンダリングします。分割代入構文:
useIntlayerコンポーザブルはコンテンツを持つ Proxy を返します。この Proxy はリアクティビティを保ったままコンテンツにアクセスするために分割代入できます。const content = useIntlayer("myContent");と{{ content.myContent }}/<content.myContent />を使用します。- または
const { myContent } = useIntlayer("myContent");と{{ myContent }}/<myContent/>を使用してコンテンツを分割代入します。
コンテンツの言語を変更する
コンテンツの言語を変更するには、
useLocaleコンポーザブルが提供するsetLocale関数を使用します。この関数により、アプリケーションのロケールを設定し、それに応じてコンテンツを更新できます。言語を切り替えるコンポーネントを作成します:
src/components/LocaleSwitcher.vueコードをコピーコードをクリップボードにコピー
次に、このコンポーネントをApp.vueで使用します:
src/App.vueコードをコピーコードをクリップボードにコピー
アプリケーションにローカライズされたルーティングを追加する
Vueアプリケーションにローカライズされたルーティングを追加するには、通常、ロケールプレフィックス付きのVue Routerを使用します。これにより、各言語ごとにユニークなルートが作成され、SEOやSEOに適したURLに役立ちます。
例:
plaintextコードをコピーコードをクリップボードにコピー
まず、Vue Routerをインストールします:
bashコードをコピーコードをクリップボードにコピー
次に、ロケールベースのルーティングを処理するルーター設定を作成します:
src/router/index.tsコードをコピーコードをクリップボードにコピー
ルート名はルーター内でルートを識別するために使用されます。すべてのルートで一意である必要があり、競合を避け、適切なナビゲーションとリンクを保証します。
次に、main.jsファイルでルーターを登録します:
src/main.tsコードをコピーコードをクリップボードにコピー
次に、
App.vueファイルを更新してRouterViewコンポーネントをレンダリングします。このコンポーネントは現在のルートにマッチしたコンポーネントを表示します。src/App.vueコードをコピーコードをクリップボードにコピー
並行して、
intlayerProxyを使用してアプリケーションにサーバーサイドルーティングを追加することもできます。このプラグインは URL に基づいて現在のロケールを自動的に検出し、適切なロケール cookie を設定します。ロケールが指定されていない場合、プラグインはユーザーのブラウザ言語設定に基づいて最も適切なロケールを決定します。ロケールが検出されない場合、デフォルトロケールにリダイレクトされます。同時に、
intlayerProxyを使用してアプリケーションにサーバーサイドルーティングを追加することもできます。このプラグインはURLに基づいて現在のロケールを自動的に検出し、適切なロケールクッキーを設定します。ロケールが指定されていない場合、プラグインはユーザーのブラウザの言語設定に基づいて最適なロケールを判定します。ロケールが検出されない場合は、デフォルトのロケールにリダイレクトします。Intlayer v9 以降、
intlayerProxy()はintlayer()プラグインに直接バンドルされており、routing.enableProxyオプション(デフォルトはtrue)を通じてデフォルトで有効になっています。以下に示すように個別に登録することはオプションになりました — これは後方互換性と、プラグインの順序を制御する必要があるセットアップのために保持されています。routing.enableProxy: falseを設定してオプトアウトできます。v9 リリースノートを参照してください。vite.config.tsコードをコピーコードをクリップボードにコピー
import { defineConfig } from "vite"; import vue from "@vitejs/plugin-vue"; import { intlayer } from "vite-intlayer"; // https://vitejs.dev/config/ export default defineConfig({ plugins: [ vue(), intlayer({ proxy: { ignore: (req) => req.url?.startsWith("/api"), }, }), ], });ロケール変更時にURLを変更する
ユーザーが言語を変更したときにURLを自動的に更新するには、
LocaleSwitcherコンポーネントを Vue Router を使うように変更できます。src/components/LocaleSwitcher.vueコードをコピーコードをクリップボードにコピー
ヒント: SEOとアクセシビリティを向上させるために、ステップ10で示したように、ローカライズされたページへのリンクには
<a href="/fr/home" hreflang="fr">のようなタグを使用してください。これにより、検索エンジンは言語別のURLを正しく検出しインデックス化できます。SPAの動作を維持するためには、@click.preventでデフォルトのナビゲーションを防止し、useLocaleでロケールを変更し、Vue Routerを使ってプログラム的にナビゲートすることが可能です。htmlコードをコピーコードをクリップボードにコピー
HTMLの言語属性と方向属性を切り替える
アプリケーションが複数の言語をサポートしている場合、
<html>タグのlang属性とdir属性を現在のロケールに合わせて更新することが非常に重要です。これにより以下が保証されます:- アクセシビリティ: スクリーンリーダーや支援技術は、正しい
lang属性に依存してコンテンツを正確に発音し解釈します。 - テキストレンダリング:
dir(方向)属性は、テキストが適切な順序(例:英語は左から右、アラビア語やヘブライ語は右から左)で表示されることを保証し、読みやすさに不可欠です。 - SEO: 検索エンジンは
lang属性を使用してページの言語を判別し、適切なローカライズされたコンテンツを検索結果に表示します。
ロケールが変更された際にこれらの属性を動的に更新することで、すべての対応言語において一貫性がありアクセシブルなユーザー体験を保証します。
src/composables/useI18nHTMLAttributes.tsコードをコピーコードをクリップボードにコピー
このコンポーザブルは、
App.vueまたはグローバルコンポーネントで使用します。src/App.vueコードをコピーコードをクリップボードにコピー
- アクセシビリティ: スクリーンリーダーや支援技術は、正しい
ローカライズされたリンクコンポーネントの作成
アプリケーションのナビゲーションが現在のロケールを尊重するようにするために、カスタムの
Linkコンポーネントを作成できます。このコンポーネントは内部のURLに自動的に現在の言語をプレフィックスとして付加します。例えば、フランス語を話すユーザーが「About」ページへのリンクをクリックすると、/aboutではなく/fr/aboutにリダイレクトされます。この動作は以下の理由で有用です:
- SEOとユーザーエクスペリエンス:ローカライズされたURLは、検索エンジンが言語別のページを正しくインデックスし、ユーザーに好みの言語でコンテンツを提供するのに役立ちます。
- 一貫性:アプリケーション全体でローカライズされたリンクを使用することで、ナビゲーションが現在のロケール内に留まり、予期しない言語の切り替えを防ぎます。
- 保守性: ローカリゼーションのロジックを単一のコンポーネントに集約することで、URLの管理が簡素化され、アプリケーションの成長に伴いコードベースの保守や拡張が容易になります。
src/components/Link.vueコードをコピーコードをクリップボードにコピー
Vue Routerで使用する場合は、ルーター専用のバージョンを作成します:
src/components/RouterLink.vueコードをコピーコードをクリップボードにコピー
これらのコンポーネントをアプリケーションで使用します:
src/App.vueコードをコピーコードをクリップボードにコピー
コンポーネントのコンテンツを抽出する
オプション既存のコードベースがある場合、数千ものファイルを変換するのは時間がかかる場合があります。
このプロセスを容易にするために、Intlayerはコンポーネントを変換し、コンテンツを抽出するための コンパイラ / エクストラクター を提供しています。
セットアップするには、
intlayer.config.tsファイルにcompilerセクションを追加できます。intlayer.config.tsコードをコピーコードをクリップボードにコピー
import { type IntlayerConfig } from "intlayer"; const config: IntlayerConfig = { // ... その他の設定 compiler: { /** * コンパイラを有効にするかどうかを指定します。 */ enabled: true, /** * 出力ファイルのパスを定義します */ output: ({ fileName, extension }) => `./${fileName}${extension}`, /** * 変換後にコンポーネントを保存するかどうかを指定します。 * * - `true` の場合、コンパイラはディスク上のコンポーネントファイルを書き換えます。これにより変換は永続的になり、次回のプロセスでは変換をスキップします。その方法で、コンパイラがアプリを変換した後に、コンパイラを削除することができます。 * * - `false` の場合、コンパイラはビルド出力のコードにのみ `useIntlayer()` 関数の呼び出しを注入し、元のコードベースはそのまま維持します。変換はメモリ内でのみ行われます。 */ saveComponents: false, /** * 辞書キーのプレフィックス */ dictionaryKeyPrefix: "", }, }; export default config;エクストラクターを実行して、コンポーネントを変換しコンテンツを抽出します
bashコードをコピーコードをクリップボードにコピー
Since v9, the
intlayerCompileris included in theintlayerplugin. So you don't need to add it manually.vite.config.tsを更新してintlayerCompilerプラグインを含めます:vite.config.tsコードをコピーコードをクリップボードにコピー
bashコードをコピーコードをクリップボードにコピー
(任意)サイトマップと robots.txt(ビルド時生成)
Intlayer は generateSitemap と getMultilingualUrls により、クローラ向けに整形した多言語の sitemap.xml と robots.txt を public/ に自動で書き出せます。通常は Vite より前に小さな Node スクリプトを走らせます(例: npm の predev / prebuild)。
サイトマップ
Intlayer のサイトマップ生成はロケール設定を踏まえ、クローラ向けのメタデータを含めます。
生成されるサイトマップはxhtml:link(hreflang)をサポートします。単純な URL 列挙ではなく、各ページの言語版同士を双方向で結びます(例:/about、/fr/about、/about?lang=frなどルーティングに依存)。
Robots.txt
getMultilingualUrls で Disallow を、機微パスのすべての言語 URLに効かせます。
1. プロジェクトルートに generate-seo.mjs を置く
コードをクリップボードにコピー
intlayer がインストールされている必要があります。本番では環境変数 SITE_URL を設定してください(CI など)。
Node の ESM ではgenerate-seo.mjsを推奨します。generate-seo.jsにする場合はpackage.jsonの"type": "module"などで ESM を有効にしてください。
2. Vite より前にスクリプトを実行する
コードをクリップボードにコピー
pnpm や yarn を使う場合はコマンドを読み替えてください。CI から呼び出しても構いません。
TypeScriptの設定
Intlayerはモジュール拡張(module augmentation)を使用してTypeScriptの利点を活用し、コードベースをより強固にします。


TypeScriptの設定に、自動生成された型が含まれていることを確認してください。
コードをクリップボードにコピー
Gitの設定
Intlayerによって生成されたファイルを無視することをお勧めします。これにより、それらをGitリポジトリにコミットすることを避けることができます。
これを行うには、.gitignoreファイルに以下の指示を追加できます。
コードをクリップボードにコピー
VS Code 拡張機能
Intlayer での開発体験を向上させるために、公式の Intlayer VS Code Extension をインストールできます。
この拡張機能は以下の機能を提供します:
- 翻訳キーの オートコンプリート。
- 不足している翻訳の リアルタイムエラー検出。
- 翻訳済みコンテンツの インラインプレビュー。
- 翻訳を簡単に作成・更新するための クイックアクション。
拡張機能の使用方法の詳細については、Intlayer VS Code Extension ドキュメントを参照してください。
さらに進むために
さらに進むには、ビジュアルエディターを実装するか、CMSを使用してコンテンツを外部化することができます。
よくある質問
vue-i18n: リファレンスライブラリで、メッセージカタログがグローバルに登録され、ICU スタイルのフォーマットに対応しています。メッセージの名前空間化の方法がないため、ページはすべてのカタログをバンドルし、アプリがページを追加するにつれてバンドルサイズが増え続けます。Intlayer: 最も高度なソリューションです。コードベースのどこにでもコンテンツを宣言でき(各コンポーネントの隣またはセントラライズ)、ビルド時に Vite プラグインでコンパイルされ、完全に型付けされ、AI 翻訳、ビジュアルエディタ、CMS を備えています。
実際の違いはスコープと型付けです。vue-i18n はキーを実行時に文字列として解決するため、キーの名前変更は静かに失敗しますが、Intlayer は宣言から型を生成し、コンポーネントが使用しないコンテンツを削除します。Intlayer を選ぶ理由と Vue i18n ベンチマークを参照してください。
はい、2 つのパスがあります。vue-i18n 移行ガイドでコンテンツを段階的に移行できます。または、現在の API を完全に保持できます。互換性アダプタは vue-i18n と同じ API を公開しますが、Intlayer 辞書によって提供されるため、インポートは変わりますがコンポーネントコードは変わりません。
はい。sync JSON プラグインは /messages/{locale}/{namespace}.json ファイルを信頼できるソースとして保持し、双方向で Intlayer 辞書を生成します。sync PO プラグインは gettext カタログに対して同じことを行い、ロケールごとのファイルではロケールを 1 つのファイルにグループ化する代わりに、言語ごとにコンテンツを分割できます。
いいえ。npx intlayer extract を実行すると、Intlayer はコンポーネントを読み取り、ユーザーに見える文字列を抽出し、各コンポーネントの隣に .content ファイルを書き込むため、文字列をカタログに 1 つずつコピーする代わりに diff をレビューできます。このガイドのステップ 11 でそれについて説明しています。
完全に自動化されたパイプラインの場合、Intlayer Compiler はビルド時に同じことを行います。変更のたびに JSX、TSX、Vue、Svelte ソースをスキャンし、辞書を生成し、hot module replacement を通じて同期を保つため、手動で保守するキーはまったくありません。
コンパイラをオンにする前に知っておく価値のある 2 つの制限があります。静的分析によって機能するため、API エラーコードや CMS フィールドなど、実行時にのみ存在する文字列は到達不可能なままです。また、className="active" やステータスコードなどのアプリケーションロジックからユーザーに見える文字列を区別する必要があり、大規模なコードベースではいくつかのアノテーションが必要です。extract コマンドはループに保つことでその両方を回避します。
5 つあり、すべてオプションです。
- VS Code 拡張機能:
useIntlayerキーからそれを宣言するコンテンツファイルにジャンプし、コンポーネントからコンテンツを抽出し、コマンドパレットまたは専用の Intlayer タブからビルド、fill、test、push、pull を実行します。 - LSP サーバー: LSP を話す任意のエディタで同じ認識を提供し、定義へのジャンプ、すべての参照を検索、翻訳値のホバープレビュー、キーとフィールドのオートコンプリート、キーが宣言されていない場合の警告があります。また、
i18next、react-i18next、next-intl、use-intl呼び出しを解決し、移行中に役立ちます。 - MCP サーバー: Intlayer ドキュメントと CLI を Cursor、VS Code、Claude Desktop、Claude Code、ChatGPT に公開し、アシスタントが推測する代わりに現在のドキュメントから回答でき、
intlayer fillなどのコマンドを自分で実行できます。 - エージェントスキル:
intlayer-config、intlayer-cli、intlayer-contentなどの焦点を絞ったスキル、およびフレームワークごとに 1 つ、エージェントにルーティング設定とコンテンツノードタイプを教えます。 - ESLint プラグイン:
no-raw-textはハードコードされた文字列にフラグを立て、静的辞書キーと未使用コンテンツのさらなるルールがあります。
