Por que sua aplicação C# precisa de internacionalização?
\nImagine: você escreveu um ótimo serviço para gerenciar notas. Tudo funciona, a interface é limpa, os usuários estão satisfeitos. Mas apenas os falantes de russo. Assim que você entra no mercado dos EUA ou da Alemanha, o projeto para. Não porque o código é ruim, mas porque o botão «Сохранить» não se transforma em «Save», e a mensagem «Ошибка ввода» assusta o estrangeiro.
\nEsse é o problema da localização. No mundo .NET, a solução é chamada de internacionalização C# (ou i18n — da palavra "internationalization", onde 18 é o número de letras entre i e n). Se você usa C# e a plataforma .NET (Core, 5/6/7/8/9), já tem sob o capô um poderoso conjunto de ferramentas para tornar sua aplicação multilíngue. Neste artigo, vamos explorá-lo na prática: desde recursos simples até a troca de idioma "em tempo real".
\n\nFundamentos: o que é cultura e idioma neutro
\nAntes de escrever código, vamos entender os termos. No .NET, a localização é gerenciada por duas classes principais do namespace System.Globalization:
- \n
- CultureInfo — objeto que descreve o idioma e os padrões regionais (por exemplo,
ru-RU,en-US,de-DE). \n - CurrentUICulture — a cultura atual da interface do usuário. É nela que o sistema se baseia ao procurar traduções. \n
- CurrentCulture — formato de datas, números, moeda. Também pode ser alterado, mas para traduções, o primeiro é o importante. \n
Em aplicações C#, normalmente usamos arquivos de recurso (.resx). São arquivos XML que armazenam strings, imagens e outros dados vinculados a uma cultura específica. Por exemplo:
\n- \n
Messages.resx— strings padrão (geralmente inglês). \n Messages.ru.resx— tradução para russo. \n Messages.de.resx— tradução para alemão. \n
Quando a aplicação é iniciada, o .NET seleciona automaticamente o arquivo correspondente à UICulture atual. Se não houver correspondência exata, usa o arquivo neutro (base).
Criando o primeiro arquivo de recurso no Visual Studio
\nSuponha que temos um aplicativo de console ou um projeto ASP.NET Core. Vamos adicionar uma pasta Resources e, dentro dela, o arquivo Strings.resx. Preencha-o:
Nome | Valor\n-------------|-------------------\nWelcomeMsg | Welcome to our app!\nGoodbyeMsg | Goodbye!\n\nAgora, crie Strings.ru.resx:
Nome | Valor\n-------------|-------------------\nWelcomeMsg | Добро пожаловать в наше приложение!\nGoodbyeMsg | До свидания!\n\nObserve: os nomes das chaves devem coincidir. Após salvar, o Visual Studio gerará automaticamente a classe Strings com acesso às strings por meio de propriedades estáticas.
Alternância programática de idioma
\nPara que a internacionalização C# funcione, você precisa definir a cultura desejada no início da execução da aplicação (por exemplo, em Main ou Startup). Veja como fica:
using System.Globalization;\nusing System.Threading;\n\n// Define o idioma da interface como russo\nCultureInfo culture = new CultureInfo("ru-RU");\nThread.CurrentThread.CurrentUICulture = culture;\nThread.CurrentThread.CurrentCulture = culture; // para formatos de data/número\n\n// Agora acessa os recursos\nConsole.WriteLine(Strings.WelcomeMsg); // Exibe: Добро пожаловать в наше приложение!\n\nSe você quiser permitir que o usuário alterne o idioma "em tempo real" (sem reiniciar), basta chamar essas linhas novamente após a mudança de cultura. No ASP.NET Core, usa-se middleware para isso:
\napp.UseRequestLocalization(new RequestLocalizationOptions\n{\n DefaultRequestCulture = new RequestCulture("en-US")