Wpf - Aplicaciones localizables

Descripción general

En este artículo se estudia la forma de crear aplicaciones multilingües usando los archivos de recursos.

[TOC] Tabla de Contenidos


↑↑↑

Introducción

Una aplicación que solo muestra sus mensajes en un único idioma, está perdiendo el acceso a un montón de gente, por eso el que una aplicación que presente sus textos en varios idiomas tiene realmente bastante importancia

Existen varias formas de hacerlo, pero una de las más sencillas es la que utiliza los archivos de recursos de Windows, que son unos archivos con forma de diccionario en el que los valores se almacenan en el formato Clave=valor

Para hacerlo hay que dar varios pasos sencillos que en resumen son los siguientes:

  1. Primero dentro de la solución, creamos una carpeta la cual llamaremos "Recursos Localizables", justo como se ve a continuación.
  2. Carpeta recursos localizables

    Carpeta recursos localizables

  3. Ahora creamos un nuevo archivo de recursos (botón derecho del ratón sobre la carpeta, agregar nuevo elemento, agregar archivo de recursos) y lo llamaremos "StringResources", debemos crearlo junto dentro de la carpeta "Recursos Localizables" que acabamos de crear.
  4. Archivo StringResources

    Archivo StringResources

  5. Revisamos las propiedades del archivo recién creado y nos aseguramos que en "Acción de compilación" (Build Action) diga "Recurso incrustado " (Embedded Resource).
  6. Propiedades fichero StringResources

    Propiedades fichero StringResources

  7. Utilizaremos ese archivo de recursos para guardar las cadenas en el idioma principal (por defecto) de nuestra aplicación, así que le damos doble clic y adicionamos los valores que se ven en la siguiente imagen.

Debido a las peculiaridades de este tipo de archivo, Visual Studio tiene un editor específico (bastante espartano) para los ficheros resx:

Editor de recursos de Visual Estudio

Editor de recursos de Visual Estudio

Como puedes ver, este fichero es similar a un diccionario, ya que presenta un formato basado en el popular enfoque de pareja "clave-valor".

Como Usar este archivo de recursos

Por ejemplo

    Private Sub buttonAdios_Click(sender As Object, e As RoutedEventArgs)
        Me.textBoxResultado.Text = My.Resources.StringResources.Adios
    End Sub

O Bien para cambiar un montón de texto de los botones y de los menús de la aplicación, podemos escribir una función que se llame desde el constructor (o cuando se cambia el idioma , por ejemplo en un menú), .Por ejemplo algo así

   Private Sub AplicarIdioma()
        'button1.Text = StringResources.ButtonLabel1
        'button2.Text = StringResources.ButtonLabel2
        'button3.Text = StringResources.ButtonLabel3
        'button4.Text = StringResources.ButtonLabel4
        'button5.Text = StringResources.ButtonLabel5
        'LabelTitulo.Content = StringResources.WindowTitle
   End Sub


↑↑↑

Cómo traducir tu programa

Hasta aquí lo que hemos hecho es sustituir las cadenas de texto de nuestra aplicación por cadenas que tengo almacenadas en un archivo de recursos. Ahora lo que quiero es que el texto que aparezca en cada botón, (en cada control), sea el correspondiente a cada idioma

En realidad, el idioma que se muestra con este procedimiento es el idioma que está instalado en el Windows de tu ordenador, es decir, si estas en Italia y en tu Win 10 está instalado en español, los mensajes que aparecen están en español.

Para traducir tú programa, te recomiendo seguir los siguientes pasos:

1) En primer lugar crear un archivo de recursos por idioma que quieras que se muestre o que necesites incluir. La manera más práctica es copiar y pegar el archivo, y después cambiar el nombre. De esta manera consigues un archivo idéntico, con todas las claves y en el que solo tienes que cambiar los textos descriptivos, (el valor de la pareja clave=valor) por los correspondientes al nuevo idioma

Notas:

El contenido de los ficheros sería algo así: (El ejemplo es intencionadamente sencillo)

Archivo de recurso con el idioma español de España,(es-ES), el idioma principal de la aplicación

Archivo de recurso con el idioma español de España,(es-ES), el idioma principal de la aplicación

 Archivo=Archivo de=de recurso=recurso con=con el=el idioma=idioma inglés=inglés Americano.=Americano. Observa=Observa que=que las=las claves=claves son=son las=las mismas

Archivo de recurso con el idioma inglés Americano.
Observa que las claves son las mismas

 Archivo=Archivo de=de recurso=recurso con=con el=el idioma=idioma francés,=francés, sin=sin que=que esté=esté ligado=ligado a=a ningún=ningún país=país en=en concreto.=concreto. Observa=Observa que=que en=en el=el nombre=nombre del=del fichero,=fichero, falta=falta la=la codificación=codificación de=de país

Archivo de recurso con el idioma francés, sin que esté ligado a ningún país en concreto.
Observa que en el nombre del fichero, falta la codificación de país


↑↑↑

Truco para agilizar las traducciones

Como has podido apreciar si has estado haciendo este ejemplo, uno de los problemas de realizar las traducciones con el editor de Visual Studio, es que no se sincronizan los distintos ficheros, teniendo que introducir a mano las claves, y sus traducciones, en cada uno de ellos.

