项目整理二.多语言包处理

本文介绍如何为跨平台游戏引擎Cocos2d-x配置iOS和Android系统的多语言支持,包括修改源代码以获取当前设备的语言设置,并根据不同地区进行语言适配。

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

iOS,android适用


1,iOS:修改 cocos2d/platform/ios/CCApplication.mm:

const char * Application::getCurrentLanguageCode()

{

    static char code[30]={0};

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    NSArray *languages = [defaults objectForKey:@"AppleLanguages"];

    NSString *currentLanguage = [languages objectAtIndex:0];

    

    const char *code_full  = [currentLanguage cStringUsingEncoding:NSASCIIStringEncoding];

    log("Application::getCurrentLanguageCode()============code_full:%s",code_full);

    

    // 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];

    [languageCode getCString:code maxLength:2 encoding:NSASCIIStringEncoding];

    

    const char *code_short  = [languageCode cStringUsingEncoding:NSASCIIStringEncoding];

    log("Application::getCurrentLanguageCode()============code_short:%s",code_short);

    

    if (strcmp("zh", code_short) == 0) {

        if ([[NSString stringWithUTF8String:code_full] rangeOfString:@"Hant"].location != NSNotFound ||

            [[NSString stringWithUTF8String:code_full] rangeOfString:@"zh-HK"].location != NSNotFound ||

            [[NSString stringWithUTF8String:code_full] rangeOfString:@"zh-TW"].location != NSNotFound) {

            strcpy(code, [@"zh-Hant" UTF8String]);

        }else

        {

            strcpy(code, [@"zh-Hans" UTF8String]);

        }

        

    }else

    {

        strcpy(code, code_short);

    }

    log("Application::getCurrentLanguageCode()============code:%s",code);

    return code;

}


2,adndroid:修改cocos2d/platform/android/CCApplication.cpp

a .增加函数

const char * Application::getCurrentLanguageCode()

{

    #define len 7//3

    static char code[len]={0};

    strncpy(code,getCurrentLanguageJNI().c_str(),len-1);

    code[len-1]='\0';

    log("android Application::getCurrentLanguageCode()========%s,%s",code,getCurrentLanguageJNI().c_str());

    return code;

}


b.修改cocos2d/cocos/platform/android/jni/Java_org_cocos2dx_lib_Cocos2dxHelper.h(.cpp)


增加函数

extern std::string getCurrentCountryJNI() ;


std::string getCurrentLanguageJNI() {

    JniMethodInfo t;

    std::string ret("");

    

    if (JniHelper::getStaticMethodInfo(t, CLASS_NAME, "getCurrentLanguage", "()Ljava/lang/String;")) {

        jstring str = (jstring)t.env->CallStaticObjectMethod(t.classID, t.methodID);

        t.env->DeleteLocalRef(t.classID);

        ret = JniHelper::jstring2string(str);

        t.env->DeleteLocalRef(str);

    }


    return ret;

}


无须修改

cocos2d/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxHelper.java:

public static String getCurrentLanguage() {
     return Locale.getDefault().getLanguage();
     }



4.调用

std::string getLocalLang()

{

       bool bFind = false;

        t_string lng = cocos2d::Application::getCurrentLanguageCode();

        log("loadGameCfg1------------------------------------lang:%s",lng.c_str());

        

#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

        if ("zh" == lng) {

            t_string countryStr = cocos2d::Application::getInstance()->getCurrentCountry();

            if (countryStr == "HK" || countryStr == "TW") {

                lng = "zh-Hant";

            }else if (countryStr == "CN")

            {

                lng = "zh-Hans";

                

            }

        }

#endif


        for(t_ulong i = 0;i<m_strLngs.size();i++)

        {

            if(lng == m_strLngs[i])//m_string:游戏的多语言 en,es,ja,pt,th,zh-Hant,zh-Hans,ko,de

            {

                bFind = true;

                break;

            }

        }

        

        if(!bFind)

        {

            lng = "en";

        }

return lng;}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值