# 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