source

iOS에서 최신 장치 언어를 가져오시겠습니까?

factcode 2023. 5. 4. 20:36
반응형

iOS에서 최신 장치 언어를 가져오시겠습니까?

디바이스 UI에서 사용 중인 현재 언어를 보여주고 싶습니다.어떤 코드를 사용해야 합니까?

나는 이것을 가지고 싶습니다.NSString철자가 완전한 형식으로.(@"en_US" 아님)

편집: 새로운 iOS 릴리스를 통해 답이 발전했기 때문에, 앞으로 운전하는 사람들을 위해 여기에 유용한 의견들이 많이 있습니다.

제공된 솔루션은 실제로 현재 선택된 언어가 아닌 장치의 현재 영역을 반환합니다.이것들은 종종 하나이고 같습니다.하지만 제가 북미에 있고 제 언어를 일본어로 설정해도 제 지역은 여전히 영어(미국)가 될 것입니다.현재 선택한 언어를 검색하기 위해 다음 작업을 수행할 수 있습니다.

NSString * language = [[NSLocale preferredLanguages] firstObject];

현재 선택한 언어에 대해 두 개의 문자 코드가 반환됩니다.영어의 "en", 스페인어의 "es", 독일어의 "de" 등.자세한 예는 다음 위키백과 항목(특히 639-1 열)을 참조하십시오.

ISO 639-1 코드 목록

그런 다음 두 개의 문자 코드를 표시할 문자열로 변환하는 간단한 문제입니다."en"이면 "English"를 표시합니다.

편집

NSLocale의 헤더 정보를 인용할 가치가 있습니다.h:

+ (NSArray *)preferredLanguages NS_AVAILABLE(10_5, 2_0); // note that this list does not indicate what language the app is actually running in; the [NSBundle mainBundle] object determines that at launch and knows that information

앱 언어에 관심이 있는 사람들은 @mindvision의 답변을 살펴봅니다.

선택한 대답은 현재 장치 언어를 반환하지만 앱에서 사용되는 실제 언어는 반환하지 않습니다.사용자의 기본 언어에 대한 현지화를 앱에 제공하지 않으면 사용자의 기본 설정 순서에 따라 사용 가능한 첫 번째 현지화가 사용됩니다.

현지화 내에서 선택한 현재 언어를 검색하려면 다음을 사용합니다.

[[NSBundle mainBundle] preferredLocalizations];

예:

NSString *language = [[[NSBundle mainBundle] preferredLocalizations] objectAtIndex:0];

스위프트:

let language = NSBundle.mainBundle().preferredLocalizations.first as NSString

iOS13, 스위프트 5+

Locale.preferredLanguages.first

iOS 9용 솔루션:

NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0];

언어 = "en-US"

NSDictionary *languageDic = [NSLocale componentsFromLocaleIdentifier:language];

languageDic에는 필요한 구성 요소가 있습니다.

NSString *countryCode = [languageDic objectForKey:@"kCFLocaleCountryCodeKey"];

국가 코드 = "US"

NSString *languageCode = [languageDic objectForKey:@"kCFLocaleLanguageCodeKey"];

languageCode = "en"

이를 통해 다음과 같은 이점을 얻을 수 있습니다.

NSLocale *locale = [NSLocale currentLocale];

NSString *language = [locale displayNameForKey:NSLocaleIdentifier 
                                         value:[locale localeIdentifier]];

언어 이름이 언어 자체로 표시됩니다.예:

Français (France)
English (United States)

경고의허용된 답변과 다른 답변은 기본 언어가 장치 언어가 아닌 다른 언어가 될 수 있다는 점을 고려하지 않습니다.

장치 언어는 운영 체제 요소와 Apple 앱이 표시되는 언어입니다.

기본 언어는 사용자가 앱을 현지화하려는 언어입니다.Apple은 제한된 번역 세트만 제공합니다.선호하는 언어가 Apple이 앱을 번역한 언어일 경우 장치 언어이기도 합니다.그러나 사용자가 Apple이 번역을 제공하지 않는 언어를 선호하는 경우 장치와 선호하는 언어가 일치하지 않습니다.장치 언어가 기본 언어 목록의 첫 번째 위치에 없습니다.

다음 기능은 기본 언어 목록을 살펴보고 Apple 프레임워크에 번역이 있는지 확인합니다.번역이 가능한 첫 번째 언어는 장치 언어입니다.함수는 언어 코드를 반환합니다.

