Sistema de Idiomas - AsdoBlog


¡Buenas!

Soy Asdonaur, gamedev independiente y artista pixelart.

A veces nuestros juegos requieren texto. Bueno, bastante texto.

Ya sea por que la historia es un factor importante, por que quieres explicar como funciona, o simplemente quieres mostrar algo de texto por cualquier razón.

Sin embargo, existen muchos idiomas: inglés, español, francés, chino, japonés, portugués...

Sería una pena que la gente se perdiera de tu juego sólo por que no está en su idioma... ¿No crees?

Por ello necesitamos un sistema de idiomas y poder traducir fácilmente el juego.

En este devlog explico paso a paso cómo hago yo para meter un sistema de idiomas, y procuraré ser lo menos técnico posible, para que puedas aplicarlo en tu motor preferido. Aunque en algunos casos explicaré como hacer ciertos procesos por medio de Unity.

1.- English Please

Antes que nada, hay que asegurar que el juego tenga el idioma ingles, los otros idiomas (incluido el español) pueden esperar.

El inglés es el idioma que tiene más probabilidades de que la gente sepa hablarlo (o al menos leerlo), por lo que es prioridad que ese sea el idioma por defecto: así, el usuario sabe al menos lo necesario para poder navegar el menú de opciones y encontrar la opción de cambiar el idioma.

"¿Y si no sé inglés?"

Pídele a alguien que te traduzca el juego.

"¿Y si no tengo a nadie que me ayude con eso?"

Podrías usar el traductor de Google, pero no es la opción mas viable, por que a veces el traductor no traduce bien las frases.

Yo te recomendaría entonces hacer un juego que tenga la menor cantidad de texto posible, y usar el traductor solo para traducir palabras simples como "Jugar", "Opciones", "Salir", etc.

"¿Pero entonces como explico la historia de mi RPG sobre un semi-vampiro y su amigo el gato fantasma que quieren matar al villano que quiere dominar el mundo y-?"

2.- Guardar las frases

Suponiendo que el jugador debe poder cambiar el idioma en cualquier momento desde el menú las frases deberían estar guardadas en alguna parte, listas para ser cargadas e intercambiadas.

"Entonces... ¿Hago un script que solo se encargue de guardar y administrar eso?"

Sí, pero no.

Es bueno tener un script que se encargue de cargar las frases y ponerlas en donde van.

Pero no es una buena idea guardarlas en el mismo script. Es mejor guardarlas en un archivo .txt aparte, para evitar que el script cargue con información que es probable que el usuario no necesite si es que no ocupa traducir el juego.

Aqui mostraré una forma organizada de como hacerlo:

- Primero, nos vamos a Google Sheets, en donde crearemos una tabla como ésta


En la primera columna, la ID representa el número de la frase para identificarla, la siguiente representa a la frase en inglés, y la última son las frases en español. Para este ejemplo solamente utilizaremos esos dos idiomas.

- Lo siguiente es exportar el archivo, pero como un ".tsv". En un momento veremos por qué.


- Si abrimos el archivo con el bloc de notas, el archivo debería verse algo así.


Copiamos y pegamos esta información a un archivo .txt, o bien, convertimos este archivo en un .txt.

- El último paso es escoger donde guardar este archivo. Por poner un ejemplo, el proyecto de Unity tiene una carpeta Resources, de la cual, se puede acceder mediante código y sacar cualquier tipo de información. Si tu proyecto no tiene esa carpeta, entra a la carpeta Assets, y crea una nueva carpeta, llámala Resources. El motor que tu usas debe de tener algo similar.

3.- Acceder a las frases

Ahora tenemos que configurar nuestro juego para que sea capaz de traducirse e intercambiar las frases dependiendo del idioma.

Aquí es donde me pongo más técnico, pero igual procuraré explicarlo de tal forma que sea aplicable en otros motores que no sean Unity.

Necesitamos varios scripts:

  • El Game Manager. Con esto me refiero al script en donde se guarda la información mas crucial del juego en general. Para este punto, supongo que ya tendrás un script así.
  • Un nuevo script que llamaremos LanguageManager. Este se encargará de controlar el idioma y varias funciones relacionadas. Lo pondremos en la misma instancia (objeto) en donde tenemos el Game Manager.
  • Otro nuevo script que llamaremos LanguageQuote. Este lo pondremos en todas las partes en donde se ocupa mostrar texto, y solamente muestre una frase corta.

El procedimiento:

  • En el Game Manager, añadimos un array de strings público (un array es un tipo de variable que puede contener varios valores) que llamaremos strsFrases. Por ahora dejamos eso como está.
  • En el Language Manager, añadimos una función que se llama CargarIdioma(), en donde, utilizando una variable intIdioma, decidiremos que columna del .txt agarrar para actualizar los valores de strFrases del Game Manager.
  • Ahora que podemos cargar un idioma, necesitamos una función CambiarIdioma(int num). Esta nos permitirá cambiar el valor de intIdioma a un valor específico, para luego ejecutar CargarIdioma() y actualizar las frases.
  • En el Language Quote, añadimos una variable int en donde guardaremos la ID de la frase que queremos mostrar. Este script también checará constantemente en que idioma está el juego, y si la frase que está motstrando actualmente es igual a la que corresponde. Si no es así, se actualizará con la frase correcta.

Y eso sería todo. Si quieres que la frase se muestre por código en otro momento (un cuadro de dialogo, por ejemplo) puedes acceder a dicha frase tomando como referencia el array del Game Manager.

4.- Preguntas

"¿Por qué en tu imagen la frase <ON> está traducida como <SÍ>, si On quiere decir Encendido?"

Esa frase es para indicar si el sonido o la música está activada, y OFF es lo contrario. Queda más sencillo y corto decir "Sonido: Sí" a decir "Sonido: Encendido".

Hay varios casos, como este, en los que traducir literalmente la frase no queda bien, y es una de las razones por las que no recomiendo usar el traductor de Google.

"En ese caso, ¿cómo muestro dos frases juntas?"

Al LanguageQuote le pasas un string.Format(strFormato, valor1, valor2), en donde strFormato es un string donde puedes meter varios valores.

En nuestro caso, se vería como "{0}: {1}"

Entonces, le pasas dos valores de ID para reemplazar las frases.

5.- Despedida

La idea es que trates de aplicar un sistema similar a tu juego.

Aunque no estoy seguro si esta es la mejor forma de hacerlo, es la forma que utilicé para Waffles Routine, y puede que siga usando por un buen tiempo, hasta que encuentre una manera mejor.

En poco mas de una semana, empieza Devs al Asador Game Jam, una jam organizada por mí.

También puedes echarle un vistazo a mis redes si te interesa.

En fin, ¡gracias por leer!

- Oscar Moreno (Asdonaur)

Leave a comment

Log in with itch.io to leave a comment.