别靠猜,请正确处理我的语言偏好:关于 `Accept-Language` 的重要性
别猜我的语言
2025年5月17日 · 阅读时长约3分钟
如果你还在用 IP 地址来决定显示什么语言,请停止这种错误的做法。这是一种伪装成功能的错误假设。
IP 只能告诉你请求来自哪里,仅此而已。它不能告诉你用户想要什么语言,说什么语言,甚至理解什么语言。它总是出错 —— VPN,旅行,居住在国外的人,拥有多种官方语言的国家。这不是什么聪明的做法,只会带来彻底的烦恼。
国家不等于语言
没有 1:1 的映射关系。比利时有三种官方语言,瑞士有四种,印度有 22 种,加拿大是官方双语国家,但实际上是多语种国家。用户可能居住在这些地方,可能途经这些地方,或者除了流量通过那里之外,与这些地方没有任何关系。那么,仅仅因为某个 geo-IP 数据库告诉你 IP 地址来自哪个国家,你就强行将 UI 设置成一种语言,你到底在做什么?
你正在基于错误的数据进行假设,这不是巧妙的工程设计,而是伪装成 UX 的懒惰行为。
别说“但是那些大型网站都这么做”,这并不能使你的行为正确。你不是在搞“拜物教”。要么做对,要么干脆不做。
就我个人而言,我经常使用 VPN,每次我启用 VPN 访问 Google 时,我都看不懂任何东西,因为 VPN 提供商的 IP 轮换导致页面显示随机语言。
你已经有了正确的工具
每个浏览器都会发送一个 Accept-Language
header。它会告诉你用户偏好的语言,而不是基于位置,也不是基于 IP,而是基于他们的操作系统或浏览器配置。而且,如果用户足够关心,他们可以调整它。
它看起来像这样:Accept-Language: en-US,en;q=0.9,de;q=0.8
这就是你的信号,使用它。它是准确的,它是免费的,它已经存在,无需授权,无需猜测,无需维护。
你不会用自己的猜测来覆盖屏幕分辨率或配色方案 —— 那么为什么要对语言这样做呢?
当你置之不理时会发生什么?
你给在德国的法国用户提供英语,给在布鲁塞尔的会阅读法语的人提供荷兰语,给使用香港 VPN 但一句中文都不会说的人提供中文。用户会感到恼火,有些人会离开,有些人会在 UI 中翻找来修复你造成的混乱。
所有这些都因为你信任了一个可疑的 IP 数据库,而不是浏览器自身的 header。
这是唯一合理的方法
- 读取
Accept-Language
- 尊重它
- 允许用户在需要时更改它(并使用 cookie 或 URL 参数记住该选择)
- 如果你想使用 GeoIP,可以 —— 但仅用于货币、运输、法律事务,绝不用于语言
如果你的软件是为真人设计的,那么你就没有理由去妄自猜测他们的偏好 —— 要么做对,要么就别费心。
Tags: ux-tips