@intlayer/docs 5.8.1 → 6.0.0-canary.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (378) hide show
  1. package/blog/ar/rag_powered_documentation_assistant.md +282 -0
  2. package/blog/de/rag_powered_documentation_assistant.md +282 -0
  3. package/blog/en/rag_powered_documentation_assistant.md +289 -0
  4. package/blog/en-GB/rag_powered_documentation_assistant.md +284 -0
  5. package/blog/es/rag_powered_documentation_assistant.md +308 -0
  6. package/blog/fr/rag_powered_documentation_assistant.md +308 -0
  7. package/blog/hi/rag_powered_documentation_assistant.md +284 -0
  8. package/blog/it/rag_powered_documentation_assistant.md +284 -0
  9. package/blog/ja/rag_powered_documentation_assistant.md +284 -0
  10. package/blog/ko/rag_powered_documentation_assistant.md +283 -0
  11. package/blog/pt/rag_powered_documentation_assistant.md +284 -0
  12. package/blog/ru/rag_powered_documentation_assistant.md +284 -0
  13. package/blog/tr/index.md +69 -0
  14. package/blog/tr/internationalization_and_SEO.md +273 -0
  15. package/blog/tr/intlayer_with_i18next.md +162 -0
  16. package/blog/tr/intlayer_with_next-i18next.md +367 -0
  17. package/blog/tr/intlayer_with_next-intl.md +392 -0
  18. package/blog/tr/intlayer_with_react-i18next.md +346 -0
  19. package/blog/tr/intlayer_with_react-intl.md +345 -0
  20. package/blog/tr/list_i18n_technologies/CMS/drupal.md +143 -0
  21. package/blog/tr/list_i18n_technologies/CMS/wix.md +167 -0
  22. package/blog/tr/list_i18n_technologies/CMS/wordpress.md +188 -0
  23. package/blog/tr/list_i18n_technologies/frameworks/angular.md +125 -0
  24. package/blog/tr/list_i18n_technologies/frameworks/flutter.md +150 -0
  25. package/blog/tr/list_i18n_technologies/frameworks/react-native.md +217 -0
  26. package/blog/tr/list_i18n_technologies/frameworks/react.md +155 -0
  27. package/blog/tr/list_i18n_technologies/frameworks/svelte.md +129 -0
  28. package/blog/tr/list_i18n_technologies/frameworks/vue.md +130 -0
  29. package/blog/tr/next-i18next_vs_next-intl_vs_intlayer.md +170 -0
  30. package/blog/tr/rag_powered_documentation_assistant.md +284 -0
  31. package/blog/tr/react-i18next_vs_react-intl_vs_intlayer.md +162 -0
  32. package/blog/tr/vue-i18n_vs_intlayer.md +276 -0
  33. package/blog/tr/what_is_internationalization.md +166 -0
  34. package/blog/zh/rag_powered_documentation_assistant.md +284 -0
  35. package/dist/cjs/generated/blog.entry.cjs +212 -0
  36. package/dist/cjs/generated/blog.entry.cjs.map +1 -1
  37. package/dist/cjs/generated/docs.entry.cjs +660 -132
  38. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  39. package/dist/cjs/generated/frequentQuestions.entry.cjs +84 -0
  40. package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
  41. package/dist/cjs/generated/legal.entry.cjs +6 -0
  42. package/dist/cjs/generated/legal.entry.cjs.map +1 -1
  43. package/dist/esm/generated/blog.entry.mjs +212 -0
  44. package/dist/esm/generated/blog.entry.mjs.map +1 -1
  45. package/dist/esm/generated/docs.entry.mjs +660 -132
  46. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  47. package/dist/esm/generated/frequentQuestions.entry.mjs +84 -0
  48. package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
  49. package/dist/esm/generated/legal.entry.mjs +6 -0
  50. package/dist/esm/generated/legal.entry.mjs.map +1 -1
  51. package/dist/types/generated/blog.entry.d.ts +1 -0
  52. package/dist/types/generated/blog.entry.d.ts.map +1 -1
  53. package/dist/types/generated/docs.entry.d.ts +5 -2
  54. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  55. package/dist/types/generated/frequentQuestions.entry.d.ts.map +1 -1
  56. package/dist/types/generated/legal.entry.d.ts.map +1 -1
  57. package/docs/ar/autoFill.md +41 -40
  58. package/docs/ar/configuration.md +202 -199
  59. package/docs/ar/dictionary/content_file.md +1059 -0
  60. package/docs/ar/intlayer_CMS.md +4 -4
  61. package/docs/ar/intlayer_with_nestjs.md +271 -0
  62. package/docs/ar/intlayer_with_nextjs_page_router.md +1 -1
  63. package/docs/ar/intlayer_with_react_router_v7.md +533 -0
  64. package/docs/ar/intlayer_with_tanstack.md +465 -299
  65. package/docs/ar/intlayer_with_vite+preact.md +7 -7
  66. package/docs/ar/intlayer_with_vite+react.md +7 -7
  67. package/docs/ar/intlayer_with_vite+vue.md +9 -9
  68. package/docs/ar/packages/vite-intlayer/index.md +3 -3
  69. package/docs/ar/readme.md +261 -0
  70. package/docs/ar/testing.md +199 -0
  71. package/docs/de/autoFill.md +42 -19
  72. package/docs/de/configuration.md +155 -147
  73. package/docs/de/dictionary/content_file.md +1059 -0
  74. package/docs/de/intlayer_CMS.md +4 -5
  75. package/docs/de/intlayer_with_nestjs.md +270 -0
  76. package/docs/de/intlayer_with_nextjs_page_router.md +1 -1
  77. package/docs/de/intlayer_with_react_router_v7.md +537 -0
  78. package/docs/de/intlayer_with_tanstack.md +469 -302
  79. package/docs/de/intlayer_with_vite+preact.md +7 -7
  80. package/docs/de/intlayer_with_vite+react.md +7 -7
  81. package/docs/de/intlayer_with_vite+vue.md +9 -9
  82. package/docs/de/packages/vite-intlayer/index.md +3 -3
  83. package/docs/de/readme.md +261 -0
  84. package/docs/de/testing.md +200 -0
  85. package/docs/en/CI_CD.md +4 -6
  86. package/docs/en/autoFill.md +25 -5
  87. package/docs/en/configuration.md +45 -54
  88. package/docs/en/dictionary/content_file.md +1054 -0
  89. package/docs/en/intlayer_CMS.md +8 -7
  90. package/docs/en/intlayer_cli.md +112 -5
  91. package/docs/en/intlayer_with_nestjs.md +268 -0
  92. package/docs/en/intlayer_with_nextjs_page_router.md +1 -1
  93. package/docs/en/intlayer_with_react_router_v7.md +531 -0
  94. package/docs/en/intlayer_with_tanstack.md +463 -294
  95. package/docs/en/intlayer_with_vite+preact.md +8 -8
  96. package/docs/en/intlayer_with_vite+react.md +8 -8
  97. package/docs/en/intlayer_with_vite+vue.md +8 -8
  98. package/docs/en/packages/intlayer/getLocalizedUrl.md +102 -25
  99. package/docs/en/packages/vite-intlayer/index.md +3 -3
  100. package/docs/en/readme.md +261 -0
  101. package/docs/en/testing.md +200 -0
  102. package/docs/en-GB/autoFill.md +29 -6
  103. package/docs/en-GB/configuration.md +79 -71
  104. package/docs/en-GB/dictionary/content_file.md +1084 -0
  105. package/docs/en-GB/intlayer_CMS.md +4 -5
  106. package/docs/en-GB/intlayer_with_nestjs.md +268 -0
  107. package/docs/en-GB/intlayer_with_nextjs_page_router.md +1 -1
  108. package/docs/en-GB/intlayer_with_react_router_v7.md +533 -0
  109. package/docs/en-GB/intlayer_with_tanstack.md +466 -299
  110. package/docs/en-GB/intlayer_with_vite+preact.md +7 -7
  111. package/docs/en-GB/intlayer_with_vite+react.md +7 -7
  112. package/docs/en-GB/intlayer_with_vite+vue.md +9 -9
  113. package/docs/en-GB/packages/vite-intlayer/index.md +3 -3
  114. package/docs/en-GB/readme.md +261 -0
  115. package/docs/en-GB/testing.md +200 -0
  116. package/docs/es/autoFill.md +45 -23
  117. package/docs/es/configuration.md +171 -167
  118. package/docs/es/dictionary/content_file.md +1088 -0
  119. package/docs/es/intlayer_CMS.md +4 -5
  120. package/docs/es/intlayer_with_nestjs.md +268 -0
  121. package/docs/es/intlayer_with_nextjs_page_router.md +1 -1
  122. package/docs/es/intlayer_with_react_router_v7.md +533 -0
  123. package/docs/es/intlayer_with_tanstack.md +469 -280
  124. package/docs/es/intlayer_with_vite+preact.md +7 -7
  125. package/docs/es/intlayer_with_vite+react.md +7 -7
  126. package/docs/es/intlayer_with_vite+vue.md +9 -9
  127. package/docs/es/packages/vite-intlayer/index.md +3 -3
  128. package/docs/es/readme.md +261 -0
  129. package/docs/es/testing.md +200 -0
  130. package/docs/fr/autoFill.md +47 -24
  131. package/docs/fr/configuration.md +213 -198
  132. package/docs/fr/dictionary/content_file.md +1054 -0
  133. package/docs/fr/intlayer_CMS.md +4 -5
  134. package/docs/fr/intlayer_with_nestjs.md +268 -0
  135. package/docs/fr/intlayer_with_nextjs_page_router.md +1 -1
  136. package/docs/fr/intlayer_with_react_router_v7.md +549 -0
  137. package/docs/fr/intlayer_with_tanstack.md +465 -279
  138. package/docs/fr/intlayer_with_vite+preact.md +7 -7
  139. package/docs/fr/intlayer_with_vite+react.md +7 -7
  140. package/docs/fr/intlayer_with_vite+vue.md +9 -9
  141. package/docs/fr/packages/vite-intlayer/index.md +3 -3
  142. package/docs/fr/readme.md +261 -0
  143. package/docs/fr/testing.md +200 -0
  144. package/docs/hi/autoFill.md +47 -25
  145. package/docs/hi/configuration.md +194 -189
  146. package/docs/hi/dictionary/content_file.md +1056 -0
  147. package/docs/hi/intlayer_CMS.md +4 -5
  148. package/docs/hi/intlayer_with_nestjs.md +269 -0
  149. package/docs/hi/intlayer_with_nextjs_page_router.md +1 -1
  150. package/docs/hi/intlayer_with_react_router_v7.md +533 -0
  151. package/docs/hi/intlayer_with_tanstack.md +467 -282
  152. package/docs/hi/intlayer_with_vite+preact.md +7 -7
  153. package/docs/hi/intlayer_with_vite+react.md +7 -7
  154. package/docs/hi/intlayer_with_vite+vue.md +9 -9
  155. package/docs/hi/packages/vite-intlayer/index.md +3 -3
  156. package/docs/hi/readme.md +261 -0
  157. package/docs/hi/testing.md +200 -0
  158. package/docs/it/autoFill.md +46 -24
  159. package/docs/it/configuration.md +169 -161
  160. package/docs/it/dictionary/content_file.md +1061 -0
  161. package/docs/it/intlayer_CMS.md +4 -5
  162. package/docs/it/intlayer_with_nestjs.md +268 -0
  163. package/docs/it/intlayer_with_nextjs_page_router.md +1 -1
  164. package/docs/it/intlayer_with_react_router_v7.md +535 -0
  165. package/docs/it/intlayer_with_tanstack.md +467 -301
  166. package/docs/it/intlayer_with_vite+preact.md +7 -7
  167. package/docs/it/intlayer_with_vite+react.md +7 -7
  168. package/docs/it/intlayer_with_vite+vue.md +9 -9
  169. package/docs/it/packages/vite-intlayer/index.md +3 -3
  170. package/docs/it/readme.md +261 -0
  171. package/docs/it/testing.md +200 -0
  172. package/docs/ja/autoFill.md +45 -23
  173. package/docs/ja/configuration.md +243 -204
  174. package/docs/ja/dictionary/content_file.md +1064 -0
  175. package/docs/ja/intlayer_CMS.md +4 -5
  176. package/docs/ja/intlayer_with_nestjs.md +268 -0
  177. package/docs/ja/intlayer_with_nextjs_page_router.md +1 -1
  178. package/docs/ja/intlayer_with_react_router_v7.md +534 -0
  179. package/docs/ja/intlayer_with_tanstack.md +467 -303
  180. package/docs/ja/intlayer_with_vite+preact.md +7 -7
  181. package/docs/ja/intlayer_with_vite+react.md +7 -7
  182. package/docs/ja/intlayer_with_vite+vue.md +9 -9
  183. package/docs/ja/packages/vite-intlayer/index.md +3 -3
  184. package/docs/ja/readme.md +263 -0
  185. package/docs/ja/testing.md +200 -0
  186. package/docs/ko/autoFill.md +39 -16
  187. package/docs/ko/configuration.md +217 -197
  188. package/docs/ko/dictionary/content_file.md +1060 -0
  189. package/docs/ko/intlayer_CMS.md +4 -5
  190. package/docs/ko/intlayer_with_nestjs.md +268 -0
  191. package/docs/ko/intlayer_with_nextjs_page_router.md +1 -1
  192. package/docs/ko/intlayer_with_react_router_v7.md +540 -0
  193. package/docs/ko/intlayer_with_tanstack.md +466 -302
  194. package/docs/ko/intlayer_with_vite+preact.md +7 -7
  195. package/docs/ko/intlayer_with_vite+react.md +7 -7
  196. package/docs/ko/intlayer_with_vite+vue.md +9 -9
  197. package/docs/ko/packages/vite-intlayer/index.md +3 -3
  198. package/docs/ko/readme.md +261 -0
  199. package/docs/ko/testing.md +200 -0
  200. package/docs/pt/autoFill.md +39 -15
  201. package/docs/pt/configuration.md +165 -147
  202. package/docs/pt/dictionary/content_file.md +1062 -0
  203. package/docs/pt/intlayer_CMS.md +4 -5
  204. package/docs/pt/intlayer_with_nestjs.md +271 -0
  205. package/docs/pt/intlayer_with_nextjs_page_router.md +1 -1
  206. package/docs/pt/intlayer_with_react_router_v7.md +535 -0
  207. package/docs/pt/intlayer_with_tanstack.md +469 -300
  208. package/docs/pt/intlayer_with_vite+preact.md +7 -7
  209. package/docs/pt/intlayer_with_vite+react.md +7 -7
  210. package/docs/pt/intlayer_with_vite+vue.md +9 -9
  211. package/docs/pt/packages/vite-intlayer/index.md +3 -3
  212. package/docs/pt/readme.md +261 -0
  213. package/docs/pt/testing.md +200 -0
  214. package/docs/ru/autoFill.md +52 -30
  215. package/docs/ru/configuration.md +164 -117
  216. package/docs/ru/dictionary/content_file.md +1064 -0
  217. package/docs/ru/intlayer_CMS.md +4 -4
  218. package/docs/ru/intlayer_with_nestjs.md +270 -0
  219. package/docs/ru/intlayer_with_nextjs_page_router.md +1 -1
  220. package/docs/ru/intlayer_with_react_router_v7.md +534 -0
  221. package/docs/ru/intlayer_with_tanstack.md +470 -305
  222. package/docs/ru/intlayer_with_vite+preact.md +7 -7
  223. package/docs/ru/intlayer_with_vite+react.md +7 -7
  224. package/docs/ru/intlayer_with_vite+vue.md +9 -9
  225. package/docs/ru/packages/vite-intlayer/index.md +3 -3
  226. package/docs/ru/readme.md +261 -0
  227. package/docs/ru/testing.md +202 -0
  228. package/docs/tr/CI_CD.md +198 -0
  229. package/docs/tr/autoFill.md +201 -0
  230. package/docs/tr/configuration.md +585 -0
  231. package/docs/tr/dictionary/condition.md +243 -0
  232. package/docs/tr/dictionary/content_file.md +1055 -0
  233. package/docs/tr/dictionary/enumeration.md +251 -0
  234. package/docs/tr/dictionary/file.md +228 -0
  235. package/docs/tr/dictionary/function_fetching.md +218 -0
  236. package/docs/tr/dictionary/gender.md +279 -0
  237. package/docs/tr/dictionary/insertion.md +191 -0
  238. package/docs/tr/dictionary/markdown.md +385 -0
  239. package/docs/tr/dictionary/nesting.md +279 -0
  240. package/docs/tr/dictionary/translation.md +315 -0
  241. package/docs/tr/formatters.md +618 -0
  242. package/docs/tr/how_works_intlayer.md +254 -0
  243. package/docs/tr/index.md +168 -0
  244. package/docs/tr/interest_of_intlayer.md +288 -0
  245. package/docs/tr/intlayer_CMS.md +347 -0
  246. package/docs/tr/intlayer_cli.md +570 -0
  247. package/docs/tr/intlayer_visual_editor.md +269 -0
  248. package/docs/tr/intlayer_with_angular.md +694 -0
  249. package/docs/tr/intlayer_with_create_react_app.md +1218 -0
  250. package/docs/tr/intlayer_with_express.md +415 -0
  251. package/docs/tr/intlayer_with_lynx+react.md +511 -0
  252. package/docs/tr/intlayer_with_nestjs.md +268 -0
  253. package/docs/tr/intlayer_with_nextjs_14.md +1029 -0
  254. package/docs/tr/intlayer_with_nextjs_15.md +1506 -0
  255. package/docs/tr/intlayer_with_nextjs_page_router.md +1484 -0
  256. package/docs/tr/intlayer_with_nuxt.md +773 -0
  257. package/docs/tr/intlayer_with_react_native+expo.md +660 -0
  258. package/docs/tr/intlayer_with_react_router_v7.md +531 -0
  259. package/docs/tr/intlayer_with_tanstack.md +452 -0
  260. package/docs/tr/intlayer_with_vite+preact.md +1673 -0
  261. package/docs/tr/intlayer_with_vite+react.md +1632 -0
  262. package/docs/tr/intlayer_with_vite+solid.md +288 -0
  263. package/docs/tr/intlayer_with_vite+svelte.md +288 -0
  264. package/docs/tr/intlayer_with_vite+vue.md +1042 -0
  265. package/docs/tr/introduction.md +209 -0
  266. package/docs/tr/locale_mapper.md +244 -0
  267. package/docs/tr/mcp_server.md +207 -0
  268. package/docs/tr/packages/@intlayer/api/index.md +58 -0
  269. package/docs/tr/packages/@intlayer/chokidar/index.md +57 -0
  270. package/docs/tr/packages/@intlayer/cli/index.md +47 -0
  271. package/docs/tr/packages/@intlayer/config/index.md +142 -0
  272. package/docs/tr/packages/@intlayer/core/index.md +51 -0
  273. package/docs/tr/packages/@intlayer/design-system/index.md +47 -0
  274. package/docs/tr/packages/@intlayer/dictionary-entry/index.md +53 -0
  275. package/docs/tr/packages/@intlayer/editor/index.md +47 -0
  276. package/docs/tr/packages/@intlayer/editor-react/index.md +47 -0
  277. package/docs/tr/packages/@intlayer/webpack/index.md +61 -0
  278. package/docs/tr/packages/angular-intlayer/index.md +59 -0
  279. package/docs/tr/packages/express-intlayer/index.md +258 -0
  280. package/docs/tr/packages/express-intlayer/t.md +459 -0
  281. package/docs/tr/packages/intlayer/getConfiguration.md +151 -0
  282. package/docs/tr/packages/intlayer/getEnumeration.md +165 -0
  283. package/docs/tr/packages/intlayer/getHTMLTextDir.md +127 -0
  284. package/docs/tr/packages/intlayer/getLocaleLang.md +87 -0
  285. package/docs/tr/packages/intlayer/getLocaleName.md +124 -0
  286. package/docs/tr/packages/intlayer/getLocalizedUrl.md +324 -0
  287. package/docs/tr/packages/intlayer/getMultilingualUrls.md +225 -0
  288. package/docs/tr/packages/intlayer/getPathWithoutLocale.md +81 -0
  289. package/docs/tr/packages/intlayer/getTranslation.md +196 -0
  290. package/docs/tr/packages/intlayer/getTranslationContent.md +195 -0
  291. package/docs/tr/packages/intlayer/index.md +505 -0
  292. package/docs/tr/packages/intlayer-cli/index.md +71 -0
  293. package/docs/tr/packages/intlayer-editor/index.md +139 -0
  294. package/docs/tr/packages/lynx-intlayer/index.md +85 -0
  295. package/docs/tr/packages/next-intlayer/index.md +154 -0
  296. package/docs/tr/packages/next-intlayer/t.md +354 -0
  297. package/docs/tr/packages/next-intlayer/useDictionary.md +270 -0
  298. package/docs/tr/packages/next-intlayer/useIntlayer.md +265 -0
  299. package/docs/tr/packages/next-intlayer/useLocale.md +133 -0
  300. package/docs/tr/packages/nuxt-intlayer/index.md +59 -0
  301. package/docs/tr/packages/preact-intlayer/index.md +55 -0
  302. package/docs/tr/packages/react-intlayer/index.md +148 -0
  303. package/docs/tr/packages/react-intlayer/t.md +304 -0
  304. package/docs/tr/packages/react-intlayer/useDictionary.md +554 -0
  305. package/docs/tr/packages/react-intlayer/useI18n.md +478 -0
  306. package/docs/tr/packages/react-intlayer/useIntlayer.md +253 -0
  307. package/docs/tr/packages/react-intlayer/useLocale.md +212 -0
  308. package/docs/tr/packages/react-native-intlayer/index.md +85 -0
  309. package/docs/tr/packages/react-scripts-intlayer/index.md +82 -0
  310. package/docs/tr/packages/solid-intlayer/index.md +56 -0
  311. package/docs/tr/packages/svelte-intlayer/index.md +55 -0
  312. package/docs/tr/packages/vite-intlayer/index.md +82 -0
  313. package/docs/tr/packages/vue-intlayer/index.md +59 -0
  314. package/docs/tr/per_locale_file.md +321 -0
  315. package/docs/tr/readme.md +261 -0
  316. package/docs/tr/roadmap.md +338 -0
  317. package/docs/tr/testing.md +200 -0
  318. package/docs/tr/vs_code_extension.md +154 -0
  319. package/docs/zh/autoFill.md +40 -18
  320. package/docs/zh/configuration.md +245 -226
  321. package/docs/zh/dictionary/content_file.md +1064 -0
  322. package/docs/zh/intlayer_CMS.md +4 -5
  323. package/docs/zh/intlayer_with_nestjs.md +268 -0
  324. package/docs/zh/intlayer_with_nextjs_page_router.md +1 -1
  325. package/docs/zh/intlayer_with_react_router_v7.md +535 -0
  326. package/docs/zh/intlayer_with_tanstack.md +468 -278
  327. package/docs/zh/intlayer_with_vite+preact.md +7 -7
  328. package/docs/zh/intlayer_with_vite+react.md +7 -7
  329. package/docs/zh/intlayer_with_vite+vue.md +7 -7
  330. package/docs/zh/packages/vite-intlayer/index.md +3 -3
  331. package/docs/zh/readme.md +261 -0
  332. package/docs/zh/testing.md +198 -0
  333. package/frequent_questions/tr/SSR_Next_no_[locale].md +105 -0
  334. package/frequent_questions/tr/array_as_content_declaration.md +72 -0
  335. package/frequent_questions/tr/build_dictionaries.md +59 -0
  336. package/frequent_questions/tr/build_error_CI_CD.md +75 -0
  337. package/frequent_questions/tr/customized_locale_list.md +65 -0
  338. package/frequent_questions/tr/domain_routing.md +114 -0
  339. package/frequent_questions/tr/esbuild_error.md +30 -0
  340. package/frequent_questions/tr/get_locale_cookie.md +142 -0
  341. package/frequent_questions/tr/intlayer_command_undefined.md +156 -0
  342. package/frequent_questions/tr/locale_incorect_in_url.md +74 -0
  343. package/frequent_questions/tr/static_rendering.md +45 -0
  344. package/frequent_questions/tr/translated_path_url.md +56 -0
  345. package/frequent_questions/tr/unknown_command.md +98 -0
  346. package/legal/tr/privacy_notice.md +83 -0
  347. package/legal/tr/terms_of_service.md +55 -0
  348. package/package.json +12 -12
  349. package/src/generated/blog.entry.ts +212 -0
  350. package/src/generated/docs.entry.ts +663 -135
  351. package/src/generated/frequentQuestions.entry.ts +85 -1
  352. package/src/generated/legal.entry.ts +7 -1
  353. package/docs/ar/dictionary/content_extention_customization.md +0 -100
  354. package/docs/ar/dictionary/get_started.md +0 -527
  355. package/docs/de/dictionary/content_extention_customization.md +0 -100
  356. package/docs/de/dictionary/get_started.md +0 -531
  357. package/docs/en/dictionary/content_extention_customization.md +0 -102
  358. package/docs/en/dictionary/get_started.md +0 -529
  359. package/docs/en-GB/dictionary/content_extention_customization.md +0 -100
  360. package/docs/en-GB/dictionary/get_started.md +0 -591
  361. package/docs/es/dictionary/content_extention_customization.md +0 -100
  362. package/docs/es/dictionary/get_started.md +0 -527
  363. package/docs/fr/dictionary/content_extention_customization.md +0 -100
  364. package/docs/fr/dictionary/get_started.md +0 -527
  365. package/docs/hi/dictionary/content_extention_customization.md +0 -100
  366. package/docs/hi/dictionary/get_started.md +0 -527
  367. package/docs/it/dictionary/content_extention_customization.md +0 -113
  368. package/docs/it/dictionary/get_started.md +0 -573
  369. package/docs/ja/dictionary/content_extention_customization.md +0 -113
  370. package/docs/ja/dictionary/get_started.md +0 -576
  371. package/docs/ko/dictionary/content_extention_customization.md +0 -100
  372. package/docs/ko/dictionary/get_started.md +0 -530
  373. package/docs/pt/dictionary/content_extention_customization.md +0 -100
  374. package/docs/pt/dictionary/get_started.md +0 -532
  375. package/docs/ru/dictionary/content_extention_customization.md +0 -100
  376. package/docs/ru/dictionary/get_started.md +0 -575
  377. package/docs/zh/dictionary/content_extention_customization.md +0 -117
  378. package/docs/zh/dictionary/get_started.md +0 -533
