Otrzymujesz aktualny język urządzenia w iOS?

431

Chciałbym pokazać bieżący język, którego używa interfejs użytkownika urządzenia. Jakiego kodu użyłbym?

Chcę to jako NSStringw pełni pisanym formacie. (Nie @ „en_US”)

EDYCJA: Dla tych, którzy przejeżdżają, jest tu mnóstwo przydatnych komentarzy, ponieważ odpowiedź ewoluowała wraz z nowymi wersjami iOS.

Mosze
źródło
1
To jest wbudowane NSLocale. Zobacz moją odpowiedź.
Erik B
15
Komentarz do iOS9: zwróć uwagę na fakt, że z jakiegoś dziwnego powodu Apple zmieniło format zwracany przez [NSLocale preferredLanguages]. kiedyś był oddzielony podkreśleniem (np. en_US), ale teraz został zmieniony na myślnik:en-US
ishahak
7
Więcej o iOS9: Uzyskanie [Preferowane języki NSLocale] na symulatorze iOS 8.4 w porównaniu z symulatorem 9.0 również ma rozbieżności. Na iOS 8.4 to „en”, a iOS 9.0 to „en-US”
Kris Subramanian
Ten komentarz bardzo mi pomógł! Utknęliśmy z prostym problemem, zastanawiając się, co poszło nie tak przez około 1 godzinę, aż zobaczyłem twój komentarz.
thandasoru
3
NSLocaleposiada metody componentsFromLocaleIdentifier:i localeIdentifierFromComponents:które są prawdopodobnie właściwy sposób obsłużyć format (potencjalnie zmienne).
Benjohn

Odpowiedzi:

808

Dostarczone rozwiązania w rzeczywistości zwrócą bieżący region urządzenia - nie aktualnie wybrany język. Często są one takie same. Jeśli jednak jestem w Ameryce Północnej i ustawię język na japoński, moim regionem nadal będzie angielski (Stany Zjednoczone). Aby odzyskać aktualnie wybrany język, możesz:

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

Zwróci dwuliterowy kod dla aktualnie wybranego języka. „en” dla języka angielskiego, „es” dla języka hiszpańskiego, „de” dla języka niemieckiego itp. Więcej przykładów można znaleźć w tym wpisie w Wikipedii (w szczególności w kolumnie 639-1):

Lista kodów ISO 639-1

Wówczas wystarczy prosta konwersja dwuliterowych kodów na ciąg znaków, który chcesz wyświetlić. Więc jeśli jest to „en”, wyświetl „English”.

Mam nadzieję, że pomoże to komuś, kto chce odróżnić region od aktualnie wybranego języka.

EDYTOWAĆ

Warto zacytować informacje nagłówka z 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

Osoby zainteresowane językiem aplikacji przyglądają się odpowiedzi @ mindvision

Dubron
źródło
2
Dokładnie tego szukałem. Miałem ten sam problem, w którym region nie jest tym samym językiem.
Jasarien,
12
zła odpowiedź: zwraca zh-Hans dla chińskiego, który nie jest kodem ISO.
cyrilchampier
2
Pierwsze dwie postacie przekazują kraj, rzeczy po kresce dają region, reszta służy tylko do dalszego zawężenia (np. Dialekty lokalne). zh jest wymieniony jako kod ISO dla chińskiego. Dla tych, którzy szukają określonego języka, jakim byłem, wypróbuj rejestr IANA
Xono
3
zh-Hans jest jedynym wyjątkiem, czy istnieją inne kody językowe, które różnią się od normy ISO 639-1?
MPaulo
57
Ostrzeżenie: w iOS 9 zwracana wartośćNSLocale preferredLanguageszmienionej. Jeśli wcześniej otrzymywałeś tylko „en”, w iOS 9 dostaniesz „en-US” lub „en-JP” itp. Odnośnik: happyteamlabs.com/blog/…
D S S
281

