No Android 7.0 (nível 24 da API) e versões mais recentes, o Android oferece suporte avançado para usuários multilíngues, permitindo selecionar várias localidades nas configurações. Para fornecer esse recurso, o Android expandiu significativamente a quantidade de localidades aceitas e mudou a forma com que o sistema resolve recursos.
Este documento começa com a explicação da estratégia de resolução de recurso em versões do Android anteriores à 7.0 (nível 24 da API). Em seguida, descreve a estratégia de resolução de recursos melhorada no Android 7.0. Por fim, explica como aproveitar as vantagens do maior número de localidades para oferecer suporte a usuários multilíngues.
Desafios ao resolver recursos de idioma
Antes da versão 7.0, o Android nem sempre conseguia fazer a correspondência correta entre apps e localidades do sistema.
Considere, por exemplo, que temos esta situação:
- O idioma padrão do seu app é
en_US
(inglês dos EUA), mas ele também tem strings em espanhol localizados em arquivos de recursoses_ES
. - Um dispositivo está definido para
es_MX
Quando seu código Java usa strings como referência, o sistema carrega
strings do arquivo de recursos padrão (en_US
), mesmo que o app tenha
recursos em espanhol localizados em es_ES
. 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 houver correspondência, o sistema
volta ao padrão, que é en_US
.
O sistema também usaria en_US
como padrão se o usuário escolhesse um idioma
não aceito pelo app, como o francês. Exemplo:
Configurações do usuário | Recursos do app | Resolução do recurso |
---|---|---|
fr_CH |
padrão (en) de_DE es_ES fr_FR it_IT |
Testa fr_CH => Falha Testa fr => Falha Usa padrão (en) |
Neste exemplo, o sistema mostra strings em inglês sem saber se o usuário entende inglês. Esse comportamento é bastante comum hoje em dia.
Melhorias na estratégia de resolução de recursos
O Android 7.0 (nível 24 da API) 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ê precisa armazenar os recursos no dialeto pai mais comum.
Por exemplo, se você estava armazenando recursos em espanhol
no diretório values-es-rUS
antes, mova-os para o diretório values-b+es+419
,
que contém o espanhol latino-americano.
Da mesma maneira, se você tiver strings de recurso em um
diretório values-en-rGB
, mude
o nome dele para values-b+en+001
(inglês
internacional), já que o pai mais
comum para strings en-GB
é en-001
.
O exemplo abaixo explica por que essas práticas melhoram a performance e a
confiabilidade da resolução de recursos.
Exemplos de resolução de recursos
Com versões de Android mais recentes que a 7.0, o caso descrito na Tabela 1 é resolvido de outra forma:
Configurações do usuário | Recursos do app | Resolução do recurso |
---|---|---|
|
padrão (en) de_DE es_ES fr_FR it_IT |
Testa fr_CH => Falha Tenta fr => Falha Testa filhos de fr => fr_FR Usa fr_FR |
Agora o usuário vai receber recursos em francês em vez de inglês. O exemplo também mostra
por que você precisa armazenar strings em francês em fr
em vez de fr_FR
para o Android 7.0 ou versões mais recentes. Aqui, é necessário
fazer a correspondência com o dialeto pai mais próximo,
tornando a resolução mais rápida e previsível.
Além dessa lógica de resolução melhorada, agora o Android oferece mais opções de idiomas de usuário. Vamos experimentar o exemplo acima novamente com o italiano especificado como um idioma extra de usuário, mas não vamos oferecer suporte ao francês no app.
Configurações do usuário | Recursos do app | Resolução do recurso |
---|---|---|
|
padrão (en) de_DE es_ES it_IT |
Testa fr_CH => Falha Testa fr => Falha Testa filhos de fr => Falha Testa it_CH => Falha Testa it => Falha Testa filhos de it => it_IT Usa it_IT |
O usuário vai encontrar um idioma que ele compreende, mesmo que o aplicativo não ofereça suporte ao francês.
Projetar seu aplicativo para compatibilidade com mais localidades
O Android oferece ferramentas que facilitam a localização de conteúdo de apps e o engajamento de usuários nos idiomas que eles preferirem. Recomendamos usar as seguintes técnicas para configurar o app para que ele possa acomodar diferentes idiomas e convenções de formatação de maneira escalonável.
Especificar os idiomas com suporte do app
Para garantir que os idiomas sejam resolvidos corretamente, especifique os idiomas com suporte do app usando a propriedade
resConfigs
no arquivo build.gradle
do módulo.
O exemplo de código abaixo mostra como usar resConfigs
para indicar idiomas aceitos.
Neste exemplo, o app oferece suporte a inglês e espanhol.
Groovy
android { defaultConfig { ... resConfigs "en", "es" } }
Kotlin
android { defaultConfig { ... resConfigs("en", "es") } }
API LocaleList
No Android 7.0 (nível 24 da API) e versões mais recentes, o Android expõe a
API LocaleList.getDefault()
que permite aos apps consultar diretamente a lista de idiomas que um usuário especificou. Essa API
permite criar um comportamento mais sofisticado
para o app e mostrar conteúdo de forma mais otimizada. Por exemplo: uma pesquisa
pode mostrar resultados em vários idiomas com base nas configurações do usuário. Apps de navegador
podem evitar ofertas de tradução de páginas em um idioma que o usuário conhece
e os apps de teclado também podem ativar todos os layouts apropriados automaticamente.
Formatadores
No Android 6.0 (nível 23 da API) e versões anteriores, 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 apps 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 aceitas do Android, pode haver diferenças significativas nos formatos de data, hora, moeda e informações similares dentro da mesma localidade. Fixar formatos no código pode produzir uma experiência confusa para os usuários. Ao desenvolver para o Android 7.0 ou versões mais recentes, não deixe de usar formatadores em vez de strings no código para números e datas.
O Android 7.0 e as versões mais recentes, por exemplo, oferecem suporte para 27 localidades arábicas. Essas localidades podem compartilhar a maioria dos recursos, mas algumas preferem dígitos ASCII, enquanto outras preferem dígitos nativos. Por exemplo, quando você quiser criar uma frase com uma variável em dígito, como "Escolha um PIN de 4 dígitos", use formatadores como mostrado abaixo:
format(locale, "Choose a %d-digit PIN", 4)