Localização de aplicativos para iPhone – problemas em inglês?

Eu tenho um aplicativo que estou traduzindo para um monte de idiomas diferentes. O problema é que o aplicativo terá alguns valores diferentes na Austrália do que na Nova Zelândia, ambos países que falam inglês.

Eu criei um arquivo de idioma en_AU e en_NZ, mas ambos estão usando o arquivo padrão do inglês. Eu apaguei o arquivo em inglês, mas continua acontecendo …

Alguma idéia de como posso fazer isso funcionar?

Obrigado,

–d

As localizações do iPhone (ou essas localizações?) não levam em consideração a Região que o usuário define (por exemplo, Reino Unido, Austrália e Nova Zelândia). Existe apenas uma tradução de idioma “inglês” disponível por padrão. No entanto, você pode navegar com coisas para forçá-lo a usar uma configuração de tradução diferente – Acabei de fazer isso para escolher entre “inglês” (EUA) e “en_GB” (inglês britânico).

No seu arquivo main.m, altere-o para que pareça algo como abaixo (coloque em seus próprios testes para NZ ou 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; 

}

Isso mostra o idioma dos usuários (por exemplo, “en”) no idioma NSString e a localidade dos usuários (por exemplo, NZ, GB, AU) na localidade NSString. Se eles (no meu caso) corresponderem en e GB, então defino as configurações de preferência de idioma padrão dos usuários como “en_GB” e, em seguida, “en”.

Em seguida, no seu aplicativo delegates application: método didFinishLaunchingWithOptions você deseja remover essa configuração NSUserDefaults que acabou de definir com o código

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

É seguro remover neste ponto porque toda a boot do pacote foi concluída. Seu aplicativo deve estar usando agora um arquivo Localization.strings no diretório en_GB.lproj.

É uma solução horrível e hacky, mas funciona para mim.

Eu cheguei com o que eu acho que é uma versão ligeiramente melhorada da resposta aceita pelo Rickerbh. A primeira coisa a perceber é que os padrões do usuário são organizados em domínios, e a tecla @"AppleLanguages" não vem do domínio do aplicativo, mas de algum domínio mais acima na hierarquia de domínios. Isso significa que é completamente seguro removê-lo dos padrões do usuário:

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

Depois de chamar esse código, você notará que chamar [defaults objectForKey:@"AppleLanguages"] ainda retorna um valor. Então, ao invés de deletar @"AppleLanguages" em algum momento depois, o que poderia ser problemático dependendo da complexidade do seu aplicativo, você quer fazer o oposto: delete @"AppleLanguages" imediatamente . Essencialmente, isso redefine o valor padrão e captura todas as alterações feitas no sistema, se, por exemplo, o usuário tiver alterado seu idioma preferido.

Aqui está o que eu faço:

 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"]; 

(Note que filteredArrayUsingPredicateFormat: é um método de extensão que eu escrevi. Não é ciência de foguetes para descobrir o que ele faz ou como funciona.)

Isso cria localizações para todos os idiomas da lista combinados com a região do usuário. Por exemplo, se a lista original for es en en-GB e a região do usuário for AU, obteremos es-AU es en-AU en en-GB . Note que es-AU não existe, mas não faz diferença. Como o aplicativo não encontra localizações ou resources associados, ele simplesmente o ignora.

A Apple documenta esse recurso iOS ausente aqui.

Importante: no iOS, as interfaces do bundle não levam em conta informações de dialeto ou script ao procurar resources localizados; somente o código do designador de idioma é considerado. Portanto, se seu projeto include diretórios de projeto específicos de idioma com um designador de região e idioma, esses diretórios serão ignorados. As interfaces do bundle no Mac OS X suportam os designadores de região em diretórios de projeto específicos de idioma.

Eu tive os mesmos problemas com o alemão e acho que encontrei a solução “certa”. O erro foi que originalmente minha língua base era apenas “alemão (de)”, ao adicionar localizações “Alemão / Áustria (de_AT)”, os arquivos eram ignorados. Ao alterar o idioma base para “Alemão / Alemanha (de_DE)”, as traduções austríacas não foram ignoradas.

Vale a pena notar aqui que o XCode é muito enganador – você pode ir para o Project (não Target), Info, Localizations, pressione o botão + que aparece na lista de idiomas e role até a parte inferior da lista de idiomas que aparecem no pop-up até chegar a “Outro” (com a seta para a direita ao lado), isso abrirá uma boa lista grande que inclui variantes regionais para idiomas. No entanto, essas variantes regionais não funcionam no iPhone – você não recebe nada (conforme documentado pela Apple e mencionado em outra resposta que aparece aqui). Evidentemente, uma das soluções baseadas em código listadas acima é necessária.