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.