Menú de navegaciónMenú
Categorías

La mejor forma de Aprender Programación online y en español www.campusmvp.es

?id=eaafe070-c154-46b6-bc3a-b1feefe8d073

Cómo crear aplicaciones multilingües con C# y .NET

En el contexto actual, en el que los desarrolladores tenemos acceso a usuarios de multitud de países, la realización de aplicaciones con soporte multilingüe cobra cada vez mayor importancia. Por esta razón, hoy te enseñamos cómo puedes incluir múltiples lenguajes en tu aplicación desarrollada con C# de manera sencilla.

La diferencia entre traducción y localización

Algo que todos vemos fácilmente a la hora de adaptar una aplicación a otro idioma es que hay que traducir los mensajes, elementos de la interfaz, etc...

Sin embargo, aunque el concepto de traducción lo tiene todo el mundo claro, existe otro concepto simple pero que no siempre se contempla al adaptar las aplicaciones. Se trata de la localización.

La localización o regionalización es el proceso de adaptación para contemplar las particularidades regionales del país al que estamos adaptando la aplicación. Esto va más allá de una simple traducción.

Consideremos, por ejemplo, el caso de las fechas. En España la forma abreviada de una fecha es día/mes/año, es decir, una fecha válida sería por ejemplo sería 15/02/2017 o si la queremos en formato largo, sería "Miércoles, 15 de febrero de 2017". Sin embargo en otros lugares la forma de expresar esta misma fecha sería completamente diferente y no se entendería si fuese en el formato común de España. Sin ir más lejos (y esto mucha gente lo desconoce) en el País Vasco la misma fecha anterior se escribiría como 2017.02.15, o sea, justo al revés en el orden y usando puntos como separadores. Otro caso común es que en muchos países anglosajones (por ejemplo EEUU, pero no en Reino Unido) la fecha se escribe con formato mes/día/año y podría dar lugar a "bonitos" equívocos.

Existen multitud de posibilidades a la hora de dar formato a una fecha. Lo mismo pasa con los formatos de números, monedas, pesos y medidas, y otros elementos. Por supuesto hay que tener en cuenta también las diferentes zonas horarias.

A todas estas particularidades que van más allá de la traducción de recursos se les denomina localización.

En este artículo nos vamos a centrar exclusivamente en la parte de traducción. Ya veremos cómo localizar en un artículo posterior.

Sistema de traducción

En C# el método que se utiliza para traducir los recursos de un programa, es la creación de un fichero con las cadenas de caracteres traducidas a los distintos lenguajes que se quieren soportar. Este tipo de ficheros se denominan archivos de recursos y utilizan la extensión .resx.

Debido a las peculiaridades de este tipo de archivo, Visual Studio tiene un editor específico para los ficheros con las traducciones:

El editor de Visual Studio para los ficheros con las traducciones

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

Cómo traducir tu programa

Para traducir tu programa, te recomiendo seguir los siguientes pasos:

  1. Anotar cada una de las cadenas de caracteres que tienen que ser traducidas.
  2. Asignarle a cada una de ellas una clave, normalmente una palabra que la represente.
  3. Crear los archivos con las traducciones, para ello deberás seguir el siguiente procedimiento:

    a) Si es el lenguaje principal del programa, denomina el archivo .resx tal y como quieras que se llame la clase donde estarán las traducciones. En mi ejemplo Strings.resx.
    b) Si es un archivo para otro lenguaje, utiliza la notación Clase.idioma-PAIS.resx. En mi ejemplo para el francés pondría Strings.fr.resx y si quisiera distinguir entre el inglés de Estados Unidos y de Reino Unido, Strings.en-US.resx y Strings.en-GB.resx respectivamente.

  4. Indicar en el programa cuál es el idioma principal.

En el programa con el se ejemplifica este artículo, hay dos frases a ser traducidas: una para saludar y otra para despedirse, este es el primer paso.

Después se les asigna una clave a cada una de ellas: Saludo y Despedida. Con esto ya habríamos cumplido con el paso 2 del proceso indicado anteriormente.

Además, también tenemos el paso 3.a realizado al haber creado el archivo de recursos Strings.resx. Para ello vamos al menú contextual del proyecto: Agregar·Nuevo elemento·Archivo de recursos. Ahora vamos a crear los dos ficheros donde se van a realizar las traducciones a inglés, tanto británico como americano, con la nomenclatura explicada anteriormente.

Ficheros con las traducciones para el programa

Como puedes ver en la imagen superior, 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 en cada uno de ellos.

Truco para agilizar las traducciones

Debido a que realicé un programa con traducciones en multiples lenguajes, estuve investigando si no existían mejores formas para realizar la gestión de los ficheros de traducción y encontré la extensión resXManager:

resXManager es una extension de Visual Studio que agiliza el proceso de traducción

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:

Traducción usando resXManager

