09/12/24 - Estado actual - Gestión de los idiomas
La gestión de los idiomas en una aventura conversacional
¿Conocéis la expresión 'vernirse arriba'? Pues eso es lo que he hecho yo el día en que se me ocurrió que sería buena idea tener una aventura conversacional traducida, simultáneamente, a 5 idiomas. ¡Vaya locura! ¡En qué momento! Pero bueno, la decisión está tomada y ya es demasiado tarde para anularla.
¿En qué he estado trabajando la última semana?
Precisamente en eso, los idiomas del juego. Por una parte (la parte sencilla) he seguido traduciendo el juego a los 5 idiomas (español, inglés, galego, euskara, català) pero (ahora viene la parte que más tiempo me está llevando) también estuve trabajando bastante en la gestión del idioma:
El vocabulario es clave en una aventura conversacional, por eso una vez tomada la decisión de que el juego es multilingüe, tengo que garantizar que todo el vocabulario funciona en todos los idiomas. Además, voy a permitir que se cambie el idioma del juego durante la partida (créeme que TODO sería mucho más fácil si no dejase esa opción) porque quiero dar la posibilidad de cambiar de idioma a alguien que se haya arrepentido de haber elegido otro idioma en el menú principal. Es decir: igual alguien elige jugar en catalán, pero a media partida se da cuenta de que no se siente a gusto con ese idioma: o bien no encuentra el vocabulario, o bien hay problemas en la traducción... bueno, lo que sea. De ahí que permita volver al castellano. Que, por cierto, el castellano será el único idioma que tenga garantizado el 100% del funcionamiento correcto del juego y así lo tengo que advertir en la pantalla de elección de idioma (sirva este post como self-recordatorio)
¿Cómo gestiona el juego los idiomas?
Pongamos la situación de que el jugador comienza en español, coge un objeto y luego cambia de idioma al inglés. ¿Cómo le decimos ahora al juego que ese objeto tiene ahora el nombre, la descripción y el resto de textos en inglés? Lo que hice fue generar un objeto diferente para cada idioma (primera locura) que se sincronizan cuando el juego detecta que el jugador ha cambiado de idioma (segunda locura)
Un objeto puede tener 4 estados:
- Está en el inventario.
- Está en la habitación.
- No está.
- No existe.
El inventario y "los objetos de una habitación" son sendos arrays de objetos. El array "objetos de una habitación" sirve para cuando se examina la habitación y sale lo de: "también puedes ver..." Si el objeto está o no está presente, se comprueba mirando si ese objeto tiene la propiedad "habitación" igual a la habitación actual. Si el nombre no es una variable de tipo diccionario es que no existe. Si controlas, esto último igual te chirría un poco. ¿Por qué compruebo si un objeto existe con el nombre de su variable en vez de con el valor del campo nombre de su variable? Buena pregunta. El motivo es que si quiero saber si existe un objeto llamado "patata" es más fácil saber si existe una variable tipo diccionario llamada "patata", que recorrerme todas las variables y ver si alguna tiene la propiedad "nombre" = "patata". Limitación técnica del programador, supongo. El caso es que ese es el motivo por el que tengo que hacer una copia de cada objeto para cada idioma: el jugador debe poder escribir "puerta", "door", "porta", etc. y esas variables deben estar sincronizadas.
@onready var ventana = { "mirar" : tr("VENTANA_MIRAR"), "nombre" : tr("VENTANA"), "cogible" : false, "abrible" : false, "abierto": false, "descripcion" : tr("VENTANA_DESC"), "habitacion" : 1 } @onready var xanela = ventana #galician @onready var window = ventana #english
Si el jugador está en idioma inglés y se cambia una de las propiedades del objeto (por ejemplo, se abre la ventana ventana.abierto = true) lo que hace el sistema es cambiarlo en el objeto en español y después copiar ese objeto a sus gemelos en otros idiomas. De esta forma me garantizo que el juego no se va a romper en español porque haya quedado alguna variable sin sincronizarse. Como he dicho antes, los cambios se hacen buscando el nombre de la variable, no el valor del campo "nombre" de la variable.
Cambiar de idioma durante el juego, en resumen, implica:
- Recorrer toda la variable inventario y cambiar el nombre de los objetos al nuevo idioma.
- Recorrer toda la variable que almacena los objetos de la habitación y cambiar los nombres al nuevo idioma.
- Replicar todos los objetos "españoles" al resto de idiomas.
Bueno, no sé si me estoy explicando con claridad, pero espero que ahora tengas un poco más claro como funciona internamente el sistema del idioma y de los objetos.
¿Y los verbos en varios idiomas?
En cuanto a los verbos no hay problema con el idioma. Todos los verbos son arrays con sus sinónimos, por lo que solo tengo que añadir al array los sinónimos en todos los idiomas. Por ejemplo:
@onready var coger = ["coger", "amarrar", "agarrar", "coller", "take", "hartu", "agafar"]
Si input[0] está en "coger", ejecuto la función _coger() que tiene las órdenes de comprobar si existe el objeto, quitarlo de la habitación y meterlo en el inventario.
El estado actual es que el juego funciona. He probado a coger un objeto, modificar una propiedad, cambiar de idioma, usar ese objeto y comprobar que la propiedad sigue cambiada, volver a cambiar de idioma, etc. y el juego sigue consistente y no se rompe. ¿Es posible que aparezca un objeto duplicado? Por ejemplo: una objeto ventana y otro objeto window. Bueno, sería posible, pero de momento no está ocurriendo y una vez establecida esta base en la programación, todo debería funcionar independientemente de los objetos así que no creo que pase.
Os escucho si tenéis alguna duda y, si no, os seguiré informando la semana que viene en el próximo post.
¡Gracias!
Escape Carcelario
¿Podrás descubrir los secretos de esta cárcel espacial?
Status | In development |
Author | Trevizer |
Genre | Interactive Fiction |
Tags | Godot, Singleplayer |
Languages | Catalan; Valencian, English, Spanish; Castilian, Galician |
Accessibility | Subtitles |
More posts
- Estado 02/12/2410 days ago
- 19/11/2024 Estado actual23 days ago
- Estado Agosto 2431 days ago
- Estado 11/11/2431 days ago
Leave a comment
Log in with itch.io to leave a comment.