Recursos en Android e internacionalización

guia-basica-programacion-android-5

Los recursos son una parte fundamental en una aplicación Android. Siempre que sea posible los separaremos del código, de ese modo conseguiremos una aplicación más mantenible. Si los organizamos bien, Android también se encargará de elegir por nosotros el elemento adecuado dependiendo de la configuración -típicamente, del tamaño de pantalla y del idioma del usuario-.

Recursos básicos: imágenes y textos

Los textos siempre han de separarse del código. Si no lo hacemos, nos costará más mantener el código: habría que revisar todas las ocurrencias y se nos podría olvidar alguna cada vez que tengamos que hacer cambios. Lo peor de todo es que entonces nuestra aplicación no será internacionalizable.

Por eso, en el código no se recomienda poner textos. La única excepción podrían ser mensajes no destinados al usuario final, como mensajes de salida de consola. Pero en general, todos nuestros textos tendrán que ir a un fichero de recursos separado. Ese fichero lo llamaremos strings.xml, y su ruta completa dentro del proyecto será res/values/strings.xml.

Un fichero strings.xml tendrá un contenido similar a éste:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="string_1">text_1</string>
    <string name="string_2">text_2</string>
</resources>

Ahora, en nuestro código podremos recuperar estos textos con sentencias como getResources().getString(R.string.string_1), o dentro de nuestros layouts como @string/string_1 . De este modo hemos conseguido lo que queríamos: el código pasa a ser independiente de los recursos.

El otro recurso que utilizaremos habitualmente serán las imágenes. Para ello tenemos dentro del proyecto varias carpetas, como res/drawable, res/drawable-hdpi, res/drawable-xhdpi, y similares.

Los sufijos que siguen a “drawable” se refieren a la densidad de la pantalla. Cada dispositivo Android tiene una densidad de píxeles por pantalla que se agrupa en varios grupos:

  • ldpi (pequeña, x0,75)
  • mdpi (media x1)
  • hdpi (grande x1,5)
  • xhdpi (extra grande x2)
  • xxhdpi (extra extra grande x3)

De este modo, la misma imagen puede adaptarse a diferentes densidades de pantalla sin que aparezcan deformidades. Se recomienda que en cada carpeta haya una copia de la imagen, respetando las proporciones (tomando mdpi como la base e igual a 1), aunque también se puede utilizar solamente una de ellas y entonces Android hará automáticamente una operación de reescalado para las demás resoluciones. Sin embargo, se recomienda cubrir todas las carpetas para ahorrar al sistema este esfuerzo extra.

La carpeta “drawable” a secas no contendrá imágenes, la utilizaremos solamente para definiciones xml de elementos avanzados, como los selectores.

Otros recursos

Dentro del directorio /res del proyecto pueden ir muchos más recursos. Sonidos, definiciones de colores usables de una forma similar a los textos, dimensiones para nuestra aplicación, estilos para nuestras vistas, y mucho más.

Para quien esté interesado en aprender más sobre estos recursos, puede consultar la documentación oficial de Android.

Internacionalización en Android

Con las imágenes ya hemos hecho una introducción al sistema de recursos alternativos en Android: si tenemos una pantalla de densidad xhdpi (la de un Galaxy S3, por ejemplo), Android preferirá las imágenes del directorio drawable-xhdpi sobre las demás.

Ese sistema se puede utilizar para distinguir muchas otras configuraciones: orientación normal o apaisada, modo en conducción o normal, modo nocturno o normal… De nuevo, os recomendamos la documentación oficial de Android para conocer todos los detalles. Ya hemos hablado de cómo proporcionar imágenes según la densidad de la pantalla, ahora nos centraremos en otro uso muy importante para nuestra aplicación: la internacionalización.

Si queremos que nuestros textos estén disponibles en varios idiomas, tendremos que añadir una carpeta diferente para cada copia del fichero strings.xml. De este modo, si queremos portar nuestra aplicación a inglés y francés, tendríamos estos tres directorios:

  • res/values (valores por defecto)
  • res/values-en
  • res/values-fr

Es decir, a la carpeta se le añade un sufijo con el código ISO del idioma concreto, y dejaremos los textos por defecto en la carpeta sin sufijo. Esto último es muy importante, porque salvo con las densidades de la pantalla, siempre tenemos que dar un valor por defecto para todos los recursos. Cuando requerimos un recurso del tipo que sea, Android buscará el que mejor encaje, y si no encuentra ninguno podemos encontrarnos con cierres inesperados de la aplicación. Por eso siempre debe haber un idioma que elijamos por defecto, y que todos los recursos tengan su valor por defecto.

De este modo, volvemos a conseguir lo que queríamos: además de haber separado los textos del código, ahora podemos tener la aplicación en diferentes idiomas sin tocar para nada nuestro código.

El sistema de generar recursos alternativos es, por supuesto, combinable. Siguiendo el enlace que hemos indicado antes, veremos en qué orden tienen que ir los sufijos. Si seguimos el ejemplo sencillo que estamos indicando en este tutorial, podríamos pensar en tener imágenes que sólo sean para la versión en inglés. Esto se consigue creando una carpeta res/drawable-en-xhdpi, o cualquier otra densidad de pantalla que necesitemos. De ese modo podemos proveer una gran variedad de recursos y no tener que preocuparnos por elegir el correcto. Eso sí: sin olvidar que la densidad de pantalla es el único modificador que no necesita valores por defecto. Todos los demás necesitan un valor por defecto o nos arriesgamos a que la aplicación se nos pare.

Ofertas en móviles y smartwatches
¿Buscas móvil nuevo o un smartwatch? No te pierdas estas ofertas! Podrás escoger tu móvil según el precio, tamaño de pantalla o marca para que escojas el que mejor se adapta a tus necesidades.
Móviles libres de ofertaSmartwatches

¿Tienes Telegram? Recibe cada día las noticias de Android

Suscríbete

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *