1

Cómo importar traducciones en Godot Engine

Según la tradición bíblica, después del Gran Diluvio los descendientes de Noé se asentaron en la región de Senaar y empezaron la construcción de una gigantesca ciudad vertical con el propósito de alcanzar los cielos: la Torre de Babel. Dios, tan amigable como siempre, decidió que no quería recibir visitas e ingenió un ardid para boicotear el proyecto: confundió la lengua de los hombres para que ya no fueran capaces de entenderse entre ellos, creando así todos los idiomas que existen hoy en día. También condenó al hombre a hacer Duolingos durante toda la eternidad.

Esto supuso un gran problema para los constructores de la Torre de Babel, y también para los desarrolladores de videojuegos que desde ese momento se vieron obligados a traducir sus títulos a varios idiomas para poder comercializarlos.

La Torre de Babel, primera sede de la Escuela Oficial de Idiomas.

Por suerte, Godot Engine ofrece herramientas para traducir automáticamente todos los textos de nuestros juegos (botones, etiquetas, diálogos…) sin ningún esfuerzo por parte del programador. En el tutorial de hoy veremos un ejemplo práctico de cómo servirnos de estas herramientas para importar y utilizar traducciones con Godot Engine.


Formato ‘clave : valor’

Los videojuegos normalmente son aplicaciones con gran cantidad de texto. Piensa un momento en juegos como Planescape Torment o Disco Elysium; el volumen de palabras que contienen puede superar con creces al de varias novelas juntas. Si se quiere traducir un juego para lograr que llegue a un público más amplio, es necesario encontrar un sistema robusto para gestionar gran cantidad de texto multidioma.

El sistema que se emplea habitualmente es de tipo ‘clave:valor’. Se utiliza un identificador (clave) único para cada texto del juego. Cada una de estas claves tendrá asignados varios textos en idiomas diferentes. A la hora de mostrar un texto en pantalla, se escribirá el identificador único y Godot lo sustituirá por el texto asociado que se corresponda al idioma del usuario.

Para facilitar nuestro trabajo, Godot dispone de un importador de ficheros .csv especial para traducciones. Estos ficheros .csv deben contener todo el texto del juego respetando el siguiente formato:

keys <idioma 1> <idioma 2> <idioma 3>
CLAVE1 Texto Texto Texto
CLAVE2 Texto Texto Texto
CLAVE3 Texto Texto Texto

Los campos “CLAVE” tienen que ser un identificador único para cada texto. Los campos “<idioma>” deben contener una de las Localizaciones que tiene definidas Godot. Además, el fichero tiene que estar codificado en formato UTF-8.

Por ejemplo, este sería un fichero .csv válido para hacer traducciones:

keys es en ca ja
KBOW Arco Bow Arc
KARMOR Armadura de hierro Iron armor Armadura de ferro 鉄の鎧
KSWORD Espada corta Shortsword Espasa curta 短刀

¿Qué hará Godot con esta información? Si importamos este fichero y establecemos un idioma para nuestro juego, Godot sustituirá todos los strings de la columna “keys” que aparezcan en etiquetas o botones por su equivalente.

Por ejemplo, si establecemos el idioma español, Godot sustituirá el string “KARMOR” por “Armadura de hierro”. Si en cambio establecemos el idioma a japonés, cambiará automáticamente el string “KARMOR” por “鉄の鎧” cada vez que aparezca en algún sitio.

 

 


Un ejemplo práctico

Vamos a ver un caso práctico de cómo trabajar con el sistema de traducciones de Godot Engine. A modo de ejemplo, vamos a crear los botones del menú principal de un juego ficticio, junto con un desplegable que nos permitirá cambiar su idioma:

La escena contendrá cinco botones y un desplegable con varios idiomas.

Eligiendo una opción del desplegable se cambiará automáticamente el idioma de los botones.

1. Crear la escena

Empieza por abrir Godot y crear un nuevo proyecto. Una vez se abra el editor, crea un nuevo nodo de tipo Node2D. Será el nodo principal de la escena:

Selecciona “2D Scene” para que el nodo principal sea un Node2D

Añade cinco nodos de tipo Button a la escena:

Hay que añadir 5 nodos de tipo Button a la escena.

Ahora modifica el tamaño y el texto de estos botones para que queden así:

El texto que estamos escribiendo en los botones son las claves que Godot traducirá según el idioma que le indiquemos.

 

Añade también un nodo de tipo OptionButton, y cambia su nombre por ‘DesplegableIdiomas’:

Añade un nodo de tipo OptionButton a la escena.

Cambia su nombre a DesplegableIdiomas.

La escena acabada debería quedar así:

 

2. Crear el fichero .csv

El siguiente paso es crear un fichero .csv con las traducciones e importarlo dentro de nuestro proyecto. Abre un editor de texto externo a Godot, copia el siguiente texto y guárdalo con el nombre ‘traducciones.csv’ dentro de la carpeta del proyecto de Godot:

key;en;es;ca;de;fr
KSTARTNEW;Start New Game;Comenzar nueva partida;Començar nova partida;Neues Spiel starten;Nouvelle partie
KCONTINUE;Continue Game;Continuar partida;Continuar partida;Weiterspielen;Continuer le jeu
KLOAD;Load Game;Cargar partida;Carregar partida;Spiel Laden;Charger une partie
KSETTINGS;Settings;Opciones;Opcions;Optionen;Options
KEXIT;Exit;Salir ;Sortir;Beenden;Sortie

Si quieres, antes de continuar, puedes abrir este fichero con un programa como Excel o Libreoffice-Calc y verás que este galimatías se corresponde a la siguiente tabla:

