@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.
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 +15 -36
  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 +15 -36
  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 +15 -36
  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 +15 -36
  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 +15 -36
  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 +15 -36
  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 +15 -36
  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 +15 -36
  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 +15 -36
  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 +15 -36
  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 +15 -36
  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: Domínios personalizados
5
+ description: Aprenda como configurar o roteamento de locale baseado em domínio no Intlayer para servir diferentes locales a partir de hostnames dedicados.
6
+ keywords:
7
+ - Domínios personalizados
8
+ - Roteamento por domínio
9
+ - Roteamento
10
+ - Internacionalização
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: "Adição de roteamento de locale baseado em domínio via configuração routing.domains."
20
+ ---
21
+
22
+ # Domínios personalizados
23
+
24
+ O Intlayer suporta roteamento de locale baseado em domínio, permitindo que você sirva locales específicos a partir de hostnames dedicados. Por exemplo, os visitantes chineses podem ser direcionados para `intlayer.zh` em vez de `intlayer.org/zh`.
25
+
26
+ ## Como funciona
27
+
28
+ O mapa `domains` em `routing` associa cada locale a um hostname. O Intlayer usa esse mapa em dois lugares:
29
+
30
+ 1. **Geração de URL** (`getLocalizedUrl`): quando o locale de destino vive em um domínio _diferente_ da página atual, uma URL absoluta é retornada (ex: `https://intlayer.zh/about`). Quando ambos os domínios coincidem, uma URL relativa é retornada (ex: `/fr/about`).
31
+ 2. **Proxy do servidor** (Next.js & Vite): as solicitações recebidas são redirecionadas ou rescritas com base no domínio em que chegam.
32
+
33
+ ### Domínios exclusivos vs. compartilhados
34
+
35
+ A distinção principal é a **exclusividade**:
36
+
37
+ - **Domínio exclusivo** — apenas um locale mapeia para esse hostname (ex: `zh → intlayer.zh`). O próprio domínio identifica o locale, portanto, nenhum prefixo de locale é adicionado ao caminho. `https://intlayer.zh/about` serve conteúdo em chinês.
38
+ - **Domínio compartilhado** — vários locales mapeiam para o mesmo hostname (ex: tanto `en` quanto `fr` mapeiam para `intlayer.org`). O roteamento padrão baseado em prefixo se aplica. `intlayer.org/fr/about` serve conteúdo em francês.
39
+
40
+ ## Configuração
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
+ // Domínio compartilhado — en e fr usam roteamento de prefixo em intlayer.org
59
+ en: "intlayer.org",
60
+ // Domínio exclusivo — zh tem seu próprio hostname, nenhum prefixo /zh/ é necessário
61
+ zh: "intlayer.zh",
62
+ },
63
+ },
64
+ };
65
+
66
+ export default config;
67
+ ```
68
+
69
+ Locales que não estão listados em `domains` continuam a usar o roteamento de prefixo padrão sem qualquer substituição de domínio.
70
+
71
+ ## Geração de URL
72
+
73
+ `getLocalizedUrl` produz automaticamente o tipo de URL correto com base no contexto da chamada.
74
+
75
+ ### Locale no mesmo domínio (URL relativa)
76
+
77
+ ```ts
78
+ // Página atual: intlayer.org/about
79
+ getLocalizedUrl("/about", "fr", { currentDomain: "intlayer.org" });
80
+ // → "/fr/about"
81
+
82
+ getLocalizedUrl("/about", "en", { currentDomain: "intlayer.org" });
83
+ // → "/about" (locale padrão, sem prefixo)
84
+ ```
85
+
86
+ ### Locale em um domínio diferente (URL absoluta)
87
+
88
+ ```ts
89
+ // Página atual: intlayer.org/about
90
+ getLocalizedUrl("/about", "zh", { currentDomain: "intlayer.org" });
91
+ // → "https://intlayer.zh/about" (domínio exclusivo, sem prefixo /zh/)
92
+ ```
93
+
94
+ ### Servindo a partir do domínio do próprio locale
95
+
96
+ ```ts
97
+ // Página atual: intlayer.zh/about
98
+ getLocalizedUrl("/about", "zh", { currentDomain: "intlayer.zh" });
99
+ // → "/about" (já está no domínio correto — URL relativa)
100
+
101
+ getLocalizedUrl("/about", "fr", { currentDomain: "intlayer.zh" });
102
+ // → "https://intlayer.org/fr/about" (link entre domínios de volta para intlayer.org)
103
+ ```
104
+
105
+ ### Detecção automática do domínio atual
106
+
107
+ `currentDomain` é opcional. Quando omitido, `getLocalizedUrl` o resolve nesta ordem:
108
+
109
+ 1. O hostname de uma URL de entrada absoluta (ex: `https://intlayer.org/about` → `intlayer.org`).
110
+ 2. `window.location.hostname` em ambientes de navegador.
111
+ 3. Se nenhum estiver disponível (SSR sem opção explícita), uma URL relativa é retornada para locales do mesmo domínio e nenhuma URL absoluta é produzida — este é o fallback seguro.
112
+
113
+ ```ts
114
+ // Navegador — window.location.hostname === 'intlayer.org'
115
+ getLocalizedUrl("/about", "zh");
116
+ // → "https://intlayer.zh/about" (detectado automaticamente a partir de window)
117
+
118
+ // A partir de uma URL absoluta — domínio detectado automaticamente
119
+ getLocalizedUrl("https://intlayer.org/about", "zh");
120
+ // → "https://intlayer.zh/about"
121
+ ```
122
+
123
+ ### `getMultilingualUrls` com domínios
124
+
125
+ `getMultilingualUrls` chama `getLocalizedUrl` para cada locale, por o que produz uma mistura de URLs relativas e absolutas dependendo do domínio do chamador:
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
+ Essas URLs absolutas estão prontas para usar em tags `<link rel="alternate" hreflang="...">` para SEO.
139
+
140
+ ## Comportamento do Proxy
141
+
142
+ ### Next.js
143
+
144
+ O middleware `intlayerProxy` lida com o roteamento de domínio automaticamente. Adicione-o ao seu `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
+ **Redirecionamento** — a solicitação chega no domínio errado para um determinado prefixo de locale:
155
+
156
+ ```
157
+ GET intlayer.org/zh/about
158
+ → 301 https://intlayer.zh/about
159
+ ```
160
+
161
+ **Reescrita** — a solicitação chega no domínio exclusivo do locale sem um prefixo:
162
+
163
+ ```
164
+ GET intlayer.zh/about
165
+ → reescrita para /zh/about (apenas roteamento interno do Next.js, a URL permanece limpa)
166
+ ```
167
+
168
+ ### Vite
169
+
170
+ O plugin Vite `intlayerProxy` aplica a mesma lógica durante o desenvolvimento:
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
+ > **Nota**: no desenvolvimento local você está normalmente no `localhost`, então redirecionamentos entre domínios apontarão para os domínios reais em vez de outra porta local. Use uma substituição no arquivo hosts (ex: `127.0.0.1 intlayer.zh`) or um proxy reverso se precisar testar o roteamento multidomínio localmente.
182
+
183
+ ## Seletor de locale (Locale Switcher)
184
+
185
+ O hook `useLocale` do `next-intlayer` lida com a navegação consciente do domínio automaticamente. Quando um usuário muda para um locale em um domínio diferente, o hook realiza uma navegação de página completa (`window.location.href`) em vez de um push do roteador no lado do cliente, porque o roteador do Next.js não pode cruzar origens.
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
+ Nenhuma configuração extra é necessária — `useLocale` detecta `window.location.hostname` internamente e decide entre `router.replace` (mesmo domínio) e `window.location.href` (cross-domain).
213
+
214
+ ## SEO: Links alternativos `hreflang`
215
+
216
+ O roteamento baseado em domínio é comumente usado junto com `hreflang` para informar aos mecanismos de pesquisa qual URL indexar para cada idioma. Use `getMultilingualUrls` para gerar o conjunto completo de URLs alternativas:
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, // ex: "intlayer.org"
225
+ });
226
+
227
+ return {
228
+ alternates: {
229
+ languages: alternates,
230
+ },
231
+ };
232
+ };
233
+ ```
234
+
235
+ Isso produz:
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
+ ## Utilitários principais
245
+
246
+ | Utilitário | Descrição |
247
+ | ------------------------------------------------- | ----------------------------------------------------------------------------------------------------- |
248
+ | `getLocalizedUrl(url, locale, { currentDomain })` | Retorna uma URL relativa ou absoluta dependendo se o locale de destino está no domínio atual ou não. |
249
+ | `getMultilingualUrls(url, { currentDomain })` | Retorna um mapa de URLs localizadas por locale, misturando relativas e absolutas conforme necessário. |
250
+ | `getPrefix(locale, { domains })` | Retorna um prefixo vazio para locales de domínio exclusivo, caso contrário, o prefixo normal. |
@@ -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
  ### Passo 5: Criar o Layout Raiz (Root Layout)
