@intlayer/docs 5.8.1 → 6.0.0-canary.1

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 (378) hide show
  1. package/blog/ar/rag_powered_documentation_assistant.md +282 -0
  2. package/blog/de/rag_powered_documentation_assistant.md +282 -0
  3. package/blog/en/rag_powered_documentation_assistant.md +289 -0
  4. package/blog/en-GB/rag_powered_documentation_assistant.md +284 -0
  5. package/blog/es/rag_powered_documentation_assistant.md +308 -0
  6. package/blog/fr/rag_powered_documentation_assistant.md +308 -0
  7. package/blog/hi/rag_powered_documentation_assistant.md +284 -0
  8. package/blog/it/rag_powered_documentation_assistant.md +284 -0
  9. package/blog/ja/rag_powered_documentation_assistant.md +284 -0
  10. package/blog/ko/rag_powered_documentation_assistant.md +283 -0
  11. package/blog/pt/rag_powered_documentation_assistant.md +284 -0
  12. package/blog/ru/rag_powered_documentation_assistant.md +284 -0
  13. package/blog/tr/index.md +69 -0
  14. package/blog/tr/internationalization_and_SEO.md +273 -0
  15. package/blog/tr/intlayer_with_i18next.md +162 -0
  16. package/blog/tr/intlayer_with_next-i18next.md +367 -0
  17. package/blog/tr/intlayer_with_next-intl.md +392 -0
  18. package/blog/tr/intlayer_with_react-i18next.md +346 -0
  19. package/blog/tr/intlayer_with_react-intl.md +345 -0
  20. package/blog/tr/list_i18n_technologies/CMS/drupal.md +143 -0
  21. package/blog/tr/list_i18n_technologies/CMS/wix.md +167 -0
  22. package/blog/tr/list_i18n_technologies/CMS/wordpress.md +188 -0
  23. package/blog/tr/list_i18n_technologies/frameworks/angular.md +125 -0
  24. package/blog/tr/list_i18n_technologies/frameworks/flutter.md +150 -0
  25. package/blog/tr/list_i18n_technologies/frameworks/react-native.md +217 -0
  26. package/blog/tr/list_i18n_technologies/frameworks/react.md +155 -0
  27. package/blog/tr/list_i18n_technologies/frameworks/svelte.md +129 -0
  28. package/blog/tr/list_i18n_technologies/frameworks/vue.md +130 -0
  29. package/blog/tr/next-i18next_vs_next-intl_vs_intlayer.md +170 -0
  30. package/blog/tr/rag_powered_documentation_assistant.md +284 -0
  31. package/blog/tr/react-i18next_vs_react-intl_vs_intlayer.md +162 -0
  32. package/blog/tr/vue-i18n_vs_intlayer.md +276 -0
  33. package/blog/tr/what_is_internationalization.md +166 -0
  34. package/blog/zh/rag_powered_documentation_assistant.md +284 -0
  35. package/dist/cjs/generated/blog.entry.cjs +212 -0
  36. package/dist/cjs/generated/blog.entry.cjs.map +1 -1
  37. package/dist/cjs/generated/docs.entry.cjs +660 -132
  38. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  39. package/dist/cjs/generated/frequentQuestions.entry.cjs +84 -0
  40. package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
  41. package/dist/cjs/generated/legal.entry.cjs +6 -0
  42. package/dist/cjs/generated/legal.entry.cjs.map +1 -1
  43. package/dist/esm/generated/blog.entry.mjs +212 -0
  44. package/dist/esm/generated/blog.entry.mjs.map +1 -1
  45. package/dist/esm/generated/docs.entry.mjs +660 -132
  46. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  47. package/dist/esm/generated/frequentQuestions.entry.mjs +84 -0
  48. package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
  49. package/dist/esm/generated/legal.entry.mjs +6 -0
  50. package/dist/esm/generated/legal.entry.mjs.map +1 -1
  51. package/dist/types/generated/blog.entry.d.ts +1 -0
  52. package/dist/types/generated/blog.entry.d.ts.map +1 -1
  53. package/dist/types/generated/docs.entry.d.ts +5 -2
  54. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  55. package/dist/types/generated/frequentQuestions.entry.d.ts.map +1 -1
  56. package/dist/types/generated/legal.entry.d.ts.map +1 -1
  57. package/docs/ar/autoFill.md +41 -40
  58. package/docs/ar/configuration.md +202 -199
  59. package/docs/ar/dictionary/content_file.md +1059 -0
  60. package/docs/ar/intlayer_CMS.md +4 -4
  61. package/docs/ar/intlayer_with_nestjs.md +271 -0
  62. package/docs/ar/intlayer_with_nextjs_page_router.md +1 -1
  63. package/docs/ar/intlayer_with_react_router_v7.md +533 -0
  64. package/docs/ar/intlayer_with_tanstack.md +465 -299
  65. package/docs/ar/intlayer_with_vite+preact.md +7 -7
  66. package/docs/ar/intlayer_with_vite+react.md +7 -7
  67. package/docs/ar/intlayer_with_vite+vue.md +9 -9
  68. package/docs/ar/packages/vite-intlayer/index.md +3 -3
  69. package/docs/ar/readme.md +261 -0
  70. package/docs/ar/testing.md +199 -0
  71. package/docs/de/autoFill.md +42 -19
  72. package/docs/de/configuration.md +155 -147
  73. package/docs/de/dictionary/content_file.md +1059 -0
  74. package/docs/de/intlayer_CMS.md +4 -5
  75. package/docs/de/intlayer_with_nestjs.md +270 -0
  76. package/docs/de/intlayer_with_nextjs_page_router.md +1 -1
  77. package/docs/de/intlayer_with_react_router_v7.md +537 -0
  78. package/docs/de/intlayer_with_tanstack.md +469 -302
  79. package/docs/de/intlayer_with_vite+preact.md +7 -7
  80. package/docs/de/intlayer_with_vite+react.md +7 -7
  81. package/docs/de/intlayer_with_vite+vue.md +9 -9
  82. package/docs/de/packages/vite-intlayer/index.md +3 -3
  83. package/docs/de/readme.md +261 -0
  84. package/docs/de/testing.md +200 -0
  85. package/docs/en/CI_CD.md +4 -6
  86. package/docs/en/autoFill.md +25 -5
  87. package/docs/en/configuration.md +45 -54
  88. package/docs/en/dictionary/content_file.md +1054 -0
  89. package/docs/en/intlayer_CMS.md +8 -7
  90. package/docs/en/intlayer_cli.md +112 -5
  91. package/docs/en/intlayer_with_nestjs.md +268 -0
  92. package/docs/en/intlayer_with_nextjs_page_router.md +1 -1
  93. package/docs/en/intlayer_with_react_router_v7.md +531 -0
  94. package/docs/en/intlayer_with_tanstack.md +463 -294
  95. package/docs/en/intlayer_with_vite+preact.md +8 -8
  96. package/docs/en/intlayer_with_vite+react.md +8 -8
  97. package/docs/en/intlayer_with_vite+vue.md +8 -8
  98. package/docs/en/packages/intlayer/getLocalizedUrl.md +102 -25
  99. package/docs/en/packages/vite-intlayer/index.md +3 -3
  100. package/docs/en/readme.md +261 -0
  101. package/docs/en/testing.md +200 -0
  102. package/docs/en-GB/autoFill.md +29 -6
  103. package/docs/en-GB/configuration.md +79 -71
  104. package/docs/en-GB/dictionary/content_file.md +1084 -0
  105. package/docs/en-GB/intlayer_CMS.md +4 -5
  106. package/docs/en-GB/intlayer_with_nestjs.md +268 -0
  107. package/docs/en-GB/intlayer_with_nextjs_page_router.md +1 -1
  108. package/docs/en-GB/intlayer_with_react_router_v7.md +533 -0
  109. package/docs/en-GB/intlayer_with_tanstack.md +466 -299
  110. package/docs/en-GB/intlayer_with_vite+preact.md +7 -7
  111. package/docs/en-GB/intlayer_with_vite+react.md +7 -7
  112. package/docs/en-GB/intlayer_with_vite+vue.md +9 -9
  113. package/docs/en-GB/packages/vite-intlayer/index.md +3 -3
  114. package/docs/en-GB/readme.md +261 -0
  115. package/docs/en-GB/testing.md +200 -0
  116. package/docs/es/autoFill.md +45 -23
  117. package/docs/es/configuration.md +171 -167
  118. package/docs/es/dictionary/content_file.md +1088 -0
  119. package/docs/es/intlayer_CMS.md +4 -5
  120. package/docs/es/intlayer_with_nestjs.md +268 -0
  121. package/docs/es/intlayer_with_nextjs_page_router.md +1 -1
  122. package/docs/es/intlayer_with_react_router_v7.md +533 -0
  123. package/docs/es/intlayer_with_tanstack.md +469 -280
  124. package/docs/es/intlayer_with_vite+preact.md +7 -7
  125. package/docs/es/intlayer_with_vite+react.md +7 -7
  126. package/docs/es/intlayer_with_vite+vue.md +9 -9
  127. package/docs/es/packages/vite-intlayer/index.md +3 -3
  128. package/docs/es/readme.md +261 -0
  129. package/docs/es/testing.md +200 -0
  130. package/docs/fr/autoFill.md +47 -24
  131. package/docs/fr/configuration.md +213 -198
  132. package/docs/fr/dictionary/content_file.md +1054 -0
  133. package/docs/fr/intlayer_CMS.md +4 -5
  134. package/docs/fr/intlayer_with_nestjs.md +268 -0
  135. package/docs/fr/intlayer_with_nextjs_page_router.md +1 -1
  136. package/docs/fr/intlayer_with_react_router_v7.md +549 -0
  137. package/docs/fr/intlayer_with_tanstack.md +465 -279
  138. package/docs/fr/intlayer_with_vite+preact.md +7 -7
  139. package/docs/fr/intlayer_with_vite+react.md +7 -7
  140. package/docs/fr/intlayer_with_vite+vue.md +9 -9
  141. package/docs/fr/packages/vite-intlayer/index.md +3 -3
  142. package/docs/fr/readme.md +261 -0
  143. package/docs/fr/testing.md +200 -0
  144. package/docs/hi/autoFill.md +47 -25
  145. package/docs/hi/configuration.md +194 -189
  146. package/docs/hi/dictionary/content_file.md +1056 -0
  147. package/docs/hi/intlayer_CMS.md +4 -5
  148. package/docs/hi/intlayer_with_nestjs.md +269 -0
  149. package/docs/hi/intlayer_with_nextjs_page_router.md +1 -1
  150. package/docs/hi/intlayer_with_react_router_v7.md +533 -0
  151. package/docs/hi/intlayer_with_tanstack.md +467 -282
  152. package/docs/hi/intlayer_with_vite+preact.md +7 -7
  153. package/docs/hi/intlayer_with_vite+react.md +7 -7
  154. package/docs/hi/intlayer_with_vite+vue.md +9 -9
  155. package/docs/hi/packages/vite-intlayer/index.md +3 -3
  156. package/docs/hi/readme.md +261 -0
  157. package/docs/hi/testing.md +200 -0
  158. package/docs/it/autoFill.md +46 -24
  159. package/docs/it/configuration.md +169 -161
  160. package/docs/it/dictionary/content_file.md +1061 -0
  161. package/docs/it/intlayer_CMS.md +4 -5
  162. package/docs/it/intlayer_with_nestjs.md +268 -0
  163. package/docs/it/intlayer_with_nextjs_page_router.md +1 -1
  164. package/docs/it/intlayer_with_react_router_v7.md +535 -0
  165. package/docs/it/intlayer_with_tanstack.md +467 -301
  166. package/docs/it/intlayer_with_vite+preact.md +7 -7
  167. package/docs/it/intlayer_with_vite+react.md +7 -7
  168. package/docs/it/intlayer_with_vite+vue.md +9 -9
  169. package/docs/it/packages/vite-intlayer/index.md +3 -3
  170. package/docs/it/readme.md +261 -0
  171. package/docs/it/testing.md +200 -0
  172. package/docs/ja/autoFill.md +45 -23
  173. package/docs/ja/configuration.md +243 -204
  174. package/docs/ja/dictionary/content_file.md +1064 -0
  175. package/docs/ja/intlayer_CMS.md +4 -5
  176. package/docs/ja/intlayer_with_nestjs.md +268 -0
  177. package/docs/ja/intlayer_with_nextjs_page_router.md +1 -1
  178. package/docs/ja/intlayer_with_react_router_v7.md +534 -0
  179. package/docs/ja/intlayer_with_tanstack.md +467 -303
  180. package/docs/ja/intlayer_with_vite+preact.md +7 -7
  181. package/docs/ja/intlayer_with_vite+react.md +7 -7
  182. package/docs/ja/intlayer_with_vite+vue.md +9 -9
  183. package/docs/ja/packages/vite-intlayer/index.md +3 -3
  184. package/docs/ja/readme.md +263 -0
  185. package/docs/ja/testing.md +200 -0
  186. package/docs/ko/autoFill.md +39 -16
  187. package/docs/ko/configuration.md +217 -197
  188. package/docs/ko/dictionary/content_file.md +1060 -0
  189. package/docs/ko/intlayer_CMS.md +4 -5
  190. package/docs/ko/intlayer_with_nestjs.md +268 -0
  191. package/docs/ko/intlayer_with_nextjs_page_router.md +1 -1
  192. package/docs/ko/intlayer_with_react_router_v7.md +540 -0
  193. package/docs/ko/intlayer_with_tanstack.md +466 -302
  194. package/docs/ko/intlayer_with_vite+preact.md +7 -7
  195. package/docs/ko/intlayer_with_vite+react.md +7 -7
  196. package/docs/ko/intlayer_with_vite+vue.md +9 -9
  197. package/docs/ko/packages/vite-intlayer/index.md +3 -3
  198. package/docs/ko/readme.md +261 -0
  199. package/docs/ko/testing.md +200 -0
  200. package/docs/pt/autoFill.md +39 -15
  201. package/docs/pt/configuration.md +165 -147
  202. package/docs/pt/dictionary/content_file.md +1062 -0
  203. package/docs/pt/intlayer_CMS.md +4 -5
  204. package/docs/pt/intlayer_with_nestjs.md +271 -0
  205. package/docs/pt/intlayer_with_nextjs_page_router.md +1 -1
  206. package/docs/pt/intlayer_with_react_router_v7.md +535 -0
  207. package/docs/pt/intlayer_with_tanstack.md +469 -300
  208. package/docs/pt/intlayer_with_vite+preact.md +7 -7
  209. package/docs/pt/intlayer_with_vite+react.md +7 -7
  210. package/docs/pt/intlayer_with_vite+vue.md +9 -9
  211. package/docs/pt/packages/vite-intlayer/index.md +3 -3
  212. package/docs/pt/readme.md +261 -0
  213. package/docs/pt/testing.md +200 -0
  214. package/docs/ru/autoFill.md +52 -30
  215. package/docs/ru/configuration.md +164 -117
  216. package/docs/ru/dictionary/content_file.md +1064 -0
  217. package/docs/ru/intlayer_CMS.md +4 -4
  218. package/docs/ru/intlayer_with_nestjs.md +270 -0
  219. package/docs/ru/intlayer_with_nextjs_page_router.md +1 -1
  220. package/docs/ru/intlayer_with_react_router_v7.md +534 -0
  221. package/docs/ru/intlayer_with_tanstack.md +470 -305
  222. package/docs/ru/intlayer_with_vite+preact.md +7 -7
  223. package/docs/ru/intlayer_with_vite+react.md +7 -7
  224. package/docs/ru/intlayer_with_vite+vue.md +9 -9
  225. package/docs/ru/packages/vite-intlayer/index.md +3 -3
  226. package/docs/ru/readme.md +261 -0
  227. package/docs/ru/testing.md +202 -0
  228. package/docs/tr/CI_CD.md +198 -0
  229. package/docs/tr/autoFill.md +201 -0
  230. package/docs/tr/configuration.md +585 -0
  231. package/docs/tr/dictionary/condition.md +243 -0
  232. package/docs/tr/dictionary/content_file.md +1055 -0
  233. package/docs/tr/dictionary/enumeration.md +251 -0
  234. package/docs/tr/dictionary/file.md +228 -0
  235. package/docs/tr/dictionary/function_fetching.md +218 -0
  236. package/docs/tr/dictionary/gender.md +279 -0
  237. package/docs/tr/dictionary/insertion.md +191 -0
  238. package/docs/tr/dictionary/markdown.md +385 -0
  239. package/docs/tr/dictionary/nesting.md +279 -0
  240. package/docs/tr/dictionary/translation.md +315 -0
  241. package/docs/tr/formatters.md +618 -0
  242. package/docs/tr/how_works_intlayer.md +254 -0
  243. package/docs/tr/index.md +168 -0
  244. package/docs/tr/interest_of_intlayer.md +288 -0
  245. package/docs/tr/intlayer_CMS.md +347 -0
  246. package/docs/tr/intlayer_cli.md +570 -0
  247. package/docs/tr/intlayer_visual_editor.md +269 -0
  248. package/docs/tr/intlayer_with_angular.md +694 -0
  249. package/docs/tr/intlayer_with_create_react_app.md +1218 -0
  250. package/docs/tr/intlayer_with_express.md +415 -0
  251. package/docs/tr/intlayer_with_lynx+react.md +511 -0
  252. package/docs/tr/intlayer_with_nestjs.md +268 -0
  253. package/docs/tr/intlayer_with_nextjs_14.md +1029 -0
  254. package/docs/tr/intlayer_with_nextjs_15.md +1506 -0
  255. package/docs/tr/intlayer_with_nextjs_page_router.md +1484 -0
  256. package/docs/tr/intlayer_with_nuxt.md +773 -0
  257. package/docs/tr/intlayer_with_react_native+expo.md +660 -0
  258. package/docs/tr/intlayer_with_react_router_v7.md +531 -0
  259. package/docs/tr/intlayer_with_tanstack.md +452 -0
  260. package/docs/tr/intlayer_with_vite+preact.md +1673 -0
  261. package/docs/tr/intlayer_with_vite+react.md +1632 -0
  262. package/docs/tr/intlayer_with_vite+solid.md +288 -0
  263. package/docs/tr/intlayer_with_vite+svelte.md +288 -0
  264. package/docs/tr/intlayer_with_vite+vue.md +1042 -0
  265. package/docs/tr/introduction.md +209 -0
  266. package/docs/tr/locale_mapper.md +244 -0
  267. package/docs/tr/mcp_server.md +207 -0
  268. package/docs/tr/packages/@intlayer/api/index.md +58 -0
  269. package/docs/tr/packages/@intlayer/chokidar/index.md +57 -0
  270. package/docs/tr/packages/@intlayer/cli/index.md +47 -0
  271. package/docs/tr/packages/@intlayer/config/index.md +142 -0
  272. package/docs/tr/packages/@intlayer/core/index.md +51 -0
  273. package/docs/tr/packages/@intlayer/design-system/index.md +47 -0
  274. package/docs/tr/packages/@intlayer/dictionary-entry/index.md +53 -0
  275. package/docs/tr/packages/@intlayer/editor/index.md +47 -0
  276. package/docs/tr/packages/@intlayer/editor-react/index.md +47 -0
  277. package/docs/tr/packages/@intlayer/webpack/index.md +61 -0
  278. package/docs/tr/packages/angular-intlayer/index.md +59 -0
  279. package/docs/tr/packages/express-intlayer/index.md +258 -0
  280. package/docs/tr/packages/express-intlayer/t.md +459 -0
  281. package/docs/tr/packages/intlayer/getConfiguration.md +151 -0
  282. package/docs/tr/packages/intlayer/getEnumeration.md +165 -0
  283. package/docs/tr/packages/intlayer/getHTMLTextDir.md +127 -0
  284. package/docs/tr/packages/intlayer/getLocaleLang.md +87 -0
  285. package/docs/tr/packages/intlayer/getLocaleName.md +124 -0
  286. package/docs/tr/packages/intlayer/getLocalizedUrl.md +324 -0
  287. package/docs/tr/packages/intlayer/getMultilingualUrls.md +225 -0
  288. package/docs/tr/packages/intlayer/getPathWithoutLocale.md +81 -0
  289. package/docs/tr/packages/intlayer/getTranslation.md +196 -0
  290. package/docs/tr/packages/intlayer/getTranslationContent.md +195 -0
  291. package/docs/tr/packages/intlayer/index.md +505 -0
  292. package/docs/tr/packages/intlayer-cli/index.md +71 -0
  293. package/docs/tr/packages/intlayer-editor/index.md +139 -0
  294. package/docs/tr/packages/lynx-intlayer/index.md +85 -0
  295. package/docs/tr/packages/next-intlayer/index.md +154 -0
  296. package/docs/tr/packages/next-intlayer/t.md +354 -0
  297. package/docs/tr/packages/next-intlayer/useDictionary.md +270 -0
  298. package/docs/tr/packages/next-intlayer/useIntlayer.md +265 -0
  299. package/docs/tr/packages/next-intlayer/useLocale.md +133 -0
  300. package/docs/tr/packages/nuxt-intlayer/index.md +59 -0
  301. package/docs/tr/packages/preact-intlayer/index.md +55 -0
  302. package/docs/tr/packages/react-intlayer/index.md +148 -0
  303. package/docs/tr/packages/react-intlayer/t.md +304 -0
  304. package/docs/tr/packages/react-intlayer/useDictionary.md +554 -0
  305. package/docs/tr/packages/react-intlayer/useI18n.md +478 -0
  306. package/docs/tr/packages/react-intlayer/useIntlayer.md +253 -0
  307. package/docs/tr/packages/react-intlayer/useLocale.md +212 -0
  308. package/docs/tr/packages/react-native-intlayer/index.md +85 -0
  309. package/docs/tr/packages/react-scripts-intlayer/index.md +82 -0
  310. package/docs/tr/packages/solid-intlayer/index.md +56 -0
  311. package/docs/tr/packages/svelte-intlayer/index.md +55 -0
  312. package/docs/tr/packages/vite-intlayer/index.md +82 -0
  313. package/docs/tr/packages/vue-intlayer/index.md +59 -0
  314. package/docs/tr/per_locale_file.md +321 -0
  315. package/docs/tr/readme.md +261 -0
  316. package/docs/tr/roadmap.md +338 -0
  317. package/docs/tr/testing.md +200 -0
  318. package/docs/tr/vs_code_extension.md +154 -0
  319. package/docs/zh/autoFill.md +40 -18
  320. package/docs/zh/configuration.md +245 -226
  321. package/docs/zh/dictionary/content_file.md +1064 -0
  322. package/docs/zh/intlayer_CMS.md +4 -5
  323. package/docs/zh/intlayer_with_nestjs.md +268 -0
  324. package/docs/zh/intlayer_with_nextjs_page_router.md +1 -1
  325. package/docs/zh/intlayer_with_react_router_v7.md +535 -0
  326. package/docs/zh/intlayer_with_tanstack.md +468 -278
  327. package/docs/zh/intlayer_with_vite+preact.md +7 -7
  328. package/docs/zh/intlayer_with_vite+react.md +7 -7
  329. package/docs/zh/intlayer_with_vite+vue.md +7 -7
  330. package/docs/zh/packages/vite-intlayer/index.md +3 -3
  331. package/docs/zh/readme.md +261 -0
  332. package/docs/zh/testing.md +198 -0
  333. package/frequent_questions/tr/SSR_Next_no_[locale].md +105 -0
  334. package/frequent_questions/tr/array_as_content_declaration.md +72 -0
  335. package/frequent_questions/tr/build_dictionaries.md +59 -0
  336. package/frequent_questions/tr/build_error_CI_CD.md +75 -0
  337. package/frequent_questions/tr/customized_locale_list.md +65 -0
  338. package/frequent_questions/tr/domain_routing.md +114 -0
  339. package/frequent_questions/tr/esbuild_error.md +30 -0
  340. package/frequent_questions/tr/get_locale_cookie.md +142 -0
  341. package/frequent_questions/tr/intlayer_command_undefined.md +156 -0
  342. package/frequent_questions/tr/locale_incorect_in_url.md +74 -0
  343. package/frequent_questions/tr/static_rendering.md +45 -0
  344. package/frequent_questions/tr/translated_path_url.md +56 -0
  345. package/frequent_questions/tr/unknown_command.md +98 -0
  346. package/legal/tr/privacy_notice.md +83 -0
  347. package/legal/tr/terms_of_service.md +55 -0
  348. package/package.json +12 -12
  349. package/src/generated/blog.entry.ts +212 -0
  350. package/src/generated/docs.entry.ts +663 -135
  351. package/src/generated/frequentQuestions.entry.ts +85 -1
  352. package/src/generated/legal.entry.ts +7 -1
  353. package/docs/ar/dictionary/content_extention_customization.md +0 -100
  354. package/docs/ar/dictionary/get_started.md +0 -527
  355. package/docs/de/dictionary/content_extention_customization.md +0 -100
  356. package/docs/de/dictionary/get_started.md +0 -531
  357. package/docs/en/dictionary/content_extention_customization.md +0 -102
  358. package/docs/en/dictionary/get_started.md +0 -529
  359. package/docs/en-GB/dictionary/content_extention_customization.md +0 -100
  360. package/docs/en-GB/dictionary/get_started.md +0 -591
  361. package/docs/es/dictionary/content_extention_customization.md +0 -100
  362. package/docs/es/dictionary/get_started.md +0 -527
  363. package/docs/fr/dictionary/content_extention_customization.md +0 -100
  364. package/docs/fr/dictionary/get_started.md +0 -527
  365. package/docs/hi/dictionary/content_extention_customization.md +0 -100
  366. package/docs/hi/dictionary/get_started.md +0 -527
  367. package/docs/it/dictionary/content_extention_customization.md +0 -113
  368. package/docs/it/dictionary/get_started.md +0 -573
  369. package/docs/ja/dictionary/content_extention_customization.md +0 -113
  370. package/docs/ja/dictionary/get_started.md +0 -576
  371. package/docs/ko/dictionary/content_extention_customization.md +0 -100
  372. package/docs/ko/dictionary/get_started.md +0 -530
  373. package/docs/pt/dictionary/content_extention_customization.md +0 -100
  374. package/docs/pt/dictionary/get_started.md +0 -532
  375. package/docs/ru/dictionary/content_extention_customization.md +0 -100
  376. package/docs/ru/dictionary/get_started.md +0 -575
  377. package/docs/zh/dictionary/content_extention_customization.md +0 -117
  378. package/docs/zh/dictionary/get_started.md +0 -533
