# General Translation React SDKs (gt-react, gt-next, gt-react-native): Статическая генерация сайта в App Router
URL: https://generaltranslation.com/ru/docs/react/nextjs/app-router-static-site-generation.mdx
Docs index: https://generaltranslation.com/llms.txt
Description: Как предварительно отрендерить локализованные страницы Next.js App Router с помощью General Translation.

Предварительно сгенерируйте по одному маршруту App Router для каждой локали с помощью `generateStaticParams`. Маршрутизация по локалям и определение локали запроса используют ту же конфигурацию, что и динамические маршруты.

## Сохраните конфигурацию Next.js [#config]

Статическая генерация не меняет настройку `withGTConfig`:

```ts title="next.config.ts"
import type { NextConfig } from 'next';
import { withGTConfig } from 'gt-next/config';

const nextConfig: NextConfig = {};

export default withGTConfig(nextConfig);
```

## Настройте маршрутизацию по локалям [#routing]

Следуйте [руководству по middleware для App Router](/docs/react/nextjs/app-router-middleware), чтобы создать `proxy.ts`, переместить маршруты в `app/[locale]` и определить пользовательскую функцию [`getLocale`](/docs/react/nextjs/reference/functions/get-locale).

## Отключение определения региона [#region]

Стандартный resolver региона читает cookie-файл, из-за чего маршрут становится динамическим. Чтобы отключить определение региона при предварительном рендеринге, добавьте `getRegion.ts` в корень проекта:

```ts title="./getRegion.ts"
export default async function getRegion() {
  return undefined;
}
```

`withGTConfig` автоматически находит этот файл.

## Сгенерируйте маршруты для локалей [#generate-routes]

Верните по одному параметру маршрута для каждой настроенной локали:

```tsx title="app/[locale]/page.tsx"
import { getLocales, T } from 'gt-next';

export function generateStaticParams() {
  return getLocales().map((locale) => ({ locale }));
}

export default function HomePage() {
  return <T>Welcome to our site</T>;
}
```

Теперь Next.js предварительно рендерит `app/[locale]/page.tsx` отдельно для каждой локали.

<Callout type="warn">
  Эта конфигурация позволяет предварительно рендерить страницы и при этом развёртывать сервер Next.js. Проект с `output: 'export'` нельзя собрать, пока присутствуют `proxy.ts` или `middleware.ts`. Для полностью статического экспорта удалите middleware, экспортируйте `dynamicParams = false`, сгенерируйте пути для всех локалей и ссылайтесь на них напрямую; определение локали и перенаправления будут недоступны.
</Callout>

## Проверка совместимости с Next.js [#compatibility]

Пользовательскому файлу `getLocale.ts` требуется доступ к корневому параметру `[locale]` во время предварительного рендеринга. Используйте API, доступный в вашей версии Next.js:

| Версия Next.js       | API для корневой локали                                                  |
| -------------------- | ------------------------------------------------------------------------ |
| 15.5 и более поздние | `locale()` из `next/root-params`                                         |
| 15.2.0 и 15.2.3–15.4 | `unstable_rootParams()` из `next/server`                                 |
| Ранее 15.2           | Обновите Next.js перед использованием этой конфигурации SSG с App Router |

`gt-next` исключает Next.js 15.2.1 и 15.2.2 из поддерживаемого диапазона peer-зависимостей. Обновите эти версии до 15.2.3 или более поздней.

Для Next.js 15.2.0 или 15.2.3–15.4 используйте:

```ts title="./getLocale.ts"
import { unstable_rootParams } from 'next/server';

export default async function getLocale() {
  const params = await unstable_rootParams();
  return params?.locale;
}
```

Для текущих проектов используйте пример `next/root-params` из [руководства по middleware](/docs/react/nextjs/app-router-middleware#root-locale), предназначенный для Next.js 15.5 и более поздних версий.

## Восстановление после сбоев сборки [#build-failures]

### Не удалось определить локаль

Middleware не выполняется, когда Next.js выполняет предварительный рендеринг страницы. Убедитесь, что файл `getLocale.ts` находится в корне проекта или что [`getLocalePath`](/docs/react/nextjs/config#request-function-paths) указывает на него.

Если произвольное значение маршрута должно приводить к ошибке 404, а не к использованию резервной локали по умолчанию, проверьте параметр `[locale]` с помощью [`isLocaleSupported`](/docs/react/nextjs/reference/functions/is-locale-supported).

### `DYNAMIC_SERVER_USAGE`

Эта ошибка означает, что при статическом рендеринге был вызван API динамического запроса. Убедитесь, что:

* `getLocale.ts` считывает только параметр корневого маршрута.
* `getRegion.ts` возвращает фиксированное значение или `undefined`.
* Ни одна из функций не вызывает `headers()` или `cookies()`.

Если включены Cache Components, также следуйте более строгим требованиям [настройки Cache Components](/docs/react/nextjs/cache-components).

### Ошибки экспорта корневого параметра

Ошибка о том, что экспорт `locale` отсутствует, обычно означает, что в проекте используется API, не соответствующий версии Next.js. См. [таблицу совместимости](#compatibility).

Сегмент `[locale]` также должен быть первым динамическим сегментом в дереве App Router. Разместите корневой layout в `app/[locale]/layout.tsx`; layout, расположенный выше этого сегмента, не может получить корневую локаль во время предварительного рендеринга.

### Маршруты изображений метаданных

Файлы Open Graph, Twitter, icon и Apple icon внутренне реализованы как Route Handlers и не могут считывать `next/root-params`. Получите `params.locale` и вызовите [`registerLocale`](/docs/react/nextjs/reference/functions/register-locale) перед вызовом других серверных хелперов. См. [Регистрация локалей запроса](/docs/react/nextjs/registering-request-locales#metadata-images).

## Next steps

- /docs/react/nextjs/app-router-middleware
- /docs/react/nextjs/registering-request-locales
- /docs/react/nextjs/cache-components
- /docs/react/nextjs/locale-alias-seo

## Sitemap

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