165
166
 
166
- Configure o seu layout raiz para suportar internacionalização usando `useMatches` para detectar a localidade atual e definindo os atributos `lang` e `dir` na tag `html`.
167
+ Configure o seu layout raiz para suportar internacionalização usando `useParams` para detectar a localidade atual e definindo os atributos `lang` e `dir` na tag `html`.
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, type Locale } from "intlayer";
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
- type Params = {
187
- locale: Locale;
188
- };
189
-
190
- function RootComponent() {
191
- const matches = useMatches();
192
-
193
- // Tenta encontrar a localidade nos parâmetros de qualquer correspondência ativa
194
- // Isso assume que você usa o segmento dinâmico "/{-$locale}" na sua árvore de rotas
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
- <Outlet />
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
  ### Passo 6: Criar o Layout de Localidade (Opcional)
@@ -459,18 +446,12 @@ export default LocaleSwitcher;
459
446
 
460
447
  ### Passo 11: Gerenciamento de Atributos HTML
461
448
 
462
- Como visto no Passo 5, você pode gerenciar os atributos `lang` e `dir` da tag `html` usando `useMatches` no seu componente raiz. Isso garante que os atributos corretos sejam definidos no servidor e no cliente.
449
+ Como visto no Passo 5, você pode gerenciar os atributos `lang` e `dir` da tag `html` usando `useParams` no seu componente raiz. Isso garante que os atributos corretos sejam definidos no servidor e no cliente.
463
450
 
464
451
  ```tsx fileName="src/routes/__root.tsx"
465
452
  const RootComponent: ParentComponent = (props) => {
466
- const matches = useMatches();
467
-
468
- // Tentar encontrar a localidade nos parâmetros de qualquer correspondência ativa
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}>
@@ -879,9 +860,7 @@ Em seguida, crie uma rota `src/routes/sitemap[.]xml.ts` que use a função `gene
879
860
  import { createFileRoute } from "@tanstack/solid-router";
880
861
  import { generateSitemap } from "intlayer";
881
862
 
882
- const SITE_URL = (
883
- import.meta.env.VITE_SITE_URL ?? "http://localhost:3000"
884
- ).replace(/\/$/, "");
863
+ const SITE_URL = "http://localhost:3000";
885
864
 
886
865
  export const Route = createFileRoute("/sitemap.xml")({
887
866
  server: {
@@ -183,31 +183,41 @@ export default config;
183
183
 
184
184
  ### Passo 5: Criar Layout Raiz
185
185
 
186
- Configure seu layout raiz para suportar internacionalização usando `useMatches` para detectar o locale atual e configurando os atributos `lang` e `dir` na tag `html`.
186
+ Configure seu layout raiz para suportar internacionalização usando `useParams` para detectar o locale atual e configurando os atributos `lang` e `dir` na tag `html`.
187
187
 
188
188
  ```tsx fileName="src/routes/__root.tsx"
189
189
  import {
190
190
  createRootRouteWithContext,
191
191
  HeadContent,
192
- Outlet,
193
192
  Scripts,
194
- useMatches,
195
193
  } from "@tanstack/react-router";
196
194
  import { defaultLocale, getHTMLTextDir } from "intlayer";
197
195
  import { type ReactNode } from "react";
198
196
  import { IntlayerProvider } from "react-intlayer";
197
+ import { Route as LocaleRoute } from "./{-$locale}/route";
199
198
 
200
199
  export const Route = createRootRouteWithContext<{}>()({
200
+ head: () => ({
201
+ meta: [
202
+ {
203
+ charSet: "utf-8",
204
+ },
205
+ {
206
+ content: "width=device-width, initial-scale=1",
207
+ name: "viewport",
208
+ },
209
+ {
210
+ title: "TanStack Start Starter",
211
+ },
212
+ ],
213
+ }),
214
+
201
215
  shellComponent: RootDocument,
202
216
  });
203
217
 
204
218
  function RootDocument({ children }: { children: ReactNode }) {
205
- const matches = useMatches();
206
-
207
- // Tenta encontrar o locale nos params de qualquer match ativo
208
- // Isso assume que você usa o segmento dinâmico "/{-$locale}" na sua árvore de rotas
209
- const localeRoute = matches.find((match) => match.routeId === "/{-$locale}");
210
- const locale = localeRoute?.params?.locale ?? defaultLocale;
219
+ const params = LocaleRoute.useParams();
220
+ const locale = params?.locale ?? defaultLocale;
211
221
 
212
222
  return (
213
223
  <html dir={getHTMLTextDir(locale)} lang={locale}>
@@ -215,7 +225,9 @@ function RootDocument({ children }: { children: ReactNode }) {
215
225
  <HeadContent />
216
226
  </head>
217
227
  <body>
218
- <IntlayerProvider locale={locale}>{children}</IntlayerProvider>
228
+ <IntlayerProvider locale={locale}>
229
+ {children}
230
+ </IntlayerProvider>
219
231
  <Scripts />
220
232
  </body>
221
233
  </html>
@@ -559,15 +571,12 @@ export const LocaleSwitcher: FC = () => {
559
571
 
560
572
  ### Passo 11: Gerenciamento de Atributos HTML
561
573
 
562
- Como visto no Passo 5, você pode gerenciar os atributos `lang` e `dir` da tag `html` usando `useMatches` no seu componente raiz. Isso garante que os atributos corretos sejam definidos no servidor e no cliente.
574
+ Como visto no Passo 5, você pode gerenciar os atributos `lang` e `dir` da tag `html` usando `useParams` no seu componente raiz. Isso garante que os atributos corretos sejam definidos no servidor e no cliente.
563
575
 
564
576
  ```tsx fileName="src/routes/__root.tsx"
565
577
  function RootDocument({ children }: { children: ReactNode }) {
566
- const matches = useMatches();
567
-
568
- // Tenta encontrar o locale nos params de qualquer match ativo
569
- const localeRoute = matches.find((match) => match.routeId === "/{-$locale}");
570
- const locale = localeRoute?.params?.locale ?? defaultLocale;
578
+ const params = LocaleRoute.useParams();
579
+ const locale = params?.locale ?? defaultLocale;
571
580
 
572
581
  return (
573
582
  <html dir={getHTMLTextDir(locale)} lang={locale}>