[XNA] Localización de videojuegos en XNA (multiidioma)

Si haces un juego con el objetivo de venderlo, en un mercado global como es el de hoy día… es imprescindible que tu videojuego sea multiidioma. Cuantos más idiomas tenga, por supuesto tanto mejor, y aunque se supone que todos somos capaces de entender el inglés, siempre se hace más cómodo jugar con el idioma nativo de uno: el cliente lo agradece! Como se verá en este tutorial, no es una tarea complicada. Una vez la aplicación está preparada para ser localizada a un idioma, es muy fácil añadir muchos más idiomas, consistiendo la única dificultad a partir de ese momento en traducir las cadenas de texto.

Este vídeo refleja el resultado de la ejecución del código que os podéis descargar con este ejemplo, se muestran textos y una foto en Castellano, Inglés y Catalán. La foto refleja claramente la cultura de cada país: Bocata calamares, Hamburguesa y Calçots respectivamente.

En cualquier aplicación .Net la localización se hace de forma muy parecida, y XNA no iba a ser menos. La traducción de los textos se basa en ficheros de recursos, de extensión “resx”. Para añadir uno de estos documentos iremos al proyecto –> Añadir -> Nuevo elemento –> Visual C# –> Fichero de recursos.

Al fichero le podemos poner el nombre que queramos, en mi caso le he puesto “Textos.resx”, y este será el fichero que contenga los textos del idioma por defecto del juego, ejemplo:

Textos

Una vez tengamos todos los textos en un idioma, necesitaremos crear nuevos ficheros Resx, uno para cada uno de los idiomas a los que queramos traducir la aplicación. En mi caso la he traducido al inglés y al catalán, así que añado los ficheros:

  • Textos.en.resx
  • Textos.ca.resx

Como ya habréis deducido, es necesario traducir sólo la columna “Value” en el fichero RESX, no así la columna “Name”, que hace la función de clave de acceso al recurso. En el fragmento de código podéis ver como se establece la cultura por defecto a español, al inicializar el juego. Podríamos inicializarla también al idioma que tenga el jugador… y eso es lo ideal, así no tenemos que preguntarle que idioma quiere, la cultura del jugador la obtenemos con CultureInfo.CurrentCulture (puede observarse comentado en el siguiente código):

   1: protected override void Initialize()

   2: {

   3:     font = Content.Load<SpriteFont>("font");

   4:  

   5:     this.EstablecerCultura("es");

   6:  

   7:     //CultureInfo.CurrentCulture.ToString();

   8:  

   9:     base.Initialize();

  10: }

El método “EstablecerCultura” no es más que un método propio, un helper que cambia la cultura que referenciaremos de los ficheros de recursos, así como cargar la foto en la cultura que toca.

   1: private void EstablecerCultura(string cultura)

   2: {

   3:     Textos.Culture = CultureInfo.GetCultureInfo(cultura);

   4:  

   5:     foto = Content.Load<Texture2D>("foto-" + cultura);

   6: }

Y ya casi estamos! Ahora sólo falta cambiar la cultura bajo petición del usuario, eso lo hago en el método Update():

   1: protected override void Update(GameTime gameTime)

   2: {

   3:     // Allows the game to exit

   4:     if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)

   5:         this.Exit();

   6:  

   7:     KeyboardState kbState = Keyboard.GetState();

   8:  

   9:     if (kbState.IsKeyDown(Keys.NumPad1))

  10:         this.EstablecerCultura("en");

  11:     else if (kbState.IsKeyDown(Keys.NumPad2))

  12:         this.EstablecerCultura("es");

  13:     else if (kbState.IsKeyDown(Keys.NumPad3))

  14:         this.EstablecerCultura("ca");

  15:  

  16:     this.titulo = String.Format(Textos.Titulo, Textos.Culture);

  17:     this.descripcion = Textos.Descripcion;

  18:     this.opciones = Textos.Opciones;

  19:  

  20:     base.Update(gameTime);

  21: }

Y finalmente lo dibujamos todo en pantalla… lo cual genera el resultado que podéis ver en el vídeo.

   1: protected override void Draw(GameTime gameTime)

   2: {

   3:     GraphicsDevice.Clear(Color.Black);

   4:  

   5:     spriteBatch.Begin();

   6:     spriteBatch.DrawString(font, titulo, new Vector2(10, 10), Color.Green);

   7:     spriteBatch.DrawString(font, descripcion, new Vector2(10, 40), Color.Green);

   8:     spriteBatch.DrawString(font, opciones, new Vector2(10, 70), Color.Green);

   9:     spriteBatch.Draw(foto, new Vector2(10, 120), Color.White);

  10:     spriteBatch.End();

  11:  

  12:     base.Draw(gameTime);

  13: }

 Quien quiera ir más allá, y necesite localizar sus juegos a idiomas que requieren gran cantidad de carácteres, con diccionarios distintos al nuestro (como japonés, coreano, chino, árabe…), echad un vistazo al ejemplo disponible en XNA Creators club respecto localización, donde además de las técnicas que os comento aquí hay un ejemplo de utilización del Content Pipeline para cargar sólo los carácteres que cada idioma requiere.

Como siempre podéis descargar el código fuente del ejemplo. Y ahora a jugar! (mmm esto me ha recordado al “precio justo” xD)

7 comentarios sobre “[XNA] Localización de videojuegos en XNA (multiidioma)”

  1. Hola que tal?

    Estuve estudiando tu ejemplo para un juego que estoy haciendo en XNA 4.0, y hay una cosa que no consigo que me salga de la manera que tu lo tienes, y es que en el método Establecer Cultura, a la hora de usar la llamada a GetCulutureInfo, XNA no me lo reconoce de ninguna de las maneras, y mirando la ayuda no veo por ningún lado que ese método haya sido eliminado o cambiado por otro en el XNA, podrías ayudarme con eso si sabes realmente como se puede hacer?
    Tengo el estatment de Globalization, y no se en que puede fallar la cosa,

    Gracias y un saludo!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *