@intlayer/docs 7.0.6 → 7.0.8-canary.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (726) hide show
  1. package/blog/ar/i18n_using_next-i18next.md +1068 -0
  2. package/blog/ar/i18n_using_next-intl.md +768 -0
  3. package/blog/ar/intlayer_with_react-intl.md +0 -4
  4. package/blog/ar/next-i18next_vs_next-intl_vs_intlayer.md +5 -4
  5. package/blog/de/i18n_using_next-i18next.md +1107 -0
  6. package/blog/de/i18n_using_next-intl.md +760 -0
  7. package/blog/de/intlayer_with_react-intl.md +0 -4
  8. package/blog/de/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
  9. package/blog/en/i18n_using_next-i18next.md +1073 -0
  10. package/blog/en/i18n_using_next-intl.md +757 -0
  11. package/blog/en/intlayer_with_i18next.md +71 -8
  12. package/blog/en/intlayer_with_next-i18next.md +71 -8
  13. package/blog/en/intlayer_with_next-intl.md +71 -8
  14. package/blog/en/intlayer_with_react-i18next.md +69 -8
  15. package/blog/en/intlayer_with_react-intl.md +68 -9
  16. package/blog/en/intlayer_with_vue-i18n.md +68 -7
  17. package/blog/en/react-i18next_vs_react-intl_vs_intlayer.md +2 -0
  18. package/blog/en/vue-i18n_vs_intlayer.md +2 -0
  19. package/blog/en-GB/i18n_using_next-i18next.md +1074 -0
  20. package/blog/en-GB/i18n_using_next-intl.md +757 -0
  21. package/blog/en-GB/intlayer_with_i18next.md +15 -6
  22. package/blog/en-GB/intlayer_with_next-i18next.md +16 -6
  23. package/blog/en-GB/intlayer_with_next-intl.md +16 -6
  24. package/blog/en-GB/intlayer_with_react-i18next.md +16 -7
  25. package/blog/en-GB/intlayer_with_react-intl.md +14 -9
  26. package/blog/en-GB/intlayer_with_vue-i18n.md +16 -7
  27. package/blog/en-GB/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
  28. package/blog/en-GB/react-i18next_vs_react-intl_vs_intlayer.md +2 -0
  29. package/blog/en-GB/vue-i18n_vs_intlayer.md +2 -0
  30. package/blog/es/i18n_using_next-i18next.md +1066 -0
  31. package/blog/es/i18n_using_next-intl.md +757 -0
  32. package/blog/es/intlayer_with_react-intl.md +0 -4
  33. package/blog/es/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
  34. package/blog/fr/i18n_using_next-i18next.md +1078 -0
  35. package/blog/fr/i18n_using_next-intl.md +759 -0
  36. package/blog/fr/intlayer_with_react-intl.md +0 -4
  37. package/blog/fr/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
  38. package/blog/hi/i18n_using_next-i18next.md +1068 -0
  39. package/blog/hi/i18n_using_next-intl.md +758 -0
  40. package/blog/hi/intlayer_with_react-intl.md +0 -4
  41. package/blog/hi/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
  42. package/blog/id/i18n_using_next-i18next.md +1078 -0
  43. package/blog/id/i18n_using_next-intl.md +757 -0
  44. package/blog/id/index.md +69 -0
  45. package/blog/id/internationalization_and_SEO.md +364 -0
  46. package/blog/id/intlayer_with_react-intl.md +0 -4
  47. package/blog/id/list_i18n_technologies/CMS/drupal.md +143 -0
  48. package/blog/id/list_i18n_technologies/CMS/wix.md +167 -0
  49. package/blog/id/list_i18n_technologies/CMS/wordpress.md +188 -0
  50. package/blog/id/list_i18n_technologies/frameworks/angular.md +125 -0
  51. package/blog/id/list_i18n_technologies/frameworks/flutter.md +150 -0
  52. package/blog/id/list_i18n_technologies/frameworks/react-native.md +217 -0
  53. package/blog/id/list_i18n_technologies/frameworks/react.md +155 -0
  54. package/blog/id/list_i18n_technologies/frameworks/svelte.md +131 -0
  55. package/blog/id/list_i18n_technologies/frameworks/vue.md +130 -0
  56. package/blog/id/next-i18next_vs_next-intl_vs_intlayer.md +1500 -0
  57. package/blog/id/nextjs-multilingual-seo-comparison.md +361 -0
  58. package/blog/id/rag_powered_documentation_assistant.md +288 -0
  59. package/blog/id/react-i18next_vs_react-intl_vs_intlayer.md +164 -0
  60. package/blog/id/vue-i18n_vs_intlayer.md +278 -0
  61. package/blog/id/what_is_internationalization.md +166 -0
  62. package/blog/it/i18n_using_next-i18next.md +1078 -0
  63. package/blog/it/i18n_using_next-intl.md +758 -0
  64. package/blog/it/intlayer_with_react-intl.md +0 -4
  65. package/blog/it/react-i18next_vs_react-intl_vs_intlayer.md +4 -0
  66. package/blog/it/vue-i18n_vs_intlayer.md +2 -0
  67. package/blog/ja/i18n_using_next-i18next.md +1078 -0
  68. package/blog/ja/i18n_using_next-intl.md +758 -0
  69. package/blog/ja/intlayer_with_react-intl.md +0 -4
  70. package/blog/ja/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
  71. package/blog/ko/i18n_using_next-i18next.md +1075 -0
  72. package/blog/ko/i18n_using_next-intl.md +759 -0
  73. package/blog/ko/intlayer_with_react-intl.md +0 -4
  74. package/blog/ko/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
  75. package/blog/pl/i18n_using_next-i18next.md +1078 -0
  76. package/blog/pl/i18n_using_next-intl.md +758 -0
  77. package/blog/pl/index.md +69 -0
  78. package/blog/pl/internationalization_and_SEO.md +363 -0
  79. package/blog/pl/intlayer_with_react-intl.md +0 -4
  80. package/blog/pl/list_i18n_technologies/CMS/drupal.md +143 -0
  81. package/blog/pl/list_i18n_technologies/CMS/wix.md +167 -0
  82. package/blog/pl/list_i18n_technologies/CMS/wordpress.md +196 -0
  83. package/blog/pl/list_i18n_technologies/frameworks/angular.md +125 -0
  84. package/blog/pl/list_i18n_technologies/frameworks/flutter.md +151 -0
  85. package/blog/pl/list_i18n_technologies/frameworks/react-native.md +217 -0
  86. package/blog/pl/list_i18n_technologies/frameworks/react.md +155 -0
  87. package/blog/pl/list_i18n_technologies/frameworks/svelte.md +131 -0
  88. package/blog/pl/list_i18n_technologies/frameworks/vue.md +130 -0
  89. package/blog/pl/next-i18next_vs_next-intl_vs_intlayer.md +1501 -0
  90. package/blog/pl/nextjs-multilingual-seo-comparison.md +362 -0
  91. package/blog/pl/rag_powered_documentation_assistant.md +288 -0
  92. package/blog/pl/react-i18next_vs_react-intl_vs_intlayer.md +164 -0
  93. package/blog/pl/vue-i18n_vs_intlayer.md +278 -0
  94. package/blog/pl/what_is_internationalization.md +167 -0
  95. package/blog/pt/i18n_using_next-i18next.md +1067 -0
  96. package/blog/pt/i18n_using_next-intl.md +760 -0
  97. package/blog/pt/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
  98. package/blog/ru/i18n_using_next-i18next.md +1106 -0
  99. package/blog/ru/i18n_using_next-intl.md +759 -0
  100. package/blog/ru/intlayer_with_react-intl.md +0 -4
  101. package/blog/ru/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
  102. package/blog/tr/i18n_using_next-i18next.md +1078 -0
  103. package/blog/tr/i18n_using_next-intl.md +760 -0
  104. package/blog/tr/intlayer_with_react-intl.md +0 -4
  105. package/blog/tr/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
  106. package/blog/tr/react-i18next_vs_react-intl_vs_intlayer.md +2 -0
  107. package/blog/tr/vue-i18n_vs_intlayer.md +2 -0
  108. package/blog/vi/i18n_using_next-i18next.md +1080 -0
  109. package/blog/vi/i18n_using_next-intl.md +758 -0
  110. package/blog/vi/index.md +69 -0
  111. package/blog/vi/internationalization_and_SEO.md +363 -0
  112. package/blog/vi/intlayer_with_react-intl.md +0 -4
  113. package/blog/vi/list_i18n_technologies/CMS/drupal.md +143 -0
  114. package/blog/vi/list_i18n_technologies/CMS/wix.md +167 -0
  115. package/blog/vi/list_i18n_technologies/CMS/wordpress.md +188 -0
  116. package/blog/vi/list_i18n_technologies/frameworks/angular.md +125 -0
  117. package/blog/vi/list_i18n_technologies/frameworks/flutter.md +150 -0
  118. package/blog/vi/list_i18n_technologies/frameworks/react-native.md +217 -0
  119. package/blog/vi/list_i18n_technologies/frameworks/react.md +155 -0
  120. package/blog/vi/list_i18n_technologies/frameworks/svelte.md +131 -0
  121. package/blog/vi/list_i18n_technologies/frameworks/vue.md +130 -0
  122. package/blog/vi/next-i18next_vs_next-intl_vs_intlayer.md +1520 -0
  123. package/blog/vi/nextjs-multilingual-seo-comparison.md +362 -0
  124. package/blog/vi/rag_powered_documentation_assistant.md +288 -0
  125. package/blog/vi/react-i18next_vs_react-intl_vs_intlayer.md +164 -0
  126. package/blog/vi/vue-i18n_vs_intlayer.md +278 -0
  127. package/blog/vi/what_is_internationalization.md +168 -0
  128. package/blog/zh/i18n_using_next-i18next.md +1105 -0
  129. package/blog/zh/i18n_using_next-intl.md +758 -0
  130. package/blog/zh/intlayer_with_react-intl.md +0 -4
  131. package/blog/zh/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
  132. package/blog/zh/react-i18next_vs_react-intl_vs_intlayer.md +2 -0
  133. package/dist/cjs/common.cjs +0 -4
  134. package/dist/cjs/common.cjs.map +1 -1
  135. package/dist/cjs/generated/blog.entry.cjs +38 -6
  136. package/dist/cjs/generated/blog.entry.cjs.map +1 -1
  137. package/dist/cjs/generated/docs.entry.cjs +0 -6
  138. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  139. package/dist/cjs/generated/frequentQuestions.entry.cjs +0 -6
  140. package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
  141. package/dist/cjs/generated/legal.entry.cjs +0 -6
  142. package/dist/cjs/generated/legal.entry.cjs.map +1 -1
  143. package/dist/esm/generated/blog.entry.mjs +38 -0
  144. package/dist/esm/generated/blog.entry.mjs.map +1 -1
  145. package/dist/types/generated/blog.entry.d.ts +2 -0
  146. package/dist/types/generated/blog.entry.d.ts.map +1 -1
  147. package/docs/ar/component_i18n.md +1 -1
  148. package/docs/ar/configuration.md +6 -0
  149. package/docs/ar/intlayer_cli.md +8 -3
  150. package/docs/ar/intlayer_with_next-i18next.md +619 -0
  151. package/docs/ar/intlayer_with_next-intl.md +446 -0
  152. package/docs/ar/intlayer_with_nextjs_16.md +21 -0
  153. package/docs/ar/intlayer_with_tanstack.md +4 -0
  154. package/docs/ar/intlayer_with_vite+react.md +4 -0
  155. package/docs/de/component_i18n.md +1 -1
  156. package/docs/de/configuration.md +6 -0
  157. package/docs/de/intlayer_cli.md +8 -3
  158. package/docs/de/intlayer_with_next-i18next.md +627 -0
  159. package/docs/de/intlayer_with_next-intl.md +451 -0
  160. package/docs/de/intlayer_with_nextjs_16.md +21 -0
  161. package/docs/de/intlayer_with_tanstack.md +4 -0
  162. package/docs/de/intlayer_with_vite+react.md +4 -0
  163. package/docs/en/component_i18n.md +1 -1
  164. package/docs/en/intlayer_cli.md +8 -1
  165. package/docs/en/intlayer_with_astro.md +10 -2
  166. package/docs/en/intlayer_with_create_react_app.md +8 -0
  167. package/docs/en/intlayer_with_lynx+react.md +8 -0
  168. package/docs/en/intlayer_with_nestjs.md +10 -0
  169. package/docs/en/intlayer_with_nextjs_14.md +10 -2
  170. package/docs/en/intlayer_with_nextjs_15.md +21 -4
  171. package/docs/en/intlayer_with_nextjs_16.md +17 -0
  172. package/docs/en/intlayer_with_nuxt.md +8 -0
  173. package/docs/en/intlayer_with_react_native+expo.md +10 -2
  174. package/docs/en/intlayer_with_react_router_v7.md +8 -0
  175. package/docs/en/intlayer_with_tanstack.md +10 -0
  176. package/docs/en/intlayer_with_vite+preact.md +10 -2
  177. package/docs/en/intlayer_with_vite+react.md +21 -4
  178. package/docs/en/intlayer_with_vite+vue.md +10 -2
  179. package/docs/en-GB/component_i18n.md +1 -1
  180. package/docs/en-GB/configuration.md +6 -0
  181. package/docs/en-GB/intlayer_cli.md +8 -3
  182. package/docs/en-GB/intlayer_with_angular.md +4 -4
  183. package/docs/en-GB/intlayer_with_express.md +4 -4
  184. package/docs/en-GB/intlayer_with_lynx+react.md +12 -12
  185. package/{blog/en/_intlayer_with_next-i18next.md → docs/en-GB/intlayer_with_next-i18next.md} +241 -42
  186. package/{blog/en/_intlayer_with_next-intl.md → docs/en-GB/intlayer_with_next-intl.md} +144 -29
  187. package/docs/en-GB/intlayer_with_nextjs_16.md +21 -0
  188. package/docs/en-GB/intlayer_with_tanstack.md +5 -1
  189. package/docs/en-GB/intlayer_with_vite+react.md +4 -0
  190. package/docs/en-GB/packages/next-intlayer/t.md +2 -2
  191. package/docs/es/component_i18n.md +1 -1
  192. package/docs/es/configuration.md +6 -0
  193. package/docs/es/intlayer_cli.md +8 -3
  194. package/docs/es/intlayer_with_next-i18next.md +628 -0
  195. package/docs/es/intlayer_with_next-intl.md +446 -0
  196. package/docs/es/intlayer_with_nextjs_16.md +21 -0
  197. package/docs/es/intlayer_with_tanstack.md +4 -0
  198. package/docs/es/intlayer_with_vite+react.md +4 -0
  199. package/docs/fr/configuration.md +6 -0
  200. package/docs/fr/intlayer_cli.md +8 -3
  201. package/docs/fr/intlayer_with_next-i18next.md +628 -0
  202. package/docs/fr/intlayer_with_next-intl.md +446 -0
  203. package/docs/fr/intlayer_with_nextjs_16.md +23 -2
  204. package/docs/fr/intlayer_with_tanstack.md +4 -0
  205. package/docs/fr/intlayer_with_vite+react.md +4 -0
  206. package/docs/hi/component_i18n.md +1 -1
  207. package/docs/hi/configuration.md +6 -0
  208. package/docs/hi/intlayer_cli.md +8 -0
  209. package/docs/hi/intlayer_with_next-i18next.md +628 -0
  210. package/docs/hi/intlayer_with_next-intl.md +446 -0
  211. package/docs/hi/intlayer_with_nextjs_16.md +21 -0
  212. package/docs/hi/intlayer_with_tanstack.md +4 -0
  213. package/docs/hi/intlayer_with_vite+react.md +4 -0
  214. package/docs/id/CI_CD.md +198 -0
  215. package/docs/id/autoFill.md +284 -0
  216. package/docs/id/component_i18n.md +186 -0
  217. package/docs/id/configuration.md +710 -0
  218. package/docs/id/dictionary/condition.md +231 -0
  219. package/docs/id/dictionary/content_file.md +1092 -0
  220. package/docs/id/dictionary/enumeration.md +245 -0
  221. package/docs/id/dictionary/file.md +237 -0
  222. package/docs/id/dictionary/function_fetching.md +214 -0
  223. package/docs/id/dictionary/gender.md +273 -0
  224. package/docs/id/dictionary/insertion.md +192 -0
  225. package/docs/id/dictionary/markdown.md +381 -0
  226. package/docs/id/dictionary/nesting.md +273 -0
  227. package/docs/id/dictionary/translation.md +310 -0
  228. package/docs/id/formatters.md +596 -0
  229. package/docs/id/how_works_intlayer.md +256 -0
  230. package/docs/id/index.md +176 -0
  231. package/docs/id/interest_of_intlayer.md +293 -0
  232. package/docs/id/intlayer_CMS.md +549 -0
  233. package/docs/id/intlayer_cli.md +850 -0
  234. package/docs/id/intlayer_visual_editor.md +288 -0
  235. package/docs/id/intlayer_with_angular.md +694 -0
  236. package/docs/id/intlayer_with_astro.md +252 -0
  237. package/docs/id/intlayer_with_create_react_app.md +1233 -0
  238. package/docs/id/intlayer_with_express.md +411 -0
  239. package/docs/id/intlayer_with_lynx+react.md +518 -0
  240. package/docs/id/intlayer_with_nestjs.md +272 -0
  241. package/docs/id/intlayer_with_next-i18next.md +628 -0
  242. package/docs/id/intlayer_with_next-intl.md +446 -0
  243. package/docs/id/intlayer_with_nextjs_14.md +1617 -0
  244. package/docs/id/intlayer_with_nextjs_15.md +1698 -0
  245. package/docs/id/intlayer_with_nextjs_16.md +21 -0
  246. package/docs/id/intlayer_with_nextjs_page_router.md +1478 -0
  247. package/docs/id/intlayer_with_nuxt.md +808 -0
  248. package/docs/id/intlayer_with_react_native+expo.md +699 -0
  249. package/docs/id/intlayer_with_react_router_v7.md +496 -0
  250. package/docs/id/intlayer_with_tanstack.md +564 -0
  251. package/docs/id/intlayer_with_vite+preact.md +1737 -0
  252. package/docs/id/intlayer_with_vite+react.md +1413 -0
  253. package/docs/id/intlayer_with_vite+solid.md +289 -0
  254. package/docs/id/intlayer_with_vite+svelte.md +289 -0
  255. package/docs/id/intlayer_with_vite+vue.md +1088 -0
  256. package/docs/id/introduction.md +218 -0
  257. package/docs/id/locale_mapper.md +242 -0
  258. package/docs/id/mcp_server.md +211 -0
  259. package/docs/id/packages/express-intlayer/t.md +458 -0
  260. package/docs/id/packages/intlayer/getConfiguration.md +145 -0
  261. package/docs/id/packages/intlayer/getEnumeration.md +159 -0
  262. package/docs/id/packages/intlayer/getHTMLTextDir.md +122 -0
  263. package/docs/id/packages/intlayer/getLocaleLang.md +81 -0
  264. package/docs/id/packages/intlayer/getLocaleName.md +119 -0
  265. package/docs/id/packages/intlayer/getLocalizedUrl.md +309 -0
  266. package/docs/id/packages/intlayer/getMultilingualUrls.md +223 -0
  267. package/docs/id/packages/intlayer/getPathWithoutLocale.md +75 -0
  268. package/docs/id/packages/intlayer/getTranslation.md +190 -0
  269. package/docs/id/packages/intlayer/getTranslationContent.md +188 -0
  270. package/docs/id/packages/next-intlayer/t.md +352 -0
  271. package/docs/id/packages/next-intlayer/useDictionary.md +271 -0
  272. package/docs/id/packages/next-intlayer/useIntlayer.md +264 -0
  273. package/docs/id/packages/next-intlayer/useLocale.md +166 -0
  274. package/docs/id/packages/react-intlayer/t.md +303 -0
  275. package/docs/id/packages/react-intlayer/useDictionary.md +287 -0
  276. package/docs/id/packages/react-intlayer/useI18n.md +267 -0
  277. package/docs/id/packages/react-intlayer/useIntlayer.md +254 -0
  278. package/docs/id/packages/react-intlayer/useLocale.md +210 -0
  279. package/docs/id/per_locale_file.md +323 -0
  280. package/docs/id/readme.md +261 -0
  281. package/docs/id/releases/v6.md +305 -0
  282. package/docs/id/roadmap.md +362 -0
  283. package/docs/id/testing.md +202 -0
  284. package/docs/id/vs_code_extension.md +126 -0
  285. package/docs/it/component_i18n.md +1 -1
  286. package/docs/it/configuration.md +6 -0
  287. package/docs/it/intlayer_cli.md +8 -3
  288. package/docs/it/intlayer_with_next-i18next.md +628 -0
  289. package/docs/it/intlayer_with_next-intl.md +446 -0
  290. package/docs/it/intlayer_with_nextjs_16.md +21 -0
  291. package/docs/it/intlayer_with_tanstack.md +4 -0
  292. package/docs/it/intlayer_with_vite+react.md +4 -0
  293. package/docs/ja/component_i18n.md +1 -1
  294. package/docs/ja/configuration.md +6 -0
  295. package/docs/ja/intlayer_cli.md +8 -3
  296. package/docs/ja/intlayer_with_next-i18next.md +627 -0
  297. package/docs/ja/intlayer_with_next-intl.md +446 -0
  298. package/docs/ja/intlayer_with_nextjs_16.md +21 -0
  299. package/docs/ja/intlayer_with_tanstack.md +4 -0
  300. package/docs/ja/intlayer_with_vite+react.md +4 -0
  301. package/docs/ko/configuration.md +6 -0
  302. package/docs/ko/intlayer_cli.md +8 -3
  303. package/docs/ko/intlayer_with_next-i18next.md +627 -0
  304. package/docs/ko/intlayer_with_next-intl.md +446 -0
  305. package/docs/ko/intlayer_with_nextjs_16.md +21 -0
  306. package/docs/ko/intlayer_with_tanstack.md +4 -0
  307. package/docs/ko/intlayer_with_vite+react.md +4 -0
  308. package/docs/pl/CI_CD.md +198 -0
  309. package/docs/pl/autoFill.md +284 -0
  310. package/docs/pl/component_i18n.md +186 -0
  311. package/docs/pl/configuration.md +710 -0
  312. package/docs/pl/dictionary/condition.md +232 -0
  313. package/docs/pl/dictionary/content_file.md +1130 -0
  314. package/docs/pl/dictionary/enumeration.md +245 -0
  315. package/docs/pl/dictionary/file.md +234 -0
  316. package/docs/pl/dictionary/function_fetching.md +214 -0
  317. package/docs/pl/dictionary/gender.md +276 -0
  318. package/docs/pl/dictionary/insertion.md +188 -0
  319. package/docs/pl/dictionary/markdown.md +408 -0
  320. package/docs/pl/dictionary/nesting.md +273 -0
  321. package/docs/pl/dictionary/translation.md +310 -0
  322. package/docs/pl/formatters.md +596 -0
  323. package/docs/pl/how_works_intlayer.md +256 -0
  324. package/docs/pl/index.md +176 -0
  325. package/docs/pl/interest_of_intlayer.md +291 -0
  326. package/docs/pl/intlayer_CMS.md +549 -0
  327. package/docs/pl/intlayer_cli.md +857 -0
  328. package/docs/pl/intlayer_visual_editor.md +288 -0
  329. package/docs/pl/intlayer_with_angular.md +690 -0
  330. package/docs/pl/intlayer_with_astro.md +280 -0
  331. package/docs/pl/intlayer_with_create_react_app.md +1235 -0
  332. package/docs/pl/intlayer_with_express.md +411 -0
  333. package/docs/pl/intlayer_with_lynx+react.md +518 -0
  334. package/docs/pl/intlayer_with_nestjs.md +272 -0
  335. package/docs/pl/intlayer_with_next-i18next.md +628 -0
  336. package/docs/pl/intlayer_with_next-intl.md +446 -0
  337. package/docs/pl/intlayer_with_nextjs_14.md +1594 -0
  338. package/docs/pl/intlayer_with_nextjs_15.md +1701 -0
  339. package/docs/pl/intlayer_with_nextjs_16.md +21 -0
  340. package/docs/pl/intlayer_with_nextjs_page_router.md +1513 -0
  341. package/docs/pl/intlayer_with_nuxt.md +885 -0
  342. package/docs/pl/intlayer_with_react_native+expo.md +698 -0
  343. package/docs/pl/intlayer_with_react_router_v7.md +503 -0
  344. package/docs/pl/intlayer_with_tanstack.md +562 -0
  345. package/docs/pl/intlayer_with_vite+preact.md +1736 -0
  346. package/docs/pl/intlayer_with_vite+react.md +1438 -0
  347. package/docs/pl/intlayer_with_vite+solid.md +290 -0
  348. package/docs/pl/intlayer_with_vite+svelte.md +289 -0
  349. package/docs/pl/intlayer_with_vite+vue.md +1116 -0
  350. package/docs/pl/introduction.md +209 -0
  351. package/docs/pl/locale_mapper.md +242 -0
  352. package/docs/pl/mcp_server.md +211 -0
  353. package/docs/pl/packages/express-intlayer/t.md +458 -0
  354. package/docs/pl/packages/intlayer/getConfiguration.md +146 -0
  355. package/docs/pl/packages/intlayer/getEnumeration.md +160 -0
  356. package/docs/pl/packages/intlayer/getHTMLTextDir.md +121 -0
  357. package/docs/pl/packages/intlayer/getLocaleLang.md +81 -0
  358. package/docs/pl/packages/intlayer/getLocaleName.md +118 -0
  359. package/docs/pl/packages/intlayer/getLocalizedUrl.md +300 -0
  360. package/docs/pl/packages/intlayer/getMultilingualUrls.md +221 -0
  361. package/docs/pl/packages/intlayer/getPathWithoutLocale.md +75 -0
  362. package/docs/pl/packages/intlayer/getTranslation.md +190 -0
  363. package/docs/pl/packages/intlayer/getTranslationContent.md +189 -0
  364. package/docs/pl/packages/next-intlayer/t.md +353 -0
  365. package/docs/pl/packages/next-intlayer/useDictionary.md +270 -0
  366. package/docs/pl/packages/next-intlayer/useIntlayer.md +263 -0
  367. package/docs/pl/packages/next-intlayer/useLocale.md +166 -0
  368. package/docs/pl/packages/react-intlayer/t.md +303 -0
  369. package/docs/pl/packages/react-intlayer/useDictionary.md +289 -0
  370. package/docs/pl/packages/react-intlayer/useI18n.md +249 -0
  371. package/docs/pl/packages/react-intlayer/useIntlayer.md +256 -0
  372. package/docs/pl/packages/react-intlayer/useLocale.md +210 -0
  373. package/docs/pl/per_locale_file.md +321 -0
  374. package/docs/pl/readme.md +261 -0
  375. package/docs/pl/releases/v6.md +305 -0
  376. package/docs/pl/roadmap.md +362 -0
  377. package/docs/pl/testing.md +202 -0
  378. package/docs/pl/vs_code_extension.md +126 -0
  379. package/docs/pt/component_i18n.md +1 -1
  380. package/docs/pt/configuration.md +6 -0
  381. package/docs/pt/intlayer_cli.md +8 -3
  382. package/docs/pt/intlayer_with_next-i18next.md +627 -0
  383. package/docs/pt/intlayer_with_next-intl.md +446 -0
  384. package/docs/pt/intlayer_with_nextjs_16.md +21 -0
  385. package/docs/pt/intlayer_with_tanstack.md +4 -0
  386. package/docs/pt/intlayer_with_vite+react.md +4 -0
  387. package/docs/ru/component_i18n.md +1 -1
  388. package/docs/ru/configuration.md +6 -0
  389. package/docs/ru/intlayer_cli.md +301 -22
  390. package/docs/ru/intlayer_with_next-i18next.md +629 -0
  391. package/docs/ru/intlayer_with_next-intl.md +448 -0
  392. package/docs/ru/intlayer_with_nextjs_16.md +21 -0
  393. package/docs/ru/intlayer_with_tanstack.md +4 -0
  394. package/docs/ru/intlayer_with_vite+react.md +4 -0
  395. package/docs/tr/component_i18n.md +1 -1
  396. package/docs/tr/configuration.md +6 -0
  397. package/docs/tr/intlayer_cli.md +8 -0
  398. package/docs/tr/intlayer_with_next-i18next.md +627 -0
  399. package/docs/tr/intlayer_with_next-intl.md +446 -0
  400. package/docs/tr/intlayer_with_nextjs_16.md +21 -0
  401. package/docs/tr/intlayer_with_tanstack.md +4 -0
  402. package/docs/tr/intlayer_with_vite+react.md +4 -0
  403. package/docs/vi/CI_CD.md +198 -0
  404. package/docs/vi/autoFill.md +284 -0
  405. package/docs/vi/component_i18n.md +186 -0
  406. package/docs/vi/configuration.md +710 -0
  407. package/docs/vi/dictionary/condition.md +237 -0
  408. package/docs/vi/dictionary/content_file.md +1115 -0
  409. package/docs/vi/dictionary/enumeration.md +255 -0
  410. package/docs/vi/dictionary/file.md +234 -0
  411. package/docs/vi/dictionary/function_fetching.md +212 -0
  412. package/docs/vi/dictionary/gender.md +275 -0
  413. package/docs/vi/dictionary/insertion.md +191 -0
  414. package/docs/vi/dictionary/markdown.md +381 -0
  415. package/docs/vi/dictionary/nesting.md +273 -0
  416. package/docs/vi/dictionary/translation.md +309 -0
  417. package/docs/vi/formatters.md +595 -0
  418. package/docs/vi/how_works_intlayer.md +256 -0
  419. package/docs/vi/index.md +174 -0
  420. package/docs/vi/interest_of_intlayer.md +292 -0
  421. package/docs/vi/intlayer_CMS.md +549 -0
  422. package/docs/vi/intlayer_cli.md +850 -0
  423. package/docs/vi/intlayer_visual_editor.md +288 -0
  424. package/docs/vi/intlayer_with_angular.md +692 -0
  425. package/docs/vi/intlayer_with_astro.md +252 -0
  426. package/docs/vi/intlayer_with_create_react_app.md +1230 -0
  427. package/docs/vi/intlayer_with_express.md +409 -0
  428. package/docs/vi/intlayer_with_lynx+react.md +520 -0
  429. package/docs/vi/intlayer_with_nestjs.md +272 -0
  430. package/docs/vi/intlayer_with_next-i18next.md +628 -0
  431. package/docs/vi/intlayer_with_next-intl.md +446 -0
  432. package/docs/vi/intlayer_with_nextjs_14.md +1584 -0
  433. package/docs/vi/intlayer_with_nextjs_15.md +1738 -0
  434. package/docs/vi/intlayer_with_nextjs_16.md +21 -0
  435. package/docs/vi/intlayer_with_nextjs_page_router.md +1504 -0
  436. package/docs/vi/intlayer_with_nuxt.md +821 -0
  437. package/docs/vi/intlayer_with_react_native+expo.md +700 -0
  438. package/docs/vi/intlayer_with_react_router_v7.md +498 -0
  439. package/docs/vi/intlayer_with_tanstack.md +562 -0
  440. package/docs/vi/intlayer_with_vite+preact.md +1722 -0
  441. package/docs/vi/intlayer_with_vite+react.md +1407 -0
  442. package/docs/vi/intlayer_with_vite+solid.md +287 -0
  443. package/docs/vi/intlayer_with_vite+svelte.md +289 -0
  444. package/docs/vi/intlayer_with_vite+vue.md +1071 -0
  445. package/docs/vi/introduction.md +215 -0
  446. package/docs/vi/locale_mapper.md +242 -0
  447. package/docs/vi/mcp_server.md +211 -0
  448. package/docs/vi/packages/express-intlayer/t.md +457 -0
  449. package/docs/vi/packages/intlayer/getConfiguration.md +145 -0
  450. package/docs/vi/packages/intlayer/getEnumeration.md +162 -0
  451. package/docs/vi/packages/intlayer/getHTMLTextDir.md +121 -0
  452. package/docs/vi/packages/intlayer/getLocaleLang.md +81 -0
  453. package/docs/vi/packages/intlayer/getLocaleName.md +129 -0
  454. package/docs/vi/packages/intlayer/getLocalizedUrl.md +309 -0
  455. package/docs/vi/packages/intlayer/getMultilingualUrls.md +221 -0
  456. package/docs/vi/packages/intlayer/getPathWithoutLocale.md +75 -0
  457. package/docs/vi/packages/intlayer/getTranslation.md +201 -0
  458. package/docs/vi/packages/intlayer/getTranslationContent.md +188 -0
  459. package/docs/vi/packages/next-intlayer/t.md +352 -0
  460. package/docs/vi/packages/next-intlayer/useDictionary.md +273 -0
  461. package/docs/vi/packages/next-intlayer/useIntlayer.md +264 -0
  462. package/docs/vi/packages/next-intlayer/useLocale.md +166 -0
  463. package/docs/vi/packages/react-intlayer/t.md +304 -0
  464. package/docs/vi/packages/react-intlayer/useDictionary.md +288 -0
  465. package/docs/vi/packages/react-intlayer/useI18n.md +295 -0
  466. package/docs/vi/packages/react-intlayer/useIntlayer.md +256 -0
  467. package/docs/vi/packages/react-intlayer/useLocale.md +210 -0
  468. package/docs/vi/per_locale_file.md +326 -0
  469. package/docs/vi/readme.md +261 -0
  470. package/docs/vi/releases/v6.md +305 -0
  471. package/docs/vi/roadmap.md +346 -0
  472. package/docs/vi/testing.md +202 -0
  473. package/docs/vi/vs_code_extension.md +126 -0
  474. package/docs/zh/configuration.md +6 -0
  475. package/docs/zh/intlayer_cli.md +8 -3
  476. package/docs/zh/intlayer_with_next-i18next.md +628 -0
  477. package/docs/zh/intlayer_with_next-intl.md +448 -0
  478. package/docs/zh/intlayer_with_nextjs_16.md +21 -0
  479. package/docs/zh/intlayer_with_tanstack.md +4 -0
  480. package/docs/zh/intlayer_with_vite+react.md +4 -0
  481. package/frequent_questions/ar/SSR_Next_no_[locale].md +1 -2
  482. package/frequent_questions/ar/array_as_content_declaration.md +1 -2
  483. package/frequent_questions/ar/build_dictionaries.md +1 -2
  484. package/frequent_questions/ar/build_error_CI_CD.md +1 -2
  485. package/frequent_questions/ar/bun_set_up.md +1 -2
  486. package/frequent_questions/ar/customized_locale_list.md +1 -2
  487. package/frequent_questions/ar/domain_routing.md +1 -2
  488. package/frequent_questions/ar/esbuild_error.md +1 -2
  489. package/frequent_questions/ar/get_locale_cookie.md +1 -2
  490. package/frequent_questions/ar/intlayer_command_undefined.md +1 -2
  491. package/frequent_questions/ar/locale_incorect_in_url.md +1 -2
  492. package/frequent_questions/ar/static_rendering.md +1 -3
  493. package/frequent_questions/ar/translated_path_url.md +1 -2
  494. package/frequent_questions/ar/unknown_command.md +1 -2
  495. package/frequent_questions/de/SSR_Next_no_[locale].md +1 -2
  496. package/frequent_questions/de/array_as_content_declaration.md +1 -2
  497. package/frequent_questions/de/build_dictionaries.md +1 -2
  498. package/frequent_questions/de/build_error_CI_CD.md +1 -2
  499. package/frequent_questions/de/bun_set_up.md +1 -2
  500. package/frequent_questions/de/customized_locale_list.md +1 -2
  501. package/frequent_questions/de/domain_routing.md +1 -2
  502. package/frequent_questions/de/esbuild_error.md +1 -2
  503. package/frequent_questions/de/get_locale_cookie.md +1 -2
  504. package/frequent_questions/de/intlayer_command_undefined.md +1 -2
  505. package/frequent_questions/de/locale_incorect_in_url.md +1 -2
  506. package/frequent_questions/de/static_rendering.md +1 -3
  507. package/frequent_questions/de/translated_path_url.md +1 -2
  508. package/frequent_questions/de/unknown_command.md +1 -2
  509. package/frequent_questions/en/SSR_Next_no_[locale].md +1 -2
  510. package/frequent_questions/en/array_as_content_declaration.md +1 -2
  511. package/frequent_questions/en/build_dictionaries.md +1 -2
  512. package/frequent_questions/en/build_error_CI_CD.md +1 -2
  513. package/frequent_questions/en/bun_set_up.md +1 -2
  514. package/frequent_questions/en/customized_locale_list.md +1 -2
  515. package/frequent_questions/en/domain_routing.md +1 -2
  516. package/frequent_questions/en/esbuild_error.md +1 -2
  517. package/frequent_questions/en/get_locale_cookie.md +1 -2
  518. package/frequent_questions/en/intlayer_command_undefined.md +1 -2
  519. package/frequent_questions/en/locale_incorect_in_url.md +1 -2
  520. package/frequent_questions/en/static_rendering.md +1 -3
  521. package/frequent_questions/en/translated_path_url.md +1 -2
  522. package/frequent_questions/en/unknown_command.md +1 -2
  523. package/frequent_questions/en-GB/SSR_Next_no_[locale].md +1 -2
  524. package/frequent_questions/en-GB/array_as_content_declaration.md +1 -2
  525. package/frequent_questions/en-GB/build_dictionaries.md +1 -2
  526. package/frequent_questions/en-GB/build_error_CI_CD.md +1 -2
  527. package/frequent_questions/en-GB/bun_set_up.md +1 -2
  528. package/frequent_questions/en-GB/customized_locale_list.md +1 -2
  529. package/frequent_questions/en-GB/domain_routing.md +1 -2
  530. package/frequent_questions/en-GB/esbuild_error.md +1 -2
  531. package/frequent_questions/en-GB/get_locale_cookie.md +1 -2
  532. package/frequent_questions/en-GB/intlayer_command_undefined.md +1 -2
  533. package/frequent_questions/en-GB/locale_incorect_in_url.md +1 -2
  534. package/frequent_questions/en-GB/static_rendering.md +1 -3
  535. package/frequent_questions/en-GB/translated_path_url.md +1 -2
  536. package/frequent_questions/en-GB/unknown_command.md +1 -2
  537. package/frequent_questions/es/SSR_Next_no_[locale].md +1 -2
  538. package/frequent_questions/es/array_as_content_declaration.md +1 -2
  539. package/frequent_questions/es/build_dictionaries.md +1 -2
  540. package/frequent_questions/es/build_error_CI_CD.md +1 -2
  541. package/frequent_questions/es/bun_set_up.md +1 -2
  542. package/frequent_questions/es/customized_locale_list.md +1 -2
  543. package/frequent_questions/es/domain_routing.md +1 -2
  544. package/frequent_questions/es/esbuild_error.md +1 -2
  545. package/frequent_questions/es/get_locale_cookie.md +1 -2
  546. package/frequent_questions/es/intlayer_command_undefined.md +1 -2
  547. package/frequent_questions/es/locale_incorect_in_url.md +1 -2
  548. package/frequent_questions/es/static_rendering.md +1 -3
  549. package/frequent_questions/es/translated_path_url.md +1 -2
  550. package/frequent_questions/es/unknown_command.md +1 -2
  551. package/frequent_questions/fr/SSR_Next_no_[locale].md +1 -2
  552. package/frequent_questions/fr/array_as_content_declaration.md +1 -2
  553. package/frequent_questions/fr/build_dictionaries.md +1 -2
  554. package/frequent_questions/fr/build_error_CI_CD.md +1 -2
  555. package/frequent_questions/fr/bun_set_up.md +1 -2
  556. package/frequent_questions/fr/customized_locale_list.md +1 -2
  557. package/frequent_questions/fr/domain_routing.md +1 -2
  558. package/frequent_questions/fr/esbuild_error.md +1 -2
  559. package/frequent_questions/fr/get_locale_cookie.md +1 -2
  560. package/frequent_questions/fr/intlayer_command_undefined.md +1 -2
  561. package/frequent_questions/fr/locale_incorect_in_url.md +1 -2
  562. package/frequent_questions/fr/static_rendering.md +1 -3
  563. package/frequent_questions/fr/translated_path_url.md +1 -2
  564. package/frequent_questions/fr/unknown_command.md +1 -2
  565. package/frequent_questions/hi/SSR_Next_no_[locale].md +1 -2
  566. package/frequent_questions/hi/array_as_content_declaration.md +1 -2
  567. package/frequent_questions/hi/build_dictionaries.md +1 -2
  568. package/frequent_questions/hi/build_error_CI_CD.md +1 -2
  569. package/frequent_questions/hi/bun_set_up.md +1 -2
  570. package/frequent_questions/hi/customized_locale_list.md +1 -2
  571. package/frequent_questions/hi/domain_routing.md +1 -2
  572. package/frequent_questions/hi/esbuild_error.md +1 -2
  573. package/frequent_questions/hi/get_locale_cookie.md +1 -2
  574. package/frequent_questions/hi/intlayer_command_undefined.md +1 -2
  575. package/frequent_questions/hi/locale_incorect_in_url.md +1 -2
  576. package/frequent_questions/hi/static_rendering.md +1 -3
  577. package/frequent_questions/hi/translated_path_url.md +1 -2
  578. package/frequent_questions/hi/unknown_command.md +1 -2
  579. package/frequent_questions/id/SSR_Next_no_[locale].md +104 -0
  580. package/frequent_questions/id/array_as_content_declaration.md +71 -0
  581. package/frequent_questions/id/build_dictionaries.md +58 -0
  582. package/frequent_questions/id/build_error_CI_CD.md +74 -0
  583. package/frequent_questions/id/bun_set_up.md +53 -0
  584. package/frequent_questions/id/customized_locale_list.md +64 -0
  585. package/frequent_questions/id/domain_routing.md +113 -0
  586. package/frequent_questions/id/esbuild_error.md +29 -0
  587. package/frequent_questions/id/get_locale_cookie.md +142 -0
  588. package/frequent_questions/id/intlayer_command_undefined.md +155 -0
  589. package/frequent_questions/id/locale_incorect_in_url.md +73 -0
  590. package/frequent_questions/id/static_rendering.md +44 -0
  591. package/frequent_questions/id/translated_path_url.md +55 -0
  592. package/frequent_questions/id/unknown_command.md +97 -0
  593. package/frequent_questions/it/SSR_Next_no_[locale].md +1 -2
  594. package/frequent_questions/it/array_as_content_declaration.md +1 -2
  595. package/frequent_questions/it/build_dictionaries.md +1 -2
  596. package/frequent_questions/it/build_error_CI_CD.md +1 -2
  597. package/frequent_questions/it/bun_set_up.md +1 -2
  598. package/frequent_questions/it/customized_locale_list.md +1 -2
  599. package/frequent_questions/it/domain_routing.md +1 -2
  600. package/frequent_questions/it/esbuild_error.md +1 -2
  601. package/frequent_questions/it/get_locale_cookie.md +1 -2
  602. package/frequent_questions/it/intlayer_command_undefined.md +1 -2
  603. package/frequent_questions/it/locale_incorect_in_url.md +1 -2
  604. package/frequent_questions/it/static_rendering.md +1 -3
  605. package/frequent_questions/it/translated_path_url.md +1 -2
  606. package/frequent_questions/it/unknown_command.md +1 -2
  607. package/frequent_questions/ja/SSR_Next_no_[locale].md +1 -2
  608. package/frequent_questions/ja/array_as_content_declaration.md +1 -2
  609. package/frequent_questions/ja/build_dictionaries.md +1 -2
  610. package/frequent_questions/ja/build_error_CI_CD.md +1 -2
  611. package/frequent_questions/ja/bun_set_up.md +1 -2
  612. package/frequent_questions/ja/customized_locale_list.md +1 -2
  613. package/frequent_questions/ja/domain_routing.md +1 -2
  614. package/frequent_questions/ja/esbuild_error.md +1 -2
  615. package/frequent_questions/ja/get_locale_cookie.md +1 -2
  616. package/frequent_questions/ja/intlayer_command_undefined.md +1 -2
  617. package/frequent_questions/ja/locale_incorect_in_url.md +1 -2
  618. package/frequent_questions/ja/static_rendering.md +1 -3
  619. package/frequent_questions/ja/translated_path_url.md +1 -2
  620. package/frequent_questions/ja/unknown_command.md +1 -2
  621. package/frequent_questions/ko/SSR_Next_no_[locale].md +1 -2
  622. package/frequent_questions/ko/array_as_content_declaration.md +1 -2
  623. package/frequent_questions/ko/build_dictionaries.md +1 -2
  624. package/frequent_questions/ko/build_error_CI_CD.md +1 -2
  625. package/frequent_questions/ko/bun_set_up.md +1 -2
  626. package/frequent_questions/ko/customized_locale_list.md +1 -2
  627. package/frequent_questions/ko/domain_routing.md +1 -2
  628. package/frequent_questions/ko/esbuild_error.md +1 -2
  629. package/frequent_questions/ko/get_locale_cookie.md +1 -2
  630. package/frequent_questions/ko/intlayer_command_undefined.md +1 -2
  631. package/frequent_questions/ko/locale_incorect_in_url.md +1 -2
  632. package/frequent_questions/ko/static_rendering.md +1 -3
  633. package/frequent_questions/ko/translated_path_url.md +1 -2
  634. package/frequent_questions/ko/unknown_command.md +1 -2
  635. package/frequent_questions/pl/SSR_Next_no_[locale].md +104 -0
  636. package/frequent_questions/pl/array_as_content_declaration.md +71 -0
  637. package/frequent_questions/pl/build_dictionaries.md +58 -0
  638. package/frequent_questions/pl/build_error_CI_CD.md +74 -0
  639. package/frequent_questions/pl/bun_set_up.md +54 -0
  640. package/frequent_questions/pl/customized_locale_list.md +64 -0
  641. package/frequent_questions/pl/domain_routing.md +113 -0
  642. package/frequent_questions/pl/esbuild_error.md +29 -0
  643. package/frequent_questions/pl/get_locale_cookie.md +142 -0
  644. package/frequent_questions/pl/intlayer_command_undefined.md +155 -0
  645. package/frequent_questions/pl/locale_incorect_in_url.md +73 -0
  646. package/frequent_questions/pl/static_rendering.md +44 -0
  647. package/frequent_questions/pl/translated_path_url.md +55 -0
  648. package/frequent_questions/pl/unknown_command.md +97 -0
  649. package/frequent_questions/pt/SSR_Next_no_[locale].md +1 -2
  650. package/frequent_questions/pt/array_as_content_declaration.md +1 -2
  651. package/frequent_questions/pt/build_dictionaries.md +1 -2
  652. package/frequent_questions/pt/build_error_CI_CD.md +1 -2
  653. package/frequent_questions/pt/bun_set_up.md +1 -2
  654. package/frequent_questions/pt/customized_locale_list.md +1 -2
  655. package/frequent_questions/pt/domain_routing.md +1 -2
  656. package/frequent_questions/pt/esbuild_error.md +1 -2
  657. package/frequent_questions/pt/get_locale_cookie.md +1 -2
  658. package/frequent_questions/pt/intlayer_command_undefined.md +1 -2
  659. package/frequent_questions/pt/locale_incorect_in_url.md +1 -2
  660. package/frequent_questions/pt/static_rendering.md +1 -3
  661. package/frequent_questions/pt/translated_path_url.md +1 -2
  662. package/frequent_questions/pt/unknown_command.md +1 -2
  663. package/frequent_questions/ru/SSR_Next_no_[locale].md +1 -2
  664. package/frequent_questions/ru/array_as_content_declaration.md +1 -2
  665. package/frequent_questions/ru/build_dictionaries.md +1 -2
  666. package/frequent_questions/ru/build_error_CI_CD.md +1 -2
  667. package/frequent_questions/ru/bun_set_up.md +1 -2
  668. package/frequent_questions/ru/customized_locale_list.md +1 -2
  669. package/frequent_questions/ru/domain_routing.md +1 -2
  670. package/frequent_questions/ru/esbuild_error.md +1 -2
  671. package/frequent_questions/ru/get_locale_cookie.md +1 -2
  672. package/frequent_questions/ru/intlayer_command_undefined.md +1 -2
  673. package/frequent_questions/ru/locale_incorect_in_url.md +1 -2
  674. package/frequent_questions/ru/static_rendering.md +1 -2
  675. package/frequent_questions/ru/translated_path_url.md +1 -2
  676. package/frequent_questions/ru/unknown_command.md +1 -2
  677. package/frequent_questions/tr/SSR_Next_no_[locale].md +1 -2
  678. package/frequent_questions/tr/array_as_content_declaration.md +1 -2
  679. package/frequent_questions/tr/build_dictionaries.md +1 -2
  680. package/frequent_questions/tr/build_error_CI_CD.md +1 -2
  681. package/frequent_questions/tr/bun_set_up.md +1 -2
  682. package/frequent_questions/tr/customized_locale_list.md +1 -2
  683. package/frequent_questions/tr/domain_routing.md +1 -2
  684. package/frequent_questions/tr/esbuild_error.md +1 -2
  685. package/frequent_questions/tr/get_locale_cookie.md +1 -2
  686. package/frequent_questions/tr/intlayer_command_undefined.md +1 -2
  687. package/frequent_questions/tr/locale_incorect_in_url.md +1 -2
  688. package/frequent_questions/tr/static_rendering.md +1 -2
  689. package/frequent_questions/tr/translated_path_url.md +1 -2
  690. package/frequent_questions/tr/unknown_command.md +1 -2
  691. package/frequent_questions/vi/SSR_Next_no_[locale].md +106 -0
  692. package/frequent_questions/vi/array_as_content_declaration.md +71 -0
  693. package/frequent_questions/vi/build_dictionaries.md +58 -0
  694. package/frequent_questions/vi/build_error_CI_CD.md +74 -0
  695. package/frequent_questions/vi/bun_set_up.md +53 -0
  696. package/frequent_questions/vi/customized_locale_list.md +64 -0
  697. package/frequent_questions/vi/domain_routing.md +113 -0
  698. package/frequent_questions/vi/esbuild_error.md +29 -0
  699. package/frequent_questions/vi/get_locale_cookie.md +142 -0
  700. package/frequent_questions/vi/intlayer_command_undefined.md +155 -0
  701. package/frequent_questions/vi/locale_incorect_in_url.md +73 -0
  702. package/frequent_questions/vi/static_rendering.md +44 -0
  703. package/frequent_questions/vi/translated_path_url.md +55 -0
  704. package/frequent_questions/vi/unknown_command.md +97 -0
  705. package/frequent_questions/zh/SSR_Next_no_[locale].md +1 -2
  706. package/frequent_questions/zh/array_as_content_declaration.md +1 -2
  707. package/frequent_questions/zh/build_dictionaries.md +1 -2
  708. package/frequent_questions/zh/build_error_CI_CD.md +1 -2
  709. package/frequent_questions/zh/bun_set_up.md +1 -2
  710. package/frequent_questions/zh/customized_locale_list.md +1 -2
  711. package/frequent_questions/zh/domain_routing.md +1 -2
  712. package/frequent_questions/zh/esbuild_error.md +1 -2
  713. package/frequent_questions/zh/get_locale_cookie.md +1 -2
  714. package/frequent_questions/zh/intlayer_command_undefined.md +1 -2
  715. package/frequent_questions/zh/locale_incorect_in_url.md +1 -2
  716. package/frequent_questions/zh/static_rendering.md +1 -3
  717. package/frequent_questions/zh/translated_path_url.md +1 -2
  718. package/frequent_questions/zh/unknown_command.md +1 -2
  719. package/legal/id/privacy_notice.md +83 -0
  720. package/legal/id/terms_of_service.md +55 -0
  721. package/legal/pl/privacy_notice.md +83 -0
  722. package/legal/pl/terms_of_service.md +55 -0
  723. package/legal/vi/privacy_notice.md +83 -0
  724. package/legal/vi/terms_of_service.md +55 -0
  725. package/package.json +19 -18
  726. package/src/generated/blog.entry.ts +38 -0
