一个在建站所在国家运行完美的网站,在另外十二个国家可能悄无声息地出问题。意大利地区从未翻译的结账按钮、对德国访客显示美元价格、在法国遮住整个页面的同意横幅、因 hreflang 指向错误 URL 而永远不会被搜索引擎发现的语言版本。这些问题在团队从办公室测试时都不会出现。
原因很简单:不同市场之间变化的大部分内容,取决于访问者所在的位置。要看到本地客户所看到的内容,你必须从该市场内部进行测试。本指南将介绍如何大规模运行跨市场本地化 QA:需要检查什么、如何像本地访问者一样查看每个市场,以及一个能自动捕获最常见错误的小型检查工具。
为什么本地化错误会隐藏起来
本地化网站很少针对每种语言提供一个固定页面。它们会在请求时根据访问者发送的信号来决定显示什么:
- 位置,来自 IP 地址:货币、价格、配送选项、法律横幅、产品可用性,有时甚至是语言本身。
- 语言偏好,来自浏览器:显示哪种翻译,以及如何格式化日期和数字。
- URL,例如
/de/或de.example.com:网站被要求提供的版本,这可能与其他两个信号一致,也可能不一致。
总部测试通常只覆盖一种组合:总部所在国家、英文浏览器和默认 URL。翻译审查检查的是文字本身,而不是页面实际呈现的样子。错误就藏在没人尝试过的组合里。
单一市场中会出现什么问题
| 错误 | 示例 | 通常是如何发生的 |
|---|---|---|
| 未翻译的字符串 | 意大利网站上出现 “Add to cart” | 新功能上线时使用英文字符串,从未进入翻译流程 |
| 货币或价格格式错误 | 对德国访客显示 $49.99,或显示 49.99 € 而不是 49,99 € | 货币在一处由 URL 决定,在另一处由 IP 决定 |
| hreflang 损坏 | 某个语言版本指向 404 或指向另一种语言 | 上线后 URL 发生变化,备用链接未更新 |
缺失或错误的 lang 属性 | 德语页面上出现 lang="en" | 共享模板中硬编码的属性 |
| 重定向循环或强制重定向 | 奥地利的访问者被发送到德国商店且无法返回 | 忽略明确选择的地理重定向 |
| 法律与同意层 | 某个欧盟国家的横幅遮住了内容 | 针对特定国家的同意配置 |
| 布局溢出 | 德语标签撑破按钮,从右到左的文字破坏网格布局 | 设计只用较短的英文字符串测试过 |
其中几项会直接影响搜索。lang 属性错误或备用链接损坏的页面,可能被索引为错误的语言,或者根本不被索引。我们的指南使用 hreflang 查找页面的每个语言版本展示了如何梳理网站的备用链接并找出那些指向无效目标的链接。
第一步:像本地访问者一样查看每个市场
核心要求是从市场内部请求每个页面,并使用配置得像本地访问者一样的浏览器。实际上这意味着三件事必须彼此一致:
- 市场内的 IP 地址。 具有国家或城市定向功能的住宅代理,能让你获得本地消费者连接上的地址,这正是网站地理逻辑所期望的。我们的住宅代理覆盖 195+ 个国家,并在需要时提供城市定向。
- 市场的语言和区域设置。 设置浏览器的语言头和区域设置以匹配。
- 市场的时区,如果你在真实浏览器中测试,因为有些网站会将其作为另一个位置信号。
如果这些信号不一致,你测试的就是一个真实客户从未遇到过的组合,可能会去追查根本不存在的错误。我们的指南匹配代理地理位置、时区和区域设置介绍了如何从一个设置推导出这三者。
同时,每个市场都要用全新会话测试。之前访问留下的 Cookie 可能会将网站锁定在你上次测试的国家,从而掩盖地理逻辑错误。
第二步:以相同方式检查每个市场
视觉审查无法扩展到几十个市场和数千个页面,但大多数本地化错误都可以在 HTML 中检测出来。下面的函数检查一个本地化页面中四个最常见的问题:lang 属性、遗留的英文字符串、错误货币的价格,以及该市场缺失的 hreflang 条目。
import re
from lxml import html as lxml_html
def market_problems(page_html, market):
"""Things that only break in one market, checked on one localized page.
market: {"lang": "de", "currency": "€", "leftovers": ["Add to cart", "Free shipping"]}
"""
doc = lxml_html.fromstring(page_html)
problems = []
lang = (doc.get("lang") or "").lower()
if not lang.startswith(market["lang"]):
problems.append(f"html lang is {lang or 'missing'}, expected {market['lang']}")
text = " ".join(" ".join(doc.itertext()).split())
for phrase in market["leftovers"]:
if phrase.lower() in text.lower():
problems.append(f"untranslated text: {phrase!r}")
prices = re.findall(r"[$€£¥₩R]\$?\s?\d[\d.,]*|\d[\d.,]*\s?[$€£¥₩]", text)
wrong = [p for p in prices if market["currency"] not in p]
if wrong:
problems.append(f"{len(wrong)} of {len(prices)} prices not in {market['currency']}, e.g. {wrong[0]!r}")
if not doc.xpath(f"//link[@rel='alternate'][starts-with(@hreflang, '{market['lang']}')]"):
problems.append(f"no hreflang entry for {market['lang']}")
return problems
在两个页面上运行它(示例 HTML,非真实网站):
from locqa import market_problems
markets = {
"de": {"lang": "de", "currency": "€", "leftovers": ["Add to cart", "Free shipping"]},
"fr": {"lang": "fr", "currency": "€", "leftovers": ["Add to cart", "Free shipping"]},
}
pages = { # in practice: the same product page, fetched from inside each market
"de": '<html lang="de"><head><link rel="alternate" hreflang="de" href="/de/p/1"></head>'
'<body><h1>Wasserkocher</h1><p>49,99 €</p><p>Free shipping</p></body></html>',
"fr": '<html lang="fr"><head><link rel="alternate" hreflang="fr" href="/fr/p/1"></head>'
'<body><h1>Bouilloire</h1><p>$49.99</p><p>Ajouter au panier</p></body></html>',
}
for code, page in pages.items():
print(code, market_problems(page, markets[code]) or "ok")
de ["untranslated text: 'Free shipping'"]
fr ["1 of 1 prices not in €, e.g. '$49.99'"]
德语页面上有一处遗留的英文短语;法语页面显示了美元价格。这两者都能通过翻译审查,因为翻译字符串本身没有问题。
从你自己的界面构建遗留短语列表:按钮标签、配送和结账消息、错误消息。这些是最常在后期添加的字符串。价格格式需要比货币符号更细致的处理,因为同一个符号可以有多种写法;我们的指南统一不同区域的价格、数字和日期格式介绍了如何可靠地解析它们。
第三步:按计划运行
本地化问题不仅在上线时出现,上线后也会不断出现。一个新功能、一次模板更改或一次定价更新,可能会破坏一个市场,而其他市场看起来都正常。一个实用的节奏是:
- 每次发布时: 在每个市场检查一小组关键页面(首页、分类页、产品页、购物车、结账页)。
- 每周: 对每个市场的更大范围页面样本进行检查,包括最近更改过的页面。
- 地理逻辑、定价或同意机制发生任何变化后: 进行一次全面检查。
按市场和按检查项分别报告结果,这样每个团队都能看到自己的问题。失败次数最多的市场,通常也是本地测试最少的市场。
自动化无法捕获的问题
有些问题仍然需要了解该市场的人来判断:一句翻译正确但读起来别扭的话、一张在当地含义不佳的图片或颜色、模板未涵盖的法律要求。自动化检查能让人们把审查时间花在这些事情上,而不是去寻找美元符号。
有些网站还会按国家显示不同的同意和隐私层,这既改变了用户看到的内容,也改变了自动化测试能够访问到的内容。我们关于各国同意墙的研究展示了这在欧盟各国之间的差异有多大。
常见问题
什么是本地化 QA?
测试网站的每个语言和市场版本是否对本地访问者正常运行并显示正确:翻译、货币和价格格式、布局、法律声明、重定向,以及搜索引擎用来查找每个版本的信号。
为什么我不能用 VPN 测试其他市场?
可以用于快速查看,但许多网站会识别 VPN 和数据中心地址,并对其采取与家庭连接不同的处理方式,因此你可能看不到真实本地客户所看到的内容。市场内的住宅 IP 更接近真实体验。
我应该在每个市场测试哪些页面?
至少包括首页、分类页、产品页、购物车和结账页,以及任何包含价格或法律文本的页面。再扩展到一组轮换的近期更改页面样本。
本地化错误如何影响 SEO?
错误的 lang 属性、损坏的 hreflang 备用链接以及强制地理重定向,可能导致搜索引擎索引错误的语言版本,或完全遗漏某个版本,从而损失该市场的曝光度。
总结
本地化错误隐藏在没人测试的市场中。像本地访问者一样查看每个市场,使用相互一致的 IP、语言和时区,并在每次发布后对每个市场运行相同的自动化检查。用机器捕获机械性问题(语言属性、遗留字符串、货币、hreflang),把人工审查留给只有本地读者才能判断的内容。