Obtener el idioma actual del dispositivo en iOS?

Me gustaría mostrar el idioma actual que usa la IU del dispositivo. ¿Qué código usaría?

Quiero esto como un NSString en formato completamente deletreado. (Not @ “en_US”)

EDITAR: para aquellos que pasan de largo, hay un montón de comentarios útiles aquí, ya que la respuesta ha evolucionado con las nuevas versiones de iOS.

Las soluciones proporcionadas realmente devolverán la región actual del dispositivo, no el idioma actualmente seleccionado. Estos son a menudo uno y lo mismo. Sin embargo, si estoy en América del Norte y configuro mi idioma en japonés, mi región seguirá siendo en inglés (Estados Unidos). Para recuperar el idioma seleccionado actualmente, puede hacer:

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

Esto devolverá un código de dos letras para el idioma seleccionado actualmente. “en” para inglés, “es” para español, “de” para alemán, etc. Para obtener más ejemplos, consulte esta entrada de Wikipedia (en particular, la columna 639-1):

Lista de códigos ISO 639-1

Entonces, es una simple cuestión de convertir los códigos de dos letras a la cadena que desea mostrar. Entonces, si es “en”, muestre “Inglés”.

Espero que esto ayude a alguien que está buscando diferenciar entre la región y el idioma actualmente seleccionado.

EDITAR

Vale la pena citar la información del encabezado 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 

Las personas interesadas en el lenguaje de la aplicación echan un vistazo a la respuesta de @ mindvision

La respuesta seleccionada devuelve el idioma actual del dispositivo, pero no el idioma real utilizado en la aplicación. Si no proporciona una localización en su aplicación para el idioma preferido del usuario, se utiliza la primera localización disponible, ordenada por el orden preferido del usuario.

Para descubrir el idioma actual seleccionado en su uso de localizaciones

 [[NSBundle mainBundle] preferredLocalizations]; 

Ejemplo:

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

Rápido:

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

Solución para iOS 9:

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

language = “en-US”

 NSDictionary *languageDic = [NSLocale componentsFromLocaleIdentifier:language]; 

languageDic tendrá los componentes necesarios

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

countryCode = “US”

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

languageCode = “en”

Esto probablemente le dará lo que quiere:

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

Mostrará el nombre del idioma, en el idioma en sí. Por ejemplo:

 Français (France) English (United States) 

advertencia Las respuestas aceptadas y las demás no tienen en cuenta que el idioma preferido puede ser otro que el idioma del dispositivo .

El idioma del dispositivo es el idioma en el que se presentan los elementos del sistema operativo y las aplicaciones de Apple.

El idioma preferido es el idioma en el que el usuario desea que se ubiquen las aplicaciones. Apple solo proporciona un conjunto limitado de traducciones. Si el idioma preferido es un idioma al que Apple tradujo sus aplicaciones, también será el idioma del dispositivo. Sin embargo, si el usuario prefiere un idioma para el que Apple no proporciona traducciones, el dispositivo y los idiomas preferidos no coincidirán . El idioma del dispositivo no estará en la primera posición en la lista de idiomas preferidos.

La siguiente función irá a través de la lista de idiomas preferidos y verificará si hay una traducción en los marcos Apple. El primer idioma para tener una traducción es el idioma del dispositivo. La función devolverá su código de idioma.

 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 } 

Esto funciona si la lista de idiomas preferida es:

  1. Afrikaans (iOS no está traducido al afrikaans)
  2. Español (Idioma del dispositivo)

La lista de idiomas preferidos se puede editar en : Configuracións.app -> General -> Idioma y región -> Orden de idioma preferido


Puede usar el código de idioma del dispositivo y traducirlo al nombre del idioma. Las siguientes líneas imprimirán el idioma del dispositivo en el idioma del dispositivo. Por ejemplo, “Español” si el dispositivo está configurado en español.

 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) } } 

yo uso esto

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

ignorar la pérdida de memoria …

y el resultado es

 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 

Traducir códigos de idioma como en_US al inglés (Estados Unidos) es una característica incorporada de NSLocale y a NSLocale no le importa de dónde obtienes los códigos de idioma. Entonces realmente no hay razón para implementar su propia traducción como sugiere la respuesta aceptada.

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

