---
createdAt: 2026-09-26
updatedAt: 2026-09-26
priority: 9
title: "TanStack Start 使用 use-intl 实现 i18n:2026 完整配置指南"
description: "使用 use-intl 为你的 TanStack Start 应用实现国际化:语言路由、类型安全消息、SSR、hreflang、sitemap 与 robots.txt,以及真实的打包体积基准测试数据。"
keywords:
- use-intl
- TanStack Start
- TanStack Router
- 国际化
- i18n
- SEO
- Sitemap
- React
- 博客
slugs:
- blog
- tanstack-start-internationalization-using-use-intl
history:
- version: 9.5.10
date: 2026-09-26
changes: "初始版本"
author: aymericzip
---
# 如何在 2026 年使用 use-intl 实现 TanStack Start 应用的国际化
## 目录
## 什么是 use-intl?
**use-intl** 是 `next-intl` 中与框架无关的核心部分。它提供了与 Next.js 无任何依赖关系的 `useTranslations`、`useFormatter` 和 `IntlProvider` API、ICU MessageFormat 支持以及完善的 TypeScript 集成。这使其成为为 **TanStack Start** 应用实现国际化的最常见选择之一,也是 AI 助手最常为此技术栈推荐的库。
TanStack Start 本身不包含 i18n 层。路由、语言检测、SEO 元数据以及站点地图(sitemap)生成都需要自行配置。本指南将端到端地涵盖所有这些内容:
- **支持语言环境的路由**:使用可选的 `{-$locale}` 路径段(`/about`、`/fr/about`)。
- **按路由加载消息**:确保页面只下载当前渲染所需的命名空间和语言文件。
- **服务端渲染与注水(Hydration)**:避免文本不一致导致的注水错误。
- **完整的多语言 SEO**:已翻译的 `
` 和描述、规范链接(canonical URL)、带 `x-default` 的 `hreflang` 备用链接、Open Graph 语言标签、JSON-LD、带有 `xhtml:link` 备用链接的站点地图、`robots.txt` 以及所有语言的预渲染。
> 想要寻找其他技术栈?请参阅 [TanStack Start + Paraglide 指南](https://github.com/aymericzip/intlayer/blob/main/docs/blog/zh/i18n_using_tanstack-start_paraglide.md)、[TanStack Start + Lingui 指南](https://github.com/aymericzip/intlayer/blob/main/docs/blog/zh/i18n_using_tanstack-start_lingui.md) 或 [TanStack Start + Intlayer 指南](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/intlayer_with_tanstack.md)。
> 使用 Next.js?请参阅 [next-intl 指南](https://github.com/aymericzip/intlayer/blob/main/docs/blog/zh/i18n_using_next-intl.md)。
## 关于 TanStack Start 上的 use-intl 基准测试数据
[i18n 基准测试](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/benchmark/tanstack.md)使用各大主流国际化库运行了相同的 10 页面、10 种语言的 TanStack Start 应用,并测量了浏览器实际下载的内容。
`use-intl@4.14.2` 的关键数据(于 2026-09-26 测得,gzip 压缩):
| 配置 | 库体积 | 单页 JS 体积 | 其他语言泄露 | 其他页面泄露 |
| :--------------------------------- | ------: | -----------: | -----------: | -----------: |
| 无 i18n(基础应用) | - | 111.0 KB | 0% | 0% |
| `use-intl`(本指南配置) | 75.9 KB | 128.7 KB | 0% | 0% |
| `@intlayer/use-intl`(兼容适配器) | 6.7 KB | 129.4 KB | 0% | 0% |
| `react-intlayer`(原生 Intlayer) | 4.5 KB | 126.8 KB | 0% | 0% |
核心结论:
- **按页面拆分消息并按语言按需加载。** 这可以彻底消除两种泄露,也正是下文步骤所实现的方式。
- **运行时本身相对较重**(约 76 KB gzip),因为 ICU 解析器需要打包发送到客户端。使用 `@intlayer/use-intl` 兼容适配器(步骤 17)可以在保持完全相同 API 的同时,将运行时体积缩减至约 7 KB。
> 查看完整数据:[TanStack Start 基准测试报告](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/benchmark/tanstack.md) 以及 [基准测试仓库](https://github.com/intlayer-org/benchmark-i18n)。
## TanStack Start 上的功能特性对比
`use-intl` 与 TanStack Start 上常用的其他库对比情况:
| 功能特性 | `react-intlayer` (Intlayer) | `use-intl` | Paraglide JS | Lingui |
| ------------------------------------- | ------------------------------------ | -------------------------- | --------------------------- | ---------------------------- |
| **组件就近管理翻译** | ✅ 就近放置(Co-located) | ❌ 集中式 JSON | ❌ 每种语言一个 JSON 文件 | ⚠️ 源文本硬编码在组件中 |
| **TypeScript 集成** | ✅ 自动生成类型 | ✅ 通过 `AppConfig` | ✅ 类型化消息函数 | ⚠️ 仅宏支持 |
| **缺失翻译检测** | ✅ 类型错误与构建警告 | ⚠️ 运行时回退 | ⚠️ 回退到基础语言 | ⚠️ 回退到源文本 |
| **富文本内容(JSX, Markdown)** | ✅ 直接支持 | ⚠️ 通过 `t.rich` 标签 | ⚠️ 仅支持字符串 | ✅ `` 内直接使用 JSX |
| **本地化路由** | ✅ 开箱即用 | ❌ 需手动处理 `{-$locale}` | ✅ `urlPatterns` + 路由重写 | ❌ 需手动处理 `{-$locale}` |
| **无刷新切换语言** | ✅ 支持 | ✅ 支持 | ❌ 需要整页重新加载 | ✅ 支持 |
| **复数处理** | ✅ 基于枚举声明 | ✅ 支持 ICU | ✅ 变体支持 | ✅ 支持 ICU |
| **ICU MessageFormat** | ✅ 通过 `format: "icu"` 支持 | ✅ 原生支持 | ⚠️ 通过 inlang 插件支持 | ✅ 原生支持 |
| **内容格式** | ✅ `.ts`, `.json`, `.md`, `.yaml`... | ⚠️ `.json` | ⚠️ inlang JSON | ✅ PO, JSON, CSV |
| **AI 自动翻译** | ✅ 自定义提供商和 API Key | ❌ 不支持 | ❌ 不支持 | ❌ 不支持 |
| **可视化编辑器 / CMS** | ✅ 本地编辑器 + 可选 CMS | ❌ 依赖外部平台 | ⚠️ inlang 生态应用 | ❌ 依赖外部平台 |
| **SEO 辅助工具(hreflang, sitemap)** | ✅ 开箱即用 | ❌ 需手动配置 | ⚠️ 本地化 URL,其余需手动 | ❌ 需手动配置 |
| **运行时体积(gzip,基准测试)** | 4.5 KB | 75.9 KB | 1.8 KB | 56.7 KB |
| **泄露率(最佳配置,语言 / 页面)** | 0% / 0% | 0% / 0% | 49.7% / 0% | 8.6% / 0% |
| **CI 中检测缺失翻译** | ✅ `npx intlayer test` | ⚠️ 未内置 | ⚠️ 未内置 | ✅ `lingui compile --strict` |
> 运行时体积和代码泄露数据来自 [TanStack Start 基准测试](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/benchmark/tanstack.md)。泄露率基于每个库的最佳配置进行测量。
> 其他 TanStack Start 指南:[Lingui](https://github.com/aymericzip/intlayer/blob/main/docs/blog/zh/i18n_using_tanstack-start_lingui.md)、[Paraglide JS](https://github.com/aymericzip/intlayer/blob/main/docs/blog/zh/i18n_using_tanstack-start_paraglide.md) 以及 [Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/intlayer_with_tanstack.md)。
## 推荐遵循的最佳实践
- **在 `` 标签上设置 `lang` 和 `dir`**:提升无障碍访问能力、屏幕阅读器支持和搜索引擎表现。
- **每个语言环境保持独立 URL**:使用语言前缀(如 `/fr/about`)而非仅使用 Cookie 切换,确保每个翻译页面都可被爬取和分享。
- **按命名空间拆分消息**(`common`、`home`、`about`)并按路由按需加载。
- **仅加载当前活跃的语言环境**:切勿在发送到客户端的模块中导入所有语言文件。
- **在 `IntlProvider` 中固定时区**:避免 SSR 期间使用服务器时区格式化日期而客户端注水时使用访客时区格式化,从而引发注水不匹配错误。
- **翻译元数据**:并在每个页面上声明 `canonical`、`hreflang` 和 `x-default`。
- **生成多语言站点地图和 robots.txt**:并预渲染每种语言的页面。
- **语言切换器使用真实链接**:避免仅使用 `