Tutorial Android #22 – Internacionalização (i18n)

Padrão

Olá pessoal! No tutorial de hoje, vamos ver como traduzir nossa aplicação para que ela se torne multi-linguagem. Isso é bastante interessante caso você tenha a intenção de colocar sua aplicação lá no Google Play.

Bom, o grande “segredo” da internacionalização consiste na pasta values do projeto. Nessa pasta, no caso do nosso projeto, temos hoje o arquivo arrays.xml e strings.xml. Esses arquivos irão conter valores correspondentes a cada um dos idiomas que nossa aplicação suportará. Hoje, temos nossa aplicação com o idioma padrão Português. Como o emulador do Android 2.2 não tem o idioma português, vamos deixá-lo como padrão mesmo, e adicionar suporte ao idioma Espanhol. (nota: se você sabe espanhol, releve as sentenças que eu vou mostrar. Foram todas traduzidas com o auxílio do Google Translator. Eu não falo espanhol!)

Para início de conversa, vamos preparar nosso aplicativo para a internacionalização. Modifique o arquivo strings.xml para que contenha os seguintes valores:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello World, ListaRestaurantes!</string>
    <string name="app_name">Lista de Restaurantes</string>
    <string name="nome">Nome:</string>
    <string name="endereco">Endereço:</string>
	<string name="tipo">Tipo:</string>
	<string name="rodizio">Rodízio</string>
	<string name="fast_food">Fast Food</string>
	<string name="a_domicilio">A Domicílio</string>
	<string name="localizacao">Localização </string>
	<string name="nao_atribuido">(não atribuída)</string>
	<string name="anotacoes">Anotações</string>
	<string name="conta_twitter">Conta do Twitter</string>
	<string name="hora_do_almoco">Hora do Almoço!</string>
	<string name="descartado">Descartado.</string>
	<string name="sem_internet">Conexão com a Internet indisponível</string>
	<string name="local_salvo">Localização salva</string>
	<string name="definir">Definir</string>
	<string name="cancelar">Cancelar</string>
	<string name="notificacao">Hora do Almoço! Está com fome?</string>
	<string name="erro_timeline">Erro manipulando timeline Twitter</string>
	<string name="erro_activity">Erro enviando dados para a Activity</string>
	<string name="timeline_twitter">Timeline Twitter</string>
	<string name="salvar_localizacao">Salvar Localização</string>
	<string name="exibir_mapa">Exibir Mapa</string>
	<string name="adicionar">Adicionar</string>
	<string name="configuracoes">Configurações</string>
	<string name="modo_listagem">Modo de Listagem</string>
	<string name="modo_listagem_desc">Escolha o modo de listagem a ser utilizado</string>
	<string name="modo_listagem_titulo">Escolha o modo de listagem</string>
	<string name="alarme">Tocar Alarme no Almoço</string>
	<string name="alarme_desc">Marque se deseja ser informado sobre a hora do almoço</string>
	<string name="alarme_hora">Horário do Alarme do Almoço</string>
	<string name="alarme_hora_desc">Configure seu horário desejado para o alarme</string>
	<string name="notificacao_titulo">Ativar Notificação</string>
	<string name="notificacao_desc">Marque caso deseje um ícone na barra de status, ou desmarque para a notificação em tela cheia</string>
</resources>

