@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 - Kompletny przewodnik po tłumaczeniu swojej aplikacji"
5
+ description: "Koniec z i18next. Przewodnik 2026 do budowania wielojęzycznej (i18n) aplikacji SolidStart. Server-rendered routing lokalizacji, hreflang, mapa strony i tłumaczenie wspomagane przez AI."
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
+ # Przetłumacz swoją stronę SolidStart za pomocą Intlayer | Internacjonalizacja (i18n)
29
+
30
+ <Tabs defaultTab="video">
31
+ <Tab label="Wideo" value="video">
32
+
33
+ <iframe title="Najlepsze rozwiązanie i18n dla Vite i Solid? Odkryj 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="Kod" 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="Demo CodeSandbox - Jak umiędzynarodowić swoją aplikację za pomocą 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
+ ## Spis treści
50
+
51
+ <TOC/>
52
+
53
+ Ten przewodnik dotyczy aplikacji SolidStart **renderowanej po stronie serwera (SSR)**: detekcja lokalizacji odbywa się podczas żądania, strony są renderowane na serwerze w odpowiednim języku, a sygnały `<html lang>`, `hreflang` oraz mapy strony wymagane przez wyszukiwarki są generowane po stronie serwera.
54
+
55
+ ## Dlaczego Intlayer zamiast alternatyw?
56
+
57
+ W porównaniu z głównymi rozwiązaniami, takimi jak `@solid-primitives/i18n` czy `i18next`, Intlayer jest rozwiązaniem wyposażonym w zintegrowane optymalizacje, takie jak:
58
+
59
+ <AccordionGroup>
60
+
61
+ <Accordion header="Pełne wsparcie dla Solid">
62
+
63
+ Intlayer jest zoptymalizowany do idealnej współpracy z Solid, oferując **zakresowanie treści na poziomie komponentów**, **reaktywne tłumaczenia** i wszystkie funkcje potrzebne do skalowania internacjonalizacji (i18n).
64
+
65
+ </Accordion>
66
+
67
+ <Accordion header="Rozmiar paczki (bundle)">
68
+
69
+ Zamiast ładować ogromne pliki JSON do swoich stron, ładuj tylko niezbędną treść. Intlayer pomaga **zmniejszyć rozmiar paczki i stron nawet o 50%**.
70
+
71
+ </Accordion>
72
+
73
+ <Accordion header="Łatwość utrzymania">
74
+
75
+ Zakresowanie treści aplikacji **ułatwia utrzymanie** w przypadku aplikacji o dużej skali. Możesz powielić lub usunąć pojedynczy folder funkcji bez obciążenia psychicznego wynikającego z przeglądania całej bazy kodowej treści. Ponadto Intlayer jest **w pełni typowany**, aby zapewnić dokładność treści.
76
+
77
+ </Accordion>
78
+
79
+ <Accordion header="Agent AI">
80
+
81
+ Wspólna lokalizacja treści **zmniejsza kontekst wymagany** przez duże modele językowe (LLM). Intlayer zawiera również zestaw narzędzi, takich jak **CLI** do testowania brakujących tłumaczeń, **[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)** oraz **[umiejętności agenta](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/agent_skills.md)**, aby czynić doświadczenie programistyczne (DX) jeszcze płynniejszym dla agentów AI.
82
+
83
+ </Accordion>
84
+
85
+ <Accordion header="Automatyzacja">
86
+
87
+ Używaj automatyzacji do tłumaczenia w swoim potoku CI/CD za pomocą wybranego LLM po kosztach Twojego dostawcy AI. Intlayer oferuje również **kompilator** do automatyzacji ekstrakcji treści, a także [platformę internetową](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/intlayer_CMS.md) pomagającą **tłumaczyć w tle**.
88
+
89
+ </Accordion>
90
+
91
+ <Accordion header="Wydajność">
92
+
93
+ Łączenie ogromnych plików JSON z komponentami może prowadzić do problemów z wydajnością i reaktywnością. Intlayer optymalizuje ładowanie treści na etapie budowania.
94
+
95
+ </Accordion>
96
+
97
+ <Accordion header="Skalowanie z osobami niebędącymi programistami">
98
+
99
+ Czymś więcej niż tylko rozwiązaniem i18n, Intlayer zapewnia **samodzielnie hostowany [edytor wizualny](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/intlayer_visual_editor.md)** oraz **[pełny CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/intlayer_CMS.md)** pomagający zarządzać wielojęzyczną treścią w **czasie rzeczywistym**, dzięki czemu współpraca z tłumaczami, copywriterami i innymi członkami zespołu jest płynna. Treść może być przechowywana lokalnie i/lub zdalnie.
100
+
101
+ </Accordion>
102
+ </AccordionGroup>
103
+
104
+ ---
105
+
106
+ ## Przewodnik krok po kroku dotyczący konfiguracji Intlayer w aplikacji SolidStart
107
+
108
+ <Steps>
109
+
110
+ <Step number={1} title="Zainstaluj zależności">
111
+
112
+ Zainstaluj niezbędne pakiety za pomocą 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
+ > flaga `--interactive` jest opcjonalna. Użyj `intlayer-cli init`, jeśli jesteś agentem AI.
131
+
132
+ > To polecenie wykryje Twoje środowisko i zainstaluje wymagane pakiety. Na przykład:
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
+ Główny pakiet zapewniający narzędzia internacjonalizacji do zarządzania konfiguracją, tłumaczeń, [deklaracji treści](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/dictionary/content_file.md), transpilacji oraz [poleceń CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/cli/index.md).
153
+
154
+ - **solid-intlayer**
155
+
156
+ Pakiet integrujący Intlayer z aplikacją Solid. Zapewnia dostawców kontekstu i haki (hooki) dla internacjonalizacji Solid.
157
+
158
+ - **vite-intlayer**
159
+
160
+ Zawiera wtyczkę Vite do integracji Intlayer z [bundlerem Vite](https://vite.dev/guide/why.html#why-bundle-for-production), a także obsługę routingu lokalizacji, która wykrywa preferowaną lokalizację użytkownika, zarządza plikami cookie i obsługuje przekierowania URL.
161
+
162
+ > `vite-intlayer` jest tutaj kwestią po stronie serwera, a nie tylko etapu budowania: dostarcza procedurę obsługi żądań uruchamianą przez serwer Nitro w SolidStart. Przechowywanie go w `dependencies` jest bezpiecznym domyślnym rozwiązaniem — możesz przenieść go do `devDependencies` tylko wtedy, gdy wdrażasz zbudowany katalog `.output`, w którym Nitro osadza tę procedurę.
163
+
164
+ </Step>
165
+
166
+ <Step number={2} title="Konfiguracja Twojego projektu">
167
+
168
+ Utwórz plik konfiguracyjny, aby skonfigurować języki Twojej aplikacji:
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
+ // Twoje inne lokalizacje
180
+ ],
181
+ defaultLocale: Locales.ENGLISH,
182
+ },
183
+ routing: {
184
+ mode: "prefix-no-default",
185
+ },
186
+ };
187
+
188
+ export default config;
189
+ ```
190
+
191
+ W przypadku `prefix-no-default` domyślna lokalizacja jest serwowana z adresów URL bez przedrostka:
192
+
193
+ ```plaintext
194
+ / /about → Angielski (domyślna lokalizacja)
195
+ /fr /fr/about → Francuski
196
+ /es /es/about → Hiszpański
197
+ ```
198
+
199
+ > Za pomocą tego pliku konfiguracyjnego możesz skonfigurować zlokalizowane adresy URL, przekierowania middleware, nazwy plików cookie, lokalizację i rozszerzenie deklaracji treści, wyłączyć logi Intlayer w konsoli i wiele więcej. Pełną listę dostępnych parametrów znajdziesz w [dokumentacji konfiguracji](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/configuration.md).
200
+
201
+ </Step>
202
+
203
+ <Step number={3} title="Zintegruj Intlayer w konfiguracji Vite">
204
+
205
+ Dodaj wtyczkę Intlayer do swojej konfiguracji:
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
+ > Wtyczka Vite `intlayer()` buduje pliki deklaracji treści, obserwuje je w trybie deweloperskim i definiuje zmienne środowiskowe Intlayer wewnątrz aplikacji. Zapewnia również aliasy optymalizujące wydajność.
219
+
220
+ ### Routing lokalizacji jest dostarczany z wtyczką
221
+
222
+ SolidStart działa na [Nitro](https://nitro.build), a `intlayer()` rejestruje swoją procedurę obsługi routingu lokalizacji bezpośrednio w potoku serwera Nitro (poprzez opcję `routing.enableProxy`, domyślnie `true`). Nic więcej nie trzeba podłączać: na zbudowanym serwerze każde żądanie jest sprawdzane, zanim dotrze do routera, oraz:
223
+
224
+ - lokalizacja jest odczytywana z przedrostka URL, następnie z pliku cookie `INTLAYER_LOCALE`, a potem z nagłówka `Accept-Language`;
225
+ - adres URL bez przedrostka jest przekierowywany do swojego zlokalizowanego odpowiednika, gdy rozstrzygnięta lokalizacja nie jest domyślną (`/` → `/fr`);
226
+ - nadmiarowo zlokalizowany adres URL jest przekierowywany z powrotem do swojej kanonicznej formy (`/en/about` → `/about`);
227
+ - plik cookie lokalizacji jest zapisywany z powrotem w odpowiedzi.
228
+
229
+ </Step>
230
+
231
+ <Step number={4} title="Zadeklaruj swoją treść">
232
+
233
+ Utwórz i zarządzaj deklaracjami treści, aby przechowywać tłumaczenia:
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
+ > ⚠️ **Haczyk specyficzny dla SolidStart**: każdy plik `.ts` / `.tsx` w `src/routes` staje się ścieżką (route), a plik `.content.ts` posiada domyślny eksport, więc zostałby wyłapany jako strona. Przechowuj deklaracje treści swoich **stron** poza katalogiem routes (`src/contents/` działa dobrze). Treść **komponentów** może pozostać w tej samej lokalizacji, ponieważ `src/components` nie jest skanowany przez router oparty na systemie plików.
298
+
299
+ > Deklaracje treści można definiować w dowolnym miejscu aplikacji, o ile są zawarte w katalogu `contentDir` (domyślnie `./src`) i pasują do rozszerzenia pliku deklaracji treści (domyślnie `.content.{json,ts,tsx,js,jsx,mjs,cjs,md,mdx,yaml,yml}`).
300
+ >
301
+ > Aby uzyskać więcej szczegółów, zapoznaj się z [dokumentacją deklaracji treści](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/dictionary/content_file.md).
302
+
303
+ </Step>
304
+
305
+ <Step number={5} title="Dodaj zlokalizowany routing">
306
+
307
+ Celem tego kroku jest nadanie każdemu językowi własnego adresu URL, co jest indeksowane przez wyszukiwarki.
308
+
309
+ Przenieś swoje strony pod **opcjonalny dynamiczny segment**. W routerze opartym na systemie plików SolidStart `[[locale]]` kompiluje się do wzorca ścieżki `:locale?`:
310
+
311
+ ```plaintext
312
+ src/routes/
313
+ [[locale]].tsx ← układ (layout), który weryfikuje segment
314
+ [[locale]]/
315
+ index.tsx → / oraz /fr oraz /es
316
+ about.tsx → /about oraz /fr/about oraz /es/about
317
+ [...404].tsx → zbiorczy plik dla wszystkiego innego
318
+ ```
319
+
320
+ Jedynym zadaniem pliku układu (layout) jest ograniczenie segmentu do skonfigurowanej lokalizacji:
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` rozwija `:locale?` do dwóch wzorców — jednego z segmentem i jednego bez — i próbuje ich według malejącej szczegółowości. `matchFilters` to różnica między działającą konfiguracją a mylącą:
338
+
339
+ | Adres URL | Bez `matchFilters` | Z `matchFilters` |
340
+ | ----------- | ----------------------------------------------- | ----------------------------------------------------- |
341
+ | `/fr/about` | Strona o nas po francusku | Strona o nas po francusku |
342
+ | `/about` | Strona o nas (statyczny segment wygrywa) | Strona o nas |
343
+ | `/unknown` | **Strona główna**, po cichu, z `locale=unknown` | Brak dopasowania → przechodzi do zbiorczej strony 404 |
344
+
345
+ > Preferuj `[locale]` (wymagane) zamiast `[[locale]]`, jeśli używasz trybu routingu `'prefix-all'`, i całkowicie pomiń segment dla `'no-prefix'` lub `'search-params'`.
346
+
347
+ </Step>
348
+
349
+ <Step number={6} title="Dostarcz lokalizację do swojej aplikacji">
350
+
351
+ Adres URL jest jedynym źródłem prawdy dla lokalizacji: middleware przekierował już żądanie do zlokalizowanej ścieżki, więc odczytanie ścieżki w układzie głównym (root layout) utrzymuje zgodność renderowania po stronie serwera i hydracji po stronie klienta, oraz powoduje, że każda nawigacja po stronie klienta aktualizuje lokalizację automatycznie.
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
+ // Serwer renderuje <html> w entry-server.tsx; nawigacja po stronie klienta
369
+ // między lokalizacjami musi samodzielnie aktualizować atrybuty.
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` reaguje na swój rekwizyt (prop) `locale`, więc przekazanie wywołania akcesora `locale()` wewnątrz JSX wystarczy — Solid kompiluje je do gettera, a całe drzewo renderuje się ponownie w nowym języku, gdy zmienia się URL.
397
+
398
+ </Step>
399
+
400
+ <Step number={7} title="Ustaw atrybuty lang i dir w elemencie HTML po stronie serwera">
401
+
402
+ Element `<html>` jest renderowany przez `entry-server.tsx`, poza `Router`. Zamiast tego odczytaj lokalizację z adresu URL żądania:
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
+ Roboty indeksujące otrzymują teraz właściwy język od pierwszego bajtu:
439
+
440
+ ```html
441
+ <html dir="ltr" lang="fr"></html>
442
+ ```
443
+
444
+ </Step>
445
+
446
+ <Step number={8} title="Wykorzystaj Intlayer w swoich stronach">
447
+
448
+ Uzyskaj dostęp do słowników treści w całej aplikacji:
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
+ > W Solid `useIntlayer` zwraca reaktywną treść (np. `content`). Możesz uzyskać dostęp do jej właściwości bezpośrednio.
471
+
472
+ > Jeśli chcesz użyć treści w atrybucie typu `string`, takim jak `alt`, `title`, `href`, `aria-label` itp., możesz użyć wartości funkcji, na przykład:
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
+ > Aby dowiedzieć się więcej o haku `useIntlayer`, zapoznaj się z [dokumentacją](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/packages/solid-intlayer/useIntlayer.md).
481
+
482
+ Węzły treści nie ograniczają się do zwykłych tłumaczeń. Na przykład licznik z liczbą mnogą:
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()` wybiera kategorię za pomocą `Intl.PluralRules` dla aktywnej lokalizacji, dzięki czemu języki z więcej niż dwoma formami liczby mnogiej działają bez dodatkowego kodu.
525
+
526
+ </Step>
527
+
528
+ <Step number={9} title="Utwórz komponent Zlokalizowany Link">
529
+
530
+ Utwórz niestandardowy komponent `Link`, który automatycznie dodaje przedrostek aktualnego języka do wewnętrznych adresów 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
+ Napisanie `href="/about"` raz powoduje teraz wygenerowanie `/about`, `/fr/about` lub `/es/about` w zależności od aktywnej lokalizacji — bez ręcznego dodawania przedrostków w jakimkolwiek miejscu na stronach.
570
+
571
+ </Step>
572
+
573
+ <Step number={10} title="Utwórz komponent Przełącznik Lokalizacji">
574
+
575
+ Renderuj przełącznik jako **prawdziwe odnośniki (anchors)**, a nie `<select>`: każdy język aktualnej strony staje się linkiem możliwym do zindeksowania, który można otworzyć w nowej karcie, czego nie zapewnia kontrolka oparta wyłącznie na JavaScript.
576
+
577
+ `getPathWithoutLocale` usuwa segment lokalizacji z aktualnej ścieżki, a `getLocalizedUrl` odbudowuje ją dla docelowej lokalizacji, dzięki czemu linki podążają za Twoim trybem routingu bez kodowania cokolwiek na sztywno. Nawigacja jest tym, co zmienia wyrenderowaną lokalizację — trasa `[[locale]]` wywodzi ją z adresu URL — podczas gdy `setLocale` utrwala wybór w pliku cookie `INTLAYER_LOCALE`, dzięki czemu późniejsza wizyta na adresie URL bez lokalizacji rozstrzyga się do tego samego języka.
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
+ // Kanoniczna ścieżka (bez lokalizacji) aktualnie wyświetlanej strony
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
+ // Tylko dokładne dopasowanie, aby link domyślnej lokalizacji nie był oznaczony
613
+ // jako aktywny na każdej stronie
614
+ end
615
+ href={getLocalizedUrl(pathWithoutLocale(), localeItem)}
616
+ hreflang={localeItem}
617
+ lang={localeItem}
618
+ onClick={() => setLocale(localeItem)}
619
+ // Gwarantuje, że przycisk „wstecz” w przeglądarce powraca do poprzedniej strony
620
+ replace
621
+ >
622
+ {/* Język we własnej lokalizacji - np. Français */}
623
+ {getLocaleName(localeItem)}
624
+ </A>
625
+ )}
626
+ </For>
627
+ </div>
628
+ </div>
629
+ );
630
+ };
631
+ ```
632
+
633
+ > W Solid `locale` z `useLocale` jest **akcesorem sygnału**. Użyj `locale()` (z nawiasami), aby reaktywnie odczytać jego aktualną wartość.
634
+ >
635
+ > `getLocaleName(localeItem)` renderuje każdy język we własnym języku — `English / Français / Español`. Przekaż drugi argument, aby zamiast tego przetłumaczyć nazwy na aktualnie wyświetlany język: `getLocaleName(localeItem, locale())` daje `English / French / Spanish` po angielsku, `anglais / français / espagnol` po francusku.
636
+ >
637
+ > `<A>` ustawia już `aria-current="page"` na linku pasującym do aktualnego adresu URL, więc nie trzeba nic dodawać. `replace` jest odczytywane z wyrenderowanego atrybutu przez router: zastępuje wpis w historii zamiast dodawać nowy, dzięki czemu przycisk „wstecz” w przeglądarce powraca do strony odwiedzonej przed zmianą, a nie do tej samej strony w poprzednim języku.
638
+ >
639
+ > `dir` i `hreflang` na każdym linku utrzymują prawidłową orientację nazw języków pisanych od prawej do lewej oraz informują technologie wspomagające i roboty indeksujące, na jaki język wskazuje każdy link.
640
+ >
641
+ > Aby dowiedzieć się więcej o haku `useLocale`, zapoznaj się z [dokumentacją](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/packages/solid-intlayer/useLocale.md).
642
+
643
+ </Step>
644
+
645
+ <Step number={11} title="Emituj linki canonical i hreflang" isOptional={true}>
646
+
647
+ Anotacje `hreflang` informują wyszukiwarki, że `/about`, `/fr/about` i `/es/about` to ta sama strona w różnych językach. `getMultilingualUrls` wywodzi je z kanonicznej ścieżki (bez lokalizacji), zgodnie z Twoim trybem routingu, więc nic nie jest zakodowane na sztywno:
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
+ /** Bezawzględny URL renderowanej strony. */
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
+ Wyrenderuj to w nagłówku dokumentu (head), gdzie dostępny jest adres URL żądania:
695
+
696
+ ```tsx fileName="src/entry-server.tsx" codeFormat="typescript"
697
+ import { AlternateLinks } from "~/components/AlternateLinks";
698
+
699
+ // … wewnątrz <head>, obok innych tagów meta:
700
+ <AlternateLinks url={url} />;
701
+ ```
702
+
703
+ `GET /fr/about` serwuje wtedy:
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
+ > **Uwaga dotycząca `@solidjs/meta`**: w momencie pisania tego tekstu, `<Title>` i `<Meta>` z `@solidjs/meta` są stosowane po stronie klienta po hydracji, ale **nie** są emitowane do renderowanego po stronie serwera `<head>` w SolidStart v2. Dopóki nie zostanie to naprawione, renderuj tagi, które roboty indeksujące muszą widzieć bez JavaScript — `canonical`, `hreflang` oraz, jeśli to konieczne, `title` / `description` — bezpośrednio w `entry-server.tsx`, jak pokazano powyżej.
714
+
715
+ </Step>
716
+
717
+ <Step number={12} title="Zarządzaj stronami nieznalezionymi (404)" isOptional={true}>
718
+
719
+ Trasa wieloznaczna (splat route) w korzeniu `src/routes` wyłapuje każdą ścieżkę, do której segment lokalizacji nie pasował — w tym nieprawidłowe przedrostki lokalizacji odrzucone przez `matchFilters`. Ponieważ lokalizacja nadal pochodzi z adresu URL poprzez układ główny, strona 404 jest wyświetlana w języku odwiedzającego:
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
+ | Żądanie | Wynik |
742
+ | ----------------- | ------------------------------------------------ |
743
+ | `/xx` | `404` — `xx` nie jest skonfigurowaną lokalizacją |
744
+ | `/nonexistent` | `404` w domyślnej lokalizacji |
745
+ | `/fr/nonexistent` | `404` po francusku (`Page introuvable`) |
746
+
747
+ </Step>
748
+
749
+ <Step number={13} title="Wygeneruj wielojęzyczną mapę strony (sitemap)" isOptional={true}>
750
+
751
+ Generator mapy strony Intlayer rozwija każdą ścieżkę do jednego wpisu na lokalizację i łączy alternatywy `xhtml:link` między nimi, dzięki czemu trasa musi jedynie wymienić kanoniczne ścieżki bez lokalizacji.
752
+
753
+ > W przeciwieństwie do podstawowych generatorów, które emitują tylko płaskie adresy URL, Intlayer łączy dwukierunkowe linki między wszystkimi zlokalizowanymi wariantami każdej strony, co pomaga wyszukiwarkom powiązać zlokalizowane adresy URL i dostarczać właściwy właściwym odbiorcom.
754
+
755
+ SolidStart zmienia plik eksportujący metodę HTTP w trasę API i usuwa rozszerzenie `.ts` ze ścieżki — więc `src/routes/sitemap.xml.ts` jest serwowane pod adresem `/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
+ > Trasy API nie obsługują parametrów opcjonalnych, więc trzymaj ten plik w korzeniu `src/routes`, poza segmentem `[[locale]]`. Mapa strony zawiera już każdą lokalizację.
797
+
798
+ Możesz zbudować `robots.txt` w ten sam sposób za pomocą `getMultilingualUrls`, tak aby wpisy `Disallow` obejmowały każdy zlokalizowany zapis wrażliwej ścieżki:
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="Pobierz lokalizację w funkcjach serwerowych" isOptional={true}>
825
+
826
+ Możesz chcieć uzyskać dostęp do bieżącej lokalizacji z wnętrza funkcji serwerowej lub trasy API.
827
+
828
+ W konfiguracji opartej na przedrostkach, takiej jak ta, **adres URL jest rozstrzygający**: `getLocaleFromPath` odczytuje przedrostek z adresu URL żądania. `getLocale` jest alternatywą dla żądań, które nie przenoszą przedrostka lokalizacji — sprawdza plik cookie `INTLAYER_LOCALE`, następnie nagłówek `x-intlayer-locale`, a potem negocjuje `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
+ // Pobiera plik cookie z żądania (domyślnie: 'INTLAYER_LOCALE')
844
+ getCookie: (name) =>
845
+ getCookie(name, request?.headers.get("cookie") ?? ""),
846
+ // Pobiera nagłówek z żądania (domyślnie: 'x-intlayer-locale'),
847
+ // przechodząc w razie potrzeby do negocjacji Accept-Language
848
+ getHeader: (name) => request?.headers.get(name) ?? undefined,
849
+ }));
850
+
851
+ // Pobierz część treści poza komponentem za pomocą 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
+ > Nie polegaj tutaj wyłącznie na `getLocale`: plik cookie lokalizacji jest zapisywany dopiero wtedy, gdy odwiedzający aktywnie zmieni język, więc pierwsza wizyta na `/fr/...` rozstrzygnęłaby się do domyślnej lokalizacji.
865
+
866
+ </Step>
867
+
868
+ <Step number={15} title="Wyodrębnij treść swoich komponentów" isOptional={true}>
869
+
870
+ Jeśli masz istniejącą bazę kodu, przekształcanie tysięcy plików może być czasochłonne.
871
+
872
+ Aby ułatwić ten proces, Intlayer proponuje [kompilator](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/compiler.md) / [ekstraktor](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/cli/extract.md) do przekształcania komponentów i ekstrakcji treści.
873
+
874
+ Aby go skonfigurować, możesz dodać sekcję `compiler` w swoim pliku `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
+ // ... Reszta Twojej konfiguracji
881
+ compiler: {
882
+ /**
883
+ * Wskazuje, czy kompilator powinien być włączony.
884
+ */
885
+ enabled: true,
886
+
887
+ /**
888
+ * Definiuje ścieżkę plików wyjściowych
889
+ */
890
+ output: ({ fileName, extension }) => `./${fileName}${extension}`,
891
+
892
+ /**
893
+ * Wskazuje, czy komponenty powinny zostać zapisane po przekształceniu.
894
+ *
895
+ * - Jeśli `true`, kompilator nadpisze plik komponentu na dysku. Przekształcenie będzie więc trwałe, a kompilator pominie przekształcenie przy następnym procesie. W ten sposób kompilator może przekształcić aplikację, a następnie można go usunąć.
896
+ *
897
+ * - Jeśli `false`, kompilator wstrzyknie wywołanie funkcji `useIntlayer()` do kodu tylko w danych wyjściowych budowania i zachowa bazową bazę kodu nienaruszoną. Przekształcenie zostanie wykonane tylko w pamięci.
898
+ */
899
+ saveComponents: false,
900
+
901
+ /**
902
+ * Przedrostek klucza słownika
903
+ */
904
+ dictionaryKeyPrefix: "",
905
+ },
906
+ };
907
+
908
+ export default config;
909
+ ```
910
+
911
+ <Tabs>
912
+ <Tab value='Extract command'>
913
+
914
+ Uruchom ekstraktor, aby przekształcić komponenty i wyodrębnić treść
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
+ > Przenieś wygenerowane pliki treści swoich stron poza `src/routes` po wykonaniu tej czynności, z powodu wyjaśnionego w kroku 5.
933
+
934
+ </Tab>
935
+ <Tab value='Babel compiler'>
936
+
937
+ > Od v9 `intlayerCompiler` jest dołączony do wtyczki `intlayer`. Nie musisz więc dodawać go ręcznie.
938
+
939
+ Zaktualizuj swój `vite.config.ts`, aby dołączyć wtyczkę `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(), // Dodaje wtyczkę kompilatora
953
+ ],
954
+ });
955
+ ```
956
+
957
+ ```bash packageManager="npm"
958
+ npm run build # Lub npm run dev
959
+ ```
960
+
961
+ ```bash packageManager="pnpm"
962
+ pnpm run build # Lub pnpm run dev
963
+ ```
964
+
965
+ ```bash packageManager="yarn"
966
+ yarn build # Lub yarn dev
967
+ ```
968
+
969
+ ```bash packageManager="bun"
970
+ bun run build # Lub bun run dev
971
+ ```
972
+
973
+ </Tab>
974
+ </Tabs>
975
+
976
+ </Step>
977
+
978
+ <Step number={16} title="Skonfiguruj TypeScript">
979
+
980
+ Intlayer używa rozszerzania modułów (module augmentation), aby czerpać korzyści z TypeScript i uczynić bazę kodu silniejszą.
981
+
982
+ Upewnij się, że Twoja konfiguracja TypeScript zawiera automatycznie wygenerowane typy:
983
+
984
+ ```json5 fileName="tsconfig.json"
985
+ {
986
+ compilerOptions: {
987
+ // ... Twoje istniejące konfiguracje
988
+ },
989
+ include: [
990
+ "src",
991
+ "*.ts",
992
+ ".intlayer/**/*.ts", // Dołącz automatycznie wygenerowane typy
993
+ ],
994
+ }
995
+ ```
996
+
997
+ Klucze słownika i ścieżki treści są teraz sprawdzane w czasie kompilacji:
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
+ ## Weryfikacja Twojej konfiguracji
1011
+
1012
+ Zbuduj i uruchom serwer, a następnie sprawdź, czy te żądania zachowują się zgodnie z oczekiwaniami:
1013
+
1014
+ ```bash
1015
+ npm run build
1016
+ node .output/server/index.mjs
1017
+ ```
1018
+
1019
+ | Żądanie | Oczekiwana odpowiedź |
1020
+ | ------------------------------------- | -------------------------------------------- |
1021
+ | `GET /` | `200` — Angielski |
1022
+ | `GET /` z `Accept-Language: fr` | `302` → `/fr` |
1023
+ | `GET /` z cookie `INTLAYER_LOCALE=es` | `302` → `/es` |
1024
+ | `GET /fr` | `200` — Francuski, `<html lang="fr">` |
1025
+ | `GET /fr/about` | `200` — Francuska strona o nas |
1026
+ | `GET /en/about` | `302` → `/about` (kanoniczne przekierowanie) |
1027
+ | `GET /xx` | `404` |
1028
+ | `GET /fr/nonexistent` | `404` po francusku |
1029
+ | `GET /sitemap.xml` | `200` — wielojęzyczna mapa strony XML |
1030
+
1031
+ Wiersze renderujące stronę zachowują się identycznie w trybie `vite dev`. Trzy wiersze z przekierowaniami mają zastosowanie tylko do zbudowanego serwera, chyba że samodzielnie zarejestrujesz procedurę obsługi jako middleware — zobacz krok 3.
1032
+
1033
+ > Uruchamiaj serwer deweloperski w środowisku Node (`vite dev`), a nie w Bun (`bun --bun vite dev`): SSR w SolidStart obecnie nie działa w środowisku uruchomieniowym Bun z błędem `Expected a Response object, but received 'NodeResponse'`. Nie jest to związane z Intlayer — powtarza się to na zwykłym szablonie — i dotyczy tylko serwera deweloperskiego, a nie `vite build`.
1034
+
1035
+ ---
1036
+
1037
+ ## Konfiguracja Git
1038
+
1039
+ Zaleca się ignorowanie plików generowanych przez Intlayer. Pozwala to uniknąć zatwierdzania ich w repozytorium Git.
1040
+
1041
+ Aby to zrobić, możesz dodać następujące instrukcje do pliku `.gitignore`:
1042
+
1043
+ ```plaintext fileName=".gitignore"
1044
+ # Ignoruj pliki generowane przez Intlayer
1045
+ .intlayer
1046
+ ```
1047
+
1048
+ ---
1049
+
1050
+ ## Rozszerzenie VS Code
1051
+
1052
+ Aby poprawić doświadczenie programistyczne z Intlayer, możesz zainstalować oficjalne **Rozszerzenie Intlayer dla VS Code**.
1053
+
1054
+ [Zainstaluj z VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
1055
+
1056
+ To rozszerzenie zapewnia:
1057
+
1058
+ - **Autouzupełnianie** dla kluczy tłumaczeń.
1059
+ - **Wykrywanie błędów w czasie rzeczywistym** dla brakujących tłumaczeń.
1060
+ - **Podgląd wstawny (inline)** przetłumaczonej treści.
1061
+ - **Szybkie akcje** do łatwego tworzenia i aktualizowania tłumaczeń.
1062
+
1063
+ ---
1064
+
1065
+ ## Przejdź dalej
1066
+
1067
+ Aby pójść dalej, możesz zaimplementować [edytor wizualny](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/intlayer_visual_editor.md) lub uzewnętrznić swoją treść za pomocą [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/intlayer_CMS.md).
1068
+
1069
+ ---
1070
+
1071
+ ## Odnośniki do dokumentacji
1072
+
1073
+ - [Dokumentacja Intlayer](https://intlayer.org)
1074
+ - [Dokumentacja SolidStart](https://start.solidjs.com)
1075
+ - [Haczyk useIntlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/packages/solid-intlayer/useIntlayer.md)
1076
+ - [Haczyk useLocale](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/packages/solid-intlayer/useLocale.md)
1077
+ - [Deklaracja treści](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/dictionary/content_file.md)
1078
+ - [Konfiguracja](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/configuration.md)