管理器
介绍#
多语言管理器提供以下功能:
- 数据管理:添加和获取多语言文本/图片数据
- 语言切换:支持动态切换语言类型
- 事件监听:监听多语言事件,实现实时更新
概念#
多语言类型#
传统多语言表会随着时间推移变得庞大且难以清理。为了解决这个问题,MK 框架引入多语言类型,以支持任意粒度的数据管理。
示例
// 原本
{
"多语言键": {
"中文": "多语言数据",
...
},
}
// 增加多语言类型
{
"多语言类型": {
"多语言键": {
"中文": "多语言数据",
...
},
},
}
通过多语言类型,你可以将数据划分为多个模块,而且可以从工具层共用多语言数据,使用插件将数据转移到各个模块下
配置#
多语言系统的配置位于 GlobalConfig.Language
下。
多语言种类#
在 privateTypeTab
中定义支持的语言类型,例如:
/** 中文(中华人民共和国) */
zhCn: {
dire: Layout.HorizontalDirection.LEFT_TO_RIGHT, // 文本方向:从左到右
},
上述代码定义了一个名为 zhCn
的语言类型,其文本方向为从左到右。
默认语种#
通过 defaultTypeStr
配置默认语言类型:
defaultTypeStr: types.zhCn;
多语言参数前后缀#
通过 argsHeadStr
和 argsTailStr
配置参数占位符。
- 默认配置:
argsHeadStr = '{'
,argsTailStr = '}'
- 参数使用:在多语言文本中使用
{0}
表示第一个参数,{1}
表示第二个参数,依此类推。
例如,配置 template-{0}
,当 argsStrList = ['123']
时,结果为 template-123
。
属性#
typeStr#
当前的多语言语种,对应于 GlobalConfig.Language.privateTypeTab
对象的键。切换语种时,修改此属性:
// 切换到英文(美国)
mk.languageManage.typeStr = GlobalConfig.Language.types.enUs;
data#
当前语种的配置数据,对应于 GlobalConfig.Language.privateTypeTab
对象中当前 typeStr
键的值。
labelDataTab#
文本数据表,类型为 Record<_MKLanguageManage.TypeType, Language_.TypeDataStruct>
。
示例:
let globalLabelData = mk.languageManage.labelDataTab['多语言类型名'];
// 数据格式
{
"测试": {
"zhCn": "测试",
"enUs": "Test"
}
}
textureDataTab#
纹理数据表,结构与 labelDataTab
一致,但存储的是图片的 db 路径(以兼容编辑器和运行时加载)。
示例:
let globalLabelData = mk.languageManage.textureDataTab['多语言类型名'];
// 数据格式
{
"测试": {
"zhCn": "db://assets/resources/xxx.png",
"enUs": "db://assets/resources/xxx_en.png"
}
}
event#
管理器事件,支持以下操作:
- 监听事件:
on(eventName, callback)
- 移除事件:
off(eventName, callback)
- 触发事件:
emit(eventName)
使用方式请参考事件系统文档。
方法#
addLabel#
动态添加多语言文本数据。
语法:
mk.languageManage.addLabel('多语言类型名', {
示例: {
enUs: 'template-{0}',
zhCn: '示例-{0}',
},
});
addTexture#
与 addLabel
类似,区别在于传递的数据是图片的 db 路径。
语法:
mk.languageManage.addTexture('多语言类型名', {
示例: {
zhCn: 'db://assets/resources/xxx.png',
enUs: 'db://assets/resources/xxx_en.png',
},
});
getLabel#
获取指定的多语言文本。
语法:
mk.languageManage.getLabel('多语言类型名', '示例', {
language: GlobalConfig.Language.types.zhCn,
argsStrList: ['123'],
});
参数:
参数 | 类型 | 描述 |
---|---|---|
type | string | addLabel 时传递的多语言类型名 |
markStr | string | addLabel 数据的多语言标识(对象键) |
config | object | 可选配置 |
config.language | string | 语种(默认为当前 typeStr ) |
config.argsStrList | string[] | 多语言参数 |
返回值:对应的多语言文本(如 示例-123
)。
getTexture#
获取指定的多语言图片。
语法:
mk.languageManage.getTexture('多语言类型名', '示例', null, GlobalConfig.Language.types.zhCn);
参数:
参数 | 类型 | 描述 |
---|---|---|
type | string | addTexture 时传递的多语言类型名 |
markStr | string | addTexture 数据的多语言标识(对象键) |
target | object | 跟随释放对象 |
language | string | 语种(可选,默认为当前 typeStr ) |
返回值:对应的 SpriteFrame
对象。
扩展功能#
多语言数据类#
在框架功能示例仓库中,可能会看到 mk.Language_.LabelData
和 mk.Language_.TextureData
的使用:
export default new mk.Language_.LabelData(cc.js.getClassName(XXX), {
示例: {
enUs: 'template-{0}',
zhCn: '示例-{0}',
},
});
在构造函数中,框架会自动执行 addLabel
,但具有以下优势:
1. 类型安全#
如果配置 zhCn
和 enUs
两个语种,缺少配置时编辑器会提示:
2. 提供 key 供外部使用#
通过 key
属性,可以快速获取多语言标识:
const key = labelData.key.示例;
配置多语言数据#
框架设想是在只需要在单个配置表中配置所有文本和图片数据,然后通过插件更新每个 mk.Language_.LabelData
和 mk.Language_.TextureData
的构造数据。
但目前没有实现这个插件,因此可以采用以下方式:
- 使用任意配置表工具:导出 JSON 或 Typescript 文件。
- 动态加载:通过
addLabel
或addTexture
添加数据作为全局使用,例如addLabel("globalText", 多语言文本数据)
,暂时不必分离为模块数据
常见问题(FAQ)#
Q:如何支持新的语言类型?
在 GlobalConfig.Language.privateTypeTab
中添加新的语言类型,并确保 defaultTypeStr
指向一个有效的语言类型。
Q:如何实现多语言参数的动态替换?
通过 argsStrList
参数传递参数数组,例如 argsStrList = ['123', '456']
,则 {0}
替换为 123
,{1}
替换为 456
。
Q:如何监听语言切换事件?
通过 event
属性监听 switchLanguage
事件:
mk.languageManage.event.on(mk.languageManage.event.key.switchLanguage, () => {
console.log('语言已切换');
});