Localização no Android

Este documento apresenta os recursos de localização do SDK do Android e como acessá-los com o Xamarin.

Recursos da plataforma Android

Esta seção descreve os principais recursos de localização do Android. Pule para a próxima seção para ver o código e os exemplos específicos.

Localidade

Os usuários escolhem seu idioma em Configurações > Idioma e entrada. Essa seleção controla o idioma exibido e as configurações regionais usadas (por exemplo, para formatação de data e número).

A localidade atual pode ser consultada por meio do Resourcescontexto atual:

var lang = Resources.Configuration.Locale; // eg. "es_ES"

Esse valor será um identificador de localidade que contém um código de idioma e um código de localidade, separados por um sublinhado. Para referência, aqui está uma lista de localidades Java e localidades suportadas pelo Android via StackOverflow.

Exemplos comuns incluem:

  • en_US para Inglês (Estados Unidos)
  • es_ES para espanhol (Espanha)
  • ja_JP para japonês (Japão)
  • zh_CN para chinês (China)
  • zh_TW para chinês (Taiwan)
  • pt_PT para português (Portugal)
  • pt_BR para Português (Brasil)

LOCALE_CHANGED

O Android é gerado android.intent.action.LOCALE_CHANGED quando o usuário altera sua seleção de idioma.

As atividades podem optar por lidar com isso definindo o android:configChanges atributo na atividade, desta forma:

[Activity (Label = "@string/app_name", MainLauncher = true, Icon="@drawable/launcher",
    ConfigurationChanges = ConfigChanges.Locale | ConfigChanges.ScreenSize | ConfigChanges.Orientation)]

Noções básicas de internacionalização no Android

A estratégia de localização do Android tem as seguintes partes principais:

  • Pastas de recursos para conter cadeias de caracteres, imagens e outros recursos localizados.

  • GetText , que é usado para recuperar strings localizadas no código

  • @string/id em arquivos AXML, para colocar automaticamente strings localizadas em layouts.

Pastas de recursos

Os aplicativos Android gerenciam a maior parte do conteúdo em pastas de recursos, como:

  • layout - contém arquivos de layout AXML.
  • Desenhável - Contém imagens e outros recursos desenháveis.
  • values - contém strings.
  • raw - contém arquivos de dados.

A maioria dos desenvolvedores já está familiarizada com o uso de sufixos dpi no diretório drawable para fornecer várias versões de uma imagem, permitindo que o Android escolha a versão correta para cada dispositivo. O mesmo mecanismo é usado para fornecer traduções de vários idiomas, sufixando diretórios de recursos com identificadores de idioma e cultura.

Captura de tela das pastas Recursos/desenháveis e Recursos/valores para vários identificadores culturais

Observação

Ao especificar um idioma de nível superior, apenas es dois caracteres são necessários; no entanto, ao especificar uma localidade completa, o formato do nome do diretório requer um traço e r minúsculo para separar as duas partes, por exemplo, pt-rBR ou zh-rCN. Compare isso com o valor retornado no código, que tem um sublinhado (por exemplo, pt_BR). Ambos são diferentes do valor que a classe .NET CultureInfo usa, que tem apenas um traço (por exemplo, pt-BR). Lembre-se dessas diferenças ao trabalhar em plataformas Xamarin.

Strings.xml formato de arquivo

Um diretório de valores localizados (por exemplo. values-es ou values-pt-rBR) devem conter um arquivo chamado Strings.xml que conterá o texto traduzido para essa localidade.

Cada cadeia de caracteres traduzível é um elemento XML com a ID do recurso especificada como o name atributo e a cadeia de caracteres traduzida como o valor:

<string name="app_name">TaskyL10n</string>

Você precisa escapar de acordo com as regras XML normais e deve ser um ID de recurso válido do name Android (sem espaços ou traços). Aqui está um exemplo do arquivo de strings padrão (inglês) para o exemplo:

valores/Strings.xml

<resources>
    <string name="app_name">TaskyL10n</string>
    <string name="taskadd">Add Task</string>
    <string name="taskname">Name</string>
    <string name="tasknotes">Notes</string>
    <string name="taskdone">Done</string>
    <string name="taskcancel">Cancel</string>
</resources>

O diretório espanhol values-es contém um arquivo com o mesmo nome (Strings.xml) que contém as traduções:

valores-es/Strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">TaskyLeon</string>
    <string name="taskadd">agregar tarea</string>
    <string name="taskname">Nombre</string>
    <string name="tasknotes">Notas</string>
    <string name="taskdone">Completo</string>
    <string name="taskcancel">Cancelar</string>
</resources>

Captura de tela de várias pastas de valores, cada uma contendo um arquivo Strings.xml

Com a configuração dos arquivos de strings, os valores traduzidos podem ser referenciados em layouts e código.

Arquivos de layout AXML

Para fazer referência a cadeias de caracteres localizadas em arquivos de layout, use a @string/id sintaxe. Este trecho XML do exemplo mostra text propriedades sendo definidas com IDs de recursos localizados (alguns outros atributos foram omitidos):

<TextView
    android:id="@+id/NameLabel"
    android:text="@string/taskname"
    ... />
