En este artículo se estudia la forma de crear aplicaciones multilingües usando los archivos de recursos.
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:
Carpeta recursos localizables
Archivo StringResources
Propiedades fichero StringResources
Debido a las peculiaridades de este tipo de archivo, Visual Studio tiene un editor específico (bastante espartano) para los ficheros resx:
Como puedes ver, este fichero es similar a un diccionario, ya que presenta un formato basado en el popular enfoque de pareja "clave-valor".
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
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:
Ejemplos de nombres de archivos de recursos
El contenido de los ficheros sería algo así: (El ejemplo es intencionadamente sencillo)
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
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,
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:
Además de la ventaja anterior, la propaganda del programa dice que tiene las siguientes características (que no he probado):
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:
Y escribir en la casilla [Idioma neutro] el idioma principal, que en este ejemplo es el [español de España]
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.
Imagen copiada del articulo C# – Aplicaciones multilenguaje, globalización y localizació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
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
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 !!
© 1997 - - La Güeb de Joaquín | |||||
Joaquín Medina Serrano
|
|||||
|
Codificación | |
Fecha de creación | |
Última actualización | |
![]() |