1. 代码中的用户可见字符串硬编码为什么是质量问题,i18n 资源管理与占位符规范如何设计?
代码中的用户可见字符串硬编码为什么是质量问题?i18n 资源管理与占位符规范如何设计?
- 用户可见字符串硬编码的弊端
- i18n 资源文件(key-value)管理
- 占位符(placeholder)规范
(1)硬编码弊端:用户可见字符串硬编码在代码里,会导致:a) 无法多语言适配,改语言需改代码;b) 文案与代码耦合,视觉/文案调整要走发布流程;c) 多语言团队维护时重复、不一致;d) 无法复用与统一管理。
(2)资源管理:把用户可见字符串抽到资源文件(如 messages.properties、JSON、resx),用 key-value 组织,key 用语义化命名(如 order.confirm),值按语言分文件。代码只引用 key,不直接写文案。
(3)占位符规范:带变量的文案用占位符(如 ICU MessageFormat 的 {name}、printf 的 %s),避免字符串拼接;占位符命名语义化,值由运行时传入,服务端渲染或客户端渲染按需。
(4)落地:a) lint 禁止在代码中硬编码用户可见字符串(如 ESLint 的 no-hardcoded-strings);b) 资源文件纳入版本管理与翻译流程;c) 占位符与语言规则(复数、性别)配合。
硬编码的根因是'文案与代码耦合'。i18n 资源管理把文案解耦为 key-value,语义化 key 稳定、占位符处理变量,lint 兜底禁止硬编码。这样多语言、文案调整都不动代码。
// 反例:硬编码
alert("订单已提交");
// 正例:资源 key + 占位符
alert(t("order.submitted", { orderId }));
// messages/zh-CN.json
{ "order": { "submitted": "订单 {orderId} 已提交" } }