@intlayer/docs 5.8.1 → 6.0.0-canary.0

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,458 +1,623 @@
1
1
  ---
2
- createdAt: 2025-08-11
3
- updatedAt: 2025-08-11
4
- title: Начало работы с Intlayer в TanStack Start (React)
5
- description: Добавьте i18n в ваше приложение TanStack Start с помощью Intlayer - словари на уровне компонентов, локализованные URL и SEO-дружественные метаданные.
2
+ createdAt: 2025-09-09
3
+ updatedAt: 2025-09-09
4
+ title: Начало работы с Intlayer в Tanstack Start
5
+ description: Узнайте, как добавить интернационализацию (i18n) в ваше приложение Tanstack Start с помощью Intlayer. Следуйте этому подробному руководству, чтобы сделать ваше приложение многоязычным с маршрутизацией, учитывающей локаль.
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
- # Начало работы с интернационализацией (i18n) с Intlayer и TanStack Start (React)
24
+ # Начало работы с интернационализацией (i18n) с Intlayer и Tanstack Start
25
+
26
+ Это руководство демонстрирует, как интегрировать **Intlayer** для бесшовной интернационализации в проектах Tanstack Start с маршрутизацией, учитывающей локаль, поддержкой TypeScript и современными практиками разработки.
22
27
 
23
28
  ## Что такое Intlayer?
24
29
 
25
- **Intlayer** - это открытый набор инструментов i18n для приложений React. Он предоставляет вам:
30
+ **Intlayer** это инновационная, открытая библиотека интернационализации (i18n), созданная для упрощения поддержки многоязычности в современных веб-приложениях.
26
31
 
27
- - **Словари на уровне компонентов** с безопасностью TypeScript.
28
- - **Динамические метаданные и маршруты** (готовые для SEO).
29
- - **Переключение локали во время выполнения** (и вспомогательные функции для обнаружения/сохранения локалей).
30
- - **Плагин Vite** для преобразований во время сборки + улучшения для разработки (DX).
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
- ## Шаг 1: Установка зависимостей
42
+ ## Пошаговое руководство по настройке Intlayer в приложении Tanstack Start
37
43
 
38
- ```bash
39
- # npm
40
- npm i intlayer react-intlayer
41
- npm i -D vite-intlayer
44
+ ### Шаг 1: Создайте проект
42
45
 
43
- # pnpm
44
- pnpm add intlayer react-intlayer
45
- pnpm add -D vite-intlayer
46
+ Начните с создания нового проекта TanStack Start, следуя руководству [Start new project](https://tanstack.com/start/latest/docs/framework/react/quick-start) на сайте TanStack Start.
47
+
48
+ ### Шаг 2: Установите пакеты 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/превью; для production 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/ru/dictionary/get_started.md), транспиляции и [CLI-команд](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/intlayer_cli.md).
67
+
68
+ - **react-intlayer**
69
+ Пакет, который интегрирует Intlayer с приложением React. Он предоставляет провайдеры контекста и хуки для интернационализации в React.
70
+
71
+ - **vite-intlayer**
72
+ Включает плагин Vite для интеграции Intlayer с [сборщиком Vite](https://vite.dev/guide/why.html#why-bundle-for-production), а также промежуточное ПО для определения предпочтительной локали пользователя, управления cookie и обработки перенаправления URL.
57
73
 
58
- ## Шаг 2: Настройка Intlayer
74
+ ### Шаг 3: Конфигурация вашего проекта
59
75
 
60
- Создайте файл `intlayer.config.ts` в корне вашего проекта:
76
+ Создайте файл конфигурации для настройки языков вашего приложения:
61
77
 
62
- ```ts fileName="intlayer.config.ts"
63
- import { Locales, type IntlayerConfig } from "intlayer";
78
+ ```typescript fileName="intlayer.config.ts" codeFormat="typescript"
79
+ import type { IntlayerConfig } from "intlayer";
80
+
81
+ import { Locales } from "intlayer";
64
82
 
65
83
  const config: IntlayerConfig = {
66
84
  internationalization: {
67
- locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
68
- defaultLocale: Locales.ENGLISH,
85
+ defaultLocale: Locales.ENGLISH, // Язык по умолчанию
86
+ locales: [
87
+ Locales.ENGLISH, // Английский
88
+ Locales.FRENCH, // Французский
89
+ Locales.SPANISH, // Испанский
90
+ // Ваши другие языки
91
+ ],
69
92
  },
70
- // Вы также можете настроить: contentDir, contentFileExtensions, параметры middleware и др.
71
93
  };
72
94
 
73
95
  export default config;
74
96
  ```
75
97
 
