# General Translation Knowledge Base: Время сборки, время выполнения или прокси для перевода: как доставлять переводы?
URL: https://generaltranslation.com/ru/kb/build-time-vs-runtime-translation.mdx
Docs index: https://generaltranslation.com/llms.txt
Description: Используйте General Translation, чтобы создать переводы известных заранее текстов приложения до релиза, а затем включить их в бандл вместе с кодом или загружать из CDN. Бандлы привязывают формулировки к конкретному релизу, а опубликованные в CDN правки попадают в новые рендеринги без развёртывания кода. Перевод во время запроса подходит для контента, который нужен посетителю сразу, а прокси — для случаев, когда вы не можете изменить код сайта.
Category: Интернационализация
Last updated: 2026-11-12
Authors: Jackie Chen
Published: 2026-11-12

Доставить перевод посетителю можно четырьмя основными способами. Его можно включить в бандл приложения при сборке, загрузить из сети доставки контента (CDN) во время рендеринга страницы, перевести через API прямо во время обработки запроса или подставить в HTML с помощью прокси или скрипта, стоящего перед вашим сайтом. От этого выбора зависит, от чего ваше приложение зависит в рабочей среде, как исправленный перевод доходит до пользователей и смогут ли поисковые системы индексировать каждую языковую версию.

Не путайте создание перевода с его загрузкой. CDN отдаёт уже созданные переводы и не обращается к AI-модели при каждом посещении. Тексты приложения, известные до развёртывания, переводите заранее и отдавайте из бандла или CDN. Контент, добавленный позже, можно переводить в момент публикации или в фоновой задаче, а перевод во время запроса стоит использовать, когда посетителю нужен результат немедленно. Прокси подходит для сайтов, код которых вы не можете или не хотите менять.

## Чем различаются подходы к доставке?

