Prática recomendada para fazer um aplicativo multilíngue em C # / WinForms? [fechadas]

94

Tenho procurado criar aplicativos adequados para várias linguagens em C #, já que preciso trabalhar em um pequeno projeto onde esse é o caso. Eu descobri basicamente duas maneiras de fazer isso:

Defina a propriedade Localizable de um formulário como true, defina a propriedade Language, preencha todos os rótulos e tal, e pronto. A principal desvantagem que vejo nisso é: como fazer outras coisas que não fazem parte de um formulário prontas para vários idiomas (por exemplo, janelas pop-up, arquivos de log ou janelas, etc).

Crie um arquivo de recurso, por exemplo 'Lang.en-us.resx' e um para cada idioma, por exemplo 'Lang.nl-nl.resx' e preencha-o com Strings. O IDE parece gerar uma classe para mim automaticamente, portanto, no código, posso apenas usar Lang.SomeText. A maior desvantagem que vejo nisso é: para cada formulário, eu mesmo preciso definir todos os rótulos e outras legendas no código (e não parece que a vinculação de dados funciona com esses recursos).

Tenho certeza, entretanto, de que existem outros métodos para fazer isso também.

Então, qual é a melhor prática? O que é mais fácil para aplicativos pequenos (alguns formulários, conexão de banco de dados, etc.) e o que é mais fácil para aplicativos maiores?

Mihai Limbășan
fonte
3
Tenho notado que perguntas não construtivas (ou outro tipo de perguntas "não válidas para SO") são uma das perguntas mais valiosas :) Esta também é uma boa pergunta (acho que votos provam isso). Aqui está uma boa demonstração de como para usar o suplemento multilíngue para suporte multilíngue youtube.com/watch?v=SNIyP1QQdVs
Prokurors
1
É tão difícil juntar todos os fragmentos de conhecimento em torno da internet às vezes, e acho essa pergunta inestimável agora. Certamente, há momentos em que fechar perguntas fáceis é menos construtivo do que deixá-las abertas, e eu acho que esse é um desses momentos. :)

Respostas:

20

Sempre usei arquivos de recursos para aplicativos multilíngues.
Existem muitos artigos na web que explicam como usá-los.

Eu usei duas maneiras diferentes:

  • Um arquivo de recurso por formulário
  • Um arquivo de recurso global

O arquivo / formulário de recurso é mais fácil de implementar, você só precisa inserir os valores no arquivo de recurso, mas acho essa abordagem mais difícil de manter, já que os rótulos estão dispersos por toda a aplicação.

O arquivo de recurso global permite centralizar todos os rótulos (imagens, etc.) em um arquivo (por idioma), mas isso significa definir manualmente os rótulos no carregamento do formulário. Este arquivo também pode ser usado para mensagens de erro etc.

Uma questão de gosto ...

Um último ponto, eu escrevo programas em inglês e francês, uso "en" e "fr" e não "en-US" e "fr-FR". Não complique as coisas, os diferentes dilelects do inglês (americano, inglês, australiano etc) têm poucas diferenças o suficiente para usar apenas um (o mesmo vale para o francês).

ThatBloke
fonte
2
Você precisa se preocupar com os dialetos às vezes. Por exemplo, os caracteres chineses são completamente diferentes no chinês tradicional (Taiwan) e no chinês simplificado (China continental).
MarkJ
1
A documentação do @MarkJ MSDN menciona que chinês tradicional e chinês simplificado não são dialetos (país / região), mas culturas neutras. Msdn: "Uma cultura neutra é uma cultura associada a um idioma, mas não a um país / região. Uma cultura específica é uma cultura associada a um idioma e a um país / região. Por exemplo," fr "é um idioma neutro cultura e "fr-FR" é uma cultura específica. Observe que "zh-CHS" (chinês simplificado) e "zh-CHT" (chinês tradicional) são culturas neutras. "
banda larga
Eu fiz isso recentemente com a ajuda de um link , 2 etapas não mencionadas lá: 1. Clique em todos os arquivos .resource e defina a propriedade "Build Action" como "Content". 2. Clique em todos os arquivos .resource e defina a propriedade "Copiar para diretório de saída" como "Copiar sempre".
Sourav
1
@Kiquenet Para obter uma resposta completa (com código) incluindo suporte amplo para .NET, consulte: stackoverflow.com/a/35813707/2901207
CularBytes
9

Recentemente, escrevi um programa com suporte aos idiomas alemão e inglês. Fiquei surpreso ao descobrir que, se eu simplesmente nomeasse meus recursos em inglês como LanguageResources.resx e meus recursos em alemão como LanguageResources.de.resx, ele selecionaria automaticamente o idioma correto. O ResXFileCodeGenerator cuidou de tudo para mim.

Observe que os campos nos dois arquivos eram iguais e quaisquer campos em alemão ainda não inseridos apareceriam no aplicativo como inglês, pois o idioma de arquivo mais não específico é o arquivo padrão. Ao procurar por uma string, ela vai do mais específico (ex .de-DE.resx) ao menos específico (ex. .Resx).

Para obter suas strings, use as chamadas ResourceManager.GetString ou ResourceManager.GetObject. O aplicativo deve fornecer o ResourceManager gratuitamente.

Rick Minerich
fonte
6

Para o benefício de outras pessoas que podem se deparar com isso (1+ anos após a última postagem), sou o autor de um produto de localização profissional que torna todo o processo de tradução extremamente fácil. É um suplemento do Visual Studio que extrairá todas as strings ".resx" de qualquer solução arbitrária e as carregará em um único arquivo que pode ser traduzido usando um aplicativo autônomo gratuito (os tradutores podem fazer o download do meu site). O mesmo suplemento importará as strings traduzidas de volta para sua solução. Extremamente fácil de usar com muitas proteções integradas, muitos sinos e assobios e ajuda online (você não precisará muito). Veja http://www.hexadigm.com

Larry
fonte
1
Isso deve ser adicionado como função nativa ao visualstudio! Ótimo software!
Caverna
Muito obrigado (apreciado). Eu teria concordado com você antes de iniciar o produto (cerca de 10 anos atrás), mas se a MSFT o implementasse hoje, ele me tiraria do mercado :)
Larry