2012-01-08 1 views
6

나는이와 로케일의 표시 이름을 보여주는거야 앱의 로케일로 예를 들어 시스템을 프랑스어로 설정하고 앱에 프랑스어 현지화가 없으면 영어 인터페이스에 프랑스어 표시 이름이 표시됩니다. 대신 영어 인터페이스에서 영어 표시 이름을 사용하여 언어를 혼합하지 않습니다.NSLocale 내 인터페이스에서

+0

[이 잠재적으로 관련 질문] (http://stackoverflow.com/questions/1522210/always-returns-en-us-not-users-current-language) 전혀 도움이됩니까? –

+0

글쎄, 내가 가장 선호하는 언어를 얻을 수 있었다. [NSLocale preferredLanguages]를 사용하여 어느 것이 사용되는지를 결정하지만 내 생각에 이상적인 해결책은 아니다. – Jef

답변

3

는 잘 모르겠어요 ...하지만이 앱이 실행되는 어떤 언어/현지화를 볼 수있는 좋은 방법입니다 : 당신이 애플 리케이션 영어와 프랑스어를 모두 지원하는 경우

[[NSBundle mainBundle] preferredLocalizations] 

언어를 사용하는 경우 두 배열을 기본 순서로 반환합니다. 테스트에서, 0에서로드되고 실행중인 xib 것 같습니다.

3

plist 저장소에서 해당 지역화에 대한 올바른 로캘 식별자를 지역화하는 plist 파일을 만들어야합니다. 코드 단편을 사용할 때 지역화 된 plist 파일에서 로캘을로드하고이를 사용하여 표시 이름

그런 식으로 로캘은 항상 화면 인터페이스 언어에 해당합니다. 나는 ... 도움이

희망을 ... 나는 형식으로 원하는 어떤 날짜에 대해이 작업을 수행하고 달력 형식이 시스템에 다른 언어로 설정 될 수 있기 때문에하지 않는 시스템에 의존 할 필요

enter image description here

- (NSDictionary*)getLocalizedCalendarStrings{ 
    NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"calendar" ofType:@"plist"]; // will return the path of the plist in the right language-specific .lproj directory) 
    NSDictionary* calendar = [NSDictionary dictionaryWithContentsOfFile:plistPath]; 
    return calendar;  
} 

그래서 같이 사용할 : 당신이 더 좋아하면

NSDictionary * calendar = [self getLocalizedCalendarStrings]; 
NSString * localeIdentifier = [calendar objectForKey:@"locale_identifier"]; 
[[NSLocale currentLocale] displayNameForKey: NSLocaleIdentifier value: localeIdentifier] 

을 그 로케일 문자열의 위험을 방지하기 위해 등의 철자가 틀리되고 입력, 또는되고 코드 지향 솔루션을 사용하면 plist의 BOOL로 "default_language"라는 속성을 사용할 수 있으며 영어로만 YES로 설정하고 코드에서이 값을 확인하고 NO이면 장치 로캘을 가져와야합니다 그렇다면 앱이 영어로되어 있다는 것을 알고 있습니다. 기기 설정이거나 영어로되어 있기 때문에 기기의 현재 로케일을 지원하지 않으므로 기본적으로 영어로 되돌아갑니다. "default_language"가 예일 때, 로케일을 en_US로 하드 코딩하거나 애국자 인 경우 en_UK ...

이 예의 줄에있는 것이 NSLocale의 카테고리 인 문제를 해결할 수 있지만 물론 당신이 지원하는 각 언어에 대한 지역화 된 plist가 필요합니다 ...

@implementation NSLocale (AppLocale) 

+(NSString*)applicationCurrentLocale{ 
    NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"currentLocale" ofType:@"plist"]; 
    NSDictionary* currentLocaleData = [NSDictionary dictionaryWithContentsOfFile:plistPath]; 

    if([[currentLocaleData objectForKey:@"english_default"] boolValue] == YES){ 
     return @"en_US"; 
    }else{ 
     NSString * deviceLocaleIdentifier = [[NSLocale currentLocale] localeIdentifier]; 
     return [[NSLocale currentLocale] displayNameForKey:NSLocaleIdentifier value:deviceLocaleIdentifier]; 
    } 
} 

@end 
0 이 당신이 원하는 경우
+0

내 눈에는 꽤 추한 것일 수도있다. . 모든 언어를 Localizable.strings에 넣는 것보다 낫지 만 코드 전용 솔루션만큼 좋지는 않습니다. 다른 답이 주어지지 않으면이 것을 받아 들일 것입니다. – Jef

+0

알아 두어야 할 가장 중요한 문제는 기기가 아닌 앱의 언어를 알아야한다는 것입니다. 프랑스어로 설정된 기기로 앱에 도착했지만 앱이 영어와 스페인어 만 지원하기 때문입니다. 말하기 앱 로캘은 기본적으로 영어이지만 장치는 프랑스어입니다. 따라서 Cocoa API에서 이러한 옵션을 사용할 수 없다면 다른 옵션은 없지만이를 위해 지역화 된 파일을 살펴보아야합니다. – Daniel

+0

물론 plist의 BOOL로 "default_language"라는 속성을 사용할 수 있으며 영어로만 설정하면됩니다. 코드에서이 값을 확인하고 NO이면 YES로 설정하고 장치 로캘을 가져옵니다. , 당신은 그 장치가 영어로 설정 되었기 때문에 영어로되어 있거나 현재 장치의 로케일을 지원하지 않기 때문에 기본적으로 영어로 되돌아갔습니다. 그래서 "default_language" 예, 하드 코드 로케일 en_US, 또는 en_UK 애국심이 있다면 ... 희망의 각도가 도움이되기를 바랍니다. – Daniel