Configurar locale en el terminal

Introducción

La librería gettext permite traducir un programa a muchas configuraciones del usuario: lenguajes, países y juegos de caracteres. Este truco revisa cómo configurar nuestro Mac usando la herramienta locale.

Un poco de programación

La librería gettext permite internacionalizar el código fuente de nuestros programas. Para ello, sentencias como esta:

printf("Hello %s.\n", name);

Deben de indicar el texto a internacionalizar usando el macro _():

printf(_("Hello %s.\n"), name);

El comando xgettext permite extraer estas cadenas en fichero .pot. el traductor traduce las cadenas del fichero .pot a distintos idiomas, y nos entrega el fichero renombrado a la extensión .po

El programador usar msgfmt para compilar el fichero .po para generar un fichero .mo. el fichero .mo se distribuye junto con el programa, y es la forma de que el programa pueda mostrar mensajes en el la configuración del usuario.

Nombres locale

La librería gettext la usan la mayoría de las aplicaciones GNU, y especialmente las de terminal. Para que un programa de terminal muestre mensajes adaptados a la configuración de usuario, es necesario que este configure locale. A Continuación vamos a ver cómo se haría.

Para empezar podemos consultar nuestra configuración actual:

$ locale
LANG=
LC_COLLATE="C"
LC_CTYPE="C"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL=

El valor "C" en las variables de configuración de locale indica que se use el valor hardcoded (por defecto) con el que se compiló el programa. Se llama "C" porque la mayoría de los programas están escritos en lenguaje C.

Además del valor "C", las variables de configuración de locale pueden tomar valores de la forma "en_US" donde las 2 primeras letras indican el idioma y las 2 segundas el país. Por ejemplo, para español de España se usaría "es_ES".

El valor de las variables de configuración también pueden incluir opcionalmente el juego de caracteres a usar. Por ejemplo, "es_ES.UTF-8" indica que queremos usar el juego de caracteres UTF-8.

Podemos obtener un listado de todos los posibles valores locale con el comando:

$ locale -a

Variables de entorno locale

La librería gettext consulta las variables de configuración en este orden:

  1. LANG
  2. LC_xxx, (LC_CTYPE, LC_NUMERIC, LC_TIME, LC_COLLATE, LC_MONETARY, LC_MESSAGES, ...)
  3. LC_ALL
  4. LANGUAGE

Por ejemplo, si LANG tiene un valor asignado, ya no consulta las demás. Sino consulta LC_xxx, etc.

El usuario sólo debería de configurar en su script de arranque (p.e. .profile) las variables de tipo LC_xxx. LC_ALL se reserva para scripts como configure o autoconf con el fin de sobrescribir la configuración del usuario.

LC_MESSAGES indica el lenguaje para los mensajes. Por ejemplo:

$ LC_MESSAGES="en_US" bison
bison: missing operand after `bison'
Try `bison --help' for more information.

$ LC_MESSAGES="es_ES" bison
bison: falta un operando después de `bison'
Pruebe `bison --help' para más información.

LC_CTYPE indica la configuraciones para funciones C como tolower(), toupper() and isalpha(), etc. LC_COLLATE se usa para indicar la configuración para ordenar caracteres. Por ejemplo, el siguiente comando muestra el path de los ficheros usando LC_CTYPE=C:

$ svn status
? content/files/Parc_Gu?\204?\136ell.jpg

Vemos que el nombre del fichero no representa bien símbolos UTF-8. Para resolverlo podemos hacer:

$ export LC_CTYPE=UTF-8
$ svn status
? content/files/Parc_Güell.jpg

El propósito de otras variables como LC_NUMERIC, LC_TIME, LC_MONETARY es más evidente.

Bibliografía

GNU gettext
Wikipedia gettext