@intlayer/docs 9.4.0 → 9.4.2

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 (1198) hide show
  1. package/README.md +1 -1
  2. package/blog/ar/hreflang_guide_multilingual_seo.md +317 -0
  3. package/blog/ar/intlayer_with_i18next.md +0 -2
  4. package/blog/ar/intlayer_with_next-i18next.md +0 -4
  5. package/blog/ar/intlayer_with_vue-i18n.md +0 -4
  6. package/blog/de/hreflang_guide_multilingual_seo.md +314 -0
  7. package/blog/de/intlayer_with_vue-i18n.md +0 -4
  8. package/blog/en/hreflang_guide_multilingual_seo.md +314 -0
  9. package/blog/en/intlayer_with_i18next.md +0 -2
  10. package/blog/en/intlayer_with_next-i18next.md +0 -2
  11. package/blog/en/intlayer_with_next-intl.md +0 -2
  12. package/blog/en/intlayer_with_react-intl.md +0 -2
  13. package/blog/en/intlayer_with_vue-i18n.md +0 -2
  14. package/blog/en-GB/hreflang_guide_multilingual_seo.md +314 -0
  15. package/blog/es/hreflang_guide_multilingual_seo.md +314 -0
  16. package/blog/fr/hreflang_guide_multilingual_seo.md +315 -0
  17. package/blog/hi/hreflang_guide_multilingual_seo.md +323 -0
  18. package/blog/hi/intlayer_with_i18next.md +0 -2
  19. package/blog/hi/intlayer_with_next-i18next.md +0 -4
  20. package/blog/hi/intlayer_with_vue-i18n.md +0 -4
  21. package/blog/id/hreflang_guide_multilingual_seo.md +314 -0
  22. package/blog/id/intlayer_with_i18next.md +0 -2
  23. package/blog/id/intlayer_with_next-i18next.md +0 -4
  24. package/blog/id/intlayer_with_vue-i18n.md +0 -4
  25. package/blog/it/hreflang_guide_multilingual_seo.md +315 -0
  26. package/blog/it/intlayer_with_i18next.md +0 -2
  27. package/blog/it/intlayer_with_next-i18next.md +0 -4
  28. package/blog/it/intlayer_with_vue-i18n.md +0 -4
  29. package/blog/ja/hreflang_guide_multilingual_seo.md +320 -0
  30. package/blog/ko/hreflang_guide_multilingual_seo.md +314 -0
  31. package/blog/ko/intlayer_with_i18next.md +0 -2
  32. package/blog/ko/intlayer_with_next-i18next.md +0 -4
  33. package/blog/ko/intlayer_with_vue-i18n.md +0 -4
  34. package/blog/pl/hreflang_guide_multilingual_seo.md +316 -0
  35. package/blog/pt/hreflang_guide_multilingual_seo.md +314 -0
  36. package/blog/pt/intlayer_with_i18next.md +0 -2
  37. package/blog/pt/intlayer_with_next-i18next.md +0 -4
  38. package/blog/pt/intlayer_with_vue-i18n.md +0 -4
  39. package/blog/ru/hreflang_guide_multilingual_seo.md +314 -0
  40. package/blog/tr/hreflang_guide_multilingual_seo.md +314 -0
  41. package/blog/tr/intlayer_with_i18next.md +0 -2
  42. package/blog/tr/intlayer_with_next-i18next.md +0 -4
  43. package/blog/tr/intlayer_with_vue-i18n.md +0 -4
  44. package/blog/uk/hreflang_guide_multilingual_seo.md +314 -0
  45. package/blog/uk/intlayer_with_i18next.md +0 -2
  46. package/blog/uk/intlayer_with_next-i18next.md +0 -2
  47. package/blog/uk/intlayer_with_next-intl.md +0 -2
  48. package/blog/uk/intlayer_with_react-intl.md +0 -2
  49. package/blog/uk/intlayer_with_vue-i18n.md +0 -2
  50. package/blog/vi/hreflang_guide_multilingual_seo.md +314 -0
  51. package/blog/vi/intlayer_with_i18next.md +0 -2
  52. package/blog/vi/intlayer_with_next-i18next.md +0 -4
  53. package/blog/vi/intlayer_with_vue-i18n.md +0 -4
  54. package/blog/zh/hreflang_guide_multilingual_seo.md +314 -0
  55. package/blog/zh/intlayer_with_i18next.md +0 -2
  56. package/blog/zh/intlayer_with_next-i18next.md +0 -2
  57. package/blog/zh/intlayer_with_next-intl.md +0 -2
  58. package/blog/zh/intlayer_with_react-intl.md +0 -2
  59. package/blog/zh/intlayer_with_vue-i18n.md +0 -2
  60. package/dist/cjs/common.cjs +29 -6
  61. package/dist/cjs/common.cjs.map +1 -1
  62. package/dist/cjs/generated/blog.entry.cjs +20 -0
  63. package/dist/cjs/generated/blog.entry.cjs.map +1 -1
  64. package/dist/cjs/generated/docs.entry.cjs +20 -0
  65. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  66. package/dist/esm/common.mjs +29 -6
  67. package/dist/esm/common.mjs.map +1 -1
  68. package/dist/esm/generated/blog.entry.mjs +20 -0
  69. package/dist/esm/generated/blog.entry.mjs.map +1 -1
  70. package/dist/esm/generated/docs.entry.mjs +20 -0
  71. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  72. package/dist/types/common.d.ts.map +1 -1
  73. package/dist/types/generated/blog.entry.d.ts +1 -0
  74. package/dist/types/generated/blog.entry.d.ts.map +1 -1
  75. package/dist/types/generated/docs.entry.d.ts +1 -0
  76. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  77. package/docs/ar/analytics.md +458 -12
  78. package/docs/ar/configuration.md +98 -0
  79. package/docs/ar/dictionary/content_file.md +4 -4
  80. package/docs/ar/dictionary/html.md +117 -1
  81. package/docs/ar/dictionary/markdown.md +18 -1
  82. package/docs/ar/dictionary/plurial.md +5 -2
  83. package/docs/ar/how_works_intlayer.md +92 -0
  84. package/docs/ar/interest_of_intlayer.md +106 -9
  85. package/docs/ar/intlayer_CMS.md +92 -0
  86. package/docs/ar/intlayer_visual_editor.md +87 -1
  87. package/docs/ar/intlayer_with_adonisjs.md +121 -0
  88. package/docs/ar/intlayer_with_analog.md +116 -8
  89. package/docs/ar/intlayer_with_angular_19.md +115 -8
  90. package/docs/ar/intlayer_with_angular_21.md +109 -8
  91. package/docs/ar/intlayer_with_astro.md +117 -20
  92. package/docs/ar/intlayer_with_astro_lit.md +118 -10
  93. package/docs/ar/intlayer_with_astro_preact.md +118 -10
  94. package/docs/ar/intlayer_with_astro_react.md +118 -10
  95. package/docs/ar/intlayer_with_astro_solid.md +118 -10
  96. package/docs/ar/intlayer_with_astro_svelte.md +118 -10
  97. package/docs/ar/intlayer_with_astro_vanilla.md +112 -10
  98. package/docs/ar/intlayer_with_astro_vue.md +118 -10
  99. package/docs/ar/intlayer_with_create_react_app.md +105 -0
  100. package/docs/ar/intlayer_with_elysia.md +121 -0
  101. package/docs/ar/intlayer_with_express.md +114 -0
  102. package/docs/ar/intlayer_with_fastify.md +115 -0
  103. package/docs/ar/intlayer_with_hono.md +114 -0
  104. package/docs/ar/intlayer_with_htmx.md +771 -0
  105. package/docs/ar/intlayer_with_lynx+react.md +7 -14
  106. package/docs/ar/intlayer_with_nestjs.md +115 -0
  107. package/docs/ar/intlayer_with_nextjs_14.md +144 -120
  108. package/docs/ar/intlayer_with_nextjs_15.md +126 -51
  109. package/docs/ar/intlayer_with_nextjs_16.md +127 -49
  110. package/docs/ar/intlayer_with_nextjs_compiler.md +122 -13
  111. package/docs/ar/intlayer_with_nextjs_no_locale_path.md +121 -9
  112. package/docs/ar/intlayer_with_nextjs_page_router.md +139 -107
  113. package/docs/ar/intlayer_with_nuxt.md +110 -8
  114. package/docs/ar/intlayer_with_react_native+expo.md +102 -7
  115. package/docs/ar/intlayer_with_react_router_v7.md +119 -10
  116. package/docs/ar/intlayer_with_react_router_v7_fs_routes.md +122 -22
  117. package/docs/ar/intlayer_with_solid_start.md +115 -1
  118. package/docs/ar/intlayer_with_storybook.md +7 -20
  119. package/docs/ar/intlayer_with_svelte_kit.md +107 -17
  120. package/docs/ar/intlayer_with_tanstack+solid.md +124 -22
  121. package/docs/ar/intlayer_with_tanstack.md +134 -43
  122. package/docs/ar/intlayer_with_vanilla.md +117 -9
  123. package/docs/ar/intlayer_with_vite+lit.md +118 -8
  124. package/docs/ar/intlayer_with_vite+preact.md +148 -40
  125. package/docs/ar/intlayer_with_vite+react.md +108 -20
  126. package/docs/ar/intlayer_with_vite+react_compiler.md +106 -1
  127. package/docs/ar/intlayer_with_vite+solid.md +114 -5
  128. package/docs/ar/intlayer_with_vite+svelte.md +118 -8
  129. package/docs/ar/intlayer_with_vite+vanilla.md +125 -8
  130. package/docs/ar/intlayer_with_vite+vue.md +105 -9
  131. package/docs/ar/introduction.md +104 -1
  132. package/docs/ar/migration_from_i18next_to_intlayer.md +0 -2
  133. package/docs/ar/migration_from_next-i18next_to_intlayer.md +0 -2
  134. package/docs/ar/migration_from_next-intl_to_intlayer.md +0 -2
  135. package/docs/ar/migration_from_nuxtjs_i18n_to_intlayer.md +0 -2
  136. package/docs/ar/migration_from_react-i18next_to_intlayer.md +0 -2
  137. package/docs/ar/migration_from_vue-i18n_to_intlayer.md +0 -2
  138. package/docs/ar/packages/vite-intlayer/intlayerMinify.md +1 -1
  139. package/docs/bn/introduction.md +0 -1
  140. package/docs/cs/interest_of_intlayer.md +0 -1
  141. package/docs/cs/intlayer_with_storybook.md +0 -12
  142. package/docs/cs/intlayer_with_vanilla.md +2 -1
  143. package/docs/cs/introduction.md +0 -1
  144. package/docs/de/analytics.md +458 -12
  145. package/docs/de/configuration.md +99 -1
  146. package/docs/de/dictionary/content_file.md +4 -4
  147. package/docs/de/dictionary/markdown.md +3 -0
  148. package/docs/de/dictionary/plurial.md +6 -3
  149. package/docs/de/how_works_intlayer.md +93 -1
  150. package/docs/de/interest_of_intlayer.md +97 -2
  151. package/docs/de/intlayer_CMS.md +93 -1
  152. package/docs/de/intlayer_visual_editor.md +88 -2
  153. package/docs/de/intlayer_with_adonisjs.md +121 -1
  154. package/docs/de/intlayer_with_analog.md +111 -2
  155. package/docs/de/intlayer_with_angular_19.md +109 -2
  156. package/docs/de/intlayer_with_angular_21.md +103 -2
  157. package/docs/de/intlayer_with_astro.md +111 -14
  158. package/docs/de/intlayer_with_astro_lit.md +112 -4
  159. package/docs/de/intlayer_with_astro_preact.md +112 -4
  160. package/docs/de/intlayer_with_astro_react.md +112 -4
  161. package/docs/de/intlayer_with_astro_solid.md +112 -4
  162. package/docs/de/intlayer_with_astro_svelte.md +112 -4
  163. package/docs/de/intlayer_with_astro_vanilla.md +106 -4
  164. package/docs/de/intlayer_with_astro_vue.md +112 -4
  165. package/docs/de/intlayer_with_create_react_app.md +107 -2
  166. package/docs/de/intlayer_with_elysia.md +121 -1
  167. package/docs/de/intlayer_with_express.md +115 -1
  168. package/docs/de/intlayer_with_fastify.md +115 -1
  169. package/docs/de/intlayer_with_hono.md +115 -1
  170. package/docs/de/intlayer_with_htmx.md +770 -0
  171. package/docs/de/intlayer_with_lynx+react.md +0 -7
  172. package/docs/de/intlayer_with_nestjs.md +115 -1
  173. package/docs/de/intlayer_with_nextjs_14.md +138 -110
  174. package/docs/de/intlayer_with_nextjs_15.md +120 -45
  175. package/docs/de/intlayer_with_nextjs_16.md +147 -51
  176. package/docs/de/intlayer_with_nextjs_compiler.md +113 -3
  177. package/docs/de/intlayer_with_nextjs_no_locale_path.md +115 -3
  178. package/docs/de/intlayer_with_nextjs_page_router.md +121 -95
  179. package/docs/de/intlayer_with_nuxt.md +104 -2
  180. package/docs/de/intlayer_with_react_native+expo.md +103 -8
  181. package/docs/de/intlayer_with_react_router_v7.md +113 -4
  182. package/docs/de/intlayer_with_react_router_v7_fs_routes.md +111 -4
  183. package/docs/de/intlayer_with_solid_start.md +117 -2
  184. package/docs/de/intlayer_with_storybook.md +0 -13
  185. package/docs/de/intlayer_with_svelte_kit.md +99 -2
  186. package/docs/de/intlayer_with_tanstack+solid.md +119 -16
  187. package/docs/de/intlayer_with_tanstack.md +231 -152
  188. package/docs/de/intlayer_with_vanilla.md +111 -3
  189. package/docs/de/intlayer_with_vite+lit.md +113 -2
  190. package/docs/de/intlayer_with_vite+preact.md +170 -33
  191. package/docs/de/intlayer_with_vite+react.md +102 -6
  192. package/docs/de/intlayer_with_vite+react_compiler.md +107 -2
  193. package/docs/de/intlayer_with_vite+solid.md +113 -2
  194. package/docs/de/intlayer_with_vite+svelte.md +113 -2
  195. package/docs/de/intlayer_with_vite+vanilla.md +119 -2
  196. package/docs/de/intlayer_with_vite+vue.md +98 -2
  197. package/docs/de/introduction.md +105 -2
  198. package/docs/de/migration_from_i18next_to_intlayer.md +0 -2
  199. package/docs/de/migration_from_next-i18next_to_intlayer.md +0 -2
  200. package/docs/de/migration_from_next-intl_to_intlayer.md +0 -2
  201. package/docs/de/migration_from_nuxtjs_i18n_to_intlayer.md +0 -2
  202. package/docs/de/migration_from_react-i18next_to_intlayer.md +0 -2
  203. package/docs/de/migration_from_vue-i18n_to_intlayer.md +0 -2
  204. package/docs/de/packages/vite-intlayer/intlayerMinify.md +1 -1
  205. package/docs/en/configuration.md +99 -1
  206. package/docs/en/dictionary/content_file.md +4 -4
  207. package/docs/en/how_works_intlayer.md +93 -1
  208. package/docs/en/interest_of_intlayer.md +97 -2
  209. package/docs/en/intlayer_CMS.md +93 -1
  210. package/docs/en/intlayer_visual_editor.md +88 -2
  211. package/docs/en/intlayer_with_adonisjs.md +121 -1
  212. package/docs/en/intlayer_with_analog.md +111 -2
  213. package/docs/en/intlayer_with_angular_19.md +109 -2
  214. package/docs/en/intlayer_with_angular_21.md +103 -2
  215. package/docs/en/intlayer_with_astro.md +107 -4
  216. package/docs/en/intlayer_with_astro_lit.md +112 -4
  217. package/docs/en/intlayer_with_astro_preact.md +112 -4
  218. package/docs/en/intlayer_with_astro_react.md +112 -4
  219. package/docs/en/intlayer_with_astro_solid.md +112 -4
  220. package/docs/en/intlayer_with_astro_svelte.md +112 -4
  221. package/docs/en/intlayer_with_astro_vanilla.md +106 -4
  222. package/docs/en/intlayer_with_astro_vue.md +112 -4
  223. package/docs/en/intlayer_with_create_react_app.md +105 -2
  224. package/docs/en/intlayer_with_elysia.md +121 -1
  225. package/docs/en/intlayer_with_express.md +115 -1
  226. package/docs/en/intlayer_with_fastify.md +115 -1
  227. package/docs/en/intlayer_with_hono.md +115 -1
  228. package/docs/en/intlayer_with_htmx.md +754 -0
  229. package/docs/en/intlayer_with_lynx+react.md +0 -7
  230. package/docs/en/intlayer_with_nestjs.md +115 -1
  231. package/docs/en/intlayer_with_nextjs_14.md +120 -43
  232. package/docs/en/intlayer_with_nextjs_15.md +120 -44
  233. package/docs/en/intlayer_with_nextjs_16.md +121 -43
  234. package/docs/en/intlayer_with_nextjs_compiler.md +111 -2
  235. package/docs/en/intlayer_with_nextjs_no_locale_path.md +115 -3
  236. package/docs/en/intlayer_with_nextjs_page_router.md +110 -95
  237. package/docs/en/intlayer_with_nuxt.md +104 -2
  238. package/docs/en/intlayer_with_react_native+expo.md +103 -8
  239. package/docs/en/intlayer_with_react_router_v7.md +113 -4
  240. package/docs/en/intlayer_with_react_router_v7_fs_routes.md +112 -5
  241. package/docs/en/intlayer_with_solid_start.md +117 -2
  242. package/docs/en/intlayer_with_storybook.md +0 -13
  243. package/docs/en/intlayer_with_svelte_kit.md +99 -2
  244. package/docs/en/intlayer_with_tanstack+solid.md +120 -16
  245. package/docs/en/intlayer_with_tanstack.md +114 -16
  246. package/docs/en/intlayer_with_vanilla.md +111 -3
  247. package/docs/en/intlayer_with_vite+lit.md +113 -2
  248. package/docs/en/intlayer_with_vite+preact.md +143 -34
  249. package/docs/en/intlayer_with_vite+react.md +101 -4
  250. package/docs/en/intlayer_with_vite+react_compiler.md +107 -2
  251. package/docs/en/intlayer_with_vite+solid.md +113 -2
  252. package/docs/en/intlayer_with_vite+svelte.md +113 -2
  253. package/docs/en/intlayer_with_vite+vanilla.md +119 -2
  254. package/docs/en/intlayer_with_vite+vue.md +98 -2
  255. package/docs/en/introduction.md +105 -2
  256. package/docs/en/migration_from_i18next_to_intlayer.md +0 -2
  257. package/docs/en/migration_from_next-i18next_to_intlayer.md +0 -2
  258. package/docs/en/migration_from_next-intl_to_intlayer.md +0 -2
  259. package/docs/en/migration_from_nuxtjs_i18n_to_intlayer.md +0 -2
  260. package/docs/en/migration_from_react-i18next_to_intlayer.md +0 -2
  261. package/docs/en/migration_from_vue-i18n_to_intlayer.md +0 -2
  262. package/docs/en/packages/vite-intlayer/intlayerMinify.md +1 -1
  263. package/docs/en-GB/analytics.md +527 -58
  264. package/docs/en-GB/configuration.md +99 -1
  265. package/docs/en-GB/dictionary/content_file.md +4 -4
  266. package/docs/en-GB/dictionary/html.md +117 -1
  267. package/docs/en-GB/dictionary/markdown.md +18 -1
  268. package/docs/en-GB/dictionary/plurial.md +5 -2
  269. package/docs/en-GB/dictionary/translation.md +1 -1
  270. package/docs/en-GB/how_works_intlayer.md +93 -1
  271. package/docs/en-GB/interest_of_intlayer.md +97 -2
  272. package/docs/en-GB/intlayer_CMS.md +93 -1
  273. package/docs/en-GB/intlayer_visual_editor.md +88 -2
  274. package/docs/en-GB/intlayer_with_adonisjs.md +121 -1
  275. package/docs/en-GB/intlayer_with_analog.md +111 -2
  276. package/docs/en-GB/intlayer_with_angular_19.md +109 -2
  277. package/docs/en-GB/intlayer_with_angular_21.md +103 -2
  278. package/docs/en-GB/intlayer_with_astro.md +111 -14
  279. package/docs/en-GB/intlayer_with_astro_lit.md +112 -4
  280. package/docs/en-GB/intlayer_with_astro_preact.md +112 -4
  281. package/docs/en-GB/intlayer_with_astro_react.md +112 -4
  282. package/docs/en-GB/intlayer_with_astro_solid.md +112 -4
  283. package/docs/en-GB/intlayer_with_astro_svelte.md +112 -4
  284. package/docs/en-GB/intlayer_with_astro_vanilla.md +106 -4
  285. package/docs/en-GB/intlayer_with_astro_vue.md +112 -4
  286. package/docs/en-GB/intlayer_with_create_react_app.md +105 -2
  287. package/docs/en-GB/intlayer_with_elysia.md +121 -1
  288. package/docs/en-GB/intlayer_with_express.md +115 -1
  289. package/docs/en-GB/intlayer_with_fastify.md +115 -1
  290. package/docs/en-GB/intlayer_with_hono.md +115 -1
  291. package/docs/en-GB/intlayer_with_htmx.md +757 -0
  292. package/docs/en-GB/intlayer_with_lynx+react.md +0 -7
  293. package/docs/en-GB/intlayer_with_nestjs.md +115 -1
  294. package/docs/en-GB/intlayer_with_nextjs_14.md +120 -44
  295. package/docs/en-GB/intlayer_with_nextjs_15.md +123 -45
  296. package/docs/en-GB/intlayer_with_nextjs_16.md +121 -44
  297. package/docs/en-GB/intlayer_with_nextjs_compiler.md +121 -12
  298. package/docs/en-GB/intlayer_with_nextjs_no_locale_path.md +115 -3
  299. package/docs/en-GB/intlayer_with_nextjs_page_router.md +122 -137
  300. package/docs/en-GB/intlayer_with_nuxt.md +104 -2
  301. package/docs/en-GB/intlayer_with_react_native+expo.md +103 -8
  302. package/docs/en-GB/intlayer_with_react_router_v7.md +113 -4
  303. package/docs/en-GB/intlayer_with_react_router_v7_fs_routes.md +111 -4
  304. package/docs/en-GB/intlayer_with_solid_start.md +117 -2
  305. package/docs/en-GB/intlayer_with_storybook.md +0 -13
  306. package/docs/en-GB/intlayer_with_svelte_kit.md +99 -2
  307. package/docs/en-GB/intlayer_with_tanstack+solid.md +120 -16
  308. package/docs/en-GB/intlayer_with_tanstack.md +255 -167
  309. package/docs/en-GB/intlayer_with_vanilla.md +111 -3
  310. package/docs/en-GB/intlayer_with_vite+lit.md +113 -2
  311. package/docs/en-GB/intlayer_with_vite+preact.md +179 -32
  312. package/docs/en-GB/intlayer_with_vite+react.md +101 -13
  313. package/docs/en-GB/intlayer_with_vite+react_compiler.md +107 -2
  314. package/docs/en-GB/intlayer_with_vite+solid.md +118 -2
  315. package/docs/en-GB/intlayer_with_vite+svelte.md +113 -11
  316. package/docs/en-GB/intlayer_with_vite+vanilla.md +119 -2
  317. package/docs/en-GB/intlayer_with_vite+vue.md +102 -8
  318. package/docs/en-GB/introduction.md +105 -2
  319. package/docs/en-GB/migration_from_i18next_to_intlayer.md +0 -2
  320. package/docs/en-GB/migration_from_next-i18next_to_intlayer.md +0 -2
  321. package/docs/en-GB/migration_from_next-intl_to_intlayer.md +0 -2
  322. package/docs/en-GB/migration_from_nuxtjs_i18n_to_intlayer.md +0 -2
  323. package/docs/en-GB/migration_from_react-i18next_to_intlayer.md +0 -2
  324. package/docs/en-GB/migration_from_vue-i18n_to_intlayer.md +0 -2
  325. package/docs/en-GB/packages/vite-intlayer/intlayerMinify.md +1 -1
  326. package/docs/es/analytics.md +458 -12
  327. package/docs/es/configuration.md +99 -1
  328. package/docs/es/dictionary/content_file.md +4 -4
  329. package/docs/es/dictionary/markdown.md +18 -1
  330. package/docs/es/dictionary/plurial.md +5 -2
  331. package/docs/es/how_works_intlayer.md +93 -1
  332. package/docs/es/interest_of_intlayer.md +97 -2
  333. package/docs/es/intlayer_CMS.md +93 -1
  334. package/docs/es/intlayer_visual_editor.md +88 -2
  335. package/docs/es/intlayer_with_adonisjs.md +121 -1
  336. package/docs/es/intlayer_with_analog.md +111 -2
  337. package/docs/es/intlayer_with_angular_19.md +109 -2
  338. package/docs/es/intlayer_with_angular_21.md +103 -2
  339. package/docs/es/intlayer_with_astro.md +111 -14
  340. package/docs/es/intlayer_with_astro_lit.md +112 -4
  341. package/docs/es/intlayer_with_astro_preact.md +112 -4
  342. package/docs/es/intlayer_with_astro_react.md +112 -4
  343. package/docs/es/intlayer_with_astro_solid.md +112 -4
  344. package/docs/es/intlayer_with_astro_svelte.md +112 -4
  345. package/docs/es/intlayer_with_astro_vanilla.md +106 -4
  346. package/docs/es/intlayer_with_astro_vue.md +112 -4
  347. package/docs/es/intlayer_with_create_react_app.md +107 -2
  348. package/docs/es/intlayer_with_elysia.md +121 -1
  349. package/docs/es/intlayer_with_express.md +115 -1
  350. package/docs/es/intlayer_with_fastify.md +115 -1
  351. package/docs/es/intlayer_with_hono.md +115 -1
  352. package/docs/es/intlayer_with_htmx.md +763 -0
  353. package/docs/es/intlayer_with_lynx+react.md +0 -7
  354. package/docs/es/intlayer_with_nestjs.md +115 -1
  355. package/docs/es/intlayer_with_nextjs_14.md +120 -44
  356. package/docs/es/intlayer_with_nextjs_15.md +123 -45
  357. package/docs/es/intlayer_with_nextjs_16.md +142 -52
  358. package/docs/es/intlayer_with_nextjs_compiler.md +122 -12
  359. package/docs/es/intlayer_with_nextjs_no_locale_path.md +115 -3
  360. package/docs/es/intlayer_with_nextjs_page_router.md +110 -95
  361. package/docs/es/intlayer_with_nuxt.md +104 -2
  362. package/docs/es/intlayer_with_react_native+expo.md +103 -8
  363. package/docs/es/intlayer_with_react_router_v7.md +113 -4
  364. package/docs/es/intlayer_with_react_router_v7_fs_routes.md +111 -4
  365. package/docs/es/intlayer_with_solid_start.md +117 -2
  366. package/docs/es/intlayer_with_storybook.md +0 -13
  367. package/docs/es/intlayer_with_svelte_kit.md +99 -2
  368. package/docs/es/intlayer_with_tanstack+solid.md +119 -16
  369. package/docs/es/intlayer_with_tanstack.md +252 -147
  370. package/docs/es/intlayer_with_vanilla.md +111 -3
  371. package/docs/es/intlayer_with_vite+lit.md +113 -2
  372. package/docs/es/intlayer_with_vite+preact.md +143 -34
  373. package/docs/es/intlayer_with_vite+react.md +101 -4
  374. package/docs/es/intlayer_with_vite+react_compiler.md +107 -2
  375. package/docs/es/intlayer_with_vite+solid.md +114 -2
  376. package/docs/es/intlayer_with_vite+svelte.md +113 -2
  377. package/docs/es/intlayer_with_vite+vanilla.md +119 -2
  378. package/docs/es/intlayer_with_vite+vue.md +99 -3
  379. package/docs/es/introduction.md +105 -2
  380. package/docs/es/migration_from_i18next_to_intlayer.md +0 -2
  381. package/docs/es/migration_from_next-i18next_to_intlayer.md +0 -2
  382. package/docs/es/migration_from_next-intl_to_intlayer.md +0 -2
  383. package/docs/es/migration_from_nuxtjs_i18n_to_intlayer.md +0 -2
  384. package/docs/es/migration_from_react-i18next_to_intlayer.md +0 -2
  385. package/docs/es/migration_from_vue-i18n_to_intlayer.md +0 -2
  386. package/docs/es/packages/vite-intlayer/intlayerMinify.md +1 -1
  387. package/docs/fr/analytics.md +437 -13
  388. package/docs/fr/configuration.md +99 -1
  389. package/docs/fr/dictionary/content_file.md +4 -4
  390. package/docs/fr/dictionary/markdown.md +18 -1
  391. package/docs/fr/dictionary/plurial.md +5 -2
  392. package/docs/fr/how_works_intlayer.md +93 -1
  393. package/docs/fr/interest_of_intlayer.md +97 -2
  394. package/docs/fr/intlayer_CMS.md +93 -1
  395. package/docs/fr/intlayer_visual_editor.md +88 -2
  396. package/docs/fr/intlayer_with_adonisjs.md +121 -1
  397. package/docs/fr/intlayer_with_analog.md +111 -2
  398. package/docs/fr/intlayer_with_angular_19.md +109 -2
  399. package/docs/fr/intlayer_with_angular_21.md +103 -2
  400. package/docs/fr/intlayer_with_astro.md +111 -14
  401. package/docs/fr/intlayer_with_astro_lit.md +112 -4
  402. package/docs/fr/intlayer_with_astro_preact.md +112 -4
  403. package/docs/fr/intlayer_with_astro_react.md +112 -4
  404. package/docs/fr/intlayer_with_astro_solid.md +112 -4
  405. package/docs/fr/intlayer_with_astro_svelte.md +112 -4
  406. package/docs/fr/intlayer_with_astro_vanilla.md +106 -4
  407. package/docs/fr/intlayer_with_astro_vue.md +112 -4
  408. package/docs/fr/intlayer_with_create_react_app.md +107 -2
  409. package/docs/fr/intlayer_with_elysia.md +121 -1
  410. package/docs/fr/intlayer_with_express.md +115 -1
  411. package/docs/fr/intlayer_with_fastify.md +115 -1
  412. package/docs/fr/intlayer_with_hono.md +115 -1
  413. package/docs/fr/intlayer_with_htmx.md +756 -0
  414. package/docs/fr/intlayer_with_lynx+react.md +0 -7
  415. package/docs/fr/intlayer_with_nestjs.md +115 -1
  416. package/docs/fr/intlayer_with_nextjs_14.md +138 -110
  417. package/docs/fr/intlayer_with_nextjs_15.md +124 -46
  418. package/docs/fr/intlayer_with_nextjs_16.md +121 -43
  419. package/docs/fr/intlayer_with_nextjs_compiler.md +122 -12
  420. package/docs/fr/intlayer_with_nextjs_no_locale_path.md +115 -3
  421. package/docs/fr/intlayer_with_nextjs_page_router.md +110 -95
  422. package/docs/fr/intlayer_with_nuxt.md +104 -2
  423. package/docs/fr/intlayer_with_react_native+expo.md +103 -8
  424. package/docs/fr/intlayer_with_react_router_v7.md +117 -10
  425. package/docs/fr/intlayer_with_react_router_v7_fs_routes.md +111 -4
  426. package/docs/fr/intlayer_with_solid_start.md +117 -2
  427. package/docs/fr/intlayer_with_storybook.md +0 -13
  428. package/docs/fr/intlayer_with_svelte_kit.md +99 -2
  429. package/docs/fr/intlayer_with_tanstack+solid.md +119 -16
  430. package/docs/fr/intlayer_with_tanstack.md +235 -128
  431. package/docs/fr/intlayer_with_vanilla.md +111 -3
  432. package/docs/fr/intlayer_with_vite+lit.md +113 -2
  433. package/docs/fr/intlayer_with_vite+preact.md +143 -34
  434. package/docs/fr/intlayer_with_vite+react.md +101 -4
  435. package/docs/fr/intlayer_with_vite+react_compiler.md +107 -2
  436. package/docs/fr/intlayer_with_vite+solid.md +114 -2
  437. package/docs/fr/intlayer_with_vite+svelte.md +113 -2
  438. package/docs/fr/intlayer_with_vite+vanilla.md +119 -2
  439. package/docs/fr/intlayer_with_vite+vue.md +99 -3
  440. package/docs/fr/introduction.md +105 -2
  441. package/docs/fr/migration_from_i18next_to_intlayer.md +0 -2
  442. package/docs/fr/migration_from_next-i18next_to_intlayer.md +0 -2
  443. package/docs/fr/migration_from_next-intl_to_intlayer.md +0 -2
  444. package/docs/fr/migration_from_nuxtjs_i18n_to_intlayer.md +0 -2
  445. package/docs/fr/migration_from_react-i18next_to_intlayer.md +0 -2
  446. package/docs/fr/migration_from_vue-i18n_to_intlayer.md +0 -2
  447. package/docs/fr/packages/vite-intlayer/intlayerMinify.md +1 -1
  448. package/docs/hi/analytics.md +488 -21
  449. package/docs/hi/configuration.md +98 -0
  450. package/docs/hi/dictionary/content_file.md +4 -4
  451. package/docs/hi/dictionary/html.md +100 -3
  452. package/docs/hi/dictionary/markdown.md +3 -0
  453. package/docs/hi/dictionary/plurial.md +6 -3
  454. package/docs/hi/how_works_intlayer.md +92 -0
  455. package/docs/hi/interest_of_intlayer.md +106 -9
  456. package/docs/hi/intlayer_CMS.md +92 -0
  457. package/docs/hi/intlayer_visual_editor.md +87 -1
  458. package/docs/hi/intlayer_with_adonisjs.md +121 -0
  459. package/docs/hi/intlayer_with_analog.md +116 -8
  460. package/docs/hi/intlayer_with_angular_19.md +115 -8
  461. package/docs/hi/intlayer_with_angular_21.md +109 -8
  462. package/docs/hi/intlayer_with_astro.md +117 -20
  463. package/docs/hi/intlayer_with_astro_lit.md +118 -10
  464. package/docs/hi/intlayer_with_astro_preact.md +118 -10
  465. package/docs/hi/intlayer_with_astro_react.md +118 -10
  466. package/docs/hi/intlayer_with_astro_solid.md +118 -10
  467. package/docs/hi/intlayer_with_astro_svelte.md +118 -10
  468. package/docs/hi/intlayer_with_astro_vanilla.md +112 -10
  469. package/docs/hi/intlayer_with_astro_vue.md +118 -10
  470. package/docs/hi/intlayer_with_create_react_app.md +106 -1
  471. package/docs/hi/intlayer_with_elysia.md +121 -0
  472. package/docs/hi/intlayer_with_express.md +114 -0
  473. package/docs/hi/intlayer_with_fastify.md +115 -0
  474. package/docs/hi/intlayer_with_hono.md +114 -0
  475. package/docs/hi/intlayer_with_htmx.md +771 -0
  476. package/docs/hi/intlayer_with_lynx+react.md +7 -14
  477. package/docs/hi/intlayer_with_nestjs.md +115 -0
  478. package/docs/hi/intlayer_with_nextjs_14.md +144 -120
  479. package/docs/hi/intlayer_with_nextjs_15.md +129 -51
  480. package/docs/hi/intlayer_with_nextjs_16.md +129 -50
  481. package/docs/hi/intlayer_with_nextjs_compiler.md +121 -12
  482. package/docs/hi/intlayer_with_nextjs_no_locale_path.md +121 -9
  483. package/docs/hi/intlayer_with_nextjs_page_router.md +123 -96
  484. package/docs/hi/intlayer_with_nuxt.md +110 -8
  485. package/docs/hi/intlayer_with_react_native+expo.md +102 -7
  486. package/docs/hi/intlayer_with_react_router_v7.md +119 -10
  487. package/docs/hi/intlayer_with_react_router_v7_fs_routes.md +122 -22
  488. package/docs/hi/intlayer_with_solid_start.md +115 -1
  489. package/docs/hi/intlayer_with_storybook.md +7 -20
  490. package/docs/hi/intlayer_with_svelte_kit.md +105 -8
  491. package/docs/hi/intlayer_with_tanstack+solid.md +124 -22
  492. package/docs/hi/intlayer_with_tanstack.md +269 -155
  493. package/docs/hi/intlayer_with_vanilla.md +117 -9
  494. package/docs/hi/intlayer_with_vite+lit.md +118 -8
  495. package/docs/hi/intlayer_with_vite+preact.md +170 -41
  496. package/docs/hi/intlayer_with_vite+react.md +108 -20
  497. package/docs/hi/intlayer_with_vite+react_compiler.md +106 -1
  498. package/docs/hi/intlayer_with_vite+solid.md +118 -8
  499. package/docs/hi/intlayer_with_vite+svelte.md +120 -9
  500. package/docs/hi/intlayer_with_vite+vanilla.md +125 -8
  501. package/docs/hi/intlayer_with_vite+vue.md +104 -8
  502. package/docs/hi/introduction.md +104 -1
  503. package/docs/hi/migration_from_i18next_to_intlayer.md +0 -2
  504. package/docs/hi/migration_from_next-i18next_to_intlayer.md +0 -2
  505. package/docs/hi/migration_from_next-intl_to_intlayer.md +0 -2
  506. package/docs/hi/migration_from_nuxtjs_i18n_to_intlayer.md +0 -2
  507. package/docs/hi/migration_from_react-i18next_to_intlayer.md +0 -2
  508. package/docs/hi/migration_from_vue-i18n_to_intlayer.md +0 -2
  509. package/docs/hi/packages/vite-intlayer/intlayerMinify.md +1 -1
  510. package/docs/id/analytics.md +488 -21
  511. package/docs/id/configuration.md +98 -0
  512. package/docs/id/dictionary/content_file.md +4 -4
  513. package/docs/id/dictionary/markdown.md +3 -0
  514. package/docs/id/dictionary/plurial.md +5 -2
  515. package/docs/id/how_works_intlayer.md +92 -0
  516. package/docs/id/interest_of_intlayer.md +96 -1
  517. package/docs/id/intlayer_CMS.md +92 -0
  518. package/docs/id/intlayer_visual_editor.md +87 -1
  519. package/docs/id/intlayer_with_adonisjs.md +121 -0
  520. package/docs/id/intlayer_with_analog.md +109 -1
  521. package/docs/id/intlayer_with_angular_19.md +108 -1
  522. package/docs/id/intlayer_with_angular_21.md +102 -1
  523. package/docs/id/intlayer_with_astro.md +110 -13
  524. package/docs/id/intlayer_with_astro_lit.md +111 -3
  525. package/docs/id/intlayer_with_astro_preact.md +111 -3
  526. package/docs/id/intlayer_with_astro_react.md +111 -3
  527. package/docs/id/intlayer_with_astro_solid.md +111 -3
  528. package/docs/id/intlayer_with_astro_svelte.md +111 -3
  529. package/docs/id/intlayer_with_astro_vanilla.md +105 -3
  530. package/docs/id/intlayer_with_astro_vue.md +111 -3
  531. package/docs/id/intlayer_with_create_react_app.md +106 -1
  532. package/docs/id/intlayer_with_elysia.md +121 -0
  533. package/docs/id/intlayer_with_express.md +114 -0
  534. package/docs/id/intlayer_with_fastify.md +115 -0
  535. package/docs/id/intlayer_with_hono.md +114 -0
  536. package/docs/id/intlayer_with_htmx.md +761 -0
  537. package/docs/id/intlayer_with_lynx+react.md +0 -7
  538. package/docs/id/intlayer_with_nestjs.md +115 -0
  539. package/docs/id/intlayer_with_nextjs_14.md +132 -66
  540. package/docs/id/intlayer_with_nextjs_15.md +119 -43
  541. package/docs/id/intlayer_with_nextjs_16.md +122 -42
  542. package/docs/id/intlayer_with_nextjs_compiler.md +122 -14
  543. package/docs/id/intlayer_with_nextjs_no_locale_path.md +114 -2
  544. package/docs/id/intlayer_with_nextjs_page_router.md +111 -94
  545. package/docs/id/intlayer_with_nuxt.md +103 -1
  546. package/docs/id/intlayer_with_react_native+expo.md +102 -7
  547. package/docs/id/intlayer_with_react_router_v7.md +112 -3
  548. package/docs/id/intlayer_with_react_router_v7_fs_routes.md +116 -16
  549. package/docs/id/intlayer_with_solid_start.md +115 -1
  550. package/docs/id/intlayer_with_storybook.md +0 -13
  551. package/docs/id/intlayer_with_svelte_kit.md +98 -1
  552. package/docs/id/intlayer_with_tanstack+solid.md +117 -15
  553. package/docs/id/intlayer_with_tanstack.md +229 -129
  554. package/docs/id/intlayer_with_vanilla.md +110 -2
  555. package/docs/id/intlayer_with_vite+lit.md +111 -1
  556. package/docs/id/intlayer_with_vite+preact.md +141 -33
  557. package/docs/id/intlayer_with_vite+react.md +101 -13
  558. package/docs/id/intlayer_with_vite+react_compiler.md +106 -1
  559. package/docs/id/intlayer_with_vite+solid.md +112 -1
  560. package/docs/id/intlayer_with_vite+svelte.md +111 -1
  561. package/docs/id/intlayer_with_vite+vanilla.md +118 -1
  562. package/docs/id/intlayer_with_vite+vue.md +97 -1
  563. package/docs/id/introduction.md +104 -1
  564. package/docs/id/migration_from_i18next_to_intlayer.md +0 -2
  565. package/docs/id/migration_from_next-i18next_to_intlayer.md +0 -2
  566. package/docs/id/migration_from_next-intl_to_intlayer.md +0 -2
  567. package/docs/id/migration_from_nuxtjs_i18n_to_intlayer.md +0 -2
  568. package/docs/id/migration_from_react-i18next_to_intlayer.md +0 -2
  569. package/docs/id/migration_from_vue-i18n_to_intlayer.md +0 -2
  570. package/docs/id/packages/vite-intlayer/intlayerMinify.md +1 -1
  571. package/docs/it/analytics.md +488 -21
  572. package/docs/it/configuration.md +99 -1
  573. package/docs/it/dictionary/content_file.md +4 -4
  574. package/docs/it/dictionary/markdown.md +18 -1
  575. package/docs/it/dictionary/plurial.md +5 -2
  576. package/docs/it/how_works_intlayer.md +93 -1
  577. package/docs/it/interest_of_intlayer.md +97 -2
  578. package/docs/it/intlayer_CMS.md +93 -1
  579. package/docs/it/intlayer_visual_editor.md +88 -2
  580. package/docs/it/intlayer_with_adonisjs.md +121 -1
  581. package/docs/it/intlayer_with_analog.md +111 -2
  582. package/docs/it/intlayer_with_angular_19.md +109 -2
  583. package/docs/it/intlayer_with_angular_21.md +103 -2
  584. package/docs/it/intlayer_with_astro.md +111 -14
  585. package/docs/it/intlayer_with_astro_lit.md +112 -4
  586. package/docs/it/intlayer_with_astro_preact.md +112 -4
  587. package/docs/it/intlayer_with_astro_react.md +112 -4
  588. package/docs/it/intlayer_with_astro_solid.md +112 -4
  589. package/docs/it/intlayer_with_astro_svelte.md +112 -4
  590. package/docs/it/intlayer_with_astro_vanilla.md +106 -4
  591. package/docs/it/intlayer_with_astro_vue.md +112 -4
  592. package/docs/it/intlayer_with_create_react_app.md +107 -2
  593. package/docs/it/intlayer_with_elysia.md +121 -1
  594. package/docs/it/intlayer_with_express.md +115 -1
  595. package/docs/it/intlayer_with_fastify.md +115 -1
  596. package/docs/it/intlayer_with_hono.md +115 -1
  597. package/docs/it/intlayer_with_htmx.md +761 -0
  598. package/docs/it/intlayer_with_lynx+react.md +0 -7
  599. package/docs/it/intlayer_with_nestjs.md +115 -1
  600. package/docs/it/intlayer_with_nextjs_14.md +138 -115
  601. package/docs/it/intlayer_with_nextjs_15.md +124 -47
  602. package/docs/it/intlayer_with_nextjs_16.md +123 -44
  603. package/docs/it/intlayer_with_nextjs_compiler.md +123 -14
  604. package/docs/it/intlayer_with_nextjs_no_locale_path.md +115 -3
  605. package/docs/it/intlayer_with_nextjs_page_router.md +119 -95
  606. package/docs/it/intlayer_with_nuxt.md +104 -2
  607. package/docs/it/intlayer_with_react_native+expo.md +103 -8
  608. package/docs/it/intlayer_with_react_router_v7.md +113 -4
  609. package/docs/it/intlayer_with_react_router_v7_fs_routes.md +111 -4
  610. package/docs/it/intlayer_with_solid_start.md +117 -2
  611. package/docs/it/intlayer_with_storybook.md +0 -13
  612. package/docs/it/intlayer_with_svelte_kit.md +99 -2
  613. package/docs/it/intlayer_with_tanstack+solid.md +119 -16
  614. package/docs/it/intlayer_with_tanstack.md +232 -131
  615. package/docs/it/intlayer_with_vanilla.md +111 -3
  616. package/docs/it/intlayer_with_vite+lit.md +113 -2
  617. package/docs/it/intlayer_with_vite+preact.md +143 -34
  618. package/docs/it/intlayer_with_vite+react.md +102 -14
  619. package/docs/it/intlayer_with_vite+react_compiler.md +107 -2
  620. package/docs/it/intlayer_with_vite+solid.md +114 -2
  621. package/docs/it/intlayer_with_vite+svelte.md +113 -2
  622. package/docs/it/intlayer_with_vite+vanilla.md +119 -2
  623. package/docs/it/intlayer_with_vite+vue.md +99 -3
  624. package/docs/it/introduction.md +105 -2
  625. package/docs/it/migration_from_i18next_to_intlayer.md +0 -2
  626. package/docs/it/migration_from_next-i18next_to_intlayer.md +0 -2
  627. package/docs/it/migration_from_next-intl_to_intlayer.md +0 -2
  628. package/docs/it/migration_from_nuxtjs_i18n_to_intlayer.md +0 -2
  629. package/docs/it/migration_from_react-i18next_to_intlayer.md +0 -2
  630. package/docs/it/migration_from_vue-i18n_to_intlayer.md +0 -2
  631. package/docs/it/packages/vite-intlayer/intlayerMinify.md +1 -1
  632. package/docs/ja/analytics.md +458 -12
  633. package/docs/ja/configuration.md +99 -1
  634. package/docs/ja/dictionary/content_file.md +4 -4
  635. package/docs/ja/dictionary/plurial.md +5 -2
  636. package/docs/ja/how_works_intlayer.md +93 -1
  637. package/docs/ja/interest_of_intlayer.md +107 -10
  638. package/docs/ja/intlayer_CMS.md +93 -1
  639. package/docs/ja/intlayer_visual_editor.md +88 -2
  640. package/docs/ja/intlayer_with_adonisjs.md +121 -1
  641. package/docs/ja/intlayer_with_analog.md +119 -10
  642. package/docs/ja/intlayer_with_angular_19.md +117 -10
  643. package/docs/ja/intlayer_with_angular_21.md +111 -10
  644. package/docs/ja/intlayer_with_astro.md +119 -22
  645. package/docs/ja/intlayer_with_astro_lit.md +120 -12
  646. package/docs/ja/intlayer_with_astro_preact.md +120 -12
  647. package/docs/ja/intlayer_with_astro_react.md +120 -12
  648. package/docs/ja/intlayer_with_astro_solid.md +120 -12
  649. package/docs/ja/intlayer_with_astro_svelte.md +120 -12
  650. package/docs/ja/intlayer_with_astro_vanilla.md +114 -12
  651. package/docs/ja/intlayer_with_astro_vue.md +120 -12
  652. package/docs/ja/intlayer_with_create_react_app.md +107 -2
  653. package/docs/ja/intlayer_with_elysia.md +121 -1
  654. package/docs/ja/intlayer_with_express.md +121 -1
  655. package/docs/ja/intlayer_with_fastify.md +115 -1
  656. package/docs/ja/intlayer_with_hono.md +115 -1
  657. package/docs/ja/intlayer_with_htmx.md +769 -0
  658. package/docs/ja/intlayer_with_lynx+react.md +8 -15
  659. package/docs/ja/intlayer_with_nestjs.md +115 -1
  660. package/docs/ja/intlayer_with_nextjs_14.md +128 -51
  661. package/docs/ja/intlayer_with_nextjs_15.md +136 -59
  662. package/docs/ja/intlayer_with_nextjs_16.md +131 -52
  663. package/docs/ja/intlayer_with_nextjs_compiler.md +123 -15
  664. package/docs/ja/intlayer_with_nextjs_no_locale_path.md +123 -11
  665. package/docs/ja/intlayer_with_nextjs_page_router.md +215 -110
  666. package/docs/ja/intlayer_with_nuxt.md +112 -10
  667. package/docs/ja/intlayer_with_react_native+expo.md +103 -8
  668. package/docs/ja/intlayer_with_react_router_v7.md +121 -11
  669. package/docs/ja/intlayer_with_react_router_v7_fs_routes.md +123 -23
  670. package/docs/ja/intlayer_with_solid_start.md +117 -2
  671. package/docs/ja/intlayer_with_storybook.md +8 -21
  672. package/docs/ja/intlayer_with_svelte_kit.md +107 -10
  673. package/docs/ja/intlayer_with_tanstack+solid.md +128 -24
  674. package/docs/ja/intlayer_with_tanstack.md +254 -203
  675. package/docs/ja/intlayer_with_vanilla.md +119 -11
  676. package/docs/ja/intlayer_with_vite+lit.md +121 -10
  677. package/docs/ja/intlayer_with_vite+preact.md +151 -23
  678. package/docs/ja/intlayer_with_vite+react.md +109 -12
  679. package/docs/ja/intlayer_with_vite+react_compiler.md +107 -2
  680. package/docs/ja/intlayer_with_vite+solid.md +121 -10
  681. package/docs/ja/intlayer_with_vite+svelte.md +121 -10
  682. package/docs/ja/intlayer_with_vite+vanilla.md +127 -10
  683. package/docs/ja/intlayer_with_vite+vue.md +107 -11
  684. package/docs/ja/introduction.md +105 -2
  685. package/docs/ja/migration_from_i18next_to_intlayer.md +0 -2
  686. package/docs/ja/migration_from_next-i18next_to_intlayer.md +0 -2
  687. package/docs/ja/migration_from_next-intl_to_intlayer.md +0 -2
  688. package/docs/ja/migration_from_nuxtjs_i18n_to_intlayer.md +0 -2
  689. package/docs/ja/migration_from_react-i18next_to_intlayer.md +0 -2
  690. package/docs/ja/migration_from_vue-i18n_to_intlayer.md +0 -2
  691. package/docs/ja/packages/vite-intlayer/intlayerMinify.md +1 -1
  692. package/docs/ko/analytics.md +457 -11
  693. package/docs/ko/configuration.md +99 -1
  694. package/docs/ko/dictionary/content_file.md +4 -4
  695. package/docs/ko/dictionary/markdown.md +18 -1
  696. package/docs/ko/dictionary/plurial.md +6 -3
  697. package/docs/ko/how_works_intlayer.md +93 -1
  698. package/docs/ko/interest_of_intlayer.md +98 -3
  699. package/docs/ko/intlayer_CMS.md +93 -1
  700. package/docs/ko/intlayer_visual_editor.md +88 -2
  701. package/docs/ko/intlayer_with_adonisjs.md +121 -1
  702. package/docs/ko/intlayer_with_analog.md +111 -2
  703. package/docs/ko/intlayer_with_angular_19.md +110 -3
  704. package/docs/ko/intlayer_with_angular_21.md +104 -3
  705. package/docs/ko/intlayer_with_astro.md +119 -19
  706. package/docs/ko/intlayer_with_astro_lit.md +112 -4
  707. package/docs/ko/intlayer_with_astro_preact.md +112 -4
  708. package/docs/ko/intlayer_with_astro_react.md +112 -4
  709. package/docs/ko/intlayer_with_astro_solid.md +112 -4
  710. package/docs/ko/intlayer_with_astro_svelte.md +112 -4
  711. package/docs/ko/intlayer_with_astro_vanilla.md +106 -4
  712. package/docs/ko/intlayer_with_astro_vue.md +112 -4
  713. package/docs/ko/intlayer_with_create_react_app.md +107 -5
  714. package/docs/ko/intlayer_with_elysia.md +121 -1
  715. package/docs/ko/intlayer_with_express.md +115 -1
  716. package/docs/ko/intlayer_with_fastify.md +115 -2
  717. package/docs/ko/intlayer_with_hono.md +115 -1
  718. package/docs/ko/intlayer_with_htmx.md +763 -0
  719. package/docs/ko/intlayer_with_lynx+react.md +0 -7
  720. package/docs/ko/intlayer_with_nestjs.md +115 -1
  721. package/docs/ko/intlayer_with_nextjs_14.md +118 -42
  722. package/docs/ko/intlayer_with_nextjs_15.md +118 -43
  723. package/docs/ko/intlayer_with_nextjs_16.md +121 -43
  724. package/docs/ko/intlayer_with_nextjs_compiler.md +110 -1
  725. package/docs/ko/intlayer_with_nextjs_no_locale_path.md +117 -7
  726. package/docs/ko/intlayer_with_nextjs_page_router.md +110 -94
  727. package/docs/ko/intlayer_with_nuxt.md +104 -2
  728. package/docs/ko/intlayer_with_react_native+expo.md +103 -8
  729. package/docs/ko/intlayer_with_react_router_v7.md +116 -10
  730. package/docs/ko/intlayer_with_react_router_v7_fs_routes.md +113 -11
  731. package/docs/ko/intlayer_with_solid_start.md +122 -7
  732. package/docs/ko/intlayer_with_storybook.md +0 -14
  733. package/docs/ko/intlayer_with_svelte_kit.md +99 -2
  734. package/docs/ko/intlayer_with_tanstack+solid.md +121 -17
  735. package/docs/ko/intlayer_with_tanstack.md +260 -191
  736. package/docs/ko/intlayer_with_vanilla.md +111 -2
  737. package/docs/ko/intlayer_with_vite+lit.md +114 -3
  738. package/docs/ko/intlayer_with_vite+preact.md +143 -34
  739. package/docs/ko/intlayer_with_vite+react.md +101 -5
  740. package/docs/ko/intlayer_with_vite+react_compiler.md +107 -10
  741. package/docs/ko/intlayer_with_vite+solid.md +115 -2
  742. package/docs/ko/intlayer_with_vite+svelte.md +114 -6
  743. package/docs/ko/intlayer_with_vite+vanilla.md +121 -11
  744. package/docs/ko/intlayer_with_vite+vue.md +99 -3
  745. package/docs/ko/introduction.md +105 -2
  746. package/docs/ko/migration_from_i18next_to_intlayer.md +0 -2
  747. package/docs/ko/migration_from_next-i18next_to_intlayer.md +0 -2
  748. package/docs/ko/migration_from_next-intl_to_intlayer.md +0 -2
  749. package/docs/ko/migration_from_nuxtjs_i18n_to_intlayer.md +0 -2
  750. package/docs/ko/migration_from_react-i18next_to_intlayer.md +0 -2
  751. package/docs/ko/migration_from_vue-i18n_to_intlayer.md +0 -2
  752. package/docs/ko/packages/express-intlayer/t.md +9 -6
  753. package/docs/ko/packages/vite-intlayer/intlayerMinify.md +1 -1
  754. package/docs/nl/interest_of_intlayer.md +0 -1
  755. package/docs/nl/intlayer_with_storybook.md +0 -12
  756. package/docs/nl/intlayer_with_vanilla.md +2 -1
  757. package/docs/nl/introduction.md +0 -1
  758. package/docs/pl/analytics.md +488 -21
  759. package/docs/pl/configuration.md +98 -0
  760. package/docs/pl/dictionary/content_file.md +4 -4
  761. package/docs/pl/dictionary/markdown.md +3 -0
  762. package/docs/pl/dictionary/plurial.md +5 -2
  763. package/docs/pl/how_works_intlayer.md +92 -0
  764. package/docs/pl/interest_of_intlayer.md +96 -1
  765. package/docs/pl/intlayer_CMS.md +92 -0
  766. package/docs/pl/intlayer_visual_editor.md +87 -1
  767. package/docs/pl/intlayer_with_adonisjs.md +120 -0
  768. package/docs/pl/intlayer_with_analog.md +116 -8
  769. package/docs/pl/intlayer_with_angular_19.md +115 -8
  770. package/docs/pl/intlayer_with_angular_21.md +109 -8
  771. package/docs/pl/intlayer_with_astro.md +117 -20
  772. package/docs/pl/intlayer_with_astro_lit.md +118 -10
  773. package/docs/pl/intlayer_with_astro_preact.md +118 -10
  774. package/docs/pl/intlayer_with_astro_react.md +118 -10
  775. package/docs/pl/intlayer_with_astro_solid.md +118 -10
  776. package/docs/pl/intlayer_with_astro_svelte.md +118 -10
  777. package/docs/pl/intlayer_with_astro_vanilla.md +112 -10
  778. package/docs/pl/intlayer_with_astro_vue.md +118 -10
  779. package/docs/pl/intlayer_with_create_react_app.md +106 -1
  780. package/docs/pl/intlayer_with_elysia.md +120 -0
  781. package/docs/pl/intlayer_with_express.md +114 -0
  782. package/docs/pl/intlayer_with_fastify.md +114 -0
  783. package/docs/pl/intlayer_with_hono.md +114 -0
  784. package/docs/pl/intlayer_with_htmx.md +767 -0
  785. package/docs/pl/intlayer_with_lynx+react.md +7 -14
  786. package/docs/pl/intlayer_with_nestjs.md +114 -0
  787. package/docs/pl/intlayer_with_nextjs_14.md +127 -50
  788. package/docs/pl/intlayer_with_nextjs_15.md +141 -62
  789. package/docs/pl/intlayer_with_nextjs_16.md +128 -51
  790. package/docs/pl/intlayer_with_nextjs_compiler.md +122 -13
  791. package/docs/pl/intlayer_with_nextjs_no_locale_path.md +122 -10
  792. package/docs/pl/intlayer_with_nextjs_page_router.md +115 -97
  793. package/docs/pl/intlayer_with_nuxt.md +110 -8
  794. package/docs/pl/intlayer_with_react_native+expo.md +102 -7
  795. package/docs/pl/intlayer_with_react_router_v7.md +131 -22
  796. package/docs/pl/intlayer_with_react_router_v7_fs_routes.md +121 -20
  797. package/docs/pl/intlayer_with_solid_start.md +115 -1
  798. package/docs/pl/intlayer_with_storybook.md +7 -20
  799. package/docs/pl/intlayer_with_svelte_kit.md +105 -8
  800. package/docs/pl/intlayer_with_tanstack+solid.md +124 -22
  801. package/docs/pl/intlayer_with_tanstack.md +238 -160
  802. package/docs/pl/intlayer_with_vanilla.md +117 -9
  803. package/docs/pl/intlayer_with_vite+lit.md +118 -8
  804. package/docs/pl/intlayer_with_vite+preact.md +148 -40
  805. package/docs/pl/intlayer_with_vite+react.md +108 -20
  806. package/docs/pl/intlayer_with_vite+react_compiler.md +108 -3
  807. package/docs/pl/intlayer_with_vite+solid.md +112 -5
  808. package/docs/pl/intlayer_with_vite+svelte.md +118 -8
  809. package/docs/pl/intlayer_with_vite+vanilla.md +125 -8
  810. package/docs/pl/intlayer_with_vite+vue.md +104 -8
  811. package/docs/pl/introduction.md +104 -1
  812. package/docs/pl/migration_from_i18next_to_intlayer.md +0 -2
  813. package/docs/pl/migration_from_next-i18next_to_intlayer.md +0 -2
  814. package/docs/pl/migration_from_next-intl_to_intlayer.md +0 -2
  815. package/docs/pl/migration_from_nuxtjs_i18n_to_intlayer.md +0 -2
  816. package/docs/pl/migration_from_react-i18next_to_intlayer.md +0 -2
  817. package/docs/pl/migration_from_vue-i18n_to_intlayer.md +0 -2
  818. package/docs/pl/packages/next-intlayer/useIntlayer.md +3 -0
  819. package/docs/pl/packages/vite-intlayer/intlayerMinify.md +1 -1
  820. package/docs/pt/analytics.md +488 -21
  821. package/docs/pt/configuration.md +99 -1
  822. package/docs/pt/dictionary/content_file.md +4 -4
  823. package/docs/pt/dictionary/html.md +18 -1
  824. package/docs/pt/dictionary/markdown.md +3 -0
  825. package/docs/pt/dictionary/plurial.md +5 -2
  826. package/docs/pt/how_works_intlayer.md +93 -1
  827. package/docs/pt/interest_of_intlayer.md +98 -3
  828. package/docs/pt/intlayer_CMS.md +93 -1
  829. package/docs/pt/intlayer_visual_editor.md +88 -2
  830. package/docs/pt/intlayer_with_adonisjs.md +121 -1
  831. package/docs/pt/intlayer_with_analog.md +112 -3
  832. package/docs/pt/intlayer_with_angular_19.md +109 -2
  833. package/docs/pt/intlayer_with_angular_21.md +103 -2
  834. package/docs/pt/intlayer_with_astro.md +111 -14
  835. package/docs/pt/intlayer_with_astro_lit.md +112 -4
  836. package/docs/pt/intlayer_with_astro_preact.md +112 -4
  837. package/docs/pt/intlayer_with_astro_react.md +112 -4
  838. package/docs/pt/intlayer_with_astro_solid.md +112 -4
  839. package/docs/pt/intlayer_with_astro_svelte.md +112 -4
  840. package/docs/pt/intlayer_with_astro_vanilla.md +106 -4
  841. package/docs/pt/intlayer_with_astro_vue.md +111 -3
  842. package/docs/pt/intlayer_with_create_react_app.md +107 -2
  843. package/docs/pt/intlayer_with_elysia.md +121 -1
  844. package/docs/pt/intlayer_with_express.md +115 -1
  845. package/docs/pt/intlayer_with_fastify.md +115 -2
  846. package/docs/pt/intlayer_with_hono.md +115 -1
  847. package/docs/pt/intlayer_with_htmx.md +771 -0
  848. package/docs/pt/intlayer_with_lynx+react.md +0 -7
  849. package/docs/pt/intlayer_with_nestjs.md +115 -1
  850. package/docs/pt/intlayer_with_nextjs_14.md +138 -117
  851. package/docs/pt/intlayer_with_nextjs_15.md +120 -45
  852. package/docs/pt/intlayer_with_nextjs_16.md +122 -45
  853. package/docs/pt/intlayer_with_nextjs_compiler.md +122 -12
  854. package/docs/pt/intlayer_with_nextjs_no_locale_path.md +115 -3
  855. package/docs/pt/intlayer_with_nextjs_page_router.md +121 -95
  856. package/docs/pt/intlayer_with_nuxt.md +104 -2
  857. package/docs/pt/intlayer_with_react_native+expo.md +103 -8
  858. package/docs/pt/intlayer_with_react_router_v7.md +140 -33
  859. package/docs/pt/intlayer_with_react_router_v7_fs_routes.md +115 -8
  860. package/docs/pt/intlayer_with_solid_start.md +121 -6
  861. package/docs/pt/intlayer_with_storybook.md +0 -13
  862. package/docs/pt/intlayer_with_svelte_kit.md +99 -2
  863. package/docs/pt/intlayer_with_tanstack+solid.md +120 -16
  864. package/docs/pt/intlayer_with_tanstack.md +252 -144
  865. package/docs/pt/intlayer_with_vanilla.md +111 -3
  866. package/docs/pt/intlayer_with_vite+lit.md +113 -2
  867. package/docs/pt/intlayer_with_vite+preact.md +143 -34
  868. package/docs/pt/intlayer_with_vite+react.md +101 -4
  869. package/docs/pt/intlayer_with_vite+react_compiler.md +107 -2
  870. package/docs/pt/intlayer_with_vite+solid.md +114 -2
  871. package/docs/pt/intlayer_with_vite+svelte.md +113 -2
  872. package/docs/pt/intlayer_with_vite+vanilla.md +119 -2
  873. package/docs/pt/intlayer_with_vite+vue.md +98 -2
  874. package/docs/pt/introduction.md +105 -2
  875. package/docs/pt/migration_from_i18next_to_intlayer.md +0 -2
  876. package/docs/pt/migration_from_next-i18next_to_intlayer.md +0 -2
  877. package/docs/pt/migration_from_next-intl_to_intlayer.md +0 -2
  878. package/docs/pt/migration_from_nuxtjs_i18n_to_intlayer.md +0 -2
  879. package/docs/pt/migration_from_react-i18next_to_intlayer.md +0 -2
  880. package/docs/pt/migration_from_vue-i18n_to_intlayer.md +0 -2
  881. package/docs/pt/packages/vite-intlayer/intlayerMinify.md +1 -1
  882. package/docs/ru/analytics.md +458 -12
  883. package/docs/ru/cli/doc-review.md +0 -2
  884. package/docs/ru/configuration.md +99 -1
  885. package/docs/ru/dictionary/content_file.md +4 -4
  886. package/docs/ru/dictionary/markdown.md +0 -2
  887. package/docs/ru/dictionary/plurial.md +6 -3
  888. package/docs/ru/dictionary/translation.md +1 -1
  889. package/docs/ru/how_works_intlayer.md +93 -1
  890. package/docs/ru/interest_of_intlayer.md +97 -2
  891. package/docs/ru/intlayer_CMS.md +93 -1
  892. package/docs/ru/intlayer_visual_editor.md +88 -2
  893. package/docs/ru/intlayer_with_adonisjs.md +121 -1
  894. package/docs/ru/intlayer_with_analog.md +111 -2
  895. package/docs/ru/intlayer_with_angular_19.md +109 -2
  896. package/docs/ru/intlayer_with_angular_21.md +103 -2
  897. package/docs/ru/intlayer_with_astro.md +111 -14
  898. package/docs/ru/intlayer_with_astro_lit.md +112 -4
  899. package/docs/ru/intlayer_with_astro_preact.md +112 -4
  900. package/docs/ru/intlayer_with_astro_react.md +112 -4
  901. package/docs/ru/intlayer_with_astro_solid.md +112 -4
  902. package/docs/ru/intlayer_with_astro_svelte.md +112 -4
  903. package/docs/ru/intlayer_with_astro_vanilla.md +106 -4
  904. package/docs/ru/intlayer_with_astro_vue.md +112 -4
  905. package/docs/ru/intlayer_with_create_react_app.md +107 -2
  906. package/docs/ru/intlayer_with_elysia.md +121 -1
  907. package/docs/ru/intlayer_with_express.md +115 -1
  908. package/docs/ru/intlayer_with_fastify.md +115 -1
  909. package/docs/ru/intlayer_with_hono.md +115 -1
  910. package/docs/ru/intlayer_with_htmx.md +767 -0
  911. package/docs/ru/intlayer_with_lynx+react.md +0 -7
  912. package/docs/ru/intlayer_with_nestjs.md +115 -1
  913. package/docs/ru/intlayer_with_nextjs_14.md +138 -114
  914. package/docs/ru/intlayer_with_nextjs_15.md +123 -62
  915. package/docs/ru/intlayer_with_nextjs_16.md +122 -45
  916. package/docs/ru/intlayer_with_nextjs_compiler.md +123 -14
  917. package/docs/ru/intlayer_with_nextjs_no_locale_path.md +115 -3
  918. package/docs/ru/intlayer_with_nextjs_page_router.md +110 -95
  919. package/docs/ru/intlayer_with_nuxt.md +104 -2
  920. package/docs/ru/intlayer_with_react_native+expo.md +103 -8
  921. package/docs/ru/intlayer_with_react_router_v7.md +113 -4
  922. package/docs/ru/intlayer_with_react_router_v7_fs_routes.md +111 -4
  923. package/docs/ru/intlayer_with_solid_start.md +117 -2
  924. package/docs/ru/intlayer_with_storybook.md +0 -13
  925. package/docs/ru/intlayer_with_svelte_kit.md +99 -2
  926. package/docs/ru/intlayer_with_tanstack+solid.md +119 -16
  927. package/docs/ru/intlayer_with_tanstack.md +230 -151
  928. package/docs/ru/intlayer_with_vanilla.md +111 -3
  929. package/docs/ru/intlayer_with_vite+lit.md +113 -2
  930. package/docs/ru/intlayer_with_vite+preact.md +143 -34
  931. package/docs/ru/intlayer_with_vite+react.md +102 -14
  932. package/docs/ru/intlayer_with_vite+react_compiler.md +107 -2
  933. package/docs/ru/intlayer_with_vite+solid.md +114 -2
  934. package/docs/ru/intlayer_with_vite+svelte.md +115 -12
  935. package/docs/ru/intlayer_with_vite+vanilla.md +119 -2
  936. package/docs/ru/intlayer_with_vite+vue.md +99 -3
  937. package/docs/ru/introduction.md +105 -2
  938. package/docs/ru/migration_from_i18next_to_intlayer.md +0 -2
  939. package/docs/ru/migration_from_next-i18next_to_intlayer.md +0 -2
  940. package/docs/ru/migration_from_next-intl_to_intlayer.md +0 -2
  941. package/docs/ru/migration_from_nuxtjs_i18n_to_intlayer.md +0 -2
  942. package/docs/ru/migration_from_react-i18next_to_intlayer.md +0 -2
  943. package/docs/ru/migration_from_vue-i18n_to_intlayer.md +0 -2
  944. package/docs/ru/packages/vite-intlayer/intlayerMinify.md +1 -1
  945. package/docs/tr/analytics.md +488 -21
  946. package/docs/tr/cli/doc-review.md +0 -2
  947. package/docs/tr/configuration.md +98 -0
  948. package/docs/tr/dictionary/content_file.md +4 -4
  949. package/docs/tr/dictionary/markdown.md +3 -0
  950. package/docs/tr/dictionary/plurial.md +6 -3
  951. package/docs/tr/how_works_intlayer.md +92 -0
  952. package/docs/tr/interest_of_intlayer.md +96 -1
  953. package/docs/tr/intlayer_CMS.md +92 -0
  954. package/docs/tr/intlayer_visual_editor.md +87 -1
  955. package/docs/tr/intlayer_with_adonisjs.md +121 -0
  956. package/docs/tr/intlayer_with_analog.md +109 -1
  957. package/docs/tr/intlayer_with_angular_19.md +108 -1
  958. package/docs/tr/intlayer_with_angular_21.md +102 -1
  959. package/docs/tr/intlayer_with_astro.md +117 -27
  960. package/docs/tr/intlayer_with_astro_lit.md +111 -3
  961. package/docs/tr/intlayer_with_astro_preact.md +111 -3
  962. package/docs/tr/intlayer_with_astro_react.md +111 -3
  963. package/docs/tr/intlayer_with_astro_solid.md +111 -3
  964. package/docs/tr/intlayer_with_astro_svelte.md +111 -3
  965. package/docs/tr/intlayer_with_astro_vanilla.md +105 -3
  966. package/docs/tr/intlayer_with_astro_vue.md +111 -3
  967. package/docs/tr/intlayer_with_create_react_app.md +106 -1
  968. package/docs/tr/intlayer_with_elysia.md +121 -0
  969. package/docs/tr/intlayer_with_express.md +114 -0
  970. package/docs/tr/intlayer_with_fastify.md +115 -0
  971. package/docs/tr/intlayer_with_hono.md +114 -0
  972. package/docs/tr/intlayer_with_htmx.md +761 -0
  973. package/docs/tr/intlayer_with_lynx+react.md +0 -7
  974. package/docs/tr/intlayer_with_nestjs.md +115 -0
  975. package/docs/tr/intlayer_with_nextjs_14.md +125 -51
  976. package/docs/tr/intlayer_with_nextjs_15.md +119 -44
  977. package/docs/tr/intlayer_with_nextjs_16.md +120 -43
  978. package/docs/tr/intlayer_with_nextjs_compiler.md +121 -13
  979. package/docs/tr/intlayer_with_nextjs_no_locale_path.md +114 -2
  980. package/docs/tr/intlayer_with_nextjs_page_router.md +124 -120
  981. package/docs/tr/intlayer_with_nuxt.md +103 -1
  982. package/docs/tr/intlayer_with_react_native+expo.md +102 -7
  983. package/docs/tr/intlayer_with_react_router_v7.md +112 -3
  984. package/docs/tr/intlayer_with_react_router_v7_fs_routes.md +110 -3
  985. package/docs/tr/intlayer_with_solid_start.md +115 -1
  986. package/docs/tr/intlayer_with_storybook.md +0 -13
  987. package/docs/tr/intlayer_with_svelte_kit.md +98 -1
  988. package/docs/tr/intlayer_with_tanstack+solid.md +117 -15
  989. package/docs/tr/intlayer_with_tanstack.md +259 -128
  990. package/docs/tr/intlayer_with_vanilla.md +110 -2
  991. package/docs/tr/intlayer_with_vite+lit.md +111 -1
  992. package/docs/tr/intlayer_with_vite+preact.md +141 -33
  993. package/docs/tr/intlayer_with_vite+react.md +100 -3
  994. package/docs/tr/intlayer_with_vite+react_compiler.md +106 -1
  995. package/docs/tr/intlayer_with_vite+solid.md +112 -1
  996. package/docs/tr/intlayer_with_vite+svelte.md +111 -1
  997. package/docs/tr/intlayer_with_vite+vanilla.md +118 -1
  998. package/docs/tr/intlayer_with_vite+vue.md +99 -4
  999. package/docs/tr/introduction.md +104 -1
  1000. package/docs/tr/migration_from_i18next_to_intlayer.md +0 -2
  1001. package/docs/tr/migration_from_next-i18next_to_intlayer.md +0 -2
  1002. package/docs/tr/migration_from_next-intl_to_intlayer.md +0 -2
  1003. package/docs/tr/migration_from_nuxtjs_i18n_to_intlayer.md +0 -2
  1004. package/docs/tr/migration_from_react-i18next_to_intlayer.md +0 -2
  1005. package/docs/tr/migration_from_vue-i18n_to_intlayer.md +0 -2
  1006. package/docs/tr/packages/vite-intlayer/intlayerMinify.md +1 -1
  1007. package/docs/uk/analytics.md +488 -21
  1008. package/docs/uk/configuration.md +98 -0
  1009. package/docs/uk/dictionary/content_file.md +4 -4
  1010. package/docs/uk/dictionary/markdown.md +3 -0
  1011. package/docs/uk/dictionary/plurial.md +6 -3
  1012. package/docs/uk/how_works_intlayer.md +92 -0
  1013. package/docs/uk/interest_of_intlayer.md +96 -1
  1014. package/docs/uk/intlayer_CMS.md +92 -0
  1015. package/docs/uk/intlayer_visual_editor.md +87 -1
  1016. package/docs/uk/intlayer_with_adonisjs.md +121 -0
  1017. package/docs/uk/intlayer_with_analog.md +109 -1
  1018. package/docs/uk/intlayer_with_angular_19.md +108 -1
  1019. package/docs/uk/intlayer_with_angular_21.md +102 -1
  1020. package/docs/uk/intlayer_with_astro.md +110 -13
  1021. package/docs/uk/intlayer_with_astro_lit.md +111 -3
  1022. package/docs/uk/intlayer_with_astro_preact.md +111 -3
  1023. package/docs/uk/intlayer_with_astro_react.md +111 -3
  1024. package/docs/uk/intlayer_with_astro_solid.md +111 -3
  1025. package/docs/uk/intlayer_with_astro_svelte.md +111 -3
  1026. package/docs/uk/intlayer_with_astro_vanilla.md +105 -3
  1027. package/docs/uk/intlayer_with_astro_vue.md +111 -3
  1028. package/docs/uk/intlayer_with_create_react_app.md +106 -1
  1029. package/docs/uk/intlayer_with_elysia.md +121 -0
  1030. package/docs/uk/intlayer_with_express.md +114 -0
  1031. package/docs/uk/intlayer_with_fastify.md +115 -0
  1032. package/docs/uk/intlayer_with_hono.md +114 -0
  1033. package/docs/uk/intlayer_with_htmx.md +760 -0
  1034. package/docs/uk/intlayer_with_lynx+react.md +0 -7
  1035. package/docs/uk/intlayer_with_nestjs.md +115 -0
  1036. package/docs/uk/intlayer_with_nextjs_14.md +119 -44
  1037. package/docs/uk/intlayer_with_nextjs_15.md +133 -56
  1038. package/docs/uk/intlayer_with_nextjs_16.md +121 -44
  1039. package/docs/uk/intlayer_with_nextjs_compiler.md +122 -14
  1040. package/docs/uk/intlayer_with_nextjs_no_locale_path.md +114 -2
  1041. package/docs/uk/intlayer_with_nextjs_page_router.md +111 -96
  1042. package/docs/uk/intlayer_with_nuxt.md +103 -1
  1043. package/docs/uk/intlayer_with_react_native+expo.md +102 -7
  1044. package/docs/uk/intlayer_with_react_router_v7.md +112 -3
  1045. package/docs/uk/intlayer_with_react_router_v7_fs_routes.md +110 -3
  1046. package/docs/uk/intlayer_with_solid_start.md +115 -1
  1047. package/docs/uk/intlayer_with_storybook.md +0 -13
  1048. package/docs/uk/intlayer_with_svelte_kit.md +98 -1
  1049. package/docs/uk/intlayer_with_tanstack+solid.md +117 -15
  1050. package/docs/uk/intlayer_with_tanstack.md +235 -132
  1051. package/docs/uk/intlayer_with_vanilla.md +110 -2
  1052. package/docs/uk/intlayer_with_vite+lit.md +111 -1
  1053. package/docs/uk/intlayer_with_vite+preact.md +167 -31
  1054. package/docs/uk/intlayer_with_vite+react.md +101 -13
  1055. package/docs/uk/intlayer_with_vite+react_compiler.md +106 -1
  1056. package/docs/uk/intlayer_with_vite+solid.md +112 -1
  1057. package/docs/uk/intlayer_with_vite+svelte.md +111 -1
  1058. package/docs/uk/intlayer_with_vite+vanilla.md +118 -1
  1059. package/docs/uk/intlayer_with_vite+vue.md +97 -1
  1060. package/docs/uk/introduction.md +104 -1
  1061. package/docs/uk/migration_from_i18next_to_intlayer.md +0 -2
  1062. package/docs/uk/migration_from_next-i18next_to_intlayer.md +0 -2
  1063. package/docs/uk/migration_from_next-intl_to_intlayer.md +0 -2
  1064. package/docs/uk/migration_from_nuxtjs_i18n_to_intlayer.md +0 -2
  1065. package/docs/uk/migration_from_react-i18next_to_intlayer.md +0 -2
  1066. package/docs/uk/migration_from_vue-i18n_to_intlayer.md +0 -2
  1067. package/docs/uk/packages/vite-intlayer/intlayerMinify.md +1 -1
  1068. package/docs/ur/intlayer_with_storybook.md +0 -12
  1069. package/docs/ur/intlayer_with_vanilla.md +2 -1
  1070. package/docs/ur/introduction.md +0 -1
  1071. package/docs/vi/analytics.md +488 -21
  1072. package/docs/vi/configuration.md +98 -0
  1073. package/docs/vi/dictionary/content_file.md +4 -4
  1074. package/docs/vi/dictionary/markdown.md +3 -0
  1075. package/docs/vi/dictionary/plurial.md +5 -2
  1076. package/docs/vi/how_works_intlayer.md +92 -0
  1077. package/docs/vi/interest_of_intlayer.md +96 -1
  1078. package/docs/vi/intlayer_CMS.md +92 -0
  1079. package/docs/vi/intlayer_visual_editor.md +87 -1
  1080. package/docs/vi/intlayer_with_adonisjs.md +121 -0
  1081. package/docs/vi/intlayer_with_analog.md +109 -1
  1082. package/docs/vi/intlayer_with_angular_19.md +108 -1
  1083. package/docs/vi/intlayer_with_angular_21.md +102 -1
  1084. package/docs/vi/intlayer_with_astro.md +110 -13
  1085. package/docs/vi/intlayer_with_astro_lit.md +111 -3
  1086. package/docs/vi/intlayer_with_astro_preact.md +111 -3
  1087. package/docs/vi/intlayer_with_astro_react.md +111 -3
  1088. package/docs/vi/intlayer_with_astro_solid.md +111 -3
  1089. package/docs/vi/intlayer_with_astro_svelte.md +111 -3
  1090. package/docs/vi/intlayer_with_astro_vanilla.md +105 -3
  1091. package/docs/vi/intlayer_with_astro_vue.md +111 -3
  1092. package/docs/vi/intlayer_with_create_react_app.md +106 -1
  1093. package/docs/vi/intlayer_with_elysia.md +121 -0
  1094. package/docs/vi/intlayer_with_express.md +114 -0
  1095. package/docs/vi/intlayer_with_fastify.md +115 -0
  1096. package/docs/vi/intlayer_with_hono.md +114 -0
  1097. package/docs/vi/intlayer_with_htmx.md +760 -0
  1098. package/docs/vi/intlayer_with_lynx+react.md +0 -7
  1099. package/docs/vi/intlayer_with_nestjs.md +115 -0
  1100. package/docs/vi/intlayer_with_nextjs_14.md +133 -53
  1101. package/docs/vi/intlayer_with_nextjs_15.md +133 -56
  1102. package/docs/vi/intlayer_with_nextjs_16.md +121 -44
  1103. package/docs/vi/intlayer_with_nextjs_compiler.md +122 -14
  1104. package/docs/vi/intlayer_with_nextjs_no_locale_path.md +114 -2
  1105. package/docs/vi/intlayer_with_nextjs_page_router.md +111 -92
  1106. package/docs/vi/intlayer_with_nuxt.md +103 -1
  1107. package/docs/vi/intlayer_with_react_native+expo.md +102 -7
  1108. package/docs/vi/intlayer_with_react_router_v7.md +112 -3
  1109. package/docs/vi/intlayer_with_react_router_v7_fs_routes.md +116 -16
  1110. package/docs/vi/intlayer_with_solid_start.md +115 -1
  1111. package/docs/vi/intlayer_with_storybook.md +0 -13
  1112. package/docs/vi/intlayer_with_svelte_kit.md +98 -1
  1113. package/docs/vi/intlayer_with_tanstack+solid.md +117 -15
  1114. package/docs/vi/intlayer_with_tanstack.md +249 -169
  1115. package/docs/vi/intlayer_with_vanilla.md +110 -2
  1116. package/docs/vi/intlayer_with_vite+lit.md +111 -1
  1117. package/docs/vi/intlayer_with_vite+preact.md +147 -14
  1118. package/docs/vi/intlayer_with_vite+react.md +101 -13
  1119. package/docs/vi/intlayer_with_vite+react_compiler.md +106 -1
  1120. package/docs/vi/intlayer_with_vite+solid.md +112 -1
  1121. package/docs/vi/intlayer_with_vite+svelte.md +111 -1
  1122. package/docs/vi/intlayer_with_vite+vanilla.md +118 -1
  1123. package/docs/vi/intlayer_with_vite+vue.md +97 -1
  1124. package/docs/vi/introduction.md +104 -1
  1125. package/docs/vi/migration_from_i18next_to_intlayer.md +0 -2
  1126. package/docs/vi/migration_from_next-i18next_to_intlayer.md +0 -2
  1127. package/docs/vi/migration_from_next-intl_to_intlayer.md +0 -2
  1128. package/docs/vi/migration_from_nuxtjs_i18n_to_intlayer.md +0 -2
  1129. package/docs/vi/migration_from_react-i18next_to_intlayer.md +0 -2
  1130. package/docs/vi/migration_from_vue-i18n_to_intlayer.md +0 -2
  1131. package/docs/vi/packages/vite-intlayer/intlayerMinify.md +1 -1
  1132. package/docs/zh/analytics.md +458 -12
  1133. package/docs/zh/configuration.md +99 -1
  1134. package/docs/zh/dictionary/content_file.md +4 -4
  1135. package/docs/zh/dictionary/markdown.md +18 -1
  1136. package/docs/zh/dictionary/plurial.md +6 -3
  1137. package/docs/zh/how_works_intlayer.md +93 -1
  1138. package/docs/zh/interest_of_intlayer.md +108 -13
  1139. package/docs/zh/intlayer_CMS.md +93 -1
  1140. package/docs/zh/intlayer_visual_editor.md +88 -2
  1141. package/docs/zh/intlayer_with_adonisjs.md +121 -1
  1142. package/docs/zh/intlayer_with_analog.md +118 -9
  1143. package/docs/zh/intlayer_with_angular_19.md +117 -10
  1144. package/docs/zh/intlayer_with_angular_21.md +110 -9
  1145. package/docs/zh/intlayer_with_astro.md +108 -4
  1146. package/docs/zh/intlayer_with_astro_lit.md +114 -7
  1147. package/docs/zh/intlayer_with_astro_preact.md +114 -7
  1148. package/docs/zh/intlayer_with_astro_react.md +114 -7
  1149. package/docs/zh/intlayer_with_astro_solid.md +114 -7
  1150. package/docs/zh/intlayer_with_astro_svelte.md +114 -7
  1151. package/docs/zh/intlayer_with_astro_vanilla.md +108 -7
  1152. package/docs/zh/intlayer_with_astro_vue.md +114 -7
  1153. package/docs/zh/intlayer_with_create_react_app.md +110 -6
  1154. package/docs/zh/intlayer_with_elysia.md +121 -1
  1155. package/docs/zh/intlayer_with_express.md +115 -1
  1156. package/docs/zh/intlayer_with_fastify.md +115 -1
  1157. package/docs/zh/intlayer_with_hono.md +115 -1
  1158. package/docs/zh/intlayer_with_htmx.md +769 -0
  1159. package/docs/zh/intlayer_with_lynx+react.md +8 -13
  1160. package/docs/zh/intlayer_with_nestjs.md +115 -1
  1161. package/docs/zh/intlayer_with_nextjs_14.md +120 -45
  1162. package/docs/zh/intlayer_with_nextjs_15.md +121 -44
  1163. package/docs/zh/intlayer_with_nextjs_16.md +121 -42
  1164. package/docs/zh/intlayer_with_nextjs_compiler.md +121 -14
  1165. package/docs/zh/intlayer_with_nextjs_no_locale_path.md +122 -10
  1166. package/docs/zh/intlayer_with_nextjs_page_router.md +110 -94
  1167. package/docs/zh/intlayer_with_nuxt.md +111 -9
  1168. package/docs/zh/intlayer_with_react_native+expo.md +103 -8
  1169. package/docs/zh/intlayer_with_react_router_v7.md +131 -28
  1170. package/docs/zh/intlayer_with_react_router_v7_fs_routes.md +134 -30
  1171. package/docs/zh/intlayer_with_solid_start.md +122 -7
  1172. package/docs/zh/intlayer_with_storybook.md +7 -20
  1173. package/docs/zh/intlayer_with_svelte_kit.md +106 -9
  1174. package/docs/zh/intlayer_with_tanstack+solid.md +129 -29
  1175. package/docs/zh/intlayer_with_tanstack.md +251 -191
  1176. package/docs/zh/intlayer_with_vanilla.md +118 -10
  1177. package/docs/zh/intlayer_with_vite+lit.md +121 -8
  1178. package/docs/zh/intlayer_with_vite+preact.md +150 -41
  1179. package/docs/zh/intlayer_with_vite+react.md +104 -12
  1180. package/docs/zh/intlayer_with_vite+react_compiler.md +107 -2
  1181. package/docs/zh/intlayer_with_vite+solid.md +113 -2
  1182. package/docs/zh/intlayer_with_vite+svelte.md +127 -14
  1183. package/docs/zh/intlayer_with_vite+vanilla.md +126 -9
  1184. package/docs/zh/intlayer_with_vite+vue.md +99 -3
  1185. package/docs/zh/introduction.md +105 -2
  1186. package/docs/zh/migration_from_i18next_to_intlayer.md +0 -2
  1187. package/docs/zh/migration_from_next-i18next_to_intlayer.md +0 -2
  1188. package/docs/zh/migration_from_next-intl_to_intlayer.md +0 -2
  1189. package/docs/zh/migration_from_nuxtjs_i18n_to_intlayer.md +0 -2
  1190. package/docs/zh/migration_from_react-i18next_to_intlayer.md +0 -2
  1191. package/docs/zh/migration_from_vue-i18n_to_intlayer.md +0 -2
  1192. package/docs/zh/packages/vite-intlayer/intlayerMinify.md +1 -1
  1193. package/docs/zh/releases/v6.md +1 -1
  1194. package/docs/zh-TW/introduction.md +0 -1
  1195. package/package.json +7 -7
  1196. package/src/common.ts +45 -18
  1197. package/src/generated/blog.entry.ts +20 -0
  1198. package/src/generated/docs.entry.ts +20 -0
