@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.
Files changed (242) hide show
  1. package/blog/en/next-i18next_vs_next-intl_vs_intlayer.md +71 -80
  2. package/dist/cjs/generated/docs.entry.cjs +16 -0
  3. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  4. package/dist/esm/generated/docs.entry.mjs +16 -0
  5. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  6. package/dist/types/generated/docs.entry.d.ts +1 -0
  7. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  8. package/docs/ar/intlayer_with_angular.md +2 -2
  9. package/docs/ar/intlayer_with_astro.md +246 -0
  10. package/docs/ar/intlayer_with_create_react_app.md +3 -2
  11. package/docs/ar/intlayer_with_express.md +2 -2
  12. package/docs/ar/intlayer_with_nestjs.md +2 -2
  13. package/docs/ar/intlayer_with_nextjs_14.md +2 -2
  14. package/docs/ar/intlayer_with_nextjs_15.md +2 -2
  15. package/docs/ar/intlayer_with_nextjs_page_router.md +2 -2
  16. package/docs/ar/intlayer_with_nuxt.md +2 -2
  17. package/docs/ar/intlayer_with_react_native+expo.md +11 -20
  18. package/docs/ar/intlayer_with_react_router_v7.md +195 -241
  19. package/docs/ar/intlayer_with_tanstack.md +198 -272
  20. package/docs/ar/intlayer_with_vite+preact.md +9 -9
  21. package/docs/ar/intlayer_with_vite+react.md +7 -7
  22. package/docs/ar/intlayer_with_vite+vue.md +9 -9
  23. package/docs/de/intlayer_with_angular.md +2 -2
  24. package/docs/de/intlayer_with_astro.md +246 -0
  25. package/docs/de/intlayer_with_create_react_app.md +2 -2
  26. package/docs/de/intlayer_with_express.md +2 -2
  27. package/docs/de/intlayer_with_nestjs.md +2 -2
  28. package/docs/de/intlayer_with_nextjs_14.md +2 -2
  29. package/docs/de/intlayer_with_nextjs_15.md +2 -2
  30. package/docs/de/intlayer_with_nextjs_page_router.md +2 -2
  31. package/docs/de/intlayer_with_nuxt.md +2 -2
  32. package/docs/de/intlayer_with_react_native+expo.md +11 -20
  33. package/docs/de/intlayer_with_react_router_v7.md +193 -242
  34. package/docs/de/intlayer_with_tanstack.md +194 -266
  35. package/docs/de/intlayer_with_vite+preact.md +9 -9
  36. package/docs/de/intlayer_with_vite+react.md +9 -9
  37. package/docs/de/intlayer_with_vite+vue.md +11 -11
  38. package/docs/de/packages/vite-intlayer/index.md +3 -3
  39. package/docs/en/how_works_intlayer.md +1 -1
  40. package/docs/en/index.md +1 -1
  41. package/docs/en/intlayer_cli.md +1 -1
  42. package/docs/en/intlayer_with_angular.md +4 -4
  43. package/docs/en/intlayer_with_astro.md +246 -0
  44. package/docs/en/intlayer_with_create_react_app.md +4 -4
  45. package/docs/en/intlayer_with_express.md +3 -3
  46. package/docs/en/intlayer_with_lynx+react.md +1 -1
  47. package/docs/en/intlayer_with_nestjs.md +2 -2
  48. package/docs/en/intlayer_with_nextjs_14.md +13 -4
  49. package/docs/en/intlayer_with_nextjs_15.md +13 -4
  50. package/docs/en/intlayer_with_nextjs_page_router.md +5 -5
  51. package/docs/en/intlayer_with_nuxt.md +4 -4
  52. package/docs/en/intlayer_with_react_native+expo.md +46 -24
  53. package/docs/en/intlayer_with_react_router_v7.md +164 -211
  54. package/docs/en/intlayer_with_tanstack.md +166 -241
  55. package/docs/en/intlayer_with_vite+preact.md +12 -12
  56. package/docs/en/intlayer_with_vite+react.md +12 -12
  57. package/docs/en/intlayer_with_vite+solid.md +2 -2
  58. package/docs/en/intlayer_with_vite+svelte.md +2 -2
  59. package/docs/en/intlayer_with_vite+vue.md +12 -12
  60. package/docs/en/introduction.md +1 -1
  61. package/docs/en/packages/next-intlayer/useDictionary.md +1 -1
  62. package/docs/en/packages/next-intlayer/useIntlayer.md +1 -1
  63. package/docs/en/packages/react-intlayer/useDictionary.md +1 -1
  64. package/docs/en/packages/react-intlayer/useI18n.md +1 -1
  65. package/docs/en/packages/react-intlayer/useIntlayer.md +1 -1
  66. package/docs/en/releases/v6.md +1 -0
  67. package/docs/en/roadmap.md +1 -1
  68. package/docs/en-GB/intlayer_with_angular.md +3 -3
  69. package/docs/en-GB/intlayer_with_astro.md +246 -0
  70. package/docs/en-GB/intlayer_with_create_react_app.md +5 -4
  71. package/docs/en-GB/intlayer_with_express.md +2 -2
  72. package/docs/en-GB/intlayer_with_nestjs.md +2 -2
  73. package/docs/en-GB/intlayer_with_nextjs_14.md +4 -4
  74. package/docs/en-GB/intlayer_with_nextjs_15.md +2 -2
  75. package/docs/en-GB/intlayer_with_nextjs_page_router.md +2 -2
  76. package/docs/en-GB/intlayer_with_nuxt.md +2 -2
  77. package/docs/en-GB/intlayer_with_react_native+expo.md +11 -20
  78. package/docs/en-GB/intlayer_with_react_router_v7.md +171 -220
  79. package/docs/en-GB/intlayer_with_tanstack.md +174 -248
  80. package/docs/en-GB/intlayer_with_vite+preact.md +9 -9
  81. package/docs/en-GB/intlayer_with_vite+react.md +9 -9
  82. package/docs/en-GB/intlayer_with_vite+vue.md +11 -11
  83. package/docs/en-GB/packages/next-intlayer/useIntlayer.md +1 -1
  84. package/docs/en-GB/packages/react-intlayer/useIntlayer.md +1 -1
  85. package/docs/es/intlayer_with_angular.md +2 -2
  86. package/docs/es/intlayer_with_astro.md +246 -0
  87. package/docs/es/intlayer_with_create_react_app.md +3 -2
  88. package/docs/es/intlayer_with_express.md +2 -2
  89. package/docs/es/intlayer_with_nextjs_14.md +2 -2
  90. package/docs/es/intlayer_with_nextjs_15.md +2 -2
  91. package/docs/es/intlayer_with_react_native+expo.md +11 -20
  92. package/docs/es/intlayer_with_react_router_v7.md +188 -232
  93. package/docs/es/intlayer_with_tanstack.md +203 -273
  94. package/docs/es/intlayer_with_vite+preact.md +7 -7
  95. package/docs/es/intlayer_with_vite+react.md +7 -7
  96. package/docs/es/intlayer_with_vite+vue.md +9 -9
  97. package/docs/fr/intlayer_with_angular.md +2 -2
  98. package/docs/fr/intlayer_with_astro.md +246 -0
  99. package/docs/fr/intlayer_with_create_react_app.md +3 -2
  100. package/docs/fr/intlayer_with_express.md +2 -2
  101. package/docs/fr/intlayer_with_nestjs.md +2 -2
  102. package/docs/fr/intlayer_with_nextjs_14.md +2 -2
  103. package/docs/fr/intlayer_with_react_native+expo.md +11 -20
  104. package/docs/fr/intlayer_with_react_router_v7.md +188 -248
  105. package/docs/fr/intlayer_with_tanstack.md +192 -265
  106. package/docs/fr/intlayer_with_vite+preact.md +7 -7
  107. package/docs/fr/intlayer_with_vite+react.md +7 -7
  108. package/docs/fr/intlayer_with_vite+vue.md +9 -9
  109. package/docs/hi/intlayer_cli.md +1 -4
  110. package/docs/hi/intlayer_with_angular.md +2 -2
  111. package/docs/hi/intlayer_with_astro.md +246 -0
  112. package/docs/hi/intlayer_with_create_react_app.md +2 -2
  113. package/docs/hi/intlayer_with_express.md +2 -2
  114. package/docs/hi/intlayer_with_nestjs.md +2 -2
  115. package/docs/hi/intlayer_with_nextjs_14.md +2 -2
  116. package/docs/hi/intlayer_with_nextjs_15.md +2 -2
  117. package/docs/hi/intlayer_with_nextjs_page_router.md +2 -2
  118. package/docs/hi/intlayer_with_nuxt.md +2 -2
  119. package/docs/hi/intlayer_with_react_native+expo.md +11 -20
  120. package/docs/hi/intlayer_with_react_router_v7.md +199 -243
  121. package/docs/hi/intlayer_with_tanstack.md +210 -285
  122. package/docs/hi/intlayer_with_vite+preact.md +9 -9
  123. package/docs/hi/intlayer_with_vite+react.md +9 -9
  124. package/docs/hi/intlayer_with_vite+solid.md +1 -1
  125. package/docs/hi/intlayer_with_vite+vue.md +11 -11
  126. package/docs/it/intlayer_with_angular.md +2 -2
  127. package/docs/it/intlayer_with_astro.md +246 -0
  128. package/docs/it/intlayer_with_create_react_app.md +3 -2
  129. package/docs/it/intlayer_with_express.md +2 -2
  130. package/docs/it/intlayer_with_nestjs.md +2 -2
  131. package/docs/it/intlayer_with_nextjs_14.md +2 -2
  132. package/docs/it/intlayer_with_nextjs_15.md +2 -2
  133. package/docs/it/intlayer_with_nextjs_page_router.md +2 -2
  134. package/docs/it/intlayer_with_nuxt.md +2 -2
  135. package/docs/it/intlayer_with_react_native+expo.md +11 -21
  136. package/docs/it/intlayer_with_react_router_v7.md +195 -242
  137. package/docs/it/intlayer_with_tanstack.md +203 -267
  138. package/docs/it/intlayer_with_vite+preact.md +9 -9
  139. package/docs/it/intlayer_with_vite+react.md +13 -11
  140. package/docs/it/intlayer_with_vite+vue.md +11 -11
  141. package/docs/ja/intlayer_with_angular.md +2 -2
  142. package/docs/ja/intlayer_with_astro.md +246 -0
  143. package/docs/ja/intlayer_with_create_react_app.md +3 -2
  144. package/docs/ja/intlayer_with_express.md +2 -2
  145. package/docs/ja/intlayer_with_nestjs.md +2 -2
  146. package/docs/ja/intlayer_with_nextjs_14.md +2 -2
  147. package/docs/ja/intlayer_with_nextjs_15.md +2 -2
  148. package/docs/ja/intlayer_with_nextjs_page_router.md +2 -2
  149. package/docs/ja/intlayer_with_nuxt.md +2 -2
  150. package/docs/ja/intlayer_with_react_native+expo.md +18 -29
  151. package/docs/ja/intlayer_with_react_router_v7.md +204 -250
  152. package/docs/ja/intlayer_with_tanstack.md +218 -286
  153. package/docs/ja/intlayer_with_vite+preact.md +9 -9
  154. package/docs/ja/intlayer_with_vite+react.md +11 -11
  155. package/docs/ja/intlayer_with_vite+vue.md +11 -11
  156. package/docs/ko/intlayer_with_angular.md +2 -2
  157. package/docs/ko/intlayer_with_astro.md +246 -0
  158. package/docs/ko/intlayer_with_create_react_app.md +3 -2
  159. package/docs/ko/intlayer_with_express.md +2 -2
  160. package/docs/ko/intlayer_with_nestjs.md +2 -2
  161. package/docs/ko/intlayer_with_nextjs_14.md +2 -2
  162. package/docs/ko/intlayer_with_nextjs_15.md +2 -2
  163. package/docs/ko/intlayer_with_nextjs_page_router.md +2 -2
  164. package/docs/ko/intlayer_with_nuxt.md +2 -2
  165. package/docs/ko/intlayer_with_react_native+expo.md +19 -28
  166. package/docs/ko/intlayer_with_react_router_v7.md +190 -244
  167. package/docs/ko/intlayer_with_tanstack.md +200 -270
  168. package/docs/ko/intlayer_with_vite+preact.md +9 -9
  169. package/docs/ko/intlayer_with_vite+react.md +9 -9
  170. package/docs/ko/intlayer_with_vite+vue.md +11 -11
  171. package/docs/pt/intlayer_with_angular.md +2 -2
  172. package/docs/pt/intlayer_with_astro.md +246 -0
  173. package/docs/pt/intlayer_with_create_react_app.md +3 -2
  174. package/docs/pt/intlayer_with_express.md +2 -2
  175. package/docs/pt/intlayer_with_nestjs.md +2 -2
  176. package/docs/pt/intlayer_with_nextjs_14.md +2 -2
  177. package/docs/pt/intlayer_with_nextjs_15.md +2 -2
  178. package/docs/pt/intlayer_with_nextjs_page_router.md +2 -2
  179. package/docs/pt/intlayer_with_nuxt.md +2 -2
  180. package/docs/pt/intlayer_with_react_native+expo.md +11 -20
  181. package/docs/pt/intlayer_with_react_router_v7.md +7 -13
  182. package/docs/pt/intlayer_with_tanstack.md +183 -258
  183. package/docs/pt/intlayer_with_vite+preact.md +9 -9
  184. package/docs/pt/intlayer_with_vite+react.md +9 -9
  185. package/docs/pt/intlayer_with_vite+vue.md +9 -9
  186. package/docs/ru/intlayer_with_angular.md +2 -2
  187. package/docs/ru/intlayer_with_astro.md +246 -0
  188. package/docs/ru/intlayer_with_create_react_app.md +3 -2
  189. package/docs/ru/intlayer_with_express.md +2 -2
  190. package/docs/ru/intlayer_with_nestjs.md +2 -2
  191. package/docs/ru/intlayer_with_nextjs_14.md +2 -2
  192. package/docs/ru/intlayer_with_nextjs_15.md +2 -2
  193. package/docs/ru/intlayer_with_nextjs_page_router.md +2 -2
  194. package/docs/ru/intlayer_with_nuxt.md +2 -2
  195. package/docs/ru/intlayer_with_react_native+expo.md +11 -20
  196. package/docs/ru/intlayer_with_react_router_v7.md +192 -238
  197. package/docs/ru/intlayer_with_tanstack.md +197 -269
  198. package/docs/ru/intlayer_with_vite+preact.md +9 -9
  199. package/docs/ru/intlayer_with_vite+react.md +9 -9
  200. package/docs/ru/intlayer_with_vite+vue.md +11 -11
  201. package/docs/tr/how_works_intlayer.md +1 -1
  202. package/docs/tr/index.md +1 -1
  203. package/docs/tr/intlayer_cli.md +1 -1
  204. package/docs/tr/intlayer_with_angular.md +4 -4
  205. package/docs/tr/intlayer_with_astro.md +246 -0
  206. package/docs/tr/intlayer_with_create_react_app.md +4 -4
  207. package/docs/tr/intlayer_with_express.md +3 -3
  208. package/docs/tr/intlayer_with_lynx+react.md +1 -1
  209. package/docs/tr/intlayer_with_nestjs.md +2 -2
  210. package/docs/tr/intlayer_with_nextjs_14.md +2 -2
  211. package/docs/tr/intlayer_with_nextjs_15.md +4 -4
  212. package/docs/tr/intlayer_with_nextjs_page_router.md +5 -5
  213. package/docs/tr/intlayer_with_nuxt.md +4 -4
  214. package/docs/tr/intlayer_with_react_native+expo.md +12 -21
  215. package/docs/tr/intlayer_with_react_router_v7.md +222 -267
  216. package/docs/tr/intlayer_with_tanstack.md +400 -303
  217. package/docs/tr/intlayer_with_vite+preact.md +12 -12
  218. package/docs/tr/intlayer_with_vite+react.md +12 -12
  219. package/docs/tr/intlayer_with_vite+solid.md +2 -2
  220. package/docs/tr/intlayer_with_vite+svelte.md +2 -2
  221. package/docs/tr/intlayer_with_vite+vue.md +12 -12
  222. package/docs/tr/introduction.md +1 -1
  223. package/docs/tr/packages/react-intlayer/useDictionary.md +1 -1
  224. package/docs/tr/packages/react-intlayer/useI18n.md +1 -1
  225. package/docs/tr/roadmap.md +1 -1
  226. package/docs/zh/intlayer_with_angular.md +2 -2
  227. package/docs/zh/intlayer_with_astro.md +246 -0
  228. package/docs/zh/intlayer_with_create_react_app.md +3 -2
  229. package/docs/zh/intlayer_with_express.md +2 -2
  230. package/docs/zh/intlayer_with_nestjs.md +2 -2
  231. package/docs/zh/intlayer_with_nextjs_14.md +2 -2
  232. package/docs/zh/intlayer_with_nextjs_15.md +2 -2
  233. package/docs/zh/intlayer_with_nextjs_page_router.md +2 -2
  234. package/docs/zh/intlayer_with_nuxt.md +2 -2
  235. package/docs/zh/intlayer_with_react_native+expo.md +19 -28
  236. package/docs/zh/intlayer_with_react_router_v7.md +200 -248
  237. package/docs/zh/intlayer_with_tanstack.md +208 -283
  238. package/docs/zh/intlayer_with_vite+preact.md +9 -9
  239. package/docs/zh/intlayer_with_vite+react.md +9 -9
  240. package/docs/zh/intlayer_with_vite+vue.md +9 -9
  241. package/package.json +11 -11
  242. 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 入门
