2009-10-05 1 views
74

Sono nei processi di internazionalizzazione di un'app per iPhone - Devo apportare modifiche programmatiche a determinate visualizzazioni in base a quali sono le impostazioni locali dell'utente. Sto andando noci perché non importa ciò che la preferenza della lingua sul simulatore iPhone o hardware reale sono, locale restituisce sempre "en_US":NSLocale currentLocale restituisce sempre "en_US" non la lingua corrente dell'utente

NSString *locale = [[NSLocale currentLocale] localeIdentifier]; 
NSLog(@"current locale: %@", locale); 

La cosa pazzesca è che il resto dell'applicazione si comporta come previsto. Le stringhe corrette vengono selezionate dal file Localization.strings e utilizzate nell'interfaccia e vengono utilizzati i file .xib corretti per le impostazioni locali selezionate.

Ho anche provato quanto segue, senza alcun risultato e con lo stesso risultato:

NSString *locale = [[NSLocale autoupdatingCurrentLocale] localeIdentifier]; 
NSLog(@"current locale: %@", locale); 

C'è qualcosa di semplice che mi manca? Una preferenza o un'importazione forse?

Quello che ho usato per fare:

Come risposta di Darren suggerisce, la preferenza che sto cercando non è in NSLocale, anzi è qui:

NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults]; 
NSArray* languages = [userDefaults objectForKey:@"AppleLanguages"]; 
NSString* preferredLanguage = [languages objectAtIndex:0]; 
NSLog(@"preferredLanguage: %@", preferredLang); 

risposta di Pietro sembra essere una soluzione migliore:

NSArray* preferredLanguages = [NSLocale preferredLanguages]; 
NSLog(@"preferredLanguages: %@", preferredLanguages); 

risposta

33

Invece di eseguire query sui valori predefiniti utilizzando direttamente una chiave non documentata, ask the NSLocale class for the array of preferred languages.

+0

@PeterHosey Inoltre, ho riscontrato problemi simili riguardo al linguaggio corrente e ho provato tutto, ma nessuno di essi ha funzionato. Così triste ... Puoi dare un'occhiata a questo, http://stackoverflow.com/questions/26572115/nslocale-preferredlanguages-objectatindex0-always-return-en/26574075#26574075? Grazie! – S1U

+0

@ s1u C'è un bug in Xcode 6.1. Controlla questa risposta: http://stackoverflow.com/a/26641497/1085556 –

+0

@ s1u: Coppia di cose: (1) Possono esserci più lingue preferite; non esiste una sola "lingua corrente" e (2) riguardo alla tua risposta (cancellata), che restituisce la lingua dominante della locale corrente (a.k.a. regione), * non * le lingue preferite dell'utente. –

54

[NSLocale currentLocale] si basa sulle impostazioni del formato della regione del dispositivo, non sulla lingua. Se la regione è impostata su Stati Uniti, otterrai en_US indipendentemente dalla lingua che stai utilizzando.

+0

Grazie a Darren, che mi ha fatto iniziare, ho anche capito come ottenere l'impostazione della lingua corrente, che è quello che stavo davvero cercando di fare. – Prairiedogg

+1

Ciao Prairiedogg, come hai ottenuto l'impostazione della lingua corrente? anch'io ho lo stesso problema .. tutto restituisce il valore EN per la lingua. – Zaldy

+0

@ZaldzBugz: qualcosa come: NSLocale * locale = [NSLocale currentLocale]; NSString * lang = [locale displayNameForKey: NSLocaleIdentificatore valore: [[NSLocale preferredLanguages] objectAtIndex: 0]]; – powerj1984

2

ho scoperto che se lascio "en_US", ma ho una localizzazione "en" che è una copia di "en_US" il simulatore inizia automagicamente rispettando le impostazioni della lingua, ma non appena "en_US" è un'opzione seleziona sempre indipendentemente dalle impostazioni.

2

Ho avuto un problema in cui i nomi di formattazione mese è uscito in inglese su un dispositivo impostato la lingua francese .

La mia soluzione era quella di utilizzare questo:

NSLocale *locale = [NSLocale localeWithLocaleIdentifier:[[NSLocale preferredLanguages] objectAtIndex:0] ]; 
    [self.monthNameFormatter setLocale:locale]; 
    [self.monthNameFormatter setDateFormat:@"MMMM"]; 
    [self.monthNameFormatter stringFromDate:myDate]; 
1

domanda è troppo vecchio, ma questo codice può aiutare a molti:

Il main.m dovrebbe essere simile a questo:

NSString *localecode=[[NSLocale currentLocale] localeIdentifier]; 
    localecode=[localecode substringToIndex:2]; //en_GB -> en 
    NSArray *arr = [NSLocale preferredLanguages]; 
    NSMutableArray * mutable = [arr mutableCopy]; 
    NSString *prefered = [mutable firstObject]; 
    if(![localecode isEqualToString:prefered]){ 
     if(![prefered isEqualToString:@"es"] && ![prefered isEqualToString:@"en"] && ![prefered isEqualToString:@"pt"]){ 
      int index = [mutable indexOfObject:@"en"]; 
      [mutable replaceObjectAtIndex:0 withObject:@"en"]; 
      [mutable replaceObjectAtIndex:index withObject:prefered]; 
      [[NSUserDefaults standardUserDefaults] setObject:mutable forKey:@"AppleLanguages"]; 

     } 
     else{ 
      int index = [mutable indexOfObject:localecode]; 
      [mutable replaceObjectAtIndex:0 withObject:localecode]; 
      [mutable replaceObjectAtIndex:index withObject:prefered]; 
      [[NSUserDefaults standardUserDefaults] setObject:mutable forKey:@"AppleLanguages"]; 
     } 
    } 
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 

Cosa fa questo? Se la lingua corrente del dispositivo è spagnolo, inglese o portoghese utilizzare l'applicazione utilizza le stringhe localizzate, d'altra parte se la lingua corrente non è una di quelle e non è supportata dall'applicazione è impostata su inglese.

4

per me, sia

NSString *localeString = [[NSLocale currentLocale] localeIdentifier]; 

e

NSArray *array = [NSLocale preferredLanguages]; 
self.label.text = array[0]; 

cedere lo stesso risultato quando si è in un simulatore.

+1

Infatti, nel mio caso, su iOS 8/Xcode 6 sempre en_US – Adrian

0

Mostra le impostazioni internazionali corrette su un iPad reale. Tuttavia, il simulatore ha il proprio iOS che, per impostazione predefinita, è impostato su en-US. Vai alle preferenze del simulatore iOS e cambia la lingua & nella regione desiderata.

Questo è il trucco.

1

Per noi il problema è stato che abbiamo sovrascritto il linguaggio dell'applicazione e l'area dell'applicazione nel nostro schema di sviluppo. Assicurarsi che la lingua dell'applicazione sia impostata su Lingua sistema nelle opzioni dello schema (Modifica schema -> Opzioni).

+0

ha funzionato per me. Grazie @ Simon – Ramakrishna