@@ -0,0 +1,314 @@
1
+ ---
2
+ createdAt: 2026-08-29
3
+ updatedAt: 2026-08-29
4
+ title: "Hreflang,多语言 SEO 指南"
5
+ description: "什么是 hreflang,搜索引擎强制执行的规则,为什么 x-default 几乎总是错误的,以及如何在 Next.js 和 TanStack Start 中生成正确的标签。"
6
+ keywords:
7
+ - hreflang
8
+ - SEO
9
+ - Internationalization
10
+ - Intlayer
11
+ - i18n
12
+ - Sitemap
13
+ - Canonical
14
+ - Next.js
15
+ - TanStack Start
16
+ slugs:
17
+ - blog
18
+ - hreflang-guide-multilingual-seo
19
+ author: aymericzip
20
+ ---
21
+
22
+ # Hreflang:多语言 SEO 指南
23
+
24
+ 你翻译了你的应用。你发布了 `/en`、`/fr`、`/es`。但法语用户仍然登录到英文页面。
25
+
26
+ 翻译很容易。困难的一半是告诉搜索引擎这些页面是**同一页面的其他语言版本**,而不是三个相互竞争的文档。这就是 `hreflang` 的作用,也是大多数多语言网站悄悄失去流量的地方。
27
+
28
+ ---
29
+
30
+ ## hreflang 实际上是什么
31
+
32
+ 一个页面上的注释,说:_这个 URL 在那里有等效的版本,适用于那些语言。_
33
+
34
+ ```html
35
+ <link rel="alternate" hreflang="en" href="https://example.com/about" />
36
+ <link rel="alternate" hreflang="fr" href="https://example.com/fr/about" />
37
+ <link rel="alternate" hreflang="es" href="https://example.com/es/about" />
38
+ <link rel="alternate" hreflang="x-default" href="https://example.com/about" />
39
+ ```
40
+
41
+ 它为你争取两样东西:为合适的用户展示正确的版本,以及将你的多语言版本合并到一个集群中,而不是作为重复内容互相蚕食。
42
+
43
+ 需要明确的是它不是什么。它**不是重定向**——它是一个提示,Google 可能会覆盖它。它**不是排名提升**——它改变的是_哪个_版本排名,而不是_是否_排名。而且 Bing 完全忽略它,而是依赖 `content-language` 和地理定位。
44
+
45
+ ---
46
+
47
+ ## 在哪里声明它
48
+
49
+ 三种放置方式,都有效。选择一种并坚持——同一个集群在两个地方声明是集合漂移的原因。
50
+
51
+ **HTML `<head>`** 是通常的选择。一个需要注意的问题:水合后注入的标签是不可靠的。如果你的框架只在客户端添加它们,爬虫可能永远看不到它们。
52
+
53
+ **XML sitemap** 在大规模使用中更有优势。十个语言版本跨越 5,000 页面意味着需要向浏览器发送 50,000 个 `<link>` 元素,而这些元素对页面毫无用处;在 sitemap 中它不会占用页面的任何字节。
54
+
55
+ **HTTP `Link` header** 是唯一适用于 PDF 等非 HTML 文件的选项。
56
+
57
+ ---
58
+
59
+ ## 规则
60
+
61
+ ### 自我引用和互惠性
62
+
63
+ 设置在 `/fr/about` 上必须包含指向 `/fr/about` 的 `hreflang="fr"`。如果 `/about` 指向 `/fr/about`,那么 `/fr/about` 也必须指回去。Google 将单向引用称为"no return tag"并将其丢弃。
64
+
65
+ 实际上这意味着**集群中的每一页都必须发送相同的链接集**。从一个共享的语言列表生成它们不仅仅是一种便利,一旦你拥有超过两个语言版本,这是保持正确性的唯一方式。
66
+
67
+ ### 始终使用绝对 URL
68
+
69
+ ```html
70
+ <!-- 被默认忽略 -->
71
+ <link rel="alternate" hreflang="fr" href="/fr/about" />
72
+
73
+ <!-- 正确 -->
74
+ <link rel="alternate" hreflang="fr" href="https://example.com/fr/about" />
75
+ ```
76
+
77
+ 这个原因值得理解而不仅仅是记忆。`hreflang` 是一个跨文档引用:搜索引擎构建一个由 URL 键值的集群,在集群中的每一页都共享这个集群。相对路径只有相对于它所在的文档才有意义,因此它无法表达这一点。它也无法跨越主机——而替代版本通常会这样做,当一个语言版本存在于 `example.fr` 或 `fr.example.com` 时。在 sitemap 或 HTTP 头中,根本没有可以用来解析的基础文档。
78
+
79
+ 这在代码中有直接的后果。`getLocalizedUrl("/about", "fr")` 返回 `/fr/about` — 相对路径输入,相对路径输出。对于 `hreflang`,你必须向其提供绝对 URL:
80
+
81
+ ```ts
82
+ getLocalizedUrl("/about", "fr"); // → "/fr/about" ❌ 被丢弃
83
+ getLocalizedUrl("https://example.com/about", "fr"); // → "https://example.com/fr/about" ✅
84
+ ```
85
+
86
+ 唯一的例外是一个框架在渲染之前为你解析相对值:Next.js 根据 `metadataBase` 展开相对的 `alternates`。没问题 — 但规则适用于**发出的 HTML**,所以用 `curl` 检查,而不是 DevTools 检查器。
87
+
88
+ ### 语言代码
89
+
90
+ ISO 639-1 用于语言,ISO 3166-1 Alpha 2 用于可选的地区:`fr`、`fr-CA`、`pt-BR`。
91
+
92
+ 两个陷阱几乎会困住每个人。单独的地区代码是无效的——`hreflang="ca"` 表示加泰罗尼亚语,而不是加拿大;你需要 `en-CA` 或 `fr-CA`。而 `en-UK` 不存在:英国的国家代码是 `GB`,所以是 `en-GB`。
93
+
94
+ 只有在你确实为该地区提供不同内容时才添加地区——不同的价格、不同的法律声明。`fr` 和 `fr-FR` 在相同内容上是冗余的。
95
+
96
+ ### x-default
97
+
98
+ ```html
99
+ <link rel="alternate" hreflang="x-default" href="https://example.com/" />
100
+ ```
101
+
102
+ 最容易被遗忘且最容易被误解的一个概念是 `x-default`——少于 30% 的应用正确实现它。
103
+
104
+ 这是用户语言与你的集合中任何内容都不匹配时的回退方案。荷兰语使用者访问仅提供英语、法语和西班牙语的网站时无法匹配任何条目;没有 `x-default`,Google 会为你做出选择。
105
+
106
+ 人们经常误解的是它的含义。`x-default` **不是"英文版本"** 也 **不是"默认 locale"**,尽管它通常指向那里。它的意思是 _这个集合不覆盖的用户的页面_。这就是为什么让它指向语言选择器或地理重定向登陆页面是合理的,通常也更好——而不是指向 `/en`。如果你没有这样的页面,你的主要语言是明智的选择。
107
+
108
+ 两件事需要区分清楚:`x-default` 是该集合中的一个额外条目,而不是自引用条目的替代品,而且像其他每个条目一样,它必须在集群中的每个页面上完全相同地出现。
109
+
110
+ ---
111
+
112
+ ## canonical 陷阱
113
+
114
+ 每个本地化页面必须**是它自己的 canonical**:
115
+
116
+ ```html
117
+ <!-- 在 https://example.com/fr/about -->
118
+ <link rel="canonical" href="https://example.com/fr/about" />
119
+ <link rel="alternate" hreflang="fr" href="https://example.com/fr/about" />
120
+ <link rel="alternate" hreflang="en" href="https://example.com/about" />
121
+ ```
122
+
123
+ 将每个语言版本的 canonical 都指向英文版本反而会这样做:
124
+
125
+ ```html
126
+ <!-- 在 https://example.com/fr/about — 会破坏该页面 -->
127
+ <link rel="canonical" href="https://example.com/about" />
128
+ ```
129
+
130
+ 表示法语页面是不应被索引的重复内容,而 `hreflang` 则表示这是应该提供给法语用户的页面。这些信号相互矛盾,canonical 优先级更高,结果是你的法语页面会被从索引中移除。
131
+
132
+ **Canonical 在每个语言版本中是自引用的。`hreflang` 描述的是整个集群。**
133
+
134
+ ---
135
+
136
+ ## 选择 URL 结构
137
+
138
+ `hreflang` 对 URL 进行注释,所以结构应该优先考虑。
139
+
140
+ | 结构 | 示例 | 权衡 |
141
+ | ---------- | ----------------- | ------------------------------------------------- |
142
+ | **子目录** | `example.com/fr/` | 一个域名,权限共享 — 地理信号较弱 |
143
+ | **子域名** | `fr.example.com` | 易于添加或删除语言版本 — 可能看起来像一个独立网站 |
144
+ | **ccTLDs** | `example.fr` | 最强的国家信号 — 每个域名建立权限 |
145
+
146
+ 对大多数项目来说,子目录是正确的默认选择。只有当你真正以独立的国家业务运营时,才应该考虑使用 ccTLDs。
147
+
148
+ 应该避免的一个结构是:基于 `Accept-Language` 或 IP 在**同一 URL** 上提供不同的语言。爬虫会看到一个版本并索引一个版本;其他所有内容都是不可见的。
149
+
150
+ > Intlayer 通过 `routing.mode` 和 `routing.domains` 支持这三种方式。参见[自定义域名](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/custom_domains.md)和[配置参考](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/configuration.md)。
151
+
152
+ ---
153
+
154
+ ## 实现
155
+
156
+ 手动编写这些标签无法在添加第二种语言时保持一致。应该从你的语言列表中派生它们。
157
+
158
+ <Steps>
159
+
160
+ <Step number={1} title="在每个页面上发出集群">
161
+
162
+ 相同的集合到处都有,每个语言环境的规范链接,绝对URL,包括 `x-default`。
163
+
164
+ <Tabs>
165
+
166
+ <Tab label="Next.js" value="nextjs">
167
+
168
+ Metadata API 暴露 `alternates.languages`,而 `getMultilingualUrls` 从你配置的语言环境构建整个记录:
169
+
170
+ ```tsx fileName="src/app/[locale]/about/page.tsx"
171
+ import { getMultilingualUrls } from "intlayer";
172
+ import type { Metadata } from "next";
173
+ import type { LocalPromiseParams } from "next-intlayer";
174
+
175
+ const SITE_URL = "https://example.com";
176
+
177
+ export const generateMetadata = async ({
178
+ params,
179
+ }: LocalPromiseParams): Promise<Metadata> => {
180
+ const { locale } = await params;
181
+
182
+ /**
183
+ * getMultilingualUrls(`${SITE_URL}/about`) 返回:
184
+ * {
185
+ * en: 'https://example.com/about',
186
+ * fr: 'https://example.com/fr/about',
187
+ * es: 'https://example.com/es/about',
188
+ * }
189
+ */
190
+ const multilingualUrls = getMultilingualUrls(`${SITE_URL}/about`);
191
+
192
+ return {
193
+ alternates: {
194
+ canonical: multilingualUrls[locale as keyof typeof multilingualUrls],
195
+ languages: { ...multilingualUrls, "x-default": `${SITE_URL}/about` },
196
+ },
197
+ };
198
+ };
199
+ ```
200
+
201
+ 完整设置: [Next.js 16 i18n 指南](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/intlayer_with_nextjs_16.md)。
202
+
203
+ </Tab>
204
+
205
+ <Tab label="TanStack Start" value="tanstack">
206
+
207
+ 路由的 `head` 函数构建链接。`localeMap` 遍历你配置的语言环境,所以向配置中添加一个语言环境会在所有地方同时添加它:
208
+
209
+ ```tsx fileName="src/routes/{-$locale}/about.tsx"
210
+ import { createFileRoute } from "@tanstack/react-router";
211
+ import { defaultLocale, getLocalizedUrl, localeMap } from "intlayer";
212
+
213
+ const SITE_URL = "https://example.com";
214
+
215
+ export const Route = createFileRoute("/{-$locale}/about")({
216
+ head: ({ params }) => {
217
+ const { locale = defaultLocale } = params;
218
+ const url = `${SITE_URL}/about`;
219
+
220
+ return {
221
+ links: [
222
+ { rel: "canonical", href: getLocalizedUrl(url, locale) },
223
+
224
+ ...localeMap(({ locale: mapLocale }) => ({
225
+ rel: "alternate",
226
+ hrefLang: mapLocale,
227
+ href: getLocalizedUrl(url, mapLocale),
228
+ })),
229
+
230
+ {
231
+ rel: "alternate",
232
+ hrefLang: "x-default",
233
+ href: getLocalizedUrl(url, defaultLocale),
234
+ },
235
+ ],
236
+ };
237
+ },
238
+ });
239
+ ```
240
+
241
+ `head` 在服务器上运行,因此标签会被插入初始 HTML 中。完整配置:[TanStack Start i18n 指南](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/intlayer_with_tanstack.md)。
242
+
243
+ </Tab>
244
+
245
+ </Tabs>
246
+
247
+ </Step>
248
+
249
+ <Step number={2} title="或将其全部移至站点地图">
250
+
251
+ 大规模应用时,将注解完全从页面中移出。`generateSitemap` 根据配置读取 locale 和路由模式,为每个条目生成 `xhtml:link` 备用链接:
252
+
253
+ ```ts fileName="src/routes/sitemap[.]xml.ts"
254
+ import { generateSitemap } from "intlayer";
255
+
256
+ const sitemap = generateSitemap(
257
+ [
258
+ { path: "/", changefreq: "daily", priority: 1.0 },
259
+ { path: "/about", changefreq: "monthly", priority: 0.8 },
260
+ ],
261
+ { siteUrl: "https://example.com" }
262
+ );
263
+ ```
264
+
265
+ 两个值得了解的选项:
266
+
267
+ - `xhtmlLinks` (默认值 `true`) — 只有在 locale URL 实际不同时,才会发出交替链接。在 `no-prefix` 模式下,每个 locale 共享一个 URL,因此除非 `routing.domains` 为 locale 分配自己的主机名,否则会被跳过。
268
+ - `entryPerLocale`(默认值 `false`)—— 默认情况下,一个 `<url>` 条目包含所有的备用语言版本。两种形式都是有效的,但只有列在 `<loc>` 中的 URL 才会在 Search Console 中被计算为**已提交**;仅作为备用语言的区域设置会保持可发现性但不会被归属到任何 sitemap。启用此选项会为每个本地化 URL 提供其自己的条目,并重复完整的备用语言集。这会按区域设置计数增加条目,因此需要注意 50,000 个 URL / 50 MB 的限制,超过后应分割为 sitemap 索引。
269
+
270
+ </Step>
271
+
272
+ <Step number={3} title="验证爬虫接收到的内容">
273
+
274
+ `hreflang` 会无声地失败,因此应该检查它而不是假设它有效。
275
+
276
+ 读取源代码,而不是检查器 — `curl https://example.com/fr/about | grep hreflang` 显示爬虫获取的内容;DevTools 显示 JavaScript 运行后的 DOM。然后跟随每个备用链接,确认它使用相同的集合指向回来,并且它们都不重定向。Search Console 的国际定位报告捕获整个站点中的其余部分。
277
+
278
+ 对于多语言特定的爬取,[Intlayer SEO Scanner](https://intlayer.org/i18n-seo-scanner) 检查本地化页面中的缺失标签、损坏的备用链接和规范冲突。
279
+
280
+ </Step>
281
+
282
+ </Steps>
283
+
284
+ ---
285
+
286
+ ## 检查清单
287
+
288
+ - [ ] 每个地区都有一个独特的、可爬取的 URL
289
+ - [ ] 每个页面自引用,并且每个引用都是相互的
290
+ - [ ] 相同的集合在集群中的每个页面上发布
291
+ - [ ] 所有 `href` 值在生成的 HTML 中都是绝对路径
292
+ - [ ] 代码遵循 ISO 639-1 + ISO 3166-1 Alpha 2 标准(`en-GB`,而非 `en-UK`)
293
+ - [ ] `x-default` 存在,并指向未匹配用户应访问的位置
294
+ - [ ] 规范标签在每个 locale 中自引用
295
+ - [ ] 标签是服务端渲染的,不是 hydration 后注入的
296
+ - [ ] 在恰好一个位置声明
297
+ - [ ] 没有跨 locale 的重定向
298
+
299
+ ---
300
+
301
+ ## 总结
302
+
303
+ `hreflang` 简单但容不得半点差错。一个缺失的返回标签、一个相对 URL、一个跨 locale 的规范标签,整个集群就会被丢弃且不会报错。这些问题通常都源于手工编写标签。
304
+
305
+ 从单个 locale 列表派生集合,进行服务器端渲染,保持 canonical 自引用,并给予 `x-default` 应有的重视。做好这一次,正确性就不再是你需要维护的东西。
306
+
307
+ ### 深入了解
308
+
309
+ - [SEO 和国际化](https://github.com/aymericzip/intlayer/blob/main/docs/blog/zh/internationalization_and_SEO.md) — 更广泛的多语言 SEO 图景
310
+ - [Next.js 中的 SEO 和 i18n](https://github.com/aymericzip/intlayer/blob/main/docs/blog/zh/nextjs-multilingual-seo-comparison.md) — `next-intl` vs `next-i18next` vs Intlayer
311
+ - [Next.js 16 i18n 指南](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/intlayer_with_nextjs_16.md)
312
+ - [TanStack Start i18n 指南](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/intlayer_with_tanstack.md)
313
+ - [每个区域的自定义域名](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/custom_domains.md)
314
+ - [配置参考](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/configuration.md)
@@ -199,8 +199,6 @@ npx intlayer fill
199
199
  > 在 [Intlayer AI 配置文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/configuration.md#ai-configuration) 中查看所有可用的 AI 提供商。
200
200
  > 在 [Intlayer CLI 文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/cli/index.md) 中查看所有可用的命令。
201
201
 
202
- ---
203
-
204
202
  </Step>
205
203
 
206
204
  </Steps>
@@ -192,8 +192,6 @@ npx intlayer fill
192
192
  > 在 [Intlayer AI 配置文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/configuration.md#ai-configuration) 中查看所有可用的 AI 提供者。
193
193
  > 在 [Intlayer CLI 文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/cli/index.md) 中查看所有可用的命令。
194
194
 
195
- ---
196
-
197
195
  </Step>
198
196
 
199
197
  </Steps>
@@ -195,8 +195,6 @@ npx intlayer fill
195
195
  > 在 [Intlayer AI 配置文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/configuration.md#ai-configuration) 中查看所有可用的 AI 提供商。
196
196
  > 在 [Intlayer CLI 文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/cli/index.md) 中查看所有可用的命令。
197
197
 
198
- ---
199
-
200
198
  </Step>
201
199
 
202
200
  </Steps>
@@ -193,8 +193,6 @@ npx intlayer fill
193
193
  > 在 [Intlayer AI 配置文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/configuration.md#ai-configuration) 中查看所有可用的 AI provider。
194
194
  > 在 [Intlayer CLI 文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/cli/index.md) 中查看所有可用的命令。
195
195
 
196
- ---
197
-
198
196
  </Step>
199
197
 
200
198
  </Steps>
@@ -195,8 +195,6 @@ npx intlayer fill
195
195
  > 在 [Intlayer AI 配置文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/configuration.md#ai-configuration) 中查看所有可用的 AI 提供商。
196
196
  > 在 [Intlayer CLI 文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/cli/index.md) 中查看所有可用的命令。
197
197
 
198
- ---
199
-
200
198
  </Step>
201
199
 
202
200
  </Steps>
@@ -77,19 +77,42 @@ const getFileMetadataRecord = async (files, locale = defaultLocale) => {
77
77
  }
78
78
  return await record;
79
79
  };
80
+ /**
81
+ * Flattens front-matter slugs into the URL segments they produce.
82
+ *
83
+ * `relativeUrl` is built by joining the slugs with `/`, so a slug holding a
84
+ * slash — `"@intlayer/babel"` — yields more URL segments than the array holds
85
+ * entries. A requested path, split on `/`, could then never be matched against
86
+ * the raw array, and the page resolved to nothing.
87
+ *
88
+ * @param slugs - Front-matter slugs, or the segments of a requested path.
89
+ * @returns One entry per URL segment, empty segments dropped.
90
+ */
91
+ const toUrlSegments = (slugs) => slugs.flatMap((slug) => slug.split("/")).filter(Boolean);
92
+ /**
93
+ * Tells whether a file answers a requested slug path.
94
+ *
95
+ * @param fileMetadata - Metadata of the candidate file.
96
+ * @param requestedSegments - URL segments asked for, already flattened.
97
+ * @param strict - Rejects files owning segments beyond the requested ones.
98
+ * @returns `true` when the file matches the request.
99
+ */
100
+ const matchesRequestedSegments = (fileMetadata, requestedSegments, strict) => {
101
+ const fileSegments = toUrlSegments(fileMetadata.slugs ?? []);
102
+ if (strict && fileSegments.length !== requestedSegments.length) return false;
103
+ return requestedSegments.every((segment) => fileSegments.includes(segment));
104
+ };
80
105
  const getFileMetadataBySlug = async (files, slugs, locale = defaultLocale, strict = false) => {
81
- const slugsArray = Array.isArray(slugs) ? slugs : [slugs];
106
+ const requestedSegments = toUrlSegments(Array.isArray(slugs) ? slugs : [slugs]);
82
107
  const filesMetadata = await getFileMetadataRecord(files, defaultLocale);
83
- let fileMetadataArray = Object.values(filesMetadata).filter((fileMetadata) => slugsArray.every((slug) => fileMetadata.slugs?.includes(slug)));
84
- if (strict) fileMetadataArray = fileMetadataArray.filter((fileMetadata) => fileMetadata.slugs.length === slugsArray.length);
108
+ const fileMetadataArray = Object.values(filesMetadata).filter((fileMetadata) => matchesRequestedSegments(fileMetadata, requestedSegments, strict));
85
109
  if (locale !== defaultLocale) return await Promise.all(fileMetadataArray.map(async (fileMetadata) => await getFileMetadata(files, fileMetadata.docKey, locale)));
86
110
  return fileMetadataArray;
87
111
  };
88
112
  const getFileBySlug = async (files, slugs, locale = defaultLocale, strict = false) => {
89
- const slugsArray = Array.isArray(slugs) ? slugs : [slugs];
113
+ const requestedSegments = toUrlSegments(Array.isArray(slugs) ? slugs : [slugs]);
90
114
  const filesMetadata = await getFileMetadataRecord(files, defaultLocale);
91
- let fileMetadataArray = Object.values(filesMetadata).filter((fileMetadata) => slugsArray.every((slug) => fileMetadata.slugs?.includes(slug)));
92
- if (strict) fileMetadataArray = fileMetadataArray.filter((fileMetadata) => fileMetadata.slugs.length === slugsArray.length);
115
+ const fileMetadataArray = Object.values(filesMetadata).filter((fileMetadata) => matchesRequestedSegments(fileMetadata, requestedSegments, strict));
93
116
  return await Promise.all(fileMetadataArray.map(async (fileMetadata) => {
94
117
  return await getFile(files, fileMetadata.docKey, locale);
95
118
  }));
@@ -1 +1 @@
1
- {"version":3,"file":"common.cjs","names":["Locales","getMarkdownMetadata","join","getLocalizedUrl"],"sources":["../../src/common.ts"],"sourcesContent":["import { join } from 'node:path';\nimport { getLocalizedUrl } from '@intlayer/core/localization';\nimport { getMarkdownMetadata } from '@intlayer/core/transpiler';\nimport * as Locales from '@intlayer/types/locales';\nimport type { LocalesValues } from '@intlayer/types/module_augmentation';\n\nexport const defaultLocale = Locales.ENGLISH;\n\nexport const GITHUB_URL_PREFIX =\n 'https://github.com/aymericzip/intlayer/blob/main/docs';\nexport const URL_PREFIX = 'https://intlayer.org/';\n\nexport const getKeys = <T extends Record<string, any>>(obj: T): (keyof T)[] =>\n Object.keys(obj) as (keyof T)[];\n\nexport const getFiles = async <\n F extends Record<`./${string}`, Record<LocalesValues, Promise<string>>>,\n>(\n files: F,\n lang: LocalesValues = defaultLocale as LocalesValues\n): Promise<Record<string, string>> => {\n const filesEntries = await Promise.all(\n Object.entries(files)\n .map(([key, value]) => [key, value[lang as LocalesValues]])\n .map(async ([key, value]) => [key, await value])\n );\n const filesResult = Object.fromEntries(filesEntries);\n return filesResult;\n};\n\nexport const getFile = async <\n F extends Record<string, Record<LocalesValues, Promise<string>>>,\n>(\n files: F,\n docKey: keyof F,\n locale: LocalesValues = defaultLocale as LocalesValues\n): Promise<string> => {\n const fileRecord = files[docKey];\n\n if (!fileRecord) {\n throw new Error(`File ${docKey as string} not found`);\n }\n\n const file = await files[docKey]?.[locale];\n\n if (!file) {\n const englishFile = await files[docKey]?.[defaultLocale as LocalesValues];\n\n if (!englishFile) {\n throw new Error(`File ${docKey as string} not found`);\n }\n\n return englishFile;\n }\n\n return file;\n};\n\nexport type FileMetadata = {\n docKey: string;\n url: string;\n relativeUrl: string;\n githubUrl: string;\n title: string;\n slugs: string[];\n description: string;\n keywords: string[];\n updatedAt: string;\n createdAt: string;\n author?: string;\n youtubeVideo?: string;\n applicationTemplate?: string;\n applicationShowcase?: string;\n history?: {\n version: string;\n date: string;\n changes: string;\n }[];\n};\n\nexport const formatMetadata = (\n docKey: string,\n file: string,\n locale: LocalesValues = defaultLocale as LocalesValues\n): FileMetadata => {\n const metadata = getMarkdownMetadata(file);\n\n const slugs = (metadata.slugs ?? []).map(String);\n const keywords = (metadata.keywords ?? []).map(String);\n\n const relativeUrl = join('/', ...slugs);\n\n const slicedDocKey = docKey.slice(1);\n\n // Normalise author: accept both a plain string handle (new format)\n // and a legacy object `{ github: '...' }` — always reduce to a plain string.\n const rawAuthor = metadata.author as\n | string\n | { name?: string; github?: string }\n | undefined;\n const author: string | undefined =\n typeof rawAuthor === 'string'\n ? rawAuthor || undefined\n : rawAuthor?.github || undefined;\n\n return {\n ...metadata,\n docKey,\n slugs,\n keywords,\n author,\n githubUrl: `${GITHUB_URL_PREFIX}${slicedDocKey}`.replace(\n '/en/',\n `/${locale}/`\n ),\n relativeUrl: getLocalizedUrl(relativeUrl, locale),\n url: getLocalizedUrl(join(URL_PREFIX, relativeUrl), locale),\n } as FileMetadata;\n};\n\nexport const getFileMetadata = async <\n F extends Record<string, Record<LocalesValues, Promise<string>>>,\n R extends FileMetadata,\n>(\n files: F,\n docKey: keyof F,\n locale: LocalesValues = defaultLocale as LocalesValues\n): Promise<R> => {\n const file = await getFile(files, docKey, locale);\n\n return formatMetadata(docKey as string, file, locale) as R;\n};\n\n/**\n * Per-locale metadata records, keyed by the entry map they were built from.\n *\n * Building a record parses the frontmatter of every document of a category, and\n * callers such as {@link getFileMetadataBySlug} need the whole record just to\n * resolve a single slug — which a static site generator repeats for every page\n * it renders. Documents are read once per process anyway (each entry caches its\n * own read), so the derived metadata is equally safe to keep.\n */\nconst fileMetadataRecordCache = new WeakMap<\n Record<string, unknown>,\n Map<LocalesValues, Promise<Record<string, FileMetadata>>>\n>();\n\nconst buildFileMetadataRecord = async <\n F extends Record<string, Record<LocalesValues, Promise<string>>>,\n>(\n files: F,\n locale: LocalesValues\n): Promise<Record<keyof F, FileMetadata>> => {\n const results = await Promise.allSettled(\n Object.entries(files).map(async ([key]) => {\n const metadata = await getFileMetadata(files, key as keyof F, locale);\n return [key, metadata] as [string, FileMetadata];\n })\n );\n const filesEntries = results\n .filter(\n (r): r is PromiseFulfilledResult<[string, FileMetadata]> =>\n r.status === 'fulfilled'\n )\n .map((r) => r.value);\n const filesResult = Object.fromEntries(filesEntries);\n return filesResult as Record<keyof F, FileMetadata>;\n};\n\nexport const getFileMetadataRecord = async <\n F extends Record<string, Record<LocalesValues, Promise<string>>>,\n>(\n files: F,\n locale: LocalesValues = defaultLocale as LocalesValues\n): Promise<Record<keyof F, FileMetadata>> => {\n let localeCache = fileMetadataRecordCache.get(files);\n\n if (!localeCache) {\n localeCache = new Map();\n fileMetadataRecordCache.set(files, localeCache);\n }\n\n let record = localeCache.get(locale);\n\n if (!record) {\n record = buildFileMetadataRecord(files, locale);\n localeCache.set(locale, record);\n }\n\n return (await record) as Record<keyof F, FileMetadata>;\n};\n\nexport const getFileMetadataBySlug = async <\n F extends Record<string, Record<LocalesValues, Promise<string>>>,\n>(\n files: F,\n slugs: string | string[],\n locale: LocalesValues = defaultLocale as LocalesValues,\n strict = false\n) => {\n const slugsArray = Array.isArray(slugs) ? slugs : [slugs];\n const filesMetadata = await getFileMetadataRecord(\n files,\n defaultLocale as LocalesValues\n );\n\n let fileMetadataArray: FileMetadata[] = Object.values(filesMetadata).filter(\n (fileMetadata) =>\n slugsArray.every((slug) => fileMetadata.slugs?.includes(slug))\n );\n\n if (strict) {\n fileMetadataArray = fileMetadataArray.filter(\n (fileMetadata) => fileMetadata.slugs.length === slugsArray.length\n );\n }\n\n if (locale !== defaultLocale) {\n const localizedFileMetadata = await Promise.all(\n fileMetadataArray.map(\n async (fileMetadata) =>\n await getFileMetadata(files, fileMetadata.docKey, locale)\n )\n );\n\n return localizedFileMetadata;\n }\n\n return fileMetadataArray;\n};\n\nexport const getFileBySlug = async <\n F extends Record<string, Record<LocalesValues, Promise<string>>>,\n>(\n files: F,\n slugs: string | string[],\n locale: LocalesValues = defaultLocale as LocalesValues,\n strict = false\n) => {\n const slugsArray = Array.isArray(slugs) ? slugs : [slugs];\n const filesMetadata = await getFileMetadataRecord(\n files,\n defaultLocale as LocalesValues\n );\n\n let fileMetadataArray = Object.values(filesMetadata).filter((fileMetadata) =>\n slugsArray.every((slug) => fileMetadata.slugs?.includes(slug))\n );\n\n if (strict) {\n fileMetadataArray = fileMetadataArray.filter(\n (fileMetadata) => fileMetadata.slugs.length === slugsArray.length\n );\n }\n\n const fileList = await Promise.all(\n fileMetadataArray.map(async (fileMetadata) => {\n const file = await getFile(files, fileMetadata.docKey, locale);\n return file;\n })\n );\n\n return fileList;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"common.cjs","names":["Locales","getMarkdownMetadata","join","getLocalizedUrl"],"sources":["../../src/common.ts"],"sourcesContent":["import { join } from 'node:path';\nimport { getLocalizedUrl } from '@intlayer/core/localization';\nimport { getMarkdownMetadata } from '@intlayer/core/transpiler';\nimport * as Locales from '@intlayer/types/locales';\nimport type { LocalesValues } from '@intlayer/types/module_augmentation';\n\nexport const defaultLocale = Locales.ENGLISH;\n\nexport const GITHUB_URL_PREFIX =\n 'https://github.com/aymericzip/intlayer/blob/main/docs';\nexport const URL_PREFIX = 'https://intlayer.org/';\n\nexport const getKeys = <T extends Record<string, any>>(obj: T): (keyof T)[] =>\n Object.keys(obj) as (keyof T)[];\n\nexport const getFiles = async <\n F extends Record<`./${string}`, Record<LocalesValues, Promise<string>>>,\n>(\n files: F,\n lang: LocalesValues = defaultLocale as LocalesValues\n): Promise<Record<string, string>> => {\n const filesEntries = await Promise.all(\n Object.entries(files)\n .map(([key, value]) => [key, value[lang as LocalesValues]])\n .map(async ([key, value]) => [key, await value])\n );\n const filesResult = Object.fromEntries(filesEntries);\n return filesResult;\n};\n\nexport const getFile = async <\n F extends Record<string, Record<LocalesValues, Promise<string>>>,\n>(\n files: F,\n docKey: keyof F,\n locale: LocalesValues = defaultLocale as LocalesValues\n): Promise<string> => {\n const fileRecord = files[docKey];\n\n if (!fileRecord) {\n throw new Error(`File ${docKey as string} not found`);\n }\n\n const file = await files[docKey]?.[locale];\n\n if (!file) {\n const englishFile = await files[docKey]?.[defaultLocale as LocalesValues];\n\n if (!englishFile) {\n throw new Error(`File ${docKey as string} not found`);\n }\n\n return englishFile;\n }\n\n return file;\n};\n\nexport type FileMetadata = {\n docKey: string;\n url: string;\n relativeUrl: string;\n githubUrl: string;\n title: string;\n slugs: string[];\n description: string;\n keywords: string[];\n updatedAt: string;\n createdAt: string;\n author?: string;\n youtubeVideo?: string;\n applicationTemplate?: string;\n applicationShowcase?: string;\n history?: {\n version: string;\n date: string;\n changes: string;\n }[];\n};\n\nexport const formatMetadata = (\n docKey: string,\n file: string,\n locale: LocalesValues = defaultLocale as LocalesValues\n): FileMetadata => {\n const metadata = getMarkdownMetadata(file);\n\n const slugs = (metadata.slugs ?? []).map(String);\n const keywords = (metadata.keywords ?? []).map(String);\n\n const relativeUrl = join('/', ...slugs);\n\n const slicedDocKey = docKey.slice(1);\n\n // Normalise author: accept both a plain string handle (new format)\n // and a legacy object `{ github: '...' }` — always reduce to a plain string.\n const rawAuthor = metadata.author as\n | string\n | { name?: string; github?: string }\n | undefined;\n const author: string | undefined =\n typeof rawAuthor === 'string'\n ? rawAuthor || undefined\n : rawAuthor?.github || undefined;\n\n return {\n ...metadata,\n docKey,\n slugs,\n keywords,\n author,\n githubUrl: `${GITHUB_URL_PREFIX}${slicedDocKey}`.replace(\n '/en/',\n `/${locale}/`\n ),\n relativeUrl: getLocalizedUrl(relativeUrl, locale),\n url: getLocalizedUrl(join(URL_PREFIX, relativeUrl), locale),\n } as FileMetadata;\n};\n\nexport const getFileMetadata = async <\n F extends Record<string, Record<LocalesValues, Promise<string>>>,\n R extends FileMetadata,\n>(\n files: F,\n docKey: keyof F,\n locale: LocalesValues = defaultLocale as LocalesValues\n): Promise<R> => {\n const file = await getFile(files, docKey, locale);\n\n return formatMetadata(docKey as string, file, locale) as R;\n};\n\n/**\n * Per-locale metadata records, keyed by the entry map they were built from.\n *\n * Building a record parses the frontmatter of every document of a category, and\n * callers such as {@link getFileMetadataBySlug} need the whole record just to\n * resolve a single slug — which a static site generator repeats for every page\n * it renders. Documents are read once per process anyway (each entry caches its\n * own read), so the derived metadata is equally safe to keep.\n */\nconst fileMetadataRecordCache = new WeakMap<\n Record<string, unknown>,\n Map<LocalesValues, Promise<Record<string, FileMetadata>>>\n>();\n\nconst buildFileMetadataRecord = async <\n F extends Record<string, Record<LocalesValues, Promise<string>>>,\n>(\n files: F,\n locale: LocalesValues\n): Promise<Record<keyof F, FileMetadata>> => {\n const results = await Promise.allSettled(\n Object.entries(files).map(async ([key]) => {\n const metadata = await getFileMetadata(files, key as keyof F, locale);\n return [key, metadata] as [string, FileMetadata];\n })\n );\n const filesEntries = results\n .filter(\n (r): r is PromiseFulfilledResult<[string, FileMetadata]> =>\n r.status === 'fulfilled'\n )\n .map((r) => r.value);\n const filesResult = Object.fromEntries(filesEntries);\n return filesResult as Record<keyof F, FileMetadata>;\n};\n\nexport const getFileMetadataRecord = async <\n F extends Record<string, Record<LocalesValues, Promise<string>>>,\n>(\n files: F,\n locale: LocalesValues = defaultLocale as LocalesValues\n): Promise<Record<keyof F, FileMetadata>> => {\n let localeCache = fileMetadataRecordCache.get(files);\n\n if (!localeCache) {\n localeCache = new Map();\n fileMetadataRecordCache.set(files, localeCache);\n }\n\n let record = localeCache.get(locale);\n\n if (!record) {\n record = buildFileMetadataRecord(files, locale);\n localeCache.set(locale, record);\n }\n\n return (await record) as Record<keyof F, FileMetadata>;\n};\n\n/**\n * Flattens front-matter slugs into the URL segments they produce.\n *\n * `relativeUrl` is built by joining the slugs with `/`, so a slug holding a\n * slash — `\"@intlayer/babel\"` — yields more URL segments than the array holds\n * entries. A requested path, split on `/`, could then never be matched against\n * the raw array, and the page resolved to nothing.\n *\n * @param slugs - Front-matter slugs, or the segments of a requested path.\n * @returns One entry per URL segment, empty segments dropped.\n */\nconst toUrlSegments = (slugs: string[]): string[] =>\n slugs.flatMap((slug) => slug.split('/')).filter(Boolean);\n\n/**\n * Tells whether a file answers a requested slug path.\n *\n * @param fileMetadata - Metadata of the candidate file.\n * @param requestedSegments - URL segments asked for, already flattened.\n * @param strict - Rejects files owning segments beyond the requested ones.\n * @returns `true` when the file matches the request.\n */\nconst matchesRequestedSegments = (\n fileMetadata: FileMetadata,\n requestedSegments: string[],\n strict: boolean\n): boolean => {\n const fileSegments = toUrlSegments(fileMetadata.slugs ?? []);\n\n if (strict && fileSegments.length !== requestedSegments.length) return false;\n\n return requestedSegments.every((segment) => fileSegments.includes(segment));\n};\n\nexport const getFileMetadataBySlug = async <\n F extends Record<string, Record<LocalesValues, Promise<string>>>,\n>(\n files: F,\n slugs: string | string[],\n locale: LocalesValues = defaultLocale as LocalesValues,\n strict = false\n) => {\n const requestedSegments = toUrlSegments(\n Array.isArray(slugs) ? slugs : [slugs]\n );\n const filesMetadata = await getFileMetadataRecord(\n files,\n defaultLocale as LocalesValues\n );\n\n const fileMetadataArray: FileMetadata[] = Object.values(filesMetadata).filter(\n (fileMetadata) =>\n matchesRequestedSegments(fileMetadata, requestedSegments, strict)\n );\n\n if (locale !== defaultLocale) {\n const localizedFileMetadata = await Promise.all(\n fileMetadataArray.map(\n async (fileMetadata) =>\n await getFileMetadata(files, fileMetadata.docKey, locale)\n )\n );\n\n return localizedFileMetadata;\n }\n\n return fileMetadataArray;\n};\n\nexport const getFileBySlug = async <\n F extends Record<string, Record<LocalesValues, Promise<string>>>,\n>(\n files: F,\n slugs: string | string[],\n locale: LocalesValues = defaultLocale as LocalesValues,\n strict = false\n) => {\n const requestedSegments = toUrlSegments(\n Array.isArray(slugs) ? slugs : [slugs]\n );\n const filesMetadata = await getFileMetadataRecord(\n files,\n defaultLocale as LocalesValues\n );\n\n const fileMetadataArray = Object.values(filesMetadata).filter(\n (fileMetadata) =>\n matchesRequestedSegments(fileMetadata, requestedSegments, strict)\n );\n\n const fileList = await Promise.all(\n fileMetadataArray.map(async (fileMetadata) => {\n const file = await getFile(files, fileMetadata.docKey, locale);\n return file;\n })\n );\n\n return fileList;\n};\n"],"mappings":"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"}
@@ -74,6 +74,26 @@ const blogEntry = {
74
74
  vi: readLocale("compiler_vs_declarative_i18n.md", "vi"),
75
75
  uk: readLocale("compiler_vs_declarative_i18n.md", "uk")
76
76
  },
77
+ "./blog/en/hreflang_guide_multilingual_seo.md": {
78
+ en: readLocale("hreflang_guide_multilingual_seo.md", "en"),
79
+ es: readLocale("hreflang_guide_multilingual_seo.md", "es"),
80
+ ru: readLocale("hreflang_guide_multilingual_seo.md", "ru"),
81
+ ja: readLocale("hreflang_guide_multilingual_seo.md", "ja"),
82
+ fr: readLocale("hreflang_guide_multilingual_seo.md", "fr"),
83
+ ko: readLocale("hreflang_guide_multilingual_seo.md", "ko"),
84
+ zh: readLocale("hreflang_guide_multilingual_seo.md", "zh"),
85
+ de: readLocale("hreflang_guide_multilingual_seo.md", "de"),
86
+ ar: readLocale("hreflang_guide_multilingual_seo.md", "ar"),
87
+ it: readLocale("hreflang_guide_multilingual_seo.md", "it"),
88
+ "en-GB": readLocale("hreflang_guide_multilingual_seo.md", "en-GB"),
89
+ pt: readLocale("hreflang_guide_multilingual_seo.md", "pt"),
90
+ hi: readLocale("hreflang_guide_multilingual_seo.md", "hi"),
91
+ tr: readLocale("hreflang_guide_multilingual_seo.md", "tr"),
92
+ pl: readLocale("hreflang_guide_multilingual_seo.md", "pl"),
93
+ id: readLocale("hreflang_guide_multilingual_seo.md", "id"),
94
+ vi: readLocale("hreflang_guide_multilingual_seo.md", "vi"),
95
+ uk: readLocale("hreflang_guide_multilingual_seo.md", "uk")
96
+ },
77
97
  "./blog/en/i18n_meaning.md": {
78
98
  en: readLocale("i18n_meaning.md", "en"),
79
99
  es: readLocale("i18n_meaning.md", "es"),