如果项目需要国际化的处理,也就是需要切换语言的功能时,一般有两种方案:
单个包 优点:1.可以动态切换语言(当然要代码上实现)
2.只有一个版本,容易维护
缺点:1.安装包大
多个包 优点:1.安装包小
2.可以对不同语言做深入的本地化(比如功能不同)
缺点:1.需要发多次审核
2.多个版本维护
下面,我们只讨论单个包的情况
因为CocosCreator的i18已经不灵了,所以我们自己动手搞一个。
要完成这个需求,大概需要四个文件:
1.LanguageMgr.ts
2.LanguageSprite.ts
3.LanguageLabel.ts
4.language.json
LanguageMgr.ts:
-
/* -
多语言管理类,主要功能是加载多语言的图片和文字 -
*/ -
import { EventMgr } from "./EventMgr"; -
import { GlobalEvent } from "../model/EventType"; -
import { config } from "./config"; -
import { CallNative } from "./CallNative"; -
import { LanguageEnum } from "./Enum"; -
export class LanguageMgr { -
static languageJson = null; -
static kind = "EN"; -
/** -
* 加载多语言json -
*/ -
static initLanguageJson() { -
this.languageJson = config.getOneConfig("language"); -
}; -
static init() { -
this.initLanguageJson(); -
let kind = "EN"; -
if (cc.sys.localStorage.getItem("lanAndCountry")) { -
kind = cc.sys.localStorage.getItem("lanAndCountry"); -
} else { -
let lanAndCountry = CallNative.getLanguage(); -
if (lanAndCountry.substr(0, 2) == "zh") { -
kind = LanguageEnum.tc; -
} else { -
kind = LanguageEnum.en; -
} -
} -
this.setKind(kind); -
} -
/** -
* 设置语言类型 -
* @param kind -
*/ -
static setKind(kind: string) { -
this.kind = kind; -
} -
/** -
* 获取当前语言类型 -
* @param kind -
*/ -
static getKind() { -
return this.kind; -
} -
/** -
* 修改语言 -
* @param kind -
*/ -
static changeLanguage = function (kind: string) { -
if (this.kind != kind) { -
this.setKind(kind); -
cc.sys.localStorage.setItem("lanAndCountry", kind); -
EventMgr.sendNormalEvent(GlobalEvent.CHANGE_LANGUAGE); -
} -
} -
/** -
* 获取语言包的key -
* @param text -
* @param param -
*/ -
static getText = function (text: string, param?: { "$param1": string | number }) { -
if (this.languageJson && this.languageJson[text]) { -
let str: string = this.languageJson[text][this.kind] || ""; -
if (param) { -
if (param["$param1"] !== undefined) str = str.replace("$param1", param["$param1"].toString()); -
} -
return str; -
} else if (text == "") { -
return ""; -
} else { -
console.log("文本 " + text + " 没有多语言"); -
return text; -
} -
} -
}
LanguageSprite.ts:
-
import { LanguageMgr } from "../common/LanguageMgr"; -
import { GlobalEvent } from "../model/EventType"; -
const { ccclass, property, menu, requireComponent, disallowMultiple } = cc._decorator; -
/** -
* 多语言的图片初始化 -
*/ -
@ccclass -
@menu("多语言/sprite") -
@requireComponent(cc.Sprite) -
@disallowMultiple -
export default class LanguageSprite extends cc.Component { -
@property(cc.SpriteFrame) -
en: cc.SpriteFrame = null; -
@property(cc.SpriteFrame) -
sc: cc.SpriteFrame = null; -
@property(cc.SpriteFrame) -
tc: cc.SpriteFrame = null; -
start() { -
cc.director.on(GlobalEvent.CHANGE_LANGUAGE, this.changeLanguage, this); -
this.changeLanguage(); -
} -
/** -
* 监听切换语言事件 -
*/ -
changeLanguage() { -
if (LanguageMgr.getKind() == "EN") { -
this.getComponent(cc.Sprite).spriteFrame = this.en; -
} else if (LanguageMgr.getKind() == "TC") { -
this.getComponent(cc.Sprite).spriteFrame = this.tc; -
} else { -
if (this.sc) { -
this.getComponent(cc.Sprite).spriteFrame = this.sc; -
} else { -
this.getComponent(cc.Sprite).spriteFrame = this.tc; -
} -
} -
} -
}
LanguageLabel.ts:
-
import { GlobalEvent } from "../model/EventType"; -
import { LanguageMgr } from "../common/LanguageMgr"; -
const { ccclass, property, menu, requireComponent, disallowMultiple } = cc._decorator; -
@ccclass -
@menu("多语言/label") -
@requireComponent(cc.Label) -
@disallowMultiple -
export default class LanguageLabel extends cc.Component { -
// LIFE-CYCLE CALLBACKS: -
// onLoad () {} -
@property -
prefix: string = ""; -
@property -
suffix: string = ""; -
@property -
text: string = ""; -
start() { -
cc.director.on(GlobalEvent.CHANGE_LANGUAGE, this.changeLanguage, this); -
this.changeLanguage(); -
} -
/** -
* 监听切换语言事件 -
*/ -
changeLanguage() { -
var label = this.getComponent(cc.Label); -
if (label) { -
label.string = this.prefix + LanguageMgr.getText(this.text) + this.suffix; -
} else { -
console.log(this.node.name + " 挂载的节点没有label组件!"); -
} -
} -
// update (dt) {} -
}
language.json:
-
{ -
"TEST_VERSION": { -
"EN": "Test Version", -
"TC": "測試版本", -
"SC": "测试版本" -
}, -
"SERVER_IS_DISCONNTECTED_LOGIN_IN_AGAIN": { -
"EN": "The Server is Disconnected, Please Log In Again!", -
"TC": "服務器已斷開鏈接,請重新登錄!", -
"SC": "服务器已断开连接,请重新登录!" -
}, -
"DAILY_TASK": { -
"EN": "Daily Quest", -
"TC": "每日任務!", -
"SC": "每日任务!" -
}, -
"OCCUPIED": { -
"EN": "Occupied", -
"TC": "使用中", -
"SC": "使用中" -
} -
}
各个脚本的主要用法:
例如,LanguageMgr.getText("TEST_VERSION");
当文本是动态变换的时候,需要用LanugaeMgr.getText。
如果是静态的文本显示:
则将LanguageLabel挂载到相应节点。
LanguageSprite的使用方式和LanguageLabel一样。
