# General Translation React SDKs (gt-react, gt-next, gt-react-native): Быстрый старт Next.js App Router
URL: https://generaltranslation.com/ru/docs/react/nextjs-quickstart.mdx
Docs index: https://generaltranslation.com/llms.txt
Description: Добавьте поддержку нескольких языков в приложение Next.js App Router с General Translation менее чем за 10 минут.

К концу этого руководства ваше приложение Next.js сможет отображать контент на нескольких языках, а пользователи — переключать язык через переключатель языка.

**Требования:**

* Приложение Next.js, использующее **App Router** (Next.js 13.0.0 или более поздней версии, за исключением 15.2.1 и 15.2.2)
* Node.js 18+

<Callout type="info">
  **Совет:** Выполните `npx gt@latest`, чтобы настроить всё с помощью [мастера настройки](/docs/cli/quickstart). В этом руководстве описана ручная настройка.
</Callout>

<Callout type="info">
  **Примечание:** Если вы используете Pages Router, воспользуйтесь [кратким руководством по Next.js Pages Router](/docs/react/nextjs-pages-router-quickstart).
</Callout>

## Быстрый старт [#quickstart]

### 1. Установите пакеты

`gt-next` — библиотека, которая обеспечивает переводы в вашем приложении. `gt` — CLI, который подготавливает переводы для Production.

<Tabs items={['npm', 'yarn', 'bun', 'pnpm']}>
  <Tab value="npm">
    ```bash
    npm i gt-next
    npm i -D gt
    ```
  </Tab>

  <Tab value="yarn">
    ```bash
    yarn add gt-next
    yarn add --dev gt
    ```
  </Tab>

  <Tab value="bun">
    ```bash
    bun add gt-next
    bun add --dev gt
    ```
  </Tab>

  <Tab value="pnpm">
    ```bash
    pnpm add gt-next
    pnpm add --save-dev gt
    ```
  </Tab>
</Tabs>

### 2. Настройте конфигурацию Next.js

`gt-next` использует плагин Next.js **`withGTConfig`** для настройки интернационализации на этапе этап сборки. Оберните им текущую конфигурацию Next.js. В этом фрагменте и приведённых ниже зелёные строки добавлены, а красные удалены; сохраните все параметры, которые уже есть в вашей конфигурации:

```ts title="next.config.ts"
import { withGTConfig } from 'gt-next/config'; // [!code ++]

const nextConfig = {};

export default nextConfig; // [!code --]
export default withGTConfig(nextConfig); // [!code ++]
```

Этот плагин считывает ваши настройки перевода и незаметно связывает всё воедино. Больше никаких изменений в конфигурации Next.js не требуется.

### 3. Создайте файл конфигурации перевода

Создайте файл **`gt.config.json`** в корне проекта. В нём указывается, какие языки поддерживает библиотека:

```json title="gt.config.json"
{
  "defaultLocale": "en",
  "locales": ["es", "fr", "ja"],
  "files": {
    "gt": {
      "output": "public/_gt/[locale].json"
    }
  }
}
```

* **`defaultLocale`** — язык, на котором написано ваше приложение (исходный язык).
* **`locales`** — языки, на которые вы хотите перевести приложение. Выберите любые из [списка поддерживаемых локалей](/docs/platform/dashboard/reference/supported-locales).
* **`files.gt.output`** — путь, по которому CLI сохраняет файлы перевода. `[locale]` заменяется кодом каждого языка (например, `public/_gt/es.json`).

Добавьте `public/_gt/` в **`.gitignore`** — эти файлы генерируются автоматически, а не создаются вручную:

```txt title=".gitignore"
public/_gt/
```

### 4. Добавьте функцию загрузки для локальных переводов

Создайте файл **[`loadTranslations`](/docs/react/reference/functions/load-translations)** в директории `src/` (или в корне проекта). Так `gt-next` поймёт, как загружать файлы перевода, созданные через CLI:

```ts title="src/loadTranslations.ts"
export default async function loadTranslations(locale: string) {
  const translations = await import(`../public/_gt/${locale}.json`);
  return translations.default;
}
```

<Callout type="warn">
  **Предупреждение:** Эти файлы перевода появятся только после того, как вы их создадите, поэтому при первом запуске `npm run dev` сборка завершится ошибкой, а страница вернёт HTTP 500. Выполните [`npx gt generate`](/docs/cli/reference/commands/generate) (API-ключ не нужен) или [`npx gt translate`](/docs/cli/reference/commands/translate) (с учётными данными), либо добавьте пустые файлы `{}` по пути `public/_gt/[locale].json`.