@@ -1,369 +1,437 @@
1
1
  ---
2
- createdAt: 2025-08-11
3
- updatedAt: 2025-08-11
4
- title: البدء مع Intlayer في TanStack Start (React)
5
- description: أضف التدويل (i18n) إلى تطبيق TanStack Start الخاص بك باستخدام Intlayer - قواميس على مستوى المكونات، عناوين URL محلية، وبيانات وصفية صديقة لمحركات البحث.
2
+ createdAt: 2025-09-09
3
+ updatedAt: 2025-09-09
4
+ title: البدء مع Intlayer في Tanstack Start
5
+ description: تعلّم كيفية إضافة التدويل (i18n) إلى تطبيق Tanstack Start الخاص بك باستخدام Intlayer. اتبع هذا الدليل الشامل لجعل تطبيقك متعدد اللغات مع توجيه واعٍ للغة.
6
6
  keywords:
7
7
  - التدويل
8
8
  - التوثيق
9
9
  - Intlayer
10
- - TanStack Start
11
- - TanStack Router
10
+ - Tanstack Start
12
11
  - React
13
12
  - i18n
14
- - جافا سكريبت
13
+ - TypeScript
14
+ - توجيه اللغة
15
15
  slugs:
16
16
  - doc
17
17
  - environment
18
+ - vite-and-react
18
19
  - tanstack-start