76
- Варианты CommonJS/ESM идентичны вашему оригинальному документу, если вы предпочитаете `cjs`/`mjs`.
98
+ ```javascript fileName="intlayer.config.mjs" codeFormat="esm"
99
+ import { Locales } from "intlayer";
100
+
101
+ /** @type {import('intlayer').IntlayerConfig} */
102
+ const config = {
103
+ internationalization: {
104
+ defaultLocale: Locales.ENGLISH, // Язык по умолчанию
105
+ locales: [
106
+ Locales.ENGLISH, // Английский
107
+ Locales.FRENCH, // Французский
108
+ Locales.SPANISH, // Испанский
109
+ // Ваши другие языки
110
+ ],
111
+ },
112
+ };
77
113
 
78
- > Полное описание конфигурации: смотрите документацию по конфигурации Intlayer.
114
+ export default config;
115
+ ```
79
116
 
80
- ---
117
+ ```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
118
+ const { Locales } = require("intlayer");
81
119
 
82
- ## Шаг 3: Добавьте плагин Vite (и опциональный middleware)
120
+ /** @type {import('intlayer').IntlayerConfig} */
121
+ const config = {
122
+ internationalization: {
123
+ defaultLocale: Locales.ENGLISH, // Язык по умолчанию
124
+ locales: [
125
+ Locales.ENGLISH, // Английский
126
+ Locales.FRENCH, // Французский
127
+ Locales.SPANISH, // Испанский
128
+ // Ваши другие языки
129
+ ],
130
+ },
131
+ };
132
+
133
+ module.exports = config;
134
+ ```
135
+
136
+ > Через этот конфигурационный файл вы можете настроить локализованные URL, перенаправления в middleware, имена cookie, расположение и расширение ваших деклараций контента, отключить логи Intlayer в консоли и многое другое. Для полного списка доступных параметров обратитесь к [документации по конфигурации](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/configuration.md).
83
137
 
84
- **TanStack Start использует Vite**, поэтому добавьте плагин(и) Intlayer в ваш `vite.config.ts`:
138
+ ### Шаг 4: Интеграция Intlayer в вашу конфигурацию Vite
85
139
 
86
- ```ts fileName="vite.config.ts"
140
+ Добавьте плагин intlayer в вашу конфигурацию:
141
+
142
+ ```typescript fileName="vite.config.ts" codeFormat="typescript"
143
+ import { reactRouter } from "@react-router/dev/vite";
87
144
  import { defineConfig } from "vite";
88
- import react from "@vitejs/plugin-react-swc";
89
- import { intlayerPlugin, intLayerMiddlewarePlugin } from "vite-intlayer";
145
+ import { intlayerMiddlewarePlugin, intlayerPlugin } from "vite-intlayer";
146
+ import tsconfigPaths from "vite-tsconfig-paths";
90
147
 
91
148
  export default defineConfig({
92
149
  plugins: [
93
- react(),
150
+ reactRouter(),
151
+ tsconfigPaths(),
94
152
  intlayerPlugin(),
95
- // Необязательно, но рекомендуется для обнаружения локали, работы с куки и редиректов:
96
- intLayerMiddlewarePlugin(),
153
+ intlayerMiddlewarePlugin(),
97
154
  ],
98
155
  });
