@intlayer/docs 9.1.3 → 9.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (482) hide show
  1. package/blog/ar/index.md +1 -1
  2. package/blog/ar/rag_powered_documentation_assistant.md +7 -0
  3. package/blog/de/index.md +1 -1
  4. package/blog/de/rag_powered_documentation_assistant.md +6 -0
  5. package/blog/en/index.md +1 -1
  6. package/blog/en-GB/index.md +1 -1
  7. package/blog/en-GB/rag_powered_documentation_assistant.md +6 -0
  8. package/blog/es/index.md +1 -1
  9. package/blog/es/rag_powered_documentation_assistant.md +7 -0
  10. package/blog/fr/i18n_meaning.md +7 -1
  11. package/blog/fr/index.md +1 -1
  12. package/blog/fr/list_i18n_technologies/frameworks/angular.md +5 -1
  13. package/blog/fr/rag_powered_documentation_assistant.md +6 -0
  14. package/blog/hi/index.md +1 -1
  15. package/blog/hi/next-i18next_vs_next-intl_vs_intlayer.md +119 -42
  16. package/blog/hi/rag_powered_documentation_assistant.md +7 -0
  17. package/blog/id/index.md +1 -1
  18. package/blog/id/rag_powered_documentation_assistant.md +6 -0
  19. package/blog/it/index.md +1 -1
  20. package/blog/it/rag_powered_documentation_assistant.md +6 -0
  21. package/blog/ja/index.md +1 -1
  22. package/blog/ja/rag_powered_documentation_assistant.md +7 -0
  23. package/blog/ko/index.md +1 -1
  24. package/blog/ko/list_i18n_technologies/frameworks/react.md +7 -7
  25. package/blog/ko/rag_powered_documentation_assistant.md +6 -0
  26. package/blog/pl/index.md +1 -1
  27. package/blog/pl/rag_powered_documentation_assistant.md +6 -0
  28. package/blog/pt/index.md +1 -1
  29. package/blog/pt/rag_powered_documentation_assistant.md +6 -0
  30. package/blog/ru/index.md +1 -1
  31. package/blog/ru/rag_powered_documentation_assistant.md +7 -0
  32. package/blog/tr/intlayer_with_react-intl.md +3 -1
  33. package/blog/tr/next-i18next_vs_next-intl_vs_intlayer.md +175 -42
  34. package/blog/tr/rag_powered_documentation_assistant.md +6 -0
  35. package/blog/uk/index.md +1 -1
  36. package/blog/uk/rag_powered_documentation_assistant.md +6 -0
  37. package/blog/vi/index.md +1 -1
  38. package/blog/vi/rag_powered_documentation_assistant.md +6 -0
  39. package/blog/zh/index.md +1 -1
  40. package/blog/zh/intlayer_with_i18next.md +87 -28
  41. package/blog/zh/intlayer_with_next-i18next.md +86 -29
  42. package/blog/zh/intlayer_with_next-intl.md +88 -28
  43. package/blog/zh/intlayer_with_react-i18next.md +87 -28
  44. package/blog/zh/intlayer_with_react-intl.md +88 -27
  45. package/blog/zh/intlayer_with_vue-i18n.md +117 -8
  46. package/blog/zh/rag_powered_documentation_assistant.md +6 -0
  47. package/dist/cjs/common.cjs +24 -1
  48. package/dist/cjs/common.cjs.map +1 -1
  49. package/dist/cjs/generated/blog.entry.cjs +58 -31
  50. package/dist/cjs/generated/blog.entry.cjs.map +1 -1
  51. package/dist/cjs/generated/docs.entry.cjs +265 -218
  52. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  53. package/dist/cjs/generated/frequentQuestions.entry.cjs +48 -21
  54. package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
  55. package/dist/cjs/generated/legal.entry.cjs +33 -6
  56. package/dist/cjs/generated/legal.entry.cjs.map +1 -1
  57. package/dist/esm/common.mjs +24 -1
  58. package/dist/esm/common.mjs.map +1 -1
  59. package/dist/esm/generated/blog.entry.mjs +58 -31
  60. package/dist/esm/generated/blog.entry.mjs.map +1 -1
  61. package/dist/esm/generated/docs.entry.mjs +265 -218
  62. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  63. package/dist/esm/generated/frequentQuestions.entry.mjs +48 -21
  64. package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
  65. package/dist/esm/generated/legal.entry.mjs +33 -6
  66. package/dist/esm/generated/legal.entry.mjs.map +1 -1
  67. package/dist/types/common.d.ts.map +1 -1
  68. package/dist/types/generated/blog.entry.d.ts.map +1 -1
  69. package/dist/types/generated/docs.entry.d.ts +1 -0
  70. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  71. package/dist/types/generated/frequentQuestions.entry.d.ts.map +1 -1
  72. package/dist/types/generated/legal.entry.d.ts.map +1 -1
  73. package/docs/ar/analytics.md +222 -0
  74. package/docs/ar/autoFill.md +28 -9
  75. package/docs/ar/bundle_optimization.md +58 -25
  76. package/docs/ar/configuration.md +25 -8
  77. package/docs/ar/dictionary/file.md +3 -1
  78. package/docs/ar/dictionary/nesting.md +47 -30
  79. package/docs/ar/formatters.md +148 -193
  80. package/docs/ar/intlayer_CMS.md +152 -0
  81. package/docs/ar/intlayer_with_angular_21.md +9 -9
  82. package/docs/ar/intlayer_with_nextjs_14.md +1 -28
  83. package/docs/ar/intlayer_with_nextjs_15.md +1 -33
  84. package/docs/ar/intlayer_with_react_router_v7_fs_routes.md +40 -83
  85. package/docs/ar/intlayer_with_solid_start.md +1078 -0
  86. package/docs/ar/intlayer_with_vite+vue.md +1 -3
  87. package/docs/ar/live-sync.md +4 -0
  88. package/docs/ar/packages/intlayer/getLocalizedUrl.md +26 -24
  89. package/docs/ar/packages/intlayer/getMultilingualUrls.md +4 -18
  90. package/docs/ar/packages/react-intlayer/useDictionary.md +4 -21
  91. package/docs/ar/packages/react-intlayer/useIntlayer.md +2 -2
  92. package/docs/ar/packages/vite-intlayer/exports.md +15 -0
  93. package/docs/ar/packages/vite-intlayer/intlayer.md +121 -6
  94. package/docs/ar/packages/vite-intlayer/intlayerPrune.md +70 -3
  95. package/docs/ar/releases/v9.md +0 -37
  96. package/docs/ar/self_hosting.md +46 -49
  97. package/docs/bn/bundle_optimization.md +58 -25
  98. package/docs/bn/configuration.md +25 -8
  99. package/docs/bn/intlayer_with_angular_21.md +9 -9
  100. package/docs/cs/bundle_optimization.md +58 -25
  101. package/docs/cs/configuration.md +25 -8
  102. package/docs/cs/intlayer_with_angular_21.md +9 -9
  103. package/docs/de/analytics.md +222 -0
  104. package/docs/de/autoFill.md +28 -9
  105. package/docs/de/bundle_optimization.md +58 -25
  106. package/docs/de/configuration.md +25 -8
  107. package/docs/de/dictionary/file.md +3 -1
  108. package/docs/de/dictionary/nesting.md +47 -31
  109. package/docs/de/formatters.md +208 -334
  110. package/docs/de/intlayer_CMS.md +66 -15
  111. package/docs/de/intlayer_with_angular_21.md +9 -9
  112. package/docs/de/intlayer_with_nestjs.md +11 -7
  113. package/docs/de/intlayer_with_nextjs_14.md +1 -28
  114. package/docs/de/intlayer_with_nextjs_15.md +1 -33
  115. package/docs/de/intlayer_with_solid_start.md +1078 -0
  116. package/docs/de/intlayer_with_vite+vue.md +1 -3
  117. package/docs/de/live-sync.md +4 -0
  118. package/docs/de/packages/intlayer/getLocalizedUrl.md +33 -25
  119. package/docs/de/packages/intlayer/getMultilingualUrls.md +4 -18
  120. package/docs/de/packages/react-intlayer/useDictionary.md +2 -5
  121. package/docs/de/packages/vite-intlayer/exports.md +15 -0
  122. package/docs/de/packages/vite-intlayer/intlayer.md +121 -6
  123. package/docs/de/packages/vite-intlayer/intlayerPrune.md +77 -4
  124. package/docs/de/releases/v9.md +0 -15
  125. package/docs/de/self_hosting.md +46 -50
  126. package/docs/en/bundle_optimization.md +51 -23
  127. package/docs/en/cli/doc-review.md +13 -2
  128. package/docs/en/configuration.md +24 -15
  129. package/docs/en/intlayer_with_angular_21.md +9 -9
  130. package/docs/en/intlayer_with_solid_start.md +1091 -0
  131. package/docs/en/intlayer_with_vite+solid.md +12 -0
  132. package/docs/en/live-sync.md +4 -0
  133. package/docs/en-GB/analytics.md +222 -0
  134. package/docs/en-GB/autoFill.md +26 -7
  135. package/docs/en-GB/bundle_optimization.md +58 -25
  136. package/docs/en-GB/configuration.md +25 -8
  137. package/docs/en-GB/dictionary/file.md +2 -0
  138. package/docs/en-GB/dictionary/nesting.md +64 -205
  139. package/docs/en-GB/formatters.md +146 -181
  140. package/docs/en-GB/intlayer_CMS.md +152 -0
  141. package/docs/en-GB/intlayer_with_angular_21.md +9 -9
  142. package/docs/en-GB/intlayer_with_nestjs.md +6 -2
  143. package/docs/en-GB/intlayer_with_nextjs_14.md +0 -27
  144. package/docs/en-GB/intlayer_with_nextjs_15.md +1 -33
  145. package/docs/en-GB/intlayer_with_react_router_v7_fs_routes.md +40 -82
  146. package/docs/en-GB/intlayer_with_solid_start.md +1078 -0
  147. package/docs/en-GB/intlayer_with_vite+vue.md +1 -3
  148. package/docs/en-GB/live-sync.md +4 -0
  149. package/docs/en-GB/packages/intlayer/getLocalizedUrl.md +30 -22
  150. package/docs/en-GB/packages/intlayer/getMultilingualUrls.md +16 -48
  151. package/docs/en-GB/packages/vite-intlayer/exports.md +15 -0
  152. package/docs/en-GB/packages/vite-intlayer/intlayer.md +121 -6
  153. package/docs/en-GB/packages/vite-intlayer/intlayerPrune.md +77 -4
  154. package/docs/en-GB/self_hosting.md +60 -49
  155. package/docs/es/analytics.md +222 -0
  156. package/docs/es/autoFill.md +28 -9
  157. package/docs/es/bundle_optimization.md +58 -25
  158. package/docs/es/configuration.md +24 -7
  159. package/docs/es/dictionary/file.md +3 -1
  160. package/docs/es/dictionary/nesting.md +47 -30
  161. package/docs/es/formatters.md +114 -168
  162. package/docs/es/intlayer_CMS.md +35 -10
  163. package/docs/es/intlayer_with_angular_21.md +9 -9
  164. package/docs/es/intlayer_with_nextjs_14.md +1 -28
  165. package/docs/es/intlayer_with_nextjs_15.md +1 -33
  166. package/docs/es/intlayer_with_solid_start.md +1078 -0
  167. package/docs/es/live-sync.md +4 -0
  168. package/docs/es/packages/intlayer/getLocalizedUrl.md +31 -23
  169. package/docs/es/packages/intlayer/getMultilingualUrls.md +4 -18
  170. package/docs/es/packages/vite-intlayer/exports.md +15 -0
  171. package/docs/es/packages/vite-intlayer/intlayer.md +121 -6
  172. package/docs/es/packages/vite-intlayer/intlayerPrune.md +69 -2
  173. package/docs/es/releases/v9.md +0 -15
  174. package/docs/es/self_hosting.md +46 -49
  175. package/docs/fr/analytics.md +222 -0
  176. package/docs/fr/autoFill.md +27 -8
  177. package/docs/fr/bundle_optimization.md +58 -25
  178. package/docs/fr/configuration.md +25 -8
  179. package/docs/fr/dictionary/file.md +2 -0
  180. package/docs/fr/dictionary/nesting.md +37 -184
  181. package/docs/fr/formatters.md +95 -236
  182. package/docs/fr/intlayer_CMS.md +66 -15
  183. package/docs/fr/intlayer_with_angular_21.md +9 -9
  184. package/docs/fr/intlayer_with_nextjs_14.md +1 -28
  185. package/docs/fr/intlayer_with_nextjs_15.md +1 -33
  186. package/docs/fr/intlayer_with_solid_start.md +1078 -0
  187. package/docs/fr/live-sync.md +4 -0
  188. package/docs/fr/packages/intlayer/getLocalizedUrl.md +37 -27
  189. package/docs/fr/packages/intlayer/getMultilingualUrls.md +18 -20
  190. package/docs/fr/packages/vite-intlayer/exports.md +15 -0
  191. package/docs/fr/packages/vite-intlayer/intlayer.md +121 -6
  192. package/docs/fr/packages/vite-intlayer/intlayerPrune.md +77 -4
  193. package/docs/fr/releases/v9.md +0 -15
  194. package/docs/fr/self_hosting.md +46 -49
  195. package/docs/hi/analytics.md +222 -0
  196. package/docs/hi/autoFill.md +28 -9
  197. package/docs/hi/bundle_optimization.md +58 -25
  198. package/docs/hi/configuration.md +25 -8
  199. package/docs/hi/dictionary/file.md +3 -1
  200. package/docs/hi/dictionary/nesting.md +47 -30
  201. package/docs/hi/formatters.md +233 -334
  202. package/docs/hi/how_works_intlayer.md +3 -1
  203. package/docs/hi/intlayer_CMS.md +152 -0
  204. package/docs/hi/intlayer_with_angular_21.md +9 -9
  205. package/docs/hi/intlayer_with_nestjs.md +11 -7
  206. package/docs/hi/intlayer_with_nextjs_14.md +1 -28
  207. package/docs/hi/intlayer_with_nextjs_15.md +1 -33
  208. package/docs/hi/intlayer_with_react_router_v7_fs_routes.md +40 -83
  209. package/docs/hi/intlayer_with_solid_start.md +1077 -0
  210. package/docs/hi/intlayer_with_vite+preact.md +56 -49
  211. package/docs/hi/intlayer_with_vite+react.md +48 -41
  212. package/docs/hi/intlayer_with_vite+solid.md +32 -41
  213. package/docs/hi/intlayer_with_vite+vue.md +49 -44
  214. package/docs/hi/live-sync.md +4 -0
  215. package/docs/hi/packages/intlayer/getLocalizedUrl.md +26 -24
  216. package/docs/hi/packages/intlayer/getMultilingualUrls.md +4 -18
  217. package/docs/hi/packages/next-intlayer/t.md +33 -1
  218. package/docs/hi/packages/react-intlayer/useDictionary.md +4 -21
  219. package/docs/hi/packages/vite-intlayer/exports.md +15 -0
  220. package/docs/hi/packages/vite-intlayer/intlayer.md +121 -6
  221. package/docs/hi/packages/vite-intlayer/intlayerPrune.md +78 -5
  222. package/docs/hi/plugins/sync-json.md +9 -9
  223. package/docs/hi/releases/v9.md +0 -15
  224. package/docs/hi/self_hosting.md +38 -51
  225. package/docs/id/analytics.md +223 -0
  226. package/docs/id/bundle_optimization.md +58 -25
  227. package/docs/id/configuration.md +25 -8
  228. package/docs/id/dictionary/nesting.md +37 -184
  229. package/docs/id/formatters.md +208 -305
  230. package/docs/id/intlayer_CMS.md +164 -0
  231. package/docs/id/intlayer_with_angular_21.md +9 -9
  232. package/docs/id/intlayer_with_nextjs_14.md +1 -26
  233. package/docs/id/intlayer_with_react_router_v7_fs_routes.md +70 -63
  234. package/docs/id/intlayer_with_solid_start.md +1078 -0
  235. package/docs/id/live-sync.md +4 -0
  236. package/docs/id/packages/intlayer/getMultilingualUrls.md +4 -18
  237. package/docs/id/packages/react-intlayer/useIntlayer.md +2 -2
  238. package/docs/id/packages/vite-intlayer/exports.md +15 -0
  239. package/docs/id/packages/vite-intlayer/intlayer.md +121 -6
  240. package/docs/id/packages/vite-intlayer/intlayerPrune.md +78 -5
  241. package/docs/id/releases/v9.md +12 -0
  242. package/docs/id/self_hosting.md +61 -50
  243. package/docs/it/analytics.md +222 -0
  244. package/docs/it/autoFill.md +27 -8
  245. package/docs/it/bundle_optimization.md +58 -25
  246. package/docs/it/configuration.md +25 -8
  247. package/docs/it/dictionary/file.md +3 -1
  248. package/docs/it/dictionary/nesting.md +47 -30
  249. package/docs/it/formatters.md +114 -168
  250. package/docs/it/intlayer_CMS.md +66 -15
  251. package/docs/it/intlayer_with_angular_21.md +9 -9
  252. package/docs/it/intlayer_with_nestjs.md +11 -7
  253. package/docs/it/intlayer_with_nextjs_14.md +1 -28
  254. package/docs/it/intlayer_with_nextjs_15.md +1 -33
  255. package/docs/it/intlayer_with_solid_start.md +1078 -0
  256. package/docs/it/intlayer_with_vite+vue.md +1 -3
  257. package/docs/it/live-sync.md +4 -0
  258. package/docs/it/packages/intlayer/getLocalizedUrl.md +34 -26
  259. package/docs/it/packages/intlayer/getMultilingualUrls.md +4 -18
  260. package/docs/it/packages/react-intlayer/useDictionary.md +4 -21
  261. package/docs/it/packages/vite-intlayer/exports.md +15 -0
  262. package/docs/it/packages/vite-intlayer/intlayer.md +121 -6
  263. package/docs/it/packages/vite-intlayer/intlayerPrune.md +77 -4
  264. package/docs/it/releases/v9.md +0 -15
  265. package/docs/it/self_hosting.md +60 -49
  266. package/docs/ja/analytics.md +222 -0
  267. package/docs/ja/autoFill.md +28 -9
  268. package/docs/ja/bundle_optimization.md +58 -25
  269. package/docs/ja/configuration.md +25 -8
  270. package/docs/ja/dictionary/content_file.md +15 -7
  271. package/docs/ja/dictionary/file.md +3 -1
  272. package/docs/ja/dictionary/nesting.md +47 -30
  273. package/docs/ja/formatters.md +133 -187
  274. package/docs/ja/intlayer_visual_editor.md +3 -1
  275. package/docs/ja/intlayer_with_angular_21.md +6 -6
  276. package/docs/ja/intlayer_with_nestjs.md +2 -12
  277. package/docs/ja/intlayer_with_nextjs_14.md +1 -28
  278. package/docs/ja/intlayer_with_nextjs_15.md +1 -33
  279. package/docs/ja/intlayer_with_react_router_v7.md +456 -20
  280. package/docs/ja/intlayer_with_solid_start.md +1078 -0
  281. package/docs/ja/intlayer_with_vite+preact.md +73 -41
  282. package/docs/ja/intlayer_with_vite+vue.md +1 -3
  283. package/docs/ja/live-sync.md +4 -0
  284. package/docs/ja/mcp_server.md +3 -9
  285. package/docs/ja/packages/intlayer/getLocalizedUrl.md +26 -24
  286. package/docs/ja/packages/intlayer/getMultilingualUrls.md +3 -17
  287. package/docs/ja/packages/vite-intlayer/exports.md +15 -0
  288. package/docs/ja/packages/vite-intlayer/intlayer.md +121 -6
  289. package/docs/ja/packages/vite-intlayer/intlayerPrune.md +79 -6
  290. package/docs/ja/releases/v9.md +12 -0
  291. package/docs/ja/self_hosting.md +46 -50
  292. package/docs/ko/analytics.md +222 -0
  293. package/docs/ko/autoFill.md +28 -9
  294. package/docs/ko/bundle_optimization.md +58 -25
  295. package/docs/ko/configuration.md +25 -8
  296. package/docs/ko/dictionary/file.md +3 -1
  297. package/docs/ko/dictionary/nesting.md +47 -30
  298. package/docs/ko/formatters.md +133 -187
  299. package/docs/ko/intlayer_with_angular_21.md +9 -9
  300. package/docs/ko/intlayer_with_lynx+react.md +133 -39
  301. package/docs/ko/intlayer_with_nextjs_14.md +1 -28
  302. package/docs/ko/intlayer_with_nextjs_15.md +1 -33
  303. package/docs/ko/intlayer_with_react_router_v7_fs_routes.md +40 -188
  304. package/docs/ko/intlayer_with_solid_start.md +1078 -0
  305. package/docs/ko/intlayer_with_vite+preact.md +57 -23
  306. package/docs/ko/intlayer_with_vite+vue.md +1 -3
  307. package/docs/ko/live-sync.md +4 -0
  308. package/docs/ko/packages/intlayer/getLocalizedUrl.md +26 -24
  309. package/docs/ko/packages/intlayer/getMultilingualUrls.md +4 -18
  310. package/docs/ko/packages/vite-intlayer/exports.md +15 -0
  311. package/docs/ko/packages/vite-intlayer/intlayer.md +121 -6
  312. package/docs/ko/packages/vite-intlayer/intlayerPrune.md +79 -6
  313. package/docs/ko/releases/v9.md +12 -0
  314. package/docs/ko/self_hosting.md +60 -49
  315. package/docs/nl/bundle_optimization.md +58 -25
  316. package/docs/nl/configuration.md +25 -8
  317. package/docs/nl/intlayer_with_angular_21.md +9 -9
  318. package/docs/pl/analytics.md +220 -0
  319. package/docs/pl/bundle_optimization.md +58 -25
  320. package/docs/pl/configuration.md +25 -8
  321. package/docs/pl/dictionary/nesting.md +47 -30
  322. package/docs/pl/formatters.md +208 -305
  323. package/docs/pl/intlayer_CMS.md +152 -0
  324. package/docs/pl/intlayer_with_angular_21.md +9 -9
  325. package/docs/pl/intlayer_with_nextjs_14.md +1 -26
  326. package/docs/pl/intlayer_with_solid_start.md +1078 -0
  327. package/docs/pl/live-sync.md +4 -0
  328. package/docs/pl/packages/intlayer/getMultilingualUrls.md +4 -18
  329. package/docs/pl/packages/react-intlayer/useDictionary.md +2 -19
  330. package/docs/pl/packages/vite-intlayer/exports.md +15 -0
  331. package/docs/pl/packages/vite-intlayer/intlayer.md +121 -6
  332. package/docs/pl/packages/vite-intlayer/intlayerPrune.md +77 -4
  333. package/docs/pl/releases/v9.md +0 -15
  334. package/docs/pl/self_hosting.md +60 -49
  335. package/docs/pt/analytics.md +222 -0
  336. package/docs/pt/bundle_optimization.md +58 -24
  337. package/docs/pt/configuration.md +25 -8
  338. package/docs/pt/dictionary/file.md +3 -1
  339. package/docs/pt/dictionary/nesting.md +47 -30
  340. package/docs/pt/formatters.md +112 -168
  341. package/docs/pt/intlayer_CMS.md +66 -15
  342. package/docs/pt/intlayer_with_angular_21.md +9 -9
  343. package/docs/pt/intlayer_with_astro_lit.md +26 -1
  344. package/docs/pt/intlayer_with_nextjs_14.md +1 -28
  345. package/docs/pt/intlayer_with_nextjs_15.md +1 -33
  346. package/docs/pt/intlayer_with_solid_start.md +1078 -0
  347. package/docs/pt/intlayer_with_vite+vue.md +1 -3
  348. package/docs/pt/live-sync.md +4 -0
  349. package/docs/pt/packages/intlayer/getLocalizedUrl.md +34 -26
  350. package/docs/pt/packages/intlayer/getMultilingualUrls.md +4 -18
  351. package/docs/pt/packages/vite-intlayer/exports.md +15 -0
  352. package/docs/pt/packages/vite-intlayer/intlayer.md +121 -6
  353. package/docs/pt/packages/vite-intlayer/intlayerPrune.md +78 -6
  354. package/docs/pt/releases/v9.md +0 -15
  355. package/docs/pt/self_hosting.md +60 -49
  356. package/docs/ru/analytics.md +222 -0
  357. package/docs/ru/autoFill.md +27 -8
  358. package/docs/ru/bundle_optimization.md +58 -25
  359. package/docs/ru/configuration.md +25 -8
  360. package/docs/ru/dictionary/file.md +3 -1
  361. package/docs/ru/dictionary/nesting.md +64 -205
  362. package/docs/ru/formatters.md +108 -128
  363. package/docs/ru/intlayer_with_angular_21.md +9 -9
  364. package/docs/ru/intlayer_with_nextjs_14.md +1 -28
  365. package/docs/ru/intlayer_with_nextjs_15.md +1 -33
  366. package/docs/ru/intlayer_with_solid_start.md +1078 -0
  367. package/docs/ru/intlayer_with_vite+vue.md +1 -3
  368. package/docs/ru/live-sync.md +4 -0
  369. package/docs/ru/packages/intlayer/getLocalizedUrl.md +34 -26
  370. package/docs/ru/packages/intlayer/getMultilingualUrls.md +4 -18
  371. package/docs/ru/packages/react-intlayer/useDictionary.md +4 -21
  372. package/docs/ru/packages/vite-intlayer/exports.md +15 -0
  373. package/docs/ru/packages/vite-intlayer/intlayer.md +121 -6
  374. package/docs/ru/packages/vite-intlayer/intlayerPrune.md +77 -4
  375. package/docs/ru/releases/v9.md +0 -15
  376. package/docs/ru/self_hosting.md +60 -49
  377. package/docs/tr/analytics.md +222 -0
  378. package/docs/tr/autoFill.md +28 -9
  379. package/docs/tr/bundle_optimization.md +58 -25
  380. package/docs/tr/configuration.md +25 -8
  381. package/docs/tr/dictionary/file.md +2 -0
  382. package/docs/tr/dictionary/nesting.md +47 -30
  383. package/docs/tr/formatters.md +144 -190
  384. package/docs/tr/intlayer_CMS.md +152 -0
  385. package/docs/tr/intlayer_with_angular_21.md +9 -9
  386. package/docs/tr/intlayer_with_nestjs.md +2 -12
  387. package/docs/tr/intlayer_with_nextjs_15.md +1 -33
  388. package/docs/tr/intlayer_with_solid_start.md +1078 -0
  389. package/docs/tr/intlayer_with_vite+vue.md +1 -3
  390. package/docs/tr/live-sync.md +4 -0
  391. package/docs/tr/packages/intlayer/getMultilingualUrls.md +4 -18
  392. package/docs/tr/packages/vite-intlayer/exports.md +15 -0
  393. package/docs/tr/packages/vite-intlayer/intlayer.md +121 -6
  394. package/docs/tr/packages/vite-intlayer/intlayerPrune.md +77 -4
  395. package/docs/tr/self_hosting.md +47 -50
  396. package/docs/uk/analytics.md +222 -0
  397. package/docs/uk/bundle_optimization.md +58 -25
  398. package/docs/uk/configuration.md +25 -8
  399. package/docs/uk/dictionary/nesting.md +47 -30
  400. package/docs/uk/formatters.md +128 -185
  401. package/docs/uk/intlayer_CMS.md +152 -0
  402. package/docs/uk/intlayer_with_angular_21.md +9 -9
  403. package/docs/uk/intlayer_with_nextjs_14.md +1 -26
  404. package/docs/uk/intlayer_with_solid_start.md +1078 -0
  405. package/docs/uk/live-sync.md +4 -0
  406. package/docs/uk/packages/react-intlayer/useDictionary.md +2 -19
  407. package/docs/uk/packages/vite-intlayer/exports.md +15 -0
  408. package/docs/uk/packages/vite-intlayer/intlayer.md +121 -6
  409. package/docs/uk/packages/vite-intlayer/intlayerPrune.md +77 -4
  410. package/docs/uk/releases/v9.md +0 -15
  411. package/docs/uk/self_hosting.md +60 -50
  412. package/docs/ur/bundle_optimization.md +58 -25
  413. package/docs/ur/configuration.md +25 -8
  414. package/docs/ur/intlayer_with_angular_21.md +9 -9
  415. package/docs/vi/analytics.md +222 -0
  416. package/docs/vi/bundle_optimization.md +58 -25
  417. package/docs/vi/configuration.md +24 -8
  418. package/docs/vi/dictionary/nesting.md +37 -184
  419. package/docs/vi/formatters.md +208 -309
  420. package/docs/vi/intlayer_CMS.md +164 -0
  421. package/docs/vi/intlayer_with_angular_21.md +9 -9
  422. package/docs/vi/intlayer_with_nextjs_14.md +0 -25
  423. package/docs/vi/intlayer_with_react_router_v7_fs_routes.md +70 -63
  424. package/docs/vi/intlayer_with_solid_start.md +1078 -0
  425. package/docs/vi/live-sync.md +4 -0
  426. package/docs/vi/packages/intlayer/getMultilingualUrls.md +4 -18
  427. package/docs/vi/packages/react-intlayer/useIntlayer.md +2 -2
  428. package/docs/vi/packages/vite-intlayer/exports.md +15 -0
  429. package/docs/vi/packages/vite-intlayer/intlayer.md +121 -6
  430. package/docs/vi/packages/vite-intlayer/intlayerPrune.md +77 -4
  431. package/docs/vi/plugins/sync-json.md +6 -6
  432. package/docs/vi/releases/v9.md +12 -0
  433. package/docs/vi/self_hosting.md +61 -50
  434. package/docs/zh/CI_CD.md +4 -0
  435. package/docs/zh/analytics.md +222 -0
  436. package/docs/zh/autoFill.md +28 -9
  437. package/docs/zh/bundle_optimization.md +58 -25
  438. package/docs/zh/configuration.md +24 -8
  439. package/docs/zh/dictionary/file.md +2 -0
  440. package/docs/zh/dictionary/nesting.md +47 -30
  441. package/docs/zh/formatters.md +140 -188
  442. package/docs/zh/intlayer_CMS.md +164 -0
  443. package/docs/zh/intlayer_with_analog.md +193 -3
  444. package/docs/zh/intlayer_with_angular_19.md +272 -3
  445. package/docs/zh/intlayer_with_angular_21.md +7 -7
  446. package/docs/zh/intlayer_with_create_react_app.md +348 -26
  447. package/docs/zh/intlayer_with_lynx+react.md +263 -4
  448. package/docs/zh/intlayer_with_nextjs_14.md +1 -28
  449. package/docs/zh/intlayer_with_nextjs_15.md +1 -33
  450. package/docs/zh/intlayer_with_nextjs_no_locale_path.md +558 -1
  451. package/docs/zh/intlayer_with_nuxt.md +182 -7
  452. package/docs/zh/intlayer_with_react_router_v7.md +183 -25
  453. package/docs/zh/intlayer_with_react_router_v7_fs_routes.md +306 -42
  454. package/docs/zh/intlayer_with_solid_start.md +1077 -0
  455. package/docs/zh/intlayer_with_storybook.md +260 -3
  456. package/docs/zh/intlayer_with_svelte_kit.md +428 -48
  457. package/docs/zh/intlayer_with_tanstack+solid.md +713 -13
  458. package/docs/zh/intlayer_with_tanstack.md +731 -20
  459. package/docs/zh/intlayer_with_vanilla.md +314 -4
  460. package/docs/zh/intlayer_with_vite+lit.md +465 -4
  461. package/docs/zh/intlayer_with_vite+preact.md +422 -116
  462. package/docs/zh/intlayer_with_vite+react.md +324 -45
  463. package/docs/zh/intlayer_with_vite+react_compiler.md +228 -13
  464. package/docs/zh/intlayer_with_vite+solid.md +462 -32
  465. package/docs/zh/intlayer_with_vite+vanilla.md +497 -4
  466. package/docs/zh/live-sync.md +4 -0
  467. package/docs/zh/mcp_server.md +3 -9
  468. package/docs/zh/packages/intlayer/getLocalizedUrl.md +26 -24
  469. package/docs/zh/packages/intlayer/getMultilingualUrls.md +4 -18
  470. package/docs/zh/packages/vite-intlayer/exports.md +29 -0
  471. package/docs/zh/packages/vite-intlayer/intlayer.md +121 -6
  472. package/docs/zh/packages/vite-intlayer/intlayerPrune.md +79 -6
  473. package/docs/zh/releases/v9.md +12 -0
  474. package/docs/zh/self_hosting.md +60 -50
  475. package/docs/zh-TW/bundle_optimization.md +58 -25
  476. package/docs/zh-TW/intlayer_with_angular_21.md +7 -7
  477. package/package.json +7 -7
  478. package/src/common.ts +39 -2
  479. package/src/generated/blog.entry.ts +66 -34
  480. package/src/generated/docs.entry.ts +273 -221
  481. package/src/generated/frequentQuestions.entry.ts +56 -24
  482. package/src/generated/legal.entry.ts +41 -9
