Archivos YAML
Las traducciones se suelen guardar en archivos YAML. Esto archivos permiten definir diccionarios y listas fácilmente mediante indentado. Más sobre los archivos YAML
Lectura de archivos
El directorio de referencia para la traducción
se ingresa con el método append()
de la función load_path()
:
# directorio con traducciones
i18n.load_path.append('.') # directorio actual
i18n.load_path.append('carpeta_traducciones/') # subdirectorio
Lo habitual es colocar los archivos de traducciones en una misma carpeta.
Estructura de programa
Los archivos con las traducciones se nombran con la siguiente convención: {nombre_archivo}.{locale}.{format}.
Por ejemplo un un programa demo con traducciones al inglés y al español podría tener una estructura como esta:
donde las traducciones al inglés
se guardan en el archivo demo.en.yml
y las traducciones al español
están en el archivo demo.es.yml
.
Las traducciones de un mismo idioma se pueden repartir en varios archivos, en caso de considerarse necesario.
Formato en YAML
Las traducciones se guardan en los archivos YAML
como diccionarios
con la siguiente convención:
primero se el lenguaje implementado (en
, es
, etc)
como primera clave
y como valores internos se guardan los pares campo - traducción.
Por ejemplo,
en el archivo de traducciones
para el inglés
se especifica la clave en
y bajo ésta
se incluyen los campos hi
y gb
con sus textos respectivos:
En el archivo de traducciones
para el español
se agrega la clave es
y bajo ésta
se incluyen los mismos campos:
Este mecanismo se aplica con todos los archivos de traducciones implementados.
Texto sin comillas
YAML no obliga a usar comillas para delimitar claves ni valores. Su uso es opcional.
Lectura
La lectura de traducciones se realiza nuevamente con la función t()
.
Si se elige como directorio de referencia la carpeta de traducciones:
entonces el argumento de entrada de t()
toma la forma {nombre_archivo}.{campo}
:
es decir se omite la abreviación de idioma y la extensión .yml
.
Si en cambio se carga todo el directorio del programa:
entonces la lectura de traducciones
tiene como formato de argumento
{nombre_carpeta}.{nombre_archivo}.{campo}
:
text = i18n.t('traducciones.demo.hi')
print(text)
text = i18n.t('traducciones.demo.gb')
print(text)
Traducciones faltantes
Si falta alguno de los archivos de idioma
entonces simplemente se carga la traducción de fallback
.
Ejemplo - rutina completa
Placeholders
Los placeholders mantienen la misma notación que en los scripts:
# archivo 'demo.es.yml' (español)
es:
hi: Hola %{name}! # placeholder 'name'
y se llaman de la misma manera, esta vez inclkuyendo el nombre de archivo:
Pluralización
La pluralización se implementa en archivos YAML
adaptando el diccionario de opciones al formato YAML.
En él se crean las claves zero
, one
, few
y many
con sus respectivos valores.
La variable de control sigue siendo count
y se reutiliza el formato de placeholder.
En el ejemplo previo del contador de correos, la definición quedaría así
# archivo 'demo.es.yml' (español)
es:
mails:
'zero': No tienes ningún correo nuevo.
'one': Tienes un nuevo correo.
'few': Sólo tienes %{count} correos nuevos.
'many': Tienes %{count} correos nuevos.
y la orden de lectura incluye al nombre de archivo:
Demo - cliente de correo
Se muestra una implementación completa del demo usado como ejemplo.
demo YAML - completo
# archivo 'demo.es.yml' (español)
# carpeta 'traducciones'
es:
hi: Hola %{name}!
gb: Hasta luego!
mails:
zero: No tienes ningún correo nuevo.
one: Tienes un nuevo correo.
few: Sólo tienes %{count} correos nuevos.
many: Tienes %{count} correos nuevos.
# archivo 'demo.en.yml' (inglés)
# carpeta 'traducciones'
en:
hi: Hello %{name}!
gb: Goodbye!
correos:
zero: You haven't any new mail.
one: You have a new mail.
few: You only have %{count} new mails.
many: You have %{count} new mails.
import i18n
i18n.load_path.append('traducciones/')
i18n.set('locale', 'es')
i18n.set('fallback', 'en')
text = i18n.t('traducciones.demo.hi', name="Bob")
print(text)
text = i18n.t('traducciones.demo.mails', count=0)
print(text)
text = i18n.t('traducciones.demo.gb')
print(text)