[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [mindfood] Patrones / buenas prácticas en aplicaciones multi-idioma



Hola,

Yo te recomendaría no utilizar una base de datos relacional para
almacenar los textos. No sólo por su idoneidad práctica, sino porque en
mi opinión la capacidad de la aplicación de adaptar su interfaz está
estrechamente ligada a la vista (V), no al modelo (M) o a los datos
(dependiendo de cómo se interprete M).
Por ese motivo yo te sugeriría que usaras nombres "normalizados" para
indicar un texto susceptible de ser visualizado en múltiples idiomas, y
utilizar ese valor como clave de búsqueda a nivel de vista.
Es decir, si tienes la entidad "pollo", y un atributo enumerado
"tamaño", con valores "muy pequeño", "pequeño", "mediano" y "grande",
utilizaría un modelo físico compuesto por la tabla "chicken", y una
columna "size", que guardaría valores (o la foreign key correspondiente
si se normaliza) tales como "very.small", "small", "regular", "large".
(la razón por la que usar inglés es, entre otras razones, la de no tener
que preocuparse por caracteres no ascii).
Esos valores serían los que tendrían los atributos de los beans.
A nivel de vista, si utilizas Struts, tienes dos alternativas:
1) Utilizar un "bundle" global para toda la aplicación.
2) Utilizar varios "bundles" más pequeños, particulares para cada vista
(o simplemente con contenido dividido por algún otro criterio).

En la opción 1), ChickenApp_en.properties podría tener algo así como:
chicken.attributes.very.small=very small
..
chicken.attributes.large=large
mientras que ChickenApp_es.properties:
chicken.attributes.very.small=muy pequeño // o bien sin escapar
..
chicken.attributes.large=grande

La opción 1) requiere indicar en struts-config.xml el nombre del
"bundle", en este caso ChickenApp, y preferiblemente también en el
web.xml.
La otra opción sería cuestión de hacer una pequeña modificación en el
tag "bean" de Struts, de forma que admita un atributo adicional (p.ej.
"view"), indicando el bundle específico. Tiene la ventaja de que evita
los prefijos para resolver conflictos, pudiendo usar directamente, en
una vista concreta, Chicken_en.properties:
very.small=small
..

Si te interesa la opción 2), te puedo pasar el taglib correspondiente.

Aparte de la vista, el resto de la aplicación debe asegurarse de
trabajar con los valores "normalizados", por lo que si tienes un combo
con textos en castellano, no son éstos los valores que debe recibir la
aplicación, sino los que se usaron en la traducción. Los "bundles", por
así decirlo, son unidireccionales...

Un saludo,
Jose.