20
+ applicationTemplate: https://github.com/AydinTheFirst/tanstack-start-intlayer
21
+ author: AydinTheFirst
19
22
  ---
20
23
 
21
- # البدء بالتدويل (i18n) مع Intlayer و TanStack Start (React)
24
+ # البدء في التدويل (i18n) باستخدام Intlayer و Tanstack Start
25
+
26
+ يوضح هذا الدليل كيفية دمج **Intlayer** لتحقيق تدويل سلس في مشاريع Tanstack Start مع توجيه واعٍ للغة، ودعم TypeScript، وممارسات تطوير حديثة.
22
27
 
23
28
  ## ما هو Intlayer؟
24
29
 
25
- **Intlayer** هو مجموعة أدوات مفتوحة المصدر للتدويل (i18n) لتطبيقات React. يوفر لك:
30
+ **Intlayer** هو مكتبة تدويل (i18n) مبتكرة ومفتوحة المصدر مصممة لتبسيط دعم اللغات المتعددة في تطبيقات الويب الحديثة.
26
31
 
27
- - **قواميس محلية للمكونات** مع أمان TypeScript.
28
- - **بيانات وصفية ومسارات ديناميكية** (جاهزة لتحسين محركات البحث).
29
- - **تبديل اللغة أثناء التشغيل** (ومساعدات لاكتشاف/حفظ اللغة).
30
- - **مكون إضافي لـ Vite** لتحويلات وقت البناء + تجربة تطوير محسنة.
32
+ مع Intlayer، يمكنك:
31
33
 
