@intlayer/docs 9.1.3 → 9.2.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 (415) hide show
  1. package/blog/ar/rag_powered_documentation_assistant.md +7 -0
  2. package/blog/de/rag_powered_documentation_assistant.md +6 -0
  3. package/blog/en-GB/rag_powered_documentation_assistant.md +6 -0
  4. package/blog/es/rag_powered_documentation_assistant.md +7 -0
  5. package/blog/fr/i18n_meaning.md +7 -1
  6. package/blog/fr/list_i18n_technologies/frameworks/angular.md +5 -1
  7. package/blog/fr/rag_powered_documentation_assistant.md +6 -0
  8. package/blog/hi/next-i18next_vs_next-intl_vs_intlayer.md +119 -42
  9. package/blog/hi/rag_powered_documentation_assistant.md +7 -0
  10. package/blog/id/rag_powered_documentation_assistant.md +6 -0
  11. package/blog/it/rag_powered_documentation_assistant.md +6 -0
  12. package/blog/ja/rag_powered_documentation_assistant.md +7 -0
  13. package/blog/ko/list_i18n_technologies/frameworks/react.md +7 -7
  14. package/blog/ko/rag_powered_documentation_assistant.md +6 -0
  15. package/blog/pl/rag_powered_documentation_assistant.md +6 -0
  16. package/blog/pt/rag_powered_documentation_assistant.md +6 -0
  17. package/blog/ru/rag_powered_documentation_assistant.md +7 -0
  18. package/blog/tr/intlayer_with_react-intl.md +3 -1
  19. package/blog/tr/next-i18next_vs_next-intl_vs_intlayer.md +175 -42
  20. package/blog/tr/rag_powered_documentation_assistant.md +6 -0
  21. package/blog/uk/rag_powered_documentation_assistant.md +6 -0
  22. package/blog/vi/rag_powered_documentation_assistant.md +6 -0
  23. package/blog/zh/intlayer_with_i18next.md +87 -28
  24. package/blog/zh/intlayer_with_next-i18next.md +86 -29
  25. package/blog/zh/intlayer_with_next-intl.md +88 -28
  26. package/blog/zh/intlayer_with_react-i18next.md +87 -28
  27. package/blog/zh/intlayer_with_react-intl.md +88 -27
  28. package/blog/zh/intlayer_with_vue-i18n.md +117 -8
  29. package/blog/zh/rag_powered_documentation_assistant.md +6 -0
  30. package/dist/cjs/generated/blog.entry.cjs +27 -27
  31. package/dist/cjs/generated/blog.entry.cjs.map +1 -1
  32. package/dist/cjs/generated/docs.entry.cjs +234 -214
  33. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  34. package/dist/cjs/generated/frequentQuestions.entry.cjs +17 -17
  35. package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
  36. package/dist/cjs/generated/legal.entry.cjs +2 -2
  37. package/dist/cjs/generated/legal.entry.cjs.map +1 -1
  38. package/dist/esm/generated/blog.entry.mjs +27 -27
  39. package/dist/esm/generated/blog.entry.mjs.map +1 -1
  40. package/dist/esm/generated/docs.entry.mjs +234 -214
  41. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  42. package/dist/esm/generated/frequentQuestions.entry.mjs +17 -17
  43. package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
  44. package/dist/esm/generated/legal.entry.mjs +2 -2
  45. package/dist/esm/generated/legal.entry.mjs.map +1 -1
  46. package/dist/types/generated/docs.entry.d.ts +1 -0
  47. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  48. package/docs/ar/analytics.md +222 -0
  49. package/docs/ar/autoFill.md +28 -9
  50. package/docs/ar/configuration.md +25 -8
  51. package/docs/ar/dictionary/file.md +3 -1
  52. package/docs/ar/dictionary/nesting.md +47 -30
  53. package/docs/ar/formatters.md +148 -193
  54. package/docs/ar/intlayer_CMS.md +152 -0
  55. package/docs/ar/intlayer_with_angular_21.md +9 -9
  56. package/docs/ar/intlayer_with_nextjs_14.md +1 -28
  57. package/docs/ar/intlayer_with_nextjs_15.md +1 -33
  58. package/docs/ar/intlayer_with_react_router_v7_fs_routes.md +40 -83
  59. package/docs/ar/intlayer_with_solid_start.md +1078 -0
  60. package/docs/ar/intlayer_with_vite+vue.md +1 -3
  61. package/docs/ar/packages/intlayer/getLocalizedUrl.md +26 -24
  62. package/docs/ar/packages/intlayer/getMultilingualUrls.md +4 -18
  63. package/docs/ar/packages/react-intlayer/useDictionary.md +4 -21
  64. package/docs/ar/packages/react-intlayer/useIntlayer.md +2 -2
  65. package/docs/ar/packages/vite-intlayer/exports.md +15 -0
  66. package/docs/ar/packages/vite-intlayer/intlayer.md +121 -6
  67. package/docs/ar/packages/vite-intlayer/intlayerPrune.md +70 -3
  68. package/docs/ar/releases/v9.md +0 -37
  69. package/docs/ar/self_hosting.md +46 -49
  70. package/docs/bn/configuration.md +25 -8
  71. package/docs/bn/intlayer_with_angular_21.md +9 -9
  72. package/docs/cs/configuration.md +25 -8
  73. package/docs/cs/intlayer_with_angular_21.md +9 -9
  74. package/docs/de/analytics.md +222 -0
  75. package/docs/de/autoFill.md +28 -9
  76. package/docs/de/configuration.md +25 -8
  77. package/docs/de/dictionary/file.md +3 -1
  78. package/docs/de/dictionary/nesting.md +47 -31
  79. package/docs/de/formatters.md +208 -334
  80. package/docs/de/intlayer_CMS.md +66 -15
  81. package/docs/de/intlayer_with_angular_21.md +9 -9
  82. package/docs/de/intlayer_with_nestjs.md +11 -7
  83. package/docs/de/intlayer_with_nextjs_14.md +1 -28
  84. package/docs/de/intlayer_with_nextjs_15.md +1 -33
  85. package/docs/de/intlayer_with_solid_start.md +1078 -0
  86. package/docs/de/intlayer_with_vite+vue.md +1 -3
  87. package/docs/de/packages/intlayer/getLocalizedUrl.md +33 -25
  88. package/docs/de/packages/intlayer/getMultilingualUrls.md +4 -18
  89. package/docs/de/packages/react-intlayer/useDictionary.md +2 -5
  90. package/docs/de/packages/vite-intlayer/exports.md +15 -0
  91. package/docs/de/packages/vite-intlayer/intlayer.md +121 -6
  92. package/docs/de/packages/vite-intlayer/intlayerPrune.md +77 -4
  93. package/docs/de/releases/v9.md +0 -15
  94. package/docs/de/self_hosting.md +46 -50
  95. package/docs/en/cli/doc-review.md +13 -2
  96. package/docs/en/configuration.md +24 -15
  97. package/docs/en/intlayer_with_angular_21.md +9 -9
  98. package/docs/en/intlayer_with_solid_start.md +1091 -0
  99. package/docs/en/intlayer_with_vite+solid.md +12 -0
  100. package/docs/en-GB/analytics.md +222 -0
  101. package/docs/en-GB/autoFill.md +26 -7
  102. package/docs/en-GB/configuration.md +25 -8
  103. package/docs/en-GB/dictionary/file.md +2 -0
  104. package/docs/en-GB/dictionary/nesting.md +64 -205
  105. package/docs/en-GB/formatters.md +146 -181
  106. package/docs/en-GB/intlayer_CMS.md +152 -0
  107. package/docs/en-GB/intlayer_with_angular_21.md +9 -9
  108. package/docs/en-GB/intlayer_with_nestjs.md +6 -2
  109. package/docs/en-GB/intlayer_with_nextjs_14.md +0 -27
  110. package/docs/en-GB/intlayer_with_nextjs_15.md +1 -33
  111. package/docs/en-GB/intlayer_with_react_router_v7_fs_routes.md +40 -82
  112. package/docs/en-GB/intlayer_with_solid_start.md +1078 -0
  113. package/docs/en-GB/intlayer_with_vite+vue.md +1 -3
  114. package/docs/en-GB/packages/intlayer/getLocalizedUrl.md +30 -22
  115. package/docs/en-GB/packages/intlayer/getMultilingualUrls.md +16 -48
  116. package/docs/en-GB/packages/vite-intlayer/exports.md +15 -0
  117. package/docs/en-GB/packages/vite-intlayer/intlayer.md +121 -6
  118. package/docs/en-GB/packages/vite-intlayer/intlayerPrune.md +77 -4
  119. package/docs/en-GB/self_hosting.md +60 -49
  120. package/docs/es/analytics.md +222 -0
  121. package/docs/es/autoFill.md +28 -9
  122. package/docs/es/configuration.md +24 -7
  123. package/docs/es/dictionary/file.md +3 -1
  124. package/docs/es/dictionary/nesting.md +47 -30
  125. package/docs/es/formatters.md +114 -168
  126. package/docs/es/intlayer_CMS.md +35 -10
  127. package/docs/es/intlayer_with_angular_21.md +9 -9
  128. package/docs/es/intlayer_with_nextjs_14.md +1 -28
  129. package/docs/es/intlayer_with_nextjs_15.md +1 -33
  130. package/docs/es/intlayer_with_solid_start.md +1078 -0
  131. package/docs/es/packages/intlayer/getLocalizedUrl.md +31 -23
  132. package/docs/es/packages/intlayer/getMultilingualUrls.md +4 -18
  133. package/docs/es/packages/vite-intlayer/exports.md +15 -0
  134. package/docs/es/packages/vite-intlayer/intlayer.md +121 -6
  135. package/docs/es/packages/vite-intlayer/intlayerPrune.md +69 -2
  136. package/docs/es/releases/v9.md +0 -15
  137. package/docs/es/self_hosting.md +46 -49
  138. package/docs/fr/analytics.md +222 -0
  139. package/docs/fr/autoFill.md +27 -8
  140. package/docs/fr/configuration.md +25 -8
  141. package/docs/fr/dictionary/file.md +2 -0
  142. package/docs/fr/dictionary/nesting.md +37 -184
  143. package/docs/fr/formatters.md +95 -236
  144. package/docs/fr/intlayer_CMS.md +66 -15
  145. package/docs/fr/intlayer_with_angular_21.md +9 -9
  146. package/docs/fr/intlayer_with_nextjs_14.md +1 -28
  147. package/docs/fr/intlayer_with_nextjs_15.md +1 -33
  148. package/docs/fr/intlayer_with_solid_start.md +1078 -0
  149. package/docs/fr/packages/intlayer/getLocalizedUrl.md +37 -27
  150. package/docs/fr/packages/intlayer/getMultilingualUrls.md +18 -20
  151. package/docs/fr/packages/vite-intlayer/exports.md +15 -0
  152. package/docs/fr/packages/vite-intlayer/intlayer.md +121 -6
  153. package/docs/fr/packages/vite-intlayer/intlayerPrune.md +77 -4
  154. package/docs/fr/releases/v9.md +0 -15
  155. package/docs/fr/self_hosting.md +46 -49
  156. package/docs/hi/analytics.md +222 -0
  157. package/docs/hi/autoFill.md +28 -9
  158. package/docs/hi/configuration.md +25 -8
  159. package/docs/hi/dictionary/file.md +3 -1
  160. package/docs/hi/dictionary/nesting.md +47 -30
  161. package/docs/hi/formatters.md +233 -334
  162. package/docs/hi/how_works_intlayer.md +3 -1
  163. package/docs/hi/intlayer_CMS.md +152 -0
  164. package/docs/hi/intlayer_with_angular_21.md +9 -9
  165. package/docs/hi/intlayer_with_nestjs.md +11 -7
  166. package/docs/hi/intlayer_with_nextjs_14.md +1 -28
  167. package/docs/hi/intlayer_with_nextjs_15.md +1 -33
  168. package/docs/hi/intlayer_with_react_router_v7_fs_routes.md +40 -83
  169. package/docs/hi/intlayer_with_solid_start.md +1077 -0
  170. package/docs/hi/intlayer_with_vite+preact.md +56 -49
  171. package/docs/hi/intlayer_with_vite+react.md +48 -41
  172. package/docs/hi/intlayer_with_vite+solid.md +32 -41
  173. package/docs/hi/intlayer_with_vite+vue.md +49 -44
  174. package/docs/hi/packages/intlayer/getLocalizedUrl.md +26 -24
  175. package/docs/hi/packages/intlayer/getMultilingualUrls.md +4 -18
  176. package/docs/hi/packages/next-intlayer/t.md +33 -1
  177. package/docs/hi/packages/react-intlayer/useDictionary.md +4 -21
  178. package/docs/hi/packages/vite-intlayer/exports.md +15 -0
  179. package/docs/hi/packages/vite-intlayer/intlayer.md +121 -6
  180. package/docs/hi/packages/vite-intlayer/intlayerPrune.md +78 -5
  181. package/docs/hi/plugins/sync-json.md +9 -9
  182. package/docs/hi/releases/v9.md +0 -15
  183. package/docs/hi/self_hosting.md +38 -51
  184. package/docs/id/analytics.md +223 -0
  185. package/docs/id/configuration.md +25 -8
  186. package/docs/id/dictionary/nesting.md +37 -184
  187. package/docs/id/formatters.md +208 -305
  188. package/docs/id/intlayer_CMS.md +164 -0
  189. package/docs/id/intlayer_with_angular_21.md +9 -9
  190. package/docs/id/intlayer_with_nextjs_14.md +1 -26
  191. package/docs/id/intlayer_with_react_router_v7_fs_routes.md +70 -63
  192. package/docs/id/intlayer_with_solid_start.md +1078 -0
  193. package/docs/id/packages/intlayer/getMultilingualUrls.md +4 -18
  194. package/docs/id/packages/react-intlayer/useIntlayer.md +2 -2
  195. package/docs/id/packages/vite-intlayer/exports.md +15 -0
  196. package/docs/id/packages/vite-intlayer/intlayer.md +121 -6
  197. package/docs/id/packages/vite-intlayer/intlayerPrune.md +78 -5
  198. package/docs/id/releases/v9.md +12 -0
  199. package/docs/id/self_hosting.md +61 -50
  200. package/docs/it/analytics.md +222 -0
  201. package/docs/it/autoFill.md +27 -8
  202. package/docs/it/configuration.md +25 -8
  203. package/docs/it/dictionary/file.md +3 -1
  204. package/docs/it/dictionary/nesting.md +47 -30
  205. package/docs/it/formatters.md +114 -168
  206. package/docs/it/intlayer_CMS.md +66 -15
  207. package/docs/it/intlayer_with_angular_21.md +9 -9
  208. package/docs/it/intlayer_with_nestjs.md +11 -7
  209. package/docs/it/intlayer_with_nextjs_14.md +1 -28
  210. package/docs/it/intlayer_with_nextjs_15.md +1 -33
  211. package/docs/it/intlayer_with_solid_start.md +1078 -0
  212. package/docs/it/intlayer_with_vite+vue.md +1 -3
  213. package/docs/it/packages/intlayer/getLocalizedUrl.md +34 -26
  214. package/docs/it/packages/intlayer/getMultilingualUrls.md +4 -18
  215. package/docs/it/packages/react-intlayer/useDictionary.md +4 -21
  216. package/docs/it/packages/vite-intlayer/exports.md +15 -0
  217. package/docs/it/packages/vite-intlayer/intlayer.md +121 -6
  218. package/docs/it/packages/vite-intlayer/intlayerPrune.md +77 -4
  219. package/docs/it/releases/v9.md +0 -15
  220. package/docs/it/self_hosting.md +60 -49
  221. package/docs/ja/analytics.md +222 -0
  222. package/docs/ja/autoFill.md +28 -9
  223. package/docs/ja/configuration.md +25 -8
  224. package/docs/ja/dictionary/content_file.md +15 -7
  225. package/docs/ja/dictionary/file.md +3 -1
  226. package/docs/ja/dictionary/nesting.md +47 -30
  227. package/docs/ja/formatters.md +133 -187
  228. package/docs/ja/intlayer_visual_editor.md +3 -1
  229. package/docs/ja/intlayer_with_angular_21.md +6 -6
  230. package/docs/ja/intlayer_with_nestjs.md +2 -12
  231. package/docs/ja/intlayer_with_nextjs_14.md +1 -28
  232. package/docs/ja/intlayer_with_nextjs_15.md +1 -33
  233. package/docs/ja/intlayer_with_react_router_v7.md +456 -20
  234. package/docs/ja/intlayer_with_solid_start.md +1078 -0
  235. package/docs/ja/intlayer_with_vite+preact.md +73 -41
  236. package/docs/ja/intlayer_with_vite+vue.md +1 -3
  237. package/docs/ja/mcp_server.md +3 -9
  238. package/docs/ja/packages/intlayer/getLocalizedUrl.md +26 -24
  239. package/docs/ja/packages/intlayer/getMultilingualUrls.md +3 -17
  240. package/docs/ja/packages/vite-intlayer/exports.md +15 -0
  241. package/docs/ja/packages/vite-intlayer/intlayer.md +121 -6
  242. package/docs/ja/packages/vite-intlayer/intlayerPrune.md +79 -6
  243. package/docs/ja/releases/v9.md +12 -0
  244. package/docs/ja/self_hosting.md +46 -50
  245. package/docs/ko/analytics.md +222 -0
  246. package/docs/ko/autoFill.md +28 -9
  247. package/docs/ko/configuration.md +25 -8
  248. package/docs/ko/dictionary/file.md +3 -1
  249. package/docs/ko/dictionary/nesting.md +47 -30
  250. package/docs/ko/formatters.md +133 -187
  251. package/docs/ko/intlayer_with_angular_21.md +9 -9
  252. package/docs/ko/intlayer_with_lynx+react.md +133 -39
  253. package/docs/ko/intlayer_with_nextjs_14.md +1 -28
  254. package/docs/ko/intlayer_with_nextjs_15.md +1 -33
  255. package/docs/ko/intlayer_with_react_router_v7_fs_routes.md +40 -188
  256. package/docs/ko/intlayer_with_solid_start.md +1078 -0
  257. package/docs/ko/intlayer_with_vite+preact.md +57 -23
  258. package/docs/ko/intlayer_with_vite+vue.md +1 -3
  259. package/docs/ko/packages/intlayer/getLocalizedUrl.md +26 -24
  260. package/docs/ko/packages/intlayer/getMultilingualUrls.md +4 -18
  261. package/docs/ko/packages/vite-intlayer/exports.md +15 -0
  262. package/docs/ko/packages/vite-intlayer/intlayer.md +121 -6
  263. package/docs/ko/packages/vite-intlayer/intlayerPrune.md +79 -6
  264. package/docs/ko/releases/v9.md +12 -0
  265. package/docs/ko/self_hosting.md +60 -49
  266. package/docs/nl/configuration.md +25 -8
  267. package/docs/nl/intlayer_with_angular_21.md +9 -9
  268. package/docs/pl/analytics.md +220 -0
  269. package/docs/pl/configuration.md +25 -8
  270. package/docs/pl/dictionary/nesting.md +47 -30
  271. package/docs/pl/formatters.md +208 -305
  272. package/docs/pl/intlayer_CMS.md +152 -0
  273. package/docs/pl/intlayer_with_angular_21.md +9 -9
  274. package/docs/pl/intlayer_with_nextjs_14.md +1 -26
  275. package/docs/pl/intlayer_with_solid_start.md +1078 -0
  276. package/docs/pl/packages/intlayer/getMultilingualUrls.md +4 -18
  277. package/docs/pl/packages/react-intlayer/useDictionary.md +2 -19
  278. package/docs/pl/packages/vite-intlayer/exports.md +15 -0
  279. package/docs/pl/packages/vite-intlayer/intlayer.md +121 -6
  280. package/docs/pl/packages/vite-intlayer/intlayerPrune.md +77 -4
  281. package/docs/pl/releases/v9.md +0 -15
  282. package/docs/pl/self_hosting.md +60 -49
  283. package/docs/pt/analytics.md +222 -0
  284. package/docs/pt/configuration.md +25 -8
  285. package/docs/pt/dictionary/file.md +3 -1
  286. package/docs/pt/dictionary/nesting.md +47 -30
  287. package/docs/pt/formatters.md +112 -168
  288. package/docs/pt/intlayer_CMS.md +66 -15
  289. package/docs/pt/intlayer_with_angular_21.md +9 -9
  290. package/docs/pt/intlayer_with_astro_lit.md +26 -1
  291. package/docs/pt/intlayer_with_nextjs_14.md +1 -28
  292. package/docs/pt/intlayer_with_nextjs_15.md +1 -33
  293. package/docs/pt/intlayer_with_solid_start.md +1078 -0
  294. package/docs/pt/intlayer_with_vite+vue.md +1 -3
  295. package/docs/pt/packages/intlayer/getLocalizedUrl.md +34 -26
  296. package/docs/pt/packages/intlayer/getMultilingualUrls.md +4 -18
  297. package/docs/pt/packages/vite-intlayer/exports.md +15 -0
  298. package/docs/pt/packages/vite-intlayer/intlayer.md +121 -6
  299. package/docs/pt/packages/vite-intlayer/intlayerPrune.md +78 -6
  300. package/docs/pt/releases/v9.md +0 -15
  301. package/docs/pt/self_hosting.md +60 -49
  302. package/docs/ru/analytics.md +222 -0
  303. package/docs/ru/autoFill.md +27 -8
  304. package/docs/ru/configuration.md +25 -8
  305. package/docs/ru/dictionary/file.md +3 -1
  306. package/docs/ru/dictionary/nesting.md +64 -205
  307. package/docs/ru/formatters.md +108 -128
  308. package/docs/ru/intlayer_with_angular_21.md +9 -9
  309. package/docs/ru/intlayer_with_nextjs_14.md +1 -28
  310. package/docs/ru/intlayer_with_nextjs_15.md +1 -33
  311. package/docs/ru/intlayer_with_solid_start.md +1078 -0
  312. package/docs/ru/intlayer_with_vite+vue.md +1 -3
  313. package/docs/ru/packages/intlayer/getLocalizedUrl.md +34 -26
  314. package/docs/ru/packages/intlayer/getMultilingualUrls.md +4 -18
  315. package/docs/ru/packages/react-intlayer/useDictionary.md +4 -21
  316. package/docs/ru/packages/vite-intlayer/exports.md +15 -0
  317. package/docs/ru/packages/vite-intlayer/intlayer.md +121 -6
  318. package/docs/ru/packages/vite-intlayer/intlayerPrune.md +77 -4
  319. package/docs/ru/releases/v9.md +0 -15
  320. package/docs/ru/self_hosting.md +60 -49
  321. package/docs/tr/analytics.md +222 -0
  322. package/docs/tr/autoFill.md +28 -9
  323. package/docs/tr/configuration.md +25 -8
  324. package/docs/tr/dictionary/file.md +2 -0
  325. package/docs/tr/dictionary/nesting.md +47 -30
  326. package/docs/tr/formatters.md +144 -190
  327. package/docs/tr/intlayer_CMS.md +152 -0
  328. package/docs/tr/intlayer_with_angular_21.md +9 -9
  329. package/docs/tr/intlayer_with_nestjs.md +2 -12
  330. package/docs/tr/intlayer_with_nextjs_15.md +1 -33
  331. package/docs/tr/intlayer_with_solid_start.md +1078 -0
  332. package/docs/tr/intlayer_with_vite+vue.md +1 -3
  333. package/docs/tr/packages/intlayer/getMultilingualUrls.md +4 -18
  334. package/docs/tr/packages/vite-intlayer/exports.md +15 -0
  335. package/docs/tr/packages/vite-intlayer/intlayer.md +121 -6
  336. package/docs/tr/packages/vite-intlayer/intlayerPrune.md +77 -4
  337. package/docs/tr/self_hosting.md +47 -50
  338. package/docs/uk/analytics.md +222 -0
  339. package/docs/uk/configuration.md +25 -8
  340. package/docs/uk/dictionary/nesting.md +47 -30
  341. package/docs/uk/formatters.md +128 -185
  342. package/docs/uk/intlayer_CMS.md +152 -0
  343. package/docs/uk/intlayer_with_angular_21.md +9 -9
  344. package/docs/uk/intlayer_with_nextjs_14.md +1 -26
  345. package/docs/uk/intlayer_with_solid_start.md +1078 -0
  346. package/docs/uk/packages/react-intlayer/useDictionary.md +2 -19
  347. package/docs/uk/packages/vite-intlayer/exports.md +15 -0
  348. package/docs/uk/packages/vite-intlayer/intlayer.md +121 -6
  349. package/docs/uk/packages/vite-intlayer/intlayerPrune.md +77 -4
  350. package/docs/uk/releases/v9.md +0 -15
  351. package/docs/uk/self_hosting.md +60 -50
  352. package/docs/ur/configuration.md +25 -8
  353. package/docs/ur/intlayer_with_angular_21.md +9 -9
  354. package/docs/vi/analytics.md +222 -0
  355. package/docs/vi/configuration.md +24 -8
  356. package/docs/vi/dictionary/nesting.md +37 -184
  357. package/docs/vi/formatters.md +208 -309
  358. package/docs/vi/intlayer_CMS.md +164 -0
  359. package/docs/vi/intlayer_with_angular_21.md +9 -9
  360. package/docs/vi/intlayer_with_nextjs_14.md +0 -25
  361. package/docs/vi/intlayer_with_react_router_v7_fs_routes.md +70 -63
  362. package/docs/vi/intlayer_with_solid_start.md +1078 -0
  363. package/docs/vi/packages/intlayer/getMultilingualUrls.md +4 -18
  364. package/docs/vi/packages/react-intlayer/useIntlayer.md +2 -2
  365. package/docs/vi/packages/vite-intlayer/exports.md +15 -0
  366. package/docs/vi/packages/vite-intlayer/intlayer.md +121 -6
  367. package/docs/vi/packages/vite-intlayer/intlayerPrune.md +77 -4
  368. package/docs/vi/plugins/sync-json.md +6 -6
  369. package/docs/vi/releases/v9.md +12 -0
  370. package/docs/vi/self_hosting.md +61 -50
  371. package/docs/zh/CI_CD.md +4 -0
  372. package/docs/zh/analytics.md +222 -0
  373. package/docs/zh/autoFill.md +28 -9
  374. package/docs/zh/configuration.md +24 -8
  375. package/docs/zh/dictionary/file.md +2 -0
  376. package/docs/zh/dictionary/nesting.md +47 -30
  377. package/docs/zh/formatters.md +140 -188
  378. package/docs/zh/intlayer_CMS.md +164 -0
  379. package/docs/zh/intlayer_with_analog.md +193 -3
  380. package/docs/zh/intlayer_with_angular_19.md +272 -3
  381. package/docs/zh/intlayer_with_angular_21.md +7 -7
  382. package/docs/zh/intlayer_with_create_react_app.md +348 -26
  383. package/docs/zh/intlayer_with_lynx+react.md +263 -4
  384. package/docs/zh/intlayer_with_nextjs_14.md +1 -28
  385. package/docs/zh/intlayer_with_nextjs_15.md +1 -33
  386. package/docs/zh/intlayer_with_nextjs_no_locale_path.md +558 -1
  387. package/docs/zh/intlayer_with_nuxt.md +182 -7
  388. package/docs/zh/intlayer_with_react_router_v7.md +183 -25
  389. package/docs/zh/intlayer_with_react_router_v7_fs_routes.md +306 -42
  390. package/docs/zh/intlayer_with_solid_start.md +1077 -0
  391. package/docs/zh/intlayer_with_storybook.md +260 -3
  392. package/docs/zh/intlayer_with_svelte_kit.md +428 -48
  393. package/docs/zh/intlayer_with_tanstack+solid.md +713 -13
  394. package/docs/zh/intlayer_with_tanstack.md +731 -20
  395. package/docs/zh/intlayer_with_vanilla.md +314 -4
  396. package/docs/zh/intlayer_with_vite+lit.md +465 -4
  397. package/docs/zh/intlayer_with_vite+preact.md +422 -116
  398. package/docs/zh/intlayer_with_vite+react.md +324 -45
  399. package/docs/zh/intlayer_with_vite+react_compiler.md +228 -13
  400. package/docs/zh/intlayer_with_vite+solid.md +462 -32
  401. package/docs/zh/intlayer_with_vite+vanilla.md +497 -4
  402. package/docs/zh/mcp_server.md +3 -9
  403. package/docs/zh/packages/intlayer/getLocalizedUrl.md +26 -24
  404. package/docs/zh/packages/intlayer/getMultilingualUrls.md +4 -18
  405. package/docs/zh/packages/vite-intlayer/exports.md +29 -0
  406. package/docs/zh/packages/vite-intlayer/intlayer.md +121 -6
  407. package/docs/zh/packages/vite-intlayer/intlayerPrune.md +79 -6
  408. package/docs/zh/releases/v9.md +12 -0
  409. package/docs/zh/self_hosting.md +60 -50
  410. package/docs/zh-TW/intlayer_with_angular_21.md +7 -7
  411. package/package.json +6 -6
  412. package/src/generated/blog.entry.ts +27 -27
  413. package/src/generated/docs.entry.ts +234 -214
  414. package/src/generated/frequentQuestions.entry.ts +17 -17
  415. package/src/generated/legal.entry.ts +2 -2
