响应式系统通过将用户地区偏好(locale)作为可响应的数据源实现多语言数字格式化,所有格式化逻辑自动订阅 locale 流,结合惰性构造 formatter、跨组件分层管理及 SSR 降级保障,确保实时、一致、可扩展。

响应式系统处理多语言数字格式化,核心在于把“用户地区偏好”作为可响应的数据源,并让所有数字显示逻辑自动订阅它——不是手动判断 locale 后调用不同函数,而是让格式化行为随 locale 流实时派生。
Locale 作为响应式信号源
在 Cycle.js、RxJS 或 SolidJS 等响应式框架中,locale 不应是静态配置或全局变量,而应是一个可监听的流(Stream)或信号(Signal)。例如:
- 用户首次访问时,从
navigator.language或后端 API 获取初始 locale,并写入响应式 store - 设置页切换语言时,触发更新操作,该操作会广播新 locale 值
- 所有数字格式化组件都依赖这个信号,无需重新挂载或强制刷新
格式化逻辑与 locale 实时绑定
避免为每个 locale 预建 formatter 实例,而是用惰性构造 + 缓存策略:
- 定义一个响应式 formatter 工厂:
const formatter$ = locale$.map(loc => new Intl.NumberFormat(loc, { ... })) - 对具体数字值应用时,组合
number$与formatter$流,用combineLatest或map生成格式化结果 - 实际渲染时,直接绑定到
formattedNumber$,视图自动重算
跨组件 locale 共享与降级保障
全局 locale 联动不等于全局污染。推荐分层管理:
- 应用级 locale:由根组件提供,作为 context 或 store 的顶层字段,支持子组件读取但不可直接修改
-
组件级 locale 覆盖:允许局部组件传入
localeprop(如报表模块需固定用 de-DE),优先级高于全局 -
降级 fallback:当 locale 值非法(如空字符串、'xx-XX')时,自动回退到
navigator.language或预设的 'en-US',并记录 warning
服务端协同与 SSR 支持要点
纯前端 locale 切换在 SSR 场景下易导致水合不一致。实战中需对齐首屏环境:
- 服务端渲染时,通过请求头
Accept-Language解析首选 locale,并注入到初始 state - 客户端 hydration 前,检查当前
navigator.language是否与服务端一致;若不一致,触发一次静默 locale 同步(不闪屏) - 避免在服务端调用
Intl.NumberFormat时使用非标准 locale 字符串(如 'zh'),应标准化为 'zh-CN' 或 'zh-Hans'

