func deviceLanguage() -> String? {
    let systemBundle: NSBundle = NSBundle(forClass: UIView.self)
    let englishLocale: NSLocale = NSLocale(localeIdentifier: "en")

    let preferredLanguages: [String] = NSLocale.preferredLanguages()

    for language: String in preferredLanguages {
        let languageComponents: [String : String] = NSLocale.componentsFromLocaleIdentifier(language)

        guard let languageCode: String = languageComponents[NSLocaleLanguageCode] else {
            continue
        }

        // ex: es_MX.lproj, zh_CN.lproj
        if let countryCode: String = languageComponents[NSLocaleCountryCode] {
            if systemBundle.pathForResource("\(languageCode)_\(countryCode)", ofType: "lproj") != nil {
                // returns language and country code because it appears that the actual language is coded within the country code aswell
                // for example: zh_CN probably mandarin, zh_HK probably cantonese
                return language
            }
        }

        // ex: English.lproj, German.lproj
        if let languageName: String = englishLocale.displayNameForKey(NSLocaleIdentifier, value: languageCode) {
            if systemBundle.pathForResource(languageName, ofType: "lproj") != nil {
                return languageCode
            }
        }

        // ex: pt.lproj, hu.lproj
        if systemBundle.pathForResource(languageCode, ofType: "lproj") != nil {
            return languageCode
        }
    }

    return nil
}

이 기능은 기본 언어 목록이 다음과 같은 경우에 작동합니다.

  1. 아프리칸스(iOS는 아프리칸스로 번역되지 않음)
  2. 스페인어(장치 언어)

기본 언어 목록은 다음에서 편집할 수 있습니다: 설정.app -> 일반 -> 언어 & 지역 -> 기본 언어 순서


장치 언어 코드를 사용하여 언어 이름으로 변환할 수 있습니다.다음 행은 장치 언어를 장치 언어로 인쇄합니다.예를 들어 디바이스가 스페인어로 설정된 경우 "에스파뇰"입니다.

if let deviceLanguageCode: String = deviceLanguage() {
    let printOutputLanguageCode: String = deviceLanguageCode
    let printOutputLocale: NSLocale = NSLocale(localeIdentifier: printOutputLanguageCode)

    if let deviceLanguageName: String = printOutputLocale.displayNameForKey(NSLocaleIdentifier, value: deviceLanguageCode) {
        // keep in mind that for some localizations this will print a language and a country
        // see deviceLanguage() implementation above
        print(deviceLanguageName)
    }
} 

iOS13, 스위프트 5+, WWDC2019 https://developer.apple.com/videos/play/wwdc2019/403/

사용자는 OS 언어와 독립적으로 앱의 기본 언어를 선택할 수 있습니다.

다음을 사용할 수 있습니다.

    // Returns a list of the user's preferred languages.
    // Maybe more than (or none of) your app supports!
    Locale.preferredLanguages

    // a subset of this bundle's localizations, re-ordered into the preferred order
    // for this process's current execution environment; the main bundle's preferred localizations
    // indicate the language (of text) the user is most likely seeing in the UI
    Bundle.main.preferredLocalizations



    // The current running app language
    Bundle.main.preferredLocalizations.first

    // list of language names this bundle appears to be localized to
    Bundle.main.localizations

나는 이것을 사용합니다.

    NSArray *arr = [NSLocale preferredLanguages];
for (NSString *lan in arr) {
    NSLog(@"%@: %@ %@",lan, [NSLocale canonicalLanguageIdentifierFromString:lan], [[[NSLocale alloc] initWithLocaleIdentifier:lan] displayNameForKey:NSLocaleIdentifier value:lan]);
}

메모리 누수를 무시합니다.

그리고 결과는

2013-03-02 20:01:57.457 xx[12334:907] zh-Hans: zh-Hans 中文(简体中文)
2013-03-02 20:01:57.460 xx[12334:907] en: en English
2013-03-02 20:01:57.462 xx[12334:907] ja: ja 日本語
2013-03-02 20:01:57.465 xx[12334:907] fr: fr français
2013-03-02 20:01:57.468 xx[12334:907] de: de Deutsch
2013-03-02 20:01:57.472 xx[12334:907] nl: nl Nederlands
2013-03-02 20:01:57.477 xx[12334:907] it: it italiano
2013-03-02 20:01:57.481 xx[12334:907] es: es español

en_과 같은 언어 코드 번역US into English(미국)는 내장된 기능입니다.NSLocale그리고.NSLocale언어 코드를 어디서 구하든 상관하지 않습니다.따라서 수용된 답변이 시사하는 바와 같이 독자적인 번역을 구현할 이유가 없습니다.

// Example code - try changing the language codes and see what happens
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en"];
NSString *l1 = [locale displayNameForKey:NSLocaleIdentifier value:@"en"];
NSString *l2 = [locale displayNameForKey:NSLocaleIdentifier value:@"de"];
NSString *l3 = [locale displayNameForKey:NSLocaleIdentifier value:@"sv"];
NSLog(@"%@, %@, %@", l1, l2, l3);

인쇄: 영어, 독일어, 스웨덴어

저는 저 자신에게 맞는 해결책을 찾으려고 노력했습니다.를 할 때Locale.preferredLanguages.first앱 설정에서 기본 언어를 반환했습니다.