Además de la ventaja anterior, es importante destacar las siguientes:

  • Soporta la exportación e importación a Excel, de manera que puedes mandarle el fichero a traducir de una manera más simple a tus colaboradores.
  • Tiene un sistema de traducción automática, con una calidad suficiente para muchas traducciones.
  • Soporta la edición de múltiples columnas.
  • Contiene un archivo con la información del código específico que debes usar para identificar al lenguaje de un país concreto.

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. Para ello debes ir a Propiedades·Aplicación, Información del ensamblado:

Indicando el idioma principal de la aplicació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á la traducción fr-CA. Si no existe pedirá francés neutro (fr) en caso de no existir ningún otro fr, como fr-FR (francés de Francia). Y si ninguno de ellos está, utilizará el idioma neutro.

Una vez tienes presente esta característica, puedes usar cada una de las traducciones utilizando la clase Strings que contiene una propiedad por cada clave, como en el siguiente ejemplo:

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(Strings.Saludo);
            Console.WriteLine(Strings.Despedida);
        }
    }

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

El programa usa el idioma español

Cómo simular otros idiomas

Uno de los problemas que os 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:

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");

El siguiente código muestra un ejemplo donde mostramos cómo usaríamos ambos idiomas, primero el idioma de Windows y después el inglés de Estados Unidos:

class Program
    {
        static void Main(string[] args)
        {  
            Console.WriteLine(Strings.Saludo);
            Console.WriteLine(Strings.Despedida);
            Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
            Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
            Console.WriteLine("Ahora en Inglés (USA)");
            Console.WriteLine(Strings.Saludo);
            Console.WriteLine(Strings.Despedida);  
        }
    }

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

El programa usando dos idiomas, español e inglés

Espero que este artículo te sirva para poder aprovechar más tus desarrollos, llegando a otros mercados.

Fecha de publicación:
Jorge Durán

Jorge es Ingeniero Informático por la Universidad de Salamanca. Es un entusiasta de la tecnología desde los 10 años, y ha escrito decenas de artículos en blogs relacionados con la informática. Lo puedes seguir en sus blogs Lenguaje de programación y Somos Binarios.

Ver todos los posts de Jorge Durán
Archivado en: Lenguajes y plataformas

Boletín campusMVP.es

Solo cosas útiles. Una vez al mes.

🚀 Únete a miles de desarrolladores

DATE DE ALTA

x No me interesa | x Ya soy suscriptor

La mejor formación online para desarrolladores como tú

Comentarios (7) -

Luis Sagasta
Luis Sagasta

Hola.

Yo utilizo Zeta Resource Editor. Es gratuito, permite agregar todos los archivos .resx de uno o varios proyectos y genera un único Excel para enviar a traducir.
https://www.zeta-resource-editor.com/

Un saludo.

Responder

Hola Luis:

Gracias por la aportación.

Saludos.

Responder

No funciona, deberias dejar un proyecto creado para poder descargarlo

Responder

campusMVP
campusMVP

Hola:

Sí que funciona. Sigue las instrucciones con detalle y no deberías tener problema. Solo tienes que crear los archivos .resx tal y como se indica, añadiéndolos al proyecto, y te funcionará tal cual indica el artículo.

Saludos.

Responder

Javier García
Javier García

Excelente artículo.

A la hora de compilar se me han creado tres carpetas dentro de cada una de ellas una dll con el recurso y si me llevo el .exe no me funciona a no ser que me lleve las carpetas correspondientes.

No se si lo he hecho correctamente, pero lo que quería es que  todo estuviera embebido en el mismo ejecutable. ¿Es posible?

Muchas gracias

Responder

desarrollo de aplicaciones web
desarrollo de aplicaciones web

Una explicación muy buena y fácil de entender. Este programa es fantástico y fácil de usar, más con el paso a paso que has detallado.
El traducir una app es un trabajo elaborado y al que se le debe de prestar atención para que no se nos pase ningún detalle. Me ha gustado que diferencies entre traducción  y localización, puesto que, el tener en cuenta la cultura del país es muy importante. Gracias por compartirlo!

Responder

hola, mi problema es cuando quiero referenciar la clave que guarde en el archivo resx
tengo un archivo FormInicio que tiene archivos: FormInicio.resx y FormInicio.en.resx
dentro de este archivo tengo una clave: bSalir.Text que tiene el valor "SALIR"

bSalir.Text = ???

supongo que tengo que elegir la cultura primero o algo como esto

ComponentResourceManager componentResourceManager = new ComponentResourceManager();
bSalir.Text = componentResourceManager.GetString("bSalir.Text", cultureInfo);

pero no funciona, te agradezco expliques esto

Responder

Agregar comentario

Los datos anteriores se utilizarán exclusivamente para permitirte hacer el comentario y, si lo seleccionas, notificarte de nuevos comentarios en este artículo, pero no se procesarán ni se utilizarán para ningún otro propósito. Lee nuestra política de privacidad.