# General Translation Knowledge Base: Как настроить SEO для многоязычного приложения Next.js?
URL: https://generaltranslation.com/ru/kb/multilingual-nextjs-seo.mdx
Docs index: https://generaltranslation.com/llms.txt
Description: Выделите каждому языку собственный URL с префиксом, например /en/about и /es/about, а затем укажите для каждого опубликованного языка html lang, канонический URL, ссылающийся на саму страницу, альтернативные версии hreflang с x-default, переведённые заголовок и описание, а также запись в карте сайта. Неопубликованные версии пометьте noindex. gt-next от General Translation направляет каждый язык на собственный URL и переводит заголовки с помощью getGT.
Category: Многоязычное SEO
Last updated: 2026-10-22
Authors: General Translation Team
Published: 2026-02-17

Многоязычное SEO в Next.js сводится к тому, чтобы выделить каждой языковой версии страницы собственный URL и сообщить поисковым системам, как эти URL связаны между собой. Если страница выбирает язык по cookie-файлу или заголовку `Accept-Language`, у неё один URL, поэтому поисковые системы обычно индексируют её только на одном языке. Каждая языковая версия должна соответствовать шести требованиям из таблицы ниже, а маршрутизация, метаданные и карта сайта должны указывать для каждого языка один и тот же URL.

| Требование                        | Назначение                                                                                | Где задаётся в Next.js                                                      |
| --------------------------------- | ----------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
| Отдельный URL для каждого языка   | Каждая версия — отдельная страница для сканирования и индексации                          | Сегмент маршрута `[locale]` и промежуточное ПО для маршрутизации по локалям |
| `<html lang>`                     | Указывает язык страницы для браузеров и вспомогательных технологий                        | Корневой макет, `app/[locale]/layout.tsx`                                   |
| Канонический URL                  | Этот URL — предпочтительная версия для своего языка, а не дубликат другой языковой версии | `alternates.canonical` в `generateMetadata`                                 |
| Альтернативные версии `hreflang`  | Все опубликованные языковые версии страницы, включая текущую, плюс резервная `x-default`  | `alternates.languages` в `generateMetadata`                                 |
| Переведённые заголовок и описание | Текст, который обычно отображается в результатах поиска на этом языке                     | `title` и `description` в `generateMetadata`                                |
| Запись в карте сайта              | Все опубликованные языковые URL каждой страницы                                           | `app/sitemap.ts`                                                            |

