ios - usato - lingua e zona iphone




Ottenere il linguaggio corrente del dispositivo in iOS? (19)

Mi piacerebbe mostrare la lingua corrente utilizzata dall'interfaccia utente del dispositivo. Quale codice dovrei usare?

Lo voglio come NSString in formato completamente scritto. (Non @ "en_US")

EDIT: Per chi sta guidando, ci sono un sacco di commenti utili qui, poiché la risposta si è evoluta con le nuove versioni di iOS.


veloce

Per ottenere la lingua corrente del dispositivo

NSLocale.preferredLanguages()[0] as String

Per ottenere il linguaggio dell'applicazione

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

Nota:

Raccoglie il linguaggio che hai fornito in CFBundleDevelopmentRegion di info.plist

se CFBundleAllowMixedLocalizations è true in info.plist, viene restituito il primo elemento di CFBundleLocalizations in info.plist


A partire da iOS 9, se si desidera solo il codice della lingua senza prefisso internazionale, è necessario questo tipo di funzione di supporto, poiché la lingua conterrà il codice paese.

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

Formato a due lettere Apple utilizza lo standard ISO ISO-3166 .

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

Ho provato a trovare la soluzione giusta per me. Quando utilizzo Locale.preferredLanguages.first stata restituita la lingua preferita dalle impostazioni dell'app.

Se desideri conoscere la lingua dalle impostazioni del dispositivo dell'utente, devi utilizzare la stringa seguente:

Swift 3

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

Per scartare e utilizzare guarda la riga sottostante:

if let currentDeviceLanguage = Locale.current.languageCode {
    print("currentLanguage", currentDeviceLanguage)

    // For example
    if currentDeviceLanguage == "he" {
        UIView.appearance().semanticContentAttribute = .forceRightToLeft
    } else {
        UIView.appearance().semanticContentAttribute = .forceLeftToRight
    }
}

La risposta selezionata restituisce la lingua corrente del dispositivo, ma non la lingua effettiva utilizzata nell'app. Se non si fornisce una localizzazione nella propria app per la lingua preferita dell'utente, viene utilizzata la prima localizzazione disponibile, ordinata in base all'ordine preferito dall'utente.

Per scoprire la lingua corrente selezionata all'interno delle tue localizzazioni, usa

[[NSBundle mainBundle] preferredLocalizations];

Esempio:

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

Swift:

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

La traduzione di codici di lingua come en_US in inglese (Stati Uniti) è una funzionalità NSLocale di NSLocale e NSLocale non si cura di dove si ottengono i codici lingua. Quindi non c'è davvero alcun motivo per implementare la propria traduzione come suggerisce la risposta accettata.

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

Stampe: inglese, tedesco, svedese


Le soluzioni fornite restituiranno effettivamente la regione corrente del dispositivo, non quella attualmente selezionata. Questi sono spesso la stessa cosa. Tuttavia, se sono in Nord America e ho impostato la lingua giapponese, la mia regione sarà ancora inglese (Stati Uniti). Per recuperare la lingua attualmente selezionata, puoi fare:

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

Ciò restituirà un codice di due lettere per la lingua attualmente selezionata. "en" per inglese, "es" per spagnolo, "de" per tedesco, ecc. Per ulteriori esempi, vedere questa voce di Wikipedia (in particolare, la colonna 639-1):

Elenco dei codici ISO 639-1

Quindi si tratta semplicemente di convertire i due codici lettera nella stringa che si desidera visualizzare. Quindi se è "en", mostra "inglese".

Spero che questo aiuti qualcuno che sta cercando di distinguere tra regione e lingua attualmente selezionata.

MODIFICARE

Vale la pena citare le informazioni dell'intestazione da 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

Le persone interessate al linguaggio app danno un'occhiata alla risposta di @ mindvision


Ovviamente, le soluzioni si basano, per esempio, su

[[NSLocale preferredLanguages] objectAtIndex:0]

di solito funzionano bene e restituiscono la lingua corrente del dispositivo.

Ma potrebbe essere fuorviante in alcuni casi:

Se l'app in cui desideri ottenere questo valore ha già cambiato la lingua, ad esempio con questo tipo di codice:

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

In questo caso, [NSLocale preferredLanguages] restituisce effettivamente il set di lingue preferito (e utilizzato) in questa particolare app, non il linguaggio corrente del dispositivo!

E ... in questo caso l'unico modo per ottenere correttamente il linguaggio attuale del dispositivo corrente (e non quello precedentemente impostato nell'app), è innanzitutto cancellare la chiave @ "appleLanguages" in NSUserDefaults, in questo modo:

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

Quindi, [NSLocale preferredLanguages] ora restituisce il valore corretto.

Spero che questo aiuto.


Per Swift 3:

NSLocale.preferredLanguages ​​[0] come stringa


Per gli sviluppatori di MonoTouch C # utilizzare:

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

Nota: so che questa era una domanda iOS, ma siccome sono uno sviluppatore MonoTouch, la risposta su questa pagina mi ha portato nella giusta direzione e ho pensato di condividere i risultati.


Puoi usare displayNameForKey:value: metodo di 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"]);

Questo verrà stampato:

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

Se si specifica lo stesso identificatore di locale per initWithLocaleIdentifier: e anche displayNameForKey:value: method, quindi fornirà il nome nativo della lingua. Ho scoperto che se rimuovi il prefisso del Paese e utilizzi solo fr e en , questo ometterà anche il Paese dal nome visualizzato (almeno su Mac OS X, non sono sicuro di iOS).


Questo probabilmente ti darà quello che vuoi:

NSLocale *locale = [NSLocale currentLocale];

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

Mostrerà il nome della lingua, nella lingua stessa. Per esempio:

Français (France)
English (United States)

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)

Se stai cercando il codice lingua preferito ("en", "de", "es" ...) e il nome della lingua preferita localizzata (per le impostazioni internazionali correnti), ecco un'estensione semplice in 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)!
}

}


Secondo la documentation Apple

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

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

Risposta aggiornata per Swift 4

let language = Bundle.main.preferredLocalizations.first

Soluzione per iOS 9:

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

language = "en-US"

NSDictionary *languageDic = [NSLocale componentsFromLocaleIdentifier:language];

languageDic avrà i componenti necessari

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

countryCode = "US"

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

languageCode = "en"


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

}




nslocale