Agregando locales en Debian
Cuando jugamos con archivos .po y .mo en un proyecto web para dar soporte a distintos idiomas tenemos dependencia de las polémicas locales de cada sistema. Vamos a intentar solucionarlo.
En Debian -y en cualquier distribución desde que se sabe hacer- es sencillo, con el comando locale podemos saber las locales que tenemos instaladas:
# locale -a
C
POSIX
eS_ES.utf8
Pero nosotros queremos modificar esa lista, agregar nuevas locales o eliminar las que no se vayan a usar.
Agregando locales nuevas
Si queremos agregar soporte para otro idioma sería tan sencillo como decirle al sistema lo que tiene que hacer con locale-gen y actualizar la base de datos dpkg-reconfigure:
# locale-gen de_DE.UTF-8
# locale-gen it_IT.UTF-8
# locale-gen fr_FR.UTF-8
# locale-gen pt_PT.UTF-8
# dpkg-reconfigure locales
Comprobemos que todo está correcto listando las nuevas locales con el comando que hemos mencionado anteriormente:
# locale -a
C
POSIX
eS_ES.utf8
de_DE.UTF-8
it_IT.UTF-8
fr_FR.UTF-8
pt_PT.UTF-8
Eliminando locales inútiles
Para borrar locales que hemos agregado por error el proceso es algo distinto, tan solo debemos ir al directorio /var/lib/locales/supported.d/ y editar los ficheros necesarios hasta quedarnos solo con lo adecuado, por ejemplo:
# cd /var/lib/locales/supported.d/
# ls
en es local
# cat en
en_GB.UTF-8 UTF-8
# cat es
es_ES.UTF-8 UTF-8
# cat local
es_ES.UTF-8 UTF-8
de_DE.UTF-8 UTF-8
it_IT.UTF-8 UTF-8
fr_FR.UTF-8 UTF-8
pt_PT.UTF-8 UTF-8
Teóricamente todas las modificaciones que hagamos con locale-gen se van a escribir en el fichero local, con lo que es más que probable que sea el único archivo que vamos a toquetear.
Si en local tuviéramos otras locales que no queremos, pongamos por caso que deseamos eliminar el portugués, con eliminar esa linea y volver a reconstruir la base de datos (dpkg-reconfigure) sería suficiente.
Soporte en PHP
Recordemos el código fuente que le corresponde en PHP para cargar el idioma que acabamos de agregar (dependdiente de gettext()):
$locale=\"de_DE.UTF-8\";
putenv(\"LANG=$locale\");
setlocale(LC_ALL, $locale);
setlocale(LC_NUMERIC,\'C\');
bindtextdomain(\'archivo-mo\', \'dir/de/idiomas/\');
textdomain(\'archivo-mo\');
Nota: Muy importante el correcto uso de las mayúsculas en todos los comandos, tanto para agregar las locales con locale-gen como para cargarlas en PHP.
Entradas y enlaces relacionados
- http://www.userlinux.net/1370_jugando_con_archivos_de_idioma_po_y_mo.html
- http://www.albertlanchas.com/articulos/internacionalizacion-php-gettext
- http://www.oreillynet.com/pub/a/php/2002/06/13/php.html
- http://code.google.com/p/winelocale/wiki/AddLocalesToDebian
- http://www.sourcerally.net/regin/49-How-to-get-PHP-and-gettext-working-(ubuntu,-debian)