5
- description: 学习如何使用 Intlayer 为您的 Tanstack Start 应用添加国际化 (i18n)。按照本综合指南,使您的应用支持多语言和基于区域设置的路由。
5
+ description: 学习如何使用 Intlayer 为您的 Tanstack Start 应用添加国际化 (i18n)。按照本综合指南,使您的应用支持多语言并具备基于区域设置的路由功能。
6
6
  keywords:
7
7
  - 国际化
8
8
  - 文档
@@ -15,19 +15,17 @@ keywords:
15
15
  slugs:
16
16
  - doc
17
17
  - environment
18
- - vite-and-react
19
18
  - tanstack-start
20
- applicationTemplate: https://github.com/AydinTheFirst/tanstack-start-intlayer
21
- author: AydinTheFirst
19
+ applicationTemplate: https://github.com/aymericzip/intlayer-tanstack-start-template
22
20
  ---
23
21
 
24
22
  # 使用 Intlayer 和 Tanstack Start 开始国际化 (i18n)
25
23
 
26
- 本指南演示了如何在 Tanstack Start 项目中集成 **Intlayer**,实现无缝国际化,支持基于区域设置的路由、TypeScript 支持以及现代开发实践。
24
+ 本指南演示如何在 Tanstack Start 项目中集成 **Intlayer**,实现无缝国际化,支持基于区域设置的路由、TypeScript 支持以及现代开发实践。
27
25
 
