@intlayer/docs 7.0.6 → 7.0.8-canary.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (726) hide show
  1. package/blog/ar/i18n_using_next-i18next.md +1068 -0
  2. package/blog/ar/i18n_using_next-intl.md +768 -0
  3. package/blog/ar/intlayer_with_react-intl.md +0 -4
  4. package/blog/ar/next-i18next_vs_next-intl_vs_intlayer.md +5 -4
  5. package/blog/de/i18n_using_next-i18next.md +1107 -0
  6. package/blog/de/i18n_using_next-intl.md +760 -0
  7. package/blog/de/intlayer_with_react-intl.md +0 -4
  8. package/blog/de/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
  9. package/blog/en/i18n_using_next-i18next.md +1073 -0
  10. package/blog/en/i18n_using_next-intl.md +757 -0
  11. package/blog/en/intlayer_with_i18next.md +71 -8
  12. package/blog/en/intlayer_with_next-i18next.md +71 -8
  13. package/blog/en/intlayer_with_next-intl.md +71 -8
  14. package/blog/en/intlayer_with_react-i18next.md +69 -8
  15. package/blog/en/intlayer_with_react-intl.md +68 -9
  16. package/blog/en/intlayer_with_vue-i18n.md +68 -7
  17. package/blog/en/react-i18next_vs_react-intl_vs_intlayer.md +2 -0
  18. package/blog/en/vue-i18n_vs_intlayer.md +2 -0
  19. package/blog/en-GB/i18n_using_next-i18next.md +1074 -0
  20. package/blog/en-GB/i18n_using_next-intl.md +757 -0
  21. package/blog/en-GB/intlayer_with_i18next.md +15 -6
  22. package/blog/en-GB/intlayer_with_next-i18next.md +16 -6
  23. package/blog/en-GB/intlayer_with_next-intl.md +16 -6
  24. package/blog/en-GB/intlayer_with_react-i18next.md +16 -7
  25. package/blog/en-GB/intlayer_with_react-intl.md +14 -9
  26. package/blog/en-GB/intlayer_with_vue-i18n.md +16 -7
  27. package/blog/en-GB/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
  28. package/blog/en-GB/react-i18next_vs_react-intl_vs_intlayer.md +2 -0
  29. package/blog/en-GB/vue-i18n_vs_intlayer.md +2 -0
  30. package/blog/es/i18n_using_next-i18next.md +1066 -0
  31. package/blog/es/i18n_using_next-intl.md +757 -0
  32. package/blog/es/intlayer_with_react-intl.md +0 -4
  33. package/blog/es/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
  34. package/blog/fr/i18n_using_next-i18next.md +1078 -0
  35. package/blog/fr/i18n_using_next-intl.md +759 -0
  36. package/blog/fr/intlayer_with_react-intl.md +0 -4
  37. package/blog/fr/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
  38. package/blog/hi/i18n_using_next-i18next.md +1068 -0
  39. package/blog/hi/i18n_using_next-intl.md +758 -0
  40. package/blog/hi/intlayer_with_react-intl.md +0 -4
  41. package/blog/hi/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
  42. package/blog/id/i18n_using_next-i18next.md +1078 -0
  43. package/blog/id/i18n_using_next-intl.md +757 -0
  44. package/blog/id/index.md +69 -0
  45. package/blog/id/internationalization_and_SEO.md +364 -0
  46. package/blog/id/intlayer_with_react-intl.md +0 -4
  47. package/blog/id/list_i18n_technologies/CMS/drupal.md +143 -0
  48. package/blog/id/list_i18n_technologies/CMS/wix.md +167 -0
  49. package/blog/id/list_i18n_technologies/CMS/wordpress.md +188 -0
  50. package/blog/id/list_i18n_technologies/frameworks/angular.md +125 -0
  51. package/blog/id/list_i18n_technologies/frameworks/flutter.md +150 -0
  52. package/blog/id/list_i18n_technologies/frameworks/react-native.md +217 -0
  53. package/blog/id/list_i18n_technologies/frameworks/react.md +155 -0
  54. package/blog/id/list_i18n_technologies/frameworks/svelte.md +131 -0
  55. package/blog/id/list_i18n_technologies/frameworks/vue.md +130 -0
  56. package/blog/id/next-i18next_vs_next-intl_vs_intlayer.md +1500 -0
  57. package/blog/id/nextjs-multilingual-seo-comparison.md +361 -0
  58. package/blog/id/rag_powered_documentation_assistant.md +288 -0
  59. package/blog/id/react-i18next_vs_react-intl_vs_intlayer.md +164 -0
  60. package/blog/id/vue-i18n_vs_intlayer.md +278 -0
  61. package/blog/id/what_is_internationalization.md +166 -0
  62. package/blog/it/i18n_using_next-i18next.md +1078 -0
  63. package/blog/it/i18n_using_next-intl.md +758 -0
  64. package/blog/it/intlayer_with_react-intl.md +0 -4
  65. package/blog/it/react-i18next_vs_react-intl_vs_intlayer.md +4 -0
  66. package/blog/it/vue-i18n_vs_intlayer.md +2 -0
  67. package/blog/ja/i18n_using_next-i18next.md +1078 -0
  68. package/blog/ja/i18n_using_next-intl.md +758 -0
  69. package/blog/ja/intlayer_with_react-intl.md +0 -4
  70. package/blog/ja/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
  71. package/blog/ko/i18n_using_next-i18next.md +1075 -0
  72. package/blog/ko/i18n_using_next-intl.md +759 -0
  73. package/blog/ko/intlayer_with_react-intl.md +0 -4
  74. package/blog/ko/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
  75. package/blog/pl/i18n_using_next-i18next.md +1078 -0
  76. package/blog/pl/i18n_using_next-intl.md +758 -0
  77. package/blog/pl/index.md +69 -0
  78. package/blog/pl/internationalization_and_SEO.md +363 -0
  79. package/blog/pl/intlayer_with_react-intl.md +0 -4
  80. package/blog/pl/list_i18n_technologies/CMS/drupal.md +143 -0
  81. package/blog/pl/list_i18n_technologies/CMS/wix.md +167 -0
  82. package/blog/pl/list_i18n_technologies/CMS/wordpress.md +196 -0
  83. package/blog/pl/list_i18n_technologies/frameworks/angular.md +125 -0
  84. package/blog/pl/list_i18n_technologies/frameworks/flutter.md +151 -0
  85. package/blog/pl/list_i18n_technologies/frameworks/react-native.md +217 -0
  86. package/blog/pl/list_i18n_technologies/frameworks/react.md +155 -0
  87. package/blog/pl/list_i18n_technologies/frameworks/svelte.md +131 -0
  88. package/blog/pl/list_i18n_technologies/frameworks/vue.md +130 -0
  89. package/blog/pl/next-i18next_vs_next-intl_vs_intlayer.md +1501 -0
  90. package/blog/pl/nextjs-multilingual-seo-comparison.md +362 -0
  91. package/blog/pl/rag_powered_documentation_assistant.md +288 -0
  92. package/blog/pl/react-i18next_vs_react-intl_vs_intlayer.md +164 -0
  93. package/blog/pl/vue-i18n_vs_intlayer.md +278 -0
  94. package/blog/pl/what_is_internationalization.md +167 -0
  95. package/blog/pt/i18n_using_next-i18next.md +1067 -0
  96. package/blog/pt/i18n_using_next-intl.md +760 -0
  97. package/blog/pt/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
  98. package/blog/ru/i18n_using_next-i18next.md +1106 -0
  99. package/blog/ru/i18n_using_next-intl.md +759 -0
  100. package/blog/ru/intlayer_with_react-intl.md +0 -4
  101. package/blog/ru/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
  102. package/blog/tr/i18n_using_next-i18next.md +1078 -0
  103. package/blog/tr/i18n_using_next-intl.md +760 -0
  104. package/blog/tr/intlayer_with_react-intl.md +0 -4
  105. package/blog/tr/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
  106. package/blog/tr/react-i18next_vs_react-intl_vs_intlayer.md +2 -0
  107. package/blog/tr/vue-i18n_vs_intlayer.md +2 -0
  108. package/blog/vi/i18n_using_next-i18next.md +1080 -0
  109. package/blog/vi/i18n_using_next-intl.md +758 -0
  110. package/blog/vi/index.md +69 -0
  111. package/blog/vi/internationalization_and_SEO.md +363 -0
  112. package/blog/vi/intlayer_with_react-intl.md +0 -4
  113. package/blog/vi/list_i18n_technologies/CMS/drupal.md +143 -0
  114. package/blog/vi/list_i18n_technologies/CMS/wix.md +167 -0
  115. package/blog/vi/list_i18n_technologies/CMS/wordpress.md +188 -0
  116. package/blog/vi/list_i18n_technologies/frameworks/angular.md +125 -0
  117. package/blog/vi/list_i18n_technologies/frameworks/flutter.md +150 -0
  118. package/blog/vi/list_i18n_technologies/frameworks/react-native.md +217 -0
  119. package/blog/vi/list_i18n_technologies/frameworks/react.md +155 -0
  120. package/blog/vi/list_i18n_technologies/frameworks/svelte.md +131 -0
  121. package/blog/vi/list_i18n_technologies/frameworks/vue.md +130 -0
  122. package/blog/vi/next-i18next_vs_next-intl_vs_intlayer.md +1520 -0
  123. package/blog/vi/nextjs-multilingual-seo-comparison.md +362 -0
  124. package/blog/vi/rag_powered_documentation_assistant.md +288 -0
  125. package/blog/vi/react-i18next_vs_react-intl_vs_intlayer.md +164 -0
  126. package/blog/vi/vue-i18n_vs_intlayer.md +278 -0
  127. package/blog/vi/what_is_internationalization.md +168 -0
  128. package/blog/zh/i18n_using_next-i18next.md +1105 -0
  129. package/blog/zh/i18n_using_next-intl.md +758 -0
  130. package/blog/zh/intlayer_with_react-intl.md +0 -4
  131. package/blog/zh/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
  132. package/blog/zh/react-i18next_vs_react-intl_vs_intlayer.md +2 -0
  133. package/dist/cjs/common.cjs +0 -4
  134. package/dist/cjs/common.cjs.map +1 -1
  135. package/dist/cjs/generated/blog.entry.cjs +38 -6
  136. package/dist/cjs/generated/blog.entry.cjs.map +1 -1
  137. package/dist/cjs/generated/docs.entry.cjs +0 -6
  138. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  139. package/dist/cjs/generated/frequentQuestions.entry.cjs +0 -6
  140. package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
  141. package/dist/cjs/generated/legal.entry.cjs +0 -6
  142. package/dist/cjs/generated/legal.entry.cjs.map +1 -1
  143. package/dist/esm/generated/blog.entry.mjs +38 -0
  144. package/dist/esm/generated/blog.entry.mjs.map +1 -1
  145. package/dist/types/generated/blog.entry.d.ts +2 -0
  146. package/dist/types/generated/blog.entry.d.ts.map +1 -1
  147. package/docs/ar/component_i18n.md +1 -1
  148. package/docs/ar/configuration.md +6 -0
  149. package/docs/ar/intlayer_cli.md +8 -3
  150. package/docs/ar/intlayer_with_next-i18next.md +619 -0
  151. package/docs/ar/intlayer_with_next-intl.md +446 -0
  152. package/docs/ar/intlayer_with_nextjs_16.md +21 -0
  153. package/docs/ar/intlayer_with_tanstack.md +4 -0
  154. package/docs/ar/intlayer_with_vite+react.md +4 -0
  155. package/docs/de/component_i18n.md +1 -1
  156. package/docs/de/configuration.md +6 -0
  157. package/docs/de/intlayer_cli.md +8 -3
  158. package/docs/de/intlayer_with_next-i18next.md +627 -0
  159. package/docs/de/intlayer_with_next-intl.md +451 -0
  160. package/docs/de/intlayer_with_nextjs_16.md +21 -0
  161. package/docs/de/intlayer_with_tanstack.md +4 -0
  162. package/docs/de/intlayer_with_vite+react.md +4 -0
  163. package/docs/en/component_i18n.md +1 -1
  164. package/docs/en/intlayer_cli.md +8 -1
  165. package/docs/en/intlayer_with_astro.md +10 -2
  166. package/docs/en/intlayer_with_create_react_app.md +8 -0
  167. package/docs/en/intlayer_with_lynx+react.md +8 -0
  168. package/docs/en/intlayer_with_nestjs.md +10 -0
  169. package/docs/en/intlayer_with_nextjs_14.md +10 -2
  170. package/docs/en/intlayer_with_nextjs_15.md +21 -4
  171. package/docs/en/intlayer_with_nextjs_16.md +17 -0
  172. package/docs/en/intlayer_with_nuxt.md +8 -0
  173. package/docs/en/intlayer_with_react_native+expo.md +10 -2
  174. package/docs/en/intlayer_with_react_router_v7.md +8 -0
  175. package/docs/en/intlayer_with_tanstack.md +10 -0
  176. package/docs/en/intlayer_with_vite+preact.md +10 -2
  177. package/docs/en/intlayer_with_vite+react.md +21 -4
  178. package/docs/en/intlayer_with_vite+vue.md +10 -2
  179. package/docs/en-GB/component_i18n.md +1 -1
  180. package/docs/en-GB/configuration.md +6 -0
  181. package/docs/en-GB/intlayer_cli.md +8 -3
  182. package/docs/en-GB/intlayer_with_angular.md +4 -4
  183. package/docs/en-GB/intlayer_with_express.md +4 -4
  184. package/docs/en-GB/intlayer_with_lynx+react.md +12 -12
  185. package/{blog/en/_intlayer_with_next-i18next.md → docs/en-GB/intlayer_with_next-i18next.md} +241 -42
  186. package/{blog/en/_intlayer_with_next-intl.md → docs/en-GB/intlayer_with_next-intl.md} +144 -29
  187. package/docs/en-GB/intlayer_with_nextjs_16.md +21 -0
  188. package/docs/en-GB/intlayer_with_tanstack.md +5 -1
  189. package/docs/en-GB/intlayer_with_vite+react.md +4 -0
  190. package/docs/en-GB/packages/next-intlayer/t.md +2 -2
  191. package/docs/es/component_i18n.md +1 -1
  192. package/docs/es/configuration.md +6 -0
  193. package/docs/es/intlayer_cli.md +8 -3
  194. package/docs/es/intlayer_with_next-i18next.md +628 -0
  195. package/docs/es/intlayer_with_next-intl.md +446 -0
  196. package/docs/es/intlayer_with_nextjs_16.md +21 -0
  197. package/docs/es/intlayer_with_tanstack.md +4 -0
  198. package/docs/es/intlayer_with_vite+react.md +4 -0
  199. package/docs/fr/configuration.md +6 -0
  200. package/docs/fr/intlayer_cli.md +8 -3
  201. package/docs/fr/intlayer_with_next-i18next.md +628 -0
  202. package/docs/fr/intlayer_with_next-intl.md +446 -0
  203. package/docs/fr/intlayer_with_nextjs_16.md +23 -2
  204. package/docs/fr/intlayer_with_tanstack.md +4 -0
  205. package/docs/fr/intlayer_with_vite+react.md +4 -0
  206. package/docs/hi/component_i18n.md +1 -1
  207. package/docs/hi/configuration.md +6 -0
  208. package/docs/hi/intlayer_cli.md +8 -0
  209. package/docs/hi/intlayer_with_next-i18next.md +628 -0
  210. package/docs/hi/intlayer_with_next-intl.md +446 -0
  211. package/docs/hi/intlayer_with_nextjs_16.md +21 -0
  212. package/docs/hi/intlayer_with_tanstack.md +4 -0
  213. package/docs/hi/intlayer_with_vite+react.md +4 -0
  214. package/docs/id/CI_CD.md +198 -0
  215. package/docs/id/autoFill.md +284 -0
  216. package/docs/id/component_i18n.md +186 -0
  217. package/docs/id/configuration.md +710 -0
  218. package/docs/id/dictionary/condition.md +231 -0
  219. package/docs/id/dictionary/content_file.md +1092 -0
  220. package/docs/id/dictionary/enumeration.md +245 -0
  221. package/docs/id/dictionary/file.md +237 -0
  222. package/docs/id/dictionary/function_fetching.md +214 -0
  223. package/docs/id/dictionary/gender.md +273 -0
  224. package/docs/id/dictionary/insertion.md +192 -0
  225. package/docs/id/dictionary/markdown.md +381 -0
  226. package/docs/id/dictionary/nesting.md +273 -0
  227. package/docs/id/dictionary/translation.md +310 -0
  228. package/docs/id/formatters.md +596 -0
  229. package/docs/id/how_works_intlayer.md +256 -0
  230. package/docs/id/index.md +176 -0
  231. package/docs/id/interest_of_intlayer.md +293 -0
  232. package/docs/id/intlayer_CMS.md +549 -0
  233. package/docs/id/intlayer_cli.md +850 -0
  234. package/docs/id/intlayer_visual_editor.md +288 -0
  235. package/docs/id/intlayer_with_angular.md +694 -0
  236. package/docs/id/intlayer_with_astro.md +252 -0
  237. package/docs/id/intlayer_with_create_react_app.md +1233 -0
  238. package/docs/id/intlayer_with_express.md +411 -0
  239. package/docs/id/intlayer_with_lynx+react.md +518 -0
  240. package/docs/id/intlayer_with_nestjs.md +272 -0
  241. package/docs/id/intlayer_with_next-i18next.md +628 -0
  242. package/docs/id/intlayer_with_next-intl.md +446 -0
  243. package/docs/id/intlayer_with_nextjs_14.md +1617 -0
  244. package/docs/id/intlayer_with_nextjs_15.md +1698 -0
  245. package/docs/id/intlayer_with_nextjs_16.md +21 -0
  246. package/docs/id/intlayer_with_nextjs_page_router.md +1478 -0
  247. package/docs/id/intlayer_with_nuxt.md +808 -0
  248. package/docs/id/intlayer_with_react_native+expo.md +699 -0
  249. package/docs/id/intlayer_with_react_router_v7.md +496 -0
  250. package/docs/id/intlayer_with_tanstack.md +564 -0
  251. package/docs/id/intlayer_with_vite+preact.md +1737 -0
  252. package/docs/id/intlayer_with_vite+react.md +1413 -0
  253. package/docs/id/intlayer_with_vite+solid.md +289 -0
  254. package/docs/id/intlayer_with_vite+svelte.md +289 -0
  255. package/docs/id/intlayer_with_vite+vue.md +1088 -0
  256. package/docs/id/introduction.md +218 -0
  257. package/docs/id/locale_mapper.md +242 -0
  258. package/docs/id/mcp_server.md +211 -0
  259. package/docs/id/packages/express-intlayer/t.md +458 -0
  260. package/docs/id/packages/intlayer/getConfiguration.md +145 -0
  261. package/docs/id/packages/intlayer/getEnumeration.md +159 -0
  262. package/docs/id/packages/intlayer/getHTMLTextDir.md +122 -0
  263. package/docs/id/packages/intlayer/getLocaleLang.md +81 -0
  264. package/docs/id/packages/intlayer/getLocaleName.md +119 -0
  265. package/docs/id/packages/intlayer/getLocalizedUrl.md +309 -0
  266. package/docs/id/packages/intlayer/getMultilingualUrls.md +223 -0
  267. package/docs/id/packages/intlayer/getPathWithoutLocale.md +75 -0
  268. package/docs/id/packages/intlayer/getTranslation.md +190 -0
  269. package/docs/id/packages/intlayer/getTranslationContent.md +188 -0
  270. package/docs/id/packages/next-intlayer/t.md +352 -0
  271. package/docs/id/packages/next-intlayer/useDictionary.md +271 -0
  272. package/docs/id/packages/next-intlayer/useIntlayer.md +264 -0
  273. package/docs/id/packages/next-intlayer/useLocale.md +166 -0
  274. package/docs/id/packages/react-intlayer/t.md +303 -0
  275. package/docs/id/packages/react-intlayer/useDictionary.md +287 -0
  276. package/docs/id/packages/react-intlayer/useI18n.md +267 -0
  277. package/docs/id/packages/react-intlayer/useIntlayer.md +254 -0
  278. package/docs/id/packages/react-intlayer/useLocale.md +210 -0
  279. package/docs/id/per_locale_file.md +323 -0
  280. package/docs/id/readme.md +261 -0
  281. package/docs/id/releases/v6.md +305 -0
  282. package/docs/id/roadmap.md +362 -0
  283. package/docs/id/testing.md +202 -0
  284. package/docs/id/vs_code_extension.md +126 -0
  285. package/docs/it/component_i18n.md +1 -1
  286. package/docs/it/configuration.md +6 -0
  287. package/docs/it/intlayer_cli.md +8 -3
  288. package/docs/it/intlayer_with_next-i18next.md +628 -0
  289. package/docs/it/intlayer_with_next-intl.md +446 -0
  290. package/docs/it/intlayer_with_nextjs_16.md +21 -0
  291. package/docs/it/intlayer_with_tanstack.md +4 -0
  292. package/docs/it/intlayer_with_vite+react.md +4 -0
  293. package/docs/ja/component_i18n.md +1 -1
  294. package/docs/ja/configuration.md +6 -0
  295. package/docs/ja/intlayer_cli.md +8 -3
  296. package/docs/ja/intlayer_with_next-i18next.md +627 -0
  297. package/docs/ja/intlayer_with_next-intl.md +446 -0
  298. package/docs/ja/intlayer_with_nextjs_16.md +21 -0
  299. package/docs/ja/intlayer_with_tanstack.md +4 -0
  300. package/docs/ja/intlayer_with_vite+react.md +4 -0
  301. package/docs/ko/configuration.md +6 -0
  302. package/docs/ko/intlayer_cli.md +8 -3
  303. package/docs/ko/intlayer_with_next-i18next.md +627 -0
  304. package/docs/ko/intlayer_with_next-intl.md +446 -0
  305. package/docs/ko/intlayer_with_nextjs_16.md +21 -0
  306. package/docs/ko/intlayer_with_tanstack.md +4 -0
  307. package/docs/ko/intlayer_with_vite+react.md +4 -0
  308. package/docs/pl/CI_CD.md +198 -0
  309. package/docs/pl/autoFill.md +284 -0
  310. package/docs/pl/component_i18n.md +186 -0
  311. package/docs/pl/configuration.md +710 -0
  312. package/docs/pl/dictionary/condition.md +232 -0
  313. package/docs/pl/dictionary/content_file.md +1130 -0
  314. package/docs/pl/dictionary/enumeration.md +245 -0
  315. package/docs/pl/dictionary/file.md +234 -0
  316. package/docs/pl/dictionary/function_fetching.md +214 -0
  317. package/docs/pl/dictionary/gender.md +276 -0
  318. package/docs/pl/dictionary/insertion.md +188 -0
  319. package/docs/pl/dictionary/markdown.md +408 -0
  320. package/docs/pl/dictionary/nesting.md +273 -0
  321. package/docs/pl/dictionary/translation.md +310 -0
  322. package/docs/pl/formatters.md +596 -0
  323. package/docs/pl/how_works_intlayer.md +256 -0
  324. package/docs/pl/index.md +176 -0
  325. package/docs/pl/interest_of_intlayer.md +291 -0
  326. package/docs/pl/intlayer_CMS.md +549 -0
  327. package/docs/pl/intlayer_cli.md +857 -0
  328. package/docs/pl/intlayer_visual_editor.md +288 -0
  329. package/docs/pl/intlayer_with_angular.md +690 -0
  330. package/docs/pl/intlayer_with_astro.md +280 -0
  331. package/docs/pl/intlayer_with_create_react_app.md +1235 -0
  332. package/docs/pl/intlayer_with_express.md +411 -0
  333. package/docs/pl/intlayer_with_lynx+react.md +518 -0
  334. package/docs/pl/intlayer_with_nestjs.md +272 -0
  335. package/docs/pl/intlayer_with_next-i18next.md +628 -0
  336. package/docs/pl/intlayer_with_next-intl.md +446 -0
  337. package/docs/pl/intlayer_with_nextjs_14.md +1594 -0
  338. package/docs/pl/intlayer_with_nextjs_15.md +1701 -0
  339. package/docs/pl/intlayer_with_nextjs_16.md +21 -0
  340. package/docs/pl/intlayer_with_nextjs_page_router.md +1513 -0
  341. package/docs/pl/intlayer_with_nuxt.md +885 -0
  342. package/docs/pl/intlayer_with_react_native+expo.md +698 -0
  343. package/docs/pl/intlayer_with_react_router_v7.md +503 -0
  344. package/docs/pl/intlayer_with_tanstack.md +562 -0
  345. package/docs/pl/intlayer_with_vite+preact.md +1736 -0
  346. package/docs/pl/intlayer_with_vite+react.md +1438 -0
  347. package/docs/pl/intlayer_with_vite+solid.md +290 -0
  348. package/docs/pl/intlayer_with_vite+svelte.md +289 -0
  349. package/docs/pl/intlayer_with_vite+vue.md +1116 -0
  350. package/docs/pl/introduction.md +209 -0
  351. package/docs/pl/locale_mapper.md +242 -0
  352. package/docs/pl/mcp_server.md +211 -0
  353. package/docs/pl/packages/express-intlayer/t.md +458 -0
  354. package/docs/pl/packages/intlayer/getConfiguration.md +146 -0
  355. package/docs/pl/packages/intlayer/getEnumeration.md +160 -0
  356. package/docs/pl/packages/intlayer/getHTMLTextDir.md +121 -0
  357. package/docs/pl/packages/intlayer/getLocaleLang.md +81 -0
  358. package/docs/pl/packages/intlayer/getLocaleName.md +118 -0
  359. package/docs/pl/packages/intlayer/getLocalizedUrl.md +300 -0
  360. package/docs/pl/packages/intlayer/getMultilingualUrls.md +221 -0
  361. package/docs/pl/packages/intlayer/getPathWithoutLocale.md +75 -0
  362. package/docs/pl/packages/intlayer/getTranslation.md +190 -0
  363. package/docs/pl/packages/intlayer/getTranslationContent.md +189 -0
  364. package/docs/pl/packages/next-intlayer/t.md +353 -0
  365. package/docs/pl/packages/next-intlayer/useDictionary.md +270 -0
  366. package/docs/pl/packages/next-intlayer/useIntlayer.md +263 -0
  367. package/docs/pl/packages/next-intlayer/useLocale.md +166 -0
  368. package/docs/pl/packages/react-intlayer/t.md +303 -0
  369. package/docs/pl/packages/react-intlayer/useDictionary.md +289 -0
  370. package/docs/pl/packages/react-intlayer/useI18n.md +249 -0
  371. package/docs/pl/packages/react-intlayer/useIntlayer.md +256 -0
  372. package/docs/pl/packages/react-intlayer/useLocale.md +210 -0
  373. package/docs/pl/per_locale_file.md +321 -0
  374. package/docs/pl/readme.md +261 -0
  375. package/docs/pl/releases/v6.md +305 -0
  376. package/docs/pl/roadmap.md +362 -0
  377. package/docs/pl/testing.md +202 -0
  378. package/docs/pl/vs_code_extension.md +126 -0
  379. package/docs/pt/component_i18n.md +1 -1
  380. package/docs/pt/configuration.md +6 -0
  381. package/docs/pt/intlayer_cli.md +8 -3
  382. package/docs/pt/intlayer_with_next-i18next.md +627 -0
  383. package/docs/pt/intlayer_with_next-intl.md +446 -0
  384. package/docs/pt/intlayer_with_nextjs_16.md +21 -0
  385. package/docs/pt/intlayer_with_tanstack.md +4 -0
  386. package/docs/pt/intlayer_with_vite+react.md +4 -0
  387. package/docs/ru/component_i18n.md +1 -1
  388. package/docs/ru/configuration.md +6 -0
  389. package/docs/ru/intlayer_cli.md +301 -22
  390. package/docs/ru/intlayer_with_next-i18next.md +629 -0
  391. package/docs/ru/intlayer_with_next-intl.md +448 -0
  392. package/docs/ru/intlayer_with_nextjs_16.md +21 -0
  393. package/docs/ru/intlayer_with_tanstack.md +4 -0
  394. package/docs/ru/intlayer_with_vite+react.md +4 -0
  395. package/docs/tr/component_i18n.md +1 -1
  396. package/docs/tr/configuration.md +6 -0
  397. package/docs/tr/intlayer_cli.md +8 -0
  398. package/docs/tr/intlayer_with_next-i18next.md +627 -0
  399. package/docs/tr/intlayer_with_next-intl.md +446 -0
  400. package/docs/tr/intlayer_with_nextjs_16.md +21 -0
  401. package/docs/tr/intlayer_with_tanstack.md +4 -0
  402. package/docs/tr/intlayer_with_vite+react.md +4 -0
  403. package/docs/vi/CI_CD.md +198 -0
  404. package/docs/vi/autoFill.md +284 -0
  405. package/docs/vi/component_i18n.md +186 -0
  406. package/docs/vi/configuration.md +710 -0
  407. package/docs/vi/dictionary/condition.md +237 -0
  408. package/docs/vi/dictionary/content_file.md +1115 -0
  409. package/docs/vi/dictionary/enumeration.md +255 -0
  410. package/docs/vi/dictionary/file.md +234 -0
  411. package/docs/vi/dictionary/function_fetching.md +212 -0
  412. package/docs/vi/dictionary/gender.md +275 -0
  413. package/docs/vi/dictionary/insertion.md +191 -0
  414. package/docs/vi/dictionary/markdown.md +381 -0
  415. package/docs/vi/dictionary/nesting.md +273 -0
  416. package/docs/vi/dictionary/translation.md +309 -0
  417. package/docs/vi/formatters.md +595 -0
  418. package/docs/vi/how_works_intlayer.md +256 -0
  419. package/docs/vi/index.md +174 -0
  420. package/docs/vi/interest_of_intlayer.md +292 -0
  421. package/docs/vi/intlayer_CMS.md +549 -0
  422. package/docs/vi/intlayer_cli.md +850 -0
  423. package/docs/vi/intlayer_visual_editor.md +288 -0
  424. package/docs/vi/intlayer_with_angular.md +692 -0
  425. package/docs/vi/intlayer_with_astro.md +252 -0
  426. package/docs/vi/intlayer_with_create_react_app.md +1230 -0
  427. package/docs/vi/intlayer_with_express.md +409 -0
  428. package/docs/vi/intlayer_with_lynx+react.md +520 -0
  429. package/docs/vi/intlayer_with_nestjs.md +272 -0
  430. package/docs/vi/intlayer_with_next-i18next.md +628 -0
  431. package/docs/vi/intlayer_with_next-intl.md +446 -0
  432. package/docs/vi/intlayer_with_nextjs_14.md +1584 -0
  433. package/docs/vi/intlayer_with_nextjs_15.md +1738 -0
  434. package/docs/vi/intlayer_with_nextjs_16.md +21 -0
  435. package/docs/vi/intlayer_with_nextjs_page_router.md +1504 -0
  436. package/docs/vi/intlayer_with_nuxt.md +821 -0
  437. package/docs/vi/intlayer_with_react_native+expo.md +700 -0
  438. package/docs/vi/intlayer_with_react_router_v7.md +498 -0
  439. package/docs/vi/intlayer_with_tanstack.md +562 -0
  440. package/docs/vi/intlayer_with_vite+preact.md +1722 -0
  441. package/docs/vi/intlayer_with_vite+react.md +1407 -0
  442. package/docs/vi/intlayer_with_vite+solid.md +287 -0
  443. package/docs/vi/intlayer_with_vite+svelte.md +289 -0
  444. package/docs/vi/intlayer_with_vite+vue.md +1071 -0
  445. package/docs/vi/introduction.md +215 -0
  446. package/docs/vi/locale_mapper.md +242 -0
  447. package/docs/vi/mcp_server.md +211 -0
  448. package/docs/vi/packages/express-intlayer/t.md +457 -0
  449. package/docs/vi/packages/intlayer/getConfiguration.md +145 -0
  450. package/docs/vi/packages/intlayer/getEnumeration.md +162 -0
  451. package/docs/vi/packages/intlayer/getHTMLTextDir.md +121 -0
  452. package/docs/vi/packages/intlayer/getLocaleLang.md +81 -0
  453. package/docs/vi/packages/intlayer/getLocaleName.md +129 -0
  454. package/docs/vi/packages/intlayer/getLocalizedUrl.md +309 -0
  455. package/docs/vi/packages/intlayer/getMultilingualUrls.md +221 -0
  456. package/docs/vi/packages/intlayer/getPathWithoutLocale.md +75 -0
  457. package/docs/vi/packages/intlayer/getTranslation.md +201 -0
  458. package/docs/vi/packages/intlayer/getTranslationContent.md +188 -0
  459. package/docs/vi/packages/next-intlayer/t.md +352 -0
  460. package/docs/vi/packages/next-intlayer/useDictionary.md +273 -0
  461. package/docs/vi/packages/next-intlayer/useIntlayer.md +264 -0
  462. package/docs/vi/packages/next-intlayer/useLocale.md +166 -0
  463. package/docs/vi/packages/react-intlayer/t.md +304 -0
  464. package/docs/vi/packages/react-intlayer/useDictionary.md +288 -0
  465. package/docs/vi/packages/react-intlayer/useI18n.md +295 -0
  466. package/docs/vi/packages/react-intlayer/useIntlayer.md +256 -0
  467. package/docs/vi/packages/react-intlayer/useLocale.md +210 -0
  468. package/docs/vi/per_locale_file.md +326 -0
  469. package/docs/vi/readme.md +261 -0
  470. package/docs/vi/releases/v6.md +305 -0
  471. package/docs/vi/roadmap.md +346 -0
  472. package/docs/vi/testing.md +202 -0
  473. package/docs/vi/vs_code_extension.md +126 -0
  474. package/docs/zh/configuration.md +6 -0
  475. package/docs/zh/intlayer_cli.md +8 -3
  476. package/docs/zh/intlayer_with_next-i18next.md +628 -0
  477. package/docs/zh/intlayer_with_next-intl.md +448 -0
  478. package/docs/zh/intlayer_with_nextjs_16.md +21 -0
  479. package/docs/zh/intlayer_with_tanstack.md +4 -0
  480. package/docs/zh/intlayer_with_vite+react.md +4 -0
  481. package/frequent_questions/ar/SSR_Next_no_[locale].md +1 -2
  482. package/frequent_questions/ar/array_as_content_declaration.md +1 -2
  483. package/frequent_questions/ar/build_dictionaries.md +1 -2
  484. package/frequent_questions/ar/build_error_CI_CD.md +1 -2
  485. package/frequent_questions/ar/bun_set_up.md +1 -2
  486. package/frequent_questions/ar/customized_locale_list.md +1 -2
  487. package/frequent_questions/ar/domain_routing.md +1 -2
  488. package/frequent_questions/ar/esbuild_error.md +1 -2
  489. package/frequent_questions/ar/get_locale_cookie.md +1 -2
  490. package/frequent_questions/ar/intlayer_command_undefined.md +1 -2
  491. package/frequent_questions/ar/locale_incorect_in_url.md +1 -2
  492. package/frequent_questions/ar/static_rendering.md +1 -3
  493. package/frequent_questions/ar/translated_path_url.md +1 -2
  494. package/frequent_questions/ar/unknown_command.md +1 -2
  495. package/frequent_questions/de/SSR_Next_no_[locale].md +1 -2
  496. package/frequent_questions/de/array_as_content_declaration.md +1 -2
  497. package/frequent_questions/de/build_dictionaries.md +1 -2
  498. package/frequent_questions/de/build_error_CI_CD.md +1 -2
  499. package/frequent_questions/de/bun_set_up.md +1 -2
  500. package/frequent_questions/de/customized_locale_list.md +1 -2
  501. package/frequent_questions/de/domain_routing.md +1 -2
  502. package/frequent_questions/de/esbuild_error.md +1 -2
  503. package/frequent_questions/de/get_locale_cookie.md +1 -2
  504. package/frequent_questions/de/intlayer_command_undefined.md +1 -2
  505. package/frequent_questions/de/locale_incorect_in_url.md +1 -2
  506. package/frequent_questions/de/static_rendering.md +1 -3
  507. package/frequent_questions/de/translated_path_url.md +1 -2
  508. package/frequent_questions/de/unknown_command.md +1 -2
  509. package/frequent_questions/en/SSR_Next_no_[locale].md +1 -2
  510. package/frequent_questions/en/array_as_content_declaration.md +1 -2
  511. package/frequent_questions/en/build_dictionaries.md +1 -2
  512. package/frequent_questions/en/build_error_CI_CD.md +1 -2
  513. package/frequent_questions/en/bun_set_up.md +1 -2
  514. package/frequent_questions/en/customized_locale_list.md +1 -2
  515. package/frequent_questions/en/domain_routing.md +1 -2
  516. package/frequent_questions/en/esbuild_error.md +1 -2
  517. package/frequent_questions/en/get_locale_cookie.md +1 -2
  518. package/frequent_questions/en/intlayer_command_undefined.md +1 -2
  519. package/frequent_questions/en/locale_incorect_in_url.md +1 -2
  520. package/frequent_questions/en/static_rendering.md +1 -3
  521. package/frequent_questions/en/translated_path_url.md +1 -2
  522. package/frequent_questions/en/unknown_command.md +1 -2
  523. package/frequent_questions/en-GB/SSR_Next_no_[locale].md +1 -2
  524. package/frequent_questions/en-GB/array_as_content_declaration.md +1 -2
  525. package/frequent_questions/en-GB/build_dictionaries.md +1 -2
  526. package/frequent_questions/en-GB/build_error_CI_CD.md +1 -2
  527. package/frequent_questions/en-GB/bun_set_up.md +1 -2
  528. package/frequent_questions/en-GB/customized_locale_list.md +1 -2
  529. package/frequent_questions/en-GB/domain_routing.md +1 -2
  530. package/frequent_questions/en-GB/esbuild_error.md +1 -2
  531. package/frequent_questions/en-GB/get_locale_cookie.md +1 -2
  532. package/frequent_questions/en-GB/intlayer_command_undefined.md +1 -2
  533. package/frequent_questions/en-GB/locale_incorect_in_url.md +1 -2
  534. package/frequent_questions/en-GB/static_rendering.md +1 -3
  535. package/frequent_questions/en-GB/translated_path_url.md +1 -2
  536. package/frequent_questions/en-GB/unknown_command.md +1 -2
  537. package/frequent_questions/es/SSR_Next_no_[locale].md +1 -2
  538. package/frequent_questions/es/array_as_content_declaration.md +1 -2
  539. package/frequent_questions/es/build_dictionaries.md +1 -2
  540. package/frequent_questions/es/build_error_CI_CD.md +1 -2
  541. package/frequent_questions/es/bun_set_up.md +1 -2
  542. package/frequent_questions/es/customized_locale_list.md +1 -2
  543. package/frequent_questions/es/domain_routing.md +1 -2
  544. package/frequent_questions/es/esbuild_error.md +1 -2
  545. package/frequent_questions/es/get_locale_cookie.md +1 -2
  546. package/frequent_questions/es/intlayer_command_undefined.md +1 -2
  547. package/frequent_questions/es/locale_incorect_in_url.md +1 -2
  548. package/frequent_questions/es/static_rendering.md +1 -3
  549. package/frequent_questions/es/translated_path_url.md +1 -2
  550. package/frequent_questions/es/unknown_command.md +1 -2
  551. package/frequent_questions/fr/SSR_Next_no_[locale].md +1 -2
  552. package/frequent_questions/fr/array_as_content_declaration.md +1 -2
  553. package/frequent_questions/fr/build_dictionaries.md +1 -2
  554. package/frequent_questions/fr/build_error_CI_CD.md +1 -2
  555. package/frequent_questions/fr/bun_set_up.md +1 -2
  556. package/frequent_questions/fr/customized_locale_list.md +1 -2
  557. package/frequent_questions/fr/domain_routing.md +1 -2
  558. package/frequent_questions/fr/esbuild_error.md +1 -2
  559. package/frequent_questions/fr/get_locale_cookie.md +1 -2
  560. package/frequent_questions/fr/intlayer_command_undefined.md +1 -2
  561. package/frequent_questions/fr/locale_incorect_in_url.md +1 -2
  562. package/frequent_questions/fr/static_rendering.md +1 -3
  563. package/frequent_questions/fr/translated_path_url.md +1 -2
  564. package/frequent_questions/fr/unknown_command.md +1 -2
  565. package/frequent_questions/hi/SSR_Next_no_[locale].md +1 -2
  566. package/frequent_questions/hi/array_as_content_declaration.md +1 -2
  567. package/frequent_questions/hi/build_dictionaries.md +1 -2
  568. package/frequent_questions/hi/build_error_CI_CD.md +1 -2
  569. package/frequent_questions/hi/bun_set_up.md +1 -2
  570. package/frequent_questions/hi/customized_locale_list.md +1 -2
  571. package/frequent_questions/hi/domain_routing.md +1 -2
  572. package/frequent_questions/hi/esbuild_error.md +1 -2
  573. package/frequent_questions/hi/get_locale_cookie.md +1 -2
  574. package/frequent_questions/hi/intlayer_command_undefined.md +1 -2
  575. package/frequent_questions/hi/locale_incorect_in_url.md +1 -2
  576. package/frequent_questions/hi/static_rendering.md +1 -3
  577. package/frequent_questions/hi/translated_path_url.md +1 -2
  578. package/frequent_questions/hi/unknown_command.md +1 -2
  579. package/frequent_questions/id/SSR_Next_no_[locale].md +104 -0
  580. package/frequent_questions/id/array_as_content_declaration.md +71 -0
  581. package/frequent_questions/id/build_dictionaries.md +58 -0
  582. package/frequent_questions/id/build_error_CI_CD.md +74 -0
  583. package/frequent_questions/id/bun_set_up.md +53 -0
  584. package/frequent_questions/id/customized_locale_list.md +64 -0
  585. package/frequent_questions/id/domain_routing.md +113 -0
  586. package/frequent_questions/id/esbuild_error.md +29 -0
  587. package/frequent_questions/id/get_locale_cookie.md +142 -0
  588. package/frequent_questions/id/intlayer_command_undefined.md +155 -0
  589. package/frequent_questions/id/locale_incorect_in_url.md +73 -0
  590. package/frequent_questions/id/static_rendering.md +44 -0
  591. package/frequent_questions/id/translated_path_url.md +55 -0
  592. package/frequent_questions/id/unknown_command.md +97 -0
  593. package/frequent_questions/it/SSR_Next_no_[locale].md +1 -2
  594. package/frequent_questions/it/array_as_content_declaration.md +1 -2
  595. package/frequent_questions/it/build_dictionaries.md +1 -2
  596. package/frequent_questions/it/build_error_CI_CD.md +1 -2
  597. package/frequent_questions/it/bun_set_up.md +1 -2
  598. package/frequent_questions/it/customized_locale_list.md +1 -2
  599. package/frequent_questions/it/domain_routing.md +1 -2
  600. package/frequent_questions/it/esbuild_error.md +1 -2
  601. package/frequent_questions/it/get_locale_cookie.md +1 -2
  602. package/frequent_questions/it/intlayer_command_undefined.md +1 -2
  603. package/frequent_questions/it/locale_incorect_in_url.md +1 -2
  604. package/frequent_questions/it/static_rendering.md +1 -3
  605. package/frequent_questions/it/translated_path_url.md +1 -2
  606. package/frequent_questions/it/unknown_command.md +1 -2
  607. package/frequent_questions/ja/SSR_Next_no_[locale].md +1 -2
  608. package/frequent_questions/ja/array_as_content_declaration.md +1 -2
  609. package/frequent_questions/ja/build_dictionaries.md +1 -2
  610. package/frequent_questions/ja/build_error_CI_CD.md +1 -2
  611. package/frequent_questions/ja/bun_set_up.md +1 -2
  612. package/frequent_questions/ja/customized_locale_list.md +1 -2
  613. package/frequent_questions/ja/domain_routing.md +1 -2
  614. package/frequent_questions/ja/esbuild_error.md +1 -2
  615. package/frequent_questions/ja/get_locale_cookie.md +1 -2
  616. package/frequent_questions/ja/intlayer_command_undefined.md +1 -2
  617. package/frequent_questions/ja/locale_incorect_in_url.md +1 -2
  618. package/frequent_questions/ja/static_rendering.md +1 -3
  619. package/frequent_questions/ja/translated_path_url.md +1 -2
  620. package/frequent_questions/ja/unknown_command.md +1 -2
  621. package/frequent_questions/ko/SSR_Next_no_[locale].md +1 -2
  622. package/frequent_questions/ko/array_as_content_declaration.md +1 -2
  623. package/frequent_questions/ko/build_dictionaries.md +1 -2
  624. package/frequent_questions/ko/build_error_CI_CD.md +1 -2
  625. package/frequent_questions/ko/bun_set_up.md +1 -2
  626. package/frequent_questions/ko/customized_locale_list.md +1 -2
  627. package/frequent_questions/ko/domain_routing.md +1 -2
  628. package/frequent_questions/ko/esbuild_error.md +1 -2
  629. package/frequent_questions/ko/get_locale_cookie.md +1 -2
  630. package/frequent_questions/ko/intlayer_command_undefined.md +1 -2
  631. package/frequent_questions/ko/locale_incorect_in_url.md +1 -2
  632. package/frequent_questions/ko/static_rendering.md +1 -3
  633. package/frequent_questions/ko/translated_path_url.md +1 -2
  634. package/frequent_questions/ko/unknown_command.md +1 -2
  635. package/frequent_questions/pl/SSR_Next_no_[locale].md +104 -0
  636. package/frequent_questions/pl/array_as_content_declaration.md +71 -0
  637. package/frequent_questions/pl/build_dictionaries.md +58 -0
  638. package/frequent_questions/pl/build_error_CI_CD.md +74 -0
  639. package/frequent_questions/pl/bun_set_up.md +54 -0
  640. package/frequent_questions/pl/customized_locale_list.md +64 -0
  641. package/frequent_questions/pl/domain_routing.md +113 -0
  642. package/frequent_questions/pl/esbuild_error.md +29 -0
  643. package/frequent_questions/pl/get_locale_cookie.md +142 -0
  644. package/frequent_questions/pl/intlayer_command_undefined.md +155 -0
  645. package/frequent_questions/pl/locale_incorect_in_url.md +73 -0
  646. package/frequent_questions/pl/static_rendering.md +44 -0
  647. package/frequent_questions/pl/translated_path_url.md +55 -0
  648. package/frequent_questions/pl/unknown_command.md +97 -0
  649. package/frequent_questions/pt/SSR_Next_no_[locale].md +1 -2
  650. package/frequent_questions/pt/array_as_content_declaration.md +1 -2
  651. package/frequent_questions/pt/build_dictionaries.md +1 -2
  652. package/frequent_questions/pt/build_error_CI_CD.md +1 -2
  653. package/frequent_questions/pt/bun_set_up.md +1 -2
  654. package/frequent_questions/pt/customized_locale_list.md +1 -2
  655. package/frequent_questions/pt/domain_routing.md +1 -2
  656. package/frequent_questions/pt/esbuild_error.md +1 -2
  657. package/frequent_questions/pt/get_locale_cookie.md +1 -2
  658. package/frequent_questions/pt/intlayer_command_undefined.md +1 -2
  659. package/frequent_questions/pt/locale_incorect_in_url.md +1 -2
  660. package/frequent_questions/pt/static_rendering.md +1 -3
  661. package/frequent_questions/pt/translated_path_url.md +1 -2
  662. package/frequent_questions/pt/unknown_command.md +1 -2
  663. package/frequent_questions/ru/SSR_Next_no_[locale].md +1 -2
  664. package/frequent_questions/ru/array_as_content_declaration.md +1 -2
  665. package/frequent_questions/ru/build_dictionaries.md +1 -2
  666. package/frequent_questions/ru/build_error_CI_CD.md +1 -2
  667. package/frequent_questions/ru/bun_set_up.md +1 -2
  668. package/frequent_questions/ru/customized_locale_list.md +1 -2
  669. package/frequent_questions/ru/domain_routing.md +1 -2
  670. package/frequent_questions/ru/esbuild_error.md +1 -2
  671. package/frequent_questions/ru/get_locale_cookie.md +1 -2
  672. package/frequent_questions/ru/intlayer_command_undefined.md +1 -2
  673. package/frequent_questions/ru/locale_incorect_in_url.md +1 -2
  674. package/frequent_questions/ru/static_rendering.md +1 -2
  675. package/frequent_questions/ru/translated_path_url.md +1 -2
  676. package/frequent_questions/ru/unknown_command.md +1 -2
  677. package/frequent_questions/tr/SSR_Next_no_[locale].md +1 -2
  678. package/frequent_questions/tr/array_as_content_declaration.md +1 -2
  679. package/frequent_questions/tr/build_dictionaries.md +1 -2
  680. package/frequent_questions/tr/build_error_CI_CD.md +1 -2
  681. package/frequent_questions/tr/bun_set_up.md +1 -2
  682. package/frequent_questions/tr/customized_locale_list.md +1 -2
  683. package/frequent_questions/tr/domain_routing.md +1 -2
  684. package/frequent_questions/tr/esbuild_error.md +1 -2
  685. package/frequent_questions/tr/get_locale_cookie.md +1 -2
  686. package/frequent_questions/tr/intlayer_command_undefined.md +1 -2
  687. package/frequent_questions/tr/locale_incorect_in_url.md +1 -2
  688. package/frequent_questions/tr/static_rendering.md +1 -2
  689. package/frequent_questions/tr/translated_path_url.md +1 -2
  690. package/frequent_questions/tr/unknown_command.md +1 -2
  691. package/frequent_questions/vi/SSR_Next_no_[locale].md +106 -0
  692. package/frequent_questions/vi/array_as_content_declaration.md +71 -0
  693. package/frequent_questions/vi/build_dictionaries.md +58 -0
  694. package/frequent_questions/vi/build_error_CI_CD.md +74 -0
  695. package/frequent_questions/vi/bun_set_up.md +53 -0
  696. package/frequent_questions/vi/customized_locale_list.md +64 -0
  697. package/frequent_questions/vi/domain_routing.md +113 -0
  698. package/frequent_questions/vi/esbuild_error.md +29 -0
  699. package/frequent_questions/vi/get_locale_cookie.md +142 -0
  700. package/frequent_questions/vi/intlayer_command_undefined.md +155 -0
  701. package/frequent_questions/vi/locale_incorect_in_url.md +73 -0
  702. package/frequent_questions/vi/static_rendering.md +44 -0
  703. package/frequent_questions/vi/translated_path_url.md +55 -0
  704. package/frequent_questions/vi/unknown_command.md +97 -0
  705. package/frequent_questions/zh/SSR_Next_no_[locale].md +1 -2
  706. package/frequent_questions/zh/array_as_content_declaration.md +1 -2
  707. package/frequent_questions/zh/build_dictionaries.md +1 -2
  708. package/frequent_questions/zh/build_error_CI_CD.md +1 -2
  709. package/frequent_questions/zh/bun_set_up.md +1 -2
  710. package/frequent_questions/zh/customized_locale_list.md +1 -2
  711. package/frequent_questions/zh/domain_routing.md +1 -2
  712. package/frequent_questions/zh/esbuild_error.md +1 -2
  713. package/frequent_questions/zh/get_locale_cookie.md +1 -2
  714. package/frequent_questions/zh/intlayer_command_undefined.md +1 -2
  715. package/frequent_questions/zh/locale_incorect_in_url.md +1 -2
  716. package/frequent_questions/zh/static_rendering.md +1 -3
  717. package/frequent_questions/zh/translated_path_url.md +1 -2
  718. package/frequent_questions/zh/unknown_command.md +1 -2
  719. package/legal/id/privacy_notice.md +83 -0
  720. package/legal/id/terms_of_service.md +55 -0
  721. package/legal/pl/privacy_notice.md +83 -0
  722. package/legal/pl/terms_of_service.md +55 -0
  723. package/legal/vi/privacy_notice.md +83 -0
  724. package/legal/vi/terms_of_service.md +55 -0
  725. package/package.json +19 -18
  726. package/src/generated/blog.entry.ts +38 -0