Wybrana odpowiedź zwraca bieżący język urządzenia, ale nie rzeczywisty język używany w aplikacji. Jeśli nie podasz lokalizacji w aplikacji dla preferowanego języka użytkownika, zostanie użyta pierwsza dostępna lokalizacja, uporządkowana według preferowanej kolejności użytkownika.

Aby odkryć aktualny język wybrany w twoich lokalizacjach użyj

[[NSBundle mainBundle] preferredLocalizations];

Przykład:

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

Szybki:

let language = NSBundle.mainBundle().preferredLocalizations.first as NSString
wizja umysłu
źródło
Doskonale, to mnie też interesowało. Przetestowane i działa poprawnie!
smileyborg,
5
doskonały! pozwala mi budować zlokalizowane ścieżki zasobów zdalnych tylko w językach obsługiwanych przez moją aplikację w preferowanej kolejności.
Jewhen Dubinin
co jeśli chcemy po tym uzyskać całą nazwę języka?
Shabarinath Pabba
Jeśli chcesz uzyskać całą nazwę języka z preferowanej lokalizacji, możesz użyć [[Przydzielanie NSLocale] initWithLocaleIdentifier: język] (od góry). Następnie masz ustawienia regionalne i możesz wywołać displayNameForKey.
Vanessa Forney
87

Rozwiązanie dla iOS 9:

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

language = "en-US"

NSDictionary *languageDic = [NSLocale componentsFromLocaleIdentifier:language];

languageDic będzie miał potrzebne komponenty

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

countryCode = "US"

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

languageCode = "en"

amir
źródło
5
kCFLocaleLanguageCodeKey jest zdefiniowaną stałą, której można użyć zamiast tworzyć własny ciąg.
SNyamathi
1
NSLocaleLanguageCode = @ "kCFLocaleCountryCodeKey"
crow
użyj NSLocaleCountryCode i NSLocaleLanguageCode dla @ "kCFLocaleCountryCodeKey", @ "kCFLocaleLanguageCodeKey", odpowiednio
crow
65

Zapewni to prawdopodobnie to, czego chcesz:

NSLocale *locale = [NSLocale currentLocale];

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

Wyświetli nazwę języka w samym języku. Na przykład:

Français (France)
English (United States)
Philippe Leybaert
źródło
31
zła odpowiedź: zwraca ustawienia regionalne, a nie język, który może być inny ...
cyrilchampier
4
Jest to zdecydowanie niewłaściwe, na przykład jeśli ustawisz język w ustawieniach telefonu na angielski, a format regionalny pozwala na powiedzmy niemiecki, Niemcy, powyższy przykład zwraca „niemiecki”. Mimo to język telefonu jest ustawiony na angielski.
jake_hetfield
2
To wcale nie jest źle. Ustawienia regionalne zawierają zarówno informacje o języku, jak i regionie. Tak więc w przykładzie @ jake_hetfield nie zwróci „niemiecki”, zwróci „angielski (Niemcy)”. To w połączeniu z odpowiedzią dreamlab powinno być poprawną odpowiedzią.
SeanR,
36

ostrzeżenieWszystkie zaakceptowane i pozostałe odpowiedzi nie biorą pod uwagę, że preferowanym językiem może być inny język niż język urządzenia .

Język urządzenia to język, w którym prezentowane są elementy systemu operacyjnego i aplikacje Apple.

Preferowany język jest językiem użytkownik chciałby mieć aplikacje zlokalizowane w. Jabłko zapewnia tylko ograniczoną liczbę tłumaczeń. Jeśli preferowanym językiem jest jeden język, na który Apple przetłumaczyło swoje aplikacje, będzie to również język urządzenia. Jeśli jednak użytkownik preferuje język, dla którego Apple nie zapewnia tłumaczeń, urządzenie i preferowane języki nie będą pasować . Język urządzenia nie będzie na pierwszym miejscu na liście preferowanych języków.