@@ -1,435 +1,625 @@
1
1
  ---
2
- createdAt: 2025-08-11
3
- updatedAt: 2025-08-11
4
- title: 在 TanStack Start (React) 中使用 Intlayer 入门
5
- description: 使用 Intlayer 为您的 TanStack Start 应用添加国际化--组件级字典、本地化 URL 以及 SEO 友好的元数据。
2
+ createdAt: 2025-09-09
3
+ updatedAt: 2025-09-09
4
+ title: 在 Tanstack Start 中使用 Intlayer 入门
5
+ description: 学习如何使用 Intlayer 为您的 Tanstack Start 应用添加国际化 (i18n)。按照本综合指南,使您的应用支持多语言和基于区域设置的路由。
6
6
  keywords:
7
7
  - 国际化
8
8
  - 文档
9
9
  - Intlayer
10
- - TanStack Start
11
- - TanStack Router
10
+ - Tanstack Start
12
11
  - React
13
12
  - i18n
14
- - JavaScript
13
+ - TypeScript
14
+ - 区域路由
15
15
  slugs:
16
16
  - doc
17
17
  - environment
18
+ - vite-and-react
18
19
  - tanstack-start
20
+ applicationTemplate: https://github.com/AydinTheFirst/tanstack-start-intlayer
21
+ author: AydinTheFirst
19
22
  ---
