关于cocos2d-x本地化的问题

本文介绍了一种在Cocos2d-x项目中实现本地化的简单方法,通过使用plist文件存储不同语言的字符串资源,并提供代码示例展示了如何根据不同系统语言加载相应的资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文地址:http://blog.youkuaiyun.com/zyxhjy/article/details/8318529


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


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

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

1、本地化文件存储。

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

en.plist部分内容:


zh-Hans.plist部分内容:



2、代码实现部分

[cpp]  view plain copy
  1. class YLocalizedStringGetter{  
  2.       
  3. public:  
  4.       
  5.     static const char* getStringByKey(const char * key){  
  6.           
  7.         //获取当前系统环境语言类型  
  8.         ccLanguageType nType = CCApplication::sharedApplication()->getCurrentLanguage();  
  9.           
  10.         //字典  
  11.         CCDictionary *pDic;  
  12.           
  13.         if(1 == nType)  
  14.             //根据语言选择不同的属性表  
  15.            pDic = CCDictionary::createWithContentsOfFile("zh-Hans.plist");  
  16.         else  
  17.             pDic = CCDictionary::createWithContentsOfFile("en.plist");  
  18.           
  19.         std::string keyStr = key;  
  20.           
  21.         //返回key对应的value  
  22.         return (pDic -> valueForKey(keyStr))->getCString();  
  23.     }  
  24.       
  25. };  

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

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

[cpp]  view plain copy
  1. typedef enum LanguageType  
  2. {  
  3.     kLanguageEnglish = 0,  
  4.     kLanguageChinese,  
  5.     kLanguageFrench,  
  6.     kLanguageItalian,  
  7.     kLanguageGerman,  
  8.     kLanguageSpanish,  
  9.     kLanguageRussian  
  10. } ccLanguageType;  

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

3、宏方法

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

[cpp]  view plain copy
  1. //return type:NSString*(for iOS)  
  2. #define YLocalizedNSStringByKey(key) [NSString stringWithUTF8String:(YLocalizedStringGetter::getStringByKey(key))]  
  3.   
  4. //return type:const char*  
  5. #define YLocalizedCStringByKey(key) YLocalizedStringGetter::getStringByKey(key)  


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

[cpp]  view plain copy
  1. #define NSLocalizedString(key, comment) \  
  2.         [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]  
  3. #define NSLocalizedStringFromTable(key, tbl, comment) \  
  4.         [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:(tbl)]  
  5. #define NSLocalizedStringFromTableInBundle(key, tbl, bundle, comment) \  
  6.         [bundle localizedStringForKey:(key) value:@"" table:(tbl)]  
  7. #define NSLocalizedStringWithDefaultValue(key, tbl, bundle, val, comment) \  
  8.         [bundle localizedStringForKey:(key) value:(val) table:(tbl)]  

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

4、调用

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

cocos2d-x中的调用:

[cpp]  view plain copy
  1. CCLabelTTF *pName  = CCLabelTTF::create(  
  2.                       CCString::createWithFormat("%-10s",YLocalizedCStringByKey("noname"))->getCString(), "", 18);  
Objective-C中的调用:

[cpp]  view plain copy
  1. UIButton *goBack = [UIButton buttonWithType:UIButtonTypeCustom];  
  2. [goBack setTitle:YLocalizedNSStringByKey("backTitle") forState:UIControlStateNormal];  

5、总结

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


6、关于图片素材

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



获取当前设备语言

[cpp]  view plain copy
  1. // get the current language and country config  
  2.     NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];  
  3.     NSArray *languages = [defaults objectForKey:@"AppleLanguages"];  
  4.     NSString *currentLanguage = [languages objectAtIndex:0];  
  5.   
  6.     // get the current language code.(such as English is "en", Chinese is "zh" and so on)  
  7.     NSDictionary* temp = [NSLocale componentsFromLocaleIdentifier:currentLanguage];  
  8.     NSString * languageCode = [temp objectForKey:NSLocaleLanguageCode]; 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值