astro-i18next如何向Astro注入i18next脚本:injectScript与服务端/客户端加载机制深度解析
【免费下载链接】astro-i18nextAn astro integration of i18next + some utility components to help you translate your astro websites!项目地址: https://gitcode.com/gh_mirrors/as/astro-i18next
astro-i18next是一款面向 Astro 站点的多语言国际化集成,它把i18next生态无缝接入 Astro,让你用几行配置就能让页面支持多语言。这篇文章带你深入它的核心机制:它到底是如何在构建阶段把 i18next 初始化脚本"注入"到你的页面里,以及server/client两种加载模式分别在什么时候生效。
一、一分钟认识 astro-i18next
在动手之前,先了解它的三大组成 🧩:
| 组成 | 作用 |
|---|---|
| Astro 集成(Integration) | 在配置阶段自动生成并注入 i18next 初始化脚本 |
| 工具组件 | Trans、LanguageSelector、HeadHrefLangs等开箱即用组件 |
| 工具函数 | localizePath、localizeUrl、interpolate等国际化辅助函数 |
使用方式非常简单:安装后在astro.config.mjs中注册集成,再写一个astro-i18next.config.ts声明默认语言和支持的语言,然后把翻译 JSON 放到public/locales/目录下即可。集成入口定义在 src/index.ts,工具组件位于 src/components/。
二、关键开关:load选项决定 i18next 在哪里运行
整个加载机制的核心,是配置里的load字段(类型定义见 src/types.ts#L52-L58):
load取值 | 服务端(页面 frontmatter / SSR) | 客户端(浏览器、React 岛) |
|---|---|---|
["server"](默认) | ✅ | ❌ |
["client"] | ❌ | ✅ |
["server", "client"] | ✅ | ✅ |
默认值定义在 src/config.ts#L9 中,即["server"]——这也是最常见的静态站点(SSG)场景的最优选择。
三、服务端机制:injectScript("page-ssr")如何生效 🔧
当load包含"server"时,集成会在 Astro 的astro:config:setup钩子里做三件事(源码见 src/index.ts#L70-L110):
- 自动拼装服务端配置:
supportedLngs、fallbackLng直接取你配置的locales,加载路径指向public/locales/{{lng}}/{{ns}}.json; - 自动挂载
i18next-fs-backend插件,让 i18next 能从本地文件系统读取翻译 JSON; - 调用
injectScript("page-ssr", ...),把"导入 + 初始化"脚本注入到page-ssr注入点。
所谓page-ssr注入点,是 Astro 提供的特殊插槽——被注入的脚本会在每个.astro文件的 frontmatter 执行前由 Astro 自动引入。也就是说,你无需在任何页面里手动import i18next,就能直接使用t("key")拿翻译、用i18next.language设置<html lang>。
注入的最后还有一行关键调用:initAstroI18next(config)(见 src/index.ts#L170-L173),它把完整的 locale、routes 等配置写入运行时全局状态,localizePath等工具函数正是靠这份状态工作。
四、客户端机制:injectScript("before-hydration")提前于水合执行 🌐
当load还包含"client"时(源码见 src/index.ts#L112-L143),集成会另外构建一套浏览器端初始化脚本:
- 后端换成
i18next-http-backend,浏览器直接请求/locales/...下的 JSON(resourcesBasePath默认/locales); - 自动挂载
i18next-browser-languagedetector,且检测顺序只认htmlTag——即跟随<html lang>,与showDefaultLocale等路由策略保持一致; - 调用
injectScript("before-hydration", ...),脚本被注入到 HTML 头部,在任何客户端组件水合之前就完成 i18next 初始化。
这正是 Astro 的React 岛屿等交互组件能直接使用t()的前提:等水合发生时,浏览器端的 i18next 已经就绪。
五、如何选型?一张表看懂 💡
| 你的场景 | 推荐load | 原因 |
|---|---|---|
| 纯静态/SSG 文案站点 | ["server"] | 服务端渲染即可,浏览器零额外 JS |
| SSR 站点(如 Node 示例) | ["server"] | 页面在服务端渲染翻译 |
| 含 React 岛等客户端交互 | ["server", "client"] | 客户端切换语言、水合后翻译不断档 |
两个可对照的官方示例:
- Node SSR 场景:examples/node/astro-i18next.config.ts(仅默认配置)
- React 岛屿场景:examples/react/astro-i18next.config.ts(同时开启 server/client,并为两端挂载
react-i18next插件)
六、进阶:自定义 i18next 配置与插件 🛠
如果默认行为不够用,配置里留了充分的扩展位(类型定义见 src/types.ts#L67-L124):
i18nextServer/i18nextClient:分别向两端注入任意 i18nextInitOptions(如debug: true,参考 examples/basics/astro-i18next.config.ts);i18nextServerPlugins/i18nextClientPlugins:按"导入名: 包名"自由指定插件,甚至传null可以关闭某个默认插件(见 src/index.ts#L153-L163 的拼装逻辑)。
总结
astro-i18next 的精髓可以概括为一句话:在astro:config:setup钩子里,用 Astro 原生的injectScript能力,把两端各自正确的 i18next 初始化脚本分别注入page-ssr与before-hydration两个插槽。理解了这个机制,你就能根据站点形态(SSG / SSR / 客户端岛屿)精准选择load策略,写出又快又省的多语言 Astro 站点 🚀
【免费下载链接】astro-i18nextAn astro integration of i18next + some utility components to help you translate your astro websites!项目地址: https://gitcode.com/gh_mirrors/as/astro-i18next
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考