# General Translation Knowledge Base: 多言語対応の Next.js アプリで SEO を設定するには？
URL: https://generaltranslation.com/ja/kb/multilingual-nextjs-seo.mdx
Docs index: https://generaltranslation.com/llms.txt
Description: 各言語に /en/about や /es/about のようなプレフィックス付きの URL を割り当て、公開している言語ごとに html lang、自己参照のカノニカル、x-default を含む hreflang の代替リンク、翻訳済みのタイトルと説明文、サイトマップのエントリを出力します。未公開のバージョンには noindex を指定します。General Translation の gt-next は各言語を専用の URL にルーティングし、getGT でタイトルを翻訳します。
Category: 多言語SEO
Last updated: 2026-10-22
Authors: General Translation Team
Published: 2026-02-17

Next.js における多言語 SEO とは、ページの各言語バージョンに専用の URL を割り当て、それらの URL の関係を検索エンジンに伝えることです。クッキーや `Accept-Language` ヘッダーから言語を決めるページは URL が 1 つしかないため、通常は 1 つの言語でしかインデックスされません。各言語バージョンは次の表の 6 つの要件をすべて満たす必要があり、さらにルーティング、メタデータ、サイトマップの間で各言語の URL を一致させなければなりません。

| 要件               | 役割                                                  | Next.js での設定場所                                |
| ---------------- | --------------------------------------------------- | --------------------------------------------- |
| 言語ごとの URL        | 各バージョンを、クロール・インデックスの対象となる個別のページにする                  | `[locale]` ルートセグメントとロケールルーティングのミドルウェア         |
| `<html lang>`    | ブラウザや支援技術にページの言語を伝える                                | ルートレイアウト (`app/[locale]/layout.tsx`)          |
| カノニカル URL        | この URL が他言語の重複ではなく、その言語における優先バージョンであることを示す          | `generateMetadata` 内の `alternates.canonical`  |
| `hreflang` 代替リンク | このページ自身を含む公開済みのすべての言語バージョンと、フォールバックとしての `x-default` | `generateMetadata` 内の `alternates.languages`  |
| 翻訳済みのタイトルと説明文    | その言語の検索結果に通常表示されるテキスト                               | `generateMetadata` 内の `title` と `description` |
| サイトマップのエントリ      | 全ページの、公開済みのすべての言語の URL                              | `app/sitemap.ts`                              |