Basicamente, definimos alguns alias para as strings do nosso aplicativo. Porém, em alguns trechos do código, ainda temos strings como constantes de texto. Para isso, vamos alterá-los para utilizar os resources deste arquivo. Primeiramente, nos formulários e menus em XML, vamos alterar os arquivos form_detalhes.xml, tanto na pasta layout

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:stretchColumns="1" >
    <TableRow>
        <TextView android:text="@string/nome"/>
        <EditText android:id="@+id/nome"/>
    </TableRow>
    <TableRow>
    	<TextView android:text="@string/endereco"/>
    	<EditText android:id="@+id/end"/>
    </TableRow>
    <TableRow>
    	<TextView android:text="@string/tipo"/>
    	<RadioGroup android:id="@+id/tipos">
    		<RadioButton android:id="@+id/rodizio"
       			android:text="@string/rodizio"/>
    		<RadioButton android:id="@+id/fast_food"
        		android:text="@string/fast_food"/>
        	<RadioButton android:id="@+id/a_domicilio"
            	android:text="@string/a_domicilio"/>
   		</RadioGroup>
	</TableRow>
	<TableRow>
	    <TextView android:text="@string/localizacao" />
	    <TextView android:id="@+id/localizacao" android:text="@string/nao_atribuido" />
	</TableRow>
    <EditText android:id="@+id/anotacoes"
    	android:singleLine="false"
    	android:gravity="top"
    	android:lines="2"
    	android:scrollHorizontally="false"
    	android:maxLines="2"
    	android:maxWidth="200sp"
    	android:hint="@string/anotacoes"
    	android:layout_marginTop="4dip"/>
    <EditText android:id="@+id/twitter"
        android:hint="@string/conta_twitter" />
</TableLayout>

… quanto na pasta layout-land

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:stretchColumns="2" >
    <TableRow>
        <TextView android:text="@string/nome"/>
        <EditText android:id="@+id/nome"
            android:layout_span="2" />
    </TableRow>
    <TableRow>
    	<TextView android:text="@string/endereco"/>
    	<EditText android:id="@+id/end"
    	    android:layout_span="2" />
    </TableRow>
    <TableRow>
    	<TextView android:text="@string/tipo"/>
    	<RadioGroup android:id="@+id/tipos">
    		<RadioButton android:id="@+id/rodizio"
       			android:text="@string/rodizio"/>
    		<RadioButton android:id="@+id/fast_food"
        		android:text="@string/fast_food"/>
        	<RadioButton android:id="@+id/a_domicilio"
            	android:text="@string/a_domicilio"/>
   		</RadioGroup>
   		<LinearLayout
   		    android:layout_width="fill_parent"
   		    android:layout_height="fill_parent"
   		    android:orientation="vertical">
   		    <EditText android:id="@+id/anotacoes"
    			android:singleLine="false"
	    		android:gravity="top"
    			android:lines="4"
    			android:scrollHorizontally="false"
    			android:maxLines="4"
    			android:maxWidth="140sp"
    			android:layout_width="fill_parent"
    			android:layout_height="wrap_content"
    			android:hint="@string/anotacoes" />
   		    <EditText android:id="@+id/twitter"
   		        android:layout_width="fill_parent"
   		        android:layout_height="wrap_content"
   		        android:hint="@string/conta_twitter"/>
   		    <LinearLayout
   		        android:layout_width="wrap_content"
   		        android:layout_height="wrap_content"
   		        android:orientation="horizontal">
   		        <TextView android:text="@string/localizacao"
   		            android:layout_width="wrap_content"
   		            android:layout_height="wrap_content"/>
   		        <TextView android:id="@+id/localizacao"
   		            android:text="@string/nao_atribuido"
   		            android:layout_width="wrap_content"
   		            android:layout_height="wrap_content"/>
   		    </LinearLayout>
   		</LinearLayout>
	</TableRow>
</TableLayout>

… além dos arquivos opcao.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
	<item android:id="@+id/adicionar"
	    android:title="@string/adicionar"
	    android:icon="@drawable/adicionar"/>
	<item android:id="@+id/prefs"
	    android:title="@string/configuracoes"
	    android:icon="@drawable/menu_preferencias"/>
</menu>

e opcao_detalhes.xml, da pasta menu

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
	<item android:id="@+id/twitter"
	    android:title="@string/timeline_twitter"
	    android:icon="@drawable/twitter"/>
	<item android:id="@+id/localizacao"
	    android:title="@string/salvar_localizacao"
	    android:icon="@drawable/gps"/>
	<item android:id="@+id/mapa"
	    android:title="@string/exibir_mapa"
	    android:icon="@drawable/mapa"/>
</menu>

Nas nossas classes, também temos alguns trechos que precisam ser adaptados. Primeiramente na classe FormularioDetalhes

Toast.makeText(FormularioDetalhes.this, getString(R.string.descartado), Toast.LENGTH_SHORT);
Toast.makeText(this, getString(R.string.sem_internet), Toast.LENGTH_LONG).show();
Toast.makeText(FormularioDetalhes.this, getString(R.string.local_salvo), Toast.LENGTH_LONG);

