CocosCreator多语言包的处理

2023-10-26

如果项目需要国际化的处理,也就是需要切换语言的功能时,一般有两种方案:

单个包

优点:

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一样。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CocosCreator多语言包的处理 的相关文章

  • CocosCreator学习1-按钮点击

    Cocos Creator小白学习 实现button点击事件 关于cocos creator 本人就是小白一个 xff0c 什么都不会 xff0c 只能慢慢从头开始摸索着来 xff0c 自己也希望能够在写自己的学习过程中 xff0c 能够给
  • CocosCreator的节点显示和隐藏

    隐藏和显示有两种方式 xff1a 1 禁止节点node的运行 xff0c 方法是x node active 61 false 此时隐藏了节点 xff0c 且节点不再运行 恢复节点正常运行 xff0c x node active 61 tru
  • 对CocosCreatorr的Draw call的理解

    Draw call比较直观的描述应该是 在CPU不改变渲染数据的情况下 openGL的一次渲染 opengGL的一次渲染 CPU调用图形绘制接口来使GPU执行渲染操作 渲染流程是CPU和GPU并行工作的过程 CPU和GPU之间通过一系列的缓
  • cocosCreator 节点坐标和世界坐标的转换

    问题描述 同一个层上的不同节点下的元素移动 在C这个层上面有两个节点A和B 现在我想把A下的一个临时创建的节点移动到B下 这个时候 第一想到的是 获取两个创建的节点的坐标 然后cc Move 但是实际的效果不是这样的 元素都不知道移动到那里
  • Cocos Creator 用JS脚本实现游戏背景的无限滚动

    首先是实现的一个原理 使用2张相同的图片 让它们在脚本中不停的移动 用y值的减少来实现 当有图片离开场景时 给此图片的y重新赋值 相当于位置的重置 在update中无限调用背景移动的函数 我的canvas 位于上方的图片结点名称为BG 下方
  • CocosCreator在Android和iOS双平台的双向调用

    由于感觉Cocos官方的文档写得有点不尽人意 所以在这里总结一下自己的经验 一 下面先写好CocosCreator调用原生端 iOS和Android CocosCreator代码 我们新建一个javascript文件 命名为 CallNat
  • 【cocos creator 3.x】精灵图片不显示

    精灵图片不显示 现象 原因 解决方案 现象 在cocos creator 3 2版本的使用中遇到了精灵图片无法展示的几个场景 在prefab某个node下Sprite的图片无法显示 动态加载prefab时 某些节点的图片无法显示 原因 图片
  • CocosCreator中的Prefab文件格式总结

    CocosCreator所有的Prefab都是以下类似的格式 我们学会用文本编辑器查看Prefab文件 可以帮助我们更轻松的查找节点 查看节点和组件信息 批量修改节点和组件信息等等 因为在文本编辑器中的Prefab文件才是原始的 而且Coc
  • CocosCreator3.8研究笔记(十五)CocosCreator 资源管理Asset Bundle

    在资源管理模块中有一个很重要的功能 Asset Bundle 那什么是Asset Bundle 有什么作用 怎么使用 Asset Bundle呢 一 什么是Asset Bundle 有什么作用 在日常游戏开发过程中 为了减少游戏启动时 资源
  • javascript全局异常监听

    不管我们用javascript做什么开发 总会出现项目运行异常 甚至crash 这个时候 我们希望不只是javascript会打印一行日志 而是可以出现一个弹窗或者其他的一些让我们开发者更能直接获取到的信息 对于这个需求 javascrip
  • CocosCreator ios 使用sdl库找不到arm64指令集

    关于sdl如何打包成ios库 android库的问题 之后会有相关文章介绍 现在先说一下CocosCreator在使用xcode运行过程中 会报的一个错 Undefined symbols for architecture arm64的错误
  • mvvm设计模式总结

    要了解mvvm 首先要了解mvc和mvp 我们也先简单说一下mvc和mvp MVC MVC全名是Model View Controller 是模型 model 视图 view 控制器 controller 的缩写 一种软件设计典范 用一种业
  • CocosCreator3.0加载远程图片资源

    在微信小游戏平台 需要获取了微信头像 对于这个需求 需要这样来做 获取微信用户信息 得到微信小游戏头像的http地址 在Cocos引擎使用loadRemote来加载 这其中的问题在于 使用loadRemote加载时获得的对象和2 x的版本不
  • CocosCreator3.8研究笔记(十八)CocosCreator UI组件(二)

    前面的文章已经介绍了Canvas 组件 UITransform 组件 Widget 组件 想了解的朋友 请查看 CocosCreator3 8研究笔记 十七 CocosCreator UI组件 一 今天我们主要介绍CocosCreator
  • CocosCreator之KUOKUO教你如何用瓦片地图生成碰撞赛车道

    本次引擎v2 0 10 目标 瓦片地图生成碰撞赛车道 过程 首先 我们需要撸一个瓦片地图 很简单的地图 分两层 墙和地面 然后 在CocosCreator中直接拖进层级管理器就行 然后你就会发现层自动形成节点并挂载组件了 然后给wall和c
  • cocos creator v3.6版本使用Intersection2D模块的circleCircle方法

    在cocos creator v3版本中Intersection2D模块的circleCircle方法可以用来检测两个圆形是否相交 该方法可以实现的功能有 cocos creator吸铁石实现 cocos creator物体在固定位置吸附
  • C#上位机软件支持中英文多语言切换MultiLanguage

    最近遇到一个项目 客户是国外的 开发上位机程序是在中国 需支持中英文多语言切换 多语言切换思路 使用不同的xml配置文件来映射不同的语言 窗体加载时从默认语言DefaultLanguage xml中读取配置 比如中文语言 对应Chinese
  • ThinkPHP 5 框架实现多语言 实例讲解

    ThinkPHP 5 框架实现多语言 今天给大家分享一篇tp5框架多语言的实例 第一步 您需要在配置文件中开启网站多语言 并添加语言允许列表 默认语言 default lang gt zh cn 语言允许列表 lang list gt zh
  • 【cc3.x】顶点着色器和片元着色器小记

    cc3 x cocos creator3 x 的着色器demo有点少 而且讲的不是很清晰 我这种业余自学小白学的真的很艰难 不过好赖算是啃的差不多了 所以有了这则小记 权当备忘录了 首先顶点着色器 上一段代码 CCProgram vs pr
  • CocosCreator列表scrollview滑动速度的修改,鼠标滚动速度修改

    由于cocos creator 在pc端 使用scrollview 鼠标滚动速度太慢 原文地址 CocosCreator列表滑动速度的修改 简书CocosCreator列表滑动速度的修改 简书引擎版本 2 2 2 之后升级的2 4 0直接可

