@intlayer/docs 8.6.1 → 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.
Files changed (197) hide show
  1. package/dist/cjs/doc.cjs.map +1 -1
  2. package/dist/cjs/generated/docs.entry.cjs +60 -0
  3. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  4. package/dist/esm/doc.mjs.map +1 -1
  5. package/dist/esm/generated/docs.entry.mjs +60 -0
  6. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  7. package/dist/types/doc.d.ts.map +1 -1
  8. package/dist/types/generated/docs.entry.d.ts +3 -0
  9. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  10. package/docs/ar/cli/index.md +54 -42
  11. package/docs/ar/cli/init.md +32 -20
  12. package/docs/ar/cli/standalone.md +91 -0
  13. package/docs/ar/configuration.md +39 -7
  14. package/docs/ar/custom_domains.md +250 -0
  15. package/docs/ar/intlayer_with_tanstack+solid.md +14 -33
  16. package/docs/ar/intlayer_with_tanstack.md +25 -16
  17. package/docs/ar/intlayer_with_vanilla.md +506 -0
  18. package/docs/bn/cli/index.md +195 -0
  19. package/docs/bn/cli/init.md +96 -0
  20. package/docs/bn/cli/standalone.md +91 -0
  21. package/docs/bn/configuration.md +46 -14
  22. package/docs/bn/custom_domains.md +250 -0
  23. package/docs/bn/intlayer_with_vanilla.md +506 -0
  24. package/docs/cs/cli/index.md +195 -0
  25. package/docs/cs/cli/init.md +96 -0
  26. package/docs/cs/cli/standalone.md +91 -0
  27. package/docs/cs/configuration.md +46 -7
  28. package/docs/cs/custom_domains.md +250 -0
  29. package/docs/cs/intlayer_with_vanilla.md +506 -0
  30. package/docs/de/cli/index.md +53 -41
  31. package/docs/de/cli/standalone.md +91 -0
  32. package/docs/de/configuration.md +46 -7
  33. package/docs/de/custom_domains.md +250 -0
  34. package/docs/de/intlayer_with_tanstack+solid.md +14 -33
  35. package/docs/de/intlayer_with_tanstack.md +25 -16
  36. package/docs/de/intlayer_with_vanilla.md +506 -0
  37. package/docs/en/bundle_optimization.md +288 -23
  38. package/docs/en/cli/index.md +6 -1
  39. package/docs/en/cli/init.md +13 -1
  40. package/docs/en/cli/standalone.md +91 -0
  41. package/docs/en/configuration.md +46 -7
  42. package/docs/en/custom_domains.md +245 -0
  43. package/docs/en/intlayer_with_tanstack+solid.md +14 -33
  44. package/docs/en/intlayer_with_tanstack.md +25 -16
  45. package/docs/en/intlayer_with_vanilla.md +506 -0
  46. package/docs/en-GB/cli/index.md +56 -44
  47. package/docs/en-GB/cli/init.md +28 -21
  48. package/docs/en-GB/cli/standalone.md +91 -0
  49. package/docs/en-GB/configuration.md +53 -14
  50. package/docs/en-GB/custom_domains.md +250 -0
  51. package/docs/en-GB/intlayer_with_tanstack+solid.md +14 -33
  52. package/docs/en-GB/intlayer_with_tanstack.md +25 -16
  53. package/docs/en-GB/intlayer_with_vanilla.md +506 -0
  54. package/docs/es/cli/index.md +65 -53
  55. package/docs/es/cli/init.md +33 -21
  56. package/docs/es/cli/standalone.md +91 -0
  57. package/docs/es/configuration.md +39 -1
  58. package/docs/es/custom_domains.md +250 -0
  59. package/docs/es/intlayer_with_tanstack+solid.md +14 -33
  60. package/docs/es/intlayer_with_tanstack.md +25 -16
  61. package/docs/es/intlayer_with_vanilla.md +506 -0
  62. package/docs/fr/cli/index.md +43 -31
  63. package/docs/fr/cli/init.md +37 -25
  64. package/docs/fr/cli/standalone.md +91 -0
  65. package/docs/fr/configuration.md +46 -7
  66. package/docs/fr/custom_domains.md +250 -0
  67. package/docs/fr/intlayer_with_tanstack+solid.md +14 -33
  68. package/docs/fr/intlayer_with_tanstack.md +25 -16
  69. package/docs/fr/intlayer_with_vanilla.md +506 -0
  70. package/docs/hi/cli/index.md +71 -59
  71. package/docs/hi/cli/init.md +37 -33
  72. package/docs/hi/cli/standalone.md +91 -0
  73. package/docs/hi/configuration.md +39 -7
  74. package/docs/hi/custom_domains.md +250 -0
  75. package/docs/hi/intlayer_with_tanstack+solid.md +14 -33
  76. package/docs/hi/intlayer_with_tanstack.md +25 -16
  77. package/docs/hi/intlayer_with_vanilla.md +506 -0
  78. package/docs/id/cli/index.md +59 -47
  79. package/docs/id/cli/init.md +32 -25
  80. package/docs/id/cli/standalone.md +91 -0
  81. package/docs/id/configuration.md +46 -7
  82. package/docs/id/custom_domains.md +250 -0
  83. package/docs/id/intlayer_with_tanstack+solid.md +14 -33
  84. package/docs/id/intlayer_with_tanstack.md +25 -16
  85. package/docs/id/intlayer_with_vanilla.md +506 -0
  86. package/docs/it/cli/index.md +58 -41
  87. package/docs/it/cli/init.md +37 -38
  88. package/docs/it/cli/standalone.md +91 -0
  89. package/docs/it/configuration.md +46 -7
  90. package/docs/it/custom_domains.md +250 -0
  91. package/docs/it/intlayer_with_tanstack+solid.md +14 -33
  92. package/docs/it/intlayer_with_tanstack.md +25 -16
  93. package/docs/it/intlayer_with_vanilla.md +506 -0
  94. package/docs/ja/cli/index.md +59 -47
  95. package/docs/ja/cli/init.md +36 -24
  96. package/docs/ja/cli/standalone.md +91 -0
  97. package/docs/ja/configuration.md +46 -7
  98. package/docs/ja/custom_domains.md +250 -0
  99. package/docs/ja/intlayer_with_tanstack+solid.md +14 -33
  100. package/docs/ja/intlayer_with_tanstack.md +25 -16
  101. package/docs/ja/intlayer_with_vanilla.md +506 -0
  102. package/docs/ko/cli/index.md +58 -46
  103. package/docs/ko/cli/init.md +39 -35
  104. package/docs/ko/cli/standalone.md +91 -0
  105. package/docs/ko/configuration.md +47 -8
  106. package/docs/ko/custom_domains.md +250 -0
  107. package/docs/ko/intlayer_with_tanstack+solid.md +14 -33
  108. package/docs/ko/intlayer_with_tanstack.md +25 -16
  109. package/docs/ko/intlayer_with_vanilla.md +506 -0
  110. package/docs/nl/cli/index.md +195 -0
  111. package/docs/nl/cli/init.md +96 -0
  112. package/docs/nl/cli/standalone.md +91 -0
  113. package/docs/nl/configuration.md +46 -7
  114. package/docs/nl/custom_domains.md +250 -0
  115. package/docs/nl/intlayer_with_vanilla.md +506 -0
  116. package/docs/pl/cli/index.md +56 -44
  117. package/docs/pl/cli/init.md +36 -32
  118. package/docs/pl/cli/standalone.md +91 -0
  119. package/docs/pl/configuration.md +46 -7
  120. package/docs/pl/custom_domains.md +250 -0
  121. package/docs/pl/intlayer_with_tanstack+solid.md +14 -33
  122. package/docs/pl/intlayer_with_tanstack.md +25 -16
  123. package/docs/pl/intlayer_with_vanilla.md +506 -0
  124. package/docs/pt/cli/index.md +64 -52
  125. package/docs/pt/cli/init.md +35 -31
  126. package/docs/pt/cli/standalone.md +91 -0
  127. package/docs/pt/configuration.md +46 -7
  128. package/docs/pt/custom_domains.md +250 -0
  129. package/docs/pt/intlayer_with_tanstack+solid.md +14 -33
  130. package/docs/pt/intlayer_with_tanstack.md +25 -16
  131. package/docs/pt/intlayer_with_vanilla.md +506 -0
  132. package/docs/ru/cli/index.md +54 -42
  133. package/docs/ru/cli/init.md +31 -27
  134. package/docs/ru/cli/standalone.md +91 -0
  135. package/docs/ru/configuration.md +46 -7
  136. package/docs/ru/custom_domains.md +250 -0
  137. package/docs/ru/intlayer_with_tanstack+solid.md +14 -33
  138. package/docs/ru/intlayer_with_tanstack.md +25 -16
  139. package/docs/ru/intlayer_with_vanilla.md +506 -0
  140. package/docs/tr/cli/index.md +64 -52
  141. package/docs/tr/cli/init.md +37 -30
  142. package/docs/tr/cli/standalone.md +91 -0
  143. package/docs/tr/configuration.md +46 -7
  144. package/docs/tr/custom_domains.md +250 -0
  145. package/docs/tr/intlayer_with_tanstack+solid.md +14 -33
  146. package/docs/tr/intlayer_with_tanstack.md +25 -16
  147. package/docs/tr/intlayer_with_vanilla.md +506 -0
  148. package/docs/uk/cli/index.md +60 -55
  149. package/docs/uk/cli/init.md +32 -20
  150. package/docs/uk/cli/standalone.md +91 -0
  151. package/docs/uk/configuration.md +46 -7
  152. package/docs/uk/custom_domains.md +250 -0
  153. package/docs/uk/intlayer_with_tanstack+solid.md +14 -33
  154. package/docs/uk/intlayer_with_tanstack.md +25 -16
  155. package/docs/uk/intlayer_with_vanilla.md +506 -0
  156. package/docs/ur/cli/index.md +195 -0
  157. package/docs/ur/cli/init.md +96 -0
  158. package/docs/ur/cli/standalone.md +91 -0
  159. package/docs/ur/configuration.md +46 -7
  160. package/docs/ur/custom_domains.md +250 -0
  161. package/docs/ur/intlayer_with_vanilla.md +506 -0
  162. package/docs/vi/cli/index.md +72 -61
  163. package/docs/vi/cli/init.md +33 -21
  164. package/docs/vi/cli/standalone.md +91 -0
  165. package/docs/vi/configuration.md +46 -7
  166. package/docs/vi/custom_domains.md +250 -0
  167. package/docs/vi/intlayer_with_tanstack+solid.md +14 -33
  168. package/docs/vi/intlayer_with_tanstack.md +25 -16
  169. package/docs/vi/intlayer_with_vanilla.md +506 -0
  170. package/docs/zh/cli/index.md +56 -49
  171. package/docs/zh/cli/init.md +30 -18
  172. package/docs/zh/cli/standalone.md +91 -0
  173. package/docs/zh/configuration.md +46 -7
  174. package/docs/zh/custom_domains.md +250 -0
  175. package/docs/zh/intlayer_with_tanstack+solid.md +14 -33
  176. package/docs/zh/intlayer_with_tanstack.md +25 -16
  177. package/docs/zh/intlayer_with_vanilla.md +506 -0
  178. package/package.json +8 -8
  179. package/src/doc.ts +4 -1
  180. package/src/generated/docs.entry.ts +60 -0
  181. package/docs/ar/bundle_optimization.md +0 -185
  182. package/docs/de/bundle_optimization.md +0 -195
  183. package/docs/en-GB/bundle_optimization.md +0 -184
  184. package/docs/es/bundle_optimization.md +0 -194
  185. package/docs/fr/bundle_optimization.md +0 -184
  186. package/docs/hi/bundle_optimization.md +0 -185
  187. package/docs/id/bundle_optimization.md +0 -185
  188. package/docs/it/bundle_optimization.md +0 -185
  189. package/docs/ja/bundle_optimization.md +0 -185
  190. package/docs/ko/bundle_optimization.md +0 -185
  191. package/docs/pl/bundle_optimization.md +0 -185
  192. package/docs/pt/bundle_optimization.md +0 -184
  193. package/docs/ru/bundle_optimization.md +0 -185
  194. package/docs/tr/bundle_optimization.md +0 -184
  195. package/docs/uk/bundle_optimization.md +0 -186
  196. package/docs/vi/bundle_optimization.md +0 -185
  197. 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: Custom Domains