@@ -37,6 +37,26 @@ npm install vite-intlayer
37
37
 
38
38
  导入:
39
39
 
40
+ ```ts
41
+ import { ... } from "vite-intlayer";
42
+ ```
43
+
44
+ | 导出 | 描述 | 相关文档 |
45
+ | -------------------------- | --------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
46
+ | `intlayer` | 主要 Vite 插件。准备字典、配置别名、启动开发服务器监听器,以及(从 v9 开始)捆绑代理和编译器。 | [intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/vite-intlayer/intlayer.md) |
47
+ | `intlayerPlugin` | (**已弃用**) `intlayer` 的别名。 | [intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/vite-intlayer/intlayer.md) |
48
+ | `intLayerPlugin` | (**已弃用**) `intlayer` 的别名。 | [intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/vite-intlayer/intlayer.md) |
49
+ | `intlayerProxy` | 本地化路由中间件插件(检测、重定向、重写)。从 v9 开始,它捆绑在 `intlayer()` 内部 — 仅在需要时单独注册。 | [intlayerProxy](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/vite-intlayer/intlayerProxy.md) |
50
+ | `intlayerMiddleware` | (**已弃用**) `intlayerProxy` 的别名。 | [intlayerProxy](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/vite-intlayer/intlayerProxy.md) |
51
+ | `intLayerMiddlewarePlugin` | (**已弃用**) `intlayerProxy` 的别名。 | [intlayerProxy](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/vite-intlayer/intlayerProxy.md) |
52
+ | `intlayerCompiler` | 从组件中提取内联内容声明并将其写入字典。从 v9 开始,它捆绑在 `intlayer()` 内部。 | [intlayerCompiler](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/vite-intlayer/intlayerCompiler.md) |
53
+ | `intlayerPrune` | 从生产 bundle 中树摇未使用的字典字段。 | [intlayerPrune](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/vite-intlayer/intlayerPrune.md) |
54
+ | `intlayerMinify` | 压缩编译后的字典 JSON 文件,并可选地破坏字段名。 | [intlayerMinify](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/vite-intlayer/intlayerMinify.md) |
55
+
56
+ ### 插件
57
+
58
+ 导入:
59
+
40
60
  ```tsx
41
61
  import "vite-intlayer";
42
62
  ```
