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.
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):
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
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
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"
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)
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:
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)
}
}
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
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
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).
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
}
}
Pour obtenir la langue actuelle de la machine utilisateur, utilisez le code suivant, il a fonctionné pour moi.
NSString * myString = [[NSLocale preferredlanguage]objectAtIndex:0];
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é
Dans Swift
:
let languageCode = NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode) as? String
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
}
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.
Swift
let locale = Locale.current
let code = (locale as NSLocale).object(forKey: NSLocale.Key.countryCode) as! String?
print(code!)
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)!
}
}
-(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;
}
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
Réponse mise à jour pour Swift 4
let language = Bundle.main.preferredLocalizations.first
Dans Swift 4.2 et Xcode 10.1
let language = NSLocale.preferredLanguages[0]
print(language)//en
Pour Swift 3.0, le code ci-dessous peut être utilisé pour répondre à votre question:
let language = Bundle.main.preferredLocalizations.first! as NSString
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;
}
Format deux lettres. Apple utilise le norme ISO ISO-3166 .
NSString *localeCountryCode = [[NSLocale autoupdatingCurrentLocale] objectForKey:NSLocaleCountryCode];
Selon Apple documentation
NSUserDefaults* defs = [NSUserDefaults standardUserDefaults];
NSArray* languages = [defs objectForKey:@"AppleLanguages"];
NSString* preferredLang = [languages objectAtIndex:0];
Pour Swift 3:
NSLocale.preferredLanguages [0] en tant que chaîne
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.
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)
@amir réponse dans Swift:
// Get language prefered by user
let langageRegion = NSLocale.preferredLanguages().first!
let languageDic = NSLocale.componentsFromLocaleIdentifier(langageRegion)
let language = languageDic[NSLocaleLanguageCode]