2011-11-18 2 views
1

기기의 언어 설정을 그대로두고 앱에서 I18N을 수행하려면 어떻게해야합니까?iOS : 인앱에서 I18N/현지화를 수행하는 방법은 무엇입니까?

스플래시 화면 뒤에 앱을 사용하려는 언어를 묻는 화면이 나타나길 원합니다. 시스템 언어와 독립적이어야합니다.

앱 컨텍스트에서 언어 설정을 지정하는 쉬운 방법이 있습니까? 예 :

[[UIApplication sharedApplication] setLocale/setBundle/setLanguage] 

감사합니다.

편집

좋아, 나는 약간의 진전을 보였다. NSLocalizedString()을 재정의 할 수있는 방법이 있습니까? 문제는 NSUserDefaults를 다른 언어 코드로 설정하면 앱을 다시 시작한 후에 만 ​​인식된다는 것입니다. 그것은 물론 나를위한 선택 사항이 아닙니다.

답변

3

나는이 해결책으로 끝냈다. 쉽게 사용할 수

@implementation I18NUtil 

static NSBundle *_bundle; 
static NSString *_language; 

+ (id)alloc 
{ 
    [NSException raise:@"Cannot be instantiated!" format:@"Static class 'ClassName' cannot be instantiated!"]; 
    return nil; 
} 

+ (void)setLanguage:(NSString *)languageCode 
{ 
    [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:languageCode, nil] forKey:@"AppleLanguages"]; 

    NSString *path = [[NSBundle mainBundle] pathForResource:languageCode ofType:@"lproj"]; 
    _bundle = [NSBundle bundleWithPath:path]; 
    _language = languageCode; 
} 

+ (NSString *)localizedString:(NSString *)key 
{ 
    return [_bundle localizedStringForKey:key value:@"" table:nil]; 
} 

@end 

: 내가 처음에 내 인앱 언어를 설정하는 정적 클래스를 정의

[I18NUtil localizedString:@"myLocalizedString"] 

을 전체 프로젝트에 지금.

하지만 NSLocalizedString 매크로를 재정의하고 i18n을 사용하는 것이 훨씬 쉽다는 것을 알았습니다. 다음을 AppName-Prefix.pch에 포함시켜야합니다.

#ifdef __OBJC__ 
    ... 

    // Override native NSLocalizedString(key,message) to achieve in-app and on-the-fly i18n 
    // Needs to be defined AFTER importing Foundation.h 
    #import "I18NUtil.h" 

    #ifdef NSLocalizedString 
     #undef NSLocalizedString 
    #endif 

    #define NSLocalizedString(key, message) \ 
     [I18NUtil localizedString:(key)] 
#endif 

재미있게 보내십시오!

1

NSLocalizedStringFromTable과 함께 임의의 문자열 파일을 사용할 수 있습니다.

예를 들어, 모든 문자열은 다음과 같이 구성 정보 파일 수 :

localizable_buttons_english.strings 
localizable_buttons_spanish.strings 
... 
localizable_errors_english.strings 
localizable_errors_spanish.strings 
... 

그리고, 어떤 언어로 번역 얻기 위해 앱 환경 설정에서 사용자가 선택한 언어를 사용 :

NSString *lang = <# read user prefs #> // Example: spanish 
NSString *table = [NSString stringWithFormat:@"localizable_buttons_%@", lang]; 
NSString *text = NSLocalizedStringFromTable(@"SendButtonLabel", table, nil); 
sendButton.titleLabel.text = text; 

// localizable_buttons_english.strings 
"SendButtonLabel" = "Send"; 

// localizable_buttons_spanish.strings 
"SendButtonLabel" = "Enviar"; 

을 NIB 파일을 지역화하는 것은 사용자가 선택한 언어를 사용하여 프로그래밍 방식으로 NIB를로드하여 NIB 이름을 작성하는 것입니다.

관련 문제