사용자 장치 설정에서 언어를 알아보려면 아래 문자열을 사용해야 합니다.

스위프트 3

let currentDeviceLanguage = Locale.current.languageCode
// Will return the optional String

포장을 풀고 사용하려면 아래 라인을 참조하십시오.

if let currentDeviceLanguage = Locale.current.languageCode {
    print("currentLanguage", currentDeviceLanguage)

    // For example
    if currentDeviceLanguage == "he" {
        UIView.appearance().semanticContentAttribute = .forceRightToLeft
    } else {
        UIView.appearance().semanticContentAttribute = .forceLeftToRight
    }
}

심지어 현재 장치 언어를 얻는 더 나은 방법도 있습니다.아래 코드로 시도해 보겠습니다.

NSLog(@"Current Language - %@", [[NSLocale preferredLanguages] firstObject]);

아비제른여기서 제안합니다.

당신은 할 수 .displayNameForKey:value:방법:

// get a French locale instance
NSLocale *frLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"fr_FR"] autorelease];

// use it to get translated display names of fr_FR and en_US
NSLog(@"%@", [frLocale displayNameForKey:NSLocaleIdentifier value:@"fr_FR"]);
NSLog(@"%@", [frLocale displayNameForKey:NSLocaleIdentifier value:@"en_US"]);

다음과 같이 출력됩니다.

français (France)
anglais (États-Unis)

동일한 initWithLocaleIdentifier: 고또한리그.displayNameForKey:value:메소드, 그러면 언어의 네이티브 이름을 알려줄 것입니다.국가 코드를 제거하고 다음을 사용하면fr그리고.en또한 표시 이름에서 국가를 생략합니다(최소한 Mac OS X에서는 iOS에 대해서는 확실하지 않음).

스위프트

장치의 최신 언어를 가져오려면 다음과 같이 하십시오.

NSLocale.preferredLanguages()[0] as String

응용 프로그램 언어를 가져오려면

NSBundle.mainBundle().preferredLocalizations[0] as NSString

참고:

info.plist의 CFBundleDevelopmentRegion에서 지정한 언어를 가져옵니다.

info.plist에서 CFBundleAllowMixedLocalization이 참이면 info.plist에서 CFBundleLocalization의 첫 번째 항목이 반환됩니다.

사용자 장치의 최신 언어를 얻기 위해 다음 it 코드를 사용하는 것이 저에게 도움이 되었습니다.

NSString * myString = [[NSLocale preferredlanguage]objectAtIndex:0];

기본 언어 코드("en", "de", "es"...)와 현지화된 기본 언어 이름(현재 로케일의 경우)을 찾고 있는 경우 Swift의 간단한 확장자는 다음과 같습니다.

extension Locale {
    static var preferredLanguageIdentifier: String {
        let id = Locale.preferredLanguages.first!
        let comps = Locale.components(fromIdentifier: id)
        return comps.values.first!
    }

    static var preferredLanguageLocalizedString: String {
        let id = Locale.preferredLanguages.first!
        return Locale.current.localizedString(forLanguageCode: id)!
    }
}

MonoTouch C# 개발자의 경우 다음을 사용합니다.

NSLocale.PreferredLanguages.FirstOrDefault() ?? "en"

참고: iOS 질문이었다는 것은 알지만, 제가 MonoTouch 개발자이기 때문에, 이 페이지의 답은 저를 올바른 방향으로 이끌었고, 그 결과를 공유해야겠다고 생각했습니다.

Swift:

let languageCode = NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode) as? String

스위프트 3

let locale = Locale.current
let code = (locale as NSLocale).object(forKey: NSLocale.Key.countryCode) as! String?
print(code!)

Simple Swift 3 기능:

@discardableResult
func getLanguageISO() -> String {
    let locale = Locale.current
    guard let languageCode = locale.languageCode,
          let regionCode = locale.regionCode else {
        return "de_DE"
    }
    return languageCode + "_" + regionCode
}
-(NSString *)returnPreferredLanguage { //as written text

NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
NSArray *preferredLanguages = [defaults objectForKey:@"AppleLanguages"];
NSString *preferredLanguageCode = [preferredLanguages objectAtIndex:0]; //preferred device language code
NSLocale *enLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en"]; //language name will be in English (or whatever)
NSString *languageName = [enLocale displayNameForKey:NSLocaleIdentifier value:preferredLanguageCode]; //name of language, eg. "French"
return languageName;

}

만약 당신이 언어만 얻고 싶다면, 여기에 제가 제안하는 답이 있습니다.

NSString *langplusreg = [[NSLocale preferredLanguages] objectAtIndex:0];
NSString * langonly = [[langplusreg componentsSeparatedByString:@"-"] 
objectAtIndex:0];

