2015. 9. 15. 14:17

Locale 확인 시 중국과 대만이 구분되지 않는 부분

알다시피 중국과 대만의 locale 코드는 zh-CN 과 zh-TW 이다.

하지만 왜 이렇게 되있는지 모르겠지만 cocos2d는 앞자리인 zh 만으로 언어를 구분하도록 되어있어

플랫폼 별로 모든 소스를 다 고쳐야 제대로된 처리를 할 수 있다.



자바 플랫폼 변경방법 ----------------------------------------------------------------


설치 경로에 따라 다를수 있겠지만 아래 파일을 열어

/코코스설치경로/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxHelper.java


public static String getCurrentLanguage() {

    return Locale.getDefault().getLanguage(); --> return Locale.getDefault().toString(); 

}


위와 같이 바꾸어주면 java쪽에서 ko-KR 같이 완전한 값을 리턴하게 된다.


그후에 cocos에서 호출하는 실제 getCurrentLanguage() 함수를 한번 더 수정해 줘야 하는데 위치는 아래 경로에 있다.


/코코스설치경로/cocos/platform/android/CCApplication-android.cpp


LanguageType Application::getCurrentLanguage()

{

    std::string languageName = getCurrentLanguageJNI();

    const char* pLanguageCode = languageName.c_str();

    const char* pLanguageName = getCurrentLanguageCode();

    LanguageType ret = LanguageType::ENGLISH;

    

    std::cout << languageName << std::endl;


    if (0 == strcmp("zh", pLanguageName))

    {

        if(0 == strcmp("zh-TW", pLanguageCode)

        {

            ret = LanguageType::TAIWAN; //  platform/CCCommon.h 파일에 추가해준다.

        }

        else 

        {

            ret = LanguageType::CHINESE;

        }

    }

   //이하 생략

}


ios 플랫폼 변경방법 ----------------------------------------------------------------

/코코스설치경로/cocos/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"]) {

            ret = LanguageType::TAIWAN;  // You need to add these enum values to LanguageType

        } else {

            ret = LanguageType::CHINESE;  // You need to add these enum values to LanguageType

        }

    }

   //이하생략

}





Win32 플랫폼 변경방법 ----------------------------------------------------------------

/코코스설치경로/cocos/platform/win32/CCApplication-win32.cpp


LanguageType Application::getCurrentLanguage()

{

    LanguageType ret = LanguageType::ENGLISH;

    

    LCID localeID = GetUserDefaultLCID();

    unsigned short primaryLanguageID = localeID & 0xFF;

    

    switch (primaryLanguageID)

    {

        case LANG_CHINESE:

        {

            if(localeID == 0x404 || localeID == 0xC04) //대만, 홍콩

                ret = LanguageType::TAIWAN;

            else

                ret = LanguageType::CHINESE;

        }

    }

}

GetUserDefaultLCID() 반환코드 관련

https://support.microsoft.com/ko-kr/kb/193080

https://msdn.microsoft.com/en-us/goglobal/bb964664.aspx