20
23
 
21
- # 使用 Intlayer 和 TanStack Start (React) 开始国际化 (i18n)
24
+ # 使用 Intlayer 和 Tanstack Start 开始国际化 (i18n)
25
+
26
+ 本指南演示了如何在 Tanstack Start 项目中集成 **Intlayer**,实现无缝国际化,支持基于区域设置的路由、TypeScript 支持以及现代开发实践。
22
27
 
23
28
  ## 什么是 Intlayer?
24
29
 
25
- **Intlayer** 是一个针对 React 应用的开源国际化工具包。它为您提供:
30
+ **Intlayer** 是一个创新的开源国际化 (i18n) 库,旨在简化现代 Web 应用中的多语言支持。
26
31
 
27
- - **组件本地字典**,具备 TypeScript 类型安全。
28
- - **动态元数据和路由**(支持 SEO)。
29
- - **运行时语言切换**(以及用于检测/持久化语言的辅助工具)。
30
- - **Vite 插件**,用于构建时转换和开发体验优化。
32
+ 使用 Intlayer,您可以:
31
33
 
32
- 本指南展示如何将 Intlayer 集成到一个 **TanStack Start** 项目中(该项目底层使用 Vite 和 TanStack Router 进行路由和 SSR)。
34
+ - **通过组件级声明式字典轻松管理翻译**。
35
+ - **动态本地化元数据、路由和内容**。
36
+ - **通过自动生成的类型确保 TypeScript 支持**,提升自动补全和错误检测能力。
37
+ - **享受高级功能**,如动态区域设置检测和切换。
38
+ - **通过 Tanstack Start 的基于文件的路由系统启用区域设置感知路由**。
33
39
 
34
40
  ---
35
41
 
36
- ## 第一步:安装依赖
42
+ ## 在 Tanstack Start 应用中设置 Intlayer 的分步指南
37
43
 
38
- ```bash
39
- # npm
40
- npm i intlayer react-intlayer
41
- npm i -D vite-intlayer
44
+ ### 第一步:创建项目
42
45
 
43
- # pnpm
44
- pnpm add intlayer react-intlayer
45
- pnpm add -D vite-intlayer
46
+ 首先,按照 TanStack Start 网站上的[创建新项目](https://tanstack.com/start/latest/docs/framework/react/quick-start)指南创建一个新的 TanStack Start 项目。
47
+
48
+ ### 第二步:安装 Intlayer
46
49
 
47
- # yarn
48
- yarn add intlayer react-intlayer
49
- yarn add -D vite-intlayer
50
+ 使用您喜欢的包管理器安装所需的包:
51
+
52
+ ```bash packageManager="npm"
53
+ npm install intlayer react-intlayer
54
+ npm install vite-intlayer --save-dev
50
55
  ```
51
56
 
52
- - **intlayer**:核心库(配置、字典、CLI/转换)。
53
- - **react-intlayer**:`<IntlayerProvider>` 组件及 React 钩子。
54
- - **vite-intlayer**:Vite 插件,附带可选中间件用于语言检测/重定向(支持开发环境和 SSR/预览;生产 SSR 时需移至 `dependencies`)。
57
+ ```bash packageManager="pnpm"
58
+ pnpm add intlayer react-intlayer
59
+ pnpm add vite-intlayer --save-dev
60
+ ```
55
61
 
56
- ---
62
+ - **intlayer**
63
+
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**
69
+
70
+ 将 Intlayer 集成到 React 应用中的包。它为 React 国际化提供上下文提供者和钩子。
57
71
 
58
- ## 第 2 步:配置 Intlayer
72
+ - **vite-intlayer**
59
73
 
60
- 在项目根目录创建 `intlayer.config.ts`:
74
+ 包含用于将 Intlayer 集成到[Vite 打包器](https://vite.dev/guide/why.html#why-bundle-for-production)的 Vite 插件,以及用于检测用户首选语言环境、管理 Cookie 和处理 URL 重定向的中间件。
61
75
 
62
- ```ts fileName="intlayer.config.ts"
63
- import { Locales, type IntlayerConfig } from "intlayer";
76
+ ### 第三步:项目配置
77
+
78
+ 创建一个配置文件来配置您的应用程序语言:
79
+
80
+ ```typescript fileName="intlayer.config.ts" codeFormat="typescript"
81
+ import type { IntlayerConfig } from "intlayer";
82
+
83
+ import { Locales } from "intlayer";
64
84
 
65
85
  const config: IntlayerConfig = {
66
86
  internationalization: {
67
- locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH], // 支持的语言列表
68
87
  defaultLocale: Locales.ENGLISH, // 默认语言
88
+ locales: [
89
+ Locales.ENGLISH, // 英语
90
+ Locales.FRENCH, // 法语
91
+ Locales.SPANISH, // 西班牙语
92
+ // 您的其他语言
93
+ ],
69
94
  },
70
- // 你也可以调整:contentDir、contentFileExtensions、中间件选项等。
71
95
  };
72
96
 
73
97
  export default config;
74
98
  ```