@@ -48,3 +68,12 @@ import "vite-intlayer";
48
68
  | `intlayerProxy` | 开发时的中间件插件,用于处理语言检测和路由。 | - |
49
69
  | `intlayerMiddleware` | (**已弃用**) `intlayerProxy` 的别名。 | - |
50
70
  | `intlayerPrune` | 用于在构建期间对未使用的字典进行 tree-shake 和修剪的插件。 | [intlayerPrune](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/vite-intlayer/intlayerPrune.md) |
71
+
72
+ ### 类型
73
+
74
+ | 导出 | 描述 |
75
+ | ---------------------------- | -------------------------------------------------------------------------------------------------- |
76
+ | `IntlayerPluginOptions` | `intlayer()` 接受的选项。扩展 `GetConfigurationOptions`,添加 `compatCallers` 和 `proxy`。 |
77
+ | `IntlayerProxyPluginOptions` | `intlayerProxy()` 和 `createIntlayerProxyHandler()` 接受的选项。包括 `ignore` 和 `configOptions`。 |
78
+ | `IntlayerCompilerOptions` | `intlayerCompiler()` 接受的选项。包括 `configOptions` 和 `compilerConfig`。 |
79
+ | `CompatCallerConfig` | 从 `@intlayer/babel` 重新导出。描述用于字段使用分析的 compat-adapter 调用者模式。 |
@@ -39,11 +39,126 @@ export default defineConfig({
39
39
  });
