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. Vá para a próxima seção para ver códigos e exemplos específicos.

Localidade

Os usuários escolhem seu idioma em Configurações > Idioma & 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 contexto atual:Resources

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 gera 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, da seguinte 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 localizadas, imagens e outros recursos.

  • GetText método, que é usado para recuperar cadeias de caracteres localizadas no código

  • @string/id em arquivos AXML, para colocar automaticamente cadeias de caracteres localizadas em layouts.

Pastas de recursos

Os aplicativos Android gerenciam a maioria 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 cadeias de caracteres.
  • RAW - contém arquivos de dados.

A maioria dos desenvolvedores já está familiarizada com o uso de sufixos dpi no diretório desenhável 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.

Screenshot of Resources/drawable and Resources/values folders for multiple cultural identifiers

Observação

Ao especificar um idioma de nível superior, como es apenas dois caracteres são necessários, no entanto, ao especificar uma localidade completa, o formato de 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 Tenha essas diferenças em mente ao trabalhar em plataformas Xamarin.

Strings.xml formato de arquivo

Um diretório de valores localizados (por exemplo. values-es ou values-pt-rBR) deve 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 atributo e a cadeia de caracteres traduzida como o name valor:

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

Você precisa escapar de acordo com as regras XML normais, e o name deve ser um ID de recurso Android válido (sem espaços ou traços). Aqui está um exemplo do arquivo de cadeias de caracteres 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>

Screenshot of multiple values folders, each containing a Strings.xml file

Com os arquivos de cadeias de caracteres configurados, 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 que estão 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);

Sequências de quantidade

Os recursos de cadeia de caracteres do Android também permitem que você crie cadeias de caracteres de quantidade que permitem que os tradutores forneçam traduções diferentes para diferentes quantidades, como:

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

(em vez de um genérico "Há n tarefa(s) restantes").

Nas cordas.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 cadeia de caracteres completa, use o método, passando a ID do recurso e o GetQuantityString valor a ser exibido (que é passado duas vezes). O segundo parâmetro é usado pelo Android para determinar qualquantity string usar, o terceiro parâmetro é o valor realmente substituído na string (ambos são necessários).

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

As opções válidas 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 manipulação 'especial', essas quantity cadeias de caracteres serão ignoradas (por exemplo, o inglês usa apenas one e other; especificar uma zero cadeia de caracteres não terá efeito, ela não será usada).

Imagens

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

As imagens específicas da localidade devem então ser colocadas em pastas desenhadas 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.

Screenshot of multiple drawable folders, each containing one or more localized .png files

Outros tipos de recursos

Você também pode fornecer outros tipos de recursos alternativos específicos de idioma, incluindo layouts, animações e arquivos brutos. Isso significa que você pode fornecer um layout de tela específico para um ou mais dos 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 recursos 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 nomeação 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 fornecem suporte completo para layouts RTL, descritos em detalhes no blog Suporte RTL nativo.

Ao usar o Android 4.2 (API nível 17) e mais recente, os valores de alinhamento podem ser especificados com start e em vez de left e endright (por exemploandroid:paddingStart). Há também novas APIs como LayoutDirection, TextDirectione TextAlignment para ajudar a criar telas que se adaptam para leitores RTL.

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

Screenshot of Tasky app in Arabic

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

Screenshot of Tasky app in Hebrew

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 faltando).

Teste de emulador

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

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

Teste de dispositivos

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 interno de recursos. Você pode saber mais sobre i18n e L10n para iOS, Android e aplicativos multiplataforma (incluindo Xamarin.Forms) neste guia multiplataforma.