… na classe PreferenciaHorario

setPositiveButtonText(getContext().getString(R.string.definir));
setNegativeButtonText(getContext().getString(R.string.cancelar));

… na classe ReceptorAlarme

Notification nota = new Notification(R.drawable.notificacao, context.getString(R.string.hora_do_almoco), System.currentTimeMillis());
nota.setLatestEventInfo(context, context.getString(R.string.app_name), context.getString(R.string.notificacao), i);

… e na classe TwitterService

Log.e(getString(R.string.app_name), getString(R.string.erro_timeline), ex);
Log.w(getString(R.string.app_name), getString(R.string.erro_activity), ex);

Caso a aplicação seja executada agora, ela deve rodar normalmente como rodava antes. Agora, vamos criar os arquivos relativos ao novo idioma. Crie um novo diretório no projeto chamado values-es na pasta res. Dentro dele, teremos 2 arquivos XML, arrays.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
	<string-array name="nomes_ordenacao">
	    <item>Por Nombre, Ascendente</item>
	    <item>Por Nombre, Descendente</item>
	    <item>Por Tipo</item>
	    <item>Por Dirección, Ascendente</item>
	    <item>Por Dirección, Descendente</item>
	</string-array>
	<string-array name="opcoes_ordenacao">
	    <item>nome ASC</item>
	    <item>nome DESC</item>
	    <item>tipo, nome ASC</item>
	    <item>endereco ASC</item>
	    <item>endereco DESC</item>
	</string-array>
</resources>

e strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello World, ListaRestaurantes!</string>
    <string name="app_name">Lista de Restaurantes</string>
    <string name="nome">Nombre:</string>
    <string name="endereco">Dirección:</string>
	<string name="tipo">Tipo:</string>
	<string name="rodizio">Rotación</string>
	<string name="fast_food">Comida Rápida</string>
	<string name="a_domicilio">Ubicación</string>
	<string name="localizacao">Posición </string>
	<string name="nao_atribuido">(sin asignar)</string>
	<string name="anotacoes">Anotaciones</string>
	<string name="conta_twitter">Cuenta de Twitter</string>
	<string name="hora_do_almoco">La Hora del Almuerzo!</string>
	<string name="descartado">Tirado.</string>
	<string name="sem_internet">Conexión com la Internet no está disponible</string>
	<string name="local_salvo">Posición salva</string>
	<string name="definir">Definir</string>
	<string name="cancelar">Cancelar</string>
	<string name="notificacao">La Hora del Almuerzo! ¿Tienes hambre?</string>
	<string name="erro_timeline">Error de Línea de Tiempo de Twitter</string>
	<string name="erro_activity">Erros al enviar datos a la Activity</string>
	<string name="timeline_twitter">Línea de Tiempo de Twitter</string>
	<string name="salvar_localizacao">Guardar Posición</string>
	<string name="exibir_mapa">Ver Mapa</string>
	<string name="adicionar">Añadir</string>
	<string name="configuracoes">Ajustes</string>
	<string name="modo_listagem">Modo de Lista</string>
	<string name="modo_listagem_desc">Elija el modo de lista que se utiliza</string>
	<string name="modo_listagem_titulo">Elija el modo de lista</string>
	<string name="alarme">Reproducir Alarma en el Almuerzo</string>
	<string name="alarme_desc">Selecciona se desea recibir información sobre la hora del almuerzo</string>
	<string name="alarme_hora">La Hora del Almuerzo</string>
	<string name="alarme_hora_desc">Ajuste el tiempo deseado para el alarma</string>
	<string name="notificacao_titulo">Habilitar Notificación</string>
	<string name="notificacao_desc">Seleccione si desea un icono en la barra de estado o borrar la notificación en pantalla completa</string>
</resources>

E pronto! Para ver seu aplicativo no idioma espanhol, siga até o menu principal, Settings -> Language & keyboard -> Select language e selecione Español.

Como de costume, pra baixar o aplicativo, basta clicar aqui.

Até a próxima!

Deixe uma resposta