# General Translation Knowledge Base: Можно ли делать i18n без файлов перевода?
URL: https://generaltranslation.com/ru/kb/i18n-without-translation-files.mdx
Docs index: https://generaltranslation.com/llms.txt
Description: Да. Библиотеки gt-react и gt-next от General Translation обеспечивают i18n для React и Next.js без ключей перевода и без отдельного JSON-файла для каждого языка, который приходится поддерживать. Тексты остаются встроенными в JSX внутри компонента `<T>`, а команда gt translate генерирует переводы для каждого языка во время сборки, учитывая контекст из вашего кода. Locadex может поддерживать их в актуальном состоянии через пул-реквесты.
Category: Интернационализация
Last updated: 2026-10-21
Authors: Jackie Chen, Ernest McCarter
Published: 2026-05-07

Да. Открытые библиотеки `gt-react` и `gt-next` от General Translation позволяют интернационализировать (i18n) приложение на React или Next.js без ключей перевода и без отдельного JSON-файла для каждого языка. Вы пишете тексты прямо в JSX внутри компонента [`<T>`](/docs/react/reference/components/t), а [`npx gt translate`](/docs/cli/reference/commands/translate) генерирует переводы на все языки во время сборки.

Библиотеки на основе ключей, такие как i18next, react-intl и next-intl, ищут каждую строку по ключу в отдельном файле сообщений для каждого языка, поэтому каждую новую строку приходится добавлять с ключом во все файлы. Стоит добавить ключ в `en.json` и забыть про `ja.json` — и одна строка на японской странице оформления заказа останется без перевода.

Файлы перевода в General Translation никуда не исчезают, но становятся результатом сборки. CLI создаёт по одному сгенерированному файлу на каждый язык и может опубликовать переводы в CDN General Translation. Никому не нужно редактировать эти файлы вручную или копировать ключи из одного в другой.

## Video

The video is narrated in English, with English captions.