99
156
  ```
100
157
 
101
- > Если вы разворачиваете SSR, переместите `vite-intlayer` в `dependencies`, чтобы middleware работал в продакшене.
158
+ > Плагин Vite `intlayerPlugin()` используется для интеграции Intlayer с Vite. Он обеспечивает сборку файлов деклараций контента и их мониторинг в режиме разработки. Также он определяет переменные окружения Intlayer внутри приложения Vite. Кроме того, он предоставляет алиасы для оптимизации производительности.
102
159
 
103
- ---
160
+ ### Шаг 5: Создайте компоненты макета
161
+
162
+ Настройте корневой макет и макеты для конкретных локалей:
163
+
164
+ #### Корневой макет
165
+
166
+ ```tsx fileName="src/routes/{-$locale}/route.tsx" codeFormat="typescript"
167
+ // src/routes/{-$locale}/route.tsx
168
+ import { createFileRoute, Navigate, Outlet } from "@tanstack/react-router";
169
+ import { configuration } from "intlayer";
170
+ import { IntlayerProvider, useLocale } from "react-intlayer";
171
+
172
+ import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes";
173
+
174
+ export const Route = createFileRoute("/{-$locale}")({
175
+ component: LayoutComponent,
176
+ });
177
+
178
+ function LayoutComponent() {
179
+ const { locale } = Route.useParams();
180
+
181
+ return (
182
+ <IntlayerProvider locale={locale}>
183
+ <Outlet />
184
+ </IntlayerProvider>
185
+ );
186
+ }
187
+ ```
104
188
 
105
- ## Шаг 4: Объявите ваш контент
189
+ ### Шаг 6: Объявите Ваш Контент
106
190
 
107
- Размещайте ваши словари где угодно внутри `./src` (по умолчанию `contentDir`). Пример:
191
+ Создайте и управляйте декларациями контента для хранения переводов:
108
192
 
109
- ```tsx fileName="src/app.content.tsx"
110
- import { t, type Dictionary } from "intlayer";
111
- import type { ReactNode } from "react";
193
+ ```tsx fileName="src/contents/page.content.ts" contentDeclarationFormat="typescript"
194
+ import type { Dictionary } from "intlayer";
195
+
196
+ import { t } from "intlayer";
112
197
 
113
198
  const appContent = {
114
- key: "app",
115
199
  content: {
116
- viteLogo: t({
117
- ru: "Логотип Vite",
118
- en: "Vite logo",
119
- fr: "Logo Vite",
120
- es: "Logo Vite",
121
- }),
122
- reactLogo: t({
123
- ru: "Логотип React",
124
- en: "React logo",
125
- fr: "Logo React",
126
- es: "Logo React",
127
- }),
200
+ links: {
201
+ about: t({
202
+ en: "About",
203
+ es: "Acerca de",
204
+ fr: "À propos",
205
+ }),
206
+ home: t({
207
+ en: "Главная",
208
+ es: "Inicio",
209
+ fr: "Accueil",
210
+ }),
211
+ },
212
+ meta: {
213
+ description: t({
214
+ en: "Это пример использования Intlayer с TanStack Router",
215
+ es: "Este es un ejemplo de uso de Intlayer con TanStack Router",
216
+ fr: "Ceci est un exemple d'utilisation d'Intlayer avec TanStack Router",
217
+ }),
218
+ },
128
219
  title: t({
129
- ru: "TanStack Start + React",
130
- en: "TanStack Start + React",
131
- fr: "TanStack Start + React",
132
- es: "TanStack Start + React",
133
- }),
134
- count: t({
135
- ru: "счёт: ",
136
- en: "count is ",
137
- fr: "le compte est ",
138
- es: "el recuento es ",
139
- }),
140
- edit: t<ReactNode>({
141
- ru: (
142
- <>
143
- Редактируйте <code>src/routes/index.tsx</code> и сохраните, чтобы
144
- проверить HMR
145
- </>
146
- ),
147
- en: (
148
- <>
149
- Edit <code>src/routes/index.tsx</code> and save to test HMR
150
- </>
151
- ),
152
- fr: (
153
- <>
154
- Éditez <code>src/routes/index.tsx</code> et enregistrez pour tester
155
- HMR
156
- </>
157
- ),
158
- es: (
159
- <>
160
- Edita <code>src/routes/index.tsx</code> y guarda para probar HMR
161
- </>
162
- ),
163
- }),
164
- readTheDocs: t({
165
- ru: "Нажмите на логотипы, чтобы узнать больше",
166
- en: "Click the logos to learn more",
167
- fr: "Cliquez sur les logos pour en savoir plus",
168
- es: "Haz clic en los logotipos para saber más",
220
+ en: "Добро пожаловать в Intlayer + TanStack Router",
221
+ es: "Bienvenido a Intlayer + TanStack Router",
222
+ fr: "Bienvenue à Intlayer + TanStack Router",
169
223
  }),
170
224
  },
225
+ key: "app",
171
226
  } satisfies Dictionary;
172
227
 
173
228
  export default appContent;
174
229
  ```
175
230
 
176
- JSON/ESM/CJS варианты работают так же, как и в вашем исходном документе.
231
+ > Ваши объявления контента могут быть определены в любом месте вашего приложения, как только они будут включены в каталог `contentDir` (по умолчанию, `./app`). И соответствовать расширению файла объявления контента (по умолчанию, `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`).
177
232
 
178
- > TSX контент? Не забудьте `import React from "react"`, если ваша сборка этого требует.
233
+ > Для получения дополнительной информации обратитесь к [документации по объявлениям контента](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/dictionary/get_started.md).
179
234
 
180
- ---
235
+ ### Шаг 7: Создайте компоненты и хуки с поддержкой локализации
181
236
 
182
- ## Шаг 5: Оберните TanStack Start с помощью Intlayer
237
+ Создайте компонент `LocalizedLink` для навигации с учетом локали:
183
238
 