75
99
 
76
- 如果你更喜欢 `cjs`/`mjs`,CommonJS/ESM 版本与原文档相同。
100
+ ```javascript fileName="intlayer.config.mjs" codeFormat="esm"
101
+ import { Locales } from "intlayer";
77
102
 
78
- > 完整配置参考:请参阅 Intlayer 的配置文档。
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
+ };
79
115
 
80
- ---
116
+ export default config;
117
+ ```
81
118
 
82
- ## 3 步:添加 Vite 插件(及可选中间件)
119
+ ```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
120
+ const { Locales } = require("intlayer");
83
121
 
84
- **TanStack Start 使用 Vite**,因此将 Intlayer 的插件添加到你的 `vite.config.ts`:
122
+ /** @type {import('intlayer').IntlayerConfig} */
123
+ const config = {
124
+ internationalization: {
125
+ defaultLocale: Locales.ENGLISH,
126
+ locales: [
127
+ Locales.ENGLISH,
128
+ Locales.FRENCH,
129
+ Locales.SPANISH,
130
+ // 你的其他语言
131
+ ],
132
+ },
133
+ };
85
134
 
86
- ```ts fileName="vite.config.ts"
135
+ module.exports = config;
136
+ ```
137
+
138
+ > 通过此配置文件,您可以设置本地化的 URL、中间件重定向、Cookie 名称、内容声明的位置和扩展名,禁用控制台中的 Intlayer 日志等。有关可用参数的完整列表,请参阅[配置文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/configuration.md)。
139
+
140
+ ### 第4步:在您的 Vite 配置中集成 Intlayer
141
+
142
+ 将 intlayer 插件添加到您的配置中:
143
+
144
+ ```typescript fileName="vite.config.ts" codeFormat="typescript"
145
+ import { reactRouter } from "@react-router/dev/vite";
87
146
  import { defineConfig } from "vite";
88
- import react from "@vitejs/plugin-react-swc";
89
- import { intlayerPlugin, intLayerMiddlewarePlugin } from "vite-intlayer";
147
+ import { intlayerMiddlewarePlugin, intlayerPlugin } from "vite-intlayer";
148
+ import tsconfigPaths from "vite-tsconfig-paths";
90
149
 
91
150
  export default defineConfig({
92
151
  plugins: [
93
- react(),
152
+ reactRouter(),
153
+ tsconfigPaths(),
94
154
  intlayerPlugin(),
95
- // 可选但推荐用于语言环境检测、Cookies 和重定向:
96
- intLayerMiddlewarePlugin(),
155
+ intlayerMiddlewarePlugin(),
97
156
  ],
98
157
  });
