@intlayer/docs 9.1.3 → 9.3.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 (482) hide show
  1. package/blog/ar/index.md +1 -1
  2. package/blog/ar/rag_powered_documentation_assistant.md +7 -0
  3. package/blog/de/index.md +1 -1
  4. package/blog/de/rag_powered_documentation_assistant.md +6 -0
  5. package/blog/en/index.md +1 -1
  6. package/blog/en-GB/index.md +1 -1
  7. package/blog/en-GB/rag_powered_documentation_assistant.md +6 -0
  8. package/blog/es/index.md +1 -1
  9. package/blog/es/rag_powered_documentation_assistant.md +7 -0
  10. package/blog/fr/i18n_meaning.md +7 -1
  11. package/blog/fr/index.md +1 -1
  12. package/blog/fr/list_i18n_technologies/frameworks/angular.md +5 -1
  13. package/blog/fr/rag_powered_documentation_assistant.md +6 -0
  14. package/blog/hi/index.md +1 -1
  15. package/blog/hi/next-i18next_vs_next-intl_vs_intlayer.md +119 -42
  16. package/blog/hi/rag_powered_documentation_assistant.md +7 -0
  17. package/blog/id/index.md +1 -1
  18. package/blog/id/rag_powered_documentation_assistant.md +6 -0
  19. package/blog/it/index.md +1 -1
  20. package/blog/it/rag_powered_documentation_assistant.md +6 -0
  21. package/blog/ja/index.md +1 -1
  22. package/blog/ja/rag_powered_documentation_assistant.md +7 -0
  23. package/blog/ko/index.md +1 -1
  24. package/blog/ko/list_i18n_technologies/frameworks/react.md +7 -7
  25. package/blog/ko/rag_powered_documentation_assistant.md +6 -0
  26. package/blog/pl/index.md +1 -1
  27. package/blog/pl/rag_powered_documentation_assistant.md +6 -0
  28. package/blog/pt/index.md +1 -1
  29. package/blog/pt/rag_powered_documentation_assistant.md +6 -0
  30. package/blog/ru/index.md +1 -1
  31. package/blog/ru/rag_powered_documentation_assistant.md +7 -0
  32. package/blog/tr/intlayer_with_react-intl.md +3 -1
  33. package/blog/tr/next-i18next_vs_next-intl_vs_intlayer.md +175 -42
  34. package/blog/tr/rag_powered_documentation_assistant.md +6 -0
  35. package/blog/uk/index.md +1 -1
  36. package/blog/uk/rag_powered_documentation_assistant.md +6 -0
  37. package/blog/vi/index.md +1 -1
  38. package/blog/vi/rag_powered_documentation_assistant.md +6 -0
  39. package/blog/zh/index.md +1 -1
  40. package/blog/zh/intlayer_with_i18next.md +87 -28
  41. package/blog/zh/intlayer_with_next-i18next.md +86 -29
  42. package/blog/zh/intlayer_with_next-intl.md +88 -28
  43. package/blog/zh/intlayer_with_react-i18next.md +87 -28
  44. package/blog/zh/intlayer_with_react-intl.md +88 -27
  45. package/blog/zh/intlayer_with_vue-i18n.md +117 -8
  46. package/blog/zh/rag_powered_documentation_assistant.md +6 -0
  47. package/dist/cjs/common.cjs +24 -1
  48. package/dist/cjs/common.cjs.map +1 -1
  49. package/dist/cjs/generated/blog.entry.cjs +58 -31
  50. package/dist/cjs/generated/blog.entry.cjs.map +1 -1
  51. package/dist/cjs/generated/docs.entry.cjs +265 -218
  52. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  53. package/dist/cjs/generated/frequentQuestions.entry.cjs +48 -21
  54. package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
  55. package/dist/cjs/generated/legal.entry.cjs +33 -6
  56. package/dist/cjs/generated/legal.entry.cjs.map +1 -1
  57. package/dist/esm/common.mjs +24 -1
  58. package/dist/esm/common.mjs.map +1 -1
  59. package/dist/esm/generated/blog.entry.mjs +58 -31
  60. package/dist/esm/generated/blog.entry.mjs.map +1 -1
  61. package/dist/esm/generated/docs.entry.mjs +265 -218
  62. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  63. package/dist/esm/generated/frequentQuestions.entry.mjs +48 -21
  64. package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
  65. package/dist/esm/generated/legal.entry.mjs +33 -6
  66. package/dist/esm/generated/legal.entry.mjs.map +1 -1
  67. package/dist/types/common.d.ts.map +1 -1
  68. package/dist/types/generated/blog.entry.d.ts.map +1 -1
  69. package/dist/types/generated/docs.entry.d.ts +1 -0
  70. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  71. package/dist/types/generated/frequentQuestions.entry.d.ts.map +1 -1
  72. package/dist/types/generated/legal.entry.d.ts.map +1 -1
  73. package/docs/ar/analytics.md +222 -0
  74. package/docs/ar/autoFill.md +28 -9
  75. package/docs/ar/bundle_optimization.md +58 -25
  76. package/docs/ar/configuration.md +25 -8
  77. package/docs/ar/dictionary/file.md +3 -1
  78. package/docs/ar/dictionary/nesting.md +47 -30
  79. package/docs/ar/formatters.md +148 -193
  80. package/docs/ar/intlayer_CMS.md +152 -0
  81. package/docs/ar/intlayer_with_angular_21.md +9 -9
  82. package/docs/ar/intlayer_with_nextjs_14.md +1 -28
  83. package/docs/ar/intlayer_with_nextjs_15.md +1 -33
  84. package/docs/ar/intlayer_with_react_router_v7_fs_routes.md +40 -83
  85. package/docs/ar/intlayer_with_solid_start.md +1078 -0
  86. package/docs/ar/intlayer_with_vite+vue.md +1 -3
  87. package/docs/ar/live-sync.md +4 -0
  88. package/docs/ar/packages/intlayer/getLocalizedUrl.md +26 -24
  89. package/docs/ar/packages/intlayer/getMultilingualUrls.md +4 -18
  90. package/docs/ar/packages/react-intlayer/useDictionary.md +4 -21
  91. package/docs/ar/packages/react-intlayer/useIntlayer.md +2 -2
  92. package/docs/ar/packages/vite-intlayer/exports.md +15 -0
  93. package/docs/ar/packages/vite-intlayer/intlayer.md +121 -6
  94. package/docs/ar/packages/vite-intlayer/intlayerPrune.md +70 -3
  95. package/docs/ar/releases/v9.md +0 -37
  96. package/docs/ar/self_hosting.md +46 -49
  97. package/docs/bn/bundle_optimization.md +58 -25
  98. package/docs/bn/configuration.md +25 -8
  99. package/docs/bn/intlayer_with_angular_21.md +9 -9
  100. package/docs/cs/bundle_optimization.md +58 -25
  101. package/docs/cs/configuration.md +25 -8
  102. package/docs/cs/intlayer_with_angular_21.md +9 -9
  103. package/docs/de/analytics.md +222 -0
  104. package/docs/de/autoFill.md +28 -9
  105. package/docs/de/bundle_optimization.md +58 -25
  106. package/docs/de/configuration.md +25 -8
  107. package/docs/de/dictionary/file.md +3 -1
  108. package/docs/de/dictionary/nesting.md +47 -31
  109. package/docs/de/formatters.md +208 -334
  110. package/docs/de/intlayer_CMS.md +66 -15
  111. package/docs/de/intlayer_with_angular_21.md +9 -9
  112. package/docs/de/intlayer_with_nestjs.md +11 -7
  113. package/docs/de/intlayer_with_nextjs_14.md +1 -28
  114. package/docs/de/intlayer_with_nextjs_15.md +1 -33
  115. package/docs/de/intlayer_with_solid_start.md +1078 -0
  116. package/docs/de/intlayer_with_vite+vue.md +1 -3
  117. package/docs/de/live-sync.md +4 -0
  118. package/docs/de/packages/intlayer/getLocalizedUrl.md +33 -25
  119. package/docs/de/packages/intlayer/getMultilingualUrls.md +4 -18
  120. package/docs/de/packages/react-intlayer/useDictionary.md +2 -5
  121. package/docs/de/packages/vite-intlayer/exports.md +15 -0
  122. package/docs/de/packages/vite-intlayer/intlayer.md +121 -6
  123. package/docs/de/packages/vite-intlayer/intlayerPrune.md +77 -4
  124. package/docs/de/releases/v9.md +0 -15
  125. package/docs/de/self_hosting.md +46 -50
  126. package/docs/en/bundle_optimization.md +51 -23
  127. package/docs/en/cli/doc-review.md +13 -2
  128. package/docs/en/configuration.md +24 -15
  129. package/docs/en/intlayer_with_angular_21.md +9 -9
  130. package/docs/en/intlayer_with_solid_start.md +1091 -0
  131. package/docs/en/intlayer_with_vite+solid.md +12 -0
  132. package/docs/en/live-sync.md +4 -0
  133. package/docs/en-GB/analytics.md +222 -0
  134. package/docs/en-GB/autoFill.md +26 -7
  135. package/docs/en-GB/bundle_optimization.md +58 -25
  136. package/docs/en-GB/configuration.md +25 -8
  137. package/docs/en-GB/dictionary/file.md +2 -0
  138. package/docs/en-GB/dictionary/nesting.md +64 -205
  139. package/docs/en-GB/formatters.md +146 -181
  140. package/docs/en-GB/intlayer_CMS.md +152 -0
  141. package/docs/en-GB/intlayer_with_angular_21.md +9 -9
  142. package/docs/en-GB/intlayer_with_nestjs.md +6 -2
  143. package/docs/en-GB/intlayer_with_nextjs_14.md +0 -27
  144. package/docs/en-GB/intlayer_with_nextjs_15.md +1 -33
  145. package/docs/en-GB/intlayer_with_react_router_v7_fs_routes.md +40 -82
  146. package/docs/en-GB/intlayer_with_solid_start.md +1078 -0
  147. package/docs/en-GB/intlayer_with_vite+vue.md +1 -3
  148. package/docs/en-GB/live-sync.md +4 -0
  149. package/docs/en-GB/packages/intlayer/getLocalizedUrl.md +30 -22
  150. package/docs/en-GB/packages/intlayer/getMultilingualUrls.md +16 -48
  151. package/docs/en-GB/packages/vite-intlayer/exports.md +15 -0
  152. package/docs/en-GB/packages/vite-intlayer/intlayer.md +121 -6
  153. package/docs/en-GB/packages/vite-intlayer/intlayerPrune.md +77 -4
  154. package/docs/en-GB/self_hosting.md +60 -49
  155. package/docs/es/analytics.md +222 -0
  156. package/docs/es/autoFill.md +28 -9
  157. package/docs/es/bundle_optimization.md +58 -25
  158. package/docs/es/configuration.md +24 -7
  159. package/docs/es/dictionary/file.md +3 -1
  160. package/docs/es/dictionary/nesting.md +47 -30
  161. package/docs/es/formatters.md +114 -168
  162. package/docs/es/intlayer_CMS.md +35 -10
  163. package/docs/es/intlayer_with_angular_21.md +9 -9
  164. package/docs/es/intlayer_with_nextjs_14.md +1 -28
  165. package/docs/es/intlayer_with_nextjs_15.md +1 -33
  166. package/docs/es/intlayer_with_solid_start.md +1078 -0
  167. package/docs/es/live-sync.md +4 -0
  168. package/docs/es/packages/intlayer/getLocalizedUrl.md +31 -23
  169. package/docs/es/packages/intlayer/getMultilingualUrls.md +4 -18
  170. package/docs/es/packages/vite-intlayer/exports.md +15 -0
  171. package/docs/es/packages/vite-intlayer/intlayer.md +121 -6
  172. package/docs/es/packages/vite-intlayer/intlayerPrune.md +69 -2
  173. package/docs/es/releases/v9.md +0 -15
  174. package/docs/es/self_hosting.md +46 -49
  175. package/docs/fr/analytics.md +222 -0
  176. package/docs/fr/autoFill.md +27 -8
  177. package/docs/fr/bundle_optimization.md +58 -25
  178. package/docs/fr/configuration.md +25 -8
  179. package/docs/fr/dictionary/file.md +2 -0
  180. package/docs/fr/dictionary/nesting.md +37 -184
  181. package/docs/fr/formatters.md +95 -236
  182. package/docs/fr/intlayer_CMS.md +66 -15
  183. package/docs/fr/intlayer_with_angular_21.md +9 -9
  184. package/docs/fr/intlayer_with_nextjs_14.md +1 -28
  185. package/docs/fr/intlayer_with_nextjs_15.md +1 -33
  186. package/docs/fr/intlayer_with_solid_start.md +1078 -0
  187. package/docs/fr/live-sync.md +4 -0
  188. package/docs/fr/packages/intlayer/getLocalizedUrl.md +37 -27
  189. package/docs/fr/packages/intlayer/getMultilingualUrls.md +18 -20
  190. package/docs/fr/packages/vite-intlayer/exports.md +15 -0
  191. package/docs/fr/packages/vite-intlayer/intlayer.md +121 -6
  192. package/docs/fr/packages/vite-intlayer/intlayerPrune.md +77 -4
  193. package/docs/fr/releases/v9.md +0 -15
  194. package/docs/fr/self_hosting.md +46 -49
  195. package/docs/hi/analytics.md +222 -0
  196. package/docs/hi/autoFill.md +28 -9
  197. package/docs/hi/bundle_optimization.md +58 -25
  198. package/docs/hi/configuration.md +25 -8
  199. package/docs/hi/dictionary/file.md +3 -1
  200. package/docs/hi/dictionary/nesting.md +47 -30
  201. package/docs/hi/formatters.md +233 -334
  202. package/docs/hi/how_works_intlayer.md +3 -1
  203. package/docs/hi/intlayer_CMS.md +152 -0
  204. package/docs/hi/intlayer_with_angular_21.md +9 -9
  205. package/docs/hi/intlayer_with_nestjs.md +11 -7
  206. package/docs/hi/intlayer_with_nextjs_14.md +1 -28
  207. package/docs/hi/intlayer_with_nextjs_15.md +1 -33
  208. package/docs/hi/intlayer_with_react_router_v7_fs_routes.md +40 -83
  209. package/docs/hi/intlayer_with_solid_start.md +1077 -0
  210. package/docs/hi/intlayer_with_vite+preact.md +56 -49
  211. package/docs/hi/intlayer_with_vite+react.md +48 -41
  212. package/docs/hi/intlayer_with_vite+solid.md +32 -41
  213. package/docs/hi/intlayer_with_vite+vue.md +49 -44
  214. package/docs/hi/live-sync.md +4 -0
  215. package/docs/hi/packages/intlayer/getLocalizedUrl.md +26 -24
  216. package/docs/hi/packages/intlayer/getMultilingualUrls.md +4 -18
  217. package/docs/hi/packages/next-intlayer/t.md +33 -1
  218. package/docs/hi/packages/react-intlayer/useDictionary.md +4 -21
  219. package/docs/hi/packages/vite-intlayer/exports.md +15 -0
  220. package/docs/hi/packages/vite-intlayer/intlayer.md +121 -6
  221. package/docs/hi/packages/vite-intlayer/intlayerPrune.md +78 -5
  222. package/docs/hi/plugins/sync-json.md +9 -9
  223. package/docs/hi/releases/v9.md +0 -15
  224. package/docs/hi/self_hosting.md +38 -51
  225. package/docs/id/analytics.md +223 -0
  226. package/docs/id/bundle_optimization.md +58 -25
  227. package/docs/id/configuration.md +25 -8
  228. package/docs/id/dictionary/nesting.md +37 -184
  229. package/docs/id/formatters.md +208 -305
  230. package/docs/id/intlayer_CMS.md +164 -0
  231. package/docs/id/intlayer_with_angular_21.md +9 -9
  232. package/docs/id/intlayer_with_nextjs_14.md +1 -26
  233. package/docs/id/intlayer_with_react_router_v7_fs_routes.md +70 -63
  234. package/docs/id/intlayer_with_solid_start.md +1078 -0
  235. package/docs/id/live-sync.md +4 -0
  236. package/docs/id/packages/intlayer/getMultilingualUrls.md +4 -18
  237. package/docs/id/packages/react-intlayer/useIntlayer.md +2 -2
  238. package/docs/id/packages/vite-intlayer/exports.md +15 -0
  239. package/docs/id/packages/vite-intlayer/intlayer.md +121 -6
  240. package/docs/id/packages/vite-intlayer/intlayerPrune.md +78 -5
  241. package/docs/id/releases/v9.md +12 -0
  242. package/docs/id/self_hosting.md +61 -50
  243. package/docs/it/analytics.md +222 -0
  244. package/docs/it/autoFill.md +27 -8
  245. package/docs/it/bundle_optimization.md +58 -25
  246. package/docs/it/configuration.md +25 -8
  247. package/docs/it/dictionary/file.md +3 -1
  248. package/docs/it/dictionary/nesting.md +47 -30
  249. package/docs/it/formatters.md +114 -168
  250. package/docs/it/intlayer_CMS.md +66 -15
  251. package/docs/it/intlayer_with_angular_21.md +9 -9
  252. package/docs/it/intlayer_with_nestjs.md +11 -7
  253. package/docs/it/intlayer_with_nextjs_14.md +1 -28
  254. package/docs/it/intlayer_with_nextjs_15.md +1 -33
  255. package/docs/it/intlayer_with_solid_start.md +1078 -0
  256. package/docs/it/intlayer_with_vite+vue.md +1 -3
  257. package/docs/it/live-sync.md +4 -0
  258. package/docs/it/packages/intlayer/getLocalizedUrl.md +34 -26
  259. package/docs/it/packages/intlayer/getMultilingualUrls.md +4 -18
  260. package/docs/it/packages/react-intlayer/useDictionary.md +4 -21
  261. package/docs/it/packages/vite-intlayer/exports.md +15 -0
  262. package/docs/it/packages/vite-intlayer/intlayer.md +121 -6
  263. package/docs/it/packages/vite-intlayer/intlayerPrune.md +77 -4
  264. package/docs/it/releases/v9.md +0 -15
  265. package/docs/it/self_hosting.md +60 -49
  266. package/docs/ja/analytics.md +222 -0
  267. package/docs/ja/autoFill.md +28 -9
  268. package/docs/ja/bundle_optimization.md +58 -25
  269. package/docs/ja/configuration.md +25 -8
  270. package/docs/ja/dictionary/content_file.md +15 -7
  271. package/docs/ja/dictionary/file.md +3 -1
  272. package/docs/ja/dictionary/nesting.md +47 -30
  273. package/docs/ja/formatters.md +133 -187
  274. package/docs/ja/intlayer_visual_editor.md +3 -1
  275. package/docs/ja/intlayer_with_angular_21.md +6 -6
  276. package/docs/ja/intlayer_with_nestjs.md +2 -12
  277. package/docs/ja/intlayer_with_nextjs_14.md +1 -28
  278. package/docs/ja/intlayer_with_nextjs_15.md +1 -33
  279. package/docs/ja/intlayer_with_react_router_v7.md +456 -20
  280. package/docs/ja/intlayer_with_solid_start.md +1078 -0
  281. package/docs/ja/intlayer_with_vite+preact.md +73 -41
  282. package/docs/ja/intlayer_with_vite+vue.md +1 -3
  283. package/docs/ja/live-sync.md +4 -0
  284. package/docs/ja/mcp_server.md +3 -9
  285. package/docs/ja/packages/intlayer/getLocalizedUrl.md +26 -24
  286. package/docs/ja/packages/intlayer/getMultilingualUrls.md +3 -17
  287. package/docs/ja/packages/vite-intlayer/exports.md +15 -0
  288. package/docs/ja/packages/vite-intlayer/intlayer.md +121 -6
  289. package/docs/ja/packages/vite-intlayer/intlayerPrune.md +79 -6
  290. package/docs/ja/releases/v9.md +12 -0
  291. package/docs/ja/self_hosting.md +46 -50
  292. package/docs/ko/analytics.md +222 -0
  293. package/docs/ko/autoFill.md +28 -9
  294. package/docs/ko/bundle_optimization.md +58 -25
  295. package/docs/ko/configuration.md +25 -8
  296. package/docs/ko/dictionary/file.md +3 -1
  297. package/docs/ko/dictionary/nesting.md +47 -30
  298. package/docs/ko/formatters.md +133 -187
  299. package/docs/ko/intlayer_with_angular_21.md +9 -9
  300. package/docs/ko/intlayer_with_lynx+react.md +133 -39
  301. package/docs/ko/intlayer_with_nextjs_14.md +1 -28
  302. package/docs/ko/intlayer_with_nextjs_15.md +1 -33
  303. package/docs/ko/intlayer_with_react_router_v7_fs_routes.md +40 -188
  304. package/docs/ko/intlayer_with_solid_start.md +1078 -0
  305. package/docs/ko/intlayer_with_vite+preact.md +57 -23
  306. package/docs/ko/intlayer_with_vite+vue.md +1 -3
  307. package/docs/ko/live-sync.md +4 -0
  308. package/docs/ko/packages/intlayer/getLocalizedUrl.md +26 -24
  309. package/docs/ko/packages/intlayer/getMultilingualUrls.md +4 -18
  310. package/docs/ko/packages/vite-intlayer/exports.md +15 -0
  311. package/docs/ko/packages/vite-intlayer/intlayer.md +121 -6
  312. package/docs/ko/packages/vite-intlayer/intlayerPrune.md +79 -6
  313. package/docs/ko/releases/v9.md +12 -0
  314. package/docs/ko/self_hosting.md +60 -49
  315. package/docs/nl/bundle_optimization.md +58 -25
  316. package/docs/nl/configuration.md +25 -8
  317. package/docs/nl/intlayer_with_angular_21.md +9 -9
  318. package/docs/pl/analytics.md +220 -0
  319. package/docs/pl/bundle_optimization.md +58 -25
  320. package/docs/pl/configuration.md +25 -8
  321. package/docs/pl/dictionary/nesting.md +47 -30
  322. package/docs/pl/formatters.md +208 -305
  323. package/docs/pl/intlayer_CMS.md +152 -0
  324. package/docs/pl/intlayer_with_angular_21.md +9 -9
  325. package/docs/pl/intlayer_with_nextjs_14.md +1 -26
  326. package/docs/pl/intlayer_with_solid_start.md +1078 -0
  327. package/docs/pl/live-sync.md +4 -0
  328. package/docs/pl/packages/intlayer/getMultilingualUrls.md +4 -18
  329. package/docs/pl/packages/react-intlayer/useDictionary.md +2 -19
  330. package/docs/pl/packages/vite-intlayer/exports.md +15 -0
  331. package/docs/pl/packages/vite-intlayer/intlayer.md +121 -6
  332. package/docs/pl/packages/vite-intlayer/intlayerPrune.md +77 -4
  333. package/docs/pl/releases/v9.md +0 -15
  334. package/docs/pl/self_hosting.md +60 -49
  335. package/docs/pt/analytics.md +222 -0
  336. package/docs/pt/bundle_optimization.md +58 -24
  337. package/docs/pt/configuration.md +25 -8
  338. package/docs/pt/dictionary/file.md +3 -1
  339. package/docs/pt/dictionary/nesting.md +47 -30
  340. package/docs/pt/formatters.md +112 -168
  341. package/docs/pt/intlayer_CMS.md +66 -15
  342. package/docs/pt/intlayer_with_angular_21.md +9 -9
  343. package/docs/pt/intlayer_with_astro_lit.md +26 -1
  344. package/docs/pt/intlayer_with_nextjs_14.md +1 -28
  345. package/docs/pt/intlayer_with_nextjs_15.md +1 -33
  346. package/docs/pt/intlayer_with_solid_start.md +1078 -0
  347. package/docs/pt/intlayer_with_vite+vue.md +1 -3
  348. package/docs/pt/live-sync.md +4 -0
  349. package/docs/pt/packages/intlayer/getLocalizedUrl.md +34 -26
  350. package/docs/pt/packages/intlayer/getMultilingualUrls.md +4 -18
  351. package/docs/pt/packages/vite-intlayer/exports.md +15 -0
  352. package/docs/pt/packages/vite-intlayer/intlayer.md +121 -6
  353. package/docs/pt/packages/vite-intlayer/intlayerPrune.md +78 -6
  354. package/docs/pt/releases/v9.md +0 -15
  355. package/docs/pt/self_hosting.md +60 -49
  356. package/docs/ru/analytics.md +222 -0
  357. package/docs/ru/autoFill.md +27 -8
  358. package/docs/ru/bundle_optimization.md +58 -25
  359. package/docs/ru/configuration.md +25 -8
  360. package/docs/ru/dictionary/file.md +3 -1
  361. package/docs/ru/dictionary/nesting.md +64 -205
  362. package/docs/ru/formatters.md +108 -128
  363. package/docs/ru/intlayer_with_angular_21.md +9 -9
  364. package/docs/ru/intlayer_with_nextjs_14.md +1 -28
  365. package/docs/ru/intlayer_with_nextjs_15.md +1 -33
  366. package/docs/ru/intlayer_with_solid_start.md +1078 -0
  367. package/docs/ru/intlayer_with_vite+vue.md +1 -3
  368. package/docs/ru/live-sync.md +4 -0
  369. package/docs/ru/packages/intlayer/getLocalizedUrl.md +34 -26
  370. package/docs/ru/packages/intlayer/getMultilingualUrls.md +4 -18
  371. package/docs/ru/packages/react-intlayer/useDictionary.md +4 -21
  372. package/docs/ru/packages/vite-intlayer/exports.md +15 -0
  373. package/docs/ru/packages/vite-intlayer/intlayer.md +121 -6
  374. package/docs/ru/packages/vite-intlayer/intlayerPrune.md +77 -4
  375. package/docs/ru/releases/v9.md +0 -15
  376. package/docs/ru/self_hosting.md +60 -49
  377. package/docs/tr/analytics.md +222 -0
  378. package/docs/tr/autoFill.md +28 -9
  379. package/docs/tr/bundle_optimization.md +58 -25
  380. package/docs/tr/configuration.md +25 -8
  381. package/docs/tr/dictionary/file.md +2 -0
  382. package/docs/tr/dictionary/nesting.md +47 -30
  383. package/docs/tr/formatters.md +144 -190
  384. package/docs/tr/intlayer_CMS.md +152 -0
  385. package/docs/tr/intlayer_with_angular_21.md +9 -9
  386. package/docs/tr/intlayer_with_nestjs.md +2 -12
  387. package/docs/tr/intlayer_with_nextjs_15.md +1 -33
  388. package/docs/tr/intlayer_with_solid_start.md +1078 -0
  389. package/docs/tr/intlayer_with_vite+vue.md +1 -3
  390. package/docs/tr/live-sync.md +4 -0
  391. package/docs/tr/packages/intlayer/getMultilingualUrls.md +4 -18
  392. package/docs/tr/packages/vite-intlayer/exports.md +15 -0
  393. package/docs/tr/packages/vite-intlayer/intlayer.md +121 -6
  394. package/docs/tr/packages/vite-intlayer/intlayerPrune.md +77 -4
  395. package/docs/tr/self_hosting.md +47 -50
  396. package/docs/uk/analytics.md +222 -0
  397. package/docs/uk/bundle_optimization.md +58 -25
  398. package/docs/uk/configuration.md +25 -8
  399. package/docs/uk/dictionary/nesting.md +47 -30
  400. package/docs/uk/formatters.md +128 -185
  401. package/docs/uk/intlayer_CMS.md +152 -0
  402. package/docs/uk/intlayer_with_angular_21.md +9 -9
  403. package/docs/uk/intlayer_with_nextjs_14.md +1 -26
  404. package/docs/uk/intlayer_with_solid_start.md +1078 -0
  405. package/docs/uk/live-sync.md +4 -0
  406. package/docs/uk/packages/react-intlayer/useDictionary.md +2 -19
  407. package/docs/uk/packages/vite-intlayer/exports.md +15 -0
  408. package/docs/uk/packages/vite-intlayer/intlayer.md +121 -6
  409. package/docs/uk/packages/vite-intlayer/intlayerPrune.md +77 -4
  410. package/docs/uk/releases/v9.md +0 -15
  411. package/docs/uk/self_hosting.md +60 -50
  412. package/docs/ur/bundle_optimization.md +58 -25
  413. package/docs/ur/configuration.md +25 -8
  414. package/docs/ur/intlayer_with_angular_21.md +9 -9
  415. package/docs/vi/analytics.md +222 -0
  416. package/docs/vi/bundle_optimization.md +58 -25
  417. package/docs/vi/configuration.md +24 -8
  418. package/docs/vi/dictionary/nesting.md +37 -184
  419. package/docs/vi/formatters.md +208 -309
  420. package/docs/vi/intlayer_CMS.md +164 -0
  421. package/docs/vi/intlayer_with_angular_21.md +9 -9
  422. package/docs/vi/intlayer_with_nextjs_14.md +0 -25
  423. package/docs/vi/intlayer_with_react_router_v7_fs_routes.md +70 -63
  424. package/docs/vi/intlayer_with_solid_start.md +1078 -0
  425. package/docs/vi/live-sync.md +4 -0
  426. package/docs/vi/packages/intlayer/getMultilingualUrls.md +4 -18
  427. package/docs/vi/packages/react-intlayer/useIntlayer.md +2 -2
  428. package/docs/vi/packages/vite-intlayer/exports.md +15 -0
  429. package/docs/vi/packages/vite-intlayer/intlayer.md +121 -6
  430. package/docs/vi/packages/vite-intlayer/intlayerPrune.md +77 -4
  431. package/docs/vi/plugins/sync-json.md +6 -6
  432. package/docs/vi/releases/v9.md +12 -0
  433. package/docs/vi/self_hosting.md +61 -50
  434. package/docs/zh/CI_CD.md +4 -0
  435. package/docs/zh/analytics.md +222 -0
  436. package/docs/zh/autoFill.md +28 -9
  437. package/docs/zh/bundle_optimization.md +58 -25
  438. package/docs/zh/configuration.md +24 -8
  439. package/docs/zh/dictionary/file.md +2 -0
  440. package/docs/zh/dictionary/nesting.md +47 -30
  441. package/docs/zh/formatters.md +140 -188
  442. package/docs/zh/intlayer_CMS.md +164 -0
  443. package/docs/zh/intlayer_with_analog.md +193 -3
  444. package/docs/zh/intlayer_with_angular_19.md +272 -3
  445. package/docs/zh/intlayer_with_angular_21.md +7 -7
  446. package/docs/zh/intlayer_with_create_react_app.md +348 -26
  447. package/docs/zh/intlayer_with_lynx+react.md +263 -4
  448. package/docs/zh/intlayer_with_nextjs_14.md +1 -28
  449. package/docs/zh/intlayer_with_nextjs_15.md +1 -33
  450. package/docs/zh/intlayer_with_nextjs_no_locale_path.md +558 -1
  451. package/docs/zh/intlayer_with_nuxt.md +182 -7
  452. package/docs/zh/intlayer_with_react_router_v7.md +183 -25
  453. package/docs/zh/intlayer_with_react_router_v7_fs_routes.md +306 -42
  454. package/docs/zh/intlayer_with_solid_start.md +1077 -0
  455. package/docs/zh/intlayer_with_storybook.md +260 -3
  456. package/docs/zh/intlayer_with_svelte_kit.md +428 -48
  457. package/docs/zh/intlayer_with_tanstack+solid.md +713 -13
  458. package/docs/zh/intlayer_with_tanstack.md +731 -20
  459. package/docs/zh/intlayer_with_vanilla.md +314 -4
  460. package/docs/zh/intlayer_with_vite+lit.md +465 -4
  461. package/docs/zh/intlayer_with_vite+preact.md +422 -116
  462. package/docs/zh/intlayer_with_vite+react.md +324 -45
  463. package/docs/zh/intlayer_with_vite+react_compiler.md +228 -13
  464. package/docs/zh/intlayer_with_vite+solid.md +462 -32
  465. package/docs/zh/intlayer_with_vite+vanilla.md +497 -4
  466. package/docs/zh/live-sync.md +4 -0
  467. package/docs/zh/mcp_server.md +3 -9
  468. package/docs/zh/packages/intlayer/getLocalizedUrl.md +26 -24
  469. package/docs/zh/packages/intlayer/getMultilingualUrls.md +4 -18
  470. package/docs/zh/packages/vite-intlayer/exports.md +29 -0
  471. package/docs/zh/packages/vite-intlayer/intlayer.md +121 -6
  472. package/docs/zh/packages/vite-intlayer/intlayerPrune.md +79 -6
  473. package/docs/zh/releases/v9.md +12 -0
  474. package/docs/zh/self_hosting.md +60 -50
  475. package/docs/zh-TW/bundle_optimization.md +58 -25
  476. package/docs/zh-TW/intlayer_with_angular_21.md +7 -7
  477. package/package.json +7 -7
  478. package/src/common.ts +39 -2
  479. package/src/generated/blog.entry.ts +66 -34
  480. package/src/generated/docs.entry.ts +273 -221
  481. package/src/generated/frequentQuestions.entry.ts +56 -24
  482. package/src/generated/legal.entry.ts +41 -9