184
- С TanStack Start ваш **корневой маршрут** - это правильное место для установки провайдеров.
239
+ ```tsx fileName="src/components/localized-link.tsx" codeFormat="typescript"
240
+ // src/components/localized-link.tsx
241
+ // eslint-disable-next-line no-restricted-imports
242
+ import { Link, type LinkProps } from "@tanstack/react-router";
243
+ import { getLocalizedUrl } from "intlayer";
244
+ import { useLocale } from "react-intlayer";
185
245
 
186
- ```tsx fileName="src/routes/__root.tsx"
187
- import {
188
- Outlet,
189
- createRootRoute,
190
- Link as RouterLink,
191
- } from "@tanstack/react-router";
192
- import { IntlayerProvider, useIntlayer } from "react-intlayer";
193
-
194
- function AppShell() {
195
- // Пример использования словаря на верхнем уровне:
196
- const content = useIntlayer("app");
246
+ type LocalizedLinkProps = {
247
+ to: string;
248
+ } & Omit<LinkProps, "to">;
197
249
 
198
- return (
199
- <div>
200
- <nav className="flex gap-3 p-3">
201
- <RouterLink to="/">Главная</RouterLink>
202
- <RouterLink to="/about">О нас</RouterLink>
203
- </nav>
204
- <main className="p-6">
205
- <h1>{content.title}</h1>
206
- <Outlet />
207
- </main>
208
- </div>
209
- );
210
- }
250
+ export function LocalizedLink(props: LocalizedLinkProps) {
251
+ const { locale } = useLocale();
211
252
 
212
- export const Route = createRootRoute({
213
- component: () => (
214
- <IntlayerProvider>
215
- <AppShell />
216
- </IntlayerProvider>
217
- ),
218
- });
219
- ```
253
+ const isExternal = (to: string) => {
254
+ return /^(https?:)?\/\//.test(to);
255
+ };
220
256
 
221
- Затем используйте ваш контент на страницах:
257
+ const to = isExternal(props.to)
258
+ ? props.to
259
+ : getLocalizedUrl(props.to, locale);
222
260
 
223
- ```tsx fileName="src/routes/index.tsx"
224
- import { createFileRoute } from "@tanstack/react-router";
225
- import { useIntlayer } from "react-intlayer";
226
- import reactLogo from "../assets/react.svg";
227
-
228
- export const Route = createFileRoute("/")({
229
- component: () => {
230
- const content = useIntlayer("app");
231
- return (
232
- <>
233
- <button>{content.count}0</button>
234
- <p>{content.edit}</p>
235
- <img
236
- src={reactLogo}
237
- alt={content.reactLogo.value}
238
- width={48}
239
- height={48}
240
- />
241
- <p className="opacity-70">{content.readTheDocs}</p>
242
- </>
243
- );
244
- },
245
- });
261
+ return <Link {...props} to={to as LinkProps["to"]} />;
262
+ }
246
263
  ```
247
264
 
248
- > Атрибуты строк (`alt`, `title`, `aria-label` и др.) требуют использования `.value`:
249
- >
250
- > ```jsx
251
- > <img alt={c.reactLogo.value} />
252
- > ```
265
+ Создайте хук `useLocalizedNavigate` для программной навигации:
253
266
 
254
- ---
267
+ ```tsx fileName="src/hooks/useLocalizedNavigate.tsx" codeFormat="typescript"
268
+ // src/hooks/useLocalizedNavigate.tsx
269
+ // eslint-disable-next-line no-restricted-imports
270
+ import { NavigateOptions, useNavigate } from "@tanstack/react-router";
271
+ import { getLocalizedUrl } from "intlayer";
272
+ import { useLocale } from "react-intlayer";
255
273
 
256
- ## (Необязательно) Шаг 6: Переключение локали (на клиенте)
274
+ type LocalizedNavigateOptions = {
275
+ to: string;
276
+ } & Omit<NavigateOptions, "to">;
257
277
 
258
- ```tsx fileName="src/components/LocaleSwitcher.tsx"
259
- import { Locales } from "intlayer";
260
- import { useLocale } from "react-intlayer";
278
+ export const useLocalizedNavigate = () => {
279
+ const navigate = useNavigate();
280
+ const { locale } = useLocale();
261
281
 
262
- export function LocaleSwitcher() {
263
- const { setLocale } = useLocale();
264
- return (
265
- <div className="flex gap-2">
266
- <button onClick={() => setLocale(Locales.ENGLISH)}>Английский</button>
267
- <button onClick={() => setLocale(Locales.FRENCH)}>Французский</button>
268
- <button onClick={() => setLocale(Locales.SPANISH)}>Испанский</button>
269
- </div>
270
- );
271
- }
282
+ const isExternal = (to: string) => {
283
+ return /^(https?:)?\/\//.test(to);
284
+ };
285
+
286
+ const localizedNavigate = (options: LocalizedNavigateOptions) => {
287
+ const to = isExternal(options.to)
288
+ ? options.to
289
+ : getLocalizedUrl(options.to, locale);
290
+
291
+ navigate({ ...options, to: to as NavigateOptions["to"] });
292
+ };
293
+
294
+ return localizedNavigate;
295
+ };
272
296
  ```
273
297
 
274
- ---
298
+ ### Шаг 8: Использование Intlayer на ваших страницах
275
299
 
