¿Cuál es la mejor práctica para crear una aplicación en varios idiomas en C # / WinForms? [cerrado]

94

He estado buscando hacer aplicaciones adecuadas para múltiples lenguajes en C # ya que necesito trabajar en un pequeño proyecto donde este es el caso. He encontrado básicamente dos formas de hacer esto:

Establezca la propiedad Localizable de un formulario en verdadero, establezca la propiedad Language, complete todas las etiquetas y demás, y ya está. El mayor inconveniente que veo en esto es: cómo hacer que otras cosas que no forman parte de un formulario estén listas para varios idiomas (por ejemplo, ventanas emergentes, archivos de registro o ventanas, etc.).

Cree un archivo de recursos, por ejemplo 'Lang.en-us.resx' y uno para cada idioma, por ejemplo 'Lang.nl-nl.resx' y rellénelo con cadenas. El IDE parece generar una clase para mí automáticamente, por lo que en el código puedo usar Lang.SomeText. El mayor inconveniente que veo en esto es: para cada formulario, necesito configurar todas las etiquetas y otros subtítulos en el código (y no parece que el enlace de datos funcione con estos recursos).

Sin embargo, estoy seguro de que también existen otros métodos para hacer esto.

Entonces, ¿cuál es la mejor práctica? ¿Qué es lo más fácil para aplicaciones pequeñas (algunos formularios, conexión de base de datos, etc.) y qué escala mejor para aplicaciones más grandes?

Mihai Limbășan
fuente
3
Me he dado cuenta de que las preguntas no constructivas (o de otro tipo "no válidas para SO") son una de las preguntas más valiosas :) Esta también es una buena pregunta (creo que los votos prueban eso) Aquí hay una buena demostración de cómo para utilizar el complemento en varios idiomas para la compatibilidad con varios idiomas youtube.com/watch?v=SNIyP1QQdVs
Prokurors
1
A veces, es muy difícil juntar todos los fragmentos de conocimiento en Internet, y encuentro esta pregunta invaluable en este momento. Seguramente hay momentos en los que cerrar preguntas suaves es menos constructivo que dejarlas abiertas, y creo que este es uno de esos momentos. :)

Respuestas:

20

Siempre he utilizado archivos de recursos para aplicaciones en varios idiomas.
Hay muchos artículos en la web que explican cómo usarlos.

He usado dos formas diferentes:

  • Un archivo de recursos por formulario
  • Un archivo de recursos global

El archivo / formulario de recursos es más fácil de implementar, solo necesita ingresar los valores en el archivo de recursos, pero encuentro este enfoque más difícil de mantener, ya que las etiquetas están dispersas por toda la aplicación.

El archivo de recursos global le permite centralizar todas las etiquetas (imágenes, etc.) en un archivo (por idioma), pero significa configurar manualmente las etiquetas en el formulario de carga. Este archivo también se puede utilizar para mensajes de error, etc.

Una cuestión de gustos ...

Un último punto, escribo programas en inglés y francés, uso "en" y "fr" y no "en-US" y "fr-FR". No compliques las cosas, los diferentes dilelectos del inglés (americano, inglés, australiano, etc.) tienen pocas diferencias como para usar solo uno (lo mismo ocurre con el francés).

ThatBloke
fuente
2
A veces tienes que preocuparte por los dialectos. Por ejemplo, los caracteres chinos son completamente diferentes en chino tradicional (Taiwán) versus chino simplificado (China continental).
MarkJ
1
La documentación de @MarkJ MSDN menciona que el chino tradicional y el chino simplificado no son dialectos (país / región) sino culturas neutrales. Msdn: "Una cultura neutral es una cultura que está asociada con un idioma pero no con un país o región. Una cultura específica es una cultura que está asociada con un idioma y un país o región. Por ejemplo," fr "es un cultura y "fr-FR" es una cultura específica. Tenga en cuenta que "zh-CHS" (chino simplificado) y "zh-CHT" (chino tradicional) son culturas neutrales ".
banda ancha
Recientemente hice esto con la ayuda del enlace , 2 pasos que no se mencionan allí: 1. Haga clic en todos los archivos .resource y establezca la propiedad "Acción de compilación" en "Contenido". 2. Haga clic en todos los archivos .resource y establezca la propiedad "Copiar en el directorio de salida" en "Copiar siempre".
Sourav
1
@Kiquenet Para obtener una respuesta completa (con código) que incluye compatibilidad con .NET, consulte: stackoverflow.com/a/35813707/2901207
CularBytes
9

Recientemente escribí un programa con soporte tanto en alemán como en inglés. Me sorprendió descubrir que si simplemente nombraba mis recursos en inglés LanguageResources.resx y mis recursos en alemán LanguageResources.de.resx, automáticamente seleccionaba el idioma correcto. El ResXFileCodeGenerator se encargó de todo por mí.

Tenga en cuenta que los campos en los dos archivos eran los mismos y cualquier campo alemán que aún no se haya ingresado aparecería en la aplicación como inglés, ya que el idioma de archivo más no específico es el archivo predeterminado. Al buscar una cadena, va desde la más específica (por ejemplo, .de-DE.resx) a la menos específica (por ejemplo, .resx).

Para obtener sus cadenas, use las llamadas ResourceManager.GetString o ResourceManager.GetObject. La aplicación debería proporcionarle ResourceManager de forma gratuita.

Rick Minerich
fuente
6

Para beneficio de otros que puedan encontrar esto (más de 1 año después de la última publicación), soy el autor de un producto de localización profesional que hace que todo el proceso de traducción sea extremadamente fácil. Es un complemento de Visual Studio que extraerá todas las cadenas ".resx" de cualquier solución arbitraria y las cargará en un solo archivo que se puede traducir usando una aplicación independiente gratuita (los traductores pueden descargar esto de mi sitio). El mismo complemento importará las cadenas traducidas de nuevo a su solución. Extremadamente fácil de usar con muchas protecciones integradas, muchas campanas y silbidos y ayuda en línea (no la necesitará mucho). Ver http://www.hexadigm.com

Larry
fuente
1
¡Esto debería agregarse como función nativa a visualstudio! ¡Gran software!
Caverna
Muchas gracias (apreciado). Hubiera estado de acuerdo con usted antes de comenzar con el producto (hace unos 10 años), pero si MSFT lo implementara hoy, me dejaría fuera del negocio :)
Larry