Poniższa funkcja przejdzie przez listę preferowanych języków i sprawdzi, czy jest dostępne tłumaczenie w środowisku Apple. Pierwszym językiem do tłumaczenia jest język urządzenia. Funkcja zwróci kod języka.

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
}

Działa to, jeśli lista preferowanych języków to:

  1. Afrikaans (iOS nie jest tłumaczony na afrikaans)
  2. Hiszpański (język urządzenia)

Lista język korzystne mogą być edytowane w : Settings.app -> Ogólne -> Język i region -> Preferowany język Zamówienie


Możesz następnie użyć kodu języka urządzenia i przetłumaczyć go na nazwę języka. Poniższe wiersze wydrukują język urządzenia w języku urządzenia. Na przykład „Español”, jeśli urządzenie jest ustawione na hiszpański.

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)
    }
} 
dreamlab
źródło
Rozumiem, że inicjując instancję pakietu NSBundle(forClass: UIView.self), próbujesz podać najbardziej konkretny język dla danego widoku. Jednak korzystając z tego, natknąłem się na problem, w którym dla danej klasy język nie został zwrócony. Zmieniłem inicjalizację na NSBundle.mainBundle()i zwróciłem oczekiwany kod języka.
palmi
Wyjaśnienie: Inicjowanie zawiniątko z mainBundle()wydaje się być jednym polecane przez Apple jako sugerowane w nagłówku dla NSLocale, // 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.
palmi
@Pouria NSBundle.mainBundle()zwraca pakiet aplikacji, a NSBundle(forClass: UIView.self)systemowy pakiet UIKit. opisana metoda szuka katalogów w pakiecie. Twój pakiet aplikacji będzie zawierał tylko te języki, w których zamierzasz się zlokalizować. aby określić język urządzenia, musisz sprawdzić pakiet systemowy.
dreamlab
1
@Pouria problemem może być to, że iOS 9 zmienił zwracane wartości NSLocale.preferredLanguages(). I aktualizowany odpowiedź na poparcie iOS 9 .
dreamlab
@dreamlab niestety to podejście daje fałszywie dodatnie wyniki, gdy dołączasz komponenty innych firm, takie jak strąki, z lokalizacjami, których nie obsługujesz w ustawieniach projektu.
kokoko
12

używam tego

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

zignoruj ​​wyciek pamięci

i wynik jest

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
enzoyang
źródło
dla ciekawości, gdzie jest przeciek pamięci?
Can Poyrazoğlu,
Przeciek - [[[Przydział NSLocale] initWithLocaleIdentifier: lan].
Pavel
1
Jednak tylko w przypadku projektów spoza ARC.
Josh Hinman
12

Tłumaczenie kodów językowych, takich jak en_US na angielski (Stany Zjednoczone), jest wbudowaną funkcją NSLocalei NSLocalenie ma znaczenia, skąd masz kody językowe. Tak naprawdę nie ma powodu, aby wdrażać własne tłumaczenie, jak sugeruje zaakceptowana odpowiedź.

// 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);

Wydruki: angielski, niemiecki, szwedzki

Erik B.
źródło
1
Właściwie powinieneś użyć [NSLocale autoupdatingCurrentLocale], aby zainicjować instancję ustawień regionalnych. W ten sposób nazwy języków będą wyświetlane w języku ojczystym użytkownika. Na przykład szwedzki stanie się Svenska.
Maciej Swic
8

Nawet istnieje lepszy sposób na uzyskanie aktualnego języka urządzenia. Spróbujmy poniżej kodu -

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

Sugerowana przez Abizern na tutaj

Praveenkumar
źródło
7

Możesz użyć displayNameForKey:value:metody NSLocale:

// 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"]);

Spowoduje to wydrukowanie:

français (France)
anglais tats-Unis)

