@intlayer/docs 7.0.7 → 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,1078 @@
1
+ ---
2
+ createdAt: 2025-11-01
3
+ updatedAt: 2025-11-01
4
+ title: Come internazionalizzare la tua applicazione Next.js usando next-i18next
5
+ description: Configura l'i18n con next-i18next - best practice e consigli SEO per app Next.js multilingue, coprendo internazionalizzazione, organizzazione dei contenuti e configurazione tecnica.
6
+ slugs:
7
+ - blog
8
+ - nextjs-internationalization-using-next-i18next
9
+ applicationTemplate: https://github.com/aymericzip/next-i18next-template
10
+ history:
11
+ - version: 7.0.6
12
+ date: 2025-11-01
13
+ changes: Versione iniziale
14
+ ---
15
+
16
+ # Come internazionalizzare la tua applicazione Next.js usando next-i18next nel 2025
17
+
18
+ ## Indice
19
+
20
+ <TOC/>
21
+
22
+ ## Cos'è next-i18next?
23
+
24
+ **next-i18next** è una popolare soluzione di internazionalizzazione (i18n) per applicazioni Next.js. Mentre il pacchetto originale `next-i18next` è stato progettato per il Pages Router, questa guida ti mostra come implementare i18next con il moderno **App Router** utilizzando direttamente `i18next` e `react-i18next`.
25
+
26
+ Con questo approccio, puoi:
27
+
28
+ - **Organizzare le traduzioni** usando namespace (ad esempio, `common.json`, `about.json`) per una migliore gestione dei contenuti.
29
+ - **Caricare le traduzioni in modo efficiente** caricando solo i namespace necessari per ogni pagina, riducendo la dimensione del bundle.
30
+ - **Supportare sia componenti server che client** con una corretta gestione di SSR e hydration.
31
+ - **Garantire il supporto a TypeScript** con configurazione locale e chiavi di traduzione tipizzate.
32
+ - **Ottimizza per la SEO** con una corretta internazionalizzazione di metadata, sitemap e robots.txt.
33
+
34
+ > In alternativa, puoi anche fare riferimento alla [guida next-intl](https://github.com/aymericzip/intlayer/blob/main/docs/blog/it/i18n_using_next-intl.md), oppure utilizzare direttamente [Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/intlayer_with_nextjs_16.md).
35
+
36
+ > Vedi il confronto in [next-i18next vs next-intl vs Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/blog/it/next-i18next_vs_next-intl_vs_intlayer.md).
37
+
38
+ ## Pratiche da seguire
39
+
40
+ Prima di entrare nell'implementazione, ecco alcune pratiche da seguire:
41
+
42
+ - **Imposta gli attributi HTML `lang` e `dir`**
43
+ - Nel tuo layout, calcola `dir` usando `getLocaleDirection(locale)` e imposta `<html lang={locale} dir={dir}>` per una corretta accessibilità e SEO.
44
+ - **Dividi i messaggi per namespace**
45
+ Organizza i file JSON per locale e namespace (ad esempio, `common.json`, `about.json`) per caricare solo ciò di cui hai bisogno.
46
+ - **Minimizza il payload client**
47
+ Nelle pagine, invia solo i namespace richiesti a `NextIntlClientProvider` (ad esempio, `pick(messages, ['common', 'about'])`).
48
+ - **Preferisci pagine statiche**
49
+ Usa pagine statiche il più possibile per migliori prestazioni e SEO.
50
+ - **I18n nei componenti server**
51
+ I componenti server, come le pagine o tutti i componenti non marcati come `client`, sono statici e possono essere prerenderizzati al momento della build. Quindi dovremo passare loro le funzioni di traduzione come props.
52
+ - **Configura i tipi TypeScript**
53
+ - Per le tue localizzazioni, assicurati la sicurezza dei tipi in tutta la tua applicazione.
54
+ - **Proxy per il reindirizzamento**
55
+ Usa un proxy per gestire il rilevamento della localizzazione e il routing, e reindirizzare l'utente all'URL corretto con prefisso locale.
56
+ - **Internazionalizzazione dei tuoi metadata, sitemap, robots.txt**
57
+ Internazionalizza i tuoi metadata, sitemap, robots.txt usando la funzione `generateMetadata` fornita da Next.js per garantire una migliore scoperta da parte dei motori di ricerca in tutte le localizzazioni.
58
+ - **Localizza i Link**
59
+ Localizza i Link usando il componente `Link` per reindirizzare l'utente all'URL corretto con prefisso locale. È importante garantire la scoperta delle tue pagine in tutte le localizzazioni.
60
+ - **Automatizza test e traduzioni**
61
+ Automatizzare test e traduzioni aiuta a risparmiare tempo nella manutenzione della tua applicazione multilingue.
62
+
63
+ > Consulta la nostra documentazione che elenca tutto ciò che devi sapere sull'internazionalizzazione e SEO: [Internazionalizzazione (i18n) con next-intl](https://github.com/aymericzip/intlayer/blob/main/docs/blog/it/internationalization_and_SEO.md).
64
+
65
+ ---
66
+
67
+ ## Guida passo-passo per configurare i18next in un'applicazione Next.js
68
+
69
+ <iframe
70
+ src="https://stackblitz.com/github/aymericzip/next-i18next-template?embed=1&ctl=1&file=src/app/i18n.ts"
71
+ className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
72
+ title="Demo CodeSandbox - Come internazionalizzare la tua applicazione usando Intlayer"
73
+ sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
74
+ loading="lazy"
75
+
76
+ > Consulta il [Template dell'Applicazione](https://github.com/aymericzip/next-i18next-template) su GitHub.
77
+
78
+ Ecco la struttura del progetto che andremo a creare:
79
+
80
+ ```bash
81
+ .
82
+ ├── i18n.config.ts
83
+ └── src # Src è opzionale
84
+ ├── locales
85
+ │ ├── en
86
+ │ │ ├── common.json
87
+ │ │ └── about.json
88
+ │ └── fr
89
+ │ ├── common.json
90
+ │ └── about.json
91
+ ├── types
92
+ │ └── i18next.d.ts
93
+ ├── app
94
+ │ ├── proxy.ts
95
+ │ ├── i18n
96
+ │ │ └── server.ts
97
+ │ └── [locale]
98
+ │ ├── layout.tsx
99
+ │ ├── (home) # / (Route Group per non inquinare tutte le pagine con i messaggi della home)
100
+ │ │ ├── layout.tsx
101
+ │ │ └── page.tsx
102
+ │ └── about # /about
103
+ │ ├── layout.tsx
104
+ │ └── page.tsx
105
+ └── components
106
+ ├── I18nProvider.tsx
107
+ ├── ClientComponent.tsx
108
+ └── ServerComponent.tsx
109
+ ```
110
+
111
+ ### Passo 1: Installa le Dipendenze
112
+
113
+ Installa i pacchetti necessari usando npm:
114
+
115
+ ```bash packageManager="npm"
116
+ npm install i18next react-i18next i18next-resources-to-backend
117
+ ```
118
+
119
+ ```bash packageManager="pnpm"
120
+ pnpm add i18next react-i18next i18next-resources-to-backend
121
+ ```
122
+
123
+ ```bash packageManager="yarn"
124
+ yarn add i18next react-i18next i18next-resources-to-backend
125
+ ```
126
+
127
+ - **i18next**: Il framework principale di internazionalizzazione che gestisce il caricamento e la gestione delle traduzioni.
128
+ - **react-i18next**: Binding React per i18next che forniscono hook come `useTranslation` per i componenti client.
129
+ - **i18next-resources-to-backend**: Un plugin che permette il caricamento dinamico dei file di traduzione, consentendoti di caricare solo i namespace di cui hai bisogno.
130
+
131
+ ### Passo 2: Configura il tuo Progetto
132
+
133
+ Crea un file di configurazione per definire le localizzazioni supportate, la localizzazione predefinita e le funzioni di supporto per la localizzazione degli URL. Questo file funge da unica fonte di verità per la tua configurazione i18n e garantisce la sicurezza dei tipi in tutta l'applicazione.
134
+
135
+ Centralizzare la configurazione delle localizzazioni previene incoerenze e rende più semplice aggiungere o rimuovere localizzazioni in futuro. Le funzioni di supporto assicurano una generazione coerente degli URL per SEO e routing.
136
+
137
+ ```ts fileName="i18n.config.ts"
138
+ // Definisci le localizzazioni supportate come array const per la sicurezza dei tipi
139
+ // L'asserzione 'as const' fa sì che TypeScript inferisca tipi letterali invece di string[]
140
+ export const locales = ["en", "fr"] as const;
141
+
142
+ // Estrai il tipo Locale dall'array delle localizzazioni
143
+ // Questo crea un tipo unione: "en" | "fr"
144
+ export type Locale = (typeof locales)[number];
145
+
146
+ // Imposta la localizzazione predefinita usata quando nessuna localizzazione è specificata
147
+ export const defaultLocale: Locale = "en";
148
+
149
+ // Lingue da destra a sinistra che necessitano di una gestione speciale della direzione del testo
150
+ export const rtlLocales = ["ar", "he", "fa", "ur"] as const;
151
+
152
+ // Verifica se una localizzazione richiede la direzione del testo RTL (da destra a sinistra)
153
+ // Usato per lingue come arabo, ebraico, persiano e urdu
154
+ export const isRtl = (locale: string) =>
155
+ (rtlLocales as readonly string[]).includes(locale);
156
+
157
+ // Genera un percorso localizzato per una data localizzazione e percorso
158
+ // I percorsi della localizzazione predefinita non hanno prefisso (es. "/about" invece di "/en/about")
159
+ // Le altre localizzazioni sono prefissate (es. "/fr/about")
160
+ export function localizedPath(locale: string, path: string) {
161
+ return locale === defaultLocale ? path : `/${locale}${path}`;
162
+ }
163
+
164
+ // URL base per URL assoluti (usati in sitemap, metadata, ecc.)
165
+ const ORIGIN = "https://example.com";
166
+
167
+ // Genera un URL assoluto con prefisso locale
168
+ // Usato per metadata SEO, sitemap e URL canonici
169
+ export function absoluteUrl(locale: string, path: string) {
170
+ return `${ORIGIN}${localizedPath(locale, path)}`;
171
+ }
172
+
173
+ // Usato per impostare il cookie della localizzazione nel browser
174
+ export function getCookie(locale: Locale) {
175
+ return [
176
+ `NEXT_LOCALE=${locale}`,
177
+ "Path=/",
178
+ `Max-Age=${60 * 60 * 24 * 365}`, // 1 anno
179
+ "SameSite=Lax",
180
+ ].join("; ");
181
+ }
182
+ ```
183
+
184
+ ### Passo 3: Centralizzare i Namespace di Traduzione
185
+
186
+ Crea una fonte unica di verità per ogni namespace che la tua applicazione espone. Riutilizzare questa lista mantiene sincronizzati il server, il client e il codice degli strumenti, e abilita il typing forte per gli helper di traduzione.
187
+
188
+ ```ts fileName="src/i18n.namespaces.ts"
189
+ export const namespaces = ["common", "about"] as const;
190
+
191
+ export type Namespace = (typeof namespaces)[number];
192
+ ```
193
+
194
+ ### Passo 4: Tipizzare Fortemente le Chiavi di Traduzione con TypeScript
195
+
196
+ Estendi `i18next` per puntare ai tuoi file linguistici canonici (di solito in inglese). TypeScript inferisce così le chiavi valide per namespace, quindi le chiamate a `t()` sono verificate end-to-end.
197
+
198
+ ```ts fileName="src/types/i18next.d.ts"
199
+ import "i18next";
200
+
201
+ declare module "i18next" {
202
+ interface CustomTypeOptions {
203
+ defaultNS: "common";
204
+ resources: {
205
+ common: typeof import("@/locales/en/common.json");
206
+ about: typeof import("@/locales/en/about.json");
207
+ };
208
+ }
209
+ }
210
+ ```
211
+
212
+ > Suggerimento: conserva questa dichiarazione sotto `src/types` (crea la cartella se non esiste). Next.js include già `src` in `tsconfig.json`, quindi l'augmentazione viene rilevata automaticamente. In caso contrario, aggiungi quanto segue al tuo file `tsconfig.json`:
213
+
214
+ ```json5 fileName="tsconfig.json"
215
+ {
216
+ "include": ["src/types/**/*.ts"],
217
+ }
218
+ ```
219
+
220
+ Con questo in atto puoi fare affidamento sull'autocompletamento e sui controlli a tempo di compilazione:
221
+
222
+ ```tsx
223
+ import { useTranslation, type TFunction } from "react-i18next";
224
+
225
+ const { t } = useTranslation("about");
226
+
227
+ // OK, tipizzato: t("counter.increment")
228
+ // ERRORE, errore di compilazione: t("doesNotExist")
229
+ export type AboutTranslator = TFunction<"about">;
230
+ ```
231
+
232
+ ### Passo 5: Configurare l'inizializzazione i18n lato server
233
+
234
+ Crea una funzione di inizializzazione lato server che carica le traduzioni per i componenti server. Questa funzione crea un'istanza separata di i18next per il rendering lato server, assicurando che le traduzioni siano caricate prima del rendering.
235
+
236
+ I componenti server necessitano di una propria istanza di i18next perché vengono eseguiti in un contesto diverso rispetto ai componenti client. Il pre-caricamento delle traduzioni sul server previene il flash di contenuti non tradotti e migliora la SEO garantendo che i motori di ricerca vedano contenuti tradotti.
237
+
238
+ ```ts fileName="src/app/i18n/server.ts"
239
+ import { createInstance } from "i18next";
240
+ import { initReactI18next } from "react-i18next/initReactI18next";
241
+ import resourcesToBackend from "i18next-resources-to-backend";
242
+ import { defaultLocale } from "@/i18n.config";
243
+ import { namespaces, type Namespace } from "@/i18n.namespaces";
244
+
245
+ // Configura il caricamento dinamico delle risorse per i18next
246
+ // Questa funzione importa dinamicamente i file JSON di traduzione basati su locale e namespace
247
+ // Esempio: locale="fr", namespace="about" -> importa "@/locales/fr/about.json"
248
+ const backend = resourcesToBackend(
249
+ (locale: string, namespace: string) =>
250
+ import(`@/locales/${locale}/${namespace}.json`)
251
+ );
252
+
253
+ const DEFAULT_NAMESPACES = [
254
+ namespaces[0],
255
+ ] as const satisfies readonly Namespace[];
256
+
257
+ /**
258
+ * Inizializza l'istanza di i18next per il rendering lato server
259
+ *
260
+ * @returns Istanza di i18next inizializzata pronta per l'uso lato server
261
+ */
262
+ export async function initI18next(
263
+ locale: string,
264
+ ns: readonly Namespace[] = DEFAULT_NAMESPACES
265
+ ) {
266
+ // Crea una nuova istanza di i18next (separata dall'istanza lato client)
267
+ const i18n = createInstance();
268
+
269
+ // Inizializza con integrazione React e caricatore backend
270
+ await i18n
271
+ .use(initReactI18next) // Abilita il supporto ai React hooks
272
+ .use(backend) // Abilita il caricamento dinamico delle risorse
273
+ .init({
274
+ lng: locale,
275
+ fallbackLng: defaultLocale,
276
+ ns, // Carica solo i namespace specificati per migliori prestazioni
277
+ defaultNS: "common", // Namespace di default quando non specificato
278
+ interpolation: { escapeValue: false }, // Non eseguire l'escape dell'HTML (React gestisce la protezione XSS)
279
+ react: { useSuspense: false }, // Disabilita Suspense per compatibilità SSR
280
+ returnNull: false, // Restituisce stringa vuota invece di null per chiavi mancanti
281
+ initImmediate: false, // Rinvia l'inizializzazione fino a quando le risorse sono caricate (SSR più veloce)
282
+ });
283
+ return i18n;
284
+ }
285
+ ```
286
+
287
+ ### Passo 6: Creare il Provider i18n lato Client
288
+
289
+ Crea un provider componente client che avvolge la tua applicazione con il contesto i18next. Questo provider riceve traduzioni pre-caricate dal server per prevenire il flash di contenuti non tradotti (FOUC) ed evitare richieste duplicate.
290
+
291
+ I componenti client necessitano della propria istanza i18next che gira nel browser. Accettando risorse pre-caricate dal server, assicuriamo un'idratazione fluida e preveniamo il lampeggio dei contenuti. Il provider gestisce anche dinamicamente i cambi di locale e il caricamento dei namespace.
292
+
293
+ ```tsx fileName="src/components/I18nProvider.tsx"
294
+ "use client";
295
+
296
+ import { useEffect, useState } from "react";
297
+ import { I18nextProvider } from "react-i18next";
298
+ import { createInstance, type ResourceLanguage } from "i18next";
299
+ import { initReactI18next } from "react-i18next/initReactI18next";
300
+ import resourcesToBackend from "i18next-resources-to-backend";
301
+ import { defaultLocale } from "@/i18n.config";
302
+ import { namespaces as allNamespaces, type Namespace } from "@/i18n.namespaces";
303
+
304
+ // Configura il caricamento dinamico delle risorse per il client
305
+ // Stesso schema del server, ma questa istanza gira nel browser
306
+ const backend = resourcesToBackend(
307
+ (locale: string, namespace: string) =>
308
+ import(`@/locales/${locale}/${namespace}.json`)
309
+ );
310
+
311
+ type Props = {
312
+ locale: string;
313
+ namespaces?: readonly Namespace[];
314
+ // Risorse pre-caricate dal server (previene FOUC - Flash of Untranslated Content)
315
+ // Formato: { namespace: translationBundle }
316
+ resources?: Record<Namespace, ResourceLanguage>;
317
+ children: React.ReactNode;
318
+ };
319
+
320
+ /**
321
+ * Provider i18n lato client che avvolge l'app con il contesto i18next
322
+ * Riceve risorse pre-caricate dal server per evitare di rifare il fetch delle traduzioni
323
+ */
324
+ export default function I18nProvider({
325
+ locale,
326
+ namespaces = [allNamespaces[0]] as const,
327
+ resources,
328
+ children,
329
+ }: Props) {
330
+ // Crea l'istanza i18n una sola volta usando l'inizializzatore lazy di useState
331
+ // Questo assicura che l'istanza venga creata una sola volta, non a ogni render
332
+ const [i18n] = useState(() => {
333
+ const i18nInstance = createInstance();
334
+
335
+ i18nInstance
336
+ .use(initReactI18next)
337
+ .use(backend)
338
+ .init({
339
+ lng: locale,
340
+ fallbackLng: defaultLocale,
341
+ ns: namespaces,
342
+ // Se le risorse sono fornite (dal server), usale per evitare il fetching lato client
343
+ // Questo previene il FOUC e migliora le prestazioni di caricamento iniziale
344
+ resources: resources ? { [locale]: resources } : undefined,
345
+ defaultNS: "common",
346
+ interpolation: { escapeValue: false },
347
+ react: { useSuspense: false },
348
+ returnNull: false, // Previene il ritorno di valori undefined
349
+ });
350
+
351
+ return i18nInstance;
352
+ });
353
+
354
+ // Aggiorna la lingua quando la prop locale cambia
355
+ useEffect(() => {
356
+ i18n.changeLanguage(locale);
357
+ }, [locale, i18n]);
358
+
359
+ // Assicura che tutti i namespace richiesti siano caricati lato client
360
+ // Usa join("|") come dipendenza per confrontare correttamente gli array
361
+ useEffect(() => {
362
+ i18n.loadNamespaces(namespaces);
363
+ }, [namespaces.join("|"), i18n]);
364
+
365
+ // Fornire l'istanza i18n a tutti i componenti figli tramite il contesto React
366
+ return <I18nextProvider i18n={i18n}>{children}</I18nextProvider>;
367
+ }
368
+ ```
369
+
370
+ ### Passo 7: Definire le Rotte Dinamiche per le Locali
371
+
372
+ Configura il routing dinamico per le localizzazioni creando una directory `[locale]` nella cartella della tua app. Questo permette a Next.js di gestire il routing basato sulla locale, dove ogni locale diventa un segmento dell'URL (es. `/en/about`, `/fr/about`).
373
+
374
+ L'uso di rotte dinamiche consente a Next.js di generare pagine statiche per tutte le localizzazioni al momento della build, migliorando le prestazioni e la SEO. Il componente layout imposta gli attributi HTML `lang` e `dir` in base alla locale, cosa cruciale per l'accessibilità e la comprensione da parte dei motori di ricerca.
375
+
376
+ ```tsx fileName="src/app/[locale]/layout.tsx"
377
+ import type { ReactNode } from "react";
378
+ import { locales, defaultLocale, isRtl, type Locale } from "@/i18n.config";
379
+
380
+ // Disabilita parametri dinamici - tutte le localizzazioni devono essere conosciute al momento della build
381
+ // Questo garantisce la generazione statica per tutte le rotte delle localizzazioni
382
+ export const dynamicParams = false;
383
+
384
+ /**
385
+ * Genera parametri statici per tutte le localizzazioni al momento della build
386
+ * Next.js pre-renderizzerà le pagine per ogni localizzazione restituita qui
387
+ * Esempio: [{ locale: "en" }, { locale: "fr" }]
388
+ */
389
+ export function generateStaticParams() {
390
+ return locales.map((locale) => ({ locale }));
391
+ }
392
+
393
+ /**
394
+ * Componente layout root che gestisce gli attributi HTML specifici per la localizzazione
395
+ * Imposta l'attributo lang e la direzione del testo (ltr/rtl) in base alla localizzazione
396
+ */
397
+ export default function LocaleLayout({
398
+ children,
399
+ params,
400
+ }: {
401
+ children: ReactNode;
402
+ params: { locale: string };
403
+ }) {
404
+ // Valida la locale dai parametri URL
405
+ // Se viene fornita una locale non valida, si utilizza la locale predefinita
406
+ const locale: Locale = (locales as readonly string[]).includes(params.locale)
407
+ ? (params.locale as any)
408
+ : defaultLocale;
409
+
410
+ // Determina la direzione del testo in base alla locale
411
+ // Le lingue RTL come l'arabo necessitano di dir="rtl" per una corretta visualizzazione del testo
412
+ const dir = isRtl(locale) ? "rtl" : "ltr";
413
+
414
+ return (
415
+ <html lang={locale} dir={dir}>
416
+ <body>{children}</body>
417
+ </html>
418
+ );
419
+ }
420
+ ```
421
+
422
+ ### Passo 8: Crea i tuoi file di traduzione
423
+
424
+ Crea file JSON per ogni locale e namespace. Questa struttura ti permette di organizzare le traduzioni in modo logico e caricare solo ciò che ti serve per ogni pagina.
425
+
426
+ Organizzare le traduzioni per namespace (ad esempio, `common.json`, `about.json`) consente di effettuare il code splitting e ridurre la dimensione del bundle. Carichi solo le traduzioni necessarie per ogni pagina, migliorando le prestazioni.
427
+
428
+ ```json fileName="src/locales/en/common.json"
429
+ {
430
+ "appTitle": "Next.js i18n App",
431
+ "appDescription": "Example Next.js application with internationalization using i18next"
432
+ }
433
+ ```
434
+
435
+ ```json fileName="src/locales/fr/common.json"
436
+ {
437
+ "appTitle": "Application Next.js i18n",
438
+ "appDescription": "Exemple d'application Next.js avec internationalisation utilisant i18next"
439
+ }
440
+ ```
441
+
442
+ ```json fileName="src/locales/en/home.json"
443
+ {
444
+ "title": "Home",
445
+ "description": "Home page description",
446
+ "welcome": "Welcome",
447
+ "greeting": "Hello, world!",
448
+ "aboutPage": "About Page",
449
+ "documentation": "Documentation"
450
+ }
451
+ ```
452
+
453
+ ```json fileName="src/locales/it/home.json"
454
+ {
455
+ "title": "Home",
456
+ "description": "Descrizione della pagina principale",
457
+ "welcome": "Benvenuto",
458
+ "greeting": "Ciao, mondo!",
459
+ "aboutPage": "Pagina Informazioni",
460
+ "documentation": "Documentazione"
461
+ }
462
+ ```
463
+
464
+ ```json fileName="src/locales/en/about.json"
465
+ {
466
+ "title": "About",
467
+ "description": "About page description",
468
+ "counter": {
469
+ "label": "Counter",
470
+ "increment": "Increment",
471
+ "description": "Click the button to increase the counter"
472
+ }
473
+ }
474
+ ```
475
+
476
+ ```json fileName="src/locales/it/about.json"
477
+ {
478
+ "title": "Informazioni",
479
+ "description": "Descrizione della pagina Informazioni",
480
+ "counter": {
481
+ "label": "Contatore",
482
+ "increment": "Incrementa",
483
+ "description": "Clicca il pulsante per aumentare il contatore"
484
+ }
485
+ }
486
+ ```
487
+
488
+ ### Passo 9: Utilizzare le Traduzioni nelle Tue Pagine
489
+
490
+ Crea un componente pagina che inizializza i18next sul server e passa le traduzioni sia ai componenti server che client. Questo assicura che le traduzioni siano caricate prima del rendering e previene il lampeggiamento del contenuto.
491
+
492
+ L'inizializzazione lato server carica le traduzioni prima che la pagina venga renderizzata, migliorando la SEO e prevenendo il FOUC (Flash Of Unstyled Content). Passando le risorse pre-caricate al provider client, evitiamo richieste duplicate e garantiamo un'idratazione fluida.
493
+
494
+ ```tsx fileName="src/app/[locale]/about/index.tsx"
495
+ import I18nProvider from "@/components/I18nProvider";
496
+ import { initI18next } from "@/app/i18n/server";
497
+ import type { Locale } from "@/i18n.config";
498
+ import { namespaces as allNamespaces, type Namespace } from "@/i18n.namespaces";
499
+ import type { ResourceLanguage } from "i18next";
500
+ import ClientComponent from "@/components/ClientComponent";
501
+ import ServerComponent from "@/components/ServerComponent";
502
+
503
+ /**
504
+ * Componente server della pagina che gestisce l'inizializzazione di i18n
505
+ * Pre-carica le traduzioni sul server e le passa ai componenti client
506
+ */
507
+ export default async function AboutPage({
508
+ params: { locale },
509
+ }: {
510
+ params: { locale: Locale };
511
+ }) {
512
+ // Definisce quali namespace di traduzione questa pagina necessita
513
+ // Riutilizza la lista centralizzata per sicurezza di tipo e completamento automatico
514
+ const pageNamespaces = allNamespaces;
515
+
516
+ // Inizializza i18next sul server con i namespace richiesti
517
+ // Questo carica i file JSON di traduzione lato server
518
+ const i18n = await initI18next(locale, pageNamespaces);
519
+
520
+ // Ottieni una funzione di traduzione fissa per il namespace "about"
521
+ // getFixedT blocca il namespace, quindi t("title") invece di t("about:title")
522
+ const tAbout = i18n.getFixedT(locale, "about");
523
+
524
+ // Estrai i bundle di traduzione dall'istanza i18n
525
+ // Questi dati vengono passati a I18nProvider per idratare l'i18n lato client
526
+ // Previene il FOUC (Flash of Untranslated Content) e evita richieste duplicate
527
+ const resources = Object.fromEntries(
528
+ pageNamespaces.map((ns) => [ns, i18n.getResourceBundle(locale, ns)])
529
+ ) satisfies Record<Namespace, ResourceLanguage>;
530
+
531
+ return (
532
+ <I18nProvider
533
+ locale={locale}
534
+ namespaces={pageNamespaces}
535
+ resources={resources}
536
+ >
537
+ <main>
538
+ <h1>{tAbout("title")}</h1>
539
+
540
+ <ClientComponent />
541
+ <ServerComponent t={tAbout} locale={locale} count={0} />
542
+ </main>
543
+ </I18nProvider>
544
+ );
545
+ }
546
+ ```
547
+
548
+ ### Passo 10: Usare le Traduzioni nei Componenti Client
549
+
550
+ I componenti client possono utilizzare il hook `useTranslation` per accedere alle traduzioni. Questo hook fornisce l'accesso alla funzione di traduzione e all'istanza i18n, permettendo di tradurre contenuti e accedere alle informazioni sulla locale.
551
+
552
+ I componenti client necessitano dei React hooks per accedere alle traduzioni. Il hook `useTranslation` si integra perfettamente con i18next e fornisce aggiornamenti reattivi quando la locale cambia.
553
+
554
+ > Assicurati che la pagina/provider includa solo i namespace necessari (es. `about`).
555
+ > Se usi React < 19, memorizza in cache formatter pesanti come `Intl.NumberFormat`.
556
+
557
+ ```tsx fileName="src/components/ClientComponent.tsx"
558
+ "use client";
559
+
560
+ import { useState } from "react";
561
+ import { useTranslation } from "react-i18next";
562
+
563
+ /**
564
+ * Esempio di componente client che utilizza React hooks per le traduzioni
565
+ * Può usare hook come useState, useEffect e useTranslation
566
+ */
567
+ const ClientComponent = () => {
568
+ // L'hook useTranslation fornisce accesso alla funzione di traduzione e all'istanza i18n
569
+ // Specifica il namespace per caricare solo le traduzioni del namespace "about"
570
+ const { t, i18n } = useTranslation("about");
571
+ const [count, setCount] = useState(0);
572
+
573
+ // Crea un formatter numerico sensibile alla locale
574
+ // i18n.language fornisce la locale corrente (es. "en", "fr")
575
+ // Intl.NumberFormat formatta i numeri secondo le convenzioni della locale
576
+ const numberFormat = new Intl.NumberFormat(i18n.language);
577
+
578
+ return (
579
+ <div className="flex flex-col items-center gap-4">
580
+ {/* Format del numero usando la formattazione specifica della locale */}
581
+ <p className="text-5xl font-bold text-white m-0">
582
+ {numberFormat.format(count)}
583
+ </p>
584
+ <button
585
+ type="button"
586
+ className="flex h-12 w-full items-center justify-center gap-2 rounded-full bg-foreground px-5 text-background transition-colors hover:bg-[#383838] dark:hover:bg-[#ccc] md:w-[158px]"
587
+ aria-label={t("counter.label")}
588
+ onClick={() => setCount((c) => c + 1)}
589
+ >
590
+ {t("counter.increment")}
591
+ </button>
592
+ </div>
593
+ );
594
+ };
595
+
596
+ export default ClientComponent;
597
+ ```
598
+
599
+ ### Passo 11: Usare le Traduzioni nei Componenti Server
600
+
601
+ I componenti server non possono utilizzare React hooks, quindi ricevono le traduzioni tramite props dai loro componenti genitori. Questo approccio mantiene i componenti server sincroni e consente loro di essere annidati all'interno di componenti client.
602
+
603
+ I componenti server che potrebbero essere annidati sotto confini client devono essere sincroni. Passando stringhe tradotte e informazioni sulla localizzazione come props, evitiamo operazioni asincrone e garantiamo un rendering corretto.
604
+
605
+ ```tsx fileName="src/components/ServerComponent.tsx"
606
+ import type { TFunction } from "i18next";
607
+
608
+ type ServerComponentProps = {
609
+ // Funzione di traduzione passata dal componente server genitore
610
+ // I componenti server non possono usare hooks, quindi le traduzioni arrivano tramite props
611
+ t: TFunction<"about">;
612
+ locale: string;
613
+ count: number;
614
+ };
615
+
616
+ /**
617
+ * Esempio di componente server - riceve le traduzioni tramite props
618
+ * Può essere annidato all'interno di componenti client (componenti server asincroni)
619
+ * Non può usare React hooks, quindi tutti i dati devono provenire da props o operazioni asincrone
620
+ */
621
+ const ServerComponent = ({ t, locale, count }: ServerComponentProps) => {
622
+ // Format numero lato server usando la locale
623
+ // Questo viene eseguito sul server durante SSR, migliorando il caricamento iniziale della pagina
624
+ const formatted = new Intl.NumberFormat(locale).format(count);
625
+
626
+ return (
627
+ <div className="flex flex-col items-center gap-4">
628
+ <p className="text-5xl font-bold text-white m-0">{formatted}</p>
629
+ {/* Usa la funzione di traduzione passata come prop */}
630
+ <div className="flex flex-col items-center gap-2">
631
+ <span className="text-xl font-semibold text-white">
632
+ {t("counter.label")}
633
+ </span>
634
+ <span className="text-sm opacity-80 italic">
635
+ {t("counter.description")}
636
+ </span>
637
+ </div>
638
+ </div>
639
+ );
640
+ };
641
+
642
+ export default ServerComponent;
643
+ ```
644
+
645
+ ---
646
+
647
+ ### (Opzionale) Passo 12: Cambiare la lingua del tuo contenuto
648
+
649
+ Per cambiare la lingua del tuo contenuto in Next.js, il modo consigliato è utilizzare URL con prefisso locale e link di Next.js. L'esempio qui sotto legge la locale corrente dalla rotta, la rimuove dal pathname, e rende un link per ogni locale disponibile.
650
+
651
+ ```tsx fileName="src/components/LocaleSwitcher.tsx"
652
+ "use client";
653
+
654
+ import Link from "next/link";
655
+ import { useParams, usePathname } from "next/navigation";
656
+ import { useMemo } from "react";
657
+ import { defaultLocale, getCookie, type Locale, locales } from "@/i18n.config";
658
+
659
+ export default function LocaleSwitcher() {
660
+ const params = useParams();
661
+ const pathname = usePathname();
662
+
663
+ const activeLocale = (params?.locale as Locale | undefined) ?? defaultLocale;
664
+
665
+ const getLocaleLabel = (locale: Locale): string => {
666
+ try {
667
+ const displayNames = new Intl.DisplayNames([locale], {
668
+ type: "language",
669
+ });
670
+ return displayNames.of(locale) ?? locale.toUpperCase();
671
+ } catch {
672
+ return locale.toUpperCase();
673
+ }
674
+ };
675
+
676
+ const basePath = useMemo(() => {
677
+ if (!pathname) return "/";
678
+
679
+ const segments = pathname.split("/").filter(Boolean);
680
+
681
+ if (segments.length === 0) return "/";
682
+
683
+ const maybeLocale = segments[0] as Locale;
684
+
685
+ if ((locales as readonly string[]).includes(maybeLocale)) {
686
+ const rest = segments.slice(1).join("/");
687
+ return rest ? `/${rest}` : "/";
688
+ }
689
+
690
+ return pathname;
691
+ }, [pathname]);
692
+
693
+ return (
694
+ <nav aria-label="Selettore della lingua">
695
+ {(locales as readonly Locale[]).map((locale) => {
696
+ const isActive = locale === activeLocale;
697
+
698
+ const href =
699
+ locale === defaultLocale ? basePath : `/${locale}${basePath}`;
700
+
701
+ return (
702
+ <Link
703
+ key={locale}
704
+ href={href}
705
+ aria-current={isActive ? "page" : undefined}
706
+ onClick={() => {
707
+ document.cookie = getCookie(locale);
708
+ }}
709
+ >
710
+ {getLocaleLabel(locale)}
711
+ </Link>
712
+ );
713
+ })}
714
+ </nav>
715
+ );
716
+ }
717
+ ```
718
+
719
+ ### (Opzionale) Passo 13: Costruire un componente Link localizzato
720
+
721
+ Riutilizzare URL localizzati in tutta la tua app mantiene la navigazione coerente e ottimizzata per la SEO. Avvolgi `next/link` in un piccolo helper che aggiunge il prefisso della locale attiva alle rotte interne lasciando intatti gli URL esterni.
722
+
723
+ ```tsx fileName="src/components/LocalizedLink.tsx"
724
+ "use client";
725
+
726
+ import NextLink, { type LinkProps } from "next/link";
727
+ import { useParams } from "next/navigation";
728
+ import type { ComponentProps, PropsWithChildren } from "react";
729
+ import {
730
+ defaultLocale,
731
+ type Locale,
732
+ locales,
733
+ localizedPath,
734
+ } from "@/i18n.config";
735
+
736
+ const isExternal = (href: string) => /^https?:\/\//.test(href);
737
+
738
+ type LocalizedLinkProps = PropsWithChildren<
739
+ Omit<LinkProps, "href"> &
740
+ Omit<ComponentProps<"a">, "href"> & { href: string; locale?: Locale }
741
+ >;
742
+
743
+ export default function LocalizedLink({
744
+ href,
745
+ locale,
746
+ children,
747
+ ...props
748
+ }: LocalizedLinkProps) {
749
+ const params = useParams();
750
+ const fallback = (params?.locale as Locale | undefined) ?? defaultLocale;
751
+ const normalizedLocale = (locales as readonly string[]).includes(fallback)
752
+ ? ((locale ?? fallback) as Locale)
753
+ : defaultLocale;
754
+
755
+ const normalizedPath = href.startsWith("/") ? href : `/${href}`;
756
+ const localizedHref = isExternal(href)
757
+ ? href
758
+ : localizedPath(normalizedLocale, normalizedPath);
759
+
760
+ return (
761
+ <NextLink href={localizedHref} {...props}>
762
+ {children}
763
+ </NextLink>
764
+ );
765
+ }
766
+ ```
767
+
768
+ > Suggerimento: Poiché `LocalizedLink` è un sostituto diretto, migra gradualmente sostituendo gli import e lasciando che il componente gestisca gli URL specifici per la locale.
769
+
770
+ ### (Opzionale) Passo 14: Accedere alla locale attiva all'interno delle Server Actions
771
+
772
+ Le Server Actions spesso necessitano della locale corrente per email, logging o integrazioni di terze parti. Combina il cookie della locale impostato dal tuo proxy con l'header `Accept-Language` come fallback.
773
+
774
+ ```ts fileName="src/app/actions/get-current-locale.ts"
775
+ "use server";
776
+
777
+ import { cookies, headers } from "next/headers";
778
+ import { defaultLocale, locales, type Locale } from "@/i18n.config";
779
+
780
+ const KNOWN_LOCALES = new Set(locales as readonly string[]);
781
+
782
+ const normalize = (value: string | undefined): Locale | undefined => {
783
+ if (!value) return undefined;
784
+ const base = value.toLowerCase().split("-")[0];
785
+ return KNOWN_LOCALES.has(base) ? (base as Locale) : undefined;
786
+ };
787
+
788
+ export async function getCurrentLocale(): Promise<Locale> {
789
+ const cookieLocale = normalize(cookies().get("NEXT_LOCALE")?.value);
790
+
791
+ if (cookieLocale) return cookieLocale;
792
+
793
+ const headerLocale = normalize(headers().get("accept-language"));
794
+ return headerLocale ?? defaultLocale;
795
+ }
796
+
797
+ // Esempio di un'azione server che utilizza la locale corrente
798
+ export async function stuffFromServer(formData: FormData) {
799
+ const locale = await getCurrentLocale();
800
+
801
+ // Usa la locale per effetti collaterali localizzati (email, CRM, ecc.)
802
+ console.log(`Stuff from server with locale ${locale}`);
803
+ }
804
+ ```
805
+
806
+ > Poiché l'helper si basa sui cookie e sugli header di Next.js, funziona nei Route Handlers, nelle Server Actions e in altri contesti esclusivamente server.
807
+
808
+ ### (Opzionale) Passo 15: Internazionalizza i Tuoi Metadata
809
+
810
+ Tradurre i contenuti è importante, ma l'obiettivo principale dell'internazionalizzazione è rendere il tuo sito web più visibile al mondo. L'i18n è una leva incredibile per migliorare la visibilità del tuo sito web attraverso una corretta SEO.
811
+
812
+ I metadata correttamente internazionalizzati aiutano i motori di ricerca a comprendere quali lingue sono disponibili sulle tue pagine. Questo include l'impostazione dei meta tag hreflang, la traduzione di titoli e descrizioni, e l'assicurarsi che gli URL canonici siano correttamente impostati per ogni locale.
813
+
814
+ Ecco una lista di buone pratiche riguardanti la SEO multilingue:
815
+
816
+ - Imposta i meta tag hreflang nel tag `<head>` per aiutare i motori di ricerca a capire quali lingue sono disponibili nella pagina
817
+ - Elenca tutte le traduzioni delle pagine nel sitemap.xml utilizzando lo schema XML `http://www.w3.org/1999/xhtml`
818
+ - Non dimenticare di escludere le pagine con prefisso dal robots.txt (es. `/dashboard`, `/fr/dashboard`, `/es/dashboard`)
819
+ - Usa un componente Link personalizzato per reindirizzare alla pagina più localizzata (es. in francese `<a href="/fr/about">À propos</a>`)
820
+
821
+ Gli sviluppatori spesso dimenticano di riferire correttamente le loro pagine tra le diverse localizzazioni. Sistemiamolo:
822
+
823
+ ```tsx fileName="src/app/[locale]/about/layout.tsx"
824
+ import type { Metadata } from "next";
825
+ import {
826
+ locales,
827
+ defaultLocale,
828
+ localizedPath,
829
+ absoluteUrl,
830
+ } from "@/i18n.config";
831
+
832
+ /**
833
+ * Genera i metadata SEO per ogni versione locale della pagina
834
+ * Questa funzione viene eseguita per ogni locale al momento della build
835
+ */
836
+ export async function generateMetadata({
837
+ params,
838
+ }: {
839
+ params: { locale: string };
840
+ }): Promise<Metadata> {
841
+ const { locale } = params;
842
+
843
+ // Importa dinamicamente il file di traduzione per questo locale
844
+ // Usato per ottenere il titolo e la descrizione tradotti per i metadata
845
+ const messages = (await import(`@/locales/${locale}/about.json`)).default;
846
+
847
+ // Crea la mappatura hreflang per tutti i locali
848
+ // Aiuta i motori di ricerca a comprendere le alternative linguistiche
849
+ // Formato: { "en": "/about", "fr": "/fr/about" }
850
+ const languages = Object.fromEntries(
851
+ locales.map((locale) => [locale, localizedPath(locale, "/about")])
852
+ );
853
+
854
+ return {
855
+ title: messages.title,
856
+ description: messages.description,
857
+ alternates: {
858
+ // URL canonico per questa versione locale
859
+ canonical: absoluteUrl(locale, "/about"),
860
+ // Alternative linguistiche per SEO (tag hreflang)
861
+ // "x-default" specifica la versione locale predefinita
862
+ languages: {
863
+ ...languages,
864
+ "x-default": absoluteUrl(defaultLocale, "/about"),
865
+ },
866
+ },
867
+ };
868
+ }
869
+
870
+ export default async function AboutPage() {
871
+ return <h1>Informazioni</h1>;
872
+ }
873
+ ```
874
+
875
+ ### (Opzionale) Passo 16: Internazionalizza la tua Sitemap
876
+
877
+ Genera una sitemap che includa tutte le versioni locali delle tue pagine. Questo aiuta i motori di ricerca a scoprire e indicizzare tutte le versioni linguistiche dei tuoi contenuti.
878
+
879
+ Una sitemap correttamente internazionalizzata garantisce che i motori di ricerca possano trovare e indicizzare tutte le versioni linguistiche delle tue pagine. Questo migliora la visibilità nei risultati di ricerca internazionali.
880
+
881
+ ```ts fileName="src/app/sitemap.ts"
882
+ import type { MetadataRoute } from "next";
883
+ import { defaultLocale, locales } from "@/i18n";
884
+
885
+ const origin = "https://example.com";
886
+
887
+ const formatterLocalizedPath = (locale: string, path: string) =>
888
+ locale === defaultLocale ? `${origin}${path}` : `${origin}/${locale}${path}`;
889
+
890
+ /**
891
+ * Ottieni una mappa di tutte le localizzazioni e i loro percorsi localizzati
892
+ *
893
+ * Esempio di output:
894
+ * {
895
+ * "en": "https://example.com",
896
+ * "fr": "https://example.com/fr",
897
+ * "es": "https://example.com/es",
898
+ * "x-default": "https://example.com"
899
+ * }
900
+ */
901
+ const getLocalizedMap = (path: string) =>
902
+ Object.fromEntries([
903
+ ...locales.map((locale) => [locale, formatterLocalizedPath(locale, path)]),
904
+ ["x-default", formatterLocalizedPath(defaultLocale, path)],
905
+ ]);
906
+
907
+ // Genera la sitemap con tutte le varianti locali per una migliore SEO
908
+ // Il campo alternates informa i motori di ricerca sulle versioni linguistiche
909
+ export default function sitemap(): MetadataRoute.Sitemap {
910
+ return [
911
+ {
912
+ url: formatterLocalizedPath(defaultLocale, "/"),
913
+ lastModified: new Date(),
914
+ changeFrequency: "monthly",
915
+ priority: 1.0,
916
+ alternates: { languages: getLocalizedMap("/") },
917
+ },
918
+ {
919
+ url: formatterLocalizedPath(defaultLocale, "/about"),
920
+ lastModified: new Date(),
921
+ changeFrequency: "monthly",
922
+ priority: 0.7,
923
+ alternates: { languages: getLocalizedMap("/about") },
924
+ },
925
+ ];
926
+ }
927
+ ```
928
+
929
+ ### (Opzionale) Passo 17: Internazionalizza il tuo robots.txt
930
+
931
+ Crea un file robots.txt che gestisca correttamente tutte le versioni locali delle tue rotte protette. Questo assicura che i motori di ricerca non indicizzino pagine di amministrazione o dashboard in nessuna lingua.
932
+
933
+ Configurare correttamente robots.txt per tutte le localizzazioni impedisce ai motori di ricerca di indicizzare pagine sensibili in qualsiasi lingua. Questo è cruciale per la sicurezza e la privacy.
934
+
935
+ ```ts fileName="src/app/robots.ts"
936
+ import type { MetadataRoute } from "next";
937
+ import { defaultLocale, locales } from "@/i18n";
938
+
939
+ const origin = "https://example.com";
940
+
941
+ // Genera i percorsi per tutte le localizzazioni (es. /admin, /fr/admin, /es/admin)
942
+ const withAllLocales = (path: string) => [
943
+ path,
944
+ ...locales
945
+ .filter((locale) => locale !== defaultLocale)
946
+ .map((locale) => `/${locale}${path}`),
947
+ ];
948
+
949
+ const disallow = [...withAllLocales("/dashboard"), ...withAllLocales("/admin")];
950
+
951
+ export default function robots(): MetadataRoute.Robots {
952
+ return {
953
+ rules: { userAgent: "*", allow: ["/"], disallow },
954
+ host: origin,
955
+ sitemap: `${origin}/sitemap.xml`,
956
+ };
957
+ }
958
+ ```
959
+
960
+ ### (Opzionale) Passo 18: Configurare il Middleware per il Routing Locale
961
+
962
+ Crea un proxy per rilevare automaticamente la locale preferita dall'utente e reindirizzarlo all'URL con il prefisso della locale appropriata. Questo migliora l'esperienza utente mostrando i contenuti nella lingua preferita.
963
+
964
+ Il middleware garantisce che gli utenti vengano reindirizzati automaticamente alla loro lingua preferita quando visitano il tuo sito. Inoltre, salva la preferenza dell'utente in un cookie per visite future.
965
+
966
+ ```ts fileName="src/proxy.ts"
967
+ import { NextResponse, type NextRequest } from "next/server";
968
+ import { defaultLocale, locales } from "@/i18n.config";
969
+
970
+ // Regex per corrispondere ai file con estensioni (es. .js, .css, .png)
971
+ // Usato per escludere le risorse statiche dal routing della localizzazione
972
+ const PUBLIC_FILE = /\.[^/]+$/;
973
+
974
+ /**
975
+ * Estrae la localizzazione dall'header Accept-Language
976
+ * Gestisce formati come "fr-CA", "en-US", ecc.
977
+ * Torna alla localizzazione predefinita se la lingua del browser non è supportata
978
+ */
979
+ const pickLocale = (accept: string | null) => {
980
+ // Ottiene la prima preferenza linguistica (es. "fr-CA" da "fr-CA,en-US;q=0.9")
981
+ const raw = accept?.split(",")[0] ?? defaultLocale;
982
+ // Estrae il codice base della lingua (es. "fr" da "fr-CA")
983
+ const base = raw.toLowerCase().split("-")[0];
984
+ // Controlla se supportiamo questa localizzazione, altrimenti usa quella predefinita
985
+ return (locales as readonly string[]).includes(base) ? base : defaultLocale;
986
+ };
987
+
988
+ /**
989
+ * Proxy di Next.js per il rilevamento e il routing della locale
990
+ * Viene eseguito ad ogni richiesta prima del rendering della pagina
991
+ * Reindirizza automaticamente agli URL con prefisso locale quando necessario
992
+ */
993
+ export function proxy(request: NextRequest) {
994
+ const { pathname } = request.nextUrl;
995
+
996
+ // Salta il proxy per le internals di Next.js, le API routes e i file statici
997
+ // Questi non devono avere il prefisso locale
998
+ if (
999
+ pathname.startsWith("/_next") ||
1000
+ pathname.startsWith("/api") ||
1001
+ pathname.startsWith("/static") ||
1002
+ PUBLIC_FILE.test(pathname)
1003
+ ) {
1004
+ return;
1005
+ }
1006
+
1007
+ // Controlla se l'URL ha già un prefisso locale
1008
+ // Esempio: "/fr/about" o "/en" restituirebbe true
1009
+ const hasLocale = (locales as readonly string[]).some(
1010
+ (locale) => pathname === `/${locale}` || pathname.startsWith(`/${locale}/`)
1011
+ );
1012
+
1013
+ // Se non c'è un prefisso di localizzazione, rileva la localizzazione e reindirizza
1014
+ if (!hasLocale) {
1015
+ // Prova a ottenere la localizzazione dal cookie prima (preferenza utente)
1016
+ const cookieLocale = request.cookies.get("NEXT_LOCALE")?.value;
1017
+
1018
+ // Usa la localizzazione del cookie se valida, altrimenti rileva dagli header del browser
1019
+ const locale =
1020
+ cookieLocale && (locales as readonly string[]).includes(cookieLocale)
1021
+ ? cookieLocale
1022
+ : pickLocale(request.headers.get("accept-language"));
1023
+
1024
+ // Clona l'URL per modificare il pathname
1025
+ const url = request.nextUrl.clone();
1026
+ // Aggiungi il prefisso di localizzazione al pathname
1027
+ // Gestisci il percorso root in modo speciale per evitare doppio slash
1028
+ url.pathname = `/${locale}${pathname === "/" ? "" : pathname}`;
1029
+
1030
+ // Crea una risposta di redirect e imposta il cookie della lingua
1031
+ const res = NextResponse.redirect(url);
1032
+ res.cookies.set("NEXT_LOCALE", locale, { path: "/" });
1033
+ return res;
1034
+ }
1035
+ }
1036
+
1037
+ export const config = {
1038
+ matcher: [
1039
+ // Corrisponde a tutti i percorsi tranne:
1040
+ // - Rotte API (/api/*)
1041
+ // - Interni di Next.js (/_next/*)
1042
+ // - File statici (/static/*)
1043
+ // - File con estensioni (.*\\..*)
1044
+ "/((?!api|_next|static|.*\\..*).*)",
1045
+ ],
1046
+ };
1047
+ ```
1048
+
1049
+ ### (Opzionale) Passo 19: Automatizza le tue traduzioni usando Intlayer
1050
+
1051
+ Intlayer è una libreria **gratuita** e **open-source** progettata per assistere il processo di localizzazione nella tua applicazione. Mentre i18next gestisce il caricamento e la gestione delle traduzioni, Intlayer aiuta ad automatizzare il flusso di lavoro delle traduzioni.
1052
+
1053
+ Gestire manualmente le traduzioni può richiedere molto tempo ed essere soggetto a errori. Intlayer automatizza il testing, la generazione e la gestione delle traduzioni, facendoti risparmiare tempo e garantendo coerenza in tutta la tua applicazione.
1054
+
1055
+ Intlayer ti permette di:
1056
+
1057
+ - **Dichiarare i tuoi contenuti dove vuoi nella tua codebase**
1058
+ Intlayer consente di dichiarare i tuoi contenuti dove vuoi nella tua codebase utilizzando file `.content.{ts|js|json}`. Questo permette una migliore organizzazione dei contenuti, assicurando una maggiore leggibilità e manutenibilità della tua codebase.
1059
+
1060
+ - **Testare le traduzioni mancanti**
1061
+ Intlayer fornisce funzioni di test che possono essere integrate nella tua pipeline CI/CD o nei tuoi test unitari. Scopri di più su [come testare le tue traduzioni](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/testing.md).
1062
+
1063
+ - **Automatizza le tue traduzioni**,
1064
+ Intlayer fornisce una CLI e un'estensione per VSCode per automatizzare le tue traduzioni. Può essere integrato nella tua pipeline CI/CD. Scopri di più su [automatizzare le tue traduzioni](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/intlayer_cli.md).
1065
+ Puoi utilizzare la tua **chiave API personale e il provider AI di tua scelta**. Fornisce inoltre traduzioni contestuali, vedi [riempi contenuto](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/autoFill.md).
1066
+
1067
+ - **Connetti contenuti esterni**
1068
+ - **Automatizza le tue traduzioni**,
1069
+ Intlayer fornisce una CLI e un'estensione VSCode per automatizzare le tue traduzioni. Può essere integrato nella tua pipeline CI/CD. Scopri di più su [automatizzare le tue traduzioni](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/intlayer_cli.md).
1070
+ Puoi utilizzare la tua **chiave API personale e il provider AI di tua scelta**. Offre inoltre traduzioni contestuali, vedi [riempimento contenuti](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/autoFill.md).
1071
+
1072
+ - **Connetti contenuti esterni**
1073
+ Intlayer ti permette di connettere i tuoi contenuti a un sistema di gestione contenuti esterno (CMS). Per recuperarli in modo ottimizzato e inserirli nelle tue risorse JSON. Scopri di più su [recupero contenuti esterni](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/dictionary/function_fetching.md).
1074
+
1075
+ - **Editor visuale**
1076
+ Intlayer offre un editor visuale gratuito per modificare i tuoi contenuti usando un editor visuale. Scopri di più su [modifica visuale delle tue traduzioni](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/intlayer_visual_editor.md).
1077
+
1078
+ E altro ancora. Per scoprire tutte le funzionalità offerte da Intlayer, consulta la [documentazione sull'interesse di Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/interest_of_intlayer.md).