用同一设置驱动三者会产生错配
别名: 单一 locale 错配 · 区域设置迁移 · coupled locale · preference migration
概念解释
耦合的 locale 偏好错配(coupled locale preference mismatch)发生在系统用一个国家选择、语言标签或“区域设置”同时决定界面语言、格式地区和时区。任何一项变化都会无意改动另外两项:切换语言可能重排日期和数字,旅行时自动改时区可能替换界面语言,选择熟悉格式又可能改变内容供给。修复不仅是新增三个字段,还要迁移旧账号、缓存、令牌、服务端默认和离线客户端,在无法确定原意时让用户确认而不是编造精确偏好。
机制
旧模型常把一个 locale 字符串复制到消息目录、格式化器、内容查询和时间转换,久而久之各消费者对它的含义不同。拆分数据库字段后,如果 API 仍返回旧字段、缓存键未包含新维度或客户端把空值重新推断为国家,错配会继续存在。迁移还面临信息损失:从 en-US 可以提出英语和美国格式假设,却不能知道用户是否真的在美国时区,也不能证明这些值是明确选择。可靠迁移保留旧值与来源,按可证明程度分别填充 explicit、inferred 或 unset,并通过版本化解析器、兼容读路径和受控回填逐步切换消费者。
怎么研究
先追踪旧 locale 的全部读写处,标注每个消费者实际需要 language、format region、time zone、content language 还是 service market。构造迁移基准集,覆盖含/不含脚本与地区子标签、缺失值、自定义时区、旅行、共享设备、旧客户端和多端同时修改;比较迁移前可见行为、新模型预期和用户确认结果。线上阶段可影子计算新旧解析值,监控日期/数字变化、通知错时、语言回退、内容供应差异和设置反复,但不把自动推断结果升级为明确用户选择。恢复测试应验证回滚不会丢失拆分后的独立偏好。
边界
并非所有格式变化都是错误:用户明确更换 formatting locale 后,日期、数字和排序应改变;明确开启“跟随设备时区”后,旅行时更新也符合预期。问题在于一个信号越权控制无关字段。旧 locale 的地区子标签不等于当前位置、IANA 时区、国籍或法律市场,迁移不可据此填入权威属性。同步冲突时也不能简单采用最后写入的整组对象,否则改语言的一台设备会覆盖另一台设备刚选的时区;冲突合并必须按字段和来源进行。
怎么落地
- 建立旧字段消费者清单并按所需语义迁移:消息目录读语言,格式化器读 formatting locale,时间显示读 IANA 时区,内容系统读内容语言偏好,合规策略读独立权威属性。
- 迁移记录保留原 locale、来源和时间;只把能证明来自明确选择的分量标成 explicit,其余标成 inferred 或 unset。无法推出时区或地区时沿用安全现状并提示确认,不从 IP 或语言标签永久回填。
- 用 schema/version gate 让新旧客户端共存:服务端分别返回新字段和有明确弃用期的兼容视图,缓存键包含实际依赖维度,多端同步按字段合并。先影子计算,再灰度切读,最后停止旧写入。
- 以迁移前后快照和真实任务验证界面语言、格式、时间、内容与通知分别保持或按用户选择变化。提供可回滚数据迁移与偏好修复入口,并监控异常设置翻转、通知错时和 fallback 激增。