# General Translation React SDKs (gt-react, gt-next, gt-react-native): Разработка с переводом для SPA
URL: https://generaltranslation.com/ru/docs/react/guides/developing-spa-translations.mdx
---
title: Разработка с переводом для SPA
description: Как просматривать переводы General Translation во время разработки одностраничного приложения на React.
related:
links:
- /docs/react/guides/storing-translations
- /docs/react/guides/configuring
- /docs/react/guides/translating-jsx
- /docs/react/guides/managing-locales
---
Перевод для разработки позволяет предварительно просматривать переведённый контент по мере редактирования SPA. Для него требуются GT компилятор и API-ключ для разработки.
**Предварительные требования:**
* Одностраничное приложение React, настроенное с помощью [Быстрый старт SPA](/docs/react/react-spa-quickstart)
* API-ключ для разработки, начинающийся с `gtx-dev-`
**Ограничение CommonJS:** Для горячей перезагрузки при разработке требуется ESM, поскольку компилятор добавляет `await` верхнего уровня. Это не работает в приложениях, собранных как CommonJS. Переводы для production по-прежнему работают с шаблоном запуска CommonJS из [Быстрый старт SPA](/docs/react/react-spa-quickstart).
## Подготовка [#setup]
### 1. Установите компилятор
Установите `@generaltranslation/compiler` в качестве зависимости для разработки:
```bash
npm i -D @generaltranslation/compiler
```
```bash
yarn add --dev @generaltranslation/compiler
```
```bash
bun add --dev @generaltranslation/compiler
```
```bash
pnpm add --save-dev @generaltranslation/compiler
```
### 2. Добавьте плагин компилятора
Включите горячую перезагрузку при разработке в общей config для CLI и компилятора:
```json title="gt.config.json"
{
"files": {
"gt": {
"output": "src/_gt/[locale].json",
"parsingFlags": {
"devHotReload": true
}
}
}
}
```
Затем добавьте плагин для своего сборщика.
```ts title="vite.config.ts"
import react from '@vitejs/plugin-react';
import { vite as gtCompiler } from '@generaltranslation/compiler'; // [!code highlight]
import { defineConfig } from 'vite';
import gtConfig from './gt.config.json'; // [!code highlight]
export default defineConfig({
plugins: [react(), gtCompiler({ ...gtConfig })], // [!code highlight]
});
```
Установите `dotenv` как зависимость для разработки, чтобы webpack мог читать `.env` и `.env.local`, затем добавьте компилятор перед остальными плагинами. Используйте `DefinePlugin`, чтобы предоставить браузерному коду только учетные данные для разработки:
```js title="webpack.config.mjs"
import { webpack as gtCompiler } from '@generaltranslation/compiler';
import dotenv from 'dotenv';
import webpack from 'webpack';
import gtConfig from './gt.config.json' with { type: 'json' };
dotenv.config({ path: '.env' });
dotenv.config({ path: '.env.local', override: true });
export default (_env, argv) => {
const isProduction = (argv.mode ?? 'production') === 'production';
return {
// Сохраните существующие настройки webpack.
plugins: [
gtCompiler({ ...gtConfig }),
new webpack.DefinePlugin({
'process.env.GT_PROJECT_ID': JSON.stringify(
isProduction ? '' : (process.env.GT_PROJECT_ID ?? '')
),
'process.env.GT_DEV_API_KEY': JSON.stringify(
isProduction ? '' : (process.env.GT_DEV_API_KEY ?? '')
),
}),
],
};
};
```
Полный пример webpack для [`gt-react`](https://github.com/generaltranslation/gt/tree/main/examples/webpack-spa) см. в разделе о лоадерах, локальных файлах перевода и настройках сервера разработки.
Подключите компилятор перед другими плагинами Rollup:
```js title="rollup.config.mjs"
import { rollup as gtCompiler } from '@generaltranslation/compiler';
export default {
input: 'src/index.ts',
plugins: [
gtCompiler(),
// Другие ваши плагины Rollup
],
};
```
Rollup не может анализировать полностью динамический импорт переводов. Укажите для каждой локали статический спецификатор импорта:
```ts title="src/loadTranslations.ts"
const translationLoaders = {
es: () => import('./_gt/es.json'),
fr: () => import('./_gt/fr.json'),
};
export default async function loadTranslations(locale: string) {
const loader =
translationLoaders[locale as keyof typeof translationLoaders];
return loader ? (await loader()).default : {};
}
```
Обычный Rollup не поддерживает интеграцию учетных данных для разработки, показанную для Vite и webpack. При изменении исходного содержимого заново генерируйте локальные файлы перевода. См. [полный пример Rollup для `gt-react`](https://github.com/generaltranslation/gt/tree/main/examples/rollup-spa).
Добавьте адаптер Rspack в список плагинов:
```js title="rspack.config.mjs"
import { rspack as gtCompiler } from '@generaltranslation/compiler';
export default {
plugins: [gtCompiler()],
};
```
Для перевода в режиме разработки также необходимо передать `GT_PROJECT_ID` и `GT_DEV_API_KEY` браузерному коду, не включая ни одно из этих значений в production-бандлы.
Добавьте адаптер esbuild в массив `plugins`:
```js title="build.mjs"
import { build } from 'esbuild';
import { esbuild as gtCompiler } from '@generaltranslation/compiler';
await build({
entryPoints: ['src/index.tsx'],
bundle: true,
outdir: 'dist',
plugins: [gtCompiler()],
});
```
*Примечание: адаптер esbuild не поддерживает автоматическую инъекцию JSX. Явно оборачивайте переводимый JSX или используйте другой адаптер, если требуется `enableAutoJsxInjection`.*
Полную настройку Vite см. в [полном примере Vite для `gt-react`](https://github.com/generaltranslation/gt/tree/main/examples/vite-spa).
### 3. Добавьте учетные данные для разработки
Получите API-ключ для разработки на [dash.generaltranslation.com](https://dash.generaltranslation.com/en-US/signin) или с помощью команды:
```bash
npx gt auth
```
Затем добавьте ID проекта и API-ключ для разработки в `.env.local` и передайте их в функцию инициализации:
```bash title=".env.local"
VITE_GT_PROJECT_ID="your-project-id"
VITE_GT_DEV_API_KEY="your-dev-api-key"
```
```ts
await initializeGTSPA({
...gtConfig,
projectId: import.meta.env.VITE_GT_PROJECT_ID,
devApiKey: import.meta.env.VITE_GT_DEV_API_KEY,
loadTranslations,
});
```
```bash title=".env.local"
GT_PROJECT_ID="your-project-id"
GT_DEV_API_KEY="your-dev-api-key"
```
```ts
await initializeGTSPA({
...gtConfig,
projectId: process.env.GT_PROJECT_ID,
devApiKey: process.env.GT_DEV_API_KEY,
loadTranslations,
});
```
Приведённая выше конфигурация webpack заменяет оба значения пустыми строками в production-сборках, поэтому учётные данные для разработки не попадают в production бандл.
**Только для разработки:** Используйте ключ, начинающийся с `gtx-dev-`. Никогда не раскрывайте в браузерном коде production-ключ, начинающийся с `gtx-api-`.
### 4. Начните разработку
Запустите сервер разработки и переключитесь на локаль, отличную от локали по умолчанию. Когда вы редактируете переводимый контент, компилятор фиксирует изменения, а `gt-react` запрашивает обновлённый перевод для разработки.
## Next steps
- /docs/react/guides/storing-translations
- /docs/react/guides/configuring
- /docs/react/guides/translating-jsx
- /docs/react/guides/managing-locales