@@ -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, карта сайту та переклад за допомогою ШІ."
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 із **серверним рендерингом (SSR)**: виявлення локалі відбувається під час запиту, сторінки рендеряться на сервері відповідною мовою, а сигнали `<html lang>`, `hreflang` та карти сайту, необхідні пошуковим системам, формуються на боці сервера.
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)** та **[навички агента](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
+ Більше ніж просто рішення i18n, Intlayer надає **[візуальний редактор](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 → Англійська (локаль за замовчуванням)
195
+ /fr /fr/about → Французька
196
+ /es /es/about → Іспанська
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 усередині застосунку. Він також надає псевдоніми (aliases), які оптимізують продуктивність.
219
+
220
+ ### Маршрутизація локалей поставляється разом із плагіном
221
+
222
+ SolidStart працює на [Nitro](https://nitro.build), і `intlayer()` реєструє свій обробник маршрутизації локалей безпосередньо в конвеєрі сервера Nitro (через опцію `routing.enableProxy`, за замовчуванням `true`). Більше нічого підключати не потрібно: на зібраному сервері кожен запит перевіряється до того, як він досягне маршрутизатора, і
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 ← макет, який перевіряє сегмент
314
+ [[locale]]/
315
+ index.tsx → / та /fr та /es
316
+ about.tsx → /about та /fr/about та /es/about
317
+ [...404].tsx → загальний файл для всього іншого
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` | Французька сторінка "Про нас" | Французька сторінка "Про нас" |
342
+ | `/about` | Сторінка "Про нас" (статичний сегмент перемагає) | Сторінка "Про нас" |
343
+ | `/unknown` | **Головна сторінка**, тихо, з `locale=unknown` | Немає збігу → переходить до загального 404 |
344
+
345
+ > Віддавайте перевагу `[locale]` (обов'язковий) замість `[[locale]]`, якщо ви використовуєте режим маршрутизації `'prefix-all'`, і повністю вилучіть сегмент для `'no-prefix'` або `'search-params'`.
346
+
347
+ </Step>
348
+
349
+ <Step number={6} title="Передайте локаль у свій застосунок">
350
+
351
+ URL-адреса є єдиним джерелом правди для локалі: middleware вже перенаправив запит на локалізований шлях, тому зчитування шляху в кореневому макеті зберігає узгодженість серверного рендерингу та гідратації на боці клієнта і робить так, що кожна навігація на боці клієнта оновлює локаль автоматично.
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`, тому передачі виклику аксесора `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
+ Рендеріть перемикач як **справжні посилання (anchors)** замість `<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` є **аксесором сигналу**. Використовуйте `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 route) у корені `src/routes` перехоплює кожен шлях, який не збігся із сегментом локалі — включаючи недійсні префікси локалей, відхилені `matchFilters`. Оскільки локаль усе ще надходить з URL через кореневий макет, сторінка 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
+ Генератор карти сайту 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]]`. Карта сайту вже містить кожну локаль.
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 використовує розширення модулів (module 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` — Французька сторінка "Про нас" |
1026
+ | `GET /en/about` | `302` → `/about` (канонічне перенаправлення) |
1027
+ | `GET /xx` | `404` |
1028
+ | `GET /fr/nonexistent` | `404` французькою мовою |
1029
+ | `GET /sitemap.xml` | `200` — багатомовна карта сайту XML |
1030
+
1031
+ Рядки, які рендерять сторінку, поводяться ідентично під `vite dev`. Три рядки перенаправлення застосовуються лише до зібраного сервера, якщо ви не зареєструєте обробник як middleware самостійно — дивіться крок 3.
1032
+
1033
+ > Запускайте сервер розробки на Node (`vite dev`), а не на Bun (`bun --bun vite dev`): SSR у SolidStart наразі не працює під середовищем виконання Bun із помилкою `Expected a Response object, but received 'NodeResponse'`. Це не пов'язано з Intlayer — це відтворюється на звичайному шаблоні — і впливає лише на сервер розробки, а не на `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
+ - **Вбудований (inline) перегляд** перекладеного контенту.
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)