99
158
  ```
100
159
 
101
- > 如果你部署 SSR,请将 `vite-intlayer` 移动到 `dependencies`,以便中间件在生产环境中运行。
160
+ > `intlayerPlugin()` 是用于将 Intlayer 集成到 Vite 的插件。它确保内容声明文件的构建,并在开发模式下监控这些文件。它在 Vite 应用中定义了 Intlayer 的环境变量。此外,它还提供别名以优化性能。
102
161
 
103
- ---
162
+ ### 第五步:创建布局组件
104
163
 
105
- ## 第 4 步:声明你的内容
164
+ 设置你的根布局和特定语言环境的布局:
106
165
 
107
- 将你的字典放置在 `./src` 下的任意位置(默认 `contentDir`)。示例:
166
+ #### 根布局
108
167
 
109
- ```tsx fileName="src/app.content.tsx"
110
- import { t, type Dictionary } from "intlayer";
111
- import type { ReactNode } from "react";
168
+ ```tsx fileName="src/routes/{-$locale}/route.tsx" codeFormat="typescript"
169
+ // src/routes/{-$locale}/route.tsx
170
+ import { createFileRoute, Navigate, Outlet } from "@tanstack/react-router";
171
+ import { configuration } from "intlayer";
172
+ import { IntlayerProvider, useLocale } from "react-intlayer";
173
+
174
+ import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes";
175
+
176
+ export const Route = createFileRoute("/{-$locale}")({
177
+ component: LayoutComponent,
178
+ });
179
+
180
+ function LayoutComponent() {
181
+ const { locale } = Route.useParams();
182
+
183
+ return (
184
+ <IntlayerProvider locale={locale}>
185
+ <Outlet />
186
+ </IntlayerProvider>
187
+ );
188
+ }
189
+ ```
190
+
191
+ ### 第6步:声明您的内容
192
+
193
+ 创建并管理您的内容声明以存储翻译:
194
+
195
+ ```tsx fileName="src/contents/page.content.ts" contentDeclarationFormat="typescript"
196
+ import type { Dictionary } from "intlayer";
197
+
198
+ import { t } from "intlayer";
112
199
 
113
200
  const appContent = {
114
- key: "app",
115
201
  content: {
116
- viteLogo: t({ en: "Vite logo", fr: "Logo Vite", es: "Logo Vite" }),
117
- reactLogo: t({ en: "React logo", fr: "Logo React", es: "Logo React" }),
202
+ links: {
203
+ about: t({
204
+ en: "About",
205
+ es: "Acerca de",
206
+ fr: "À propos",
207
+ }),
208
+ home: t({
209
+ en: "首页",
210
+ es: "Inicio",
211
+ fr: "Accueil",
212
+ }),
213
+ },
214
+ meta: {
215
+ description: t({
216
+ en: "这是一个使用 Intlayer 与 TanStack Router 的示例",
217
+ es: "Este es un ejemplo de uso de Intlayer con TanStack Router",
218
+ fr: "Ceci est un exemple d'utilisation d'Intlayer avec TanStack Router",
219
+ }),
220
+ },
118
221
  title: t({
119
- en: "TanStack Start + React",
120
- fr: "TanStack Start + React",
121
- es: "TanStack Start + React",
122
- }),
123
- count: t({ en: "count is ", fr: "le compte est ", es: "el recuento es " }),
124
- edit: t<ReactNode>({
125
- en: (
126
- <>
127
- 编辑 <code>src/routes/index.tsx</code> 并保存以测试 HMR
128
- </>
129
- ),
130
- fr: (
131
- <>
132
- Éditez <code>src/routes/index.tsx</code> et enregistrez pour tester
133
- HMR
134
- </>
135
- ),
136
- es: (
137
- <>
138
- Edita <code>src/routes/index.tsx</code> y guarda para probar HMR
139
- </>
140
- ),
141
- }),
142
- readTheDocs: t({
143
- en: "点击标志以了解更多",
144
- fr: "Cliquez sur les logos pour en savoir plus",
145
- es: "Haz clic en los logotipos para saber más",
222
+ en: "欢迎使用 Intlayer + TanStack Router",
223
+ es: "Bienvenido a Intlayer + TanStack Router",
224
+ fr: "Bienvenue à Intlayer + TanStack Router",
146
225
  }),
147
226
  },
227
+ key: "app",
148
228
  } satisfies Dictionary;
149
229
 
150
230
  export default appContent;
151
231
  ```
152
232
 
153
- JSON/ESM/CJS 变体与您的原始文档中相同。
233
+ > 您的内容声明可以在应用程序中的任何位置定义,只要它们被包含在 `contentDir` 目录中(默认是 `./app`)。并且文件扩展名需匹配内容声明的文件扩展名(默认是 `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`)。
154
234
 
155
- > TSX 内容?如果您的设置需要,别忘了 `import React from "react"`。
235
+ > 更多详情,请参阅[内容声明文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/dictionary/get_started.md)。
156
236
 
157
- ---
237
+ ### 第7步:创建支持多语言环境的组件和钩子
158
238
 
159
- ## 第5步:用 Intlayer 包裹 TanStack Start
239
+ 创建一个用于多语言环境导航的 `LocalizedLink` 组件:
160
240
 
161
- 使用 TanStack Start,您的**根路由**是设置提供者的正确位置。
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";
162
247
 
163
- ```tsx fileName="src/routes/__root.tsx"
164
- import {
165
- Outlet,
166
- createRootRoute,
167
- Link as RouterLink,
168
- } from "@tanstack/react-router";
169
- import { IntlayerProvider, useIntlayer } from "react-intlayer";
170
-
171
- function AppShell() {
172
- // 在顶层使用字典的示例:
173
- const content = useIntlayer("app");
248
+ type LocalizedLinkProps = {
249
+ to: string;
250
+ } & Omit<LinkProps, "to">;
174
251
 
175
- return (
176
- <div>
177
- <nav className="flex gap-3 p-3">
178
- <RouterLink to="/">首页</RouterLink>
179
- <RouterLink to="/about">关于</RouterLink>
180
- </nav>
181
- <main className="p-6">
182
- <h1>{content.title}</h1>
183
- <Outlet />
184
- </main>
185
- </div>
186
- );
187
- }
252
+ export function LocalizedLink(props: LocalizedLinkProps) {
253
+ const { locale } = useLocale();
188
254
 
189
- export const Route = createRootRoute({
190
- component: () => (
191
- <IntlayerProvider>
192
- <AppShell />
193
- </IntlayerProvider>
194
- ),
195
- });
196
- ```
255
+ const isExternal = (to: string) => {
256
+ return /^(https?:)?\/\//.test(to);
257
+ };
197
258
 
198
- 然后在页面中使用你的内容:
259
+ const to = isExternal(props.to)
260
+ ? props.to
261
+ : getLocalizedUrl(props.to, locale);
199
262
 
200
- ```tsx fileName="src/routes/index.tsx"
201
- import { createFileRoute } from "@tanstack/react-router";
202
- import { useIntlayer } from "react-intlayer";
203
- import reactLogo from "../assets/react.svg";
204
-
205
- export const Route = createFileRoute("/")({
206
- component: () => {
207
- const content = useIntlayer("app");
208
- return (
209
- <>
210
- <button>{content.count}0</button>
211
- <p>{content.edit}</p>
212
- <img
213
- src={reactLogo}
214
- alt={content.reactLogo.value}
215
- width={48}
216
- height={48}
217
- />
218
- <p className="opacity-70">{content.readTheDocs}</p>
219
- </>
220
- );
221
- },
222
- });
263
+ return <Link {...props} to={to as LinkProps["to"]} />;
264
+ }
223
265
  ```
224
266
 
225
- > 字符串属性(`alt`,`title`,`aria-label` 等)需要 `.value`:
226
- >
227
- > ```jsx
228
- > <img alt={c.reactLogo.value} />
229
- > ```
267
+ 创建一个用于编程式导航的 `useLocalizedNavigate` 钩子:
230
268
 
231
- ---
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";
232
275
 
233
- ## (可选)步骤 6:语言切换(客户端)
276
+ type LocalizedNavigateOptions = {
277
+ to: string;
278
+ } & Omit<NavigateOptions, "to">;
234
279
 
