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 Resources
contexto 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.
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>
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.
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:
A próxima captura de tela mostra o exemplo localizado de 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.