2010-07-22 10 views
17

Ho un'app che sto traducendo in un sacco di lingue diverse. Il problema è che l'app avrà alcuni valori diversi in Australia rispetto a quelli della Nuova Zelanda, entrambi paesi di lingua inglese.- Problemi in inglese?

Ho creato un en_AU e un file di lingua en_NZ, ma entrambi utilizzano il file inglese standard. Ho cancellato il file in lingua inglese, ma continua ad accadere ...

Qualche idea su come posso farlo funzionare?

Grazie,

--d

+0

eliminare il file inglese ha causato un sacco di problemi ... Ho un sacco di altre lingue di lavoro, ma quando voglio usare la stessa lingua, ma per regioni diverse, non funziona: S – dewberry

risposta

37

localizzazioni di iPhone (o è che localizzazioni?) Non prendono alcun avviso della Regione l'utente imposta (ad esempio, Regno Unito, Aus, NZ). C'è una sola traduzione in lingua "inglese" disponibile per impostazione predefinita. Tuttavia, puoi incappare in qualcosa per costringerlo a utilizzare una diversa impostazione di traduzione: l'ho appena fatto per scegliere tra "English" (Stati Uniti) e "en_GB" (inglese britannico).

Nel file main.m, alterarlo in modo che sembra qualcosa di simile al di sotto (mettere il proprio test per NZ o AU)

int main(int argc, char *argv[]) { 
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

// Set up the locale jiggery pokery 
NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0]; 
NSString *locale = [[NSLocale currentLocale] objectForKey: NSLocaleCountryCode]; 
if ([language isEqualToString:@"en"] && [locale isEqualToString:@"GB"]) { 
    [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"en_GB", @"en", nil] forKey:@"AppleLanguages"]; 
} 

int retVal = UIApplicationMain(argc, argv, nil, nil); 
[pool release]; 
return retVal; 

}

Questo apre la lingua degli utenti (ad esempio " it ") nella lingua NSString e nella locale dell'utente (ad esempio, NZ, GB, AU) nella locale NSString. Se (nel mio caso) corrispondono a en e GB, quindi imposto alle impostazioni predefinite della lingua di preferenza degli utenti "en_GB", quindi "en".

Poi, nell'applicazione delegati di applicazione: Metodo didFinishLaunchingWithOptions si desidera rimuovere che NSUserDefaults impostazione appena impostato con il codice

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

E 'possibile rimuovere a questo punto perché tutta l'inizializzazione fascio è stato completato. L'app dovrebbe ora utilizzare un file Localization.strings nella directory en_GB.lproj.

È un po 'una soluzione orribile e hacky, ma funziona per me.

+0

funziona per voi , funziona per me ... funziona! fantastico grazie! – dewberry

+0

Grazie per questa risposta. Mi ha davvero aiutato qui per risolvere i miei problemi. – AppAspect

+0

Grazie per NSString * language = [[NSLocale preferredLanguages] objectAtIndex: 0]; – CReaTuS

4

Apple documents this missing iOS feature here.

Importante: In iOS, le interfacce fascio non prendono informazioni dialetto o lo script in considerazione quando si alla ricerca di risorse localizzate; solo il codice di designazione della lingua è considerato. Pertanto se il progetto include le directory di progetto specifiche per lingua con una lingua e la designazione regione , tali directory vengono ignorate. Le interfacce bundle in Mac OS X supportano i designatori di regione nelle directory del progetto specifiche della lingua .

14

Mi è venuta in mente una versione leggermente migliorata della risposta accettata di rickerbh. La prima cosa da capire è che le impostazioni predefinite dell'utente sono organizzate in domini e la chiave @"AppleLanguages" non proviene dal dominio dell'app, ma da qualche dominio più in alto nella gerarchia dei domini.Ciò significa che è completamente sicuro per rimuoverlo dalla predefinite dall'utente:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
[defaults removeObjectForKey:@"AppleLanguages"]; 

Dopo aver chiamato questo codice, si noterà che chiamando [defaults objectForKey:@"AppleLanguages"] restituisce ancora un valore. Quindi, piuttosto che eliminare lo @"AppleLanguages" in un momento successivo, che potrebbe essere problematico a seconda della complessità della tua app, devi fare il contrario: eliminare @"AppleLanguages" immediatamente. In sostanza, questo lo riporta al suo valore predefinito e acquisisce tutte le modifiche apportate al sistema, se, ad esempio, l'utente ha cambiato la sua lingua preferita.

Ecco quello che faccio:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
[defaults removeObjectForKey:@"AppleLanguages"]; 

NSMutableArray *appleLanguages = [[defaults objectForKey:@"AppleLanguages"] mutableCopy]; 
NSString *region = [[NSLocale currentLocale] objectForKey:NSLocaleCountryCode]; 
NSArray *languages = [appleLanguages filteredArrayUsingPredicateFormat:@"not (self contains '-')"]; 
for (NSString *language in languages) { 
    NSString *languageAndRegion = [NSString stringWithFormat:@"%@-%@", language, region]; 
    [appleLanguages removeObject:languageAndRegion]; 
} 
for (NSString *language in languages) { 
    NSString *languageAndRegion = [NSString stringWithFormat:@"%@-%@", language, region]; 
    NSInteger index = [appleLanguages indexOfObject:language]; 
    [appleLanguages insertObject:languageAndRegion atIndex:index]; 
} 
[defaults setObject:appleLanguages forKey:@"AppleLanguages"]; 

(. Si noti che filteredArrayUsingPredicateFormat: è un metodo di estensione che ho scritto Non è la scienza a razzo per capire cosa fa o come funziona.)

Questo crea localizzazioni per ogni lingua nell'elenco combinata con la regione dell'utente. Ad esempio, se l'elenco originale era es en en-GB e la regione dell'utente è AU, otterremo es-AU es en-AU en en-GB. Si noti che es-AU non esiste, ma non fa alcuna differenza. Poiché l'app non trova localizzazioni o risorse associate, la ignora semplicemente.

+1

Con ios 8.1 questa è la soluzione. – Mike

+0

Sembra solido. Una cosa da aggiungere, @selector (filteredArrayUsingPredicateFormat :) è un metodo di categoria su NSArray che puoi trovare qui: https://github.com/huguesbr/library-ios/blob/master/Categories/NSArray%2BFilteredSortedShortcuts.m –

+0

, dove lo inserisci nel tuo codice: nel delegato dell'app o nella tua funzione "principale"? –

0

Ho avuto gli stessi problemi con il tedesco e penso di aver trovato la soluzione "giusta". L'errore era, che in origine la mia lingua di base era solo "tedesco (de)", quando aggiungevo localizzazioni "tedesco/Austria (de_AT)", i file venivano ignorati. Quando si cambia la lingua di base in "tedesco/Germania (de_DE)" le traduzioni in austriaco non sono state ignorate.

0

Vale la pena notare che XCode è molto fuorviante: puoi andare su Progetto (non su Target), Informazioni, Localizzazioni, premere il pulsante + che appare sotto l'elenco delle lingue, quindi scorrere verso il basso fino alla fine dell'elenco delle lingue che appaiono nel popup fino ad arrivare a "Altro" (con la freccia destra accanto ad esso), questo aprirà una bella lista che include varianti regionali per le lingue. Tuttavia, queste varianti regionali non funzionano su iPhone - non ottieni nulla (come documentato da Apple e referenziato in un'altra risposta che appare qui). Evidentemente una delle soluzioni basate su codice sopra elencate è necessaria.