5
+ description: Learn how to configure domain-based locale routing in Intlayer to serve different locales from dedicated hostnames.
6
+ keywords:
7
+ - Custom Domains
8
+ - Domain Routing
9
+ - Routing
10
+ - Internationalisation
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: "Add domain-based locale routing via routing.domains configuration."
20
+ ---
21
+
22
+ # Custom Domains
23
+
24
+ Intlayer supports domain-based locale routing, allowing you to serve specific locales from dedicated hostnames. For example, Chinese visitors can be directed to `intlayer.zh` instead of `intlayer.org/zh`.
25
+
26
+ ## How It Works
27
+
28
+ The `domains` map in `routing` associates each locale with a hostname. Intlayer uses this map in two places:
29
+
30
+ 1. **URL generation** (`getLocalizedUrl`): when the target locale lives on a _different_ domain than the current page, an absolute URL is returned (e.g. `https://intlayer.zh/about`). When both domains match, a relative URL is returned (e.g. `/fr/about`).
31
+ 2. **Server proxy** (Next.js & Vite): incoming requests are redirected or rewritten based on the domain they arrive on.
32
+
33
+ ### Exclusive vs. shared domains
34
+
35
+ The key distinction is **exclusivity**:
36
+
37
+ - **Exclusive domain** — only one locale maps to that hostname (e.g. `zh → intlayer.zh`). The domain itself identifies the locale, so no locale prefix is added to the path. `https://intlayer.zh/about` serves Chinese content.
38
+ - **Shared domain** — multiple locales map to the same hostname (e.g. `en` and `fr` both map to `intlayer.org`). Normal prefix-based routing applies. `intlayer.org/fr/about` serves French content.
39
+
40
+ ## Configuration
41
+
42
+ ```typescript fileName="intlayer.config.ts"
43
+ import { Locales, type IntlayerConfig } from "intlayer";
44
+
45
+ const config: IntlayerConfig = {
46
+ internationalisation: {
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
+ // Shared domain — en and fr use prefix routing on intlayer.org
59
+ en: "intlayer.org",
60
+ // Exclusive domain — zh has its own hostname, no /zh/ prefix needed
61
+ zh: "intlayer.zh",
62
+ },
63
+ },
64
+ };
65
+
66
+ export default config;
67
+ ```
68
+
69
+ Locales that are not listed in `domains` continue to use the standard prefix routing without any domain override.
70
+
71
+ ## URL Generation
72
+
73
+ `getLocalizedUrl` automatically produces the correct URL type based on the calling context.
74
+
75
+ ### Same-domain locale (relative URL)
76
+
77
+ ```ts
78
+ // Current page: intlayer.org/about
79
+ getLocalizedUrl("/about", "fr", { currentDomain: "intlayer.org" });
80
+ // → "/fr/about"
81
+
82
+ getLocalizedUrl("/about", "en", { currentDomain: "intlayer.org" });
83
+ // → "/about" (default locale, no prefix)
84
+ ```
85
+
86
+ ### Cross-domain locale (absolute URL)
87
+
88
+ ```ts
89
+ // Current page: intlayer.org/about
90
+ getLocalizedUrl("/about", "zh", { currentDomain: "intlayer.org" });
91
+ // → "https://intlayer.zh/about" (exclusive domain, no /zh/ prefix)
92
+ ```
93
+
94
+ ### Serving from the locale's own domain
95
+
96
+ ```ts
97
+ // Current page: intlayer.zh/about
98
+ getLocalizedUrl("/about", "zh", { currentDomain: "intlayer.zh" });
99
+ // → "/about" (already on the correct domain — relative URL)
100
+
101
+ getLocalizedUrl("/about", "fr", { currentDomain: "intlayer.zh" });
102
+ // → "https://intlayer.org/fr/about" (cross-domain link back to intlayer.org)
103
+ ```
104
+
105
+ ### Current domain auto-detection
106
+
107
+ `currentDomain` is optional. When omitted, `getLocalizedUrl` resolves it in this order:
108
+
109
+ 1. The hostname of an absolute input URL (e.g. `https://intlayer.org/about` → `intlayer.org`).
110
+ 2. `window.location.hostname` in browser environments.
111
+ 3. If neither is available (SSR without explicit option), a relative URL is returned for same-domain locales and no absolute URL is produced — this is the safe fallback.
112
+
113
+ ```ts
114
+ // Browser — window.location.hostname === 'intlayer.org'
115
+ getLocalizedUrl("/about", "zh");
116
+ // → "https://intlayer.zh/about" (auto-detected from window)
117
+
118
+ // From an absolute URL — domain detected automatically
119
+ getLocalizedUrl("https://intlayer.org/about", "zh");
120
+ // → "https://intlayer.zh/about"
121
+ ```
122
+
123
+ ### `getMultilingualUrls` with domains
124
+
125
+ `getMultilingualUrls` calls `getLocalizedUrl` for every locale, so it produces a mix of relative and absolute URLs depending on the caller's domain:
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
+ These absolute URLs are ready to use in `<link rel="alternate" hreflang="...">` tags for SEO.
139
+
140
+ ## Proxy Behaviour
141
+
142
+ ### Next.js
143
+
144
+ The `intlayerProxy` middleware handles domain routing automatically. Add it to your `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
+ **Redirect** — request arrives on the wrong domain for a given locale prefix:
155
+
156
+ ```
157
+ GET intlayer.org/zh/about
158
+ → 301 https://intlayer.zh/about
159
+ ```
160
+
161
+ **Rewrite** — request arrives on the locale's exclusive domain without a prefix:
162
+
163
+ ```
164
+ GET intlayer.zh/about
165
+ → rewrite to /zh/about (internal Next.js routing only, URL stays clean)
166
+ ```
167
+
168
+ ### Vite
169
+
170
+ The `intlayerProxy` Vite plugin applies the same logic during development:
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
+ > **Note**: in local development you are typically on `localhost`, so cross-domain redirects will point to the live domains rather than another local port. Use a hosts-file override (e.g. `127.0.0.1 intlayer.zh`) or a reverse proxy if you need to test multi-domain routing locally.
182
+
183
+ ## Locale Switcher
184
+
185
+ The `useLocale` hook from `next-intlayer` handles domain-aware navigation automatically. When a user switches to a locale on a different domain the hook performs a full-page navigation (`window.location.href`) instead of a client-side router push, because the Next.js router cannot cross origins.
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((l) => (
198
+ <li key={l}>
199
+ <button
200
+ onClick={() => setLocale(l)}
201
+ aria-current={l === locale ? "true" : undefined}
202
+ >
203
+ {l.toUpperCase()}
204
+ </button>
205
+ </li>
206
+ ))}
207
+ </ul>
208
+ );
209
+ };
210
+ ```
211
+
212
+ No extra configuration is required — `useLocale` detects `window.location.hostname` internally and decides between `router.replace` (same domain) and `window.location.href` (cross-domain).
213
+
214
+ ## SEO: `hreflang` Alternate Links
215
+
216
+ Domain-based routing is commonly used together with `hreflang` to tell search engines which URL to index for each language. Use `getMultilingualUrls` to generate the full set of alternate URLs:
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, // e.g. "intlayer.org"
225
+ });
226
+
227
+ return {
228
+ alternates: {
229
+ languages: alternates,
230
+ },
231
+ };
232
+ };
233
+ ```
234
+
235
+ This produces:
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
+ ## Core Utilities
245
+
246
+ | Utility | Description |
247
+ | ------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
248
+ | `getLocalizedUrl(url, locale, { currentDomain })` | Returns relative or absolute URL depending on whether the target locale is on the current domain. |
249
+ | `getMultilingualUrls(url, { currentDomain })` | Returns a locale-keyed map of localised URLs, mixing relative and absolute as needed. |
250
+ | `getPrefix(locale, { domains })` | Returns an empty prefix for exclusive-domain locales, normal prefix otherwise. |
@@ -16,6 +16,7 @@ slugs:
16
16
  - doc
17
17
  - environment
18
18
  - tanstack-start
19
+ - solid
19
20
  applicationTemplate: https://github.com/aymericzip/intlayer-tanstack-start-solid-template
20
21
  youtubeVideo: https://www.youtube.com/watch?v=_XTdKVWaeqg
21
22
  history:
@@ -162,59 +163,45 @@ export default defineConfig({
162
163
 
163
164
  ### Step 5: Create the Root Layout
164
165
 
165
- Configure your root layout to support internationalisation by using `useMatches` to detect the current locale and setting the `lang` and `dir` attributes on the `html` tag.
166
+ Configure your root layout to support internationalisation by using `useParams` to detect the current locale and setting the `lang` and `dir` attributes on the `html` tag.
166
167
 
167
168
  ```tsx fileName="src/routes/__root.tsx"
