柯里化不直接实现国际化,但能提升多语言翻译函数的复用性与调用体验:将 t(key, lang) 改为 t(lang)(key) 或 t(key)(lang),支持预置语言、组合函数及注入组件链,并可结合异步加载与状态管理。

柯里化本身不直接实现国际化,但它能显著提升多语言翻译函数的复用性和调用体验。核心思路是:把 t(key, lang) 这类双参翻译函数,柯里化为 t(lang)(key) 或 t(key)(lang) 形式,让语言或文案成为可预置、可组合的配置项。
为什么用柯里化优化翻译调用
普通翻译函数通常写成 t(key, options),每次都要传 key 和可能的 locale;而柯里化后可以:
- 提前绑定语言,生成专用翻译器:
const zhT = t('zh'),后续只管传 key - 配合模块/组件封装,避免重复传 locale 参数
- 与函数组合(如
compose)结合,构建翻译管道,例如:compose(zhT, capitalize) - 在 React 等场景中,方便注入到高阶组件或 hooks 的参数链中
手动柯里化一个翻译函数
假设你已有基础 i18n 实例(含 messages 和 getLocaleText 方法),可这样封装柯里化版 t:
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
function curryTranslate(getText) {
return function(locale) {
return function(key, replacements = {}) {
let text = getText(locale, key) || key;
Object.entries(replacements).forEach(([k, v]) => {
text = text.replace(`{{${k}}}`, v);
});
return text;
};
};
}
// 使用
const t = curryTranslate((lang, key) =>
window.i18n?.messages?.[lang]?.[key] || key
);
const enT = t('en');
console.log(enT('welcome')); // "Welcome"
console.log(enT('greeting', { name: 'Alice' })); // "Hello, Alice!"
结合 JSON 资源与自动加载的柯里化实践
若语言包需异步加载,柯里化可与 Promise 链自然融合:
- 先柯里化出
loadLang('zh')→ 返回 Promise - 再链式调用
.then(t('zh'))得到已就绪的翻译函数 - 或封装成
tFor('zh').then(f => f('save'))
示例:
function tFor(lang) {
return fetch(`/locales/${lang}.json`)
.then(res => res.json())
.then(messages => (key, opts = {}) => {
let txt = messages[key] || key;
Object.entries(opts).forEach(([k, v]) =>
txt = txt.replace(`{{${k}}}`, v)
);
return txt;
});
}
// 调用
tFor('en').then(en => console.log(en('loading'))); // "Loading"
注意事项与边界情况
柯里化不是银弹,使用时需注意:
- 不要为了柯里化而柯里化——如果项目已用 i18next 或 vue-i18n,其内置
t函数本身已支持作用域绑定(如useI18n({ useScope: 'global' })),无需额外柯里化 - 柯里化函数默认不处理语言切换后的重渲染,仍需监听
languageChanged并触发 DOM 更新 - 若翻译函数依赖内部状态(如当前 locale 缓存),确保闭包捕获的是最新值,或配合
ref/useState管理 - ES6 箭头函数写法更简洁:
const t = lang => key => messages[lang]?.[key] ?? key,但无法自动识别fn.length,适合固定两层结构
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










