versiones para descargar ios objective-c cocoa-touch nslocale

para - ios 9



¿Obteniendo el idioma actual del dispositivo en iOS? (28)

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

Quiero esto como una NSString en un formato completamente detallado. (No @ "en_US")

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


Rápido

Para obtener el idioma actual del dispositivo.

NSLocale.preferredLanguages()[0] as String

Para obtener el idioma de la aplicación

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

Nota:

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

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


A partir de iOS 9, si solo desea 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, 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; }


El aceptado, y las otras respuestas, no tienen en cuenta que el idioma preferido puede ser otro idioma 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 localicen 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 cual 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 recorrerá la lista de idiomas preferidos y verificará si hay una traducción en los marcos de 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 preferidos es:

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

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

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


En Swift :

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


Esto probablemente te dará lo que quieres:

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

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

Français (France) English (United States)


Formato de dos letras. Apple utiliza la norma ISO ISO-3166 .

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


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


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

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

Sugerido por Abizern here


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 dentro de sus localizaciones use

[[NSBundle mainBundle] preferredLocalizations];

Ejemplo:

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

Rápido:

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


La traducción de códigos de idioma como en_US al inglés (Estados Unidos) es una función incorporada de NSLocale y a NSLocale no le importa de dónde obtiene los códigos de idioma. Así que 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);

Estampas: inglés, alemán, sueco.


Las soluciones proporcionadas devolverán realmente la región actual del dispositivo, no el idioma seleccionado actualmente. Estos son a menudo uno y el mismo. Sin embargo, si estoy en América del Norte y establezco mi idioma en japonés, mi región seguirá siendo el inglés (Estados Unidos). Para recuperar el idioma seleccionado actualmente, puedes 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 más ejemplos, consulte esta entrada de Wikipedia (en particular, la columna 639-1):

Lista de los códigos ISO 639-1

Entonces es una simple cuestión de convertir los dos códigos de letras a la cadena que le gustaría mostrar. Así que si es "en", muestra "inglés".

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

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 pueden ver la respuesta de @ mindvision


Obviamente, las soluciones que confían, por ejemplo, en

[[NSLocale preferredLanguages] objectAtIndex:0]

Generalmente 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] en realidad devuelve el conjunto de idioma preferido (y utilizado) en esta aplicación en particular, ¡no en el idioma actual del dispositivo!

Y ... en este caso, la única forma de obtener correctamente el idioma actual del dispositivo (y no el establecido previamente en la aplicación), es en primer lugar borrar la clave @ "appleLanguages" en NSUserDefaults, como esto:

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

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

Espero que esto ayude.


Para Swift 3.0, debajo del código puede usarse para responder a su pregunta:

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


Para Swift 3:

NSLocale.preferredLanguages ​​[0] como cadena


Para los desarrolladores de MonoTouch C # use:

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

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


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

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


Puedes 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 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 de visualización (al menos en Mac OS X, no estoy seguro sobre iOS).


Respuesta de @amir en Swift:

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


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)


Según la documentation Apple.

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


Si busca el código de idioma preferido ("en", "de", "es" ...) y el nombre de idioma preferido localizado (para la ubicación 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)! }

}


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

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

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

Salida: Si el idioma de tu Locale es japonés y la región del locale es Japón, entonces:

langplusreg = ja-JP

langonly = ja


Traté de encontrar la solución correcta para mí. Cuando uso Locale.preferredLanguages.first se me devolvió el idioma preferido de la configuración de la aplicación.

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

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


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


Respuesta actualizada para Swift 4

let language = Bundle.main.preferredLocalizations.first


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"


Swift 3

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


-(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; }