40
40
  ```
41
41
 
42
- ## 描述
42
+ ## 选项
43
43
 
44
- 该插件执行以下任务:
44
+ ```ts
45
+ import type { IntlayerPluginOptions } from "vite-intlayer";
46
+ ```
47
+
48
+ `IntlayerPluginOptions` 扩展了 `GetConfigurationOptions`(参见 `@intlayer/config`),并添加了以下额外字段:
49
+
50
+ | 选项 | 类型 | 默认值 | 描述 |
51
+ | --------------- | ------------------------------- | ----------- | --------------------------------------------------------------------------------------------------- |
52
+ | `compatCallers` | `CompatCallerConfig[]` | `[]` | compat-adapter 包的额外调用者模式(例如 `@intlayer/react-i18next`)。在构建时传递给字段使用分析器。 |
53
+ | `proxy` | `{ ignore?: (req) => boolean }` | `undefined` | 转发到捆绑的区域设置路由代理的选项。使用 `ignore` 排除特定路径(例如 API 路由)不进行区域设置路由。 |
54
+
55
+ 所有其他选项(`override`、`configFile`、…)直接转发到 `getConfiguration()`。
56
+
57
+ ### 示例
58
+
59
+ #### 忽略来自区域设置路由的 API 路由
60
+
61
+ ```ts
62
+ // vite.config.ts
63
+ import { defineConfig } from "vite";
64
+ import { intlayer } from "vite-intlayer";
65
+
66
+ export default defineConfig({
67
+ plugins: [
68
+ intlayer({
69
+ proxy: {
70
+ ignore: (req) => req.url?.startsWith("/api"),
71
+ },
72
+ }),
73
+ ],
74
+ });
75
+ ```
76
+
77
+ #### 使用自定义配置文件路径
78
+
79
+ ```ts
80
+ export default defineConfig({
81
+ plugins: [
82
+ intlayer({
83
+ configFile: "./config/intlayer.config.ts",
84
+ }),
85
+ ],
86
+ });
87
+ ```
88
+
89
+ #### 带有 compat-adapter 调用者
90
+
91
+ ```ts
92
+ import { intlayer } from "vite-intlayer";
93
+ import { reactI18nextCallerConfig } from "@intlayer/react-i18next/plugin";
94
+
95
+ export default defineConfig({
96
+ plugins: [
97
+ intlayer({
98
+ compatCallers: [reactI18nextCallerConfig],
99
+ }),
100
+ ],
101
+ });
102
+ ```
103
+
104
+ ## 插件的作用
105
+
106
+ ### 1. 字典准备
107
+
108
+ 在构建开始前(以及开发中每小时一次),`intlayer` 调用 `prepareIntlayer` 来编译所有 `.content.ts` 文件到存储在 `.intlayer/` 中的优化 JSON 字典。
109
+
110
+ ### 2. Module aliases
111
+
112
+ 该插件添加了 Vite resolve aliases,使得 `import { myDict } from 'intlayer/dictionaries/my-dict'` 能够解析到磁盘上的已编译 JSON 文件。SSR 构建使用 `ssr.noExternal` 来确保所有 `@intlayer/*` packages 都与应用的 aliases 一起打包。
113
+
114
+ ### 3. Dev-server watcher
115
+
116
+ 在开发模式下,会启动一个 `chokidar` watcher。当 `.content.ts` 文件变化时,字典会被重新编译,Vite 的 HMR 会将更新传播到浏览器。
117
+
118
+ ### 4. 捆绑的语言环境路由代理 (v9+)
119
+
120
+ 自 Intlayer v9 起,`intlayerProxy` 中间件会自动在 `intlayer()` 内注册。它处理:
121
+
122
+ - 从 URL 前缀、cookies 和 `Accept-Language` 头进行语言环境检测。
123
+ - 当检测到的语言环境与当前 URL 不匹配时进行 301 重定向。
124
+ - 内部 URL 重写,以便框架看到正确的 `[locale]` 路由参数。
125
+
126
+ 代理由 Intlayer 配置中的 `routing.enableProxy`(默认 `true`)控制。要完全禁用它:
127
+
128
+ ```ts
129
+ // intlayer.config.ts
130
+ import { defineConfig } from "intlayer";
131
+
132
+ export default defineConfig({
133
+ routing: { enableProxy: false },
134
+ });
135
+ ```
136
+
137
+ 要在不进行单独 `intlayerProxy()` 调用的情况下自定义代理行为,请将 `proxy` 选项传递给主插件:
138
+
139
+ ```ts
140
+ intlayer({ proxy: { ignore: (req) => req.url?.startsWith("/api") } });
141
+ ```
142
+
143
+ 有关完整的路由行为参考,请参阅 [intlayerProxy 文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/vite-intlayer/intlayerProxy.md)。
144
+
145
+ ### 5. Bundled compiler (v9+)
146
+
147
+ 当 `compiler.enabled` 为 `true` **且** `compiler.output` 在你的 Intlayer config 中设置时,`intlayer()` 会自动注册 `intlayerCompiler`。编译器提取直接写在组件文件中的内联内容声明,并在转换时将其写入字典。参见 [intlayerCompiler 文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/vite-intlayer/intlayerCompiler.md)。
148
+
149
+ ### 6. 构建优化
150
+
151
+ 在生产构建期间,插件会添加:
152
+
153
+ - **intlayerOptimize** – Babel 转换,将 `useIntlayer('key')` 重写为 `useDictionary(hash)` 并注入直接的 JSON 导入。
154
+ - **intlayerPrune** – 从字典 JSON 中删除未使用的内容字段。
155
+ - **intlayerMinify** – 压缩字典 JSON,并可选地混淆字段名。
156
+
157
+ 这些在开发模式下处于非活动状态。
158
+
159
+ ## 已弃用的别名
45
160
 
46
- 1. **准备字典**:在构建或开发过程开始时,将字典编译为优化后的文件。
47
- 2. **监听模式**:在开发模式下,它会监视字典文件的更改并自动重新编译。
48
- 3. **别名**:为在应用中访问字典提供别名。
49
- 4. **Tree-shaking**:它通过 `intlayerPrune` 插件支持对未使用的翻译进行 tree-shaking。
161
+ | 已弃用的导出 | 替换项 |
162
+ | ---------------- | ---------- |
163
+ | `intlayerPlugin` | `intlayer` |
164
+ | `intLayerPlugin` | `intlayer` |
@@ -28,18 +28,91 @@ author: aymericzip
28
28
 
29
29
  `intlayerPrune` Vite 插件用于对应用包中未使用的字典进行 tree-shaking 和裁剪。这样可以通过仅包含必要的多语言内容来减小最终包的体积。
30
30
 
31
- ## 用法
31
+ ## 使用
32
+
33
+ ### 作为 `intlayer()` 的一部分(推荐)
34
+
35
+ 通过您的 Intlayer 配置启用剪枝,主插件会处理一切:
36
+
37
+ ```ts
38
+ // intlayer.config.ts
39
+ import { defineConfig } from "intlayer";
40
+
41
+ export default defineConfig({
42
+ build: {
43
+ optimize: true, // 启用剪枝和最小化
44
+ },
45
+ });
46
+ ```
47
+
48
+ ```ts
49
+ // vite.config.ts
50
+ import { defineConfig } from "vite";
51
+ import { intlayer } from "vite-intlayer";
52
+
53
+ export default defineConfig({
54
+ plugins: [intlayer()],
55
+ });
56
+ ```
57
+
58
+ ### 独立使用
59
+
60
+ 如果您是手动组合插件堆栈,`intlayerPrune` 和 `intlayerMinify` 共享一个 `PruneContext` 对象,该对象必须创建一次并传递给两者:
32
61
 
33
62
  ```ts
34
- // vite.config.ts(Vite 配置)
63
+ // vite.config.ts
35
64
  import { defineConfig } from "vite";
36
- import { intlayer, intlayerPrune } from "vite-intlayer";
65
+ import { intlayerPrune, intlayerMinify } from "vite-intlayer";
66
+ import { createPruneContext } from "@intlayer/babel";
67
+ import { getConfiguration } from "@intlayer/config/node";
68
+
69
+ const intlayerConfig = getConfiguration();
70
+ const pruneContext = createPruneContext();
37
71
 
38
72
  export default defineConfig({
39
- plugins: [intlayer(), intlayerPrune()],
73
+ plugins: [
74
+ intlayerPrune(intlayerConfig, pruneContext),
75
+ intlayerMinify(intlayerConfig, pruneContext), // 可选,从同一上下文读取
76
+ ],
40
77
  });
41
78
  ```
42
79
 
43
- ## 描述
80
+ ## 它的工作原理
81
+
82
+ ### 1. 使用情况分析 (buildStart)
83
+
84
+ 在 `buildStart` 期间,`intlayerOptimize` 插件(也是 `intlayer()` 的一部分)扫描 `build.filesList` 中列出的每个组件源文件。对于每个 `useIntlayer('key')` 或 `getIntlayer('key')` 调用,它会准确记录访问了哪些字段,例如:
85
+
86
+ ```ts
87
+ const { title, description } = useIntlayer("myDict");
88
+ // 记录: myDict → { title, description }
89
+ ```
90
+
91
+ 这在任何 `transform` 调用运行之前建立了 `pruneContext.fieldUsageMap`。
92
+
93
+ ### 2. JSON 修剪 (transform, enforce: 'pre')
94
+
95
+ 当 Vite 处理编译的字典 JSON 文件时,`intlayerPrune` 在 Vite 的内置 JSON → ESM 转换之前拦截它。它从 `pruneContext` 读取字段使用情况映射,并删除任何不在记录的使用集中的内容字段。
96
+
97
+ 支持两种内容形状:
98
+
99
+ - **静态字典** — `{ nodeType: "translation", translation: { en: {...}, fr: {...} } }`。字段在 `translation` 内按语言环境修剪。
100
+ - **动态(按语言环境)字典** — 扁平化 `{ fieldA: ..., fieldB: ... }`。字段在顶级进行修剪。
101
+
102
+ ### 3. Edge cases
103
+
104
+ 如果字典的内容结构无法识别(例如,不寻常的嵌套形状),它会被添加到 `pruneContext.dictionariesWithEdgeCases` 中并**保持不变**。会记录一条警告。`intlayerMinify` 也会跳过这些字典。
105
+
106
+ ### 4. Field-rename map
107
+
108
+ 当剪枝成功时,`intlayerPrune` 也会写入 `pruneContext.dictionaryKeyToFieldRenameMap` — 一个从原始字段名到简短别名的映射。`intlayerMinify` 读取此映射以在输出 JSON 中重命名字段,而 `intlayerOptimize` 的 Babel 重命名传递相应地更新源文件中的属性访问。
109
+
110
+ ## 激活条件
111
+
112
+ `intlayerPrune` **仅当**以下所有条件都为真时才会激活:
113
+
114
+ 1. Vite 命令是 `build`。
115
+ 2. `build.optimize` 是 `true`(或 `undefined`,在构建时默认为 `true`)。
116
+ 3. 在您的 Intlayer 配置中 `build.purge` 是 `true`。
44
117
 
45
- 该插件会分析你的源代码以识别哪些字典键实际上被使用。然后它会从打包后的字典文件中移除任何未使用的内容。对于拥有大量字典但在特定页面或组件中仅使用其中一部分的大型项目,这尤其有用。
118
+ 当 `editor.enabled` 是 `true` 时,它会自动**禁用**,因为编辑器需要完整的字典内容。
@@ -358,6 +358,18 @@ await dictionaryEndpoint(cms).pushDictionaries([myDictionary]);
358
358
 
359
359
  ---
360
360
 
361
+ ## 自托管
362
+
363
+ Intlayer v9 提供一流的支持,使您可以通过单个命令运行自己的 Intlayer 实例。无需 Intlayer Cloud 账户。
364
+
365
+ ```sh
366
+ curl -fsSL https://intlayer.org/install.sh | sh
367
+ ```
368
+
369
+ 安装程序下载 `docker-compose.yml` 和 `.env`,自动生成所需的密钥,并运行 `docker compose up -d`。一切内容 — dashboard、API、数据库、对象存储和事务性电子邮件 — 都在容器中本地运行。
370
+
371
+ ---
372
+
361
373
  ## Migration notes from v8
362
374
 
363
375
  If you are upgrading from v8, note that the v9 does not include breaking changes. But here are the key changes:
@@ -64,6 +64,32 @@ Chromium(用于 Puppeteer 屏幕截图生成)捆绑在后端镜像中——
64
64
 
65
65
  ## 快速开始
66
66
 
67
+ Pull 并运行已发布的镜像,提供您的 MongoDB Atlas 凭证和密钥:
68
+
69
+ ```sh
70
+ docker run -d --name intlayer \
71
+ -p 3000:3000 \
72
+ -p 3100:3100 \
73
+ -p 9000:9000 \
74
+ -p 9001:9001 \
75
+ -v intlayer-data:/data \
76
+ -e DB_ID="<atlas-user>" \
77
+ -e DB_MDP="<atlas-password>" \
78
+ -e DB_CLUSTER="<cluster>.xxxxx.mongodb.net" \
79
+ -e BETTER_AUTH_SECRET="$(openssl rand -hex 32)" \
80
+ -e S3_SECRET_ACCESS_KEY="$(openssl rand -hex 16)" \
81
+ -e RESEND_API_KEY="<your-resend-key>" \
82
+ aymericzip/intlayer-selfhost
83
+ ```
84
+
85
+ 然后打开 **http://localhost:3000**。
86
+
87
+ > dashboard 在 `localhost` 上提供。请参阅 [限制](#limitations) — 已发布的镜像不支持自定义域名。
88
+
89
+ ---
90
+
91
+ ## 快速开始
92
+
67
93
  ```sh
68
94
  curl -fsSL https://intlayer.org/install.sh | sh
69
95
  ```
@@ -99,7 +125,16 @@ curl -fsSL https://intlayer.org/install.sh | sh
99
125
 
100
126
  ## 环境变量
101
127
 
102
- 安装程序会生成一个即用型 `.env` 文件。下表描述了每个变量。
128
+ ### 必需
129
+
130
+ | Variable | Example | Description |
131
+ | ---------------------- | ---------------------------- | -------------------------------------------------------------------------------------------------------------------- |
132
+ | `DB_ID` | `intlayer` | MongoDB Atlas 用户 |
133
+ | `DB_MDP` | _(your password)_ | MongoDB Atlas 密码 |
134
+ | `DB_CLUSTER` | `cluster0.xxxxx.mongodb.net` | MongoDB Atlas 集群主机(在 `mongodb+srv://` URI 中使用) |
135
+ | `BETTER_AUTH_SECRET` | _(generated)_ | 用于会话签名的 32 字节密钥 |
136
+ | `S3_SECRET_ACCESS_KEY` | _(generated)_ | 捆绑 MinIO 的密钥 |
137
+ | `RESEND_API_KEY` | _(your key)_ | 通过 Resend 发送事务性邮件。除非你配置全局 SMTP 邮件器(见[全局邮件器](#global-mailer)),否则首次运行设置时为必需项 |
103
138
 
104
139
  ### 必需(自动生成或提示)
105
140
 
@@ -141,6 +176,26 @@ curl -fsSL https://intlayer.org/install.sh | sh
141
176
 
142
177
  ---
143
178
 
179
+ ### 全局邮件服务
180
+
181
+ 默认情况下,所有事务性电子邮件都通过使用 `RESEND_API_KEY` 的 Resend 发送。自托管部署可以改为通过配置了环境变量的全局邮件服务路由**所有**电子邮件 — 包括非组织电子邮件,例如密码重置和魔法链接。
182
+
183
+ 设置 `MAIL_PROVIDER` 以激活它。如果未设置,将使用默认的 Resend 邮件服务。
184
+
185
+ | 变量 | 示例 | 描述 |
186
+ | -------------------- | ------------------------------ | -------------------------------------------- |
187
+ | `MAIL_PROVIDER` | `smtp` | 全局传输:`smtp` 或 `resend`。留空使用默认值 |
188
+ | `MAIL_FROM` | `Intlayer <no-reply@acme.com>` | 发件人标题。接受裸地址或 `Name <email>` 格式 |
189
+ | `MAIL_SMTP_HOST` | `smtp.acme.com` | SMTP 主机(当 `MAIL_PROVIDER=smtp` 时必需) |
190
+ | `MAIL_SMTP_PORT` | `587` | SMTP 端口(默认为 `587`) |
191
+ | `MAIL_SMTP_SECURE` | `false` | 隐式 TLS。对于端口 `465` 设置为 `true` |
192
+ | `MAIL_SMTP_USER` | _(你的用户名)_ | SMTP 用户名(可选;无身份验证中继可省略) |
193
+ | `MAIL_SMTP_PASSWORD` | _(你的密码)_ | SMTP 密码 |
194
+
195
+ > 优先级:组织自己的邮件服务(从**组织**仪表板配置)优先于全局邮件服务,全局邮件服务优先于默认的 Resend 密钥。
196
+
197
+ ---
198
+
144
199
  ## 连接您的 Intlayer 项目
145
200
 
146
201
  堆栈运行后,将您的项目指向自托管的后端和仪表盘,而不是 `intlayer.org`。
@@ -259,47 +314,11 @@ docker run --rm \
259
314
 
260
315
  ---
261
316
 
262
- ## 使用反向代理 (Nginx / Caddy)
263
-
264
- 对于生产部署,请在应用和后端容器前放置一个反向代理,而不是直接暴露它们。
265
-
266
- ### Nginx 示例
267
-
268
- ```nginx
269
- server {
270
- listen 80;
271
- server_name cms.example.com;
272
-
273
- location / {
274
- proxy_pass http://localhost:3000;
275
- proxy_set_header Host $host;
276
- proxy_set_header X-Real-IP $remote_addr;
277
- }
278
- }
317
+ ## 限制条件
279
318
 
280
- server {
281
- listen 80;
282
- server_name api.example.com;
283
-
284
- location / {
285
- proxy_pass http://localhost:3100;
286
- proxy_set_header Host $host;
287
- proxy_set_header X-Real-IP $remote_addr;
288
- }
289
- }
290
- ```
291
-
292
- 更新以下 `.env` 变量以匹配您的公共域名:
293
-
294
- ```sh
295
- BACKEND_URL=https://api.example.com
296
- APP_URL=https://cms.example.com
297
- DOMAIN=example.com
298
- VITE_BACKEND_URL=https://api.example.com
299
- VITE_DOMAIN=example.com
300
- ```
301
-
302
- > `VITE_*` 变量在构建时被嵌入到仪表盘镜像中。如果在镜像构建后更改它们,您需要重建 `app` 镜像 (`docker compose build app`) 或使用运行时配置注入。
319
+ - **MongoDB 必须是外部的 (Atlas)。** 后端仅通过 `mongodb+srv://` 连接(由 `DB_ID` / `DB_MDP` / `DB_CLUSTER` 构建),因此不能使用普通的 `mongodb://host:27017` — 包括容器自己的捆绑 `mongod`。请提供一个 MongoDB Atlas 集群。
320
+ - **不支持自定义域名。** 所有面向浏览器的 `VITE_*` URL 都在构建时内联到应用中,发布的镜像带有 `localhost` 值。必须在 `http://localhost:3000` 上访问仪表板;在公共域上提供服务需要使用目标 URL 重新构建镜像,这在开箱即用时不受支持。
321
+ - **Email 需要工作的邮件程序。** 首次运行设置强制执行电子邮件验证,因此必须配置 `RESEND_API_KEY` 或 [全局 SMTP 邮件程序](#global-mailer)(`MAIL_PROVIDER=smtp` + `MAIL_SMTP_*`)。第一个管理员登录后,每个组织也可以从仪表板配置自己的 SMTP 或 Resend 邮件程序。
303
322
 
304
323
  ---
305
324
 
@@ -315,15 +334,6 @@ docker compose logs mongo
315
334
  docker compose logs redis
316
335
  ```
317
336
 
318
- ### 仪表盘无法连接到 API
319
-
320
- 验证 `VITE_BACKEND_URL` 是否与后端可以从**浏览器**(而非 Docker 网络)访问的 URL 匹配。如果您更改了后端端口或添加了反向代理,请重建仪表盘镜像:
321
-
322
- ```sh
323
- docker compose build app
324
- docker compose up -d app
325
- ```
326
-
327
337
  ### 电子邮件未发送
328
338
 
329
339
  默认情况下,所有出站电子邮件都会被 Mailpit 捕获。打开 `http://localhost:8025` 查看已发送的消息。要发送真实电子邮件,请在 `.env` 中设置 `MAIL_PROVIDER=resend` 和 `RESEND_API_KEY=<your-key>`,然后重启后端:
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  createdAt: 2025-11-25
3
- updatedAt: 2026-06-07
3
+ updatedAt: 2026-08-09
4
4
  title: 最佳化 i18n 打包體積與效能
5
5
  description: 透過最佳化國際化(i18n)內容來縮減應用程式包的大小。了解如何利用 Intlayer 實現字典的 tree shaking 和延遲載入(lazy loading)。
6
6
  keywords:
@@ -16,6 +16,12 @@ slugs:
16
16
  - concept
17
17
  - bundle-optimization
18
18
  history:
19
+ - version: 9.2.1
20
+ date: 2026-08-09
21
+ changes: "`purge` 與 `minify` 現在可透過 `@intlayer/swc` 在 Next.js 上運作 — 不需要 `babel.config.js`"
22
+ - version: 8.12.0
23
+ date: 2026-06-24
24
+ changes: "在參考表中依所需的流水線順序列出 Babel 外掛(extract → purge → minify → optimize)"
19
25
  - version: 8.12.0
20
26
  date: 2026-06-07
21
27
  changes: "為 Babel/Webpack 引入了 `intlayerPurgeBabelPlugin` 和 `intlayerMinifyBabelPlugin`,明確了外掛程式管線"
@@ -191,12 +197,14 @@ Intlayer 的建置最佳化被劃分為若干個職責單一的外掛程式。
191
197
 
192
198
  這些被直接運用在基於 Webpack 設定的 `babel.config.js` 當中(比如使用了 Babel 的 Next.js、CRA,或是自訂的 Webpack 等)。
193
199
 
200
+ 下表依所需的流水線順序列出它們(與它們必須在 `babel.config.js` 中出現的順序相同):
201
+
194
202
  | 外掛程式 | 功能說明 |
195
203
  | :---------------------------- | :----------------------------------------------------------------------------------------------------- |
196
204
  | `intlayerExtractBabelPlugin` | 掃描 `.content.ts` 檔案並把編譯好的字典寫入 `.intlayer/` |
197
- | `intlayerOptimizeBabelPlugin` | 將 `useIntlayer('key')` 重寫為 `useDictionary(hash)` 並注入匹配對應字典的 `import` 語句 |
198
205
  | `intlayerPurgeBabelPlugin` | 掃描所有原始碼檔案,從已編譯的 `.intlayer/**/*.json` 字典檔案中刪除**未被使用的內容欄位** |
199
206
  | `intlayerMinifyBabelPlugin` | **重新命名內容欄位的鍵(keys)** 為簡短的字母別名(例如 `title` 變成 `a`),作用範圍包括 JSON 與原始碼 |
207
+ | `intlayerOptimizeBabelPlugin` | 將 `useIntlayer('key')` 重寫為 `useDictionary(hash)` 並注入匹配對應字典的 `import` 語句 |
200
208
 
201
209
  > **外掛程式的執行順序很重要。** 在您的 `babel.config.js` 裡,purge 和 minify 的外掛程式必須放置在 optimize 外掛程式**之前**。最佳化步驟(optimize)會把 `useIntlayer('key')` 替換為模糊的 `useDictionary(hash)`,此舉抹除了能夠讓 purge 和 minify 識別哪些欄位被使用過的字典 key 資訊。
202
210
 
@@ -205,9 +213,9 @@ Intlayer 的建置最佳化被劃分為若干個職責單一的外掛程式。
205
213
  | 選項助手 | 配套外掛程式 |
206
214
  | :--------------------------- | :---------------------------- |
207
215
  | `getExtractPluginOptions()` | `intlayerExtractBabelPlugin` |
208
- | `getOptimizePluginOptions()` | `intlayerOptimizeBabelPlugin` |
209
216
  | `getPurgePluginOptions()` | `intlayerPurgeBabelPlugin` |
210
217
  | `getMinifyPluginOptions()` | `intlayerMinifyBabelPlugin` |
218
+ | `getOptimizePluginOptions()` | `intlayerOptimizeBabelPlugin` |
211
219
 
212
220
  ### Vite 外掛程式 (`vite-intlayer`)
213
221
 
@@ -220,6 +228,20 @@ Vite 使用者**不需要直接對它們進行設定**。當您在 `vite.config.
220
228
  | Dictionary minify | 等同於 `intlayerMinifyBabelPlugin` 的 JSON 寫入步驟 |
