107.3 Lección 1
Certificación: |
LPIC-1 |
---|---|
Versión: |
5.0 |
Tema: |
107 Tareas administrativas |
Objetivo: |
107.3 Localización e internacionalización |
Lección: |
1 de 1 |
Introducción
Todas las principales distribuciones de Linux pueden ser configuradas para utilizar ajustes de localización personalizados. Estos ajustes incluyen definiciones relacionadas con la región y el idioma, como la zona horaria, el idioma de la interfaz, así como la codificación de caracteres que pueden ser modificados durante la instalación del sistema operativo o en cualquier momento posterior.
Las aplicaciones se basan en variables de entorno, archivos de configuración del sistema y comandos para seleccionar la hora y el idioma adecuados; por lo tanto, la mayoría de las distribuciones comparten una forma estandarizada de ajustar la hora y los ajustes de localización. Estos ajustes son importantes no sólo para mejorar la experiencia del usuario, sino también para asegurar que la hora de los eventos importantes del sistema se calcule correctamente, por ejemplo, informar sobre temas relacionados con la seguridad .
Para poder representar cualquier texto escrito, independientemente del idioma hablado, los sistemas operativos modernos necesitan una referencia estándar de codificación de caracteres, y los sistemas Linux no son la excepción. Como las computadoras sólo pueden tratar con números, un caracter de texto no es más que un número asociado a un símbolo gráfico. Distintas plataformas informáticas pueden asociar valores numéricos distintos al mismo caracter, por lo que se necesita una norma de codificación de caracteres común para que sean compatibles. Un documento de texto creado en un sistema sólo será legible en otro sistema si ambos coinciden en el formato de codificación y en qué número se asocia a qué carácter, o al menos si saben cómo convertirlo entre las dos normas.
La naturaleza heterogénea de los ajustes de localización en los sistemas basados en Linux da lugar a sutiles diferencias entre las distribuciones. A pesar de estas diferencias, todas las distribuciones comparten las mismas herramientas y conceptos básicos para configurar los aspectos de internacionalización de un sistema.
Zonas horarias
Las zonas horarias son bandas discretas de la superficie de la Tierra que abarcan el equivalente a una hora, es decir, regiones del mundo que experimentan la misma hora del día en un momento dado. Como no hay una sola longitud que pueda considerarse como el comienzo del día para todo el mundo, las zonas horarias son relativas al meridiano principal, donde el ángulo de longitud de la Tierra se define como 0. La hora en el meridiano principal se denomina Hora Universal Coordinada, por convención abreviada como UTC. Por razones prácticas, los husos horarios no siguen la distancia longitudinal exacta del punto de referencia (el meridiano principal). En su lugar, los husos horarios se adaptan artificialmente para seguir las fronteras de los países u otras subdivisiones importantes.
Las subdivisiones políticas son tan relevantes que las zonas horarias reciben el nombre de algún agente geográfico importante de esa zona en particular, normalmente basado en el nombre de un gran país o ciudad dentro de la zona. Sin embargo, los husos horarios se dividen según su desfase horario en relación con el UTC y este desfase también puede utilizarse para indicar la zona en cuestión. La zona horaria GMT-5, por ejemplo, indica una región cuya hora UTC está cinco horas adelantada, es decir, esa región está cinco horas atrasada respecto de la UTC. Asimismo, el huso horario GMT+3 indica una región para la cual la hora UTC está tres horas por detrás. El término GMT - de Greenwich Mean Time - se utiliza como sinónimo de UTC en los nombres de las zonas basadas en la compensación.
Se puede acceder a una máquina conectada desde diferentes partes del mundo, por lo que es una buena práctica ajustar el reloj del hardware a UTC (la zona horaria GMT+0) y dejar la elección de la zona horaria a cada caso particular. Los servicios en la nube, por ejemplo, se configuran comúnmente para usar UTC, ya que puede ayudar a mitigar las inconsistencias ocasionales entre la hora local y la hora de los clientes o en otros servidores. Por el contrario, los usuarios que abren una sesión remota en el servidor pueden querer utilizar su zona horaria local. Por lo tanto, dependerá del sistema operativo establecer la zona horaria correcta según cada caso.
Además de la fecha y la hora actuales, el comando date
también imprimirá la zona horaria actualmente configurada:
$ date Mon Oct 21 10:45:21 -03 2019
El desplazamiento relativo al UTC viene dado por el valor -03
, lo que significa que la hora mostrada tiene 3 horas de retraso con respecto a UTC. Por lo tanto, la hora UTC está tres horas por delante, haciendo que GMT-3 sea el huso horario correspondiente a la hora dada. El comando timedatectl
, que está disponible en las distribuciones que utilizan systemd, muestra más detalles sobre la hora y la fecha del sistema:
$ timedatectl Local time: Sat 2019-10-19 17:53:18 -03 Universal time: Sat 2019-10-19 20:53:18 UTC RTC time: Sat 2019-10-19 20:53:18 Time zone: America/Sao_Paulo (-03, -0300) System clock synchronized: yes systemd-timesyncd.service active: yes RTC in local TZ: no
Como se muestra en la entrada Time zone
, los nombres de las zonas horarias basados en localidades - como America/Sao_Paulo
- también se aceptan. La zona horaria por defecto del sistema se mantiene en el archivo /etc/timezone
, ya sea por el nombre descriptivo completo de la zona o por la diferencia de horas. Los nombres genéricos de la zona horaria dados por la diferencia de horas UTC deben incluir Etc
como la primera parte del nombre. Así que para fijar la zona horaria por defecto en GMT+3, el nombre de la zona horaria debe ser Etc/GMT+3
:
$ cat /etc/timezone Etc/GMT+3
Aunque los nombres de las zonas horarias basados en las localidades no requieren el desplazamiento de la hora para funcionar, no es tan sencillo elegirlos. La misma zona puede tener más de un nombre, lo que puede ser difícil de recordar. Para facilitar esto, el comando tzselect
ofrece un método interactivo que guiará al usuario hacia la definición correcta de la zona horaria. El comando tzselect
debería estar disponible por defecto en todas las distribuciones de Linux, ya que lo proporciona el paquete que contiene los programas de utilidades necesarios relacionados con la Biblioteca C de GNU.
El comando tzselect
será útil, por ejemplo, para un usuario que quiera identificar la zona horaria de “São Paulo City” en “Brazil”. El comando tzselect
comienza preguntando por la macro región de la ubicación deseada:
$ tzselect Please identify a location so that time zone rules can be set correctly. Please select a continent, ocean, "coord", or "TZ". 1) Africa 2) Americas 3) Antarctica 4) Asia 5) Atlantic Ocean 6) Australia 7) Europe 8) Indian Ocean 9) Pacific Ocean 10) coord - I want to use geographical coordinates. 11) TZ - I want to specify the time zone using the Posix TZ format. #? 2
La opción 2
es para las regiones de América (Norte y Sur), no necesariamente en la misma zona horaria. También es posible especificar el huso horario con coordenadas geográficas o con la notación de desplazamiento, también conocido como el formato Posix TZ format. El siguiente paso es elegir el país:
Please select a country whose clocks agree with yours. 1) Anguilla 19) Dominican Republic 37) Peru 2) Antigua & Barbuda 20) Ecuador 38) Puerto Rico 3) Argentina 21) El Salvador 39) St Barthelemy 4) Aruba 22) French Guiana 40) St Kitts & Nevis 5) Bahamas 23) Greenland 41) St Lucia 6) Barbados 24) Grenada 42) St Maarten (Dutch) 7) Belize 25) Guadeloupe 43) St Martin (French) 8) Bolivia 26) Guatemala 44) St Pierre & Miquelon 9) Brazil 27) Guyana 45) St Vincent 10) Canada 28) Haiti 46) Suriname 11) Caribbean NL 29) Honduras 47) Trinidad & Tobago 12) Cayman Islands 30) Jamaica 48) Turks & Caicos Is 13) Chile 31) Martinique 49) United States 14) Colombia 32) Mexico 50) Uruguay 15) Costa Rica 33) Montserrat 51) Venezuela 16) Cuba 34) Nicaragua 52) Virgin Islands (UK) 17) Curaçao 35) Panama 53) Virgin Islands (US) 18) Dominica 36) Paraguay #? 9
El territorio de Brasil abarca cuatro zonas horarias, por lo que la información del país por sí sola no es suficiente para establecer la zona horaria. En el siguiente paso, el comando tzselect
requerirá que el usuario especifique la región local:
Please select one of the following time zone regions. 1) Atlantic islands 2) Pará (east); Amapá 3) Brazil (northeast: MA, PI, CE, RN, PB) 4) Pernambuco 5) Tocantins 6) Alagoas, Sergipe 7) Bahia 8) Brazil (southeast: GO, DF, MG, ES, RJ, SP, PR, SC, RS) 9) Mato Grosso do Sul 10) Mato Grosso 11) Pará (west) 12) Rondônia 13) Roraima 14) Amazonas (east) 15) Amazonas (west) 16) Acre #? 8
No están disponibles todos los nombres de las localidades, pero elegir la región más cercana será suficiente. La información dada será utilizada por tzselect
para mostrar la zona horaria correspondiente:
Se ha dado la siguiente información: Brazil Brazil (southeast: GO, DF, MG, ES, RJ, SP, PR, SC, RS) Therefore TZ='America/Sao_Paulo' will be used. Selected time is now: sex out 18 18:47:07 -03 2019. Universal Time is now: sex out 18 21:47:07 UTC 2019. Is the above information OK? 1) Yes 2) No #? 1 You can make this change permanent for yourself by appending the line TZ='America/Sao_Paulo'; export TZ to the file '.profile' in your home directory; then log out and log in again. Here is that TZ value again, this time on standard output so that you can use the /usr/bin/tzselect command in shell scripts: America/Sao_Paulo
El nombre de la zona horaria resultante, America/Sao_Paulo
, también puede ser usado como el contenido del fichero /etc/timezone
para informar la zona horaria por defecto del sistema:
$ cat /etc/timezone America/Sao_Paulo
Como se indica en la salida de tzselect
, la variable de entorno TZ
define la zona horaria de la sesión de shell, sea cual sea la zona horaria (por defecto) del sistema. Añadiendo la línea TZ='America/Sao_Paulo'; export TZ
al archivo ~/.profile
hará que America/Sao_Paulo
sea la zona horaria para las futuras sesiones del usuario. La variable TZ
también puede ser modificada temporalmente durante la sesión actual, para mostrar la hora en una zona horaria diferente:
$ env TZ='Africa/Cairo' date Mon Oct 21 15:45:21 EET 2019
En el ejemplo, env
ejecutará el comando dado en una nueva sesión de sub-shell con las mismas variables de entorno de la sesión actual, excepto la variable TZ
, modificado por el argumento TZ='Africa/Cairo'
.
Horario de verano (Daylight Saving Time)
Muchas regiones adoptan un horario de ahorro de luz diurna (Daylight Saving Time) durante una parte del año — cuando los relojes se ajustan típicamente por una hora — que podría llevar a un sistema mal configurado a reportar la hora equivocada durante esa estación del año.
El archivo /etc/localtime
contiene los datos utilizados por el sistema operativo para ajustar su hora en consecuencia. Los sistemas estándares de Linux tienen archivos para todas las zonas horarias en el directorio /usr/share/zoneinfo/
, así que /etc/localtime
es sólo un enlace simbólico al archivo de datos reales dentro de ese directorio. Los archivos en /usr/share/zoneinfo/
están organizados por el nombre de la zona horaria correspondiente, así que el archivo de datos para la zona horaria America/Sao_Paulo
será /usr/share/zoneinfo/America/Sao_Paulo
Como las definiciones para el horario de verano pueden cambiar, es importante mantener actualizados los archivos en /usr/share/zoneinfo/
. El comando de actualización de la herramienta de gestión de paquetes que proporciona la distribución debería actualizarlos cada vez que haya una nueva versión disponible.
Lenguaje y codificación de caracteres
Los sistemas Linux pueden trabajar con una amplia variedad de lenguajes y codificaciones de caracteres no occidentales, definiciones conocidas como locales. La configuración de locale más básica es la definición de la variable de entorno LANG
, a partir de la cual la mayoría de los programas de shell identifican el lenguaje a utilizar.
El contenido de la variable LANG
sigue el formato ab_CD
, donde ab
es el código del idioma y CD
es el código de la región. El código del idioma debe seguir la norma ISO-639 y el código de la región debe seguir la norma ISO-3166. Un sistema configurado para usar portugués brasileño, por ejemplo, debe tener la variable LANG
definida como pt_BR.UTF-8
:
$ echo $LANG pt_BR.UTF-8
Como se ve en el ejemplo anterior, la variable LANG
también contiene la codificación de caracteres prevista para el sistema. ASCII, abreviatura de American Standard Code for Information Interchange, fue la primera norma de codificación de caracteres ampliamente utilizada para la comunicación electrónica. Sin embargo, ASCII tiene un rango muy limitado de valores numéricos disponibles y dado que se basa en el alfabeto inglés, no contiene caracteres utilizados por otros idiomas o un conjunto ampliado de símbolos no alfabéticos. La codificación UTF-8 es una Norma de Unicode para los caracteres occidentales ordinarios, además de muchos otros símbolos no convencionales. Como ha señalado el Consorcio del Unicode, que mantiene el Estándar del Unicode, debe adoptarse por defecto para garantizar la compatibilidad entre las plataformas informáticas:
El Estándar Unicode proporciona un número único para cada caracter, sin importar la plataforma, el dispositivo, la aplicación o el idioma. Ha sido adoptado por todos los proveedores de software moderno y ahora permite que los datos sean transportados a través de muchas plataformas, dispositivos y aplicaciones diferentes sin corrupción. El soporte de Unicode constituye la base para la representación de idiomas y símbolos en todos los sistemas operativos principales, motores de búsqueda, navegadores, ordenadores portátiles y teléfonos inteligentes, además de Internet y la World Wide Web (URL, HTML, XML, CSS, JSON, etc.). (…) el estándar Unicode y la disponibilidad de herramientas que lo respaldan se encuentran entre las tendencias mundiales más importantes de la tecnología de software.
¿Qué es Unicode?
Algunos sistemas todavía pueden usar los estándares definidos por la ISO — como el estándar ISO-8859-1 — para la codificación de caracteres no ASCII. Sin embargo, tales estándares de codificación de caracteres deberían ser desaprobados en favor de los estándares de codificación de Unicode. No obstante, todos los principales sistemas operativos tienden a adoptar dicho estándar por defecto.
Los ajustes de localización del sistema están configurados en el archivo /etc/locale.conf
. La variable LANG
y otras variables relacionadas con la localización se asignan en este archivo como una variable de shell ordinaria, por ejemplo:
$ cat /etc/locale.conf LANG=pt_BR.UTF-8
Los usuarios pueden usar una configuración de locale personalizada redefiniendo la variable de entorno LANG
. Puede hacerse sólo para la sesión actual o para futuras sesiones, añadiendo la nueva definición al perfil del usuario en Bash, ~/.bash_profile
o ~/.profile
. Sin embargo, hasta que el usuario inicie la sesión, la localización del sistema por defecto seguirá siendo utilizada por programas independientes del usuario, como la pantalla de inicio de sesión del administrador de pantalla.
Tip
|
El comando |
Además de la variable LANG
, otras variables de entorno afectan aspectos específicos de la región, como el símbolo de la moneda a utilizar o el separador correcto de miles para los números:
LC_COLLATE
-
Establece el orden alfabético. Uno de sus propósitos es definir el orden en que los archivos y directorios son listados.
LC_CTYPE
-
Establece cómo el sistema tratará ciertos conjuntos de caracteres. Define, por ejemplo, qué caracteres considera como mayúsculas o minúsculas.
LC_MESSAGES
-
Establece el lenguaje a mostrar para los mensajes del programa (en su mayoría programas GNU).
LC_MONETARY
-
Establece la unidad monetaria y el formato de la moneda.
LC_NUMERIC
-
Establece el formato numérico para los valores no monetarios. Su principal propósito es definir los separadores de miles y decimales.
LC_TIME
-
Establece el formato de la hora y la fecha.
LC_PAPER
-
Establece el tamaño de papel estándar.
LC_ALL
-
Anula todas las demás variables, incluyendo
LANG
.
El comando locale
mostrará todas las variables definidas en la configuración de locale actual:
$ locale LANG=pt_BR.UTF-8 LC_CTYPE="pt_BR.UTF-8" LC_NUMERIC=pt_BR.UTF-8 LC_TIME=pt_BR.UTF-8 LC_COLLATE="pt_BR.UTF-8" LC_MONETARY=pt_BR.UTF-8 LC_MESSAGES="pt_BR.UTF-8" LC_PAPER=pt_BR.UTF-8 LC_NAME=pt_BR.UTF-8 LC_ADDRESS=pt_BR.UTF-8 LC_TELEPHONE=pt_BR.UTF-8 LC_MEASUREMENT=pt_BR.UTF-8 LC_IDENTIFICATION=pt_BR.UTF-8 LC_ALL=
La única variable no definida es LC_ALL
, que puede ser usada para anular temporalmente todos los ajustes de localización. El siguiente ejemplo muestra cómo el comando date
— ejecutándose en un sistema configurado con locale pt_BR.UTF-8
— modificará su salida para cumplir con la nueva variable LC_ALL
:
$ date seg out 21 10:45:21 -03 2019 $ env LC_ALL=en_US.UTF-8 date Mon Oct 21 10:45:21 -03 2019
La modificación de la variable LC_ALL
hizo que las abreviaturas del día de la semana y del mes se mostraran en inglés americano (en_US
). Sin embargo, no es obligatorio establecer la misma localidad para todas las variables. Es posible, por ejemplo, hacer que el lenguaje definido a pt_BR
y el formato numérico (LC_NUMERIC
) se establezca en el estándar americano.
Algunos ajustes de localización cambian la forma en que los programas tratan el orden alfabético y los formatos de los números. Mientras que los programas convencionales suelen estar preparados para elegir correctamente una localización común para estas situaciones, los guiones pueden comportarse de forma inesperada cuando intentan ordenar correctamente por orden alfabético una lista de elementos. Por esta razón, se recomienda establecer la variable de entorno LANG
en la localización común C
, como en LANG=C
, para que el script produzca resultados inequívocos, independientemente de las definiciones de localización utilizadas en el sistema donde se ejecute. El locale C sólo realiza una simple comparación bytewise, por lo que también tendrá un mejor rendimiento que los otros.
Conversión de la codificación
El texto puede aparecer con caracteres ininteligibles cuando se muestra con una codificación de caracteres distinta del sistema en el que se creó el texto. El comando iconv
puede ser usado para resolver este problema, convirtiendo el archivo de su codificación de caracteres original a la deseada. Por ejemplo, para convertir un archivo llamado "original.txt" de la codificación ISO-8859-1 al archivo llamado "converted.txt" usando la codificación UTF-8, se puede usar el siguiente comando:
$ iconv -f ISO-8859-1 -t UTF-8 original.txt > converted.txt
La opción -f ISO-8859-1
(o --from-code=ISO-8859-1
) establece la codificación del archivo original y la opción -t UTF-8
(o --to-code=UTF-8
) establece el del archivo convertido. Todas las codificaciones soportadas por el comando iconv
se listan con el comando iconv -l
o iconv --list
. En lugar de usar la redirección de la salida, como en el ejemplo, también se puede usar la opción -o converted.txt
o --output converted.txt
.
Ejercicios guiados
-
Basado en la siguiente salida del comando
date
, ¿cuál es la zona horaria del sistema en notación GMT?$ date Mon Oct 21 18:45:21 +05 2019
-
¿A qué archivo debe apuntar el enlace simbólico
/etc/localtime
para queEuropa/Bruselas
sea la hora local por defecto del sistema? -
Es posible que los caracteres de los archivos de texto no se representen correctamente en un sistema con una codificación de caracteres diferente de la utilizada en el documento de texto. ¿Cómo podría usarse
iconv
para convertir el archivo codificado WINDOWS-1252old.txt
en el archivonew.txt
usando la codificación UTF-8?
Ejercicios de exploración
-
¿Qué comando hará que
Pacific/Auckland
sea la zona horaria por defecto para la sesión de shell actual? -
El comando
uptime
muestra, entre otras cosas, el promedio de carga del sistema en números fraccionarios. Utiliza la configuración actual de la región para decidir si el separador de decimales debe ser un punto o una coma. Si, por ejemplo, el locale actual está configurado comode_DE.UTF-8
(el locale estándar de Alemania),uptime
utilizará una coma como separador. Sabiendo que en el idioma inglés americano el punto se usa como separador, ¿qué comando hará queuptime
muestre las fracciones usando un punto en lugar de una coma para el resto de la sesión actual? -
El comando
iconv
reemplazará todos los caracteres fuera del conjunto con un signo de interrogación. Si se añade//TRANSLIT
a la codificación de destino, los caracteres no representados en el conjunto de caracteres destino serán reemplazados (transliterados) por uno o más caracteres de aspecto similar. ¿Cómo podría usarse este método para convertir un archivo de texto UTF-8 llamadoreadme.txt
a un archivo ASCII plano llamadoascii.txt
?
Resumen
Esta lección cubre cómo configurar un sistema Linux para que funcione con idiomas y configuraciones de fecha y hora personalizados. También se tratan los conceptos y ajustes de codificación de caracteres, ya que son muy importantes para representar correctamente el contenido del texto. La lección abarca los siguientes temas:
-
¿Cómo los sistemas Linux seleccionan el idioma para mostrar los mensajes del shell?
-
Entender cómo las zonas horarias afectan a la hora local.
-
Cómo identificar la zona horaria apropiada y modificar la configuración del sistema en consecuencia.
-
¿Qué son las codificaciones de caracteres y cómo convertirlas?
Los comandos y procedimientos abordados fueron:
-
Variables de entorno relacionadas con la región, fecha y hora, como
LC_ALL
,LANG
yTZ
. -
/etc/timezone
-
/etc/localtime
-
/usr/share/zoneinfo/
-
locale
-
tzselect
-
timedatectl
-
date
-
iconv
Respuestas a los ejercicios guiados
-
Basado en la siguiente salida del comando
date
, ¿cuál es la zona horaria del sistema en notación GMT?$ date Mon Oct 21 18:45:21 +05 2019
Es la zona horaria
Etc/GMT+5
. -
¿A qué archivo debe apuntar el enlace simbólico
/etc/localtime
para queEuropa/Bruselas
sea la hora local por defecto del sistema?El enlace
/etc/localtime
debe apuntar a/usr/share/zoneinfo/Europe/Brussels
. -
Es posible que los caracteres de los archivos de texto no se representen correctamente en un sistema con una codificación de caracteres diferente de la utilizada en el documento de texto. ¿Cómo podría usarse
iconv
para convertir el archivo codificado WINDOWS-1252old.txt
en el archivonew.txt
usando la codificación UTF-8?El comando
iconv -f WINDOWS-1252 -t UTF-8 -o new.txt old.txt
realizará la conversión deseada.
Respuestas a los ejercicios de exploración
-
¿Qué comando hará que
Pacific/Auckland
sea la zona horaria por defecto para la sesión de shell actual?export TZ=Pacific/Auckland
-
El comando
uptime
muestra, entre otras cosas, el promedio de carga del sistema en números fraccionarios. Utiliza la configuración actual de la región para decidir si el separador de decimales debe ser un punto o una coma. Si, por ejemplo, el locale actual está configurado comode_DE.UTF-8
(el locale estándar de Alemania),uptime
utilizará una coma como separador. Sabiendo que en el idioma inglés americano el punto se usa como separador, ¿qué comando hará queuptime
muestre las fracciones usando un punto en lugar de una coma para el resto de la sesión actual?El comando
export LC_NUMERIC=en_US.UTF-8
oexport LC_ALL=en_US.UTF-8
. -
El comando
iconv
reemplazará todos los caracteres fuera del conjunto con un signo de interrogación. Si se añade//TRANSLIT
a la codificación de destino, los caracteres no representados en el conjunto de caracteres destino serán reemplazados (transliterados) por uno o más caracteres de aspecto similar. ¿Cómo podría usarse este método para convertir un archivo de texto UTF-8 llamadoreadme.txt
a un archivo ASCII plano llamadoascii.txt
?El comando
iconv -f UTF-8 -t ASCII//TRANSLIT -o ascii.txt readme.txt
realizará la conversión deseada.