国际化 SEO (i18n SEO)
1. hreflang 标签
Next.js App Router 实现
// app/layout.tsx
import { Metadata } from 'next'
export const metadata: Metadata = {
alternates: {
canonical: 'https://example.com',
languages: {
'zh-CN': 'https://example.com/zh',
'en-US': 'https://example.com/en',
'ja-JP': 'https://example.com/ja',
'x-default': 'https://example.com/en', // 默认语言
},
},
}
HTML 实现
<head>
<!-- hreflang 标签 — 每种语言版本互相引用 -->
<link rel="alternate" hreflang="zh-CN" href="https://example.com/zh/page" />
<link rel="alternate" hreflang="en-US" href="https://example.com/en/page" />
<link rel="alternate" hreflang="ja-JP" href="https://example.com/ja/page" />
<link rel="alternate" hreflang="x-default" href="https://example.com/en/page" />
</head>
2. hreflang 规则
三种实现方式
- HTML
<link>标签(推荐,适合中小站点) - HTTP
Link响应头(适合非 HTML 文件如 PDF) -Link: <https://example.com/en/doc.pdf>; rel="alternate"; hreflang="en" - XML Sitemap(推荐大型站点,集中管理)
hreflang_rules:
must:
- "每个语言版本页面都必须包含指向所有版本(包括自身)的 hreflang 标签"
- "建议设置 x-default 指向默认语言版本或语言选择页(用于无匹配语言时的回退)"
- "hreflang 标签必须完整互引(A→B 则 B→A),缺失互引会被忽略"
- "语言代码使用 ISO 639-1(必填),国家代码使用 ISO 3166-1 Alpha 2(可选),脚本变体使用 ISO 15924(如 zh-Hans、zh-Hant)"
- "⚠️ 不能只指定国家不指定语言(如 hreflang='US' 是无效的,必须是 'en-US');EU/UN/UK 不是有效区域代码"
- "URL 必须是绝对路径"
- "三种方式(HTML link / HTTP header / sitemap)任选其一即可;可同时使用,但没有额外搜索收益且更难维护"
- "如有多个区域特定版本(en-ie、en-ca),应同时提供通用语言版本(en)作为回退"
avoid:
- "不完整互引(A 指向 B,但 B 不指向 A)— Google 会忽略该对"
- "指向 4xx/5xx 错误页面"
- "指向被 noindex 标记的页面"
- "指向被 robots.txt 阻止的页面"
- "hreflang 指向的 URL 与 canonical 不一致"
- "页面主要内容未翻译(仅翻译模板/导航不算本地化,Google 视为重复页面)"
language_detection:
- "⚠️ Google 不通过 hreflang 或 HTML lang 属性检测页面语言,而是用算法分析页面主要内容来判断"
- "hreflang 仅用于向搜索用户展示正确的语言版本,不影响 Google 对页面语言的判断"
url_structure:
subdirectory: "example.com/zh/, example.com/en/ — 推荐"
subdomain: "zh.example.com, en.example.com — 可选"
ccTLD: "example.cn, example.com — 最强信号但成本高"
3. 多语言 Sitemap
// app/sitemap.ts
import { MetadataRoute } from 'next'
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
const languages = ['zh', 'en', 'ja']
const pages = await getAllPages()
return pages.flatMap((page) =>
languages.map((lang) => ({
url: `https://example.com/${lang}/${page.slug}`,
lastModified: new Date(page.updatedAt),
changeFrequency: 'weekly' as const,
priority: 0.8,
alternates: {
languages: Object.fromEntries(
languages.map((l) => [l, `https://example.com/${l}/${page.slug}`])
),
},
}))
)
}
4. 内容本地化注意事项
localization_checklist:
content:
- "翻译所有用户可见的文本内容"
- "翻译 meta title 和 description"
- "翻译 Open Graph 标签"
- "翻译图片 alt 文本"
- "本地化日期、货币、度量单位格式"
technical:
- "设置正确的 <html lang='xx'> 属性"
- "使用正确的字符编码 (UTF-8)"
- "每个语言版本页面应有自己的 canonical URL,优先 canonical 到同语言版本;如无同语言等价页,再指向最佳替代语言版本"
- "每个语言版本页面应输出与该页面内容和语言一致的页面级结构化数据(如 Article、BreadcrumbList、Product);站点级 WebSite Schema 仅放首页或等价首页"
avoid:
- "不要使用自动翻译生成的低质量内容"
- "不要在同一个页面混合多种语言(Google 通过主要内容判断页面语言)"
- "不要使用 cookie 或 IP 自动重定向语言(提供语言切换器)— Googlebot 通常从美国 IP 抓取且通常不发送 Accept-Language,IP 重定向会让 Google 难以发现和抓取全部语言/地区版本"
- "推荐使用独立语言 URL + hreflang 标注,而非服务端自适应内容(adaptive serving)"
- "最佳实践是每种语言版本使用不同的 URL(不要用同一个 URL 根据 IP/cookie 切换语言)"
- "⚠️ Google 不识别 geolocation meta 标签或 HTML 属性进行地理定位,必须用 hreflang/ccTLD/明确链接"
- "URL 参数方式(?loc=de)不推荐用于多区域站点(索引和分区困难)"
相关文档
本文档为站内渲染。原始文件本地路径:saas/source/seo-llm/skill-google-seo-skill-references-i18n-seo-1cbef1.md(仅本地保留,不入库不部署)