@intlayer/docs 7.5.11 → 7.5.13

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 (417) hide show
  1. package/blog/ar/intlayer_with_i18next.md +0 -2
  2. package/blog/ar/intlayer_with_next-i18next.md +0 -2
  3. package/blog/ar/intlayer_with_react-i18next.md +0 -2
  4. package/blog/de/intlayer_with_i18next.md +0 -45
  5. package/blog/de/intlayer_with_next-i18next.md +0 -46
  6. package/blog/de/intlayer_with_react-i18next.md +0 -2
  7. package/blog/en/intlayer_with_i18next.md +0 -46
  8. package/blog/en/intlayer_with_next-i18next.md +0 -48
  9. package/blog/en/intlayer_with_next-intl.md +0 -44
  10. package/blog/en/intlayer_with_react-i18next.md +0 -44
  11. package/blog/en/intlayer_with_react-intl.md +0 -42
  12. package/blog/en/intlayer_with_vue-i18n.md +0 -44
  13. package/blog/en-GB/intlayer_with_i18next.md +0 -45
  14. package/blog/en-GB/intlayer_with_next-i18next.md +0 -47
  15. package/blog/en-GB/intlayer_with_next-intl.md +0 -42
  16. package/blog/en-GB/intlayer_with_react-i18next.md +0 -43
  17. package/blog/en-GB/intlayer_with_react-intl.md +0 -42
  18. package/blog/en-GB/intlayer_with_vue-i18n.md +0 -46
  19. package/blog/es/intlayer_with_i18next.md +0 -45
  20. package/blog/es/intlayer_with_next-i18next.md +0 -47
  21. package/blog/es/intlayer_with_next-intl.md +0 -42
  22. package/blog/es/intlayer_with_react-i18next.md +0 -43
  23. package/blog/es/intlayer_with_react-intl.md +0 -42
  24. package/blog/es/intlayer_with_vue-i18n.md +0 -46
  25. package/blog/fr/intlayer_with_i18next.md +0 -45
  26. package/blog/fr/intlayer_with_next-i18next.md +0 -47
  27. package/blog/fr/intlayer_with_next-intl.md +0 -42
  28. package/blog/fr/intlayer_with_react-i18next.md +0 -43
  29. package/blog/fr/intlayer_with_react-intl.md +0 -42
  30. package/blog/fr/intlayer_with_vue-i18n.md +0 -46
  31. package/blog/hi/intlayer_with_i18next.md +0 -2
  32. package/blog/hi/intlayer_with_next-i18next.md +0 -2
  33. package/blog/hi/intlayer_with_react-i18next.md +0 -2
  34. package/blog/id/intlayer_with_i18next.md +0 -2
  35. package/blog/id/intlayer_with_next-i18next.md +0 -2
  36. package/blog/id/intlayer_with_react-i18next.md +0 -2
  37. package/blog/it/intlayer_with_i18next.md +0 -2
  38. package/blog/it/intlayer_with_next-i18next.md +0 -2
  39. package/blog/it/intlayer_with_react-i18next.md +0 -2
  40. package/blog/ja/intlayer_with_i18next.md +0 -45
  41. package/blog/ja/intlayer_with_next-i18next.md +0 -46
  42. package/blog/ja/intlayer_with_next-intl.md +0 -42
  43. package/blog/ja/intlayer_with_react-i18next.md +0 -42
  44. package/blog/ja/intlayer_with_react-intl.md +0 -42
  45. package/blog/ja/intlayer_with_vue-i18n.md +0 -46
  46. package/blog/ko/intlayer_with_i18next.md +0 -2
  47. package/blog/ko/intlayer_with_next-i18next.md +0 -2
  48. package/blog/ko/intlayer_with_react-i18next.md +0 -1
  49. package/blog/pl/intlayer_with_i18next.md +0 -45
  50. package/blog/pl/intlayer_with_next-i18next.md +0 -46
  51. package/blog/pl/intlayer_with_next-intl.md +0 -42
  52. package/blog/pl/intlayer_with_react-i18next.md +0 -43
  53. package/blog/pl/intlayer_with_react-intl.md +0 -42
  54. package/blog/pl/intlayer_with_vue-i18n.md +0 -46
  55. package/blog/pt/intlayer_with_i18next.md +0 -2
  56. package/blog/pt/intlayer_with_next-i18next.md +0 -2
  57. package/blog/pt/intlayer_with_react-i18next.md +0 -2
  58. package/blog/ru/intlayer_with_i18next.md +0 -45
  59. package/blog/ru/intlayer_with_next-i18next.md +0 -47
  60. package/blog/ru/intlayer_with_next-intl.md +0 -42
  61. package/blog/ru/intlayer_with_react-i18next.md +0 -43
  62. package/blog/ru/intlayer_with_react-intl.md +0 -42
  63. package/blog/ru/intlayer_with_vue-i18n.md +0 -46
  64. package/blog/tr/intlayer_with_i18next.md +0 -2
  65. package/blog/tr/intlayer_with_next-i18next.md +0 -1
  66. package/blog/tr/intlayer_with_react-i18next.md +0 -2
  67. package/blog/uk/compiler_vs_declarative_i18n.md +224 -0
  68. package/blog/uk/i18n_using_next-i18next.md +1086 -0
  69. package/blog/uk/i18n_using_next-intl.md +760 -0
  70. package/blog/uk/index.md +69 -0
  71. package/blog/uk/internationalization_and_SEO.md +273 -0
  72. package/blog/uk/intlayer_with_i18next.md +211 -0
  73. package/blog/uk/intlayer_with_next-i18next.md +202 -0
  74. package/blog/uk/intlayer_with_next-intl.md +203 -0
  75. package/blog/uk/intlayer_with_react-i18next.md +200 -0
  76. package/blog/uk/intlayer_with_react-intl.md +202 -0
  77. package/blog/uk/intlayer_with_vue-i18n.md +206 -0
  78. package/blog/uk/l10n_platform_alternative/Lokalise.md +80 -0
  79. package/blog/uk/l10n_platform_alternative/crowdin.md +80 -0
  80. package/blog/uk/l10n_platform_alternative/phrase.md +78 -0
  81. package/blog/uk/list_i18n_technologies/CMS/drupal.md +143 -0
  82. package/blog/uk/list_i18n_technologies/CMS/wix.md +167 -0
  83. package/blog/uk/list_i18n_technologies/CMS/wordpress.md +189 -0
  84. package/blog/uk/list_i18n_technologies/frameworks/angular.md +125 -0
  85. package/blog/uk/list_i18n_technologies/frameworks/flutter.md +128 -0
  86. package/blog/uk/list_i18n_technologies/frameworks/react-native.md +217 -0
  87. package/blog/uk/list_i18n_technologies/frameworks/react.md +155 -0
  88. package/blog/uk/list_i18n_technologies/frameworks/svelte.md +145 -0
  89. package/blog/uk/list_i18n_technologies/frameworks/vue.md +144 -0
  90. package/blog/uk/next-i18next_vs_next-intl_vs_intlayer.md +1499 -0
  91. package/blog/uk/nextjs-multilingual-seo-comparison.md +360 -0
  92. package/blog/uk/rag_powered_documentation_assistant.md +288 -0
  93. package/blog/uk/react-i18next_vs_react-intl_vs_intlayer.md +164 -0
  94. package/blog/uk/vue-i18n_vs_intlayer.md +279 -0
  95. package/blog/uk/what_is_internationalization.md +167 -0
  96. package/blog/vi/intlayer_with_i18next.md +0 -2
  97. package/blog/vi/intlayer_with_next-i18next.md +0 -2
  98. package/blog/vi/intlayer_with_react-i18next.md +0 -2
  99. package/blog/zh/intlayer_with_i18next.md +0 -2
  100. package/blog/zh/intlayer_with_next-i18next.md +0 -2
  101. package/blog/zh/intlayer_with_react-i18next.md +0 -2
  102. package/blog/zh/intlayer_with_vue-i18n.md +0 -46
  103. package/dist/cjs/generated/blog.entry.cjs +58 -29
  104. package/dist/cjs/generated/blog.entry.cjs.map +1 -1
  105. package/dist/cjs/generated/docs.entry.cjs +218 -99
  106. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  107. package/dist/cjs/generated/frequentQuestions.entry.cjs +50 -15
  108. package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
  109. package/dist/cjs/generated/legal.entry.cjs +4 -2
  110. package/dist/cjs/generated/legal.entry.cjs.map +1 -1
  111. package/dist/esm/generated/blog.entry.mjs +58 -29
  112. package/dist/esm/generated/blog.entry.mjs.map +1 -1
  113. package/dist/esm/generated/docs.entry.mjs +218 -99
  114. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  115. package/dist/esm/generated/frequentQuestions.entry.mjs +50 -15
  116. package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
  117. package/dist/esm/generated/legal.entry.mjs +4 -2
  118. package/dist/esm/generated/legal.entry.mjs.map +1 -1
  119. package/dist/types/generated/blog.entry.d.ts.map +1 -1
  120. package/dist/types/generated/docs.entry.d.ts +1 -0
  121. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  122. package/dist/types/generated/frequentQuestions.entry.d.ts +1 -0
  123. package/dist/types/generated/frequentQuestions.entry.d.ts.map +1 -1
  124. package/dist/types/generated/legal.entry.d.ts.map +1 -1
  125. package/docs/ar/configuration.md +6 -1
  126. package/docs/ar/dictionary/content_file.md +6 -1
  127. package/docs/ar/intlayer_with_next-i18next.md +0 -1
  128. package/docs/ar/intlayer_with_nextjs_14.md +28 -0
  129. package/docs/ar/intlayer_with_nextjs_15.md +28 -0
  130. package/docs/ar/intlayer_with_nextjs_16.md +28 -0
  131. package/docs/ar/intlayer_with_nextjs_no_locale_path.md +1159 -0
  132. package/docs/ar/plugins/sync-json.md +6 -2
  133. package/docs/de/configuration.md +6 -1
  134. package/docs/de/dictionary/content_file.md +6 -1
  135. package/docs/de/intlayer_with_next-i18next.md +0 -1
  136. package/docs/de/intlayer_with_nextjs_14.md +28 -0
  137. package/docs/de/intlayer_with_nextjs_15.md +28 -0
  138. package/docs/de/intlayer_with_nextjs_16.md +28 -0
  139. package/docs/de/intlayer_with_nextjs_no_locale_path.md +1152 -0
  140. package/docs/de/plugins/sync-json.md +6 -2
  141. package/docs/en/configuration.md +6 -1
  142. package/docs/en/dictionary/content_file.md +6 -1
  143. package/docs/en/intlayer_with_next-i18next.md +0 -1
  144. package/docs/en/intlayer_with_nextjs_14.md +28 -0
  145. package/docs/en/intlayer_with_nextjs_15.md +28 -0
  146. package/docs/en/intlayer_with_nextjs_16.md +31 -1
  147. package/docs/en/intlayer_with_nextjs_no_locale_path.md +1132 -0
  148. package/docs/en/plugins/sync-json.md +6 -2
  149. package/docs/en-GB/configuration.md +6 -1
  150. package/docs/en-GB/dictionary/content_file.md +3 -1
  151. package/docs/en-GB/intlayer_with_next-i18next.md +0 -1
  152. package/docs/en-GB/intlayer_with_nextjs_14.md +28 -0
  153. package/docs/en-GB/intlayer_with_nextjs_15.md +28 -0
  154. package/docs/en-GB/intlayer_with_nextjs_16.md +28 -0
  155. package/docs/en-GB/intlayer_with_nextjs_no_locale_path.md +1154 -0
  156. package/docs/en-GB/plugins/sync-json.md +6 -2
  157. package/docs/es/configuration.md +6 -1
  158. package/docs/es/dictionary/content_file.md +6 -1
  159. package/docs/es/intlayer_with_next-i18next.md +0 -1
  160. package/docs/es/intlayer_with_nextjs_14.md +28 -0
  161. package/docs/es/intlayer_with_nextjs_15.md +28 -0
  162. package/docs/es/intlayer_with_nextjs_16.md +28 -0
  163. package/docs/es/intlayer_with_nextjs_no_locale_path.md +1143 -0
  164. package/docs/es/plugins/sync-json.md +6 -2
  165. package/docs/fr/configuration.md +6 -1
  166. package/docs/fr/dictionary/content_file.md +3 -1
  167. package/docs/fr/intlayer_with_next-i18next.md +0 -1
  168. package/docs/fr/intlayer_with_nextjs_14.md +28 -0
  169. package/docs/fr/intlayer_with_nextjs_15.md +28 -0
  170. package/docs/fr/intlayer_with_nextjs_16.md +28 -0
  171. package/docs/fr/intlayer_with_nextjs_no_locale_path.md +1174 -0
  172. package/docs/fr/plugins/sync-json.md +9 -5
  173. package/docs/hi/configuration.md +6 -1
  174. package/docs/hi/dictionary/content_file.md +3 -1
  175. package/docs/hi/intlayer_with_next-i18next.md +0 -1
  176. package/docs/hi/intlayer_with_nextjs_14.md +28 -0
  177. package/docs/hi/intlayer_with_nextjs_15.md +28 -0
  178. package/docs/hi/intlayer_with_nextjs_16.md +28 -0
  179. package/docs/hi/intlayer_with_nextjs_no_locale_path.md +1151 -0
  180. package/docs/hi/plugins/sync-json.md +6 -2
  181. package/docs/id/configuration.md +6 -1
  182. package/docs/id/dictionary/content_file.md +3 -1
  183. package/docs/id/intlayer_with_next-i18next.md +0 -1
  184. package/docs/id/intlayer_with_nextjs_14.md +28 -0
  185. package/docs/id/intlayer_with_nextjs_15.md +28 -0
  186. package/docs/id/intlayer_with_nextjs_16.md +28 -0
  187. package/docs/id/intlayer_with_nextjs_no_locale_path.md +1154 -0
  188. package/docs/id/plugins/sync-json.md +6 -2
  189. package/docs/it/configuration.md +6 -1
  190. package/docs/it/dictionary/content_file.md +3 -1
  191. package/docs/it/intlayer_with_next-i18next.md +0 -1
  192. package/docs/it/intlayer_with_nextjs_14.md +28 -0
  193. package/docs/it/intlayer_with_nextjs_15.md +28 -0
  194. package/docs/it/intlayer_with_nextjs_16.md +28 -0
  195. package/docs/it/intlayer_with_nextjs_no_locale_path.md +1148 -0
  196. package/docs/it/plugins/sync-json.md +6 -2
  197. package/docs/ja/configuration.md +6 -1
  198. package/docs/ja/dictionary/content_file.md +3 -1
  199. package/docs/ja/intlayer_with_next-i18next.md +0 -1
  200. package/docs/ja/intlayer_with_nextjs_14.md +28 -0
  201. package/docs/ja/intlayer_with_nextjs_15.md +28 -0
  202. package/docs/ja/intlayer_with_nextjs_16.md +28 -0
  203. package/docs/ja/intlayer_with_nextjs_no_locale_path.md +1222 -0
  204. package/docs/ja/plugins/sync-json.md +6 -2
  205. package/docs/ko/configuration.md +6 -1
  206. package/docs/ko/dictionary/content_file.md +3 -1
  207. package/docs/ko/intlayer_with_next-i18next.md +0 -1
  208. package/docs/ko/intlayer_with_nextjs_14.md +28 -0
  209. package/docs/ko/intlayer_with_nextjs_15.md +28 -0
  210. package/docs/ko/intlayer_with_nextjs_16.md +28 -0
  211. package/docs/ko/intlayer_with_nextjs_no_locale_path.md +1205 -0
  212. package/docs/ko/plugins/sync-json.md +6 -2
  213. package/docs/pl/configuration.md +3 -1
  214. package/docs/pl/dictionary/content_file.md +3 -1
  215. package/docs/pl/intlayer_with_next-i18next.md +0 -1
  216. package/docs/pl/intlayer_with_nextjs_14.md +28 -0
  217. package/docs/pl/intlayer_with_nextjs_15.md +28 -0
  218. package/docs/pl/intlayer_with_nextjs_16.md +28 -0
  219. package/docs/pl/intlayer_with_nextjs_no_locale_path.md +1149 -0
  220. package/docs/pl/plugins/sync-json.md +6 -2
  221. package/docs/pt/configuration.md +6 -1
  222. package/docs/pt/dictionary/content_file.md +3 -1
  223. package/docs/pt/intlayer_with_next-i18next.md +0 -1
  224. package/docs/pt/intlayer_with_nextjs_14.md +28 -0
  225. package/docs/pt/intlayer_with_nextjs_15.md +28 -0
  226. package/docs/pt/intlayer_with_nextjs_16.md +28 -0
  227. package/docs/pt/intlayer_with_nextjs_no_locale_path.md +1152 -0
  228. package/docs/pt/plugins/sync-json.md +6 -2
  229. package/docs/ru/configuration.md +6 -1
  230. package/docs/ru/dictionary/content_file.md +6 -1
  231. package/docs/ru/intlayer_with_next-i18next.md +0 -1
  232. package/docs/ru/intlayer_with_nextjs_14.md +28 -0
  233. package/docs/ru/intlayer_with_nextjs_15.md +28 -0
  234. package/docs/ru/intlayer_with_nextjs_16.md +28 -0
  235. package/docs/ru/intlayer_with_nextjs_no_locale_path.md +1204 -0
  236. package/docs/ru/plugins/sync-json.md +6 -2
  237. package/docs/tr/configuration.md +6 -1
  238. package/docs/tr/dictionary/content_file.md +3 -1
  239. package/docs/tr/intlayer_with_next-i18next.md +0 -1
  240. package/docs/tr/intlayer_with_nextjs_14.md +28 -0
  241. package/docs/tr/intlayer_with_nextjs_15.md +28 -0
  242. package/docs/tr/intlayer_with_nextjs_16.md +28 -0
  243. package/docs/tr/intlayer_with_nextjs_no_locale_path.md +1159 -0
  244. package/docs/tr/plugins/sync-json.md +6 -2
  245. package/docs/uk/CI_CD.md +198 -0
  246. package/docs/uk/autoFill.md +307 -0
  247. package/docs/uk/bundle_optimization.md +185 -0
  248. package/docs/uk/cli/build.md +64 -0
  249. package/docs/uk/cli/ci.md +137 -0
  250. package/docs/uk/cli/configuration.md +63 -0
  251. package/docs/uk/cli/debug.md +46 -0
  252. package/docs/uk/cli/doc-review.md +43 -0
  253. package/docs/uk/cli/doc-translate.md +132 -0
  254. package/docs/uk/cli/editor.md +28 -0
  255. package/docs/uk/cli/fill.md +130 -0
  256. package/docs/uk/cli/index.md +190 -0
  257. package/docs/uk/cli/init.md +84 -0
  258. package/docs/uk/cli/list.md +90 -0
  259. package/docs/uk/cli/list_projects.md +128 -0
  260. package/docs/uk/cli/live.md +41 -0
  261. package/docs/uk/cli/login.md +157 -0
  262. package/docs/uk/cli/pull.md +78 -0
  263. package/docs/uk/cli/push.md +98 -0
  264. package/docs/uk/cli/sdk.md +71 -0
  265. package/docs/uk/cli/test.md +76 -0
  266. package/docs/uk/cli/transform.md +65 -0
  267. package/docs/uk/cli/version.md +24 -0
  268. package/docs/uk/cli/watch.md +37 -0
  269. package/docs/uk/compiler.md +133 -0
  270. package/docs/uk/component_i18n.md +194 -0
  271. package/docs/uk/configuration.md +742 -0
  272. package/docs/uk/dictionary/condition.md +237 -0
  273. package/docs/uk/dictionary/content_file.md +1134 -0
  274. package/docs/uk/dictionary/enumeration.md +245 -0
  275. package/docs/uk/dictionary/file.md +232 -0
  276. package/docs/uk/dictionary/function_fetching.md +212 -0
  277. package/docs/uk/dictionary/gender.md +273 -0
  278. package/docs/uk/dictionary/insertion.md +187 -0
  279. package/docs/uk/dictionary/markdown.md +383 -0
  280. package/docs/uk/dictionary/nesting.md +273 -0
  281. package/docs/uk/dictionary/translation.md +332 -0
  282. package/docs/uk/formatters.md +595 -0
  283. package/docs/uk/how_works_intlayer.md +256 -0
  284. package/docs/uk/index.md +175 -0
  285. package/docs/uk/interest_of_intlayer.md +297 -0
  286. package/docs/uk/intlayer_CMS.md +569 -0
  287. package/docs/uk/intlayer_visual_editor.md +292 -0
  288. package/docs/uk/intlayer_with_angular.md +710 -0
  289. package/docs/uk/intlayer_with_astro.md +256 -0
  290. package/docs/uk/intlayer_with_create_react_app.md +1258 -0
  291. package/docs/uk/intlayer_with_express.md +429 -0
  292. package/docs/uk/intlayer_with_fastify.md +446 -0
  293. package/docs/uk/intlayer_with_lynx+react.md +548 -0
  294. package/docs/uk/intlayer_with_nestjs.md +283 -0
  295. package/docs/uk/intlayer_with_next-i18next.md +640 -0
  296. package/docs/uk/intlayer_with_next-intl.md +456 -0
  297. package/docs/uk/intlayer_with_nextjs_14.md +1646 -0
  298. package/docs/uk/intlayer_with_nextjs_15.md +1910 -0
  299. package/docs/uk/intlayer_with_nextjs_16.md +1763 -0
  300. package/docs/uk/intlayer_with_nextjs_no_locale_path.md +1159 -0
  301. package/docs/uk/intlayer_with_nextjs_page_router.md +1541 -0
  302. package/docs/uk/intlayer_with_nuxt.md +711 -0
  303. package/docs/uk/intlayer_with_react_native+expo.md +715 -0
  304. package/docs/uk/intlayer_with_react_router_v7.md +600 -0
  305. package/docs/uk/intlayer_with_react_router_v7_fs_routes.md +669 -0
  306. package/docs/uk/intlayer_with_svelte_kit.md +579 -0
  307. package/docs/uk/intlayer_with_tanstack.md +818 -0
  308. package/docs/uk/intlayer_with_vite+preact.md +1748 -0
  309. package/docs/uk/intlayer_with_vite+react.md +1449 -0
  310. package/docs/uk/intlayer_with_vite+solid.md +302 -0
  311. package/docs/uk/intlayer_with_vite+svelte.md +520 -0
  312. package/docs/uk/intlayer_with_vite+vue.md +1113 -0
  313. package/docs/uk/introduction.md +222 -0
  314. package/docs/uk/locale_mapper.md +242 -0
  315. package/docs/uk/mcp_server.md +211 -0
  316. package/docs/uk/packages/express-intlayer/t.md +465 -0
  317. package/docs/uk/packages/intlayer/getConfiguration.md +145 -0
  318. package/docs/uk/packages/intlayer/getEnumeration.md +159 -0
  319. package/docs/uk/packages/intlayer/getHTMLTextDir.md +121 -0
  320. package/docs/uk/packages/intlayer/getLocaleLang.md +81 -0
  321. package/docs/uk/packages/intlayer/getLocaleName.md +135 -0
  322. package/docs/uk/packages/intlayer/getLocalizedUrl.md +338 -0
  323. package/docs/uk/packages/intlayer/getMultilingualUrls.md +359 -0
  324. package/docs/uk/packages/intlayer/getPathWithoutLocale.md +75 -0
  325. package/docs/uk/packages/intlayer/getPrefix.md +213 -0
  326. package/docs/uk/packages/intlayer/getTranslation.md +190 -0
  327. package/docs/uk/packages/intlayer/getTranslationContent.md +189 -0
  328. package/docs/uk/packages/next-intlayer/t.md +365 -0
  329. package/docs/uk/packages/next-intlayer/useDictionary.md +276 -0
  330. package/docs/uk/packages/next-intlayer/useIntlayer.md +263 -0
  331. package/docs/uk/packages/next-intlayer/useLocale.md +166 -0
  332. package/docs/uk/packages/react-intlayer/t.md +311 -0
  333. package/docs/uk/packages/react-intlayer/useDictionary.md +295 -0
  334. package/docs/uk/packages/react-intlayer/useI18n.md +250 -0
  335. package/docs/uk/packages/react-intlayer/useIntlayer.md +251 -0
  336. package/docs/uk/packages/react-intlayer/useLocale.md +210 -0
  337. package/docs/uk/per_locale_file.md +345 -0
  338. package/docs/uk/plugins/sync-json.md +398 -0
  339. package/docs/uk/readme.md +265 -0
  340. package/docs/uk/releases/v6.md +305 -0
  341. package/docs/uk/releases/v7.md +624 -0
  342. package/docs/uk/roadmap.md +346 -0
  343. package/docs/uk/testing.md +204 -0
  344. package/docs/uk/vs_code_extension.md +133 -0
  345. package/docs/vi/configuration.md +6 -1
  346. package/docs/vi/dictionary/content_file.md +6 -1
  347. package/docs/vi/intlayer_with_next-i18next.md +0 -1
  348. package/docs/vi/intlayer_with_nextjs_14.md +28 -0
  349. package/docs/vi/intlayer_with_nextjs_15.md +28 -0
  350. package/docs/vi/intlayer_with_nextjs_16.md +28 -0
  351. package/docs/vi/intlayer_with_nextjs_no_locale_path.md +1151 -0
  352. package/docs/vi/plugins/sync-json.md +6 -2
  353. package/docs/zh/configuration.md +6 -1
  354. package/docs/zh/dictionary/content_file.md +6 -1
  355. package/docs/zh/intlayer_with_next-i18next.md +0 -1
  356. package/docs/zh/intlayer_with_nextjs_14.md +28 -0
  357. package/docs/zh/intlayer_with_nextjs_15.md +28 -0
  358. package/docs/zh/intlayer_with_nextjs_16.md +28 -0
  359. package/docs/zh/intlayer_with_nextjs_no_locale_path.md +1206 -0
  360. package/docs/zh/plugins/sync-json.md +9 -5
  361. package/frequent_questions/ar/SSR_Next_no_[locale].md +1 -1
  362. package/frequent_questions/ar/error-vite-env-only.md +77 -0
  363. package/frequent_questions/de/SSR_Next_no_[locale].md +1 -1
  364. package/frequent_questions/de/error-vite-env-only.md +77 -0
  365. package/frequent_questions/en/SSR_Next_no_[locale].md +1 -1
  366. package/frequent_questions/en/error-vite-env-only.md +77 -0
  367. package/frequent_questions/en-GB/SSR_Next_no_[locale].md +1 -1
  368. package/frequent_questions/en-GB/error-vite-env-only.md +77 -0
  369. package/frequent_questions/es/SSR_Next_no_[locale].md +1 -1
  370. package/frequent_questions/es/error-vite-env-only.md +76 -0
  371. package/frequent_questions/fr/SSR_Next_no_[locale].md +1 -1
  372. package/frequent_questions/fr/error-vite-env-only.md +77 -0
  373. package/frequent_questions/hi/SSR_Next_no_[locale].md +1 -1
  374. package/frequent_questions/hi/error-vite-env-only.md +77 -0
  375. package/frequent_questions/id/SSR_Next_no_[locale].md +1 -1
  376. package/frequent_questions/id/error-vite-env-only.md +77 -0
  377. package/frequent_questions/it/SSR_Next_no_[locale].md +1 -1
  378. package/frequent_questions/it/error-vite-env-only.md +77 -0
  379. package/frequent_questions/ja/SSR_Next_no_[locale].md +1 -1
  380. package/frequent_questions/ja/error-vite-env-only.md +77 -0
  381. package/frequent_questions/ko/SSR_Next_no_[locale].md +1 -1
  382. package/frequent_questions/ko/error-vite-env-only.md +77 -0
  383. package/frequent_questions/pl/SSR_Next_no_[locale].md +1 -1
  384. package/frequent_questions/pl/error-vite-env-only.md +77 -0
  385. package/frequent_questions/pt/SSR_Next_no_[locale].md +1 -1
  386. package/frequent_questions/pt/error-vite-env-only.md +77 -0
  387. package/frequent_questions/ru/SSR_Next_no_[locale].md +1 -1
  388. package/frequent_questions/ru/error-vite-env-only.md +77 -0
  389. package/frequent_questions/tr/SSR_Next_no_[locale].md +1 -1
  390. package/frequent_questions/tr/error-vite-env-only.md +77 -0
  391. package/frequent_questions/uk/SSR_Next_no_[locale].md +104 -0
  392. package/frequent_questions/uk/array_as_content_declaration.md +72 -0
  393. package/frequent_questions/uk/build_dictionaries.md +58 -0
  394. package/frequent_questions/uk/build_error_CI_CD.md +74 -0
  395. package/frequent_questions/uk/bun_set_up.md +53 -0
  396. package/frequent_questions/uk/customized_locale_list.md +64 -0
  397. package/frequent_questions/uk/domain_routing.md +113 -0
  398. package/frequent_questions/uk/error-vite-env-only.md +77 -0
  399. package/frequent_questions/uk/esbuild_error.md +29 -0
  400. package/frequent_questions/uk/get_locale_cookie.md +142 -0
  401. package/frequent_questions/uk/intlayer_command_undefined.md +155 -0
  402. package/frequent_questions/uk/locale_incorect_in_url.md +73 -0
  403. package/frequent_questions/uk/package_version_error.md +181 -0
  404. package/frequent_questions/uk/static_rendering.md +44 -0
  405. package/frequent_questions/uk/translated_path_url.md +55 -0
  406. package/frequent_questions/uk/unknown_command.md +97 -0
  407. package/frequent_questions/vi/SSR_Next_no_[locale].md +1 -1
  408. package/frequent_questions/vi/error-vite-env-only.md +77 -0
  409. package/frequent_questions/zh/SSR_Next_no_[locale].md +1 -1
  410. package/frequent_questions/zh/error-vite-env-only.md +77 -0
  411. package/legal/uk/privacy_notice.md +83 -0
  412. package/legal/uk/terms_of_service.md +55 -0
  413. package/package.json +6 -6
  414. package/src/generated/blog.entry.ts +29 -0
  415. package/src/generated/docs.entry.ts +119 -0
  416. package/src/generated/frequentQuestions.entry.ts +35 -0
  417. package/src/generated/legal.entry.ts +2 -0
