# General Translation Knowledge Base: Как перевести приложение на Node.js?
URL: https://generaltranslation.com/ru/kb/translate-node-app.mdx
Docs index: https://generaltranslation.com/llms.txt
Description: Определяйте язык каждого запроса, обычно по заголовку Accept-Language, и возвращайте все строки на этом языке. Пакет gt-node от General Translation привязывает локаль к каждому запросу с помощью withGT и переводит строки с помощью getGT. Переводы для них генерирует команда npx gt translate --publish ещё до развертывания.
Category: Интернационализация
Last updated: 2026-10-21
Authors: Kevin Liu, Kevin Wu
Published: 2026-10-21

Перевести приложение на Node.js — значит определять язык каждого запроса, обычно по заголовку `Accept-Language`, и возвращать все строки на этом языке. Сложность в том, что один сервер одновременно обслуживает множество пользователей, поэтому язык не может быть глобальной настройкой: у каждого запроса он свой, и он нужен каждой функции, которая формирует ответ. Кроме того, строкам с подставляемыми значениями нужны грамматические правила конкретного языка: в английском число требует одной из 2 форм множественного числа, а в арабском — одной из 6.

## Video

The video is narrated in English, with English captions.

[How do I translate a Node.js app?](https://caxecubb9c64cezv.public.blob.vercel-storage.com/films/kb-translate-node-app.mp4) (48 с)

General Translation lets you translate strings into each request's locale with `gt-node`. Call `initializeGT` once, wrap each request in `withGT`, await `getGT` in a handler, list `server.js` in `gt.config.json`, sign in, and run `npx gt translate`.

## Способы перевести приложение Node.js

| Подход                                                                                         | Сильные стороны                                                                                                                                                            | Локаль для каждого запроса                                                                            | Что остаётся на вас                                                                                                                                                                                                 |
| ---------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Только библиотека интернационализации (i18n) ([`i18next`](/kb/general-translation-vs-i18next)) | Зрелая среда выполнения для рендеринга переводов и форматирования значений                                                                                                 | Её определяет плагин промежуточного ПО                                                                | Извлечение строк в отдельный JSON-файл с ключами для каждого языка, написание всех переводов и обновление каждого файла при любом изменении текста                                                                  |
| [`nestjs-i18n`](/kb/general-translation-vs-nestjs-i18n) (NestJS)                               | Рендеринг сообщений из JSON- или YAML-каталогов для каждого языка через HTTP, GraphQL, gRPC и WebSockets                                                                   | Резолверы читают строку запроса, заголовок, cookie-файл или `Accept-Language` в заданном вами порядке | Написание каталога для каждого языка и поддержание всех каталогов в актуальном состоянии                                                                                                                            |
| API машинного перевода во время запроса (DeepL, Google Cloud Translation)                      | Переводит любой текст, включая контент, который появляется только во время выполнения                                                                                      | Вы передаёте язык перевода при каждом вызове                                                          | Задержки и расходы на каждый запрос (если не кешировать результаты), единообразие терминологии, формы множественного числа и вычитка                                                                                |
| General Translation (`gt-node` и CLI `gt`)                                                     | Строки остаются встроенными прямо в обработчиках, в вызовах `gt()`, а [`npx gt translate --publish`](/docs/cli/reference/commands/translate) переводит их до развёртывания | Её привязывает [`withGT`](/docs/node/reference/functions/with-gt)                                     | Идентификатор проекта и `gt.config.json` из [`npx gt init`](/docs/cli/reference/commands/init), [`gt login`](/docs/cli/reference/commands/login) или ключ API, а также запуск CLI на этапе сборки или развёртывания |

Используйте только `i18next` или `nestjs-i18n`, если ваша команда уже ведёт переведённые каталоги. Вызывайте API машинного перевода во время запроса только для контента, который появляется лишь во время выполнения, например для пользовательских публикаций. Используйте `gt-node`, если строки находятся в ваших обработчиках и меняются с каждым релизом. Если ваш API возвращает только данные и коды ошибок, а все сообщения рендерит веб- или мобильный клиент, можно обойтись более простой настройкой: переводите на стороне клиента.

## Перевод приложения Node.js с помощью gt-node

1. Один раз при запуске вызовите [`initializeGT`](/docs/node/reference/functions/initialize-gt), передав свои локали.

2. Оберните каждый запрос в [`withGT`](/docs/node/reference/functions/with-gt). Эта функция привязывает локаль через `AsyncLocalStorage`, поэтому у каждого из параллельных запросов остаётся своя локаль, а [`getRequestLocale`](/docs/node/reference/functions/get-request-locale) считывает её из `Accept-Language`.

3. В обработчике вызовите [`getGT`](/docs/node/reference/functions/get-gt), чтобы получить функцию `gt()`. Она принимает ICU-сообщения (в том числе с формами множественного числа) и опцию `$context` для неоднозначных слов:

   ```js title="server.js"
   import express from 'express';
   import { initializeGT, withGT, getRequestLocale, getGT } from 'gt-node';

   initializeGT({ defaultLocale: 'en', locales: ['en', 'es', 'fr'] });
   const app = express();
   app.use((req, res, next) => withGT(getRequestLocale(req), () => next()));

   app.get('/api/greeting', async (req, res) => {
     const gt = await getGT();
     res.json({ message: gt('Hello, {name}!', { name: 'Alice' }) });
   });
   app.listen(3000, () => console.log('Listening on http://localhost:3000'));
   ```

4. Перед развёртыванием включите CDN в настройках проекта и выполните [`npx gt translate --publish`](/docs/cli/reference/commands/translate).

В рабочей среде `gt-node` загружает эти переводы из General Translation CDN по идентификатору проекта из `GT_PROJECT_ID`, а если перевод отсутствует, используется исходная строка.

## Единая терминология с клиентским приложением

Если ваш веб- или мобильный клиент тоже использует General Translation, назначьте его контекстную группу (Glossary и пользовательские промпты) серверному проекту в разделе **Project &gt; Context** панели управления. Тогда в новых переводах в ответах API будет использоваться та же терминология. Подробная инструкция приведена в руководстве [Быстрый старт для Node.js](/docs/node/quickstart).

## Related questions

- [Как перевести React-приложение?](https://generaltranslation.com/ru/kb/translate-react-app.mdx): Перевод React-приложения состоит из двух этапов — интернационализации компонентов, чтобы они отображались на языке пользователя, и перевода каждой строки на все поддерживаемые языки. gt-react от General Translation переводит JSX на месте в компоненте `<T>`, а npx gt translate создаёт по одному файлу на каждый язык.
- [Как перевести приложение на Vue?](https://generaltranslation.com/ru/kb/translate-vue-app.mdx): Чтобы перевести приложение на Vue, нужно заменить каждую строку шаблона поиском по ключу для активного языка и перевести её на все языки перевода. Плагин gt-vue от General Translation переводит контент, обёрнутый в компонент `<T>`, а npx gt translate создаёт отдельный каталог для каждого языка перевода.
- [Как добавить 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 берут на себя генерацию, проверку и последующие обновления. В этом руководстве также показана явная настройка с локальными файлами.
- [Как поддерживать переводы в актуальном состоянии при каждом развёртывании?](https://generaltranslation.com/ru/kb/translations-in-ci.mdx): Запускайте перевод как этап конвейера перед каждой сборкой для рабочей среды — тогда новые тексты попадут в то же развёртывание, что и сами изменения, уже переведёнными. В CLI gt от General Translation для этого служит команда npx gt translate, которая использует ключ API проекта и идентификатор проекта, сохранённые как секреты CI.

## Previous and next questions

- Previous question: [Как перевести контент в Storyblok?](https://generaltranslation.com/ru/kb/translate-storyblok-content.mdx)
- Next question: [Как перевести приложение на React Native?](https://generaltranslation.com/ru/kb/translate-react-native-app.mdx)

## Sitemap

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