多语言国际化管理器

78 阅读1分钟

//LanguageMgr.js //多语言管理类,主要功能是加载多语言的图片和文字

let LanguageMgr = {
    /**
     * 初始化
     * @param  
     */
    init() {
		//默认语言为简体中文
        let kind = "CHS",lan = LOADLOCAL("language");
        if (lan) {
            kind = lan;
        }
        this.setKind(kind);
		cc.log('语言管理器初始化完成');
    },
 
    /**
     * 设置语言类型
     * @param kind 
     */
    setKind(kind) {
        this.kind = kind;
    },
 
    /**
     * 获取当前语言类型
     * @param kind
     */
    getKind() {
        return this.kind;
    },
 
 
    /**
     * 修改语言,缺乏EventMgr,暂时注释
     * @param kind 
     */
    changeLanguage(kind) {
        if (this.kind != kind) {
            this.setKind(kind);
            SAVELOCAL('language', kind);
			cc.director.emit('CHANGE_LANGUAGE');
        }
    },
 
    /**
     * 获取语言包对应的文本
     * @param txtIdx 
     * @param param 
     */
    getText(txtIdx, param) {
        if (CFG.language && CFG.language[txtIdx]) {
            let str = CFG.language[txtIdx][this.kind] || "";
            if (param) {
                if (param["X"] !== undefined){
					str = str.replace("X", param["X"].toString());
				}
            }
            cc.log('获取语言包对应的文本txtIdx::',txtIdx,',文本=:',str);
            return str;
        } else if (txtIdx == "") {
            return "";
        } else {
            console.error("文本 " + txtIdx + " 没有多语言");
            return txtIdx;
        }
 
    },
    /* getSprite(path, cb) {
        cc.resources.load('languagesprite/'+spritename, cc.SpriteFrame, (err, spriteFrame: cc.SpriteFrame) => {
            if (err) {
                return cb(null);
            }
            cb(spriteFrame);
        });
    } */
};
//module.exports = LanguageMgr;
window.LanguageMgr = LanguageMgr;

//LanguageLabel.js==直接挂载在相应的Label组件上面再配置相应的key即可

cc.Class({
    extends: cc.Component,

    properties: {
		txtIdx:''
    },
	onLoad(){
		cc.log('LanguageMgr:',LanguageMgr);
	},
    start() {
        cc.director.on('CHANGE_LANGUAGE', this.changeLanguage, this);
        this.changeLanguage();
		
    },
 
    /**
     * 监听切换语言事件
     */
    changeLanguage() {
        let label = this.node.getComponent(cc.Label);
        if (label) {
            label.string = LanguageMgr.getText(this.txtIdx);
        } else {
            console.log(this.node.name + " 挂载的节点没有label组件!");
        }
    }
 
    // update (dt) {}
});

//LanguageSprite.js==直接挂载到相应的Sprite组件上,再配置相应的key

cc.Class({
    extends: cc.Component,

    properties: {
		imgIdx:''
    },
	onLoad(){
		
	},
    start() {
        cc.director.on('CHANGE_LANGUAGE', this.changeLanguage, this);
        this.changeLanguage();
		
    },
 
    /**
     * 监听切换语言事件
     */
    changeLanguage() {
        let sprite = this.node.getComponent(cc.Sprite);
		cc.log('sprite::',sprite);
        if (sprite) {
            cc.resources.load('languagesprite/'+this.imgIdx+LanguageMgr.getKind(),cc.SpriteFrame,(err,Lsprite)=>{
				if(err){
					cc.log('GETLANGUAGESPRITE,err:',err);
					return null;
				}
				sprite.spriteFrame = Lsprite;
			});
            
        } else {
            console.log(this.node.name + " 挂载的节点没有sprite组件!");
        }
    }
 
    // update (dt) {}
});

对于需要动态修改的文本则需要使用 Label.string = LanguageMgr.getText(key); 的形式使用