En mi afán investigador he descubierto un sistema para traducir programas en Python utilizando JSON, el método es extensible a otros lenguajes y dependerá de como maneje los datos de JSON.
Para empezar un poco de teoría:
Python al hacer un parser de JSON convierte los datos en un diccionario y se utiliza como clave de cada elemento el identificador con el mismo nombre que el JSON. Este método permite una actualización de las traducciones más rápida que gettext y es algo más simple de implementar.
Primero necesitamos una base de datos JSON con los textos que tienen que salir por la pantalla, podemos hacer un mismo archivo con varios idiomas o varios archivos cada uno por un idioma.
Aquí el ejemplo de archivo JSON
{
"es":{
"Titles":{
"First":"El procesador segmentado",
"Subtitle":"Muestra de partes en el procesador segmentado",
"Parts":["Búsqueda","Decodificacion","Ejecución","Memoria","Escritura"]
}
},
"en":{
"Titles":{
"First":"The pipelined processor",
"Subtitle":"Show the parts in the pipelined processor",
"Parts":["Find","Decodification","Execution","Memory","Write"]
}
}
}
Lo más importante en este caso es que la estructura sea la misma si no tendremos problemas, mi recomendación es que las traducciones se hagan copiando una traducción correcta e ir sustituyendo cada parte, si los nombres de los identificadores no coincide el programa no funcionará.
Después de crear nuestros ficheros con las traducciones lo utilizamos en Python. Este es el código de ejemplo
#!/usr/bin/python3
import json
#Cargamos el json y lo guardamos en data que es un diccionario
with open('lang.json') as data_file:
data = json.load(data_file)
#Seleccionamos el idioma
lang = "es" #Este paso depende de la implementación
#Para acceder a data basta con usar el identificador en JSON
print(data[lang]["Titles"]["First"])
print(data[lang]["Titles"]["Subtitle"])
for x in data[lang]["Titles"]["Parts"]:
print(x)
Paso a paso explicado sería.
- Importamos la librería json y cargamos el archivo
import json with open('lang.json') as data_file: data = json.load(data_file)
- Tras esto cargamos el idioma, en este caso la carga es estática pero esto puede hacerse de muchas maneras, un fichero de configuración, la variable LANG del sistema etcétera.
lang = "es"
- Por último utilizamos los datos como un diccionario, los arrays se acceden igual que si fueran nativos.
print(data[lang]["Titles"]["First"]) print(data[lang]["Titles"]["Subtitle"]) for x in data[lang]["Titles"]["Parts"]: print(x)
Como anotación si se quiere cargar un fichero distinto según el idioma (una opción más recomendable si son muchas cadenas) solo hace falta cargar el idioma antes y abrir el fichero según el idioma cargado. El funcionamiento es el mismo, solo que con diferentes archivos.
Por último algunas capturas
Con lang=»es»
Con lang=»en»
Espero que este método para traducir proyectos os sea útil y no olvidéis dejar vuestras sugerencias en los comentarios.