viernes, 2 de diciembre de 2011

Convenciones para los literales en archivos .properties en Java


Java
La internacionalización (i18n) y la localización (i10n) en las aplicaciones Java ya sean de escritorio o aplicaciones web se suelen hacer a través de archivos .properties obtenidos a partir de la clase ResourceBundle que contienen los literales para cada uno de los idiomas que soporta la aplicación, a cada literal se le asocia una clave que será el medio por el cual se identificará a la hora de recuperarlos.

Un extracto de un archivo típico suele tener el siguiente aspecto:

...
#Combos
comboDepartamentos=Todos los departamentos
comboAreas=Todas las áreas
comboRepositorios=Todos los repositorios
comboAplicaciones=Todas las aplicaciones
comboModulos=Todos los módulos
comboProgramas=Todos los programas
...
#Mantenimiento de Repositorios
mr.aceptar=Aceptar
mr.buscar=Buscar
mr.cancelar=Cancelar
mr.confirmarEliminar=Los repositorios seleccionados pueden tener información relacionada que será eliminada en cascada. ¿Desea eliminar los repositorios seleccionados y la información relacionada?
mr.registroEliminado=El registro ha sido eliminado por otro usuario.
mr.validacion.nombreExiste=Existe otro repositorio con el mismo nombre.
...
#Mantenimiento de Aplicaciones
ma.aceptar=Aceptar
ma.buscar=Buscar
ma.cancelar=Cancelar
...
#Mantenimiento de Módulos
mm.aceptar=Aceptar
mm.buscar=Buscar
mm.confirmarEliminar=Los módulos seleccionados pueden tener información relacionada que será eliminada en cascada. ¿Desea eliminar los módulos seleccionados y la información relacionada?
...

Como se puede observar las claves de los literales de cada pantalla están identificados por un prefijo (mr, ma, mm) con el objetivo de agrupar los de cada pantalla, algunos no tienen prefijo como los de la sección #Combos. A los literales muy largos como mr.confirmarEliminar y mm.confirmarEliminar se les asigna una clave más corta que el propio literal y que tendremos que asignar para identificarlo.

Estas convenciones tienen algunos problemas. Uno de ellos es que hay literales que son muy comunes en la aplicación y estarán varias veces repetidos como Aceptar, Buscar, Cancelar lo que implica que los traductores tendrán que tarducirlo varias veces y a los programadores mantener mayor número de literales, además de ralentizar el trabajo ¿tiene sentido pedir a los traductores traducir el mismo literal varias veces? No. Los literales largos como mr.confirmarEliminar y mm.confirmarEliminar tienen el problema de que sus claves son poco representativas de su literal siendo vistos en el archivo de código fuente donde se use, lo que hace que leerlo sea poco significativo y representativo de los textos que luego se muestran.

Para solventar estos problemas y después de varios años de experiencia trabajando con archivos de literales en Java prefiero seguir otras convenciones. Según estas los archivos tendrían el siguiente aspecto:

...
Aceptar=Aceptar
Buscar=Buscar
Cancelar=Cancelar
...
El_registro_ha_sido_eliminado_por_=El registro ha sido eliminado por otro usuario.
Existe_otro_repositorio_con_=Existe otro repositorio con el mismo nombre.
Los_repositorios_seleccionados_pueden_tener_información_relacionada_=Los repositorios seleccionados pueden tener información relacionada que será eliminada en cascada. ¿Desea eliminar los repositorios seleccionados y la información relacionada?
...
Los_módulos_seleccionados_pueden_tener_información_relacionada_=Los módulos seleccionados pueden tener información relacionada que será eliminada en cascada. ¿Desea eliminar los módulos seleccionados y la información relacionada?
...
#Combos
Todas_las_aplicaciones=Todas las aplicaciones
Todas_las_areas=Todas las áreas
Todos_los_departamentos=Todos los departamentos
Todos_los_modulos=Todos los módulos
Todos_los_programas=Todos los programas
Todos_los_repositorios=Todos los repositorios
...

Como se puede ver para los literales cortos la clave será el propio literal en nuestro idioma nativo sin ñ o tildes, con esto al leer el archivo de código fuente sabremos cual es el texto exacto que se mostrará y no tendremos que estar inventándonos constantemente identificadores para los literales. Los literales cortos pero formados por varias palabras tendrán un «_» para representar el espacio. Las claves de los literales largos son el literal acortado con suficientes palabras para que no se repitan, les añado un «_» al final para saber que se ha acortado, el objetivo de acortarlo es que con unas cuantas palabras ya podemos hacernos una idea del texto que se muestra. Además los literales están ordenados alfabéticamente por la clave para encontrarlos más fácilmente. No digo que estas reglas no puedan tener excepciones para algunos casos pero siguiéndolas para la mayoría evitaremos que según vaya pasando el tiempo estos archivos se conviertan en un problema de mantenimiento, cuando en una aplicación tenemos 2000 o más literales, créeme, puede llegar a serlo.