# General Translation React SDKs (gt-react, gt-next, gt-react-native): createNextMiddleware
URL: https://generaltranslation.com/ru/docs/react/nextjs/reference/functions/create-next-middleware.mdx
Docs index: https://generaltranslation.com/llms.txt
Description: Добавляет маршрутизацию по локалям и определение локали в приложение Next.js с General Translation. Справочник API для createNextMiddleware.

Функция `createNextMiddleware` из `gt-next/middleware` определяет локаль каждого посетителя, сохраняет её в cookie-файле и направляет его на локализованную версию страницы.

Для текущей настройки используйте [руководство по middleware для App Router](/docs/react/nextjs/app-router-middleware). Приложения с Pages Router вместо этого используют [интернационализированную маршрутизацию Next.js](/docs/react/nextjs/pages-router-middleware).

*Middleware не обязателен, если вам не нужно определение локали во время запроса или URL с префиксом локали. Без него селекторы локали оставляют URL без префикса, сохраняют выбранную локаль в cookie-файле и обновляют содержимое App Router.*

## Обзор [#overview]

Создайте `middleware` и экспортируйте его вместе с сопоставителем путей из файла `middleware`. Разместите этот файл в корневом каталоге проекта: `proxy.ts` в Next.js 16+ или `middleware.ts` в Next.js 15 и ниже, а не внутри `app/` или `pages/`.

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

export default createNextMiddleware();