221
229
  | Babel transform | 等同於 `intlayerMinifyBabelPlugin` 的程式碼重新命名步驟 + `intlayerOptimizeBabelPlugin` |
222
230
 
231
+ ### SWC 外掛(`@intlayer/swc`)
232
+
233
+ Next.js 使用者同樣**從不直接設定這些**。自 **v9.2.1** 起,`next.config.ts` 中的 `withIntlayer()` 僅憑 `build.purge` 與 `build.minify` 兩個旗標就會執行完整流水線 —— 清除、壓縮與匯入重寫。
234
+
235
+ 工作被分成兩部分,因為 SWC Wasm 外掛一次只轉換一個檔案,且無法存取檔案系統:
236
+
237
+ | 階段 | 執行位置 | 作用 |
238
+ | :----------------------------------- | :----------------------------- | :------------------------------------------------------------- |
239
+ | 使用分析 + JSON 清除/壓縮 | Node,位於 `withIntlayer()` 內 | 讀取每個元件原始檔,重寫 `.intlayer/**/*.json`,產生重新命名表 |
240
+ | 原始碼重寫(`content.title` → `.a`) | `@intlayer/swc`(Wasm) | 將重新命名表套用到你程式碼中對應的屬性存取 |
241
+ | 匯入重寫(`useIntlayer` → dict) | `@intlayer/swc`(Wasm) | 與 `intlayerOptimizeBabelPlugin` 相同 |
242
+
243
+ 判斷_哪些_欄位未被使用以及每個欄位取得_什麼_別名,需要跨檔案狀態與檔案 I/O,因此這一半在 Node 中執行;SWC 外掛只接收產生的表。
244
+
223
245
  ## 各平台設定指南