General Translation の `gt-next` は各言語を `/es/about` のような URL にルーティングし、[`getGT`](/docs/react/nextjs/reference/functions/get-gt) でタイトルと説明文を翻訳します。カノニカル URL、`hreflang` 代替リンク、サイトマップは Next.js の[メタデータ API](https://nextjs.org/docs/app/api-reference/functions/generate-metadata#alternates) で生成します。

## Video

The video is narrated in English, with English captions.

[How do I set up SEO for a multilingual Next.js app?](https://caxecubb9c64cezv.public.blob.vercel-storage.com/films/kb-multilingual-nextjs-seo.mp4) (50 秒)

General Translation lets you give every language its own URL and tell search engines about them. Move your pages into `app/[locale]` with `gt-next`'s middleware, set the html `lang` attribute with `useLocale`, add canonical and hreflang links with a helper, translate the title with `getGT`, and list every page in every language in a sitemap.

## Google が Next.js サイトの1つの言語しかインデックスしないのはなぜですか？

すべての言語が1つの URL を共有していると、Google は1つの言語しかインデックスしません。Googlebot は [`Accept-Language` ヘッダーを付けずにリクエストを送信し](https://developers.google.com/search/docs/specialty/international/locale-adaptive-pages)、[ページの読み込みをまたいでクッキーを保持しない](https://developers.google.com/search/docs/crawling-indexing/javascript/fix-search-javascript)ため、そのどちらかをもとに言語を選択するページは、Google に対して常にデフォルトの言語を表示することになります。その他の言語には、Google がクロールできる URL がありません。

解決策は、言語ごとに個別の URL を用意し、`hreflang` の代替リンクとサイトマップに記載することです。Google も、クッキーやブラウザ設定に頼るよりも[言語バージョンごとに個別の URL を使用することを推奨しています](https://developers.google.com/search/docs/specialty/international/managing-multi-regional-sites)。ミドルウェアを使用していない General Translation の `gt-next` アプリにも同じ問題があります。ロケールセレクターは選択内容をクッキーに保存するため、[`createNextMiddleware`](/docs/react/nextjs/reference/functions/create-next-middleware) を追加するまで URL にはプレフィックスが付きません。

完全に翻訳された英語ページとフランス語ページは、同じ製品を説明しているからといって重複とみなされるわけではありません。Google がローカライズ版を重複とみなすのは、メインコンテンツが未翻訳のままの場合だけです (Google の[ローカライズ版ページに関するガイダンス](https://developers.google.com/search/docs/specialty/international/localized-versions)を参照してください) 。

## 言語別バージョンにはサブディレクトリ、サブドメイン、別ドメインのどれを使うべきか？

市場ごとに個別のサーバー所在地や独立したサイトが必要な場合を除き、`example.com/es/about` のようなサブディレクトリを使用してください。Google の[多地域・多言語サイトの管理](https://developers.google.com/search/docs/specialty/international/managing-multi-regional-sites)に関するガイドでは、すべての言語が 1 つのホストにまとまるため、サブディレクトリは設定が簡単で保守の手間も少ないとされています。一方、URL パラメータは推奨されていません。

| 構成            | 例                           | Google の評価                                   | Next.jsアプリの場合                                                                                                            |
| ------------- | --------------------------- | -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
| サブディレクトリ      | `example.com/es/about`      | 設定が簡単、保守の手間が少ない (同一ホスト) 、サーバー所在地は 1 か所       | General Translation の `gt-next` ミドルウェアがデフォルトでこの構成に対応                                                                     |
| サブドメイン        | `es.example.com/about`      | 設定が簡単、サーバー所在地を分けられる                          | ホストベースのルーティングを自前で実装。[`createNextMiddleware`](/docs/react/nextjs/reference/functions/create-next-middleware) はパスでルーティングする |
| 国別ドメイン        | `example.es/about`          | ジオターゲティングが明確だが、コストが高くインフラも増える。1 ドメインにつき 1 か国 | ドメインごとのデプロイまたはホストベースのルーティング                                                                                              |
| URL パラメータ     | `example.com/about?lang=es` | 非推奨                                          | 使用しない                                                                                                                    |
| クッキーまたはヘッダーのみ | `example.com/about`         | 代わりに個別の URL を推奨                              | 1 言語でしかインデックス登録されない                                                                                                      |

市場ごとに別々のホスティングや国別ターゲティングが必要な場合は、サブドメインまたは国別ドメインを使用してください。Next.js を単一のデプロイで運用するなら、サブディレクトリが最も少ないコードで済みます。General Translation の `gt-next` ミドルウェアはデフォルトで `/es/about` に対応していますが、サブドメインや国別ドメインではホストベースのルーティングを自前で実装する必要があります。 (各構成のトレードオフについては、[URL 構成の比較](/kb/multilingual-url-structure)を参照してください。)

## Next.jsで言語ごとに個別のURLを割り当てるには？

ロケールルーティング用のミドルウェアと`app/[locale]`ルートセグメントを追加します。General Translationの`gt-next`を使う場合は、プロジェクトルートに`proxy.ts`を作成します (Next.js 15以前では`middleware.ts`) 。

```ts title="proxy.ts"
import { createNextMiddleware } from 'gt-next/middleware';

export default createNextMiddleware({ prefixDefaultLocale: true });

export const config = {
  matcher: ['/((?!api|static|.*\\..*|_next).*)'],
};
```

次に、ページを `app/[locale]` 配下に移動します。

```text
proxy.ts
app/
├── sitemap.ts
└── [locale]/
    ├── layout.tsx
    ├── page.tsx
    └── about/
        └── page.tsx
```

`prefixDefaultLocale: true` を指定すると、英語を含むすべてのロケールにプレフィックスが付くため、各コンテンツURLは常に1つの言語だけを配信します。この記事では、全体を通してこの設定を前提とします。`/about` のようなプレフィックスのないパスはエントリポイントとして扱われます。ミドルウェアは一時的な `307` リダイレクトで応答し、訪問者の保存済みロケール、または `Accept-Language` に最も一致するロケールへ、どちらもない場合は `/en/about` へリダイレクトします。ローカライズされたURLがリダイレクトされることはなく、`/en/about` はフランス語を優先するブラウザに対しても英語を返します。このオプションを指定しない場合、デフォルトロケールにはプレフィックスが付かず、`/about` はクッキーやブラウザのヘッダーに基づいてリダイレクトされる場合があります (これが重要な理由については、[ロケールルーティングとSEO](/kb/locale-routing-seo)を参照してください) 。

ルーティングを変更する設定は、ほかに次の 2 つがあります。

* [`pathConfig`](/docs/react/nextjs/reference/functions/create-next-middleware#path-config) を使うと、`/about` を `/fr/a-propos` にするなど、パスを翻訳できます。
* `withGTConfig` で [`ignoreBrowserLocales: true`](/docs/react/nextjs/config#ignore-browser-locales) を指定すると、ミドルウェアは `Accept-Language` ヘッダーに基づいてロケールを選択しなくなります。Google は、訪問者の言語を推測して[リダイレクトすることを推奨していません](https://developers.google.com/search/docs/specialty/international/managing-multi-regional-sites)。

`generateStaticParams` でページをプリレンダリングする場合は、プロジェクトルートに `getLocale.ts` も追加してください。静的生成時にはミドルウェアが実行されないためです。ファイルの内容とルーティングの詳しい手順は、[App Router ミドルウェアガイド](/docs/react/nextjs/app-router-middleware#root-locale)を参照してください。

## ロケールごとに html の lang 属性を設定するにはどうすればよいですか？

ルートレイアウト `app/[locale]/layout.tsx` で、`[locale]` ルートパラメータの値を `lang` に設定します。[`isLocaleSupported`](/docs/react/nextjs/reference/functions/is-locale-supported) でチェックしておけば、設定していないロケールでアクセスされた場合に、その URL でデフォルトロケールにフォールバックするのではなく 404 を返せます：

```tsx title="app/[locale]/layout.tsx"
import { GTProvider, isLocaleSupported } from 'gt-next';
import { notFound } from 'next/navigation';

export default async function LocaleLayout({
  children,
  params,
}: {
  children: React.ReactNode;
  params: Promise<{ locale: string }>;
}) {
  const { locale } = await params;

  if (!isLocaleSupported(locale)) {
    notFound();
  }

  return (
    <html lang={locale}>
      <body>
        <GTProvider>{children}</GTProvider>
      </body>
    </html>
  );
}
```

`lang` 属性は、支援技術や、言語に応じて動作を変えるブラウザに対してページの言語を伝えるものです。Google は `lang` 属性ではなく[表示されるコンテンツ](https://developers.google.com/search/docs/specialty/international/managing-multi-regional-sites#language)から言語を判断します。そのため、`lang` はランキングを左右する手段としてではなく、アクセシビリティのために正確に設定してください。

ページをプリレンダリングする場合、ルートレイアウトは `app/[locale]/layout.tsx` に配置します。`[locale]` セグメントより上位にあるレイアウトでは、静的生成時にロケールを読み取れないためです。URL セグメントが中国語を表す `/cn` のようなエイリアスの場合は、[`resolveCanonicalLocale`](/docs/react/nextjs/reference/functions/resolve-canonical-locale) で変換して `lang` が `zh` になるようにします。メタデータやサイトマップでのエイリアスの扱いについては、[ロケールエイリアスの SEO 管理](/docs/react/nextjs/locale-alias-seo)を参照してください。

## Next.js App Routerでhreflangの代替リンクとカノニカルURLを追加するには？

Next.js App Routerでは、各ページの`generateMetadata`から`alternates.languages`を返すと`hreflang`の代替リンクが、`alternates.canonical`を返すとカノニカルURLが追加されます。Next.jsは、`alternates.languages`の各エントリを`<link rel="alternate" hreflang>`タグとしてレンダリングします。

Googleは[各言語版が自身を含むすべての版を列挙すること](https://developers.google.com/search/docs/specialty/international/localized-versions)を求めており、2つのページが相互に宣言していない`hreflang`リンクは無視されます。そのため、ページのすべての版で同じリストを返す必要があります。`x-default`エントリは、どの版の言語にも該当しない訪問者向けのURLです。各版のカノニカルはその版自身のURLを指すようにし、翻訳ページのカノニカルを英語版に向けないでください。なお、カノニカルはあくまでシグナルであり、確実に反映される保証はありません。 ([hreflangとカノニカルタグ](/kb/what-is-hreflang#should-hreflang-pages-use-self-referencing-canonicals)を参照してください。) 

翻訳の公開は元のページより遅れることがあるため、カノニカル、代替リンク、サイトマップは、各ページがどのロケールで公開済みかを記録した単一のレコードから生成してください。次のヘルパーは、そのレコードをもとにカノニカルと代替リンクを構築し、未公開の版を`noindex`としてマークします：

```ts title="lib/i18n-metadata.ts"
import type { Metadata } from 'next';
import { getLocale } from 'gt-next/server';

export const BASE_URL = 'https://example.com';

// 各ページの公開先ロケール。翻訳のレビューが完了したら、そのロケールを追加します。
export const PUBLISHED: Record<string, string[]> = {
  '/': ['en', 'fr', 'es'],
  '/about': ['en', 'fr', 'es'],
  '/pricing': ['en', 'fr'], // スペイン語はまだ翻訳されていません
};

export const localeUrl = (locale: string, path: string) =>
  `${BASE_URL}/${locale}${path === '/' ? '' : path}`;

export async function getI18NMetadata(path: string): Promise<Metadata> {
  const locale = await getLocale();
  const published = PUBLISHED[path] ?? [];

  // 未公開のバージョンはインデックスされないようにします。
  if (!published.includes(locale)) {
    return {
      robots: { index: false },
      alternates: null,
    };
  }

  const languages: Record<string, string> = {};
  for (const loc of published) languages[loc] = localeUrl(loc, path);
  languages['x-default'] = localeUrl(published.includes('en') ? 'en' : published[0], path);

  return { alternates: { canonical: localeUrl(locale, path), languages } };
}
```

次に、各ページからこれを呼び出します：

```tsx title="app/[locale]/pricing/page.tsx"
import { getI18NMetadata } from '@/lib/i18n-metadata';

export async function generateMetadata() {
  return getI18NMetadata('/pricing');
}
```

Next.js 16.4.2 と `gt-next` 11.4.14 でビルドしたところ、3 つの言語すべてで公開されている `/fr/about` では、次の `<head>` がレンダリングされました：

```html title="/fr/about"
<html lang="fr">
<link rel="canonical" href="https://example.com/fr/about"/>
<link rel="alternate" hrefLang="en" href="https://example.com/en/about"/>
<link rel="alternate" hrefLang="fr" href="https://example.com/fr/about"/>
<link rel="alternate" hrefLang="es" href="https://example.com/es/about"/>
<link rel="alternate" hrefLang="x-default" href="https://example.com/en/about"/>
```

スペイン語版の料金ページは公開されていないため、`/fr/pricing` にはスペイン語の 代替リンクが含まれません：

```html title="/fr/pricing"
<html lang="fr">
<link rel="canonical" href="https://example.com/fr/pricing"/>
<link rel="alternate" hrefLang="en" href="https://example.com/en/pricing"/>
<link rel="alternate" hrefLang="fr" href="https://example.com/fr/pricing"/>
<link rel="alternate" hrefLang="x-default" href="https://example.com/en/pricing"/>
```

このルートは引き続き `/es/pricing` で応答しますが、その `<head>` には `<meta name="robots" content="noindex"/>` だけが含まれ、カノニカルや代替リンクは出力されません。そのため、クローラーは `noindex` の指示を検出できます。`alternates: null` を設定すると、親レイアウトから継承されたカノニカルや代替リンクはすべてクリアされます。ルートはクロール可能な状態のままにしておいてください。`noindex` はアクセス制御ではありません。`x-default` は、英語が公開されていれば英語を、公開されていなければ最初に公開されたロケールを指します。このヘルパーは、すべてのロケールで同じパスが使われることを前提としています。`pathConfig` による翻訳済みパス、ローカライズされたスラッグ、ルートのエイリアスを使用している場合は、そのルートマップから各ロケールの URL を組み立て、`fr` が `/fr/a-propos` を指すようにしてください。

あわせて、対応するページへの通常のリンクを備えた[言語切り替え機能](/kb/language-switcher)も用意してください。hreflang があっても、画面上に表示されるナビゲーションの選択肢は必要です。

## Next.jsでロケールごとにページタイトルとメタ説明文を翻訳するにはどうすればよいですか？

`generateMetadata` が返す文字列を翻訳します。検索結果には通常、ページのタイトルと説明文が表示されます。そのため、スペイン語のページに英語のタイトルが設定されていると、スペイン語の検索結果に英語のテキストが表示されてしまいます。なお、検索エンジンは表示するタイトルやスニペットを書き換えることがあるため、指定したメタデータがそのまま表示されるとは限りません。General Translationの `gt-next/server` が提供する [`getGT`](/docs/react/nextjs/reference/functions/get-gt) は、現在のリクエストのロケールに対応した翻訳関数を返し、`generateMetadata` 内でも使用できます。翻訳したタイトルと説明文を、ヘルパーが生成する代替リンクとあわせて返しましょう：

```tsx title="app/[locale]/about/page.tsx"
import type { Metadata } from 'next';
import { getGT } from 'gt-next/server';
import { getI18NMetadata } from '@/lib/i18n-metadata';

export async function generateMetadata(): Promise<Metadata> {
  const gt = await getGT();
  const i18nMeta = await getI18NMetadata('/about');

  return {
    title: gt('About us'),
    description: gt('Meet the team that builds our product.'),
    ...i18nMeta,
  };
}
```

ビルドステップで検出できるよう、上記の例のように文字列リテラルを渡してください。[`getGT`](/docs/react/nextjs/reference/functions/get-gt) の本番環境用の翻訳はデプロイ前に用意されるため、`next build` の前に [`npx gt translate`](/docs/cli/reference/commands/translate) を実行してください：

```json title="package.json"
{
  "scripts": {
    "build": "npx gt translate && next build"
  }
}
```

英語のタイトルを変更すると、次回のビルドで新しいテキストがすべてのロケールに翻訳されるため、メッセージファイルを更新する必要はありません。ロケールを `PUBLISHED` に追加する前に、[ダッシュボードのエディター](/docs/platform/dashboard/guides/reviewing-translations)でタイトルと説明文をレビューしてください。共有の[用語集](/docs/platform/dashboard/guides/defining-context-for-translations)を使えば、ページと検索用メタデータとで製品名の表記を統一しやすくなります。クリック率が一定の割合で向上すると決めてかからず、公開後に実際のインプレッション数、クリック数、コンバージョン数を測定してください。 (市場ごとのキーワード、言語による文字数の違い、Open Graphタグについては、[SEOタイトルとメタ説明文を翻訳するにはどうすればよいですか？](/kb/translate-seo-metadata)を参照してください。)

## Next.js のサイトマップにすべての言語を追加するにはどうすればよいですか？

`app/sitemap.ts` で、公開済みのロケールごとに、各ページのエントリを 1 つずつ列挙します。サイトマップと `hreflang` リンクの内容が食い違わないよう、どちらも同じ `PUBLISHED` レコードを参照します：

```ts title="app/sitemap.ts"
import type { MetadataRoute } from 'next';
import { PUBLISHED, localeUrl } from '@/lib/i18n-metadata';

export default function sitemap(): MetadataRoute.Sitemap {
  return Object.entries(PUBLISHED).flatMap(([path, locales]) =>
    locales.map((locale) => ({ url: localeUrl(locale, path) })),
  );
}
```

生成された `/sitemap.xml` には、`/en`、`/fr`、`/es`、3 つの `/about` ページ、`/en/pricing`、`/fr/pricing` の 8 つの URL が含まれていました。`/es/pricing` は公開されるまで含まれません。`lastModified` を追加する場合は、サイトマップの生成時刻ではなく、ページの内容が実際に更新された日付を指定してください (Google の[サイトマップに関するガイダンス](https://developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap)を参照) 。

ページのメタデータですでに HTML 内に `hreflang` を宣言しているため、このサイトマップには URL のみを記載しています。代わりにサイトマップ側で `hreflang` を宣言することもできます。その場合は、各エントリに `alternates.languages` マップを指定します。Next.js 14.2 以降では、これが各 `<url>` 内に `xhtml:link` の代替リンクとして出力されます。Google は [サイトマップ内の `hreflang`](https://developers.google.com/search/docs/specialty/international/localized-versions) を HTML 内の `hreflang` と同等に扱います。Google によると、両方の方法を併用しても検索上のメリットは増えないため、どちらか一方を選んでください。`alternates` フィールドの詳細は、Next.js の[サイトマップリファレンス](https://nextjs.org/docs/app/api-reference/file-conventions/metadata/sitemap#generate-a-localized-sitemap)を参照してください。(サイズの上限、サイトマップインデックスを使った分割、送信前に確認すべき点については、[多言語ウェブサイトのサイトマップを作成するにはどうすればよいですか？](/kb/multilingual-sitemap)を参照してください。)

## ロケールのルーティングとSEO向けのhreflangに対応できるNext.jsのi18nライブラリはどれか？

SEOのためには、Next.jsのi18nライブラリが言語ごとに個別のURLを提供する必要があります。General Translationの`gt-next`とnext-intlはどちらもApp Routerのミドルウェアでこれを実現しますが、i18nextとreact-intlではルーティングを自前で実装する必要があります。また、next-intlのミドルウェアは`hreflang`の代替リンクをHTTPヘッダーで送信し、`gt-next`はメッセージファイルを使わずにビルド時にタイトルと説明文を翻訳します。ただし、カノニカルURLやサイトマップを自動生成してくれるライブラリはありません。

| アプローチ                                    | 言語別URL                                                                                                                                         | `hreflang`                                                                                                              | 翻訳されたタイトルと説明文                                                                                                                                | カノニカルURLとサイトマップ                                     |
| ---------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------- |
| next-intl                                | ロケールプレフィックス付きのミドルウェア (デフォルトは`/en/about`) 、ローカライズされたパス名、またはロケールごとのドメイン                                                                          | ミドルウェアがデフォルトで[`x-default`を含む代替リンクを`Link` HTTPヘッダーで送信](https://next-intl.dev/docs/routing/configuration#alternate-links) | チームまたは翻訳サービスが各言語のJSONカタログに記述するメッセージ                                                                                                          | 自前で記述                                               |
| i18nextまたはreact-intl                     | Next.jsのルーティングなし。ミドルウェアは自前で記述                                                                                                                  | 自前で記述                                                                                                                   | 各言語のカタログ内のメッセージ                                                                                                                              | 自前で記述                                               |
| 訪問者のブラウザでのGoogle翻訳                       | ページごとに1つのURL                                                                                                                                   | なし                                                                                                                      | ブラウザ内でのみ翻訳。検索結果には翻訳元の言語が表示される                                                                                                                | URLが1つのため列挙不要                                       |
| AI APIの直接利用 (OpenAI API、Claude API)      | 自前で構築したルート                                                                                                                                     | 自前で記述                                                                                                                   | 文言を変更するたびに再実行するスクリプト                                                                                                                         | 自前で記述                                               |
| General Translation (`gt-next`と`gt` CLI) | [`createNextMiddleware`](/docs/react/nextjs/reference/functions/create-next-middleware)が`/en/about`、`/es/about`、および`/fr/a-propos`のような翻訳済みパスを配信 | 公開済みロケールのレコードをもとに構築した`alternates.languages`を`generateMetadata`から返す                                                      | [`getGT`](/docs/react/nextjs/reference/functions/get-gt)の文字列を、`next build`の前に[`npx gt translate`](/docs/cli/reference/commands/translate)で翻訳 | 同じレコードを使い、`generateMetadata`と`app/sitemap.ts`で自前で記述 |

チームがすでにメッセージカタログを管理しており、ミドルウェアから`hreflang`を送信したい場合はnext-intlが適しています。翻訳者がいて、文言がほとんど変わらず、ルーティングを実装する余裕がある場合はi18nextまたはreact-intlを選びましょう。ブラウザ翻訳は、検索エンジンがクロールできないログイン後のアプリなど、他言語からの検索流入が不要なページに限って使用してください。アプリの文言を頻繁に更新し、各言語版に専用のインデックス対象ページと翻訳済みタイトルが必要な場合は、General Translationの`gt-next`を使用してください。文言はコンポーネント内にインラインで記述したまま、ビルド時にページとタイトルがまとめて翻訳されます。Profoundのプラットフォームとドキュメントは、General Translationを利用して47以上のロケールで提供されています。 ([本番環境での導入事例](https://generaltranslation.com/enterprise)を参照してください。)

## Related questions

- [言語リダイレクトと SEO：URL、クッキー、Accept-Language のどれを使うべきか](https://generaltranslation.com/ja/kb/locale-routing-seo.mdx): Googlebot は Accept-Language ヘッダーを送信せず、クロールの大半を米国の IP アドレスから行います。そのため、インデックスさせたいすべてのページの言語は URL で決めましょう。保存済みのクッキーの選択、次いで Accept-Language を使うのは、/ のような中立的なルートのリダイレクト先を決める場合だけにとどめ、その際は一時的な 302 または 307 を使います。
- [hreflang とは？設定方法を解説](https://generaltranslation.com/ja/kb/what-is-hreflang.mdx): hreflang は、どの URL が同じページの言語版または地域版であるかを Google に伝え、検索結果に適切なページを表示させるための仕組みです。HTML の link タグ、HTTP の Link ヘッダー、またはサイトマップで追加し、すべてのリンクを相互に参照させたうえで、en-UK ではなく en-GB のような有効なコードを使用してください。
- [多言語SEOにおけるサブディレクトリ・サブドメイン・ccTLDの比較](https://generaltranslation.com/ja/kb/multilingual-url-structure.mdx): 1つのプロダクトでサイトとリリースプロセスを共有するなら、example.com/de/ のようなサブディレクトリを使いましょう。国を示せるのは ccTLD だけで、サブドメインなら個別にホスティングできます。Google は ?lang= パラメータを推奨しておらず、.io や .ai のようなバニティドメインは汎用ドメインとして扱います。
- [言語切り替え機能のベストプラクティス：UX、SEO、アクセシビリティ](https://generaltranslation.com/ja/kb/language-switcher.mdx): 各言語は Deutsch や 日本語 のようにその言語自身の名称で表記し、国を表す国旗は使わないでください。各選択肢からは、クロール可能なリンクで同じページの該当言語版へ遷移させ、選択内容はクッキーに保存します。ローカライズされた URL は決して自動リダイレクトしないでください。
- [多言語アプリのローカライゼーションテスト チェックリスト](https://generaltranslation.com/ja/kb/multilingual-app-launch-checklist.mdx): 本番環境のビルドで、サポート対象のすべてのロケールについて次の9項目をテストしてください：エラー状態やメールを含むジャーニー全体、言語の切り替え、複数形、通貨とタイムゾーン、テキストの伸長、右から左のレイアウト、アクセシビリティ、翻訳の配信、クロール可能な言語別URL。各項目には明確な合格条件を設けてください。

## Previous and next questions

- Previous question: [JSX の条件付きテキストはどのように翻訳すればよいですか？](https://generaltranslation.com/ja/kb/translate-conditional-jsx.mdx)
- Next question: [開発者にとって最適なローカライゼーションソフトウェアとは？](https://generaltranslation.com/ja/kb/best-localization-software.mdx)

## Sitemap

See the [Knowledge Base sitemap](https://generaltranslation.com/ja/kb/sitemap.md) for every article.
