Microsoft MVP

Email y Rss

email rss

Klout

Seguidores en facebook

Timeline de mi Twitter

Tienes preguntas?

Ideas de un Conejo
Más allá de los sistemas de información: (C#)=> videojuegos, soluciones a problemas interesantes y Sistemas Operativos
XNA
C#
Sistemas Operativos
Varios
Windows Phone
WinRT
XAML
Azure
HTML 5
Acerca de

C# – Aplicaciones multilenguaje ( globalización y localización )

August 29th, 2010 by JuanK

Follow @JuanKRuiz

Continuamente en mis conferencias y de paso por los foros a través de internet encuentro multitud de dudas e inquietudes al respecto de Cómo hacer una aplicación que soporte múltiples idiomas, ciertamente hay varias formas de conseguirlo y no todas esas formas son buenas en todos los escenarios, dependiendo de diferentes factores como por ejemplo el tamaño de la aplicación o la cantidad de idiomas soportados.

 

Sin embargo yo tengo mi método preferido, el cual considero que es válido para la inmensa mayoría de aplicaciones desarrolladas, el método de los archivos de recursos y ese es el tema principal de este artículo.

 

En tres pasos enseñare como hacerlo.

  1. Utilizar archivos de recursos para manipular las cadenas de texto
  2. Soportar múltiples lenguajes con los archivos de recursos
  3. Aislar los archivos de recursos para facilitar la actualización

 

Finalmente relacionare otros temas de interés para tener una funcionalidad más robusta.

 

1. UTILIZAR ARCHIVOS DE RECURSOS PARA MANIPULAR LAS CADENAS DE TEXTO

PREPARAR LA APLICACION

Lo primero que debemos hacer es crear una aplicación de Windows Forms con 1 ListBox y 5 Botones como se ven la siguiente imagen.

image

Para fines de este ejemplo con excepción de los textos del listbox ninguno de los textos es obligatorio.

Ahora, dentro de la solución, creamos una carpeta la cual llamaremos “Recursos Localizables”, justo como se ve a continuación.

image

Ahora creamos un nuevo archivo de recursos y lo llamaremos StringResources, debemos crearlo junto dentro de la carpeta “Recursos Localizables” que acabamos de crear.

 

Revisamos las propiedades del archivo recién creado y nos aseguramos que en Build Action diga “Embedded Resource”.

 

Ahora 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.

 

image

 

Para efectos del ejemplo es importante hacerlo con los valores que ven.

 

UTILIZAR EL ARCHIVO DE RECURSOS EN NUESTRA APLICACION

Esta parte es muy sencilla, creamos un método llamado AplicarIdioma con el siguiente código:

private void AplicarIdioma()
{
    button1.Text = StringResources.ButtonLabel1;
    button2.Text = StringResources.ButtonLabel2;
    button3.Text = StringResources.ButtonLabel3;
    button4.Text = StringResources.ButtonLabel4;
    button5.Text = StringResources.ButtonLabel5;
    this.Text = StringResources.WindowTitle;
}

Y lo llamamos desde el Form_Load, ejecutamos la aplicación y obtenemos esto

 

image

 

2. SOPORTAR MÚLTIPLES LENGUAJES CON LOS ARCHIVOS DE RECURSOS

Casi todo el trabajo de codificación ha terminado ahora viene ‘la magia’ . En la carpeta “Recursos Localizables” creamos 3 copias de el archivo de recursos original, nos aseguramos de que cada una de ellas quede con los siguientes nombres.

 

image

 

Ahora editamos cada uno de ellos dejándolos con los textos que se ven a continuación (pueden ayudarse de traductores online para obtener los caracteres en japonés).

 

image

image

 

 

 

 

 

 

 

 

 

 

image

 

Una vez hecho esto procedemos a modificar el evento SelectedIndexChanged del listbox y lo dejamos así:

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    Thread.CurrentThread.CurrentUICulture = new CultureInfo((string)listBox1.SelectedItem);
    AplicarIdioma();
}

