Visão geral da resolução de idioma e localidade

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 recursos es_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:

Tabela 1. Resolução de recurso sem uma correspondência exata de localidade.

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:

Tabela 2. Uma estratégia de resolução melhorada para quando não há uma correspondência exata para a localidade.

Configurações do usuário Recursos do app Resolução do recurso
  1. fr_CH
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.

Tabela 3. Resolução de recurso quando o app faz a correspondência apenas da segunda configuração de localidade preferencial do usuário.

Configurações do usuário Recursos do app Resolução do recurso
  1. fr_CH
  2. it_CH
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")
    }
}
Devido à maneira como o sistema de compilação mescla recursos do app e as dependências dele, é necessário especificar os idiomas com suporte dessa forma para garantir que as configurações de idioma do usuário sejam recebidas corretamente.

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)