Obtenir la langue actuelle de l'appareil dans iOS?

431

Je voudrais montrer la langue actuelle que l'interface utilisateur de l'appareil utilise. Quel code devrais-je utiliser?

Je veux que ce soit dans un NSStringformat entièrement expliqué. (Pas @ "en_US")

EDIT: Pour ceux qui passent, il y a une tonne de commentaires utiles ici, car la réponse a évolué avec les nouvelles versions d'iOS.

Moshe
la source
1
C'est intégré NSLocale. Voir ma réponse.
Erik B
15
Commentaire iOS9: faites attention au fait que pour une raison étrange, Apple a changé le format renvoyé par [NSLocale preferredLanguages]. il était séparé par un trait de soulignement (par exemple en_US), mais maintenant il a été changé en tiret:en-US
ishahak
7
En savoir plus sur iOS9: La mise en place de [NSLocale PreferredLanguages] sur un simulateur iOS 8.4 par rapport à un simulateur 9.0 présente également des différences. Sur iOS 8.4, c'est "en" et iOS 9.0, c'est "en-US"
Kris Subramanian
Ce commentaire m'a beaucoup aidé! Nous étions coincés avec un simple problème en nous demandant ce qui s'était passé pendant environ 1 heure jusqu'à ce que je voie votre commentaire.
thandasoru
3
NSLocalea des méthodes componentsFromLocaleIdentifier:et localeIdentifierFromComponents:qui sont probablement la bonne façon de gérer le format (potentiellement modifiable).
Benjohn

Réponses:

808

Les solutions fournies renverront en fait la région actuelle de l'appareil - pas la langue actuellement sélectionnée. Ce sont souvent les mêmes. Cependant, si je suis en Amérique du Nord et que je mets ma langue au japonais, ma région sera toujours l'anglais (États-Unis). Pour récupérer la langue actuellement sélectionnée, vous pouvez:

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

Cela renverra un code à deux lettres pour la langue actuellement sélectionnée. "en" pour l'anglais, "es" pour l'espagnol, "de" pour l'allemand, etc. Pour plus d'exemples, veuillez consulter cette entrée Wikipedia (en particulier, la colonne 639-1):

Liste des codes ISO 639-1

Il suffit ensuite de convertir les codes à deux lettres en la chaîne que vous souhaitez afficher. Donc, si c'est "en", affichez "Anglais".

J'espère que cela aidera quelqu'un qui cherche à faire la différence entre la région et la langue actuellement sélectionnée.

ÉDITER

Vaut la peine de citer les informations d'en-tête de 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

Les personnes intéressées par le langage de l'application regardent la réponse de @ mindvision

Dubron
la source
2
Exactement ce que je cherchais. J'ai eu le même problème où la région n'est pas la même que la langue.
Jasarien
12
mauvaise réponse: renvoie zh-Hans pour le chinois, qui n'est pas le code iso.
cyrilchampier
2
Les deux premiers caractères donnent le pays, l'étoffe après le tiret donne la région, le reste est juste pour le restreindre davantage (comme les dialectes locaux). zh est répertorié comme le code iso pour le chinois. Pour ceux qui recherchent une langue spécifique comme la
mienne
3
zh-Hans est la seule exception ou existe-t-il d'autres codes de langue qui diffèrent de la norme ISO 639-1?
MPaulo
57
Attention: dans iOS 9 , la valeur de retour de laNSLocale preferredLanguagesmodifiée. Si auparavant vous obteniez "en" uniquement, dans iOS 9, vous obtiendrez "en-US" ou "en-JP", etc. Référence: happyteamlabs.com/blog/…
Dj S
281

La réponse sélectionnée renvoie la langue actuelle de l'appareil, mais pas la langue réelle utilisée dans l'application. Si vous ne fournissez pas de localisation dans votre application pour la langue préférée de l'utilisateur, la première localisation disponible, commandée par la commande préférée de l'utilisateur, est utilisée.

Pour découvrir la langue actuellement sélectionnée dans vos localisations, utilisez

[[NSBundle mainBundle] preferredLocalizations];

Exemple:

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

Rapide:

let language = NSBundle.mainBundle().preferredLocalizations.first as NSString
mindvision
la source
Excellent, c'est aussi ce qui m'intéressait. Testé et ça fonctionne correctement!
smileyborg
5
parfait! cela me permet de construire des chemins de ressources distants localisés avec uniquement les langues prises en charge par mon application dans un ordre préférable.
Yevhen Dubinin
que se passe-t-il si nous voulons obtenir le nom complet de la langue après cela?
Shabarinath Pabba
Si vous souhaitez obtenir le nom complet de la langue à partir de la localisation préférée, vous pouvez utiliser [[NSLocale alloc] initWithLocaleIdentifier: language] (par le haut). Ensuite, vous avez les paramètres régionaux et pouvez appeler displayNameForKey.
Vanessa Forney
87

Solution pour iOS 9:

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

langue = "en-US"

NSDictionary *languageDic = [NSLocale componentsFromLocaleIdentifier:language];

languageDic aura les composants nécessaires

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

countryCode = "US"

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

languageCode = "en"

amir
la source
5
kCFLocaleLanguageCodeKey est une constante définie que vous pouvez utiliser plutôt que de créer votre propre chaîne.
SNyamathi
1
NSLocaleLanguageCode = @ "kCFLocaleCountryCodeKey"
corbeau
utiliser NSLocaleCountryCode et NSLocaleLanguageCode pour @ "kCFLocaleCountryCodeKey", @ "kCFLocaleLanguageCodeKey", respectivement
corbeau
65

Cela vous donnera probablement ce que vous voulez:

NSLocale *locale = [NSLocale currentLocale];

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

Il affichera le nom de la langue, dans la langue elle-même. Par exemple:

Français (France)
English (United States)
Philippe Leybaert
la source
31
mauvaise réponse: cela renvoie les paramètres régionaux, pas la langue, ce qui peut être différent ...
cyrilchampier
4
C'est définitivement faux, par exemple si vous définissez la langue dans les paramètres du téléphone sur l'anglais et le format de la région pour dire allemand, Allemagne, l'exemple ci-dessus renvoie "allemand". La langue du téléphone est toujours définie sur l'anglais.
jake_hetfield
2
Ce n'est pas faux du tout. Les paramètres régionaux contiennent des informations sur la langue et la région. Ainsi, dans l'exemple de @ jake_hetfield, il ne retournerait pas «allemand», il retournerait «anglais (Allemagne)». Ceci combiné avec la réponse de dreamlab devrait être la bonne réponse.
SeanR
36

AttentionLes réponses acceptées et les autres ne tiennent pas compte du fait que la langue préférée peut être une autre langue que la langue de l'appareil .

La langue de l'appareil est la langue dans laquelle les éléments du système d'exploitation et les applications Apple sont présentés.

La langue préférée est la langue dans laquelle l'utilisateur souhaite que les applications soient localisées. Apple ne fournit qu'un ensemble limité de traductions. Si la langue préférée est une langue vers laquelle Apple a traduit ses applications, ce sera également la langue de l'appareil. Cependant, si l'utilisateur préfère une langue pour laquelle Apple ne fournit pas de traductions, l' appareil et les langues préférées ne correspondent pas . La langue de l'appareil ne sera pas en première position dans la liste des langues préférées.

La fonction suivante va parcourir la liste des langues préférées et vérifier s'il y a une traduction dans les frameworks Apple. La première langue à traduire est la langue de l'appareil. La fonction renverra son code de langue.

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
}

