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.
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>
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.
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 end
right
(por exemploandroid:paddingStart
). Há também novas APIs como LayoutDirection
, TextDirection
e 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:
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 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.