@@ -0,0 +1,757 @@
1
+ ---
2
+ createdAt: 2025-11-01
3
+ updatedAt: 2025-11-01
4
+ title: Cara menginternasionalisasi aplikasi Next.js Anda menggunakan next-intl
5
+ description: Mengatur i18n dengan next-intl - praktik terbaik dan tips SEO untuk aplikasi Next.js multibahasa, mencakup internasionalisasi, organisasi konten, dan pengaturan teknis.
6
+ slugs:
7
+ - blog
8
+ - nextjs-internationalization-using-next-intl
9
+ applicationTemplate: https://github.com/aymericzip/next-intl-template
10
+ history:
11
+ - version: 7.0.0
12
+ date: 2025-11-01
13
+ changes: Versi awal
14
+ ---
15
+
16
+ # Cara menginternasionalisasi aplikasi Next.js Anda menggunakan next-intl pada tahun 2025
17
+
18
+ ## Daftar Isi
19
+
20
+ <TOC/>
21
+
22
+ ## Apa itu next-intl?
23
+
24
+ **next-intl** adalah perpustakaan internasionalisasi (i18n) yang populer yang dirancang khusus untuk Next.js App Router. Ini menyediakan cara yang mulus untuk membangun aplikasi Next.js multibahasa dengan dukungan TypeScript yang sangat baik dan optimasi bawaan.
25
+
26
+ > Jika Anda mau, Anda juga dapat merujuk ke [panduan next-i18next](https://github.com/aymericzip/intlayer/blob/main/docs/blog/id/i18n_using_next-i18next.md), atau langsung menggunakan [Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/id/intlayer_with_next-intl.md).
27
+
28
+ > Lihat perbandingan di [next-i18next vs next-intl vs Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/blog/id/next-i18next_vs_next-intl_vs_intlayer.md).
29
+
30
+ ## Praktik yang harus Anda ikuti
31
+
32
+ Sebelum kita masuk ke implementasi, berikut beberapa praktik yang harus Anda ikuti:
33
+
34
+ - **Atur atribut HTML `lang` dan `dir`**
35
+ Dalam layout Anda, hitung `dir` menggunakan `getLocaleDirection(locale)` dan atur `<html lang={locale} dir={dir}>` untuk aksesibilitas dan SEO yang tepat.
36
+ - **Pisahkan pesan berdasarkan namespace**
37
+ Atur file JSON per locale dan namespace (misalnya, `common.json`, `about.json`) agar hanya memuat apa yang Anda butuhkan.
38
+ - **Minimalkan payload klien**
39
+ Pada halaman, kirim hanya namespace yang diperlukan ke `NextIntlClientProvider` (misalnya, `pick(messages, ['common', 'about'])`).
40
+ - **Utamakan halaman statis**
41
+ Gunakan halaman statis sebanyak mungkin untuk kinerja dan SEO yang lebih baik.
42
+ - **I18n pada komponen server**
43
+ Komponen server, seperti halaman atau semua komponen yang tidak ditandai sebagai `client` adalah statis dan dapat di-pre-render pada waktu build. Jadi kita harus mengoper fungsi terjemahan ke mereka sebagai props.
44
+ - **Atur tipe TypeScript**
45
+ Untuk locale Anda guna memastikan keamanan tipe di seluruh aplikasi Anda.
46
+ - **Proxy untuk pengalihan**
47
+ Gunakan proxy untuk menangani deteksi locale dan routing serta mengarahkan pengguna ke URL dengan prefix locale yang sesuai.
48
+ - **Internasionalisasi metadata, sitemap, robots.txt Anda**
49
+ Internasionalisasikan metadata, sitemap, robots.txt Anda menggunakan fungsi `generateMetadata` yang disediakan oleh Next.js untuk memastikan penemuan yang lebih baik oleh mesin pencari di semua locale.
50
+ - **Lokalisaikan Tautan**
51
+ Lokalisasi Tautan menggunakan komponen `Link` untuk mengarahkan pengguna ke URL dengan prefix locale yang sesuai. Ini penting untuk memastikan penemuan halaman Anda di semua locale.
52
+ - **Otomatisasi pengujian dan terjemahan**
53
+ Otomatisasi pengujian dan terjemahan membantu menghemat waktu dalam memelihara aplikasi multibahasa Anda.
54
+
55
+ > Lihat dokumentasi kami yang mencantumkan semua yang perlu Anda ketahui tentang internasionalisasi dan SEO: [Internasionalisasi (i18n) dengan next-intl](https://github.com/aymericzip/intlayer/blob/main/docs/blog/id/internationalization_and_SEO.md).
56
+
57
+ ---
58
+
59
+ ## Panduan Langkah demi Langkah untuk Mengatur next-intl di Aplikasi Next.js
60
+
61
+ <iframe
62
+ src="https://stackblitz.com/github/aymericzip/next-intl-template?embed=1&ctl=1&file=src/i18n.ts"
63
+ className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
64
+ title="Demo CodeSandbox - Cara Menginternasionalisasi aplikasi Anda menggunakan Intlayer"
65
+ sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
66
+ loading="lazy"
67
+ />
68
+
69
+ > Lihat [Template Aplikasi](https://github.com/aymericzip/next-intl-template) di GitHub.
70
+
71
+ Berikut adalah struktur proyek yang akan kita buat:
72
+
73
+ ```bash
74
+ .
75
+ ├── global.ts
76
+ ├── locales
77
+ │ ├── en
78
+ │ │ ├── common.json
79
+ │ │ └── about.json
80
+ │ ├── fr
81
+ │ │ ├── common.json
82
+ │ │ └── about.json
83
+ │ └── es
84
+ │ ├── common.json
85
+ │ └── about.json
86
+ └── src # Src adalah opsional
87
+ ├── proxy.ts
88
+ ├── app
89
+ │ ├── i18n.ts
90
+ │ └── [locale]
91
+ │ ├── layout.tsx
92
+ │ ├── (home) # / (Grup Rute untuk tidak mencemari semua halaman dengan sumber daya home)
93
+ │ │ ├── layout.tsx
94
+ │ │ └── page.tsx
95
+ │ └── about # /about
96
+ │ ├── layout.tsx
97
+ │ └── page.tsx
98
+ └── components
99
+ ├── ClientComponent.tsx
100
+ └── ServerComponent.tsx
101
+ ```
102
+
103
+ ### Langkah 1: Pasang Dependensi
104
+
105
+ Pasang paket yang diperlukan menggunakan npm:
106
+
107
+ ```bash packageManager="npm"
108
+ npm install next-intl
109
+ ```
110
+
111
+ ```bash packageManager="pnpm"
112
+ pnpm add next-intl
113
+ ```
114
+
115
+ ```bash packageManager="yarn"
116
+ yarn add next-intl
117
+ ```
118
+
119
+ - **next-intl**: Perpustakaan internasionalisasi inti untuk Next.js App Router yang menyediakan hooks, fungsi server, dan penyedia klien untuk mengelola terjemahan.
120
+
121
+ ### Langkah 2: Konfigurasikan Proyek Anda
122
+
123
+ Buat file konfigurasi yang mendefinisikan locale yang didukung dan mengatur konfigurasi request next-intl. File ini berfungsi sebagai sumber kebenaran tunggal untuk pengaturan i18n Anda dan memastikan keamanan tipe di seluruh aplikasi Anda.
124
+
125
+ Mencentralisasi konfigurasi locale Anda mencegah inkonsistensi dan memudahkan penambahan atau penghapusan locale di masa depan. Fungsi `getRequestConfig` dijalankan pada setiap permintaan dan hanya memuat terjemahan yang dibutuhkan untuk setiap halaman, memungkinkan pemisahan kode dan mengurangi ukuran bundle.
126
+
127
+ ```tsx fileName="src/i18n.ts"
128
+ import { notFound } from "next/navigation";
129
+ import createMiddleware from "next-intl/middleware";
130
+ import { createNavigation } from "next-intl/navigation";
131
+
132
+ // Mendefinisikan locale yang didukung dengan keamanan tipe
133
+ export const locales = ["en", "fr", "es"] as const;
134
+ export type Locale = (typeof locales)[number];
135
+ export const defaultLocale: Locale = "en";
136
+
137
+ export function isRTL(locale: Locale | (string & {})) {
138
+ return /^(ar|fa|he|iw|ur|ps|sd|ug|yi|ckb|ku)(-|$)/i.test(locale);
139
+ }
140
+
141
+ // Memuat pesan secara dinamis per locale untuk memungkinkan pemisahan kode
142
+ // Promise.all memuat namespace secara paralel untuk kinerja yang lebih baik
143
+ async function loadMessages(locale: Locale) {
144
+ // Hanya memuat namespace yang dibutuhkan oleh layout/halaman Anda
145
+ const [common, home, about] = await Promise.all([
146
+ import(`../locales/${locale}/common.json`).then((m) => m.default),
147
+ import(`../locales/${locale}/home.json`).then((m) => m.default),
148
+ import(`../locales/${locale}/about.json`).then((m) => m.default),
149
+ // ... File JSON masa depan harus ditambahkan di sini
150
+ ]);
151
+
152
+ return { common, home, about } as const;
153
+ }
154
+
155
+ // Helper untuk menghasilkan URL yang dilokalkan (misalnya, /about vs /fr/about)
156
+ export function localizedPath(locale: string, path: string) {
157
+ return locale === defaultLocale ? path : `/${locale}${path}`;
158
+ }
159
+
160
+ // getRequestConfig dijalankan pada setiap permintaan dan menyediakan pesan ke komponen server
161
+ // Di sinilah next-intl terhubung ke rendering sisi server Next.js
162
+ export default async function getRequestConfig({
163
+ requestLocale,
164
+ }: {
165
+ requestLocale: Promise<string | undefined>;
166
+ }) {
167
+ const requested: Locale = ((await requestLocale) as Locale) ?? defaultLocale;
168
+
169
+ if (!locales.includes(requested)) notFound();
170
+
171
+ return {
172
+ locale: requested,
173
+ messages: await loadMessages(requested),
174
+ };
175
+ }
176
+
177
+ export function getCookie(locale: Locale) {
178
+ return [
179
+ `NEXT_LOCALE=${locale}`,
180
+ "Path=/",
181
+ `Max-Age=${60 * 60 * 24 * 365}`, // 1 tahun
182
+ "SameSite=Lax",
183
+ ].join("; ");
184
+ }
185
+
186
+ const routingOptions = {
187
+ locales,
188
+ defaultLocale,
189
+ localePrefix: "as-needed", // Ubah rute /en/... menjadi /...
190
+ // Opsional: pathnames yang dilokalkan
191
+ // pathnames: {
192
+ // '/': '/',
193
+ // '/about': {en: '/about', fr: '/a-propos', es: '/acerca-de'},
194
+ // '/blog/[slug]': '/blog/[slug]'
195
+ // }
196
+ // localeDetection: true, // mencegah pengalihan "/" -> "/en" dari cookie
197
+ } as const;
198
+
199
+ export const { Link, redirect, usePathname, useRouter, getPathname } =
200
+ createNavigation(routingOptions);
201
+
202
+ export const proxy = createMiddleware(routingOptions);
203
+ ```
204
+
205
+ ### Langkah 3: Definisikan Rute Dinamis Locale
206
+
207
+ Atur routing dinamis untuk locale dengan membuat direktori `[locale]` di folder aplikasi Anda. Ini memungkinkan Next.js untuk menangani routing berbasis locale di mana setiap locale menjadi segmen URL (misalnya, `/en/about`, `/fr/about`).
208
+
209
+ Menggunakan routing dinamis memungkinkan Next.js untuk menghasilkan halaman statis untuk semua locale saat build time, meningkatkan performa dan SEO. Komponen layout mengatur atribut HTML `lang` dan `dir` berdasarkan locale, yang sangat penting untuk aksesibilitas dan pemahaman mesin pencari.
210
+
211
+ ```tsx fileName="src/app/[locale]/layout.tsx"
212
+ import type { ReactNode } from "react";
213
+ import { locales } from "@/i18n";
214
+ import { getLocaleDirection, setRequestLocale } from "next-intl/server";
215
+
216
+ // Pra-hasilkan halaman statis untuk semua locale saat build time (SSG)
217
+ // Ini meningkatkan performa dan SEO
218
+ export function generateStaticParams() {
219
+ return locales.map((locale) => ({ locale }));
220
+ }
221
+
222
+ export default function LocaleLayout({
223
+ children,
224
+ params,
225
+ }: {
226
+ children: ReactNode;
227
+ params: Promise<{ locale: string }>;
228
+ }) {
229
+ // Dalam Next.js App Router, params adalah Promise (dapat di-await)
230
+ // Ini memungkinkan segmen rute dinamis diselesaikan secara asinkron
231
+ const { locale } = await params;
232
+
233
+ // Penting: setRequestLocale memberi tahu next-intl locale mana yang digunakan untuk permintaan ini
234
+ // Tanpa ini, getTranslations() tidak akan tahu locale mana yang digunakan di komponen server
235
+ setRequestLocale(locale);
236
+
237
+ // Dapatkan arah teks (LTR/RTL) untuk rendering HTML yang tepat
238
+ const dir = getLocaleDirection(locale);
239
+
240
+ return (
241
+ <html lang={locale} dir={dir}>
242
+ <body>{children}</body>
243
+ </html>
244
+ );
245
+ }
246
+ ```
247
+
248
+ ```tsx fileName="src/app/[locale]/about/page.tsx"
249
+ import { getTranslations, getMessages, getFormatter } from "next-intl/server";
250
+ import { NextIntlClientProvider } from "next-intl";
251
+ import pick from "lodash/pick";
252
+ import ServerComponent from "@/components/ServerComponent";
253
+ import ClientComponent from "@/components/ClientComponent";
254
+
255
+ export default async function AboutPage({
256
+ params,
257
+ }: {
258
+ params: Promise<{ locale: string }>;
259
+ }) {
260
+ const { locale } = await params;
261
+
262
+ // Pesan dimuat di sisi server. Kirim hanya yang dibutuhkan ke klien.
263
+ // Ini meminimalkan bundle JavaScript yang dikirim ke browser
264
+ const messages = await getMessages();
265
+ const clientMessages = pick(messages, ["common", "about"]);
266
+
267
+ // Terjemahan/formatting yang hanya dijalankan di sisi server
268
+ // Ini dijalankan di server dan dapat diteruskan sebagai props ke komponen
269
+ const tAbout = await getTranslations("about");
270
+ const tCounter = await getTranslations("about.counter");
271
+ const format = await getFormatter();
272
+
273
+ const initialFormattedCount = format.number(0);
274
+
275
+ return (
276
+ // NextIntlClientProvider membuat terjemahan tersedia untuk komponen klien
277
+ // Hanya teruskan namespace yang benar-benar digunakan oleh komponen klien Anda
278
+ <NextIntlClientProvider locale={locale} messages={clientMessages}>
279
+ <main>
280
+ <h1>{tAbout("title")}</h1>
281
+ <ClientComponent />
282
+ <ServerComponent
283
+ formattedCount={initialFormattedCount}
284
+ label={tCounter("label")}
285
+ increment={tCounter("increment")}
286
+ />
287
+ </main>
288
+ </NextIntlClientProvider>
289
+ );
290
+ }
291
+ ```
292
+
293
+ ### Langkah 4: Buat File Terjemahan Anda
294
+
295
+ Buat file JSON untuk setiap locale dan namespace. Struktur ini memungkinkan Anda mengatur terjemahan secara logis dan memuat hanya yang Anda butuhkan untuk setiap halaman.
296
+
297
+ Mengorganisir terjemahan berdasarkan namespace (misalnya, `common.json`, `about.json`) memungkinkan pemisahan kode dan mengurangi ukuran bundle. Anda hanya memuat terjemahan yang dibutuhkan untuk setiap halaman, sehingga meningkatkan performa.
298
+
299
+ ```json fileName="locales/en/common.json"
300
+ {
301
+ "welcome": "Welcome",
302
+ "greeting": "Hello, world!"
303
+ }
304
+ ```
305
+
306
+ ```json fileName="locales/fr/common.json"
307
+ {
308
+ "welcome": "Bienvenue",
309
+ "greeting": "Bonjour le monde!"
310
+ }
311
+ ```
312
+
313
+ ```json fileName="locales/en/about.json"
314
+ {
315
+ "title": "About",
316
+ "description": "About page description",
317
+ "counter": {
318
+ "label": "Counter",
319
+ "increment": "Increment"
320
+ }
321
+ }
322
+ ```
323
+
324
+ ```json fileName="locales/fr/about.json"
325
+ {
326
+ "title": "À propos",
327
+ "description": "Description de la page À propos",
328
+ "counter": {
329
+ "label": "Compteur",
330
+ "increment": "Incrémenter"
331
+ }
332
+ }
333
+ ```
334
+
335
+ ### Langkah 5: Gunakan Terjemahan di Halaman Anda
336
+
337
+ Buat komponen halaman yang memuat terjemahan di server dan meneruskannya ke komponen server dan klien. Ini memastikan terjemahan dimuat sebelum rendering dan mencegah konten berkedip.
338
+
339
+ Memuat terjemahan di sisi server meningkatkan SEO dan mencegah FOUC (Flash of Untranslated Content). Dengan menggunakan `pick` untuk mengirim hanya namespace yang diperlukan ke penyedia klien, kita meminimalkan bundle JavaScript yang dikirim ke browser.
340
+
341
+ ```tsx fileName="src/app/[locale]/about/page.tsx"
342
+ import { getTranslations, getMessages, getFormatter } from "next-intl/server";
343
+ import { NextIntlClientProvider } from "next-intl";
344
+ import pick from "lodash/pick";
345
+ import ServerComponent from "@/components/ServerComponent";
346
+ import ClientComponent from "@/components/ClientComponent";
347
+
348
+ export default async function AboutPage({
349
+ params,
350
+ }: {
351
+ params: Promise<{ locale: string }>;
352
+ }) {
353
+ const { locale } = await params;
354
+
355
+ // Pesan dimuat di sisi server. Kirim hanya yang diperlukan ke klien.
356
+ // Ini meminimalkan bundle JavaScript yang dikirim ke browser
357
+ const messages = await getMessages();
358
+ const clientMessages = pick(messages, ["common", "about"]);
359
+
360
+ // Terjemahan/formatting yang benar-benar di sisi server
361
+ // Ini dijalankan di server dan dapat diteruskan sebagai props ke komponen
362
+ const tAbout = await getTranslations("about");
363
+ const tCounter = await getTranslations("about.counter");
364
+ const format = await getFormatter();
365
+
366
+ const initialFormattedCount = format.number(0);
367
+
368
+ return (
369
+ // NextIntlClientProvider membuat terjemahan tersedia untuk komponen klien
370
+ // Hanya kirim namespace yang benar-benar digunakan oleh komponen klien Anda
371
+ <NextIntlClientProvider locale={locale} messages={clientMessages}>
372
+ <main>
373
+ <h1>{tAbout("title")}</h1>
374
+ <ClientComponent />
375
+ <ServerComponent
376
+ formattedCount={initialFormattedCount}
377
+ label={tCounter("label")}
378
+ increment={tCounter("increment")}
379
+ />
380
+ </main>
381
+ </NextIntlClientProvider>
382
+ );
383
+ }
384
+ ```
385
+
386
+ ### Langkah 6: Gunakan Terjemahan di Komponen Klien
387
+
388
+ Komponen klien dapat menggunakan hook `useTranslations` dan `useFormatter` untuk mengakses terjemahan dan fungsi pemformatan. Hook ini membaca dari konteks `NextIntlClientProvider`.
389
+
390
+ Komponen klien memerlukan hook React untuk mengakses terjemahan. Hook `useTranslations` dan `useFormatter` terintegrasi dengan mulus dengan next-intl dan menyediakan pembaruan reaktif saat locale berubah.
391
+
392
+ > Jangan lupa untuk menambahkan namespace yang diperlukan ke pesan klien halaman (hanya sertakan namespace yang benar-benar dibutuhkan oleh komponen klien Anda).
393
+
394
+ ```tsx fileName="src/components/ClientComponent.tsx"
395
+ "use client";
396
+
397
+ import React, { useState } from "react";
398
+ import { useTranslations, useFormatter } from "next-intl";
399
+
400
+ const ClientComponent = () => {
401
+ // Scope langsung ke objek bersarang
402
+ // useTranslations/useFormatter adalah hook yang membaca dari konteks NextIntlClientProvider
403
+ // Mereka hanya berfungsi jika komponen dibungkus dalam NextIntlClientProvider
404
+ const t = useTranslations("about.counter");
405
+ const format = useFormatter();
406
+ const [count, setCount] = useState(0);
407
+
408
+ return (
409
+ <div>
410
+ <p>{format.number(count)}</p>
411
+ <button
412
+ aria-label={t("label")}
413
+ onClick={() => setCount((count) => count + 1)}
414
+ >
415
+ {t("increment")}
416
+ </button>
417
+ </div>
418
+ );
419
+ };
420
+ ```
421
+
422
+ ### Langkah 7: Menggunakan Terjemahan di Komponen Server
423
+
424
+ Komponen server tidak dapat menggunakan React hooks, sehingga mereka menerima terjemahan dan formatter melalui props dari komponen induknya. Pendekatan ini menjaga komponen server tetap sinkron dan memungkinkan mereka untuk disisipkan di dalam komponen klien.
425
+
426
+ Komponen server yang mungkin disisipkan di bawah batasan klien harus bersifat sinkron. Dengan meneruskan string yang sudah diterjemahkan dan nilai yang sudah diformat sebagai props, kita menghindari operasi async dan memastikan rendering yang tepat. Pre-komputasi terjemahan dan format di komponen halaman induk.
427
+
428
+ ```tsx fileName="src/components/ServerComponent.tsx"
429
+ // Komponen server yang disisipkan di dalam komponen klien harus bersifat sinkron
430
+ // React tidak dapat menyerialisasi fungsi async melintasi batas server/klien
431
+ // Solusi: pre-komputasi terjemahan/format di induk dan teruskan sebagai props
432
+ type ServerComponentProps = {
433
+ formattedCount: string;
434
+ label: string;
435
+ increment: string;
436
+ };
437
+
438
+ const ServerComponent = ({
439
+ formattedCount,
440
+ label,
441
+ increment,
442
+ }: ServerComponentProps) => {
443
+ return (
444
+ <div>
445
+ <p>{formattedCount}</p>
446
+ <button aria-label={label}>{increment}</button>
447
+ </div>
448
+ );
449
+ };
450
+ ```
451
+
452
+ > Di halaman/layout Anda, gunakan `getTranslations` dan `getFormatter` dari `next-intl/server` untuk menghitung terjemahan dan format terlebih dahulu, lalu teruskan sebagai props ke komponen server.
453
+
454
+ ---
455
+
456
+ ### (Opsional) Langkah 8: Ubah bahasa konten Anda
457
+
458
+ Untuk mengubah bahasa konten Anda dengan next-intl, render tautan yang mengenali locale yang mengarah ke pathname yang sama sambil mengganti locale. Provider akan menulis ulang URL secara otomatis, jadi Anda hanya perlu menargetkan rute saat ini.
459
+
460
+ ```tsx fileName="src/components/LocaleSwitcher.tsx"
461
+ "use client";
462
+
463
+ import Link from "next/link";
464
+ import { usePathname } from "next/navigation";
465
+ import { useLocale } from "next-intl";
466
+ import { defaultLocale, getCookie, type Locale, locales } from "@/i18n";
467
+
468
+ const getLocaleLabel = (locale: Locale): string => {
469
+ try {
470
+ const displayNames = new Intl.DisplayNames([locale], { type: "language" });
471
+ return displayNames.of(locale) ?? locale.toUpperCase();
472
+ } catch {
473
+ return locale.toUpperCase();
474
+ }
475
+ };
476
+
477
+ const localeFlags: Record<Locale, string> = {
478
+ en: "🇬🇧",
479
+ fr: "🇫🇷",
480
+ es: "🇪🇸",
481
+ };
482
+
483
+ export default function LocaleSwitcher() {
484
+ const activeLocale = useLocale();
485
+ const pathname = usePathname();
486
+
487
+ // Hapus prefix locale dari pathname untuk mendapatkan path dasar
488
+ const getBasePath = (path: string) => {
489
+ for (const locale of locales) {
490
+ if (path.startsWith(`/${locale}`)) {
491
+ return path.slice(locale.length + 1) || "/";
492
+ }
493
+ }
494
+ return path;
495
+ };
496
+
497
+ const basePath = getBasePath(pathname);
498
+
499
+ return (
500
+ <nav aria-label="Pemilih bahasa">
501
+ <div>
502
+ {(locales as readonly Locale[]).map((locale) => {
503
+ const isActive = locale === activeLocale;
504
+ // Bangun href berdasarkan apakah ini locale default
505
+ const href =
506
+ locale === defaultLocale ? basePath : `/${locale}${basePath}`;
507
+ return (
508
+ <Link
509
+ key={locale}
510
+ href={href}
511
+ aria-current={isActive ? "page" : undefined}
512
+ onClick={() => {
513
+ document.cookie = getCookie(locale);
514
+ }}
515
+ >
516
+ <span>{localeFlags[locale]}</span>
517
+ <span>{getLocaleLabel(locale)}</span>
518
+ <span>{locale.toUpperCase()}</span>
519
+ </Link>
520
+ );
521
+ })}
522
+ </div>
523
+ </nav>
524
+ );
525
+ }
526
+ ```
527
+
528
+ ### (Opsional) Langkah 9: Gunakan komponen Link yang sudah dilokalisasi
529
+
530
+ `next-intl` menyediakan subpaket `next-intl/navigation` yang berisi komponen link yang sudah dilokalisasi dan secara otomatis menerapkan locale aktif. Kami sudah mengekstraknya untuk Anda di file `@/i18n`, jadi Anda bisa menggunakannya seperti ini:
531
+
532
+ ```tsx fileName="src/components/MyComponent.tsx"
533
+ import { Link } from "@/i18n";
534
+
535
+ return <Link href="/about">t("about.title")</Link>;
536
+ ```
537
+
538
+ ### (Opsional) Langkah 10: Akses locale aktif di dalam Server Actions
539
+
540
+ Server Actions dapat membaca locale saat ini menggunakan `next-intl/server`. Ini berguna untuk mengirim email yang sudah dilokalisasi atau menyimpan preferensi bahasa bersamaan dengan data yang dikirimkan.
541
+
542
+ ```ts fileName="src/app/actions/get-current-locale.ts"
543
+ "use server";
544
+
545
+ import { getLocale } from "next-intl/server";
546
+
547
+ export async function getCurrentLocale() {
548
+ return getLocale();
549
+ }
550
+
551
+ export async function handleContactForm(formData: FormData) {
552
+ const locale = await getCurrentLocale();
553
+
554
+ // Gunakan locale untuk memilih template, label analitik, dll.
555
+ console.log(`Menerima formulir kontak dari locale ${locale}`);
556
+ }
557
+ ```
558
+
559
+ > `getLocale` membaca locale yang diatur oleh proxy `next-intl`, sehingga berfungsi di mana saja di server: Route Handlers, Server Actions, dan edge functions.
560
+
561
+ ### (Opsional) Langkah 11: Internasionalisasi Metadata Anda
562
+
563
+ Menerjemahkan konten itu penting, tetapi tujuan utama internasionalisasi adalah membuat situs web Anda lebih terlihat oleh dunia. I18n adalah tuas luar biasa untuk meningkatkan visibilitas situs web Anda melalui SEO yang tepat.
564
+
565
+ Metadata yang diinternasionalkan dengan benar membantu mesin pencari memahami bahasa apa saja yang tersedia di halaman Anda. Ini termasuk pengaturan tag meta hreflang, menerjemahkan judul dan deskripsi, serta memastikan URL kanonis diatur dengan benar untuk setiap locale.
566
+
567
+ ```tsx fileName="src/app/[locale]/about/layout.tsx"
568
+ import type { Metadata } from "next";
569
+ import { locales, defaultLocale, localizedPath } from "@/i18n";
570
+ import { getTranslations } from "next-intl/server";
571
+
572
+ // generateMetadata berjalan untuk setiap locale, menghasilkan metadata yang ramah SEO
573
+ // Ini membantu mesin pencari memahami versi bahasa alternatif
574
+ export async function generateMetadata({
575
+ params,
576
+ }: {
577
+ params: { locale: string };
578
+ }): Promise<Metadata> {
579
+ const { locale } = params;
580
+ const t = await getTranslations({ locale, namespace: "about" });
581
+
582
+ const url = "/about";
583
+ const languages = Object.fromEntries(
584
+ locales.map((locale) => [locale, localizedPath(locale, url)])
585
+ );
586
+
587
+ return {
588
+ title: t("title"),
589
+ description: t("description"),
590
+ alternates: {
591
+ canonical: localizedPath(locale, url),
592
+ languages: { ...languages, "x-default": url },
593
+ },
594
+ };
595
+ }
596
+
597
+ // ... Sisa kode halaman
598
+ ```
599
+
600
+ ### (Opsional) Langkah 12: Internasionalisasi Sitemap Anda
601
+
602
+ Buat sitemap yang mencakup semua versi lokal dari halaman Anda. Ini membantu mesin pencari menemukan dan mengindeks semua versi bahasa dari konten Anda.
603
+
604
+ Sitemap yang diinternasionalkan dengan benar memastikan mesin pencari dapat menemukan dan mengindeks semua versi bahasa dari halaman Anda. Ini meningkatkan visibilitas dalam hasil pencarian internasional.
605
+
606
+ ```tsx fileName="src/app/sitemap.ts"
607
+ import type { MetadataRoute } from "next";
608
+ import { defaultLocale, locales } from "@/i18n";
609
+
610
+ const origin = "https://example.com";
611
+
612
+ const formatterLocalizedPath = (locale: string, path: string) =>
613
+ locale === defaultLocale ? `${origin}${path}` : `${origin}/${locale}${path}`;
614
+
615
+ /**
616
+ * Dapatkan peta semua locale dan path lokalnya
617
+ *
618
+ * Contoh output:
619
+ * {
620
+ * "en": "https://example.com",
621
+ * "fr": "https://example.com/fr",
622
+ * "es": "https://example.com/es",
623
+ * "x-default": "https://example.com"
624
+ * }
625
+ */
626
+ const getLocalizedMap = (path: string) =>
627
+ Object.fromEntries([
628
+ ...locales.map((locale) => [locale, formatterLocalizedPath(locale, path)]),
629
+ ["x-default", formatterLocalizedPath(defaultLocale, path)],
630
+ ]);
631
+
632
+ // Menghasilkan sitemap dengan semua varian locale untuk SEO yang lebih baik
633
+ // Field alternates memberi tahu mesin pencari tentang versi bahasa
634
+ export default function sitemap(): MetadataRoute.Sitemap {
635
+ return [
636
+ {
637
+ url: formatterLocalizedPath(defaultLocale, "/"),
638
+ lastModified: new Date(),
639
+ changeFrequency: "monthly",
640
+ priority: 1.0,
641
+ alternates: { languages: getLocalizedMap("/") },
642
+ },
643
+ {
644
+ url: formatterLocalizedPath(defaultLocale, "/about"),
645
+ lastModified: new Date(),
646
+ changeFrequency: "monthly",
647
+ priority: 0.7,
648
+ alternates: { languages: getLocalizedMap("/about") },
649
+ },
650
+ ];
651
+ }
652
+ ```
653
+
654
+ ### (Opsional) Langkah 13: Internasionalisasi robots.txt Anda
655
+
656
+ Buat file robots.txt yang menangani dengan benar semua versi locale dari rute yang dilindungi. Ini memastikan mesin pencari tidak mengindeks halaman admin atau dashboard dalam bahasa apa pun.
657
+
658
+ Mengonfigurasi robots.txt dengan benar untuk semua locale mencegah mesin pencari mengindeks halaman sensitif ketika rute Anda berbeda untuk setiap locale.
659
+
660
+ ```tsx fileName="src/app/robots.ts"
661
+ import type { MetadataRoute } from "next";
662
+ import { locales, defaultLocale } from "@/i18n";
663
+
664
+ const origin = "https://example.com";
665
+ // Menghasilkan path untuk semua locale (misalnya, /admin, /fr/admin, /es/admin)
666
+ const withAllLocales = (path: string) => [
667
+ path,
668
+ ...locales
669
+ .filter((locale) => locale !== defaultLocale)
670
+ .map((locale) => "/" + locale + path),
671
+ ];
672
+
673
+ export default function robots(): MetadataRoute.Robots {
674
+ const disallow = [
675
+ ...withAllLocales("/dashboard"),
676
+ ...withAllLocales("/admin"),
677
+ ];
678
+
679
+ return {
680
+ rules: { userAgent: "*", allow: ["/"], disallow },
681
+ host: origin,
682
+ sitemap: origin + "/sitemap.xml",
683
+ };
684
+ }
685
+ ```
686
+
687
+ ### (Opsional) Langkah 14: Mengatur Proxy untuk Routing Locale
688
+
689
+ Buat proxy untuk secara otomatis mendeteksi locale yang dipilih pengguna dan mengarahkan mereka ke URL dengan prefix locale yang sesuai. next-intl menyediakan fungsi proxy yang nyaman yang menangani ini secara otomatis.
690
+
691
+ Proxy memastikan bahwa pengguna secara otomatis diarahkan ke bahasa pilihan mereka saat mengunjungi situs Anda. Ini juga menyimpan preferensi pengguna untuk kunjungan berikutnya, meningkatkan pengalaman pengguna.
692
+
693
+ ```ts fileName="src/proxy.ts"
694
+ import { proxy } from "@/i18n";
695
+
696
+ // Middleware berjalan sebelum rute, menangani deteksi locale dan routing
697
+ // localeDetection: true menggunakan header Accept-Language untuk mendeteksi locale secara otomatis
698
+ export default proxy;
699
+
700
+ export const config = {
701
+ // Lewati API, internal Next, dan aset statis
702
+ // Regex: mencocokkan semua rute kecuali yang dimulai dengan api, _next, atau yang mengandung titik (file)
703
+ matcher: ["/((?!api|_next|.*\\..*).*)"],
704
+ };
705
+ ```
706
+
707
+ ### (Opsional) Langkah 15: Atur Tipe TypeScript untuk Locale
708
+
709
+ Mengatur TypeScript akan membantu Anda mendapatkan autocompletion dan keamanan tipe untuk kunci Anda.
710
+
711
+ Untuk itu, Anda dapat membuat file global.ts di root proyek Anda dan menambahkan kode berikut:
712
+
713
+ ```ts fileName="global.ts"
714
+ import type { locales } from "@/i18n";
715
+
716
+ type Messages = {
717
+ common: typeof import("./locales/en/common.json");
718
+ home: typeof import("./locales/en/home.json");
719
+ about: typeof import("./locales/en/about.json");
720
+ // ... File JSON masa depan juga harus ditambahkan di sini
721
+ };
722
+
723
+ declare module "next-intl" {
724
+ interface AppConfig {
725
+ Locale: (typeof locales)[number];
726
+ Messages: Messages;
727
+ }
728
+ }
729
+ ```
730
+
731
+ Kode ini akan menggunakan Module Augmentation untuk menambahkan locales dan messages ke tipe AppConfig dari next-intl.
732
+
733
+ ### (Opsional) Langkah 15: Otomatiskan Terjemahan Anda Menggunakan Intlayer
734
+
735
+ Intlayer adalah perpustakaan **gratis** dan **open-source** yang dirancang untuk membantu proses lokalisasi dalam aplikasi Anda. Sementara next-intl menangani pemuatan dan pengelolaan terjemahan, Intlayer membantu mengotomatisasi alur kerja terjemahan.
736
+
737
+ Mengelola terjemahan secara manual bisa memakan waktu dan rentan kesalahan. Intlayer mengotomatisasi pengujian, pembuatan, dan pengelolaan terjemahan, menghemat waktu Anda dan memastikan konsistensi di seluruh aplikasi Anda.
738
+
739
+ Intlayer memungkinkan Anda untuk:
740
+
741
+ - **Mendeklarasikan konten Anda di mana pun Anda inginkan dalam codebase Anda**
742
+ Intlayer memungkinkan Anda mendeklarasikan konten di mana pun Anda inginkan dalam codebase menggunakan file `.content.{ts|js|json}`. Ini akan memungkinkan organisasi konten yang lebih baik, memastikan keterbacaan dan pemeliharaan codebase yang lebih baik.
743
+
744
+ - **Mengujikan terjemahan yang hilang**
745
+ Intlayer menyediakan fungsi pengujian yang dapat diintegrasikan ke dalam pipeline CI/CD Anda, atau dalam unit test Anda. Pelajari lebih lanjut tentang [mengujikan terjemahan Anda](https://github.com/aymericzip/intlayer/blob/main/docs/docs/id/testing.md).
746
+
747
+ - **Otomatisasi terjemahan Anda**,
748
+ Intlayer menyediakan CLI dan ekstensi VSCode untuk mengotomatisasi terjemahan Anda. Ini dapat diintegrasikan ke dalam pipeline CI/CD Anda. Pelajari lebih lanjut tentang [mengotomatisasi terjemahan Anda](https://github.com/aymericzip/intlayer/blob/main/docs/docs/id/intlayer_cli.md).
749
+ Anda dapat menggunakan **API key Anda sendiri, dan penyedia AI pilihan Anda**. Ini juga menyediakan terjemahan yang sadar konteks, lihat [mengisi konten](https://github.com/aymericzip/intlayer/blob/main/docs/docs/id/autoFill.md).
750
+
751
+ - **Menghubungkan konten eksternal**
752
+ Intlayer memungkinkan Anda menghubungkan konten Anda ke sistem manajemen konten (CMS) eksternal. Untuk mengambilnya dengan cara yang dioptimalkan dan memasukkannya ke dalam sumber daya JSON Anda. Pelajari lebih lanjut tentang [mengambil konten eksternal](https://github.com/aymericzip/intlayer/blob/main/docs/docs/id/dictionary/function_fetching.md).
753
+
754
+ - **Editor visual**
755
+ Intlayer menawarkan editor visual gratis untuk mengedit konten Anda menggunakan editor visual. Pelajari lebih lanjut tentang [mengedit terjemahan Anda secara visual](https://github.com/aymericzip/intlayer/blob/main/docs/docs/id/intlayer_visual_editor.md).
756
+
757
+ Dan masih banyak lagi. Untuk menemukan semua fitur yang disediakan oleh Intlayer, silakan merujuk ke [Dokumentasi Manfaat Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/id/interest_of_intlayer.md).