Jeśli podasz taki sam identyfikator lokalizacji dla initWithLocaleIdentifier:a także displayNameForKey:value:metoda, to daje rodzimą nazwę języka. Odkryłem, że jeśli usuniesz kod kraju i użyjesz po prostu, fri enże również pominie kraj w nazwie wyświetlanej (przynajmniej w Mac OS X, nie jestem pewien co do iOS).

dreamlax
źródło
6

Szybki

Aby uzyskać bieżący język urządzenia

NSLocale.preferredLanguages()[0] as String

Aby uzyskać język aplikacji

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

Uwaga:

Pobiera język podany w CFBundleDevelopmentRegion info.plist

jeśli CFBundleAllowMixedLocalizations ma wartość true w info.plist, wówczas zwracana jest pierwsza pozycja CFBundleLocalizations w info.plist

Durai Amuthan.H
źródło
6

Próbowałem znaleźć odpowiednie rozwiązanie dla siebie. Kiedy używam Locale.preferredLanguages.firstzostał zwrócony preferowany język z ustawień aplikacji.

Jeśli chcesz poznać język z ustawień urządzenia użytkownika, użyj poniższego ciągu:

Szybki 3

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

Aby rozpakować i użyć, spójrz na linię poniżej:

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

    // For example
    if currentDeviceLanguage == "he" {
        UIView.appearance().semanticContentAttribute = .forceRightToLeft
    } else {
        UIView.appearance().semanticContentAttribute = .forceLeftToRight
    }
}
Roman Romanenko
źródło
nie musisz rozpakowywać, jeśli używasz tego Bundle.main.preferredLocalizations [0] jako String
μολὼν.λαβέ
5

Aby uzyskać bieżący język urządzenia użytkownika, użyj następującego kodu, który dla mnie zadziałał.

NSString * myString = [[NSLocale preferredlanguage]objectAtIndex:0];
shailendra
źródło
4

iOS13, Swift 5+, WWDC2019 https://developer.apple.com/videos/play/wwdc2019/403/

Użytkownicy mogą wybrać preferowany język aplikacji niezależnie od języka systemu operacyjnego.

Możesz użyć tych:

    // 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
norbDEV
źródło
3

W przypadku programistów MonoTouch C # użyj:

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

Uwaga: wiem, że było to pytanie na iOS, ale ponieważ jestem programistą MonoTouch, odpowiedź na tej stronie poprowadziła mnie we właściwym kierunku i pomyślałem, że podzielę się wynikami.

Chuck Savage
źródło
Obecnie używam NSLocale.PreferredLanguages ​​i otrzymuję pustą tablicę. Zakładam, że przeczytałeś w dokumentacji, że może nigdy nie być pusty, ale nigdzie go nie widzę?
JFoulkes
Nie, szczerze mówiąc, to było moje własne założenie.
Chuck Savage
@LarryF Obejrzyj ten film: jonas.follesoe.no/2011/07/22/cross-platform-mobile-ndc-2011 Jest bardzo pouczający, jak ustrukturyzować aplikacje kodowe / wieloplatformowe.
Chuck Savage,
3

W Swift:

let languageCode = NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode) as? String
zawietrzny
źródło
3

Szybki 3

let locale = Locale.current
let code = (locale as NSLocale).object(forKey: NSLocale.Key.countryCode) as! String?
print(code!)
Tarik
źródło
Witamy w Stack Overflow! Chociaż ten fragment kodu może odpowiedzieć na pytanie, lepiej dołączyć opis problemu i sposób, w jaki Twój kod poradzi sobie z danym problemem. Na przyszłość, oto kilka informacji, jak złamać niesamowitą odpowiedź na temat przepełnienia stosu.
dirtydanee
3

Prosta funkcja 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
  }
Sasha Prochorenko
źródło
3

Jeśli szukasz preferowanego kodu języka („en”, „de”, „es” ...) i zlokalizowanej nazwy preferowanego języka (dla bieżących ustawień regionalnych), oto proste rozszerzenie w 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)!
}

}

