[重新认识cocos2dx---工具篇] 一 cocos命令行之语言包MultiLanguage
来源:互联网 发布:手机拍摄淘宝视频 编辑:程序博客网 时间:2024/06/05 03:23
多语言对于游戏程序的设计来说是很必要的,很意外的是在cocos命令行项目中也发现了这个,就试着分析一下,不喜勿喷。
主体程序是/bin/目录下的MultiLanguage.py和string.json
一 . 用法
#设置语言类型,本例中时'en','zh','zh_tr' 对应英语,简体,台湾MultiLanguage.set_language('zh')#获取相应的字符串MultiLanguage.get_string('COCOS_PARSE_PLUGIN_WARNING_FMT', classname)
二. 分析
首先应该区分在python中的 类方法和 实例方法(详情链接)
第一个初始化的方法是不能少的,读取语言的配置信息
def __init__(self): # 获取配置文件的路径 cfg_file_path = os.path.join(get_current_path(), MultiLanguage.CONFIG_FILE_NAME) try: # 获取语言和编码方式 sys_lang, self.encoding = locale.getdefaultlocale() except: sys_lang = None self.encoding = None pass if self.encoding is None: self.encoding = 'utf-8' if sys_lang is None: cur_lang_key = MultiLanguage.DEFAULT_LANGUAGE else: cur_lang_key = self.get_lang_key(sys_lang) # 读取json文档 if os.path.isfile(cfg_file_path): f = open(cfg_file_path) self.cfg_info = json.load(f, encoding='utf-8') f.close() if self.cfg_info.has_key(cur_lang_key): self.cur_lang_strings = self.cfg_info[cur_lang_key] else: self.cur_lang_strings = None if self.cfg_info.has_key(MultiLanguage.DEFAULT_LANGUAGE): self.default_lang_strings = self.cfg_info[MultiLanguage.DEFAULT_LANGUAGE] else: self.default_lang_strings = None else: self.cfg_info = None self.cur_lang_strings = None self.default_lang_strings = None
def get_current_path():if getattr(sys, 'frozen', None):# 获取安装目录ret = os.path.realpath(os.path.dirname(sys.executable))else:# 获取当前文件的目录ret = os.path.realpath(os.path.dirname(__file__))return retdef get_lang_key(self, sys_lang):# 将系统的语言编号变为自定义的编号 sys_lang_info = sys_lang.split('_')lang = sys_lang_info[0]lang = lang.lower()region = Noneif len(sys_lang_info) > 1:region = sys_lang_info[1]region = region.lower()if lang == 'zh':if (region is None) or (region == 'cn'):ret = langelse:ret = 'zh_tr'else:ret = langreturn ret
第二个 set_language
@classmethoddef set_language(cls, lang):'''挺常用的设计思路 单体类,调用实例方法设置当前的语言'''cls.get_instance().set_current_language(lang)@classmethoddef get_instance(cls):if cls.instance is None:cls.instance = MultiLanguage()return cls.instancedef set_current_language(self, lang):if (self.cfg_info is not None) and (self.cfg_info.has_key(lang)):self.cur_lang_strings = self.cfg_info[lang]else:cocos.Logging.warning(MultiLanguage.get_string('COCOS_WARNING_LANG_NOT_SUPPORT_FMT', lang))第三个: get_string()
@classmethod def get_string(cls, key, fmt_value=None): ''' 获取指定key的字符,或是返回默认值 ''' fmt = cls.get_instance().get_current_string(key) if fmt_value is None: ret = fmt else: # 拼凑字段 eg: ("%s,%s") %("name","nID") == "name,nID" if isinstance(fmt_value, tuple): dst_values = [] for value in fmt_value: # 转换编码方式 if isinstance(value, unicode): dst_values.append(value.encode(cls.get_instance().get_encoding())) else: dst_values.append(value) ret = fmt % tuple(dst_values) elif isinstance(fmt_value, unicode): ret = fmt % fmt_value.encode(cls.get_instance().get_encoding()) else: ret = fmt % fmt_value return ret def get_current_string(self, key): if self.has_key(key, self.cur_lang_strings): # 查询到含有所需的字段 ret = self.cur_lang_strings[key] elif self.has_key(key, self.default_lang_strings): # 查询到默认表中含有所需的字段 ret = self.default_lang_strings[key] else: ret= key # 转换编码方式 if isinstance(ret, unicode): ret = ret.encode(self.encoding) return ret def has_key(self, key, strings_info): ret = False if strings_info is not None and strings_info.has_key(key): ret = True return ret
三. 总结
该类的核心方法MultiLanguage.get_string().设计思路也是多语言实现的可行方法之一,值得借鉴。另外类中对编码的转换值得注意
有些方法还是值得借鉴的:
#判读表中是否含有键值keydef has_key(self, key, strings_info):ret = Falseif strings_info is not None and strings_info.has_key(key):ret = Truereturn ret# 转换编码方式if isinstance(ret, unicode):ret = ret.encode(self.encoding)# 获取当前文件的目录def get_current_path(): if getattr(sys, 'frozen', None): # 获取安装目录 ret = os.path.realpath(os.path.dirname(sys.executable)) else: # 获取当前文件的目录 ret = os.path.realpath(os.path.dirname(__file__)) return ret# 获取语言和编码方式try:sys_lang, self.encoding = locale.getdefaultlocale()except:sys_lang = Noneself.encoding = Nonepass
end
0 0
- [重新认识cocos2dx---工具篇] 一 cocos命令行之语言包MultiLanguage
- [重新认识cocos2dx---工具篇] 一 setup.py
- [重新认识cocos2dx] 感想
- cocos2dx:cocos之Shader
- cocos 学习笔记(一) cocos2dx-v3.0命令行创建工程
- 重新定义与认识商业智能可视化工具(一)
- 重新认识android(一)
- cocos2dx命令行创建项目与cocos创建项目
- 重新认识WebService(一)
- 重新认识javascript(一)
- 重新认识View(一)
- Qt/C++ 之重新认识
- 重新认识电脑硬件(一)-主机内部
- spring源码分析,重新认识spring 一
- cocos2dx之lua 继承、重新定义
- 使用命令行工具提升cocos2d-x开发效率(一)之TexturePacker篇
- 重新开始之学习篇(一)
- Android从零开始之重新认识Activity--基础知识
- FMDB的使用
- 大型网站技术架构
- Java中带包的类的编译与执行
- 今日学习札记——C++指针3(11.4)
- Network Link Conditioner
- [重新认识cocos2dx---工具篇] 一 cocos命令行之语言包MultiLanguage
- Gradle 笔记——Java构建入门
- xcode7不允许HTTP传输的过渡办法
- mac安装redis3.0.5分布式集群
- HttpClient设置请求超时和读取超时
- ios app 修改名称后,收到的推送通知 显示的仍然是上一个名称 问题
- node.js study
- iOS工程中添加cocoapods
- 关于Struts2框架下使用servlet的配置