[Can I do i18n without translation files?](https://caxecubb9c64cezv.public.blob.vercel-storage.com/films/kb-i18n-without-translation-files.mp4) (46 с)

General Translation lets you stop writing translation files with `gt-react` or `gt-next`. Run `npx gt init`, write the English inside a `<T>` component, then add `npx gt translate` to your build script so every build writes the translations.

## Можно ли переводить React-компоненты прямо в коде, без файла с ключами?

Да. С General Translation каждое предложение остаётся в компоненте внутри [`<T>`](/docs/react/reference/components/t), а CLI переводит весь блок целиком. Например, сводка заказа на react-i18next получает каждую строку по ключу из JSON-файла:

```json title="locales/en/checkout.json"
{
  "summary": {
    "title": "Order summary",
    "item_count_one": "You have {{count}} item in your cart.",
    "item_count_other": "You have {{count}} items in your cart.",
    "tax_notice": "Tax is calculated at checkout."
  }
}
```

```tsx title="CheckoutSummary.tsx"
import { useTranslation } from 'react-i18next';

export function CheckoutSummary({ itemCount }: { itemCount: number }) {
  const { t } = useTranslation('checkout');
  return (
    <section>
      <h2>{t('summary.title')}</h2>
      <p>{t('summary.item_count', { count: itemCount })}</p>
      <small>{t('summary.tax_notice')}</small>
    </section>
  );
}
```

Тот же компонент с `gt-next` сохраняет английский текст прямо в JSX. В других React-фреймворках импорт выполняется из соответствующего пакета, например `gt-react`.

```tsx title="CheckoutSummary.tsx"
import { T, Plural, Num } from 'gt-next';

export function CheckoutSummary({ itemCount }: { itemCount: number }) {
  return (
    <T>
      <section>
        <h2>Order summary</h2>
        <Plural
          n={itemCount}
          one={<p>You have <Num>{itemCount}</Num> item in your cart.</p>}
          other={<p>You have <Num>{itemCount}</Num> items in your cart.</p>}
        />
        <small>Tax is calculated at checkout.</small>
      </section>
    </T>
  );
}
```

В версии с `gt-next` нет ни `checkout.json`, ни ключей, которым нужно придумывать имена, ни `ja.json`, который приходится обновлять. [`npx gt translate`](/docs/cli/reference/commands/translate) отправляет каждый блок [`<T>`](/docs/react/reference/components/t) в API General Translation, передавая структуру его элементов в качестве контекста, и записывает перевод для каждого языка, указанного в `gt.config.json`. [`<Plural>`](/docs/react/reference/components/plural) выбирает форму множественного числа, нужную конкретному языку (в японском она одна, в арабском — шесть), а [`<Num>`](/docs/react/reference/components/num) форматирует число в соответствии с локалью читателя.

## Какие библиотеки интернационализации позволяют писать текст прямо в JSX без файлов с ключами?

`gt-react` и `gt-next` от General Translation позволяют писать переводимый текст прямо в JSX без файлов с ключами, а переводы генерирует сам General Translation. Lingui и экспериментальное извлечение в next-intl тоже поддерживают встроенные сообщения, но извлекают их в каталоги, которые всё равно придётся переводить вашей команде, переводчикам или стороннему сервису.

| Библиотека                                  | Где вы пишете текст                                                                                                                                                | Откуда берутся переводы                                                                                                                | Что поддерживает ваша команда                                                       |
| ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- |
| i18next (`react-i18next`)                   | Ключи в JSON-файле для каждого языка                                                                                                                               | Ваша команда, переводчики или сервис                                                                                                   | Ключ для каждой строки в файле каждого языка                                        |
| next-intl                                   | Ключи в JSON-каталоге для каждого языка; [встроенные сообщения с `useExtracted`](https://next-intl.dev/docs/usage/extraction) — экспериментальная функция          | Ваша команда, переводчики или сервис                                                                                                   | Все каталоги, которые нужно обновлять при каждом изменении текста                   |
| [Lingui](https://lingui.dev/introduction)   | Встроенные макросы `<Trans>` со сгенерированными ID сообщений, которые извлекаются в PO-каталоги                                                                   | Ваша команда, переводчики или сервис                                                                                                   | Извлечение, перевод и компиляция каталогов                                          |
| General Translation (`gt-react`, `gt-next`) | Встроенный JSX внутри [`<T>`](/docs/react/reference/components/t), строки через [`useGT`](/docs/react/reference/hooks/use-gt) или необязательные словари с ключами | Генерируются командой [`npx gt translate`](/docs/cli/reference/commands/translate) при каждой сборке с учётом контекста из вашего кода | Оборачивание текста в [`<T>`](/docs/react/reference/components/t) и один шаг сборки |

Выбирайте i18next или next-intl, если переводчики или система управления переводами уже работают с файлами каталогов или если текст меняется редко. Lingui или извлечение в next-intl подойдут, если вы хотите держать исходный текст прямо в коде и планируете отдавать каталоги на перевод. General Translation — если вы хотите писать текст прямо в коде и получать переводы на все языки при каждой сборке. Командам, которые предпочитают стабильные ключи, не придётся от них отказываться: в General Translation есть [режим словарей](/docs/react/guides/translating-with-dictionaries).

## Каковы плюсы и минусы i18n на основе ключей и встроенного перевода?

При встроенном переводе каждое предложение остаётся в том React-компоненте, который его рендерит. Поэтому компоненты и пул-реквесты легко читать, а ключи не нужно придумывать, синхронизировать и вычищать. Обратная сторона — исходный текст хранится в коде, и любые правки текста проходят через разработчиков. При i18n на основе ключей текст хранится в каталогах отдельно от кода: авторы и переводчики могут работать, не трогая компоненты, но для каждой строки приходится добавлять ключ и запись в файл каждого языка. General Translation поддерживает оба подхода: встроенный текст с [`<T>`](/docs/react/reference/components/t) или ключи в режиме словаря.

| Задача                             | Ключи перевода (i18next, next-intl)                                                 | Встроенный текст (General Translation)                                                                                                                 |
| ---------------------------------- | ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Чтение компонента или пул-реквеста | Вы видите `t('summary.tax_notice')` и открываете JSON-файл, чтобы найти предложение | Вы видите предложение прямо в JSX                                                                                                                      |
| Добавление строки                  | Придумать ключ, добавить его в исходный файл, затем перенести в файл каждого языка  | Написать её внутри [`<T>`](/docs/react/reference/components/t); следующий запуск [`gt translate`](/docs/cli/reference/commands/translate) переведёт её |
| Изменение исходного текста         | В других языках остаётся старый перевод, пока кто-нибудь его не обновит             | Следующий запуск заново переведёт изменённую запись                                                                                                    |
| Удаление компонента                | Его ключи остаются во всех файлах, пока их не удалит человек или скрипт             | Следующий запуск перестанет собирать его содержимое                                                                                                    |
| Добавление языка                   | Создать файл со всеми ключами и перевести его                                       | Добавить код локали в `locales` в `gt.config.json` и запустить [`gt translate`](/docs/cli/reference/commands/translate)                                |
| Стабильные идентификаторы          | Есть у каждой строки                                                                | Необязательны: задаются через [`$id`](/docs/react/reference/components/t#id) в [`<T>`](/docs/react/reference/components/t) или в режиме словаря        |
| Кто редактирует исходный текст     | Авторы могут править каталог, не трогая код                                         | Изменения текста — это изменения кода                                                                                                                  |

Ключи подходят лучше, если авторы должны править исходный текст, не трогая код, или если в компонентах не должно быть предложений ни на одном конкретном языке. В таком случае оставьте свои ключи: [режим словаря](/docs/react/guides/translating-with-dictionaries) General Translation читает словарь с ключами и при этом сам генерирует переводы.

## Как добавить поддержку нескольких языков в приложение Next.js на App Router без ключей перевода?

Используйте библиотеку `gt-next` от General Translation и CLI `gt` — достаточно четырёх шагов. Ручная настройка по тем же шагам описана в [руководстве «Быстрый старт» для Next.js App Router](/docs/react/nextjs-quickstart):

1. Выполните [`npx gt@latest init`](/docs/cli/reference/commands/init). Мастер настройки определяет App Router, может установить `gt-next`, добавить `withGTConfig` в `next.config.ts` и [`GTProvider`](/docs/react/reference/components/gt-provider) в `app/layout.tsx`, а также записывает выбранные языки в `gt.config.json`. Кроме того, он может записать ключ для разработки в `.env.local`, чтобы `next dev` переводил новый текст по запросу. Проверьте внесённые изменения.
2. Оберните текст в [`<T>`](/docs/react/reference/components/t) и добавьте раскрывающийся список [`<LocaleSelector>`](/docs/react/reference/components/locale-selector) для переключения языков. [`<T>`](/docs/react/reference/components/t) работает как в серверных, так и в клиентских компонентах.
3. Добавьте [`npx gt translate`](/docs/cli/reference/commands/translate) в скрипт сборки перед `next build`.
4. Задайте `GT_PROJECT_ID` и `GT_API_KEY` в настройках хостинг-провайдера. У ключа для сборки должны быть включены права **Files &gt; Write** и **Translation queue**.

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

export default function Home() {
  return (
    <main>
      <LocaleSelector />
      <T>
        <h1>Find your next project</h1>
        <p>Explore projects from teams around the world.</p>
      </T>
    </main>
  );
}
```

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

После этого каждая сборка для рабочей среды записывает переводы для всех языков, указанных в `gt.config.json`. Более подробное пошаговое руководство с использованием Серверных и Клиентских Компонентов см. в статье [Как добавить i18n в приложение Next.js на App Router?](/kb/add-i18n-to-nextjs). Если вы хотите поручить настройку агенту для написания кода, см. [рабочий процесс с агентом для написания кода](/kb/ai-agent-i18n-setup).

## Как не допустить рассинхронизации JSON-файлов перевода с исходным кодом?

Генерируйте их из исходного кода при каждой сборке, а не редактируйте вручную. При работе с файлами ключей в приложении с 400 строками на 12 целевых языках набирается 4 800 записей, которые кому-то приходится синхронизировать с кодом. В General Translation команда [`npx gt translate`](/docs/cli/reference/commands/translate) запускается перед сборкой, собирает все блоки [`<T>`](/docs/react/reference/components/t) и строки [`useGT`](/docs/react/reference/hooks/use-gt), переводит новое или изменённое на каждый язык из `gt.config.json` и записывает по одному JSON-файлу на каждый язык по пути `files.gt.output`:

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

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

General Translation заново генерирует эти файлы из кода при каждой сборке, поэтому они всегда соответствуют этому коду. В руководстве «Быстрый старт» для Next.js выходной каталог добавляется в `.gitignore`, поскольку эти файлы генерируются автоматически. [Инкрементальный рабочий процесс](/docs/cli/guides/generating-translations#retranslate) General Translation переводит только изменённый исходный текст и повторно использует совпадающие переводы из предыдущих версий. [Отслеживание веток](/docs/cli/guides/branching) (`--enable-branching`, на тарифе Starter или Enterprise) хранит переводы функциональной ветки отдельно от рабочей среды, пока ветка не будет слита.

Если команде нужно фиксировать изменения переводов в репозитории, [автоматизации Locadex](/docs/platform/locadex/guides/configuring-automations) через пул-реквесты переводят новое или обновлённое исходное содержимое, а также добавляют или удаляют файлы локалей при изменении списка языков. Каждая автоматизация срабатывает по одному из трёх триггеров: изменение пул-реквеста, отправка коммита или ручной запуск. О настройке CI см. статью [Как поддерживать переводы в актуальном состоянии при каждом развёртывании?](/kb/translations-in-ci).

## Может ли General Translation автоматически добавить i18n в приложение React?

Да. General Translation автоматизирует оба этапа i18n в React: обёртывание текста для перевода и создание переводов.

* **Во время сборки:** компилятор General Translation, `@generaltranslation/compiler`, оборачивает переводимый текст JSX в [`<T>`](/docs/react/reference/components/t), если в `gt.config.json` в разделе `files.gt.parsingFlags` включён параметр `enableAutoJsxInjection`. [Автоматическое внедрение JSX](/docs/cli/guides/using-auto-jsx) работает в одностраничных приложениях React, приложениях React с серверным рендерингом и сборках Next.js на webpack. Чтобы использовать этот рабочий процесс компилятора в Next.js, собирайте проект с помощью webpack; если вы используете Turbopack, размечайте контент с помощью [`<T>`](/docs/react/reference/components/t) вручную или поручите добавление обёрток Locadex.
* **Через пул-реквесты:** Locadex, AI-агент General Translation, запускает автоматизацию **Generate code**, которая оборачивает исходный код в [`<T>`](/docs/react/reference/components/t) и вызовы для строк, такие как [`useGT`](/docs/react/reference/hooks/use-gt), а затем открывает пул-реквест, который можно проверить вручную или слить через auto-merge.
* **Для переводов:** команда [`npx gt translate`](/docs/cli/reference/commands/translate) в процессе сборки или автоматизация Locadex **Generate translations and push** переводит новый и изменённый контент на все настроенные языки.

## Чем gt-next отличается от next-intl?

next-intl рендерит сообщения из JSON-каталогов — по одному на каждый язык, — которые пишет ваша команда или сторонний сервис. gt-next — библиотека General Translation для Next.js — хранит тексты прямо в коде внутри [`<T>`](/docs/react/reference/components/t) и генерирует все переводы с помощью [`gt translate`](/docs/cli/reference/commands/translate). Обе библиотеки поддерживают App Router и серверные компоненты и распространяются по лицензии MIT.

Чтобы пользоваться General Translation, менять библиотеку не обязательно. CLI `gt` распознаёт next-intl, react-i18next и next-i18next по `package.json` и [переводит их JSON-файлы](/docs/cli/guides/generating-translations), сохраняя синтаксис сообщений каждой библиотеки, — так что ваши компоненты и маршрутизация остаются прежними. Если позже вы решите перейти на встроенные тексты, в [руководстве по миграции](/docs/react/guides/migrating-i18n-libraries) описано, как заменить ключи на [`<T>`](/docs/react/reference/components/t), сохранить словари с помощью [`useTranslations`](/docs/react/reference/hooks/use-translations) и использовать обе библиотеки параллельно, переводя маршруты по одному. Подробное сравнение см. в статье [next-intl vs gt-next](/kb/next-intl-vs-gt-next).

## Как рецензенты исправляют переводы, не редактируя файлы перевода?

Рецензенты работают в [Редакторе переводов в панели управления](/docs/platform/dashboard/guides/reviewing-translations) General Translation. В нём можно сравнивать локали бок о бок и править сгенерированные переводы, не открывая файлы локалей и не запуская новое задание на перевод. Если ваша команда предпочитает редактировать скачанные файлы, команда [`npx gt save-local`](/docs/cli/reference/commands/save-local) загрузит эти правки на платформу. Кроме того, можно передать флаг `--save-local` команде [`gt translate`](/docs/cli/reference/commands/translate), чтобы правки синхронизировались при каждом запуске.

Контекст перевода задаётся в коде и в панели управления. [Проп `context`](/docs/react/reference/components/t#context) у компонента [`<T>`](/docs/react/reference/components/t) снимает неоднозначность слов: «Save» в редакторе документов переводится на немецкий как *speichern*, а в значении «копить деньги» — как *sparen*. [Термины Glossary и пользовательские промпты](/docs/platform/dashboard/guides/defining-context-for-translations) в контекстной группе обеспечивают единую терминологию и тон во всём приложении, документации и других проектах.

## Где хранятся сгенерированные переводы и нужна ли учётная запись?

Сгенерированные переводы хранятся в одном из двух мест:

* **В бандле вашего приложения:** [локальный загрузчик](/docs/react/guides/storing-translations) импортирует сгенерированные файлы, поэтому приложение в рабочей среде использует собственные переводы и не обращается к General Translation во время выполнения. Новые переводы попадают в приложение со следующей сборкой.
* **На CDN General Translation:** при [доставке через CDN](/docs/react/guides/configuring#delivery) опубликованные правки попадают в развёрнутое приложение без пересборки — с учётом настроек версии и кэширования.

`gt-react` и `gt-next` распространяются [по лицензии MIT](https://github.com/generaltranslation/gt) и работают без учётной записи General Translation, если вы предоставляете переводы самостоятельно. [`npx gt generate`](/docs/cli/reference/commands/generate) создаёт файл шаблона для каждой локали, который можно перевести вручную. Для генерации переводов с помощью [`gt translate`](/docs/cli/reference/commands/translate) используется облачный сервис General Translation; подробнее см. [тарифы General Translation](https://generaltranslation.com/pricing).

## Главное

* Интернационализацию можно реализовать без файлов перевода: в `gt-react` и `gt-next` от General Translation тексты остаются встроенными прямо в [`<T>`](/docs/react/reference/components/t), без ключей перевода, а [`npx gt translate`](/docs/cli/reference/commands/translate) при каждой сборке генерирует отдельный файл для каждого языка.
* Сгенерированные файлы — это результат сборки. Никто не редактирует их вручную и не копирует ключи из одного в другой, поэтому они всегда синхронизированы с кодом.
* Компилятор General Translation может оборачивать JSX в [`<T>`](/docs/react/reference/components/t) во время сборки, а Locadex — оборачивать код и переводить его через пул-реквесты.
* Если вы уже используете next-intl или react-i18next, CLI `gt` переведёт ваши существующие JSON-каталоги, а режим словаря позволит сохранить ключи, если они вам нужны.

## Related questions

- [Как добавить i18n в приложение Next.js на App Router?](https://generaltranslation.com/ru/kb/add-i18n-to-nextjs.mdx): Начните с gt init, чтобы настроить General Translation в поддерживаемом проекте на App Router, затем разметьте исходное содержимое, создайте переводы и проверьте переключение языка. gt-next хранит тексты прямо в JSX вместе с контекстом перевода, а CLI, редактор в панели управления и Locadex берут на себя генерацию, проверку и последующие обновления. В этом руководстве также показана явная настройка с локальными файлами.
- [Как интернационализировать приложение с помощью Cursor или Claude Code?](https://generaltranslation.com/ru/kb/ai-agent-i18n-setup.mdx): Начните с промпта Setup for Agents от General Translation в Cursor или Claude Code, выберите функциональность и целевые языки, а затем поручите агенту реализовать и проверить результат. Вход через браузер, машиночитаемая документация и инструменты MCP связывают настройку с переводом и проверкой. Используйте Locadex, чтобы автоматизировать дальнейшую локализацию через пул-реквесты.
- [Как работать с формами множественного числа в React?](https://generaltranslation.com/ru/kb/how-to-handle-plurals-in-react.mdx): Чтобы работать с формами множественного числа в React, задайте для каждого языка по одному предложению на каждую форму множественного числа и выбирайте нужное по правилам множественного числа этого языка — ведь в английском 2 формы, в русском 4, а в арабском 6. Компонент `<Plural>` от General Translation в gt-react и gt-next принимает формы на исходном языке, а General Translation генерирует формы, нужные каждому языку перевода.
- [Как поддерживать переводы в актуальном состоянии при каждом развёртывании?](https://generaltranslation.com/ru/kb/translations-in-ci.mdx): Запускайте перевод как этап конвейера перед каждой сборкой для рабочей среды — тогда новые тексты попадут в то же развёртывание, что и сами изменения, уже переведёнными. В CLI gt от General Translation для этого служит команда npx gt translate, которая использует ключ API проекта и идентификатор проекта, сохранённые как секреты CI.

## Previous and next questions

- Previous question: [Какое ПО для локализации лучше всего подходит разработчикам?](https://generaltranslation.com/ru/kb/best-localization-software.mdx)
- Next question: [General Translation и GNU gettext: нужны ли оба?](https://generaltranslation.com/ru/kb/general-translation-vs-gettext.mdx)

## Sitemap

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