随机推荐

  • 黑盒测试用例设计方法案例与练习题

    1 等价类 案例 登录功能 用户名和密码登录 以在线考试系统为例 年龄字段输入 2 网站注册页面年龄输入要求 某网站前台用户注册页面 其中有年龄字段的输入 要求输入1 150之间的正整数 输入条件 有效等价类 取值 编号 无效等价类 取值
  • 4.1.2 到底在规划、设计什么

    最后更新2021 08 19 以最简单 最朴素的语言说 规划 设计就是在拼凑一个框架 虚拟填补小说的事实 让最后一切发生的合情合理 顺乎自然 没有例外 规划 不能将悲剧的结局变成喜剧收尾 但依靠编剧的功底 能够将剧情玩弄于股掌之间 让每位观
  • 天梯赛省赛选拔赛复盘

    很可惜的一场比赛 两小时调H题没调出来T T 如果调出来就能被选上了 无限Sad 意难平 希望蓝桥杯不留遗憾 文章目录 A题 蜗牛与井 签到 B题 火力覆盖 贪心 数学 C题 ZZ的函数 D题 自然溢出 思维 数学 E题 小y的棋子 F题
  • Groovy语言详解

    一 Groovy 概述 Groovy是一种基于Java平台的面向对象语言 Groovy 1 0于2007年1月2日发布 其中Groovy 2 4是当前的主要版本 Groovy通过Apache License v 2 0发布 Groovy中有
  • apt-get

    问题 如何查看已经安装的软件 如何确定一个软件是否已经安装 目前常用的 更新本机中的数据库缓存 sudo apt get update 查找包含部分关键字的软件包 sudo apt cache search lt 你要查找的name gt
  • 【AI视野·今日NLP 自然语言处理论文速览 第三十六期】Tue, 19 Sep 2023

    AI视野 今日CS NLP 自然语言处理论文速览 Tue 19 Sep 2023 showing first 100 of 106 entries Totally 106 papers 上期速览 更多精彩请移步主页 Daily Comput
  • 数据分析综述

    欢迎来到我的博客 作者 秋无之地 简介 CSDN爬虫 后端 大数据领域创作者 目前从事python爬虫 后端和大数据等相关工作 主要擅长领域有 爬虫 后端 大数据开发 数据分析等 欢迎小伙伴们点赞 收藏 留言 关注 关注必回关 了解过数据分
  • Python random.seed() random.sample()函数使用

    random seed 0 作用 使得随机数据可预测 即只要seed的值一样 后续生成的随机数都一样 一 不设置seed import random list 1 2 3 4 5 6 7 8 9 10 a random sample lis
  • Gensim构造词向量模型

    1 下载维基百科data https dumps wikimedia org zhwiki 20190820 zhwiki 20190820 pages articles xml bz2 也可以下下面的小的 2 将bz2内容提取出来 确保安
  • Qt 图形特效(Graphics Effect)介绍

    本站所有文章由本站和原作者保留一切权力 仅在保留本版权信息 原文链接 原 文作者的情况下允许转载 转载请勿删改原文内容 并不得用于商业用途 谢谢合作 原文链接 Qt 图形特效 Graphics Effect 介绍 QGraphicsEffe
  • nginx路由匹配规则解析

    一 规则分类 精确匹配 优先级最高 精确前缀匹配 优先级仅次于 区分大小写的正则匹配 优先级次于 不区分大小写的正则匹配 优先级次于 uri 普通前缀匹配 优先级次于正则 通用匹配 优先级最低 二 规则详解 精确匹配 精确匹配使用 表示 n
  • java如何计算程序运行时间

    long startTime System currentTimeMillis 获取开始时间doSomething 测试的代码段long endTime System currentTimeMillis 获取结束时间System out p
  • yii2 自动引入php文件,composer 自动载入的四种方式

    Composer 是PHP的一个包依赖管理工具 类似Ruby中的RubyGems或者Node中的NPM 它并非官方 但现在已经非常流行 此文并不介绍如何使用Composer 而是关注于它的autoload的内容吧 对于第三方包的自动加载 C
  • java对单词加密_Java加密解密(一)Java加密体系基础

    Java加密解密 一 Java加密体系基础 1 JCA Java Cryptography Architecture 提供基本的加密框架 如证书 数字签名 消息摘要和密钥对生成器 其主要实现在java security包中 2 JCE Ja
  • ubuntu 命令行提示符 颜色 配色 Linux配色 命令行配色

    https blog csdn net u010953692 article details 88845430 标题 echo PS1 033 01 33m t 033 00m 033 01 31m u 033 00m 033 01 32m
  • 实现页面刷新(全局刷新)

    1 简介 全局刷新 就是当触发请求的时候 xx do 会实现全部界面的刷新 旧的页面销毁 新的页面呈现出来 2 新建一个servlet类 public class DemoServlet extends HttpServlet public
  • 卸载小鲁温度监控有影响吗_振动和温度对轴承的影响,看看你都注意到了吗?...

    振动对轴承的影响 在平时的使用中 振动对轴承的损伤是相当敏感的 剥落 压痕 锈蚀 裂纹 磨损等都会在轴承振动测量中反映出来 所以 通过采用特殊的轴承振动测量器 频率分析器等 可测量出振动的大小 通过频率分布可推断出异常的具体情况 测得的数值
  • c语言数组中怎么找最小值,C语言基础算法---从数组中找最大最小值的基础应用...

    有一个很基础的算法在做嵌入式开发中经常会使用到 那就是找最值 最常见的是以下两个宏 define max a b a gt b a b define min a b a lt b a b max和min宏分别比较两个值谁大谁小 然后予以返回
  • H5跳转微信公众号

    更多内容可参考我的博客 首先找到目标公众号 用电脑打开里面的任意一篇文章 比如 打开深圳卫健委里的任意一篇文章 点击 Network gt Fetch XHR 点击任意一个接口请求 点击 Payload 获取 biz MzIxNDA0MTE
  • CocosCreator多语言包的处理

    如果项目需要国际化的处理 也就是需要切换语言的功能时 一般有两种方案 单个包 优点 1 可以动态切换语言 当然要代码上实现 2 只有一个版本 容易维护 缺点 1 安装包大 多个包 优点 1 安装包小 2 可以对不同语言做深入的本地化 比如功