Lo que hemos hecho es hacer que cada vez que se de clic en uno de los miembros de la lista se cambie la cultura de la interfaz de usuario del hilo actual de la aplicación, y dado que cada miembro del listbox es el nombre corto de cada una de las tres culturas que tenemos, basta con crear un nuevo objeto de tipo CultureInfo que coincida con el nombre corto del ítem seleccionado.

 

PORQUÉ Y PARA QUÉ?

Esto que acabamos de hacer tiene un importante objetivo.

Cuando se utiliza un archivo de recursos el CLR  busca primero cual es la cultura del hilo actual, entonces con ese dato automáticamente utiliza el archivo de recursos cuya nomenclatura coincide con esa cultura, sino encuentra dicho archivo de recursos entonces el CLR utiliza el archivo de recursos que no tiene cultura específica.

 

FUNCIONA!

Ejecutamos la aplicación, damos clic en cada uno de los ítems del listbox y podemos ver esto Sorpresa:

 

CultureAnimation

 

3. AISLAR LOS ARCHIVOS DE RECURSOS PARA FACILITAR LA ACTUALIZACIÓN

Hasta aquí nuestro proyecto ya esta terminado y ya estamos en capacidad de hacer aplicaciones multilenguaje, sin embargo como tip final de este artículo les recomiendo que si piensan incluir alguna funcionalidad de actualizaciones en sus aplicaciones y tienen planeado actualizar o incluir nuevos idiomas en su aplicación, coloquen los archivo de recursos en una dl por aparte donde solo se coloquen 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 utilicen para tal fin, recuerden establecer en cada archivo de recursos el modificador de acceso en public como lo muestra esta imagen.

 

image

 

LECTURAS RECOMENDADAS

Este tema puede ir aún más allá de donde lo hemos llevado, los invito averiguar acerca de como utilizar ensamblados satélite para brindar algunas funcionalidades adicionales y que intenten utilizar la clase CultureInfo y demás relacionadas para detectar el idioma de la interfaz de usuario actual o el idioma con el cual se ha instalado el sistema operativo.

 

En Sistemas como Windows 7 si instalas el sistema en inglés y luego le actualizadas el lenguaje a español, algunas funciones te seguirán reportando que el idioma del sistema esta en inglés por lo que hay que hacer un trabajo adicional para detectar el idioma actual de la interfaz de usuario actual.

 

Pueden bajar la solución completa aquí: Articulo Aplicaciones multilenguaje ( globalización y localización )

 

Espero que le puedan sacar mucho provecho.

 

Saludos.

Print Friendly

Follow @JuanKRuiz

  • 28 Comentarios »
  • Publicado en la categoría 'C#'