32
- يوضح هذا الدليل كيفية توصيل Intlayer بمشروع **TanStack Start** (الذي يستخدم Vite تحت الغطاء وTanStack Router للتوجيه/SSR).
34
+ - **إدارة الترجمات بسهولة** باستخدام قواميس إعلانية على مستوى المكونات.
35
+ - **توطين البيانات الوصفية، والمسارات، والمحتوى بشكل ديناميكي**.
36
+ - **ضمان دعم TypeScript** من خلال أنواع مولدة تلقائيًا، مما يحسن الإكمال التلقائي واكتشاف الأخطاء.
37
+ - **الاستفادة من الميزات المتقدمة**، مثل الكشف الديناميكي عن اللغة والتبديل بينها.
38
+ - **تمكين التوجيه الواعي للغة** باستخدام نظام التوجيه المعتمد على الملفات في Tanstack Start.
33
39
 
34
40
  ---
35
41
 
36
- ## الخطوة 1: تثبيت التبعيات
42
+ ## دليل خطوة بخطوة لإعداد Intlayer في تطبيق Tanstack Start
37
43
 
38
- ```bash
39
- # npm
40
- npm i intlayer react-intlayer
41
- npm i -D vite-intlayer
44
+ ### الخطوة 1: إنشاء المشروع
42
45
 
43
- # pnpm
44
- pnpm add intlayer react-intlayer
45
- pnpm add -D vite-intlayer
46
+ ابدأ بإنشاء مشروع TanStack Start جديد باتباع دليل [بدء مشروع جديد](https://tanstack.com/start/latest/docs/framework/react/quick-start) على موقع TanStack Start.
47
+
48
+ ### الخطوة 2: تثبيت حزم Intlayer
46
49
 
47
- # yarn
48
- yarn add intlayer react-intlayer
49
- yarn add -D vite-intlayer
50
+ قم بتثبيت الحزم اللازمة باستخدام مدير الحزم المفضل لديك:
51
+
52
+ ```bash packageManager="npm"
53
+ npm install intlayer react-intlayer
54
+ npm install vite-intlayer --save-dev
50
55
  ```
51
56
 
52
- - **intlayer**: النواة (الإعدادات، القواميس، CLI/التحويلات).
53
- - **react-intlayer**: `<IntlayerProvider>` + هوكس لـ React.
54
- - **vite-intlayer**: مكون Vite الإضافي، بالإضافة إلى وسيط اختياري لاكتشاف اللغة/إعادة التوجيه (يعمل في التطوير و SSR/المعاينة؛ انقل إلى `dependencies` لـ SSR في الإنتاج).
57
+ ```bash packageManager="pnpm"
58
+ pnpm add intlayer react-intlayer
59
+ pnpm add vite-intlayer --save-dev
60
+ ```
55
61
 
56
- ---
62
+ - **intlayer**
63
+
64
+ الحزمة الأساسية التي توفر أدوات التدويل لإدارة التكوين، والترجمة، و[إعلان المحتوى](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/dictionary/get_started.md)، والتحويل البرمجي، و[أوامر CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/intlayer_cli.md).
65
+
66
+ - **react-intlayer**
67
+ الحزمة التي تدمج Intlayer مع تطبيق React. توفر موفري السياق (context providers) وخطافات (hooks) لتدويل React.
57
68
 
58
- ## الخطوة 2: تكوين Intlayer
69
+ - **vite-intlayer**
70
+ تتضمن إضافة Vite لدمج Intlayer مع [مجمّع Vite](https://vite.dev/guide/why.html#why-bundle-for-production)، بالإضافة إلى وسيط (middleware) لاكتشاف اللغة المفضلة للمستخدم، وإدارة ملفات تعريف الارتباط (cookies)، والتعامل مع إعادة توجيه URL.
59
71
 
60
- قم بإنشاء ملف `intlayer.config.ts` في جذر مشروعك:
72
+ ### الخطوة 3: تكوين مشروعك
61
73
 
62
- ```ts fileName="intlayer.config.ts"
63
- import { Locales, type IntlayerConfig } from "intlayer";
74
+ قم بإنشاء ملف تكوين لتكوين لغات تطبيقك:
75
+
76
+ ```typescript fileName="intlayer.config.ts" codeFormat="typescript"
77
+ import type { IntlayerConfig } from "intlayer";
78
+
79
+ import { Locales } from "intlayer";
64
80
 
65
81
  const config: IntlayerConfig = {
66
82
  internationalization: {
67
- locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
68
83
  defaultLocale: Locales.ENGLISH,
84
+ locales: [
85
+ Locales.ENGLISH,
86
+ Locales.FRENCH,
87
+ Locales.SPANISH,
88
+ // لغاتك الأخرى
89
+ ],
69
90
  },
70
- // يمكنك أيضًا تعديل: contentDir، contentFileExtensions، خيارات الوسيط، إلخ.
71
91
  };
72
92
 
73
93
  export default config;
74
94
  ```
75
95
 
