# General Translation React SDKs (gt-react, gt-next, gt-react-native): SPA翻訳で開発する URL: https://generaltranslation.com/ja/docs/react/guides/developing-spa-translations.mdx --- title: SPA翻訳で開発する description: シングルページのReactアプリを開発しながら、General Translationの翻訳をプレビューする方法。 related: links: - /docs/react/guides/storing-translations - /docs/react/guides/configuring - /docs/react/guides/translating-jsx - /docs/react/guides/managing-locales --- 開発時の翻訳を使うと、SPA の編集中に翻訳済みコンテンツをプレビューできます。これには GT コンパイラと開発用 API キーが必要です。 **前提条件:** * [SPA クイックスタート](/docs/react/react-spa-quickstart)に従って設定されたシングルページの React アプリ * `gtx-dev-` で始まる開発用 API キー **CommonJS の制限:** 開発時の hot reload には、コンパイラがトップレベルの `await` を挿入するため、ESM が必要です。CommonJS としてコンパイルされたアプリケーションでは動作しません。本番用の翻訳は、[SPA クイックスタート](/docs/react/react-spa-quickstart)の CommonJS 起動パターンでも引き続き動作します。 ## セットアップ [#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. コンパイラプラグインを追加する CLI とコンパイラで共有される config で、開発時のhot reloadを有効にします: ```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] }); ``` webpack が `.env` と `.env.local` を読み込めるように、まず開発依存関係として `dotenv` をインストールし、続けて他のプラグインより前にコンパイラを追加します。`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 ?? '') ), }), ], }; }; ``` loader、ローカル翻訳ファイル、開発サーバーの設定については、[`gt-react` の webpack 完全版サンプル](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 で示した開発用認証情報のインテグレーションは利用できません。ソースコンテンツが変更されたら、ローカル翻訳ファイルを再生成してください。完全な [`gt-react` Rollup サンプル](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` をブラウザコードに公開する必要もあります。ただし、どちらの値も本番バンドルには含めないでください。 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 インジェクションをサポートしていません。`enableAutoJsxInjection` が必要な場合は、翻訳対象の JSX を明示的にラップするか、別のアダプタを使用してください。* Vite の完全なセットアップについては、[`gt-react` の Vite 完全版サンプル](https://github.com/generaltranslation/gt/tree/main/examples/vite-spa)を参照してください。 ### 3. 開発用認証情報を追加する [dash.generaltranslation.com](https://dash.generaltranslation.com/en-US/signin) で開発用 API キーを取得するか、次を実行します: ```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 の設定では、本番ビルド時に両方の値が空文字列に置き換えられるため、開発用の認証情報が本番バンドルに含まれることはありません。 **開発時のみ:** `gtx-dev-` で始まるキーを使用してください。`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