276
- ## (Необязательно) Шаг 7: Локализованная маршрутизация (SEO-дружественные URL)
300
+ Получайте доступ к вашим словарям контента по всему приложению:
277
301
 
278
- У вас есть **два хороших варианта** с TanStack Start. Выберите один.
302
+ #### Страница перенаправления корня
279
303
 
280
- Создайте папку с динамическим сегментом `src/routes/$locale/`, чтобы ваши URL были вида `/:locale/...`. В макете `$locale` проверьте `params.locale`, установите `<IntlayerProvider locale=...>`, и отобразите `<Outlet />`. Этот подход прост, но остальные маршруты будут размещены внутри `$locale`, и вам понадобится дополнительное дерево без префикса, если вы _не_ хотите, чтобы префикс локали по умолчанию добавлялся.
304
+ ```tsx fileName="src/routes/page.tsx" codeFormat="typescript"
305
+ // src/routes/page.tsx
306
+ import { useLocale } from "react-intlayer";
307
+ import { Navigate } from "react-router";
281
308
 
282
- ---
309
+ export default function Page() {
310
+ const { locale } = useLocale();
283
311
 
284
- ## (Необязательно) Шаг 8: Обновление URL при переключении локали
312
+ return <Navigate replace to={locale} />;
313
+ }
314
+ ```
285
315
 
286
- При использовании шаблона A (basepath) переключение локалей означает **переход на другой базовый путь**:
316
+ #### Локализованная главная страница
287
317
 
288
- ```tsx fileName="src/components/LocaleSwitcherNavigate.tsx"
289
- import { useRouter } from "@tanstack/react-router";
290
- import { Locales, getLocalizedUrl } from "intlayer";
291
- import { useLocale } from "react-intlayer";
318
+ ```tsx fileName="src/routes/{-$locale}/index.tsx" codeFormat="typescript"
319
+ import { createFileRoute } from "@tanstack/react-router";
320
+ import { getIntlayer } from "intlayer";
321
+ import { useIntlayer } from "react-intlayer";
292
322
 