Jovan Stankovic
źródło
2
-(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;

}
Johnny Rockex
źródło
2

Jeśli chcesz uzyskać tylko język, oto moja sugerowana odpowiedź:

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

W moim przypadku chciałem tylko język regionalny, a nie region regionalny.

Dane wyjściowe: jeśli Twoim językiem lokalizacji jest język japoński, a regionem jest Japonia, to:

langplusreg = ja-JP

langonly = ja

Danboz
źródło
1

Odpowiedź @amir w Swift:

// Get language prefered by user
    let langageRegion = NSLocale.preferredLanguages().first!
    let languageDic = NSLocale.componentsFromLocaleIdentifier(langageRegion)
    let language = languageDic[NSLocaleLanguageCode]
CedricSoubrie
źródło
1

Oczywiście rozwiązania oparte na przykład na

[[NSLocale preferredLanguages] objectAtIndex:0]

zwykle działają dobrze i zwracają bieżący język urządzenia.

Ale w niektórych przypadkach może być mylące:

Jeśli aplikacja, w której chcesz uzyskać tę wartość, już zmieniła język, na przykład za pomocą tego rodzaju kodu:

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

W tym przypadku [NSLocale preferowane języki] faktycznie zwraca preferowany zestaw języków (i używany) w tej konkretnej aplikacji, a nie bieżący język urządzenia!

I ... w tym przypadku jedynym sposobem na poprawne pobranie aktualnego języka urządzenia (a nie tego wcześniej ustawionego w aplikacji) jest najpierw wyczyszczenie klucza @ „appleLanguages” w NSUserDefault:

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

Następnie [NSLocale preferLanguages] zwraca teraz poprawną wartość.

Mam nadzieję, że to pomoże.

Chrysotribax
źródło
1

Zaktualizowana odpowiedź dla Swift 4

let language = Bundle.main.preferredLocalizations.first
Pan Ibrahim Hassan
źródło
Zauważ, że pobiera to zagregowaną listę dostępnych (obsługiwanych przez pakiet, tj. Ciebie) i preferowanych (przez użytkownika) lokalizacji. NSLocale.preferredLanguagespowinien zwrócić preferowane przez użytkownika, nie zwracając uwagi na to, co jest obsługiwane przez pakiet.
Jonny
1

W przypadku Swift 3.0 poniżej można użyć kodu, aby odpowiedzieć na twoje pytanie:

 let language = Bundle.main.preferredLocalizations.first! as NSString
Apurv Soni
źródło
1

W Swift 4.2 i Xcode 10.1

let language = NSLocale.preferredLanguages[0]
print(language)//en
iOS
źródło
0

Według dokumentacji Apple

NSUserDefaults* defs = [NSUserDefaults standardUserDefaults];
NSArray* languages = [defs objectForKey:@"AppleLanguages"];
NSString* preferredLang = [languages objectAtIndex:0];
Max Tymchii
źródło
0

Format dwóch liter. Apple stosuje normę ISO ISO-3166 .

NSString *localeCountryCode = [[NSLocale autoupdatingCurrentLocale] objectForKey:NSLocaleCountryCode];
Jakub Truhlář
źródło
0

W przypadku Swift 3:

NSLocale.preferredLanguages ​​[0] as String

Bill Chan
źródło
0

Począwszy od iOS 9, jeśli chcesz tylko kodu języka bez kodu kraju, będziesz potrzebować tego rodzaju funkcji pomocniczej - ponieważ język będzie zawierał kod kraju.

// 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;
}
jjxtra
źródło
0

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)
anshul-systematix
źródło
Zauważ, że pobiera to zagregowaną listę dostępnych (obsługiwanych przez pakiet, tj. Ciebie) i preferowanych (przez użytkownika) lokalizacji. NSLocale.preferredLanguagespowinien zwrócić preferowane przez użytkownika, nie zwracając uwagi na to, co jest obsługiwane przez pakiet.
Jonny