字符串插值不负责多语言切换,但可高效配合t()函数处理带变量文案:先用t()获取含{{name}}等占位符的翻译文本,再通过replace()批量替换动态值,实现翻译与变量逻辑解耦。

字符串插值本身不负责多语言切换,但它能高效配合翻译函数处理带变量的文案。关键在于:先用 t() 获取翻译文本(含占位符),再用模板字符串或 replace() 插入动态值。
翻译文本里预留插值占位符
在语言包 JSON 中,把需要动态替换的部分用统一格式标记,比如 {{name}}、{{count}}:
// en.json
{
"welcome_user": "Hello, {{name}}! You have {{count}} new messages."
}
// zh.json
{
"welcome_user": "你好,{{name}}!你有 {{count}} 条新消息。"
}
这样翻译逻辑和变量逻辑解耦,同一段文案可复用于不同用户、不同数量场景。
用 replace() 批量替换占位符
翻译函数 t(key) 返回带 {{xxx}} 的字符串后,遍历传入的参数对象,逐个替换:
立即学习“Java免费学习笔记(深入)”;
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 用
Object.entries()拆出键值对 - 对每个
key构造正则/{{key}}/g,确保全局替换 - 用
String.prototype.replace()替换,避免多次调用造成性能损耗
function t(key, params = {}) {
const text = messages[key] || key;
return Object.entries(params).reduce((str, [k, v]) =>
str.replace(new RegExp(`{{${k}}}`, 'g'), v),
text
);
}
// 使用示例
t('welcome_user', { name: 'Alice', count: 5 });
// → "Hello, Alice! You have 5 new messages."
模板字符串只在拼接固定前缀/后缀时用
模板字符串(`)适合组装“翻译结果 + 静态修饰”,不适合直接做多语言主体替换。例如:
- ✅ 合理:生成带单位的提示
`${t('file_size')}: ${size} KB` - ❌ 不合理:把整句文案写成
`Hello, ${name}!`—— 这样就绕过了翻译系统,无法支持中文语序差异(如“你好,Alice!”和“欢迎,Alice!”)
真正需要国际化的地方,必须走 t() + 占位符路径,保证语序、复数、格式等由语言包控制。
进阶:支持嵌套表达式与函数调用
如果需求更复杂(如根据数值决定单复数),可扩展 t(),让占位符支持简单表达式:
- 例如语言包中写
"item_count": "You have {{count === 1 ? '1 item' : count + ' items'}}" - 替换时用
eval()或安全沙箱执行(需谨慎评估 XSS 风险) - 更稳妥做法是预定义函数,如
{{plural(count, 'item')}},在替换阶段调用对应逻辑
这类能力常见于 i18next、formatjs 等专业库,自研方案建议优先满足基础插值,复杂逻辑交由业务层处理。

















