cocos2d-x локализация упрощенный/традиционный китайский

мне нужно разделить упрощенный/традиционный китайский. в cocos2d для iPhone я просто использую "hans" и "hant". но в cocos2d-x я погружаюсь в код, и вот код для CCApplication:

ccLanguageType ret = kLanguageEnglish;
if ([languageCode isEqualToString:@"zh"])
{
    ret = kLanguageChinese;
}
else if ([languageCode isEqualToString:@"en"])
{
    ret = kLanguageEnglish;
}
else if ([languageCode isEqualToString:@"fr"]){
    ret = kLanguageFrench;
}
else if ([languageCode isEqualToString:@"it"]){
    ret = kLanguageItalian;
}
else if ([languageCode isEqualToString:@"de"]){
    ret = kLanguageGerman;
}
else if ([languageCode isEqualToString:@"es"]){
    ret = kLanguageSpanish;
}
else if ([languageCode isEqualToString:@"ru"]){
    ret = kLanguageRussian;
}

return ret;

обратите внимание, что только «zh» для китайского языка (возможно, как упрощенного, так и традиционного)

так как я могу отличить их?

РЕДАКТИРОВАТЬ: я использую cocos2d-x и должен работать с Android. не только айфон. Ответ Микки работает только для iPhone. благодаря.


person OMGPOP    schedule 22.05.2012    source источник


Ответы (3)


Вам нужно внести некоторые изменения в cocos2dx android jni: в cocos2d-x-2.x.x/cocos2dx/platform/android/java/src/org/cocos2dx/lib/Cocos2dxHelper.java,

заменять

return Locale.getDefault().getLanguage();

с участием

return Locale.getDefault().toString();

Таким образом, вы можете получить zh_CN, zh_TW в CCApplication::getCurrentLanguage(), также вы должны обновить реализации в CCApplication::getCurrentLanguage() (находит cocos2d-x-2.xx/cocos2dx/platform/android/CCApplication.cpp) :

ccLanguageType CCApplication::getCurrentLanguage()
{
    std::string languageName = getCurrentLanguageJNI();
    if (languageName.find("zh_CN") == 0) {
        return kLanguageChineseCN; // need define this value by yourself
    } else if (languageName.find("zh_TW") == 0) {
        return kLanguageChineseTW; // need define this value by yourself
    } else if (languangeName.find("en") == 0) {
        return kLanguageEnglish;
    } ...

    return kLanguageEnglish;
}
person Ring.Yee    schedule 13.08.2013

Я протестировал следующий код на cocos2D helloworld. Я могу разделить упрощенное/традиционное на zh-Hans и zh-Hant.

Шаг 1. В HelloWorldLayer.m вам нужно добавить эту строку вверху или не скомпилировать:

#import <Foundation/NSLocale.h>

Шаг 2. Теперь вы можете получить язык. Например,

-(id)init{
    NSString* currentLang = [[NSLocale preferredLanguages] objectAtIndex:0] ;
    NSLog(@"Language: %@", currentLang);
}
person Mickey    schedule 25.05.2012
comment
я использую cocos2d-x, а не cocos2d. - person OMGPOP; 26.05.2012

Вот как я модифицировал код cocos2d-x, чтобы различать упрощенный и традиционный китайский. Обратите внимание, это для cocos2d-x v3.0+.

Для iOS измените cocos2d_libs.xcodeproj/platform/ios/CCApplication-ios.mm.

LanguageType Application::getCurrentLanguage()
{
    // 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];

    LanguageType ret = LanguageType::ENGLISH;
    if ([languageCode isEqualToString:@"zh"])
    {
       /** CHANGE THE FOLLOWING LINES */
        NSString* scriptCode = [temp objectForKey:NSLocaleScriptCode];
        NSString* countryCode = [temp objectForKey:NSLocaleCountryCode];
        // On iOS, either chinese hong kong or chinese taiwan are traditional chinese.
        if ([scriptCode isEqualToString:@"Hant"] || [countryCode isEqualToString:@"HK"] || [countryCode isEqualToString:@"TW"]) {
            ret = LanguageType::CHINESE_TRADITIONAL;  // You need to add these enum values to LanguageType
        } else {
            ret = LanguageType::CHINESE_SIMPLIFIED;  // You need to add these enum values to LanguageType
        }
    }
    else if ([languageCode isEqualToString:@"en"])
    {
        ret = LanguageType::ENGLISH;
    }
.....
.....

Для Android измените cocos2d/cocos/platform/android/CCApplication-android.cpp.

LanguageType Application::getCurrentLanguage()
{
    std::string languageName = getCurrentLanguageJNI();
    const char* pLanguageName = languageName.c_str();
    const char* languageCode = getCurrentLanguageCode();
    LanguageType ret = LanguageType::ENGLISH;

    if (0 == strcmp("zh", languageCode))
    {
        /** Change the following lines */
        if (languageName.find("TW") != std::string::npos) {
            ret = LanguageType::CHINESE_TRADITIONAL;
        } else {
            ret = LanguageType::CHINESE_SIMPLIFIED;
        }
    }
    else if (0 == strcmp("en", languageCode))
    {
        ret = LanguageType::ENGLISH;
    }
    else if (0 == strcmp("fr", languageCode))
.....
.....

а также изменить libcocos2d/org/cocos2dx/lib/Cocos2dxHelper.java

public static String getCurrentLanguage() {
    // This would return language code as well as region code, e.g. zh_CN
    return Locale.getDefault().toString();
}
person marcwjj    schedule 28.05.2015
comment
В коде есть ошибка, когда вы проверяете, чтобы сравнить код, вы должны искать код страны либо TW, либо HK, чтобы считать его традиционным китайским. Ганс - тот, кто для упрощения. (Для iOS-версии). И разве вы не должны искать HK в LanguageName для версии Android? - person Pochi; 13.01.2016
comment
@Чикис прав. Условие iOS должно быть обновлено до [scriptCode isEqualToString:@Hant] || [Код страны isEqualToString:@HK] || [Код страны isEqualToString:@TW] - person BoJIHa npocmombI; 14.04.2016
comment
Спасибо Chiquis и BoJIHa, я обновил условие в iOS. Для Android нет необходимости проверять подстроку HK, так как есть только zh_rCN и zh_rTW, чтобы отличить упрощенный китайский от традиционного китайского. - person marcwjj; 03.10.2016