Internacionalización y localización de aplicaciones C#

Se conoce como localización (abreviado l10n), al proceso de adaptar un producto software a una región o país específico, traduciendo los textos del programa, adecuando los formatos de fechas, monedas o unidades y, en general, adaptando el conjunto de la aplicación a las distintas peculiaridades de la zona.

Gracias a Visual Studio el proceso de localizar una aplicación escrita en C# es de lo más sencillo. Primero nos dirigiremos al diseñador de interfaces y estableceremos la propiedad Localizable de la ventana cuyos textos queramos traducir a True. Como valor para Language seleccionaremos el idioma al que vamos a traducir la aplicación.

Esto creará un par de archivos de recursos, uno de ellos con el mismo nombre de la ventana y extensión resx, que corresponde al idioma por defecto de la aplicación, y otro con el sufijo correspondiente al idioma al que vamos a traducir la aplicación (“en” para el inglés, por ejemplo, o “fr” para el francés). Estos archivos de recursos contendrán, entre otros, los textos de la aplicación.

Para comenzar la localización sólo tenemos que hacer doble clic sobre el archivo resx del nuevo idioma y comenzar a traducir, o bien traducir las propiedades correspondientes de cada widget utilizando el diseñador de interfaces (el nombre de la pestaña correspondiente al diseñador mostrará el idioma para el cuál estamos traduciendo en este momento).

Todo esto funciona porque al establecer la propiedad Localizable a True el IDE sustituye automáticamente las asignaciones de las propiedades de los widgets a sus textos correspondientes por llamadas al método ApplyResources de un objeto ResourceManager, el cuál establece como valor para la propiedad correspondiente del widget el obtenido del archivo de recursos asociado al idioma actual del sistema operativo.

Al compilar, los archivos de recursos se traducirán del formato XML resx a un formato binario intermedio (extensión .resources), el cuál pasará a formar parte del del assembly principal, en el caso de los recursos utilizados por defecto, o de assembly satélites para los recursos localizados (un assembly por cada idioma).

Una vez traducida y compilada la aplicación sólo resta probarla. Si estás utilizando un Windows con un MUI instalado (un Multilingual User Interface Pack) puedes comprobar la localización fácilmente cambiando el idioma actual desde el panel de control. En caso contrario tendrás que cambiar el idioma programáticamente cambiando el valor de Thread.CurrentThread.CurrentUICulture a un nuevo objeto CultureInfo correspondiente al idioma que quieras probar antes de inicializar el formulario (es decir, antes de la llamada a InitializeComponent())

using System.Globalization;
using System.Threading;

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

Por otro lado, si tenemos textos en nuestra aplicación que no corresponden a propiedades de widgets pero necesitan traducción, tendremos que añadir estas cadenas por nosotros mismos en los archivos de recursos, así como distintas llamadas al método GetString() de ResourceManager en el código.

using System.Resources;

ResourceManager rm = new ResourceManager("WindowsApplication1.WinFormStrings",typeof(Form1).Assembly);

Console.WriteLine(rm.GetString("nombreVar"));

Un último detalle a comentar es que, a menudo, sobre todo en el software libre, se recurre a la ayuda de los propios usuarios de la propia aplicación para crear traducciones a su idioma. No sería razonable que estos usuarios tuvieran que contar con conocimientos de programación o instalar Visual Studio para ayudarnos. Pero no hay ningún problema, ya que los archivos resx son simples ficheros de texto plano. Además, para ayudar a no desarrolladores a localizar aplicaciones escritas utilizando el framework .NET, este incluye una herramienta llamada “Windows Resource Localization Editor” (winres.exe) con la que basta abrir el archivo resx, seleccionar el idioma al que corresponderá el fichero que vamos a crear, y comenzar a traducir con una interfaz gráfica bastante amigable.



Comentarios
  1. Hace tiempo hice algo parecido en Java.. recuerdo que era muy similar… es un tip muy interesante 🙂

    Responder

  2. ¿Solo funciona en Visual Studio?

    Responder

  3. Ojala fuera tan fácil para C++ 🙁

    Responder

  4. ROSA

    HOLA ESTA MUY INTERESANTE

    Responder

  5. Hola
    gracias, super util el post

    Responder

  6. Miguel

    Por eso amo C#

    Responder

Deja un comentario