Cela fonctionne si la liste des langues préférées est:

  1. Afrikaans (iOS n'est pas traduit en afrikaans)
  2. Espagnol (langue de l'appareil)

La liste des langues préférées peut être modifiée dans : Settings.app -> General -> Language & Region -> Preferred Language Order


Vous pouvez alors utiliser le code de langue de l'appareil et le traduire en nom de langue. Les lignes suivantes imprimeront la langue de l'appareil dans la langue de l'appareil. Par exemple, "Español" si l'appareil est réglé sur l'espagnol.

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
la source
Ma compréhension est qu'en initialisant votre instance de bundle avec NSBundle(forClass: UIView.self)vous essayez de fournir la langue la plus spécifique pour une vue donnée. Cependant, en utilisant cela, j'ai rencontré un problème où, pour la classe donnée, une langue n'était pas retournée. J'ai changé l'initialisation en NSBundle.mainBundle()et est retourné le code de langue attendu.
palmi
Précision: le faisceau avec Initialiser mainBundle()semble être celle recommandée par Apple comme suggéré dans l' en- tête 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()renvoie le bundle de votre application, tandis que NSBundle(forClass: UIView.self)le bundle UIKit du système. la méthode décrite recherche les répertoires du bundle. votre ensemble d'applications ne contiendra que celles des langues dans lesquelles vous souhaitez localiser. pour déterminer la langue de l'appareil, vous devrez vérifier l'ensemble du système.
dreamlab
1
@Pouria, le problème peut être dû au fait qu'iOS 9 a modifié les valeurs de retour NSLocale.preferredLanguages(). j'ai mis à jour la réponse pour prendre en charge iOS 9 .
dreamlab
@dreamlab, malheureusement, cette approche donne des résultats faussement positifs lorsque vous incluez des composants tiers, tels que des pods, avec des localisations que vous ne prenez pas en charge dans les paramètres du projet.
kokoko
12

j'utilise ceci

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

ignorer la fuite de mémoire ..

et le résultat est

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
la source
juste pour la curiosité, où est la fuite de mémoire ici?
Can Poyrazoğlu
Fuite - [[[NSLocale alloc] initWithLocaleIdentifier: lan].
Pavel
1
Seulement pour les projets non-ARC, cependant.
Josh Hinman
12

La traduction de codes de langue tels que en_US en anglais (États-Unis) est une fonction intégrée de NSLocaleet NSLocalene se soucie pas d'où vous obtenez les codes de langue. Il n'y a donc vraiment aucune raison d'implémenter votre propre traduction comme le suggère la réponse acceptée.

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

Impressions: anglais, allemand, suédois

Erik B
la source
1
En fait, vous devez utiliser [NSLocale autoupdatingCurrentLocale] pour initialiser votre instance de paramètres régionaux. De cette façon, les noms de langue seront affichés dans la langue maternelle de l'utilisateur. Par exemple, le suédois deviendra Svenska.
Maciej Swic
8

Même il existe un meilleur moyen d'obtenir la langue actuelle de l'appareil. Essayons par le code ci-dessous -

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

Proposé par Abizern sur ici

Praveenkumar
la source
7

Vous pouvez utiliser la displayNameForKey:value:méthode de 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"]);

Cela imprimera:

français (France)
anglais tats-Unis)

Si vous spécifiez le même identificateur de paramètres régionaux pour la méthode initWithLocaleIdentifier:et également displayNameForKey:value:, il vous donnera le nom natif de la langue. J'ai découvert que si vous supprimez le code de pays et utilisez simplement fret en, cela supprimera également le pays du nom d'affichage (sur Mac OS X au moins, je ne suis pas sûr d'iOS).

dreamlax
la source
6

Rapide

Pour obtenir la langue actuelle de l'appareil

NSLocale.preferredLanguages()[0] as String

Pour obtenir la langue de l'application

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

Remarque:

Il récupère le langage que vous avez donné dans CFBundleDevelopmentRegion of info.plist

si CFBundleAllowMixedLocalizations est vrai dans info.plist, le premier élément de CFBundleLocalizations dans info.plist est renvoyé

Durai Amuthan.H
la source
6

J'ai essayé de trouver la bonne solution pour moi. Lorsque j'utilise a Locale.preferredLanguages.firstété retourné la langue préférée de vos paramètres d'application.

Si vous souhaitez connaître la langue à partir des paramètres de la machine utilisateur, vous devez utiliser la chaîne ci-dessous:

Swift 3

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

Pour déballer et utiliser, regardez la ligne ci-dessous:

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
la source
vous n'avez pas à déballer si vous utilisez ce Bundle.main.preferredLocalizations [0] comme chaîne
μολὼν.λαβέ
5

Pour obtenir la langue actuelle de la machine utilisateur, utilisez le code informatique suivant, cela a fonctionné pour moi.

NSString * myString = [[NSLocale preferredlanguage]objectAtIndex:0];
shailendra
la source
4

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

Les utilisateurs peuvent sélectionner la langue préférée d'une application indépendamment de la langue du système d'exploitation.

Vous pouvez les utiliser:

    // 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
la source
3

Pour les développeurs MonoTouch C #, utilisez:

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

Remarque: je sais que c'était une question iOS, mais comme je suis développeur MonoTouch, la réponse sur cette page m'a conduit dans la bonne direction et j'ai pensé partager les résultats.

Chuck Savage
la source
J'utilise actuellement NSLocale.PreferredLanguages ​​et j'obtiens un tableau vide. Je suppose que vous avez lu dans la documentation qu'elle peut ne jamais être vide, mais je ne vois cela nulle part?
JFoulkes
Non, honnêtement, ce n'était qu'une supposition de ma part.
Chuck Savage
@LarryF Regardez cette vidéo: jonas.follesoe.no/2011/07/22/cross-platform-mobile-ndc-2011 Il est très instructif sur la façon de structurer vos applications de code / multiplateforme.
Chuck Savage
3

Dans Swift:

let languageCode = NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode) as? String
Lee
la source
3

Swift 3

let locale = Locale.current
let code = (locale as NSLocale).object(forKey: NSLocale.Key.countryCode) as! String?
print(code!)
Tarik
la source
Bienvenue dans Stack Overflow! Bien que ce morceau de code puisse répondre à la question, il est préférable d'inclure une description du problème et de la façon dont votre code s'attaquera au problème donné. Pour l'avenir, voici quelques informations, comment trouver une réponse impressionnante sur Stack Overflow.
dirtydanee
3

Fonction Swift 3 simple:

  @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 Prokhorenko
la source
3

Si vous recherchez le code de langue préféré ("en", "de", "es" ...) et le nom de langue préféré localisé (pour les paramètres régionaux actuels), voici une extension simple dans 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
la source
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
la source
2

Si vous souhaitez obtenir uniquement la langue, voici ma réponse suggérée:

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

Dans mon cas, je voulais seulement la langue locale et non la région locale.

Sortie: Si votre langue locale est le japonais et que la région locale est le Japon, alors:

langplusreg = ja-JP

langonly = ja

Danboz
la source
1

Réponse de @amir dans Swift:

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

De toute évidence, les solutions reposant, par exemple, sur

[[NSLocale preferredLanguages] objectAtIndex:0]

fonctionnent généralement bien et renvoient la langue actuelle de l'appareil.

Mais cela pourrait être trompeur dans certains cas:

Si l'application dans laquelle vous souhaitez obtenir cette valeur a déjà changé la langue, par exemple avec ce type de code:

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

Dans ce cas, [NSLocale PreferredLanguages] renvoie en fait le jeu de langues préféré (et utilisé) dans cette application particulière, pas la langue actuelle de l'appareil!

Et ... dans ce cas, le seul moyen d'obtenir correctement la langue actuelle de l'appareil actuel (et non celle précédemment définie dans l'application) est d'abord de supprimer la clé @ "appleLanguages" dans NSUserDefaults, comme ceci:

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

Ensuite, [NSLocale PreferredLanguages] renvoie maintenant la valeur correcte.

J'espère que cette aide.

Chrysotribax
la source
1

Réponse mise à jour pour Swift 4

let language = Bundle.main.preferredLocalizations.first
Md. Ibrahim Hassan
la source
Notez que cela récupère la liste agrégée des localisations disponibles (prises en charge par l'ensemble, c'est-à-dire vous) et préférées (par l'utilisateur). NSLocale.preferredLanguagesdoit renvoyer les préférences de l'utilisateur sans respecter ce qui est pris en charge par le bundle.
Jonny
1

Pour Swift 3.0, le code ci-dessous peut être utilisé pour répondre à votre question:

 let language = Bundle.main.preferredLocalizations.first! as NSString
Apurv Soni
la source
1

Dans Swift 4.2 et Xcode 10.1

let language = NSLocale.preferredLanguages[0]
print(language)//en
iOS
la source
0

Selon la documentation Apple

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

Format à deux lettres. Apple utilise la norme ISO ISO-3166 .

NSString *localeCountryCode = [[NSLocale autoupdatingCurrentLocale] objectForKey:NSLocaleCountryCode];
Jakub Truhlář
la source
0

Pour Swift 3:

NSLocale.preferredLanguages ​​[0] en tant que chaîne

Bill Chan
la source
0

À partir d'iOS 9, si vous voulez simplement le code de langue sans code de pays, vous aurez besoin de ce type de fonction d'aide - car la langue contiendra le code de pays.

// 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
la source
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
la source
Notez que cela récupère la liste agrégée des localisations disponibles (prises en charge par l'ensemble, c'est-à-dire vous) et préférées (par l'utilisateur). NSLocale.preferredLanguagesdoit renvoyer les préférences de l'utilisateur sans respecter ce qui est pris en charge par le bundle.
Jonny