168
169
  import {
169
170
  HeadContent,
170
- Outlet,
171
171
  Scripts,
172
172
  createRootRouteWithContext,
173
- useMatches,
174
173
  } from "@tanstack/solid-router";
175
- import { TanStackRouterDevtools } from "@tanstack/solid-router-devtools";
176
174
  import { HydrationScript } from "solid-js/web";
177
- import { Suspense } from "solid-js";
175
+ import { Suspense, type ParentComponent } from "solid-js";
178
176
  import { IntlayerProvider } from "solid-intlayer";
179
- import { defaultLocale, getHTMLTextDir, type Locale } from "intlayer";
177
+ import { defaultLocale, getHTMLTextDir } from "intlayer";
178
+ import { Route as LocaleRoute } from "./{-$locale}/route";
180
179
 
181
180
  export const Route = createRootRouteWithContext()({
182
181
  shellComponent: RootComponent,
183
182
  });
184
183
 
185
- type Params = {
186
- locale: Locale;
187
- };
188
-
189
- function RootComponent() {
190
- const matches = useMatches();
191
-
192
- // Try to find the locale in the parameters of any active match
193
- // This assumes you use the dynamic segment "/{-$locale}" in your route tree
194
- const locale =
195
- (
196
- matches().find((match) => match.routeId === "/{-$locale}/")
197
- ?.params as Params
198
- )?.locale ?? defaultLocale;
184
+ const RootComponent: ParentComponent = (props) => {
185
+ const params = LocaleRoute.useParams();
186
+ const locale = params()?.locale ?? defaultLocale;
199
187
 
200
188
  return (
201
189
  <html dir={getHTMLTextDir(locale)} lang={locale}>
202
190
  <head>
203
191
  <HydrationScript />
192
+ <HeadContent />
204
193
  </head>
205
194
  <body>
206
- <HeadContent />
207
195
  <IntlayerProvider locale={locale}>
208
196
  <Suspense>
209
- <Outlet />
210
- <TanStackRouterDevtools />
197
+ {props.children}
211
198
  </Suspense>
212
199
  </IntlayerProvider>
213
200
  <Scripts />
214
201
  </body>
215
202
  </html>
216
203
  );
217
- }
204
+ };
218
205
  ```
219
206
 
220
207
  ### Step 6: Create the Locale Layout (Optional)
@@ -459,18 +446,12 @@ export default LocaleSwitcher;
459
446
 
460
447
  ### Step 11: Management of HTML Attributes
461
448
 
462
- As seen in Step 5, you can manage the `lang` and `dir` attributes of the `html` tag by using `useMatches` in your root component. This ensures that the correct attributes are set on both the server and client.
449
+ As seen in Step 5, you can manage the `lang` and `dir` attributes of the `html` tag by using `useParams` in your root component. This ensures that the correct attributes are set on both the server and client.
463
450
 
464
451
  ```tsx fileName="src/routes/__root.tsx"