`gt-next` от General Translation направляет каждый язык на URL вида `/es/about` и переводит заголовки и описания с помощью [`getGT`](/docs/react/nextjs/reference/functions/get-gt). Канонический URL, альтернативные версии `hreflang` и карта сайта задаются через [API метаданных](https://nextjs.org/docs/app/api-reference/functions/generate-metadata#alternates) Next.js.

## 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?

Google индексирует только один язык, если все языковые версии открываются по одному и тому же URL. Googlebot [отправляет запросы без заголовка `Accept-Language`](https://developers.google.com/search/docs/specialty/international/locale-adaptive-pages) и [не сохраняет cookie-файлы между загрузками страниц](https://developers.google.com/search/docs/crawling-indexing/javascript/fix-search-javascript), поэтому страница, которая выбирает язык на основе одного из них, всегда показывает Google язык по умолчанию. У остальных языков просто нет URL, которые Google мог бы просканировать.

Решение — выделить каждому языку отдельный URL и указать его в альтернативных версиях `hreflang` и в карте сайта. Google [рекомендует использовать отдельные URL для каждой языковой версии](https://developers.google.com/search/docs/specialty/international/managing-multi-regional-sites), а не полагаться на cookie-файлы или настройки браузера. У приложения General Translation на `gt-next` без промежуточного ПО та же проблема: селектор локали сохраняет выбор в cookie-файле, а URL остаются без префикса, пока вы не добавите [`createNextMiddleware`](/docs/react/nextjs/reference/functions/create-next-middleware).

Полностью переведённые английская и французская страницы не являются дубликатами только потому, что описывают один и тот же продукт. 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) подкаталоги названы простыми в настройке и обслуживании, поскольку все языковые версии размещаются на одном хосте. URL-параметры Google использовать не рекомендует.

| Структура                        | Пример                      | Оценка Google                                                                       | В приложении Next.js                                                                                                                                                        |
| -------------------------------- | --------------------------- | ----------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Подкаталоги                      | `example.com/es/about`      | Простая настройка, лёгкое обслуживание (один хост), одно расположение сервера       | Промежуточное ПО `gt-next` от General Translation по умолчанию поддерживает эту структуру                                                                                   |
| Поддомены                        | `es.example.com/about`      | Простая настройка, возможны разные расположения серверов                            | Маршрутизацию по хосту нужно писать самостоятельно; [`createNextMiddleware`](/docs/react/nextjs/reference/functions/create-next-middleware) выполняет маршрутизацию по пути |
| Национальные домены              | `example.es/about`          | Чёткий геотаргетинг, но дорого, требует больше инфраструктуры, одна страна на домен | Отдельное развёртывание или маршрутизация по хосту для каждого домена                                                                                                       |
| URL-параметры                    | `example.com/about?lang=es` | Не рекомендуется                                                                    | Избегайте                                                                                                                                                                   |
| Только cookie-файл или заголовок | `example.com/about`         | Рекомендуется использовать отдельные URL                                            | Индексируется только на одном языке                                                                                                                                         |

Используйте поддомены или национальные домены, если для рынков нужен отдельный хостинг или таргетинг по странам. При одном развёртывании Next.js подкаталоги требуют меньше всего кода: промежуточное ПО `gt-next` от General Translation по умолчанию обслуживает `/es/about`, а для поддоменов и национальных доменов маршрутизацию по хосту придётся писать самостоятельно. (Плюсы и минусы каждого варианта описаны в [сравнении структур URL](/kb/multilingual-url-structure).)

## Как в Next.js задать для каждого языка собственный URL?

Добавьте промежуточное ПО для маршрутизации по локалям и сегмент маршрута `app/[locale]`. Если вы используете `gt-next` от General Translation, создайте файл `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 с контентом всегда отдаёт страницу на одном языке. Во всех примерах этой статьи используется именно такая конфигурация. Путь без префикса, например `/about`, становится точкой входа: промежуточное ПО отвечает временным перенаправлением `307` на сохранённую у посетителя локаль или на локаль, лучше всего соответствующую `Accept-Language`, а если нет ни того ни другого — на `/en/about`. Локализованный URL никогда не перенаправляется: `/en/about` возвращает английскую версию даже браузеру, предпочитающему французский. Без этого параметра локаль по умолчанию отдаётся без префикса, и `/about` может перенаправлять в зависимости от cookie-файла или заголовка браузера. (Почему это важно, см. в статье [маршрутизация по локалям и SEO](/kb/locale-routing-seo).)

Маршрутизацию меняют ещё две настройки:

* [`pathConfig`](/docs/react/nextjs/reference/functions/create-next-middleware#path-config) переводит пути, например `/fr/a-propos` вместо `/about`.
* [`ignoreBrowserLocales: true`](/docs/react/nextjs/config#ignore-browser-locales) в `withGTConfig` отключает выбор локали промежуточным ПО по заголовку `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 для каждой локали?

Задайте `lang` на основе параметра маршрута `[locale]` в корневом макете `app/[locale]/layout.tsx`. Благодаря проверке [`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 определяет язык по [видимому содержимому](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).

## Как добавить альтернативные ссылки hreflang и канонические URL в Next.js App Router?

В Next.js App Router альтернативные ссылки `hreflang` добавляются через `alternates.languages`, возвращаемое из `generateMetadata` каждой страницы, а канонический URL — через `alternates.canonical`. Next.js рендерит каждую запись `alternates.languages` как тег `<link rel="alternate" hreflang>`.

Google требует, чтобы [каждая языковая версия ссылалась на саму себя и на все остальные версии](https://developers.google.com/search/docs/specialty/international/localized-versions), и игнорирует ссылки `hreflang`, если они не объявлены на обеих страницах. Поэтому каждая версия страницы должна возвращать один и тот же список. Запись `x-default` — это URL для посетителей, язык которых не совпадает ни с одной из версий. Канонический URL каждой версии должен указывать на её собственный адрес; не направляйте переведённые страницы на английскую версию. Канонический URL — это сигнал, а не гарантия (см. [теги hreflang и canonical](/kb/what-is-hreflang#should-hreflang-pages-use-self-referencing-canonicals)).

Перевод может отставать от исходной страницы, поэтому формируйте канонический URL, альтернативные версии и карту сайта из единого источника данных о том, в каких локалях опубликована каждая страница. Эта вспомогательная функция строит на его основе канонический URL и альтернативные версии, а ещё не опубликованную версию помечает как `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 страница `/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"/>` — без канонического URL и альтернативных версий, — поэтому поисковые роботы могут увидеть инструкцию `noindex`. Значение `alternates: null` сбрасывает канонический URL и альтернативные версии, унаследованные от родительского макета. Не закрывайте маршрут от сканирования: `noindex` не является средством контроля доступа. `x-default` указывает на английскую версию, если она опубликована, а иначе — на первую опубликованную локаль. Вспомогательная функция исходит из того, что путь одинаков во всех локалях. Если вы используете переведённые пути из `pathConfig`, локализованные слаги или алиасы маршрутов, формируйте URL для каждой локали по этой карте маршрутов, чтобы `fr` указывал на `/fr/a-propos`.

Также добавьте [переключатель языка](/kb/language-switcher) с обычными ссылками на соответствующие страницы. Hreflang не заменяет видимый элемент навигации.

## Как перевести заголовки страниц и метаописания для каждой локали в Next.js?

Переведите строки, которые возвращает `generateMetadata`. В результатах поиска обычно отображаются заголовок и описание страницы, поэтому если у испанской страницы английский заголовок, в испанской поисковой выдаче появится английский текст. Кроме того, поисковые системы могут переписывать отображаемые заголовки и сниппеты, так что заданные метаданные не гарантируют, что страница будет показана именно в таком виде. Функция [`getGT`](/docs/react/nextjs/reference/functions/get-gt) из `gt-next/server` от General Translation возвращает функцию перевода для локали текущего запроса и работает внутри `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). Общие [термины Glossary](/docs/platform/dashboard/guides/defining-context-for-translations) помогают единообразно передавать названия продуктов как на странице, так и в её поисковых метаданных. После публикации измеряйте реальные показы, клики и конверсии, а не рассчитывайте на заранее известный рост CTR. (О ключевых словах для разных рынков, длине текста на разных языках и тегах Open Graph см. статью [Как перевести SEO-заголовки и метаописания?](/kb/translate-seo-metadata))

## Как добавить все языки в карту сайта Next.js?

Укажите в `app/sitemap.ts` по одной записи для каждой страницы в каждой опубликованной локали. Берите данные из того же Record `PUBLISHED`, чтобы карта сайта и ссылки `hreflang` всегда совпадали:

```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` содержал восемь URL: `/en`, `/fr`, `/es`, три версии `/about`, `/en/pricing` и `/fr/pricing`. `/es/pricing` не попадёт в карту сайта, пока страница не будет опубликована. Если вы добавляете `lastModified`, указывайте дату последнего содержательного обновления страницы, а не время генерации карты сайта. (См. [рекомендации Google по картам сайта](https://developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap)).

Поскольку `hreflang` уже объявлен в HTML-метаданных страниц, эта карта сайта содержит только URL. Вместо этого `hreflang` можно объявить в самой карте сайта: задайте для каждой записи объект `alternates.languages`, и Next.js 14.2 и новее выведет его как альтернативные версии `xhtml:link` внутри каждого `<url>`. Google обрабатывает [`hreflang` в карте сайта](https://developers.google.com/search/docs/specialty/international/localized-versions) так же, как `hreflang` в HTML. По словам Google, использование обоих способов одновременно не даёт дополнительных преимуществ в поиске, поэтому выберите какой-то один. Поле `alternates` описано в [справочнике Next.js по картам сайта](https://nextjs.org/docs/app/api-reference/file-conventions/metadata/sitemap#generate-a-localized-sitemap). (Об ограничениях на размер, разбиении с помощью индексного файла карт сайта и проверках перед отправкой см. [Как создать карту сайта для многоязычного веб-сайта?](/kb/multilingual-sitemap))

## Какая библиотека интернационализации для Next.js поддерживает маршруты локалей и hreflang для SEO?

Для SEO библиотека интернационализации для Next.js должна выделять каждому языку собственный URL. `gt-next` от General Translation и next-intl делают это с помощью промежуточного ПО App Router, а i18next и react-intl оставляют маршрутизацию вам. Промежуточное ПО next-intl также отправляет альтернативные версии `hreflang` в HTTP-заголовке, а `gt-next` переводит заголовки страниц и описания во время сборки без файлов сообщений. Ни одна из этих библиотек не создаёт за вас канонический URL или карту сайта.

| Подход                                       | URL для языков                                                                                                                                                            | `hreflang`                                                                                                                                                                       | Переведённые заголовки и описания                                                                                                                                      | Канонический URL и карта сайта                                                |
| -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- |
| next-intl                                    | Промежуточное ПО с префиксами локалей (`/en/about` по умолчанию), локализованными путями или отдельным доменом для каждой локали                                          | Промежуточное ПО по умолчанию [отправляет альтернативные версии, включая `x-default`, в HTTP-заголовке `Link`](https://next-intl.dev/docs/routing/configuration#alternate-links) | Сообщения, которые ваша команда или сервис перевода записывает в JSON-каталог каждого языка                                                                            | Пишете сами                                                                   |
| i18next или react-intl                       | Маршрутизации для Next.js нет; промежуточное ПО пишете вы                                                                                                                 | Пишете сами                                                                                                                                                                      | Сообщения в каталоге каждого языка                                                                                                                                     | Пишете сами                                                                   |
| Google Translate в браузере посетителя       | Один URL на страницу                                                                                                                                                      | Нет                                                                                                                                                                              | Перевод только в браузере; в результатах поиска отображается язык-источник                                                                                             | Один URL, перечислять нечего                                                  |
| Прямой вызов AI API (OpenAI API, Claude API) | Маршруты, которые вы создаёте сами                                                                                                                                        | Пишете сами                                                                                                                                                                      | Скрипт, который нужно перезапускать после каждого изменения текста                                                                                                     | Пишете сами                                                                   |
| General Translation (`gt-next` и CLI `gt`)   | [`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), переведённые командой [`npx gt translate`](/docs/cli/reference/commands/translate) перед `next build` | Вы пишете их в `generateMetadata` и `app/sitemap.ts` на основе того же списка |

Выбирайте next-intl, если ваша команда уже ведёт каталоги сообщений и хочет, чтобы `hreflang` отправлялся из промежуточного ПО. Выбирайте i18next или react-intl, если у вас есть переводчики, текст меняется редко и есть время на написание маршрутизации. Используйте перевод в браузере только для страниц, которым не нужен поисковый трафик на других языках, например для приложения, закрытого авторизацией: поисковые системы всё равно не могут его проиндексировать. Выбирайте `gt-next` от General Translation, если в приложении часто появляется новый текст, а каждой языковой версии нужны собственная индексируемая страница и переведённый заголовок: текст остаётся встроенным в ваши компоненты, а при сборке страницы и заголовки переводятся вместе. Платформа и документация Profound доступны более чем в 47 локалях благодаря General Translation. (См. [развёртывания в рабочей среде](https://generaltranslation.com/enterprise).)

## Related questions

- [Языковые перенаправления и SEO: URL, cookie-файл или Accept-Language?](https://generaltranslation.com/ru/kb/locale-routing-seo.mdx): Язык каждой страницы, которую вы хотите видеть в индексе, должен определять URL, ведь Googlebot не отправляет заголовок Accept-Language и сканирует сайты в основном с американских адресов. Сохранённый в cookie-файле выбор, а за ним Accept-Language используйте только для того, чтобы решить, куда перенаправлять с нейтрального корневого пути вроде /, причём временным перенаправлением 302 или 307.
- [Что такое hreflang и как его настроить?](https://generaltranslation.com/ru/kb/what-is-hreflang.mdx): Hreflang сообщает Google, какие URL являются языковыми или региональными версиями одной и той же страницы, чтобы в результатах поиска показывалась нужная. Добавьте его с помощью HTML-тегов link, HTTP-заголовков Link или карты сайта, сделайте все ссылки взаимными и используйте корректные коды, например en-GB, а не en-UK.
- [Подкаталог, поддомен или ccTLD для многоязычного SEO](https://generaltranslation.com/ru/kb/multilingual-url-structure.mdx): Используйте подкаталоги вида example.com/de/, если один продукт работает на общем сайте с единым процессом релизов. На страну указывает только ccTLD, поддомены позволяют размещать версии на отдельном хостинге, параметры ?lang= Google не рекомендует, а «имиджевые» домены вроде .io и .ai считает общими.
- [Переключатель языка: лучшие практики UX, SEO и доступности](https://generaltranslation.com/ru/kb/language-switcher.mdx): Называйте каждый язык на нём самом, например Deutsch или 日本語, и не используйте флаги — они обозначают страны. Каждый вариант должен вести на ту же страницу на выбранном языке через индексируемую ссылку. Запоминайте выбор в cookie-файле и никогда не перенаправляйте автоматически с локализованного URL.
- [Чек-лист тестирования локализации для многоязычных приложений](https://generaltranslation.com/ru/kb/multilingual-app-launch-checklist.mdx): Проверьте девять аспектов в каждой поддерживаемой локали на сборке для рабочей среды: пользовательские сценарии целиком, включая состояния ошибок и письма; переключение языка; формы множественного числа; валюту и часовые пояса; увеличение длины текста; вёрстку для языков right-to-left; доступность; доставку переводов; индексируемые языковые URL. Задайте для каждой проверки явный критерий успешного прохождения.

## Previous and next questions

- Previous question: [Как перевести условный текст в JSX?](https://generaltranslation.com/ru/kb/translate-conditional-jsx.mdx)
- Next question: [Какое ПО для локализации лучше всего подходит разработчикам?](https://generaltranslation.com/ru/kb/best-localization-software.mdx)

## Sitemap

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