76
- تكون نسخ CommonJS/ESM متطابقة مع مستندك الأصلي إذا كنت تفضل `cjs`/`mjs`.
96
+ ```javascript fileName="intlayer.config.mjs" codeFormat="esm"
97
+ import { Locales } from "intlayer";
98
+
99
+ /** @type {import('intlayer').IntlayerConfig} */
100
+ const config = {
101
+ internationalization: {
102
+ defaultLocale: Locales.ENGLISH,
103
+ locales: [
104
+ Locales.ENGLISH,
105
+ Locales.FRENCH,
106
+ Locales.SPANISH,
107
+ // لغاتك الأخرى
108
+ ],
109
+ },
110
+ };
77
111
 
78
- > المرجع الكامل للإعدادات: راجع وثائق تكوين Intlayer.
112
+ export default config;
113
+ ```
79
114
 
80
- ---
115
+ ```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
116
+ const { Locales } = require("intlayer");
81
117
 
82
- ## الخطوة 3: إضافة مكون Vite الإضافي (والوسيط الاختياري)
118
+ /** @type {import('intlayer').IntlayerConfig} */
119
+ const config = {
120
+ internationalization: {
121
+ defaultLocale: Locales.ENGLISH,
122
+ locales: [
123
+ Locales.ENGLISH,
124
+ Locales.FRENCH,
125
+ Locales.SPANISH,
126
+ // لغاتك الأخرى
127
+ ],
128
+ },
129
+ };
130
+
131
+ module.exports = config;
132
+ ```
83
133
 
84
- **يستخدم TanStack Start Vite**، لذا أضف مكون(ات) Intlayer الإضافي إلى ملف `vite.config.ts` الخاص بك:
134
+ > من خلال ملف التكوين هذا، يمكنك إعداد عناوين URL محلية، إعادة توجيه الوسيط، أسماء ملفات تعريف الارتباط، موقع وامتداد إعلانات المحتوى الخاصة بك، تعطيل سجلات Intlayer في وحدة التحكم، والمزيد. للحصول على قائمة كاملة بالمعلمات المتاحة، راجع [توثيق التكوين](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/configuration.md).
85
135
 
86
- ```ts fileName="vite.config.ts"
136
+ ### الخطوة 4: دمج Intlayer في تكوين Vite الخاص بك
137
+
138
+ أضف مكون intlayer الإضافي إلى تكوينك:
139
+
140
+ ```typescript fileName="vite.config.ts" codeFormat="typescript"
141
+ import { reactRouter } from "@react-router/dev/vite";
87
142
  import { defineConfig } from "vite";
88
- import react from "@vitejs/plugin-react-swc";
89
- import { intlayerPlugin, intLayerMiddlewarePlugin } from "vite-intlayer";
143
+ import { intlayerMiddlewarePlugin, intlayerPlugin } from "vite-intlayer";
144
+ import tsconfigPaths from "vite-tsconfig-paths";
90
145
 
91
146
  export default defineConfig({
92
147
  plugins: [
93
- react(),
148
+ reactRouter(),
149
+ tsconfigPaths(),
94
150
  intlayerPlugin(),
95
- // اختياري ولكنه موصى به لاكتشاف اللغة، ملفات تعريف الارتباط وإعادة التوجيه:
96
- intLayerMiddlewarePlugin(),
151
+ intlayerMiddlewarePlugin(),
97
152
  ],
98
153
  });
99
154
  ```
100
155
 
101
- > إذا قمت بنشر SSR، انقل `vite-intlayer` إلى `dependencies` حتى يعمل الوسيط في الإنتاج.
156
+ > يتم استخدام مكون Vite الإضافي `intlayerPlugin()` لدمج Intlayer مع Vite. يضمن بناء ملفات إعلان المحتوى ومراقبتها في وضع التطوير. كما يعرّف متغيرات بيئة Intlayer داخل تطبيق Vite. بالإضافة إلى ذلك، يوفر ألقابًا لتحسين الأداء.
102
157
 
103
- ---
158
+ ### الخطوة 5: إنشاء مكونات التخطيط
159
+
160
+ قم بإعداد تخطيط الجذر والتخطيطات الخاصة بكل لغة:
161
+
162
+ #### تخطيط الجذر
104
163
 
105
- ## الخطوة 4: إعلان المحتوى الخاص بك
164
+ ```tsx fileName="src/routes/{-$locale}/route.tsx" codeFormat="typescript"
165
+ // src/routes/{-$locale}/route.tsx
166
+ import { createFileRoute, Navigate, Outlet } from "@tanstack/react-router";
167
+ import { configuration } from "intlayer";
168
+ import { IntlayerProvider, useLocale } from "react-intlayer";
169
+
170
+ import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes";
171
+
172
+ export const Route = createFileRoute("/{-$locale}")({
173
+ component: LayoutComponent,
174
+ });
175
+
176
+ function LayoutComponent() {
177
+ const { locale } = Route.useParams();
178
+
179
+ return (
180
+ <IntlayerProvider locale={locale}>
181
+ <Outlet />
182
+ </IntlayerProvider>
183
+ );
184
+ }
185
+ ```
106
186
 
107
- ضع قواميسك في أي مكان تحت `./src` (المجلد الافتراضي `contentDir`). مثال:
187
+ ### الخطوة 6: إعلان المحتوى الخاص بك
108
188
 
109
- ```tsx fileName="src/app.content.tsx"
110
- import { t, type Dictionary } from "intlayer";
111
- import type { ReactNode } from "react";
189
+ قم بإنشاء وإدارة إعلانات المحتوى الخاصة بك لتخزين الترجمات:
190
+
191
+ ```tsx fileName="src/contents/page.content.ts" contentDeclarationFormat="typescript"
192
+ import type { Dictionary } from "intlayer";
193
+
194
+ import { t } from "intlayer";
112
195
 
113
196
  const appContent = {
114
- key: "app",
115
197
  content: {
116
- viteLogo: t({
117
- ar: "شعار Vite",
118
- en: "Vite logo",
119
- fr: "Logo Vite",
120
- es: "Logo Vite",
121
- }),
122
- reactLogo: t({
123
- ar: "شعار React",
124
- en: "React logo",
125
- fr: "Logo React",
126
- es: "Logo React",
127
- }),
198
+ links: {
199
+ about: t({
200
+ en: "About",
201
+ es: "Acerca de",
202
+ fr: "À propos",
203
+ }),
204
+ home: t({
205
+ en: "الرئيسية",
206
+ es: "Inicio",
207
+ fr: "Accueil",
208
+ }),
209
+ },
210
+ meta: {
211
+ description: t({
212
+ en: "هذا مثال على استخدام Intlayer مع TanStack Router",
213
+ es: "Este es un ejemplo de uso de Intlayer con TanStack Router",
214
+ fr: "Ceci est un exemple d'utilisation d'Intlayer avec TanStack Router",
215
+ }),
216
+ },
128
217
  title: t({
129
- ar: "TanStack Start + React",
130
- en: "TanStack Start + React",
131
- fr: "TanStack Start + React",
132
- es: "TanStack Start + React",
133
- }),
134
- count: t({
135
- ar: "العدد هو ",
136
- en: "count is ",
137
- fr: "le compte est ",
138
- es: "el recuento es ",
139
- }),
140
- edit: t<ReactNode>({
141
- ar: (
142
- <>
143
- حرر <code>src/routes/index.tsx</code> واحفظ لاختبار HMR
144
- </>
145
- ),
146
- en: (
147
- <>
148
- Edit <code>src/routes/index.tsx</code> and save to test HMR
149
- </>
150
- ),
151
- fr: (
152
- <>
153
- Éditez <code>src/routes/index.tsx</code> et enregistrez pour tester
154
- HMR
155
- </>
156
- ),
157
- es: (
158
- <>
159
- Edita <code>src/routes/index.tsx</code> y guarda para probar HMR
160
- </>
161
- ),
162
- }),
163
- readTheDocs: t({
164
- ar: "انقر على الشعارات لمعرفة المزيد",
165
- en: "Click the logos to learn more",
166
- fr: "Cliquez sur les logos pour en savoir plus",
167
- es: "Haz clic en los logotipos para saber más",
218
+ en: "مرحبًا بك في Intlayer + TanStack Router",
219
+ es: "Bienvenido a Intlayer + TanStack Router",
220
+ fr: "Bienvenue à Intlayer + TanStack Router",
168
221
  }),
169
222
  },
223
+ key: "app",
170
224
  } satisfies Dictionary;
171
225
 
172
226
  export default appContent;
173
227
  ```
174
228
 
175
- JSON/ESM/CJS variants تعمل بنفس الطريقة كما في مستندك الأصلي.
229
+ > يمكن تعريف إعلانات المحتوى الخاصة بك في أي مكان في تطبيقك بمجرد تضمينها في دليل `contentDir` (افتراضيًا، `./app`). ويجب أن تتطابق مع امتداد ملف إعلان المحتوى (افتراضيًا، `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`).
176
230
 