Existe una extensión de Visual Estudio que se llama resXManager: que facilita la edición de los ficheros [.resx]. Se puede descargar buscando en la ventana de "Extensiones y actualizaciones" del visual estudio,

Extensiones y actualizaciones de Visual Estudio

Extensiones y actualizaciones de Visual Estudio

O bien en la página web: https://marketplace.visualstudio.com/items?itemName=TomEnglert.ResXManager

Esta extensión consigue agilizar en gran medida el proceso de traducción, ya que nos permite visualizar todos los ficheros de traducción al mismo tiempo, como se puede ver en la siguiente imagen:

ResXManager

ResXManager

Además de la ventaja anterior, la propaganda del programa dice que tiene las siguientes características (que no he probado):


↑↑↑

Indicar a la aplicación el idioma principal (o neutro)

Una vez que hayas terminado de rellenar todas las celdas con las traducciones correspondientes, tienes que indicarle a tu aplicación cuál es el idioma principal. (También llamado el idioma neutro) Para ello debes ir a Propiedades >·Aplicación, > Información del ensamblado:

Información del ensamblado

Información del ensamblado

Y escribir en la casilla [Idioma neutro] el idioma principal, que en este ejemplo es el [español de España]


↑↑↑

Aislar los archivos de recursos para facilitar la actualización

Nuestro proyecto ya está terminado y tenemos la capacidad de hacer aplicaciones multilenguaje, sin embargo si piensas incluir alguna funcionalidad de actualizaciones en tus aplicaciones y tienes planeado actualizar o incluir nuevos idiomas en tu aplicación, te recomiendo que coloques los archivo de recursos en una DLL independiente, en la que únicamente estarán los archivos de recursos, esto permitirá que las actualizaciones relacionadas con cadenas de lenguaje se aíslen en un solo componente.

Para que esto funcione, en el proyecto de la librería que utilices para tal fin, recuerda establecer en cada archivo de recursos el modificador de acceso en [Public] como lo muestra esta imagen.

Falta el texto Alt de la imagen

Imagen copiada del articulo C# – Aplicaciones multilenguaje, globalización y localización


↑↑↑

Cómo usar el sistema de traducción

Si no indicas nada, el programa va a emplear el lenguaje más cercano al que estés utilizando en el sistema operativo. Para ello, si usas por ejemplo francés de Canadá (fr-CA), primero buscará el archivo de recursos con fr-CA. Si no existe buscara francés neutro (fr) en caso de no existir, buscara cualquier idioma francés de cualquier otro país, como fr-FR (francés de Francia). Y si no existe ninguno, utilizará el idioma neutro, o idioma principal

Ejemplo:

    Private Sub buttonPrueba_Click(sender As Object, e As RoutedEventArgs)
        Using sw As New System.IO.StringWriter
            sw.WriteLine(My.Resources.StringResources.Hola)
            sw.WriteLine(My.Resources.StringResources.Adios)
            sw.Flush()
        Me.textBoxResultado.Text = sw.ToString
        End Using
    End Sub

En mi caso, como tengo Windows en español, el texto sale en este idioma:

Resultadocon idioma neutro

Resultadocon idioma neutro


↑↑↑

Cómo simular otros idiomas

Uno de los problemas que te puede surgir, es que no tenéis o no queréis instalar más idiomas en Windows para probar que efectivamente funciona el sistema. La solución a lo anterior, es emular el idioma mediante código, para ello utilizaremos:

        System.Threading.Thread.CurrentThread.CurrentUICulture = 
            New System.Globalization.CultureInfo("EN-US")

El siguiente código muestra un ejemplo donde mostramos cómo usaríamos los tres idiomas de este ejemplo:

    Private Sub buttonPrueba_Click(sender As Object, e As RoutedEventArgs)
        Using sw As New System.IO.StringWriter
            sw.WriteLine(My.Resources.StringResources.Hola)
            sw.WriteLine(My.Resources.StringResources.Adios)
            sw.WriteLine("Ahora en Inglés (USA)")
            Thread.CurrentThread.CurrentCulture = New CultureInfo("en-US")
            Thread.CurrentThread.CurrentUICulture = New CultureInfo("en-US")
            sw.WriteLine(My.Resources.StringResources.Hola)
            sw.WriteLine(My.Resources.StringResources.Adios)
            sw.WriteLine("Ahora en francés")
            Thread.CurrentThread.CurrentCulture = New CultureInfo("fr-FR")
            Thread.CurrentThread.CurrentUICulture = New CultureInfo("fr-FR")
            sw.WriteLine(My.Resources.StringResources.Hola)
            sw.WriteLine(My.Resources.StringResources.Adios)
            sw.Flush()
        Me.textBoxResultado.Text = sw.ToString
        End Using
    End Sub

El resultado de la ejecución del código anterior es el siguiente:

Ejemplo con todos los idiomas

Ejemplo con todos los idiomas

Y eso es todo

Me queda por averiguar cómo se hace todo esto con código xaml (y si se puede hacer), pero eso será ¡¡ Mañana !!


↑↑↑

A.2.Enlaces

[Para saber mas]
[Grupo de documentos]
[Documento Index]
[Documento Start]
[Imprimir el Documento]
© 1997 - - La Güeb de Joaquín
Joaquín Medina Serrano
Ésta página es española

Codificación
Fecha de creación
Última actualización
[HTML5 Desarrollado usando CSS3]