miércoles, 7 de diciembre de 2011

Internacionalizacion en asp.net con gettext

Desde hace algún tiempo que estoy buscando una forma de usar gettext en mis proyectos asp.net para soportar internacionalización también abreviada como i18n ¿por qué?, hay muchas razones pero las principales para mi son:
1. Es software libre.
2. Hay muy buenas herramientas tanto para GNU/Linux como para otros OS.
3. Es muy popular y muchos proyectos lo usan, lo cual hace más simple que los traductores puedan ayudar con los muchos lenguajes que yo no domino.
4. Es mucho más simple que la forma soportada por asp.net.

Ya tengo un proyecto asp.net creado en github, así que lo usaré para los ejemplos.

Estoy basandome en este artículo publicado por Jason Kester.

A continuación los pasos a seguir:

1. Agregar gettext al proyecto. Para esto descargamos la librería FairlyLocal y colocamos los dll en algún lugar accesible para nuestra aplicación y copiamos las clases de ejemplo Internationalization, Localization y Message dentro del proyecto.

2. Creamos una interfaz que define el helper para soportar i18n (esta interfaz y su implementación están basadas en los ejemplos de la librería FairyLocal):


3. Ahora modificamos la interfaz IPage, de mi post anterior, para poder insertar el recurso de i18n:


4.Mediante inyección de dependencias (DI por sus siglas en ingles) proveemos un helper que manejará la lógica de acceso gettext. La forma como implementé la DI la explico en un post anterior. Esto significa que debemos modificar la clase SimpleInjectorPageHandlerFactory.

5. Modificamos nuestra aplicación para que use la función "_" donde haga falta.


6. Y el ultimo paso es agregar un script de post construcción (post-build) para que gestione la creación de los archivos .po (a menos claro que prefieran hacerlo manualmente).
Aqui cabe señalar que existen dos tipos de aplicación web en asp.net, a saber: WSP (web site project) y WAP (web application project); más aquí. Esto es importante porque solo en los WAP existe la posibilidad de crear post-build scripts, pero si tenemos una aplicación WSP lo que debemos hacer es crear un proyecto extra y agregarlo a la solución, por simplicidad recomiendo que sea una librería pero cualquier tipo de proyecto que soporte este tipo de scripts funciona.
A continuación les dejo mi script


Cabe señalar que este post-build script tiene que incluir todos los tipos de archivos fuente que nuestro proyecto tiene para que pueda crear correctamente todas las cadenas que requieren una traducción.

Lo que sigue es traducir o solicitar a nuestros amigos, colegas, traductores pagados, etc que nos den una mano.

Hasta la próxima.