@@ -0,0 +1,1736 @@
1
+ ---
2
+ createdAt: 2025-04-18
3
+ updatedAt: 2025-10-28
4
+ title: Jak przetłumaczyć swoją aplikację Vite i Preact – przewodnik i18n 2025
5
+ description: Dowiedz się, jak uczynić swoją stronę Vite i Preact wielojęzyczną. Postępuj zgodnie z dokumentacją, aby zinternacjonalizować (i18n) i przetłumaczyć ją.
6
+ keywords:
7
+ - Internacjonalizacja
8
+ - Dokumentacja
9
+ - Intlayer
10
+ - Vite
11
+ - Preact
12
+ - JavaScript
13
+ slugs:
14
+ - doc
15
+ - environment
16
+ - vite-and-preact
17
+ applicationTemplate: https://github.com/aymericzip/intlayer-vite-preact-template
18
+ history:
19
+ - version: 7.0.0
20
+ date: 2025-10-28
21
+ changes: Aktualizacja komponentu LocaleRouter do użycia nowej konfiguracji tras
22
+ - version: 5.5.10
23
+ date: 2025-06-29
24
+ changes: Inicjalizacja historii
25
+ ---
26
+
27
+ # Przetłumacz swoją stronę Vite i Preact za pomocą Intlayer | Internacjonalizacja (i18n)
28
+
29
+ > Ten pakiet jest w trakcie rozwoju. Zobacz [zgłoszenie](https://github.com/aymericzip/intlayer/issues/118) po więcej informacji. Pokaż swoje zainteresowanie Intlayer dla Preact, lajkując to zgłoszenie
30
+
31
+ ## Spis treści
32
+
33
+ <TOC/>
34
+
35
+ ## Czym jest Intlayer?
36
+
37
+ **Intlayer** to innowacyjna, open-source'owa biblioteka do internacjonalizacji (i18n), zaprojektowana, aby uprościć wsparcie wielojęzyczne w nowoczesnych aplikacjach webowych.
38
+
39
+ Dzięki Intlayer możesz:
40
+
41
+ - **Łatwo zarządzać tłumaczeniami** za pomocą deklaratywnych słowników na poziomie komponentu.
42
+ - **Dynamicznie lokalizować metadane**, trasy i treści.
43
+ - **Zapewnić wsparcie dla TypeScript** dzięki automatycznie generowanym typom, co poprawia autouzupełnianie i wykrywanie błędów.
44
+ - **Korzystać z zaawansowanych funkcji**, takich jak dynamiczne wykrywanie i przełączanie lokalizacji.
45
+
46
+ ---
47
+
48
+ ## Przewodnik krok po kroku, jak skonfigurować Intlayer w aplikacji Vite i Preact
49
+
50
+ <iframe
51
+ src="https://stackblitz.com/github/aymericzip/intlayer-vite-preact-template?embed=1&ctl=1&file=intlayer.config.ts"
52
+ className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
53
+ title="Demo CodeSandbox - Jak internacjonalizować swoją aplikację za pomocą Intlayer"
54
+ sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
55
+ loading="lazy"
56
+ />
57
+
58
+ Zobacz [Szablon aplikacji](https://github.com/aymericzip/intlayer-vite-preact-template) na GitHub.
59
+
60
+ ### Krok 1: Instalacja zależności
61
+
62
+ Zainstaluj niezbędne pakiety za pomocą npm:
63
+
64
+ ```bash packageManager="npm"
65
+ npm install intlayer preact-intlayer
66
+ npm install vite-intlayer --save-dev
67
+ ```
68
+
69
+ ```bash packageManager="pnpm"
70
+ pnpm add intlayer preact-intlayer
71
+ pnpm add vite-intlayer --save-dev
72
+ ```
73
+
74
+ ```bash packageManager="yarn"
75
+ yarn add intlayer preact-intlayer
76
+ yarn add vite-intlayer --save-dev
77
+ ```
78
+
79
+ - **intlayer**
80
+
81
+ Główne pakiet, który dostarcza narzędzia do internacjonalizacji do zarządzania konfiguracją, tłumaczeń, [deklaracji treści](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/dictionary/content_file.md), transpilecji oraz [poleceń CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/intlayer_cli.md).
82
+
83
+ - **preact-intlayer**
84
+ Pakiet integrujący Intlayer z aplikacją Preact. Zapewnia providery kontekstu oraz hooki do internacjonalizacji w Preact.
85
+
86
+ - **vite-intlayer**
87
+ Zawiera wtyczkę Vite do integracji Intlayer z [bundlerem Vite](https://vite.dev/guide/why.html#why-bundle-for-production), a także middleware do wykrywania preferowanego języka użytkownika, zarządzania ciasteczkami oraz obsługi przekierowań URL.
88
+
89
+ ### Krok 2: Konfiguracja Twojego projektu
90
+
91
+ Utwórz plik konfiguracyjny, aby skonfigurować języki swojej aplikacji:
92
+
93
+ ```typescript fileName="intlayer.config.ts" codeFormat="typescript"
94
+ import { Locales, type IntlayerConfig } from "intlayer";
95
+
96
+ const config: IntlayerConfig = {
97
+ internationalization: {
98
+ locales: [
99
+ Locales.ENGLISH,
100
+ Locales.FRENCH,
101
+ Locales.SPANISH,
102
+ // Twoje pozostałe lokalizacje
103
+ ],
104
+ defaultLocale: Locales.ENGLISH,
105
+ },
106
+ routing: {
107
+ mode: "prefix-no-default", // Domyślnie: prefiksuj wszystkie lokalizacje oprócz domyślnej lokalizacji
108
+ storage: ["cookie", "header"], // Domyślnie: przechowuj lokalizację w ciasteczku i wykrywaj z nagłówka
109
+ },
110
+ };
111
+
112
+ export default config;
113
+ ```
114
+
115
+ ```javascript fileName="intlayer.config.mjs" codeFormat="esm"
116
+ import { Locales } from "intlayer";
117
+
118
+ /** @type {import('intlayer').IntlayerConfig} */
119
+ const config = {
120
+ internationalization: {
121
+ locales: [
122
+ Locales.ENGLISH,
123
+ Locales.FRENCH,
124
+ Locales.SPANISH,
125
+ // Twoje inne lokalizacje
126
+ ],
127
+ defaultLocale: Locales.ENGLISH,
128
+ },
129
+ routing: {
130
+ mode: "prefix-no-default", // Domyślnie: prefiksuj wszystkie lokalizacje oprócz domyślnej lokalizacji
131
+ storage: ["cookie", "header"], // Domyślnie: przechowuj lokalizację w ciasteczku i wykrywaj z nagłówka
132
+ },
133
+ };
134
+
135
+ export default config;
136
+ ```
137
+
138
+ ```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
139
+ const { Locales } = require("intlayer");
140
+
141
+ /** @type {import('intlayer').IntlayerConfig} */
142
+ const config = {
143
+ internationalization: {
144
+ locales: [
145
+ Locales.ENGLISH,
146
+ Locales.FRENCH,
147
+ Locales.SPANISH,
148
+ // Twoje inne lokalizacje
149
+ ],
150
+ defaultLocale: Locales.ENGLISH,
151
+ },
152
+ routing: {
153
+ mode: "prefix-no-default", // Domyślnie: prefiksuj wszystkie lokalizacje oprócz domyślnej lokalizacji
154
+ storage: ["cookie", "header"], // Domyślnie: przechowuj lokalizację w ciasteczku i wykrywaj z nagłówka
155
+ },
156
+ };
157
+
158
+ module.exports = config;
159
+ ```
160
+
161
+ > Dzięki temu plikowi konfiguracyjnemu możesz ustawić lokalizowane adresy URL, tryby routingu, opcje przechowywania, nazwy ciasteczek, lokalizację i rozszerzenie deklaracji zawartości, wyłączyć logi Intlayer w konsoli i wiele więcej. Pełną listę dostępnych parametrów znajdziesz w [dokumentacji konfiguracji](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/configuration.md).
162
+
163
+ ### Krok 3: Zintegruj Intlayer w swojej konfiguracji Vite
164
+
165
+ Dodaj wtyczkę intlayer do swojej konfiguracji.
166
+
167
+ ```typescript fileName="vite.config.ts" codeFormat="typescript"
168
+ import { defineConfig } from "vite";
169
+ import preact from "@preact/preset-vite";
170
+ import { intlayer } from "vite-intlayer";
171
+
172
+ // https://vitejs.dev/config/
173
+ export default defineConfig({
174
+ plugins: [preact(), intlayer()],
175
+ });
176
+ ```
177
+
178
+ ```javascript fileName="vite.config.mjs" codeFormat="esm"
179
+ import { defineConfig } from "vite";
180
+ import preact from "@preact/preset-vite";
181
+ import { intlayer } from "vite-intlayer";
182
+
183
+ // https://vitejs.dev/config/
184
+ export default defineConfig({
185
+ plugins: [preact(), intlayer()],
186
+ });
187
+ ```
188
+
189
+ ```javascript fileName="vite.config.cjs" codeFormat="commonjs"
190
+ const { defineConfig } = require("vite");
191
+ const preact = require("@preact/preset-vite");
192
+ const { intlayer } = require("vite-intlayer");
193
+
194
+ // https://vitejs.dev/config/
195
+ module.exports = defineConfig({
196
+ plugins: [preact(), intlayer()],
197
+ });
198
+ ```
199
+
200
+ > Wtyczka Vite `intlayer()` służy do integracji Intlayer z Vite. Zapewnia budowanie plików deklaracji treści oraz monitoruje je w trybie deweloperskim. Definiuje zmienne środowiskowe Intlayer w aplikacji Vite. Dodatkowo dostarcza aliasy optymalizujące wydajność.
201
+
202
+ ### Krok 4: Zadeklaruj swoją treść
203
+
204
+ Utwórz i zarządzaj deklaracjami treści, aby przechowywać tłumaczenia:
205
+
206
+ ```tsx fileName="src/app.content.tsx" contentDeclarationFormat="typescript"
207
+ import { t, type Dictionary } from "intlayer";
208
+ import type { ComponentChildren } from "preact";
209
+
210
+ const appContent = {
211
+ key: "app",
212
+ content: {
213
+ viteLogo: t({
214
+ en: "Vite logo",
215
+ fr: "Logo Vite",
216
+ es: "Logo Vite",
217
+ }),
218
+ preactLogo: t({
219
+ en: "Preact logo",
220
+ fr: "Logo Preact",
221
+ es: "Logo Preact",
222
+ }),
223
+
224
+ title: "Vite + Preact",
225
+
226
+ count: t({
227
+ en: "count is ",
228
+ fr: "le compte est ",
229
+ es: "el recuento es ",
230
+ }),
231
+
232
+ edit: t<ComponentChildren>({
233
+ en: (
234
+ <>
235
+ Edytuj <code>src/app.tsx</code> i zapisz, aby przetestować HMR
236
+ </>
237
+ ),
238
+ fr: (
239
+ <>
240
+ Éditez <code>src/app.tsx</code> et enregistrez pour tester HMR
241
+ </>
242
+ ),
243
+ es: (
244
+ <>
245
+ Edita <code>src/app.tsx</code> y guarda para probar HMR
246
+ </>
247
+ ),
248
+ }),
249
+
250
+ readTheDocs: t({
251
+ en: "Click on the Vite and Preact logos to learn more",
252
+ fr: "Cliquez sur les logos Vite et Preact pour en savoir plus",
253
+ es: "Haga clic en los logotipos de Vite y Preact para obtener más información",
254
+ }),
255
+ },
256
+ } satisfies Dictionary;
257
+
258
+ export default appContent;
259
+ ```
260
+
261
+ ```javascript fileName="src/app.content.mjs" contentDeclarationFormat="esm"
262
+ import { t } from "intlayer";
263
+ // import { h } from 'preact'; // Potrzebne, jeśli używasz JSX bezpośrednio w .mjs
264
+
265
+ /** @type {import('intlayer').Dictionary} */
266
+ const appContent = {
267
+ key: "app",
268
+ content: {
269
+ viteLogo: t({
270
+ en: "Vite logo",
271
+ fr: "Logo Vite",
272
+ es: "Logo Vite",
273
+ }),
274
+ preactLogo: t({
275
+ en: "Preact logo",
276
+ fr: "Logo Preact",
277
+ es: "Logo Preact",
278
+ }),
279
+
280
+ title: "Vite + Preact",
281
+
282
+ count: t({
283
+ en: "count is ",
284
+ fr: "le compte est ",
285
+ es: "el recuento es ",
286
+ }),
287
+
288
+ edit: t({
289
+ en: "Edytuj src/app.jsx i zapisz, aby przetestować HMR",
290
+ fr: "Éditez src/app.jsx et enregistrez pour tester HMR",
291
+ es: "Edytuj src/app.jsx i zapisz, aby przetestować HMR",
292
+ }),
293
+
294
+ readTheDocs: t({
295
+ en: "Kliknij na loga Vite i Preact, aby dowiedzieć się więcej",
296
+ fr: "Cliquez sur les logos Vite et Preact pour en savoir plus",
297
+ es: "Haga clic en los logotipos de Vite y Preact para obtener más información",
298
+ }),
299
+ },
300
+ };
301
+
302
+ export default appContent;
303
+ ```
304
+
305
+ ```javascript fileName="src/app.content.cjs" contentDeclarationFormat="commonjs"
306
+ const { t } = require("intlayer");
307
+ // const { h } = require('preact'); // Potrzebne, jeśli używasz JSX bezpośrednio w .cjs
308
+
309
+ /** @type {import('intlayer').Dictionary} */
310
+ const appContent = {
311
+ key: "app",
312
+ content: {
313
+ viteLogo: t({
314
+ en: "Vite logo",
315
+ fr: "Logo Vite",
316
+ es: "Logo Vite",
317
+ }),
318
+ preactLogo: t({
319
+ en: "Preact logo",
320
+ fr: "Logo Preact",
321
+ es: "Logo Preact",
322
+ }),
323
+
324
+ title: "Vite + Preact",
325
+
326
+ count: t({
327
+ en: "count is ",
328
+ fr: "le compte est ",
329
+ es: "el recuento es ",
330
+ pl: "licznik to ",
331
+ }),
332
+
333
+ edit: t({
334
+ en: "Edit src/app.tsx and save to test HMR",
335
+ fr: "Éditez src/app.tsx et enregistrez pour tester HMR",
336
+ es: "Edita src/app.tsx y guarda para probar HMR",
337
+ pl: "Edytuj src/app.tsx i zapisz, aby przetestować HMR",
338
+ }),
339
+
340
+ readTheDocs: t({
341
+ en: "Click on the Vite and Preact logos to learn more",
342
+ fr: "Cliquez sur les logos Vite et Preact pour en savoir plus",
343
+ es: "Haga clic en los logotipos de Vite y Preact para obtener más información",
344
+ pl: "Kliknij na loga Vite i Preact, aby dowiedzieć się więcej",
345
+ }),
346
+ },
347
+ };
348
+
349
+ module.exports = appContent;
350
+ ```
351
+
352
+ ```json fileName="src/app.content.json" contentDeclarationFormat="json"
353
+ {
354
+ "$schema": "https://intlayer.org/schema.json",
355
+ "key": "app",
356
+ "content": {
357
+ "viteLogo": {
358
+ "nodeType": "translation",
359
+ "translation": {
360
+ "en": "Vite logo",
361
+ "fr": "Logo Vite",
362
+ "es": "Logo Vite",
363
+ "pl": "Logo Vite"
364
+ }
365
+ },
366
+ "preactLogo": {
367
+ "nodeType": "translation",
368
+ "translation": {
369
+ "en": "Preact logo",
370
+ "fr": "Logo Preact",
371
+ "es": "Logo Preact",
372
+ "pl": "Logo Preact"
373
+ }
374
+ },
375
+ "title": {
376
+ "nodeType": "translation",
377
+ "translation": {
378
+ "en": "Vite + Preact",
379
+ "fr": "Vite + Preact",
380
+ "es": "Vite + Preact",
381
+ "pl": "Vite + Preact"
382
+ }
383
+ },
384
+ "count": {
385
+ "nodeType": "translation",
386
+ "translation": {
387
+ "en": "count is ",
388
+ "fr": "le compte est ",
389
+ "es": "el recuento es ",
390
+ "pl": "licznik to "
391
+ }
392
+ },
393
+ "edit": {
394
+ "nodeType": "translation",
395
+ "translation": {
396
+ "en": "Edit src/app.tsx and save to test HMR",
397
+ "fr": "Éditez src/app.tsx et enregistrez pour tester HMR",
398
+ "es": "Edita src/app.tsx y guarda para probar HMR",
399
+ "pl": "Edytuj src/app.tsx i zapisz, aby przetestować HMR"
400
+ }
401
+ },
402
+ "readTheDocs": {
403
+ "nodeType": "translation",
404
+ "translation": {
405
+ "en": "Click on the Vite and Preact logos to learn more",
406
+ "fr": "Cliquez sur les logos Vite et Preact pour en savoir plus",
407
+ "es": "Haga clic en los logotipos de Vite y Preact para obtener más información",
408
+ "pl": "Kliknij na loga Vite i Preact, aby dowiedzieć się więcej"
409
+ }
410
+ }
411
+ }
412
+ }
413
+ ```
414
+
415
+ > Twoje deklaracje treści mogą być zdefiniowane w dowolnym miejscu w aplikacji, pod warunkiem, że zostaną umieszczone w katalogu `contentDir` (domyślnie `./src`). I muszą odpowiadać rozszerzeniu pliku deklaracji treści (domyślnie `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`).
416
+
417
+ > Aby uzyskać więcej szczegółów, odnieś się do [dokumentacji deklaracji treści](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/dictionary/content_file.md).
418
+
419
+ > Jeśli Twój plik treści zawiera kod TSX, może być konieczne zaimportowanie `import { h } from "preact";` lub upewnienie się, że pragma JSX jest poprawnie ustawiona dla Preact.
420
+
421
+ ### Krok 5: Wykorzystaj Intlayer w swoim kodzie
422
+
423
+ Uzyskaj dostęp do swoich słowników treści w całej aplikacji:
424
+
425
+ ```tsx {6,10} fileName="src/app.tsx" codeFormat="typescript"
426
+ import { useState } from "preact/hooks";
427
+ import type { FunctionalComponent } from "preact";
428
+ import preactLogo from "./assets/preact.svg"; // Zakładamy, że masz plik preact.svg
429
+ import viteLogo from "/vite.svg";
430
+ import "./app.css"; // Zakładamy, że Twój plik CSS nazywa się app.css
431
+ import { IntlayerProvider, useIntlayer } from "preact-intlayer";
432
+
433
+ const AppContent: FunctionalComponent = () => {
434
+ const [count, setCount] = useState(0);
435
+ const content = useIntlayer("app");
436
+
437
+ return (
438
+ <>
439
+ <div>
440
+ <a href="https://vitejs.dev" target="_blank">
441
+ <img src={viteLogo} class="logo" alt={content.viteLogo.value} />
442
+ </a>
443
+ <a href="https://preactjs.com" target="_blank">
444
+ <img
445
+ src={preactLogo}
446
+ class="logo preact"
447
+ alt={content.preactLogo.value}
448
+ />
449
+ </a>
450
+ </div>
451
+ <h1>{content.title}</h1>
452
+ <div class="card">
453
+ <button onClick={() => setCount((count) => count + 1)}>
454
+ {content.count}
455
+ {count}
456
+ </button>
457
+ <p>{content.edit}</p>
458
+ </div>
459
+ <p class="read-the-docs">{content.readTheDocs}</p>
460
+ </>
461
+ );
462
+ };
463
+
464
+ const App: FunctionalComponent = () => (
465
+ <IntlayerProvider>
466
+ <AppContent />
467
+ </IntlayerProvider>
468
+ );
469
+
470
+ export default App;
471
+ ```
472
+
473
+ ```jsx {5,9} fileName="src/app.jsx" codeFormat="esm"
474
+ import { useState } from "preact/hooks";
475
+ import preactLogo from "./assets/preact.svg";
476
+ import viteLogo from "/vite.svg";
477
+ import "./app.css";
478
+ import { IntlayerProvider, useIntlayer } from "preact-intlayer";
479
+
480
+ const AppContent = () => {
481
+ const [count, setCount] = useState(0);
482
+ const content = useIntlayer("app");
483
+
484
+ return (
485
+ <>
486
+ <div>
487
+ <a href="https://vitejs.dev" target="_blank">
488
+ <img src={viteLogo} class="logo" alt={content.viteLogo.value} />
489
+ </a>
490
+ <a href="https://preactjs.com" target="_blank">
491
+ <img
492
+ src={preactLogo}
493
+ class="logo preact"
494
+ alt={content.preactLogo.value}
495
+ />
496
+ </a>
497
+ </div>
498
+ <h1>{content.title}</h1>
499
+ <div class="card">
500
+ <button onClick={() => setCount((count) => count + 1)}>
501
+ {content.count}
502
+ {count}
503
+ </button>
504
+ <p>{content.edit}</p>
505
+ </div>
506
+ <p class="read-the-docs">{content.readTheDocs}</p>
507
+ </>
508
+ );
509
+ };
510
+
511
+ const App = () => (
512
+ <IntlayerProvider>
513
+ <AppContent />
514
+ </IntlayerProvider>
515
+ );
516
+
517
+ export default App;
518
+ ```
519
+
520
+ ```jsx {5,9} fileName="src/app.cjsx" codeFormat="commonjs"
521
+ const { useState } = require("preact/hooks");
522
+ const preactLogo = require("./assets/preact.svg");
523
+ const viteLogo = require("/vite.svg");
524
+ require("./app.css");
525
+ const { IntlayerProvider, useIntlayer } = require("preact-intlayer");
526
+
527
+ const AppContent = () => {
528
+ const [count, setCount] = useState(0);
529
+ const content = useIntlayer("app");
530
+
531
+ return (
532
+ <>
533
+ <div>
534
+ <a href="https://vitejs.dev" target="_blank">
535
+ <img src={viteLogo} class="logo" alt={content.viteLogo.value} />
536
+ </a>
537
+ <a href="https://preactjs.com" target="_blank">
538
+ <img
539
+ src={preactLogo}
540
+ class="logo preact"
541
+ alt={content.preactLogo.value}
542
+ />
543
+ </a>
544
+ </div>
545
+ <h1>{content.title}</h1>
546
+ <div class="card">
547
+ <button onClick={() => setCount((count) => count + 1)}>
548
+ {content.count}
549
+ {count}
550
+ </button>
551
+ <p>{content.edit}</p>
552
+ </div>
553
+ <p class="read-the-docs">{content.readTheDocs}</p>
554
+ </>
555
+ );
556
+ };
557
+
558
+ const App = () => (
559
+ <IntlayerProvider>
560
+ <AppContent />
561
+ </IntlayerProvider>
562
+ );
563
+
564
+ module.exports = App;
565
+ ```
566
+
567
+ > Jeśli chcesz użyć swojej zawartości w atrybucie typu `string`, takim jak `alt`, `title`, `href`, `aria-label` itp., musisz wywołać wartość funkcji, na przykład:
568
+
569
+ > ```jsx
570
+ > <img src={content.image.src.value} alt={content.image.value} />
571
+ > ```
572
+
573
+ > Uwaga: W Preact `className` jest zazwyczaj zapisywane jako `class`.
574
+
575
+ > Aby dowiedzieć się więcej o hooku `useIntlayer`, zapoznaj się z [dokumentacją](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/packages/react-intlayer/useIntlayer.md) (API jest podobne dla `preact-intlayer`).
576
+
577
+ ### (Opcjonalny) Krok 6: Zmień język swojej zawartości
578
+
579
+ Aby zmienić język swojej zawartości, możesz użyć funkcji `setLocale` dostarczonej przez hook `useLocale`. Funkcja ta pozwala ustawić lokalizację aplikacji i odpowiednio zaktualizować zawartość.
580
+
581
+ ```tsx fileName="src/components/LocaleSwitcher.tsx" codeFormat="typescript"
582
+ import type { FunctionalComponent } from "preact";
583
+ import { Locales } from "intlayer";
584
+ import { useLocale } from "preact-intlayer";
585
+
586
+ const LocaleSwitcher: FunctionalComponent = () => {
587
+ const { setLocale } = useLocale();
588
+
589
+ return (
590
+ <button onClick={() => setLocale(Locales.ENGLISH)}>
591
+ Zmień język na angielski
592
+ </button>
593
+ );
594
+ };
595
+
596
+ export default LocaleSwitcher;
597
+ ```
598
+
599
+ ```jsx fileName="src/components/LocaleSwitcher.jsx" codeFormat="esm"
600
+ import { Locales } from "intlayer";
601
+ import { useLocale } from "preact-intlayer";
602
+
603
+ const LocaleSwitcher = () => {
604
+ const { setLocale } = useLocale();
605
+
606
+ return (
607
+ <button onClick={() => setLocale(Locales.ENGLISH)}>
608
+ Zmień język na angielski
609
+ </button>
610
+ );
611
+ };
612
+
613
+ export default LocaleSwitcher;
614
+ ```
615
+
616
+ ```jsx fileName="src/components/LocaleSwitcher.cjsx" codeFormat="commonjs"
617
+ const { Locales } = require("intlayer");
618
+ const { useLocale } = require("preact-intlayer");
619
+
620
+ const LocaleSwitcher = () => {
621
+ const { setLocale } = useLocale();
622
+
623
+ return (
624
+ <button onClick={() => setLocale(Locales.ENGLISH)}>
625
+ Zmień język na angielski
626
+ </button>
627
+ );
628
+ };
629
+
630
+ module.exports = LocaleSwitcher;
631
+ ```
632
+
633
+ > Aby dowiedzieć się więcej o hooku `useLocale`, zapoznaj się z [dokumentacją](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/packages/react-intlayer/useLocale.md) (API jest podobne dla `preact-intlayer`).
634
+
635
+ ### (Opcjonalny) Krok 7: Dodaj lokalizowane routingi do swojej aplikacji
636
+
637
+ Celem tego kroku jest utworzenie unikalnych ścieżek dla każdego języka. Jest to przydatne dla SEO oraz przyjaznych dla SEO adresów URL.
638
+ Przykład:
639
+
640
+ ```plaintext
641
+ - https://example.com/about
642
+ - https://example.com/es/about
643
+ - https://example.com/fr/about
644
+ ```
645
+
646
+ > Domyślnie trasy nie mają prefiksu dla domyślnej lokalizacji (`routing.mode: "prefix-no-default"`). Jeśli chcesz dodać prefiks dla domyślnej lokalizacji, możesz ustawić opcję `routing.mode`na`"prefix-all"` w swojej konfiguracji. Więcej informacji znajdziesz w [dokumentacji konfiguracji](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/configuration.md).
647
+
648
+ Aby dodać lokalizowane routowanie do swojej aplikacji, możesz utworzyć komponent `LocaleRouter`, który otacza trasy aplikacji i obsługuje routowanie oparte na lokalizacji. Oto przykład z użyciem [preact-iso](https://github.com/preactjs/preact-iso):
649
+
650
+ Najpierw zainstaluj `preact-iso`:
651
+
652
+ ```bash packageManager="npm"
653
+ npm install preact-iso
654
+ ```
655
+
656
+ ```bash packageManager="pnpm"
657
+ pnpm add preact-iso
658
+ ```
659
+
660
+ ```bash packageManager="yarn"
661
+ yarn add preact-iso
662
+ ```
663
+
664
+ ```tsx fileName="src/components/LocaleRouter.tsx" codeFormat="typescript"
665
+ import { configuration, getPathWithoutLocale, type Locale } from "intlayer";
666
+ // Importy typów komponentów z preact
667
+ import type { ComponentChildren, FunctionalComponent } from "preact";
668
+ import { useEffect } from "preact/hooks";
669
+ import { IntlayerProvider } from "preact-intlayer";
670
+ import { LocationProvider, useLocation } from "preact-iso";
671
+
672
+ const { internationalization, routing } = configuration;
673
+ const { locales, defaultLocale } = internationalization;
674
+
675
+ // Komponent do nawigacji, który wykonuje przekierowanie na wskazaną ścieżkę
676
+ const Navigate: FunctionalComponent<{ to: string; replace?: boolean }> = ({
677
+ to,
678
+ replace,
679
+ }) => {
680
+ const { route } = useLocation();
681
+ useEffect(() => {
682
+ route(to, replace);
683
+ }, [to, replace, route]);
684
+ return null;
685
+ };
686
+
687
+ /**
688
+ * Komponent obsługujący lokalizację i opakowujący dzieci w odpowiedni kontekst lokalizacji.
689
+ * Zarządza wykrywaniem i walidacją lokalizacji na podstawie URL.
690
+ */
691
+ const AppLocalized: FunctionalComponent<{
692
+ children: ComponentChildren;
693
+ locale?: Locale;
694
+ }> = ({ children, locale }) => {
695
+ const { path: pathname, url } = useLocation();
696
+
697
+ if (!url) {
698
+ return null;
699
+ }
700
+
701
+ const search = url.substring(pathname.length);
702
+
703
+ // Określa bieżącą lokalizację, domyślnie ustawiając lokalizację domyślną, jeśli nie jest podana
704
+ const currentLocale = locale ?? defaultLocale;
705
+
706
+ // Usuwa prefiks lokalizacji z ścieżki, aby skonstruować ścieżkę bazową
707
+ const pathWithoutLocale = getPathWithoutLocale(
708
+ pathname // Bieżąca ścieżka URL
709
+ );
710
+
711
+ /**
712
+ * Jeśli routing.mode to 'prefix-all', domyślna lokalizacja powinna zawsze mieć prefiks.
713
+ */
714
+ if (routing.mode === "prefix-all") {
715
+ // Waliduj locale
716
+ if (!locale || !locales.includes(locale)) {
717
+ // Przekieruj do domyślnego locale z zaktualizowaną ścieżką
718
+ return (
719
+ <Navigate
720
+ to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
721
+ replace // Zamień bieżący wpis w historii na nowy
722
+ />
723
+ );
724
+ }
725
+
726
+ // Owiń dzieci w IntlayerProvider i ustaw bieżące locale
727
+ return (
728
+ <IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
729
+ );
730
+ } else {
731
+ /**
732
+ * Gdy routing.mode nie jest 'prefix-all', domyślne locale nie jest poprzedzone prefiksem.
733
+ * Upewnij się, że bieżące locale jest ważne i nie jest domyślnym locale.
734
+ */
735
+ if (
736
+ currentLocale.toString() !== defaultLocale.toString() &&
737
+ !locales
738
+ .filter(
739
+ (loc) => loc.toString() !== defaultLocale.toString() // Wyklucz domyślny język
740
+ )
741
+ .includes(currentLocale) // Sprawdź, czy bieżący język znajduje się na liście ważnych języków
742
+ ) {
743
+ // Przekieruj na ścieżkę bez prefiksu języka
744
+ return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
745
+ }
746
+
747
+ // Otocz dzieci komponentem IntlayerProvider i ustaw bieżący język
748
+ return (
749
+ <IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
750
+ );
751
+ }
752
+ };
753
+
754
+ const RouterContent: FunctionalComponent<{
755
+ children: ComponentChildren;
756
+ }> = ({ children }) => {
757
+ const { path } = useLocation();
758
+
759
+ if (!path) {
760
+ return null;
761
+ }
762
+
763
+ const pathLocale = path.split("/")[1] as Locale;
764
+
765
+ const isLocaleRoute = locales
766
+ .filter(
767
+ (locale) => routing.mode === "prefix-all" || locale !== defaultLocale
768
+ )
769
+ .some((locale) => locale.toString() === pathLocale);
770
+
771
+ if (isLocaleRoute) {
772
+ return <AppLocalized locale={pathLocale}>{children}</AppLocalized>;
773
+ }
774
+
775
+ return (
776
+ <AppLocalized
777
+ locale={routing.mode !== "prefix-all" ? defaultLocale : undefined}
778
+ >
779
+ {children}
780
+ </AppLocalized>
781
+ );
782
+ };
783
+
784
+ /**
785
+ * Komponent routera, który ustawia trasy specyficzne dla lokalizacji.
786
+ * Używa preact-iso do zarządzania nawigacją i renderowania komponentów zlokalizowanych.
787
+ */
788
+ export const LocaleRouter: FunctionalComponent<{
789
+ children: ComponentChildren;
790
+ }> = ({ children }) => (
791
+ <LocationProvider>
792
+ <RouterContent>{children}</RouterContent>
793
+ </LocationProvider>
794
+ );
795
+ ```
796
+
797
+ ```jsx fileName="src/components/LocaleRouter.jsx" codeFormat="esm"
798
+ // Importowanie niezbędnych zależności i funkcji
799
+ import { configuration, getPathWithoutLocale } from "intlayer";
800
+ import { IntlayerProvider } from "preact-intlayer";
801
+ import { LocationProvider, useLocation } from "preact-iso";
802
+ import { useEffect } from "preact/hooks";
803
+ import { h } from "preact"; // Wymagane dla JSX
804
+
805
+ // Destrukturyzacja konfiguracji z Intlayer
806
+ const { internationalization, routing } = configuration;
807
+ const { locales, defaultLocale } = internationalization;
808
+
809
+ const Navigate = ({ to, replace }) => {
810
+ const { route } = useLocation();
811
+ useEffect(() => {
812
+ route(to, replace);
813
+ }, [to, replace, route]);
814
+ return null;
815
+ };
816
+
817
+ /**
818
+ /**
819
+ * Komponent obsługujący lokalizację i opakowujący dzieci w odpowiedni kontekst lokalizacji.
820
+ * Zarządza wykrywaniem i walidacją lokalizacji na podstawie URL.
821
+ */
822
+ const AppLocalized = ({ children, locale }) => {
823
+ const { path: pathname, url } = useLocation();
824
+
825
+ if (!url) {
826
+ return null;
827
+ }
828
+
829
+ const search = url.substring(pathname.length);
830
+
831
+ // Określ bieżącą lokalizację, domyślnie używając lokalizacji domyślnej, jeśli nie została podana
832
+ const currentLocale = locale ?? defaultLocale;
833
+
834
+ // Usuń prefiks lokalizacji ze ścieżki, aby utworzyć ścieżkę bazową
835
+ const pathWithoutLocale = getPathWithoutLocale(
836
+ pathname // Bieżąca ścieżka URL
837
+ );
838
+
839
+ /**
840
+ * Jeśli routing.mode to 'prefix-all', domyślna lokalizacja powinna zawsze mieć prefiks.
841
+ */
842
+ if (routing.mode === "prefix-all") {
843
+ // Waliduj lokalizację
844
+ if (!locale || !locales.includes(locale)) {
845
+ // Przekieruj do domyślnej lokalizacji z zaktualizowaną ścieżką
846
+ return (
847
+ <Navigate
848
+ to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
849
+ replace // Zamień bieżący wpis w historii na nowy
850
+ />
851
+ );
852
+ }
853
+
854
+ // Owiń dzieci w IntlayerProvider i ustaw bieżącą lokalizację
855
+ return (
856
+ <IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
857
+ );
858
+ } else {
859
+ /**
860
+ * Gdy routing.mode nie jest 'prefix-all', domyślna lokalizacja nie jest poprzedzona prefiksem.
861
+ * Upewnij się, że bieżąca lokalizacja jest poprawna i nie jest domyślną lokalizacją.
862
+ */
863
+ if (
864
+ currentLocale.toString() !== defaultLocale.toString() &&
865
+ !locales
866
+ .filter(
867
+ (loc) => loc.toString() !== defaultLocale.toString() // Wyklucz domyślny język
868
+ )
869
+ .includes(currentLocale) // Sprawdź, czy bieżący język znajduje się na liście ważnych języków
870
+ ) {
871
+ // Przekieruj na ścieżkę bez prefiksu językowego
872
+ return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
873
+ }
874
+
875
+ // Opakuj dzieci w IntlayerProvider i ustaw bieżący język
876
+ return (
877
+ <IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
878
+ );
879
+ }
880
+ };
881
+
882
+ const RouterContent = ({ children }) => {
883
+ const { path } = useLocation();
884
+
885
+ if (!path) {
886
+ return null;
887
+ }
888
+
889
+ const pathLocale = path.split("/")[1];
890
+
891
+ const isLocaleRoute = locales
892
+ .filter(
893
+ (locale) => routing.mode === "prefix-all" || locale !== defaultLocale
894
+ )
895
+ .some((locale) => locale.toString() === pathLocale);
896
+
897
+ if (isLocaleRoute) {
898
+ return <AppLocalized locale={pathLocale}>{children}</AppLocalized>;
899
+ }
900
+
901
+ return (
902
+ <AppLocalized
903
+ locale={routing.mode !== "prefix-all" ? defaultLocale : undefined}
904
+ >
905
+ {children}
906
+ </AppLocalized>
907
+ );
908
+ };
909
+
910
+ /**
911
+ * Komponent routera, który ustawia trasy specyficzne dla lokalizacji.
912
+ * Używa preact-iso do zarządzania nawigacją i renderowania komponentów zlokalizowanych.
913
+ */
914
+ export const LocaleRouter = ({ children }) => (
915
+ <LocationProvider>
916
+ <RouterContent>{children}</RouterContent>
917
+ </LocationProvider>
918
+ );
919
+ ```
920
+
921
+ ```jsx fileName="src/components/LocaleRouter.cjsx" codeFormat="commonjs"
922
+ // Importowanie niezbędnych zależności i funkcji
923
+ const { configuration, getPathWithoutLocale } = require("intlayer");
924
+ const { IntlayerProvider } = require("preact-intlayer");
925
+ const { LocationProvider, useLocation } = require("preact-iso");
926
+ const { useEffect } = require("preact/hooks");
927
+ const { h } = require("preact"); // Wymagane dla JSX
928
+
929
+ // Destrukturyzacja konfiguracji z Intlayer
930
+ const { internationalization, routing } = configuration;
931
+ const { locales, defaultLocale } = internationalization;
932
+
933
+ const Navigate = ({ to, replace }) => {
934
+ const { route } = useLocation();
935
+ useEffect(() => {
936
+ route(to, replace);
937
+ }, [to, replace, route]);
938
+ return null;
939
+ };
940
+
941
+ /**
942
+ * Komponent obsługujący lokalizację i opakowujący dzieci w odpowiedni kontekst lokalizacji.
943
+ * Zarządza wykrywaniem i walidacją lokalizacji na podstawie URL.
944
+ */
945
+ const AppLocalized = ({ children, locale }) => {
946
+ const { path: pathname, url } = useLocation();
947
+
948
+ if (!url) {
949
+ return null;
950
+ }
951
+
952
+ const search = url.substring(pathname.length);
953
+
954
+ // Określ bieżący język, domyślnie używając języka domyślnego, jeśli nie jest podany
955
+ const currentLocale = locale ?? defaultLocale;
956
+
957
+ // Usuń prefiks języka z ścieżki, aby utworzyć ścieżkę bazową
958
+ const pathWithoutLocale = getPathWithoutLocale(
959
+ pathname // Bieżąca ścieżka URL
960
+ );
961
+
962
+ /**
963
+ * Jeśli routing.mode to 'prefix-all', domyślny język powinien zawsze mieć prefiks.
964
+ */
965
+ if (routing.mode === "prefix-all") {
966
+ // Waliduj język
967
+ if (!locale || !locales.includes(locale)) {
968
+ // Przekieruj do domyślnego języka z zaktualizowaną ścieżką
969
+ return (
970
+ <Navigate
971
+ to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
972
+ replace // Zamień bieżący wpis w historii na nowy
973
+ />
974
+ );
975
+ }
976
+
977
+ // Otocz dzieci IntlayerProvider i ustaw bieżący locale
978
+ return (
979
+ <IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
980
+ );
981
+ } else {
982
+ /**
983
+ * Gdy routing.mode nie jest 'prefix-all', domyślny locale nie jest poprzedzony prefiksem.
984
+ * Upewnij się, że bieżący locale jest ważny i nie jest domyślnym locale.
985
+ */
986
+ if (
987
+ currentLocale.toString() !== defaultLocale.toString() &&
988
+ !locales
989
+ .filter(
990
+ (loc) => loc.toString() !== defaultLocale.toString() // Wyklucz domyślny locale
991
+ )
992
+ .includes(currentLocale) // Sprawdź, czy bieżący locale jest na liście ważnych locale
993
+ ) {
994
+ // Przekieruj do ścieżki bez prefiksu lokalizacji
995
+ return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
996
+ }
997
+
998
+ // Otocz dzieci komponentem IntlayerProvider i ustaw aktualną lokalizację
999
+ return (
1000
+ <IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
1001
+ );
1002
+ }
1003
+ };
1004
+
1005
+ const RouterContent = ({ children }) => {
1006
+ const { path } = useLocation();
1007
+
1008
+ if (!path) {
1009
+ return null;
1010
+ }
1011
+
1012
+ const pathLocale = path.split("/")[1];
1013
+
1014
+ const isLocaleRoute = locales
1015
+ .filter(
1016
+ (locale) => routing.mode === "prefix-all" || locale !== defaultLocale
1017
+ )
1018
+ .some((locale) => locale.toString() === pathLocale);
1019
+
1020
+ if (isLocaleRoute) {
1021
+ return <AppLocalized locale={pathLocale}>{children}</AppLocalized>;
1022
+ }
1023
+
1024
+ return (
1025
+ <AppLocalized
1026
+ locale={routing.mode !== "prefix-all" ? defaultLocale : undefined}
1027
+ >
1028
+ {children}
1029
+ </AppLocalized>
1030
+ );
1031
+ };
1032
+
1033
+ /**
1034
+ * Komponent routera, który ustawia trasy specyficzne dla lokalizacji.
1035
+ * Używa preact-iso do zarządzania nawigacją i renderowania komponentów zlokalizowanych.
1036
+ */
1037
+ const LocaleRouter = ({ children }) => (
1038
+ <LocationProvider>
1039
+ <RouterContent>{children}</RouterContent>
1040
+ </LocationProvider>
1041
+ );
1042
+
1043
+ module.exports = { LocaleRouter };
1044
+ ```
1045
+
1046
+ Następnie możesz użyć komponentu `LocaleRouter` w swojej aplikacji:
1047
+
1048
+ ```tsx fileName="src/app.tsx" codeFormat="typescript"
1049
+ import { LocaleRouter } from "./components/LocaleRouter";
1050
+ import type { FunctionalComponent } from "preact";
1051
+ // ... Twój komponent AppContent (zdefiniowany w Kroku 5)
1052
+
1053
+ const App: FunctionalComponent = () => (
1054
+ <LocaleRouter>
1055
+ <AppContent />
1056
+ </LocaleRouter>
1057
+ );
1058
+
1059
+ export default App;
1060
+ ```
1061
+
1062
+ ```jsx fileName="src/app.jsx" codeFormat="esm"
1063
+ import { LocaleRouter } from "./components/LocaleRouter";
1064
+ // ... Twój komponent AppContent (zdefiniowany w Kroku 5)
1065
+
1066
+ const App = () => (
1067
+ <LocaleRouter>
1068
+ <AppContent />
1069
+ </LocaleRouter>
1070
+ );
1071
+
1072
+ export default App;
1073
+ ```
1074
+
1075
+ ```jsx fileName="src/app.cjsx" codeFormat="commonjs"
1076
+ const { LocaleRouter } = require("./components/LocaleRouter");
1077
+ // ... Twój komponent AppContent (zdefiniowany w Kroku 5)
1078
+
1079
+ const App = () => (
1080
+ <LocaleRouter>
1081
+ <AppContent />
1082
+ </LocaleRouter>
1083
+ );
1084
+
1085
+ module.exports = App;
1086
+ ```
1087
+
1088
+ Równolegle możesz również użyć `intlayerMiddleware`, aby dodać routing po stronie serwera do swojej aplikacji. Ten plugin automatycznie wykryje bieżący język na podstawie URL i ustawi odpowiedni cookie językowy. Jeśli nie zostanie określony żaden język, plugin wybierze najbardziej odpowiedni język na podstawie preferencji językowych przeglądarki użytkownika. Jeśli nie zostanie wykryty żaden język, nastąpi przekierowanie do domyślnego języka.
1089
+
1090
+ > Uwaga: aby używać `intlayerMiddleware` w środowisku produkcyjnym, musisz przenieść pakiet `vite-intlayer` z `devDependencies` do `dependencies`.
1091
+
1092
+ ```typescript {3,7} fileName="vite.config.ts" codeFormat="typescript"
1093
+ import { defineConfig } from "vite";
1094
+ import preact from "@preact/preset-vite";
1095
+ import { intlayer, intlayerMiddleware } from "vite-intlayer";
1096
+
1097
+ typescript {3,7} fileName="vite.config.ts" codeFormat="typescript"
1098
+ import { defineConfig } from "vite";
1099
+ import preact from "@preact/preset-vite";
1100
+ import { intlayer, intlayerMiddleware } from "vite-intlayer";
1101
+
1102
+ // https://vitejs.dev/config/
1103
+ export default defineConfig({
1104
+ plugins: [preact(), intlayer(), intlayerMiddleware()],
1105
+ });
1106
+ ```
1107
+
1108
+ ```javascript {3,7} fileName="vite.config.mjs" codeFormat="esm"
1109
+ import { defineConfig } from "vite";
1110
+ import preact from "@preact/preset-vite";
1111
+ import { intlayer, intlayerMiddleware } from "vite-intlayer";
1112
+
1113
+ // https://vitejs.dev/config/
1114
+ export default defineConfig({
1115
+ plugins: [preact(), intlayer(), intlayerMiddleware()],
1116
+ });
1117
+ ```
1118
+
1119
+ ```javascript {3,7} fileName="vite.config.cjs" codeFormat="commonjs"
1120
+ const { defineConfig } = require("vite");
1121
+ const preact = require("@preact/preset-vite");
1122
+ const { intlayer, intlayerMiddleware } = require("vite-intlayer");
1123
+
1124
+ // https://vitejs.dev/config/
1125
+ module.exports = defineConfig({
1126
+ plugins: [preact(), intlayer(), intlayerMiddleware()],
1127
+ });
1128
+ ```
1129
+
1130
+ ### (Opcjonalnie) Krok 8: Zmień URL, gdy zmienia się lokalizacja
1131
+
1132
+ Aby zmienić URL, gdy zmienia się lokalizacja, możesz użyć właściwości `onLocaleChange` dostarczonej przez hook `useLocale`. Równolegle możesz użyć `useLocation` i `route` z `preact-iso`, aby zaktualizować ścieżkę URL.
1133
+
1134
+ ```tsx fileName="src/components/LocaleSwitcher.tsx" codeFormat="typescript"
1135
+ import { useLocation, route } from "preact-iso";
1136
+ import {
1137
+ Locales,
1138
+ getHTMLTextDir,
1139
+ getLocaleName,
1140
+ getLocalizedUrl,
1141
+ } from "intlayer";
1142
+ import { useLocale } from "preact-intlayer";
1143
+ import type { FunctionalComponent } from "preact";
1144
+
1145
+ const LocaleSwitcher: FunctionalComponent = () => {
1146
+ const location = useLocation();
1147
+ plugins: [preact(), intlayer(), intlayerMiddleware()],
1148
+ });
1149
+ ```
1150
+
1151
+ ### (Opcjonalny) Krok 8: Zmiana URL po zmianie lokalizacji
1152
+
1153
+ Aby zmienić URL po zmianie lokalizacji, możesz użyć właściwości `onLocaleChange` dostarczonej przez hook `useLocale`. Równolegle możesz użyć `useLocation` oraz `route` z `preact-iso`, aby zaktualizować ścieżkę URL.
1154
+
1155
+ ```tsx fileName="src/components/LocaleSwitcher.tsx" codeFormat="typescript"
1156
+ import { useLocation, route } from "preact-iso";
1157
+ import {
1158
+ Locales,
1159
+ getHTMLTextDir,
1160
+ getLocaleName,
1161
+ getLocalizedUrl,
1162
+ } from "intlayer";
1163
+ import { useLocale } from "preact-intlayer";
1164
+ import type { FunctionalComponent } from "preact";
1165
+
1166
+ const LocaleSwitcher: FunctionalComponent = () => {
1167
+ const location = useLocation();
1168
+ const { locale, availableLocales, setLocale } = useLocale({
1169
+ onLocaleChange: (newLocale) => {
1170
+ const currentFullPath = location.url; // preact-iso dostarcza pełny URL
1171
+ // Budowanie URL z zaktualizowanym locale
1172
+ // Przykład: /es/about?foo=bar
1173
+ const pathWithLocale = getLocalizedUrl(currentFullPath, newLocale);
1174
+
1175
+ // Aktualizacja ścieżki URL
1176
+ route(pathWithLocale, true); // true oznacza replace
1177
+ },
1178
+ });
1179
+
1180
+ return (
1181
+ <div>
1182
+ <button popovertarget="localePopover">{getLocaleName(locale)}</button>
1183
+ <div id="localePopover" popover="auto">
1184
+ {availableLocales.map((localeItem) => (
1185
+ <a
1186
+ href={getLocalizedUrl(location.url, localeItem)}
1187
+ hreflang={localeItem}
1188
+ aria-current={locale === localeItem ? "page" : undefined}
1189
+ onClick={(e) => {
1190
+ e.preventDefault();
1191
+ setLocale(localeItem);
1192
+ // Nawigacja programowa po ustawieniu lokalizacji będzie obsługiwana przez onLocaleChange
1193
+ }}
1194
+ key={localeItem}
1195
+ >
1196
+ <span>
1197
+ {/* Lokalizacja - np. FR */}
1198
+ {localeItem}
1199
+ </span>
1200
+ <span>
1201
+ {/* Język w swojej własnej lokalizacji - np. Français */}
1202
+ {getLocaleName(localeItem, localeItem)}
1203
+ </span>
1204
+ <span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
1205
+ {/* Język w bieżącej lokalizacji - np. Francés przy ustawionej lokalizacji Locales.SPANISH */}
1206
+ {getLocaleName(localeItem, locale)}
1207
+ </span>
1208
+ <span dir="ltr" lang={Locales.ENGLISH}>
1209
+ {/* Język po angielsku - np. French */}
1210
+ {getLocaleName(localeItem, Locales.ENGLISH)}
1211
+ </span>
1212
+ </a>
1213
+ ))}
1214
+ </div>
1215
+ </div>
1216
+ );
1217
+ };
1218
+
1219
+ export default LocaleSwitcher;
1220
+ ```
1221
+
1222
+ ```jsx fileName="src/components/LocaleSwitcher.jsx" codeFormat="esm"
1223
+ import { useLocation, route } from "preact-iso";
1224
+ import {
1225
+ Locales,
1226
+ getHTMLTextDir,
1227
+ getLocaleName,
1228
+ getLocalizedUrl,
1229
+ } from "intlayer";
1230
+ import { useLocale } from "preact-intlayer";
1231
+ import { h } from "preact"; // Dla JSX
1232
+
1233
+ const LocaleSwitcher = () => {
1234
+ const location = useLocation();
1235
+ const { locale, availableLocales, setLocale } = useLocale({
1236
+ onLocaleChange: (newLocale) => {
1237
+ const currentFullPath = location.url;
1238
+ const pathWithLocale = getLocalizedUrl(currentFullPath, newLocale);
1239
+ route(pathWithLocale, true);
1240
+ },
1241
+ });
1242
+
1243
+ return (
1244
+ <div>
1245
+ <button popovertarget="localePopover">{getLocaleName(locale)}</button>
1246
+ <div id="localePopover" popover="auto">
1247
+ {availableLocales.map((localeItem) => (
1248
+ <a
1249
+ href={getLocalizedUrl(location.url, localeItem)}
1250
+ hreflang={localeItem}
1251
+ aria-current={locale === localeItem ? "page" : undefined}
1252
+ onClick={(e) => {
1253
+ e.preventDefault();
1254
+ setLocale(localeItem);
1255
+ }}
1256
+ key={localeItem}
1257
+ >
1258
+ <span>{localeItem}</span>
1259
+ <span>{getLocaleName(localeItem, localeItem)}</span>
1260
+ <span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
1261
+ {getLocaleName(localeItem, locale)}
1262
+ </span>
1263
+ <span dir="ltr" lang={Locales.ENGLISH}>
1264
+ {getLocaleName(localeItem, Locales.ENGLISH)}
1265
+ </span>
1266
+ </a>
1267
+ ))}
1268
+ </div>
1269
+ </div>
1270
+ );
1271
+ };
1272
+
1273
+ export default LocaleSwitcher;
1274
+ ```
1275
+
1276
+ ```jsx fileName="src/components/LocaleSwitcher.cjsx" codeFormat="commonjs"
1277
+ const { useLocation, route } = require("preact-iso");
1278
+ const {
1279
+ Locales,
1280
+ getHTMLTextDir,
1281
+ getLocaleName,
1282
+ getLocalizedUrl,
1283
+ } = require("intlayer");
1284
+ const { useLocale } = require("preact-intlayer");
1285
+ const { h } = require("preact"); // Do JSX
1286
+
1287
+ const LocaleSwitcher = () => {
1288
+ const location = useLocation();
1289
+ const { locale, availableLocales, setLocale } = useLocale({
1290
+ onLocaleChange: (newLocale) => {
1291
+ const currentFullPath = location.url;
1292
+ const pathWithLocale = getLocalizedUrl(currentFullPath, newLocale);
1293
+ route(pathWithLocale, true);
1294
+ },
1295
+ });
1296
+
1297
+ return (
1298
+ <div>
1299
+ <button popovertarget="localePopover">{getLocaleName(locale)}</button>
1300
+ <div id="localePopover" popover="auto">
1301
+ {availableLocales.map((localeItem) => (
1302
+ <a
1303
+ href={getLocalizedUrl(location.url, localeItem)}
1304
+ hreflang={localeItem}
1305
+ aria-current={locale === localeItem ? "page" : undefined}
1306
+ onClick={(e) => {
1307
+ e.preventDefault();
1308
+ setLocale(localeItem);
1309
+ }}
1310
+ key={localeItem}
1311
+ >
1312
+ <span>{localeItem}</span>
1313
+ <span>{getLocaleName(localeItem, localeItem)}</span>
1314
+ <span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
1315
+ {getLocaleName(localeItem, locale)}
1316
+ </span>
1317
+ <span dir="ltr" lang={Locales.ENGLISH}>
1318
+ {getLocaleName(localeItem, Locales.ENGLISH)}
1319
+ </span>
1320
+ </a>
1321
+ ))}
1322
+ </div>
1323
+ </div>
1324
+ );
1325
+ };
1326
+
1327
+ module.exports = LocaleSwitcher;
1328
+ ```
1329
+
1330
+ > Odniesienia do dokumentacji:
1331
+ >
1332
+ > > - [`useLocale` hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/packages/react-intlayer/useLocale.md) (API jest podobne dla `preact-intlayer`) > - [`getLocaleName` hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/packages/intlayer/getLocaleName.md) > - [`getLocalizedUrl` hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/packages/intlayer/getLocalizedUrl.md) > - [`getHTMLTextDir` hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/packages/intlayer/getHTMLTextDir.md) > - atrybut [`hreflang`](https://developers.google.com/search/docs/specialty/international/localized-versions?hl=fr) > - atrybut [`lang`](https://developer.mozilla.org/pl/docs/Web/HTML/Global_attributes/lang) > - atrybut [`dir`](https://developer.mozilla.org/pl/docs/Web/HTML/Global_attributes/dir) > - atrybut [`aria-current`](https://developer.mozilla.org/pl/docs/Web/Accessibility/ARIA/Attributes/aria-current) > - [API Popover](https://developer.mozilla.org/pl/docs/Web/API/Popover_API)la.org/en-US/docs/Web/HTML/Global_attributes/dir)> - [`aria-current` atrybut](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-current)> - [Popover API](https://developer.mozilla.org/en-US/docs/Web/API/Popover_API)
1333
+
1334
+ Poniżej znajduje się zaktualizowany **Krok 9** z dodatkowymi wyjaśnieniami i dopracowanymi przykładami kodu:
1335
+
1336
+ ---
1337
+
1338
+ ### (Opcjonalny) Krok 9: Zmiana atrybutów języka i kierunku w elemencie HTML
1339
+
1340
+ Gdy Twoja aplikacja obsługuje wiele języków, kluczowe jest zaktualizowanie atrybutów `lang` i `dir` w tagu `<html>`, aby odpowiadały bieżącej lokalizacji. Zapewnia to:
1341
+
1342
+ - **Dostępność**: Czytniki ekranu i technologie wspomagające polegają na poprawnym atrybucie `lang`, aby prawidłowo wymawiać i interpretować zawartość.
1343
+ - **Renderowanie tekstu**: Atrybut `dir` (kierunek) zapewnia, że tekst jest wyświetlany w odpowiedniej kolejności (np. od lewej do prawej dla angielskiego, od prawej do lewej dla arabskiego lub hebrajskiego), co jest niezbędne dla czytelności.
1344
+ - **SEO**: Wyszukiwarki używają atrybutu `lang` do określenia języka Twojej strony, co pomaga w wyświetlaniu odpowiednio zlokalizowanych treści w wynikach wyszukiwania.
1345
+
1346
+ Poprzez dynamiczną aktualizację tych atrybutów podczas zmiany lokalizacji, zapewniasz spójne i dostępne doświadczenie dla użytkowników we wszystkich obsługiwanych językach.
1347
+
1348
+ #### Implementacja hooka
1349
+
1350
+ Utwórz niestandardowy hook do zarządzania atrybutami HTML. Hook nasłuchuje zmian lokalizacji i odpowiednio aktualizuje atrybuty:
1351
+
1352
+ ```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx" codeFormat="typescript"
1353
+ import { useEffect } from "preact/hooks";
1354
+ import { useLocale } from "preact-intlayer";
1355
+ import { getHTMLTextDir } from "intlayer";
1356
+
1357
+ /**
1358
+ * Aktualizuje atrybuty `lang` i `dir` elementu <html> na podstawie bieżącej lokalizacji.
1359
+ * - `lang`: Informuje przeglądarki i wyszukiwarki o języku strony.
1360
+ * - `dir`: Zapewnia prawidłowy kierunek czytania (np. 'ltr' dla angielskiego, 'rtl' dla arabskiego).
1361
+ *
1362
+ * Ta dynamiczna aktualizacja jest niezbędna dla prawidłowego renderowania tekstu, dostępności i SEO.
1363
+ */
1364
+ export const useI18nHTMLAttributes = () => {
1365
+ const { locale } = useLocale();
1366
+
1367
+ useEffect(() => {
1368
+ // Aktualizuje atrybut języka na bieżący locale.
1369
+ document.documentElement.lang = locale;
1370
+
1371
+ // Ustawia kierunek tekstu na podstawie bieżącego locale.
1372
+ document.documentElement.dir = getHTMLTextDir(locale);
1373
+ }, [locale]);
1374
+ };
1375
+ ```
1376
+
1377
+ ```jsx fileName="src/hooks/useI18nHTMLAttributes.jsx" codeFormat="esm"
1378
+ import { useEffect } from "preact/hooks";
1379
+ import { useLocale } from "preact-intlayer";
1380
+ import { getHTMLTextDir } from "intlayer";
1381
+
1382
+ /**
1383
+ * Aktualizuje atrybuty `lang` i `dir` elementu HTML <html> na podstawie bieżącej lokalizacji.
1384
+ */
1385
+ export const useI18nHTMLAttributes = () => {
1386
+ const { locale } = useLocale();
1387
+
1388
+ useEffect(() => {
1389
+ document.documentElement.lang = locale;
1390
+ document.documentElement.dir = getHTMLTextDir(locale);
1391
+ }, [locale]);
1392
+ };
1393
+ ```
1394
+
1395
+ ```jsx fileName="src/hooks/useI18nHTMLAttributes.cjsx" codeFormat="commonjs"
1396
+ const { useEffect } = require("preact/hooks");
1397
+ const { useLocale } = require("preact-intlayer");
1398
+ const { getHTMLTextDir } = require("intlayer");
1399
+
1400
+ /**
1401
+ * Aktualizuje atrybuty `lang` i `dir` elementu HTML <html> na podstawie bieżącej lokalizacji.
1402
+ */
1403
+ const useI18nHTMLAttributes = () => {
1404
+ const { locale } = useLocale();
1405
+
1406
+ useEffect(() => {
1407
+ document.documentElement.lang = locale;
1408
+ document.documentElement.dir = getHTMLTextDir(locale);
1409
+ }, [locale]);
1410
+ };
1411
+
1412
+ module.exports = { useI18nHTMLAttributes };
1413
+ ```
1414
+
1415
+ #### Użycie Hooka w Twojej Aplikacji
1416
+
1417
+ Zintegruj hook w swoim głównym komponencie, aby atrybuty HTML były aktualizowane za każdym razem, gdy zmienia się lokalizacja:
1418
+
1419
+ ```tsx fileName="src/app.tsx" codeFormat="typescript"
1420
+ import type { FunctionalComponent } from "preact";
1421
+ import { IntlayerProvider } from "preact-intlayer"; // useIntlayer już zaimportowany, jeśli AppContent tego potrzebuje
1422
+ import { useI18nHTMLAttributes } from "./hooks/useI18nHTMLAttributes";
1423
+ import "./app.css";
1424
+ // Definicja AppContent z Kroku 5
1425
+
1426
+ const AppWithHooks: FunctionalComponent = () => {
1427
+ // Zastosuj hook do aktualizacji atrybutów lang i dir znacznika <html> na podstawie lokalizacji.
1428
+ useI18nHTMLAttributes();
1429
+
1430
+ // Zakładając, że AppContent jest Twoim głównym komponentem wyświetlającym zawartość z Kroku 5
1431
+ return <AppContent />;
1432
+ };
1433
+
1434
+ const App: FunctionalComponent = () => (
1435
+ <IntlayerProvider>
1436
+ <AppWithHooks />
1437
+ </IntlayerProvider>
1438
+ );
1439
+
1440
+ export default App;
1441
+ ```
1442
+
1443
+ ```jsx fileName="src/app.jsx" codeFormat="esm"
1444
+ import { IntlayerProvider } from "preact-intlayer";
1445
+ import { useI18nHTMLAttributes } from "./hooks/useI18nHTMLAttributes";
1446
+ import "./app.css";
1447
+ // Definicja AppContent z Kroku 5
1448
+
1449
+ const AppWithHooks = () => {
1450
+ useI18nHTMLAttributes();
1451
+ return <AppContent />;
1452
+ };
1453
+
1454
+ const App = () => (
1455
+ <IntlayerProvider>
1456
+ <AppWithHooks />
1457
+ </IntlayerProvider>
1458
+ );
1459
+
1460
+ export default App;
1461
+ ```
1462
+
1463
+ ```jsx fileName="src/app.cjsx" codeFormat="commonjs"
1464
+ const { IntlayerProvider } = require("preact-intlayer");
1465
+ const { useI18nHTMLAttributes } = require("./hooks/useI18nHTMLAttributes");
1466
+ require("./app.css");
1467
+ // Definicja AppContent z Kroku 5
1468
+
1469
+ const AppWithHooks = () => {
1470
+ useI18nHTMLAttributes();
1471
+ return <AppContent />;
1472
+ };
1473
+
1474
+ const App = () => (
1475
+ <IntlayerProvider>
1476
+ <AppWithHooks />
1477
+ </IntlayerProvider>
1478
+ );
1479
+
1480
+ module.exports = App;
1481
+ ```
1482
+
1483
+ Wprowadzając te zmiany, Twoja aplikacja:
1484
+
1485
+ - Zapewni, że atrybut **language** (`lang`) poprawnie odzwierciedla aktualną lokalizację, co jest ważne dla SEO i zachowania przeglądarki.
1486
+ - Dostosuje **kierunek tekstu** (`dir`) zgodnie z lokalizacją, poprawiając czytelność i użyteczność dla języków o różnych kierunkach czytania.
1487
+ - Zapewnij bardziej **dostępne** doświadczenie, ponieważ technologie wspomagające polegają na tych atrybutach, aby działać optymalnie.
1488
+
1489
+ ### (Opcjonalny) Krok 10: Tworzenie Lokalizowanego Komponentu Linku
1490
+
1491
+ Aby zapewnić, że nawigacja w Twojej aplikacji respektuje bieżącą lokalizację, możesz stworzyć niestandardowy komponent `Link`. Ten komponent automatycznie dodaje prefiks z aktualnym językiem do wewnętrznych adresów URL.
1492
+
1493
+ To zachowanie jest przydatne z kilku powodów:
1494
+
1495
+ - **SEO i doświadczenie użytkownika**: Lokalizowane adresy URL pomagają wyszukiwarkom poprawnie indeksować strony specyficzne dla języka oraz dostarczają użytkownikom treści w preferowanym przez nich języku.
1496
+ - **Spójność**: Używając lokalizowanego linku w całej aplikacji, zapewniasz, że nawigacja pozostaje w obrębie bieżącej lokalizacji, zapobiegając nieoczekiwanym zmianom języka.
1497
+ - **Utrzymanie**: Centralizacja logiki lokalizacji w jednym komponencie upraszcza zarządzanie URL-ami.
1498
+
1499
+ Dla Preact z `preact-iso` standardowo używa się tagów `<a>` do nawigacji, a routing obsługuje `preact-iso`. Jeśli potrzebujesz programatycznej nawigacji po kliknięciu (np. aby wykonać akcje przed nawigacją), możesz użyć funkcji `route` z `useLocation`. Oto jak możesz stworzyć niestandardowy komponent anchor, który lokalizuje URL-e:
1500
+
1501
+ ```tsx fileName="src/components/LocalizedLink.tsx" codeFormat="typescript"
1502
+ import { getLocalizedUrl } from "intlayer";
1503
+ import { useLocale, useLocation, route } from "preact-intlayer"; // Zakładając, że useLocation i route mogą pochodzić z preact-iso przez preact-intlayer, jeśli są reeksportowane, lub importować bezpośrednio
1504
+ // Jeśli nie jest ponownie eksportowane, importuj bezpośrednio: import { useLocation, route } from "preact-iso";
1505
+ import type { JSX } from "preact"; // Dla HTMLAttributes
1506
+ import { forwardRef } from "preact/compat"; // Dla przekazywania referencji
1507
+
1508
+ export interface LocalizedLinkProps
1509
+ extends JSX.HTMLAttributes<HTMLAnchorElement> {
1510
+ href: string;
1511
+ replace?: boolean; // Opcjonalne: do zastąpienia stanu historii
1512
+ }
1513
+
1514
+ /**
1515
+ * Funkcja pomocnicza do sprawdzania, czy podany URL jest zewnętrzny.
1516
+ * Jeśli URL zaczyna się od http:// lub https://, jest uznawany za zewnętrzny.
1517
+ */
1518
+ export const checkIsExternalLink = (href?: string): boolean =>
1519
+ /^https?:\/\//.test(href ?? "");
1520
+
1521
+ /**
1522
+ * Niestandardowy komponent Link, który dostosowuje atrybut href na podstawie bieżącej lokalizacji.
1523
+ * Dla linków wewnętrznych używa `getLocalizedUrl`, aby poprzedzić URL lokalizacją (np. /fr/about).
1524
+ * Zapewnia to, że nawigacja pozostaje w tym samym kontekście lokalizacji.
1525
+ * Używa standardowego tagu <a>, ale może wywołać nawigację po stronie klienta za pomocą `route` z preact-iso.
1526
+ */
1527
+ export const LocalizedLink = forwardRef<HTMLAnchorElement, LocalizedLinkProps>(
1528
+ ({ href, children, onClick, replace = false, ...props }, ref) => {
1529
+ const { locale } = useLocale();
1530
+ const location = useLocation(); // z preact-iso
1531
+ const isExternalLink = checkIsExternalLink(href);
1532
+
1533
+ const hrefI18n =
1534
+ href && !isExternalLink ? getLocalizedUrl(href, locale) : href;
1535
+
1536
+ const handleClick = (event: JSX.TargetedMouseEvent<HTMLAnchorElement>) => {
1537
+ if (onClick) {
1538
+ onClick(event);
1539
+ }
1540
+ if (
1541
+ !isExternalLink &&
1542
+ href && // Upewnij się, że href jest zdefiniowany
1543
+ event.button === 0 && // Kliknięcie lewym przyciskiem myszy
1544
+ !event.metaKey &&
1545
+ !event.ctrlKey &&
1546
+ !event.shiftKey &&
1547
+ !event.altKey && // Standardowe sprawdzenie modyfikatorów
1548
+ !props.target // Nie otwieraj w nowej karcie/oknie
1549
+ ) {
1550
+ event.preventDefault();
1551
+ if (location.url !== hrefI18n) {
1552
+ // Nawiguj tylko, jeśli URL jest inny
1553
+ route(hrefI18n, replace); // Użyj route z preact-iso
1554
+ }
1555
+ }
1556
+ };
1557
+
1558
+ return (
1559
+ <a href={hrefI18n} ref={ref} onClick={handleClick} {...props}>
1560
+ {children}
1561
+ </a>
1562
+ );
1563
+ }
1564
+ );
1565
+ ```
1566
+
1567
+ ```jsx fileName="src/components/LocalizedLink.jsx" codeFormat="esm"
1568
+ import { getLocalizedUrl } from "intlayer";
1569
+ import { useLocale } from "preact-intlayer";
1570
+ import { useLocation, route } from "preact-iso"; // Import z preact-iso
1571
+ import { forwardRef } from "preact/compat";
1572
+ import { h } from "preact"; // Do JSX
1573
+
1574
+ export const checkIsExternalLink = (href) => /^https?:\/\//.test(href ?? "");
1575
+
1576
+ export const LocalizedLink = forwardRef(
1577
+ ({ href, children, onClick, replace = false, ...props }, ref) => {
1578
+ const { locale } = useLocale();
1579
+ const location = useLocation();
1580
+ const isExternalLink = checkIsExternalLink(href);
1581
+
1582
+ const hrefI18n =
1583
+ href && !isExternalLink ? getLocalizedUrl(href, locale) : href;
1584
+
1585
+ const handleClick = (event) => {
1586
+ if (onClick) {
1587
+ onClick(event);
1588
+ }
1589
+ if (
1590
+ !isExternalLink &&
1591
+ href &&
1592
+ event.button === 0 &&
1593
+ !event.metaKey &&
1594
+ !event.ctrlKey &&
1595
+ !event.shiftKey &&
1596
+ !event.altKey &&
1597
+ !props.target
1598
+ ) {
1599
+ event.preventDefault();
1600
+ if (location.url !== hrefI18n) {
1601
+ route(hrefI18n, replace);
1602
+ }
1603
+ }
1604
+ };
1605
+
1606
+ return (
1607
+ <a href={hrefI18n} ref={ref} onClick={handleClick} {...props}>
1608
+ {children}
1609
+ </a>
1610
+ );
1611
+ }
1612
+ );
1613
+ ```
1614
+
1615
+ ```jsx fileName="src/components/LocalizedLink.cjsx" codeFormat="commonjs"
1616
+ const { getLocalizedUrl } = require("intlayer");
1617
+ const { useLocale } = require("preact-intlayer");
1618
+ const { useLocation, route } = require("preact-iso"); // Import z preact-iso
1619
+ const { forwardRef } = require("preact/compat");
1620
+ const { h } = require("preact"); // Do JSX
1621
+
1622
+ const checkIsExternalLink = (href) => /^https?:\/\//.test(href ?? "");
1623
+
1624
+ const LocalizedLink = forwardRef(
1625
+ ({ href, children, onClick, replace = false, ...props }, ref) => {
1626
+ const { locale } = useLocale();
1627
+ const location = useLocation();
1628
+ const isExternalLink = checkIsExternalLink(href);
1629
+
1630
+ const hrefI18n =
1631
+ href && !isExternalLink ? getLocalizedUrl(href, locale) : href;
1632
+
1633
+ const handleClick = (event) => {
1634
+ if (onClick) {
1635
+ onClick(event);
1636
+ }
1637
+ if (
1638
+ !isExternalLink &&
1639
+ href &&
1640
+ event.button === 0 &&
1641
+ !event.metaKey &&
1642
+ !event.ctrlKey &&
1643
+ !event.shiftKey &&
1644
+ !event.altKey &&
1645
+ !props.target
1646
+ ) {
1647
+ event.preventDefault();
1648
+ if (location.url !== hrefI18n) {
1649
+ route(hrefI18n, replace);
1650
+ }
1651
+ }
1652
+ };
1653
+
1654
+ return (
1655
+ <a href={hrefI18n} ref={ref} onClick={handleClick} {...props}>
1656
+ {children}
1657
+ </a>
1658
+ );
1659
+ }
1660
+ );
1661
+
1662
+ module.exports = { LocalizedLink, checkIsExternalLink };
1663
+ ```
1664
+
1665
+ #### Jak to działa
1666
+
1667
+ - **Wykrywanie linków zewnętrznych**:
1668
+ Funkcja pomocnicza `checkIsExternalLink` określa, czy URL jest zewnętrzny. Linki zewnętrzne pozostają niezmienione.
1669
+ - **Pobieranie bieżącej lokalizacji**:
1670
+ Hook `useLocale` dostarcza bieżącą lokalizację.
1671
+ - **Lokalizacja URL**:
1672
+ Dla linków wewnętrznych `getLocalizedUrl` dodaje prefiks z bieżącą lokalizacją.
1673
+ - **Nawigacja po stronie klienta**:
1674
+ Funkcja `handleClick` sprawdza, czy jest to link wewnętrzny oraz czy standardowa nawigacja powinna zostać zablokowana. Jeśli tak, używa funkcji `route` z `preact-iso` (uzyskanej przez `useLocation` lub bezpośrednio zaimportowanej) do wykonania nawigacji po stronie klienta. Zapewnia to zachowanie podobne do SPA bez pełnego przeładowania strony.
1675
+ - **Zwracanie linku**:
1676
+ Komponent zwraca element `<a>` z zlokalizowanym URL-em oraz niestandardowym obsługiwaczem kliknięć.
1677
+
1678
+ ### Konfiguracja TypeScript
1679
+
1680
+ Intlayer wykorzystuje rozszerzenia modułów, aby korzystać z zalet TypeScript i wzmocnić Twoją bazę kodu.
1681
+
1682
+ ![Autouzupełnianie](https://github.com/aymericzip/intlayer/blob/main/docs/assets/autocompletion.png?raw=true)
1683
+
1684
+ ![Błąd tłumaczenia](https://github.com/aymericzip/intlayer/blob/main/docs/assets/translation_error.png?raw=true)
1685
+
1686
+ Upewnij się, że Twoja konfiguracja TypeScript zawiera automatycznie generowane typy.
1687
+
1688
+ ```json5 fileName="tsconfig.json"
1689
+ {
1690
+ // ... Twoje istniejące konfiguracje TypeScript
1691
+ "compilerOptions": {
1692
+ // ...
1693
+ "jsx": "react-jsx",
1694
+ "jsxImportSource": "preact", // Zalecane dla Preact 10+
1695
+ // ...
1696
+ },
1697
+ "include": [
1698
+ // ... Twoje istniejące konfiguracje TypeScript
1699
+ ".intlayer/**/*.ts", // Uwzględnij automatycznie generowane typy
1700
+ ],
1701
+ }
1702
+ ```
1703
+
1704
+ > Upewnij się, że Twój plik `tsconfig.json` jest skonfigurowany pod Preact, szczególnie opcje `jsx` i `jsxImportSource` lub `jsxFactory`/`jsxFragmentFactory` dla starszych wersji Preact, jeśli nie korzystasz z domyślnych ustawień `preset-vite`.
1705
+
1706
+ ### Konfiguracja Git
1707
+
1708
+ Zaleca się ignorowanie plików generowanych przez Intlayer. Pozwala to uniknąć ich zatwierdzania do repozytorium Git.
1709
+
1710
+ Aby to zrobić, możesz dodać następujące instrukcje do pliku `.gitignore`:
1711
+
1712
+ ```plaintext
1713
+ # Ignoruj pliki generowane przez Intlayer
1714
+ .intlayer
1715
+ ```
1716
+
1717
+ ### Rozszerzenie VS Code
1718
+
1719
+ Aby poprawić swoje doświadczenie deweloperskie z Intlayer, możesz zainstalować oficjalne **rozszerzenie Intlayer dla VS Code**.
1720
+
1721
+ [Zainstaluj z Marketplace VS Code](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
1722
+
1723
+ To rozszerzenie oferuje:
1724
+
1725
+ - **Autouzupełnianie** kluczy tłumaczeń.
1726
+ - **Wykrywanie błędów w czasie rzeczywistym** dla brakujących tłumaczeń.
1727
+ - **Podgląd w linii** przetłumaczonej zawartości.
1728
+ - **Szybkie akcje** umożliwiające łatwe tworzenie i aktualizowanie tłumaczeń.
1729
+
1730
+ Aby uzyskać więcej informacji o korzystaniu z rozszerzenia, zapoznaj się z [dokumentacją rozszerzenia Intlayer dla VS Code](https://intlayer.org/doc/vs-code-extension).
1731
+
1732
+ ---
1733
+
1734
+ ### Idź dalej
1735
+
1736
+ Aby pójść dalej, możesz zaimplementować [edytor wizualny](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/intlayer_visual_editor.md) lub wyeksportować swoją zawartość, korzystając z [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/intlayer_CMS.md).