177
- > محتوى TSX؟ لا تنسَ `import React from "react"` إذا كانت إعداداتك تحتاج ذلك.
231
+ > لمزيد من التفاصيل، راجع [توثيق إعلان المحتوى](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/dictionary/get_started.md).
178
232
 
179
- ---
233
+ ### الخطوة 7: إنشاء مكونات وخطافات تدرك اللغة
180
234
 
181
- ## الخطوة 5: لف TanStack Start باستخدام Intlayer
235
+ قم بإنشاء مكون `LocalizedLink` للملاحة المدركة للغة:
182
236
 
183
- مع TanStack Start، فإن **المسار الجذري** هو المكان المناسب لتعيين المزودين.
237
+ ```tsx fileName="src/components/localized-link.tsx" codeFormat="typescript"
238
+ // src/components/localized-link.tsx
239
+ // eslint-disable-next-line no-restricted-imports
240
+ import { Link, type LinkProps } from "@tanstack/react-router";
241
+ import { getLocalizedUrl } from "intlayer";
242
+ import { useLocale } from "react-intlayer";
184
243
 
185
- ```tsx fileName="src/routes/__root.tsx"
186
- import {
187
- Outlet,
188
- createRootRoute,
189
- Link as RouterLink,
190
- } from "@tanstack/react-router";
191
- import { IntlayerProvider, useIntlayer } from "react-intlayer";
192
-
193
- function AppShell() {
194
- // مثال على استخدام قاموس على المستوى الأعلى:
195
- const content = useIntlayer("app");
244
+ type LocalizedLinkProps = {
245
+ to: string;
246
+ } & Omit<LinkProps, "to">;
196
247
 
197
- return (
198
- <div>
199
- <nav className="flex gap-3 p-3">
200
- <RouterLink to="/">الرئيسية</RouterLink>
201
- <RouterLink to="/about">حول</RouterLink>
202
- </nav>
203
- <main className="p-6">
204
- <h1>{content.title}</h1>
205
- <Outlet />
206
- </main>
207
- </div>
208
- );
209
- }
248
+ export function LocalizedLink(props: LocalizedLinkProps) {
249
+ const { locale } = useLocale();
210
250
 
211
- export const Route = createRootRoute({
212
- component: () => (
213
- <IntlayerProvider>
214
- <AppShell />
215
- </IntlayerProvider>
216
- ),
217
- });
218
- ```
251
+ // دالة للتحقق مما إذا كان الرابط خارجيًا
252
+ const isExternal = (to: string) => {
253
+ return /^(https?:)?\/\//.test(to);
254
+ };
219
255
 
220
- ثم استخدم المحتوى الخاص بك في الصفحات:
256
+ // تحديد الرابط بناءً على ما إذا كان خارجيًا أو داخليًا مع تعريب الرابط
257
+ const to = isExternal(props.to)
258
+ ? props.to
259
+ : getLocalizedUrl(props.to, locale);
221
260
 
222
- ```tsx fileName="src/routes/index.tsx"
223
- import { createFileRoute } from "@tanstack/react-router";
224
- import { useIntlayer } from "react-intlayer";
225
- import reactLogo from "../assets/react.svg";
226
-
227
- export const Route = createFileRoute("/")({
228
- component: () => {
229
- const content = useIntlayer("app");
230
- return (
231
- <>
232
- <button>{content.count}0</button>
233
- <p>{content.edit}</p>
234
- <img
235
- src={reactLogo}
236
- alt={content.reactLogo.value}
237
- width={48}
238
- height={48}
239
- />
240
- <p className="opacity-70">{content.readTheDocs}</p>
241
- </>
242
- );
243
- },
244
- });
261
+ return <Link {...props} to={to as LinkProps["to"]} />;
262
+ }
245
263
  ```
246
264
 
247
- > سمات السلسلة النصية (`alt`، `title`، `aria-label`، …) تحتاج إلى `.value`:
248
- >
249
- > ```jsx
250
- > <img alt={c.reactLogo.value} />
251
- > ```
265
+ إنشاء هوك `useLocalizedNavigate` للملاحة البرمجية:
252
266
 
253
- ---
267
+ ```tsx fileName="src/hooks/useLocalizedNavigate.tsx" codeFormat="typescript"
268
+ // src/hooks/useLocalizedNavigate.tsx
269
+ // eslint-disable-next-line no-restricted-imports
270
+ import { NavigateOptions, useNavigate } from "@tanstack/react-router";
271
+ import { getLocalizedUrl } from "intlayer";
272
+ import { useLocale } from "react-intlayer";
254
273
 
255
- ## (اختياري) الخطوة 6: تبديل اللغة (العميل)
274
+ type LocalizedNavigateOptions = {
275
+ to: string;
276
+ } & Omit<NavigateOptions, "to">;
256
277
 
257
- ```tsx fileName="src/components/LocaleSwitcher.tsx"
258
- import { Locales } from "intlayer";
259
- import { useLocale } from "react-intlayer";
278
+ export const useLocalizedNavigate = () => {
279
+ const navigate = useNavigate();
280
+ const { locale } = useLocale();
260
281
 
261
- export function LocaleSwitcher() {
262
- const { setLocale } = useLocale();
263
- return (
264
- <div className="flex gap-2">
265
- <button onClick={() => setLocale(Locales.ENGLISH)}>الإنجليزية</button>
266
- <button onClick={() => setLocale(Locales.FRENCH)}>الفرنسية</button>
267
- <button onClick={() => setLocale(Locales.SPANISH)}>الإسبانية</button>
268
- </div>
269
- );
270
- }
282
+ const isExternal = (to: string) => {
283
+ return /^(https?:)?\/\//.test(to);
284
+ };
285
+
286
+ const localizedNavigate = (options: LocalizedNavigateOptions) => {
287
+ const to = isExternal(options.to)
288
+ ? options.to
289
+ : getLocalizedUrl(options.to, locale);
290
+
291
+ navigate({ ...options, to: to as NavigateOptions["to"] });
292
+ };
293
+
294
+ return localizedNavigate;
295
+ };
271
296
  ```
272
297
 
273
- ---
298
+ ### الخطوة 8: استخدام Intlayer في صفحاتك
274
299
 
275
- ## (اختياري) الخطوة 7: التوجيه المحلي (عناوين URL صديقة لتحسين محركات البحث)
300
+ الوصول إلى قواميس المحتوى الخاصة بك في جميع أنحاء تطبيقك:
276
301
 
277
- لديك **نموذجان جيدان** مع TanStack Start. اختر واحدًا.
302
+ #### صفحة إعادة التوجيه الجذرية
278
303
 
279
- قم بإنشاء مجلد مقطع ديناميكي `src/routes/$locale/` بحيث تكون عناوين URL الخاصة بك `/:locale/...`. في تخطيط `$locale`، تحقق من صحة `params.locale`، وقم بتعيين `<IntlayerProvider locale=...>`، وقم بعرض `<Outlet />`. هذا النهج مباشر، ولكنك ستقوم بتركيب بقية مساراتك تحت `$locale`، وستحتاج إلى شجرة إضافية بدون بادئة إذا لم ترغب في إضافة بادئة اللغة الافتراضية.
304
+ ```tsx fileName="src/routes/page.tsx" codeFormat="typescript"
305
+ // src/routes/page.tsx
306
+ import { useLocale } from "intlayer";
307
+ import { Navigate } from "react-router";
280
308
 
281
- ---
309
+ export default function Page() {
310
+ const { locale } = useLocale();
282
311
 
283
- ## (اختياري) الخطوة 8: تحديث عنوان URL عند تبديل اللغة
312
+ return <Navigate replace to={locale} />;
313
+ }
314
+ ```
284
315
 
285
- مع النمط أ (المسار الأساسي)، يعني تبديل اللغات **التنقل إلى مسار أساسي مختلف**:
316
+ #### الصفحة الرئيسية المحلية
286
317
 
287
- ```tsx fileName="src/components/LocaleSwitcherNavigate.tsx"
288
- import { useRouter } from "@tanstack/react-router";
289
- import { Locales, getLocalizedUrl } from "intlayer";
290
- import { useLocale } from "react-intlayer";
318
+ ```tsx fileName="src/routes/{-$locale}/index.tsx" codeFormat="typescript"
319
+ import { createFileRoute } from "@tanstack/react-router";
320
+ import { getIntlayer } from "intlayer";
321
+ import { useIntlayer } from "react-intlayer";
291
322
 