28 comentarios to “C# – Aplicaciones multilenguaje ( globalización y localización ) ”


  • Anonymous Says:
    August 30th, 2010 at 8:40 am  

    [...] [...]

  • Ideas de un Conejo Says:
    August 30th, 2010 at 8:48 am  

    [...] Este artículo es una copia cruzada del artículo original en mi blog:C# – Aplicaciones multilenguaje ( globalización y localización )————————————————————————————- [...]

  • By AlaN Says:
    August 30th, 2010 at 11:21 am  

    Uyyyy… excelente man… un ejemplo practico :D

    SuerteX :)

  • Ideas de un Conejo Says:
    August 30th, 2010 at 12:29 pm  

    [...] C# – Aplicaciones multilenguaje ( globalización y localización )————————————————————————————- [...]

  • C# – Aplicaciones multilenguaje ( globalización y localización ) - MVP Factor - Site Home - MSDN Blogs Says:
    August 31st, 2010 at 5:24 pm  

    [...] 0 tweetmeme_source = 'ferglo'; Nuestro buen amigo Juan Carlos Ruiz ha escrito un interesante artículo, aquí el [...]

  • Tune Up Your PC » Post Topic » C# – Aplicaciones multilenguaje ( globalización y localización ) Says:
    August 31st, 2010 at 11:31 pm  

    [...] buen amigo Juan Carlos Ruiz ha escrito un interesante artículo, aquí el [...]

  • Fran Alcarranza Says:
    September 5th, 2010 at 12:16 pm  

    Genial, como siempre. Llevo siguiendo tu blog desde hace mucho tiempo y al final me he animado a dejarte un comentario.
    Sería mucho pedir solicitar tu ayuda para una cosa en la que estoy atascado en C# y nadie es capaz de ayudarme?
    Muchas gracias por compartir lo que sabes y felicidades por tu blog, debo de decir que es uno de los mejores.

  • JuanK Says:
    September 5th, 2010 at 12:23 pm  

    no hay problema, enviame un email con tus dudas y si puedo ayudarte dejame publicarla en el blog!

    saludos

  • Fran Alcarranza Says:
    September 5th, 2010 at 12:32 pm  

    Muchisimas gracias por tu ayuda !
    La verdad es que estoy desesperado porque no encuentro ayuda y gracias a ti he visto un rayo de luz.
    Cual es tu mail, es que no lo encuentro por ningun lado en la página?

    Un saludo !

  • yelinna Says:
    September 14th, 2010 at 12:11 pm  

    Gracias por el dato, JuanK!! Siempre quise saber cómo hacer una app multilenguaje.

  • Eduardo Says:
    October 13th, 2010 at 5:44 pm  

    Hola muy buena tu aportacion pero por ejemplo aver si puedes ayudarme en los botones supongamos ponemos un MessageBox en los idiomas al seleccionarlos me sale el mismo hay una manera de poder cambiar los mensajes a su idioma seleccionado????

    gracias

  • JuanK Says:
    October 13th, 2010 at 7:32 pm  

    Eso es todo un tema que por fortuna tengo cubierto en este artículo: http://juank.black-byte.com/c-cambiar-texto-botones-messagebox/

  • Damian Says:
    November 17th, 2010 at 9:26 am  

    En mi caso en mi sitio tengo una base de datos que posee mucha informacion en español, es un glosario de terminos, asi que imaginate lo largo que es. Y mi idea es que el usuario pueda seleccionar su idioma y buscar el termino en cuestion con su cultura. Como seria en este caso?, ya es algo dinamico.
    Por supuesto que tambien quiero cambiar el texto que esta fijo en mi sitio, o sea quiero cambiar todo. Se puede lograr eso?.

  • MariaA Says:
    December 3rd, 2010 at 3:27 am  

    Hola, muchas gracias por el post. Quería preguntarte si hay alguna manera de que el StringResource capture el nombre de todos los objetos en el formulario, para no tener que ingresarlos uno por uno? Que sea únicamente cuestión de cambiar el valor respectivo? Gracias.

  • AlAN Says:
    December 14th, 2010 at 5:09 pm  

    no me funciona, tengo el codigo exactamente igual y no me funciona
    al momento de darle click al listbox

    espero me puedar ayudar Gracias

  • JuanK Says:
    December 14th, 2010 at 5:11 pm  

    Algo habras de haber echo mal…

    ya bajaste el ejemplo completo para compararlo?

  • Alvaro Says:
    January 27th, 2011 at 5:41 pm  

    Excelente articulo! Me sirvio muchisimo! En verdad te lo agradezco! =)

  • Luis Says:
    February 4th, 2011 at 12:51 pm  

    Funciona tambien para Web???

  • JuanK Says:
    February 4th, 2011 at 1:49 pm  

    si para Web tambien aplica!

  • Eduardo Says:
    April 26th, 2011 at 7:39 am  

    Hola, muy bueno el artículo me sirvio bastante, pero tengo consulta, yo intento usar el idioma japones, pero solo me salen pequeñas barritas, no me sale como lo veo en tu post, a que crees que se deba??, USO WINDOWS XP SP1

  • JuanK Says:
    April 26th, 2011 at 8:23 am  

    Debes ir a la configuracion regional de XP y en idiomas agregar soporte para lenguajes orientales, debe decir algo asi como IMEI.

  • Guille Says:
    June 2nd, 2011 at 7:05 pm  

    Excelente ayuda!, solo una duda, como se haria para guardar esos cambios de idioma, es decir si opto por el ingles o el español, como guardar esos cambios para que cuando la aplicacion vuelva a mostrarse mantenga esos cambios de idioma!!

    Gracias por tú tiempo!!

  • Gabriel Says:
    October 24th, 2011 at 11:24 pm  

    Oye una pregunta sabes como aplicar eso para C++

  • JuanK Says:
    November 5th, 2011 at 8:58 am  

    mismos principios aplian seguramente , sobre todo si usas C++/CLI, pero sino es asi deberas buscar otras alternativas similares.

  • JuanG. Says:
    December 16th, 2011 at 4:08 pm  

    Juan Carlos, como le va, primero felicitarlo excelente blog excelente contenido, me gustaria realizarle la siguiente consulta, estoy realizando una aplicación con mvc3 y c#, con oracle, para ello estoy llamando procedures o funciones, que me retornar cursores o valores con los selects del caso, esos cursores los convierto a objetos datatable, y los envío a la aplicacion modelos-controladores. Según la documentacion y ejemplos de mvc, observo que siempre están apuntando a usar entidades de la base de datos sqlserver toman las tablas como objetos, y casi que es nula la documentacion para oracle, considera ud eficiente la forma en que estoy trabajando?, que me podria recomendar.
    Muchas gracias.

  • Andy Says:
    February 9th, 2012 at 11:30 am  

    Muchas gracias. Felicidades por el blog.

  • Juanch Says:
    May 19th, 2012 at 1:47 pm  

    Muchísimas gracias, aunque trabajo vn Vb.Net creo que me servirá de mucho! :)

  • Edgar J Acevedo Says:
    December 6th, 2012 at 3:13 pm  

    Hola, muy buen tuto, felicidades,

    oye solo tengo una pregunta, o un problema, lo que pasa es que estoy realizando una aplicación Ingles, Español y Coreano, solo que en los labels y botonos no aparece los caracteres coreanos, sol dos como [][] pero en el menustrip si aparece el caracter normal, sabes que es lo que esta pasando?? gracias

