ホームサンドボックスショーケースアプリ文書ブログ
    • English英語
      EN
    • русскийロシア語
      RU
    • 日本語日本語
      JA
    • françaisフランス語
      FR
    • 한국어韓国語
      KO
    • 中文中国語
      ZH
    • españolスペイン語
      ES
    • Deutschドイツ語
      DE
    • العربيةアラビア語
      AR
    • italianoイタリア語
      IT
    • British Englishイギリス英語
      EN-GB
    • portuguêsポルトガル語
      PT
    • हिन्दीヒンディー語
      HI
    • Türkçeトルコ語
      TR
    • polskiポーランド語
      PL
    • Indonesiaインドネシア語
      ID
    • Tiếng Việtベトナム語
      VI
    • українськаウクライナ語
      UK
    /
    フレームワークでドキュメントをフィルター
    Alt+←
    なぜIntlayer?
    始める
    コンセプト
    • Intlayerの仕組み
    • 設定
    • TestFillBuildWatchExtractLoginPushPullConfigurationListVersionEditorLiveDebugDoc ReviewDoc TranslateSDK
    • ビジュアルエディター
    • CMS
    • CI/CD統合
    • 翻訳複数形列挙条件性別挿入ファイルネスティングMarkdownHTML関数取得
    • ロケールごとのファイル
    • コンパイラー
    • 自動入力
    • テスト
    • バンドル最適化
    環境
    • Next.js 14とApp Router
      Next.js 15
      Next.js ロケールなし URL
      Next.jsとページルーター
      コンパイラ
    • Tanstack Start Solid
    • AstroおよびReact
      AstroおよびSvelte
      AstroおよびVue
      AstroおよびSolid
      AstroおよびPreact
      AstroおよびLit
      AstroおよびVanilla JS
    • React Router v7
      React Router v7 (fs-routes)
      Compiler
    • NuxtおよびVue
    • ViteおよびSolid
    • SvelteKit
    • ViteおよびPreact
    • ViteおよびVanilla JS
    • ViteおよびLit
    • Angular 19 (Webpack)
      Analog
    • React CRA
    • React NativeとExpo
    • Express.js
      NestJS
      Fastify
      Hono
      Adonis
    • LynxおよびReact
    Plugins
    • JSON
    • gettext (.po)
    VS Code拡張機能
    エージェント
    • MCPサーバー
    • エージェントのスキル
    リリース
    • v8
    • v7
    • v6
    ベンチマーク
    • Next.js
    • TanStack
    • Vue
    • Solid
    • Svelte
    ブログ
    質問をする
    1. Documentation
    2. 環境
    3. ViteおよびVue
    \n\n\n```\n\n#### Intlayerでのコンテンツへのアクセス\n\nIntlayerは、コンテンツにアクセスするためのさまざまなAPIを提供しています:\n\n- **コンポーネントベースの構文**(推奨):\n `` または `` の構文を使用して、Intlayerノードとしてコンテンツをレンダリングします。これは[ビジュアルエディター](/ja/doc/concept/editor)や[CMS](/ja/doc/concept/cms)とシームレスに統合されます。\n\n- **文字列ベースの構文**:\n `{{ myContent }}` を使用して、ビジュアルエディターのサポートなしにプレーンテキストとしてコンテンツをレンダリングします。\n\n- **生のHTML構文**:\n `
    ` を使用して、Visual Editor のサポートなしでコンテンツを生の HTML としてレンダリングします。\n\n- **分割代入構文**:\n `useIntlayer` コンポーザブルはコンテンツを持つ Proxy を返します。この Proxy はリアクティビティを保ったままコンテンツにアクセスするために分割代入できます。\n - `const content = useIntlayer(\"myContent\");` と `{{ content.myContent }}` / `` を使用します。\n - または `const { myContent } = useIntlayer(\"myContent\");` と `{{ myContent }}` / `` を使用してコンテンツを分割代入します。\n\n> アプリケーションが既に存在する場合は、[Intlayer コンパイラ](/ja/doc/compiler) と [抽出コマンド](/ja/doc/concept/cli/extract) を組み合わせて、1 秒で何千ものコンポーネントを変換できます。\n\n### (オプション)ステップ6: コンテンツの言語を変更する\n\nコンテンツの言語を変更するには、`useLocale` コンポーザブルが提供する `setLocale` 関数を使用します。この関数により、アプリケーションのロケールを設定し、それに応じてコンテンツを更新できます。\n\n言語を切り替えるコンポーネントを作成します:\n\n```vue fileName=\"src/components/LocaleSwitcher.vue\"\n\n\n\n```\n\n次に、このコンポーネントをApp.vueで使用します:\n\n```vue fileName=\"src/App.vue\"\n\n\n\n```\n\n### (オプション)ステップ7: アプリケーションにローカライズされたルーティングを追加する\n\nVueアプリケーションにローカライズされたルーティングを追加するには、通常、ロケールプレフィックス付きのVue Routerを使用します。これにより、各言語ごとにユニークなルートが作成され、SEOやSEOに適したURLに役立ちます。\n\n例:\n\n```plaintext\n- https://example.com/about\n- https://example.com/es/about\n- https://example.com/fr/about\n```\n\nまず、Vue Routerをインストールします:\n\n```bash packageManager=\"npm\"\nnpm install vue-router\nnpx intlayer init\n```\n\n```bash packageManager=\"pnpm\"\npnpm add vue-router\npnpm intlayer init\n```\n\n```bash packageManager=\"yarn\"\nyarn add vue-router\n```\n\n次に、ロケールベースのルーティングを処理するルーター設定を作成します:\n\n```js fileName=\"src/router/index.ts\"\nimport {\n localeFlatMap,\n type Locale,\n} from 'intlayer';\nimport { createIntlayerClient } from \"vue-intlayer\";\nimport { createRouter, createWebHistory } from 'vue-router';\nimport HomeView from './views/home/HomeView.vue';\nimport RootView from './views/root/Root.vue';\n\n/**\n * ロケール固有のパスとメタデータを持つルートを宣言します。\n */\nconst routes = localeFlatMap(({ urlPrefix, locale }) => [\n {\n path: `${urlPrefix}/`,\n name: `Root-${locale}`,\n component: RootView,\n meta: {\n locale,\n },\n },\n {\n path: `${urlPrefix}/home`,\n name: `Home-${locale}`,\n component: HomeView,\n meta: {\n locale,\n },\n },\n]);\n\n// ルーターインスタンスを作成\nexport const router = createRouter({\n history: createWebHistory(),\n routes,\n});\n\n// ロケール処理のためのナビゲーションガードを追加\nrouter.beforeEach((to, _from, next) => {\n const client = createIntlayerClient();\n\n const metaLocale = to.meta.locale as Locale;\n\n // ルートのメタに定義されたロケールを再利用\n client.setLocale(metaLocale);\n next();\n});\n```\n\n> ルート名はルーター内でルートを識別するために使用されます。すべてのルートで一意である必要があり、競合を避け、適切なナビゲーションとリンクを保証します。\n\n次に、main.jsファイルでルーターを登録します:\n\n```js fileName=\"src/main.ts\"\nimport { createApp } from \"vue\";\nimport App from \"./App.vue\";\nimport { router } from \"./router\";\nimport \"./style.css\";\n\nconst app = createApp(App);\n\n// アプリにルーターを追加\napp.use(router);\n\n// アプリをマウント\napp.mount(\"#app\");\n```\n\n次に、`App.vue` ファイルを更新して `RouterView` コンポーネントをレンダリングします。このコンポーネントは現在のルートにマッチしたコンポーネントを表示します。\n\n```vue fileName=\"src/App.vue\"\n\n\n\n```\n\n同時に、`intlayerProxy` を使用してアプリケーションにサーバーサイドルーティングを追加することもできます。このプラグインはURLに基づいて現在のロケールを自動的に検出し、適切なロケールクッキーを設定します。ロケールが指定されていない場合、プラグインはユーザーのブラウザの言語設定に基づいて最適なロケールを判定します。ロケールが検出されない場合は、デフォルトのロケールにリダイレクトします。\n\n```typescript {3,7} fileName=\"vite.config.ts\" codeFormat={[\"typescript\", \"esm\", \"commonjs\"]}\nimport { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\nimport { intlayer, intlayerProxy } from \"vite-intlayer\";\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n plugins: [\n intlayerProxy(), // should be placed first\n vue(),\n intlayer(),\n ],\n});\n```\n\n### (オプション)ステップ8: ロケール変更時にURLを変更する\n\nユーザーが言語を変更したときにURLを自動的に更新するには、`LocaleSwitcher` コンポーネントを Vue Router を使うように変更できます。\n\n```vue fileName=\"src/components/LocaleSwitcher.vue\"\n\n\n\n```\n\nヒント: SEOとアクセシビリティを向上させるために、ステップ10で示したように、ローカライズされたページへのリンクには `` のようなタグを使用してください。これにより、検索エンジンは言語別のURLを正しく検出しインデックス化できます。SPAの動作を維持するためには、@click.preventでデフォルトのナビゲーションを防止し、useLocaleでロケールを変更し、Vue Routerを使ってプログラム的にナビゲートすることが可能です。\n\n```html\n
      \n
    1. \n \n
      \n English\n 英語\n EN\n
      \n
      \n
    2. \n
    3. \n \n
      \n Español\n スペイン語\n ES\n
      \n \n
    4. \n
    \n```\n\n### (オプション)ステップ9:HTMLの言語属性と方向属性を切り替える\n\nアプリケーションが複数の言語をサポートしている場合、``タグの`lang`属性と`dir`属性を現在のロケールに合わせて更新することが非常に重要です。これにより以下が保証されます:\n\n- **アクセシビリティ**: スクリーンリーダーや支援技術は、正しい `lang` 属性に依存してコンテンツを正確に発音し解釈します。\n- **テキストレンダリング**: `dir`(方向)属性は、テキストが適切な順序(例:英語は左から右、アラビア語やヘブライ語は右から左)で表示されることを保証し、読みやすさに不可欠です。\n- **SEO**: 検索エンジンは `lang` 属性を使用してページの言語を判別し、適切なローカライズされたコンテンツを検索結果に表示します。\n\nロケールが変更された際にこれらの属性を動的に更新することで、すべての対応言語において一貫性がありアクセシブルなユーザー体験を保証します。\n\n```js fileName=\"src/composables/useI18nHTMLAttributes.ts\"\nimport { watch } from \"vue\";\nimport { useLocale } from \"vue-intlayer\";\nimport { getHTMLTextDir } from \"intlayer\";\n\n/**\n * 現在のロケールに基づいてHTMLの要素の`lang`および`dir`属性を更新するComposable。\n *\n * @example\n * // App.vueまたはグローバルコンポーネント内で\n * import { useI18nHTMLAttributes } from './composables/useI18nHTMLAttributes'\n *\n * useI18nHTMLAttributes()\n */\nexport const useI18nHTMLAttributes = () => {\n const { locale } = useLocale();\n\n // ロケールが変更されるたびにHTML属性を更新する\n watch(\n () => locale.value,\n (newLocale) => {\n if (!newLocale) return;\n\n // 言語属性を更新する\n document.documentElement.lang = newLocale;\n\n // テキストの方向を設定する(ほとんどの言語はltr、アラビア語やヘブライ語などはrtl)\n document.documentElement.dir = getHTMLTextDir(newLocale);\n },\n { immediate: true }\n );\n};\n```\n\nこのコンポーザブルは、`App.vue` またはグローバルコンポーネントで使用します。\n\n```vue fileName=\"src/App.vue\"\n\n\n\n```\n\n### (オプション)ステップ10:ローカライズされたリンクコンポーネントの作成\n\nアプリケーションのナビゲーションが現在のロケールを尊重するようにするために、カスタムの `Link` コンポーネントを作成できます。このコンポーネントは内部のURLに自動的に現在の言語をプレフィックスとして付加します。例えば、フランス語を話すユーザーが「About」ページへのリンクをクリックすると、`/about` ではなく `/fr/about` にリダイレクトされます。\n\nこの動作は以下の理由で有用です:\n\n- **SEOとユーザーエクスペリエンス**:ローカライズされたURLは、検索エンジンが言語別のページを正しくインデックスし、ユーザーに好みの言語でコンテンツを提供するのに役立ちます。\n- **一貫性**:アプリケーション全体でローカライズされたリンクを使用することで、ナビゲーションが現在のロケール内に留まり、予期しない言語の切り替えを防ぎます。\n- **保守性**: ローカリゼーションのロジックを単一のコンポーネントに集約することで、URLの管理が簡素化され、アプリケーションの成長に伴いコードベースの保守や拡張が容易になります。\n\n```vue fileName=\"src/components/Link.vue\"\n\n\n\n```\n\nVue Routerで使用する場合は、ルーター専用のバージョンを作成します:\n\n```vue fileName=\"src/components/RouterLink.vue\"\n\n\n\n```\n\nこれらのコンポーネントをアプリケーションで使用します:\n\n```vue fileName=\"src/App.vue\"\n\n\n\n```\n\n### (オプション)ステップ11:Markdownのレンダリング\n\nIntlayerは、Vueアプリケーション内でMarkdownコンテンツを直接レンダリングすることをサポートしています。デフォルトでは、Markdownはプレーンテキストとして扱われます。MarkdownをリッチなHTMLに変換するには、Markdownパーサーである[markdown-it](https://github.com/markdown-it/markdown-it)を統合できます。\n\nこれは、翻訳にリスト、リンク、強調などのフォーマットされたコンテンツが含まれる場合に特に便利です。\n\nデフォルトではIntlayerはMarkdownを文字列としてレンダリングしますが、`installIntlayerMarkdown`関数を使ってMarkdownをHTMLにレンダリングする方法も提供しています。\n\n> `intlayer`パッケージを使ってMarkdownコンテンツを宣言する方法については、[markdownドキュメント](https://github.com/aymericzip/intlayer/tree/main/docs/ja/dictionary/markdown.md)を参照してください。\n\n```ts fileName=\"main.ts\"\nimport MarkdownIt from \"markdown-it\";\nimport { createApp, h } from \"vue\";\nimport { installIntlayer, installIntlayerMarkdown } from \"vue-intlayer\";\n\nconst app = createApp(App);\n\napp.use(intlayer);\n\nconst md = new MarkdownIt({\n html: true, // HTMLタグを許可\n linkify: true, // URLを自動リンク化\n typographer: true, // スマートクォートやダッシュなどを有効化\n});\n\n// IntlayerにmarkdownをHTMLに変換する際にmd.render()を使うよう指示\ninstallIntlayerMarkdown(app, (markdown) => {\n const html = md.render(markdown);\n return h(\"div\", { innerHTML: html });\n});\n```\n\n登録が完了すると、コンポーネントベースの構文を使ってMarkdownコンテンツを直接表示できます:\n\n```vue\n\n\n\n```\n\n### TypeScriptの設定\n\nIntlayerはモジュール拡張を利用して、TypeScriptの利点を活かし、コードベースをより強固にします。\n\n![Autocompletion](https://github.com/aymericzip/intlayer/blob/main/docs/assets/autocompletion.png?raw=true)\n\n![Translation error](https://github.com/aymericzip/intlayer/blob/main/docs/assets/translation_error.png?raw=true)\n\nTypeScriptの設定に自動生成された型定義が含まれていることを確認してください。\n\n```json5 fileName=\"tsconfig.json\"\n{\n // ... 既存のTypeScript設定\n \"include\": [\n // ... 既存のTypeScript設定\n \".intlayer/**/*.ts\", // 自動生成された型定義を含める\n ],\n}\n```\n\n### Gitの設定\n\nIntlayerによって生成されたファイルは無視することを推奨します。これにより、それらのファイルをGitリポジトリにコミットするのを避けることができます。\n\nこれを行うには、以下の指示を`.gitignore`ファイルに追加してください。\n\n```bash\n# Intlayerによって生成されたファイルを無視する\n.intlayer\n```\n\n### VS Code拡張機能\n\nIntlayerでの開発体験を向上させるために、公式の**Intlayer VS Code拡張機能**をインストールできます。\n\n[VS Codeマーケットプレイスからインストール](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)\n\nこの拡張機能は以下を提供します:\n\n- 翻訳キーの**オートコンプリート**。\n- 欠落している翻訳の**リアルタイムエラー検出**。\n- 翻訳されたコンテンツの**インラインプレビュー**。\n- 翻訳を簡単に作成・更新できる**クイックアクション**。\n\n拡張機能の使用方法の詳細については、[Intlayer VS Code Extension ドキュメント](https://intlayer.org/doc/vs-code-extension)を参照してください。\n\n---\n\n### (オプション) ステップ 1 : コンポーネントのコンテンツを抽出する\n\n既存のコードベースがある場合、数千のファイルを変換するのは時間がかかることがあります。\n\nこのプロセスを容易にするために、Intlayerは、コンポーネントを変換しコンテンツを抽出するための [コンパイラ](/ja/doc/compiler) / [エクストラクタ](/ja/doc/concept/cli/extract) を提案しています。\n\nセットアップするには、`intlayer.config.ts` ファイルに `compiler` セクションを追加します。\n\n```typescript fileName=\"intlayer.config.ts\" codeFormat={[\"typescript\", \"esm\", \"commonjs\"]}\nimport { type IntlayerConfig } from \"intlayer\";\n\nconst config: IntlayerConfig = {\n // ... 他の構成\n compiler: {\n /**\n * コンパイラを有効にするかどうかを指定します。\n */\n enabled: true,\n\n /**\n * 出力ファイルのパスを定義します。\n */\n output: ({ fileName, extension }) => `./${fileName}${extension}`,\n\n /**\n * 変換後にコンポーネントを保存するかどうかを指定します。これにより、コンパイラを一度だけ実行してアプリを変換し、その後削除することができます。\n */\n saveComponents: false,\n\n /**\n * 辞書キーの接頭辞\n */\n dictionaryKeyPrefix: \"\",\n },\n};\n\nexport default config;\n```\n\n\n \n\nコンポーネントを変換してコンテンツを抽出するためにエクストラクタを実行します\n\n```bash packageManager=\"npm\"\nnpx intlayer extract\n```\n\n```bash packageManager=\"pnpm\"\npnpm intlayer extract\n```\n\n```bash packageManager=\"yarn\"\nyarn intlayer extract\n```\n\n```bash packageManager=\"bun\"\nbun x intlayer extract\n```\n\n \n \n\n`vite.config.ts` を更新して `intlayerCompiler` プラグインを含めます。\n\n```ts fileName=\"vite.config.ts\"\nimport { defineConfig } from \"vite\";\nimport { intlayer, intlayerCompiler } from \"vite-intlayer\";\n\nexport default defineConfig({\n plugins: [\n intlayer(),\n intlayerCompiler(), // コンパイラプラグインを追加します\n ],\n});\n```\n\n```bash packageManager=\"npm\"\nnpm run build # または npm run dev\n```\n\n```bash packageManager=\"pnpm\"\npnpm run build # または pnpm run dev\n```\n\n```bash packageManager=\"yarn\"\nyarn build # または yarn dev\n```\n\n```bash packageManager=\"bun\"\nbun run build # Or bun run dev\n```\n\n \n\n\n### (任意)サイトマップと robots.txt(ビルド時生成)\n\nIntlayer は `generateSitemap` と `getMultilingualUrls` により、クローラ向けに整形した多言語の `sitemap.xml` と `robots.txt` を `public/` に自動で書き出せます。通常は Vite より**前**に小さな Node スクリプトを走らせます(例: npm の `predev` / `prebuild`)。\n\n#### サイトマップ\n\nIntlayer のサイトマップ生成はロケール設定を踏まえ、クローラ向けのメタデータを含めます。\n\n> 生成されるサイトマップは `xhtml:link`(hreflang)をサポートします。単純な URL 列挙ではなく、各ページの言語版同士を双方向で結びます(例: `/about`、`/fr/about`、`/about?lang=fr` などルーティングに依存)。\n\n#### Robots.txt\n\n`getMultilingualUrls` で `Disallow` を、機微パスの**すべての言語 URL**に効かせます。\n\n#### 1. プロジェクトルートに `generate-seo.mjs` を置く\n\n```javascript fileName=\"generate-seo.mjs\"\nimport fs from \"fs\";\nimport path from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { generateSitemap, getMultilingualUrls } from \"intlayer\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nconst SITE_URL = (process.env.SITE_URL || \"http://localhost:5173\").replace(\n /\\/$/,\n \"\"\n);\n\nconst pathList = [\n { path: \"/\", changefreq: \"daily\", priority: 1.0 },\n { path: \"/about\", changefreq: \"monthly\", priority: 0.7 },\n];\n\nconst sitemapXml = generateSitemap(pathList, { siteUrl: SITE_URL });\nfs.writeFileSync(path.join(__dirname, \"public\", \"sitemap.xml\"), sitemapXml);\n\nconst getAllMultilingualUrls = (urls) =>\n urls.flatMap((url) => Object.values(getMultilingualUrls(url)));\n\nconst disallowedPaths = getAllMultilingualUrls([\"/admin\", \"/private\"]);\n\nconst robotsTxt = [\n \"User-agent: *\",\n \"Allow: /\",\n ...disallowedPaths.map((path) => `Disallow: ${path}`),\n \"\",\n `Sitemap: ${SITE_URL}/sitemap.xml`,\n].join(\"\\n\");\n\nfs.writeFileSync(path.join(__dirname, \"public\", \"robots.txt\"), robotsTxt);\n\nconsole.log(\"SEO files generated successfully.\");\n```\n\n`intlayer` がインストールされている必要があります。本番では環境変数 `SITE_URL` を設定してください(CI など)。\n\n> Node の ESM では `generate-seo.mjs` を推奨します。`generate-seo.js` にする場合は `package.json` の `\"type\": \"module\"` などで ESM を有効にしてください。\n\n#### 2. Vite より前にスクリプトを実行する\n\n```json fileName=\"package.json\"\n{\n \"scripts\": {\n \"dev\": \"vite\",\n \"prebuild\": \"node generate-seo.mjs\",\n \"build\": \"vite build\",\n \"preview\": \"vite preview\"\n }\n}\n```\n\npnpm や yarn を使う場合はコマンドを読み替えてください。CI から呼び出しても構いません。\n\n### さらに進むために\n\nさらに進むには、[ビジュアルエディター](/ja/doc/concept/editor)を実装するか、[CMS](/ja/doc/concept/cms)を使用してコンテンツを外部化することができます。\n\n---\n","about":"Vite と Vue のウェブサイトを多言語対応にする方法を紹介します。国際化(i18n)と翻訳のためのドキュメントに従ってください。","url":"https://intlayer.org/ja/doc/environment/vite-and-vue","datePublished":"18-04-2025","dateModified":"06-05-2026","keywords":"国際化, ドキュメント, Intlayer, Vite, Vue, JavaScript","license":"https://raw.githubusercontent.com/aymericzip/intlayer/refs/heads/main/LICENSE","audience":{"@type":"Audience","audienceType":"開発者、コンテンツマネージャー"}}
    作成:2025-04-18最終更新:2026-05-06
    GitHubでアプリケーションテンプレートを見る

    このページにはアプリケーションテンプレートが用意されています。

    ショーケースアプリケーションを見る

    このページはテンプレートのライブデモにリンクしています。

    ビデオチュートリアルを見る

    このページにはビデオチュートリアルがあります。

    このドキュメントをあなたの好きなAIアシスタントに参照してください
    ChatGPT
    Claude
    DeepSeek
    Google AI mode
    Gemini
    Perplexity
    Mistral
    Grok

    このページとあなたの好きなAIアシスタントを使ってドキュメントを要約します

    バージョン履歴

    1. "Solid の useIntlayer API の使用法を直接プロパティアクセスに更新"
      v8.9.02026/5/4
    2. "initコマンドを追加"
      v7.5.92025/12/30
    3. "履歴の初期化"
      v5.5.102025/6/29

    このページのコンテンツはAIを使用して翻訳されました。

    英語の元のコンテンツの最新バージョンを見る
    このドキュメントを編集

    このドキュメントを改善するアイデアがある場合は、GitHubでプルリクエストを送信することで自由に貢献してください。

    ドキュメントへのGitHubリンク
    コピー

    ドキュメントのMarkdownをクリップボードにコピー

    IntlayerでVite and Vueを翻訳する | 国際化(i18n)

    GitHub の アプリケーションテンプレート を参照してください。

    Intlayer とは?

    Intlayer は、最新のウェブアプリケーションにおける多言語対応を簡素化するために設計された革新的なオープンソースの国際化(i18n)ライブラリです。

    Intlayer を使うと、以下が可能です:

    • コンポーネントレベルで宣言的な辞書を使い、翻訳を簡単に管理できます。
    • メタデータ、ルート、コンテンツを動的にローカライズできます。
    • 自動生成された型により TypeScript サポートを確保し、オートコンプリートやエラー検出を向上させます。
    • 動的なロケール検出や切り替えなどの高度な機能を利用できます。

    Vite と Vue アプリケーションに Intlayer をセットアップするステップバイステップガイド

    www.youtube.com
    ide.intlayer.org
    intlayer-vite-vue-template.vercel.app

    GitHub の アプリケーションテンプレート を参照してください。

    ステップ 1: 依存パッケージのインストール

    npm を使って必要なパッケージをインストールします:

    bash
    コードをコピー

    コードをクリップボードにコピー

    npm install intlayer vue-intlayernpm install vite-intlayer --save-devnpx intlayer init
    • intlayer

      設定管理、翻訳、コンテンツ宣言、トランスパイル、およびCLIコマンドのための国際化ツールを提供するコアパッケージです。

    • vue-intlayer IntlayerをVueアプリケーションに統合するパッケージです。Vueの国際化のためのコンテキストプロバイダーとコンポーザブルを提供します。

    • vite-intlayer

    Viteバンドラー(Vite bundler)とIntlayerを統合するためのViteプラグイン、およびユーザーの優先ロケールの検出、クッキー管理、URLリダイレクト処理のためのミドルウェアを含みます。

    ステップ2: プロジェクトの設定

    アプリケーションの言語を設定するための設定ファイルを作成します:

    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ログの無効化などを設定できます。利用可能なパラメータの完全なリストについては、設定ドキュメントを参照してください。

    ステップ3: 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の環境変数を定義します。さらに、パフォーマンスを最適化するためのエイリアスも提供します。

    ステップ4: コンテンツを宣言する

    翻訳を格納するためのコンテンツ宣言を作成および管理します:

    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})に一致している必要があります。
    詳細については、コンテンツ宣言のドキュメントを参照してください。

    ステップ5: コード内でIntlayerを利用する

    Vueアプリケーション全体でIntlayerの国際化機能を利用するには、まずメインファイルでIntlayerのシングルトンインスタンスを登録する必要があります。このステップは非常に重要で、アプリケーション内のすべてのコンポーネントに国際化コンテキストを提供し、コンポーネントツリーのどこからでも翻訳にアクセスできるようにします。

    コードをコピー

    コードをクリップボードにコピー

    import { createApp } from "vue";import { intlayer } from "vue-intlayer";import App from "./App.vue";import "./style.css";const app = createApp(App);// 最上位でプロバイダーを注入app.use(intlayer);// アプリをマウントapp.mount("#app");

    メインのVueコンポーネントを作成し、useIntlayerのコンポーザブルを使用することで、アプリケーション全体でコンテンツ辞書にアクセスできます。

    src/HelloWord.vue
    コードをコピー

    コードをクリップボードにコピー

    <script setup lang="ts">import { ref } from "vue";import { useIntlayer } from "vue-intlayer";defineProps({  msg: String,});const {  count,  edit,  checkOut,  officialStarter,  learnMore,  vueDocs,  readTheDocs,} = useIntlayer("helloworld");const countRef = ref(0);</script><template>  <h1>{{ msg }}</h1>  <div class="card">    <button type="button" @click="countRef++">      <count />      {{ countRef }}    </button>    <p v-html="edit"></p>  </div>  <p>    <checkOut />    <a href="https://vuejs.org/guide/quick-start.html#local" target="_blank"      >create-vue</a    >, <officialStarter />  </p>  <p>    <learnMore />    <a      href="https://vuejs.org/guide/scaling-up/tooling.html#ide-support"      target="_blank"      ><vueDocs /></a    >.  </p>  <p class="read-the-docs"><readTheDocs /></p>  <p class="read-the-docs">{{ readTheDocs }}</p></template>

    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/> を使用してコンテンツを分割代入します。
    アプリケーションが既に存在する場合は、Intlayer コンパイラ と 抽出コマンド を組み合わせて、1 秒で何千ものコンポーネントを変換できます。

    (オプション)ステップ6: コンテンツの言語を変更する

    コンテンツの言語を変更するには、useLocale コンポーザブルが提供する setLocale 関数を使用します。この関数により、アプリケーションのロケールを設定し、それに応じてコンテンツを更新できます。

    言語を切り替えるコンポーネントを作成します:

    src/components/LocaleSwitcher.vue
    コードをコピー

    コードをクリップボードにコピー

    <template>  <div class="locale-switcher">    <select v-model="selectedLocale" @change="changeLocale">      <option v-for="loc in availableLocales" :key="loc" :value="loc">        {{ getLocaleName(loc) }}      </option>    </select>  </div></template><script setup lang="ts">import { ref, watch } from "vue";import { getLocaleName } from "intlayer";import { useLocale } from "vue-intlayer";// ロケール情報と setLocale 関数を取得const { locale, availableLocales, setLocale } = useLocale();// ref で選択されたロケールを追跡const selectedLocale = ref(locale.value);// 選択が変更されたときにロケールを更新const changeLocale = () => setLocale(selectedLocale.value);// selectedLocaleをグローバルなlocaleと同期させるwatch(  () => locale.value,  (newLocale) => {    selectedLocale.value = newLocale;  });</script>

    次に、このコンポーネントをApp.vueで使用します:

    src/App.vue
    コードをコピー

    コードをクリップボードにコピー

    <script setup lang="ts">import { useIntlayer } from "vue-intlayer";import HelloWorld from "@components/HelloWorld.vue";import LocaleSwitcher from "@components/LocaleSwitcher.vue";import { ref, watch } from "vue";const content = useIntlayer("app"); // 関連するintlayer宣言ファイルを作成</script><template>  <div>    <LocaleSwitcher />    <a href="https://vite.dev" target="_blank">      <img src="/vite.svg" class="logo" :alt="content.viteLogo" />    </a>    <a href="https://vuejs.org/" target="_blank">      <img src="./assets/vue.svg" class="logo vue" :alt="content.vueLogo" />    </a>  </div>  <HelloWorld :msg="content.title" /></template>

    (オプション)ステップ7: アプリケーションにローカライズされたルーティングを追加する

    Vueアプリケーションにローカライズされたルーティングを追加するには、通常、ロケールプレフィックス付きのVue Routerを使用します。これにより、各言語ごとにユニークなルートが作成され、SEOやSEOに適したURLに役立ちます。

    例:

    plaintext
    コードをコピー

    コードをクリップボードにコピー

    - https://example.com/about- https://example.com/es/about- https://example.com/fr/about

    まず、Vue Routerをインストールします:

    bash
    コードをコピー

    コードをクリップボードにコピー

    npm install vue-routernpx intlayer init

    次に、ロケールベースのルーティングを処理するルーター設定を作成します:

    src/router/index.ts
    コードをコピー

    コードをクリップボードにコピー

    import {  localeFlatMap,  type Locale,} from 'intlayer';import { createIntlayerClient } from "vue-intlayer";import { createRouter, createWebHistory } from 'vue-router';import HomeView from './views/home/HomeView.vue';import RootView from './views/root/Root.vue';/** * ロケール固有のパスとメタデータを持つルートを宣言します。 */const routes = localeFlatMap(({ urlPrefix, locale }) => [  {    path: `${urlPrefix}/`,    name: `Root-${locale}`,    component: RootView,    meta: {      locale,    },  },  {    path: `${urlPrefix}/home`,    name: `Home-${locale}`,    component: HomeView,    meta: {      locale,    },  },]);// ルーターインスタンスを作成export const router = createRouter({  history: createWebHistory(),  routes,});// ロケール処理のためのナビゲーションガードを追加router.beforeEach((to, _from, next) => {  const client = createIntlayerClient();  const metaLocale = to.meta.locale as Locale;  // ルートのメタに定義されたロケールを再利用  client.setLocale(metaLocale);  next();});
    ルート名はルーター内でルートを識別するために使用されます。すべてのルートで一意である必要があり、競合を避け、適切なナビゲーションとリンクを保証します。

    次に、main.jsファイルでルーターを登録します:

    src/main.ts
    コードをコピー

    コードをクリップボードにコピー

    import { createApp } from "vue";import App from "./App.vue";import { router } from "./router";import "./style.css";const app = createApp(App);// アプリにルーターを追加app.use(router);// アプリをマウントapp.mount("#app");

    次に、App.vue ファイルを更新して RouterView コンポーネントをレンダリングします。このコンポーネントは現在のルートにマッチしたコンポーネントを表示します。

    src/App.vue
    コードをコピー

    コードをクリップボードにコピー

    <script setup lang="ts">import LocaleSwitcher from "@components/LocaleSwitcher.vue";</script><template>  <nav>    <LocaleSwitcher />  </nav>  <RouterView /></template>

    同時に、intlayerProxy を使用してアプリケーションにサーバーサイドルーティングを追加することもできます。このプラグインはURLに基づいて現在のロケールを自動的に検出し、適切なロケールクッキーを設定します。ロケールが指定されていない場合、プラグインはユーザーのブラウザの言語設定に基づいて最適なロケールを判定します。ロケールが検出されない場合は、デフォルトのロケールにリダイレクトします。

    vite.config.ts
    コードをコピー

    コードをクリップボードにコピー

    import { defineConfig } from "vite";
    import vue from "@vitejs/plugin-vue";
    import { intlayer, intlayerProxy } from "vite-intlayer";
    
    // https://vitejs.dev/config/
    export default defineConfig({
      plugins: [
        intlayerProxy(), // should be placed first
        vue(),
        intlayer(),
      ],
    });

    (オプション)ステップ8: ロケール変更時にURLを変更する

    ユーザーが言語を変更したときにURLを自動的に更新するには、LocaleSwitcher コンポーネントを Vue Router を使うように変更できます。

    src/components/LocaleSwitcher.vue
    コードをコピー

    コードをクリップボードにコピー

    <template>  <div class="locale-switcher">    <select v-model="selectedLocale" @change="changeLocale">      <option v-for="loc in availableLocales" :key="loc" :value="loc">        {{ getLocaleName(loc) }}      </option>    </select>  </div></template><script setup lang="ts">import { ref, watch } from "vue";import { useRouter } from "vue-router";import { Locales, getLocaleName, getLocalizedUrl } from "intlayer";import { useLocale } from "vue-intlayer";// Vue Router を取得const router = useRouter();// ロケール情報と setLocale 関数を取得const { locale, availableLocales, setLocale } = useLocale({  onLocaleChange: (newLocale) => {    // 現在のルートを取得し、ローカライズされたURLを作成    const currentPath = router.currentRoute.value.fullPath;    const localizedPath = getLocalizedUrl(currentPath, newLocale);    // ページをリロードせずにローカライズされたルートへ遷移    router.push(localizedPath);  },});// 選択されたロケールを ref で追跡const selectedLocale = ref(locale.value);// 選択が変更されたときにロケールを更新するconst changeLocale = () => {  setLocale(selectedLocale.value);};// selectedLocaleをグローバルなロケールと同期させるwatch(  () => locale.value,  (newLocale) => {    selectedLocale.value = newLocale;  });</script>

    ヒント: SEOとアクセシビリティを向上させるために、ステップ10で示したように、ローカライズされたページへのリンクには <a href="/fr/home" hreflang="fr"> のようなタグを使用してください。これにより、検索エンジンは言語別のURLを正しく検出しインデックス化できます。SPAの動作を維持するためには、@click.preventでデフォルトのナビゲーションを防止し、useLocaleでロケールを変更し、Vue Routerを使ってプログラム的にナビゲートすることが可能です。

    html
    コードをコピー

    コードをクリップボードにコピー

    <ol>  <li>    <a      hreflang="x-default"      aria-label="英語に切り替え"      target="_self"      aria-current="page"      href="/doc/get-started"    >      <div>        <span dir="ltr" lang="en">English</span>        <span>英語</span>        <span>EN</span>      </div>    </a>  </li>  <li>    <a      hreflang="es"      aria-label="スペイン語に切り替え"      target="_self"      href="/es/doc/get-started"    >      <div>        <span dir="ltr" lang="es">Español</span>        <span>スペイン語</span>        <span>ES</span>      </div>    </a>  </li></ol>

    (オプション)ステップ9:HTMLの言語属性と方向属性を切り替える

    アプリケーションが複数の言語をサポートしている場合、<html>タグのlang属性とdir属性を現在のロケールに合わせて更新することが非常に重要です。これにより以下が保証されます:

    • アクセシビリティ: スクリーンリーダーや支援技術は、正しい lang 属性に依存してコンテンツを正確に発音し解釈します。
    • テキストレンダリング: dir(方向)属性は、テキストが適切な順序(例:英語は左から右、アラビア語やヘブライ語は右から左)で表示されることを保証し、読みやすさに不可欠です。
    • SEO: 検索エンジンは lang 属性を使用してページの言語を判別し、適切なローカライズされたコンテンツを検索結果に表示します。

    ロケールが変更された際にこれらの属性を動的に更新することで、すべての対応言語において一貫性がありアクセシブルなユーザー体験を保証します。

    src/composables/useI18nHTMLAttributes.ts
    コードをコピー

    コードをクリップボードにコピー

    import { watch } from "vue";import { useLocale } from "vue-intlayer";import { getHTMLTextDir } from "intlayer";/** * 現在のロケールに基づいてHTMLの<html>要素の`lang`および`dir`属性を更新するComposable。 * * @example * // App.vueまたはグローバルコンポーネント内で * import { useI18nHTMLAttributes } from './composables/useI18nHTMLAttributes' * * useI18nHTMLAttributes() */export const useI18nHTMLAttributes = () => {  const { locale } = useLocale();  // ロケールが変更されるたびにHTML属性を更新する  watch(    () => locale.value,    (newLocale) => {      if (!newLocale) return;      // 言語属性を更新する      document.documentElement.lang = newLocale;      // テキストの方向を設定する(ほとんどの言語はltr、アラビア語やヘブライ語などはrtl)      document.documentElement.dir = getHTMLTextDir(newLocale);    },    { immediate: true }  );};

    このコンポーザブルは、App.vue またはグローバルコンポーネントで使用します。

    src/App.vue
    コードをコピー

    コードをクリップボードにコピー

    <script setup lang="ts">import { useI18nHTMLAttributes } from "@composables/useI18nHTMLAttributes";// 現在のロケールに基づいてHTML属性を適用するuseI18nHTMLAttributes();</script><template>  <!-- アプリのテンプレート --></template>

    (オプション)ステップ10:ローカライズされたリンクコンポーネントの作成

    アプリケーションのナビゲーションが現在のロケールを尊重するようにするために、カスタムの Link コンポーネントを作成できます。このコンポーネントは内部のURLに自動的に現在の言語をプレフィックスとして付加します。例えば、フランス語を話すユーザーが「About」ページへのリンクをクリックすると、/about ではなく /fr/about にリダイレクトされます。

    この動作は以下の理由で有用です:

    • SEOとユーザーエクスペリエンス:ローカライズされたURLは、検索エンジンが言語別のページを正しくインデックスし、ユーザーに好みの言語でコンテンツを提供するのに役立ちます。
    • 一貫性:アプリケーション全体でローカライズされたリンクを使用することで、ナビゲーションが現在のロケール内に留まり、予期しない言語の切り替えを防ぎます。
    • 保守性: ローカリゼーションのロジックを単一のコンポーネントに集約することで、URLの管理が簡素化され、アプリケーションの成長に伴いコードベースの保守や拡張が容易になります。
    src/components/Link.vue
    コードをコピー

    コードをクリップボードにコピー

    <template>  <a :href="localizedHref" v-bind="$attrs">    <slot />  </a></template><script setup lang="ts">import { computed } from "vue";import { getLocalizedUrl } from "intlayer";import { useLocale } from "vue-intlayer";const props = defineProps({  href: {    type: String,    required: true,  },});const { locale } = useLocale();// リンクが外部リンクかどうかをチェックconst isExternalLink = computed(() => /^https?:\/\//.test(props.href || ""));// 内部リンク用のローカライズされたhrefを作成const localizedHref = computed(() =>  isExternalLink.value ? props.href : getLocalizedUrl(props.href, locale.value));</script>

    Vue Routerで使用する場合は、ルーター専用のバージョンを作成します:

    src/components/RouterLink.vue
    コードをコピー

    コードをクリップボードにコピー

    <template>  <router-link :to="localizedTo" v-bind="$attrs">    <slot />  </router-link></template><script setup lang="ts">import { computed } from "vue";import { getLocalizedUrl } from "intlayer";import { useLocale } from "vue-intlayer";const props = defineProps({  to: {    type: [String, Object],    required: true,  },});const { locale } = useLocale();// router-link用のローカライズされたtoプロパティを作成const localizedTo = computed(() => {  if (typeof props.to === "string") {    return getLocalizedUrl(props.to, locale.value);  } else {    // 'to'がオブジェクトの場合は、pathプロパティをローカライズします    return {      ...props.to,      path: getLocalizedUrl(props.to.path ?? "/", locale.value),    };  }});</script>

    これらのコンポーネントをアプリケーションで使用します:

    src/App.vue
    コードをコピー

    コードをクリップボードにコピー

    <template>  <div>    <!-- Vueルーター -->    <RouterLink to="/">ルート</RouterLink>    <RouterLink to="/home">ホーム</RouterLink>    <!-- その他 -->    <Link href="/">ルート</Link>    <Link href="/home">ホーム</Link>  </div></template><script setup lang="ts">import Link from "@components/Link.vue";import RouterLink from "@components/RouterLink.vue";</script>

    (オプション)ステップ11:Markdownのレンダリング

    Intlayerは、Vueアプリケーション内でMarkdownコンテンツを直接レンダリングすることをサポートしています。デフォルトでは、Markdownはプレーンテキストとして扱われます。MarkdownをリッチなHTMLに変換するには、Markdownパーサーであるmarkdown-itを統合できます。

    これは、翻訳にリスト、リンク、強調などのフォーマットされたコンテンツが含まれる場合に特に便利です。

    デフォルトではIntlayerはMarkdownを文字列としてレンダリングしますが、installIntlayerMarkdown関数を使ってMarkdownをHTMLにレンダリングする方法も提供しています。

    intlayerパッケージを使ってMarkdownコンテンツを宣言する方法については、markdownドキュメントを参照してください。
    main.ts
    コードをコピー

    コードをクリップボードにコピー

    import MarkdownIt from "markdown-it";import { createApp, h } from "vue";import { installIntlayer, installIntlayerMarkdown } from "vue-intlayer";const app = createApp(App);app.use(intlayer);const md = new MarkdownIt({  html: true, // HTMLタグを許可  linkify: true, // URLを自動リンク化  typographer: true, // スマートクォートやダッシュなどを有効化});// IntlayerにmarkdownをHTMLに変換する際にmd.render()を使うよう指示installIntlayerMarkdown(app, (markdown) => {  const html = md.render(markdown);  return h("div", { innerHTML: html });});

    登録が完了すると、コンポーネントベースの構文を使ってMarkdownコンテンツを直接表示できます:

    vue
    コードをコピー

    コードをクリップボードにコピー

    <template>  <div>    <myMarkdownContent />  </div></template><script setup lang="ts">import { useIntlayer } from "vue-intlayer";const { myMarkdownContent } = useIntlayer("my-component");</script>

    TypeScriptの設定

    Intlayerはモジュール拡張を利用して、TypeScriptの利点を活かし、コードベースをより強固にします。

    Autocompletion

    Translation error

    TypeScriptの設定に自動生成された型定義が含まれていることを確認してください。

    tsconfig.json
    コードをコピー

    コードをクリップボードにコピー

    {  // ... 既存のTypeScript設定  "include": [    // ... 既存のTypeScript設定    ".intlayer/**/*.ts", // 自動生成された型定義を含める  ],}

    Gitの設定

    Intlayerによって生成されたファイルは無視することを推奨します。これにより、それらのファイルをGitリポジトリにコミットするのを避けることができます。

    これを行うには、以下の指示を.gitignoreファイルに追加してください。

    bash
    コードをコピー

    コードをクリップボードにコピー

    #  Intlayerによって生成されたファイルを無視する.intlayer

    VS Code拡張機能

    Intlayerでの開発体験を向上させるために、公式のIntlayer VS Code拡張機能をインストールできます。

    VS Codeマーケットプレイスからインストール

    この拡張機能は以下を提供します:

    • 翻訳キーのオートコンプリート。
    • 欠落している翻訳のリアルタイムエラー検出。
    • 翻訳されたコンテンツのインラインプレビュー。
    • 翻訳を簡単に作成・更新できるクイックアクション。

    拡張機能の使用方法の詳細については、Intlayer VS Code Extension ドキュメントを参照してください。


    (オプション) ステップ 1 : コンポーネントのコンテンツを抽出する

    既存のコードベースがある場合、数千のファイルを変換するのは時間がかかることがあります。

    このプロセスを容易にするために、Intlayerは、コンポーネントを変換しコンテンツを抽出するための コンパイラ / エクストラクタ を提案しています。

    セットアップするには、intlayer.config.ts ファイルに compiler セクションを追加します。

    intlayer.config.ts
    コードをコピー

    コードをクリップボードにコピー

    import { type IntlayerConfig } from "intlayer";
    
    const config: IntlayerConfig = {
      // ... 他の構成
      compiler: {
        /**
         * コンパイラを有効にするかどうかを指定します。
         */
        enabled: true,
    
        /**
         * 出力ファイルのパスを定義します。
         */
        output: ({ fileName, extension }) => `./${fileName}${extension}`,
    
        /**
         * 変換後にコンポーネントを保存するかどうかを指定します。これにより、コンパイラを一度だけ実行してアプリを変換し、その後削除することができます。
         */
        saveComponents: false,
    
        /**
         * 辞書キーの接頭辞
         */
        dictionaryKeyPrefix: "",
      },
    };
    
    export default config;

    コンポーネントを変換してコンテンツを抽出するためにエクストラクタを実行します

    bash
    コードをコピー

    コードをクリップボードにコピー

    npx intlayer extract

    vite.config.ts を更新して intlayerCompiler プラグインを含めます。

    vite.config.ts
    コードをコピー

    コードをクリップボードにコピー

    import { defineConfig } from "vite";import { intlayer, intlayerCompiler } from "vite-intlayer";export default defineConfig({ plugins: [   intlayer(),   intlayerCompiler(), // コンパイラプラグインを追加します ],});
    bash
    コードをコピー

    コードをクリップボードにコピー

    npm run build # または npm run dev

    (任意)サイトマップと 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 を置く

    generate-seo.mjs
    コードをコピー

    コードをクリップボードにコピー

    import fs from "fs";import path from "path";import { fileURLToPath } from "url";import { generateSitemap, getMultilingualUrls } from "intlayer";const __dirname = path.dirname(fileURLToPath(import.meta.url));const SITE_URL = (process.env.SITE_URL || "http://localhost:5173").replace(  /\/$/,  "");const pathList = [  { path: "/", changefreq: "daily", priority: 1.0 },  { path: "/about", changefreq: "monthly", priority: 0.7 },];const sitemapXml = generateSitemap(pathList, { siteUrl: SITE_URL });fs.writeFileSync(path.join(__dirname, "public", "sitemap.xml"), sitemapXml);const getAllMultilingualUrls = (urls) =>  urls.flatMap((url) => Object.values(getMultilingualUrls(url)));const disallowedPaths = getAllMultilingualUrls(["/admin", "/private"]);const robotsTxt = [  "User-agent: *",  "Allow: /",  ...disallowedPaths.map((path) => `Disallow: ${path}`),  "",  `Sitemap: ${SITE_URL}/sitemap.xml`,].join("\n");fs.writeFileSync(path.join(__dirname, "public", "robots.txt"), robotsTxt);console.log("SEO files generated successfully.");

    intlayer がインストールされている必要があります。本番では環境変数 SITE_URL を設定してください(CI など)。

    Node の ESM では generate-seo.mjs を推奨します。generate-seo.js にする場合は package.json の "type": "module" などで ESM を有効にしてください。

    2. Vite より前にスクリプトを実行する

    package.json
    コードをコピー

    コードをクリップボードにコピー

    {  "scripts": {    "dev": "vite",    "prebuild": "node generate-seo.mjs",    "build": "vite build",    "preview": "vite preview"  }}

    pnpm や yarn を使う場合はコマンドを読み替えてください。CI から呼び出しても構いません。

    さらに進むために

    さらに進むには、ビジュアルエディターを実装するか、CMSを使用してコンテンツを外部化することができます。


    Compiler
    NuxtおよびVue
    Alt+→

    このページについて

      ディスカッションは匿名で、よくある問題に対処するために定期的に確認されます。機能のアイデア、ドキュメントへのフィードバック、Intlayerに関することなど、お気軽にお聞かせください, このフィードバックをロードマップの作成と製品の改善に活用しています。

      npm install intlayer vue-intlayernpm install vite-intlayer --save-devnpx intlayer init
      import { createApp } from "vue";import { intlayer } from "vue-intlayer";import App from "./App.vue";import "./style.css";const app = createApp(App);// 最上位でプロバイダーを注入app.use(intlayer);// アプリをマウントapp.mount("#app");
      <script setup lang="ts">import { ref } from "vue";import { useIntlayer } from "vue-intlayer";defineProps({  msg: String,});const {  count,  edit,  checkOut,  officialStarter,  learnMore,  vueDocs,  readTheDocs,} = useIntlayer("helloworld");const countRef = ref(0);</script><template>  <h1>{{ msg }}</h1>  <div class="card">    <button type="button" @click="countRef++">      <count />      {{ countRef }}    </button>    <p v-html="edit"></p>  </div>  <p>    <checkOut />    <a href="https://vuejs.org/guide/quick-start.html#local" target="_blank"      >create-vue</a    >, <officialStarter />  </p>  <p>    <learnMore />    <a      href="https://vuejs.org/guide/scaling-up/tooling.html#ide-support"      target="_blank"      ><vueDocs /></a    >.  </p>  <p class="read-the-docs"><readTheDocs /></p>  <p class="read-the-docs">{{ readTheDocs }}</p></template>
      <template>  <div class="locale-switcher">    <select v-model="selectedLocale" @change="changeLocale">      <option v-for="loc in availableLocales" :key="loc" :value="loc">        {{ getLocaleName(loc) }}      </option>    </select>  </div></template><script setup lang="ts">import { ref, watch } from "vue";import { getLocaleName } from "intlayer";import { useLocale } from "vue-intlayer";// ロケール情報と setLocale 関数を取得const { locale, availableLocales, setLocale } = useLocale();// ref で選択されたロケールを追跡const selectedLocale = ref(locale.value);// 選択が変更されたときにロケールを更新const changeLocale = () => setLocale(selectedLocale.value);// selectedLocaleをグローバルなlocaleと同期させるwatch(  () => locale.value,  (newLocale) => {    selectedLocale.value = newLocale;  });</script>
      <script setup lang="ts">import { useIntlayer } from "vue-intlayer";import HelloWorld from "@components/HelloWorld.vue";import LocaleSwitcher from "@components/LocaleSwitcher.vue";import { ref, watch } from "vue";const content = useIntlayer("app"); // 関連するintlayer宣言ファイルを作成</script><template>  <div>    <LocaleSwitcher />    <a href="https://vite.dev" target="_blank">      <img src="/vite.svg" class="logo" :alt="content.viteLogo" />    </a>    <a href="https://vuejs.org/" target="_blank">      <img src="./assets/vue.svg" class="logo vue" :alt="content.vueLogo" />    </a>  </div>  <HelloWorld :msg="content.title" /></template>
      - https://example.com/about- https://example.com/es/about- https://example.com/fr/about
      npm install vue-routernpx intlayer init
      import {  localeFlatMap,  type Locale,} from 'intlayer';import { createIntlayerClient } from "vue-intlayer";import { createRouter, createWebHistory } from 'vue-router';import HomeView from './views/home/HomeView.vue';import RootView from './views/root/Root.vue';/** * ロケール固有のパスとメタデータを持つルートを宣言します。 */const routes = localeFlatMap(({ urlPrefix, locale }) => [  {    path: `${urlPrefix}/`,    name: `Root-${locale}`,    component: RootView,    meta: {      locale,    },  },  {    path: `${urlPrefix}/home`,    name: `Home-${locale}`,    component: HomeView,    meta: {      locale,    },  },]);// ルーターインスタンスを作成export const router = createRouter({  history: createWebHistory(),  routes,});// ロケール処理のためのナビゲーションガードを追加router.beforeEach((to, _from, next) => {  const client = createIntlayerClient();  const metaLocale = to.meta.locale as Locale;  // ルートのメタに定義されたロケールを再利用  client.setLocale(metaLocale);  next();});
      import { createApp } from "vue";import App from "./App.vue";import { router } from "./router";import "./style.css";const app = createApp(App);// アプリにルーターを追加app.use(router);// アプリをマウントapp.mount("#app");
      <script setup lang="ts">import LocaleSwitcher from "@components/LocaleSwitcher.vue";</script><template>  <nav>    <LocaleSwitcher />  </nav>  <RouterView /></template>
      <template>  <div class="locale-switcher">    <select v-model="selectedLocale" @change="changeLocale">      <option v-for="loc in availableLocales" :key="loc" :value="loc">        {{ getLocaleName(loc) }}      </option>    </select>  </div></template><script setup lang="ts">import { ref, watch } from "vue";import { useRouter } from "vue-router";import { Locales, getLocaleName, getLocalizedUrl } from "intlayer";import { useLocale } from "vue-intlayer";// Vue Router を取得const router = useRouter();// ロケール情報と setLocale 関数を取得const { locale, availableLocales, setLocale } = useLocale({  onLocaleChange: (newLocale) => {    // 現在のルートを取得し、ローカライズされたURLを作成    const currentPath = router.currentRoute.value.fullPath;    const localizedPath = getLocalizedUrl(currentPath, newLocale);    // ページをリロードせずにローカライズされたルートへ遷移    router.push(localizedPath);  },});// 選択されたロケールを ref で追跡const selectedLocale = ref(locale.value);// 選択が変更されたときにロケールを更新するconst changeLocale = () => {  setLocale(selectedLocale.value);};// selectedLocaleをグローバルなロケールと同期させるwatch(  () => locale.value,  (newLocale) => {    selectedLocale.value = newLocale;  });</script>
      <ol>  <li>    <a      hreflang="x-default"      aria-label="英語に切り替え"      target="_self"      aria-current="page"      href="/doc/get-started"    >      <div>        <span dir="ltr" lang="en">English</span>        <span>英語</span>        <span>EN</span>      </div>    </a>  </li>  <li>    <a      hreflang="es"      aria-label="スペイン語に切り替え"      target="_self"      href="/es/doc/get-started"    >      <div>        <span dir="ltr" lang="es">Español</span>        <span>スペイン語</span>        <span>ES</span>      </div>    </a>  </li></ol>
      import { watch } from "vue";import { useLocale } from "vue-intlayer";import { getHTMLTextDir } from "intlayer";/** * 現在のロケールに基づいてHTMLの<html>要素の`lang`および`dir`属性を更新するComposable。 * * @example * // App.vueまたはグローバルコンポーネント内で * import { useI18nHTMLAttributes } from './composables/useI18nHTMLAttributes' * * useI18nHTMLAttributes() */export const useI18nHTMLAttributes = () => {  const { locale } = useLocale();  // ロケールが変更されるたびにHTML属性を更新する  watch(    () => locale.value,    (newLocale) => {      if (!newLocale) return;      // 言語属性を更新する      document.documentElement.lang = newLocale;      // テキストの方向を設定する(ほとんどの言語はltr、アラビア語やヘブライ語などはrtl)      document.documentElement.dir = getHTMLTextDir(newLocale);    },    { immediate: true }  );};
      <script setup lang="ts">import { useI18nHTMLAttributes } from "@composables/useI18nHTMLAttributes";// 現在のロケールに基づいてHTML属性を適用するuseI18nHTMLAttributes();</script><template>  <!-- アプリのテンプレート --></template>
      <template>  <a :href="localizedHref" v-bind="$attrs">    <slot />  </a></template><script setup lang="ts">import { computed } from "vue";import { getLocalizedUrl } from "intlayer";import { useLocale } from "vue-intlayer";const props = defineProps({  href: {    type: String,    required: true,  },});const { locale } = useLocale();// リンクが外部リンクかどうかをチェックconst isExternalLink = computed(() => /^https?:\/\//.test(props.href || ""));// 内部リンク用のローカライズされたhrefを作成const localizedHref = computed(() =>  isExternalLink.value ? props.href : getLocalizedUrl(props.href, locale.value));</script>
      <template>  <router-link :to="localizedTo" v-bind="$attrs">    <slot />  </router-link></template><script setup lang="ts">import { computed } from "vue";import { getLocalizedUrl } from "intlayer";import { useLocale } from "vue-intlayer";const props = defineProps({  to: {    type: [String, Object],    required: true,  },});const { locale } = useLocale();// router-link用のローカライズされたtoプロパティを作成const localizedTo = computed(() => {  if (typeof props.to === "string") {    return getLocalizedUrl(props.to, locale.value);  } else {    // 'to'がオブジェクトの場合は、pathプロパティをローカライズします    return {      ...props.to,      path: getLocalizedUrl(props.to.path ?? "/", locale.value),    };  }});</script>
      <template>  <div>    <!-- Vueルーター -->    <RouterLink to="/">ルート</RouterLink>    <RouterLink to="/home">ホーム</RouterLink>    <!-- その他 -->    <Link href="/">ルート</Link>    <Link href="/home">ホーム</Link>  </div></template><script setup lang="ts">import Link from "@components/Link.vue";import RouterLink from "@components/RouterLink.vue";</script>
      import MarkdownIt from "markdown-it";import { createApp, h } from "vue";import { installIntlayer, installIntlayerMarkdown } from "vue-intlayer";const app = createApp(App);app.use(intlayer);const md = new MarkdownIt({  html: true, // HTMLタグを許可  linkify: true, // URLを自動リンク化  typographer: true, // スマートクォートやダッシュなどを有効化});// IntlayerにmarkdownをHTMLに変換する際にmd.render()を使うよう指示installIntlayerMarkdown(app, (markdown) => {  const html = md.render(markdown);  return h("div", { innerHTML: html });});
      <template>  <div>    <myMarkdownContent />  </div></template><script setup lang="ts">import { useIntlayer } from "vue-intlayer";const { myMarkdownContent } = useIntlayer("my-component");</script>
      {  // ... 既存のTypeScript設定  "include": [    // ... 既存のTypeScript設定    ".intlayer/**/*.ts", // 自動生成された型定義を含める  ],}
      #  Intlayerによって生成されたファイルを無視する.intlayer
      npx intlayer extract
      import { defineConfig } from "vite";import { intlayer, intlayerCompiler } from "vite-intlayer";export default defineConfig({ plugins: [   intlayer(),   intlayerCompiler(), // コンパイラプラグインを追加します ],});
      npm run build # または npm run dev
      import fs from "fs";import path from "path";import { fileURLToPath } from "url";import { generateSitemap, getMultilingualUrls } from "intlayer";const __dirname = path.dirname(fileURLToPath(import.meta.url));const SITE_URL = (process.env.SITE_URL || "http://localhost:5173").replace(  /\/$/,  "");const pathList = [  { path: "/", changefreq: "daily", priority: 1.0 },  { path: "/about", changefreq: "monthly", priority: 0.7 },];const sitemapXml = generateSitemap(pathList, { siteUrl: SITE_URL });fs.writeFileSync(path.join(__dirname, "public", "sitemap.xml"), sitemapXml);const getAllMultilingualUrls = (urls) =>  urls.flatMap((url) => Object.values(getMultilingualUrls(url)));const disallowedPaths = getAllMultilingualUrls(["/admin", "/private"]);const robotsTxt = [  "User-agent: *",  "Allow: /",  ...disallowedPaths.map((path) => `Disallow: ${path}`),  "",  `Sitemap: ${SITE_URL}/sitemap.xml`,].join("\n");fs.writeFileSync(path.join(__dirname, "public", "robots.txt"), robotsTxt);console.log("SEO files generated successfully.");
      {  "scripts": {    "dev": "vite",    "prebuild": "node generate-seo.mjs",    "build": "vite build",    "preview": "vite preview"  }}