@intlayer/docs 8.3.0-canary.4 → 8.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/docs/ar/compiler.md +84 -49
- package/docs/ar/configuration.md +80 -37
- package/docs/ar/intlayer_with_nextjs_16.md +174 -1
- package/docs/ar/intlayer_with_nextjs_compiler.md +174 -1
- package/docs/ar/intlayer_with_react_router_v7.md +224 -1
- package/docs/ar/intlayer_with_react_router_v7_fs_routes.md +225 -1
- package/docs/ar/intlayer_with_svelte_kit.md +175 -2
- package/docs/ar/intlayer_with_tanstack.md +176 -1
- package/docs/ar/intlayer_with_vite+preact.md +174 -1
- package/docs/ar/intlayer_with_vite+react.md +174 -1
- package/docs/ar/intlayer_with_vite+solid.md +174 -1
- package/docs/ar/intlayer_with_vite+svelte.md +174 -1
- package/docs/ar/intlayer_with_vite+vue.md +174 -1
- package/docs/de/compiler.md +83 -48
- package/docs/de/configuration.md +434 -212
- package/docs/de/intlayer_with_nextjs_16.md +176 -1
- package/docs/de/intlayer_with_nextjs_compiler.md +106 -349
- package/docs/de/intlayer_with_react_router_v7.md +225 -2
- package/docs/de/intlayer_with_react_router_v7_fs_routes.md +221 -79
- package/docs/de/intlayer_with_svelte_kit.md +158 -2
- package/docs/de/intlayer_with_tanstack.md +159 -1
- package/docs/de/intlayer_with_vite+preact.md +157 -1
- package/docs/de/intlayer_with_vite+react.md +157 -1
- package/docs/de/intlayer_with_vite+solid.md +159 -3
- package/docs/de/intlayer_with_vite+svelte.md +157 -1
- package/docs/de/intlayer_with_vite+vue.md +157 -1
- package/docs/en/compiler.md +60 -33
- package/docs/en/configuration.md +80 -57
- package/docs/en/intlayer_with_nextjs_16.md +176 -0
- package/docs/en/intlayer_with_nextjs_compiler.md +179 -1
- package/docs/en/intlayer_with_react_router_v7.md +159 -0
- package/docs/en/intlayer_with_react_router_v7_fs_routes.md +159 -0
- package/docs/en/intlayer_with_svelte_kit.md +159 -0
- package/docs/en/intlayer_with_tanstack.md +160 -1
- package/docs/en/intlayer_with_vite+preact.md +159 -0
- package/docs/en/intlayer_with_vite+react.md +159 -0
- package/docs/en/intlayer_with_vite+solid.md +148 -27
- package/docs/en/intlayer_with_vite+svelte.md +159 -0
- package/docs/en/intlayer_with_vite+vue.md +142 -41
- package/docs/en-GB/compiler.md +66 -34
- package/docs/en-GB/configuration.md +78 -36
- package/docs/es/compiler.md +83 -48
- package/docs/es/configuration.md +429 -206
- package/docs/es/intlayer_with_adonisjs.md +1 -1
- package/docs/es/intlayer_with_express.md +1 -1
- package/docs/es/intlayer_with_fastify.md +1 -1
- package/docs/es/intlayer_with_hono.md +1 -1
- package/docs/es/intlayer_with_nestjs.md +1 -1
- package/docs/es/intlayer_with_nextjs_16.md +176 -3
- package/docs/es/intlayer_with_nextjs_compiler.md +175 -2
- package/docs/es/intlayer_with_nuxt.md +1 -1
- package/docs/es/intlayer_with_react_router_v7.md +227 -4
- package/docs/es/intlayer_with_react_router_v7_fs_routes.md +162 -4
- package/docs/es/intlayer_with_svelte_kit.md +158 -2
- package/docs/es/intlayer_with_tanstack.md +160 -2
- package/docs/es/intlayer_with_vite+preact.md +162 -6
- package/docs/es/intlayer_with_vite+react.md +160 -4
- package/docs/es/intlayer_with_vite+solid.md +163 -7
- package/docs/es/intlayer_with_vite+svelte.md +157 -1
- package/docs/es/intlayer_with_vite+vue.md +165 -9
- package/docs/fr/compiler.md +81 -46
- package/docs/fr/configuration.md +355 -134
- package/docs/fr/intlayer_with_adonisjs.md +1 -1
- package/docs/fr/intlayer_with_express.md +1 -1
- package/docs/fr/intlayer_with_fastify.md +1 -1
- package/docs/fr/intlayer_with_hono.md +1 -1
- package/docs/fr/intlayer_with_nestjs.md +1 -1
- package/docs/fr/intlayer_with_nextjs_16.md +183 -7
- package/docs/fr/intlayer_with_nextjs_compiler.md +179 -3
- package/docs/fr/intlayer_with_react_router_v7.md +229 -3
- package/docs/fr/intlayer_with_react_router_v7_fs_routes.md +237 -6
- package/docs/fr/intlayer_with_svelte_kit.md +158 -2
- package/docs/fr/intlayer_with_tanstack.md +159 -1
- package/docs/fr/intlayer_with_vite+preact.md +164 -8
- package/docs/fr/intlayer_with_vite+react.md +162 -6
- package/docs/fr/intlayer_with_vite+solid.md +163 -7
- package/docs/fr/intlayer_with_vite+svelte.md +157 -1
- package/docs/fr/intlayer_with_vite+vue.md +164 -8
- package/docs/hi/compiler.md +81 -46
- package/docs/hi/configuration.md +87 -44
- package/docs/hi/intlayer_with_nextjs_16.md +174 -1
- package/docs/hi/intlayer_with_nextjs_compiler.md +174 -1
- package/docs/hi/intlayer_with_react_router_v7.md +224 -1
- package/docs/hi/intlayer_with_react_router_v7_fs_routes.md +225 -1
- package/docs/hi/intlayer_with_svelte_kit.md +158 -2
- package/docs/hi/intlayer_with_tanstack.md +159 -1
- package/docs/hi/intlayer_with_vite+preact.md +157 -1
- package/docs/hi/intlayer_with_vite+react.md +157 -1
- package/docs/hi/intlayer_with_vite+solid.md +157 -1
- package/docs/hi/intlayer_with_vite+svelte.md +157 -1
- package/docs/hi/intlayer_with_vite+vue.md +157 -1
- package/docs/id/compiler.md +84 -51
- package/docs/id/configuration.md +83 -45
- package/docs/id/intlayer_with_nextjs_16.md +174 -1
- package/docs/id/intlayer_with_nextjs_compiler.md +174 -1
- package/docs/id/intlayer_with_react_router_v7.md +224 -1
- package/docs/id/intlayer_with_react_router_v7_fs_routes.md +225 -1
- package/docs/id/intlayer_with_svelte_kit.md +158 -2
- package/docs/id/intlayer_with_tanstack.md +159 -1
- package/docs/id/intlayer_with_vite+preact.md +157 -1
- package/docs/id/intlayer_with_vite+react.md +157 -1
- package/docs/id/intlayer_with_vite+solid.md +157 -1
- package/docs/id/intlayer_with_vite+svelte.md +157 -1
- package/docs/id/intlayer_with_vite+vue.md +157 -1
- package/docs/it/compiler.md +81 -46
- package/docs/it/configuration.md +426 -204
- package/docs/it/intlayer_with_nextjs_16.md +174 -1
- package/docs/it/intlayer_with_nextjs_compiler.md +174 -1
- package/docs/it/intlayer_with_react_router_v7.md +225 -2
- package/docs/it/intlayer_with_react_router_v7_fs_routes.md +226 -2
- package/docs/it/intlayer_with_svelte_kit.md +158 -2
- package/docs/it/intlayer_with_tanstack.md +159 -1
- package/docs/it/intlayer_with_vite+preact.md +157 -1
- package/docs/it/intlayer_with_vite+react.md +157 -1
- package/docs/it/intlayer_with_vite+solid.md +159 -3
- package/docs/it/intlayer_with_vite+svelte.md +157 -1
- package/docs/it/intlayer_with_vite+vue.md +157 -1
- package/docs/ja/compiler.md +94 -58
- package/docs/ja/configuration.md +88 -45
- package/docs/ja/intlayer_with_nextjs_16.md +174 -1
- package/docs/ja/intlayer_with_nextjs_compiler.md +174 -1
- package/docs/ja/intlayer_with_react_router_v7.md +184 -394
- package/docs/ja/intlayer_with_react_router_v7_fs_routes.md +226 -2
- package/docs/ja/intlayer_with_svelte_kit.md +119 -595
- package/docs/ja/intlayer_with_tanstack.md +131 -642
- package/docs/ja/intlayer_with_vite+preact.md +111 -1231
- package/docs/ja/intlayer_with_vite+react.md +129 -1304
- package/docs/ja/intlayer_with_vite+solid.md +159 -3
- package/docs/ja/intlayer_with_vite+svelte.md +157 -1
- package/docs/ja/intlayer_with_vite+vue.md +157 -1
- package/docs/ko/compiler.md +88 -52
- package/docs/ko/configuration.md +87 -44
- package/docs/ko/intlayer_with_nextjs_16.md +174 -1
- package/docs/ko/intlayer_with_nextjs_compiler.md +174 -1
- package/docs/ko/intlayer_with_react_router_v7.md +225 -2
- package/docs/ko/intlayer_with_react_router_v7_fs_routes.md +226 -2
- package/docs/ko/intlayer_with_svelte_kit.md +158 -2
- package/docs/ko/intlayer_with_tanstack.md +159 -1
- package/docs/ko/intlayer_with_vite+preact.md +157 -1
- package/docs/ko/intlayer_with_vite+react.md +157 -1
- package/docs/ko/intlayer_with_vite+solid.md +159 -3
- package/docs/ko/intlayer_with_vite+svelte.md +157 -1
- package/docs/ko/intlayer_with_vite+vue.md +157 -1
- package/docs/pl/compiler.md +84 -51
- package/docs/pl/configuration.md +83 -37
- package/docs/pl/intlayer_with_nextjs_16.md +174 -1
- package/docs/pl/intlayer_with_nextjs_compiler.md +174 -1
- package/docs/pl/intlayer_with_react_router_v7.md +224 -1
- package/docs/pl/intlayer_with_react_router_v7_fs_routes.md +225 -1
- package/docs/pl/intlayer_with_svelte_kit.md +158 -2
- package/docs/pl/intlayer_with_tanstack.md +159 -1
- package/docs/pl/intlayer_with_vite+preact.md +157 -1
- package/docs/pl/intlayer_with_vite+react.md +157 -1
- package/docs/pl/intlayer_with_vite+solid.md +157 -1
- package/docs/pl/intlayer_with_vite+svelte.md +157 -1
- package/docs/pl/intlayer_with_vite+vue.md +157 -1
- package/docs/pt/compiler.md +81 -46
- package/docs/pt/configuration.md +404 -194
- package/docs/pt/intlayer_with_nextjs_16.md +174 -1
- package/docs/pt/intlayer_with_nextjs_compiler.md +174 -1
- package/docs/pt/intlayer_with_react_router_v7.md +224 -1
- package/docs/pt/intlayer_with_react_router_v7_fs_routes.md +225 -1
- package/docs/pt/intlayer_with_svelte_kit.md +158 -2
- package/docs/pt/intlayer_with_tanstack.md +159 -1
- package/docs/pt/intlayer_with_vite+preact.md +157 -1
- package/docs/pt/intlayer_with_vite+react.md +157 -1
- package/docs/pt/intlayer_with_vite+solid.md +157 -1
- package/docs/pt/intlayer_with_vite+svelte.md +157 -1
- package/docs/pt/intlayer_with_vite+vue.md +157 -1
- package/docs/ru/compiler.md +90 -57
- package/docs/ru/configuration.md +76 -46
- package/docs/ru/intlayer_with_nextjs_16.md +174 -1
- package/docs/ru/intlayer_with_nextjs_compiler.md +174 -1
- package/docs/ru/intlayer_with_react_router_v7.md +224 -1
- package/docs/ru/intlayer_with_react_router_v7_fs_routes.md +225 -1
- package/docs/ru/intlayer_with_svelte_kit.md +158 -2
- package/docs/ru/intlayer_with_tanstack.md +159 -1
- package/docs/ru/intlayer_with_vite+preact.md +157 -1
- package/docs/ru/intlayer_with_vite+react.md +157 -1
- package/docs/ru/intlayer_with_vite+solid.md +157 -1
- package/docs/ru/intlayer_with_vite+svelte.md +157 -1
- package/docs/ru/intlayer_with_vite+vue.md +157 -1
- package/docs/tr/compiler.md +85 -52
- package/docs/tr/configuration.md +83 -40
- package/docs/tr/intlayer_with_nextjs_16.md +174 -1
- package/docs/tr/intlayer_with_nextjs_compiler.md +174 -1
- package/docs/tr/intlayer_with_react_router_v7.md +224 -1
- package/docs/tr/intlayer_with_react_router_v7_fs_routes.md +225 -1
- package/docs/tr/intlayer_with_svelte_kit.md +158 -2
- package/docs/tr/intlayer_with_tanstack.md +159 -1
- package/docs/tr/intlayer_with_vite+preact.md +157 -1
- package/docs/tr/intlayer_with_vite+react.md +157 -1
- package/docs/tr/intlayer_with_vite+solid.md +157 -1
- package/docs/tr/intlayer_with_vite+svelte.md +157 -1
- package/docs/tr/intlayer_with_vite+vue.md +157 -1
- package/docs/uk/compiler.md +96 -61
- package/docs/uk/configuration.md +83 -37
- package/docs/uk/intlayer_with_nextjs_16.md +174 -1
- package/docs/uk/intlayer_with_nextjs_compiler.md +174 -1
- package/docs/uk/intlayer_with_react_router_v7.md +224 -1
- package/docs/uk/intlayer_with_react_router_v7_fs_routes.md +225 -1
- package/docs/uk/intlayer_with_svelte_kit.md +157 -1
- package/docs/uk/intlayer_with_tanstack.md +159 -1
- package/docs/uk/intlayer_with_vite+preact.md +157 -1
- package/docs/uk/intlayer_with_vite+react.md +157 -1
- package/docs/uk/intlayer_with_vite+solid.md +157 -1
- package/docs/uk/intlayer_with_vite+svelte.md +157 -1
- package/docs/uk/intlayer_with_vite+vue.md +157 -1
- package/docs/vi/compiler.md +85 -50
- package/docs/vi/configuration.md +85 -39
- package/docs/vi/intlayer_with_nextjs_16.md +174 -1
- package/docs/vi/intlayer_with_nextjs_compiler.md +174 -1
- package/docs/vi/intlayer_with_react_router_v7.md +224 -1
- package/docs/vi/intlayer_with_react_router_v7_fs_routes.md +225 -1
- package/docs/vi/intlayer_with_svelte_kit.md +158 -2
- package/docs/vi/intlayer_with_tanstack.md +159 -1
- package/docs/vi/intlayer_with_vite+preact.md +157 -1
- package/docs/vi/intlayer_with_vite+react.md +157 -1
- package/docs/vi/intlayer_with_vite+solid.md +157 -1
- package/docs/vi/intlayer_with_vite+svelte.md +157 -1
- package/docs/vi/intlayer_with_vite+vue.md +157 -1
- package/docs/zh/compiler.md +84 -49
- package/docs/zh/configuration.md +80 -37
- package/docs/zh/intlayer_with_adonisjs.md +1 -1
- package/docs/zh/intlayer_with_express.md +1 -1
- package/docs/zh/intlayer_with_fastify.md +1 -1
- package/docs/zh/intlayer_with_hono.md +1 -1
- package/docs/zh/intlayer_with_nestjs.md +1 -1
- package/docs/zh/intlayer_with_nextjs_16.md +174 -1
- package/docs/zh/intlayer_with_nextjs_compiler.md +174 -1
- package/docs/zh/intlayer_with_react_router_v7.md +227 -4
- package/docs/zh/intlayer_with_react_router_v7_fs_routes.md +228 -4
- package/docs/zh/intlayer_with_svelte_kit.md +158 -2
- package/docs/zh/intlayer_with_tanstack.md +159 -1
- package/docs/zh/intlayer_with_vite+preact.md +159 -3
- package/docs/zh/intlayer_with_vite+react.md +157 -1
- package/docs/zh/intlayer_with_vite+solid.md +161 -5
- package/docs/zh/intlayer_with_vite+svelte.md +157 -1
- package/docs/zh/intlayer_with_vite+vue.md +158 -2
- package/package.json +6 -6
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2025-09-09
|
|
3
|
-
updatedAt:
|
|
3
|
+
updatedAt: 2026-03-12
|
|
4
4
|
title: Tanstack Start i18n - Tanstack Startアプリの翻訳方法 2026
|
|
5
5
|
description: Intlayerを使用してTanStack Startアプリケーションに国際化(i18n)を追加する方法を学びます。ロケール対応のルーティングでアプリを多言語化するための包括的なガイドに従ってください。
|
|
6
6
|
keywords:
|
|
@@ -87,703 +87,192 @@ Intlayerを使用すると、以下のことが可能になります:
|
|
|
87
87
|
|
|
88
88
|
GitHubの[アプリケーションテンプレート](https://github.com/aymericzip/intlayer-tanstack-start-template)を参照してください。
|
|
89
89
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
まず、TanStack Startウェブサイトの[新規プロジェクトの開始](https://tanstack.com/start/latest/docs/framework/react/quick-start)ガイドに従って、新しいTanStack Startプロジェクトを作成します。
|
|
93
|
-
|
|
94
|
-
### ステップ2:Intlayerパッケージのインストール
|
|
95
|
-
|
|
96
|
-
好みのパッケージマネージャーを使用して、必要なパッケージをインストールします:
|
|
90
|
+
---
|
|
97
91
|
|
|
98
|
-
|
|
99
|
-
npm install intlayer react-intlayer
|
|
100
|
-
npm install vite-intlayer --save-dev
|
|
101
|
-
npx intlayer init
|
|
102
|
-
```
|
|
92
|
+
### Git構成
|
|
103
93
|
|
|
104
|
-
|
|
105
|
-
pnpm add intlayer react-intlayer
|
|
106
|
-
pnpm add vite-intlayer --save-dev
|
|
107
|
-
pnpm intlayer init
|
|
108
|
-
```
|
|
94
|
+
Intlayerによって生成されたファイルは無視することをお勧めします。これにより、Gitリポジトリにそれらをコミットすることを避けることができます。
|
|
109
95
|
|
|
110
|
-
|
|
111
|
-
yarn add intlayer react-intlayer
|
|
112
|
-
yarn add vite-intlayer --save-dev
|
|
113
|
-
yarn intlayer init
|
|
114
|
-
```
|
|
96
|
+
これを行うには、`.gitignore`ファイルに以下の指示を追加できます:
|
|
115
97
|
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
bunx intlayer init
|
|
98
|
+
```plaintext fileName=".gitignore"
|
|
99
|
+
# Intlayerによって生成されたファイルを無視する
|
|
100
|
+
.intlayer
|
|
120
101
|
```
|
|
121
102
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
構成管理、翻訳、[コンテンツ宣言](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/dictionary/content_file.md)、トランスパイル、および[CLIコマンド](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/cli/index.md)のための国際化ツールを提供するコアパッケージ。
|
|
103
|
+
### (オプション) ステップ 1 : コンポーネントのコンテンツを抽出する
|
|
125
104
|
|
|
126
|
-
|
|
127
|
-
IntlayerをReactアプリケーションと統合するパッケージ。Reactの国際化のためのコンテキストプロバイダーとフックを提供します。
|
|
105
|
+
既存のコードベースがある場合、数千のファイルを変換するのは時間がかかることがあります。
|
|
128
106
|
|
|
129
|
-
|
|
130
|
-
Intlayerを[Viteバンドラー](https://vite.dev/guide/why.html#why-bundle-for-production)と統合するためのViteプラグイン、およびユーザーの優先ロケールの検出、クッキーの管理、URLリダイレクトの処理のためのミドルウェアが含まれています。
|
|
107
|
+
このプロセスを容易にするために、Intlayerは、コンポーネントを変換しコンテンツを抽出するための [コンパイラ](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/compiler.md) / [エクストラクタ](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/cli/extract.md) を提案しています。
|
|
131
108
|
|
|
132
|
-
|
|
109
|
+
セットアップするには、`intlayer.config.ts` ファイルに `compiler` セクションを追加します。
|
|
133
110
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
```typescript fileName="intlayer.config.ts"
|
|
137
|
-
import type { IntlayerConfig } from "intlayer";
|
|
138
|
-
|
|
139
|
-
import { Locales } from "intlayer";
|
|
111
|
+
```typescript fileName="intlayer.config.ts" codeFormat="typescript"
|
|
112
|
+
import { type IntlayerConfig } from "intlayer";
|
|
140
113
|
|
|
141
114
|
const config: IntlayerConfig = {
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
115
|
+
// ... 他の構成
|
|
116
|
+
compiler: {
|
|
117
|
+
/**
|
|
118
|
+
* コンパイラを有効にするかどうかを指定します。
|
|
119
|
+
*/
|
|
120
|
+
enabled: true,
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* 出力ファイルのパスを定義します。
|
|
124
|
+
*/
|
|
125
|
+
output: ({ fileName, extension }) => `./${fileName}${extension}`,
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* 変換後にコンポーネントを保存するかどうかを指定します。これにより、コンパイラを一度だけ実行してアプリを変換し、その後削除することができます。
|
|
129
|
+
*/
|
|
130
|
+
saveComponents: false,
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* 辞書キーの接頭辞
|
|
134
|
+
*/
|
|
135
|
+
dictionaryKeyPrefix: "",
|
|
145
136
|
},
|
|
146
137
|
};
|
|
147
138
|
|
|
148
139
|
export default config;
|
|
149
140
|
```
|
|
150
141
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
}),
|
|
178
|
-
viteReact(),
|
|
179
|
-
],
|
|
180
|
-
});
|
|
142
|
+
```javascript fileName="intlayer.config.mjs" codeFormat="esm"
|
|
143
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
144
|
+
const config = {
|
|
145
|
+
// ... 他の構成
|
|
146
|
+
compiler: {
|
|
147
|
+
/**
|
|
148
|
+
* コンパイラを有効にするかどうかを指定します。
|
|
149
|
+
*/
|
|
150
|
+
enabled: true,
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* 出力ファイルのパスを定義します。
|
|
154
|
+
*/
|
|
155
|
+
output: ({ fileName, extension }) => `./${fileName}${extension}`,
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* 変換後にコンポーネントを保存するかどうかを指定します。これにより、コンパイラを一度だけ実行してアプリを変換し、その後削除することができます。
|
|
159
|
+
*/
|
|
160
|
+
saveComponents: false,
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* 辞書キーの接頭辞
|
|
164
|
+
*/
|
|
165
|
+
dictionaryKeyPrefix: "",
|
|
166
|
+
},
|
|
167
|
+
};
|
|
181
168
|
|
|
182
169
|
export default config;
|
|
183
170
|
```
|
|
184
171
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
// アクティブなマッチのパラメーターでロケールを見つけようとする
|
|
211
|
-
// これはルートツリーで動的セグメント「/{-$locale}」を使用していることを前提としています
|
|
212
|
-
const localeRoute = matches.find((match) => match.routeId === "/{-$locale}");
|
|
213
|
-
const locale = localeRoute?.params?.locale ?? defaultLocale;
|
|
214
|
-
|
|
215
|
-
return (
|
|
216
|
-
<html dir={getHTMLTextDir(locale)} lang={locale}>
|
|
217
|
-
<head>
|
|
218
|
-
<HeadContent />
|
|
219
|
-
</head>
|
|
220
|
-
<body>
|
|
221
|
-
<IntlayerProvider locale={locale}>{children}</IntlayerProvider>
|
|
222
|
-
<Scripts />
|
|
223
|
-
</body>
|
|
224
|
-
</html>
|
|
225
|
-
);
|
|
226
|
-
}
|
|
227
|
-
```
|
|
228
|
-
|
|
229
|
-
### ステップ6:ロケールレイアウトの作成
|
|
230
|
-
|
|
231
|
-
ロケールプレフィックスを処理し、検証を実行するレイアウトを作成します。
|
|
232
|
-
|
|
233
|
-
```tsx fileName="src/routes/{-$locale}/route.tsx"
|
|
234
|
-
import { createFileRoute, Outlet, redirect } from "@tanstack/react-router";
|
|
235
|
-
import { validatePrefix } from "intlayer";
|
|
236
|
-
|
|
237
|
-
export const Route = createFileRoute("/{-$locale}")({
|
|
238
|
-
beforeLoad: ({ params }) => {
|
|
239
|
-
const localeParam = params.locale;
|
|
240
|
-
|
|
241
|
-
// ロケールプレフィックスを検証する
|
|
242
|
-
const { isValid, localePrefix } = validatePrefix(localeParam);
|
|
243
|
-
|
|
244
|
-
if (!isValid) {
|
|
245
|
-
throw redirect({
|
|
246
|
-
to: "/{-$locale}/404",
|
|
247
|
-
params: { locale: localePrefix },
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
},
|
|
251
|
-
component: Outlet,
|
|
252
|
-
});
|
|
253
|
-
```
|
|
254
|
-
|
|
255
|
-
> ここで、`{-$locale}`は現在のロケールに置き換えられる動的ルートパラメーターです。この表記によりスロットがオプションになり、`'prefix-no-default'`などのルーティングモードで動作できるようになります。
|
|
256
|
-
|
|
257
|
-
> 同じルートで複数の動的セグメントを使用する場合(例:`/{-$locale}/other-path/$anotherDynamicPath/...`)、このスロットが問題を引き起こす可能性があることに注意してください。
|
|
258
|
-
> `'prefix-all'`モードの場合は、代わりにスロットを`$locale`に切り替えることを検討してください。
|
|
259
|
-
> `'no-prefix'`または`'search-params'`モードの場合は、スロットを完全に削除できます。
|
|
260
|
-
|
|
261
|
-
### ステップ7:コンテンツの宣言
|
|
262
|
-
|
|
263
|
-
翻訳を保存するためのコンテンツ宣言を作成および管理します:
|
|
264
|
-
|
|
265
|
-
```tsx fileName="src/contents/page.content.ts"
|
|
266
|
-
import type { Dictionary } from "intlayer";
|
|
267
|
-
|
|
268
|
-
import { t } from "intlayer";
|
|
269
|
-
|
|
270
|
-
const appContent = {
|
|
271
|
-
content: {
|
|
272
|
-
links: {
|
|
273
|
-
about: t({
|
|
274
|
-
en: "About",
|
|
275
|
-
es: "Acerca de",
|
|
276
|
-
fr: "À propos",
|
|
277
|
-
}),
|
|
278
|
-
home: t({
|
|
279
|
-
en: "Home",
|
|
280
|
-
es: "Inicio",
|
|
281
|
-
fr: "Accueil",
|
|
282
|
-
}),
|
|
283
|
-
},
|
|
284
|
-
meta: {
|
|
285
|
-
title: t({
|
|
286
|
-
en: "Welcome to Intlayer + TanStack Router",
|
|
287
|
-
es: "Bienvenido a Intlayer + TanStack Router",
|
|
288
|
-
fr: "Bienvenue à Intlayer + TanStack Router",
|
|
289
|
-
}),
|
|
290
|
-
description: t({
|
|
291
|
-
en: "This is an example of using Intlayer with TanStack Router",
|
|
292
|
-
es: "Este es un ejemplo de uso de Intlayer con TanStack Router",
|
|
293
|
-
fr: "Ceci est un exemple d'utilisation d'Intlayer avec TanStack Router",
|
|
294
|
-
}),
|
|
295
|
-
},
|
|
172
|
+
```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
|
|
173
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
174
|
+
const config = {
|
|
175
|
+
// ... 他の構成
|
|
176
|
+
compiler: {
|
|
177
|
+
/**
|
|
178
|
+
* コンパイラを有効にするかどうかを指定します。
|
|
179
|
+
*/
|
|
180
|
+
enabled: true,
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* 出力ファイルのパスを定義します。
|
|
184
|
+
*/
|
|
185
|
+
output: ({ fileName, extension }) => `./${fileName}${extension}`,
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* 変換後にコンポーネントを保存するかどうかを指定します。これにより、コンパイラを一度だけ実行してアプリを変換し、その後削除することができます。
|
|
189
|
+
*/
|
|
190
|
+
saveComponents: false,
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* 辞書キーの接頭辞
|
|
194
|
+
*/
|
|
195
|
+
dictionaryKeyPrefix: "",
|
|
296
196
|
},
|
|
297
|
-
|
|
298
|
-
} satisfies Dictionary;
|
|
197
|
+
};
|
|
299
198
|
|
|
300
|
-
|
|
199
|
+
module.exports = config;
|
|
301
200
|
```
|
|
302
201
|
|
|
303
|
-
>
|
|
304
|
-
|
|
305
|
-
> 詳細については、[コンテンツ宣言のドキュメント](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/dictionary/content_file.md)を参照してください。
|
|
306
|
-
|
|
307
|
-
### ステップ8:ロケール対応コンポーネントとフックの作成
|
|
308
|
-
|
|
309
|
-
ロケール対応ナビゲーション用の`LocalizedLink`コンポーネントを作成します:
|
|
310
|
-
|
|
311
|
-
```tsx fileName="src/components/localized-link.tsx"
|
|
312
|
-
import type { FC } from "react";
|
|
313
|
-
|
|
314
|
-
import { Link, type LinkComponentProps } from "@tanstack/react-router";
|
|
315
|
-
import { useLocale } from "react-intlayer";
|
|
316
|
-
import { getPrefix } from "intlayer";
|
|
317
|
-
|
|
318
|
-
export const LOCALE_ROUTE = "{-$locale}" as const;
|
|
202
|
+
<Tabs>
|
|
203
|
+
<Tab value='抽出コマンド'>
|
|
319
204
|
|
|
320
|
-
|
|
321
|
-
export type RemoveLocaleParam<T> = T extends string
|
|
322
|
-
? RemoveLocaleFromString<T>
|
|
323
|
-
: T;
|
|
205
|
+
コンポーネントを変換してコンテンツを抽出するためにエクストラクタを実行します
|
|
324
206
|
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
type CollapseDoubleSlashes<S extends string> =
|
|
328
|
-
S extends `${infer H}//${infer T}` ? CollapseDoubleSlashes<`${H}/${T}`> : S;
|
|
329
|
-
|
|
330
|
-
type LocalizedLinkProps = {
|
|
331
|
-
to?: To;
|
|
332
|
-
} & Omit<LinkComponentProps, "to">;
|
|
333
|
-
|
|
334
|
-
// ヘルパー
|
|
335
|
-
type RemoveAll<
|
|
336
|
-
S extends string,
|
|
337
|
-
Sub extends string,
|
|
338
|
-
> = S extends `${infer H}${Sub}${infer T}` ? RemoveAll<`${H}${T}`, Sub> : S;
|
|
339
|
-
|
|
340
|
-
type RemoveLocaleFromString<S extends string> = CollapseDoubleSlashes<
|
|
341
|
-
RemoveAll<S, typeof LOCALE_ROUTE>
|
|
342
|
-
>;
|
|
343
|
-
|
|
344
|
-
export const LocalizedLink: FC<LocalizedLinkProps> = (props) => {
|
|
345
|
-
const { locale } = useLocale();
|
|
346
|
-
const { localePrefix } = getPrefix(locale);
|
|
347
|
-
|
|
348
|
-
return (
|
|
349
|
-
<Link
|
|
350
|
-
{...props}
|
|
351
|
-
params={{
|
|
352
|
-
locale: localePrefix,
|
|
353
|
-
...(typeof props?.params === "object" ? props?.params : {}),
|
|
354
|
-
}}
|
|
355
|
-
to={`/${LOCALE_ROUTE}${props.to}` as LinkComponentProps["to"]}
|
|
356
|
-
/>
|
|
357
|
-
);
|
|
358
|
-
};
|
|
207
|
+
```bash packageManager="npm"
|
|
208
|
+
npx intlayer extract
|
|
359
209
|
```
|
|
360
210
|
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
- URLから不要な`{-$locale}`プレフィックスを削除すること。
|
|
364
|
-
- ユーザーがローカライズされたルートに直接リダイレクトされるように、ロケールパラメーターをURLに注入すること。
|
|
365
|
-
|
|
366
|
-
次に、プログラムによるナビゲーションのための`useLocalizedNavigate`フックを作成できます:
|
|
367
|
-
|
|
368
|
-
```tsx fileName="src/hooks/useLocalizedNavigate.tsx"
|
|
369
|
-
import { useNavigate } from "@tanstack/react-router";
|
|
370
|
-
import { getPrefix } from "intlayer";
|
|
371
|
-
import { useLocale } from "react-intlayer";
|
|
372
|
-
import { LOCALE_ROUTE } from "@/components/localized-link";
|
|
373
|
-
import type { FileRouteTypes } from "@/routeTree.gen";
|
|
374
|
-
|
|
375
|
-
type StripLocalePrefix<T extends string> = T extends
|
|
376
|
-
| `/${typeof LOCALE_ROUTE}`
|
|
377
|
-
| `/${typeof LOCALE_ROUTE}/`
|
|
378
|
-
? "/"
|
|
379
|
-
: T extends `/${typeof LOCALE_ROUTE}/${infer Rest}`
|
|
380
|
-
? `/${Rest}`
|
|
381
|
-
: never;
|
|
382
|
-
|
|
383
|
-
type LocalizedTo = StripLocalePrefix<FileRouteTypes["to"]>;
|
|
384
|
-
|
|
385
|
-
type LocalizedNavigate = {
|
|
386
|
-
(to: LocalizedTo): ReturnType<ReturnType<typeof useNavigate>>;
|
|
387
|
-
(
|
|
388
|
-
opts: { to: LocalizedTo } & Record<string, unknown>
|
|
389
|
-
): ReturnType<ReturnType<typeof useNavigate>>;
|
|
390
|
-
};
|
|
391
|
-
|
|
392
|
-
export const useLocalizedNavigate = () => {
|
|
393
|
-
const navigate = useNavigate();
|
|
394
|
-
|
|
395
|
-
const { locale } = useLocale();
|
|
396
|
-
|
|
397
|
-
const localizedNavigate: LocalizedNavigate = (args: any) => {
|
|
398
|
-
const { localePrefix } = getPrefix(locale);
|
|
399
|
-
|
|
400
|
-
if (typeof args === "string") {
|
|
401
|
-
return navigate({
|
|
402
|
-
to: `/${LOCALE_ROUTE}${args}`,
|
|
403
|
-
params: { locale: localePrefix },
|
|
404
|
-
});
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
const { to, ...rest } = args;
|
|
408
|
-
|
|
409
|
-
const localizedTo = `/${LOCALE_ROUTE}${to}` as any;
|
|
410
|
-
|
|
411
|
-
return navigate({
|
|
412
|
-
to: localizedTo,
|
|
413
|
-
params: { locale: localePrefix, ...rest } as any,
|
|
414
|
-
});
|
|
415
|
-
};
|
|
416
|
-
|
|
417
|
-
return localizedNavigate;
|
|
418
|
-
};
|
|
211
|
+
```bash packageManager="pnpm"
|
|
212
|
+
pnpm intlayer extract
|
|
419
213
|
```
|
|
420
214
|
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
アプリケーション全体でコンテンツ辞書にアクセスします:
|
|
424
|
-
|
|
425
|
-
#### ローカライズされたホームページ
|
|
426
|
-
|
|
427
|
-
```tsx fileName="src/routes/{-$locale}/index.tsx"
|
|
428
|
-
import { createFileRoute } from "@tanstack/react-router";
|
|
429
|
-
import { getIntlayer } from "intlayer";
|
|
430
|
-
import { useIntlayer } from "react-intlayer";
|
|
431
|
-
|
|
432
|
-
import LocaleSwitcher from "@/components/locale-switcher";
|
|
433
|
-
import { LocalizedLink } from "@/components/localized-link";
|
|
434
|
-
import { useLocalizedNavigate } from "@/hooks/useLocalizedNavigate";
|
|
435
|
-
|
|
436
|
-
export const Route = createFileRoute("/{-$locale}/")({
|
|
437
|
-
component: RouteComponent,
|
|
438
|
-
head: ({ params }) => {
|
|
439
|
-
const { locale } = params;
|
|
440
|
-
const path = "/"; // The path for this route
|
|
441
|
-
|
|
442
|
-
const metaContent = getIntlayer("app", locale);
|
|
443
|
-
|
|
444
|
-
return {
|
|
445
|
-
links: [
|
|
446
|
-
// Canonical link: Points to the current localized page
|
|
447
|
-
{ rel: "canonical", href: getLocalizedUrl(path, locale) },
|
|
448
|
-
|
|
449
|
-
// Hreflang: Tell Google about all localized versions
|
|
450
|
-
...localeMap(({ locale: mapLocale }) => ({
|
|
451
|
-
rel: "alternate",
|
|
452
|
-
hrefLang: mapLocale,
|
|
453
|
-
href: getLocalizedUrl(path, mapLocale),
|
|
454
|
-
})),
|
|
455
|
-
|
|
456
|
-
// x-default: For users in unmatched languages
|
|
457
|
-
// Define the default fallback locale (usually your primary language)
|
|
458
|
-
{
|
|
459
|
-
rel: "alternate",
|
|
460
|
-
hrefLang: "x-default",
|
|
461
|
-
href: getLocalizedUrl(path, defaultLocale),
|
|
462
|
-
},
|
|
463
|
-
],
|
|
464
|
-
meta: [
|
|
465
|
-
{ title: metaContent.title },
|
|
466
|
-
{ name: "description", content: metaContent.meta.description },
|
|
467
|
-
],
|
|
468
|
-
};
|
|
469
|
-
},
|
|
470
|
-
});
|
|
471
|
-
|
|
472
|
-
function RouteComponent() {
|
|
473
|
-
const content = useIntlayer("app");
|
|
474
|
-
const navigate = useLocalizedNavigate();
|
|
475
|
-
|
|
476
|
-
return (
|
|
477
|
-
<div>
|
|
478
|
-
<div>
|
|
479
|
-
{content.title}
|
|
480
|
-
<LocaleSwitcher />
|
|
481
|
-
<div>
|
|
482
|
-
<LocalizedLink to="/">{content.links.home}</LocalizedLink>
|
|
483
|
-
<LocalizedLink to="/about">{content.links.about}</LocalizedLink>
|
|
484
|
-
</div>
|
|
485
|
-
<div>
|
|
486
|
-
<button onClick={() => navigate({ to: "/" })}>
|
|
487
|
-
{content.links.home}
|
|
488
|
-
</button>
|
|
489
|
-
<button onClick={() => navigate({ to: "/about" })}>
|
|
490
|
-
{content.links.about}
|
|
491
|
-
</button>
|
|
492
|
-
</div>
|
|
493
|
-
</div>
|
|
494
|
-
</div>
|
|
495
|
-
);
|
|
496
|
-
}
|
|
215
|
+
```bash packageManager="yarn"
|
|
216
|
+
yarn intlayer extract
|
|
497
217
|
```
|
|
498
218
|
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
### ステップ10:ロケールスイッチャーコンポーネントの作成
|
|
502
|
-
|
|
503
|
-
ユーザーが言語を変更できるようにするコンポーネントを作成します:
|
|
504
|
-
|
|
505
|
-
```tsx fileName="src/components/locale-switcher.tsx"
|
|
506
|
-
import { useLocation } from "@tanstack/react-router";
|
|
507
|
-
import {
|
|
508
|
-
getHTMLTextDir,
|
|
509
|
-
getLocaleName,
|
|
510
|
-
getPathWithoutLocale,
|
|
511
|
-
getPrefix,
|
|
512
|
-
Locales,
|
|
513
|
-
} from "intlayer";
|
|
514
|
-
import type { FC } from "react";
|
|
515
|
-
import { useLocale } from "react-intlayer";
|
|
516
|
-
|
|
517
|
-
import { LocalizedLink, type To } from "./localized-link";
|
|
518
|
-
|
|
519
|
-
export const LocaleSwitcher: FC = () => {
|
|
520
|
-
const { pathname } = useLocation();
|
|
521
|
-
|
|
522
|
-
const { availableLocales, locale, setLocale } = useLocale();
|
|
523
|
-
|
|
524
|
-
const pathWithoutLocale = getPathWithoutLocale(pathname);
|
|
525
|
-
|
|
526
|
-
return (
|
|
527
|
-
<ol>
|
|
528
|
-
{availableLocales.map((localeEl) => (
|
|
529
|
-
<li key={localeEl}>
|
|
530
|
-
<LocalizedLink
|
|
531
|
-
aria-current={localeEl === locale ? "page" : undefined}
|
|
532
|
-
onClick={() => setLocale(localeEl)}
|
|
533
|
-
params={{ locale: getPrefix(localeEl).localePrefix }}
|
|
534
|
-
to={pathWithoutLocale as To}
|
|
535
|
-
>
|
|
536
|
-
<span>
|
|
537
|
-
{/* ロケール - 例: FR */}
|
|
538
|
-
{localeEl}
|
|
539
|
-
</span>
|
|
540
|
-
<span>
|
|
541
|
-
{/* それ自体のロケールでの言語 - 例: Français */}
|
|
542
|
-
{getLocaleName(localeEl, locale)}
|
|
543
|
-
</span>
|
|
544
|
-
<span dir={getHTMLTextDir(localeEl)} lang={localeEl}>
|
|
545
|
-
{/* 現在のロケールでの言語 - 例: 現在のロケールが Locales.SPANISH の場合は Francés */}
|
|
546
|
-
{getLocaleName(localeEl)}
|
|
547
|
-
</span>
|
|
548
|
-
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
549
|
-
{/* 英語での言語 - 例: French */}
|
|
550
|
-
{getLocaleName(localeEl, Locales.ENGLISH)}
|
|
551
|
-
</span>
|
|
552
|
-
</LocalizedLink>
|
|
553
|
-
</li>
|
|
554
|
-
))}
|
|
555
|
-
</ol>
|
|
556
|
-
);
|
|
557
|
-
};
|
|
219
|
+
```bash packageManager="bun"
|
|
220
|
+
bunx intlayer extract
|
|
558
221
|
```
|
|
559
222
|
|
|
560
|
-
>
|
|
561
|
-
|
|
562
|
-
### ステップ11:HTML属性の管理
|
|
563
|
-
|
|
564
|
-
ステップ5で見たように、ルートコンポーネントで`useMatches`を使用して`html`タグの`lang`および`dir`属性を管理できます。これにより、サーバーとクライアントの両方で正しい属性が設定されます。
|
|
565
|
-
|
|
566
|
-
```tsx fileName="src/routes/__root.tsx"
|
|
567
|
-
function RootDocument({ children }: { children: ReactNode }) {
|
|
568
|
-
const matches = useMatches();
|
|
223
|
+
</Tab>
|
|
224
|
+
<Tab value='Babelコンパイラ'>
|
|
569
225
|
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
const locale = localeRoute?.params?.locale ?? defaultLocale;
|
|
573
|
-
|
|
574
|
-
return (
|
|
575
|
-
<html dir={getHTMLTextDir(locale)} lang={locale}>
|
|
576
|
-
{/* ... */}
|
|
577
|
-
</html>
|
|
578
|
-
);
|
|
579
|
-
}
|
|
226
|
+
```bash packageManager="npm"
|
|
227
|
+
npm install @intlayer/babel --save-dev
|
|
580
228
|
```
|
|
581
229
|
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
### ステップ12:ミドルウェアの追加(任意)
|
|
585
|
-
|
|
586
|
-
`intlayerProxy`を使用して、アプリケーションにサーバーサイドルーティングを追加することもできます。このプラグインは、URLに基づいて現在のロケールを自動的に検出し、適切なロケールクッキーを設定します。ロケールが指定されていない場合、プラグインはユーザーのブラウザの言語設定に基づいて最も適切なロケールを決定します。ロケールが検出されない場合は、デフォルトのロケールにリダイレクトされます。
|
|
587
|
-
|
|
588
|
-
> `intlayerProxy`を本番環境で使用するには、`vite-intlayer`パッケージを`devDependencies`から`dependencies`に切り替える必要があることに注意してください。
|
|
589
|
-
|
|
590
|
-
```typescript {7,14-17} fileName="vite.config.ts"
|
|
591
|
-
import { tanstackStart } from "@tanstack/react-start/plugin/vite";
|
|
592
|
-
import viteReact from "@vitejs/plugin-react";
|
|
593
|
-
import { nitro } from "nitro/vite";
|
|
594
|
-
import { defineConfig } from "vite";
|
|
595
|
-
import { intlayer, intlayerProxy } from "vite-intlayer";
|
|
596
|
-
import viteTsConfigPaths from "vite-tsconfig-paths";
|
|
597
|
-
|
|
598
|
-
export default defineConfig({
|
|
599
|
-
plugins: [
|
|
600
|
-
intlayerProxy(), // Nitroを使用する場合、プロキシはサーバーの前に配置する必要があります
|
|
601
|
-
nitro(),
|
|
602
|
-
viteTsConfigPaths({
|
|
603
|
-
projects: ["./tsconfig.json"],
|
|
604
|
-
}),
|
|
605
|
-
intlayer(),
|
|
606
|
-
tanstackStart({
|
|
607
|
-
router: {
|
|
608
|
-
routeFileIgnorePattern:
|
|
609
|
-
".content.(ts|tsx|js|mjs|cjs|jsx|json|jsonc|json5)$",
|
|
610
|
-
},
|
|
611
|
-
}),
|
|
612
|
-
viteReact(),
|
|
613
|
-
],
|
|
614
|
-
});
|
|
230
|
+
```bash packageManager="pnpm"
|
|
231
|
+
pnpm add @intlayer/babel --save-dev
|
|
615
232
|
```
|
|
616
233
|
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
### ステップ13:メタデータの国際化(任意)
|
|
620
|
-
|
|
621
|
-
`getIntlayer`フックを使用して、アプリケーション全体でコンテンツ辞書にアクセスすることもできます:
|
|
622
|
-
|
|
623
|
-
```tsx fileName="src/routes/{-$locale}/index.tsx"
|
|
624
|
-
import { createFileRoute } from "@tanstack/react-router";
|
|
625
|
-
import { getIntlayer } from "intlayer";
|
|
626
|
-
|
|
627
|
-
export const Route = createFileRoute("/{-$locale}/")({
|
|
628
|
-
component: RouteComponent,
|
|
629
|
-
head: ({ params }) => {
|
|
630
|
-
const { locale } = params;
|
|
631
|
-
const metaContent = getIntlayer("page-metadata", locale);
|
|
632
|
-
|
|
633
|
-
return {
|
|
634
|
-
meta: [
|
|
635
|
-
{ title: metaContent.title },
|
|
636
|
-
{ content: metaContent.description, name: "description" },
|
|
637
|
-
],
|
|
638
|
-
};
|
|
639
|
-
},
|
|
640
|
-
});
|
|
234
|
+
```bash packageManager="yarn"
|
|
235
|
+
yarn add @intlayer/babel --save-dev
|
|
641
236
|
```
|
|
642
237
|
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
### ステップ14:サーバーアクション内でのロケールの取得(任意)
|
|
646
|
-
|
|
647
|
-
サーバーアクションやAPIエンドポイント内から現在のロケールにアクセスしたい場合があります。
|
|
648
|
-
これは、`intlayer`の`getLocale`ヘルパーを使用して行うことができます。
|
|
649
|
-
|
|
650
|
-
以下は、TanStack Startのサーバー関数を使用した例です:
|
|
651
|
-
|
|
652
|
-
```tsx fileName="src/routes/{-$locale}/index.tsx"
|
|
653
|
-
import { createServerFn } from "@tanstack/react-start";
|
|
654
|
-
import {
|
|
655
|
-
getRequestHeader,
|
|
656
|
-
getRequestHeaders,
|
|
657
|
-
} from "@tanstack/react-start/server";
|
|
658
|
-
import { getCookie, getIntlayer, getLocale } from "intlayer";
|
|
659
|
-
|
|
660
|
-
export const getLocaleServer = createServerFn().handler(async () => {
|
|
661
|
-
const locale = await getLocale({
|
|
662
|
-
// リクエストからクッキーを取得(デフォルト:'INTLAYER_LOCALE')
|
|
663
|
-
getCookie: (name) => {
|
|
664
|
-
const cookieString = getRequestHeader("cookie");
|
|
665
|
-
|
|
666
|
-
return getCookie(name, cookieString);
|
|
667
|
-
},
|
|
668
|
-
// リクエストからヘッダーを取得(デフォルト:'x-intlayer-locale')
|
|
669
|
-
// Accept-Languageネゴシエーションを使用したフォールバック
|
|
670
|
-
getHeader: (name) => getRequestHeader(name),
|
|
671
|
-
});
|
|
672
|
-
|
|
673
|
-
// getIntlayer()を使用してコンテンツを取得
|
|
674
|
-
const content = getIntlayer("app", locale);
|
|
675
|
-
|
|
676
|
-
return { locale, content };
|
|
677
|
-
});
|
|
238
|
+
```bash packageManager="bun"
|
|
239
|
+
bun add @intlayer/babel --dev
|
|
678
240
|
```
|
|
679
241
|
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
242
|
+
```js fileName="babel.config.js"
|
|
243
|
+
const {
|
|
244
|
+
intlayerExtractBabelPlugin,
|
|
245
|
+
getExtractPluginOptions,
|
|
246
|
+
} = require("@intlayer/babel");
|
|
683
247
|
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
2. **ルートレベルの検証**:ロケールプレフィックスを検証し、無効なものを404にリダイレクト
|
|
692
|
-
3. **キャッチオールルート**:ロケールセグメント内の不一致なパスをすべてキャプチャ
|
|
693
|
-
|
|
694
|
-
```tsx fileName="src/routes/{-$locale}/404.tsx"
|
|
695
|
-
import { createFileRoute } from "@tanstack/react-router";
|
|
696
|
-
|
|
697
|
-
// これは専用の /[locale]/404 ルートを作成します
|
|
698
|
-
// これは直接のルートとして使用されるほか、他のファイルでコンポーネントとしてインポートされます
|
|
699
|
-
export const Route = createFileRoute("/{-$locale}/404")({
|
|
700
|
-
component: NotFoundComponent,
|
|
701
|
-
});
|
|
702
|
-
|
|
703
|
-
// notFoundComponentおよびキャッチオールルートで再利用できるように個別にエクスポートされます
|
|
704
|
-
export function NotFoundComponent() {
|
|
705
|
-
return (
|
|
706
|
-
<div>
|
|
707
|
-
<h1>404</h1>
|
|
708
|
-
</div>
|
|
709
|
-
);
|
|
710
|
-
}
|
|
248
|
+
module.exports = {
|
|
249
|
+
presets: ["next/babel"],
|
|
250
|
+
plugins: [
|
|
251
|
+
// コンポーネントから辞書へコンテンツを抽出する
|
|
252
|
+
[intlayerExtractBabelPlugin, getExtractPluginOptions()],
|
|
253
|
+
],
|
|
254
|
+
};
|
|
711
255
|
```
|
|
712
256
|
|
|
713
|
-
```
|
|
714
|
-
|
|
715
|
-
import { validatePrefix } from "intlayer";
|
|
716
|
-
import { NotFoundComponent } from "./404";
|
|
717
|
-
|
|
718
|
-
export const Route = createFileRoute("/{-$locale}")({
|
|
719
|
-
// beforeLoadはルートがレンダリングされる前に実行されます(サーバーとクライアントの両方で)
|
|
720
|
-
// これはロケールプレフィックスを検証するのに理想的な場所です
|
|
721
|
-
beforeLoad: ({ params }) => {
|
|
722
|
-
const localeParam = params.locale;
|
|
723
|
-
|
|
724
|
-
// validatePrefixは、ロケールがintlayer構成に従って有効かどうかをチェックします
|
|
725
|
-
const { isValid, localePrefix } = validatePrefix(localeParam);
|
|
726
|
-
|
|
727
|
-
if (!isValid) {
|
|
728
|
-
// 無効なロケールプレフィックス - 有効なロケールプレフィックスで404ページにリダイレクト
|
|
729
|
-
throw redirect({
|
|
730
|
-
to: "/{-$locale}/404",
|
|
731
|
-
params: { locale: localePrefix },
|
|
732
|
-
});
|
|
733
|
-
}
|
|
734
|
-
},
|
|
735
|
-
component: Outlet,
|
|
736
|
-
// notFoundComponentは子ルートが存在しないときに呼び出されます
|
|
737
|
-
// 例:/en/non-existent-page は /en レイアウト内でこれをトリガーします
|
|
738
|
-
notFoundComponent: NotFoundComponent,
|
|
739
|
-
});
|
|
257
|
+
```bash packageManager="npm"
|
|
258
|
+
npm run build # または npm run dev
|
|
740
259
|
```
|
|
741
260
|
|
|
742
|
-
```
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
import { NotFoundComponent } from "./404";
|
|
746
|
-
|
|
747
|
-
// $ (splat/キャッチオール) ルートは、他のルートと一致しないパスに一致します
|
|
748
|
-
// 例:/en/some/deeply/nested/invalid/path
|
|
749
|
-
// これにより、ロケール内のすべての不一致なパスが404ページを表示することが保証されます
|
|
750
|
-
// これがないと、不一致な深いパスが空白のページやエラーを表示する可能性があります
|
|
751
|
-
export const Route = createFileRoute("/{-$locale}/$")({
|
|
752
|
-
component: NotFoundComponent,
|
|
753
|
-
});
|
|
261
|
+
```bash packageManager="pnpm"
|
|
262
|
+
pnpm run build # または pnpm run dev
|
|
754
263
|
```
|
|
755
264
|
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
### ステップ16:TypeScriptの構成(任意)
|
|
759
|
-
|
|
760
|
-
Intlayerはモジュール拡張を使用して、TypeScriptの利点を享受し、コードベースをより強力にします。
|
|
761
|
-
|
|
762
|
-
TypeScript構成に自動生成された型が含まれていることを確認してください:
|
|
763
|
-
|
|
764
|
-
```json5 fileName="tsconfig.json"
|
|
765
|
-
{
|
|
766
|
-
// ... 既存の構成
|
|
767
|
-
include: [
|
|
768
|
-
// ... 既存の包含
|
|
769
|
-
".intlayer/**/*.ts", // 自動生成された型を含める
|
|
770
|
-
],
|
|
771
|
-
}
|
|
265
|
+
```bash packageManager="yarn"
|
|
266
|
+
yarn build # または yarn dev
|
|
772
267
|
```
|
|
773
268
|
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
### Git構成
|
|
777
|
-
|
|
778
|
-
Intlayerによって生成されたファイルは無視することをお勧めします。これにより、Gitリポジトリにそれらをコミットすることを避けることができます。
|
|
779
|
-
|
|
780
|
-
これを行うには、`.gitignore`ファイルに以下の指示を追加できます:
|
|
781
|
-
|
|
782
|
-
```plaintext fileName=".gitignore"
|
|
783
|
-
# Intlayerによって生成されたファイルを無視する
|
|
784
|
-
.intlayer
|
|
269
|
+
```bash packageManager="bun"
|
|
270
|
+
bun run build # Or bun run dev
|
|
785
271
|
```
|
|
786
272
|
|
|
273
|
+
</Tab>
|
|
274
|
+
</Tabs>
|
|
275
|
+
|
|
787
276
|
---
|
|
788
277
|
|
|
789
278
|
## VS Code拡張機能
|