Deja un comentario

Redes Sociales

Follow @JuanKRuiz
Answer Questions

Busca en el blog

Artículos Relacionados

  • El extraño caso de la ventana sin borde que no se deja maximizar ni minimizar
  • C# – Como modificar el comportamiento del botón minimizar, maximizar, etc.
  • C# – El extraño caso de la ventana sin borde que no se deja cambiar de tamaño
  • C# – Recibir notificaciones cuando hayan cambios de sesión parte 2 – Windows Forms
  • Artículos Relacionados

  • El extraño caso de la ventana sin borde que no se deja maximizar ni minimizar
  • C# – Como modificar el comportamiento del botón minimizar, maximizar, etc.
  • C# – El extraño caso de la ventana sin borde que no se deja cambiar de tamaño
  • C# – Recibir notificaciones cuando hayan cambios de sesión parte 2 – Windows Forms
  • Nube de Temas

    API - Azure - C# - codigo - Forms - IE - IE9 - Image - imagenes - IT - Microsoft - MVP - Pinned - PowerShell - Proceso - rendimiento - RSS - sistema - Sistemas Operativos - Site - Visual - WCF - Windows - Windows 8 - Windows Store - WinRT - WndProc - WPF - XAML - XNA

    Blogs recomendados

  • VBCodigoPocketPC Espacio para tratar temas de programacion para dispositivos moviles, Pocket PC, Compact Framework, Embbeded Visual Basic, Visual Basic.NET , C# (C Sharp)
  • Róbinson Moscoso Estaré publicando acá cosas sobre tecnologia .NET, situacioines cotidianas de las que voy aprendiendo… sirve como extensión de memoria.
  • .Net C# Blog de Nelsón Venegas
  • Warnov Microsoft Developer Evangelist
  • IT LIfe Blog de mi Hermano que esta en el lado claro: IT
  • Sorey Garcia Una chica del común con la firme intención de no serlo
  • Black Byte videojuegos, modelado y animación 3d
  • Road to IT World Cosas interesantes de IT
  • Marcela Chitiva Un poco de esto… un poco de aquello
  • Surviving the Nigth El mejor blog para aquellos que nos gustan los “internals”
  • Meta

    1. Log in
    2. WordPress

    Ideas de un Conejo is powered by Wordpress. Theme designed by Juan Carlos Ruiz.