javascript中不存在“国际化工具继承”标准概念,实际指复用或扩展i18n能力:可通过class extends实现可定制翻译类,组合模式依赖注入更灵活,原型链共享格式化函数,或模块级导出重用配置与资源。

基于 class extends 的可扩展 i18n 类
这是最清晰、推荐的方式,尤其适合封装核心翻译能力,并支持子类定制行为:
- 父类提供基础能力:语言切换、键值查找、fallback 逻辑
- 子类可覆盖方法:如重写 formatMessage 支持日期/数字本地化(调用 Intl.DateTimeFormat 等)
- 子类可注入新能力:如自动检测浏览器语言、加载远程 locale 包、支持复数规则(CLDR)
示例:
class BaseI18n {<br> constructor(locales = {}) {<br> this.locales = locales;<br> this.locale = 'en';<br> }<br> t(key, params = {}) {<br> const msg = this.locales[this.locale]?.[key] || key;<br> return msg.replace(/\{\{(\w+)\}\}/g, (_, k) => params[k] ?? '');<br> }<br>}<br><br>class AdvancedI18n extends BaseI18n {<br> constructor(locales) {<br> super(locales);<br> this.formatter = new Intl.NumberFormat(this.locale);<br> }<br> t(key, params = {}) {<br> const base = super.t(key, params);<br> // 可添加插值增强,如 {{count | number}}<br> return base.replace(/\{\{(\w+) \| (\w+)\}\}/g, (_, k, f) => {<br> if (f === 'number' && typeof params[k] === 'number') {<br> return this.formatter.format(params[k]);<br> }<br> return params[k];<br> });<br> }<br>}
组合优于继承:用 mixin 或委托封装 i18n 能力
很多现代 i18n 库(如 i18next、vue-i18n)本身不鼓励继承,而是通过实例挂载、插件机制或函数式 API复用能力:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 不继承类,而是把 i18n 实例作为依赖注入到业务类中
- 用高阶函数或装饰器为任意对象“附加”翻译方法(例如 withI18n(MyComponent))
- 共享同一套 resource store + event emitter,多个模块响应语言变更
原型链复用:轻量级工具函数继承
若使用纯函数式 i18n 工具(如 tiny-i18n),可通过原型链共享通用方法:
- 将公共格式化函数(如 pluralize、date)挂到基对象 prototype 上
- 子对象通过 Object.setPrototypeOf(child, BaseProto) 接入能力
- 避免污染全局,适合微前端或多租户场景下隔离 i18n 行为
ES6 模块级“继承”:按需导出与重导出
在工程层面,“继承”常体现为模块复用:
- 基础包导出 createI18n() 工厂函数
- 业务包调用它并扩展配置:export const myI18n = createI18n({...})
- 不同项目共用同一套 key 结构和 loader,形成事实上的“语义继承”
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










