@intlayer/docs 6.1.6-canary.0 → 6.1.6
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/blog/en/next-i18next_vs_next-intl_vs_intlayer.md +71 -80
- package/dist/cjs/generated/docs.entry.cjs +16 -0
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +16 -0
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/types/generated/docs.entry.d.ts +1 -0
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/docs/ar/intlayer_with_angular.md +2 -2
- package/docs/ar/intlayer_with_astro.md +246 -0
- package/docs/ar/intlayer_with_create_react_app.md +3 -2
- package/docs/ar/intlayer_with_express.md +2 -2
- package/docs/ar/intlayer_with_nestjs.md +2 -2
- package/docs/ar/intlayer_with_nextjs_14.md +2 -2
- package/docs/ar/intlayer_with_nextjs_15.md +2 -2
- package/docs/ar/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/ar/intlayer_with_nuxt.md +2 -2
- package/docs/ar/intlayer_with_react_native+expo.md +11 -20
- package/docs/ar/intlayer_with_react_router_v7.md +195 -241
- package/docs/ar/intlayer_with_tanstack.md +198 -272
- package/docs/ar/intlayer_with_vite+preact.md +9 -9
- package/docs/ar/intlayer_with_vite+react.md +7 -7
- package/docs/ar/intlayer_with_vite+vue.md +9 -9
- package/docs/de/intlayer_with_angular.md +2 -2
- package/docs/de/intlayer_with_astro.md +246 -0
- package/docs/de/intlayer_with_create_react_app.md +2 -2
- package/docs/de/intlayer_with_express.md +2 -2
- package/docs/de/intlayer_with_nestjs.md +2 -2
- package/docs/de/intlayer_with_nextjs_14.md +2 -2
- package/docs/de/intlayer_with_nextjs_15.md +2 -2
- package/docs/de/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/de/intlayer_with_nuxt.md +2 -2
- package/docs/de/intlayer_with_react_native+expo.md +11 -20
- package/docs/de/intlayer_with_react_router_v7.md +193 -242
- package/docs/de/intlayer_with_tanstack.md +194 -266
- package/docs/de/intlayer_with_vite+preact.md +9 -9
- package/docs/de/intlayer_with_vite+react.md +9 -9
- package/docs/de/intlayer_with_vite+vue.md +11 -11
- package/docs/de/packages/vite-intlayer/index.md +3 -3
- package/docs/en/how_works_intlayer.md +1 -1
- package/docs/en/index.md +1 -1
- package/docs/en/intlayer_cli.md +1 -1
- package/docs/en/intlayer_with_angular.md +4 -4
- package/docs/en/intlayer_with_astro.md +246 -0
- package/docs/en/intlayer_with_create_react_app.md +4 -4
- package/docs/en/intlayer_with_express.md +3 -3
- package/docs/en/intlayer_with_lynx+react.md +1 -1
- package/docs/en/intlayer_with_nestjs.md +2 -2
- package/docs/en/intlayer_with_nextjs_14.md +13 -4
- package/docs/en/intlayer_with_nextjs_15.md +13 -4
- package/docs/en/intlayer_with_nextjs_page_router.md +5 -5
- package/docs/en/intlayer_with_nuxt.md +4 -4
- package/docs/en/intlayer_with_react_native+expo.md +46 -24
- package/docs/en/intlayer_with_react_router_v7.md +164 -211
- package/docs/en/intlayer_with_tanstack.md +166 -241
- package/docs/en/intlayer_with_vite+preact.md +12 -12
- package/docs/en/intlayer_with_vite+react.md +12 -12
- package/docs/en/intlayer_with_vite+solid.md +2 -2
- package/docs/en/intlayer_with_vite+svelte.md +2 -2
- package/docs/en/intlayer_with_vite+vue.md +12 -12
- package/docs/en/introduction.md +1 -1
- package/docs/en/packages/next-intlayer/useDictionary.md +1 -1
- package/docs/en/packages/next-intlayer/useIntlayer.md +1 -1
- package/docs/en/packages/react-intlayer/useDictionary.md +1 -1
- package/docs/en/packages/react-intlayer/useI18n.md +1 -1
- package/docs/en/packages/react-intlayer/useIntlayer.md +1 -1
- package/docs/en/releases/v6.md +1 -0
- package/docs/en/roadmap.md +1 -1
- package/docs/en-GB/intlayer_with_angular.md +3 -3
- package/docs/en-GB/intlayer_with_astro.md +246 -0
- package/docs/en-GB/intlayer_with_create_react_app.md +5 -4
- package/docs/en-GB/intlayer_with_express.md +2 -2
- package/docs/en-GB/intlayer_with_nestjs.md +2 -2
- package/docs/en-GB/intlayer_with_nextjs_14.md +4 -4
- package/docs/en-GB/intlayer_with_nextjs_15.md +2 -2
- package/docs/en-GB/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/en-GB/intlayer_with_nuxt.md +2 -2
- package/docs/en-GB/intlayer_with_react_native+expo.md +11 -20
- package/docs/en-GB/intlayer_with_react_router_v7.md +171 -220
- package/docs/en-GB/intlayer_with_tanstack.md +174 -248
- package/docs/en-GB/intlayer_with_vite+preact.md +9 -9
- package/docs/en-GB/intlayer_with_vite+react.md +9 -9
- package/docs/en-GB/intlayer_with_vite+vue.md +11 -11
- package/docs/en-GB/packages/next-intlayer/useIntlayer.md +1 -1
- package/docs/en-GB/packages/react-intlayer/useIntlayer.md +1 -1
- package/docs/es/intlayer_with_angular.md +2 -2
- package/docs/es/intlayer_with_astro.md +246 -0
- package/docs/es/intlayer_with_create_react_app.md +3 -2
- package/docs/es/intlayer_with_express.md +2 -2
- package/docs/es/intlayer_with_nextjs_14.md +2 -2
- package/docs/es/intlayer_with_nextjs_15.md +2 -2
- package/docs/es/intlayer_with_react_native+expo.md +11 -20
- package/docs/es/intlayer_with_react_router_v7.md +188 -232
- package/docs/es/intlayer_with_tanstack.md +203 -273
- package/docs/es/intlayer_with_vite+preact.md +7 -7
- package/docs/es/intlayer_with_vite+react.md +7 -7
- package/docs/es/intlayer_with_vite+vue.md +9 -9
- package/docs/fr/intlayer_with_angular.md +2 -2
- package/docs/fr/intlayer_with_astro.md +246 -0
- package/docs/fr/intlayer_with_create_react_app.md +3 -2
- package/docs/fr/intlayer_with_express.md +2 -2
- package/docs/fr/intlayer_with_nestjs.md +2 -2
- package/docs/fr/intlayer_with_nextjs_14.md +2 -2
- package/docs/fr/intlayer_with_react_native+expo.md +11 -20
- package/docs/fr/intlayer_with_react_router_v7.md +188 -248
- package/docs/fr/intlayer_with_tanstack.md +192 -265
- package/docs/fr/intlayer_with_vite+preact.md +7 -7
- package/docs/fr/intlayer_with_vite+react.md +7 -7
- package/docs/fr/intlayer_with_vite+vue.md +9 -9
- package/docs/hi/intlayer_cli.md +1 -4
- package/docs/hi/intlayer_with_angular.md +2 -2
- package/docs/hi/intlayer_with_astro.md +246 -0
- package/docs/hi/intlayer_with_create_react_app.md +2 -2
- package/docs/hi/intlayer_with_express.md +2 -2
- package/docs/hi/intlayer_with_nestjs.md +2 -2
- package/docs/hi/intlayer_with_nextjs_14.md +2 -2
- package/docs/hi/intlayer_with_nextjs_15.md +2 -2
- package/docs/hi/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/hi/intlayer_with_nuxt.md +2 -2
- package/docs/hi/intlayer_with_react_native+expo.md +11 -20
- package/docs/hi/intlayer_with_react_router_v7.md +199 -243
- package/docs/hi/intlayer_with_tanstack.md +210 -285
- package/docs/hi/intlayer_with_vite+preact.md +9 -9
- package/docs/hi/intlayer_with_vite+react.md +9 -9
- package/docs/hi/intlayer_with_vite+solid.md +1 -1
- package/docs/hi/intlayer_with_vite+vue.md +11 -11
- package/docs/it/intlayer_with_angular.md +2 -2
- package/docs/it/intlayer_with_astro.md +246 -0
- package/docs/it/intlayer_with_create_react_app.md +3 -2
- package/docs/it/intlayer_with_express.md +2 -2
- package/docs/it/intlayer_with_nestjs.md +2 -2
- package/docs/it/intlayer_with_nextjs_14.md +2 -2
- package/docs/it/intlayer_with_nextjs_15.md +2 -2
- package/docs/it/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/it/intlayer_with_nuxt.md +2 -2
- package/docs/it/intlayer_with_react_native+expo.md +11 -21
- package/docs/it/intlayer_with_react_router_v7.md +195 -242
- package/docs/it/intlayer_with_tanstack.md +203 -267
- package/docs/it/intlayer_with_vite+preact.md +9 -9
- package/docs/it/intlayer_with_vite+react.md +13 -11
- package/docs/it/intlayer_with_vite+vue.md +11 -11
- package/docs/ja/intlayer_with_angular.md +2 -2
- package/docs/ja/intlayer_with_astro.md +246 -0
- package/docs/ja/intlayer_with_create_react_app.md +3 -2
- package/docs/ja/intlayer_with_express.md +2 -2
- package/docs/ja/intlayer_with_nestjs.md +2 -2
- package/docs/ja/intlayer_with_nextjs_14.md +2 -2
- package/docs/ja/intlayer_with_nextjs_15.md +2 -2
- package/docs/ja/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/ja/intlayer_with_nuxt.md +2 -2
- package/docs/ja/intlayer_with_react_native+expo.md +18 -29
- package/docs/ja/intlayer_with_react_router_v7.md +204 -250
- package/docs/ja/intlayer_with_tanstack.md +218 -286
- package/docs/ja/intlayer_with_vite+preact.md +9 -9
- package/docs/ja/intlayer_with_vite+react.md +11 -11
- package/docs/ja/intlayer_with_vite+vue.md +11 -11
- package/docs/ko/intlayer_with_angular.md +2 -2
- package/docs/ko/intlayer_with_astro.md +246 -0
- package/docs/ko/intlayer_with_create_react_app.md +3 -2
- package/docs/ko/intlayer_with_express.md +2 -2
- package/docs/ko/intlayer_with_nestjs.md +2 -2
- package/docs/ko/intlayer_with_nextjs_14.md +2 -2
- package/docs/ko/intlayer_with_nextjs_15.md +2 -2
- package/docs/ko/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/ko/intlayer_with_nuxt.md +2 -2
- package/docs/ko/intlayer_with_react_native+expo.md +19 -28
- package/docs/ko/intlayer_with_react_router_v7.md +190 -244
- package/docs/ko/intlayer_with_tanstack.md +200 -270
- package/docs/ko/intlayer_with_vite+preact.md +9 -9
- package/docs/ko/intlayer_with_vite+react.md +9 -9
- package/docs/ko/intlayer_with_vite+vue.md +11 -11
- package/docs/pt/intlayer_with_angular.md +2 -2
- package/docs/pt/intlayer_with_astro.md +246 -0
- package/docs/pt/intlayer_with_create_react_app.md +3 -2
- package/docs/pt/intlayer_with_express.md +2 -2
- package/docs/pt/intlayer_with_nestjs.md +2 -2
- package/docs/pt/intlayer_with_nextjs_14.md +2 -2
- package/docs/pt/intlayer_with_nextjs_15.md +2 -2
- package/docs/pt/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/pt/intlayer_with_nuxt.md +2 -2
- package/docs/pt/intlayer_with_react_native+expo.md +11 -20
- package/docs/pt/intlayer_with_react_router_v7.md +7 -13
- package/docs/pt/intlayer_with_tanstack.md +183 -258
- package/docs/pt/intlayer_with_vite+preact.md +9 -9
- package/docs/pt/intlayer_with_vite+react.md +9 -9
- package/docs/pt/intlayer_with_vite+vue.md +9 -9
- package/docs/ru/intlayer_with_angular.md +2 -2
- package/docs/ru/intlayer_with_astro.md +246 -0
- package/docs/ru/intlayer_with_create_react_app.md +3 -2
- package/docs/ru/intlayer_with_express.md +2 -2
- package/docs/ru/intlayer_with_nestjs.md +2 -2
- package/docs/ru/intlayer_with_nextjs_14.md +2 -2
- package/docs/ru/intlayer_with_nextjs_15.md +2 -2
- package/docs/ru/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/ru/intlayer_with_nuxt.md +2 -2
- package/docs/ru/intlayer_with_react_native+expo.md +11 -20
- package/docs/ru/intlayer_with_react_router_v7.md +192 -238
- package/docs/ru/intlayer_with_tanstack.md +197 -269
- package/docs/ru/intlayer_with_vite+preact.md +9 -9
- package/docs/ru/intlayer_with_vite+react.md +9 -9
- package/docs/ru/intlayer_with_vite+vue.md +11 -11
- package/docs/tr/how_works_intlayer.md +1 -1
- package/docs/tr/index.md +1 -1
- package/docs/tr/intlayer_cli.md +1 -1
- package/docs/tr/intlayer_with_angular.md +4 -4
- package/docs/tr/intlayer_with_astro.md +246 -0
- package/docs/tr/intlayer_with_create_react_app.md +4 -4
- package/docs/tr/intlayer_with_express.md +3 -3
- package/docs/tr/intlayer_with_lynx+react.md +1 -1
- package/docs/tr/intlayer_with_nestjs.md +2 -2
- package/docs/tr/intlayer_with_nextjs_14.md +2 -2
- package/docs/tr/intlayer_with_nextjs_15.md +4 -4
- package/docs/tr/intlayer_with_nextjs_page_router.md +5 -5
- package/docs/tr/intlayer_with_nuxt.md +4 -4
- package/docs/tr/intlayer_with_react_native+expo.md +12 -21
- package/docs/tr/intlayer_with_react_router_v7.md +222 -267
- package/docs/tr/intlayer_with_tanstack.md +400 -303
- package/docs/tr/intlayer_with_vite+preact.md +12 -12
- package/docs/tr/intlayer_with_vite+react.md +12 -12
- package/docs/tr/intlayer_with_vite+solid.md +2 -2
- package/docs/tr/intlayer_with_vite+svelte.md +2 -2
- package/docs/tr/intlayer_with_vite+vue.md +12 -12
- package/docs/tr/introduction.md +1 -1
- package/docs/tr/packages/react-intlayer/useDictionary.md +1 -1
- package/docs/tr/packages/react-intlayer/useI18n.md +1 -1
- package/docs/tr/roadmap.md +1 -1
- package/docs/zh/intlayer_with_angular.md +2 -2
- package/docs/zh/intlayer_with_astro.md +246 -0
- package/docs/zh/intlayer_with_create_react_app.md +3 -2
- package/docs/zh/intlayer_with_express.md +2 -2
- package/docs/zh/intlayer_with_nestjs.md +2 -2
- package/docs/zh/intlayer_with_nextjs_14.md +2 -2
- package/docs/zh/intlayer_with_nextjs_15.md +2 -2
- package/docs/zh/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/zh/intlayer_with_nuxt.md +2 -2
- package/docs/zh/intlayer_with_react_native+expo.md +19 -28
- package/docs/zh/intlayer_with_react_router_v7.md +200 -248
- package/docs/zh/intlayer_with_tanstack.md +208 -283
- package/docs/zh/intlayer_with_vite+preact.md +9 -9
- package/docs/zh/intlayer_with_vite+react.md +9 -9
- package/docs/zh/intlayer_with_vite+vue.md +9 -9
- package/package.json +11 -11
- package/src/generated/docs.entry.ts +16 -0
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
createdAt: 2025-09-09
|
|
3
3
|
updatedAt: 2025-09-09
|
|
4
4
|
title: Tanstack StartでのIntlayerによる国際化(i18n)入門
|
|
5
|
-
description: Intlayer
|
|
5
|
+
description: Intlayerを使ってTanstack Startアプリケーションに国際化(i18n)を追加する方法を学びます。ロケール対応ルーティングで多言語対応アプリを作成するための包括的なガイドです。
|
|
6
6
|
keywords:
|
|
7
7
|
- 国際化
|
|
8
8
|
- ドキュメント
|
|
@@ -15,15 +15,13 @@ keywords:
|
|
|
15
15
|
slugs:
|
|
16
16
|
- doc
|
|
17
17
|
- environment
|
|
18
|
-
- vite-and-react
|
|
19
18
|
- tanstack-start
|
|
20
|
-
applicationTemplate: https://github.com/
|
|
21
|
-
author: AydinTheFirst
|
|
19
|
+
applicationTemplate: https://github.com/aymericzip/intlayer-tanstack-start-template
|
|
22
20
|
---
|
|
23
21
|
|
|
24
|
-
# IntlayerとTanstack Start
|
|
22
|
+
# IntlayerとTanstack Startで始める国際化(i18n)
|
|
25
23
|
|
|
26
|
-
このガイドでは、Tanstack Startプロジェクトにおいて、ロケール対応ルーティング、TypeScriptサポート、最新の開発手法を活用しながら、**Intlayer
|
|
24
|
+
このガイドでは、Tanstack Startプロジェクトにおいて、ロケール対応ルーティング、TypeScriptサポート、最新の開発手法を活用しながら、**Intlayer**を使ったシームレスな国際化(i18n)の統合方法を示します。
|
|
27
25
|
|
|
28
26
|
## Intlayerとは?
|
|
29
27
|
|
|
@@ -33,8 +31,8 @@ Intlayerを使うことで、以下が可能になります:
|
|
|
33
31
|
|
|
34
32
|
- **コンポーネントレベルで宣言的な辞書を使い、翻訳を簡単に管理**できます。
|
|
35
33
|
- **メタデータ、ルート、コンテンツを動的にローカライズ**できます。
|
|
36
|
-
-
|
|
37
|
-
-
|
|
34
|
+
- **自動生成された型によりTypeScriptサポートを保証し、オートコンプリートやエラー検出を向上**させます。
|
|
35
|
+
- **動的なロケール検出や切り替えなどの高度な機能を活用**できます。
|
|
38
36
|
- **Tanstack Startのファイルベースのルーティングシステムを使ってロケール対応ルーティングを有効化**します。
|
|
39
37
|
|
|
40
38
|
---
|
|
@@ -43,7 +41,7 @@ Intlayerを使うことで、以下が可能になります:
|
|
|
43
41
|
|
|
44
42
|
### ステップ1:プロジェクトの作成
|
|
45
43
|
|
|
46
|
-
TanStack Startの公式サイトにある[
|
|
44
|
+
TanStack Startの公式サイトにある[新規プロジェクトの開始](https://tanstack.com/start/latest/docs/framework/react/quick-start)ガイドに従って、新しいTanStack Startプロジェクトを作成します。
|
|
47
45
|
|
|
48
46
|
### ステップ2:Intlayerパッケージのインストール
|
|
49
47
|
|
|
@@ -61,110 +59,64 @@ pnpm add vite-intlayer --save-dev
|
|
|
61
59
|
|
|
62
60
|
- **intlayer**
|
|
63
61
|
|
|
64
|
-
|
|
62
|
+
- **intlayer**
|
|
63
|
+
|
|
64
|
+
設定管理、翻訳、[コンテンツ宣言](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/dictionary/get_started.md)、トランスパイル、および[CLIコマンド](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/intlayer_cli.md)のための国際化ツールを提供するコアパッケージ。
|
|
65
|
+
|
|
66
|
+
- **react-intlayer**
|
|
67
|
+
|
|
68
|
+
IntlayerをReactアプリケーションに統合するパッケージです。Reactの国際化のためのコンテキストプロバイダーとフックを提供します。
|
|
65
69
|
|
|
66
|
-
- **
|
|
67
|
-
IntlayerをReactアプリケーションと統合するパッケージです。Reactの国際化のためのコンテキストプロバイダーやフックを提供します。
|
|
70
|
+
- **vite-intlayer**
|
|
68
71
|
|
|
69
|
-
|
|
70
|
-
Intlayerを[Viteバンドラー](https://vite.dev/guide/why.html#why-bundle-for-production)と統合するためのViteプラグインを含み、ユーザーの優先ロケール検出、クッキー管理、URLリダイレクト処理のためのミドルウェアも提供します。
|
|
72
|
+
Intlayerを[Viteバンドラー](https://vite.dev/guide/why.html#why-bundle-for-production)と統合するためのViteプラグイン、およびユーザーの優先ロケールの検出、クッキー管理、URLリダイレクト処理のためのミドルウェアを含みます。
|
|
71
73
|
|
|
72
74
|
### ステップ3: プロジェクトの設定
|
|
73
75
|
|
|
74
76
|
アプリケーションの言語を設定するための設定ファイルを作成します:
|
|
75
77
|
|
|
76
|
-
```typescript fileName="intlayer.config.ts"
|
|
78
|
+
```typescript fileName="intlayer.config.ts"
|
|
77
79
|
import type { IntlayerConfig } from "intlayer";
|
|
78
80
|
|
|
79
81
|
import { Locales } from "intlayer";
|
|
80
82
|
|
|
81
83
|
const config: IntlayerConfig = {
|
|
82
|
-
internationalization: {
|
|
83
|
-
defaultLocale: Locales.ENGLISH, // デフォルトのロケール
|
|
84
|
-
locales: [
|
|
85
|
-
Locales.ENGLISH, // 英語
|
|
86
|
-
Locales.FRENCH, // フランス語
|
|
87
|
-
Locales.SPANISH, // スペイン語
|
|
88
|
-
// 他のロケールを追加
|
|
89
|
-
],
|
|
90
|
-
},
|
|
91
|
-
};
|
|
92
|
-
|
|
93
|
-
export default config;
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
```javascript fileName="intlayer.config.mjs" codeFormat="esm"
|
|
97
|
-
import { Locales } from "intlayer";
|
|
98
|
-
|
|
99
|
-
/** @type {import('intlayer').IntlayerConfig} */
|
|
100
|
-
const config = {
|
|
101
|
-
internationalization: {
|
|
102
|
-
defaultLocale: Locales.ENGLISH, // デフォルトのロケール
|
|
103
|
-
locales: [
|
|
104
|
-
Locales.ENGLISH, // 英語
|
|
105
|
-
Locales.FRENCH, // フランス語
|
|
106
|
-
Locales.SPANISH, // スペイン語
|
|
107
|
-
// 他のロケール
|
|
108
|
-
],
|
|
109
|
-
},
|
|
110
|
-
};
|
|
111
|
-
|
|
112
|
-
export default config;
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
|
|
116
|
-
const { Locales } = require("intlayer");
|
|
117
|
-
|
|
118
|
-
/** @type {import('intlayer').IntlayerConfig} */
|
|
119
|
-
const config = {
|
|
120
84
|
internationalization: {
|
|
121
85
|
defaultLocale: Locales.ENGLISH,
|
|
122
|
-
locales: [
|
|
123
|
-
Locales.ENGLISH,
|
|
124
|
-
Locales.FRENCH,
|
|
125
|
-
Locales.SPANISH,
|
|
126
|
-
// 他のロケール
|
|
127
|
-
],
|
|
86
|
+
locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
|
|
128
87
|
},
|
|
129
88
|
};
|
|
130
89
|
|
|
131
|
-
|
|
90
|
+
export default config;
|
|
132
91
|
```
|
|
133
92
|
|
|
134
93
|
> この設定ファイルを通じて、ローカライズされたURL、ミドルウェアのリダイレクション、クッキー名、コンテンツ宣言の場所と拡張子、コンソールでのIntlayerログの無効化などを設定できます。利用可能なパラメータの完全なリストについては、[設定ドキュメント](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/configuration.md)を参照してください。
|
|
135
94
|
|
|
136
95
|
### ステップ4: Vite設定にIntlayerを統合する
|
|
137
96
|
|
|
138
|
-
設定にintlayer
|
|
97
|
+
設定にintlayerプラグインを追加します:
|
|
139
98
|
|
|
140
|
-
```typescript fileName="vite.config.ts"
|
|
99
|
+
```typescript fileName="vite.config.ts"
|
|
141
100
|
import { reactRouter } from "@react-router/dev/vite";
|
|
142
101
|
import { defineConfig } from "vite";
|
|
143
|
-
import {
|
|
102
|
+
import { intlayer } from "vite-intlayer";
|
|
144
103
|
import tsconfigPaths from "vite-tsconfig-paths";
|
|
145
104
|
|
|
146
105
|
export default defineConfig({
|
|
147
|
-
plugins: [
|
|
148
|
-
reactRouter(),
|
|
149
|
-
tsconfigPaths(),
|
|
150
|
-
intlayer(),
|
|
151
|
-
intlayerMiddlewarePlugin(),
|
|
152
|
-
],
|
|
106
|
+
plugins: [reactRouter(), tsconfigPaths(), intlayer()],
|
|
153
107
|
});
|
|
154
108
|
```
|
|
155
109
|
|
|
156
|
-
> `intlayer()` Viteプラグインは、IntlayerをVite
|
|
110
|
+
> `intlayer()` Viteプラグインは、IntlayerをViteと統合するために使用されます。これにより、コンテンツ宣言ファイルのビルドが保証され、開発モードで監視されます。また、Viteアプリケーション内でIntlayerの環境変数を定義します。さらに、パフォーマンス最適化のためのエイリアスも提供します。
|
|
157
111
|
|
|
158
|
-
### ステップ5:
|
|
112
|
+
### ステップ 5: レイアウトコンポーネントを作成する
|
|
159
113
|
|
|
160
|
-
|
|
114
|
+
ルートレイアウトとロケール固有のレイアウトを設定します:
|
|
161
115
|
|
|
162
116
|
#### ルートレイアウト
|
|
163
117
|
|
|
164
|
-
```tsx fileName="src/routes/{-$locale}/route.tsx"
|
|
165
|
-
// src/routes/{-$locale}/route.tsx
|
|
118
|
+
```tsx fileName="src/routes/{-$locale}/route.tsx"
|
|
166
119
|
import { createFileRoute, Navigate, Outlet } from "@tanstack/react-router";
|
|
167
|
-
import { configuration } from "intlayer";
|
|
168
120
|
import { IntlayerProvider, useLocale } from "react-intlayer";
|
|
169
121
|
|
|
170
122
|
import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes";
|
|
@@ -174,21 +126,22 @@ export const Route = createFileRoute("/{-$locale}")({
|
|
|
174
126
|
});
|
|
175
127
|
|
|
176
128
|
function LayoutComponent() {
|
|
129
|
+
const { defaultLocale } = useLocale();
|
|
177
130
|
const { locale } = Route.useParams();
|
|
178
131
|
|
|
179
132
|
return (
|
|
180
|
-
<IntlayerProvider locale={
|
|
133
|
+
<IntlayerProvider locale={defaultLocale}>
|
|
181
134
|
<Outlet />
|
|
182
135
|
</IntlayerProvider>
|
|
183
136
|
);
|
|
184
137
|
}
|
|
185
138
|
```
|
|
186
139
|
|
|
187
|
-
### ステップ6: コンテンツを宣言する
|
|
140
|
+
### ステップ 6: コンテンツを宣言する
|
|
188
141
|
|
|
189
|
-
|
|
142
|
+
翻訳を保存するためのコンテンツ宣言を作成および管理します:
|
|
190
143
|
|
|
191
|
-
```tsx fileName="src/contents/page.content.ts"
|
|
144
|
+
```tsx fileName="src/contents/page.content.ts"
|
|
192
145
|
import type { Dictionary } from "intlayer";
|
|
193
146
|
|
|
194
147
|
import { t } from "intlayer";
|
|
@@ -197,25 +150,29 @@ const appContent = {
|
|
|
197
150
|
content: {
|
|
198
151
|
links: {
|
|
199
152
|
about: t({
|
|
153
|
+
ja: "約",
|
|
200
154
|
en: "About",
|
|
201
155
|
es: "Acerca de",
|
|
202
156
|
fr: "À propos",
|
|
203
157
|
}),
|
|
204
158
|
home: t({
|
|
205
|
-
|
|
159
|
+
ja: "ホーム",
|
|
160
|
+
en: "Home",
|
|
206
161
|
es: "Inicio",
|
|
207
162
|
fr: "Accueil",
|
|
208
163
|
}),
|
|
209
164
|
},
|
|
210
165
|
meta: {
|
|
211
166
|
description: t({
|
|
212
|
-
|
|
167
|
+
ja: "これはIntlayerをTanStack Routerと一緒に使う例です",
|
|
168
|
+
en: "This is an example of using Intlayer with TanStack Router",
|
|
213
169
|
es: "Este es un ejemplo de uso de Intlayer con TanStack Router",
|
|
214
170
|
fr: "Ceci est un exemple d'utilisation d'Intlayer avec TanStack Router",
|
|
215
171
|
}),
|
|
216
172
|
},
|
|
217
173
|
title: t({
|
|
218
|
-
|
|
174
|
+
ja: "Intlayer + TanStack Routerへようこそ",
|
|
175
|
+
en: "Welcome to Intlayer + TanStack Router",
|
|
219
176
|
es: "Bienvenido a Intlayer + TanStack Router",
|
|
220
177
|
fr: "Bienvenue à Intlayer + TanStack Router",
|
|
221
178
|
}),
|
|
@@ -226,67 +183,107 @@ const appContent = {
|
|
|
226
183
|
export default appContent;
|
|
227
184
|
```
|
|
228
185
|
|
|
229
|
-
>
|
|
186
|
+
> コンテンツ宣言は、`contentDir` ディレクトリ(デフォルトは `./app`)に含まれている限り、アプリケーションのどこにでも定義できます。また、コンテンツ宣言ファイルの拡張子(デフォルトは `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`)に一致する必要があります。
|
|
230
187
|
|
|
231
188
|
> 詳細については、[コンテンツ宣言のドキュメント](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/dictionary/get_started.md)を参照してください。
|
|
232
189
|
|
|
233
|
-
### ステップ7:
|
|
190
|
+
### ステップ7: ロケール対応コンポーネントとフックの作成
|
|
234
191
|
|
|
235
192
|
ロケール対応のナビゲーション用に `LocalizedLink` コンポーネントを作成します:
|
|
236
193
|
|
|
237
|
-
```tsx fileName="src/components/localized-link.tsx"
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
import { Link, type
|
|
241
|
-
import { getLocalizedUrl } from "intlayer";
|
|
194
|
+
```tsx fileName="src/components/localized-link.tsx"
|
|
195
|
+
import type { FC } from "react";
|
|
196
|
+
|
|
197
|
+
import { Link, type LinkComponentProps } from "@tanstack/react-router";
|
|
242
198
|
import { useLocale } from "react-intlayer";
|
|
243
199
|
|
|
200
|
+
export const LOCALE_ROUTE = "{-$locale}" as const;
|
|
201
|
+
|
|
202
|
+
// メインユーティリティ
|
|
203
|
+
export type RemoveLocaleParam<T> = T extends string
|
|
204
|
+
? RemoveLocaleFromString<T>
|
|
205
|
+
: T;
|
|
206
|
+
|
|
207
|
+
export type To = RemoveLocaleParam<LinkComponentProps["to"]>;
|
|
208
|
+
|
|
209
|
+
type CollapseDoubleSlashes<S extends string> =
|
|
210
|
+
S extends `${infer H}//${infer T}` ? CollapseDoubleSlashes<`${H}/${T}`> : S;
|
|
211
|
+
|
|
244
212
|
type LocalizedLinkProps = {
|
|
245
|
-
to
|
|
246
|
-
} & Omit<
|
|
213
|
+
to?: To;
|
|
214
|
+
} & Omit<LinkComponentProps, "to">;
|
|
247
215
|
|
|
248
|
-
|
|
249
|
-
|
|
216
|
+
// ヘルパー
|
|
217
|
+
type RemoveAll<
|
|
218
|
+
S extends string,
|
|
219
|
+
Sub extends string,
|
|
220
|
+
> = S extends `${infer H}${Sub}${infer T}` ? RemoveAll<`${H}${T}`, Sub> : S;
|
|
250
221
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
222
|
+
type RemoveLocaleFromString<S extends string> = CollapseDoubleSlashes<
|
|
223
|
+
RemoveAll<S, typeof LOCALE_ROUTE>
|
|
224
|
+
>;
|
|
254
225
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
: getLocalizedUrl(props.to, locale);
|
|
226
|
+
export const LocalizedLink: FC<LocalizedLinkProps> = (props) => {
|
|
227
|
+
const { locale } = useLocale();
|
|
258
228
|
|
|
259
|
-
return
|
|
260
|
-
|
|
229
|
+
return (
|
|
230
|
+
<Link
|
|
231
|
+
{...props}
|
|
232
|
+
params={{
|
|
233
|
+
locale,
|
|
234
|
+
...(typeof props?.params === "object" ? props?.params : {}),
|
|
235
|
+
}}
|
|
236
|
+
to={`/${LOCALE_ROUTE}${props.to}` as LinkComponentProps["to"]}
|
|
237
|
+
/>
|
|
238
|
+
);
|
|
239
|
+
};
|
|
261
240
|
```
|
|
262
241
|
|
|
263
|
-
|
|
242
|
+
このコンポーネントには2つの目的があります:
|
|
264
243
|
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
import { getLocalizedUrl } from "intlayer";
|
|
270
|
-
import { useLocale } from "react-intlayer";
|
|
244
|
+
- URLから不要な `{-$locale}` プレフィックスを削除すること。
|
|
245
|
+
- ロケールパラメータをURLに注入し、ユーザーが直接ローカライズされたルートにリダイレクトされるようにすること。
|
|
246
|
+
|
|
247
|
+
次に、プログラム的なナビゲーションのために `useLocalizedNavigate` フックを作成できます:
|
|
271
248
|
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
}
|
|
249
|
+
```tsx fileName="src/hooks/useLocalizedNavigate.tsx"
|
|
250
|
+
import { useLocale } from "react.intlayer";
|
|
251
|
+
import { useNavigate } from "@tanstack/react-router";
|
|
252
|
+
import { LOCALE_ROUTE } from "@/components/localized-link";
|
|
253
|
+
import type { FileRouteTypes } from "@/routeTree.gen";
|
|
275
254
|
|
|
276
255
|
export const useLocalizedNavigate = () => {
|
|
277
256
|
const navigate = useNavigate();
|
|
257
|
+
|
|
278
258
|
const { locale } = useLocale();
|
|
279
259
|
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
260
|
+
type StripLocalePrefix<T extends string> = T extends
|
|
261
|
+
| `/${typeof LOCALE_ROUTE}`
|
|
262
|
+
| `/${typeof LOCALE_ROUTE}/`
|
|
263
|
+
? "/" // ロケールプレフィックスのみの場合はルートに置き換え
|
|
264
|
+
: T extends `/${typeof LOCALE_ROUTE}/${infer Rest}`
|
|
265
|
+
? `/${Rest}` // ロケールプレフィックスを除去したパス
|
|
266
|
+
: never;
|
|
267
|
+
|
|
268
|
+
type LocalizedTo = StripLocalePrefix<FileRouteTypes["to"]>;
|
|
269
|
+
|
|
270
|
+
interface LocalizedNavigate {
|
|
271
|
+
(to: LocalizedTo): ReturnType<typeof navigate>;
|
|
272
|
+
(
|
|
273
|
+
opts: { to: LocalizedTo } & Record<string, unknown>
|
|
274
|
+
): ReturnType<typeof navigate>;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
const localizedNavigate: LocalizedNavigate = (args: any) => {
|
|
278
|
+
if (typeof args === "string") {
|
|
279
|
+
return navigate({ to: `/${LOCALE_ROUTE}${args}`, params: { locale } });
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
const { to, ...rest } = args;
|
|
283
283
|
|
|
284
|
-
|
|
285
|
-
const to = isExternal(options.to)
|
|
286
|
-
? options.to
|
|
287
|
-
: getLocalizedUrl(options.to, locale);
|
|
284
|
+
const localedTo = `/${LOCALE_ROUTE}${to}` as any;
|
|
288
285
|
|
|
289
|
-
navigate({
|
|
286
|
+
return navigate({ to: localedTo, params: { locale, ...rest } as any });
|
|
290
287
|
};
|
|
291
288
|
|
|
292
289
|
return localizedNavigate;
|
|
@@ -295,25 +292,11 @@ export const useLocalizedNavigate = () => {
|
|
|
295
292
|
|
|
296
293
|
### ステップ8: ページでIntlayerを活用する
|
|
297
294
|
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
#### ルートリダイレクトページ
|
|
301
|
-
|
|
302
|
-
```tsx fileName="src/routes/page.tsx" codeFormat="typescript"
|
|
303
|
-
// src/routes/page.tsx
|
|
304
|
-
import { useLocale } from "react-intlayer";
|
|
305
|
-
import { Navigate } from "react-router";
|
|
306
|
-
|
|
307
|
-
export default function Page() {
|
|
308
|
-
const { locale } = useLocale();
|
|
309
|
-
|
|
310
|
-
return <Navigate replace to={locale} />;
|
|
311
|
-
}
|
|
312
|
-
```
|
|
295
|
+
アプリケーション全体でコンテンツ辞書にアクセスします:
|
|
313
296
|
|
|
314
297
|
#### ローカライズされたホームページ
|
|
315
298
|
|
|
316
|
-
```tsx fileName="src/routes/{-$locale}/index.tsx"
|
|
299
|
+
```tsx fileName="src/routes/{-$locale}/index.tsx"
|
|
317
300
|
import { createFileRoute } from "@tanstack/react-router";
|
|
318
301
|
import { getIntlayer } from "intlayer";
|
|
319
302
|
import { useIntlayer } from "react-intlayer";
|
|
@@ -342,16 +325,15 @@ function RouteComponent() {
|
|
|
342
325
|
const navigate = useLocalizedNavigate();
|
|
343
326
|
|
|
344
327
|
return (
|
|
345
|
-
<div
|
|
346
|
-
<div
|
|
328
|
+
<div>
|
|
329
|
+
<div>
|
|
347
330
|
{content.title}
|
|
348
331
|
<LocaleSwitcher />
|
|
349
|
-
<div
|
|
350
|
-
<a href="/">インデックス</a>
|
|
332
|
+
<div>
|
|
351
333
|
<LocalizedLink to="/">{content.links.home}</LocalizedLink>
|
|
352
334
|
<LocalizedLink to="/about">{content.links.about}</LocalizedLink>
|
|
353
335
|
</div>
|
|
354
|
-
<div
|
|
336
|
+
<div>
|
|
355
337
|
<button onClick={() => navigate({ to: "/" })}>
|
|
356
338
|
{content.links.home}
|
|
357
339
|
</button>
|
|
@@ -369,59 +351,67 @@ function RouteComponent() {
|
|
|
369
351
|
|
|
370
352
|
### ステップ9: ロケールスイッチャーコンポーネントの作成
|
|
371
353
|
|
|
372
|
-
|
|
354
|
+
ユーザーが言語を切り替えられるコンポーネントを作成します:
|
|
355
|
+
|
|
356
|
+
```tsx fileName="src/components/locale-switcher.tsx"
|
|
357
|
+
import type { FC } from "react";
|
|
373
358
|
|
|
374
|
-
```tsx fileName="src/components/locale-switcher.tsx" codeFormat="typescript"
|
|
375
359
|
import { useLocation } from "@tanstack/react-router";
|
|
376
|
-
import {
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
const {
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
const { availableLocales, locale, setLocale } = useLocale({
|
|
389
|
-
onLocaleChange: (newLocale) => {
|
|
390
|
-
const pathWithLocale = getLocalizedUrl(pathname + searchStr, newLocale);
|
|
391
|
-
location.replace(pathWithLocale);
|
|
392
|
-
},
|
|
393
|
-
});
|
|
360
|
+
import { getHTMLTextDir, getLocaleName, getPathWithoutLocale } from "intlayer";
|
|
361
|
+
import { setLocaleCookie, useIntlayer, useLocale } from "react-intlayer";
|
|
362
|
+
|
|
363
|
+
import { LocalizedLink, To } from "./localized-link";
|
|
364
|
+
|
|
365
|
+
export const LocaleSwitcher: FC = () => {
|
|
366
|
+
const { localeSwitcherLabel } = useIntlayer("locale-switcher");
|
|
367
|
+
const { pathname } = useLocation();
|
|
368
|
+
|
|
369
|
+
const { availableLocales, locale } = useLocale();
|
|
370
|
+
|
|
371
|
+
const pathWithoutLocale = getPathWithoutLocale(pathname);
|
|
394
372
|
|
|
395
373
|
return (
|
|
396
|
-
<
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
374
|
+
<ol>
|
|
375
|
+
{availableLocales.map((localeEl) => (
|
|
376
|
+
<li key={localeEl}>
|
|
377
|
+
<LocalizedLink
|
|
378
|
+
aria-current={localeEl === locale ? "page" : undefined}
|
|
379
|
+
aria-label={`${localeSwitcherLabel.value} ${getLocaleName(localeEl)}`}
|
|
380
|
+
onClick={() => setLocaleCookie(localeEl)}
|
|
381
|
+
params={{ locale: localeEl }}
|
|
382
|
+
to={pathWithoutLocale as To}
|
|
383
|
+
>
|
|
384
|
+
<span>
|
|
385
|
+
{/* ロケール - 例: FR */}
|
|
386
|
+
{localeItem}
|
|
387
|
+
</span>
|
|
388
|
+
<span>
|
|
389
|
+
{/* 自身のロケールでの言語名 - 例: Français */}
|
|
390
|
+
{getLocaleName(localeItem, locale)}
|
|
391
|
+
</span>
|
|
392
|
+
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
393
|
+
{/* 現在のロケールでの言語名 - 例: Locales.SPANISHに設定された場合のFrancés */}
|
|
394
|
+
{getLocaleName(localeItem)}
|
|
395
|
+
</span>
|
|
396
|
+
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
397
|
+
{/* 英語での言語名 - 例: French */}
|
|
398
|
+
{getLocaleName(localeItem, Locales.ENGLISH)}
|
|
399
|
+
</span>
|
|
400
|
+
</LocalizedLink>
|
|
401
|
+
</li>
|
|
412
402
|
))}
|
|
413
|
-
</
|
|
403
|
+
</ol>
|
|
414
404
|
);
|
|
415
|
-
}
|
|
405
|
+
};
|
|
416
406
|
```
|
|
417
407
|
|
|
418
408
|
> `useLocale` フックの詳細については、[ドキュメント](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/packages/react-intlayer/useLocale.md)を参照してください。
|
|
419
409
|
|
|
420
410
|
### ステップ10: HTML属性の管理を追加(オプション)
|
|
421
411
|
|
|
422
|
-
HTMLのlang
|
|
412
|
+
HTMLの `lang` と `dir` 属性を管理するフックを作成します:
|
|
423
413
|
|
|
424
|
-
```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx"
|
|
414
|
+
```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx"
|
|
425
415
|
// src/hooks/useI18nHTMLAttributes.tsx
|
|
426
416
|
import { getHTMLTextDir } from "intlayer";
|
|
427
417
|
import { useEffect } from "react";
|
|
@@ -431,17 +421,16 @@ export const useI18nHTMLAttributes = () => {
|
|
|
431
421
|
const { locale } = useLocale();
|
|
432
422
|
|
|
433
423
|
useEffect(() => {
|
|
434
|
-
document.documentElement.lang = locale;
|
|
435
|
-
document.documentElement.dir = getHTMLTextDir(locale);
|
|
424
|
+
document.documentElement.lang = locale;
|
|
425
|
+
document.documentElement.dir = getHTMLTextDir(locale);
|
|
436
426
|
}, [locale]);
|
|
437
427
|
};
|
|
438
428
|
```
|
|
439
429
|
|
|
440
430
|
次に、ルートコンポーネントでこれを使用します:
|
|
441
431
|
|
|
442
|
-
```tsx fileName="src/routes/{-$locale}/index.tsx"
|
|
432
|
+
```tsx fileName="src/routes/{-$locale}/index.tsx"
|
|
443
433
|
import { createFileRoute, Navigate, Outlet } from "@tanstack/react-router";
|
|
444
|
-
import { configuration } from "intlayer";
|
|
445
434
|
import { IntlayerProvider, useLocale } from "react-intlayer";
|
|
446
435
|
|
|
447
436
|
import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes"; // フックをインポート
|
|
@@ -453,153 +442,96 @@ export const Route = createFileRoute("/{-$locale}")({
|
|
|
453
442
|
function LayoutComponent() {
|
|
454
443
|
useI18nHTMLAttributes(); // この行を追加
|
|
455
444
|
|
|
445
|
+
const { defaultLocale } = useLocale();
|
|
456
446
|
const { locale } = Route.useParams();
|
|
457
447
|
|
|
458
448
|
return (
|
|
459
|
-
<IntlayerProvider locale={locale}>
|
|
449
|
+
<IntlayerProvider locale={locale ?? defaultLocale}>
|
|
460
450
|
<Outlet />
|
|
461
451
|
</IntlayerProvider>
|
|
462
452
|
);
|
|
463
453
|
}
|
|
464
454
|
```
|
|
465
455
|
|
|
466
|
-
|
|
456
|
+
---
|
|
467
457
|
|
|
468
|
-
|
|
458
|
+
### ステップ11: ミドルウェアを追加(オプション)
|
|
469
459
|
|
|
470
|
-
|
|
471
|
-
# Intlayerの辞書をビルド
|
|
472
|
-
npm run intlayer:build
|
|
460
|
+
`intlayerMiddleware` を使用して、アプリケーションにサーバーサイドルーティングを追加することもできます。このプラグインは、URL に基づいて現在のロケールを自動的に検出し、適切なロケールクッキーを設定します。ロケールが指定されていない場合、プラグインはユーザーのブラウザの言語設定に基づいて最も適切なロケールを判断します。ロケールが検出されない場合は、デフォルトのロケールにリダイレクトされます。
|
|
473
461
|
|
|
474
|
-
|
|
475
|
-
npm run dev
|
|
476
|
-
```
|
|
462
|
+
> `intlayerMiddleware` を本番環境で使用するには、`vite-intlayer` パッケージを `devDependencies` から `dependencies` に切り替える必要があることに注意してください。
|
|
477
463
|
|
|
478
|
-
```
|
|
479
|
-
|
|
480
|
-
|
|
464
|
+
```typescript {3,7} fileName="vite.config.ts"
|
|
465
|
+
import { reactRouter } from "@react-router/dev/vite";
|
|
466
|
+
import tailwindcss from "@tailwindcss/vite";
|
|
467
|
+
import { defineConfig } from "vite";
|
|
468
|
+
import { intlayer, intlayerMiddleware } from "vite-intlayer";
|
|
469
|
+
import tsconfigPaths from "vite-tsconfig-paths";
|
|
481
470
|
|
|
482
|
-
|
|
483
|
-
|
|
471
|
+
export default defineConfig({
|
|
472
|
+
plugins: [
|
|
473
|
+
tailwindcss(),
|
|
474
|
+
reactRouter(),
|
|
475
|
+
tsconfigPaths(),
|
|
476
|
+
intlayer(),
|
|
477
|
+
intlayerMiddleware(),
|
|
478
|
+
],
|
|
479
|
+
});
|
|
484
480
|
```
|
|
485
481
|
|
|
486
|
-
|
|
487
|
-
# Intlayerの辞書をビルド
|
|
488
|
-
yarn intlayer:build
|
|
489
|
-
|
|
490
|
-
# 開発サーバーを起動
|
|
491
|
-
yarn dev
|
|
492
|
-
```
|
|
482
|
+
---
|
|
493
483
|
|
|
494
484
|
### ステップ12: TypeScriptの設定(任意)
|
|
495
485
|
|
|
496
|
-
Intlayer
|
|
486
|
+
Intlayerはモジュール拡張を使用して、TypeScriptの利点を活かし、コードベースを強化します。
|
|
497
487
|
|
|
498
488
|
TypeScriptの設定に自動生成された型が含まれていることを確認してください:
|
|
499
489
|
|
|
500
490
|
```json5 fileName="tsconfig.json"
|
|
501
491
|
{
|
|
502
|
-
|
|
503
|
-
// ... 既存のTypeScript設定
|
|
504
|
-
},
|
|
492
|
+
// ... 既存の設定
|
|
505
493
|
include: [
|
|
506
|
-
// ...
|
|
494
|
+
// ... 既存のinclude
|
|
507
495
|
".intlayer/**/*.ts", // 自動生成された型を含める
|
|
508
496
|
],
|
|
509
497
|
}
|
|
510
498
|
```
|
|
511
499
|
|
|
512
|
-
|
|
500
|
+
---
|
|
501
|
+
|
|
502
|
+
### Gitの設定
|
|
513
503
|
|
|
514
|
-
Intlayer
|
|
504
|
+
Intlayerによって生成されたファイルはGitリポジトリにコミットしないように、無視することを推奨します。
|
|
515
505
|
|
|
516
|
-
これを行うには、`.gitignore
|
|
506
|
+
これを行うには、`.gitignore` ファイルに以下の指示を追加できます。
|
|
517
507
|
|
|
518
508
|
```plaintext fileName=".gitignore"
|
|
519
|
-
# Intlayerによって生成されたファイルを無視する
|
|
509
|
+
# Intlayer によって生成されたファイルを無視する
|
|
520
510
|
.intlayer
|
|
521
511
|
```
|
|
522
512
|
|
|
523
513
|
---
|
|
524
514
|
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
```typescript fileName="src/routes/{-$locale}/rotue.tsx" codeFormat="typescript"
|
|
528
|
-
function LayoutComponent() {
|
|
529
|
-
useI18nHTMLAttributes();
|
|
530
|
-
|
|
531
|
-
const { locale } = Route.useParams();
|
|
532
|
-
const { locale: selectedLocale } = useLocale();
|
|
533
|
-
const { defaultLocale } = configuration.internationalization;
|
|
534
|
-
const { prefixDefault } = configuration.middleware;
|
|
535
|
-
|
|
536
|
-
// prefixDefault が true の場合、URL にロケールが存在しないときはデフォルトロケールへリダイレクトする
|
|
537
|
-
if (selectedLocale === defaultLocale && !locale && prefixDefault) {
|
|
538
|
-
return <Navigate replace to={defaultLocale} />;
|
|
539
|
-
}
|
|
540
|
-
|
|
541
|
-
// URL のロケールが選択されたロケールと一致しない場合は選択されたロケールへリダイレクトする
|
|
542
|
-
if (selectedLocale !== defaultLocale && !locale) {
|
|
543
|
-
return <Navigate replace to={selectedLocale} />;
|
|
544
|
-
}
|
|
545
|
-
|
|
546
|
-
return (
|
|
547
|
-
<IntlayerProvider locale={locale}>
|
|
548
|
-
<Outlet />
|
|
549
|
-
</IntlayerProvider>
|
|
550
|
-
);
|
|
551
|
-
}
|
|
552
|
-
```
|
|
553
|
-
|
|
554
|
-
## 本番環境へのデプロイ
|
|
555
|
-
|
|
556
|
-
アプリケーションをデプロイする際は、以下の手順を行ってください:
|
|
557
|
-
|
|
558
|
-
1. **アプリケーションをビルドする:**
|
|
559
|
-
|
|
560
|
-
```bash
|
|
561
|
-
npm run build
|
|
562
|
-
```
|
|
563
|
-
|
|
564
|
-
2. **Intlayerの辞書をビルドする:**
|
|
565
|
-
|
|
566
|
-
```bash
|
|
567
|
-
npm run intlayer:build
|
|
568
|
-
```
|
|
569
|
-
|
|
570
|
-
3. **本番環境でミドルウェアを使用する場合は、`vite-intlayer`を依存関係に移動する:**
|
|
571
|
-
```bash
|
|
572
|
-
npm install vite-intlayer --save
|
|
573
|
-
```
|
|
574
|
-
|
|
575
|
-
これでアプリケーションは以下をサポートします:
|
|
576
|
-
|
|
577
|
-
- **URL構造**: `/en`, `/en/about`, `/tr`, `/tr/about`
|
|
578
|
-
- **ブラウザの設定に基づく自動ロケール検出**
|
|
579
|
-
- **Tanstack Startによるロケール対応ルーティング**
|
|
580
|
-
- **自動生成された型定義によるTypeScriptサポート**
|
|
581
|
-
- **適切なロケール処理を行うサーバーサイドレンダリング**
|
|
582
|
-
|
|
583
|
-
## VS Code拡張機能
|
|
515
|
+
## VS Code 拡張機能
|
|
584
516
|
|
|
585
|
-
Intlayer
|
|
517
|
+
Intlayer での開発体験を向上させるために、公式の **Intlayer VS Code 拡張機能** をインストールできます。
|
|
586
518
|
|
|
587
|
-
[VS Code
|
|
519
|
+
[VS Code Marketplace からインストール](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
|
|
588
520
|
|
|
589
521
|
この拡張機能は以下を提供します:
|
|
590
522
|
|
|
591
|
-
-
|
|
592
|
-
-
|
|
593
|
-
-
|
|
594
|
-
-
|
|
523
|
+
- 翻訳キーの **オートコンプリート**。
|
|
524
|
+
- 翻訳が欠落している場合の **リアルタイムエラー検出**。
|
|
525
|
+
- 翻訳されたコンテンツの **インラインプレビュー**。
|
|
526
|
+
- 翻訳を簡単に作成・更新できる **クイックアクション**。
|
|
595
527
|
|
|
596
|
-
|
|
528
|
+
拡張機能の使用方法の詳細については、[Intlayer VS Code 拡張機能のドキュメント](https://intlayer.org/doc/vs-code-extension)を参照してください。
|
|
597
529
|
|
|
598
530
|
---
|
|
599
531
|
|
|
600
|
-
##
|
|
532
|
+
## さらに進むために
|
|
601
533
|
|
|
602
|
-
|
|
534
|
+
さらに進みたい場合は、[ビジュアルエディター](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/intlayer_visual_editor.md)を実装するか、[CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/intlayer_CMS.md)を使用してコンテンツを外部化することができます。
|
|
603
535
|
|
|
604
536
|
---
|
|
605
537
|
|
|
@@ -612,10 +544,10 @@ Intlayerでの開発体験を向上させるために、公式の**Intlayer VS C
|
|
|
612
544
|
- [コンテンツ宣言](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/dictionary/get_started.md)
|
|
613
545
|
- [設定](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/configuration.md)
|
|
614
546
|
|
|
615
|
-
この包括的なガイドは、IntlayerをTanstack Startと統合し、ロケール対応のルーティングとTypeScriptサポートを備えた完全な国際化アプリケーションを構築するために必要なすべてを提供します。
|
|
547
|
+
この包括的なガイドは、Intlayer を Tanstack Start と統合し、ロケール対応のルーティングと TypeScript サポートを備えた完全な国際化アプリケーションを構築するために必要なすべてを提供します。
|
|
616
548
|
|
|
617
549
|
## ドキュメント履歴
|
|
618
550
|
|
|
619
|
-
| バージョン | 日付 | 変更内容
|
|
620
|
-
| ---------- | ---------- |
|
|
621
|
-
| 5.8.1 | 2025-09-09 | Tanstack Start
|
|
551
|
+
| バージョン | 日付 | 変更内容 |
|
|
552
|
+
| ---------- | ---------- | ----------------------- |
|
|
553
|
+
| 5.8.1 | 2025-09-09 | Tanstack Start 用に追加 |
|