224
246
 
225
247
  <Tabs>
@@ -227,10 +249,12 @@ Vite 使用者**不需要直接對它們進行設定**。當您在 `vite.config.
227
249
 
228
250
  ### Next.js
229
251
 
230
- Next.js 需要依靠 `@intlayer/swc` 外掛程式來進行最佳化步驟(匯入重寫),因為 Next.js 採用 SWC 作為編譯器。
252
+ Next.js 需要 `@intlayer/swc` 外掛,因為 Next.js 使用 SWC 進行建置。自 **v9.2.1** 起,這一個套件即可涵蓋整條流水線 —— 最佳化(匯入重寫)、清除與壓縮。
231
253
 
232
254
  > 該外掛程式並未預設安裝,因為 SWC 外掛程式在 Next.js 當中目前仍處於實驗階段。未來這部分有可能會發生改變。
233
255
 
256
+ > **Next.js 16.1.0 是最低版本。** 它是首個基於 SWC 向前相容 Wasm 外掛 ABI 建置的版本;更早的版本會拒絕該外掛。`withIntlayer` 會讀取你專案的 Next.js 版本,低於 16.1.0 時乾脆不註冊該外掛 —— 這些建置仍會成功,只是在沒有打包最佳化的情況下執行。
257
+
234
258
  <Tabs>
235
259
  <Tab value="npm">
236
260
 
@@ -265,33 +289,40 @@ intlayer-swc-plugin = "*"
265
289
 
266
290
  安裝完畢後,Intlayer 將會自動偵測並使用該外掛程式。
267
291
 
268
- 至於**清除(purge)和最小化(minify)**步驟(即欄位移除和欄位重新命名),請連同 `@intlayer/babel` 一併安裝並加入 Babel 外掛程式。由於 Next.js 依靠 SWC 處理程式碼轉化,但仍會評估 `babel.config.js` 以決定外掛程式設定,因此上述 Babel 外掛程式能夠在進入 SWC 前作為預處理步驟得以執行。
292
+ **清除與壓縮**階段(欄位移除與欄位重新命名)不需要額外套件,也不需要 `babel.config.js`。用 `withIntlayer` 包住你的設定,並在 `intlayer.config.ts` 中開啟相應旗標:
269
293
 
270
- ```bash packageManager="npm"
271
- npm install -D @intlayer/babel
294
+ ```typescript fileName="next.config.ts"
295
+ import { withIntlayer } from "next-intlayer/server";
296
+ import type { NextConfig } from "next";
297
+
298
+ const nextConfig: NextConfig = {/* 你的設定 */};
299
+
300
+ export default withIntlayer(nextConfig);
272
301
  ```