235
- ```tsx fileName="src/components/LocaleSwitcher.tsx"
236
- import { Locales } from "intlayer";
237
- import { useLocale } from "react-intlayer";
280
+ export const useLocalizedNavigate = () => {
281
+ const navigate = useNavigate();
282
+ const { locale } = useLocale();
238
283
 
239
- export function LocaleSwitcher() {
240
- const { setLocale } = useLocale();
241
- return (
242
- <div className="flex gap-2">
243
- <button onClick={() => setLocale(Locales.ENGLISH)}>English</button>
244
- <button onClick={() => setLocale(Locales.FRENCH)}>Français</button>
245
- <button onClick={() => setLocale(Locales.SPANISH)}>Español</button>
246
- </div>
247
- );
248
- }
284
+ const isExternal = (to: string) => {
285
+ return /^(https?:)?\/\//.test(to);
286
+ };
287
+
288
+ const localizedNavigate = (options: LocalizedNavigateOptions) => {
289
+ const to = isExternal(options.to)
290
+ ? options.to
291
+ : getLocalizedUrl(options.to, locale);
292
+
293
+ navigate({ ...options, to: to as NavigateOptions["to"] });
294
+ };
295
+
296
+ return localizedNavigate;
297
+ };
249
298
  ```
250
299
 
251
- ---
300
+ ### 第8步:在您的页面中使用 Intlayer
252
301
 
253
- ## (可选)步骤7:本地化路由(SEO友好URL)
302
+ 在整个应用程序中访问您的内容字典:
254
303
 
255
- TanStack Start 中,你有**两种不错的模式**。请选择其一。
304
+ #### 根重定向页面
256
305
 
257
- 创建一个动态段文件夹 `src/routes/$locale/`,这样你的 URL 就是 `/:locale/...`。在 `$locale` 布局中,验证 `params.locale`,设置 `<IntlayerProvider locale=...>`,并渲染一个 `<Outlet />`。这种方法很直接,但你需要将其余路由挂载在 `$locale` 下面,如果你**不想**让默认语言带前缀,则还需要额外的无前缀路由树。
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";
258
310
 
259
- ---
311
+ export default function Page() {
312
+ const { locale } = useLocale();
260
313
 
261
- ## (可选)步骤 8:切换语言时更新 URL
314
+ return <Navigate replace to={locale} />;
315
+ }
316
+ ```
262
317
 
263
- 使用模式 A(basepath),切换语言意味着**导航到不同的 basepath**:
318
+ #### 本地化首页
264
319
 
265
- ```tsx fileName="src/components/LocaleSwitcherNavigate.tsx"
266
- import { useRouter } from "@tanstack/react-router";
267
- import { Locales, getLocalizedUrl } from "intlayer";
268
- import { useLocale } from "react-intlayer";
320
+ ```tsx fileName="src/routes/{-$locale}/index.tsx" codeFormat="typescript"
321
+ import { createFileRoute } from "@tanstack/react-router";
322
+ import { getIntlayer } from "intlayer";
323
+ import { useIntlayer } from "react-intlayer";
269
324
 
270
- export function LocaleSwitcherNavigate() {
271
- const router = useRouter();
272
- const { locale, setLocale } = useLocale();
273
-
274
- const change = async (next: Locales) => {
275
- if (next === locale) return;
276
- const nextPath = getLocalizedUrl(
277
- window.location.pathname + window.location.search,
278
- next
279
- );
280
- await router.navigate({ to: nextPath }); // 保留历史记录
281
- setLocale(next);
282
- };
325
+ import LocaleSwitcher from "@/components/locale-switcher";
326
+ import { LocalizedLink } from "@/components/localized-link";
327
+ import { useLocalizedNavigate } from "@/hooks/useLocalizedNavigate";
328
+
329
+ export const Route = createFileRoute("/{-$locale}/")({
330
+ component: RouteComponent,
331
+ head: ({ params }) => {
332
+ const { locale } = params;
333
+ const metaContent = getIntlayer("app", locale);
334
+
335
+ return {
336
+ meta: [
337
+ { title: metaContent.title },
338
+ { content: metaContent.meta.description, name: "description" },
339
+ ],
340
+ };
341
+ },
342
+ });
343
+
344
+ function RouteComponent() {
345
+ const content = useIntlayer("app");
346
+ const navigate = useLocalizedNavigate();
283
347
 
284
348
  return (
285
- <div className="flex gap-2">
286
- <button onClick={() => change(Locales.ENGLISH)}>English</button>
287
- <button onClick={() => change(Locales.FRENCH)}>Français</button>
288
- <button onClick={() => change(Locales.SPANISH)}>Español</button>
349
+ <div className="grid place-items-center h-screen">
350
+ <div className="flex flex-col gap-4 items-center text-center">
351
+ {content.title}
352
+ <LocaleSwitcher />
353
+ <div className="flex gap-4">
354
+ <a href="/">索引</a>
355
+ <LocalizedLink to="/">{content.links.home}</LocalizedLink>
356
+ <LocalizedLink to="/about">{content.links.about}</LocalizedLink>
357
+ </div>
358
+ <div className="flex gap-4">
359
+ <button onClick={() => navigate({ to: "/" })}>
360
+ {content.links.home}
361
+ </button>
362
+ <button onClick={() => navigate({ to: "/about" })}>
363
+ {content.links.about}
364
+ </button>
365
+ </div>
366
+ </div>
289
367
  </div>
290
368
  );
291
369
  }
292
370
  ```
293
371
 
294
- ---
372
+ > 想了解更多关于 `useIntlayer` 钩子的内容,请参阅[文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/react-intlayer/useIntlayer.md)。
295
373
 
296
- ## (可选)步骤 9:`<html lang>` 和 `dir`(TanStack Start Document)
374
+ ### 9步:创建语言切换组件
297
375
 
298
- TanStack Start 提供了一个可自定义的 **Document**(根 HTML 外壳)。设置 `lang` 和 `dir` 以提升无障碍访问和 SEO:
376
+ 创建一个组件,允许用户切换语言:
299
377
 
300
- ```tsx fileName="src/routes/__root.tsx" {4,15}
301
- import { Outlet, createRootRoute } from "@tanstack/react-router";
302
- import { IntlayerProvider } from "react-intlayer";
303
- import { getHTMLTextDir } from "intlayer";
378
+ ```tsx fileName="src/components/locale-switcher.tsx" codeFormat="typescript"
379
+ 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
+ });
304
398
 
305
- function Document({
306
- locale,
307
- children,
308
- }: {
309
- locale: string;
310
- children: React.ReactNode;
311
- }) {
312
399
  return (
313
- <html lang={locale} dir={getHTMLTextDir(locale)}>
314
- <head>
315
- <meta charSet="utf-8" />
316
- <meta name="viewport" content="width=device-width, initial-scale=1" />
317
- {/* ... */}
318
- </head>
319
- <body>{children}</body>
320
- </html>
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>
416
+ ))}
417
+ </select>
321
418
  );
322
419
  }
323
-
324
- export const Route = createRootRoute({
325
- component: () => (
326
- <IntlayerProvider>
327
- {/* 如果您在服务器端计算 locale,请将其传递给 Document;否则客户端将在水合后进行修正 */}
328
- <Document locale={document?.documentElement?.lang || "en"}>
329
- <Outlet />
330
- </Document>
331
- </IntlayerProvider>
332
- ),
333
- });
334
420
  ```
335
421
 
336
- 对于客户端修正,您也可以保留您的小钩子:
422
+ > 想了解更多关于 `useLocale` 钩子的内容,请参考[文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/react-intlayer/useLocale.md)。
423
+
424
+ ### 第10步:添加HTML属性管理(可选)
425
+
426
+ 创建一个钩子来管理HTML的lang和dir属性:
337
427
 
338
- ```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx"
428
+ ```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx" codeFormat="typescript"
429
+ // src/hooks/useI18nHTMLAttributes.tsx
430
+ import { getHTMLTextDir } from "intlayer";
339
431
  import { useEffect } from "react";
340
432
  import { useLocale } from "react-intlayer";
341
- import { getHTMLTextDir } from "intlayer";
342
433
 
343
434
  export const useI18nHTMLAttributes = () => {
344
435
  const { locale } = useLocale();
436
+
345
437
  useEffect(() => {
346
438
  document.documentElement.lang = locale;
347
- document.documentElement.dir = getHTMLTextDir(locale);
439
+ document.documentElement.dir = getHTMLTextDir(locale); // 设置HTML的文本方向属性
348
440
  }, [locale]);
349
441
  };
350
442
  ```