</Callout>

`withGTConfig` автоматически находит файл `loadTranslations.[js|ts]` в каталоге `src/` или в корне проекта — никакой дополнительной настройки не требуется.

<Callout type="info">
  **Примечание:** Локальные переводы включаются в бандл приложения, поэтому загружаются мгновенно и не зависят от внешних сервисов. Подробнее о деталях и компромиссах — в разделе [Хранение переводов](/docs/react/guides/storing-translations).
</Callout>

### 5. Добавьте GTProvider в корневой layout

Компонент **[`GTProvider`](/docs/react/reference/components/gt-provider)** предоставляет всему приложению доступ к переводам. Он должен оборачивать приложение на уровне корневого layout. Остальную часть существующего layout (шрифты, метаданные, стили) оставьте без изменений:

```tsx title="app/layout.tsx"
import { GTProvider, useLocale } from 'gt-next'; // [!code ++]

export default function RootLayout({ children }: { children: React.ReactNode }) {
  const locale = useLocale(); // [!code ++]
  return (
    {/* [!code --] */}
    <html lang="en">
    {/* [!code ++] */}
    <html lang={locale}>
      <body>
        {/* [!code --] */}
        {children}
        {/* [!code ++:3] */}
        <GTProvider>
          {children}
        </GTProvider>
      </body>
    </html>
  );
}
```

### 6. Пометьте текст для перевода

Теперь оберните любой текст, который хотите перевести, в компонент **[`<T>`](/docs/react/reference/components/t)**. [`<T>`](/docs/react/reference/components/t) означает &quot;translate&quot;:

```tsx title="app/page.tsx"
import { T } from 'gt-next'; // [!code ++]

export default function Home() {
  return (
    <main>
      {/* [!code ++] */}
      <T>
        <h1>Welcome to my app</h1>
        <p>This content will be translated automatically.</p>
      {/* [!code ++] */}
      </T>
    </main>
  );
}
```

Вы можете обернуть в [`<T>`](/docs/react/reference/components/t) столько JSX, сколько захотите. Всё внутри — текст, вложенные элементы и даже форматирование — переводится как единое целое.

### 7. Добавьте переключатель языка

Добавьте **[`<LocaleSelector>`](/docs/react/reference/components/locale-selector)**, чтобы пользователи могли переключать язык:

```tsx title="app/page.tsx"
import { T } from 'gt-next'; // [!code --]
import { T, LocaleSelector } from 'gt-next'; // [!code ++]

export default function Home() {
  return (
    <main>
      {/* [!code ++] */}
      <LocaleSelector />
      <T>
        <h1>Welcome to my app</h1>
        <p>This content will be translated automatically.</p>
      </T>
    </main>
  );
}
```

[`LocaleSelector`](/docs/react/reference/components/locale-selector) отображает выпадающий список с языками из вашего `gt.config.json`.

### 8. Настройте переменные окружения (необязательно)

Чтобы видеть переводы во время разработки, вам понадобятся API-ключи General Translation. Они позволяют использовать **перевод по запросу** — приложение будет переводить контент в реальном времени прямо в процессе разработки.

Создайте файл **`.env.local`**:

```bash title=".env.local"
GT_API_KEY="your-api-key"
GT_PROJECT_ID="your-project-id"
```

