关于cocos2d-x本地化的问题
2014-02-11 11:26
253 查看
原文地址:http://blog.csdn.net/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
plaincopy
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,真和谐):
[cpp] view
plaincopy
typedef enum LanguageType
{
kLanguageEnglish = 0,
kLanguageChinese,
kLanguageFrench,
kLanguageItalian,
kLanguageGerman,
kLanguageSpanish,
kLanguageRussian
} ccLanguageType;
所以当当前的系统语言环境类型值等于1的时候,系统是中文。所以根据本人的需求,只需要判断中文,其他系统都直接用英文。
3、宏方法
自己写的这个getStringByKey函数的返回值是const char*的,但是在实际应用中,也就是我正在做的这个项目,它有两个页面是直接加载了View的,是iOS平台相关的了。本来打算这部分直接用常规的本地化方法来写的,但是考虑到这样维护起来不方便(虽然cocos2d-x中添加某一平台相关的东西已经是个很狗血的事),于是定义了两个宏方法,一个只是简单的把getStringByKey这个方法包装了一下,另一个是专门为调用NSString的地方定义的。
[cpp] view
plaincopy
//return type:NSString*(for iOS)
#define YLocalizedNSStringByKey(key) [NSString stringWithUTF8String:(YLocalizedStringGetter::getStringByKey(key))]
//return type:const char*
#define YLocalizedCStringByKey(key) YLocalizedStringGetter::getStringByKey(key)
这种宏方法参照的是iOS中本地化宏方法的:
[cpp] view
plaincopy
#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中的调用:
[cpp] view
plaincopy
CCLabelTTF *pName = CCLabelTTF::create(
CCString::createWithFormat("%-10s",YLocalizedCStringByKey("noname"))->getCString(), "", 18);
Objective-C中的调用:
[cpp] view
plaincopy
UIButton *goBack = [UIButton buttonWithType:UIButtonTypeCustom];
[goBack setTitle:YLocalizedNSStringByKey("backTitle") forState:UIControlStateNormal];
5、总结
差不多就是这样吧,不知道有没有什么地方忘了写的,第一次写博客,其实整体上非常简单,希望通过写博客的方式帮自己理理思路,同时也找到可以改进的地方。
6、关于图片素材
另外,游戏开发中使用更多的是图片素材,所以图片的本地化应该更常用。目前这个项目,我的图片素材都是做成Texture的,所以本地化的方法就是把文字相关的素材打包到同一个Texture,然后每种语言出张,根据不同的语言环境加载不同的纹理图,实现起来还算简单。如果看官有什么好的方法或者有什么疑问都可以联系我,大家一起进步!
获取当前设备语言
[cpp] view
plaincopy
// get the current language and country config
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSArray *languages = [defaults objectForKey:@"AppleLanguages"];
NSString *currentLanguage = [languages objectAtIndex:0];
// get the current language code.(such as English is "en", Chinese is "zh" and so on)
NSDictionary* temp = [NSLocale componentsFromLocaleIdentifier:currentLanguage];
NSString * languageCode = [temp objectForKey:NSLocaleLanguageCode];
由于工作中涉及到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
plaincopy
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,真和谐):
[cpp] view
plaincopy
typedef enum LanguageType
{
kLanguageEnglish = 0,
kLanguageChinese,
kLanguageFrench,
kLanguageItalian,
kLanguageGerman,
kLanguageSpanish,
kLanguageRussian
} ccLanguageType;
所以当当前的系统语言环境类型值等于1的时候,系统是中文。所以根据本人的需求,只需要判断中文,其他系统都直接用英文。
3、宏方法
自己写的这个getStringByKey函数的返回值是const char*的,但是在实际应用中,也就是我正在做的这个项目,它有两个页面是直接加载了View的,是iOS平台相关的了。本来打算这部分直接用常规的本地化方法来写的,但是考虑到这样维护起来不方便(虽然cocos2d-x中添加某一平台相关的东西已经是个很狗血的事),于是定义了两个宏方法,一个只是简单的把getStringByKey这个方法包装了一下,另一个是专门为调用NSString的地方定义的。
[cpp] view
plaincopy
//return type:NSString*(for iOS)
#define YLocalizedNSStringByKey(key) [NSString stringWithUTF8String:(YLocalizedStringGetter::getStringByKey(key))]
//return type:const char*
#define YLocalizedCStringByKey(key) YLocalizedStringGetter::getStringByKey(key)
这种宏方法参照的是iOS中本地化宏方法的:
[cpp] view
plaincopy
#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中的调用:
[cpp] view
plaincopy
CCLabelTTF *pName = CCLabelTTF::create(
CCString::createWithFormat("%-10s",YLocalizedCStringByKey("noname"))->getCString(), "", 18);
Objective-C中的调用:
[cpp] view
plaincopy
UIButton *goBack = [UIButton buttonWithType:UIButtonTypeCustom];
[goBack setTitle:YLocalizedNSStringByKey("backTitle") forState:UIControlStateNormal];
5、总结
差不多就是这样吧,不知道有没有什么地方忘了写的,第一次写博客,其实整体上非常简单,希望通过写博客的方式帮自己理理思路,同时也找到可以改进的地方。
6、关于图片素材
另外,游戏开发中使用更多的是图片素材,所以图片的本地化应该更常用。目前这个项目,我的图片素材都是做成Texture的,所以本地化的方法就是把文字相关的素材打包到同一个Texture,然后每种语言出张,根据不同的语言环境加载不同的纹理图,实现起来还算简单。如果看官有什么好的方法或者有什么疑问都可以联系我,大家一起进步!
获取当前设备语言
[cpp] view
plaincopy
// get the current language and country config
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSArray *languages = [defaults objectForKey:@"AppleLanguages"];
NSString *currentLanguage = [languages objectAtIndex:0];
// get the current language code.(such as English is "en", Chinese is "zh" and so on)
NSDictionary* temp = [NSLocale componentsFromLocaleIdentifier:currentLanguage];
NSString * languageCode = [temp objectForKey:NSLocaleLanguageCode];
相关文章推荐
- 关于cocos2d-x本地化的问题。
- 关于cocos2d和cocos2dx,还有iOS上的cocos2d的ARC问题
- Cocos2D v3.x中关于重叠触摸层优先级的问题
- 关于Cocos2d-x中音效重复播放问题的解决
- cocos2d-x中关于打包成APK的问题
- 关于Cocos2d-x中文乱码问题的解决
- cocos2d-x tips(一)关于tilemap滚动时黑线闪动的问题
- [cocos2dx]COCOS2D-X 关于 fatal error C1083: 无法打开包括文件:“CCStdC.h” 的问题
- 关于cocos2d-x 触屏事件不能接收的问题
- 关于cocos2d-x 资源释放问题
- Cocos2d-X----关于覆盖问题 setZorder
- 关于cocos2d-x的一些问题
- Cocos2D v3.x中关于重叠触摸层优先级的问题
- 关于cocos2d-x面试的问题
- 关于Cocos2d-x游戏在小米盒子3对声音进行预加载造成假死的问题
- COCOS2D-X 关于 fatal error C1083: 无法打开包括文件:“CCStdC.h” 的问题
- 关于Cocos2D-X 3.10在android平台上使用外接键盘无法响应的问题
- 关于Cocos2d-x中使用完Blink动作后精灵突然消失的问题的解决
- 关于quick-cocos2d-x开发的热(yue)门(jing)问题
- 关于cocos2d和cocos2dx,还有iOS上的cocos2d的ARC问题