| Подход                                                                                                                                                                                    | Как это работает                                                            | От чего зависит рабочая среда                                                           | Как исправленный перевод попадает к пользователям                                                         | Подходит для                                                                        |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- |
| Включение в бандл во время сборки                                                                                                                                                         | Файлы перевода генерируются до сборки и импортируются для каждой локали     | Только от вашего приложения                                                             | Со следующим развёртыванием                                                                               | Большинства приложений, включая статические, ISR и отрисованные на сервере страницы |
| Загрузка из CDN во время выполнения                                                                                                                                                       | Приложение загружает сгенерированные переводы для каждой локали             | От CDN                                                                                  | Опубликуйте правку, затем обновите кэши переводов и страниц; полностью статический HTML нужно пересобрать | Приложений, в которых рецензенты исправляют формулировки между релизами             |
| Перевод по запросу                                                                                                                                                                        | Во время обработки запроса сервер получает текст от API перевода            | От API перевода — для запросов, при рендеринге которых встречается непереведённый текст | Каждый запрос переводит то, что отрисовывает, с учётом переданного текста и контекста                     | Мгновенного перевода пользовательских публикаций, ответов поддержки или ответов ИИ  |
| Прокси или наложение через скрипт ([Weglot](https://weglot.com/technical-presentation/), [Transifex Live](https://help.transifex.com/en/articles/6244596-introduction-to-transifex-live)) | Прокси отдаёт переведённый HTML; скрипт наложения заменяет текст в браузере | От сервиса доставки поставщика с учётом кэширования                                     | Правится в панели управления поставщика и отдаётся через его слой доставки                                | Готовых сайтов, которые вы не хотите менять; маркетинговых сайтов                   |

Включайте переводы в бандл во время сборки, если хотите проверять и выпускать код и формулировки вместе. Выбирайте CDN, если рецензенты должны публиковать исправления формулировок между релизами приложения. Например, исправленная метка кнопки на немецком попадёт в приложение, загружающее переводы из CDN, без пересборки, а для добавления новой кнопки всё равно придётся развернуть компонент. Генерация во время запроса увеличивает задержку по сравнению с чтением готового перевода, поэтому заранее известные тексты интерфейса лучше переводить предварительно.

## Какой подход лучше для SEO?

Выделите для каждого языка стабильный URL, доступный для сканирования, например `/es/pricing`, и отдавайте по этому URL переведённый контент и метаданные. Страницы, отрисованные на сервере или сгенерированные статически, справляются с этим, используя переводы из бандла или загружаемые из CDN; подойдёт и прокси с языковыми подкаталогами. Google [рекомендует использовать отдельные URL для языковых версий](https://developers.google.com/search/docs/specialty/international/managing-multi-regional-sites). Google умеет [выполнять рендеринг JavaScript](https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics), но наложение, которое меняет язык страницы по тому же URL только после того, как посетитель воспользуется переключателем, не даёт поисковому роботу отдельных языковых страниц для сканирования. Подробнее о hreflang и метаданных — в [руководстве по SEO для многоязычных приложений на Next.js](/kb/multilingual-nextjs-seo).

## В чём разница между i18n с рендерингом на edge и прокси для перевода?

При i18n с рендерингом на edge ваше приложение формирует переведённый HTML в edge-среде выполнения, используя собственные маршруты и переводы. Само по себе промежуточное ПО для определения локали не делает рендеринг страницы edge-рендерингом: среда выполнения для рендеринга определяется отдельно — выбором фреймворка и хостинга. Локализованные маршруты, отрисованное содержимое и кэширование находятся под вашим контролем.

Прокси переводит не исходный код, а готовый результат. [Обратный прокси Weglot](https://weglot.com/technical-presentation/) переводит каждую страницу на пути к посетителю, кэширует повторяющиеся запросы и подхватывает новое содержимое по мере его отдачи, а формулировки правятся в его панели управления. Настройка описана в [руководстве для сайтов](/kb/make-website-multilingual). Этот подход работает с исходным сервером, который отдаёт содержимое в виде HTML — статического или отрисованного на сервере. Текста, который создаётся только JavaScript в браузере, в ответе исходного сервера нет. Прокси видит структуру отрисованного HTML, но исходные компоненты и контекстные заметки разработчиков автоматически вместе с ней не передаются. Компромиссы рассмотрены в [сравнении с Weglot](/kb/general-translation-vs-weglot).

## Как доставлять переводы в приложении Next.js с SSG, ISR или SSR?

Создайте переводы до сборки — тогда их сможет использовать любой режим рендеринга. При работе с `gt-next` от General Translation запускайте [`npx gt translate`](/docs/cli/reference/commands/translate) перед `next build`. При серверном рендеринге (SSR) правка, опубликованная в CDN, подхватывается при следующем рендеринге — после обновления кэшей переводов. При генерации статических сайтов (SSG) переведённый текст встраивается в HTML и остаётся неизменным до повторной сборки или ревалидации. При инкрементальной статической регенерации (ISR) [ревалидация заново генерирует этот HTML](https://nextjs.org/docs/app/guides/incremental-static-regeneration); исправленная формулировка появится, как только обновление попадёт и в кэш переводов. Полностью статический экспорт требует новой сборки.

Чтобы предварительно отрисовать отдельный маршрут для каждой локали в App Router, перенесите маршруты в `app/[locale]`, подключите промежуточное ПО для локалей из `gt-next`, а затем верните все локали из `generateStaticParams`:

```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, в корневом каталоге есть файл `getLocale.ts`, который считывает корневой параметр `locale`, а файл `getRegion.ts` возвращает `undefined`. Поддерживаемые версии Next.js и необходимые файлы описаны в [руководстве по статической генерации для App Router](/docs/react/nextjs/app-router-static-site-generation). Предварительная отрисовка маршрутов при развёртывании Next.js — не то же самое, что `output: 'export'`: в последнем случае дополнительно нужна конфигурация статического экспорта из того же руководства.

## Как перевести контент, который появляется только во время выполнения?

Если заметку нужно переводить в момент, когда посетитель её открывает, используйте компонент [`<Tx>`](/docs/react/nextjs/reference/components/tx) и функцию [`tx`](/docs/react/nextjs/reference/functions/tx) из General Translation: они обращаются к API перевода из серверных компонентов Next.js App Router. В этом примере предполагается, что маршрутизация по локалям уже настроена, а `getNote` загружает заметку:

```tsx title="app/[locale]/notes/[id]/page.tsx"
import { Tx } from 'gt-next/server';
import { getNote } from '@/lib/notes';

export default async function NotePage({
  params,
}: {
  params: Promise<{ id: string }>;
}) {
  const { id } = await params;
  const note = await getNote(id);
  return <Tx context="A note written by a user">{note.body}</Tx>;
}
```

В рабочей среде задайте на сервере переменную `GT_API_KEY`, указав в ней ключ проекта с включённым параметром **Перевод во время выполнения**, и никогда не передавайте этот ключ в браузер ([учётные данные для рабочей среды](/docs/react/nextjs/config#credentials)). Перевод во время обработки запроса тарифицируется отдельно от перевода на этапе сборки; подробнее см. в разделе [тарифы на использование](https://generaltranslation.com/pricing/usage). Вне серверных компонентов Next.js, например в API на Express, ту же задачу для строк решает функция [`tx`](/docs/node/reference/functions/tx) из `gt-node`.

## Как General Translation доставляет переводы?

General Translation генерирует переводы с помощью своего CLI, а ваше приложение затем считывает их из одного из двух мест:

* **Локальные файлы.** Укажите путь вывода в `gt.config.json`, запустите [`npx gt translate`](/docs/cli/reference/commands/translate) перед сборкой и реализуйте функцию [`loadTranslations`](/docs/react/reference/functions/load-translations), которая импортирует каждую локаль. При рендеринге переводов, включённых в сборку, никаких запросов к General Translation не выполняется. [`gt init`](/docs/cli/reference/commands/init) рекомендует именно такую настройку (**Save locally**), а для `gt-vue` это единственный вариант.
* **CDN General Translation** — в SDK для React и Next.js. Включите CDN в настройках проекта, запустите [`npx gt translate --publish`](/docs/cli/reference/commands/translate) и передайте SDK ваш [`projectId`](/docs/react/reference/config#project-id), не настраивая локальный загрузчик. Если локальный загрузчик не настроен, SDK по умолчанию загружает переводы из CDN. CLI фиксирует версию источника, которую будет загружать сборка. Правки, опубликованные в эту версию, попадают в новые рендеринги после обновления кэшей — без развёртывания нового кода приложения. Новый текст по-прежнему попадает в продакшен вместе с развёртыванием, в котором он добавлен, а статический HTML подчиняется описанным выше правилам пересборки и ревалидации. Доставка через CDN [бесплатна](https://generaltranslation.com/pricing/usage).

Чтобы переключиться между локальными файлами и CDN, достаточно изменить конфигурацию — компоненты при этом менять не нужно. В [руководстве по хранению переводов](/docs/react/guides/storing-translations) приведён загрузчик для каждого React-фреймворка.

## Ключевые выводы

* Генерируйте переводы известного контента приложения до развёртывания. Включайте их в бандл вместе с релизом или загружайте из CDN, если исправления формулировок должны попадать в новые рендеринги между релизами.
* Переводите новый контент при публикации, в фоновой задаче или по запросу — в зависимости от того, когда он нужен пользователям. Храните ключи API перевода на сервере.
* Прокси добавляет языки без изменений в коде, но переводит уже отрисованный HTML, и каждый просмотр переведённой страницы зависит от поставщика.
* General Translation отдаёт одни и те же компоненты [`<T>`](/docs/react/reference/components/t) из локальных файлов или через свой CDN, а для контента, переводимого во время запроса, предоставляет [`<Tx>`](/docs/react/nextjs/reference/components/tx). Начните с раздела [Быстрый старт для Next.js](/docs/react/nextjs-quickstart).

## Related questions

- [Как сделать сайт многоязычным?](https://generaltranslation.com/ru/kb/make-website-multilingual.mdx): Выберите, где будут храниться переводы — в прокси, плагине CMS, конструкторе сайтов или в вашем собственном коде, — а затем выделите каждому языку собственный URL, как рекомендует Google. Переводите страницы целиком, включая заголовки и метаописания, связывайте языковые версии с помощью hreflang и предлагайте переключатель языка вместо автоматического перенаправления посетителей.
- [Как настроить SEO для многоязычного приложения Next.js?](https://generaltranslation.com/ru/kb/multilingual-nextjs-seo.mdx): Выделите каждому языку собственный URL с префиксом, например /en/about и /es/about, а затем укажите для каждого опубликованного языка html lang, канонический URL, ссылающийся на саму страницу, альтернативные версии hreflang с x-default, переведённые заголовок и описание, а также запись в карте сайта. Неопубликованные версии пометьте noindex. gt-next от General Translation направляет каждый язык на собственный URL и переводит заголовки с помощью getGT.
- [Какой инструмент непрерывной локализации лучше всего подходит командам, выпускающим релизы ежедневно?](https://generaltranslation.com/ru/kb/best-continuous-localization-tools.mdx): Выберите General Translation, чтобы переводить новые тексты перед каждой сборкой с учётом контекста из размеченного JSX и общей продуктовой терминологии. Ваша команда проверяет и правит формулировки в панели управления, а Locadex открывает пул-реквесты, которые размечают новый текст UI для перевода. Этот рабочий процесс можно внедрить, не отказываясь от существующей настройки i18next или next-intl.
- [Альтернативы Weglot: General Translation и Weglot](https://generaltranslation.com/ru/kb/general-translation-vs-weglot.mdx): Weglot — сервис перевода сайтов, который переводит отрендеренные страницы с помощью плагинов, JavaScript-сниппета или прокси, а в Weglot 2.0 появились рабочие процессы перевода JSON в GitHub. General Translation — платформа локализации, объединяющая интернационализацию исходного кода, перевод файлов, общий контекст, проверку в панели управления и маршрутизацию по локалям.
- [Языковые перенаправления и SEO: URL, cookie-файл или Accept-Language?](https://generaltranslation.com/ru/kb/locale-routing-seo.mdx): Язык каждой страницы, которую вы хотите видеть в индексе, должен определять URL, ведь Googlebot не отправляет заголовок Accept-Language и сканирует сайты в основном с американских адресов. Сохранённый в cookie-файле выбор, а за ним Accept-Language используйте только для того, чтобы решить, куда перенаправлять с нейтрального корневого пути вроде /, причём временным перенаправлением 302 или 307.

## Previous and next questions

- Previous question: [AI-агент для написания кода или конвейер перевода: что выбрать для автоматизации локализации?](https://generaltranslation.com/ru/kb/ai-coding-agent-vs-translation-pipeline.mdx)
- Next question: [Какой инструмент непрерывной локализации лучше всего подходит командам, выпускающим релизы ежедневно?](https://generaltranslation.com/ru/kb/best-continuous-localization-tools.mdx)

## Sitemap

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