page.title=Idioma e localidades page.tags=androidn page.image=images/cards/card-nyc_2x.jpg @jd:body
O Android N oferece suporte avançado para usuários multilíngues, permitindo que eles selecionem várias localidades nas configurações. O Android N fornece esse recurso ao expandir significativamente a quantidade de localidades com suporte e mudando a forma como o sistema resolve recursos. O novo método para resolver recursos é mais robusto e foi projetado para ser compatível com APKs existentes, mas tenha cuidado adicional para identificar comportamentos inesperados. Por exemplo, você deve testar para garantir que seu aplicativo assuma o idioma esperado por padrão. Além disso, se seu aplicativo oferecer suporte a vários idiomas, você deverá garantir que esse suporte funcione da maneira esperada. Por fim, garanta que seu aplicativo possa lidar corretamente com idiomas que ele não tenha sido explicitamente projetado para suportar.
Este documento começa explicando a estratégia de resolução de recursos anterior ao Android N. Em seguida, ele descreve a estratégia de resolução de recursos aprimorada do Android N. Por fim, ele explica como aproveitar as vantagens do maior número de localidades para oferecer suporte a usuários multilíngues.
Antes do Android N, o Android nem sempre conseguia fazer a correspondência correta entre aplicativos e localidades do sistema.
Considere, por exemplo, que temos a seguinte situação:
Quando seu código Java usa strings como referência, o sistema carrega strings do arquivo de recursos padrão ({@code en_US}), mesmo que o aplicativo tenha recursos em espanhol localizados em {@code es_ES}. Isso acontece porque, quando não consegue encontrar uma correspondência exata, o sistema continua procurando recursos após extrair o código do país da localidade. Por fim, se não há correspondência, o sistema volta ao padrão, que é {@code en_US}.
O sistema também usaria {@code en_US} como padrão se o usuário escolhesse um idioma não suportado pelo aplicativo, como o francês. Por exemplo:
Configurações do usuário | Recursos do aplicativo | Resolução do recurso |
---|---|---|
fr_CH |
padrão (en) de_DE es_ES fr_FR it_IT |
Tentativa de fr_CH => Falha Tentativa de fr => Falha Usar o padrão (en) |
Neste exemplo, o sistema exibe strings em inglês sem saber se o usuário entende inglês. Esse comportamento é bastante comum hoje em dia. O Android N deverá reduzir de forma significativa a frequência de resultados como esse.
O Android N proporciona uma resolução de recurso mais robusta e
encontra soluções alternativas melhores. No entanto, para agilizar a resolução e melhorar
a capacidade de manutenção, você deve armazenar os recursos no dialeto pai mais comum.
Por exemplo, se você estava armazenando recursos em espanhol no diretório {@code es-US}
antes, mova-os para o diretório {@code es-419}, que contém o espanhol latino-americano.
Da mesma maneira, se você tiver strings de recurso em uma pasta {@code en-GB}, renomeie
essa pasta para {@code en-001} (inglês internacional), pois o pai mais comum
para strings en-GB
é {@code en-001}.
O exemplo a seguir explica por que essas práticas melhoram o desempenho e
a confiabilidade da resolução de recursos.
Com o Android N, o caso descrito na Tabela 1 é resolvido de forma diferente:
Configurações do usuário | Recursos do aplicativo | Resolução do recurso |
---|---|---|
|
padrão (en) de_DE es_ES fr_FR it_IT |
Tentativa de fr_CH => Falha Tentativa de fr => Falha Tentativa de filhos de fr => fr_FR Usar fr_FR |
Agora o usuário obtém recursos em francês em vez de inglês. Esse exemplo também mostra por que você deve armazenar strings em francês em {@code fr} em vez de em {@code fr_FR} para o Android N. Nesse caso, a ação necessária é fazer a correspondência com o dialeto pai mais próximo, tornando a resolução mais rápida e mais previsível.
Além dessa lógica de resolução melhorada, agora o Android oferece mais idiomas de usuário dentre os quais escolher. Vamos experimentar o exemplo acima novamente com o italiano especificado como um idioma de usuário adicional, mas sem suporte para francês no aplicativo.
Configurações do usuário | Recursos do aplicativo | Resolução do recurso |
---|---|---|
|
padrão (en) de_DE es_ES it_IT |
Tentativa de fr_CH => Falha Tentativa de fr => Falha Tentativa de filhos de fr => Falha Tentativa de it_CH => Falha Tentativa de it => Falha Tentativa de filhos de it => it_IT Usar it_IT |
O usuário obtém um idioma que ele compreende, mesmo que o aplicativo não tenha suporte para o francês.
O Android N adiciona uma nova API {@code LocaleList.getDefault()} que permite que os aplicativos façam uma consulta direta na lista de idiomas especificados por um usuário. Essa API permite que você crie um comportamento mais sofisticado para o aplicativo e uma exibição de conteúdo mais otimizada. Por exemplo, uma pesquisa pode mostrar resultados em vários idiomas com base nas configurações do usuário. Aplicativos de navegador podem evitar ofertas de tradução de páginas em um idioma que o usuário conhece e os aplicativos de teclado também podem ativar todos os layouts apropriados automaticamente.
Até o Android 6.0 (nível da API 23), o Android oferecia suporte para apenas uma ou duas localidades para muitos idiomas comuns (en, es, ar, fr, ru). Como só existiam poucas variantes de cada idioma, os aplicativos podiam armazenar alguns números e datas como strings no código nos arquivos de recurso. No entanto, com o conjunto mais amplo de localidades suportadas do Android, podem existir diferenças significativas nos formatos de data, hora, moeda e informações similares dentro da mesma localidade. Colocar formatos no código pode produzir uma experiência confusa para os usuários. Portanto, ao desenvolver para o Android N, não deixe de usar formatadores em vez de strings no código para números e datas.
Um bom exemplo é o árabe, cujo suporte no Android N foi expandido de uma {@code ar_EG} para 27 localidades de árabe. Essas localidades podem compartilhar a maioria dos recursos, mas algumas preferem dígitos ASCII, enquanto outras preferem dígitos nativos. Por exemplo, quando você quer criar uma frase com uma variável em dígito, como “Choose a 4 digit pin”, use formatadores como mostrado abaixo:
format(locale, "Choose a %d-digit PIN", 4)