Internacionalización
Sumario
Introdución
- Tamén temos outras formas de personalizar as nosas aplicacións en base a unha serie de sufixos.
- Se queremos que as cadeas de constantes estean traducidas a varios idiomas, só temos que crear un cartafol novo de nome values-?? onde ?? é o idioma.
- Para o inglés teriamos /res/values-en, /res/values-es para o español,....
- O idioma por defecto será o que estea gardado en /res/values.
- So se deben cambiar os valores das contanstes, os identificadores deben ser os mesmos.
- Referencias:
Caso práctico
- Crear un novo proxecto: U2_41_Internacional
- Imos en /res/values definimos as cadeas de texto en galego e esas mesmas cadeas as definimos en inglés en /res/values-en.
- Para probar a aplicación hai que cambiar o idioma do sistema como se viu na Unidade 1.
strings.xml de /res/values
1 <?xml version="1.0" encoding="utf-8"?>
2 <resources>
3
4 <string name="app_name">U2_41_Internacional</string>
5 <string name="action_settings">Settings</string>
6 <string name="idioma">Esta aplicación, por defecto, está en galego!</string>
7 <string name="boton">Preme aquí</string>
8 <string name="mensaxe_toast">Premeches o botón!</string>
9
10 </resources>
strings.xml de /res/values-en
1 <?xml version="1.0" encoding="utf-8"?>
2 <resources>
3
4 <string name="app_name">U2_41_Internacional</string>
5 <string name="action_settings">Settings</string>
6 <string name="idioma">This app is by default in galician language!</string>
7 <string name="boton">Click here</string>
8 <string name="mensaxe_toast">You have clicked on the button!</string>
9
10 </resources>
O XML do layout
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 xmlns:tools="http://schemas.android.com/tools"
3 android:layout_width="match_parent"
4 android:layout_height="match_parent"
5 android:orientation="vertical" >
6
7 <TextView
8 android:layout_width="wrap_content"
9 android:layout_height="wrap_content"
10 android:text="@string/idioma" />
11
12 <Button
13 android:layout_width="wrap_content"
14 android:layout_height="wrap_content"
15 android:text="@string/boton"
16 android:onClick="onBotonClick" />
17
18
19 </LinearLayout>
- Liñas 10 e 15: Agora temos que traballar con constantes, non podemos poñer o texto a lume.
O código Java
1 package com.example.u2_41_internacional;
2
3 import android.app.Activity;
4 import android.os.Bundle;
5 import android.view.Menu;
6 import android.view.View;
7 import android.widget.Toast;
8
9 public class U2_41_Internacional extends Activity {
10
11 @Override
12 protected void onCreate(Bundle savedInstanceState) {
13 super.onCreate(savedInstanceState);
14 setContentView(R.layout.activity_u2_41__internacional);
15 }
16
17 @Override
18 public boolean onCreateOptionsMenu(Menu menu) {
19 // Inflate the menu; this adds items to the action bar if it is present.
20 getMenuInflater().inflate(R.menu.u2_41__internacional, menu);
21 return true;
22 }
23
24 public void onBotonClick(View v) {
25 Toast.makeText(this, R.string.mensaxe_toast, Toast.LENGTH_SHORT).show();
26 }
27 }
- Liña 25 observar como o toast tamén colle a cadea de texto dos recursos tipo string.
Consideracións a ter en conta
- Cando queiramos empregar un texto cunha función que non acepte un recurso da clase R de tipo R.string.nome_recurso, deberemos facer uso da función getResources().getString("R.string.nome_recurso") a cal devolvería unha cadea (String) no idioma adecuado.
- A través desta función (getResources()) podemos recuperar, chamando a diferentes métodos, todo tipo de recurso gardado en /res/.
- Nota Tamén se podería empregar directamente a función getString("R.string.nome_recurso").
- Máis información na sección da Wiki de Acceso a Recursos
- Nota: Lembra que ata o de agora as Acitivities creadas teñen un label 'posto a man' por nos no arquivo AndroidManifiest.xml.
- Deberían ir referenciadas nun arquivo externo de tipo 'values' => 'string'. Lembra cambialo no teu proxecto (soamente debería levar etiqueta a nivel de proxecto, non de activity).
Estes sufixos que estamos a utilizar (-land; -es) poden ser combinados entre eles e con outros moitos diferentes.
No seguinte enlace aparece dita orde de prefixos.
Por exemplo:
- res/values-en-rUS/strings.xml
- res/values-en-rUK/strings.xml
Onde o segundo sufixo fai referencia a inglés ‘americano’ (en-rUS) ou ‘ inglés’ do Reino Unido (en-rUK).
Nota: a letra r fai referencia á rexión.
Para facilitarnos o traballo, Android Studio dispón dunha pantalla na que podemos indicar que 'características' queremos que teña o noso arquivo de recursos e automaticamente xa engade por nós os sufixos necesarios.
Neste exemplo estamos a crear un recurso de tipo layout para pantallas de 7-10 pulgadas (tamaño x-large), entón teríamos que crear un layout nun cartafol ‘layout-xlarge’. Ó facelo, podedes observar como na parte baixa aparece o nome co sufixo correcto. Ademais crearase un cartafol físico có dito sufixo.
Podemos combinar varias propiedades no mesmo arquivo. No exemplo, soamente se cargarán as entradas definidas no arquivo xml cando o dispositivo sexa x-large, o idioma estea configurado como español y o dispositivo teña unha orientación horizontal. Fixarse que o sufixo (e por tanto o cartafol a nivel de S.O.) será: -es-xlarge-land
- Na versión Lollipop (API 21, android 5.0) xa se inclúe o idioma galego.
- Tamén temos a opción de crear estes arquivos de idiomas directamente nun Editor.
- A través desta ferramenta podemos editar calquera arquivo en /res/values e asociarlle diferentes idiomas graficamente e introducir a súa tradución:
Unha vez engadido o idioma aparecerá unha nova columna para cada unha das entradas do arquivo. Crearase o arquivo no cartafol do idioma engadido e poderemos indicar si algunha das entradas non ten tradución (opción Untranslatable) có que indicaremos que dita entrada collerá o valor do arquivo default en calquera idioma que esteamos.
Enlace a la página principal de la UD2
Enlace a la página principal del curso
-- Ángel D. Fernández González e Carlos Carrión Álvarez -- (2015).