NSLocale currentLocale은 항상 사용자의 현재 언어가 아닌 "en_US"를 반환합니다.


82

iPhone 앱을 국제화하는 과정에 있습니다. 사용자의 현재 로케일에 따라 특정보기를 프로그래밍 방식으로 변경해야합니다. iPhone 시뮬레이터 또는 실제 하드웨어의 언어 선호도가 무엇이든 상관없이 locale항상 "en_US"로 평가되기 때문에 미쳐 가겠습니다.

NSString *locale = [[NSLocale currentLocale] localeIdentifier];
NSLog(@"current locale: %@", locale);

미친 것은 나머지 응용 프로그램이 예상대로 작동한다는 것입니다. Localization.strings 파일에서 올바른 문자열이 선택되어 인터페이스에서 사용되며 선택한 로케일에 대한 올바른 .xib 파일이 사용됩니다.

나는 또한 다음을 시도했지만 아무 소용이 없으며 동일한 결과를 얻었습니다.

NSString *locale = [[NSLocale autoupdatingCurrentLocale] localeIdentifier];
NSLog(@"current locale: %@", locale);

내가 놓친 간단한 것이 있습니까? 선호 또는 수입?

내가했던 것 :

Darren의 답변에서 알 수 있듯이 내가 찾고있는 기본 설정은 NSLocale에있는 것이 아니라 여기에 있습니다.

NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
NSArray* languages = [userDefaults objectForKey:@"AppleLanguages"];
NSString* preferredLanguage = [languages objectAtIndex:0];
NSLog(@"preferredLanguage: %@", preferredLang);

Peter의 대답이 더 나은 해결책 인 것 같습니다.

NSArray* preferredLanguages = [NSLocale preferredLanguages];
NSLog(@"preferredLanguages: %@", preferredLanguages);

답변:


36

문서화되지 않은 키를 사용하여 기본값을 직접 쿼리하는 대신 NSLocale 클래스 에 선호 언어 배열을 요청하십시오 .


@PeterHosey 나는 현재 언어와 관련하여 비슷한 문제가 있으며 모든 것을 시도했지만 아무도 작동하지 않았습니다. 너무 슬프다 ... 이것 좀 봐 줄래 , stackoverflow.com/questions/26572115/… ? 감사!
S1U

@ s1u Xcode 6.1에 버그가 있습니다. 이 답변 확인 : stackoverflow.com/a/26641497/1085556
Bart van Kuik 2014

@ s1u : 몇 가지 : (1) 선호하는 여러 언어가있을 수 있습니다. 단일 "현재 언어"는 없으며 (2) (삭제 된) 답변과 관련하여 사용자가 선호하는 언어가 아닌 현재 로케일 (일명 지역)의 주요 언어를 반환합니다 .
Peter Hosey

2
AppleLanguages키는 이전 OS X 10.5 시스템의 사용자가 선호하는 언어를 얻기 위해 문서화 된 방법, 문서화되지 않는다 (이 일이 매우 드문,하지만 여전히 되어 문서화 ).
dreamlax 2015

58

[NSLocale currentLocale]언어가 아닌 장치의 지역 형식 설정을 기반으로합니다. 지역이 미국으로 설정되어 있으면 사용중인 언어에 관계없이 en_US가 표시됩니다.


감사합니다 Darren, 저를 시작하게되었고 현재 언어 설정을 얻는 방법도 알아 냈습니다. 이것이 제가 정말로하려고했던 것입니다.
prairiedogg

2
안녕하세요 Prairiedogg, 현재 언어 설정은 어떻게 얻었습니까? 나는 또한 같은 문제가 있습니다. 모든 언어에 대한 EN 값을 반환합니다.
Zaldy

@ZaldzBugz : 다음과 같습니다. NSLocale * locale = [NSLocale currentLocale]; NSString * lang = [locale displayNameForKey : NSLocaleIdentifier 값 : [[NSLocale preferredLanguages] objectAtIndex : 0]];
powerj1984

3
iOS 8에서는 그렇지 않습니다. 언어가 독일어이고 지역이 미국이면 iOS 8은 "de_US"를 반환합니다. 그것이해야 할 일입니다.
odyth