export const config = {
  // Совпадение со всеми путями, кроме API-маршрутов, статических файлов и внутренних путей Next.js
  matcher: ['/((?!api|static|.*\\..*|_next).*)'],
};
```

## Как это работает [#how-it-works]

`middleware` определяет локаль каждого запроса из следующих источников в таком порядке:

1. **Cookie-файл сброса локали** — локаль, только что выбранная в браузере, пока ожидается сброс маршрутизации локали.
2. **Локаль в URL** — префикс поддерживаемой локали в пути, например `/es/about`, или настроенный путь локали по умолчанию без префикса.
3. **Cookie-файл локали** — локаль, которую посетитель выбрал ранее, если сброс не ожидается.
4. **Cookie-файл локали реферера** — локаль из предыдущего клиентского маршрута, если сброс не ожидается.
5. **Заголовки браузера** — заголовок `Accept-Language`, если не включён параметр [`ignoreBrowserLocales`](/docs/react/nextjs/config#ignore-browser-locales).
6. **Локаль по умолчанию** — настроенный вами `defaultLocale` как резервный вариант.

Затем `middleware` устанавливает cookie-файл локали и, если включён `localeRouting`, перенаправляет запрос или переписывает его на правильный локализованный путь. По умолчанию `defaultLocale` не получает префикс (`/about` остаётся `/about`), а остальные локали получают (`/es/about`). Когда включены сервисы General Translation, коды локалей приводятся к канонической форме, а для неподдерживаемых настроенных локалей выводится предупреждение на этапе сборки.

## Параметры [#options]

`createNextMiddleware` принимает один объект параметров. Все поля необязательны.

| Параметр                                        | Описание                                                                           | Тип              | Необязательный | По умолчанию |
| ----------------------------------------------- | ---------------------------------------------------------------------------------- | ---------------- | -------------- | ------------ |
| [`localeRouting`](#locale-routing)              | Включает маршрутизацию по локалям.                                                 | `boolean`        | Да             | `true`       |
| [`prefixDefaultLocale`](#prefix-default-locale) | Также добавляет в URL префикс для локали по умолчанию.                             | `boolean`        | Да             | `false`      |
| [`ignoreSourceMaps`](#ignore-source-maps)       | Пропускает запросы Next.js к source maps.                                          | `boolean`        | Да             | `true`       |
| [`pathConfig`](#path-config)                    | Алиасы локализованных путей.                                                       | `object`         | Да             | `{}`         |
| [`routeOverrides`](#route-overrides)            | Использует реализацию страницы для конкретной локали без изменения публичного URL. | `RouteOverrides` | Да             | `{}`         |

*Примечание: чтобы ограничить пути, на которых выполняется middleware, задайте [`pathRegex`](/docs/react/nextjs/config#path-regex) в `withGTConfig` — это не параметр middleware. `matcher` в вашем экспортируемом `config` — это механизм, который Next.js использует, чтобы вообще определить, когда нужно запускать middleware.*

### `localeRouting` [#locale-routing]

**Тип** `boolean` · **Необязательно** · **По умолчанию** `true`

Включает маршрутизацию по локалям и перенаправления. Если `false`, middleware по-прежнему определяет и сохраняет локаль, но не добавляет префиксы локали и не переписывает пути.

### `prefixDefaultLocale` [#prefix-default-locale]

**Тип** `boolean` · **Необязательно** · **По умолчанию** `false`

Если `false` (по умолчанию), локаль по умолчанию обслуживается без префикса (`/about`), а для других локалей добавляется префикс (`/es/about`). Если `true`, префикс добавляется ко всем локалям, включая локаль по умолчанию (`/en/about`).

### `ignoreSourceMaps` [#ignore-source-maps]

**Тип** `boolean` · **Необязательный** · **По умолчанию** `true`

Если `true`, запросы к source maps Next.js передаются без изменений.

### `pathConfig` [#path-config]

**Тип** `object` · **Необязательно** · **По умолчанию** `{}`

Сопоставляет общие пути с локализованными, чтобы у маршрута был свой URL для каждой локали. Каждый ключ — это общий путь; каждое значение — либо один локализованный путь, либо сопоставление по локалям.

```ts title="proxy.ts"
export default createNextMiddleware({
  pathConfig: {
    // Английский: /products, Французский: /fr/produits
    '/products': {
      fr: '/produits',
    },
    // Динамический: /product/123, /fr/produit/123
    '/product/[id]': {
      fr: '/produit/[id]',
    },
    // Обязательный catch-all: /blog/2026/launch, /fr/articles/2026/launch
    '/blog/[...slug]': {
      fr: '/articles/[...slug]',
    },
    // Необязательный catch-all: /news или /news/latest, /fr/actualites или /fr/actualites/latest
    '/news/[[...slug]]': {
      fr: '/actualites/[[...slug]]',
    },
  },
});
```

### `routeOverrides` [#route-overrides]

**Type** `RouteOverrides` · **Optional** · **Default** `{}`

Сопоставляет локаль с общими шаблонами маршрутов, для которых есть отдельная реализация страницы под конкретную локаль. Публичный URL по-прежнему использует общий маршрут или его алиас из [`pathConfig`](#path-config), а middleware переписывает запрос на маршрут со вторым, статическим сегментом локали.

Например, такая структура файлов даёт французским посетителям собственные реализации статической страницы, динамической страницы товара и набора страниц блога:

<Files>
  <Folder name="app">
    <Folder name="[locale]">
      <Folder name="home">
        <File name="page.tsx" />
      </Folder>

      <Folder name="fr">
        <Folder name="home">
          <File name="page.tsx" />
        </Folder>

        <Folder name="product">
          <Folder name="[id]">
            <File name="page.tsx" />
          </Folder>
        </Folder>

        <Folder name="blog">
          <File name="page.tsx" />

          <Folder name="authors">
            <File name="page.tsx" />
          </Folder>

          <Folder name="posts">
            <File name="page.tsx" />

            <Folder name="[...slug]">
              <File name="page.tsx" />
            </Folder>
          </Folder>
        </Folder>
      </Folder>
    </Folder>
  </Folder>
</Files>

Настройте каждое переопределение, указав его общий шаблон маршрута:

```ts title="proxy.ts"
export default createNextMiddleware({
  routeOverrides: {
    fr: [
      '/home', // Статический маршрут
      '/product/[id]', // Динамический параметр
      '/blog/[[...slug]]', // Маршрут и все дочерние пути
    ],
  },
});
```

* `/home` использует `app/[locale]/fr/home/page.tsx` для французского и общий `app/[locale]/home/page.tsx` для остальных локалей.
* `/product/[id]` добавляет страницу товара только для французского, сохраняя динамический `id`.
* `/blog/[[...slug]]` добавляет группу страниц блога только для французского, включая `/blog`, `/blog/authors`, `/blog/posts` и `/blog/posts/[...slug]`.

Переопределения игнорируются, если `localeRouting` имеет значение `false`. Ключи локалей приводятся к стандартному виду, если включены сервисы General Translation.

<Callout type="info">
  API кэша и макетов видят внутренний маршрут. Передавайте назначение переписывания, например `/fr/fr/home`, в `revalidatePath` из Next.js. В макете `[locale]` хук `useSelectedLayoutSegments` также возвращает статический сегмент локали из переопределения.
</Callout>

Используйте [`<Link>`](/docs/react/nextjs/link) из `gt-next/link` для внутренней навигации, чтобы маршруты с префиксом локали формировались до перехода, без дополнительного перенаправления через middleware.

## Пример [#example]

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

export default createNextMiddleware({
  prefixDefaultLocale: true,
  pathConfig: {
    '/about': {
      fr: '/a-propos',
    },
  },
});

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

*Предупреждение: тщательно проверьте свой matcher. Слишком широкий matcher может вызвать циклические перенаправления или нарушить работу статических ресурсов.*

## Sitemap

See the full [sitemap](https://generaltranslation.com/sitemap.md) for all pages.
