使用您最喜欢的AI助手总结文档,并引用此页面和AI提供商
版本历史
- "更新 Solid useIntlayer API 用法以直接访问属性"v8.9.02026/5/4
- "针对 Tanstack Start Solid.js 添加"v8.5.12026/3/25
此页面的内容已使用 AI 翻译。
查看英文原文的最新版本如果您有改善此文档的想法,请随时通过在GitHub上提交拉取请求来贡献。
文档的 GitHub 链接复制文档 Markdown 到剪贴板
使用 Intlayer 翻译您的 Tanstack Start + Solid.js 网站 | 国际化 (i18n)
目录
本指南演示了如何集成 Intlayer,以便在包含 Solid.js 的 Tanstack Start 项目中实现无缝国际化、本地化感知路由、TypeScript 支持以及现代开发实践。
为什么选择 Inlayer 而不是替代品?
与“react-i18next”或“i18next”等主要解决方案相比,Intlayer是一个具有集成优化的解决方案,例如:
完整的 TanStack Start 覆盖
Intlayer 经过优化,可与 TanStack Start 和 Solid 完美配合,提供多语言路由、站点地图以及扩展国际化 (i18n) 所需的所有功能。
捆绑尺寸
不要将大量 JSON 文件加载到页面中,而只需加载必要的内容。 Intlayer 有助于将捆绑包和页面大小减少多达 50%。
可维护性
确定应用程序内容的范围有利于大型应用程序的维护。您可以复制或删除单个功能文件夹,而无需承担检查整个内容代码库的精神负担。此外,Intlayer 具有完全类型化 (fully typed),以确保您的内容的准确性。
人工智能代理
共置内容减少大型语言模型 (LLM) 所需的上下文。 Intlayer 还附带了一套工具,例如用于测试缺失翻译的 CLI、LSP、MCP 和 agent技能,使 AI 代理的开发者体验 (DX) 更加流畅。
自动化
使用您选择的法学硕士,通过自动化在 CI/CD 管道中进行翻译,而费用由您的 AI 提供商承担。 Intlayer 还提供了一个编译器来自动提取内容,以及一个网络平台来帮助在后台翻译。
表现
将大量 JSON 文件连接到组件可能会导致性能和反应性问题。 Intlayer 可在构建时 (build time)优化您的内容加载。
无需开发即可扩展
Intlayer 不仅仅是一个 i18n 解决方案,还提供了一个自托管的可视化编辑器和一个完整的 CMS 来帮助您管理多语言内容实时,与译员、文案人员和其他团队成员无缝协作。内容可以本地和/或远程存储。
在 Tanstack Start 应用中设置 Intlayer 的分步指南
在 GitHub 上查看应用模板。
第 1 步:创建项目
首先,按照 TanStack Start 网站上的开始新项目指南创建一个新的 TanStack Start 项目。
第 2 步:安装 Intlayer 包
使用您喜欢的包管理器安装必要的包:
复制代码到剪贴板
intlayer
solid-intlayer 将 Intlayer 与 Solid 应用集成的包。它为 Solid 提供国际化的上下文提供者和钩子。
vite-intlayer 包含用于将 Intlayer 与 Vite 构建工具集成的 Vite 插件,以及用于检测用户首选语言、管理 Cookie 和处理 URL 重定向的中间件。
第 3 步:项目配置
创建一个配置文件以配置应用程序的语言:
复制代码到剪贴板
通过此配置文件,您可以配置本地化 URL、中间件重定向、Cookie 名称、内容声明的位置和扩展名、禁用控制台中的 Intlayer 日志等。有关可用参数的完整列表,请参阅配置文档。
第 4 步:将 Intlayer 集成到您的 Vite 配置中
在您的配置中添加 intlayer 插件:
复制代码到剪贴板
intlayer() Vite 插件用于将 Intlayer 与 Vite 集成。它确保内容声明文件的构建,并在开发模式下监控它们。它在 Vite 应用中定义了 Intlayer 环境变量。此外,它还提供了减少性能开销的别名。
第 5 步:创建根布局 (Root Layout)
配置您的根布局以支持国际化,使用 useParams 检测当前语言,并在 html 标签上设置 lang 和 dir 属性。
复制代码到剪贴板
第 6 步:创建语言布局 (可选)
创建一个处理语言前缀并执行验证的布局。此布局将确保仅处理有效的语言。
如果您不需要在路由级别验证语言前缀,此步骤是可选的。
复制代码到剪贴板
此处的{-$locale}是一个动态路由参数,它会被当前语言替换。这种记法使该插槽变为可选,从而能够支持'prefix-no-default'等路由模式。
请注意,如果您在同一路由中使用了多个动态段 (如:
/{-$locale}/other-path/$anotherDynamicPath/...),此插槽可能会引起问题。 对于'prefix-all'模式,您可能更倾向于将插槽切换为$locale。 对于'no-prefix'或'search-params'模式,您可以完全移除此插槽。
第 7 步:声明您的内容
创建并管理您的内容声明以存储翻译:
复制代码到剪贴板
只要您的内容声明位于contentDir目录 (默认为./app) 中,就可以在应用程序的任何位置定义。并且它们应匹配内容声明文件扩展名 (默认为.content.{json,ts,tsx,js,jsx,mjs,cjs,md,mdx,yaml,yml})。
有关更多详细信息,请参阅内容声明文档。
第 8 步:利用语言感知的组件和钩子
为语言敏感的导航创建一个 LocalizedLink 组件:
复制代码到剪贴板
此组件有两个目的:
- 从 URL 中删除不必要的
{-$locale}前缀。 - 在 URL 中注入语言参数,以确保用户直接重定向到本地化路由。
接着,我们可以为编程式导航创建一个 useLocalizedNavigate 钩子:
复制代码到剪贴板
第 9 步:在您的页面中使用 Intlayer
在您的整个应用程序中访问您的内容字典:
本地化主页
复制代码到剪贴板
如果您想在字符串属性中使用内容,比如alt、title、href、aria-label等,可以使用函数的值,例如:
html复制代码复制代码到剪贴板
在 Solid 中,
useIntlayer返回响应式内容(例如content)。您可以直接访问其属性。欲了解更多关于
useIntlayer钩子的信息,请参考文档。
第 10 步:创建一个语言切换组件
创建一个允许用户更改语言的组件:
复制代码到剪贴板
在 Solid 中,来自
useLocale的locale是一个 signal accessor。请使用locale()(带括号) 来响应式地读取其当前值。欲了解更多关于
useLocale钩子的信息,请参考文档。
第 11 步:管理 HTML 属性
正如第 5 步所示,您可以在根组件中使用 useParams 来管理 html 标签的 lang 和 dir 属性。这确保了在服务器端和客户端都设置了正确的属性。
复制代码到剪贴板
第 12 步:添加中间件 (可选)
您还可以使用 intlayerProxy 为您的应用程序添加服务器端路由。此插件将根据 URL 自动检测当前语言并设置适当的语言 Cookie。如果没有指定语言,插件将根据用户的浏览器语言偏好确定最合适的语言。如果未检测到语言,它将重定向到默认语言。
请注意,要在生产环境中使用intlayerProxy,您需要将vite-intlayer包从devDependencies切换到dependencies。
复制代码到剪贴板
第 12 步:国际化您的元数据 (可选)
您还可以在 head 加载器中使用 getIntlayer 函数访问您的内容字典,以实现语言感知的元数据:
复制代码到剪贴板
第 13 步:在服务器操作中获取语言 (可选)
您可能希望从服务器操作 (server actions) 或 API 端点中访问当前语言。
您可以使用 intlayer 提供的 getLocale 助手函数来实现这一点。
以下是一个使用 TanStack Start 服务器函数的示例:
复制代码到剪贴板
第 14 步:管理“未找到”页面 (可选)
当用户访问不存在的页面时,您可以显示自定义的 404 页面,而语言前缀可能会影响 404 页面的触发方式。
理解带有语言前缀的 TanStack Router 404 处理
在 TanStack Router 中,使用本地化路由处理 404 页面需要一种分层的方法:
- 专用 404 路由:用于显示 404 UI 的特定路由。
- 路由级验证:验证语言前缀并将无效前缀重定向到 404。
- Catch-all 路由:捕获语言段内任何不匹配的路径。
复制代码到剪贴板
复制代码到剪贴板
复制代码到剪贴板
第 15 步:提取组件中的内容 (可选)
如果您拥有现有的代码库,转换数千个文件可能会非常耗时。
为了简化这一过程,Intlayer 建议使用编译器 / 提取器来转换您的组件并提取内容。
要设置它,您可以在 intlayer.config.ts 文件中添加一个 compiler 部分:
复制代码到剪贴板
import { type IntlayerConfig } from "intlayer";
const config: IntlayerConfig = {
// ... 其余配置
compiler: {
/**
* 指示是否启用编译器。
*/
enabled: true,
/**
* 定义输出文件路径
*/
output: ({ fileName, extension }) => `./${fileName}${extension}`,
/**
* 指示转换后是否应保存组件。
*
* - 如果为 `true`,编译器将重写磁盘上的组件文件。因此,转换将是永久性的,且编译器在下次运行时将跳过该转换。这样,编译器转换应用后便可以将其删除。
*
* - 如果为 `false`,编译器仅在构建输出代码中注入 `useIntlayer()` 函数调用,而保持基础代码库完好无损。转换仅在内存中进行。
*/
saveComponents: false,
/**
* 字典键前缀
*/
dictionaryKeyPrefix: "",
},
};
export default config;运行提取器以转换您的组件并提取内容
复制代码到剪贴板
第 16 步:生成站点地图 (可选)
Intlayer 带有内置的站点地图生成器,可帮助您轻松为应用程序创建站点地图。它处理本地化路由并为搜索引擎添加必要的元数据。
Intlayer 生成的站点地图支持xhtml:link命名空间(Hreflang XML 扩展)。与仅列出原始 URL 的默认站点地图生成器不同,Intlayer 会自动在页面的所有语言版本(例如/about、/about?lang=fr和/about?lang=es)之间创建所需的双向链接。这确保了搜索引擎能够正确索引并向合适的受众提供正确的语言版本。
要使用它,您首先需要配置 vite.config.ts 以启用本地化路由的预渲染,并禁用 TanStack Start 的默认站点地图生成。
复制代码到剪贴板
然后,创建一个使用 generateSitemap 函数的 src/routes/sitemap[.]xml.ts 路由:
复制代码到剪贴板
第 17 步:配置 TypeScript (可选)
Intlayer 使用模块扩充 (module augmentation) 来利用 TypeScript 的优势,并使您的代码库更加健壮。
确保您的 TypeScript 配置包含自动生成的类型声明:
复制代码到剪贴板
Git 配置
建议忽略 Intlayer 生成的文件。这可以避免将它们提交到您的 Git 仓库。
为此,您可以在 .gitignore 文件中添加以下指令:
复制代码到剪贴板
VS Code 扩展
为了提升 Intlayer 的开发体验,您可以安装官方的 Intlayer VS Code 扩展。
此扩展提供:
- 翻译键的自动补全。
- 缺失翻译的实时错误检测。
- 翻译内容的内联预览。
- 用于轻松创建和更新翻译的快速操作。
有关如何使用该扩展的更多详细信息,请参阅 Intlayer VS Code 扩展文档。
深入探索
如需深入了解,您可以实现可视化编辑器或使用 CMS 外置您的内容。