lightbulb_outline Help shape the future of the Google Play Console, Android Studio, and Firebase. Start survey

Idioma e localidade

A partir do Android 7.0 (API de nível 24), o Android oferece compatibilidade avançada para usuários multilíngues, permitindo-lhes 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 inicia com a explicação da estratégia de resolução de recurso em versões do Android inferiores a 7.0 (API de nível 24). Em seguida, descreve a estratégia de resolução de recurso aprimorada 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 do Android 7.0, 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:

  • O idioma padrão do seu aplicativo é en_US (inglês dos EUA), mas ele também tem strings em espanhol localizadas 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 aplicativo 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 há 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 aplicativo, como o francês. Por exemplo:

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

    Configurações de 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.

    Melhorias na estratégia de resolução de recursos

    O Android 7.0 (API de nível 24) 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 principal mais comum. Por exemplo, se você estava armazenando recursos em espanhol no diretório es-US antes, mova-os para o diretório es-419, que contém o espanhol latino-americano. Da mesma maneira, se você tiver strings de recurso em uma pasta en-GB, renomeie-a para en-001 (inglês internacional), pois o pai mais comum para strings en-GB é en-001. O exemplo a seguir explica por que essas práticas melhoram o desempenho e a confiabilidade da resolução de recursos.

    Exemplos de resolução de recursos

    Com versões de Android mais recentes que 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 de usuário Recursos do aplicativo Resolução do recurso
    1. fr_CH
    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. Este exemplo também mostra por que você deve armazenar strings em francês em fr em vez de em fr_FR para Android 7.0 ou mais recente. Aqui, o curso da ação é corresponder 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 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 compatibilidade com francês no aplicativo.

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

    Configurações de usuário Recursos do aplicativo Resolução do recurso
    1. fr_CH
    2. it_CH
    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 aceite francês.

    Projetar seu aplicativo para compatibilidade com localidades adicionais

    LocaleList API

    A partir do Android 7.0 (API de nível 24), o Android expõe a LocaleList.getDefault() API que permite aos aplicativos consultar diretamente a lista de idiomas que um usuário especificou. Essa API permite criar 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.

    Formatadores

    Até o Android 6.0 (API de nível 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 aceitas do Android, pode haver 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 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, são compatíveis com 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ê 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)