Grabados: inglés, alemán, sueco

Incluso hay una mejor manera de obtener el idioma actual del dispositivo. Probemos por el siguiente código:

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

Sugerido por Abizern aquí

Puede usar el método 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"]); 

Esto se imprimirá:

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

Si especifica el mismo identificador de configuración regional para initWithLocaleIdentifier: y también el método displayNameForKey:value: , le dará el nombre nativo del idioma. Descubrí que si elimina el código de país y usa solo fr y en , también omitirá el país del nombre para mostrar (al menos en Mac OS X, no estoy seguro acerca de iOS).

Rápido

Para obtener el idioma actual del dispositivo

 NSLocale.preferredLanguages()[0] as String 

Para obtener el lenguaje de la aplicación

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

Nota:

Busca el lenguaje que has dado en CFBundleDevelopmentRegion of info.plist

si CFBundleAllowMixedLocalizations es verdadero en info.plist, se devuelve el primer elemento de CFBundleLocalizations en info.plist

Traté de encontrar la solución adecuada para mí. Cuando uso Locale.preferredLanguages.first fue devuelto al idioma preferido de la configuración de su aplicación.

Si desea conocer el idioma de la configuración del dispositivo del usuario, debe utilizar la cadena a continuación:

Swift 3

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

Para desenvolver y usar, mira la siguiente línea:

 if let currentDeviceLanguage = Locale.current.languageCode { print("currentLanguage", currentDeviceLanguage) // For example if currentDeviceLanguage == "he" { UIView.appearance().semanticContentAttribute = .forceRightToLeft } else { UIView.appearance().semanticContentAttribute = .forceLeftToRight } } 

Para obtener el idioma actual del dispositivo del usuario use el siguiente código que funcionó para mí.

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

Para los desarrolladores de MonoTouch C #, use:

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

Nota: Sé que esta era una pregunta de iOS, pero como soy desarrollador de MonoTouch, la respuesta en esta página me condujo en la dirección correcta y pensé que compartiría los resultados.

En Swift :

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

Función 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; } 

Swift 3

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

Si desea obtener solo el idioma aquí, mi respuesta sugerida es:

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

En mi caso, solo quería solo el idioma de la región y no el de la región.

Salida: si su idioma de configuración regional es japonés y la región local es Japón, entonces:

langplusreg = ja-JP

langonly = ja

Si está buscando el código de idioma preferido (“en”, “de”, “es” …) y el nombre de idioma preferido local (para la configuración regional actual), aquí hay una extensión simple en 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)! } 

}

Para Swift 3.0 a continuación se puede usar el código para responder a su pregunta:

  let language = Bundle.main.preferredLocalizations.first! as NSString 

De acuerdo con la documentación de Apple

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

Formato de dos letras. Apple usa el estándar ISO ISO-3166 .

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

@amir respuesta en Swift:

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

Para Swift 3:

NSLocale.preferredLanguages ​​[0] como cadena

A partir de iOS 9, si solo quiere el código de idioma sin código de país, querrá este tipo de función de ayuda, ya que el idioma contendrá el código de país.

 // gets the language code without country code in uppercase format, ie 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; } 

Obviamente, las soluciones dependen, por ejemplo, de

 [[NSLocale preferredLanguages] objectAtIndex:0] 

por lo general funciona bien y devuelve el idioma actual del dispositivo.

Pero podría ser engañoso en algunos casos:

Si la aplicación en la que desea obtener este valor ya ha cambiado el idioma, por ejemplo, con este tipo de código:

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

En este caso, [NSLocale preferredLanguages] realmente devuelve el conjunto de idiomas preferido (y utilizado) en esta aplicación en particular, ¡no el idioma actual del dispositivo!

Y … en este caso, la única forma de obtener correctamente el idioma actual del dispositivo (y no el que se estableció anteriormente en la aplicación) es borrar primero la clave @ “appleLanguages” en NSUserDefaults, de esta manera:

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

Entonces, [NSLocale preferredLanguages] ahora devuelve el valor correcto.

Espero que esto ayude.

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) 

Respuesta actualizada para Swift 4

 let language = Bundle.main.preferredLocalizations.first