ホームサンドボックスショーケースアプリ文書ブログ
    • 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. Nuxt and vue
    \n\n\n```\n\n#### Intlayerでのコンテンツアクセス\n\nIntlayerはコンテンツにアクセスするためのさまざまなAPIを提供しています:\n\n- **コンポーネントベースの構文**(推奨):\n `` または `` の構文を使用して、コンテンツを Intlayer ノードとしてレンダリングします。これは [Visual Editor](/ja/doc/concept/editor) および [CMS](/ja/doc/concept/cms) とシームレスに統合されます。\n\n- **文字列ベースの構文**: \n `{{ myContent }}` を使用して、Visual Editor のサポートなしにプレーンテキストとしてコンテンツをレンダリングします。\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### (オプション)ステップ6: コンテンツの言語を変更する\n\nコンテンツの言語を変更するには、`useLocale` コンポーザブルが提供する `setLocale` 関数を使用します。この関数により、アプリケーションのロケールを設定し、それに応じてコンテンツを更新できます。\n\n`NuxtLink` を使用して言語を切り替えるコンポーネントを作成します。**ロケール切り替えにボタンではなくリンクを使うことは、SEOやページの発見性向上のベストプラクティスです**。これにより、検索エンジンがすべてのローカライズされたページをクロールしインデックス化できます。\n\n```vue fileName=\"components/LocaleSwitcher.vue\"\n\n\n\n```\n\n> `NuxtLink` を適切な `href` 属性(`getLocalizedUrl` 経由)と共に使用することで、検索エンジンがページのすべての言語バリアントを検出できるようになります。これは、検索エンジンクローラーが追跡しない可能性のあるJavaScriptのみのロケール切り替えよりも望ましい方法です。\n\n次に、`app.vue` を設定してレイアウトを使用します:\n\n```vue fileName=\"app.vue\"\n\n```\n\n### (オプション)ステップ6b:ナビゲーション付きレイアウトの作成\n\nNuxtのレイアウトを使うと、ページの共通構造を定義できます。ロケールスイッチャーとナビゲーションを含むデフォルトレイアウトを作成しましょう:\n\n```vue fileName=\"layouts/default.vue\"\n\n\n\n```\n\n`Links` コンポーネント(以下に示す)は、内部ナビゲーションリンクが自動的にローカライズされることを保証します。\n\n### (オプション)ステップ7: アプリケーションにローカライズされたルーティングを追加する\n\n`nuxt-intlayer` モジュールを使用すると、Nuxtはローカライズされたルーティングを自動的に処理します。これは、ページのディレクトリ構造に基づいて各言語のルートを自動的に作成します。\n\n例:\n\n```plaintext\npages/\n├── index.vue → /, /fr, /es\n├── about.vue → /about, /fr/about, /es/about\n└── contact/\n └── index.vue → /contact, /fr/contact, /es/contact\n```\n\nローカライズされたページを作成するには、単に `pages/` ディレクトリに Vue ファイルを作成します。以下に2つの例を示します。\n\n**ホームページ (`pages/index.vue`):**\n\n```vue fileName=\"pages/index.vue\"\n\n\n\n```\n\n**アバウトページ (`pages/about.vue`):**\n\n```vue fileName=\"pages/about.vue\"\n\n\n\n```\n\n> 注意: `useHead` は Nuxt で自動インポートされます。コンテンツの値には `.value`(リアクティブ)または `.raw`(プリミティブ文字列)を用途に応じて使用できます。\n\n`nuxt-intlayer` モジュールは自動的に以下を行います:\n\n- ユーザーの優先ロケールを検出\n- URL を介したロケール切り替えの処理\n- 適切な `` 属性の設定\n- ロケールクッキーの管理\n- ユーザーを適切なローカライズされた URL にリダイレクト\n\n### (オプション)ステップ8:ローカライズされたリンクコンポーネントの作成\n\nアプリケーションのナビゲーションが現在のロケールを尊重するようにするために、カスタムの `Links` コンポーネントを作成できます。このコンポーネントは内部URLに自動的に現在の言語をプレフィックスとして付加し、これは**SEOおよびページの発見性**に不可欠です。\n\n```vue fileName=\"components/Links.vue\"\n\n\n\n```\n\n次に、このコンポーネントをアプリケーション全体で使用します:\n\n```vue fileName=\"layouts/default.vue\"\n\n\n\n```\n\n> `NuxtLink` をローカライズされたパスで使用することで、以下を保証できます:\n>\n> - 検索エンジンがすべての言語バージョンのページをクロールおよびインデックスできる\n> - ユーザーがローカライズされたURLを直接共有できる\n> - ブラウザの履歴がロケール接頭辞付きURLで正しく動作する\n\n### (オプション)ステップ9:メタデータとSEOの処理\n\nNuxtは `useHead` コンポーザブル(自動インポート)を通じて優れたSEO機能を提供します。Intlayerを使って、`.raw` または `.value` アクセサを用いてプリミティブな文字列値を取得し、ローカライズされたメタデータを扱うことができます:\n\n```vue fileName=\"pages/about.vue\"\n\n\n\n```\n\n> あるいは、Vueのリアクティビティなしでコンテンツを取得するために `import { getIntlayer } from \"intlayer\"` 関数を使用することもできます。\n\n> **コンテンツ値へのアクセス方法:**\n>\n> - プリミティブな文字列値(非リアクティブ)を取得するには `.raw` を使用\n> - リアクティブな値を取得するには `.value` を使用\n> - Visual Editorサポートのために `` コンポーネント構文を使用\n\n対応するコンテンツ宣言を作成します:\n\n```ts fileName=\"pages/about-page.content.ts\" contentDeclarationFormat={[\"typescript\", \"esm\", \"commonjs\"]}\nimport { t, type Dictionary } from \"intlayer\";\n\nconst aboutPageContent = {\n key: \"about-page\",\n content: {\n metaTitle: t({\n en: \"About Us - My Company\",\n fr: \"À Propos - Ma Société\",\n es: \"Acerca de Nosotros - Mi Empresa\",\n }),\n metaDescription: t({\n ja: \"私たちの会社とミッションについて詳しく知る\",\n en: \"Learn more about our company and our mission\",\n fr: \"En savoir plus sur notre société et notre mission\",\n es: \"Conozca más sobre nuestra empresa y nuestra misión\",\n }),\n title: t({\n ja: \"私たちについて\",\n en: \"About Us\",\n fr: \"À Propos\",\n es: \"Acerca de Nosotros\",\n }),\n },\n} satisfies Dictionary;\n\nexport default aboutPageContent;\n```\n\n```json fileName=\"pages/about-page.content.json\" contentDeclarationFormat=\"json\"\n{\n \"$schema\": \"https://intlayer.org/schema.json\",\n \"key\": \"about-page\",\n \"content\": {\n \"metaTitle\": {\n \"nodeType\": \"translation\",\n \"translation\": {\n \"en\": \"About Us - My Company\",\n \"fr\": \"À Propos - Ma Société\",\n \"es\": \"Acerca de Nosotros - Mi Empresa\"\n }\n },\n \"metaDescription\": {\n \"nodeType\": \"translation\",\n \"translation\": {\n \"en\": \"Learn more about our company and our mission\",\n \"fr\": \"En savoir plus sur notre société et notre mission\",\n \"es\": \"Conozca más sobre nuestra empresa y nuestra misión\",\n \"ja\": \"当社と当社のミッションについて詳しく知る\"\n }\n },\n \"title\": {\n \"nodeType\": \"translation\",\n \"translation\": {\n \"en\": \"About Us\",\n \"fr\": \"À Propos\",\n \"es\": \"Acerca de Nosotros\",\n \"ja\": \"私たちについて\"\n }\n }\n }\n}\n```\n\n### Gitの設定\n\nIntlayerによって生成されたファイルは無視することを推奨します。これにより、Gitリポジトリへの不要なコミットを防ぐことができます。\n\nこれを行うには、`.gitignore`ファイルに以下の指示を追加してください。\n\n```plaintext fileName=\".gitignore\"\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拡張機能のドキュメント](https://intlayer.org/doc/vs-code-extension)を参照してください。\n\n---\n\n### さらに進む\n\nさらに進めるには、[ビジュアルエディター](/ja/doc/concept/editor)を実装するか、[CMS](/ja/doc/concept/cms)を使用してコンテンツを外部化することができます。\n","about":"Nuxt と Vue のウェブサイトを多言語対応にする方法を紹介します。国際化(i18n)と翻訳のためのドキュメントに従ってください。","url":"https://intlayer.org/ja/doc/environment/nuxt-and-vue","datePublished":"18-06-2025","dateModified":"06-05-2026","keywords":"国際化, ドキュメント, Intlayer, Nuxt, Vue, JavaScript","license":"https://raw.githubusercontent.com/aymericzip/intlayer/refs/heads/main/LICENSE","audience":{"@type":"Audience","audienceType":"開発者、コンテンツマネージャー"}}
    作成:2025-06-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. "LocaleSwitcher、SEO、メタデータの更新"
      v7.3.112025/12/7
    3. "履歴の初期化"
      v5.5.102025/6/29

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

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

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

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

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

    Intlayer を使って Nuxt と Vue のウェブサイトを翻訳する | 国際化(i18n)

    目次

    Intlayerとは?

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

    Intlayerを使うことで、以下が可能になります:

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

    NuxtアプリケーションでIntlayerをセットアップするステップバイステップガイド

    www.youtube.com
    ide.intlayer.org
    intlayer-nuxt-4-template.vercel.app

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

    ステップ1: 依存関係のインストール

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

    bash
    コードをコピー

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

    npm install intlayer vue-intlayernpm install --save-dev nuxt-intlayernpx intlayer init
    • intlayer

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

    • vue-intlayer IntlayerをVueアプリケーションに統合するパッケージです。Vueコンポーネント用のcomposablesを提供します。

    • nuxt-intlayer NuxtアプリケーションとIntlayerを統合するNuxtモジュールです。自動セットアップ、ロケール検出のためのミドルウェア、クッキー管理、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: Nuxt設定にIntlayerを統合する

    Nuxtの設定にintlayerモジュールを追加します:

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

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

    import { defineNuxtConfig } from "nuxt/config";export default defineNuxtConfig({  // ... 既存のNuxt設定  modules: ["nuxt-intlayer"],});
    nuxt-intlayer モジュールは、Intlayer と Nuxt の統合を自動的に処理します。コンテンツ宣言のビルドを設定し、開発モードでファイルを監視し、ロケール検出のためのミドルウェアを提供し、ローカライズされたルーティングを管理します。

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

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

    コンテンツ宣言は、contentDir ディレクトリ(デフォルトは ./src)に含まれている限り、アプリケーションのどこにでも定義できます。また、コンテンツ宣言ファイルの拡張子(デフォルトは .content.{json,ts,tsx,js,jsx,mjs,cjs})に一致している必要があります。
    詳細については、コンテンツ宣言ドキュメントを参照してください。

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

    useIntlayerコンポーザブルを使って、Nuxtアプリケーション全体でコンテンツ辞書にアクセスします:

    components/HelloWorld.vue
    コードをコピー

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

    <script setup lang="ts">import { ref } from "vue";import { useIntlayer } from "vue-intlayer";defineProps({  msg: String,});const {  count,  edit,  checkOut,  nuxtIntlayer,  learnMore,  nuxtDocs,  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://nuxt.com/docs/getting-started/introduction" target="_blank"      >Nuxt</a    >、<nuxtIntlayer />  </p>  <p>    <learnMore />    <a href="https://nuxt.com" target="_blank"><nuxtDocs /></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 ノードとしてレンダリングします。これは Visual Editor および CMS とシームレスに統合されます。

    • 文字列ベースの構文:
      {{ myContent }} を使用して、Visual Editor のサポートなしにプレーンテキストとしてコンテンツをレンダリングします。

    • 生の 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/> としてレンダリングします。

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

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

    NuxtLink を使用して言語を切り替えるコンポーネントを作成します。ロケール切り替えにボタンではなくリンクを使うことは、SEOやページの発見性向上のベストプラクティスです。これにより、検索エンジンがすべてのローカライズされたページをクロールしインデックス化できます。

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

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

    <script setup lang="ts">import { getLocaleName, getLocalizedUrl } from "intlayer";import { useLocale } from "vue-intlayer";// NuxtはuseRouteを自動インポートしますconst route = useRoute();const { locale, availableLocales, setLocale } = useLocale();</script><template>  <nav class="locale-switcher">    <NuxtLink      v-for="localeEl in availableLocales"      :key="localeEl"      :to="getLocalizedUrl(route.fullPath, localeEl)"      class="locale-link"      :class="{ 'active-locale': localeEl === locale }"      @click="setLocale(localeEl)"    >      {{ getLocaleName(localeEl) }}    </NuxtLink>  </nav></template>
    NuxtLink を適切な href 属性(getLocalizedUrl 経由)と共に使用することで、検索エンジンがページのすべての言語バリアントを検出できるようになります。これは、検索エンジンクローラーが追跡しない可能性のあるJavaScriptのみのロケール切り替えよりも望ましい方法です。

    次に、app.vue を設定してレイアウトを使用します:

    app.vue
    コードをコピー

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

    <template>  <NuxtLayout>    <NuxtPage />  </NuxtLayout></template>

    (オプション)ステップ6b:ナビゲーション付きレイアウトの作成

    Nuxtのレイアウトを使うと、ページの共通構造を定義できます。ロケールスイッチャーとナビゲーションを含むデフォルトレイアウトを作成しましょう:

    layouts/default.vue
    コードをコピー

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

    <script setup lang="ts">import Links from "~/components/Links.vue";import LocaleSwitcher from "~/components/LocaleSwitcher.vue";</script><template>  <div>    <header>      <LocaleSwitcher />    </header>    <main>      <slot />    </main>    <Links href="/">ホーム</Links>    <Links href="/about">アバウト</Links>  </div></template>

    Links コンポーネント(以下に示す)は、内部ナビゲーションリンクが自動的にローカライズされることを保証します。

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

    nuxt-intlayer モジュールを使用すると、Nuxtはローカライズされたルーティングを自動的に処理します。これは、ページのディレクトリ構造に基づいて各言語のルートを自動的に作成します。

    例:

    plaintext
    コードをコピー

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

    pages/├── index.vue          → /, /fr, /es├── about.vue          → /about, /fr/about, /es/about└── contact/    └── index.vue      → /contact, /fr/contact, /es/contact

    ローカライズされたページを作成するには、単に pages/ ディレクトリに Vue ファイルを作成します。以下に2つの例を示します。

    ホームページ (pages/index.vue):

    pages/index.vue
    コードをコピー

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

    <script setup lang="ts">import { useIntlayer } from "vue-intlayer";const content = useIntlayer("home-page");useHead({  title: content.metaTitle.raw,  meta: [    {      name: "description",      content: content.metaDescription.raw,    },  ],});</script><template>  <h1><content.title /></h1></template>

    アバウトページ (pages/about.vue):

    pages/about.vue
    コードをコピー

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

    <script setup lang="ts">import { useIntlayer } from "vue-intlayer";const content = useIntlayer("about-page");useHead({  title: content.metaTitle.raw, // プリミティブ文字列アクセスには .raw を使用  meta: [    {      name: "description",      content: content.metaDescription.raw, // プリミティブな文字列アクセスには .raw を使用    },  ],});</script><template>  <h1><content.title /></h1></template>
    注意: useHead は Nuxt で自動インポートされます。コンテンツの値には .value(リアクティブ)または .raw(プリミティブ文字列)を用途に応じて使用できます。

    nuxt-intlayer モジュールは自動的に以下を行います:

    • ユーザーの優先ロケールを検出
    • URL を介したロケール切り替えの処理
    • 適切な <html lang=""> 属性の設定
    • ロケールクッキーの管理
    • ユーザーを適切なローカライズされた URL にリダイレクト

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

    アプリケーションのナビゲーションが現在のロケールを尊重するようにするために、カスタムの Links コンポーネントを作成できます。このコンポーネントは内部URLに自動的に現在の言語をプレフィックスとして付加し、これはSEOおよびページの発見性に不可欠です。

    components/Links.vue
    コードをコピー

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

    <script setup lang="ts">import { getLocalizedUrl } from "intlayer";import { useLocale } from "vue-intlayer";interface Props {  href: string;  locale?: string;}const props = defineProps<Props>();const { locale: currentLocale } = useLocale();// 最終的なパスを計算するconst finalPath = computed(() => {  // 1. リンクが外部かどうかをチェック  const isExternal = /^https?:\/\//.test(props.href || "");  // 2. 外部の場合はそのまま返す(NuxtLinkが<a>タグの生成を処理)  if (isExternal) return props.href;  // 3. 内部リンクの場合、URLをローカライズする  const targetLocale = props.locale || currentLocale.value;  return getLocalizedUrl(props.href, targetLocale);});</script><template>  <NuxtLink :to="finalPath" v-bind="$attrs">    <slot />  </NuxtLink></template>

    次に、このコンポーネントをアプリケーション全体で使用します:

    layouts/default.vue
    コードをコピー

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

    <script setup lang="ts">import Links from "~/components/Links.vue";import LocaleSwitcher from "~/components/LocaleSwitcher.vue";</script><template>  <div>    <header>      <LocaleSwitcher />    </header>    <main>      <slot />    </main>    <Links href="/">ホーム</Links>    <Links href="/about">アバウト</Links>  </div></template>

    NuxtLink をローカライズされたパスで使用することで、以下を保証できます:

    • 検索エンジンがすべての言語バージョンのページをクロールおよびインデックスできる
    • ユーザーがローカライズされたURLを直接共有できる
    • ブラウザの履歴がロケール接頭辞付きURLで正しく動作する

    (オプション)ステップ9:メタデータとSEOの処理

    Nuxtは useHead コンポーザブル(自動インポート)を通じて優れたSEO機能を提供します。Intlayerを使って、.raw または .value アクセサを用いてプリミティブな文字列値を取得し、ローカライズされたメタデータを扱うことができます:

    pages/about.vue
    コードをコピー

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

    <script setup lang="ts">import { useIntlayer } from "vue-intlayer";// useHeadはNuxtで自動インポートされますconst content = useIntlayer("about-page");useHead({  title: content.metaTitle.raw, // プリミティブな文字列アクセスには .raw を使用  meta: [    {      name: "description",      content: content.metaDescription.raw, // プリミティブな文字列アクセスには .raw を使用    },  ],});</script><template>  <h1><content.title /></h1></template>
    あるいは、Vueのリアクティビティなしでコンテンツを取得するために import { getIntlayer } from "intlayer" 関数を使用することもできます。

    コンテンツ値へのアクセス方法:

    • プリミティブな文字列値(非リアクティブ)を取得するには .raw を使用
    • リアクティブな値を取得するには .value を使用
    • Visual Editorサポートのために <content.key /> コンポーネント構文を使用

    対応するコンテンツ宣言を作成します:

    pages/about-page.content.ts
    コードをコピー

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

    import { t, type Dictionary } from "intlayer";
    
    const aboutPageContent = {
      key: "about-page",
      content: {
        metaTitle: t({
          en: "About Us - My Company",
          fr: "À Propos - Ma Société",
          es: "Acerca de Nosotros - Mi Empresa",
        }),
        metaDescription: t({
          ja: "私たちの会社とミッションについて詳しく知る",
          en: "Learn more about our company and our mission",
          fr: "En savoir plus sur notre société et notre mission",
          es: "Conozca más sobre nuestra empresa y nuestra misión",
        }),
        title: t({
          ja: "私たちについて",
          en: "About Us",
          fr: "À Propos",
          es: "Acerca de Nosotros",
        }),
      },
    } satisfies Dictionary;
    
    export default aboutPageContent;

    Gitの設定

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

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

    .gitignore
    コードをコピー

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

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

    VS Code拡張機能

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

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

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

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

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


    さらに進む

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

    ViteおよびVue
    ViteおよびSolid
    Alt+→

    このページについて

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

      npm install intlayer vue-intlayernpm install --save-dev nuxt-intlayernpx intlayer init
      import { defineNuxtConfig } from "nuxt/config";export default defineNuxtConfig({  // ... 既存のNuxt設定  modules: ["nuxt-intlayer"],});
      <script setup lang="ts">import { ref } from "vue";import { useIntlayer } from "vue-intlayer";defineProps({  msg: String,});const {  count,  edit,  checkOut,  nuxtIntlayer,  learnMore,  nuxtDocs,  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://nuxt.com/docs/getting-started/introduction" target="_blank"      >Nuxt</a    >、<nuxtIntlayer />  </p>  <p>    <learnMore />    <a href="https://nuxt.com" target="_blank"><nuxtDocs /></a>。  </p>  <p class="read-the-docs"><readTheDocs /></p>  <p class="read-the-docs">{{ readTheDocs }}</p></template>
      <script setup lang="ts">import { getLocaleName, getLocalizedUrl } from "intlayer";import { useLocale } from "vue-intlayer";// NuxtはuseRouteを自動インポートしますconst route = useRoute();const { locale, availableLocales, setLocale } = useLocale();</script><template>  <nav class="locale-switcher">    <NuxtLink      v-for="localeEl in availableLocales"      :key="localeEl"      :to="getLocalizedUrl(route.fullPath, localeEl)"      class="locale-link"      :class="{ 'active-locale': localeEl === locale }"      @click="setLocale(localeEl)"    >      {{ getLocaleName(localeEl) }}    </NuxtLink>  </nav></template>
      <template>  <NuxtLayout>    <NuxtPage />  </NuxtLayout></template>
      <script setup lang="ts">import Links from "~/components/Links.vue";import LocaleSwitcher from "~/components/LocaleSwitcher.vue";</script><template>  <div>    <header>      <LocaleSwitcher />    </header>    <main>      <slot />    </main>    <Links href="/">ホーム</Links>    <Links href="/about">アバウト</Links>  </div></template>
      pages/├── index.vue          → /, /fr, /es├── about.vue          → /about, /fr/about, /es/about└── contact/    └── index.vue      → /contact, /fr/contact, /es/contact
      <script setup lang="ts">import { useIntlayer } from "vue-intlayer";const content = useIntlayer("home-page");useHead({  title: content.metaTitle.raw,  meta: [    {      name: "description",      content: content.metaDescription.raw,    },  ],});</script><template>  <h1><content.title /></h1></template>
      <script setup lang="ts">import { useIntlayer } from "vue-intlayer";const content = useIntlayer("about-page");useHead({  title: content.metaTitle.raw, // プリミティブ文字列アクセスには .raw を使用  meta: [    {      name: "description",      content: content.metaDescription.raw, // プリミティブな文字列アクセスには .raw を使用    },  ],});</script><template>  <h1><content.title /></h1></template>
      <script setup lang="ts">import { getLocalizedUrl } from "intlayer";import { useLocale } from "vue-intlayer";interface Props {  href: string;  locale?: string;}const props = defineProps<Props>();const { locale: currentLocale } = useLocale();// 最終的なパスを計算するconst finalPath = computed(() => {  // 1. リンクが外部かどうかをチェック  const isExternal = /^https?:\/\//.test(props.href || "");  // 2. 外部の場合はそのまま返す(NuxtLinkが<a>タグの生成を処理)  if (isExternal) return props.href;  // 3. 内部リンクの場合、URLをローカライズする  const targetLocale = props.locale || currentLocale.value;  return getLocalizedUrl(props.href, targetLocale);});</script><template>  <NuxtLink :to="finalPath" v-bind="$attrs">    <slot />  </NuxtLink></template>
      <script setup lang="ts">import Links from "~/components/Links.vue";import LocaleSwitcher from "~/components/LocaleSwitcher.vue";</script><template>  <div>    <header>      <LocaleSwitcher />    </header>    <main>      <slot />    </main>    <Links href="/">ホーム</Links>    <Links href="/about">アバウト</Links>  </div></template>
      <script setup lang="ts">import { useIntlayer } from "vue-intlayer";// useHeadはNuxtで自動インポートされますconst content = useIntlayer("about-page");useHead({  title: content.metaTitle.raw, // プリミティブな文字列アクセスには .raw を使用  meta: [    {      name: "description",      content: content.metaDescription.raw, // プリミティブな文字列アクセスには .raw を使用    },  ],});</script><template>  <h1><content.title /></h1></template>
      # Intlayerによって生成されたファイルを無視する.intlayer