web-dev-qa-db-fra.com

Obtenir la langue actuelle du périphérique sous iOS?

J'aimerais montrer le langage actuel utilisé par l'interface utilisateur du périphérique. Quel code utiliserais-je?

Je le veux comme un NSString au format bien énoncé. (Pas @ "en_US")

EDIT: Pour ceux qui conduisent par, il y a une tonne de commentaires utiles ici, comme la réponse a évolué avec les nouvelles versions iOS.

416
Moshe

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

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

Cela retournera un code de 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

Ensuite, il suffit de convertir les codes à deux lettres en 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.

EDIT

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 des applications consultent réponse de @ mindvision

789
Dubron

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, classée par ordre de préférence de l'utilisateur, est utilisée.

Pour découvrir la langue actuelle 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
274
mindvision

Solution pour iOS 9:

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

language = "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"

84
amir

Cela vous donnera probablement ce que vous voulez:

NSLocale *locale = [NSLocale currentLocale];

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

Il montrera le nom de la langue, dans la langue même. Par exemple:

Français (France)
English (United States)
64
Philippe Leybaert

warning Les 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.

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

langue préférée est la langue dans laquelle l'utilisateur souhaite que les applications soient localisées. Apple ne fournit qu'un nombre limité de traductions. Si la langue préférée est une langue Apple traduite dans leurs applications, il s'agira également de la langue de l'appareil. Cependant si l'utilisateur préfère une langue pour laquelle Apple ne fournit pas les traductions le périphérique et les langues par défaut 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 parcourt la liste des langues préférées et vérifie s’il existe une traduction dans les frameworks Apple. La première langue à avoir une traduction est la langue de l'appareil. La fonction retournera 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 de langues par défaut est:

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

Le liste de langues préférées peut être modifié en: Settings.app -> Général -> Langue et région -> Ordre des langues préférées


Vous pouvez ensuite utiliser le code de langue de l'appareil et le traduire dans le nom de la langue. Les lignes suivantes imprimeront la langue du périphérique dans la langue du périphérique. Par exemple, "Español" si le périphérique est défini 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)
    }
} 
35
dreamlab

Traduire des codes de langue tels que en_US en anglais (États-Unis) est une fonction intégrée de NSLocale et NSLocale ne se soucie pas de savoir où se trouve le codes de langue de. Il n’ya donc vraiment aucune raison de mettre en œuvre 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

12
Erik B

je l'utilise

    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
12
enzoyang

Même s'il existe un meilleur moyen d'obtenir la langue actuelle du périphérique. Essayons par le code ci-dessous -

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

Proposé par Abizern sur ici

8
Praveenkumar

Vous pouvez utiliser la méthode displayNameForKey:value: 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 va imprimer:

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

Si vous spécifiez le même identificateur de paramètres régionaux pour la méthode initWithLocaleIdentifier: ainsi que pour la méthode displayNameForKey:value:, le nom natif de la langue vous sera alors attribué. J'ai découvert que si vous supprimez le code pays et utilisez uniquement fr et en, le pays sera également omis du nom complet (sous Mac OS X au moins, vous n'êtes pas sûr d'iOS).

7
dreamlax

J'ai essayé de trouver la bonne solution pour moi-même. Lorsque j'utilise Locale.preferredLanguages.first, la langue par défaut de vos paramètres d'application a été renvoyée.

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

Swift

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
    }
}
6
Roman Romanenko

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

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

rapide

Pour obtenir la langue courante de l'appareil

NSLocale.preferredLanguages()[0] as String

Pour obtenir la langue de l'application

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

Note:

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

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

5
Durai Amuthan.H

Dans Swift:

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

Fonction 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
  }
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 un développeur MonoTouch, la réponse fournie sur cette page m'a conduit dans la bonne direction et j'ai pensé partager les résultats.

3
Chuck Savage

Swift

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

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

}

3
Jovan Stankovic
-(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;

}
2
Johnny Rockex

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 ne voulais que la langue locale et non la région locale.

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

langplusreg = ja-JP

langonly = ja

2
Danboz

Réponse mise à jour pour Swift 4

let language = Bundle.main.preferredLocalizations.first
1
Md. Ibrahim Hassan

Dans Swift 4.2 et Xcode 10.1

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

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

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

Depuis iOS 9, si vous voulez juste le code de langue sans code de pays, vous aurez besoin de ce type de fonction d'assistance, 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;
}
0
jjxtra

Format deux lettres. Apple utilise le norme ISO ISO-3166 .

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

Selon Apple documentation

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

Pour Swift 3:

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

0
Bill Chan

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

[[NSLocale preferredLanguages] objectAtIndex:0]

fonctionnent normalement et renvoient la langue actuelle du périphérique.

Mais cela peut être trompeur dans certains cas:

Si l'application dans laquelle vous souhaitez obtenir cette valeur a déjà changé de 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, et non la langue actuelle du périphérique!

Et ... dans ce cas, le seul moyen d'obtenir correctement le langage actuel du périphérique (et non celui défini précédemment dans l'application), consiste tout d'abord à effacer la clé @ "appleLanguages" dans NSUserDefaults, comme suit:

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

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

J'espère que cette aide.

0
Chrysotribax

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)
0
anshul-systematix

@amir réponse dans Swift:

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