사용자가 오스트레일리아로 이동하면 지역이 자동으로 업데이트 되나요?
Nagendra Rao


9

우리에게 문제는 개발 계획에서 응용 프로그램 언어와 응용 프로그램 영역을 재정의한다는 것입니다. 구성표 옵션 (구성표 편집-> 옵션)에서 응용 프로그램 언어가 시스템 언어로 설정되어 있는지 확인합니다.


이 측면을 지적 해 주신 Simon에게 감사드립니다. 테스트를 위해 현지 언어로 설정했으며 나중에 변경하는 것을 잊었습니다.
아미르

그거였다! 그것을 엉망으로 만드는 Xcode 설정이라는 것을 믿을 수 없습니다.
Pedro

이것은 내 베이컨을 구했습니다! 감사.
Kirby Todd

4

나를 위해, 둘 다

NSString *localeString = [[NSLocale currentLocale] localeIdentifier];

NSArray *array = [NSLocale preferredLanguages];
self.label.text = array[0];

시뮬레이터에있을 때 동일한 결과를 얻을 수 있습니다.


2
사실, 제 경우에는 iOS 8 / Xcode 6에서 항상 en_US
Adrian

3

프랑스어로 설정된 장치에서 월 이름 서식이 영어로 나오는 문제가 발생했습니다.

내 해결책은 이것을 사용하는 것입니다.

    NSLocale *locale = [NSLocale localeWithLocaleIdentifier:[[NSLocale preferredLanguages] objectAtIndex:0] ];
    [self.monthNameFormatter setLocale:locale];
    [self.monthNameFormatter setDateFormat:@"MMMM"];
    [self.monthNameFormatter stringFromDate:myDate];

[NSLocale currentLocale]이 iOS10에서 월 이름을 프랑스어로 제대로 번역했지만 iOS11에는 없었습니다. 사용 : NSLocale * locale = [NSLocale localeWithLocaleIdentifier : [[NSLocale preferredLanguages] objectAtIndex : 0]]; 문제를 해결했습니다. Thanks Ben +1
birdman

2

"en_US"를 제외하고 "en_US"의 복사 본인 "en"지역화가있는 경우 시뮬레이터는 언어 설정을 자동으로 따르기 시작하지만 "en_US"가 옵션이 되 자마자 항상 상관없이 선택합니다. 설정의.


1

질문이 너무 오래되었지만이 코드는 많은 사람들에게 도움이 될 수 있습니다.

main.m은 다음과 같아야합니다.

    NSString *localecode=[[NSLocale currentLocale] localeIdentifier];
    localecode=[localecode substringToIndex:2]; //en_GB -> en
    NSArray *arr = [NSLocale preferredLanguages];
    NSMutableArray * mutable = [arr mutableCopy];
    NSString *prefered = [mutable firstObject];
    if(![localecode isEqualToString:prefered]){
        if(![prefered isEqualToString:@"es"] && ![prefered isEqualToString:@"en"] && ![prefered isEqualToString:@"pt"]){
            int index = [mutable indexOfObject:@"en"];
            [mutable replaceObjectAtIndex:0 withObject:@"en"];
            [mutable replaceObjectAtIndex:index withObject:prefered];
            [[NSUserDefaults standardUserDefaults] setObject:mutable forKey:@"AppleLanguages"];

        }
        else{
            int index = [mutable indexOfObject:localecode];
            [mutable replaceObjectAtIndex:0 withObject:localecode];
            [mutable replaceObjectAtIndex:index withObject:prefered];
            [[NSUserDefaults standardUserDefaults] setObject:mutable forKey:@"AppleLanguages"];
        }
    }
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

이게 뭐야? 장치의 현재 언어가 스페인어, 영어 또는 포르투갈어 인 경우 응용 프로그램은 현지화 된 문자열을 사용하고, 반면 현재 언어가 해당 언어 중 하나가 아니고 응용 프로그램에서 지원하지 않는 경우 영어로 설정됩니다.


0

실제 iPad에서 올바른 로케일을 표시합니다. 그러나 시뮬레이터에는 기본적으로 en-US로 설정된 자체 iOS가 있습니다. 시뮬레이터 iOS 환경 설정으로 이동하여 언어 및 지역을 원하는 것으로 전환하십시오.

그게 트릭입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.