351
443
 
352
- ---
444
+ 然后在你的根组件中使用它:
353
445
 
354
- ## (可选)步骤10:本地化链接组件
446
+ ```tsx fileName="src/routes/{-$locale}/index.tsx" codeFormat="typescript"
447
+ import { createFileRoute, Navigate, Outlet } from "@tanstack/react-router";
448
+ import { configuration } from "intlayer";
449
+ import { IntlayerProvider, useLocale } from "react-intlayer";
355
450
 
356
- TanStack Router 提供了一个 `<Link/>`,但如果你需要一个自动为内部 URL 添加前缀的普通 `<a>` 标签:
451
+ import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes"; // 导入该hook
357
452
 
358
- ```tsx fileName="src/components/Link.tsx"
359
- import { getLocalizedUrl } from "intlayer";
360
- import {
361
- forwardRef,
362
- type AnchorHTMLAttributes,
363
- type DetailedHTMLProps,
364
- } from "react";
365
- import { useLocale } from "react-intlayer";
453
+ export const Route = createFileRoute("/{-$locale}")({
454
+ component: LayoutComponent,
455
+ });
366
456
 
367
- export interface LinkProps
368
- extends DetailedHTMLProps<
369
- AnchorHTMLAttributes<HTMLAnchorElement>,
370
- HTMLAnchorElement
371
- > {}
372
-
373
- const isExternal = (href?: string) => /^https?:\/\//.test(href ?? "");
374
-
375
- export const Link = forwardRef<HTMLAnchorElement, LinkProps>(
376
- ({ href, children, ...props }, ref) => {
377
- const { locale } = useLocale();
378
- const hrefI18n =
379
- href && !isExternal(href) ? getLocalizedUrl(href, locale) : href;
380
- return (
381
- <a href={hrefI18n} ref={ref} {...props}>
382
- {children}
383
- </a>
384
- );
385
- }
386
- );
387
- Link.displayName = "Link";
457
+ function LayoutComponent() {
458
+ useI18nHTMLAttributes(); // 添加此行
459
+
460
+ const { locale } = Route.useParams();
461
+
462
+ return (
463
+ <IntlayerProvider locale={locale}>
464
+ <Outlet />
465
+ </IntlayerProvider>
466
+ );
467
+ }
388
468
  ```
389
469
 
390
- > 如果您使用模式 A(basepath),TanStack 的 `<Link to="/about" />` 已经通过 `basepath` 解析为 `/fr/about`,因此自定义链接是可选的。
470
+ ### 第11步:构建并运行您的应用程序
391
471
 
392
- ---
472
+ 构建内容字典并运行您的应用程序:
473
+
474
+ ```bash packageManager="npm"
475
+ # 构建 Intlayer 字典
476
+ npm run intlayer:build
393
477
 
394
- ## TypeScript
478
+ # 启动开发服务器
479
+ npm run dev
480
+ ```
481
+
482
+ ```bash packageManager="pnpm"
483
+ # 构建 Intlayer 字典
484
+ pnpm intlayer:build
485
+
486
+ # 启动开发服务器
487
+ pnpm dev
488
+ ```
489
+
490
+ ```bash packageManager="yarn"
491
+ # 构建 Intlayer 字典
492
+ yarn intlayer:build
395
493
 
396
- 包含 Intlayer 生成的类型:
494
+ # 启动开发服务器
495
+ yarn dev
496
+ ```
497
+
498
+ ### 第12步:配置 TypeScript(可选)
499
+
500
+ Intlayer 使用模块增强来利用 TypeScript 的优势,使您的代码库更强大。
501
+
502
+ 确保您的 TypeScript 配置包含自动生成的类型:
397
503
 
398
504
  ```json5 fileName="tsconfig.json"
399
505
  {
400
- "include": ["src", ".intlayer/**/*.ts"],
506
+ compilerOptions: {
507
+ // ... 您现有的 TypeScript 配置
508
+ },
509
+ include: [
510
+ // ... 您现有的包含项
511
+ ".intlayer/**/*.ts", // 包含自动生成的类型
512
+ ],
401
513
  }
402
514
  ```
403
515
 
404
- ---
516
+ ### Git 配置
405
517
 
406
- ## Git
518
+ 建议忽略 Intlayer 生成的文件。这样可以避免将它们提交到您的 Git 仓库。
407
519
 
408
- 忽略 Intlayer 生成的构建产物:
520
+ 为此,您可以将以下指令添加到您的 `.gitignore` 文件中:
409
521
 
410
- ```gitignore
522
+ ```plaintext fileName=".gitignore"
523
+ # 忽略 Intlayer 生成的文件
411
524
  .intlayer
412
525
  ```
413
526
 
414
527
  ---
415
528
 
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
+
416
587
  ## VS Code 扩展
417
588
 
418
- - **Intlayer VS Code 扩展** → 自动补全、错误提示、内联预览、快速操作。
419
- 市场链接:`intlayer.intlayer-vs-code-extension`
589
+ 为了提升您使用 Intlayer 的开发体验,您可以安装官方的 **Intlayer VS Code 扩展**。
590
+
591
+ [从 VS Code 市场安装](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
592
+
593
+ 该扩展提供:
594
+
595
+ - 翻译键的 **自动补全**。
596
+ - 缺失翻译的 **实时错误检测**。
597
+ - 翻译内容的 **内联预览**。
598
+ - 轻松创建和更新翻译的 **快速操作**。
599
+
600
+ 有关如何使用该扩展的更多详细信息,请参阅 [Intlayer VS Code 扩展文档](https://intlayer.org/doc/vs-code-extension)。
420
601
 
421
602
  ---
422
603
 
423
604
  ## 深入了解
424
605
 
425
- - 可视化编辑器
426
- - CMS 模式
427
- - 边缘/适配器上的语言环境检测
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)将内容外部化。
428
607
 
429
608
  ---
430
609
 
610
+ ## 文档参考
611
+
612
+ - [Intlayer 文档](https://intlayer.org)
613
+ - [Tanstack Start 文档](https://reactrouter.com/)
614
+ - [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)
616
+ - [内容声明](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/dictionary/get_started.md)
617
+ - [配置](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/configuration.md)
618
+
619
+ 本综合指南提供了将 Intlayer 与 Tanstack Start 集成所需的一切,支持完全国际化的应用程序,具备区域感知路由和 TypeScript 支持。
620
+
431
621
  ## 文档历史
432
622
 
433
- | 版本 | 日期 | 变更内容 |
434
- | ----- | ---------- | ------------------------------ |
435
- | 1.0.0 | 2025-08-11 | 添加了 TanStack Start 适配支持 |
623
+ | 版本 | 日期 | 变更内容 |
624
+ | ----- | ---------- | ---------------------- |
625
+ | 5.8.1 | 2025-09-09 | Tanstack Start 添加 |