@@ -0,0 +1,1078 @@
1
+ ---
2
+ createdAt: 2025-08-06
3
+ updatedAt: 2026-08-06
4
+ title: "Solid Start i18n — полное руководство по переводу вашего приложения"
5
+ description: "Забудьте про i18next. Руководство 2026 года по созданию многоязычного (i18n) приложения на SolidStart. Серверная маршрутизация локалей, hreflang, sitemap и перевод с помощью ИИ."
6
+ keywords:
7
+ - Internationalization
8
+ - Documentation
9
+ - Intlayer
10
+ - SolidStart
11
+ - Solid
12
+ - i18n
13
+ - TypeScript
14
+ - Locale Routing
15
+ - Sitemap
16
+ slugs:
17
+ - doc
18
+ - environment
19
+ - solid-start
20
+ applicationTemplate: https://github.com/aymericzip/intlayer-solid-start-template
21
+ history:
22
+ - version: 9.1.3
23
+ date: 2025-08-06
24
+ changes: "Initial history"
25
+ author: aymericzip
26
+ ---
27
+
28
+ # Переведите ваш сайт на SolidStart с помощью Intlayer | Интернационализация (i18n)
29
+
30
+ <Tabs defaultTab="video">
31
+ <Tab label="Видео" value="video">
32
+
33
+ <iframe title="Лучшее решение i18n для Vite и Solid? Знакомьтесь с Intlayer" class="m-auto aspect-16/9 w-full overflow-hidden rounded-lg border-0" allow="autoplay; gyroscope;" loading="lazy" width="1080" height="auto" src="https://www.youtube.com/embed/dS9L7uJeak4?si=VaKmrYMmXjo3xpk2"/>
34
+
35
+ </Tab>
36
+ <Tab label="Код" value="code">
37
+
38
+ <iframe
39
+ src="https://ide.intlayer.org/aymericzip/intlayer-solid-start-template?file=intlayer.config.ts"
40
+ className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
41
+ title="Демо CodeSandbox — как интернационализировать ваше приложение с помощью Intlayer"
42
+ sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
43
+ loading="lazy"
44
+ />
45
+
46
+ </Tab>
47
+ </Tabs>
48
+
49
+ ## Содержание
50
+
51
+ <TOC/>
52
+
53
+ Это руководство описывает **серверно-рендерящееся** приложение SolidStart: определение локали происходит на этапе запроса, страницы рендерятся на сервере на нужном языке, а сигналы `<html lang>`, `hreflang` и sitemap, необходимые поисковым системам, отдаются уже на стороне сервера.
54
+
55
+ ## Почему Intlayer лучше альтернатив?
56
+
57
+ По сравнению с такими решениями, как `@solid-primitives/i18n` или `i18next`, Intlayer — это решение со встроенными оптимизациями, такими как:
58
+
59
+ <AccordionGroup>
60
+
61
+ <Accordion header="Полная поддержка Solid">
62
+
63
+ Intlayer оптимизирован для идеальной работы с Solid: он предлагает **компонентно-ориентированную область видимости контента**, **реактивные переводы** и все возможности, необходимые для масштабирования интернационализации (i18n).
64
+
65
+ </Accordion>
66
+
67
+ <Accordion header="Размер бандла">
68
+
69
+ Вместо загрузки огромных JSON-файлов на страницы загружается только нужный контент. Intlayer помогает **сократить размер бандла и страниц до 50%**.
70
+
71
+ </Accordion>
72
+
73
+ <Accordion header="Удобство поддержки">
74
+
75
+ Разделение контента приложения по областям **упрощает поддержку** крупных приложений. Вы можете дублировать или удалить одну папку с функциональностью, не беспокоясь о пересмотре всей кодовой базы контента. Кроме того, Intlayer **полностью типизирован**, что гарантирует точность вашего контента.
76
+
77
+ </Accordion>
78
+
79
+ <Accordion header="ИИ-агент">
80
+
81
+ Совместное расположение контента **сокращает контекст**, необходимый большим языковым моделям (LLM). Intlayer также поставляется с набором инструментов, таких как **CLI** для проверки отсутствующих переводов, **[LSP](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/lsp.md)**, **[MCP](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/mcp_server.md)** и **[agent skills](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/agent_skills.md)**, чтобы сделать опыт разработки (DX) ещё удобнее для ИИ-агентов.
82
+
83
+ </Accordion>
84
+
85
+ <Accordion header="Автоматизация">
86
+
87
+ Используйте автоматизацию для перевода в вашем CI/CD-пайплайне с помощью выбранной вами LLM за счёт вашего ИИ-провайдера. Intlayer также предлагает **компилятор** для автоматизации извлечения контента, а также [веб-платформу](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/intlayer_CMS.md), помогающую **переводить в фоновом режиме**.
88
+
89
+ </Accordion>
90
+
91
+ <Accordion header="Производительность">
92
+
93
+ Подключение огромных JSON-файлов к компонентам может привести к проблемам с производительностью и реактивностью. Intlayer оптимизирует загрузку контента на этапе сборки.
94
+
95
+ </Accordion>
96
+
97
+ <Accordion header="Масштабирование с участием нетехнических специалистов">
98
+
99
+ Intlayer — это больше, чем просто решение для i18n: он предоставляет **самостоятельно размещаемый [визуальный редактор](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/intlayer_visual_editor.md)** и **[полноценную CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/intlayer_CMS.md)**, чтобы помочь вам управлять многоязычным контентом **в реальном времени**, делая совместную работу с переводчиками, копирайтерами и другими членами команды бесшовной. Контент может храниться локально и/или удалённо.
100
+
101
+ </Accordion>
102
+ </AccordionGroup>
103
+
104
+ ---
105
+
106
+ ## Пошаговое руководство по настройке Intlayer в приложении SolidStart
107
+
108
+ <Steps>
109
+
110
+ <Step number={1} title="Установка зависимостей">
111
+
112
+ Установите необходимые пакеты с помощью npm:
113
+
114
+ ```bash packageManager="npm"
115
+ npx intlayer init --interactive
116
+ ```
117
+
118
+ ```bash packageManager="pnpm"
119
+ pnpm dlx intlayer@canary init --interactive
120
+ ```
121
+
122
+ ```bash packageManager="yarn"
123
+ yarn dlx intlayer@canary init --interactive
124
+ ```
125
+
126
+ ```bash packageManager="bun"
127
+ bunx intlayer@canary init --interactive
128
+ ```
129
+
130
+ > флаг `--interactive` необязателен. Используйте `intlayer-cli init`, если вы ИИ-агент.
131
+
132
+ > Эта команда определит вашу среду и установит необходимые пакеты. Например:
133
+
134
+ ```bash packageManager="npm"
135
+ npm install intlayer solid-intlayer vite-intlayer
136
+ ```
137
+
138
+ ```bash packageManager="pnpm"
139
+ pnpm add intlayer solid-intlayer vite-intlayer
140
+ ```
141
+
142
+ ```bash packageManager="yarn"
143
+ yarn add intlayer solid-intlayer vite-intlayer
144
+ ```
145
+
146
+ ```bash packageManager="bun"
147
+ bun add intlayer solid-intlayer vite-intlayer
148
+ ```
149
+
150
+ - **intlayer**
151
+
152
+ Основной пакет, предоставляющий инструменты интернационализации для управления конфигурацией, перевода, [декларации контента](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/dictionary/content_file.md), транспиляции и [команд CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/cli/index.md).
153
+
154
+ - **solid-intlayer**
155
+
156
+ Пакет, интегрирующий Intlayer с приложением Solid. Он предоставляет провайдеры контекста и хуки для интернационализации Solid.
157
+
158
+ - **vite-intlayer**
159
+
160
+ Включает плагин Vite для интеграции Intlayer со [сборщиком Vite](https://vite.dev/guide/why.html#why-bundle-for-production), а также обработчик маршрутизации по локали, который определяет предпочитаемую локаль пользователя, управляет cookie и обрабатывает перенаправление URL.
161
+
162
+ > `vite-intlayer` здесь является серверной зависимостью, а не только зависимостью времени сборки: он предоставляет обработчик запросов, который запускает Nitro-сервер SolidStart. Оставить его в `dependencies` — безопасный вариант по умолчанию; переносить в `devDependencies` стоит только если вы деплоите собранную директорию `.output`, в которую Nitro встраивает обработчик.
163
+
164
+ </Step>
165
+
166
+ <Step number={2} title="Настройка вашего проекта">
167
+
168
+ Создайте конфигурационный файл для настройки языков вашего приложения:
169
+
170
+ ```typescript fileName="intlayer.config.ts" codeFormat={["typescript", "esm", "commonjs"]}
171
+ import { type IntlayerConfig, Locales } from "intlayer";
172
+
173
+ const config: IntlayerConfig = {
174
+ internationalization: {
175
+ locales: [
176
+ Locales.ENGLISH,
177
+ Locales.FRENCH,
178
+ Locales.SPANISH,
179
+ // Ваши другие локали
180
+ ],
181
+ defaultLocale: Locales.ENGLISH,
182
+ },
183
+ routing: {
184
+ mode: "prefix-no-default",
185
+ },
186
+ };
187
+
188
+ export default config;
189
+ ```
190
+
191
+ При `prefix-no-default` локаль по умолчанию обслуживается по URL без префикса:
192
+
193
+ ```plaintext
194
+ / /about → English (локаль по умолчанию)
195
+ /fr /fr/about → French
196
+ /es /es/about → Spanish
197
+ ```
198
+
199
+ > С помощью этого конфигурационного файла вы можете настроить локализованные URL, перенаправление через middleware, названия cookie, расположение и расширение деклараций контента, отключить логи Intlayer в консоли и многое другое. Полный список доступных параметров смотрите в [документации по конфигурации](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/configuration.md).
200
+
201
+ </Step>
202
+
203
+ <Step number={3} title="Интеграция Intlayer в конфигурацию Vite">
204
+
205
+ Добавьте плагин Intlayer в вашу конфигурацию:
206
+
207
+ ```typescript fileName="vite.config.ts" codeFormat={["typescript", "esm", "commonjs"]}
208
+ import { solidStart } from "@solidjs/start/config";
209
+ import { nitro } from "nitro/vite";
210
+ import { defineConfig } from "vite";
211
+ import { intlayer } from "vite-intlayer";
212
+
213
+ export default defineConfig({
214
+ plugins: [solidStart(), nitro(), intlayer()],
215
+ });
216
+ ```
217
+
218
+ > Плагин Vite `intlayer()` собирает файлы деклараций контента, отслеживает их в режиме разработки и определяет переменные окружения Intlayer внутри приложения. Он также предоставляет алиасы, оптимизирующие производительность.
219
+
220
+ ### Маршрутизация по локали идёт вместе с плагином
221
+
222
+ SolidStart работает на основе [Nitro](https://nitro.build), и `intlayer()` регистрирует свой обработчик маршрутизации по локали прямо в серверном пайплайне Nitro (через опцию `routing.enableProxy`, включённую по умолчанию). Больше ничего подключать не нужно: на собранном сервере каждый запрос проверяется до того, как попадёт в роутер, и
223
+
224
+ - локаль считывается из префикса URL, затем из cookie `INTLAYER_LOCALE`, затем из заголовка `Accept-Language`;
225
+ - URL без префикса перенаправляется на локализованный вариант, если определённая локаль не является локалью по умолчанию (`/` → `/fr`);
226
+ - избыточно префиксированный URL перенаправляется обратно к каноническому виду (`/en/about` → `/about`);
227
+ - cookie локали записывается обратно в ответ.
228
+
229
+ </Step>
230
+
231
+ <Step number={4} title="Объявление вашего контента">
232
+
233
+ Создайте и управляйте декларациями контента для хранения переводов:
234
+
235
+ ```tsx fileName="src/contents/home.content.ts" contentDeclarationFormat={["typescript", "esm", "commonjs"]}
236
+ import { type Dictionary, t } from "intlayer";
237
+
238
+ const homeContent = {
239
+ key: "home-page",
240
+ content: {
241
+ title: t({
242
+ en: "Hello world!",
243
+ fr: "Bonjour le monde !",
244
+ es: "¡Hola mundo!",
245
+ }),
246
+ metaTitle: "SolidStart + Intlayer",
247
+ metaDescription: t({
248
+ en: "A SolidStart application internationalized with Intlayer.",
249
+ fr: "Une application SolidStart internationalisée avec Intlayer.",
250
+ es: "Una aplicación SolidStart internacionalizada con Intlayer.",
251
+ }),
252
+ documentation: t({
253
+ en: "Visit start.solidjs.com to learn how to build SolidStart apps.",
254
+ fr: "Visitez start.solidjs.com pour apprendre à créer des applications SolidStart.",
255
+ es: "Visita start.solidjs.com para aprender a crear aplicaciones SolidStart.",
256
+ }),
257
+ },
258
+ } satisfies Dictionary;
259
+
260
+ export default homeContent;
261
+ ```
262
+
263
+ ```json fileName="src/contents/home.content.json" contentDeclarationFormat="json"
264
+ {
265
+ "$schema": "https://intlayer.org/schema.json",
266
+ "key": "home-page",
267
+ "content": {
268
+ "title": {
269
+ "nodeType": "translation",
270
+ "translation": {
271
+ "en": "Hello world!",
272
+ "fr": "Bonjour le monde !",
273
+ "es": "¡Hola mundo!"
274
+ }
275
+ },
276
+ "metaTitle": "SolidStart + Intlayer",
277
+ "metaDescription": {
278
+ "nodeType": "translation",
279
+ "translation": {
280
+ "en": "A SolidStart application internationalized with Intlayer.",
281
+ "fr": "Une application SolidStart internationalisée avec Intlayer.",
282
+ "es": "Una aplicación SolidStart internacionalizada con Intlayer."
283
+ }
284
+ },
285
+ "documentation": {
286
+ "nodeType": "translation",
287
+ "translation": {
288
+ "en": "Visit start.solidjs.com to learn how to build SolidStart apps.",
289
+ "fr": "Visitez start.solidjs.com pour apprendre à créer des applications SolidStart.",
290
+ "es": "Visita start.solidjs.com para aprender a crear aplicaciones SolidStart."
291
+ }
292
+ }
293
+ }
294
+ }
295
+ ```
296
+
297
+ > ⚠️ **Особенность SolidStart**: каждый файл `.ts` / `.tsx` в директории `src/routes` становится маршрутом, а файл `.content.ts` имеет экспорт по умолчанию, поэтому он тоже будет воспринят как страница. Держите декларации контента ваших **страниц** вне директории routes (хорошо подходит `src/contents/`). Контент **компонентов** может оставаться рядом с ними, так как `src/components` не сканируется файловым роутером.
298
+
299
+ > Ваши декларации контента могут быть определены в любом месте приложения, если они включены в директорию `contentDir` (по умолчанию `./src`) и соответствуют расширению файла декларации контента (по умолчанию `.content.{json,ts,tsx,js,jsx,mjs,cjs,md,mdx,yaml,yml}`).
300
+ >
301
+ > Подробнее см. в [документации по декларации контента](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/dictionary/content_file.md).
302
+
303
+ </Step>
304
+
305
+ <Step number={5} title="Добавление локализованной маршрутизации">
306
+
307
+ Цель этого шага — дать каждому языку свой собственный URL, который будет индексироваться поисковыми системами.
308
+
309
+ Переместите ваши страницы в **необязательный динамический сегмент**. В файловом роутере SolidStart `[[locale]]` компилируется в шаблон пути `:locale?`:
310
+
311
+ ```plaintext
312
+ src/routes/
313
+ [[locale]].tsx ← layout, проверяющий сегмент
314
+ [[locale]]/
315
+ index.tsx → / и /fr и /es
316
+ about.tsx → /about и /fr/about и /es/about
317
+ [...404].tsx → catch-all для всего остального
318
+ ```
319
+
320
+ Единственная задача файла layout — ограничить сегмент настроенной локалью:
321
+
322
+ ```tsx fileName="src/routes/[[locale]].tsx" codeFormat="typescript"
323
+ import type { RouteSectionProps } from "@solidjs/router";
324
+ import { locales } from "intlayer";
325
+
326
+ export const route = {
327
+ matchFilters: {
328
+ locale: locales,
329
+ },
330
+ };
331
+
332
+ export default function LocaleLayout(props: RouteSectionProps) {
333
+ return <>{props.children}</>;
334
+ }
335
+ ```
336
+
337
+ `@solidjs/router` разворачивает `:locale?` в два шаблона — один с сегментом и один без — и пробует их по убыванию специфичности. Именно `matchFilters` отличает работающую настройку от запутывающей:
338
+
339
+ | URL | Без `matchFilters` | С `matchFilters` |
340
+ | ----------- | --------------------------------------------------- | ------------------------------------------ |
341
+ | `/fr/about` | Страница about на французском | Страница about на французском |
342
+ | `/about` | Страница about (статический сегмент побеждает) | Страница about |
343
+ | `/unknown` | **Главная страница**, незаметно, с `locale=unknown` | Нет совпадения → переходит к catch-all 404 |
344
+
345
+ > Предпочитайте `[locale]` (обязательный) вместо `[[locale]]`, если вы используете режим маршрутизации `'prefix-all'`, и полностью уберите сегмент для `'no-prefix'` или `'search-params'`.
346
+
347
+ </Step>
348
+
349
+ <Step number={6} title="Передача локали вашему приложению">
350
+
351
+ URL — это единственный источник истины для локали: middleware уже перенаправил запрос на его локализованный путь, поэтому чтение пути в корневом layout сохраняет согласованность серверного рендеринга и клиентской гидратации, а также автоматически обновляет локаль при каждой клиентской навигации.
352
+
353
+ ```tsx fileName="src/app.tsx" codeFormat="typescript"
354
+ import { MetaProvider } from "@solidjs/meta";
355
+ import { Router, useLocation } from "@solidjs/router";
356
+ import { FileRoutes } from "@solidjs/start/router";
357
+ import { defaultLocale, getHTMLTextDir, getLocaleFromPath } from "intlayer";
358
+ import { IntlayerProvider } from "solid-intlayer";
359
+ import { createEffect, type ParentProps, Suspense } from "solid-js";
360
+ import { isServer } from "solid-js/web";
361
+ import { Nav } from "~/components/Nav";
362
+ import "./app.css";
363
+
364
+ const RootLayout = (props: ParentProps) => {
365
+ const location = useLocation();
366
+ const locale = () => getLocaleFromPath(location.pathname) ?? defaultLocale;
367
+
368
+ // Сервер рендерит <html> в entry-server.tsx; клиентским переходам между
369
+ // локалями нужно самостоятельно обновлять атрибуты.
370
+ createEffect(() => {
371
+ if (isServer) return;
372
+
373
+ document.documentElement.lang = locale();
374
+ document.documentElement.dir = getHTMLTextDir(locale());
375
+ });
376
+
377
+ return (
378
+ <MetaProvider>
379
+ <IntlayerProvider locale={locale()}>
380
+ <Nav />
381
+ <Suspense>{props.children}</Suspense>
382
+ </IntlayerProvider>
383
+ </MetaProvider>
384
+ );
385
+ };
386
+
387
+ export default function App() {
388
+ return (
389
+ <Router root={RootLayout}>
390
+ <FileRoutes />
391
+ </Router>
392
+ );
393
+ }
394
+ ```
395
+
396
+ > `IntlayerProvider` реагирует на свой проп `locale`, поэтому достаточно передать вызов accessor'а `locale()` внутри JSX — Solid компилирует его в геттер, и всё дерево перерендеривается на новом языке при изменении URL.
397
+
398
+ </Step>
399
+
400
+ <Step number={7} title="Установка атрибутов lang и dir HTML на сервере">
401
+
402
+ Элемент `<html>` рендерится в `entry-server.tsx`, вне `Router`. Вместо этого считывайте локаль из URL запроса:
403
+
404
+ ```tsx fileName="src/entry-server.tsx" codeFormat="typescript"
405
+ // @refresh reload
406
+ import { createHandler, StartServer } from "@solidjs/start/server";
407
+ import { defaultLocale, getHTMLTextDir, getLocaleFromPath } from "intlayer";
408
+ import { getRequestEvent } from "solid-js/web";
409
+
410
+ export default createHandler(() => (
411
+ <StartServer
412
+ document={({ assets, children, scripts }) => {
413
+ const url = getRequestEvent()?.request.url ?? "/";
414
+ const locale = getLocaleFromPath(url) ?? defaultLocale;
415
+
416
+ return (
417
+ <html dir={getHTMLTextDir(locale)} lang={locale}>
418
+ <head>
419
+ <meta charset="utf-8" />
420
+ <meta
421
+ name="viewport"
422
+ content="width=device-width, initial-scale=1"
423
+ />
424
+ <link rel="icon" href="/favicon.ico" />
425
+ {assets}
426
+ </head>
427
+ <body>
428
+ <div id="app">{children}</div>
429
+ {scripts}
430
+ </body>
431
+ </html>
432
+ );
433
+ }}
434
+ />
435
+ ));
436
+ ```
437
+
438
+ Теперь краулеры получают правильный язык уже в первом байте:
439
+
440
+ ```html
441
+ <html dir="ltr" lang="fr"></html>
442
+ ```
443
+
444
+ </Step>
445
+
446
+ <Step number={8} title="Использование Intlayer на ваших страницах">
447
+
448
+ Обращайтесь к словарям контента в любом месте приложения:
449
+
450
+ ```tsx fileName="src/routes/[[locale]]/index.tsx" codeFormat="typescript"
451
+ import { Meta, Title } from "@solidjs/meta";
452
+ import { useIntlayer } from "solid-intlayer";
453
+ import Counter from "~/components/Counter";
454
+
455
+ export default function Home() {
456
+ const content = useIntlayer("home-page");
457
+
458
+ return (
459
+ <main>
460
+ <Title>{content.metaTitle.value}</Title>
461
+ <Meta content={content.metaDescription.value} name="description" />
462
+ <h1>{content.title}</h1>
463
+ <Counter />
464
+ <p>{content.documentation}</p>
465
+ </main>
466
+ );
467
+ }
468
+ ```
469
+
470
+ > В Solid `useIntlayer` возвращает реактивный контент (например, `content`). Вы можете обращаться к его свойствам напрямую.
471
+
472
+ > Если вы хотите использовать ваш контент в атрибуте типа `string`, таком как `alt`, `title`, `href`, `aria-label` и т. д., используйте значение функции, например:
473
+ >
474
+ > ```html
475
+ > <img src="{content.image.src.value}" alt="{content.image.value}" />
476
+ > <img src="{content.image.src.toString()}" alt="{content.image.toString()}" />
477
+ > <img src="{String(content.image.src)}" alt="{String(content.image)}" />
478
+ > ```
479
+
480
+ > Подробнее о хуке `useIntlayer` см. в [документации](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/packages/solid-intlayer/useIntlayer.md).
481
+
482
+ Контентные узлы не ограничиваются простыми переводами. Например, счётчик с формами множественного числа:
483
+
484
+ ```typescript fileName="src/components/Counter.content.ts" codeFormat="typescript"
485
+ import { type Dictionary, plural, t } from "intlayer";
486
+
487
+ const counterContent = {
488
+ key: "counter",
489
+ content: {
490
+ clicks: plural({
491
+ one: t({
492
+ en: "{{count}} click",
493
+ fr: "{{count}} clic",
494
+ es: "{{count}} clic",
495
+ }),
496
+ other: t({
497
+ en: "{{count}} clicks",
498
+ fr: "{{count}} clics",
499
+ es: "{{count}} clics",
500
+ }),
501
+ }),
502
+ },
503
+ } satisfies Dictionary;
504
+
505
+ export default counterContent;
506
+ ```
507
+
508
+ ```tsx fileName="src/components/Counter.tsx" codeFormat="typescript"
509
+ import { useIntlayer } from "solid-intlayer";
510
+ import { createSignal } from "solid-js";
511
+
512
+ export default function Counter() {
513
+ const [count, setCount] = createSignal(0);
514
+ const content = useIntlayer("counter");
515
+
516
+ return (
517
+ <button onClick={() => setCount(count() + 1)} type="button">
518
+ {content.clicks(count())}
519
+ </button>
520
+ );
521
+ }
522
+ ```
523
+
524
+ `plural()` выбирает категорию через `Intl.PluralRules` для активной локали, поэтому языки с более чем двумя формами множественного числа работают без дополнительного кода.
525
+
526
+ </Step>
527
+
528
+ <Step number={9} title="Создание компонента локализованной ссылки">
529
+
530
+ Создайте пользовательский компонент `Link`, который автоматически добавляет префикс языка к внутренним URL:
531
+
532
+ ```tsx fileName="src/components/LocalizedLink.tsx" codeFormat="typescript"
533
+ import { A, type AnchorProps } from "@solidjs/router";
534
+ import { getLocalizedUrl } from "intlayer";
535
+ import { useLocale } from "solid-intlayer";
536
+ import type { ParentComponent } from "solid-js";
537
+
538
+ export const LocalizedLink: ParentComponent<AnchorProps> = (props) => {
539
+ const { locale } = useLocale();
540
+
541
+ const isExternal = () => /^[a-z][a-z0-9+.-]*:/i.test(props.href);
542
+
543
+ const localizedHref = () =>
544
+ isExternal() ? props.href : getLocalizedUrl(props.href, locale());
545
+
546
+ return <A {...props} href={localizedHref()} />;
547
+ };
548
+ ```
549
+
550
+ ```tsx fileName="src/components/Nav.tsx" codeFormat="typescript"
551
+ import { useIntlayer } from "solid-intlayer";
552
+ import type { Component } from "solid-js";
553
+ import { LocaleSwitcher } from "./LocaleSwitcher";
554
+ import { LocalizedLink } from "./LocalizedLink";
555
+
556
+ export const Nav: Component = () => {
557
+ const content = useIntlayer("nav");
558
+
559
+ return (
560
+ <nav>
561
+ <LocalizedLink href="/">{content.home}</LocalizedLink>
562
+ <LocalizedLink href="/about">{content.about}</LocalizedLink>
563
+ <LocaleSwitcher />
564
+ </nav>
565
+ );
566
+ };
567
+ ```
568
+
569
+ Написав `href="/about"` один раз, вы получаете `/about`, `/fr/about` или `/es/about` в зависимости от активной локали — без ручного добавления префиксов где-либо на страницах.
570
+
571
+ </Step>
572
+
573
+ <Step number={10} title="Создание компонента переключателя локали">
574
+
575
+ Отрисовывайте переключатель как **настоящие ссылки**, а не как `<select>`: каждый язык текущей страницы становится индексируемой ссылкой, которую можно открыть в новой вкладке — то, что элемент управления только на JavaScript предложить не может.
576
+
577
+ `getPathWithoutLocale` убирает сегмент локали из текущего пути, а `getLocalizedUrl` перестраивает его для целевой локали, поэтому ссылки следуют вашему режиму маршрутизации без жёсткого кодирования чего-либо. Именно навигация меняет отображаемую локаль — маршрут `[[locale]]` определяет её из URL — в то время как `setLocale` сохраняет выбор в cookie `INTLAYER_LOCALE`, чтобы при последующем посещении URL без локали открывался тот же язык.
578
+
579
+ ```tsx fileName="src/components/LocaleSwitcher.tsx" codeFormat={["typescript", "esm"]}
580
+ import { A, useLocation } from "@solidjs/router";
581
+ import {
582
+ getHTMLTextDir,
583
+ getLocaleName,
584
+ getLocalizedUrl,
585
+ getPathWithoutLocale,
586
+ } from "intlayer";
587
+ import { useIntlayer, useLocale } from "solid-intlayer";
588
+ import { type Component, For } from "solid-js";
589
+
590
+ export const LocaleSwitcher: Component = () => {
591
+ const content = useIntlayer("locale-switcher");
592
+ const location = useLocation();
593
+ const { locale, setLocale, availableLocales } = useLocale();
594
+
595
+ // Канонический (без локали) путь текущей отображаемой страницы
596
+ const pathWithoutLocale = () => getPathWithoutLocale(location.pathname);
597
+
598
+ return (
599
+ <div>
600
+ <button
601
+ aria-label={content.label.value}
602
+ popoverTarget="localePopover"
603
+ type="button"
604
+ >
605
+ {getLocaleName(locale())}
606
+ </button>
607
+ <div id="localePopover" popover="auto">
608
+ <For each={availableLocales}>
609
+ {(localeItem) => (
610
+ <A
611
+ dir={getHTMLTextDir(localeItem)}
612
+ // Точное совпадение, чтобы ссылка на локаль по умолчанию не
613
+ // помечалась активной на каждой странице
614
+ end
615
+ href={getLocalizedUrl(pathWithoutLocale(), localeItem)}
616
+ hreflang={localeItem}
617
+ lang={localeItem}
618
+ onClick={() => setLocale(localeItem)}
619
+ // Гарантирует, что кнопка "назад" браузера вернёт на предыдущую страницу
620
+ replace
621
+ >
622
+ {/* Язык на своём собственном языке — например, Français */}
623
+ {getLocaleName(localeItem)}
624
+ </A>
625
+ )}
626
+ </For>
627
+ </div>
628
+ </div>
629
+ );
630
+ };
631
+ ```
632
+
633
+ > В Solid `locale` из `useLocale` — это **accessor-сигнал**. Используйте `locale()` (со скобками), чтобы реактивно прочитать его текущее значение.
634
+ >
635
+ > `getLocaleName(localeItem)` отображает каждый язык на его собственном языке — `English / Français / Español`. Передайте второй аргумент, чтобы перевести названия на текущий отображаемый язык: `getLocaleName(localeItem, locale())` даёт `English / French / Spanish` на английском, `anglais / français / espagnol` на французском.
636
+ >
637
+ > `<A>` уже устанавливает `aria-current="page"` на ссылке, соответствующей текущему URL, так что здесь ничего добавлять не нужно. `replace` считывается роутером обратно из отрисованного атрибута: он заменяет запись в истории вместо добавления новой, поэтому кнопка "назад" браузера возвращает на страницу, посещённую до переключения, а не на ту же страницу на предыдущем языке.
638
+ >
639
+ > `dir` и `hreflang` на каждой ссылке сохраняют правильную ориентацию названий языков с письмом справа налево и сообщают вспомогательным технологиям и краулерам, на какой язык указывает каждая ссылка.
640
+ >
641
+ > Подробнее о хуке `useLocale` см. в [документации](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/packages/solid-intlayer/useLocale.md).
642
+
643
+ </Step>
644
+
645
+ <Step number={11} title="Отправка ссылок canonical и hreflang" isOptional={true}>
646
+
647
+ Аннотации `hreflang` сообщают поисковым системам, что `/about`, `/fr/about` и `/es/about` — это одна и та же страница на разных языках. `getMultilingualUrls` формирует их из канонического (без локали) пути в соответствии с вашим режимом маршрутизации, поэтому ничего не приходится жёстко кодировать:
648
+
649
+ ```tsx fileName="src/components/AlternateLinks.tsx" codeFormat="typescript"
650
+ import {
651
+ defaultLocale,
652
+ getMultilingualUrls,
653
+ getPathWithoutLocale,
654
+ } from "intlayer";
655
+ import { type Component, For } from "solid-js";
656
+
657
+ export type AlternateLinksProps = {
658
+ /** Абсолютный URL отображаемой страницы. */
659
+ url: string;
660
+ };
661
+
662
+ export const AlternateLinks: Component<AlternateLinksProps> = (props) => {
663
+ const multilingualUrls = () => {
664
+ const { origin, pathname } = new URL(props.url);
665
+
666
+ return Object.entries(
667
+ getMultilingualUrls(`${origin}${getPathWithoutLocale(pathname)}`)
668
+ );
669
+ };
670
+
671
+ const canonicalUrl = () =>
672
+ new URL(props.url).origin + new URL(props.url).pathname;
673
+
674
+ return (
675
+ <>
676
+ <link href={canonicalUrl()} rel="canonical" />
677
+ <For each={multilingualUrls()}>
678
+ {([locale, localizedUrl]) => (
679
+ <link href={localizedUrl} hreflang={locale} rel="alternate" />
680
+ )}
681
+ </For>
682
+ <link
683
+ href={
684
+ multilingualUrls().find(([locale]) => locale === defaultLocale)?.[1]
685
+ }
686
+ hreflang="x-default"
687
+ rel="alternate"
688
+ />
689
+ </>
690
+ );
691
+ };
692
+ ```
693
+
694
+ Отрисуйте его в head документа, где доступен URL запроса:
695
+
696
+ ```tsx fileName="src/entry-server.tsx" codeFormat="typescript"
697
+ import { AlternateLinks } from "~/components/AlternateLinks";
698
+
699
+ // … внутри <head>, рядом с остальными мета-тегами:
700
+ <AlternateLinks url={url} />;
701
+ ```
702
+
703
+ `GET /fr/about` отдаёт тогда:
704
+
705
+ ```html
706
+ <link href="https://example.com/fr/about" rel="canonical" />
707
+ <link href="https://example.com/about" hreflang="en" rel="alternate" />
708
+ <link href="https://example.com/fr/about" hreflang="fr" rel="alternate" />
709
+ <link href="https://example.com/es/about" hreflang="es" rel="alternate" />
710
+ <link href="https://example.com/about" hreflang="x-default" rel="alternate" />
711
+ ```
712
+
713
+ > **Примечание о `@solidjs/meta`**: на момент написания `<Title>` и `<Meta>` из `@solidjs/meta` применяются на клиенте после гидратации, но **не** попадают в серверно-рендерённый `<head>` в SolidStart v2. Пока это не исправлено выше по стеку, отрисовывайте теги, которые краулеры должны видеть без JavaScript — `canonical`, `hreflang` и, при необходимости, `title` / `description` — напрямую в `entry-server.tsx`, как показано выше.
714
+
715
+ </Step>
716
+
717
+ <Step number={12} title="Управление страницами 404" isOptional={true}>
718
+
719
+ Splat-маршрут в корне `src/routes` перехватывает все пути, которые не совпали с сегментом локали, включая некорректные префиксы локали, отклонённые `matchFilters`. Так как локаль по-прежнему определяется из URL через корневой layout, страница 404 отображается на языке посетителя:
720
+
721
+ ```tsx fileName="src/routes/[...404].tsx" codeFormat="typescript"
722
+ import { Title } from "@solidjs/meta";
723
+ import { HttpStatusCode } from "@solidjs/start";
724
+ import { useIntlayer } from "solid-intlayer";
725
+ import { LocalizedLink } from "~/components/LocalizedLink";
726
+
727
+ export default function NotFound() {
728
+ const content = useIntlayer("not-found-page");
729
+
730
+ return (
731
+ <main>
732
+ <Title>{content.metaTitle.value}</Title>
733
+ <HttpStatusCode code={404} />
734
+ <h1>{content.title}</h1>
735
+ <LocalizedLink href="/">{content.backHome}</LocalizedLink>
736
+ </main>
737
+ );
738
+ }
739
+ ```
740
+
741
+ | Запрос | Результат |
742
+ | ----------------- | -------------------------------------------- |
743
+ | `/xx` | `404` — `xx` не является настроенной локалью |
744
+ | `/nonexistent` | `404` на локали по умолчанию |
745
+ | `/fr/nonexistent` | `404` на французском (`Page introuvable`) |
746
+
747
+ </Step>
748
+
749
+ <Step number={13} title="Генерация многоязычного sitemap" isOptional={true}>
750
+
751
+ Генератор sitemap Intlayer разворачивает каждый путь в одну запись на каждую локаль и связывает альтернативы через `xhtml:link` между ними, так что маршрут должен перечислять только канонические пути без локали.
752
+
753
+ > В отличие от базовых генераторов, которые выводят только плоские URL, Intlayer связывает двунаправленными ссылками каждый локализованный вариант каждой страницы, что помогает поисковым системам сопоставлять локализованные URL и показывать нужный нужной аудитории.
754
+
755
+ SolidStart превращает файл, экспортирующий HTTP-метод, в API-маршрут и убирает расширение `.ts` из пути — поэтому `src/routes/sitemap.xml.ts` обслуживается по адресу `/sitemap.xml`:
756
+
757
+ ```typescript fileName="src/routes/sitemap.xml.ts" codeFormat={["typescript", "esm", "commonjs"]}
758
+ import type { APIEvent } from "@solidjs/start/server";
759
+ import { generateSitemap } from "intlayer";
760
+
761
+ const SITE_URL = process.env.SITE_URL ?? "http://localhost:3000";
762
+
763
+ export const GET = (_event: APIEvent) => {
764
+ const sitemap = generateSitemap(
765
+ [
766
+ { path: "/", changefreq: "daily", priority: 1.0 },
767
+ { path: "/about", changefreq: "monthly", priority: 0.8 },
768
+ ],
769
+ { siteUrl: SITE_URL }
770
+ );
771
+
772
+ return new Response(sitemap, {
773
+ headers: { "Content-Type": "application/xml" },
774
+ });
775
+ };
776
+ ```
777
+
778
+ ```xml fileName="output of GET /sitemap.xml"
779
+ <?xml version="1.0" encoding="UTF-8"?>
780
+ <urlset
781
+ xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
782
+ xmlns:xhtml="http://www.w3.org/1999/xhtml"
783
+ >
784
+ <url>
785
+ <loc>https://example.com/about</loc>
786
+ <changefreq>monthly</changefreq>
787
+ <priority>0.8</priority>
788
+ <xhtml:link rel="alternate" hreflang="en" href="https://example.com/about"/>
789
+ <xhtml:link rel="alternate" hreflang="fr" href="https://example.com/fr/about"/>
790
+ <xhtml:link rel="alternate" hreflang="es" href="https://example.com/es/about"/>
791
+ <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/about"/>
792
+ </url>
793
+ </urlset>
794
+ ```
795
+
796
+ > API-маршруты не поддерживают необязательные параметры, поэтому держите этот файл в корне `src/routes`, вне сегмента `[[locale]]`. Sitemap уже содержит все локали.
797
+
798
+ Аналогично можно собрать `robots.txt` с помощью `getMultilingualUrls`, чтобы записи `Disallow` охватывали все локализованные написания чувствительного пути:
799
+
800
+ ```typescript fileName="src/routes/robots.txt.ts" codeFormat={["typescript", "esm", "commonjs"]}
801
+ import { getMultilingualUrls } from "intlayer";
802
+
803
+ const SITE_URL = process.env.SITE_URL ?? "http://localhost:3000";
804
+
805
+ const disallowedPaths = ["/admin", "/private"].flatMap((path) =>
806
+ Object.values(getMultilingualUrls(path))
807
+ );
808
+
809
+ export const GET = () =>
810
+ new Response(
811
+ [
812
+ "User-agent: *",
813
+ "Allow: /",
814
+ ...disallowedPaths.map((path) => `Disallow: ${path}`),
815
+ "",
816
+ `Sitemap: ${SITE_URL}/sitemap.xml`,
817
+ ].join("\n"),
818
+ { headers: { "Content-Type": "text/plain" } }
819
+ );
820
+ ```
821
+
822
+ </Step>
823
+
824
+ <Step number={14} title="Получение локали в серверных функциях" isOptional={true}>
825
+
826
+ Иногда нужно получить доступ к текущей локали внутри серверной функции или API-маршрута.
827
+
828
+ В настройке на основе префиксов, как эта, **URL является авторитетным источником**: `getLocaleFromPath` считывает префикс из URL запроса. `getLocale` — это резервный вариант для запросов без префикса локали: он проверяет cookie `INTLAYER_LOCALE`, затем заголовок `x-intlayer-locale`, затем согласовывает `Accept-Language`.
829
+
830
+ ```tsx fileName="src/routes/[[locale]]/index.tsx" codeFormat="typescript"
831
+ import { createAsync } from "@solidjs/router";
832
+ import { getCookie, getIntlayer, getLocale, getLocaleFromPath } from "intlayer";
833
+ import { getRequestEvent } from "solid-js/web";
834
+
835
+ const loadLocalizedData = async () => {
836
+ "use server";
837
+
838
+ const request = getRequestEvent()?.request;
839
+
840
+ const locale =
841
+ getLocaleFromPath(request?.url) ??
842
+ (await getLocale({
843
+ // Получить cookie из запроса (по умолчанию: 'INTLAYER_LOCALE')
844
+ getCookie: (name) =>
845
+ getCookie(name, request?.headers.get("cookie") ?? ""),
846
+ // Получить заголовок из запроса (по умолчанию: 'x-intlayer-locale'),
847
+ // с резервом на согласование Accept-Language
848
+ getHeader: (name) => request?.headers.get(name) ?? undefined,
849
+ }));
850
+
851
+ // Получить некоторый контент вне компонента с помощью getIntlayer()
852
+ const content = getIntlayer("home-page", locale);
853
+
854
+ return { locale, title: String(content.title) };
855
+ };
856
+
857
+ export default function Page() {
858
+ const data = createAsync(() => loadLocalizedData());
859
+
860
+ return <p>{data()?.title}</p>;
861
+ }
862
+ ```
863
+
864
+ > Не полагайтесь только на `getLocale` здесь: cookie локали записывается только после того, как посетитель активно переключит язык, поэтому первый визит на `/fr/...` разрешился бы в локаль по умолчанию.
865
+
866
+ </Step>
867
+
868
+ <Step number={15} title="Извлечение контента ваших компонентов" isOptional={true}>
869
+
870
+ Если у вас уже есть существующая кодовая база, преобразование тысяч файлов может занять много времени.
871
+
872
+ Чтобы упростить этот процесс, Intlayer предлагает [компилятор](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/compiler.md) / [экстрактор](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/cli/extract.md) для преобразования ваших компонентов и извлечения контента.
873
+
874
+ Чтобы настроить это, добавьте секцию `compiler` в ваш файл `intlayer.config.ts`:
875
+
876
+ ```typescript fileName="intlayer.config.ts" codeFormat={["typescript", "esm", "commonjs"]}
877
+ import { type IntlayerConfig } from "intlayer";
878
+
879
+ const config: IntlayerConfig = {
880
+ // ... остальная часть вашей конфигурации
881
+ compiler: {
882
+ /**
883
+ * Указывает, должен ли компилятор быть включён.
884
+ */
885
+ enabled: true,
886
+
887
+ /**
888
+ * Определяет путь выходных файлов
889
+ */
890
+ output: ({ fileName, extension }) => `./${fileName}${extension}`,
891
+
892
+ /**
893
+ * Указывает, должны ли компоненты сохраняться после преобразования.
894
+ *
895
+ * - Если `true`, компилятор перезапишет файл компонента на диске. Таким образом, преобразование станет постоянным, и компилятор пропустит преобразование при следующем запуске. Так компилятор может преобразовать приложение, после чего его можно удалить.
896
+ *
897
+ * - Если `false`, компилятор внедрит вызов функции `useIntlayer()` в код только в выходных данных сборки, оставив исходную кодовую базу нетронутой. Преобразование будет выполняться только в памяти.
898
+ */
899
+ saveComponents: false,
900
+
901
+ /**
902
+ * Префикс ключа словаря
903
+ */
904
+ dictionaryKeyPrefix: "",
905
+ },
906
+ };
907
+
908
+ export default config;
909
+ ```
910
+
911
+ <Tabs>
912
+ <Tab value='Extract command'>
913
+
914
+ Запустите экстрактор, чтобы преобразовать ваши компоненты и извлечь контент
915
+
916
+ ```bash packageManager="npm"
917
+ npx intlayer extract
918
+ ```
919
+
920
+ ```bash packageManager="pnpm"
921
+ pnpm intlayer extract
922
+ ```
923
+
924
+ ```bash packageManager="yarn"
925
+ yarn intlayer extract
926
+ ```
927
+
928
+ ```bash packageManager="bun"
929
+ bun x intlayer extract
930
+ ```
931
+
932
+ > Впоследствии переместите сгенерированные файлы контента ваших страниц из `src/routes` — по причине, объяснённой в шаге 5.
933
+
934
+ </Tab>
935
+ <Tab value='Babel compiler'>
936
+
937
+ > Начиная с v9, `intlayerCompiler` включён в плагин `intlayer`. Так что добавлять его вручную не нужно.
938
+
939
+ Обновите ваш `vite.config.ts`, включив плагин `intlayerCompiler`:
940
+
941
+ ```ts fileName="vite.config.ts"
942
+ import { solidStart } from "@solidjs/start/config";
943
+ import { nitro } from "nitro/vite";
944
+ import { defineConfig } from "vite";
945
+ import { intlayer, intlayerCompiler } from "vite-intlayer";
946
+
947
+ export default defineConfig({
948
+ plugins: [
949
+ solidStart({ middleware: "src/middleware.ts" }),
950
+ nitro(),
951
+ intlayer(),
952
+ intlayerCompiler(), // Добавляет плагин компилятора
953
+ ],
954
+ });
955
+ ```
956
+
957
+ ```bash packageManager="npm"
958
+ npm run build # Или npm run dev
959
+ ```
960
+
961
+ ```bash packageManager="pnpm"
962
+ pnpm run build # Или pnpm run dev
963
+ ```
964
+
965
+ ```bash packageManager="yarn"
966
+ yarn build # Или yarn dev
967
+ ```
968
+
969
+ ```bash packageManager="bun"
970
+ bun run build # Или bun run dev
971
+ ```
972
+
973
+ </Tab>
974
+ </Tabs>
975
+
976
+ </Step>
977
+
978
+ <Step number={16} title="Настройка TypeScript">
979
+
980
+ Intlayer использует augmentation модулей, чтобы вы получили преимущества TypeScript и укрепили вашу кодовую базу.
981
+
982
+ Убедитесь, что ваша конфигурация TypeScript включает автогенерируемые типы:
983
+
984
+ ```json5 fileName="tsconfig.json"
985
+ {
986
+ compilerOptions: {
987
+ // ... ваши существующие настройки
988
+ },
989
+ include: [
990
+ "src",
991
+ "*.ts",
992
+ ".intlayer/**/*.ts", // Включить автогенерируемые типы
993
+ ],
994
+ }
995
+ ```
996
+
997
+ Теперь ключи словарей и пути контента проверяются во время компиляции:
998
+
999
+ ```tsx
1000
+ useIntlayer("home-page"); // ✅
1001
+ useIntlayer("hom-page"); // ❌ Argument of type '"hom-page"' is not assignable to parameter of type 'keyof __DictionaryRegistry'
1002
+ ```
1003
+
1004
+ </Step>
1005
+
1006
+ </Steps>
1007
+
1008
+ ---
1009
+
1010
+ ## Проверка вашей настройки
1011
+
1012
+ Соберите и запустите сервер, затем проверьте, что следующие запросы ведут себя как ожидается:
1013
+
1014
+ ```bash
1015
+ npm run build
1016
+ node .output/server/index.mjs
1017
+ ```
1018
+
1019
+ | Запрос | Ожидаемый ответ |
1020
+ | ------------------------------------- | ---------------------------------------- |
1021
+ | `GET /` | `200` — английский |
1022
+ | `GET /` с `Accept-Language: fr` | `302` → `/fr` |
1023
+ | `GET /` с cookie `INTLAYER_LOCALE=es` | `302` → `/es` |
1024
+ | `GET /fr` | `200` — французский, `<html lang="fr">` |
1025
+ | `GET /fr/about` | `200` — страница about на французском |
1026
+ | `GET /en/about` | `302` → `/about` (канонический редирект) |
1027
+ | `GET /xx` | `404` |
1028
+ | `GET /fr/nonexistent` | `404` на французском |
1029
+ | `GET /sitemap.xml` | `200` — многоязычный XML sitemap |
1030
+
1031
+ Строки, отображающие страницу, ведут себя идентично под `vite dev`. Три строки с редиректами применяются только к собранному серверу, если только вы сами не зарегистрируете обработчик как middleware — см. шаг 3.
1032
+
1033
+ > Запускайте dev-сервер на Node (`vite dev`), а не на Bun (`bun --bun vite dev`): SSR SolidStart в настоящее время падает под рантаймом Bun с ошибкой `Expected a Response object, but received 'NodeResponse'`. Это не связано с Intlayer — ошибка воспроизводится на обычном шаблоне — и затрагивает только dev-сервер, а не `vite build`.
1034
+
1035
+ ---
1036
+
1037
+ ## Настройка Git
1038
+
1039
+ Рекомендуется игнорировать файлы, сгенерированные Intlayer. Это позволяет избежать их коммита в ваш Git-репозиторий.
1040
+
1041
+ Для этого добавьте следующие инструкции в файл `.gitignore`:
1042
+
1043
+ ```plaintext fileName=".gitignore"
1044
+ # Игнорировать файлы, сгенерированные Intlayer
1045
+ .intlayer
1046
+ ```
1047
+
1048
+ ---
1049
+
1050
+ ## Расширение для VS Code
1051
+
1052
+ Чтобы улучшить опыт разработки с Intlayer, вы можете установить официальное **расширение Intlayer для VS Code**.
1053
+
1054
+ [Установить из VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
1055
+
1056
+ Это расширение предоставляет:
1057
+
1058
+ - **Автодополнение** для ключей перевода.
1059
+ - **Обнаружение ошибок в реальном времени** для отсутствующих переводов.
1060
+ - **Встроенные превью** переведённого контента.
1061
+ - **Быстрые действия** для лёгкого создания и обновления переводов.
1062
+
1063
+ ---
1064
+
1065
+ ## Что дальше
1066
+
1067
+ Чтобы пойти дальше, вы можете внедрить [визуальный редактор](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/intlayer_visual_editor.md) или вынести ваш контент вовне с помощью [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/intlayer_CMS.md).
1068
+
1069
+ ---
1070
+
1071
+ ## Ссылки на документацию
1072
+
1073
+ - [Документация Intlayer](https://intlayer.org)
1074
+ - [Документация SolidStart](https://start.solidjs.com)
1075
+ - [Хук useIntlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/packages/solid-intlayer/useIntlayer.md)
1076
+ - [Хук useLocale](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/packages/solid-intlayer/useLocale.md)
1077
+ - [Декларация контента](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/dictionary/content_file.md)
1078
+ - [Конфигурация](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/configuration.md)