제 경우에는 지역이 아닌 지역 언어만 원했습니다.

출력: 로케일 언어가 일본어이고 로케일 지역이 일본인 경우:

langplusreg = ja-JP

langonly = ja

분명히, 예를 들어, 의존하는 솔루션은

[[NSLocale preferredLanguages] objectAtIndex:0]

일반적으로 정상적으로 작동하고 현재 장치 언어를 반환합니다.

그러나 경우에 따라 오해를 불러일으킬 수 있습니다.

이 값을 가져오려는 앱이 다음과 같은 코드를 사용하여 언어를 이미 변경한 경우:

NSString *lg = @"en"; // or anything like @"en", @"fr", etc.
[[NSUserDefaults standardUserDefaults] 
    setObject:[NSArray arrayWithObjects:lg, nil]  
    forKey:@"AppleLanguages"]

이 경우 [NSLocale preferredLanguages]는 실제로 현재 장치 언어가 아닌 특정 앱의 기본 언어 집합(및 사용됨)을 반환합니다!

그리고... 이 경우 앱에 이전에 설정되지 않은 실제 현재 장치 언어를 올바르게 가져오는 유일한 방법은 먼저 NSUserDefaults에서 다음과 같이 @"appleLanguages" 키를 지우는 것입니다.

[[NSUserDefaults standardUserDefaults]removeObjectForKey:@"AppleLanguages"];

그러면 [NSLocale preferredLanguages]에서 올바른 값을 반환합니다.

도움이 되길 바랍니다.

Swift 4.2 및 Xcode 10.1에서

let language = NSLocale.preferredLanguages[0]
debugPrint(language)//en

Swift 5.x에서

let langStr = Locale.current.languageCode
debugPrint(langStr ?? "") //en  el

는 사실 질문을 , 그 이 " UI " 언어(내가를 하는 것이라고 했습니다. 이 가장 은 "앱 UI"를 사용하는 입니다.preferredLocalizations하지만 그 대답들은 여전히 코드를 제공합니다. 표시할 멋진 문자열을 얻는 데 한 단계가 더 있습니다. 언어에 응답했지만 다음과 같습니다. "사용자 인터페이스" "사용자 인터페이스" "사용자 인터페이스" "사용자 인터페이스" "사용자 인터페이스" "사용자 인터페이스" "사용자 인터페이스" "사용자 인터페이스" "사용자 인터페이스를 선택하십시오.

NSLocalizedString(@"currentLanguage", @"")

모든 UI 현지화에서 원하는 방식으로 정확히 지정했습니다.예를 들어en의 버전.strings파일:

"currentLanguage"="English";

당신의fr의 버전.strings파일:

"currentLanguage"="Francais";

코드를 함부로 만지지 말고 UI에 맞게 문자열을 직접 만듭니다.

SWIFT-4

 // To get device default selected language. It will print like short name of zone. For english, en or spain, es.

let language = Bundle.main.preferredLocalizations.first! as NSString
print("device language",language)

@스위프트의 아미르 응답:

// Get language prefered by user
let langageRegion = NSLocale.preferredLanguages().first!
let languageDic = NSLocale.componentsFromLocaleIdentifier(langageRegion)
let language = languageDic[NSLocaleLanguageCode]

Apple 문서에 따름

NSUserDefaults* defs = [NSUserDefaults standardUserDefaults];
NSArray* languages = [defs objectForKey:@"AppleLanguages"];
NSString* preferredLang = [languages objectAtIndex:0];

두 글자 형식입니다.Apple은 ISO 표준 ISO-3166을 사용합니다.

NSString *localeCountryCode = [[NSLocale autoupdatingCurrentLocale] objectForKey:NSLocaleCountryCode];

Swift 3의 경우:

NSLocale.기본 설정 언어[0]를 문자열로 지정

iOS 9부터는 국가 코드 없이 언어 코드만 원한다면 언어에 국가 코드가 포함되기 때문에 이런 종류의 도우미 기능을 원할 것입니다.

// gets the language code without country code in uppercase format, i.e. EN or DE
NSString* GetLanguageCode()
{
    static dispatch_once_t onceToken;
    static NSString* lang;
    dispatch_once(&onceToken, ^
    {
        lang = [[[NSLocale preferredLanguages] objectAtIndex:0] uppercaseString];
        NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:@"^[A-Za-z]+" options:0 error:nil];
        NSTextCheckingResult* match = [regex firstMatchInString:lang options:0 range:NSMakeRange(0, lang.length)];
        if (match.range.location != NSNotFound)
        {
            lang = [lang substringToIndex:match.range.length];
        }
    });
    return lang;
}

Swift 4에 대한 답변 업데이트

let language = Bundle.main.preferredLocalizations.first

언급URL : https://stackoverflow.com/questions/3910244/getting-current-device-language-in-ios

반응형