Получите бесплатные ключи на [dash.generaltranslation.com](https://dash.generaltranslation.com/en-US/signin) или, выполнив команду:

```bash
npx gt auth
```

<Callout type="warn">
  **Предупреждение:** Для разработки используйте ключ, начинающийся с `gtx-dev-`. Рабочие ключи (`gtx-api-`) предназначены только для CI/CD.

  Никогда не делайте `GT_API_KEY` доступным в браузере и не коммитьте его в систему контроля версий.
</Callout>

<Accordions>
  <Accordion title="Можно ли использовать gt-next без API-ключей?">
    Да. Без API-ключей `gt-next` работает как обычная библиотека i18n. Перевод по запросу при разработке будет недоступен, но вы всё равно сможете:

    * Вручную подключать собственные файлы перевода
    * Использовать все компоненты ([`<T>`](/docs/react/reference/components/t), [`<Var>`](/docs/react/reference/components/var), [`LocaleSelector`](/docs/react/reference/components/locale-selector) и т. д.)
    * Запускать [`npx gt generate`](/docs/cli/reference/commands/generate), чтобы создавать шаблоны файлов перевода, а затем переводить их самостоятельно
  </Accordion>
</Accordions>

### 9. Посмотрите, как это работает

Запустите dev-сервер:

<Tabs items={['npm', 'yarn', 'bun', 'pnpm']}>
  <Tab value="npm">
    ```bash
    npm run dev
    ```
  </Tab>

  <Tab value="yarn">
    ```bash
    yarn dev
    ```
  </Tab>

  <Tab value="bun">
    ```bash
    bun dev
    ```
  </Tab>

  <Tab value="pnpm">
    ```bash
    pnpm dev
    ```
  </Tab>
</Tabs>

Откройте [http://localhost:3000](http://localhost:3000) и используйте выпадающий список языков, чтобы переключаться между языками. Вы должны увидеть, что содержимое переведено.

<Callout type="info">
  **Примечание:** В режиме разработки переводы выполняются по запросу, поэтому при первом переключении на новый язык вы можете ненадолго увидеть состояние загрузки. В Production переводы предварительно сгенерированы и загружаются мгновенно.
</Callout>

### 10. Перевод строк

Для обычных строк — таких как атрибуты `placeholder`, значения `aria-label` или текст `alt` — используйте хук **[`useGT`](/docs/react/reference/hooks/use-gt)**. Он работает в синхронных серверных и клиентских компонентах:

```tsx title="app/contact/page.tsx"
import { useGT } from 'gt-next';

export default function ContactPage() {
  const gt = useGT();

  return (
    <form>
      <input
        placeholder={gt('Enter your email')}
        aria-label={gt('Email input field')}
      />
      <button type="submit">{gt('Send')}</button>
    </form>
  );
}
```

<Accordions>
  <Accordion title="Используете асинхронный компонент?">
    Асинхронные компоненты не поддерживают hooks. Вместо этого импортируйте [`getGT`](/docs/react/nextjs/reference/functions/get-gt) из `gt-next/server`:

    ```tsx
    import { getGT } from 'gt-next/server';

    export default async function Page() {
      const gt = await getGT();
      return <p>{gt('Hello')}</p>;
    }
    ```
  </Accordion>
</Accordions>

### 11. Развертывание в production

В production переводы генерируются заранее на этапе сборки (без API-вызовов в реальном времени). Добавьте команду translate в скрипт сборки:

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

Задайте переменные окружения для **production** у вашего хостинг-провайдера (Vercel, Netlify и т. д.):

```bash
GT_PROJECT_ID=your-project-id
GT_API_KEY=gtx-api-your-production-key
```

<Callout type="warn">
  **Предупреждение:** Рабочие ключи начинаются с `gtx-api-` (а не с `gtx-dev-`). Получите ключ на [dash.generaltranslation.com](https://dash.generaltranslation.com). Никогда не добавляйте к нему префикс `NEXT_PUBLIC_`.
</Callout>

Вот и всё — теперь ваше приложение мультиязычное. 🎉

## Устранение неполадок [#troubleshooting]

<Accordions>
  <Accordion title="Язык не меняется, когда я использую выпадающий список">
    Убедитесь, что в браузере включены cookie-файлы и селектор отображается внутри [`<GTProvider>`](/docs/react/reference/components/gt-provider). Если включена маршрутизация по локалям, также убедитесь, что правило сопоставления middleware и [`pathRegex`](/docs/react/nextjs/config#path-regex) охватывают текущий маршрут.
  </Accordion>

  <Accordion title="В development переводы работают медленно">
    Это нормально. В development переводы выполняются по запросу (контент переводится в реальном времени через API). В **Production** этой задержки нет — все переводы предварительно генерируются командой [`npx gt translate`](/docs/cli/reference/commands/translate).
  </Accordion>

  <Accordion title="Некоторые переводы неточны">
    Неоднозначный текст может приводить к неточным переводам. Например, &quot;apple&quot; может означать и фрукт, и компанию. Чтобы помочь системе, добавьте prop `$context`:

    ```jsx
    <T $context="the technology company">Apple</T>
    ```

    [`<T>`](/docs/react/reference/components/t), [`useGT()`](/docs/react/reference/hooks/use-gt) и [`getGT()`](/docs/react/nextjs/reference/functions/get-gt) поддерживают параметр `$context`.
  </Accordion>
</Accordions>

## Next steps

- /docs/react/guides/translating-jsx
- /docs/react/guides/translating-strings
- /docs/react/guides/managing-locales
- /docs/react/guides/formatting-variables

## Sitemap

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