465
452
  const RootComponent: ParentComponent = (props) => {
466
- const matches = useMatches();
467
-
468
- // Try to find the locale in the parameters of any active match
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}>
@@ -182,31 +182,41 @@ export default config;
182
182
 
183
183
  ### Step 5: Create Root Layout
184
184
 
185
- Configure your root layout to support internationalisation by using `useMatches` to detect the current locale and setting the `lang` and `dir` attributes on the `html` tag.
185
+ Configure your root layout to support internationalisation by using `useParams` to detect the current locale and setting the `lang` and `dir` attributes on the `html` tag.
186
186
 
187
187
  ```tsx fileName="src/routes/__root.tsx"
188
188
  import {
189
189
  createRootRouteWithContext,
190
190
  HeadContent,
191
- Outlet,
192
191
  Scripts,
193
- useMatches,
194
192
  } from "@tanstack/react-router";
195
193
  import { defaultLocale, getHTMLTextDir } from "intlayer";
196
194
  import { type ReactNode } from "react";
197
195
  import { IntlayerProvider } from "react-intlayer";
196
+ import { Route as LocaleRoute } from "./{-$locale}/route";
198
197
 
199
198
  export const Route = createRootRouteWithContext<{}>()({
199
+ head: () => ({
200
+ meta: [
201
+ {
202
+ charSet: "utf-8",
203
+ },
204
+ {
205
+ content: "width=device-width, initial-scale=1",
206
+ name: "viewport",
207
+ },
208
+ {
209
+ title: "TanStack Start Starter",
210
+ },
211
+ ],
212
+ }),
213
+
200
214
  shellComponent: RootDocument,
201
215
  });
202
216
 
203
217
  function RootDocument({ children }: { children: ReactNode }) {
204
- const matches = useMatches();
205
-
206
- // Try to find locale in params of any active match
207
- // This assumes you use the dynamic segment "/{-$locale}" in your route tree
208
- const localeRoute = matches.find((match) => match.routeId === "/{-$locale}");
209
- const locale = localeRoute?.params?.locale ?? defaultLocale;
218
+ const params = LocaleRoute.useParams();
219
+ const locale = params?.locale ?? defaultLocale;
210
220
 
211
221
  return (
212
222
  <html dir={getHTMLTextDir(locale)} lang={locale}>
@@ -214,7 +224,9 @@ function RootDocument({ children }: { children: ReactNode }) {
214
224
  <HeadContent />
215
225
  </head>
216
226
  <body>
217
- <IntlayerProvider locale={locale}>{children}</IntlayerProvider>
227
+ <IntlayerProvider locale={locale}>
228
+ {children}
229
+ </IntlayerProvider>
218
230
  <Scripts />
219
231
  </body>
220
232
  </html>
@@ -557,15 +569,12 @@ export const LocaleSwitcher: FC = () => {
557
569
 
558
570
  ### Step 11: HTML Attributes Management
559
571
 
560
- As seen in Step 5, you can manage the `lang` and `dir` attributes of the `html` tag using `useMatches` in your root component. This ensures that the correct attributes are set on the server and client.
572
+ As seen in Step 5, you can manage the `lang` and `dir` attributes of the `html` tag using `useParams` in your root component. This ensures that the correct attributes are set on the server and client.
561
573
 
562
574
  ```tsx fileName="src/routes/__root.tsx"
563
575
  function RootDocument({ children }: { children: ReactNode }) {
564
- const matches = useMatches();
565
-
566
- // Try to find locale in params of any active match
567
- const localeRoute = matches.find((match) => match.routeId === "/{-$locale}");
568
- const locale = localeRoute?.params?.locale ?? defaultLocale;
576
+ const params = LocaleRoute.useParams();
577
+ const locale = params?.locale ?? defaultLocale;
569
578
 
570
579
  return (
571
580
  <html dir={getHTMLTextDir(locale)} lang={locale}>