Nuxt i18n 默认选项致法语首页被 Google 显示为英文
译注:本文编译自 dev.to 作者 dibodev 的技术复盘,原文标题为《My French homepage showed up in English on Google. A default Nuxt i18n option was the reason.》,记录了作者排查自家法语站点在 Google 搜索结果中显示英文标题的全过程。原文链接见文末。
一个以法语为默认语言的 Nuxt 静态站点,在 Google 搜索结果里却显示英文标题,并附带“翻译此页面”链接。作者在排查后发现,问题并不在服务端渲染的 HTML,而在于 @nuxtjs/i18n 一个默认开启的选项——detectBrowserLanguage。
服务端一切正常
作者的站点采用 Nuxt 4 静态生成(SSG),配合 @nuxtjs/i18n,策略为 prefix_except_default:法语在根路径 /,英文在 /en,西班牙文在 /es。
用 curl 抓取 / 的原始 HTML,结果完全正确:
curl -s https://dibodev.fr/ | grep -o 'lang="[a-z]*"\|<title>[^<]*</title>' | head -2
# lang="fr"
# <title>Dibodev — Développeur Web Freelance à Rennes</title>canonical 指向 /,hreflang 标签也正确:fr-FR → /、en-US → /en、es-ES → /es、x-default → /。即便使用 Googlebot 的 User-Agent,服务器返回的仍是同一个法语页面,状态码 200。
服务端没有问题,那么问题只能出在浏览器端。
用英文浏览器复现
Google 并不只是下载 HTML,它会在无头 Chrome 中渲染页面并执行 JavaScript。而爬虫不会声明自己使用什么语言。作者用 Playwright 以英文浏览器 locale 打开首页:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
for locale in ["fr-FR", "en-US"]:
page = browser.new_context(locale=locale).new_page()
page.goto("https://dibodev.fr/", wait_until="networkidle")
print(locale, "->", page.url, "|", page.title())
browser.close()输出结果:
fr-FR -> https://dibodev.fr/ | Dibodev — Développeur Web Freelance à Rennes
en-US -> https://dibodev.fr/en | Dibodev — Freelance Web Developer in Rennes问题复现了。任何设置为英文的浏览器访问 /,拿到法语 HTML 后,会在水合完成后立即被重定向到 /en。使用 Googlebot 的 User-Agent 结果相同。对渲染器而言,/ 的内容就是英文页面。
元凶:一个默认选项
作者从未主动要求语言重定向,但 @nuxtjs/i18n 的 detectBrowserLanguage 选项默认开启。默认情况下它只作用于根路径,并通过 cookie 记住用户选择。对真实访客来说,这体验不错:英语用户会落到英文站点。
但在预渲染站点上,重定向无法在服务端发生——HTML 早已生成。它只能在浏览器中、应用启动后执行。而一个英文 locale、没有 cookie 的无头浏览器,每次都会触发重定向。
作者的配置里从未提及该选项:
// nuxt.config.ts (before, simplified)
i18n: {
locales: [
{ code: 'fr', language: 'fr-FR', file: 'fr.json' },
{ code: 'en', language: 'en-US', file: 'en.json' },
{ code: 'es', language: 'es-ES', file: 'es.json' },
],
defaultLocale: 'fr',
strategy: 'prefix_except_default',
},修复:一行配置
// nuxt.config.ts (after)
i18n: {
// ...same as before
strategy: 'prefix_except_default',
// No redirect to the browser language: crawlers render in English and were sent from / to /en.
detectBrowserLanguage: false,
},访客仍可通过语言选择器切换语言,搜索引擎也已通过 hreflang 了解所有版本。这也符合 Google 的建议:不要根据浏览器语言把用户重定向到某个语言版本,而是链接各版本并让用户自行选择。
部署后,同样的 Playwright 脚本输出:
fr-FR -> https://dibodev.fr/ | Dibodev — Développeur Web Freelance à Rennes
en-US -> https://dibodev.fr/ | Dibodev — Développeur Web Freelance à Rennes为什么值得关注:AI 搜索同样受影响
作者注意到这个问题,是因为他正在研究自己的站点如何在 AI 回答(ChatGPT、Copilot、Perplexity、Google 的 AI 模式)中呈现。Copilot 和 ChatGPT 依赖 Bing 的索引,而 Bing 同样会用浏览器渲染页面。一个在渲染时“变成英文”的首页,正是那种会让小型法语企业在法语查询中难以被推荐的混杂信号。
这是作者两天内在该站点上发现的第二个渲染陷阱。第一个是:部分项目描述在客户端渲染,而 GPTBot、PerplexityBot 等 AI 爬虫根本不执行 JavaScript,对它们来说这些文字根本不存在。
要点
@nuxtjs/i18n默认启用detectBrowserLanguage。在静态或对 SEO 敏感的站点上,应明确决定是否需要它。- 用其他语言的浏览器测试页面,而不只是用
curl:水合后的重定向不会出现在原始 HTML 中。 - 爬虫渲染你的站点时没有你的 cookie,往往也没有你的语言。检查它们看到的内容,而不是你自己看到的。
作者已请求 Google 重新抓取首页,并将在法语标题重回搜索结果后更新原文。