<CheckBox
    android:id="@+id/chkDone"
    android:text="@string/taskdone"
    ... />

Método GetText

Para recuperar cadeias de caracteres traduzidas no código, use o GetText método e passe a ID do recurso:

var cancelText = Resources.GetText (Resource.String.taskcancel);

Cadeia de caracteres de quantidade

Os recursos de string do Android também permitem criar strings de quantidade que permitem que os tradutores forneçam traduções diferentes para quantidades diferentes, como:

  • "Resta 1 tarefa."
  • "Ainda há 2 tarefas a serem feitas."

(em vez de um genérico "Restam n tarefas").

No Strings.xml

<plurals name="numberOfTasks">
   <!--
      As a developer, you should always supply "one" and "other"
      strings. Your translators will know which strings are actually
      needed for their language.
    -->
   <item quantity="one">There is %d task left.</item>
   <item quantity="other">There are %d tasks still to do.</item>
 </plurals>

Para renderizar a string completa, use o GetQuantityString método, passando a ID do recurso e o valor a ser exibido (que é passado duas vezes). O segundo parâmetro é usado pelo Android para determinar qual quantity string usar, o terceiro parâmetro é o valor realmente substituído na string (ambos são obrigatórios).

var translated = Resources.GetQuantityString (
                    Resource.Plurals.numberOfTasks, taskcount, taskcount);`

Os switches válidos quantity são:

  • zero
  • um
  • dois
  • few
  • many
  • other

Eles são descritos com mais detalhes nos documentos do Android. Se um determinado idioma não exigir tratamento 'especial', essas quantity strings serão ignoradas (por exemplo, o inglês usa one apenas e other; especificar uma zero string não terá efeito, não será usado).

Imagens

As imagens localizadas seguem as mesmas regras dos arquivos de strings: todas as imagens referenciadas no aplicativo devem ser colocadas em diretórios desenháveis para que haja um fallback.

Imagens específicas da localidade devem ser colocadas em pastas desenháveis qualificadas, como drawable-es ou drawable-ja (especificadores de dpi também podem ser adicionados).

Nesta captura de tela, quatro imagens são salvas no diretório desenhável , mas apenas uma, flag.png, tem cópias localizadas em outros diretórios.

Captura de tela de várias pastas desenháveis, cada uma contendo um ou mais arquivos .png localizados

Outros tipos de recursos

Você também pode fornecer outros tipos de recursos alternativos específicos do idioma, incluindo layouts, animações e arquivos brutos. Isso significa que você pode fornecer um layout de tela específico para um ou mais de seus idiomas de destino, por exemplo, você pode criar um layout especificamente para alemão que permita rótulos de texto muito longos.

O Android 4.2 introduziu suporte para idiomas da direita para a esquerda (RTL) se você definir a configuração android:supportsRtl="true"do aplicativo . O qualificador "ldrtl" de recurso pode ser incluído em um nome de diretório para conter layouts personalizados projetados para exibição RTL.

Para obter mais informações sobre nomenclatura e fallback de diretório de recursos, consulte os documentos do Android para fornecer recursos alternativos.

Nome do aplicativo

O nome do aplicativo é fácil de localizar usando um @string/id in para a MainLauncher atividade:

[Activity (Label = "@string/app_name", MainLauncher = true, Icon="@drawable/launcher",
    ConfigurationChanges =  ConfigChanges.Orientation | ConfigChanges.Locale)]

Idiomas da direita para a esquerda (RTL)

O Android 4.2 e versões mais recentes oferecem suporte completo para layouts RTL, descritos em detalhes no blog de suporte RTL nativo.

Ao usar o Android 4.2 (API de nível 17) e versões mais recentes, os valores de alinhamento podem ser especificados com start e end em vez de left e right (por exemplo android:paddingStart). Há também novas APIs como LayoutDirection, TextDirection, e TextAlignment para ajudar a criar telas que se adaptam aos leitores RTL.

A captura de tela a seguir mostra o exemplo localizado de Tasky em árabe:

Captura de tela do aplicativo Tasky em árabe

A próxima captura de tela mostra o exemplo localizado de Tasky em hebraico:

Screenshot do aplicativo Tasky em hebraico

O texto RTL é localizado usando arquivos Strings.xml da mesma forma que o texto LTR.

Testando

Certifique-se de testar completamente a localidade padrão. Seu aplicativo falhará se os recursos padrão não puderem ser carregados por algum motivo (ou seja, eles estão ausentes).

Teste de emulador

Consulte a seção Teste em um Android Emulator do Google para obter instruções sobre como definir um emulador para uma localidade específica usando o shell ADB.

adb shell setprop persist.sys.locale fr-CA;stop;sleep 5;start

Teste de dispositivo

Para testar em um dispositivo, altere o idioma no aplicativo Configurações .

Dica

Anote os ícones e a localização dos itens de menu para que você possa reverter o idioma para a configuração original.

Resumo

Este artigo aborda os conceitos básicos da localização de aplicativos Android usando o tratamento de recursos integrado. Você pode saber mais sobre i18n e L10n para aplicativos iOS, Android e multiplataforma (incluindo Xamarin.Forms) neste guia multiplataforma.