@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,362 @@
1
+ ---
2
+ createdAt: 2025-09-28
3
+ updatedAt: 2025-09-28
4
+ title: SEO và i18n trong Next.js
5
+ description: Tìm hiểu cách thiết lập SEO đa ngôn ngữ trong ứng dụng Next.js của bạn bằng cách sử dụng next-intl, next-i18next và Intlayer.
6
+ keywords:
7
+ - Intlayer
8
+ - SEO
9
+ - Quốc tế hóa
10
+ - Next.js
11
+ - i18n
12
+ - JavaScript
13
+ - React
14
+ - next-intl
15
+ - next-i18next
16
+ slugs:
17
+ - blog
18
+ - blog-seo-i18n-nextjs
19
+ ---
20
+
21
+ # SEO và i18n trong Next.js: Dịch thuật không thôi là chưa đủ
22
+
23
+ Khi các nhà phát triển nghĩ về quốc tế hóa (i18n), phản xạ đầu tiên thường là: _dịch nội dung_. Nhưng mọi người thường quên rằng mục tiêu chính của quốc tế hóa là làm cho trang web của bạn trở nên dễ nhìn thấy hơn với thế giới.
24
+ Nếu ứng dụng Next.js đa ngôn ngữ của bạn không cho các công cụ tìm kiếm biết cách thu thập dữ liệu và hiểu các phiên bản ngôn ngữ khác nhau, hầu hết nỗ lực của bạn có thể sẽ bị bỏ qua.
25
+
26
+ Trong bài blog này, chúng ta sẽ khám phá **tại sao i18n là một siêu năng lực SEO** và cách triển khai đúng trong Next.js với `next-intl`, `next-i18next`, và `Intlayer`.
27
+
28
+ ---
29
+
30
+ ## Tại sao SEO và i18n
31
+
32
+ Thêm ngôn ngữ không chỉ là về trải nghiệm người dùng (UX). Nó còn là một đòn bẩy mạnh mẽ cho **tầm nhìn hữu cơ**. Đây là lý do:
33
+
34
+ 1. **Khả năng khám phá tốt hơn:** Các công cụ tìm kiếm lập chỉ mục các phiên bản địa phương hóa và xếp hạng chúng cho người dùng tìm kiếm bằng ngôn ngữ mẹ đẻ của họ.
35
+ 2. **Tránh nội dung trùng lặp:** Các thẻ canonical và alternate đúng cách giúp trình thu thập dữ liệu biết trang nào thuộc ngôn ngữ nào.
36
+ 3. **Trải nghiệm người dùng tốt hơn:** Khách truy cập sẽ được đưa đến đúng phiên bản của trang web ngay lập tức.
37
+ 4. **Lợi thế cạnh tranh:** Ít trang web triển khai SEO đa ngôn ngữ tốt, điều này có nghĩa là bạn có thể nổi bật hơn.
38
+
39
+ ---
40
+
41
+ ## Các thực hành tốt nhất cho SEO đa ngôn ngữ trong Next.js
42
+
43
+ Dưới đây là danh sách kiểm tra mà mọi ứng dụng đa ngôn ngữ nên thực hiện:
44
+
45
+ - **Đặt thẻ meta `hreflang` trong `<head>`**
46
+ Giúp Google hiểu các phiên bản tồn tại cho mỗi ngôn ngữ.
47
+
48
+ - **Liệt kê tất cả các trang đã dịch trong `sitemap.xml`**
49
+ Sử dụng schema `xhtml` để các trình thu thập dữ liệu dễ dàng tìm thấy các phiên bản thay thế.
50
+
51
+ - **Loại trừ các tuyến đường riêng tư/địa phương hóa trong `robots.txt`**
52
+ Ví dụ: không cho phép `/dashboard`, `/fr/dashboard`, `/es/dashboard` được lập chỉ mục.
53
+
54
+ - **Sử dụng các liên kết địa phương hóa**
55
+ Ví dụ: `<a href="/fr/about">À propos</a>` thay vì liên kết đến trang mặc định `/about`.
56
+
57
+ Đây là những bước đơn giản — nhưng bỏ qua chúng có thể khiến bạn mất đi khả năng hiển thị.
58
+
59
+ ---
60
+
61
+ ## Ví dụ về triển khai
62
+
63
+ Các nhà phát triển thường quên tham chiếu đúng các trang của họ qua các ngôn ngữ, vì vậy hãy cùng xem cách điều này hoạt động trong thực tế với các thư viện khác nhau.
64
+
65
+ ### **next-intl**
66
+
67
+ <Tabs>
68
+ <TabItem label="next-intl">
69
+
70
+ ```tsx fileName="src/app/[locale]/about/layout.tsx
71
+ import type { Metadata } from "next";
72
+ import { locales, defaultLocale } from "@/i18n";
73
+ import { getTranslations, unstable_setRequestLocale } from "next-intl/server";
74
+
75
+ // Hàm tạo đường dẫn có địa phương hóa
76
+ function localizedPath(locale: string, path: string) {
77
+ return locale === defaultLocale ? path : `/${locale}${path}`;
78
+ }
79
+
80
+ export async function generateMetadata({
81
+ params,
82
+ }: {
83
+ params: { locale: string };
84
+ }): Promise<Metadata> {
85
+ const { locale } = params;
86
+ const t = await getTranslations({ locale, namespace: "about" });
87
+
88
+ const url = "/about";
89
+ const languages = Object.fromEntries(
90
+ locales.map((l) => [l, localizedPath(l, url)])
91
+ );
92
+
93
+ return {
94
+ title: t("title"),
95
+ description: t("description"),
96
+ alternates: {
97
+ canonical: localizedPath(locale, url),
98
+ languages: { ...languages, "x-default": url },
99
+ },
100
+ };
101
+ }
102
+
103
+ // ... Phần còn lại của mã trang
104
+ ```
105
+
106
+ ```tsx fileName="src/app/sitemap.ts"
107
+ import type { MetadataRoute } from "next";
108
+ import { locales, defaultLocale } from "@/i18n";
109
+
110
+ const origin = "https://example.com";
111
+
112
+ const formatterLocalizedPath = (locale: string, path: string) =>
113
+ locale === defaultLocale ? `${origin}${path}` : `${origin}/${locale}${path}`;
114
+
115
+ export default function sitemap(): MetadataRoute.Sitemap {
116
+ const aboutLanguages = Object.fromEntries(
117
+ locales.map((l) => [l, formatterLocalizedPath(l, "/about")])
118
+ );
119
+
120
+ return [
121
+ {
122
+ url: formatterLocalizedPath(defaultLocale, "/about"),
123
+ lastModified: new Date(),
124
+ changeFrequency: "monthly",
125
+ priority: 0.7,
126
+ alternates: { languages: aboutLanguages },
127
+ },
128
+ ];
129
+ }
130
+ ```
131
+
132
+ ```tsx fileName="src/app/robots.ts"
133
+ import type { MetadataRoute } from "next";
134
+ import { locales, defaultLocale } from "@/i18n";
135
+
136
+ const origin = "https://example.com";
137
+ const withAllLocales = (path: string) => [
138
+ path,
139
+ ...locales.filter((l) => l !== defaultLocale).map((l) => `/${l}${path}`),
140
+ ];
141
+
142
+ export default function robots(): MetadataRoute.Robots {
143
+ const disallow = [
144
+ ...withAllLocales("/dashboard"),
145
+ ...withAllLocales("/admin"),
146
+ ];
147
+
148
+ return {
149
+ rules: { userAgent: "*", allow: ["/"], disallow },
150
+ host: origin,
151
+ sitemap: `${origin}/sitemap.xml`,
152
+ };
153
+ }
154
+ ```
155
+
156
+ ### **next-i18next**
157
+
158
+ </TabItem>
159
+ <TabItem label="next-i18next">
160
+
161
+ ```ts fileName="i18n.config.ts"
162
+ export const locales = ["en", "fr"] as const;
163
+ export type Locale = (typeof locales)[number];
164
+ export const defaultLocale: Locale = "en";
165
+
166
+ /** Tiền tố đường dẫn với locale trừ khi đó là locale mặc định */
167
+ export function localizedPath(locale: string, path: string) {
168
+ return locale === defaultLocale ? path : `/${locale}${path}`;
169
+ }
170
+
171
+ /** Trợ giúp URL tuyệt đối */
172
+ const ORIGIN = "https://example.com";
173
+ export function abs(locale: string, path: string) {
174
+ return `${ORIGIN}${localizedPath(locale, path)}`;
175
+ }
176
+ ```
177
+
178
+ ```tsx fileName="src/app/[locale]/about/layout.tsx"
179
+ import type { Metadata } from "next";
180
+ import { locales, defaultLocale, localizedPath } from "@/i18n.config";
181
+
182
+ export async function generateMetadata({
183
+ params,
184
+ }: {
185
+ params: { locale: string };
186
+ }): Promise<Metadata> {
187
+ const { locale } = params;
188
+
189
+ // Nhập động file JSON tương ứng
190
+ const messages = (await import(`@/../public/locales/${locale}/about.json`))
191
+ .default;
192
+
193
+ const languages = Object.fromEntries(
194
+ locales.map((l) => [l, localizedPath(l, "/about")])
195
+ );
196
+
197
+ return {
198
+ title: messages.title,
199
+ description: messages.description,
200
+ alternates: {
201
+ canonical: localizedPath(locale, "/about"),
202
+ languages: { ...languages, "x-default": "/about" },
203
+ },
204
+ };
205
+ }
206
+
207
+ export default async function AboutPage() {
208
+ return <h1>About</h1>;
209
+ }
210
+ ```
211
+
212
+ ```ts fileName="src/app/sitemap.ts"
213
+ import type { MetadataRoute } from "next";
214
+ import { locales, defaultLocale, abs } from "@/i18n.config";
215
+
216
+ export default function sitemap(): MetadataRoute.Sitemap {
217
+ const languages = Object.fromEntries(
218
+ locales.map((l) => [l, abs(l, "/about")])
219
+ );
220
+ return [
221
+ {
222
+ url: abs(defaultLocale, "/about"),
223
+ lastModified: new Date(),
224
+ changeFrequency: "monthly",
225
+ priority: 0.7,
226
+ alternates: { languages },
227
+ },
228
+ ];
229
+ }
230
+ ```
231
+
232
+ ```ts fileName="src/app/robots.ts"
233
+ import type { MetadataRoute } from "next";
234
+ import { locales, defaultLocale, localizedPath } from "@/i18n.config";
235
+
236
+ const ORIGIN = "https://example.com";
237
+
238
+ const expandAllLocales = (path: string) => [
239
+ localizedPath(defaultLocale, path),
240
+ ...locales
241
+
242
+ .filter((l) => l !== defaultLocale)
243
+ .map((l) => localizedPath(l, path)),
244
+ ];
245
+
246
+ export default function robots(): MetadataRoute.Robots {
247
+ const disallow = [
248
+ ...expandAllLocales("/dashboard"),
249
+ ...expandAllLocales("/admin"),
250
+ ];
251
+
252
+ return {
253
+ rules: { userAgent: "*", allow: ["/"], disallow },
254
+ host: ORIGIN,
255
+ sitemap: `${ORIGIN}/sitemap.xml`,
256
+ };
257
+ }
258
+ ```
259
+
260
+ ### **Intlayer**
261
+
262
+ </TabItem>
263
+ <TabItem label="intlayer">
264
+
265
+ ````typescript fileName="src/app/[locale]/about/layout.tsx"
266
+ import { getIntlayer, getMultilingualUrls } from "intlayer";
267
+ import type { Metadata } from "next";
268
+ import type { LocalPromiseParams } from "next-intlayer";
269
+
270
+ export const generateMetadata = async ({
271
+ params,
272
+ }: LocalPromiseParams): Promise<Metadata> => {
273
+ const { locale } = await params;
274
+
275
+ const metadata = getIntlayer("page-metadata", locale);
276
+
277
+ /**
278
+ * Tạo một đối tượng chứa tất cả các url cho mỗi locale.
279
+ *
280
+ * Ví dụ:
281
+ * ```ts
282
+ * getMultilingualUrls('/about');
283
+ *
284
+ * // Trả về
285
+ * // {
286
+ * // en: '/about',
287
+ * // fr: '/fr/about',
288
+ * // es: '/es/about',
289
+ * // }
290
+ * ```
291
+ */
292
+ const multilingualUrls = getMultilingualUrls("/about");
293
+
294
+ return {
295
+ ...metadata,
296
+ alternates: {
297
+ canonical: multilingualUrls[locale as keyof typeof multilingualUrls],
298
+ languages: { ...multilingualUrls, "x-default": "/about" },
299
+ },
300
+ };
301
+ };
302
+
303
+ // ... Phần còn lại của mã trang
304
+ ````
305
+
306
+ ```tsx fileName="src/app/sitemap.ts"
307
+ import { getMultilingualUrls } from "intlayer";
308
+ import type { MetadataRoute } from "next";
309
+
310
+ const sitemap = (): MetadataRoute.Sitemap => [
311
+ {
312
+ url: "https://example.com/about",
313
+ alternates: {
314
+ languages: { ...getMultilingualUrls("https://example.com/about") },
315
+ },
316
+ },
317
+ ];
318
+ ```
319
+
320
+ ```tsx fileName="src/app/robots.ts"
321
+ import { getMultilingualUrls } from "intlayer";
322
+ import type { MetadataRoute } from "next";
323
+
324
+ const getAllMultilingualUrls = (urls: string[]) =>
325
+ urls.flatMap((url) => Object.values(getMultilingualUrls(url)) as string[]);
326
+
327
+ const robots = (): MetadataRoute.Robots => ({
328
+ rules: {
329
+ userAgent: "*",
330
+ allow: ["/"],
331
+ disallow: getAllMultilingualUrls(["/dashboard"]), // không cho phép truy cập các URL đa ngôn ngữ của /dashboard
332
+ },
333
+ host: "https://example.com",
334
+ sitemap: `https://example.com/sitemap.xml`,
335
+ });
336
+
337
+ export default robots;
338
+ ```
339
+
340
+ > Intlayer cung cấp một hàm `getMultilingualUrls` để tạo các URL đa ngôn ngữ cho sitemap của bạn.
341
+
342
+ </TabItem>
343
+ </Tabs>
344
+
345
+ ---
346
+
347
+ ## Kết luận
348
+
349
+ Việc làm i18n đúng trong Next.js không chỉ là dịch văn bản, mà còn là đảm bảo các công cụ tìm kiếm và người dùng biết chính xác phiên bản nội dung nào cần được phục vụ.
350
+ Thiết lập hreflang, sitemap và quy tắc robots chính là những gì biến các bản dịch thành giá trị SEO thực sự.
351
+
352
+ Trong khi next-intl và next-i18next cung cấp cho bạn các cách vững chắc để kết nối điều này, chúng thường yêu cầu rất nhiều thiết lập thủ công để giữ mọi thứ nhất quán giữa các locale.
353
+
354
+ Đây chính là điểm mà Intlayer thực sự nổi bật:
355
+
356
+ Nó đi kèm với các trợ giúp tích hợp sẵn như getMultilingualUrls, giúp việc tích hợp hreflang, sitemap và robots trở nên gần như không tốn công sức.
357
+
358
+ Metadata được giữ tập trung thay vì phân tán khắp các tệp JSON hoặc các tiện ích tùy chỉnh.
359
+
360
+ Nó được thiết kế dành riêng cho Next.js ngay từ đầu, giúp bạn dành ít thời gian hơn cho việc gỡ lỗi cấu hình và nhiều thời gian hơn để triển khai.
361
+
362
+ Nếu mục tiêu của bạn không chỉ là dịch thuật mà còn là mở rộng SEO đa ngôn ngữ một cách mượt mà, Intlayer mang đến cho bạn cấu hình sạch sẽ nhất và bền vững nhất cho tương lai.
@@ -0,0 +1,288 @@
1
+ ---
2
+ createdAt: 2025-09-10
3
+ updatedAt: 2025-09-10
4
+ title: Xây dựng Trợ lý Tài liệu được hỗ trợ bởi RAG (Phân đoạn, Embeddings và Tìm kiếm)
5
+ description: Xây dựng Trợ lý Tài liệu được hỗ trợ bởi RAG (Phân đoạn, Embeddings và Tìm kiếm)
6
+ keywords:
7
+ - RAG
8
+ - Tài liệu
9
+ - Trợ lý
10
+ - Phân đoạn
11
+ - Embeddings
12
+ - Tìm kiếm
13
+ slugs:
14
+ - blog
15
+ - rag-powered-documentation-assistant
16
+ ---
17
+
18
+ # Xây dựng Trợ lý Tài liệu được hỗ trợ bởi RAG (Phân đoạn, Embeddings và Tìm kiếm)
19
+
20
+ ## Những gì bạn nhận được
21
+
22
+ Tôi đã xây dựng một trợ lý tài liệu được hỗ trợ bởi RAG và đóng gói nó thành một boilerplate mà bạn có thể sử dụng ngay lập tức.
23
+
24
+ - Bao gồm một ứng dụng sẵn sàng sử dụng (Next.js + OpenAI API)
25
+ - Bao gồm một pipeline RAG hoạt động (phân đoạn, embeddings, độ tương đồng cosine)
26
+ - Cung cấp một giao diện chatbot hoàn chỉnh được xây dựng bằng React
27
+ - Tất cả các thành phần UI đều có thể chỉnh sửa hoàn toàn với Tailwind CSS
28
+ - Ghi lại mọi truy vấn của người dùng để giúp xác định tài liệu thiếu, điểm đau của người dùng và cơ hội sản phẩm
29
+
30
+ 👉 [Bản demo trực tiếp](https://intlayer.org/doc/why) 👉 [Boilerplate mã nguồn](https://github.com/aymericzip/smart_doc_RAG)
31
+
32
+ ## Giới thiệu
33
+
34
+ Nếu bạn từng bị lạc trong tài liệu, cuộn mãi để tìm một câu trả lời, bạn sẽ hiểu nó đau đầu như thế nào. Tài liệu rất hữu ích, nhưng chúng tĩnh và việc tìm kiếm thường cảm thấy vụng về.
35
+
36
+ Đó là lúc **RAG (Retrieval-Augmented Generation)** phát huy tác dụng. Thay vì bắt người dùng phải tìm kiếm trong văn bản, chúng ta có thể kết hợp **retrieval** (tìm phần phù hợp trong tài liệu) với **generation** (để một LLM giải thích một cách tự nhiên).
37
+
38
+ Trong bài viết này, tôi sẽ hướng dẫn bạn cách tôi xây dựng một chatbot tài liệu được hỗ trợ bởi RAG và cách nó không chỉ giúp người dùng tìm câu trả lời nhanh hơn mà còn cung cấp cho các nhóm sản phẩm một cách mới để hiểu các điểm đau của người dùng.
39
+
40
+ ## Tại sao sử dụng RAG cho tài liệu?
41
+
42
+ RAG đã trở thành một phương pháp phổ biến vì một lý do: đây là một trong những cách thực tế nhất để làm cho các mô hình ngôn ngữ lớn thực sự hữu ích.
43
+
44
+ Đối với tài liệu, các lợi ích rất rõ ràng:
45
+
46
+ - Câu trả lời tức thì: người dùng hỏi bằng ngôn ngữ tự nhiên và nhận được câu trả lời phù hợp.
47
+ - Ngữ cảnh tốt hơn: mô hình chỉ xem các phần tài liệu liên quan nhất, giảm thiểu ảo tưởng.
48
+ - Tìm kiếm cảm giác như con người: giống như kết hợp Algolia + FAQ + chatbot trong một.
49
+ - Vòng phản hồi: bằng cách lưu trữ các truy vấn, bạn khám phá được những gì người dùng thực sự gặp khó khăn.
50
+
51
+ Điểm cuối cùng đó rất quan trọng. Hệ thống RAG không chỉ trả lời câu hỏi, mà còn cho bạn biết người dùng đang hỏi gì. Điều đó có nghĩa là:
52
+
53
+ - Bạn phát hiện ra những thông tin còn thiếu trong tài liệu của mình.
54
+ - Bạn thấy các yêu cầu tính năng mới xuất hiện.
55
+ - Bạn nhận ra các mẫu có thể thậm chí hướng dẫn chiến lược sản phẩm.
56
+
57
+ Vì vậy, RAG không chỉ là một công cụ hỗ trợ. Nó còn là một **công cụ khám phá sản phẩm**.
58
+
59
+ ## Cách hoạt động của Pipeline RAG
60
+
61
+ ![Pipeline RAG](https://github.com/aymericzip/intlayer/blob/main/docs/assets/rag_flow.svg)
62
+
63
+ Ở mức độ tổng quan, đây là công thức tôi đã sử dụng:
64
+
65
+ 1. **Chia nhỏ tài liệu** Các file Markdown lớn được chia thành các phần nhỏ. Việc chia nhỏ cho phép cung cấp làm ngữ cảnh chỉ những phần tài liệu liên quan.
66
+ 2. **Tạo embeddings** Mỗi đoạn được chuyển thành một vector bằng cách sử dụng API embedding của OpenAI (text-embedding-3-large) hoặc một cơ sở dữ liệu vector (Chroma, Qdrant, Pinecone).
67
+ 3. **Lập chỉ mục & lưu trữ** Embeddings được lưu trong một file JSON đơn giản (cho bản demo của tôi), nhưng trong môi trường sản xuất, bạn có thể sẽ sử dụng một cơ sở dữ liệu vector.
68
+ 4. **Truy xuất (R trong RAG)** Truy vấn của người dùng được chuyển thành embedding, tính toán độ tương đồng cosine, và các đoạn phù hợp nhất được truy xuất.
69
+ 5. **Tăng cường + Tạo (AG trong RAG)** Những đoạn đó được chèn vào prompt cho ChatGPT, để mô hình trả lời với ngữ cảnh thực tế từ tài liệu.
70
+ 6. **Ghi lại truy vấn để phản hồi** Mỗi truy vấn của người dùng đều được lưu lại. Đây là nguồn dữ liệu quý giá để hiểu các điểm đau, tài liệu còn thiếu, hoặc cơ hội mới.
71
+
72
+ ## Bước 1: Đọc tài liệu
73
+
74
+ Bước đầu tiên rất đơn giản: tôi cần một cách để quét thư mục docs/ để lấy tất cả các file .md. Sử dụng Node.js và glob, tôi đã lấy nội dung của từng file Markdown vào bộ nhớ.
75
+
76
+ Điều này giữ cho pipeline linh hoạt: thay vì Markdown, bạn có thể lấy tài liệu từ cơ sở dữ liệu, một CMS, hoặc thậm chí một API.
77
+
78
+ ## Bước 2: Chia nhỏ tài liệu
79
+
80
+ Tại sao phải chia nhỏ? Vì các mô hình ngôn ngữ có **giới hạn ngữ cảnh**. Cung cấp cho chúng một cuốn sách tài liệu toàn bộ sẽ không hiệu quả.
81
+
82
+ Vì vậy, ý tưởng là chia văn bản thành các đoạn nhỏ có thể quản lý được (ví dụ: mỗi đoạn 500 token) với phần chồng lấn (ví dụ: 100 token). Phần chồng lấn đảm bảo tính liên tục để bạn không mất ý nghĩa ở ranh giới các đoạn.
83
+
84
+ <p align="center">
85
+ <img width="480" alt="Nguồn dữ liệu đáng tin cậy" src="https://github.com/user-attachments/assets/ee548851-7206-4cc6-821e-de8a4366c6a3" />
86
+ </p>
87
+
88
+ **Ví dụ:**
89
+
90
+ - Chunk 1 → “…thư viện cũ mà nhiều người đã quên lãng. Những kệ sách cao chót vót chứa đầy sách…”
91
+ - Chunk 2 → “…những kệ sách chứa đầy sách từ mọi thể loại có thể tưởng tượng, mỗi cuốn thì thầm những câu chuyện…”
92
+
93
+ Phần chồng lấn đảm bảo cả hai đoạn đều chứa ngữ cảnh chung, giúp việc truy xuất thông tin vẫn mạch lạc.
94
+
95
+ Sự đánh đổi này (kích thước đoạn so với phần chồng lấn) là yếu tố then chốt cho hiệu quả của RAG:
96
+
97
+ - Quá nhỏ → bạn sẽ nhận được nhiều nhiễu.
98
+ - Quá lớn → bạn làm phình to kích thước ngữ cảnh.
99
+
100
+ ## Bước 3: Tạo Embeddings
101
+
102
+ Khi tài liệu đã được chia nhỏ, chúng ta tạo ra **embeddings** — các vector đa chiều đại diện cho mỗi đoạn.
103
+
104
+ Tôi đã sử dụng mô hình text-embedding-3-large của OpenAI, nhưng bạn có thể dùng bất kỳ mô hình embedding hiện đại nào.
105
+
106
+ **Ví dụ embedding:**
107
+
108
+ ```js
109
+ [
110
+ -0.0002630692, -0.029749284, 0.010225477, -0.009224428, -0.0065269712,
111
+ -0.002665544, 0.003214777, 0.04235309, -0.033162255, -0.00080789323,
112
+ //...+1533 elements
113
+ ];
114
+ ```
115
+
116
+ Mỗi vector là một dấu vân tay toán học của văn bản, cho phép tìm kiếm tương đồng.
117
+
118
+ ## Bước 4: Lập chỉ mục & Lưu trữ Embeddings
119
+
120
+ Để tránh phải tạo lại embeddings nhiều lần, tôi đã lưu chúng trong file embeddings.json.
121
+
122
+ Trong môi trường sản xuất, bạn có thể muốn sử dụng một cơ sở dữ liệu vector như:
123
+
124
+ - Chroma
125
+ - Qdrant
126
+ - Pinecone
127
+ - FAISS, Weaviate, Milvus, v.v.
128
+
129
+ Các cơ sở dữ liệu vector xử lý việc lập chỉ mục, khả năng mở rộng và tìm kiếm nhanh. Nhưng với nguyên mẫu của tôi, một file JSON cục bộ là đủ.
130
+
131
+ ## Bước 5: Truy xuất với Cosine Similarity
132
+
133
+ Khi người dùng đặt câu hỏi:
134
+
135
+ 1. Tạo embedding cho truy vấn.
136
+ 2. So sánh nó với tất cả embeddings trong tài liệu bằng **cosine similarity**.
137
+ 3. Chỉ giữ lại N đoạn có độ tương đồng cao nhất.
138
+
139
+ Cosine similarity đo góc giữa hai vector. Một kết quả khớp hoàn hảo sẽ có điểm số **1.0**.
140
+
141
+ Bằng cách này, hệ thống tìm được các đoạn tài liệu gần nhất với truy vấn.
142
+
143
+ ## Bước 6: Tăng cường + Tạo nội dung
144
+
145
+ Giờ đến phần kỳ diệu. Chúng ta lấy các đoạn tài liệu hàng đầu và chèn chúng vào **system prompt** cho ChatGPT.
146
+
147
+ Điều đó có nghĩa là mô hình trả lời như thể những đoạn đó là một phần của cuộc trò chuyện.
148
+
149
+ Kết quả: các câu trả lời chính xác, **dựa trên tài liệu**.
150
+
151
+ ## Bước 7: Ghi lại các truy vấn của người dùng
152
+
153
+ Đây là siêu năng lực ẩn.
154
+
155
+ Mỗi câu hỏi được hỏi đều được lưu lại. Theo thời gian, bạn xây dựng một bộ dữ liệu gồm:
156
+
157
+ - Các câu hỏi thường gặp nhất (tuyệt vời cho phần FAQ)
158
+ - Các câu hỏi chưa được trả lời (tài liệu thiếu hoặc không rõ ràng)
159
+ - Các yêu cầu tính năng được ngụy trang dưới dạng câu hỏi (“Nó có tích hợp với X không?”)
160
+ - Các trường hợp sử dụng mới nổi mà bạn chưa dự tính đến
161
+
162
+ Điều này biến trợ lý RAG của bạn thành một **công cụ nghiên cứu người dùng liên tục**.
163
+
164
+ ## Chi Phí Là Bao Nhiêu?
165
+
166
+ Một phản đối phổ biến đối với RAG là chi phí. Trên thực tế, nó rẻ đến bất ngờ:
167
+
168
+ - Tạo embeddings cho khoảng ~200 tài liệu mất khoảng **5 phút** và chi phí khoảng **1–2 euro**.
169
+ - Tính năng tìm kiếm tài liệu hoàn toàn miễn phí.
170
+ - Đối với các truy vấn, chúng tôi sử dụng gpt-4o-latest mà không bật chế độ “suy nghĩ”. Trên Intlayer, chúng tôi thấy khoảng **300 truy vấn chat mỗi tháng**, và hóa đơn API OpenAI hiếm khi vượt quá **10 đô la**.
171
+
172
+ Ngoài ra, bạn có thể tính thêm chi phí lưu trữ.
173
+
174
+ ## Chi Tiết Triển Khai
175
+
176
+ Stack:
177
+
178
+ - Monorepo: pnpm workspace
179
+ - Gói tài liệu: Node.js / TypeScript / OpenAI API
180
+ - Frontend: Next.js / React / Tailwind CSS
181
+ - Backend: Node.js API route / OpenAI API
182
+
183
+ Gói `@smart-doc/docs` là một gói TypeScript xử lý việc xử lý tài liệu. Khi một tệp markdown được thêm hoặc sửa đổi, gói này bao gồm một script `build` để xây dựng lại danh sách tài liệu trong mỗi ngôn ngữ, tạo embeddings và lưu chúng vào tệp `embeddings.json`.
184
+
185
+ Đối với frontend, chúng tôi sử dụng ứng dụng Next.js cung cấp:
186
+
187
+ - Chuyển đổi Markdown sang HTML
188
+ - Thanh tìm kiếm để tìm tài liệu liên quan
189
+ - Giao diện chatbot để đặt câu hỏi về tài liệu
190
+
191
+ Để thực hiện tìm kiếm tài liệu, ứng dụng Next.js bao gồm một API route gọi một hàm trong gói `@smart-doc/docs` để lấy các đoạn tài liệu phù hợp với truy vấn. Sử dụng các đoạn này, chúng tôi có thể trả về danh sách các trang tài liệu liên quan đến tìm kiếm của người dùng.
192
+
193
+ Đối với chức năng chatbot, chúng tôi theo cùng một quy trình tìm kiếm nhưng bổ sung thêm việc chèn các đoạn tài liệu thu thập được vào prompt gửi đến ChatGPT.
194
+
195
+ Dưới đây là ví dụ về một prompt gửi đến ChatGPT:
196
+
197
+ Prompt hệ thống:
198
+
199
+ ```txt
200
+ Bạn là một trợ lý hữu ích có thể trả lời các câu hỏi về tài liệu Intlayer.
201
+
202
+ Các đoạn liên quan:
203
+
204
+ -----
205
+ docName: "getting-started"
206
+ docChunk: "1/3"
207
+ docUrl: "https://example.com/docs/en/getting-started"
208
+ ---
209
+
210
+ # Cách bắt đầu
211
+
212
+ ...
213
+
214
+ -----
215
+ docName: "another-doc"
216
+ docChunk: "1/5"
217
+ docUrl: "https://example.com/docs/en/another-doc"
218
+ ---
219
+
220
+ # Tài liệu khác
221
+
222
+ ...
223
+ ```
224
+
225
+ Truy vấn người dùng:
226
+
227
+ ```txt
228
+ Làm thế nào để bắt đầu?
229
+ ```
230
+
231
+ Chúng tôi sử dụng SSE để truyền trực tiếp phản hồi từ API route.
232
+
233
+ Như đã đề cập, chúng tôi sử dụng gpt-4-turbo mà không có chế độ "suy nghĩ". Các phản hồi có liên quan và độ trễ thấp.
234
+ Chúng tôi đã thử nghiệm với gpt-5, nhưng độ trễ quá cao (đôi khi lên đến 15 giây cho một phản hồi). Nhưng chúng tôi sẽ xem xét lại điều đó trong tương lai.
235
+
236
+ 👉 [Thử bản demo tại đây](https://intlayer.org/doc/why) 👉 [Xem mẫu mã nguồn trên GitHub](https://github.com/aymericzip/smart_doc_RAG)
237
+
238
+ ## Tiến xa hơn
239
+
240
+ Dự án này là một triển khai tối giản. Nhưng bạn có thể mở rộng nó theo nhiều cách:
241
+
242
+ - MCP server → chuyển chức năng tìm kiếm tài liệu sang một MCP server để kết nối tài liệu với bất kỳ trợ lý AI nào
243
+
244
+ - Vector DBs → mở rộng quy mô đến hàng triệu đoạn tài liệu
245
+ - LangChain / LlamaIndex → các framework sẵn sàng cho pipeline RAG
246
+ - Bảng điều khiển phân tích → trực quan hóa các truy vấn người dùng và điểm đau
247
+ - Truy xuất đa nguồn → không chỉ lấy tài liệu, mà còn các mục cơ sở dữ liệu, bài đăng blog, vé hỗ trợ, v.v.
248
+ - Cải thiện prompting → sắp xếp lại, lọc và tìm kiếm kết hợp (từ khóa + ngữ nghĩa)
249
+
250
+ ## Những Hạn Chế Chúng Tôi Gặp Phải
251
+
252
+ - Việc chia đoạn và chồng lấn là dựa trên kinh nghiệm thực nghiệm. Cân bằng đúng (kích thước đoạn, tỷ lệ chồng lấn, số đoạn được truy xuất) cần phải lặp lại và thử nghiệm.
253
+ - Embeddings không được tự động tạo lại khi tài liệu thay đổi. Hệ thống của chúng tôi chỉ đặt lại embeddings cho một file nếu số lượng đoạn khác với số đã lưu.
254
+ - Trong nguyên mẫu này, embeddings được lưu trữ dưới dạng JSON. Điều này phù hợp cho các bản demo nhưng gây ô nhiễm Git. Trong môi trường sản xuất, sử dụng cơ sở dữ liệu hoặc kho vector chuyên dụng sẽ tốt hơn.
255
+
256
+ ## Tại Sao Điều Này Quan Trọng Ngoài Tài Liệu
257
+
258
+ Phần thú vị không chỉ là chatbot. Đó là **vòng phản hồi**.
259
+
260
+ Với RAG, bạn không chỉ trả lời:
261
+
262
+ - Bạn học được điều gì làm người dùng bối rối.
263
+ - Bạn khám phá ra những tính năng họ mong đợi.
264
+ - Bạn điều chỉnh chiến lược sản phẩm dựa trên các truy vấn thực tế.
265
+
266
+ **Ví dụ:**
267
+
268
+ Hãy tưởng tượng ra mắt một tính năng mới và ngay lập tức thấy:
269
+
270
+ - 50% câu hỏi liên quan đến cùng một bước thiết lập chưa rõ ràng
271
+ - Người dùng liên tục yêu cầu một tích hợp mà bạn chưa hỗ trợ
272
+ - Mọi người tìm kiếm các thuật ngữ tiết lộ một trường hợp sử dụng mới
273
+
274
+ Đó chính là **trí tuệ sản phẩm** trực tiếp từ người dùng của bạn.
275
+
276
+ ## Kết luận
277
+
278
+ RAG là một trong những cách đơn giản nhất và mạnh mẽ nhất để làm cho LLM trở nên thực tiễn. Bằng cách kết hợp **truy xuất + tạo sinh**, bạn có thể biến tài liệu tĩnh thành một **trợ lý thông minh** và đồng thời thu được một dòng thông tin liên tục về sản phẩm.
279
+
280
+ Đối với tôi, dự án này cho thấy RAG không chỉ là một thủ thuật kỹ thuật. Nó là cách để biến tài liệu thành:
281
+
282
+ - một hệ thống hỗ trợ tương tác
283
+ - một kênh phản hồi
284
+ - một công cụ chiến lược sản phẩm
285
+
286
+ 👉 [Thử bản demo tại đây](https://intlayer.org/doc/why) 👉 [Xem mẫu code trên GitHub](https://github.com/aymericzip/smart_doc_RAG)
287
+
288
+ Và nếu bạn cũng đang thử nghiệm với RAG, tôi rất muốn nghe cách bạn đang sử dụng nó như thế nào.