@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 - الدليل الكامل لترجمة تطبيقك"
5
+ description: "لا مزيد من i18next. دليل 2026 لبناء تطبيق SolidStart متعدد اللغات (i18n). توجيه اللغة المقدم من الخادم، وhreflang، وخريطة الموقع (sitemap)، والترجمة بمساعدة الذكاء الاصطناعي."
6
+ keywords:
7
+ - Internationalization
8
+ - Documentation
9
+ - Intlayer
10
+ - SolidStart
11
+ - Solid
12
+ - i18n
13
+ - TypeScript
14
+ - Locale Routing
15
+ - Sitemap
16
+ slugs:
17
+ - doc
18
+ - environment
19
+ - solid-start
20
+ applicationTemplate: https://github.com/aymericzip/intlayer-solid-start-template
21
+ history:
22
+ - version: 9.1.3
23
+ date: 2025-08-06
24
+ changes: "السجل الأولي"
25
+ author: aymericzip
26
+ ---
27
+
28
+ # ترجم موقع SolidStart الخاص بك باستخدام Intlayer | التدويل (i18n)
29
+
30
+ <Tabs defaultTab="video">
31
+ <Tab label="فيديو" value="video">
32
+
33
+ <iframe title="أفضل حل تدويل لـ 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 **المقدم عبر الخادم (server-rendered)**: يتم اكتشاف اللغة عند الطلب، وتتم ترجمة الصفحات وعرضها على الخادم باللغة الصحيحة، وتصريحات `<html lang>` و `hreflang` وإشارات sitemap التي تحتاجها محركات البحث يتم إصدارها من جانب الخادم.
54
+
55
+ ## لماذا Intlayer بدلاً من الحلول الأخرى؟
56
+
57
+ بالمقارنة مع الحلول الرئيسية مثل `@solid-primitives/i18n` أو `i18next`، فإن Intlayer هو حل يأتي مجهّزًا بتحسينات مدمجة مثل:
58
+
59
+ <AccordionGroup>
60
+
61
+ <Accordion header="تغطية كاملة لـ Solid">
62
+
63
+ تم تحسين Intlayer ليعمل بشكل مثالي مع Solid من خلال تقديم **تقسيم محتوى على مستوى المكونات**، و**ترجمات تفاعلية**، وجميع الميزات المطلوبة لتوسيع التدويل (i18n).
64
+
65
+ </Accordion>
66
+
67
+ <Accordion header="حجم الحزمة (Bundle size)">
68
+
69
+ بدلاً من تحميل ملفات JSON ضخمة في صفحاتك، قم بتشغيل المحتوى الضروري فقط. يساعد Intlayer على **تقليل حجم الحزمة والصفحة بنسبة تصل إلى 50%**.
70
+
71
+ </Accordion>
72
+
73
+ <Accordion header="إمكانية الصيانة">
74
+
75
+ يساعد تقسيم محتوى تطبيقك في نطاقات محددة على **تسهيل الصيانة** للتطبيقات واسعة النطاق. يمكنك نسخ أو حذف مجلد ميزة واحدة دون العبء الذهني لمراجعة قاعدة كود المحتوى بالكامل. بالإضافة إلى ذلك، يتميز Intlayer بـ **أنواع كاملة (fully typed)** لضمان دقة محتواك.
76
+
77
+ </Accordion>
78
+
79
+ <Accordion header="وكيل الذكاء الاصطناعي">
80
+
81
+ يؤدي تجميع المحتوى في نفس المكان إلى **تقليل السياق المطلوب** بواسطة نماذج اللغات الكبيرة (LLMs). يأتي Intlayer أيضًا مع مجموعة من الأدوات، مثل **CLI** للاختبار عن الترجمات المفقودة، و **[LSP](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/lsp.md)**، و **[MCP](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/mcp_server.md)**، و **[agent skills](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/agent_skills.md)**، لجعل تجربة المطور (DX) أكثر سلاسة لوكلاء الذكاء الاصطناعي.
82
+
83
+ </Accordion>
84
+
85
+ <Accordion header="الأتمتة">
86
+
87
+ استخدم الأتمتة للترجمة في خط أنابيب CI/CD الخاص بك باستخدام نموذج اللغة الكبير الذي تختاره بتكلفة مزود الذكاء الاصطناعي الخاص بك. يقدم Intlayer أيضًا **مترجمًا (compiler)** لأتمتة استخراج المحتوى، بالإضافة إلى [منصة ويب](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/intlayer_CMS.md) للمساعدة في **الترجمة في الخلفية**.
88
+
89
+ </Accordion>
90
+
91
+ <Accordion header="الأداء">
92
+
93
+ قد يؤدي ربط ملفات JSON الضخمة بالمكونات إلى مشاكل في الأداء والتفاعلية. يقدم Intlayer تحسينًا لتحميل المحتوى في وقت البناء (build time).
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. توفر مزودي السياق (context providers) والخطاطيف (hooks) لتدويل Solid.
157
+
158
+ - **vite-intlayer**
159
+
160
+ تتضمن ملحق Vite لدمج Intlayer مع [مجمّع Vite](https://vite.dev/guide/why.html#why-bundle-for-production)، بالإضافة إلى معالج توجيه اللغة الذي يكتشف اللغة المفضلة للمستخدم ويدير ملفات الكوكيز ويتعامل مع إعادة توجيه عناوين 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)، وأسماء ملفات تعريف الارتباط (cookies)، وموقع وامتداد إعلانات المحتوى الخاصة بك، وتعطيل سجلات 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` افتراضيًا). لا داعي لتوصيل أي شيء آخر: في الخادم المجمّع، يتم فحص كل طلب قبل وصوله إلى الموجّه (router)، و
223
+
224
+ - تُقرأ اللغة من بادئة URL، ثم من ملف تعريف الارتباط `INTLAYER_LOCALE`، ثم تترويسة `Accept-Language`؛
225
+ - يتم إعادة توجيه URL غير المزود ببادئة إلى نظيره المترجم عندما لا تكون اللغة المحللة هي اللغة الافتراضية (`/` → `/fr`)؛
226
+ - يتم إعادة توجيه URL ذي البادئة المكررة إلى شكله المعياري (`/en/about` → `/about`)؛
227
+ - يتم إعادة كتابة ملف تعريف الارتباط الخاص باللغة في الاستجابة.
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` يحتوي على تصدير افتراضي، لذا سيتم اعتباره صفحة. احتفظ بإعلانات المحتوى لـ **الصفحات** خارج مجلد المسارات (`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
+ المهمة الوحيدة لملف التخطيط هي تقييد الشريحة باللغة المكونة:
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 هو المصدر الوحيد للحقيقة بالنسبة للغة: لقد قام الوسيط بالفعل بإعادة توجيه الطلب إلى مساره المترجم، لذا فإن قراءة المسار في التخطيط الرئيسي تحافظ على توافق العرض من الخادم والتنشيط في العميل (hydration)، وتجعل كل تنقل من جانب العميل يحدّث اللغة تلقائيًا.
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 بتجميعها إلى دالة الحصول (getter)، ويعاد عرض الشجرة بأكملها باللغة الجديدة عند تغيير 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
+ تتلقى الزواحف (crawlers) الآن اللغة الصحيحة في البايت الأول:
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` الخيار في ملف تعريف الارتباط `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` هو **وصول إشارة (signal accessor)**. استخدم `locale()` (مع الأقواس) لقراءة قيمته الحالية بشكل تفاعلي.
634
+ >
635
+ > يعرض `getLocaleName(localeItem)` كل لغة بلغتها الخاصة — `English / Français / Español`. مرر وسيطة ثانية لترجمة الأسماء إلى اللغة المعروضة حاليًا بدلاً من ذلك: `getLocaleName(localeItem, locale())` يعطي `English / French / Spanish` بالإنجليزية، و `anglais / français / espagnol` بالفرنسية.
636
+ >
637
+ > يقوم `<A>` بالفعل بتعيين `aria-current="page"` على الرابط المطبق على URL الحالي، لذا لا يوجد شيء لإضافته في هذا الشأن. تٌقرأ `replace` من التعبير المعروض بواسطة الموجّه: فهي تستبدل مدخل التارخ بدلاً من إضافته، بحيث يعود زر "الرجوع" في المتصفح إلى الصفحة التي زرتها قبل التبديل بدلاً من الذهاب إلى نفس الصفحة باللغة السابقة.
638
+ >
639
+ > تضمن `dir` و `hreflang` في كل رابط التوجيه الصحيح لأسماء اللغات من اليمين إلى اليسار وتخبر التقنيات المساعدة والزواحف باللغة التي يشير إليها كل رابط.
640
+ >
641
+ > لمعرفة المزيد حول خطاف `useLocale`، يُرجى الرجوع إلى [التوثيق](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/packages/solid-intlayer/useLocale.md).
642
+
643
+ </Step>
644
+
645
+ <Step number={11} title="إصدار روابط canonical و hreflang" isOptional={true}>
646
+
647
+ تخبر التوضيحات `hreflang` محركات البحث أن `/about` و `/fr/about` و `/es/about` هي نفس الصفحة بلغات مختلفة. يقوم `getMultilingualUrls` بإنشائها من المسار المعياري (الخالي من اللغة) متبعًا وضع التوجيه الخاص بك، بحيث لا يلزم إدخال أي كود ثابت:
648
+
649
+ ```tsx fileName="src/components/AlternateLinks.tsx" codeFormat="typescript"
650
+ import {
651
+ defaultLocale,
652
+ getMultilingualUrls,
653
+ getPathWithoutLocale,
654
+ } from "intlayer";
655
+ import { type Component, For } from "solid-js";
656
+
657
+ export type AlternateLinksProps = {
658
+ /** عنوان URL المطلق للصفحة التي يتم عرضها. */
659
+ url: string;
660
+ };
661
+
662
+ export const AlternateLinks: Component<AlternateLinksProps> = (props) => {
663
+ const multilingualUrls = () => {
664
+ const { origin, pathname } = new URL(props.url);
665
+
666
+ return Object.entries(
667
+ getMultilingualUrls(`${origin}${getPathWithoutLocale(pathname)}`)
668
+ );
669
+ };
670
+
671
+ const canonicalUrl = () =>
672
+ new URL(props.url).origin + new URL(props.url).pathname;
673
+
674
+ return (
675
+ <>
676
+ <link href={canonicalUrl()} rel="canonical" />
677
+ <For each={multilingualUrls()}>
678
+ {([locale, localizedUrl]) => (
679
+ <link href={localizedUrl} hreflang={locale} rel="alternate" />
680
+ )}
681
+ </For>
682
+ <link
683
+ href={
684
+ multilingualUrls().find(([locale]) => locale === defaultLocale)?.[1]
685
+ }
686
+ hreflang="x-default"
687
+ rel="alternate"
688
+ />
689
+ </>
690
+ );
691
+ };
692
+ ```
693
+
694
+ قم بعرضه في رأس المستند (head)، حيث يكون عنوان URL للطلب متاحًا:
695
+
696
+ ```tsx fileName="src/entry-server.tsx" codeFormat="typescript"
697
+ import { AlternateLinks } from "~/components/AlternateLinks";
698
+
699
+ // … داخل <head>، بجوار وسوم meta الأخرى:
700
+ <AlternateLinks url={url} />;
701
+ ```
702
+
703
+ يقوم `GET /fr/about` بعد ذلك بتقديم:
704
+
705
+ ```html
706
+ <link href="https://example.com/fr/about" rel="canonical" />
707
+ <link href="https://example.com/about" hreflang="en" rel="alternate" />
708
+ <link href="https://example.com/fr/about" hreflang="fr" rel="alternate" />
709
+ <link href="https://example.com/es/about" hreflang="es" rel="alternate" />
710
+ <link href="https://example.com/about" hreflang="x-default" rel="alternate" />
711
+ ```
712
+
713
+ > **ملاحظة حول `@solidjs/meta`**: في وقت كتابة هذا الدليل، يتم تطبيق `<Title>` و `<Meta>` من `@solidjs/meta` على العميل بعد التنشيط ولكن **لا يتم** إرسالها إلى `<head>` المعروض من الخادم في SolidStart v2. حتى يتم إصلاح ذلك في المستقبل، قم بعرض الوسوم التي يجب أن تراها الزواحف بدون JavaScript — `canonical` و `hreflang` وإذا لزم الأمر `title` / `description` — مباشرة في `entry-server.tsx`، كما هو موضح أعلاه.
714
+
715
+ </Step>
716
+
717
+ <Step number={12} title="إدارة صفحات غير الموجودة (404)" isOptional={true}>
718
+
719
+ يلتقط مسار splat في جذر `src/routes` كل مسار لم تطابقه شريحة اللغة — بما في ذلك بادئات اللغة غير الصالحة التي يرفضها `matchFilters`. نظرًا لأن اللغة ما زالت تأتي من URL عبر التخطيط الرئيسي، يتم عرض صفحة 404 بلغة الزائر:
720
+
721
+ ```tsx fileName="src/routes/[...404].tsx" codeFormat="typescript"
722
+ import { Title } from "@solidjs/meta";
723
+ import { HttpStatusCode } from "@solidjs/start";
724
+ import { useIntlayer } from "solid-intlayer";
725
+ import { LocalizedLink } from "~/components/LocalizedLink";
726
+
727
+ export default function NotFound() {
728
+ const content = useIntlayer("not-found-page");
729
+
730
+ return (
731
+ <main>
732
+ <Title>{content.metaTitle.value}</Title>
733
+ <HttpStatusCode code={404} />
734
+ <h1>{content.title}</h1>
735
+ <LocalizedLink href="/">{content.backHome}</LocalizedLink>
736
+ </main>
737
+ );
738
+ }
739
+ ```
740
+
741
+ | الطلب | النتيجة |
742
+ | ----------------- | ------------------------------------ |
743
+ | `/xx` | `404` — `xx` ليست لغة مكونة |
744
+ | `/nonexistent` | `404` باللغة الافتراضية |
745
+ | `/fr/nonexistent` | `404` بالفرنسية (`Page introuvable`) |
746
+
747
+ </Step>
748
+
749
+ <Step number={13} title="إنشاء خريطة موقع (sitemap) متعددة اللغات" isOptional={true}>
750
+
751
+ منشئ sitemap الخاص بـ Intlayer يوسع كل مسار إلى إدخال واحد لكل لغة ويربط بدائل `xhtml:link` بينها، لذلك يتعين على المسار فقط إدراج المسارات المعيارية الخالية من اللغة.
752
+
753
+ > على عكس المنشئات الأساسية التي تصدر فقط عناوين URL مسطحة، يربط Intlayer روابط ثنائية الاتجاه بين كل متغير مترجم لكل صفحة، مما يساعد محركات البحث على ربط عناوين URL المترجمة وتقديم العنوان الصحيح للجمهور المناسب.
754
+
755
+ يحول SolidStart الملف الذي يصدر طريقة HTTP إلى مسار API، ويزيل امتداد `.ts` من المسار — لذلك يتم تقديم `src/routes/sitemap.xml.ts` عند `/sitemap.xml`:
756
+
757
+ ```typescript fileName="src/routes/sitemap.xml.ts" codeFormat={["typescript", "esm", "commonjs"]}
758
+ import type { APIEvent } from "@solidjs/start/server";
759
+ import { generateSitemap } from "intlayer";
760
+
761
+ const SITE_URL = process.env.SITE_URL ?? "http://localhost:3000";
762
+
763
+ export const GET = (_event: APIEvent) => {
764
+ const sitemap = generateSitemap(
765
+ [
766
+ { path: "/", changefreq: "daily", priority: 1.0 },
767
+ { path: "/about", changefreq: "monthly", priority: 0.8 },
768
+ ],
769
+ { siteUrl: SITE_URL }
770
+ );
771
+
772
+ return new Response(sitemap, {
773
+ headers: { "Content-Type": "application/xml" },
774
+ });
775
+ };
776
+ ```
777
+
778
+ ```xml fileName="output of GET /sitemap.xml"
779
+ <?xml version="1.0" encoding="UTF-8"?>
780
+ <urlset
781
+ xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
782
+ xmlns:xhtml="http://www.w3.org/1999/xhtml"
783
+ >
784
+ <url>
785
+ <loc>https://example.com/about</loc>
786
+ <changefreq>monthly</changefreq>
787
+ <priority>0.8</priority>
788
+ <xhtml:link rel="alternate" hreflang="en" href="https://example.com/about"/>
789
+ <xhtml:link rel="alternate" hreflang="fr" href="https://example.com/fr/about"/>
790
+ <xhtml:link rel="alternate" hreflang="es" href="https://example.com/es/about"/>
791
+ <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/about"/>
792
+ </url>
793
+ </urlset>
794
+ ```
795
+
796
+ > لا تدعم مسارات API المعلمات الاختيارية، لذا احتفظ بهذا الملف في جذر `src/routes`، خارج شريحة `[[locale]]`. تحتوي خريطة الموقع بالفعل على كل لغة.
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` هو الحل الاحتياطي للطلبات التي لا تحمل بادئة لغة — فهو يفحص ملف تعريف الارتباط `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
+ // الحصول على ملف تعريف الارتباط من الطلب (افتراضيًا: '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` بمفرده هنا: يتم كتابة ملف تعريف الارتباط الخاص باللغة فقط بمجرد أن يغير الزائر اللغة بنشاط، لذا فإن الزيارة الأولى لـ `/fr/...` ستقوم بالتحليل إلى اللغة الافتراضية.
865
+
866
+ </Step>
867
+
868
+ <Step number={15} title="استخراج محتوى مكوناتك" isOptional={true}>
869
+
870
+ إذا كان لديك قاعدة كود حالية، فقد يكون تحويل آلاف الملفات مستهلكًا للوقت.
871
+
872
+ لتسهيل هذه العملية، يقدم Intlayer [مترجمًا (compiler)](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/compiler.md) / [أداة استخراج (extractor)](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='أمر الاستخراج'>
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'>
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
+ مفاتيح القاموس ومسارات المحتوى يتم فحصها الآن في وقت التجميع (compile time):
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 /` مع ملف تعريف الارتباط `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`. تنطبق صفوف إعادة التوجيه الثلاثة فقط على خادم مجمّع ما لم تقم بتسجيل المعالج كوسيط بنفسك — انظر الخطوة 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](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)