cocos2d-x localización chino simplificado/tradicional

necesito separar chino simplificado/tradicional. en cocos2d para iPhone, simplemente uso "hans" y "hant". pero en cocos2d-x, me sumergí en el código y aquí está el código para 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;

tenga en cuenta que solo 'zh' para chino (ambos simplificado/tradicional, tal vez)

Entonces, ¿cómo puedo distinguirlos?

EDITAR: uso cocos2d-x y necesito trabajar con Android. no solo iPhone. La respuesta de Mickey solo funciona para iPhone. Gracias.

preguntado el 22 de mayo de 12 a las 08:05

3 Respuestas

Probé el siguiente código en cocos2D helloworld. Puedo separar simplificado/tradicional por zh-Hans y zh-hant.

Paso 1. En HelloWorldLayer.m, debe agregar esta línea en la parte superior o no compilar:

#import <Foundation/NSLocale.h>

Paso 2. Ahora, usted puede obtener el idioma. Por ejemplo,

-(id)init{
    NSString* currentLang = [[NSLocale preferredLanguages] objectAtIndex:0] ;
    NSLog(@"Language: %@", currentLang);
}

contestado el 25 de mayo de 12 a las 10:05

Yo uso cocos2d-x, no cocos2d. - OMGPOP

Así es como modifiqué el código cocos2d-x para distinguir el chino simplificado y el tradicional. Tenga en cuenta que esto es para cocos2d-x v3.0+.

Para iOS, modifique 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;
    }
.....
.....

Para Android, modifique 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))
.....
.....

y también modifique 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();
}

Respondido 03 Oct 16, 19:10

Hay un error en el código, cuando verifique para comparar el código, debe buscar un código de país de TW o HK para considerarlo chino tradicional. Hans es el de simplificado. (Para la versión de iOS). ¿Y no debería buscar HK en el nombre del idioma para la versión de Android también? - Pocos

@Chiquis tiene razón. La condición de iOS debe actualizarse a [scriptCode isEqualToString:@"Hant"] || [el código del país es igual a la cadena: @"HK"] || [el código de país es igual a la cadena: @"TW"] - BoJIHa npocmombI

Gracias Chiquis y BoJIHa, actualicé la condición en iOS. Para Android, no es necesario verificar la subcadena HK, ya que solo hay zh_rCN y zh_rTW para distinguir el chino simplificado del chino tradicional. - marcwjj

Necesitas hacer algunos cambios en cocos2dx android jni: en cocos2d-x-2.x.x/cocos2dx/platform/android/java/src/org/cocos2dx/lib/Cocos2dxHelper.java,

reemplazar

return Locale.getDefault().getLanguage();

con

return Locale.getDefault().toString();

Por lo tanto, puede obtener zh_CN, zh_TW en CCApplication::getCurrentLanguage(), además, debe actualizar las implementaciones en CCApplication::getCurrentLanguage() (localiza 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;
}

Respondido 13 ago 13, 10:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.