@@ -0,0 +1,818 @@
1
+ ---
2
+ createdAt: 2025-09-09
3
+ updatedAt: 2025-12-30
4
+ title: Як перекласти ваш застосунок Tanstack Start — посібник з i18n 2026
5
+ description: Дізнайтеся, як додати інтернаціоналізацію (i18n) до вашого застосунку Tanstack Start за допомогою Intlayer. Дотримуйтесь цього вичерпного посібника, щоб зробити ваш додаток багатомовним із маршрутизацією з урахуванням локалі.
6
+ keywords:
7
+ - Інтернаціоналізація
8
+ - Документація
9
+ - Intlayer
10
+ - Tanstack Start
11
+ - React
12
+ - i18n
13
+ - TypeScript
14
+ - Локалізована маршрутизація
15
+ slugs:
16
+ - doc
17
+ - environment
18
+ - tanstack-start
19
+ applicationTemplate: https://github.com/aymericzip/intlayer-tanstack-start-template
20
+ youtubeVideo: https://www.youtube.com/watch?v=_XTdKVWaeqg
21
+ history:
22
+ - version: 7.5.9
23
+ date: 2025-12-30
24
+ changes: Додано команду init
25
+ - version: 7.4.0
26
+ date: 2025-12-11
27
+ changes: Представлено validatePrefix та додано крок 14: Обробка сторінок 404 з локалізованими маршрутами.
28
+ - version: 7.3.9
29
+ date: 2025-12-05
30
+ changes: Додано крок 13: Отримання локалі у server actions (необов'язково)
31
+ - version: 7.2.3
32
+ date: 2025-11-18
33
+ changes: Додано крок 13: Адаптувати Nitro
34
+ - version: 7.1.0
35
+ date: 2025-11-17
36
+ changes: Виправлено значення префікса за замовчуванням, додавши функцію getPrefix, useLocalizedNavigate, LocaleSwitcher та LocalizedLink.
37
+ - version: 6.5.2
38
+ date: 2025-10-03
39
+ changes: Оновлено документацію
40
+ - version: 5.8.1
41
+ date: 2025-09-09
42
+ changes: Додано для Tanstack Start
43
+ ---
44
+
45
+ # Перекладіть ваш вебсайт Tanstack Start за допомогою Intlayer | Інтернаціоналізація (i18n)
46
+
47
+ ## Зміст
48
+
49
+ <TOC/>
50
+
51
+ Цей посібник демонструє, як інтегрувати **Intlayer** для плавної інтернаціоналізації в проєктах Tanstack Start з маршрутизацією, що враховує локаль, підтримкою TypeScript та сучасними практиками розробки.
52
+
53
+ ## Що таке Intlayer?
54
+
55
+ **Intlayer** — інноваційна open-source бібліотека для інтернаціоналізації (i18n), призначена для спрощення підтримки кількох мов у сучасних вебзастосунках.
56
+
57
+ За допомогою Intlayer ви можете:
58
+
59
+ - **Легко керувати перекладами** за допомогою декларативних словників на рівні компонентів.
60
+ - **Динамічно локалізувати метадані**, маршрути та контент.
61
+ - **Забезпечити підтримку TypeScript** за допомогою автогенерованих типів, що покращує автозаповнення та виявлення помилок.
62
+ - **Скористатися розширеними можливостями**, такими як динамічне визначення локалі та її перемикання.
63
+ - **Увімкніть маршрутизацію з урахуванням локалі** за допомогою файлової системи маршрутизації Tanstack Start.
64
+
65
+ ---
66
+
67
+ ## Покроковий посібник з налаштування Intlayer у застосунку Tanstack Start
68
+
69
+ <Tab defaultTab="video">
70
+ <TabItem label="Відео" value="video">
71
+
72
+ <iframe title="Найкраще i18n-рішення для Tanstack Start? Дізнайтеся про 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/_XTdKVWaeqg?autoplay=0&amp;origin=http://intlayer.org&amp;controls=0&amp;rel=1"/>
73
+
74
+ </TabItem>
75
+ <TabItem label="Код" value="code">
76
+
77
+ <iframe
78
+ src="https://stackblitz.com/github/aymericzip/intlayer-tanstack-start-template?embed=1&ctl=1&file=intlayer.config.ts"
79
+ className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
80
+ title="Демо CodeSandbox — як інтернаціоналізувати ваш додаток за допомогою Intlayer"
81
+ sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
82
+ loading="lazy"
83
+ />
84
+
85
+ </TabItem>
86
+ </Tab>
87
+
88
+ Перегляньте [Шаблон додатка](https://github.com/aymericzip/intlayer-tanstack-start-template) на GitHub.
89
+
90
+ ### Крок 1: Створіть проект
91
+
92
+ Почніть зі створення нового проєкту TanStack Start, дотримуючись інструкції [Створення нового проєкту](https://tanstack.com/start/latest/docs/framework/react/quick-start) на сайті TanStack Start.
93
+
94
+ ### Крок 2: Встановіть пакети Intlayer
95
+
96
+ Встановіть необхідні пакети, використовуючи обраний менеджер пакетів:
97
+
98
+ ```bash packageManager="npm"
99
+ npm install intlayer react-intlayer
100
+ npm install vite-intlayer --save-dev
101
+ npx intlayer init
102
+ ```
103
+
104
+ ```bash packageManager="pnpm"
105
+ pnpm add intlayer react-intlayer
106
+ pnpm add vite-intlayer --save-dev
107
+ pnpm intlayer init
108
+ ```
109
+
110
+ ```bash packageManager="yarn"
111
+ yarn add intlayer react-intlayer
112
+ yarn add vite-intlayer --save-dev
113
+ yarn intlayer init
114
+ ```
115
+
116
+ ```bash packageManager="bun"
117
+ bun add intlayer react-intlayer
118
+ bun add vite-intlayer --dev
119
+ bunx intlayer init
120
+ ```
121
+
122
+ - **intlayer**
123
+
124
+ Основний пакет, який надає інструменти інтернаціоналізації для керування конфігурацією, перекладу, [оголошення контенту](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/dictionary/content_file.md), транспіляції та [команд CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/cli/index.md).
125
+
126
+ - **react-intlayer**
127
+ Пакет, який інтегрує Intlayer із React-застосунком. Надає провайдери контексту та хуки для інтернаціоналізації в React.
128
+
129
+ - **vite-intlayer**
130
+ Містить плагін Vite для інтеграції Intlayer з [бандлером Vite](https://vite.dev/guide/why.html#why-bundle-for-production), а також middleware для визначення пріоритетної локалі користувача, керування cookie та обробки перенаправлень URL.
131
+
132
+ ### Крок 3: Конфігурація вашого проєкту
133
+
134
+ Створіть файл конфігурації, щоб налаштувати мови вашого додатка:
135
+
136
+ ```typescript fileName="intlayer.config.ts"
137
+ import type { IntlayerConfig } from "intlayer";
138
+
139
+ import { Locales } from "intlayer";
140
+
141
+ const config: IntlayerConfig = {
142
+ internationalization: {
143
+ defaultLocale: Locales.ENGLISH,
144
+ locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
145
+ },
146
+ };
147
+
148
+ export default config;
149
+ ```
150
+
151
+ > За допомогою цього файлу конфігурації ви можете налаштувати локалізовані URL-адреси, перенаправлення через middleware, імена cookie, розташування та розширення декларацій контенту, вимкнути логування Intlayer у консолі та інше. Для повного переліку доступних параметрів див. [документацію з конфігурації](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/configuration.md).
152
+
153
+ ### Крок 4: Інтегруйте Intlayer у вашу конфігурацію Vite
154
+
155
+ Додайте плагін intlayer до вашої конфігурації:
156
+
157
+ ```typescript fileName="vite.config.ts"
158
+ import { tanstackStart } from "@tanstack/react-start/plugin/vite";
159
+ import viteReact from "@vitejs/plugin-react";
160
+ import { nitro } from "nitro/vite";
161
+ import { defineConfig } from "vite";
162
+ import { intlayer } from "vite-intlayer";
163
+ import viteTsConfigPaths from "vite-tsconfig-paths";
164
+
165
+ const config = defineConfig({
166
+ plugins: [
167
+ nitro(),
168
+ viteTsConfigPaths({
169
+ projects: ["./tsconfig.json"],
170
+ }),
171
+ tanstackStart(),
172
+ viteReact(),
173
+ intlayer(), // Додати плагін
174
+ ],
175
+ });
176
+
177
+ export default config;
178
+ ```
179
+
180
+ > Плагін Vite `intlayer()` використовується для інтеграції Intlayer з Vite. Він забезпечує побудову файлів декларацій контенту та відстежує їх у режимі розробки. Він визначає змінні середовища Intlayer у Vite-застосунку. Додатково він надає аліаси для оптимізації продуктивності.
181
+
182
+ ### Крок 5: Створіть компоненти Layout
183
+
184
+ Налаштуйте кореневий layout та layout-и для конкретних локалей:
185
+
186
+ #### Кореневий Layout
187
+
188
+ ```tsx fileName="src/routes/{-$locale}/route.tsx"
189
+ import { createFileRoute, Outlet } from "@tanstack/react-router";
190
+ import { IntlayerProvider, useLocale } from "react-intlayer";
191
+
192
+ import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes";
193
+
194
+ export const Route = createFileRoute("/{-$locale}")({
195
+ component: LayoutComponent,
196
+ });
197
+
198
+ function LayoutComponent() {
199
+ const { defaultLocale } = useLocale();
200
+ const { locale } = Route.useParams();
201
+
202
+ return (
203
+ <IntlayerProvider locale={locale ?? defaultLocale}>
204
+ <Outlet />
205
+ </IntlayerProvider>
206
+ );
207
+ }
208
+ ```
209
+
210
+ > Тут `{-$locale}` — динамічний параметр маршруту, який підставляється поточним локалем. Ця нотація робить слот необов'язковим, що дозволяє використовувати його з режимами маршрутизації, такими як `'prefix-no-default'` тощо.
211
+
212
+ > Зауважте, що цей слот може викликати проблеми, якщо ви використовуєте кілька динамічних сегментів в одному маршруті (наприклад, `/{-$locale}/other-path/$anotherDynamicPath/...`).
213
+ > У режимі `'prefix-all'` можливо краще змінити слот на `$locale`.
214
+ > У режимах `'no-prefix'` або `'search-params'` ви можете повністю видалити слот.
215
+
216
+ ### Крок 6: Оголосіть ваш контент
217
+
218
+ Створюйте й керуйте деклараціями контенту для зберігання перекладів:
219
+
220
+ ```tsx fileName="src/contents/page.content.ts"
221
+ import type { Dictionary } from "intlayer";
222
+
223
+ import { t } from "intlayer";
224
+
225
+ const appContent = {
226
+ content: {
227
+ links: {
228
+ about: t({
229
+ uk: "Про",
230
+ en: "About",
231
+ es: "Acerca de",
232
+ fr: "À propos",
233
+ }),
234
+ home: t({
235
+ uk: "Головна",
236
+ en: "Home",
237
+ es: "Inicio",
238
+ fr: "Accueil",
239
+ }),
240
+ },
241
+ meta: {
242
+ title: t({
243
+ uk: "Ласкаво просимо до Intlayer + TanStack Router",
244
+ en: "Welcome to Intlayer + TanStack Router",
245
+ es: "Bienvenido a Intlayer + TanStack Router",
246
+ fr: "Bienvenue à Intlayer + TanStack Router",
247
+ }),
248
+ description: t({
249
+ uk: "Це приклад використання Intlayer з TanStack Router",
250
+ en: "This is an example of using Intlayer with TanStack Router",
251
+ es: "Este es un ejemplo de uso de Intlayer con TanStack Router",
252
+ fr: "Ceci est un exemple d'utilisation d'Intlayer avec TanStack Router",
253
+ }),
254
+ },
255
+ },
256
+ key: "app",
257
+ } satisfies Dictionary;
258
+
259
+ export default appContent;
260
+ ```
261
+
262
+ > Оголошення вмісту можна визначати будь-де у вашому застосунку, за умови, що вони включені у директорію `contentDir` (за замовчуванням — `./app`) та відповідають розширенню файлу декларації вмісту (за замовчуванням — `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`).
263
+
264
+ > Для детальнішої інформації зверніться до [документації з оголошення вмісту](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/dictionary/content_file.md).
265
+
266
+ ### Крок 7: Створіть компоненти та хуки, що враховують локаль
267
+
268
+ Створіть компонент `LocalizedLink` для навігації з урахуванням локалі:
269
+
270
+ ```tsx fileName="src/components/localized-link.tsx"
271
+ import type { FC } from "react";
272
+
273
+ import { Link, type LinkComponentProps } from "@tanstack/react-router";
274
+ import { useLocale } from "react-intlayer";
275
+ import { getPrefix } from "intlayer";
276
+
277
+ export const LOCALE_ROUTE = "{-$locale}" as const;
278
+
279
+ // Основна утиліта
280
+ export type RemoveLocaleParam<T> = T extends string
281
+ ? RemoveLocaleFromString<T>
282
+ : T;
283
+
284
+ export type To = RemoveLocaleParam<LinkComponentProps["to"]>;
285
+
286
+ type CollapseDoubleSlashes<S extends string> =
287
+ S extends `${infer H}//${infer T}` ? CollapseDoubleSlashes<`${H}/${T}`> : S;
288
+
289
+ type LocalizedLinkProps = {
290
+ to?: To;
291
+ } & Omit<LinkComponentProps, "to">;
292
+
293
+ // Допоміжні типи
294
+ type RemoveAll<
295
+ S extends string,
296
+ Sub extends string,
297
+ > = S extends `${infer H}${Sub}${infer T}` ? RemoveAll<`${H}${T}`, Sub> : S;
298
+
299
+ type RemoveLocaleFromString<S extends string> = CollapseDoubleSlashes<
300
+ RemoveAll<S, typeof LOCALE_ROUTE>
301
+ >;
302
+
303
+ export const LocalizedLink: FC<LocalizedLinkProps> = (props) => {
304
+ const { locale } = useLocale();
305
+ const { localePrefix } = getPrefix(locale);
306
+
307
+ return (
308
+ <Link
309
+ {...props}
310
+ params={{
311
+ locale: localePrefix,
312
+ ...(typeof props?.params === "object" ? props?.params : {}),
313
+ }}
314
+ to={`/${LOCALE_ROUTE}${props.to}` as LinkComponentProps["to"]}
315
+ />
316
+ );
317
+ };
318
+ ```
319
+
320
+ Цей компонент має дві цілі:
321
+
322
+ - Видалити непотрібний префікс `{-$locale}` з URL.
323
+ - Вставити параметр локалі в URL, щоб користувач був безпосередньо перенаправлений на локалізований маршрут.
324
+
325
+ Потім ми можемо створити хук `useLocalizedNavigate` для програмної навігації:
326
+
327
+ ```tsx fileName="src/hooks/useLocalizedNavigate.tsx"
328
+ import { useNavigate } from "@tanstack/react-router";
329
+ import { getPrefix } from "intlayer";
330
+ import { useLocale } from "react-intlayer";
331
+ import { LOCALE_ROUTE } from "@/components/localized-link";
332
+ import type { FileRouteTypes } from "@/routeTree.gen";
333
+
334
+ type StripLocalePrefix<T extends string> = T extends
335
+ | `/${typeof LOCALE_ROUTE}`
336
+ | `/${typeof LOCALE_ROUTE}/`
337
+ ? "/"
338
+ : T extends `/${typeof LOCALE_ROUTE}/${infer Rest}`
339
+ ? `/${Rest}`
340
+ : never;
341
+
342
+ type LocalizedTo = StripLocalePrefix<FileRouteTypes["to"]>;
343
+
344
+ type LocalizedNavigate = {
345
+ (to: LocalizedTo): ReturnType<ReturnType<typeof useNavigate>>;
346
+ (
347
+ opts: { to: LocalizedTo } & Record<string, unknown>
348
+ ): ReturnType<ReturnType<typeof useNavigate>>;
349
+ };
350
+
351
+ export const useLocalizedNavigate = () => {
352
+ const navigate = useNavigate();
353
+
354
+ const { locale } = useLocale();
355
+
356
+ const localizedNavigate: LocalizedNavigate = (args: any) => {
357
+ const { localePrefix } = getPrefix(locale);
358
+
359
+ if (typeof args === "string") {
360
+ return navigate({
361
+ to: `/${LOCALE_ROUTE}${args}`,
362
+ params: { locale: localePrefix },
363
+ });
364
+ }
365
+
366
+ const { to, ...rest } = args;
367
+
368
+ const localizedTo = `/${LOCALE_ROUTE}${to}` as any;
369
+
370
+ return navigate({
371
+ to: localizedTo,
372
+ params: { locale: localePrefix, ...rest } as any,
373
+ });
374
+ };
375
+
376
+ return localizedNavigate;
377
+ };
378
+ ```
379
+
380
+ ### Крок 8: Використовуйте Intlayer на ваших сторінках
381
+
382
+ Отримуйте доступ до словників контенту по всьому застосунку:
383
+
384
+ #### Локалізована головна сторінка
385
+
386
+ ```tsx fileName="src/routes/{-$locale}/index.tsx"
387
+ import { createFileRoute } from "@tanstack/react-router";
388
+ import { getIntlayer } from "intlayer";
389
+ import { useIntlayer } from "react-intlayer";
390
+
391
+ import LocaleSwitcher from "@/components/locale-switcher";
392
+ import { LocalizedLink } from "@/components/localized-link";
393
+ import { useLocalizedNavigate } from "@/hooks/useLocalizedNavigate";
394
+
395
+ export const Route = createFileRoute("/{-$locale}/")({
396
+ component: RouteComponent,
397
+ head: ({ params }) => {
398
+ const { locale } = params;
399
+ const metaContent = getIntlayer("app", locale);
400
+
401
+ return {
402
+ meta: [
403
+ { title: metaContent.title },
404
+ { content: metaContent.meta.description, name: "description" },
405
+ ],
406
+ };
407
+ },
408
+ });
409
+
410
+ function RouteComponent() {
411
+ const content = useIntlayer("app");
412
+ const navigate = useLocalizedNavigate();
413
+
414
+ return (
415
+ <div>
416
+ <div>
417
+ {content.title}
418
+ <LocaleSwitcher />
419
+ <div>
420
+ <LocalizedLink to="/">{content.links.home}</LocalizedLink>
421
+ <LocalizedLink to="/about">{content.links.about}</LocalizedLink>
422
+ </div>
423
+ <div>
424
+ <button onClick={() => navigate({ to: "/" })}>
425
+ {content.links.home}
426
+ </button>
427
+ <button onClick={() => navigate({ to: "/about" })}>
428
+ {content.links.about}
429
+ </button>
430
+ </div>
431
+ </div>
432
+ </div>
433
+ );
434
+ }
435
+ ```
436
+
437
+ > Щоб дізнатися більше про хук `useIntlayer`, зверніться до [документації](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/packages/react-intlayer/useIntlayer.md).
438
+
439
+ ### Крок 9: Створіть компонент перемикача локалі
440
+
441
+ Створіть компонент, щоб дозволити користувачам змінювати мову:
442
+
443
+ ```tsx fileName="src/components/locale-switcher.tsx"
444
+ import { useLocation } from "@tanstack/react-router";
445
+ import {
446
+ getHTMLTextDir,
447
+ getLocaleName,
448
+ getPathWithoutLocale,
449
+ getPrefix,
450
+ Locales,
451
+ } from "intlayer";
452
+ import type { FC } from "react";
453
+ import { useLocale } from "react-intlayer";
454
+
455
+ import { LocalizedLink, type To } from "./localized-link";
456
+
457
+ export const LocaleSwitcher: FC = () => {
458
+ const { pathname } = useLocation();
459
+
460
+ const { availableLocales, locale, setLocale } = useLocale();
461
+
462
+ const pathWithoutLocale = getPathWithoutLocale(pathname);
463
+
464
+ return (
465
+ <ol>
466
+ {availableLocales.map((localeEl) => (
467
+ <li key={localeEl}>
468
+ <LocalizedLink
469
+ aria-current={localeEl === locale ? "page" : undefined}
470
+ onClick={() => setLocale(localeEl)}
471
+ params={{ locale: getPrefix(localeEl).localePrefix }}
472
+ to={pathWithoutLocale as To}
473
+ >
474
+ <span>
475
+ {/* Локаль — наприклад FR */}
476
+ {localeEl}
477
+ </span>
478
+ <span>
479
+ {/* Назва мови у власній локалі — наприклад Français */}
480
+ {getLocaleName(localeEl, locale)}
481
+ </span>
482
+ <span dir={getHTMLTextDir(localeEl)} lang={localeEl}>
483
+ {/* Мова в поточній локалі — наприклад «Francés», коли поточна локаль встановлена як Locales.SPANISH */}
484
+ {getLocaleName(localeEl)}
485
+ </span>
486
+ <span dir="ltr" lang={Locales.ENGLISH}>
487
+ {/* Мова англійською — наприклад «French» */}
488
+ {getLocaleName(localeEl, Locales.ENGLISH)}
489
+ </span>
490
+ </LocalizedLink>
491
+ </li>
492
+ ))}
493
+ </ol>
494
+ );
495
+ };
496
+ ```
497
+
498
+ > Щоб дізнатися більше про хук `useLocale`, зверніться до [документації](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/packages/react-intlayer/useLocale.md).
499
+
500
+ ### Крок 10: Додати керування атрибутами HTML (необов'язково)
501
+
502
+ Створіть хук для керування атрибутами HTML lang і dir:
503
+
504
+ ```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx"
505
+ // src/hooks/useI18nHTMLAttributes.tsx
506
+ import { getHTMLTextDir } from "intlayer";
507
+ import { useEffect } from "react";
508
+ import { useLocale } from "react-intlayer";
509
+
510
+ export const useI18nHTMLAttributes = () => {
511
+ const { locale } = useLocale();
512
+
513
+ useEffect(() => {
514
+ document.documentElement.lang = locale;
515
+ document.documentElement.dir = getHTMLTextDir(locale);
516
+ }, [locale]);
517
+ };
518
+ ```
519
+
520
+ Потім використайте його у кореневому компоненті:
521
+
522
+ ```tsx fileName="src/routes/{-$locale}/index.tsx"
523
+ import { createFileRoute, Outlet } from "@tanstack/react-router";
524
+ import { IntlayerProvider } from "react-intlayer";
525
+
526
+ import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes"; // імпортуємо хук
527
+
528
+ export const Route = createFileRoute("/{-$locale}")({
529
+ component: LayoutComponent,
530
+ });
531
+
532
+ function LayoutComponent() {
533
+ useI18nHTMLAttributes(); // додайте цей рядок
534
+
535
+ const { locale } = Route.useParams();
536
+ const { defaultLocale } = useLocale();
537
+
538
+ return (
539
+ <IntlayerProvider
540
+ locale={locale ?? defaultLocale} // Якщо локаль не вказана як параметр, буде використана локаль за замовчуванням
541
+ >
542
+ <Outlet />
543
+ </IntlayerProvider>
544
+ );
545
+ }
546
+ ```
547
+
548
+ ---
549
+
550
+ ### Крок 11: Додати middleware (необов'язково)
551
+
552
+ Ви також можете використовувати `intlayerProxy` для додавання маршрутизації на стороні сервера у вашому додатку. Цей плагін автоматично визначатиме поточну локаль на основі URL і встановлюватиме відповідний cookie з локаллю. Якщо локаль не вказана, плагін визначить найбільш підходящу локаль на основі мовних налаштувань браузера користувача. Якщо локаль не буде виявлена, відбудеться перенаправлення на локаль за замовчуванням.
553
+
554
+ > Зверніть увагу, що щоб використовувати `intlayerProxy` у production, потрібно перемістити пакет `vite-intlayer` з `devDependencies` до `dependencies`.
555
+
556
+ ```typescript {3,7} fileName="vite.config.ts"
557
+ import { reactRouter } from "@react-router/dev/vite";
558
+ import tailwindcss from "@tailwindcss/vite";
559
+ import { defineConfig } from "vite";
560
+ import { intlayer, intlayerProxy } from "vite-intlayer";
561
+ import tsconfigPaths from "vite-tsconfig-paths";
562
+
563
+ export default defineConfig({
564
+ plugins: [
565
+ intlayerProxy(), // Проксі слід розміщувати перед сервером, якщо ви використовуєте Nitro
566
+ tailwindcss(),
567
+ reactRouter(),
568
+ tsconfigPaths(),
569
+ intlayer(),
570
+ ],
571
+ });
572
+ ```
573
+
574
+ ---
575
+
576
+ ### Крок 12: Інтернаціоналізуйте свої метадані (необов'язково)
577
+
578
+ Ви також можете використовувати хук `getIntlayer`, щоб отримувати ваші словники контенту по всьому застосунку:
579
+
580
+ ```tsx fileName="src/routes/{-$locale}/index.tsx"
581
+ import { createFileRoute } from "@tanstack/react-router";
582
+ import { getIntlayer } from "intlayer";
583
+
584
+ export const Route = createFileRoute("/{-$locale}/")({
585
+ component: RouteComponent,
586
+ head: ({ params }) => {
587
+ const { locale } = params;
588
+ const metaContent = getIntlayer("page-metadata", locale);
589
+
590
+ return {
591
+ meta: [
592
+ { title: metaContent.title },
593
+ { content: metaContent.description, name: "description" },
594
+ ],
595
+ };
596
+ },
597
+ });
598
+ ```
599
+
600
+ ---
601
+
602
+ ### Крок 13: Отримання локалі у серверних діях (Необов'язково)
603
+
604
+ Можливо, ви захочете отримувати поточну локаль всередині серверних дій або API-ендпоїнтів.
605
+ Ви можете зробити це за допомогою хелпера `getLocale` з `intlayer`.
606
+
607
+ Ось приклад із використанням серверних функцій TanStack Start:
608
+
609
+ ```tsx fileName="src/routes/{-$locale}/index.tsx"
610
+ import { createServerFn } from "@tanstack/react-start";
611
+ import {
612
+ getRequestHeader,
613
+ getRequestHeaders,
614
+ } from "@tanstack/react-start/server";
615
+ import { getCookie, getIntlayer, getLocale } from "intlayer";
616
+
617
+ export const getLocaleServer = createServerFn().handler(async () => {
618
+ const locale = await getLocale({
619
+ // Отримати cookie з запиту (за замовчуванням: 'INTLAYER_LOCALE')
620
+ getCookie: (name) => {
621
+ const cookieString = getRequestHeader("cookie");
622
+
623
+ return getCookie(name, cookieString);
624
+ },
625
+ // Отримати заголовок з запиту (за замовчуванням: 'x-intlayer-locale')
626
+ // Резервне відпрацювання через узгодження Accept-Language
627
+ getHeader: (name) => getRequestHeader(name),
628
+ });
629
+
630
+ // Отримати певний контент за допомогою getIntlayer()
631
+ const content = getIntlayer("app", locale);
632
+
633
+ return { locale, content };
634
+ });
635
+ ```
636
+
637
+ ---
638
+
639
+ ### Крок 14: Керування сторінками «Не знайдено» (необов'язково)
640
+
641
+ Коли користувач переходить на неіснуючу сторінку, ви можете відобразити власну сторінку «не знайдено», і префікс локалі може впливати на те, як ця сторінка викликається.
642
+
643
+ #### Розуміння обробки 404 у TanStack Router з префіксами локалі
644
+
645
+ У TanStack Router обробка сторінок 404 для локалізованих маршрутів вимагає багаторівневого підходу:
646
+
647
+ 1. **Виділений маршрут 404**: спеціальний маршрут для відображення інтерфейсу сторінки 404
648
+ 2. **Валідація на рівні маршруту**: перевіряє префікси локалі та перенаправляє некоректні на 404
649
+ 3. **Catch-all route**: Перехоплює будь-які невідповідні шляхи в межах сегмента локалі
650
+
651
+ ```tsx fileName="src/routes/{-$locale}/404.tsx"
652
+ import { createFileRoute } from "@tanstack/react-router";
653
+
654
+ // Це створює спеціальний маршрут /[locale]/404
655
+ // Використовується як прямий маршрут і імпортується як компонент в інших файлах
656
+ export const Route = createFileRoute("/{-$locale}/404")({
657
+ component: NotFoundComponent,
658
+ });
659
+
660
+ // Експортується окремо, щоб його можна було повторно використовувати в notFoundComponent та catch-all маршрутах
661
+ export function NotFoundComponent() {
662
+ return (
663
+ <div>
664
+ <h1>404</h1>
665
+ </div>
666
+ );
667
+ }
668
+ ```
669
+
670
+ ```tsx fileName="src/routes/{-$locale}/route.tsx"
671
+ import { createFileRoute, Outlet, redirect } from "@tanstack/react-router";
672
+ import { validatePrefix } from "intlayer";
673
+ import { IntlayerProvider, useLocale } from "react-intlayer";
674
+
675
+ import { LocaleSwitcher } from "@/components/locale-switcher";
676
+ import { NotFoundComponent } from "./404";
677
+
678
+ export const Route = createFileRoute("/{-$locale}")({
679
+ // beforeLoad виконується перед відображенням маршруту (як на сервері, так і на клієнті)
680
+ // Це ідеальне місце для валідації префіксу локалі
681
+ beforeLoad: ({ params }) => {
682
+ // Отримати локаль з параметрів маршруту (не з заголовків сервера, оскільки beforeLoad виконується і на клієнті, і на сервері)
683
+ const localeParam = params.locale;
684
+
685
+ // validatePrefix перевіряє, чи дійсна локаль згідно з вашою конфігурацією intlayer
686
+ // Повертає: { isValid: boolean, localePrefix: string }
687
+ // - isValid: true якщо префікс відповідає налаштованій локалі (або порожній, коли префікс опціональний)
688
+ // - localePrefix: перевірений префікс або префікс локалі за замовчуванням для перенаправлень
689
+ const { isValid, localePrefix } = validatePrefix(localeParam);
690
+
691
+ if (isValid) {
692
+ // Локаль дійсна, дозволяємо маршруту рендеритися як зазвичай
693
+ return;
694
+ }
695
+
696
+ // Неприпустимий префікс локалі (наприклад, /xyz/about, де "xyz" не є дійсною локаллю)
697
+ // Перенаправити на сторінку 404 з дійсним префіксом локалі
698
+ // Це гарантує, що сторінка 404 буде правильно локалізована
699
+ throw redirect({
700
+ to: "/{-$locale}/404",
701
+ params: { locale: localePrefix },
702
+ });
703
+ },
704
+ component: RouteComponent,
705
+ // notFoundComponent викликається, коли дочірній маршрут не існує
706
+ // наприклад, /en/non-existent-page спричиняє це в межах layout для /en
707
+ notFoundComponent: NotFoundLayout,
708
+ });
709
+
710
+ function RouteComponent() {
711
+ const { defaultLocale } = useLocale();
712
+ const { locale } = Route.useParams();
713
+
714
+ return (
715
+ // Обгортає весь сегмент локалі компонентом IntlayerProvider
716
+ // Використовує defaultLocale, якщо параметр locale не визначений (режим необов'язкового префіксу)
717
+ <IntlayerProvider locale={locale ?? defaultLocale}>
718
+ <Outlet />
719
+ </IntlayerProvider>
720
+ );
721
+ }
722
+
723
+ // NotFoundLayout обгортає компонент 404 компонентом IntlayerProvider
724
+ // Це гарантує, що переклади працюють і на сторінці 404
725
+ function NotFoundLayout() {
726
+ const { defaultLocale } = useLocale();
727
+ const { locale } = Route.useParams();
728
+
729
+ return (
730
+ <IntlayerProvider locale={locale ?? defaultLocale}>
731
+ <NotFoundComponent />
732
+ {/* Додати LocaleSwitcher, щоб користувачі могли змінювати мову навіть на сторінці 404 */}
733
+ <LocaleSwitcher />
734
+ </IntlayerProvider>
735
+ );
736
+ }
737
+ ```
738
+
739
+ ```tsx fileName="src/routes/{-$locale}/$.tsx"
740
+ import { createFileRoute } from "@tanstack/react-router";
741
+
742
+ import { NotFoundComponent } from "./404";
743
+
744
+ // Маркер $ (splat/catch-all) маршрут відповідає будь-якому шляху, який не відповідає іншим маршрутам
745
+ // наприклад, /en/some/deeply/nested/invalid/path
746
+ // Це гарантує, що ВСІ невідповідні шляхи всередині локалі показуватимуть сторінку 404
747
+ // Без цього, невідповідні глибокі шляхи можуть показувати порожню сторінку або викликати помилку
748
+ export const Route = createFileRoute("/{-$locale}/$")({
749
+ component: NotFoundComponent,
750
+ });
751
+ ```
752
+
753
+ ---
754
+
755
+ ### Крок 15: Налаштування TypeScript (необов'язково)
756
+
757
+ Intlayer використовує module augmentation, щоб отримати переваги TypeScript і зміцнити ваш codebase.
758
+
759
+ Переконайтеся, що ваша конфігурація TypeScript включає автогенеровані типи:
760
+
761
+ ```json5 fileName="tsconfig.json"
762
+ {
763
+ // ... ваші наявні конфігурації
764
+ include: [
765
+ // ... ваші наявні includes
766
+ ".intlayer/**/*.ts", // Включає автогенеровані типи
767
+ ],
768
+ }
769
+ ```
770
+
771
+ ---
772
+
773
+ ### Налаштування Git
774
+
775
+ Рекомендується ігнорувати файли, згенеровані Intlayer. Це дозволить уникнути їх коміту в ваш Git-репозиторій.
776
+
777
+ Для цього ви можете додати наступні інструкції до файлу `.gitignore`:
778
+
779
+ ```plaintext fileName=".gitignore"
780
+ # Ігнорувати файли, згенеровані Intlayer
781
+ .intlayer
782
+ ```
783
+
784
+ ---
785
+
786
+ ## Розширення VS Code
787
+
788
+ Щоб покращити досвід розробки з Intlayer, ви можете встановити офіційне **Intlayer VS Code Extension**.
789
+
790
+ [Встановити з VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
791
+
792
+ Це розширення надає:
793
+
794
+ - **Автозаповнення** для ключів перекладу.
795
+ - **Виявлення помилок у реальному часі** для відсутніх перекладів.
796
+ - **Вбудовані попередні перегляди** перекладеного вмісту.
797
+ - **Швидкі дії** для простого створення та оновлення перекладів.
798
+
799
+ Для детальнішої інформації про використання розширення зверніться до [документації Intlayer VS Code Extension](https://intlayer.org/doc/vs-code-extension).
800
+
801
+ ---
802
+
803
+ ## Рухатися далі
804
+
805
+ Щоб піти далі, ви можете реалізувати [візуальний редактор](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/intlayer_visual_editor.md) або винести свій вміст у зовнішню систему, використовуючи [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/intlayer_CMS.md).
806
+
807
+ ---
808
+
809
+ ## Посилання на документацію
810
+
811
+ - [Документація Intlayer](https://intlayer.org)
812
+ - [Документація Tanstack Start](https://reactrouter.com/)
813
+ - [Хук useIntlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/packages/react-intlayer/useIntlayer.md)
814
+ - [Хук useLocale](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/packages/react-intlayer/useLocale.md)
815
+ - [Оголошення контенту](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/dictionary/content_file.md)
816
+ - [Конфігурація](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/configuration.md)
817
+
818
+ Цей вичерпний посібник містить усе необхідне для інтеграції Intlayer з Tanstack Start для повністю інтернаціоналізованого додатка з маршрутизацією, що враховує локаль, та підтримкою TypeScript.