273
302
 
274
- ```javascript fileName="babel.config.js"
275
- const {
276
- intlayerPurgeBabelPlugin,
277
- intlayerMinifyBabelPlugin,
278
- getPurgePluginOptions,
279
- getMinifyPluginOptions,
280
- } = require("@intlayer/babel");
303
+ ```typescript fileName="intlayer.config.ts"
304
+ import type { IntlayerConfig } from "intlayer";
281
305
 
282
- module.exports = {
283
- presets: ["next/babel"],
284
- plugins: [
285
- // Purge: 移除 .intlayer/**/*.json 裡未被使用的內容欄位
286
- [intlayerPurgeBabelPlugin, getPurgePluginOptions()],
287
- // Minify: 對 JSON 以及原始碼裡的內容欄位的鍵(keys)進行重新命名
288
- [intlayerMinifyBabelPlugin, getMinifyPluginOptions()],
289
- // 注意: 在這裡不需要使用 intlayerOptimizeBabelPlugin,因為
290
- // @intlayer/swc 已經處理了 useIntlayer → useDictionary 的重寫過程。
291
- ],
306
+ const config: IntlayerConfig = {
307
+ build: {
308
+ purge: true, // 從打包的 JSON 中移除未使用的內容欄位
309
+ minify: true, // 將內容欄位鍵重新命名為簡短別名
310
+ },
292
311
  };
312
+
313
+ export default config;
293
314
  ```
294
315
 
316
+ 在 `next build` 期間,`withIntlayer` 會分析你的原始碼、重寫已編譯的字典,並將產生的欄位重新命名表交給 `@intlayer/swc`,由它更新你程式碼中對應的屬性存取。
317
+
318
+ > 請使用非同步的 `withIntlayer`,而不是 `withIntlayerSync`。同步版本不會執行分析流水線,因此清除與壓縮對它沒有效果。
319
+
320
+ > 清除與壓縮僅在 `next build` 時執行 —— 最佳化流水線在 `next dev` 期間是關閉的。
321
+
322
+ > 當設定了相容轉接器呼叫方時它們也會被停用(`swcExtraCallers`,由 `@intlayer/next-intl`、`@intlayer/react-i18next` 等相容套件設定):這些呼叫點對使用分析器不可見,因此清除會移除程式碼仍在讀取的欄位。匯入重寫仍保持啟用。
323
+
324
+ **更早的版本(9.2.1 之前)** 需要 `@intlayer/babel` 以及一個宣告 `intlayerPurgeBabelPlugin` 與 `intlayerMinifyBabelPlugin` 的 `babel.config.js`。該檔案不再需要,可以刪除。
325
+
295
326
  </Tab>
296
327
  <Tab value="vite">
297
328
 
@@ -447,6 +478,8 @@ export default config;
447
478
 
448
479
  > 如果在 `optimize` 被設為 `false`、又或是啟用了視覺化編輯器也就是當 `editor.enabled` 設定為了 `true` 時(由於編輯器需要保留欄位名稱以便做後續處理),重新命名這個操作都將會被跳過。
449
480
 
481
+ > 在 Next.js 上,當 `@intlayer/swc` 未安裝或無法載入時(Next.js 低於 16.1.0),壓縮同樣會被略過。重寫原始碼存取的正是這個外掛,因此在沒有它的情況下重新命名字典,會讓你的程式碼讀取已不存在的欄位名稱。
482
+
450
483
  > 同理,如果是利用了 `importMode: 'fetch'` 來載入欄位時此過程同樣不適用。因為它們的內容會以原始命名由後端 API 所提供,對客戶端內容隨意重新命名會破壞客戶端與伺服器端的匹配契約。
451
484
 
452
485
  ### 欄位清除 / Purging (去掉未被引用的欄位內容)
@@ -475,7 +508,7 @@ export default config;
475
508
  { "title": "…", "subtitle": "…" }
476
509
  ```
477
510
 
478
- > 與前邊提到的類似,當 `optimize` 是 `false` 或是開啟了視覺化編輯器(`editor.enabled` 取值 `true`) 時,它會選擇跳過對資料的清除操作。
511
+ > 與前邊提到的類似,當 `optimize` 是 `false` 或是開啟了視覺化編輯器(`editor.enabled` 取值 `true`) 時,它會選擇跳過對資料的清除操作。 在 Next.js 上,當 `@intlayer/swc` 不可用以及設定了相容轉接器呼叫方時,還會被額外略過。
479
512
 
480
513
  > 當檢測到某份程式碼因為異常無法順利解析、又或者當把由 `useIntlayer` 輸出的值以靜態解析器難以預測分析的模式在不同元件中來回丟(比如被打包成物件傳入等而未被進行解構)的時候,它同樣會跳過,以此保守地保留整部字典的全部資訊,避免意外發生。
481
514
 
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  createdAt: 2025-04-18
3
3
  updatedAt: 2026-05-31
4
- title: "Angular 21 i18n - 翻譯您的應用程式的完整指南"
5
- description: "告別 i18next。2026 年建構多語言 (i18n) Angular 21 應用程式的完整指南。使用 AI 代理翻譯並優化套件大小、SEO 和效能。"
4
+ title: "Angular 22 i18n - 翻譯您的應用程式的完整指南"
5
+ description: "告別 i18next。2026 年建構多語言 (i18n) Angular 22 應用程式的完整指南。使用 AI 代理翻譯並優化套件大小、SEO 和效能。"
6
6
  keywords:
7
7
  - 國際化
8
8
  - 文件
@@ -13,8 +13,8 @@ slugs:
13
13
  - doc
14
14
  - environment
15
15
  - angular
16
- applicationTemplate: https://github.com/aymericzip/intlayer-angular-21-template
17
- applicationShowcase: https://intlayer-angular-21-template.vercel.app/
16
+ applicationTemplate: https://github.com/aymericzip/intlayer-angular-22-template
17
+ applicationShowcase: https://intlayer-angular-22-template.vercel.app/
18
18
  history:
19
19
  - version: 8.9.0
20
20
  date: 2026-05-04
@@ -56,7 +56,7 @@ author: aymericzip
56
56
  <Tab label="程式碼" value="code">
57
57
 
58
58
  <iframe
59
- src="https://ide.intlayer.org/aymericzip/intlayer-angular-21-template?file=intlayer.config.ts"
59
+ src="https://ide.intlayer.org/aymericzip/intlayer-angular-22-template?file=intlayer.config.ts"
60
60
  className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
61
61
  title="Demo CodeSandbox - 如何使用Intlayer進行應用程式國際化"
62
62
  sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
@@ -67,7 +67,7 @@ author: aymericzip
67
67
  <Tab label="展示" value="demo">
68
68
 
69
69
  <iframe
70
- src="https://intlayer-angular-21-template.vercel.app/"
70
+ src="https://intlayer-angular-22-template.vercel.app/"
71
71
  className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
72
72
  title="Demo - intlayer-angular-template"
73
73
  sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
@@ -77,7 +77,7 @@ author: aymericzip
77
77
  </Tab>
78
78
  </Tabs>
79
79
 
80
- 在GitHub上查看 [應用程式模板](https://github.com/aymericzip/intlayer-angular-21-template)。
80
+ 在GitHub上查看 [應用程式模板](https://github.com/aymericzip/intlayer-angular-22-template)。
81
81
 
82
82
  <Steps>
83
83