关于cocos2d-x本地化的问题。

来源:互联网 发布:横滨玛丽知乎 编辑:程序博客网 时间:2024/05/28 05:14

由于工作中涉及到cocos2d-x的本地化问题,今天查了一下,没有找到现成的方法,就自己模仿iOS应用开发的本地化方法做了个简单的本地化实现。


由于本人学生一枚,目前正在实习,接触到的技术很有限,使用的方法可能比较笨拙,但是解决问题是目的,会怎么做就先怎么做了,等以后慢慢完善。希望大神们有什么好的建议意见不吝赐教。(注:本人使用的cocos2d-x版本是2.0.3)

====================================================

1、本地化文件存储。

我实现本地化的基本思路就是简单的字典(key-value)。iOS应用开发用的是.strings,个人觉得plist用起来比较舒服,又可以直接用CCDictionary读取,所以就直接用plist来存储。目前只用到两个语言:中文、英文。工程中添加如下属性表文件,部分内容如图,使用相同的key。

en.plist部分内容:


zh-Hans.plist部分内容:



2、代码实现部分

class YLocalizedStringGetter{    public:        static const char* getStringByKey(const char * key){                //获取当前系统环境语言类型        ccLanguageType nType = CCApplication::sharedApplication()->getCurrentLanguage();                //字典        CCDictionary *pDic;                if(1 == nType)            //根据语言选择不同的属性表           pDic = CCDictionary::createWithContentsOfFile("zh-Hans.plist");        else            pDic = CCDictionary::createWithContentsOfFile("en.plist");                std::string keyStr = key;                //返回key对应的value        return (pDic -> valueForKey(keyStr))->getCString();    }    };

说明:先获取当前系统环境的语言类型(ps:之前在学习iOS应用开发的时候,没找到怎么获取当前设备的语言,有朋友知道的求指导)。

ccLanguageType在2.0.3版本中的定义(写到这里才发现没有Japanese,真和谐):

typedef enum LanguageType{    kLanguageEnglish = 0,    kLanguageChinese,    kLanguageFrench,    kLanguageItalian,    kLanguageGerman,    kLanguageSpanish,    kLanguageRussian} ccLanguageType;

所以当当前的系统语言环境类型值等于1的时候,系统是中文。所以根据本人的需求,只需要判断中文,其他系统都直接用英文。

3、宏方法

自己写的这个getStringByKey函数的返回值是const char*的,但是在实际应用中,也就是我正在做的这个项目,它有两个页面是直接加载了View的,是iOS平台相关的了。本来打算这部分直接用常规的本地化方法来写的,但是考虑到这样维护起来不方便(虽然cocos2d-x中添加某一平台相关的东西已经是个很狗血的事),于是定义了两个宏方法,一个只是简单的把getStringByKey这个方法包装了一下,另一个是专门为调用NSString的地方定义的。

//return type:NSString*(for iOS)#define YLocalizedNSStringByKey(key) [NSString stringWithUTF8String:(YLocalizedStringGetter::getStringByKey(key))]//return type:const char*#define YLocalizedCStringByKey(key) YLocalizedStringGetter::getStringByKey(key)


这种宏方法参照的是iOS中本地化宏方法的:

#define NSLocalizedString(key, comment) \    [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]#define NSLocalizedStringFromTable(key, tbl, comment) \    [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:(tbl)]#define NSLocalizedStringFromTableInBundle(key, tbl, bundle, comment) \    [bundle localizedStringForKey:(key) value:@"" table:(tbl)]#define NSLocalizedStringWithDefaultValue(key, tbl, bundle, val, comment) \    [bundle localizedStringForKey:(key) value:(val) table:(tbl)]

现学现卖吧,感觉这样写也提升了代码的可读性(好像很厉害的样子)。

4、调用

既然宏方法是参照来的,调用的时候自然也是很相似的。

cocos2d-x中的调用:

  CCLabelTTF *pName  = CCLabelTTF::create(                        CCString::createWithFormat("%-10s",YLocalizedCStringByKey("noname"))->getCString(), "", 18);
Objective-C中的调用:

  UIButton *goBack = [UIButton buttonWithType:UIButtonTypeCustom];  [goBack setTitle:YLocalizedNSStringByKey("backTitle") forState:UIControlStateNormal];

5、总结

差不多就是这样吧,不知道有没有什么地方忘了写的,第一次写博客,其实整体上非常简单,希望通过写博客的方式帮自己理理思路,同时也找到可以改进的地方。


6、关于图片素材

另外,游戏开发中使用更多的是图片素材,所以图片的本地化应该更常用。目前这个项目,我的图片素材都是做成Texture的,所以本地化的方法就是把文字相关的素材打包到同一个Texture,然后每种语言出张,根据不同的语言环境加载不同的纹理图,实现起来还算简单。如果看官有什么好的方法或者有什么疑问都可以联系我,大家一起进步!



PS:第一次写博客还是有点小激动的,把自己写的东西整理出来也是个学习的过程,也许还能从一定程度上帮助到别人,很开心。另外大家有什么好的学习建议意见愿意赐教的可以给我留言或者直接给我发邮件,cragodn@gmail.com。非常感谢! 

原创粉丝点击