Tuesday, August 30

Localización de textos en J2ME

Reproduzco el código de la semana que se ha publicado en el foro de Stratos:


Os presento una clase muy simple para recuperar cadenas de texto localizadas en J2ME. Permite seleccionar el idioma en el que queremos presentar los textos, usando por defecto la localización del dispositivo.

Antes de usar la clase, debemos colocar un fichero de texto para cada idioma que queremos soportar. Este sería un ejemplo para el idioma español:

menu.main.newgame = Nuevo juego
menu.main.options = Opciones
menu.main.help = Ayuda
menu.main.exit = Salir
ingame.lives = Vidas
ingame.energy = Energia

Este fichero lo llamariamos "es-ES.txt" y lo colocaríamos en un directorio llamado "i18n" dentro de los recursos de la aplicación. Si vamos a soportar español, inglés y alemán, tendríamos la siguiente estructura:

i18n/es-ES.txt
i18n/en-UK.txt
i18n/de-DE.txt

La notación de los nombres de ficheros viene dada por los códigos de idioma y país.

Ejemplo de uso

En el siguiente ejemplo, mostraríamos tres cadenas localizadas en el idioma por defecto del teléfono, en el caso de lo hayamos soportado. En otro caso, usaría la localización "en-UK" por defecto. Luego seleccionamos manualmente el idioma alemán-Alemania y volvemos a mostrar las tres cadenas:

Locale locale = new Locale();

System.out.println( "New game = " + locale.getString( "menu.main.newgame" ) );
System.out.println( "Options = " + locale.getString( "menu.main.options" ) );
System.out.println( "Lives = " + locale.getString( "ingame.lives" ) );

locale.setLocale( "de-DE" );

System.out.println( "\nNew game = " + locale.getString( "menu.main.newgame" ) );
System.out.println( "Options = " + locale.getString( "menu.main.options" ) );
System.out.println( "Lives = " + locale.getString( "ingame.lives" ) );


Podeis descargar un MIDLet de ejemplo desde este enlace. Debereis ejecutarlo en un emulador ya que imprime la salida por la consola.


Notas y posibles mejoras


- En caso de que Locale no encuentre ningun fichero, todas las llamadas a getString() devolverán null.

- Locale asume por defecto "UTF-8" como codificación para los ficheros. En el caso de idiomas asiáticos,hay que emplear "UTF-16" ya que cada caracter requiere dos bytes. En ese caso haríamos algo así:

locale.setEncoding( "UTF-16 " );
locale.setLocale( "jp-JP" );

Una mejora deseable sería seleccionar automáticamente la codificación para cada idioma. Otros idiomas que usan UTF-16 son el Polaco, el Finlandés y el Griego(corregidme si me equivoco)

- El código del analizador léxico podría ser reducido y optimizado usando una filosofía más "java".

- En sistemas de producción, suele existir una clase superior que devuelve "objetos" localizados, sean cadenas de texto, imágenes, etc.

Código y minitutorial: Locale.zip (38kb)

No comments: