使用您最喜欢的AI助手总结文档,并引用此页面和AI提供商
此页面的内容已使用 AI 翻译。
查看英文原文的最新版本如果您有改善此文档的想法,请随时通过在GitHub上提交拉取请求来贡献。
文档的 GitHub 链接复制文档 Markdown 到剪贴板
自定义域名
Intlayer 支持基于域名的语言路由,允许您从专用主机名提供特定语言。例如,可以将中国访问者引导至 intlayer.zh 而不是 intlayer.org/zh。
工作原理
routing 中的 domains 映射将每种语言与一个主机名关联。Intlayer 在两个地方使用此映射:
- URL 生成 (
getLocalizedUrl):当目标语言位于与当前页面 不同 的域名上时,返回绝对 URL(例如https://intlayer.zh/about)。当两个域名匹配时,返回相对 URL(例如/fr/about)。 - 服务器代理 (Next.js & Vite):进入的请求根据到达到达的域名进行重定向或重写。
专用域名 vs 共享域名
关键区别在于 专用性:
- 专用域名 - 只有一种语言映射到该主机名(例如
zh → intlayer.zh)。域名本身标识了语言,因此路径中不添加语言前缀。https://intlayer.zh/about提供中文内容。 - 共享域名 - 多种语言映射到同一个主机名(例如
en和fr都映射到intlayer.org)。应用正规的基于前缀的路由。intlayer.org/fr/about提供法语内容。
配置
末在 domains 中列出的语言将继续使用标准前缀路由,没有任何域名覆盖。
URL 生成
getLocalizedUrl 根据调用上下文自动产生正确的 URL 类型。
同域名语言(相对 URL)
跨域名语言(绝对 URL)
从语言自己的域名提供服务
当前域名自动检测
currentDomain 是可选的。省略时,getLocalizedUrl 按此顺序解析:
- 绝对输入 URL 的主机名(例如
https://intlayer.org/about→intlayer.org)。 - 浏览器环境中的
window.location.hostname。 - 如果两者均不可用(不带显式选项的 SSR),则为同域名语言返回相对 URL,并且不生成绝对 URL - 这是安全的回退方案。
带有域名的 getMultilingualUrls
getMultilingualUrls 为每种语言调用 getLocalizedUrl,因此它根据调用者的域名产生相对和绝对 URL 的混合:
这些绝对 URL 已准备好用于 SEO 的 <link rel="alternate" hreflang="..."> 标签。
代理行为
Next.js
intlayerProxy 中间件自动处理域名路由。将其添加到您的 middleware.ts 中:
重定向 - 请求到达了给定语言前缀的错误域名:
重写 - 请求到达了语言的专用域名且没有前缀:
Vite
intlayerProxy Vite 插件在开发期间应用相同的逻辑:
注意: 在本地开发中,您通常位于localhost,因此跨域名重定向将指向实时域名,而不是另一个本地端口。如果需要在本地测试多域名路由,请使用 hosts 文件覆盖(例如127.0.0.1 intlayer.zh)或反向代理。
语言切换器
来自 next-intlayer 的 useLocale hook 自动处理域名感知的导航。当用户切换到不同域名上的语言时,该 hook 会执行全页面导航 (window.location.href) 而不是客户端路由推送,因为 Next.js 路由无法跨越源 (origins)。
无需额外配置 - useLocale 内部检测 window.location.hostname 并决定是进行 router.replace(同域名)还是 window.location.href(跨域名)。
SEO: hreflang 备用链接
基于域名的路由通常与 hreflang 一起使用,以告诉搜索引擎为每种语言索引哪个 URL。使用 getMultilingualUrls 生成全套备用 URL:
这会产生:
核心实用程序
在弹窗中打开表格以清晰地查看所有数据
| 实用程序 | 描述 |
|---|---|
getLocalizedUrl(url, locale, { currentDomain }) | 返回相对或绝对 URL,取决于目标语言是否在当前域名上。 |
getMultilingualUrls(url, { currentDomain }) | 返回语言键控的本地化 URL 映射,根据需要混合相对和绝对 URL。 |
getPrefix(locale, { domains }) | 为专用域名语言返回空前缀,否则返回普通前缀。 |