Correcta localización de una aplicación WinForms

Tengo una aplicación WinForms que quiero traducir a varios idiomas. Sin embargo, no tengo ninguna experiencia con la localización de una aplicación WinForms, y encuentro información muy contradictoria sobre este tema.

Básicamente, lo que quiero es:

  • En el código fuente, solo quiero un archivo por idioma
  • este archivo se comstack en la aplicación principal en la comstackción: no hay conjuntos de satélites ni archivos de datos externos después de comstackr la aplicación
  • El usuario puede seleccionar el idioma, no necesito / quiero detección automática en función del sistema operativo
  • Esto debería contener principalmente strings y ints, pero también un CultureInfo

La mayoría de las soluciones que he visto tienen un archivo .resx por formulario y / o ensamblajes satelitales externos.

¿Tengo que hacer mi propio? ¿O hay algo en el marco ya?

.Net Framework 3.5 SP1 si eso es importante.

Editar: en su mayor parte, Visual Studio ya ofrece soporte para lo que quiero, pero hay dos problemas. Cuando establezco Form.Localizable en true, tengo este bonito soporte de diseñador, pero esto genera un resx por formulario. La idea de anularla manualmente en InitializeComponent falla porque es un código escrito por el diseñador que se sobrescribirá regularmente. Teóricamente, solo quiero a) anular la creación del ComponentResourceManager para apuntarlo a mi resx global yb) cambiar la llamada a ApplyResources a la sobrecarga que toma un CultureInfo como tercer parámetro.

Parece como si tuviera que agregar una llamada de función a mi constructor que llama invocada después de InitializeComponent () y anula su comportamiento. Eso parece terriblemente ineficiente, pero Visual Studio tiene razón cuando advierte sobre tocar InitializeComponent. Por el momento, estoy rodando mi propio Framework de localización WinForms …

Acabo de completar un proyecto C # .Net 3.5 con un problema similar. Estábamos escribiendo el plugin WinForms para una aplicación multilingüe existente con 8 idiomas (incluido el inglés).

Así es como lo hicimos:

  1. Cree todos nuestros formularios y UI en el idioma predeterminado, inglés.

  2. Coloque todas las cadenas internas en un archivo de recursos (cosas que no están vinculadas directamente a un formulario como los mensajes de error personalizados y los títulos del cuadro de diálogo, etc.)

Una vez que habíamos completado la mayor parte del trabajo y las pruebas, lo localizamos.

  1. Cada formulario ya tenía un archivo .resx pero estaba vacío. Establecimos la propiedad ‘Localizable’ en verdadero, el archivo .resx se llenó con elementos como tamaños de botones y cadenas.

  2. Para cada uno de los otros idiomas, cambiamos la propiedad ‘Idioma’ en el formulario. Elegimos la versión básica de cada idioma, por ejemplo: ‘español’ en lugar de ‘español (Chile)’, etc. para que funcione para cada dialecto ‘español’, creo.

  3. Luego revisamos cada control, traducimos su texto y cambiamos el tamaño, si es necesario. Esto creó un .resx por combinación de idioma y forma.

Luego nos quedamos con, para 8 idiomas, 8 .resx para cada formulario y 8 .resx para las cadenas generales. Cuando se compiló, la carpeta de salida tenía el .dll que estábamos creando y luego una subcarpeta para cada idioma con un .resources.dll en él.

Pudimos probar las versiones de la IU en el diseñador simplemente cambiando la propiedad del idioma para verificar que tuviéramos las cadenas y el diseño correctos.

Con todo, una vez que lo entendimos, fue bastante fácil e indolora.

No necesitamos escribir ningún ajuste personalizado para la carga del formulario

Estaba haciendo una pregunta similar sobre ASP.NET y obtuve una primera respuesta, esta herramienta y su flujo de trabajo también pueden ser algo para usted, eche un vistazo: Lingobit Localizer

Parece que puede cargar su aplicación Winforms y le permite comenzar a traducir sus tags, etc. y ver los formularios mientras lo hace. Muchas otras funciones, como la traducción incremental y la memoria de traducción (si usa los mismos términos una y otra vez).

Parece bastante prometedor (para Winforms); sin embargo, no lo he usado yo mismo.

Aquí hay una lista extensa de posibles herramientas de localización de .NET : no estoy seguro de qué tan bien funcionen y qué cubren. Eche un vistazo, quizás encuentre lo que está buscando.

Bagazo

Este es un gran tema y hay muchas maneras de lograr lo que quieres. El marco proporciona la base, pero una solución completa requiere que implemente ciertos elementos usted mismo.

Por ejemplo, la implementación del marco predeterminado es crear un archivo .resx para cada recurso. En ASP.Net esto significa cada control / página de usuario / servidor. Esto no se presta para un mantenimiento fácil y si desea mover recursos a una base de datos, necesita implementar su propio proveedor.

Mi familiaridad con Winforms es limitada, pero si está usando Silverlight o WPF, entonces lea el trabajo de Guy Smith-Ferrier sobre el tema en: http://www.guysmithferrier.com/category/Internationalization.aspx . También tiene algunos conjuntos de herramientas que pueden hacer su vida más fácil en: http://www.dotneti18n.com/Downloads.aspx .

He trabajado con él antes y nunca he encontrado a nadie con una mejor comprensión del tema.

No tengo una solución para su primer y segundo requisito, pero tenga en cuenta que localizar un formulario no es tan simple como traducir cada palabra. Debe verificar que cada texto traducido encaje en su control respectivo. Además, tal vez tengas un ícono o una imagen que necesites cambiar en otra cultura.

Para su punto tres, puede cambiar el idioma manualmente con las siguientes líneas:

 CultureInfo ci = new CultureInfo("fr"); Thread.CurrentThread.CurrentUICulture = ci; 

Lo que estás pidiendo:

  1. sin archivos de recursos satelitales
  2. solo un tamaño y ubicación de control por formulario.
  3. muchos idiomas incrustados en el ejecutable.

No es posible en el IDE de vanilla Visual Studio.

Lo que se requiere es un trabajo personalizado, que básicamente cumpla con todos estos pasos:

  • Adquiera un administrador de recursos personalizado que maneje los archivos de recursos de TMX.
  • Coloque todas sus cadenas localizables en un archivo TMX.
    • Haga de este archivo TMX un recurso incrustado en su proyecto.
  • En su constructor de Formulario, cree su TMX ResourceManager, cargando el archivo TMX desde sus recursos incrustados.
  • En su código, use su ResourceManager tmx en lugar del ResourceManager predeterminado para obtener cadenas localizadas.
    • Deje que el formulario use el ResourceManager predeterminado para obtener todas las cosas del diseñador excepto las cadenas.
  • Obtenga su archivo TMX con las nuevas traducciones de idiomas.
    • Se pueden agregar más en la próxima versión de su proyecto, solo agregándolos a este archivo TMX antes de comstackr.

RECURSOS: (no es una lista exhaustiva, de ninguna manera)