keys en es ca de fr
KSTARTNEW Start New Game Comenzar nueva partida Començar nova partida Neues Spiel starten Nouvelle partie
KCONTINUE Continue Game Continuar partida Continuar partida Weiterspielen Continuer le jeu
KLOAD Load Game Cargar partida Carregar partida Spiel Laden Charger une partie
KSETTINGS Settings Opciones Opcions Optionen Options
KEXIT Exit Salir Sortir Beenden Sortie

3. Importar el fichero .csv

Para importar este fichero .csv vuelve al editor de Godot y selecciónalo en el panel FileSystem. Una vez seleccionado, abre el panel Import.

Cuando trabajamos con ficheros .csv, Godot nos da dos formas de importarlos: como ficheros normales, o como ficheros de traducción. Tenemos que indicarle a Godot que se trata de un fichero de traducción, y cambiar el tipo de separador a punto-y-coma:

Le indicamos al motor que se trata de un fichero con traducciones.

Cambiamos el delimitador a punto-y-coma.

Lo más probable es que, al pulsar Reimport, te obligue a reiniciar el editor. Una vez reiniciado, verás que ha creado varios ficheros .translation en la carpeta del proyecto, uno para cada idioma definido en la tabla .csv. Hay que añadir estos ficheros al proyecto.

Ve al menú Project → Project Settings:

Abre la ventana de Opciones del Proyecto (Project Settings).

Ve a la pestaña Localization. Pulsa el botón ‘Add’ e importa todos los ficheros acabados en .translation:

Cuando acabes deberías tener una lista con cinco ficheros de traducción (Alemán, Inglés, Español, Francés y Catalán):

Ya tenemos todos los ingredientes. Ahora hay que mezclarlos todos y cocinarlos con un script.

4. GDScript

Crea un nuevo script y adjúntalo al Node2D. Borra el código que viene por defecto y copia este:

extends Node2D


func _ready():
	
	#Guardar todas las localizaciones en una lista:
	var locales = TranslationServer.get_loaded_locales()
	# get_loaded_locales() devuelve una lista de strings con todas las localizaciones
	# que han sido importadas al proyecto.
	# Por tanto, en nuestro caso será ["en", "ca", "fr", "de", "es"]
	
	#Añadir los nombres de los idiomas al desplegable:
	for l in locales:
		
		#Buscar el nombre del idioma según su código:
		var nombre_idioma = TranslationServer.get_locale_name(l)
		# get_locale_name() recibe el código de un idioma y devuelve su nombre.
		# Por ejemplo, si recibe el string "es", devolverá el string "Spanish"
		
		#Añadir el nombre del idioma a la lista desplegable:
		$DesplegableIdiomas.add_item(nombre_idioma)
		
	#Establecer el ítem 0 como seleccionado:
	$DesplegableIdiomas.selected = 0
	
	#Cambiar el idioma de los textos al primero de la lista:
	TranslationServer.set_locale(locales[0])
	# set_locale() permite cambiar el idioma del juego. Requiere una localización
	# como argumento (p.ej. "ca" o "es"), y cambia automáticamente el idioma
	# de todos los textos y etiquetas.
	
	
	#Conectar la señal 'item_selected' del desplegable a la función 'item_seleccionado':
	$DesplegableIdiomas.connect("item_selected", self, "idioma_seleccionado")
	

func idioma_seleccionado(id):
	#(Esta función se llamará cada vez que el usuario seleccione un idioma del desplegable).
	
	#Guardar la lista de locales:
	var locales = TranslationServer.get_loaded_locales()
	
	#Cambiar el idioma de los textos por el seleccionado:
	TranslationServer.set_locale(locales[id])
	

Fíjate que hemos usado el nodo TranslationServer para cambiar el idioma del juego. Este nodo se crea automáticamente cada vez que se utilizan ficheros de traducción, y dispone de varios métodos para gestionar varios idiomas. Aquí puedes ver información detallada sobre este nodo.

Conclusiones

Si ahora inicias el juego, verás que el menú aparece escrito en el primer idioma de la lista desplegable (en mi caso, inglés). Ahora puedes abrir el desplegable y seleccionar otra opción: deberías ver que el idioma de los botones cambia al que has seleccionado.

Como puedes ver, Godot Engine nos ha facilitado mucho la tarea de añadir localización para nuestro proyecto, sin necesidad de programar toda una infraestructura de código que gestione las distintas traducciones.

Como siempre, si tienes dudas o problemas con este ejemplo puedes dejar un comentario. Y si te ha gustado el tutorial, no olvides seguirnos en nuestra página de Facebook o Twitter. Es una buena forma de apoyarnos, y estarás al tanto de nuestras publicaciones.

Final de línea.

 

Tr4nsduc7or

Originariamente creado cómo un galvanómetro de bolsillo, Transductor tomó consciencia de si mismo y fue despedido cuando en vez cumplir con su trabajo se dedicó a pensar teorías filosóficas sobre los hilos de cobre, los electrones y el Sentido del efecto Joule en el Universo. Guarda cierto recelo a sus creadores por no comprender la esencia metafísica de las metáforas de su obra. Actualmente trabaja a media jornada cómo antena de radio, y dedica su tiempo libre a la electrónica recreativa y a la filosofía.

guest
1 Comment
más nuevos primero
más antiguos primero
Inline Feedbacks
Ver todos los comentarios
trackback

[…] este otro tutorial se puede ver un ejemplo de cómo traducir un menú a varios idiomas utilizando ficheros […]