直接答案:把多个语言页的 HTML 用一行 --- 隔开、第一行写 URL,工具在浏览器本地解析每个页面的 hreflang、canonical 与 html lang,然后核对:是否互指、是否声明 x-default、是否使用绝对 URL、是否引用自身、lang 与自身 hreflang 是否一致。它不联网,也不判断翻译质量。
hreflang 是最容易被写成“只做一半”的声明。我们自己的扫描里,25 个可分析首页只有 1 个带 hreflang;而在项目验收中更常见的问题是:A 页指向 B 页,B 页没指回来;或者写了英文 hreflang,但那其实是一个机器占位页。前者是结构问题,后者是内容问题——这个工具只解决前者,并把后者留给人工。
互指、x-default、绝对 URL、自身引用、lang 一致。
翻译是否真实、页面是否可达,工具不知道。
它不会抓站:只核对粘贴进来的页面。
工具:粘贴多个页面 → 检查
| 页面 | lang | canonical | hreflang | 自身引用 | x-default |
|---|
未提供的语言页只提示“无法核对互指”;相对地址、缺 lang、缺自指与互指断裂分别判定。
默认示例是完整的一对页面:两个页面互相声明、都带 x-default、lang 与自身 hreflang 一致,所以没有错误。点“载入缺互指示例”会把英文页指回中文页的那一行删掉,工具会立刻报“该页没有指回本页”。
检查规则
| 检查 | 级别 | 说明 |
|---|---|---|
| hreflang 使用相对地址 | 错误 | 声明必须是绝对 URL |
| A 指向 B,B 未指回 A | 错误 | 互指断裂,单向声明通常被忽略 |
| html lang 与自身 hreflang 主语言不一致 | 错误 | 如 lang="en" 但自指 hreflang="zh-CN" |
| 缺少 html lang / 完全没有 hreflang | 错误 | 基础声明缺失 |
| 缺少 x-default | 警告 | 兜底页未指定 |
| 没有指向自身的 hreflang | 警告 | 自身也应出现在语言集合里 |
| 重复声明同一语言 | 警告 | 同一 hreflang 出现两次 |
| 各页 x-default 指向不同地址 | 警告 | 兜底页不一致 |
| 缺少 canonical | 警告 | 以输入 URL 兜底 |
区域差异(zh-CN 与 zh-TW)不在本版判定范围;只比较主语言(zh / en)。
五个常见失败
- 只在一个页面写。 中文页声明英文页,英文页没有回头声明;工具直接报互指断裂。
- 相对地址。
hreflang="en" href="/en/"在部分实现里会被忽略;必须写全 URL。 - 忘了 x-default。 语言匹配失败时没有兜底页,用户可能被送到错误语言版本。
- lang 与 hreflang 打架。 页面写着
lang="zh-CN",自指却写hreflang="en",信号矛盾。 - 声明了不存在的页面。 工具在未提供对应页时只提示“无法核对”;是否真实存在仍要自己取一次。
边界
- 不抓站:只解析粘贴的 HTML;未提供的语言页无法核对。
- 不判翻译:页面是不是机器占位、内容是否等价,需人工或另行抽样。
- 不判可达:不请求 URL,因此 404、跳转、登录墙都看不到。
- 不保证生效:声明结构正确不等于搜索引擎一定按此处理。
测试与复算
逻辑在 js/hreflang-check.js(无依赖、无网络);scripts/test_hreflang_check.js 覆盖 32 条断言:URL 归一化、页面解析(属性顺序)、互指断裂、相对地址、重复声明、x-default 缺失与不一致、lang 不一致、单页、空输入与计数。运行:
node scripts/test_hreflang_check.js
配套:12 条验收条款模板(第 6 条即 hreflang)、JSON-LD 检查器、30 家装备企业扫描(hreflang 1/25)。
数据来源与口径
- Google Search Central《Localized versions of your page》:developers.google.com。
- HTML 语言声明:HTML Standard。
- hreflang 取值:IETF 语言标签(工具只比较主语言)。