管理器

介绍#

多语言管理器提供以下功能:

  • 数据管理:添加和获取多语言文本/图片数据
  • 语言切换:支持动态切换语言类型
  • 事件监听:监听多语言事件,实现实时更新

概念#

多语言类型#

传统多语言表会随着时间推移变得庞大且难以清理。为了解决这个问题,MK 框架引入多语言类型,以支持任意粒度的数据管理。

示例

// 原本
{
    "多语言键": {
        "中文": "多语言数据",
        ...
    },
}

// 增加多语言类型
{
    "多语言类型": {
        "多语言键": {
            "中文": "多语言数据",
            ...
        },
    },
}

通过多语言类型,你可以将数据划分为多个模块,而且可以从工具层共用多语言数据,使用插件将数据转移到各个模块下


配置#

多语言系统的配置位于 GlobalConfig.Language 下。

多语言种类#

privateTypeTab 中定义支持的语言类型,例如:

/** 中文(中华人民共和国) */
zhCn: {
    dire: Layout.HorizontalDirection.LEFT_TO_RIGHT, // 文本方向:从左到右
},

上述代码定义了一个名为 zhCn 的语言类型,其文本方向为从左到右。

默认语种#

通过 defaultTypeStr 配置默认语言类型:

defaultTypeStr: types.zhCn;

多语言参数前后缀#

通过 argsHeadStrargsTailStr 配置参数占位符。

  • 默认配置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'],
});

参数

参数类型描述
typestringaddLabel 时传递的多语言类型名
markStrstringaddLabel 数据的多语言标识(对象键)
configobject可选配置
config.languagestring语种(默认为当前 typeStr
config.argsStrListstring[]多语言参数

返回值:对应的多语言文本(如 示例-123)。

getTexture#

获取指定的多语言图片。

语法

mk.languageManage.getTexture('多语言类型名', '示例', null, GlobalConfig.Language.types.zhCn);

参数

参数类型描述
typestringaddTexture 时传递的多语言类型名
markStrstringaddTexture 数据的多语言标识(对象键)
targetobject跟随释放对象
languagestring语种(可选,默认为当前 typeStr

返回值:对应的 SpriteFrame 对象。


扩展功能#

多语言数据类#

在框架功能示例仓库中,可能会看到 mk.Language_.LabelDatamk.Language_.TextureData 的使用:

export default new mk.Language_.LabelData(cc.js.getClassName(XXX), {
    示例: {
        enUs: 'template-{0}',
        zhCn: '示例-{0}',
    },
});

在构造函数中,框架会自动执行 addLabel,但具有以下优势:

1. 类型安全#

如果配置 zhCnenUs 两个语种,缺少配置时编辑器会提示:

类型安全提示

2. 提供 key 供外部使用#

通过 key 属性,可以快速获取多语言标识:

const key = labelData.key.示例;

外部 key

配置多语言数据#

框架设想是在只需要在单个配置表中配置所有文本和图片数据,然后通过插件更新每个 mk.Language_.LabelDatamk.Language_.TextureData 的构造数据。

但目前没有实现这个插件,因此可以采用以下方式:

  1. 使用任意配置表工具:导出 JSON 或 Typescript 文件。
  2. 动态加载:通过 addLabeladdTexture 添加数据作为全局使用,例如 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('语言已切换');
});