# node: Быстрый старт Node.js URL: https://generaltranslation.com/ru/docs/node/tutorials/quickstart.mdx --- title: Быстрый старт Node.js description: Добавьте поддержку нескольких языков на свой сервер Node.js менее чем за 10 минут --- После выполнения этого руководства ваш сервер Node.js будет возвращать переведённое содержимое в зависимости от языка запроса, используя либо инлайн, либо предварительно зарегистрированные строки. **Предварительные требования:** * Сервер Node.js (Express, Fastify или аналогичный) * Node.js 18+ **Нужен автоматический сетап?** Запустите `npx gt@latest`, чтобы настроить всё с помощью [мастера Setup](/docs/cli/init). В этом руководстве рассматривается ручная настройка. *** ## Шаг 1: Установите пакеты `gt-node` — библиотека, которая обеспечивает переводы на сервере. `gt` — CLI-инструмент, который подготавливает переводы для продакшена. ```bash npm i gt-node npm i -D gt ``` ```bash yarn add gt-node yarn add --dev gt ``` ```bash bun add gt-node bun add --dev gt ``` ```bash pnpm add gt-node pnpm add --save-dev gt ``` *** ## Шаг 2: Создайте файл конфигурации перевода Создайте файл **`gt.config.json`** в корне проекта. В нем библиотеке указывается, какие языки вы поддерживаете: ```json title="gt.config.json" { "defaultLocale": "en", "locales": ["es", "fr", "ja"] } ``` * **`defaultLocale`** — язык, на котором написаны строки на вашем сервере. * **`locales`** — языки, на которые вы хотите переводить. Выберите любые из [списка поддерживаемых локалей](/docs/platform/supported-locales). *** ## Шаг 3: Инициализируйте General Translation Вызовите **`initializeGT`** один раз в начале входного файла сервера, прежде чем использовать какие-либо функции перевода: ```js title="server.js" import { initializeGT } from 'gt-node'; initializeGT({ defaultLocale: 'en', locales: ['en', 'es', 'fr', 'ja'], projectId: process.env.GT_PROJECT_ID, }); ``` Здесь вы настраиваете библиотеку, указывая поддерживаемые языки и учетные данные проекта. *** ## Шаг 4: Задайте контекст локали для каждого запроса Каждому запросу нужно знать, какой язык использовать. Оберните обработчики запросов с помощью **`withGT`** — он использует асинхронное локальное хранилище, поэтому функции перевода автоматически подхватывают нужную локаль: ```js title="server.js" import { withGT } from 'gt-node'; app.use((req, res, next) => { const locale = req.headers['accept-language']?.split(',')[0] || 'en'; withGT(locale, () => next()); }); ``` *** ## Шаг 5: Перевод инлайн-строк Чтобы переводить строки прямо внутри обработчиков запросов, используйте **`getGT`**: ```js title="server.js" import { getGT } from 'gt-node'; app.get('/api/greeting', async (req, res) => { const gt = await getGT(); res.json({ message: gt('Hello, world!'), welcome: gt('Welcome, {name}!', { name: 'Alice' }), }); }); ``` `getGT` возвращает функцию перевода для локали текущего запроса. *** ## Шаг 6: Предварительно зарегистрируйте константные строки (необязательно) Для строк, определённых вне обработчиков запросов, — например, сообщений об ошибках, меток перечислений или констант — используйте **`msg`** для регистрации на уровне модуля, а затем **`getMessages`** для получения переводов во время выполнения: ```js title="messages.js" import { msg } from 'gt-node'; export const GREETING = msg('Hello, world!'); export const WELCOME = msg('Welcome, {name}!'); export const NOT_FOUND = msg('Resource not found.'); ``` ```js title="handler.js" import { getMessages } from 'gt-node'; import { GREETING, WELCOME, NOT_FOUND } from './messages.js'; app.get('/api/status', async (req, res) => { const m = await getMessages(); res.json({ greeting: m(GREETING), welcome: m(WELCOME, { name: 'Alice' }), }); }); app.use(async (req, res) => { const m = await getMessages(); res.status(404).json({ error: m(NOT_FOUND) }); }); ``` Этот подход полезен, когда одни и те же строки используются в нескольких обработчиках. *** ## Шаг 7: Настройте переменные окружения (необязательно) Чтобы видеть переводы в процессе разработки, вам понадобятся API-ключи General Translation. Они включают **перевод по запросу** — ваш сервер будет переводить контент в реальном времени во время разработки. Создайте файл **`.env`**: ```bash title=".env" GT_API_KEY="your-api-key" GT_PROJECT_ID="your-project-id" ``` Получите бесплатные ключи на [dash.generaltranslation.com](https://dash.generaltranslation.com/signup) или выполнив команду: ```bash npx gt auth ``` Никогда не публикуйте `GT_API_KEY` и не коммитьте его в систему контроля версий. Да. Без API-ключей `gt-node` работает как обычная библиотека i18n. Перевод по запросу во время разработки будет недоступен, но вы по-прежнему можете: * Вручную добавлять собственные файлы переводов * Использовать все функции перевода (`getGT`, `msg`, `getMessages` и т. д.) * Запустить `npx gt generate`, чтобы создать шаблоны файлов перевода, а затем перевести их самостоятельно *** ## Шаг 8: Проверка в работе Запустите сервер и протестируйте его с разными заголовками `Accept-Language`: ```bash # По умолчанию (английский) curl http://localhost:3000/api/greeting # Испанский curl -H "Accept-Language: es" http://localhost:3000/api/greeting # Французский curl -H "Accept-Language: fr" http://localhost:3000/api/greeting ``` Вы должны увидеть переведённые ответы для каждого языка. Во время разработки переводы выполняются по запросу — при первом запросе нового языка может быть небольшая задержка. В продакшене переводы генерируются заранее и загружаются мгновенно. *** ## Шаг 9: Полный пример Вот полный пример сервера Express, где всё собрано вместе: ```js title="server.js" import express from 'express'; import { initializeGT, withGT, getGT, msg, getMessages } from 'gt-node'; // Инициализировать GT раньше всего остального initializeGT({ defaultLocale: 'en', locales: ['en', 'es', 'fr', 'ja'], projectId: process.env.GT_PROJECT_ID, }); // Предварительная регистрация константных строк const NOT_FOUND = msg('Resource not found.'); const app = express(); // Установить контекст локали для каждого запроса app.use((req, res, next) => { const locale = req.headers['accept-language']?.split(',')[0] || 'en'; withGT(locale, () => next()); }); // Инлайн-перевод app.get('/api/greeting', async (req, res) => { const gt = await getGT(); res.json({ message: gt('Hello, world!') }); }); // Перевод предварительно зарегистрированного сообщения app.use(async (req, res) => { const m = await getMessages(); res.status(404).json({ error: m(NOT_FOUND) }); }); app.listen(3000, () => console.log('Server running on port 3000')); ``` *** ## Шаг 10: Развертывание в продакшен В продакшене переводы заранее генерируются на этапе сборки (без API-вызовов в реальном времени). Добавьте команду `translate` в скрипт сборки: ```json title="package.json" { "scripts": { "build": "npx gt translate && " } } ``` Задайте переменные окружения для **продакшен** у своего хостинг-провайдера: ```bash GT_PROJECT_ID=your-project-id GT_API_KEY=gtx-api-your-production-key ``` Никогда не публикуйте свой `GT_API_KEY` в открытом доступе. Вот и всё — теперь ваш сервер многоязычный. 🎉 *** ## Устранение неполадок Это ожидаемо. В режиме разработки переводы выполняются по запросу (контент переводится в реальном времени через API). В **продакшен** этой задержки нет — все переводы заранее генерируются командой `npx gt translate`. Неоднозначный текст может приводить к неточным переводам. Например, "apple" может означать как фрукт, так и компанию. Чтобы уточнить значение, добавьте параметр `$context`: ```js gt('Apple', { $context: 'the technology company' }); ``` Параметр `$context` поддерживается и в `getGT()`, и в `msg()`. *** ## Следующие шаги * [**`initializeGT`**](/docs/node/api/initialize-gt) — Полный список параметров конфигурации * [**`withGT`**](/docs/node/api/with-gt) — Контекст локали в запросах * [**`getGT`**](/docs/node/api/get-gt) — Инлайн-перевод строк * [**`msg` & `getMessages`**](/docs/node/api/get-messages) — Перевод предварительно зарегистрированных сообщений * [**CLI**](/docs/cli/translate) — Справка по процессу перевода