@intlayer/docs 8.6.0 → 8.6.10
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/dist/cjs/doc.cjs.map +1 -1
- package/dist/cjs/generated/docs.entry.cjs +60 -0
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/esm/doc.mjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +60 -0
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/types/doc.d.ts.map +1 -1
- package/dist/types/generated/docs.entry.d.ts +3 -0
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/docs/ar/cli/index.md +54 -42
- package/docs/ar/cli/init.md +32 -20
- package/docs/ar/cli/standalone.md +91 -0
- package/docs/ar/configuration.md +39 -7
- package/docs/ar/custom_domains.md +250 -0
- package/docs/ar/intlayer_with_tanstack+solid.md +14 -33
- package/docs/ar/intlayer_with_tanstack.md +25 -16
- package/docs/ar/intlayer_with_vanilla.md +506 -0
- package/docs/bn/cli/index.md +195 -0
- package/docs/bn/cli/init.md +96 -0
- package/docs/bn/cli/standalone.md +91 -0
- package/docs/bn/configuration.md +46 -14
- package/docs/bn/custom_domains.md +250 -0
- package/docs/bn/intlayer_with_vanilla.md +506 -0
- package/docs/cs/cli/index.md +195 -0
- package/docs/cs/cli/init.md +96 -0
- package/docs/cs/cli/standalone.md +91 -0
- package/docs/cs/configuration.md +46 -7
- package/docs/cs/custom_domains.md +250 -0
- package/docs/cs/intlayer_with_vanilla.md +506 -0
- package/docs/de/cli/index.md +53 -41
- package/docs/de/cli/standalone.md +91 -0
- package/docs/de/configuration.md +46 -7
- package/docs/de/custom_domains.md +250 -0
- package/docs/de/intlayer_with_tanstack+solid.md +15 -36
- package/docs/de/intlayer_with_tanstack.md +25 -16
- package/docs/de/intlayer_with_vanilla.md +506 -0
- package/docs/en/bundle_optimization.md +288 -23
- package/docs/en/cli/index.md +6 -1
- package/docs/en/cli/init.md +13 -1
- package/docs/en/cli/standalone.md +91 -0
- package/docs/en/configuration.md +46 -7
- package/docs/en/custom_domains.md +245 -0
- package/docs/en/intlayer_with_tanstack+solid.md +15 -36
- package/docs/en/intlayer_with_tanstack.md +25 -16
- package/docs/en/intlayer_with_vanilla.md +506 -0
- package/docs/en-GB/cli/index.md +56 -44
- package/docs/en-GB/cli/init.md +28 -21
- package/docs/en-GB/cli/standalone.md +91 -0
- package/docs/en-GB/configuration.md +53 -14
- package/docs/en-GB/custom_domains.md +250 -0
- package/docs/en-GB/intlayer_with_tanstack+solid.md +15 -36
- package/docs/en-GB/intlayer_with_tanstack.md +25 -16
- package/docs/en-GB/intlayer_with_vanilla.md +506 -0
- package/docs/es/cli/index.md +65 -53
- package/docs/es/cli/init.md +33 -21
- package/docs/es/cli/standalone.md +91 -0
- package/docs/es/configuration.md +39 -1
- package/docs/es/custom_domains.md +250 -0
- package/docs/es/intlayer_with_tanstack+solid.md +15 -36
- package/docs/es/intlayer_with_tanstack.md +25 -16
- package/docs/es/intlayer_with_vanilla.md +506 -0
- package/docs/fr/cli/index.md +43 -31
- package/docs/fr/cli/init.md +37 -25
- package/docs/fr/cli/standalone.md +91 -0
- package/docs/fr/configuration.md +46 -7
- package/docs/fr/custom_domains.md +250 -0
- package/docs/fr/intlayer_with_tanstack+solid.md +15 -36
- package/docs/fr/intlayer_with_tanstack.md +25 -16
- package/docs/fr/intlayer_with_vanilla.md +506 -0
- package/docs/hi/cli/index.md +71 -59
- package/docs/hi/cli/init.md +37 -33
- package/docs/hi/cli/standalone.md +91 -0
- package/docs/hi/configuration.md +39 -7
- package/docs/hi/custom_domains.md +250 -0
- package/docs/hi/intlayer_with_tanstack+solid.md +14 -33
- package/docs/hi/intlayer_with_tanstack.md +25 -16
- package/docs/hi/intlayer_with_vanilla.md +506 -0
- package/docs/id/cli/index.md +59 -47
- package/docs/id/cli/init.md +32 -25
- package/docs/id/cli/standalone.md +91 -0
- package/docs/id/configuration.md +46 -7
- package/docs/id/custom_domains.md +250 -0
- package/docs/id/intlayer_with_tanstack+solid.md +14 -33
- package/docs/id/intlayer_with_tanstack.md +25 -16
- package/docs/id/intlayer_with_vanilla.md +506 -0
- package/docs/it/cli/index.md +58 -41
- package/docs/it/cli/init.md +37 -38
- package/docs/it/cli/standalone.md +91 -0
- package/docs/it/configuration.md +46 -7
- package/docs/it/custom_domains.md +250 -0
- package/docs/it/intlayer_with_tanstack+solid.md +15 -36
- package/docs/it/intlayer_with_tanstack.md +25 -16
- package/docs/it/intlayer_with_vanilla.md +506 -0
- package/docs/ja/cli/index.md +59 -47
- package/docs/ja/cli/init.md +36 -24
- package/docs/ja/cli/standalone.md +91 -0
- package/docs/ja/configuration.md +46 -7
- package/docs/ja/custom_domains.md +250 -0
- package/docs/ja/intlayer_with_tanstack+solid.md +15 -36
- package/docs/ja/intlayer_with_tanstack.md +25 -16
- package/docs/ja/intlayer_with_vanilla.md +506 -0
- package/docs/ko/cli/index.md +58 -46
- package/docs/ko/cli/init.md +39 -35
- package/docs/ko/cli/standalone.md +91 -0
- package/docs/ko/configuration.md +47 -8
- package/docs/ko/custom_domains.md +250 -0
- package/docs/ko/intlayer_with_tanstack+solid.md +15 -36
- package/docs/ko/intlayer_with_tanstack.md +25 -16
- package/docs/ko/intlayer_with_vanilla.md +506 -0
- package/docs/nl/cli/index.md +195 -0
- package/docs/nl/cli/init.md +96 -0
- package/docs/nl/cli/standalone.md +91 -0
- package/docs/nl/configuration.md +46 -7
- package/docs/nl/custom_domains.md +250 -0
- package/docs/nl/intlayer_with_vanilla.md +506 -0
- package/docs/pl/cli/index.md +56 -44
- package/docs/pl/cli/init.md +36 -32
- package/docs/pl/cli/standalone.md +91 -0
- package/docs/pl/configuration.md +46 -7
- package/docs/pl/custom_domains.md +250 -0
- package/docs/pl/intlayer_with_tanstack+solid.md +14 -33
- package/docs/pl/intlayer_with_tanstack.md +25 -16
- package/docs/pl/intlayer_with_vanilla.md +506 -0
- package/docs/pt/cli/index.md +64 -52
- package/docs/pt/cli/init.md +35 -31
- package/docs/pt/cli/standalone.md +91 -0
- package/docs/pt/configuration.md +46 -7
- package/docs/pt/custom_domains.md +250 -0
- package/docs/pt/intlayer_with_tanstack+solid.md +15 -36
- package/docs/pt/intlayer_with_tanstack.md +25 -16
- package/docs/pt/intlayer_with_vanilla.md +506 -0
- package/docs/ru/cli/index.md +54 -42
- package/docs/ru/cli/init.md +31 -27
- package/docs/ru/cli/standalone.md +91 -0
- package/docs/ru/configuration.md +46 -7
- package/docs/ru/custom_domains.md +250 -0
- package/docs/ru/intlayer_with_tanstack+solid.md +15 -36
- package/docs/ru/intlayer_with_tanstack.md +25 -16
- package/docs/ru/intlayer_with_vanilla.md +506 -0
- package/docs/tr/cli/index.md +64 -52
- package/docs/tr/cli/init.md +37 -30
- package/docs/tr/cli/standalone.md +91 -0
- package/docs/tr/configuration.md +46 -7
- package/docs/tr/custom_domains.md +250 -0
- package/docs/tr/intlayer_with_tanstack+solid.md +14 -33
- package/docs/tr/intlayer_with_tanstack.md +25 -16
- package/docs/tr/intlayer_with_vanilla.md +506 -0
- package/docs/uk/cli/index.md +60 -55
- package/docs/uk/cli/init.md +32 -20
- package/docs/uk/cli/standalone.md +91 -0
- package/docs/uk/configuration.md +46 -7
- package/docs/uk/custom_domains.md +250 -0
- package/docs/uk/intlayer_with_tanstack+solid.md +14 -33
- package/docs/uk/intlayer_with_tanstack.md +25 -16
- package/docs/uk/intlayer_with_vanilla.md +506 -0
- package/docs/ur/cli/index.md +195 -0
- package/docs/ur/cli/init.md +96 -0
- package/docs/ur/cli/standalone.md +91 -0
- package/docs/ur/configuration.md +46 -7
- package/docs/ur/custom_domains.md +250 -0
- package/docs/ur/intlayer_with_vanilla.md +506 -0
- package/docs/vi/cli/index.md +72 -61
- package/docs/vi/cli/init.md +33 -21
- package/docs/vi/cli/standalone.md +91 -0
- package/docs/vi/configuration.md +46 -7
- package/docs/vi/custom_domains.md +250 -0
- package/docs/vi/intlayer_with_tanstack+solid.md +14 -33
- package/docs/vi/intlayer_with_tanstack.md +25 -16
- package/docs/vi/intlayer_with_vanilla.md +506 -0
- package/docs/zh/cli/index.md +56 -49
- package/docs/zh/cli/init.md +30 -18
- package/docs/zh/cli/standalone.md +91 -0
- package/docs/zh/configuration.md +46 -7
- package/docs/zh/custom_domains.md +250 -0
- package/docs/zh/intlayer_with_tanstack+solid.md +15 -36
- package/docs/zh/intlayer_with_tanstack.md +25 -16
- package/docs/zh/intlayer_with_vanilla.md +506 -0
- package/package.json +8 -8
- package/src/doc.ts +4 -1
- package/src/generated/docs.entry.ts +60 -0
- package/docs/ar/bundle_optimization.md +0 -185
- package/docs/de/bundle_optimization.md +0 -195
- package/docs/en-GB/bundle_optimization.md +0 -184
- package/docs/es/bundle_optimization.md +0 -194
- package/docs/fr/bundle_optimization.md +0 -184
- package/docs/hi/bundle_optimization.md +0 -185
- package/docs/id/bundle_optimization.md +0 -185
- package/docs/it/bundle_optimization.md +0 -185
- package/docs/ja/bundle_optimization.md +0 -185
- package/docs/ko/bundle_optimization.md +0 -185
- package/docs/pl/bundle_optimization.md +0 -185
- package/docs/pt/bundle_optimization.md +0 -184
- package/docs/ru/bundle_optimization.md +0 -185
- package/docs/tr/bundle_optimization.md +0 -184
- package/docs/uk/bundle_optimization.md +0 -186
- package/docs/vi/bundle_optimization.md +0 -185
- package/docs/zh/bundle_optimization.md +0 -185
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2026-04-02
|
|
3
|
+
updatedAt: 2026-04-02
|
|
4
|
+
title: カスタムドメイン
|
|
5
|
+
description: Intlayerでのドメインベースのロケールルーティングを設定し、専用のホスト名から異なるロケールを提供する方法を学びます。
|
|
6
|
+
keywords:
|
|
7
|
+
- カスタムドメイン
|
|
8
|
+
- ドメインルーティング
|
|
9
|
+
- ルーティング
|
|
10
|
+
- 国際化
|
|
11
|
+
- i18n
|
|
12
|
+
slugs:
|
|
13
|
+
- doc
|
|
14
|
+
- concept
|
|
15
|
+
- custom_domains
|
|
16
|
+
history:
|
|
17
|
+
- version: 8.5.0
|
|
18
|
+
date: 2026-04-02
|
|
19
|
+
changes: "routing.domains設定によるドメインベースのロケールルーティングを追加。"
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
# カスタムドメイン
|
|
23
|
+
|
|
24
|
+
Intlayerはドメインベースのロケールルーティングをサポートしており、専用のホスト名から特定のロケールを提供できます。たとえば、中国の訪問者を `intlayer.org/zh` ではなく `intlayer.zh` に誘導できます。
|
|
25
|
+
|
|
26
|
+
## 仕組み
|
|
27
|
+
|
|
28
|
+
`routing` の `domains` マップは、各ロケールをホスト名に関連付けます。Intlayerはこのマップを次の2か所で使用します。
|
|
29
|
+
|
|
30
|
+
1. **URLの生成** (`getLocalizedUrl`): ターゲットのロケールが現在のページとは _異なる_ ドメインにある場合、絶対URLが返されます(例: `https://intlayer.zh/about`)。両方のドメインが一致する場合、相対URLが返されます(例: `/fr/about`)。
|
|
31
|
+
2. **サーバープロキシ**(Next.js & Vite): 着信リクエストは、到着したドメインに基づいてリダイレクトまたはリライトされます。
|
|
32
|
+
|
|
33
|
+
### 排他的ドメイン vs 共有ドメイン
|
|
34
|
+
|
|
35
|
+
主な違いは **排他性** です。
|
|
36
|
+
|
|
37
|
+
- **排他的ドメイン** — 1つのロケールのみがそのホスト名にマップされます(例: `zh → intlayer.zh`)。ドメイン自体がロケールを識別するため、パスにロケールプレフィックスは追加されません。 `https://intlayer.zh/about` は中国語のコンテンツを提供します。
|
|
38
|
+
- **共有ドメイン** — 複数のロケールが同じホスト名にマップされます(例: `en` と `fr` の両方が `intlayer.org` にマップされます)。通常のプレフィックスベースのルーティングが適用されます。 `intlayer.org/fr/about` はフランス語のコンテンツを提供します。
|
|
39
|
+
|
|
40
|
+
## 設定
|
|
41
|
+
|
|
42
|
+
```typescript fileName="intlayer.config.ts"
|
|
43
|
+
import { Locales, type IntlayerConfig } from "intlayer";
|
|
44
|
+
|
|
45
|
+
const config: IntlayerConfig = {
|
|
46
|
+
internationalization: {
|
|
47
|
+
locales: [
|
|
48
|
+
Locales.ENGLISH,
|
|
49
|
+
Locales.FRENCH,
|
|
50
|
+
Locales.SPANISH,
|
|
51
|
+
Locales.CHINESE,
|
|
52
|
+
],
|
|
53
|
+
defaultLocale: Locales.ENGLISH,
|
|
54
|
+
},
|
|
55
|
+
routing: {
|
|
56
|
+
mode: "prefix-no-default",
|
|
57
|
+
domains: {
|
|
58
|
+
// 共有ドメイン — enとfrはintlayer.orgでプレフィックスルーティングを使用
|
|
59
|
+
en: "intlayer.org",
|
|
60
|
+
// 排他的ドメイン — zhは独自のホスト名を持ち、/zh/プレフィックスは不要
|
|
61
|
+
zh: "intlayer.zh",
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
export default config;
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
`domains` にリストされていないロケールは、ドメインの上書きなしで標準のプレフィックスルーティングを引き続き使用します。
|
|
70
|
+
|
|
71
|
+
## URLの生成
|
|
72
|
+
|
|
73
|
+
`getLocalizedUrl` は、呼び出しコンテキストに基づいて正しいURLタイプを自動的に生成します。
|
|
74
|
+
|
|
75
|
+
### 同一ドメインのロケール(相対URL)
|
|
76
|
+
|
|
77
|
+
```ts
|
|
78
|
+
// 現在のページ: intlayer.org/about
|
|
79
|
+
getLocalizedUrl("/about", "fr", { currentDomain: "intlayer.org" });
|
|
80
|
+
// → "/fr/about"
|
|
81
|
+
|
|
82
|
+
getLocalizedUrl("/about", "en", { currentDomain: "intlayer.org" });
|
|
83
|
+
// → "/about" (デフォルトのロケール、プレフィックスなし)
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### ドメインをまたぐロケール(絶対URL)
|
|
87
|
+
|
|
88
|
+
```ts
|
|
89
|
+
// 現在のページ: intlayer.org/about
|
|
90
|
+
getLocalizedUrl("/about", "zh", { currentDomain: "intlayer.org" });
|
|
91
|
+
// → "https://intlayer.zh/about" (排他的ドメイン、/zh/プレフィックスなし)
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### ロケール自身のドメインからの提供
|
|
95
|
+
|
|
96
|
+
```ts
|
|
97
|
+
// 現在のページ: intlayer.zh/about
|
|
98
|
+
getLocalizedUrl("/about", "zh", { currentDomain: "intlayer.zh" });
|
|
99
|
+
// → "/about" (すでに正しいドメイン上にある — 相対URL)
|
|
100
|
+
|
|
101
|
+
getLocalizedUrl("/about", "fr", { currentDomain: "intlayer.zh" });
|
|
102
|
+
// → "https://intlayer.org/fr/about" (intlayer.orgへのドメイン間リンク)
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### 現在のドメインの自動検出
|
|
106
|
+
|
|
107
|
+
`currentDomain` はオプションです。省略した場合、 `getLocalizedUrl` は次の順序で解決します。
|
|
108
|
+
|
|
109
|
+
1. 絶対入力URLのホスト名(例: `https://intlayer.org/about` → `intlayer.org`)。
|
|
110
|
+
2. ブラウザ環境における `window.location.hostname`。
|
|
111
|
+
3. いずれも利用できない場合(明示的なオプションなしのSSR)、同一ドメインのロケールに対して相対URLが返され、絶対URLは生成されません。これが安全なフォールバックです。
|
|
112
|
+
|
|
113
|
+
```ts
|
|
114
|
+
// ブラウザ — window.location.hostname === 'intlayer.org'
|
|
115
|
+
getLocalizedUrl("/about", "zh");
|
|
116
|
+
// → "https://intlayer.zh/about" (windowから自動検出)
|
|
117
|
+
|
|
118
|
+
// 絶対URLから — ドメインを自動検出
|
|
119
|
+
getLocalizedUrl("https://intlayer.org/about", "zh");
|
|
120
|
+
// → "https://intlayer.zh/about"
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### ドメインを使用した `getMultilingualUrls`
|
|
124
|
+
|
|
125
|
+
`getMultilingualUrls` はすべてのロケールに対して `getLocalizedUrl` を呼び出すため、呼び出し元のドメインに応じて相対URLと絶対URLが混在して生成されます。
|
|
126
|
+
|
|
127
|
+
```ts
|
|
128
|
+
// currentDomain: 'intlayer.org'
|
|
129
|
+
getMultilingualUrls("/about", { currentDomain: "intlayer.org" });
|
|
130
|
+
// {
|
|
131
|
+
// en: "/about",
|
|
132
|
+
// fr: "/fr/about",
|
|
133
|
+
// es: "/es/about",
|
|
134
|
+
// zh: "https://intlayer.zh/about",
|
|
135
|
+
// }
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
これらの絶対URLは、SEO用の `<link rel="alternate" hreflang="...">` タグですぐに使用できます。
|
|
139
|
+
|
|
140
|
+
## プロキシの動作
|
|
141
|
+
|
|
142
|
+
### Next.js
|
|
143
|
+
|
|
144
|
+
`intlayerProxy` ミドルウェアはドメインルーティングを自動的に処理します。 `middleware.ts` に追加してください。
|
|
145
|
+
|
|
146
|
+
```typescript fileName="middleware.ts"
|
|
147
|
+
export { intlayerProxy as default } from "next-intlayer/proxy";
|
|
148
|
+
|
|
149
|
+
export const config = {
|
|
150
|
+
matcher: "/((?!api|static|assets|robots|sitemap|.*\\..*|_next).*)",
|
|
151
|
+
};
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
**リダイレクト** — 指定されたロケールプレフィックスに対してリクエストが間違ったドメインに到着した場合:
|
|
155
|
+
|
|
156
|
+
```
|
|
157
|
+
GET intlayer.org/zh/about
|
|
158
|
+
→ 301 https://intlayer.zh/about
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
**リライト** — プレフィックスなしでロケールの排他的ドメインにリクエストが到着した場合:
|
|
162
|
+
|
|
163
|
+
```
|
|
164
|
+
GET intlayer.zh/about
|
|
165
|
+
→ /zh/about へのリライト(Next.jsの内部ルーティングのみ、URLはきれいなまま)
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### Vite
|
|
169
|
+
|
|
170
|
+
`intlayerProxy` Viteプラグインは、開発中に同じロジックを適用します。
|
|
171
|
+
|
|
172
|
+
```typescript fileName="vite.config.ts"
|
|
173
|
+
import { defineConfig } from "vite";
|
|
174
|
+
import { intlayerProxy } from "vite-intlayer";
|
|
175
|
+
|
|
176
|
+
export default defineConfig({
|
|
177
|
+
plugins: [intlayerProxy()],
|
|
178
|
+
});
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
> **注意**: ローカル開発では通常 `localhost` 上にいるため、ドメイン間のリダイレクトは別のローカルポートではなくライブドメインを指します。マルチドメインルーティングをローカルでテストする必要がある場合は、hostsファイルの上書き(例: `127.0.0.1 intlayer.zh`)またはリバースプロキシを使用してください。
|
|
182
|
+
|
|
183
|
+
## ロケールスイッチャー
|
|
184
|
+
|
|
185
|
+
`next-intlayer` の `useLocale` フックは、ドメインを認識したナビゲーションを自動的に処理します。ユーザーが別のドメインのロケールに切り替えると、Next.jsルーターはオリジンを越えることができないため、フックはクライアント側のルータープッシュではなく、フルページナビゲーション( `window.location.href` )を実行します。
|
|
186
|
+
|
|
187
|
+
```tsx fileName="components/LocaleSwitcher.tsx"
|
|
188
|
+
"use client";
|
|
189
|
+
|
|
190
|
+
import { useLocale } from "next-intlayer";
|
|
191
|
+
|
|
192
|
+
export const LocaleSwitcher = () => {
|
|
193
|
+
const { availableLocales, locale, setLocale } = useLocale();
|
|
194
|
+
|
|
195
|
+
return (
|
|
196
|
+
<ul>
|
|
197
|
+
{availableLocales.map((localeEl) => (
|
|
198
|
+
<li key={localeEl}>
|
|
199
|
+
<button
|
|
200
|
+
onClick={() => setLocale(localeEl)}
|
|
201
|
+
aria-current={localeEl === locale ? "true" : undefined}
|
|
202
|
+
>
|
|
203
|
+
{l.toUpperCase()}
|
|
204
|
+
</button>
|
|
205
|
+
</li>
|
|
206
|
+
))}
|
|
207
|
+
</ul>
|
|
208
|
+
);
|
|
209
|
+
};
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
追加の設定は不要です。 `useLocale` は内部的に `window.location.hostname` を検出し、 `router.replace` (同一ドメイン)と `window.location.href` (ドメイン間)のどちらかを選択します。
|
|
213
|
+
|
|
214
|
+
## SEO: `hreflang` 代替リンク
|
|
215
|
+
|
|
216
|
+
ドメインベースのルーティングは、検索エンジンに各言語でインデックスを作成するURLを伝えるために、 `hreflang` と共に一般的に使用されます。 `getMultilingualUrls` を使用して、代替URLの完全なセットを生成します。
|
|
217
|
+
|
|
218
|
+
```tsx fileName="app/[locale]/layout.tsx"
|
|
219
|
+
import { getMultilingualUrls } from "intlayer";
|
|
220
|
+
import type { Metadata } from "next";
|
|
221
|
+
|
|
222
|
+
export const generateMetadata = (): Metadata => {
|
|
223
|
+
const alternates = getMultilingualUrls("/", {
|
|
224
|
+
currentDomain: process.env.NEXT_PUBLIC_DOMAIN, // 例: "intlayer.org"
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
return {
|
|
228
|
+
alternates: {
|
|
229
|
+
languages: alternates,
|
|
230
|
+
},
|
|
231
|
+
};
|
|
232
|
+
};
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
これにより、以下が生成されます。
|
|
236
|
+
|
|
237
|
+
```html
|
|
238
|
+
<link rel="alternate" hreflang="en" href="https://intlayer.org/" />
|
|
239
|
+
<link rel="alternate" hreflang="fr" href="https://intlayer.org/fr/" />
|
|
240
|
+
<link rel="alternate" hreflang="es" href="https://intlayer.org/es/" />
|
|
241
|
+
<link rel="alternate" hreflang="zh" href="https://intlayer.zh/" />
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
## コアユーティリティ
|
|
245
|
+
|
|
246
|
+
| ユーティリティ | 説明 |
|
|
247
|
+
| ------------------------------------------------- | ------------------------------------------------------------------------------------------------------ |
|
|
248
|
+
| `getLocalizedUrl(url, locale, { currentDomain })` | ターゲットロケールが現在のドメインにあるかどうかに応じて、相対URLまたは絶対URLを返します。 |
|
|
249
|
+
| `getMultilingualUrls(url, { currentDomain })` | 必要に応じて相対URLと絶対URLを混合し、ロケールをキーとしたローカライズ済みURLのマップを返します。 |
|
|
250
|
+
| `getPrefix(locale, { domains })` | 排他的ドメインのロケールには空のプレフィックスを返し、それ以外の場合は通常のプレフィックスを返します。 |
|
|
@@ -17,6 +17,7 @@ slugs:
|
|
|
17
17
|
- doc
|
|
18
18
|
- environment
|
|
19
19
|
- tanstack-start
|
|
20
|
+
- solid
|
|
20
21
|
applicationTemplate: https://github.com/aymericzip/intlayer-tanstack-start-solid-template
|
|
21
22
|
youtubeVideo: https://www.youtube.com/watch?v=_XTdKVWaeqg
|
|
22
23
|
history:
|
|
@@ -163,59 +164,45 @@ export default defineConfig({
|
|
|
163
164
|
|
|
164
165
|
### ステップ 5: ルートレイアウトの作成
|
|
165
166
|
|
|
166
|
-
現在選択されているロケールを検出するために `
|
|
167
|
+
現在選択されているロケールを検出するために `useParams` を使用し、`html` タグに `lang` および `dir` 属性を設定することで、国際化をサポートするようにルートレイアウトを構成します。
|
|
167
168
|
|
|
168
169
|
```tsx fileName="src/routes/__root.tsx"
|
|
169
170
|
import {
|
|
170
171
|
HeadContent,
|
|
171
|
-
Outlet,
|
|
172
172
|
Scripts,
|
|
173
173
|
createRootRouteWithContext,
|
|
174
|
-
useMatches,
|
|
175
174
|
} from "@tanstack/solid-router";
|
|
176
|
-
import { TanStackRouterDevtools } from "@tanstack/solid-router-devtools";
|
|
177
175
|
import { HydrationScript } from "solid-js/web";
|
|
178
|
-
import { Suspense } from "solid-js";
|
|
176
|
+
import { Suspense, type ParentComponent } from "solid-js";
|
|
179
177
|
import { IntlayerProvider } from "solid-intlayer";
|
|
180
|
-
import { defaultLocale, getHTMLTextDir
|
|
178
|
+
import { defaultLocale, getHTMLTextDir } from "intlayer";
|
|
179
|
+
import { Route as LocaleRoute } from "./{-$locale}/route";
|
|
181
180
|
|
|
182
181
|
export const Route = createRootRouteWithContext()({
|
|
183
182
|
shellComponent: RootComponent,
|
|
184
183
|
});
|
|
185
184
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
function RootComponent() {
|
|
191
|
-
const matches = useMatches();
|
|
192
|
-
|
|
193
|
-
// アクティブなマッチのパラメータからロケールを見つけようとします
|
|
194
|
-
// これはルートツリーで動的セグメント "/{-$locale}" を使用していることを前提としています
|
|
195
|
-
const locale =
|
|
196
|
-
(
|
|
197
|
-
matches().find((match) => match.routeId === "/{-$locale}/")
|
|
198
|
-
?.params as Params
|
|
199
|
-
)?.locale ?? defaultLocale;
|
|
185
|
+
const RootComponent: ParentComponent = (props) => {
|
|
186
|
+
const params = LocaleRoute.useParams();
|
|
187
|
+
const locale = params()?.locale ?? defaultLocale;
|
|
200
188
|
|
|
201
189
|
return (
|
|
202
190
|
<html dir={getHTMLTextDir(locale)} lang={locale}>
|
|
203
191
|
<head>
|
|
204
192
|
<HydrationScript />
|
|
193
|
+
<HeadContent />
|
|
205
194
|
</head>
|
|
206
195
|
<body>
|
|
207
|
-
<HeadContent />
|
|
208
196
|
<IntlayerProvider locale={locale}>
|
|
209
197
|
<Suspense>
|
|
210
|
-
|
|
211
|
-
<TanStackRouterDevtools />
|
|
198
|
+
{props.children}
|
|
212
199
|
</Suspense>
|
|
213
200
|
</IntlayerProvider>
|
|
214
201
|
<Scripts />
|
|
215
202
|
</body>
|
|
216
203
|
</html>
|
|
217
204
|
);
|
|
218
|
-
}
|
|
205
|
+
};
|
|
219
206
|
```
|
|
220
207
|
|
|
221
208
|
### ステップ 6: ロケールレイアウトの作成 (任意)
|
|
@@ -459,18 +446,12 @@ export default LocaleSwitcher;
|
|
|
459
446
|
|
|
460
447
|
### ステップ 11: HTML属性の管理
|
|
461
448
|
|
|
462
|
-
ステップ 5 で見たように、ルートコンポーネントで `
|
|
449
|
+
ステップ 5 で見たように、ルートコンポーネントで `useParams` を使用して `html` タグの `lang` および `dir` 属性を管理できます。これにより、サーバーとクライアントで正しい属性が設定されるようになります。
|
|
463
450
|
|
|
464
451
|
```tsx fileName="src/routes/__root.tsx"
|
|
465
452
|
const RootComponent: ParentComponent = (props) => {
|
|
466
|
-
const
|
|
467
|
-
|
|
468
|
-
// アクティブなマッチのパラメータからロケールを見つけようとします
|
|
469
|
-
const locale =
|
|
470
|
-
(
|
|
471
|
-
matches().find((match) => match.routeId === "/{-$locale}/")
|
|
472
|
-
?.params as Params
|
|
473
|
-
)?.locale ?? defaultLocale;
|
|
453
|
+
const params = LocaleRoute.useParams();
|
|
454
|
+
const locale = params()?.locale ?? defaultLocale;
|
|
474
455
|
|
|
475
456
|
return (
|
|
476
457
|
<html dir={getHTMLTextDir(locale)} lang={locale}>
|
|
@@ -881,9 +862,7 @@ export default defineConfig({
|
|
|
881
862
|
import { createFileRoute } from "@tanstack/solid-router";
|
|
882
863
|
import { generateSitemap } from "intlayer";
|
|
883
864
|
|
|
884
|
-
const SITE_URL =
|
|
885
|
-
import.meta.env.VITE_SITE_URL ?? "http://localhost:3000"
|
|
886
|
-
).replace(/\/$/, "");
|
|
865
|
+
const SITE_URL = "http://localhost:3000";
|
|
887
866
|
|
|
888
867
|
export const Route = createFileRoute("/sitemap.xml")({
|
|
889
868
|
server: {
|
|
@@ -186,31 +186,41 @@ export default config;
|
|
|
186
186
|
|
|
187
187
|
### ステップ 5: ルートレイアウトの作成
|
|
188
188
|
|
|
189
|
-
`
|
|
189
|
+
`useParams`を使用して現在のロケールを検出し、`html`タグに`lang`および`dir`属性を設定することで、国際化をサポートするようにルートレイアウトを構成します。
|
|
190
190
|
|
|
191
191
|
```tsx fileName="src/routes/__root.tsx"
|
|
192
192
|
import {
|
|
193
193
|
createRootRouteWithContext,
|
|
194
194
|
HeadContent,
|
|
195
|
-
Outlet,
|
|
196
195
|
Scripts,
|
|
197
|
-
useMatches,
|
|
198
196
|
} from "@tanstack/react-router";
|
|
199
197
|
import { defaultLocale, getHTMLTextDir } from "intlayer";
|
|
200
198
|
import { type ReactNode } from "react";
|
|
201
199
|
import { IntlayerProvider } from "react-intlayer";
|
|
200
|
+
import { Route as LocaleRoute } from "./{-$locale}/route";
|
|
202
201
|
|
|
203
202
|
export const Route = createRootRouteWithContext<{}>()({
|
|
203
|
+
head: () => ({
|
|
204
|
+
meta: [
|
|
205
|
+
{
|
|
206
|
+
charSet: "utf-8",
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
content: "width=device-width, initial-scale=1",
|
|
210
|
+
name: "viewport",
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
title: "TanStack Start Starter",
|
|
214
|
+
},
|
|
215
|
+
],
|
|
216
|
+
}),
|
|
217
|
+
|
|
204
218
|
shellComponent: RootDocument,
|
|
205
219
|
});
|
|
206
220
|
|
|
207
221
|
function RootDocument({ children }: { children: ReactNode }) {
|
|
208
|
-
const
|
|
209
|
-
|
|
210
|
-
// アクティブなマッチのパラメータからロケールを探そうとします
|
|
211
|
-
// これは、ルートツリーで動的セグメント "/{-$locale}" を使用していることを前提としています
|
|
212
|
-
const localeRoute = matches.find((match) => match.routeId === "/{-$locale}");
|
|
213
|
-
const locale = localeRoute?.params?.locale ?? defaultLocale;
|
|
222
|
+
const params = LocaleRoute.useParams();
|
|
223
|
+
const locale = params?.locale ?? defaultLocale;
|
|
214
224
|
|
|
215
225
|
return (
|
|
216
226
|
<html dir={getHTMLTextDir(locale)} lang={locale}>
|
|
@@ -218,7 +228,9 @@ function RootDocument({ children }: { children: ReactNode }) {
|
|
|
218
228
|
<HeadContent />
|
|
219
229
|
</head>
|
|
220
230
|
<body>
|
|
221
|
-
<IntlayerProvider locale={locale}>
|
|
231
|
+
<IntlayerProvider locale={locale}>
|
|
232
|
+
{children}
|
|
233
|
+
</IntlayerProvider>
|
|
222
234
|
<Scripts />
|
|
223
235
|
</body>
|
|
224
236
|
</html>
|
|
@@ -570,15 +582,12 @@ export const LocaleSwitcher: FC = () => {
|
|
|
570
582
|
|
|
571
583
|
### ステップ 11: HTML属性の管理
|
|
572
584
|
|
|
573
|
-
ステップ 5 で見たように、ルートコンポーネントで `
|
|
585
|
+
ステップ 5 で見たように、ルートコンポーネントで `useParams` を使用して `html` タグの `lang` および `dir` 属性を管理できます。これにより、サーバーとクライアントで正しい属性が設定されるようになります。
|
|
574
586
|
|
|
575
587
|
```tsx fileName="src/routes/__root.tsx"
|
|
576
588
|
function RootDocument({ children }: { children: ReactNode }) {
|
|
577
|
-
const
|
|
578
|
-
|
|
579
|
-
// アクティブなマッチのパラメータからロケールを探そうとします
|
|
580
|
-
const localeRoute = matches.find((match) => match.routeId === "/{-$locale}");
|
|
581
|
-
const locale = localeRoute?.params?.locale ?? defaultLocale;
|
|
589
|
+
const params = LocaleRoute.useParams();
|
|
590
|
+
const locale = params?.locale ?? defaultLocale;
|
|
582
591
|
|
|
583
592
|
return (
|
|
584
593
|
<html dir={getHTMLTextDir(locale)} lang={locale}>
|