@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-04
|
|
3
|
-
updatedAt:
|
|
3
|
+
updatedAt: 2026-03-12
|
|
4
4
|
title: React Router v7 i18n - React Router v7アプリの翻訳方法 2026
|
|
5
5
|
description: Intlayerを使用してReact Router v7アプリケーションに国際化(i18n)を追加する方法を学びます。ロケール対応ルーティングでアプリを多言語化するための包括的なガイドに従ってください。
|
|
6
6
|
keywords:
|
|
@@ -38,7 +38,7 @@ history:
|
|
|
38
38
|
|
|
39
39
|
このガイドでは、React Router v7プロジェクトにおいて、ロケール対応ルーティング、TypeScriptサポート、最新の開発手法を活用しながら、**Intlayer**を使ったシームレスな国際化の統合方法を説明します。
|
|
40
40
|
|
|
41
|
-
##
|
|
41
|
+
## 目次
|
|
42
42
|
|
|
43
43
|
<TOC/>
|
|
44
44
|
|
|
@@ -58,473 +58,263 @@ Intlayerを使うことで、以下が可能になります:
|
|
|
58
58
|
|
|
59
59
|
## React Router v7アプリケーションでIntlayerをセットアップするステップバイステップガイド
|
|
60
60
|
|
|
61
|
-
|
|
61
|
+
---
|
|
62
62
|
|
|
63
|
-
|
|
63
|
+
## Configure TypeScript
|
|
64
64
|
|
|
65
|
-
|
|
66
|
-
npm install intlayer react-intlayer
|
|
67
|
-
npm install vite-intlayer --save-dev
|
|
68
|
-
npx intlayer init
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
```bash packageManager="pnpm"
|
|
72
|
-
pnpm add intlayer react-intlayer
|
|
73
|
-
pnpm add vite-intlayer --save-dev
|
|
74
|
-
pnpm intlayer init
|
|
75
|
-
```
|
|
65
|
+
Intlayer uses module augmentation to get benefits of TypeScript and make your codebase stronger.
|
|
76
66
|
|
|
77
|
-
|
|
78
|
-
yarn add intlayer react-intlayer
|
|
79
|
-
yarn add vite-intlayer --save-dev
|
|
80
|
-
yarn intlayer init
|
|
81
|
-
```
|
|
67
|
+
Ensure your TypeScript configuration includes the autogenerated types:
|
|
82
68
|
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
69
|
+
```json5 fileName="tsconfig.json"
|
|
70
|
+
{
|
|
71
|
+
// ... your existing configurations
|
|
72
|
+
include: [
|
|
73
|
+
// ... your existing includes
|
|
74
|
+
".intlayer/**/*.ts", // Include the auto-generated types
|
|
75
|
+
],
|
|
76
|
+
}
|
|
87
77
|
```
|
|
88
78
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
- **intlayer**
|
|
92
|
-
設定管理、翻訳、[コンテンツ宣言](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)のための国際化ツールを提供するコアパッケージ。
|
|
93
|
-
|
|
94
|
-
- **react-intlayer**
|
|
95
|
-
IntlayerをReactアプリケーションと統合するパッケージです。Reactの国際化のためのコンテキストプロバイダーとフックを提供します。
|
|
79
|
+
---
|
|
96
80
|
|
|
97
|
-
|
|
98
|
-
Intlayerを[Viteバンドラー](https://vite.dev/guide/why.html#why-bundle-for-production)と統合するためのViteプラグイン、およびユーザーの優先ロケール検出、クッキー管理、URLリダイレクト処理のためのミドルウェアを含みます。
|
|
81
|
+
## Git Configuration
|
|
99
82
|
|
|
100
|
-
|
|
83
|
+
It is recommended to ignore the files generated by Intlayer. This allows you to avoid committing them to your Git repository.
|
|
101
84
|
|
|
102
|
-
|
|
85
|
+
To do this, you can add the following instructions to your `.gitignore` file:
|
|
103
86
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
87
|
+
```plaintext fileName=".gitignore"
|
|
88
|
+
# Intlayerによって生成されたファイルを無視する
|
|
89
|
+
.intlayer
|
|
90
|
+
```
|
|
108
91
|
|
|
109
|
-
|
|
110
|
-
<Tab label="Code" value="code">
|
|
92
|
+
---
|
|
111
93
|
|
|
112
|
-
|
|
113
|
-
src="https://stackblitz.com/github/aymericzip/intlayer-react-router-v7-template?embed=1&ctl=1&file=intlayer.config.ts"
|
|
114
|
-
className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
|
|
115
|
-
title="Demo CodeSandbox - How to Internationalize your application using Intlayer"
|
|
116
|
-
sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
|
|
117
|
-
loading="lazy"
|
|
118
|
-
/>
|
|
94
|
+
## VS Code Extension
|
|
119
95
|
|
|
120
|
-
|
|
121
|
-
</Tabs>
|
|
96
|
+
To improve your development experience with Intlayer, you can install the official **Intlayer VS Code Extension**.
|
|
122
97
|
|
|
123
|
-
|
|
98
|
+
[Install from the VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
|
|
124
99
|
|
|
125
|
-
|
|
100
|
+
This extension provides:
|
|
126
101
|
|
|
127
|
-
|
|
128
|
-
|
|
102
|
+
- **Autocompletion** for translation keys.
|
|
103
|
+
- **Real-time error detection** for missing translations.
|
|
104
|
+
- **Inline previews** of translated content.
|
|
105
|
+
- **Quick actions** to easily create and update translations.
|
|
129
106
|
|
|
130
|
-
|
|
131
|
-
internationalization: {
|
|
132
|
-
defaultLocale: Locales.ENGLISH, // デフォルトのロケールを英語に設定
|
|
133
|
-
locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH], // 利用可能なロケールのリスト
|
|
134
|
-
},
|
|
135
|
-
};
|
|
107
|
+
For more details on how to use the extension, refer to the [Intlayer VS Code Extension documentation](https://intlayer.org/doc/vs-code-extension).
|
|
136
108
|
|
|
137
|
-
|
|
138
|
-
```
|
|
109
|
+
---
|
|
139
110
|
|
|
140
|
-
|
|
141
|
-
import { Locales } from "intlayer";
|
|
111
|
+
## Go Further
|
|
142
112
|
|
|
143
|
-
|
|
144
|
-
const config = {
|
|
145
|
-
internationalization: {
|
|
146
|
-
defaultLocale: Locales.ENGLISH, // デフォルトのロケールを英語に設定
|
|
147
|
-
locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH], // 利用可能なロケールのリスト
|
|
148
|
-
},
|
|
149
|
-
};
|
|
113
|
+
To go further, you can implement the [visual editor](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/intlayer_visual_editor.md) or externalize your content using the [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/intlayer_CMS.md).
|
|
150
114
|
|
|
151
|
-
|
|
152
|
-
```
|
|
115
|
+
---
|
|
153
116
|
|
|
154
|
-
|
|
155
|
-
const { Locales } = require("intlayer");
|
|
117
|
+
## Documentation References
|
|
156
118
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
};
|
|
119
|
+
- [Intlayer Documentation](https://intlayer.org)
|
|
120
|
+
- [React Router v7 Documentation](https://reactrouter.com/)
|
|
121
|
+
- [useIntlayer hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/packages/react-intlayer/useIntlayer.md)
|
|
122
|
+
- [useLocale hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/packages/react-intlayer/useLocale.md)
|
|
123
|
+
- [Content Declaration](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/dictionary/content_file.md)
|
|
124
|
+
- [Configuration](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/configuration.md)
|
|
164
125
|
|
|
165
|
-
|
|
166
|
-
```
|
|
126
|
+
This comprehensive guide provides everything you need to integrate Intlayer with React Router v7 for a fully internationalized application with locale-aware routing and TypeScript support.
|
|
167
127
|
|
|
168
|
-
|
|
128
|
+
### ステップ11: ミドルウェアを追加する(オプション)
|
|
169
129
|
|
|
170
|
-
|
|
130
|
+
`intlayerProxy` を使用して、アプリケーションにサーバーサイドルーティングを追加することもできます。このプラグインは、URL に基づいて現在のロケールを自動的に検出し、適切なロケールクッキーを設定します。ロケールが指定されていない場合、プラグインはユーザーのブラウザの言語設定に基づいて最も適切なロケールを判断します。ロケールが検出されない場合は、デフォルトのロケールにリダイレクトします。
|
|
171
131
|
|
|
172
|
-
|
|
132
|
+
> `intlayerProxy` を本番環境で使用するには、`vite-intlayer` パッケージを `devDependencies` から `dependencies` に切り替える必要があることに注意してください。
|
|
173
133
|
|
|
174
|
-
```typescript fileName="vite.config.ts"
|
|
134
|
+
```typescript {3,7} fileName="vite.config.ts"
|
|
175
135
|
import { reactRouter } from "@react-router/dev/vite";
|
|
176
136
|
import { defineConfig } from "vite";
|
|
177
|
-
import { intlayer } from "vite-intlayer";
|
|
137
|
+
import { intlayer, intlayerProxy } from "vite-intlayer";
|
|
178
138
|
import tsconfigPaths from "vite-tsconfig-paths";
|
|
179
139
|
|
|
180
140
|
export default defineConfig({
|
|
181
|
-
plugins: [reactRouter(), tsconfigPaths(), intlayer()],
|
|
141
|
+
plugins: [reactRouter(), tsconfigPaths(), intlayer(), intlayerProxy()],
|
|
182
142
|
});
|
|
183
143
|
```
|
|
184
144
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
### ステップ4: React Router v7のルートを設定する
|
|
188
|
-
|
|
189
|
-
ロケール対応のルートでルーティング設定を行います:
|
|
190
|
-
|
|
191
|
-
```typescript fileName="app/routes.ts"
|
|
192
|
-
import { layout, route, type RouteConfig } from "@react-router/dev/routes";
|
|
193
|
-
|
|
194
|
-
export default [
|
|
195
|
-
route("/:lang?", "routes/page.tsx"), // ローカライズされたホームページ
|
|
196
|
-
route("/:lang?/about", "routes/about/page.tsx"), // ローカライズされたアバウトページ
|
|
197
|
-
] satisfies RouteConfig;
|
|
198
|
-
```
|
|
145
|
+
### (オプション) ステップ 12 : コンポーネントのコンテンツを抽出する
|
|
199
146
|
|
|
200
|
-
|
|
147
|
+
既存のコードベースがある場合、数千のファイルを変換するのは時間がかかることがあります。
|
|
201
148
|
|
|
202
|
-
|
|
149
|
+
このプロセスを容易にするために、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) を提案しています。
|
|
203
150
|
|
|
204
|
-
|
|
151
|
+
セットアップするには、`intlayer.config.ts` ファイルに `compiler` セクションを追加します。
|
|
205
152
|
|
|
206
|
-
```
|
|
207
|
-
import {
|
|
208
|
-
import { IntlayerProvider } from "react-intlayer";
|
|
209
|
-
import {
|
|
210
|
-
data,
|
|
211
|
-
Meta,
|
|
212
|
-
Scripts,
|
|
213
|
-
ScrollRestoration,
|
|
214
|
-
useLoaderData,
|
|
215
|
-
} from "react-router";
|
|
216
|
-
import type { Route } from "./+types/root";
|
|
217
|
-
|
|
218
|
-
// ... Unchanged App, links and ErrorBoundary code
|
|
219
|
-
|
|
220
|
-
export async function loader({ request }: Route.LoaderArgs) {
|
|
221
|
-
const locale = getLocaleFromPath(request.url);
|
|
222
|
-
|
|
223
|
-
if (!locale) {
|
|
224
|
-
throw data("Language not supported", { status: 404 });
|
|
225
|
-
}
|
|
153
|
+
```typescript fileName="intlayer.config.ts" codeFormat="typescript"
|
|
154
|
+
import { type IntlayerConfig } from "intlayer";
|
|
226
155
|
|
|
227
|
-
|
|
228
|
-
|
|
156
|
+
const config: IntlayerConfig = {
|
|
157
|
+
// ... 他の構成
|
|
158
|
+
compiler: {
|
|
159
|
+
/**
|
|
160
|
+
* コンパイラを有効にするかどうかを指定します。
|
|
161
|
+
*/
|
|
162
|
+
enabled: true,
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* 出力ファイルのパスを定義します。
|
|
166
|
+
*/
|
|
167
|
+
output: ({ fileName, extension }) => `./${fileName}${extension}`,
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* 変換後にコンポーネントを保存するかどうかを指定します。これにより、コンパイラを一度だけ実行してアプリを変換し、その後削除することができます。
|
|
171
|
+
*/
|
|
172
|
+
saveComponents: false,
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* 辞書キーの接頭辞
|
|
176
|
+
*/
|
|
177
|
+
dictionaryKeyPrefix: "",
|
|
178
|
+
},
|
|
179
|
+
};
|
|
229
180
|
|
|
230
|
-
export
|
|
231
|
-
children,
|
|
232
|
-
}: { children: React.ReactNode } & Route.ComponentProps) {
|
|
233
|
-
const data = useLoaderData<typeof loader>();
|
|
234
|
-
const { locale } = data ?? {};
|
|
235
|
-
|
|
236
|
-
return (
|
|
237
|
-
<html lang={locale}>
|
|
238
|
-
<head>
|
|
239
|
-
<meta charSet="utf-8" />
|
|
240
|
-
<meta content="width=device-width, initial-scale=1" name="viewport" />
|
|
241
|
-
<Meta />
|
|
242
|
-
<Links />
|
|
243
|
-
</head>
|
|
244
|
-
<body>
|
|
245
|
-
<IntlayerProvider locale={locale}>{children}</IntlayerProvider>
|
|
246
|
-
<ScrollRestoration />
|
|
247
|
-
<Scripts />
|
|
248
|
-
</body>
|
|
249
|
-
</html>
|
|
250
|
-
);
|
|
251
|
-
}
|
|
181
|
+
export default config;
|
|
252
182
|
```
|
|
253
183
|
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
}),
|
|
279
|
-
homeLink: t({
|
|
280
|
-
en: "ホーム",
|
|
281
|
-
es: "Inicio",
|
|
282
|
-
fr: "Accueil",
|
|
283
|
-
}),
|
|
184
|
+
```javascript fileName="intlayer.config.mjs" codeFormat="esm"
|
|
185
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
186
|
+
const config = {
|
|
187
|
+
// ... 他の構成
|
|
188
|
+
compiler: {
|
|
189
|
+
/**
|
|
190
|
+
* コンパイラを有効にするかどうかを指定します。
|
|
191
|
+
*/
|
|
192
|
+
enabled: true,
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* 出力ファイルのパスを定義します。
|
|
196
|
+
*/
|
|
197
|
+
output: ({ fileName, extension }) => `./${fileName}${extension}`,
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* 変換後にコンポーネントを保存するかどうかを指定します。これにより、コンパイラを一度だけ実行してアプリを変換し、その後削除することができます。
|
|
201
|
+
*/
|
|
202
|
+
saveComponents: false,
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* 辞書キーの接頭辞
|
|
206
|
+
*/
|
|
207
|
+
dictionaryKeyPrefix: "",
|
|
284
208
|
},
|
|
285
|
-
}
|
|
209
|
+
};
|
|
286
210
|
|
|
287
|
-
export default
|
|
211
|
+
export default config;
|
|
288
212
|
```
|
|
289
213
|
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
return getLocalizedUrl(to, locale);
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
if (isExternalLink(to.pathname ?? "")) {
|
|
319
|
-
return to;
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
return {
|
|
323
|
-
...to,
|
|
324
|
-
pathname: getLocalizedUrl(to.pathname ?? "", locale),
|
|
325
|
-
};
|
|
214
|
+
```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
|
|
215
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
216
|
+
const config = {
|
|
217
|
+
// ... 他の構成
|
|
218
|
+
compiler: {
|
|
219
|
+
/**
|
|
220
|
+
* コンパイラを有効にするかどうかを指定します。
|
|
221
|
+
*/
|
|
222
|
+
enabled: true,
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* 出力ファイルのパスを定義します。
|
|
226
|
+
*/
|
|
227
|
+
output: ({ fileName, extension }) => `./${fileName}${extension}`,
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* 変換後にコンポーネントを保存するかどうかを指定します。これにより、コンパイラを一度だけ実行してアプリを変換し、その後削除することができます。
|
|
231
|
+
*/
|
|
232
|
+
saveComponents: false,
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* 辞書キーの接頭辞
|
|
236
|
+
*/
|
|
237
|
+
dictionaryKeyPrefix: "",
|
|
238
|
+
},
|
|
326
239
|
};
|
|
327
240
|
|
|
328
|
-
|
|
329
|
-
export const LocalizedLink: FC<LinkProps> = (props) => {
|
|
330
|
-
const { locale } = useLocale();
|
|
331
|
-
|
|
332
|
-
return <Link {...props} to={locacalizeTo(props.to, locale)} />;
|
|
333
|
-
};
|
|
241
|
+
module.exports = config;
|
|
334
242
|
```
|
|
335
243
|
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
```tsx fileName="app/hooks/useLocalizedNavigate.ts"
|
|
339
|
-
import { useLocale } from "react-intlayer";
|
|
340
|
-
import { type NavigateOptions, type To, useNavigate } from "react-router";
|
|
244
|
+
<Tabs>
|
|
245
|
+
<Tab value='抽出コマンド'>
|
|
341
246
|
|
|
342
|
-
|
|
247
|
+
コンポーネントを変換してコンテンツを抽出するためにエクストラクタを実行します
|
|
343
248
|
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
const { locale } = useLocale();
|
|
347
|
-
|
|
348
|
-
const localizedNavigate = (to: To, options?: NavigateOptions) => {
|
|
349
|
-
const localedTo = locacalizeTo(to, locale);
|
|
350
|
-
|
|
351
|
-
navigate(localedTo, options);
|
|
352
|
-
};
|
|
353
|
-
|
|
354
|
-
return localizedNavigate;
|
|
355
|
-
};
|
|
249
|
+
```bash packageManager="npm"
|
|
250
|
+
npx intlayer extract
|
|
356
251
|
```
|
|
357
252
|
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
#### ローカライズされたホームページ
|
|
363
|
-
|
|
364
|
-
```tsx fileName="app/routes/page.tsx"
|
|
365
|
-
import { getIntlayer, validatePrefix } from "intlayer";
|
|
366
|
-
import { useIntlayer } from "react-intlayer";
|
|
367
|
-
import { data } from "react-router";
|
|
368
|
-
|
|
369
|
-
import { LocaleSwitcher } from "~/components/locale-switcher";
|
|
370
|
-
|
|
371
|
-
import { Navbar } from "~/components/navbar";
|
|
372
|
-
import type { Route } from "./+types/page";
|
|
373
|
-
|
|
374
|
-
export const loader = ({ params }: Route.LoaderArgs) => {
|
|
375
|
-
const { locale } = params;
|
|
376
|
-
|
|
377
|
-
const { isValid } = validatePrefix(locale);
|
|
378
|
-
|
|
379
|
-
if (!isValid) {
|
|
380
|
-
throw data("Locale not supported", { status: 404 });
|
|
381
|
-
}
|
|
382
|
-
};
|
|
383
|
-
|
|
384
|
-
export const meta: Route.MetaFunction = ({ params }) => {
|
|
385
|
-
const content = getIntlayer("page", params.locale);
|
|
386
|
-
|
|
387
|
-
return [
|
|
388
|
-
{ title: content.title },
|
|
389
|
-
{ content: content.description, name: "description" },
|
|
390
|
-
];
|
|
391
|
-
};
|
|
253
|
+
```bash packageManager="pnpm"
|
|
254
|
+
pnpm intlayer extract
|
|
255
|
+
```
|
|
392
256
|
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
return (
|
|
397
|
-
<div>
|
|
398
|
-
<h1>{title}</h1>
|
|
399
|
-
<p>{description}</p>
|
|
400
|
-
<nav>
|
|
401
|
-
<LocalizedLink to="/about">{aboutLink}</LocalizedLink>
|
|
402
|
-
</nav>
|
|
403
|
-
</div>
|
|
404
|
-
);
|
|
405
|
-
}
|
|
257
|
+
```bash packageManager="yarn"
|
|
258
|
+
yarn intlayer extract
|
|
406
259
|
```
|
|
407
260
|
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
> アプリケーションが既に存在する場合は、[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) を組み合わせて、1 秒で何千ものコンポーネントを変換できます。
|
|
411
|
-
|
|
412
|
-
### ステップ9:ロケールスイッチャーコンポーネントを作成する
|
|
413
|
-
|
|
414
|
-
ユーザーが言語を変更できるコンポーネントを作成します:
|
|
415
|
-
|
|
416
|
-
```tsx fileName="app/components/locale-switcher.tsx"
|
|
417
|
-
import type { FC } from "react";
|
|
418
|
-
|
|
419
|
-
import {
|
|
420
|
-
getHTMLTextDir,
|
|
421
|
-
getLocaleName,
|
|
422
|
-
getLocalizedUrl,
|
|
423
|
-
getPathWithoutLocale,
|
|
424
|
-
Locales,
|
|
425
|
-
} from "intlayer";
|
|
426
|
-
import { setLocaleInStorage, useIntlayer, useLocale } from "react-intlayer";
|
|
427
|
-
import { Link, useLocation } from "react-router";
|
|
428
|
-
|
|
429
|
-
export const LocaleSwitcher: FC = () => {
|
|
430
|
-
const { localeSwitcherLabel } = useIntlayer("locale-switcher"); // ロケールスイッチャーのラベルを取得
|
|
431
|
-
const { pathname } = useLocation(); // 現在のパス名を取得
|
|
432
|
-
|
|
433
|
-
const { availableLocales, locale } = useLocale(); // 利用可能なロケールと現在のロケールを取得
|
|
434
|
-
|
|
435
|
-
const pathWithoutLocale = getPathWithoutLocale(pathname); // パスからロケール部分を除去
|
|
436
|
-
|
|
437
|
-
return (
|
|
438
|
-
<ol>
|
|
439
|
-
{availableLocales.map((localeItem) => (
|
|
440
|
-
<li key={localeItem}>
|
|
441
|
-
<Link
|
|
442
|
-
aria-current={localeItem === locale ? "page" : undefined}
|
|
443
|
-
aria-label={`${localeSwitcherLabel.value} ${getLocaleName(localeItem)}`}
|
|
444
|
-
onClick={() => setLocale(localeItem)}
|
|
445
|
-
to={getLocalizedUrl(pathWithoutLocale, localeItem)}
|
|
446
|
-
>
|
|
447
|
-
<span>
|
|
448
|
-
{/* ロケール - 例: FR */}
|
|
449
|
-
{localeItem}
|
|
450
|
-
</span>
|
|
451
|
-
<span>
|
|
452
|
-
{/* 自身のロケールでの言語名 - 例: Français */}
|
|
453
|
-
{getLocaleName(localeItem, locale)}
|
|
454
|
-
</span>
|
|
455
|
-
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
456
|
-
{/* 現在のロケールでの言語名 - 例: 現在のロケールがLocales.SPANISHの場合のFrancés */}
|
|
457
|
-
{getLocaleName(localeItem)}
|
|
458
|
-
</span>
|
|
459
|
-
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
460
|
-
{/* 英語での言語名 - 例: French */}
|
|
461
|
-
{getLocaleName(localeItem, Locales.ENGLISH)}
|
|
462
|
-
</span>
|
|
463
|
-
</Link>
|
|
464
|
-
</li>
|
|
465
|
-
))}
|
|
466
|
-
</ol>
|
|
467
|
-
);
|
|
468
|
-
};
|
|
261
|
+
```bash packageManager="bun"
|
|
262
|
+
bunx intlayer extract
|
|
469
263
|
```
|
|
470
264
|
|
|
471
|
-
>
|
|
265
|
+
</Tab>
|
|
266
|
+
<Tab value='Babelコンパイラ'>
|
|
472
267
|
|
|
473
|
-
|
|
268
|
+
```bash packageManager="npm"
|
|
269
|
+
npm install @intlayer/babel --save-dev
|
|
270
|
+
```
|
|
474
271
|
|
|
475
|
-
|
|
272
|
+
```bash packageManager="pnpm"
|
|
273
|
+
pnpm add @intlayer/babel --save-dev
|
|
274
|
+
```
|
|
476
275
|
|
|
477
|
-
```
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
import { useLocale } from "react-intlayer";
|
|
276
|
+
```bash packageManager="yarn"
|
|
277
|
+
yarn add @intlayer/babel --save-dev
|
|
278
|
+
```
|
|
481
279
|
|
|
482
|
-
|
|
483
|
-
|
|
280
|
+
```bash packageManager="bun"
|
|
281
|
+
bun add @intlayer/babel --dev
|
|
282
|
+
```
|
|
484
283
|
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
284
|
+
```js fileName="babel.config.js"
|
|
285
|
+
const {
|
|
286
|
+
intlayerExtractBabelPlugin,
|
|
287
|
+
getExtractPluginOptions,
|
|
288
|
+
} = require("@intlayer/babel");
|
|
289
|
+
|
|
290
|
+
module.exports = {
|
|
291
|
+
presets: ["next/babel"],
|
|
292
|
+
plugins: [
|
|
293
|
+
// コンポーネントから辞書へコンテンツを抽出する
|
|
294
|
+
[intlayerExtractBabelPlugin, getExtractPluginOptions()],
|
|
295
|
+
],
|
|
489
296
|
};
|
|
490
297
|
```
|
|
491
298
|
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
```tsx fileName="app/routes/layout.tsx"
|
|
495
|
-
import { Outlet } from "react-router";
|
|
496
|
-
import { IntlayerProvider } from "react-intlayer";
|
|
497
|
-
|
|
498
|
-
import { useI18nHTMLAttributes } from "app/hooks/useI18nHTMLAttributes"; // フックをインポート
|
|
499
|
-
|
|
500
|
-
export default function RootLayout() {
|
|
501
|
-
useI18nHTMLAttributes(); // フックを呼び出す
|
|
502
|
-
|
|
503
|
-
return (
|
|
504
|
-
<IntlayerProvider>
|
|
505
|
-
<Outlet />
|
|
506
|
-
</IntlayerProvider>
|
|
507
|
-
);
|
|
508
|
-
}
|
|
299
|
+
```bash packageManager="npm"
|
|
300
|
+
npm run build # または npm run dev
|
|
509
301
|
```
|
|
510
302
|
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
> `intlayerProxy` を本番環境で使用するには、`vite-intlayer` パッケージを `devDependencies` から `dependencies` に切り替える必要があることに注意してください。
|
|
303
|
+
```bash packageManager="pnpm"
|
|
304
|
+
pnpm run build # または pnpm run dev
|
|
305
|
+
```
|
|
516
306
|
|
|
517
|
-
```
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
import { intlayer, intlayerProxy } from "vite-intlayer";
|
|
521
|
-
import tsconfigPaths from "vite-tsconfig-paths";
|
|
307
|
+
```bash packageManager="yarn"
|
|
308
|
+
yarn build # または yarn dev
|
|
309
|
+
```
|
|
522
310
|
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
});
|
|
311
|
+
```bash packageManager="bun"
|
|
312
|
+
bun run build # Or bun run dev
|
|
526
313
|
```
|
|
527
314
|
|
|
315
|
+
</Tab>
|
|
316
|
+
</Tabs>
|
|
317
|
+
|
|
528
318
|
---
|
|
529
319
|
|
|
530
320
|
## TypeScriptの設定
|