Localizzazione dell’app per iPhone – Problemi in inglese?

Ho un’applicazione 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.

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

Qualche idea su come posso farlo funzionare?

Grazie,

–d

Le localizzazioni iPhone (o si tratta di localizzazioni?) non prendono in considerazione la Regione impostata dall’utente (ad esempio, Regno Unito, Aus, Nuova Zelanda). C’è una sola traduzione in lingua “inglese” disponibile per impostazione predefinita. Tuttavia, puoi aggirare le cose 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 tuo file main.m, alteralo in modo che assomigli a qualcosa di simile (inserisci i tuoi 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 “en”) nella lingua NSString e le impostazioni locali 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”.

Quindi, nell’applicazione di delega dell’applicazione: didFinishLaunchingWithOptions metodo si desidera rimuovere l’impostazione NSUserDefaults che è stata appena impostata con il codice

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

È sicuro rimuovere a questo punto perché è stata completata l’inizializzazione del pacchetto. 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.

Ho trovato quella che penso sia 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 un dominio in alto nella gerarchia dei domini. Ciò significa che è completamente sicuro rimuoverlo dalle impostazioni predefinite dell’utente:

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

Dopo aver chiamato questo codice, noterai che la chiamata [defaults objectForKey:@"AppleLanguages"] restituisce comunque un valore. Quindi, piuttosto che cancellare @"AppleLanguages" ad un certo punto più tardi, che potrebbe essere problematico a seconda della complessità della tua app, devi fare il contrario: elimina immediatamente @"AppleLanguages" . 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 cosa 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 è scienza missilistica per capire cosa fa o come funziona.)

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

Apple documenta questa caratteristica iOS mancante qui.

Importante: in iOS, le interfacce bundle non tengono conto delle informazioni relative a dialetto o script quando cercano risorse localizzate; viene considerato solo il codice di designazione del linguaggio. Pertanto se il tuo progetto include directory di progetto specifiche della lingua con un designatore di lingua e regione, tali directory vengono ignorate. Le interfacce bundle in Mac OS X supportano i designatori di regioni in directory di progetto specifiche della lingua.

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.

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 di lingue che appaiono nel popup fino ad arrivare a “Altro” (con la freccia destra accanto ad essa), si 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.