28
26
  ## 什么是 Intlayer?
29
27
 
30
- **Intlayer** 是一个创新的开源国际化 (i18n) 库,旨在简化现代 Web 应用中的多语言支持。
28
+ **Intlayer** 是一个创新的开源国际化(i18n)库,旨在简化现代 Web 应用中的多语言支持。
31
29
 
32
30
  使用 Intlayer,您可以:
33
31
 
@@ -43,7 +41,7 @@ author: AydinTheFirst
43
41
 
44
42
  ### 第一步:创建项目
45
43
 
46
- 首先,按照 TanStack Start 网站上的[创建新项目](https://tanstack.com/start/latest/docs/framework/react/quick-start)指南创建一个新的 TanStack Start 项目。
44
+ 首先,按照 TanStack Start 网站上的[新建项目](https://tanstack.com/start/latest/docs/framework/react/quick-start)指南创建一个新的 TanStack Start 项目。
47
45
 
48
46
  ### 第二步:安装 Intlayer 包
49
47
 
@@ -61,114 +59,61 @@ pnpm add vite-intlayer --save-dev
61
59
 
62
60
  - **intlayer**
63
61
 
64
- - **intlayer**
65
-
66
- 核心包,提供用于配置管理、翻译、[内容声明](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/dictionary/get_started.md)、转译和[CLI命令](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/intlayer_cli.md)的国际化工具。
67
-
68
- - **react-intlayer**
62
+ - **intlayer**
63
+ 核心包,提供用于配置管理、翻译、[内容声明](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/dictionary/get_started.md)、转译以及[命令行工具](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/intlayer_cli.md)的国际化工具。
69
64
 
65
+ - **react-intlayer**
70
66
  将 Intlayer 集成到 React 应用中的包。它为 React 国际化提供上下文提供者和钩子。
71
67
 
72
- - **vite-intlayer**
73
-
74
- 包含用于将 Intlayer 集成到[Vite 打包器](https://vite.dev/guide/why.html#why-bundle-for-production)的 Vite 插件,以及用于检测用户首选语言环境、管理 Cookie 和处理 URL 重定向的中间件。
68
+ - **vite-intlayer**
69
+ 包含用于将 Intlayer 集成到[Vite 打包器](https://vite.dev/guide/why.html#why-bundle-for-production)的 Vite 插件,以及用于检测用户首选语言、管理 Cookie 和处理 URL 重定向的中间件。
75
70
 
76
71
  ### 第三步:项目配置
77
72
 
78
73
  创建一个配置文件来配置您的应用程序语言:
79
74
 
80
- ```typescript fileName="intlayer.config.ts" codeFormat="typescript"
75
+ ```typescript fileName="intlayer.config.ts"
81
76
  import type { IntlayerConfig } from "intlayer";
82
77
 
83
78
  import { Locales } from "intlayer";
84
79
 
85
80
  const config: IntlayerConfig = {
86
- internationalization: {
87
- defaultLocale: Locales.ENGLISH, // 默认语言
88
- locales: [
89
- Locales.ENGLISH, // 英语
90
- Locales.FRENCH, // 法语
91
- Locales.SPANISH, // 西班牙语
92
- // 您的其他语言
93
- ],
94
- },
95
- };
96
-
97
- export default config;
98
- ```
99
-
100
- ```javascript fileName="intlayer.config.mjs" codeFormat="esm"
101
- import { Locales } from "intlayer";
102
-
103
- /** @type {import('intlayer').IntlayerConfig} */
104
- const config = {
105
- internationalization: {
106
- defaultLocale: Locales.ENGLISH, // 默认语言
107
- locales: [
108
- Locales.ENGLISH, // 英语
109
- Locales.FRENCH, // 法语
110
- Locales.SPANISH, // 西班牙语
111
- // 你的其他语言
112
- ],
113
- },
114
- };
115
-
116
- export default config;
117
- ```
118
-
119
- ```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
120
- const { Locales } = require("intlayer");
121
-
122
- /** @type {import('intlayer').IntlayerConfig} */
123
- const config = {
124
81
  internationalization: {
125
82
  defaultLocale: Locales.ENGLISH,
126
- locales: [
127
- Locales.ENGLISH,
128
- Locales.FRENCH,
129
- Locales.SPANISH,
130
- // 你的其他语言
131
- ],
83
+ locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
132
84
  },
133
85
  };
134
86
 
135
- module.exports = config;
87
+ export default config;
136
88
  ```
137
89
 
138
- > 通过此配置文件,您可以设置本地化的 URL、中间件重定向、Cookie 名称、内容声明的位置和扩展名,禁用控制台中的 Intlayer 日志等。有关可用参数的完整列表,请参阅[配置文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/configuration.md)。
90
+ > 通过此配置文件,您可以设置本地化 URL、中间件重定向、cookie 名称、内容声明的位置和扩展名、禁用控制台中的 Intlayer 日志等。有关可用参数的完整列表,请参阅[配置文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/configuration.md)。
139
91
 
140
92
  ### 第4步:在您的 Vite 配置中集成 Intlayer
141
93
 
142
94
  将 intlayer 插件添加到您的配置中:
143
95
 
144
- ```typescript fileName="vite.config.ts" codeFormat="typescript"
96
+ ```typescript fileName="vite.config.ts"
145
97
  import { reactRouter } from "@react-router/dev/vite";
146
98
  import { defineConfig } from "vite";
147
- import { intlayerMiddlewarePlugin, intlayer } from "vite-intlayer";
99
+ import { intlayer } from "vite-intlayer";
148
100
  import tsconfigPaths from "vite-tsconfig-paths";
149
101
 
150
102
  export default defineConfig({
151
- plugins: [
152
- reactRouter(),
153
- tsconfigPaths(),
154
- intlayer(),
155
- intlayerMiddlewarePlugin(),
156
- ],
103
+ plugins: [reactRouter(), tsconfigPaths(), intlayer()],
157
104
  });
158
105
  ```
159
106
 
160
- > `intlayer()` 是用于将 Intlayer 集成到 Vite 的插件。它确保内容声明文件的构建,并在开发模式下监控这些文件。它在 Vite 应用中定义了 Intlayer 的环境变量。此外,它还提供别名以优化性能。
107
+ > `intlayer()` Vite 插件用于将 Intlayer 集成到 Vite 中。它确保构建内容声明文件并在开发模式下监视它们。它在 Vite 应用中定义了 Intlayer 环境变量。此外,它还提供别名以优化性能。
161
108
 
162
- ### 第五步:创建布局组件
109
+ ### 第5步:创建布局组件
163
110
 
164
- 设置你的根布局和特定语言环境的布局:
111
+ 设置您的根布局和特定语言环境的布局:
165
112
 
166
113
  #### 根布局
167
114
 
168
- ```tsx fileName="src/routes/{-$locale}/route.tsx" codeFormat="typescript"
169
- // src/routes/{-$locale}/route.tsx
115
+ ```tsx fileName="src/routes/{-$locale}/route.tsx"
170
116
  import { createFileRoute, Navigate, Outlet } from "@tanstack/react-router";
171
- import { configuration } from "intlayer";
172
117
  import { IntlayerProvider, useLocale } from "react-intlayer";
173
118
 
174
119
  import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes";
@@ -178,10 +123,11 @@ export const Route = createFileRoute("/{-$locale}")({
178
123
  });
179
124
 
180
125
  function LayoutComponent() {
126
+ const { defaultLocale } = useLocale();
181
127
  const { locale } = Route.useParams();
182
128
 
183
129
  return (
184
- <IntlayerProvider locale={locale}>
130
+ <IntlayerProvider locale={defaultLocale}>
185
131
  <Outlet />
186
132
  </IntlayerProvider>
187
133
  );
@@ -192,7 +138,7 @@ function LayoutComponent() {
192
138
 
193
139
  创建并管理您的内容声明以存储翻译:
194
140
 
195
- ```tsx fileName="src/contents/page.content.ts" contentDeclarationFormat="typescript"
141
+ ```tsx fileName="src/contents/page.content.ts"
196
142
  import type { Dictionary } from "intlayer";
197
143
 
198
144
  import { t } from "intlayer";
@@ -201,25 +147,29 @@ const appContent = {
201
147
  content: {
202
148
  links: {
203
149
  about: t({
150
+ zh: "关于",
204
151
  en: "About",
205
152
  es: "Acerca de",
206
153
  fr: "À propos",
207
154
  }),
208
155
  home: t({
209
- en: "首页",
156
+ zh: "首页",
157
+ en: "Home",
210
158
  es: "Inicio",
211
159
  fr: "Accueil",
212
160
  }),
213
161
  },
214
162
  meta: {
215
163
  description: t({
216
- en: "这是一个使用 Intlayer TanStack Router 的示例",
164
+ zh: "这是一个使用 Intlayer TanStack Router 的示例",
165
+ en: "This is an example of using Intlayer with TanStack Router",
217
166
  es: "Este es un ejemplo de uso de Intlayer con TanStack Router",
218
167
  fr: "Ceci est un exemple d'utilisation d'Intlayer avec TanStack Router",
219
168
  }),
220
169
  },
221
170
  title: t({
222
- en: "欢迎使用 Intlayer + TanStack Router",
171
+ zh: "欢迎使用 Intlayer + TanStack Router",
172
+ en: "Welcome to Intlayer + TanStack Router",
223
173
  es: "Bienvenido a Intlayer + TanStack Router",
224
174
  fr: "Bienvenue à Intlayer + TanStack Router",
225
175
  }),
@@ -230,67 +180,107 @@ const appContent = {
230
180
  export default appContent;
231
181
  ```
232
182
 
233
- > 您的内容声明可以在应用程序中的任何位置定义,只要它们被包含在 `contentDir` 目录中(默认是 `./app`)。并且文件扩展名需匹配内容声明的文件扩展名(默认是 `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`)。
183
+ > 您的内容声明可以在应用程序中的任何位置定义,只要它们被包含在 `contentDir` 目录中(默认是 `./app`)。并且文件扩展名需匹配内容声明文件扩展名(默认是 `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`)。
234
184
 
235
185
  > 更多详情,请参阅[内容声明文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/dictionary/get_started.md)。
236
186
 
237
- ### 第7步:创建支持多语言环境的组件和钩子
187
+ ### 第7步:创建支持多语言的组件和钩子
238
188
 
239
- 创建一个用于多语言环境导航的 `LocalizedLink` 组件:
189
+ 创建一个用于多语言导航的 `LocalizedLink` 组件:
240
190
 
241
- ```tsx fileName="src/components/localized-link.tsx" codeFormat="typescript"
242
- // src/components/localized-link.tsx
243
- // eslint-disable-next-line no-restricted-imports
244
- import { Link, type LinkProps } from "@tanstack/react-router";
245
- import { getLocalizedUrl } from "intlayer";
246
- import { useLocale } from "react-intlayer";
191
+ ```tsx fileName="src/components/localized-link.tsx"
192
+ import type { FC } from "react";
193
+
194
+ import { Link, type LinkComponentProps } from "@tanstack/react-router";
195
+ import { useLocale } from "intlayer";
196
+
197
+ export const LOCALE_ROUTE = "{-$locale}" as const;
198
+
199
+ // 主要工具类型
200
+ export type RemoveLocaleParam<T> = T extends string
201
+ ? RemoveLocaleFromString<T>
202
+ : T;
203
+
204
+ export type To = RemoveLocaleParam<LinkComponentProps["to"]>;
205
+
206
+ type CollapseDoubleSlashes<S extends string> =
207
+ S extends `${infer H}//${infer T}` ? CollapseDoubleSlashes<`${H}/${T}`> : S;
247
208
 
248
209
  type LocalizedLinkProps = {
249
- to: string;
250
- } & Omit<LinkProps, "to">;
210
+ to?: To;
211
+ } & Omit<LinkComponentProps, "to">;
251
212
 
252
- export function LocalizedLink(props: LocalizedLinkProps) {
253
- const { locale } = useLocale();
213
+ // 辅助类型
214
+ type RemoveAll<
215
+ S extends string,
216
+ Sub extends string,
217
+ > = S extends `${infer H}${Sub}${infer T}` ? RemoveAll<`${H}${T}`, Sub> : S;
254
218
 
255
- const isExternal = (to: string) => {
256
- return /^(https?:)?\/\//.test(to);
257
- };
219
+ type RemoveLocaleFromString<S extends string> = CollapseDoubleSlashes<
220
+ RemoveAll<S, typeof LOCALE_ROUTE>
221
+ >;
258
222
 
259
- const to = isExternal(props.to)
260
- ? props.to
261
- : getLocalizedUrl(props.to, locale);
223
+ export const LocalizedLink: FC<LocalizedLinkProps> = (props) => {
224
+ const { locale } = useLocale();
262
225
 
263
- return <Link {...props} to={to as LinkProps["to"]} />;
264
- }
226
+ return (
227
+ <Link
228
+ {...props}
229
+ params={{
230
+ locale,
231
+ ...(typeof props?.params === "object" ? props?.params : {}),
232
+ }}
233
+ to={`/${LOCALE_ROUTE}${props.to}` as LinkComponentProps["to"]}
234
+ />
235
+ );
236
+ };
265
237
  ```
266
238
 
267
- 创建一个用于编程式导航的 `useLocalizedNavigate` 钩子:
239
+ 该组件有两个目标:
268
240
 
269
- ```tsx fileName="src/hooks/useLocalizedNavigate.tsx" codeFormat="typescript"
270
- // src/hooks/useLocalizedNavigate.tsx
271
- // eslint-disable-next-line no-restricted-imports
272
- import { NavigateOptions, useNavigate } from "@tanstack/react-router";
273
- import { getLocalizedUrl } from "intlayer";
274
- import { useLocale } from "react-intlayer";
241
+ - 移除 URL 中不必要的 `{-$locale}` 前缀。
242
+ - 将 locale 参数注入 URL,确保用户被直接重定向到本地化路由。
275
243
 
276
- type LocalizedNavigateOptions = {
277
- to: string;
278
- } & Omit<NavigateOptions, "to">;
244
+ 接下来我们可以创建一个用于编程导航的 `useLocalizedNavigate` 钩子:
245
+
246
+ ```tsx fileName="src/hooks/useLocalizedNavigate.tsx"
247
+ import { useLocale } from "react-intlayer";
248
+ import { useNavigate } from "@tanstack/react-router";
249
+ import { LOCALE_ROUTE } from "@/components/localized-link";
250
+ import type { FileRouteTypes } from "@/routeTree.gen";
279
251
 
280
252
  export const useLocalizedNavigate = () => {
281
253
  const navigate = useNavigate();
254
+
282
255
  const { locale } = useLocale();
283
256
 
284
- const isExternal = (to: string) => {
285
- return /^(https?:)?\/\//.test(to);
286
- };
257
+ type StripLocalePrefix<T extends string> = T extends
258
+ | `/${typeof LOCALE_ROUTE}`
259
+ | `/${typeof LOCALE_ROUTE}/`
260
+ ? "/" // 去除本地化前缀后返回根路径
261
+ : T extends `/${typeof LOCALE_ROUTE}/${infer Rest}`
262
+ ? `/${Rest}` // 去除本地化前缀后返回剩余路径
263
+ : never;
264
+
265
+ type LocalizedTo = StripLocalePrefix<FileRouteTypes["to"]>;
266
+
267
+ interface LocalizedNavigate {
268
+ (to: LocalizedTo): ReturnType<typeof navigate>;
269
+ (
270
+ opts: { to: LocalizedTo } & Record<string, unknown>
271
+ ): ReturnType<typeof navigate>;
272
+ }
287
273
 
288
- const localizedNavigate = (options: LocalizedNavigateOptions) => {
289
- const to = isExternal(options.to)
290
- ? options.to
291
- : getLocalizedUrl(options.to, locale);
274
+ const localizedNavigate: LocalizedNavigate = (args: any) => {
275
+ if (typeof args === "string") {
276
+ return navigate({ to: `/${LOCALE_ROUTE}${args}`, params: { locale } });
277
+ }
292
278
 
293
- navigate({ ...options, to: to as NavigateOptions["to"] });
279
+ const { to, ...rest } = args;
280
+
281
+ const localedTo = `/${LOCALE_ROUTE}${to}` as any;
282
+
283
+ return navigate({ to: localedTo, params: { locale, ...rest } as any });
294
284
  };
295
285
 
296
286
  return localizedNavigate;
@@ -301,23 +291,9 @@ export const useLocalizedNavigate = () => {
301
291
 
302
292
  在整个应用程序中访问您的内容字典:
303
293
 
304
- #### 根重定向页面
305
-
306
- ```tsx fileName="src/routes/page.tsx" codeFormat="typescript"
307
- // src/routes/page.tsx
308
- import { useLocale } from "react-intlayer";
309
- import { Navigate } from "react-router";
310
-
311
- export default function Page() {
312
- const { locale } = useLocale();
313
-
314
- return <Navigate replace to={locale} />;
315
- }
316
- ```
317
-
318
294
  #### 本地化首页
319
295
 
320
- ```tsx fileName="src/routes/{-$locale}/index.tsx" codeFormat="typescript"
296
+ ```tsx fileName="src/routes/{-$locale}/index.tsx"
321
297
  import { createFileRoute } from "@tanstack/react-router";
322
298
  import { getIntlayer } from "intlayer";
323
299
  import { useIntlayer } from "react-intlayer";
@@ -346,16 +322,15 @@ function RouteComponent() {
346
322
  const navigate = useLocalizedNavigate();
347
323
 
348
324
  return (
349
- <div className="grid place-items-center h-screen">
350
- <div className="flex flex-col gap-4 items-center text-center">
325
+ <div>
326
+ <div>
351
327
  {content.title}
352
328
  <LocaleSwitcher />
353
- <div className="flex gap-4">
354
- <a href="/">索引</a>
329
+ <div>
355
330
  <LocalizedLink to="/">{content.links.home}</LocalizedLink>
356
331
  <LocalizedLink to="/about">{content.links.about}</LocalizedLink>
357
332
  </div>
358
- <div className="flex gap-4">
333
+ <div>
359
334
  <button onClick={() => navigate({ to: "/" })}>
360
335
  {content.links.home}
361
336
  </button>
@@ -369,63 +344,71 @@ function RouteComponent() {
369
344
  }
370
345
  ```
371
346
 
372
- > 想了解更多关于 `useIntlayer` 钩子的内容,请参阅[文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/react-intlayer/useIntlayer.md)。
347
+ > 要了解更多关于 `useIntlayer` 钩子的内容,请参阅[文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/react-intlayer/useIntlayer.md)。
373
348
 
374
349
  ### 第9步:创建语言切换组件
375
350
 
376
351
  创建一个组件,允许用户切换语言:
377
352
 
378
- ```tsx fileName="src/components/locale-switcher.tsx" codeFormat="typescript"
353
+ ```tsx fileName="src/components/locale-switcher.tsx"
354
+ import type { FC } from "react";
355
+
379
356
  import { useLocation } from "@tanstack/react-router";
380
- import {
381
- getHTMLTextDir,
382
- getLocaleName,
383
- getLocalizedUrl,
384
- Locales,
385
- } from "intlayer";
386
- import { useIntlayer, useLocale } from "react-intlayer";
387
-
388
- export default function LocaleSwitcher() {
389
- const { pathname, searchStr } = useLocation();
390
- const content = useIntlayer("locale-switcher");
391
-
392
- const { availableLocales, locale, setLocale } = useLocale({
393
- onLocaleChange: (newLocale) => {
394
- const pathWithLocale = getLocalizedUrl(pathname + searchStr, newLocale);
395
- location.replace(pathWithLocale);
396
- },
397
- });
357
+ import { getHTMLTextDir, getLocaleName, getPathWithoutLocale } from "intlayer";
358
+ import { setLocaleCookie, useIntlayer, useLocale } from "react-intlayer";
359
+
360
+ import { LocalizedLink, To } from "./localized-link";
361
+
362
+ export const LocaleSwitcher: FC = () => {
363
+ const { localeSwitcherLabel } = useIntlayer("locale-switcher"); // 使用 useIntlayer 钩子获取语言切换器标签
364
+ const { pathname } = useLocation(); // 获取当前路径名
365
+
366
+ const { availableLocales, locale } = useLocale(); // 获取可用语言列表和当前语言
367
+
368
+ const pathWithoutLocale = getPathWithoutLocale(pathname); // 获取不带语言前缀的路径
398
369
 
399
370
  return (
400
- <select
401
- aria-label={content.label.toString()}
402
- onChange={(e) => setLocale(e.target.value)}
403
- value={locale}
404
- >
405
- {availableLocales.map((localeItem) => (
406
- <option
407
- dir={getHTMLTextDir(localeItem)}
408
- key={localeItem}
409
- lang={localeItem}
410
- value={localeItem}
411
- >
412
- {/* 示例:Français(法语) */}
413
- {getLocaleName(localeItem, locale)} (
414
- {getLocaleName(localeItem, Locales.ENGLISH)})
415
- </option>
371
+ <ol>
372
+ {availableLocales.map((localeEl) => (
373
+ <li key={localeEl}>
374
+ <LocalizedLink
375
+ aria-current={localeEl === locale ? "page" : undefined} // 当前语言时设置 aria-current 为 page
376
+ aria-label={`${localeSwitcherLabel.value} ${getLocaleName(localeEl)}`} // 设置无障碍标签,显示语言切换器标签和语言名称
377
+ onClick={() => setLocaleCookie(localeEl)} // 点击时设置语言 cookie
378
+ params={{ locale: localeEl }} // 传递语言参数
379
+ to={pathWithoutLocale as To} // 跳转到不带语言前缀的路径
380
+ >
381
+ <span>
382
+ {/* 语言环境 - 例如 FR */}
383
+ {localeItem}
384
+ </span>
385
+ <span>
386
+ {/* 语言在其自身语言环境中的名称 - 例如 Français */}
387
+ {getLocaleName(localeItem, locale)}
388
+ </span>
389
+ <span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
390
+ {/* 语言在当前语言环境中的名称 - 例如当前语言环境为 Locales.SPANISH 时显示 Francés */}
391
+ {getLocaleName(localeItem)}
392
+ </span>
393
+ <span dir="ltr" lang={Locales.ENGLISH}>
394
+ {/* 语言的英文名称 - 例如 French */}
395
+ {getLocaleName(localeItem, Locales.ENGLISH)}
396
+ </span>
397
+ </LocalizedLink>
398
+ </li>
416
399
  ))}
417
- </select>
400
+ </ol>
418
401
  );
419
- }
402
+ };
420
403
  ```
421
404
 
422
- > 想了解更多关于 `useLocale` 钩子的内容,请参考[文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/react-intlayer/useLocale.md)。
405
+ > 要了解有关 `useLocale` 钩子的更多信息,请参阅[文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/react-intlayer/useLocale.md)。
423
406
 
424
- ### 第10步:添加HTML属性管理(可选)
407
+ ### 第10步:添加 HTML 属性管理(可选)
425
408
 
426
- 创建一个钩子来管理HTML的lang和dir属性:
409
+ 创建一个钩子来管理 HTML lang dir 属性:
427
410
 
428
- ```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx" codeFormat="typescript"
411
+ ```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx"
429
412
  // src/hooks/useI18nHTMLAttributes.tsx
430
413
  import { getHTMLTextDir } from "intlayer";
431
414
  import { useEffect } from "react";
@@ -436,19 +419,18 @@ export const useI18nHTMLAttributes = () => {
436
419
 
437
420
  useEffect(() => {
438
421
  document.documentElement.lang = locale;
439
- document.documentElement.dir = getHTMLTextDir(locale); // 设置HTML的文本方向属性
422
+ document.documentElement.dir = getHTMLTextDir(locale);
440
423
  }, [locale]);
441
424
  };
442
425
  ```
443
426
 
444
427
  然后在你的根组件中使用它:
445
428
 
446
- ```tsx fileName="src/routes/{-$locale}/index.tsx" codeFormat="typescript"
429
+ ```tsx fileName="src/routes/{-$locale}/index.tsx"
447
430
  import { createFileRoute, Navigate, Outlet } from "@tanstack/react-router";
448
- import { configuration } from "intlayer";
449
431
  import { IntlayerProvider, useLocale } from "react-intlayer";
450
432
 
451
- import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes"; // 导入该hook
433
+ import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes"; // 导入钩子
452
434
 
453
435
  export const Route = createFileRoute("/{-$locale}")({
454
436
  component: LayoutComponent,
@@ -457,55 +439,54 @@ export const Route = createFileRoute("/{-$locale}")({
457
439
  function LayoutComponent() {
458
440
  useI18nHTMLAttributes(); // 添加此行
459
441
 
442
+ const { defaultLocale } = useLocale();
460
443
  const { locale } = Route.useParams();
461
444
 
462
445
  return (
463
- <IntlayerProvider locale={locale}>
446
+ <IntlayerProvider locale={locale ?? defaultLocale}>
464
447
  <Outlet />
465
448
  </IntlayerProvider>
466
449
  );
467
450
  }
468
451
  ```
469
452
 
470
- ### 第11步:构建并运行您的应用程序
453
+ ---
471
454
 
472
- 构建内容字典并运行您的应用程序:
455
+ ### 第11步:添加中间件(可选)
473
456
 
474
- ```bash packageManager="npm"
475
- # 构建 Intlayer 字典
476
- npm run intlayer:build
457
+ 您还可以使用 `intlayerMiddleware` 为您的应用程序添加服务器端路由。该插件将根据 URL 自动检测当前语言环境,并设置相应的语言环境 Cookie。如果未指定语言环境,插件将根据用户浏览器的语言偏好确定最合适的语言环境。如果未检测到语言环境,它将重定向到默认语言环境。
477
458
 
478
- # 启动开发服务器
479
- npm run dev
480
- ```
459
+ > 注意,要在生产环境中使用 `intlayerMiddleware`,您需要将 `vite-intlayer` 包从 `devDependencies` 切换到 `dependencies`。
481
460
 
482
- ```bash packageManager="pnpm"
483
- # 构建 Intlayer 字典
484
- pnpm intlayer:build
461
+ ```typescript {3,7} fileName="vite.config.ts"
462
+ import { reactRouter } from "@react-router/dev/vite";
463
+ import tailwindcss from "@tailwindcss/vite";
464
+ import { defineConfig } from "vite";
465
+ import { intlayer, intlayerMiddleware } from "vite-intlayer";
466
+ import tsconfigPaths from "vite-tsconfig-paths";
485
467
 
486
- # 启动开发服务器
487
- pnpm dev
468
+ export default defineConfig({
469
+ plugins: [
470
+ tailwindcss(),
471
+ reactRouter(),
472
+ tsconfigPaths(),
473
+ intlayer(),
474
+ intlayerMiddleware(),
475
+ ],
476
+ });
488
477
  ```
489
478
 
490
- ```bash packageManager="yarn"
491
- # 构建 Intlayer 字典
492
- yarn intlayer:build
493
-
494
- # 启动开发服务器
495
- yarn dev
496
- ```
479
+ ---
497
480
 
498
481
  ### 第12步:配置 TypeScript(可选)
499
482
 
500
- Intlayer 使用模块增强来利用 TypeScript 的优势,使您的代码库更强大。
483
+ Intlayer 使用模块增强来利用 TypeScript 的优势,使您的代码库更健壮。
501
484
 
502
485
  确保您的 TypeScript 配置包含自动生成的类型:
503
486
 
504
487
  ```json5 fileName="tsconfig.json"
505
488
  {
506
- compilerOptions: {
507
- // ... 您现有的 TypeScript 配置
508
- },
489
+ // ... 您现有的配置
509
490
  include: [
510
491
  // ... 您现有的包含项
511
492
  ".intlayer/**/*.ts", // 包含自动生成的类型
@@ -513,11 +494,13 @@ Intlayer 使用模块增强来利用 TypeScript 的优势,使您的代码库
513
494
  }
514
495
  ```
515
496
 
497
+ ---
498
+
516
499
  ### Git 配置
517
500
 
518
- 建议忽略 Intlayer 生成的文件。这样可以避免将它们提交到您的 Git 仓库。
501
+ 建议忽略 Intlayer 生成的文件。这样可以避免将它们提交到您的 Git 仓库中。
519
502
 
520
- 为此,您可以将以下指令添加到您的 `.gitignore` 文件中:
503
+ 要做到这一点,您可以将以下指令添加到您的 `.gitignore` 文件中:
521
504
 
522
505
  ```plaintext fileName=".gitignore"
523
506
  # 忽略 Intlayer 生成的文件
@@ -526,64 +509,6 @@ Intlayer 使用模块增强来利用 TypeScript 的优势,使您的代码库
526
509
 
527
510
  ---
528
511
 
529
- ### 第 13 步:创建重定向(可选)
530
-
531
- ```typescript fileName="src/routes/{-$locale}/rotue.tsx" codeFormat="typescript"
532
- function LayoutComponent() {
533
- useI18nHTMLAttributes();
534
-
535
- const { locale } = Route.useParams();
536
- const { locale: selectedLocale } = useLocale();
537
- const { defaultLocale } = configuration.internationalization;
538
- const { prefixDefault } = configuration.middleware;
539
-
540
- // 如果 prefixDefault 为 true 且 URL 中没有 locale,则重定向到默认语言
541
- if (selectedLocale === defaultLocale && !locale && prefixDefault) {
542
- return <Navigate replace to={defaultLocale} />;
543
- }
544
-
545
- // 如果 URL 中的 locale 与选定的 locale 不匹配,则重定向到选定的 locale
546
- if (selectedLocale !== defaultLocale && !locale) {
547
- return <Navigate replace to={selectedLocale} />;
548
- }
549
-
550
- return (
551
- <IntlayerProvider locale={locale}>
552
- <Outlet />
553
- </IntlayerProvider>
554
- );
555
- }
556
- ```
557
-
558
- ## 生产部署
559
-
560
- 部署您的应用程序时:
561
-
562
- 1. **构建您的应用程序:**
563
-
564
- ```bash
565
- npm run build
566
- ```
567
-
568
- 2. **构建 Intlayer 词典:**
569
-
570
- ```bash
571
- npm run intlayer:build
572
- ```
573
-
574
- 3. **如果在生产环境中使用中间件,请将 `vite-intlayer` 移动到依赖项:**
575
- ```bash
576
- npm install vite-intlayer --save
577
- ```
578
-
579
- 您的应用程序现在将支持:
580
-
581
- - **URL 结构**:`/en`、`/en/about`、`/tr`、`/tr/about`
582
- - **基于浏览器偏好的自动语言环境检测**
583
- - **基于 Tanstack Start 的语言环境感知路由**
584
- - **带有自动生成类型的 TypeScript 支持**
585
- - **具有正确语言环境处理的服务器端渲染**
586
-
587
512
  ## VS Code 扩展
588
513
 
589
514
  为了提升您使用 Intlayer 的开发体验,您可以安装官方的 **Intlayer VS Code 扩展**。
@@ -592,18 +517,18 @@ function LayoutComponent() {
592
517
 
593
518
  该扩展提供:
594
519
 
595
- - 翻译键的 **自动补全**。
596
- - 缺失翻译的 **实时错误检测**。
597
- - 翻译内容的 **内联预览**。
598
- - 轻松创建和更新翻译的 **快速操作**。
520
+ - 翻译键的**自动补全**。
521
+ - 缺失翻译的**实时错误检测**。
522
+ - 翻译内容的**内联预览**。
523
+ - 轻松创建和更新翻译的**快速操作**。
599
524
 
600
- 有关如何使用该扩展的更多详细信息,请参阅 [Intlayer VS Code 扩展文档](https://intlayer.org/doc/vs-code-extension)。
525
+ 有关如何使用该扩展的更多详细信息,请参阅[Intlayer VS Code 扩展文档](https://intlayer.org/doc/vs-code-extension)。
601
526
 
602
527
  ---
603
528
 
604
- ## 深入了解
529
+ ## 深入探索
605
530
 
606
- 要进一步提升,您可以实现[可视化编辑器](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/intlayer_visual_editor.md)或使用[CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/intlayer_CMS.md)将内容外部化。
531
+ 要进一步使用,您可以实现[可视化编辑器](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/intlayer_visual_editor.md)或使用[内容管理系统(CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/intlayer_CMS.md)将内容外部化。
607
532
 
608
533
  ---
609
534
 
@@ -612,14 +537,14 @@ function LayoutComponent() {
612
537
  - [Intlayer 文档](https://intlayer.org)
613
538
  - [Tanstack Start 文档](https://reactrouter.com/)
614
539
  - [useIntlayer 钩子](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/react-intlayer/useIntlayer.md)
615
- - [useLocale 钩子](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/react-intlayer/useLocale.md)
540
+ - [useLocale hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/react-intlayer/useLocale.md)
616
541
  - [内容声明](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/dictionary/get_started.md)
617
542
  - [配置](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/configuration.md)
618
543
 
619
- 本综合指南提供了将 Intlayer 与 Tanstack Start 集成所需的一切,支持完全国际化的应用程序,具备区域感知路由和 TypeScript 支持。
544
+ 本综合指南提供了将 Intlayer 与 Tanstack Start 集成所需的一切,支持完全国际化的应用程序,具备基于区域设置的路由和 TypeScript 支持。
620
545
 
621
546
  ## 文档历史
622
547
 
623
- | 版本 | 日期 | 变更内容 |
624
- | ----- | ---------- | ---------------------- |
625
- | 5.8.1 | 2025-09-09 | 为 Tanstack Start 添加 |
548
+ | 版本 | 日期 | 变更内容 |
549
+ | ----- | ---------- | -------------------------- |
550
+ | 5.8.1 | 2025-09-09 | 为 Tanstack Start 添加支持 |