293
- export function LocaleSwitcherNavigate() {
294
- const router = useRouter();
295
- const { locale, setLocale } = useLocale();
296
-
297
- const change = async (next: Locales) => {
298
- if (next === locale) return;
299
- const nextPath = getLocalizedUrl(
300
- window.location.pathname + window.location.search,
301
- next
302
- );
303
- await router.navigate({ to: nextPath }); // сохраняет историю
304
- setLocale(next);
305
- };
323
+ import LocaleSwitcher from "@/components/locale-switcher";
324
+ import { LocalizedLink } from "@/components/localized-link";
325
+ import { useLocalizedNavigate } from "@/hooks/useLocalizedNavigate";
326
+
327
+ export const Route = createFileRoute("/{-$locale}/")({
328
+ component: RouteComponent,
329
+ head: ({ params }) => {
330
+ const { locale } = params;
331
+ const metaContent = getIntlayer("app", locale);
332
+
333
+ return {
334
+ meta: [
335
+ { title: metaContent.title },
336
+ { content: metaContent.meta.description, name: "description" },
337
+ ],
338
+ };
339
+ },
340
+ });
341
+
342
+ function RouteComponent() {
343
+ const content = useIntlayer("app");
344
+ const navigate = useLocalizedNavigate();
306
345
 
307
346
  return (
308
- <div className="flex gap-2">
309
- <button onClick={() => change(Locales.ENGLISH)}>English</button>
310
- <button onClick={() => change(Locales.FRENCH)}>Français</button>
311
- <button onClick={() => change(Locales.SPANISH)}>Español</button>
347
+ <div className="grid place-items-center h-screen">
348
+ <div className="flex flex-col gap-4 items-center text-center">
349
+ {content.title}
350
+ <LocaleSwitcher />
351
+ <div className="flex gap-4">
352
+ <a href="/">Индекс</a>
353
+ <LocalizedLink to="/">{content.links.home}</LocalizedLink>
354
+ <LocalizedLink to="/about">{content.links.about}</LocalizedLink>
355
+ </div>
356
+ <div className="flex gap-4">
357
+ <button onClick={() => navigate({ to: "/" })}>
358
+ {content.links.home}
359
+ </button>
360
+ <button onClick={() => navigate({ to: "/about" })}>
361
+ {content.links.about}
362
+ </button>
363
+ </div>
364
+ </div>
312
365
  </div>
313
366
  );
314
367
  }
315
368
  ```
316
369
 
317
- ---
370
+ > Чтобы узнать больше о хуке `useIntlayer`, обратитесь к [документации](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/packages/react-intlayer/useIntlayer.md).
318
371
 
319
- ## (Необязательно) Шаг 9: `<html lang>` и `dir` (TanStack Start Document)
372
+ ### Шаг 9: Создайте компонент переключения локали
320
373
 
321
- TanStack Start предоставляет **Document** (корневой HTML-шаблон), который вы можете настроить. Установите `lang` и `dir` для доступности и SEO:
374
+ Создайте компонент, который позволит пользователям менять язык:
322
375
 
323
- ```tsx fileName="src/routes/__root.tsx" {4,15}
324
- import { Outlet, createRootRoute } from "@tanstack/react-router";
325
- import { IntlayerProvider } from "react-intlayer";
326
- import { getHTMLTextDir } from "intlayer";
376
+ ```tsx fileName="src/components/locale-switcher.tsx" codeFormat="typescript"
377
+ import { useLocation } from "@tanstack/react-router";
378
+ import {
379
+ getHTMLTextDir,
380
+ getLocaleName,
381
+ getLocalizedUrl,
382
+ Locales,
383
+ } from "intlayer";
384
+ import { useIntlayer, useLocale } from "react-intlayer";
385
+
386
+ export default function LocaleSwitcher() {
387
+ const { pathname, searchStr } = useLocation();
388
+ const content = useIntlayer("locale-switcher");
389
+
390
+ const { availableLocales, locale, setLocale } = useLocale({
391
+ onLocaleChange: (newLocale) => {
392
+ const pathWithLocale = getLocalizedUrl(pathname + searchStr, newLocale);
393
+ location.replace(pathWithLocale);
394
+ },
395
+ });
327
396
 
328
- function Document({
329
- locale,
330
- children,
331
- }: {
332
- locale: string;
333
- children: React.ReactNode;
334
- }) {
335
397
  return (
336
- <html lang={locale} dir={getHTMLTextDir(locale)}>
337
- <head>
338
- <meta charSet="utf-8" />
339
- <meta name="viewport" content="width=device-width, initial-scale=1" />
340
- {/* ... */}
341
- </head>
342
- <body>{children}</body>
343
- </html>
398
+ <select
399
+ aria-label={content.label.toString()}
400
+ onChange={(e) => setLocale(e.target.value)}
401
+ value={locale}
402
+ >
403
+ {availableLocales.map((localeItem) => (
404
+ <option
405
+ dir={getHTMLTextDir(localeItem)}
406
+ key={localeItem}
407
+ lang={localeItem}
408
+ value={localeItem}
409
+ >
410
+ {/* Пример: Français (Французский) */}
411
+ {getLocaleName(localeItem, locale)} (
412
+ {getLocaleName(localeItem, Locales.ENGLISH)})
413
+ </option>
414
+ ))}
415
+ </select>
344
416
  );
345
417
  }
346
-
347
- export const Route = createRootRoute({
348
- component: () => (
349
- <IntlayerProvider>
350
- {/* Если вы вычисляете локаль на сервере, передайте её в Document; иначе клиент исправит после гидратации */}
351
- <Document locale={document?.documentElement?.lang || "en"}>
352
- <Outlet />
353
- </Document>
354
- </IntlayerProvider>
355
- ),
356
- });
357
418
  ```
358
419
 
359
- Для исправления на стороне клиента вы также можете использовать небольшой хук:
420
+ > Чтобы узнать больше о хуке `useLocale`, обратитесь к [документации](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/packages/react-intlayer/useLocale.md).
421
+
422
+ ### Шаг 10: Добавление управления атрибутами HTML (необязательно)
423
+
424
+ Создайте хук для управления атрибутами lang и dir в HTML:
360
425
 
361
- ```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx"
426
+ ```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx" codeFormat="typescript"
427
+ // src/hooks/useI18nHTMLAttributes.tsx
428
+ import { getHTMLTextDir } from "intlayer";
362
429
  import { useEffect } from "react";
363
430
  import { useLocale } from "react-intlayer";
364
- import { getHTMLTextDir } from "intlayer";
365
431
 
366
432
  export const useI18nHTMLAttributes = () => {
367
433
  const { locale } = useLocale();
434
+
368
435
  useEffect(() => {
369
- document.documentElement.lang = locale; // Устанавливаем атрибут lang для документа
370
- document.documentElement.dir = getHTMLTextDir(locale); // Устанавливаем направление текста (ltr или rtl) в зависимости от локали
436
+ document.documentElement.lang = locale;
437
+ document.documentElement.dir = getHTMLTextDir(locale); // установка атрибута dir для документа
371
438
  }, [locale]);
372
439
  };
373
440
  ```
374
441
 
375
- ---
442
+ Затем используйте его в вашем корневом компоненте:
376
443
 
377
- ## (Необязательно) Шаг 10: Локализованный компонент Link
444
+ ```tsx fileName="src/routes/{-$locale}/index.tsx" codeFormat="typescript"
445
+ import { createFileRoute, Navigate, Outlet } from "@tanstack/react-router";
446
+ import { configuration } from "intlayer";
447
+ import { IntlayerProvider, useLocale } from "react-intlayer";
378
448
 
379
- TanStack Router предоставляет компонент `<Link/>`, но если вам когда-либо понадобится простой `<a>`, который автоматически добавляет префикс локали к внутренним URL:
449
+ import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes"; // импорт хука
380
450
 
381
- ```tsx fileName="src/components/Link.tsx"
382
- import { getLocalizedUrl } from "intlayer";
383
- import {
384
- forwardRef,
385
- type AnchorHTMLAttributes,
386
- type DetailedHTMLProps,
387
- } from "react";
388
- import { useLocale } from "react-intlayer";
451
+ export const Route = createFileRoute("/{-$locale}")({
452
+ component: LayoutComponent,
453
+ });
389
454
 
390
- export interface LinkProps
391
- extends DetailedHTMLProps<
392
- AnchorHTMLAttributes<HTMLAnchorElement>,
393
- HTMLAnchorElement
394
- > {}
395
-
396
- const isExternal = (href?: string) => /^https?:\/\//.test(href ?? "");
397
-
398
- export const Link = forwardRef<HTMLAnchorElement, LinkProps>(
399
- ({ href, children, ...props }, ref) => {
400
- const { locale } = useLocale();
401
- const hrefI18n =
402
- href && !isExternal(href) ? getLocalizedUrl(href, locale) : href;
403
- return (
404
- <a href={hrefI18n} ref={ref} {...props}>
405
- {children}
406
- </a>
407
- );
408
- }
409
- );
410
- Link.displayName = "Link";
455
+ function LayoutComponent() {
456
+ useI18nHTMLAttributes(); // добавьте эту строку
457
+
458
+ const { locale } = Route.useParams();
459
+
460
+ return (
461
+ <IntlayerProvider locale={locale}>
462
+ <Outlet />
463
+ </IntlayerProvider>
464
+ );
465
+ }
411
466
  ```
412
467
 
413
- > Если вы используете шаблон A (basepath), то `<Link to="/about" />` из TanStack уже преобразуется в `/fr/about` через `basepath`, поэтому кастомная ссылка является необязательной.
468
+ ### Шаг 11: Сборка и запуск вашего приложения
414
469
 
415
- ---
470
+ Соберите словари контента и запустите ваше приложение:
471
+
472
+ ```bash packageManager="npm"
473
+ # Сборка словарей Intlayer
474
+ npm run intlayer:build
416
475
 
417
- ## TypeScript
476
+ # Запуск сервера разработки
477
+ npm run dev
478
+ ```
479
+
480
+ ```bash packageManager="pnpm"
481
+ # Сборка словарей Intlayer
482
+ pnpm intlayer:build
483
+
484
+ # Запуск сервера разработки
485
+ pnpm dev
486
+ ```
487
+
488
+ ```bash packageManager="yarn"
489
+ # Сборка словарей Intlayer
490
+ yarn intlayer:build
418
491
 
419
- Включите сгенерированные Intlayer типы:
492
+ # Запуск сервера разработки
493
+ yarn dev
494
+ ```
495
+
496
+ ### Шаг 12: Настройка TypeScript (необязательно)
497
+
498
+ Intlayer использует расширение модулей (module augmentation), чтобы использовать преимущества TypeScript и сделать ваш код более надежным.
499
+
500
+ Убедитесь, что ваша конфигурация TypeScript включает автоматически сгенерированные типы:
420
501
 
421
502
  ```json5 fileName="tsconfig.json"
422
503
  {
423
- "include": ["src", ".intlayer/**/*.ts"],
504
+ compilerOptions: {
505
+ // ... ваши существующие настройки TypeScript
506
+ },
507
+ include: [
508
+ // ... ваши существующие включения
509
+ ".intlayer/**/*.ts", // Включить автоматически сгенерированные типы
510
+ ],
424
511
  }
425
512
  ```
426
513
 
427
- ---
514
+ ### Конфигурация Git
428
515
 
429
- ## Git
516
+ Рекомендуется игнорировать файлы, сгенерированные Intlayer. Это позволит избежать их коммита в ваш репозиторий Git.
430
517
 
431
- Игнорируйте сгенерированные артефакты Intlayer:
518
+ Для этого вы можете добавить следующие инструкции в ваш файл `.gitignore`:
432
519
 
433
- ```gitignore
520
+ ```plaintext fileName=".gitignore"
521
+ # Игнорировать файлы, сгенерированные Intlayer
434
522
  .intlayer
435
523
  ```
436
524
 
437
525
  ---
438
526
 
439
- ## Расширение VS Code
527
+ ### Шаг 13: Создание перенаправления (опционально)
528
+
529
+ ```typescript fileName="src/routes/{-$locale}/rotue.tsx" codeFormat="typescript"
530
+ function LayoutComponent() {
531
+ useI18nHTMLAttributes();
532
+
533
+ const { locale } = Route.useParams();
534
+ const { locale: selectedLocale } = useLocale();
535
+ const { defaultLocale } = configuration.internationalization;
536
+ const { prefixDefault } = configuration.middleware;
537
+
538
+ // Перенаправление на локаль по умолчанию, если в URL отсутствует локаль и prefixDefault установлен в true
539
+ if (selectedLocale === defaultLocale && !locale && prefixDefault) {
540
+ return <Navigate replace to={defaultLocale} />;
541
+ }
440
542
 
441
- - **Расширение Intlayer для VS Code** автодополнение, ошибки, встроенные превью, быстрые действия.
442
- Marketplace: `intlayer.intlayer-vs-code-extension`
543
+ // Перенаправление на выбранную локаль, если локаль в URL не совпадает с выбранной локалью
544
+ if (selectedLocale !== defaultLocale && !locale) {
545
+ return <Navigate replace to={selectedLocale} />;
546
+ }
547
+
548
+ return (
549
+ <IntlayerProvider locale={locale}>
550
+ <Outlet />
551
+ </IntlayerProvider>
552
+ );
553
+ }
554
+ ```
555
+
556
+ ## Развертывание в продакшн
557
+
558
+ При развертывании вашего приложения:
559
+
560
+ 1. **Соберите ваше приложение:**
561
+
562
+ ```bash
563
+ npm run build
564
+ ```
565
+
566
+ 2. **Соберите словари Intlayer:**
567
+
568
+ ```bash
569
+ npm run intlayer:build
570
+ ```
571
+
572
+ 3. **Переместите `vite-intlayer` в зависимости**, если используете middleware в продакшн:
573
+ ```bash
574
+ npm install vite-intlayer --save
575
+ ```
576
+
577
+ Теперь ваше приложение будет поддерживать:
578
+
579
+ - **Структуру URL**: `/en`, `/en/about`, `/tr`, `/tr/about`
580
+ - **Автоматическое определение локали** на основе настроек браузера
581
+ - **Маршрутизацию с учётом локали** с использованием Tanstack Start
582
+ - **Поддержку TypeScript** с автогенерируемыми типами
583
+ - **Серверный рендеринг** с правильной обработкой локали
584
+
585
+ ## Расширение для VS Code
586
+
587
+ Чтобы улучшить ваш опыт разработки с Intlayer, вы можете установить официальное расширение **Intlayer для VS Code**.
588
+
589
+ [Установить из VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
590
+
591
+ Это расширение предоставляет:
592
+
593
+ - **Автозаполнение** ключей переводов.
594
+ - **Обнаружение ошибок в реальном времени** для отсутствующих переводов.
595
+ - **Встроенный просмотр** переведённого контента.
596
+ - **Быстрые действия** для удобного создания и обновления переводов.
597
+
598
+ Для получения дополнительной информации о том, как использовать расширение, обратитесь к [документации по расширению Intlayer для VS Code](https://intlayer.org/doc/vs-code-extension).
443
599
 
444
600
  ---
445
601
 
446
- ## Дальнейшие шаги
602
+ ## Продвинутые возможности
447
603
 
448
- - Визуальный редактор
449
- - Режим CMS
450
- - Определение локали на краю / адаптеры
604
+ Чтобы продвинуться дальше, вы можете реализовать [визуальный редактор](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/intlayer_visual_editor.md) или вынести ваш контент, используя [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/intlayer_CMS.md).
451
605
 
452
606
  ---
453
607
 
608
+ ## Ссылки на документацию
609
+
610
+ - [Документация Intlayer](https://intlayer.org)
611
+ - [Документация Tanstack Start](https://reactrouter.com/)
612
+ - [Хук useIntlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/packages/react-intlayer/useIntlayer.md)
613
+ - [Хук useLocale](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/packages/react-intlayer/useLocale.md)
614
+ - [Объявление контента](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/dictionary/get_started.md)
615
+ - [Конфигурация](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/configuration.md)
616
+
617
+ Это подробное руководство содержит все необходимое для интеграции Intlayer с Tanstack Start для полностью интернационализированного приложения с маршрутизацией, учитывающей локаль, и поддержкой TypeScript.
618
+
454
619
  ## История документации
455
620
 
456
- | Версия | Дата | Изменения |
457
- | ------ | ---------- | ---------------------------------- |
458
- | 1.0.0 | 2025-08-11 | Добавлена адаптация TanStack Start |
621
+ | Версия | Дата | Изменения |
622
+ | ------ | ---------- | ---------------------------- |
623
+ | 5.8.1 | 2025-09-09 | Добавлено для Tanstack Start |