Que sistema utilizariais para crear un programa en c# que soportase diferentes idiomas? Tal vez, un XML por idioma, con un codigo numerico por cada string? :roll:
La globalización que trae por defecto el Visual mete todas esas cosas en un archivo de recursos (un resx). Te vale eso?
Un saludo!
Vicente
Yo para los textos siempre he usado ficheros de recursos.
Y los valores que se guardan en una BD (por ejemplo los elementos de un combo) los sigo manteniendo en la BD pero modificando las tablas para soportar el multilenguaje. En //www.panoramabox.com creo que habia un articulo sobre esto.
Hombre, los archivos de recursos están bastante bien porque no solo guardan los textos, también guardan posiciones, tamaños, etc etc. Los botones pueden variar de tamaño según el texto que lleven dentro, etc etc.
Un saludo!
Vicente
Si os referiis a este metodo:
http://www.devhood.com/tutorials/tutorial_details.aspx?tutorial_id=211
lo he probado, pero no me acaba de convencer. Me genera una DLL para cada idioma que ademas debe de estar dentro de un directorio (a pesar de que en el recurso ponga "Recurso incrustado"). Ademas tb tiene la pega de que si quiero darle al usuario la posibilidad de poder traducirlo, no puede sin el codigo fuente. ¿alguna alternativa?
Cita de: "Vicente"Hombre, los archivos de recursos están bastante bien porque no solo guardan los textos, también guardan posiciones, tamaños, etc etc. Los botones pueden variar de tamaño según el texto que lleven dentro, etc etc.
Un saludo!
Vicente
Yo tb uso ese sistema...lo que no he logrado conseguir es cambiar de indiomas mientras se ejecuta la App. Vicente, sabes algo sobre esto ?
Un saludo.
El motivo de que no se pueda cambiar durante la aplicacion es que el .net el idioma es automatico si se hace con el sistema que trae el, es decir, si un italiano ejecuta la aplicacion y tu aplicacion da el soporta para idioma italiano, esta persona lo vera directamente en italiano, si es frances pues frances, etc. (siempre que hableis de .net claro)
Si es para vc++6.0 tienes esta solucion:
HINSTANCE hInst = LoadLibrary( szIdiomaDLL );
if( hInst != NULL )
{
afxCurrentResourceHandle = hInst;
}
Este codigo te cambiara todos los recursos de la aplicacion a los de la dll, este sistema es el que usaba para el wic messenger.
Desde .NET se puede cambiar "el idioma" recorriendote con un bucle todos los controles y accediendo al recurso pertinente para cambiarle el .text
Esa es la forma q empleo, pero buscaba otra más elegante, supongo q .NET debe prever esta situación y debe tener un CambiameElIdiomaPorElMorro (NuevoIdima)
Pues yo he visto una forma de hacer ese cambio, lo vi creo que en la página del guille :( lo que no recuerdo como era. Pero sé, que no era recorriendote los controles.
Cita de: "zupervaca"El motivo de que no se pueda cambiar durante la aplicacion es que el .net el idioma es automatico si se hace con el sistema que trae el, es decir, si un italiano ejecuta la aplicacion y tu aplicacion da el soporta para idioma italiano, esta persona lo vera directamente en italiano, si es frances pues frances, etc. (siempre que hableis de .net claro)
Si es para vc++6.0 tienes esta solucion:
HINSTANCE hInst = LoadLibrary( szIdiomaDLL );
if( hInst != NULL )
{
afxCurrentResourceHandle = hInst;
}
Este codigo te cambiara todos los recursos de la aplicacion a los de la dll, este sistema es el que usaba para el wic messenger.
En VC++ 6.0 funciona tambien automático, simplemente se hacen más copias de los recursos, poniendo la misma ID, pero cambiando el idioma del recurso (en el combo que hay debajo de la ID)
un saludo
En el wic messenger lo tuve que hacer asi ya que de esta manera solo descargabas la dll del idioma, cosas del tamaño de descarga.
Cita de: "Diferencial"Pues yo he visto una forma de hacer ese cambio, lo vi creo que en la página del guille :( lo que no recuerdo como era. Pero sé, que no era recorriendote los controles.
Debe de ser esto:
http://www.elguille.info/colabora/NET2006/miliuco_web2.htm
Y digo yo... no seria una mejor idea un ficherito de texto plano ( utf-8 ) con un código numerico y una string por linea? No se,,.... lo de una .dll me parece absurdo... esperaba que en c# se usase un .xml o algo asi... :?
En csharp puedes usar el sistema nativo que explique antes:
(http://img136.imageshack.us/img136/6214/dibujo1ar.th.jpg) (http://img136.imageshack.us/my.php?image=dibujo1ar.jpg)
Recientemente hice unas pruebas para cambiar idiomas con ficheros .ini (eran en C++/MFC, no C#, pero supongo que sirve igual).
Más o menos:
- Cada contenedor se crea heredando de interfaz ITraducible, que tiene el método ActualizarTraduccion();
- Un Singleton mantiene el acceso al ini actual, teniendo como método GetMensaje( clave );
- Las traducciones se indexan en el ini con "clave = valor en este idioma"
- Cuando se cambia el idioma, se llama a ActualizarTraduccion() para cada contenedor, que debe llamar a ActualizarTraduccion() de cada contenedor hijo, así como a sus componentes, quendando al final métodos como:
ActualizarTraduccion() {
m_labelX1.SetText( SingletonTraductor.GetMensaje( clave1 );
m_labelX2.SetText( SingletonTraductor.GetMensaje( clave2 );
m_contenedor1.ActualizarTraduccion();
}
Ignora por completo los mecanismos de Microsoft, pero es lo que yo quería.
Esto... en .NET es bástante más fácil que hacer lo de los controles de MA]Mestre u otras cosas que comentáis (en un formulario).
Los formularios tienen una propiedad que es Localizable y otra que es Language. Esto hace que todas las cosas que se hagan (textos, posiciones, tamaños, etc etc), se localicen para la cultura seleccionada. Si se selecciona otra cultura, pues todo lo que se haga es para esa otra cultura, etc etc.
Luego la aplicación mira el idioma del SO y según eso lanza la aplicación con una cultura u otra. Supongo que si cambias la cultura a mano desde el código cargará los recursos adecuados también (algo parecido al CambiameElIdiomaPorElMorro (NuevoIdima) que comentaba MA]Mestre).
Un saludo!
Vicente
Cita de: "AbelNightroad"Y digo yo... no seria una mejor idea un ficherito de texto plano ( utf-8 ) con un código numerico y una string por linea? No se,,.... lo de una .dll me parece absurdo... esperaba que en c# se usase un .xml o algo asi... :?
Se suelen utilizar DLL porque hay que almacenar recursos enteros, es decir, no solo las cadenas de texto, sino botones, menus, diálogos... Ya que la longitud de las cadenas de texto varía con cada idioma y si haces solo un cambio del texto te pueden salir todos los botones con el texto cortado. Pero vamos, si lo haces "a pelo", cambiando los textos de los recursos uno a uno te lo puedes currar como quieras...
De todas formas, en el caso del fichero de texto, mejor utilizar Unicode, por si te da por traducirlo a alguna cosa rara.
un saludo
Por comentar mi caso particular. Llevaba un tiempo re-convirtiendo todo mi código para soportar Unicode. Hace dos dias por fin acabé de adaptar todo el código. Yo me he decidido por utilizar ficheros de texto en Unicode, ya que solo uso menús y tooltips en mi aplicación, nada de diálogos. He cogido todos los textos que aparecen en mi programa y los he metido en un fichero de texto, después lo incluyo directamente en el programa como un resource. Hice una petición en un foro especializado y en un dia tengo el programa traducido a 8 idiomas. Incluir un nuevo fichero me lleva un par de minutos.
Según como sea la aplicación y el número de idiomas que tengas pensado meter, este sistema de ficheros de texto me parece perfecto. Claro que yo no tengo diálogos con botones que se puedan descuadrar. Esta es mi aplicación, es un visor panorámico, lo mismo que mi plugin si lo habeis vito, pero en modo local: http://www.devalvr.com/descargas/dps/playerUnicode.zip y los ficheros que me ha ido mandando la gente: http://www.devalvr.com/fiero/translations.zip
En el menú contextual he incluido un submenú para cambiar de idioma. Lo hago como se comentó por aquí, recorriendo todos los controles, no es nada engorroso, con un par de "for" en la mayoría de los casos está hecho.
un saludo
Al final estoy usando el fichero plano, y creo que para lo que estoy haciendo va bien. No tengo previsto un numero de traducciones en concreto; de "serie" me conformo con ingles y español.