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:

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:
- Anotar cada una de las cadenas de caracteres que tienen que ser traducidas.
- Asignarle a cada una de ellas una clave, normalmente una palabra que la represente.
-
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.
- 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.

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:

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, 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
:

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:

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:

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