292
- export function LocaleSwitcherNavigate() {
293
- const router = useRouter();
294
- const { locale, setLocale } = useLocale();
295
-
296
- const change = async (next: Locales) => {
297
- if (next === locale) return;
298
- const nextPath = getLocalizedUrl(
299
- window.location.pathname + window.location.search,
300
- next
301
- );
302
- await router.navigate({ to: nextPath }); // يحافظ على التاريخ
303
- setLocale(next);
304
- };
323
+ import LocaleSwitcher from "@/components/locale-switcher";
324
+ import { LocalizedLink } from "@/components/localized-link";
325
+ import { useLocalizedNavigate } from "@/hooks/useLocalizedNavigate";
326
+
327
+ export const Route = createFileRoute("/{-$locale}/")({
328
+ component: RouteComponent,
329
+ head: ({ params }) => {
330
+ const { locale } = params;
331
+ const metaContent = getIntlayer("app", locale);
332
+
333
+ return {
334
+ meta: [
335
+ { title: metaContent.title },
336
+ { content: metaContent.meta.description, name: "description" },
337
+ ],
338
+ };
339
+ },
340
+ });
341
+
342
+ function RouteComponent() {
343
+ const content = useIntlayer("app");
344
+ const navigate = useLocalizedNavigate();
305
345
 
306
346
  return (
307
- <div className="flex gap-2">
308
- <button onClick={() => change(Locales.ENGLISH)}>الإنجليزية</button>
309
- <button onClick={() => change(Locales.FRENCH)}>الفرنسية</button>
310
- <button onClick={() => change(Locales.SPANISH)}>الإسبانية</button>
347
+ <div className="grid place-items-center h-screen">
348
+ <div className="flex flex-col gap-4 items-center text-center">
349
+ {content.title}
350
+ <LocaleSwitcher />
351
+ <div className="flex gap-4">
352
+ <a href="/">الفهرس</a>
353
+ <LocalizedLink to="/">{content.links.home}</LocalizedLink>
354
+ <LocalizedLink to="/about">{content.links.about}</LocalizedLink>
355
+ </div>
356
+ <div className="flex gap-4">
357
+ <button onClick={() => navigate({ to: "/" })}>
358
+ {content.links.home}
359
+ </button>
360
+ <button onClick={() => navigate({ to: "/about" })}>
361
+ {content.links.about}
362
+ </button>
363
+ </div>
364
+ </div>
311
365
  </div>
312
366
  );
313
367
  }
314
368
  ```
315
369
 
316
- ---
370
+ > لمعرفة المزيد عن الخطاف `useIntlayer`، راجع [التوثيق](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/packages/react-intlayer/useIntlayer.md).
317
371
 
318
- ## (اختياري) الخطوة 9: `<html lang>` و `dir` (مستند TanStack Start)
372
+ ### الخطوة 9: إنشاء مكون لتبديل اللغة
319
373
 
320
- يوفر TanStack Start **مستند** (هيكل HTML الجذري) يمكنك تخصيصه. قم بتعيين `lang` و `dir` لتحسين إمكانية الوصول وSEO:
374
+ أنشئ مكونًا يسمح للمستخدمين بتغيير اللغة:
321
375
 
322
- ```tsx fileName="src/routes/__root.tsx" {4,15}
323
- import { Outlet, createRootRoute } from "@tanstack/react-router";
324
- import { IntlayerProvider } from "react-intlayer";
325
- import { getHTMLTextDir } from "intlayer";
376
+ ```tsx fileName="src/components/locale-switcher.tsx" codeFormat="typescript"
377
+ import { useLocation } from "@tanstack/react-router";
378
+ import {
379
+ getHTMLTextDir,
380
+ getLocaleName,
381
+ getLocalizedUrl,
382
+ Locales,
383
+ } from "intlayer";
384
+ import { useIntlayer, useLocale } from "react-intlayer";
385
+
386
+ export default function LocaleSwitcher() {
387
+ const { pathname, searchStr } = useLocation();
388
+ const content = useIntlayer("locale-switcher");
389
+
390
+ const { availableLocales, locale, setLocale } = useLocale({
391
+ onLocaleChange: (newLocale) => {
392
+ const pathWithLocale = getLocalizedUrl(pathname + searchStr, newLocale);
393
+ location.replace(pathWithLocale);
394
+ },
395
+ });
326
396
 
327
- function Document({
328
- locale,
329
- children,
330
- }: {
331
- locale: string;
332
- children: React.ReactNode;
333
- }) {
334
397
  return (
335
- <html lang={locale} dir={getHTMLTextDir(locale)}>
336
- <head>
337
- <meta charSet="utf-8" />
338
- <meta name="viewport" content="width=device-width, initial-scale=1" />
339
- {/* ... */}
340
- </head>
341
- <body>{children}</body>
342
- </html>
398
+ <select
399
+ aria-label={content.label.toString()}
400
+ onChange={(e) => setLocale(e.target.value)}
401
+ value={locale}
402
+ >
403
+ {availableLocales.map((localeItem) => (
404
+ <option
405
+ dir={getHTMLTextDir(localeItem)}
406
+ key={localeItem}
407
+ lang={localeItem}
408
+ value={localeItem}
409
+ >
410
+ {/* مثال: Français (الفرنسية) */}
411
+ {getLocaleName(localeItem, locale)} (
412
+ {getLocaleName(localeItem, Locales.ENGLISH)})
413
+ </option>
414
+ ))}
415
+ </select>
343
416
  );
344
417
  }
345
-
346
- export const Route = createRootRoute({
347
- component: () => (
348
- <IntlayerProvider>
349
- {/* إذا كنت تحسب اللغة على الخادم، قم بتمريرها إلى المستند؛ وإلا سيصححها العميل بعد التحميل */}
350
- <Document locale={document?.documentElement?.lang || "en"}>
351
- <Outlet />
352
- </Document>
353
- </IntlayerProvider>
354
- ),
355
- });
356
418
  ```
357
419
 
358
- لتصحيح جانب العميل، يمكنك أيضًا الاحتفاظ بالهوك الصغير الخاص بك:
420
+ > لمعرفة المزيد عن الخطاف `useLocale`، يرجى الرجوع إلى [التوثيق](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/packages/react-intlayer/useLocale.md).
421
+
422
+ ### الخطوة 10: إضافة إدارة خصائص HTML (اختياري)
423
+
424
+ إنشاء خطاف لإدارة خصائص lang و dir في HTML:
359
425
 
360
- ```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx"
426
+ ```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx" codeFormat="typescript"
427
+ // src/hooks/useI18nHTMLAttributes.tsx
428
+ import { getHTMLTextDir } from "intlayer";
361
429
  import { useEffect } from "react";
362
430
  import { useLocale } from "react-intlayer";
363
- import { getHTMLTextDir } from "intlayer";
364
431
 
365
432
  export const useI18nHTMLAttributes = () => {
366
433
  const { locale } = useLocale();
434
+
367
435
  useEffect(() => {
368
436
  document.documentElement.lang = locale;
369
437
  document.documentElement.dir = getHTMLTextDir(locale);
@@ -371,87 +439,185 @@ export const useI18nHTMLAttributes = () => {
371
439
  };
372
440
  ```
373
441
 
374
- ---
442
+ ثم استخدمه في مكون الجذر الخاص بك:
375
443
 
376
- ## (اختياري) الخطوة 10: مكون الرابط المحلي
444
+ ```tsx fileName="src/routes/{-$locale}/index.tsx" codeFormat="typescript"
445
+ import { createFileRoute, Navigate, Outlet } from "@tanstack/react-router";
446
+ import { configuration } from "intlayer";
447
+ import { IntlayerProvider, useLocale } from "react-intlayer";
377
448
 
378
- يوفر TanStack Router مكون `<Link/>`، ولكن إذا كنت بحاجة إلى عنصر `<a>` عادي يضيف بادئة تلقائية لعناوين URL الداخلية:
449
+ import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes"; // استيراد الخطاف
379
450
 
380
- ```tsx fileName="src/components/Link.tsx"
381
- import { getLocalizedUrl } from "intlayer";
382
- import {
383
- forwardRef,
384
- type AnchorHTMLAttributes,
385
- type DetailedHTMLProps,
386
- } from "react";
387
- import { useLocale } from "react-intlayer";
451
+ export const Route = createFileRoute("/{-$locale}")({
452
+ component: LayoutComponent,
453
+ });
388
454
 
389
- export interface LinkProps
390
- extends DetailedHTMLProps<
391
- AnchorHTMLAttributes<HTMLAnchorElement>,
392
- HTMLAnchorElement
393
- > {}
394
-
395
- const isExternal = (href?: string) => /^https?:\/\//.test(href ?? "");
396
-
397
- export const Link = forwardRef<HTMLAnchorElement, LinkProps>(
398
- ({ href, children, ...props }, ref) => {
399
- const { locale } = useLocale();
400
- const hrefI18n =
401
- href && !isExternal(href) ? getLocalizedUrl(href, locale) : href;
402
- return (
403
- <a href={hrefI18n} ref={ref} {...props}>
404
- {children}
405
- </a>
406
- );
407
- }
408
- );
409
- Link.displayName = "Link";
455
+ function LayoutComponent() {
456
+ useI18nHTMLAttributes(); // أضف هذا السطر
457
+
458
+ const { locale } = Route.useParams();
459
+
460
+ return (
461
+ <IntlayerProvider locale={locale}>
462
+ <Outlet />
463
+ </IntlayerProvider>
464
+ );
465
+ }
410
466
  ```
411
467
 
412
- > إذا كنت تستخدم النمط أ (basepath)، فإن `<Link to="/about" />` الخاص بـ TanStack يحل بالفعل إلى `/fr/about` عبر `basepath`، لذا فإن استخدام رابط مخصص هو أمر اختياري.
468
+ ### الخطوة 11: بناء وتشغيل تطبيقك
413
469
 
414
- ---
470
+ قم ببناء قواميس المحتوى وتشغيل تطبيقك:
471
+
472
+ ```bash packageManager="npm"
473
+ # بناء قواميس Intlayer
474
+ npm run intlayer:build
415
475
 
416
- ## TypeScript
476
+ # بدء خادم التطوير
477
+ npm run dev
478
+ ```
479
+
480
+ ```bash packageManager="pnpm"
481
+ # بناء قواميس Intlayer
482
+ pnpm intlayer:build
483
+
484
+ # بدء خادم التطوير
485
+ pnpm dev
486
+ ```
487
+
488
+ ```bash packageManager="yarn"
489
+ # بناء قواميس Intlayer
490
+ yarn intlayer:build
417
491
 
418
- قم بتضمين الأنواع التي تم إنشاؤها بواسطة Intlayer:
492
+ # بدء خادم التطوير
493
+ yarn dev
494
+ ```
495
+
496
+ ### الخطوة 12: تكوين TypeScript (اختياري)
497
+
498
+ يستخدم Intlayer تعزيز الوحدات للاستفادة من ميزات TypeScript وجعل قاعدة الشيفرة الخاصة بك أقوى.
499
+
500
+ تأكد من أن تكوين TypeScript الخاص بك يتضمن الأنواع التي تم إنشاؤها تلقائيًا:
419
501
 
420
502
  ```json5 fileName="tsconfig.json"
421
503
  {
422
- "include": ["src", ".intlayer/**/*.ts"],
504
+ compilerOptions: {
505
+ // ... تكوينات TypeScript الحالية الخاصة بك
506
+ },
507
+ include: [
508
+ // ... الملفات التي تشملها حاليًا
509
+ ".intlayer/**/*.ts", // تضمين الأنواع التي تم إنشاؤها تلقائيًا
510
+ ],
423
511
  }
424
512
  ```
425
513
 
426
- ---
514
+ ### تكوين Git
427
515
 
428
- ## Git
516
+ يوصى بتجاهل الملفات التي تم إنشاؤها بواسطة Intlayer. هذا يسمح لك بتجنب إضافتها إلى مستودع Git الخاص بك.
429
517
 
430
- تجاهل الملفات الناتجة عن Intlayer:
518
+ للقيام بذلك، يمكنك إضافة التعليمات التالية إلى ملف `.gitignore` الخاص بك:
431
519
 
432
- ```gitignore
520
+ ```plaintext fileName=".gitignore"
521
+ # تجاهل الملفات التي تم إنشاؤها بواسطة Intlayer
433
522
  .intlayer
434
523
  ```
435
524
 
436
525
  ---
437
526
 
527
+ ### الخطوة 13: إنشاء إعادة توجيه (اختياري)
528
+
529
+ ```typescript fileName="src/routes/{-$locale}/rotue.tsx" codeFormat="typescript"
530
+ function LayoutComponent() {
531
+ useI18nHTMLAttributes();
532
+
533
+ const { locale } = Route.useParams();
534
+ const { locale: selectedLocale } = useLocale();
535
+ const { defaultLocale } = configuration.internationalization;
536
+ const { prefixDefault } = configuration.middleware;
537
+
538
+ // إعادة التوجيه إلى اللغة الافتراضية إذا لم تكن هناك لغة في عنوان URL عندما تكون prefixDefault صحيحة
539
+ if (selectedLocale === defaultLocale && !locale && prefixDefault) {
540
+ return <Navigate replace to={defaultLocale} />;
541
+ }
542
+
543
+ // إعادة التوجيه إلى اللغة المختارة إذا كانت اللغة في عنوان URL لا تطابق اللغة المختارة
544
+ if (selectedLocale !== defaultLocale && !locale) {
545
+ return <Navigate replace to={selectedLocale} />;
546
+ }
547
+
548
+ return (
549
+ <IntlayerProvider locale={locale}>
550
+ <Outlet />
551
+ </IntlayerProvider>
552
+ );
553
+ }
554
+ ```
555
+
556
+ ## النشر في بيئة الإنتاج
557
+
558
+ عند نشر تطبيقك:
559
+
560
+ 1. **قم ببناء تطبيقك:**
561
+
562
+ ```bash
563
+ npm run build
564
+ ```
565
+
566
+ 2. **قم ببناء قواميس Intlayer:**
567
+
568
+ ```bash
569
+ npm run intlayer:build
570
+ ```
571
+
572
+ 3. **انقل `vite-intlayer` إلى التبعيات** إذا كنت تستخدم الوسيط (middleware) في الإنتاج:
573
+ ```bash
574
+ npm install vite-intlayer --save
575
+ ```
576
+
577
+ سيصبح تطبيقك الآن يدعم:
578
+
579
+ - **هيكلية URL**: `/en`، `/en/about`، `/tr`، `/tr/about`
580
+ - **الكشف التلقائي عن اللغة** بناءً على تفضيلات المتصفح
581
+ - **التوجيه المدرك للغة** باستخدام Tanstack Start
582
+ - **دعم TypeScript** مع أنواع مولدة تلقائيًا
583
+ - **التصيير على جانب الخادم** مع التعامل الصحيح مع اللغة
584
+
438
585
  ## امتداد VS Code
439
586
 
440
- - **امتداد Intlayer لـ VS Code** الإكمال التلقائي، الأخطاء، المعاينات المضمنة، الإجراءات السريعة.
441
- السوق: `intlayer.intlayer-vs-code-extension`
587
+ لتحسين تجربة التطوير الخاصة بك مع Intlayer، يمكنك تثبيت **امتداد Intlayer الرسمي لـ VS Code**.
588
+
589
+ [التثبيت من سوق VS Code](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
590
+
591
+ يوفر هذا الامتداد:
592
+
593
+ - **الإكمال التلقائي** لمفاتيح الترجمة.
594
+ - **الكشف الفوري عن الأخطاء** للترجمات المفقودة.
595
+ - **معاينات داخلية** للمحتوى المترجم.
596
+ - **إجراءات سريعة** لإنشاء وتحديث الترجمات بسهولة.
597
+
598
+ لمزيد من التفاصيل حول كيفية استخدام الامتداد، راجع [توثيق امتداد Intlayer لـ VS Code](https://intlayer.org/doc/vs-code-extension).
442
599
 
443
600
  ---
444
601
 
445
602
  ## التقدم أكثر
446
603
 
447
- - المحرر المرئي
448
- - وضع CMS
449
- - اكتشاف اللغة على الحافة / المحولات
604
+ للمضي قدمًا، يمكنك تنفيذ [المحرر المرئي](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/intlayer_visual_editor.md) أو إخراج محتواك باستخدام [نظام إدارة المحتوى (CMS)](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/intlayer_CMS.md).
450
605
 
451
606
  ---
452
607
 
608
+ ## مراجع التوثيق
609
+
610
+ - [توثيق Intlayer](https://intlayer.org)
611
+ - [توثيق Tanstack Start](https://reactrouter.com/)
612
+ - [هوك useIntlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/packages/react-intlayer/useIntlayer.md)
613
+ - [هوك useLocale](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/packages/react-intlayer/useLocale.md)
614
+ - [إعلان المحتوى](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/dictionary/get_started.md)
615
+ - [التكوين](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/configuration.md)
616
+
617
+ يوفر هذا الدليل الشامل كل ما تحتاجه لدمج Intlayer مع Tanstack Start لتطبيق معرب بالكامل مع توجيه واعٍ للغة ودعم TypeScript.
618
+
453
619
  ## تاريخ الوثيقة
454
620
 
455
- | الإصدار | التاريخ | التغييرات |
456
- | ------- | ---------- | ------------------------------ |
457
- | 1.0.0 | 2025-08-11 | تمت إضافة تكييف TanStack Start |
621
+ | الإصدار | التاريخ | التغييرات |
622
+ | ------- | ---------- | ---------------------- |
623
+ | 5.8.1 | 2025-09-09 | أضيف لـ Tanstack Start |