Conseguir el idioma del dispositivo actual en iOS?
-
29-09-2019 - |
Pregunta
Me gustaría mostrar el idioma actual de que el panel de la máquina está utilizando. ¿Qué código debo utilizar?
Quiero esto como una NSString
en formato totalmente explicado. (No @ "en_US")
EDIT:. Para aquellos que conducen encendido cerca, hay un montón de comentarios muy útiles aquí, ya que la respuesta ha evolucionado con nuevos lanzamientos IOS
Solución
Las soluciones aportadas en realidad devolver la región actual del dispositivo - no el idioma seleccionado en ese momento. Estos son a menudo una y la misma. Sin embargo, si estoy en América del Norte y me puse mi lengua al japonés, mi región seguirá siendo Inglés (Estados Unidos). Con el fin de recuperar el idioma actualmente seleccionado, que puede hacer:
NSString * language = [[NSLocale preferredLanguages] firstObject];
Esto devolverá un código de dos letras del idioma seleccionado en ese momento. "En" para Inglés, "es" para español, "es" de España, etc. Para más ejemplos, consulta esta entrada de Wikipedia (en particular, la columna 639-1):
A continuación, se trata de una simple cuestión de la conversión de los códigos de dos letras a la cadena que desea mostrar. Así que si es "en", la pantalla "Inglés".
Espero que esto ayude a alguien que está mirando para diferenciar entre la región y el idioma seleccionado actualmente.
Editar
Vale la pena citar la información de 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 aplicación echar un vistazo a la respuesta @ de MindVision
Otros consejos
La respuesta seleccionada devuelve el idioma del dispositivo actual, pero no el idioma real que se utiliza en la aplicación. Si usted no proporciona una localización en su aplicación para el idioma preferido del usuario, la primera localización disponibles, ordenados por orden de preferencia del usuario, se utiliza.
Para descubrir el idioma actual seleccionado dentro de sus localizaciones utilizar
[[NSBundle mainBundle] preferredLocalizations];
Ejemplo:
NSString *language = [[[NSBundle mainBundle] preferredLocalizations] objectAtIndex:0];
Swift:
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]];
Se mostrará el nombre de la lengua, en el lenguaje mismo. Por ejemplo:
Français (France)
English (United States)
El aceptó, y las otras respuestas todos no toman en cuenta que el preferían el lenguaje puede ser otro idioma que no sea el idioma del dispositivo .
La idioma del dispositivo es el idioma en el que se presentan los elementos del sistema operativo y las aplicaciones de Apple.
La idioma preferido es el idioma que el usuario le gustaría tener aplicaciones localizadas en. Apple sólo ofrece un conjunto limitado de traducciones. Si el idioma preferido es un idioma de Apple tradujo sus aplicaciones a, será también el idioma del dispositivo. No obstante si el usuario prefiere un idioma para el que Apple no proporciona traducciones en el dispositivo de idiomas preferidos y no coincidirá . El idioma del dispositivo no estará en primera posición en la lista de idiomas preferidos.
La siguiente función pasará a través de la lista de idiomas preferidos y comprobar si hay una traducción en los marcos de Apple. La primera lengua de tener una traducción es el idioma del dispositivo. La función devolverá el código en lenguaje.
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
}
Estos trabajos si la lista idioma preferido es:
- Afrikaans (IOS no se traduce en afrikáans)
- español (Idioma de dispositivo)
La lista idioma puede ser Editado : Settings.app -> General -> Idioma y Región -> Idioma preferido de pedido
Puede utilizar el código de idioma del dispositivo y traducirla en el nombre del idioma. Las siguientes líneas se imprimirán el idioma del dispositivo en el idioma del dispositivo. Por ejemplo, "Español" si el dispositivo está ajustado 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 este
NSArray *arr = [NSLocale preferredLanguages];
for (NSString *lan in arr) {
NSLog(@"%@: %@ %@",lan, [NSLocale canonicalLanguageIdentifierFromString:lan], [[[NSLocale alloc] initWithLocaleIdentifier:lan] displayNameForKey:NSLocaleIdentifier value:lan]);
}
ignorar 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
La traducción de códigos de idioma, como en_US en Inglés (Estados Unidos) es una función incorporada de NSLocale
y NSLocale
no le importa donde se obtiene a partir de los códigos de idioma. Así que realmente no hay razón para poner en práctica su propia traducción como la respuesta aceptada sugiere.
// 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);
Las impresiones: Inglés, Alemán, Sueco
Puede utilizar el método de displayNameForKey:value:
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 el initWithLocaleIdentifier:
y también el método displayNameForKey:value:
, a continuación, se le dará el nombre nativo de la lengua. He descubierto que si se quita el código de país y el uso justo y fr
en
, que también va a omitir el país a partir del nombre de visualización (en Mac OS X, al menos, no está seguro acerca de iOS).
Me intentó encontrado la solución correcta para mí. Cuando uso Locale.preferredLanguages.first
fue devuelto el idioma preferido de la configuración de la aplicación.
Si desea conocer el lenguaje de los ajustes del dispositivo de usuario, si la cadena de uso a continuación:
Swift 3
let currentDeviceLanguage = Locale.current.languageCode
// Will return the optional String
Para Separar y el uso vistazo a la línea de abajo:
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 dispositivo de usuario actual uso del lenguaje el siguiente código que funcionó para mí.
NSString * myString = [[NSLocale preferredlanguage]objectAtIndex:0];
Swift
Para obtener el lenguaje actual del dispositivo
NSLocale.preferredLanguages()[0] as String
Para llegar idioma de la aplicación
NSBundle.mainBundle().preferredLocalizations[0] as NSString
Nota:
Se obtiene el idioma que usted ha dado en CFBundleDevelopmentRegion de info.plist
si CFBundleAllowMixedLocalizations es cierto en info.plist entonces primer elemento de CFBundleLocalizations se devuelve en info.plist
Para MonoTouch desarrolladores de C # utilizan:
NSLocale.PreferredLanguages.FirstOrDefault() ?? "en"
Nota:. Sé que esto era una cuestión de iOS, pero como soy un desarrollador MonoTouch, la respuesta en esta página me llevó en la dirección correcta y yo pensé en compartir los resultados
En Swift
:
let languageCode = NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode) as? String
Swift 3
let locale = Locale.current
let code = (locale as NSLocale).object(forKey: NSLocale.Key.countryCode) as! String?
print(code!)
simple función 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
}
Si usted está buscando un código de idioma preferido ( "en", "de", "es" ...), y localizado nombre de idioma preferido (por localización actual), aquí es una simple extensión 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)!
}
}
-(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 desea obtener único lenguaje que aquí está mi respuesta sugerida:
NSString *langplusreg = [[NSLocale preferredLanguages] objectAtIndex:0];
NSString * langonly = [[langplusreg componentsSeparatedByString:@"-"]
objectAtIndex:0];
En mi caso yo sólo quería no sólo el lenguaje Locale región local.
Salida: Si el idioma de configuración regional es japonés y la región local es Japón continuación:
langplusreg = ja-JP
langonly = ja
Respuesta de Actualización de Swift 4
let language = Bundle.main.preferredLocalizations.first
Para Swift 3.0 por debajo de código se puede utilizar para responder a su pregunta:
let language = Bundle.main.preferredLocalizations.first! as NSString
En Swift 4,2 y Xcode 10.1
let language = NSLocale.preferredLanguages[0]
print(language)//en
Dos cartas de formato. Apple utiliza el de la norma ISO-3166 .
NSString *localeCountryCode = [[NSLocale autoupdatingCurrentLocale] objectForKey:NSLocaleCountryCode];
respuesta @amir 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 lo que desea el código de idioma y sin código de país, tendrá que este tipo de función auxiliar -. Ya que el lenguaje 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;
}
Obviamente, las soluciones que dependen, por ejemplo, en
[[NSLocale preferredLanguages] objectAtIndex:0]
por lo general funcionan bien y devolver el idioma del dispositivo actual.
Sin embargo, 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] realidad devuelve el conjunto de idioma preferido (y utilizado) en esta aplicación particular, no el idioma del dispositivo actual!
Y ... en este caso, la única manera de conseguir adecuadamente el idioma del dispositivo de corriente real (y no es que previamente configurado en la aplicación), es eliminar en primer lugar la tecla @ "appleLanguages" en NSUserDefaults, como esto:
[[NSUserDefaults standardUserDefaults]removeObjectForKey:@"AppleLanguages"];
A continuación, [NSLocale preferredLanguages] ahora devuelve el valor correcto.
Espero que esto ayuda.
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)