Internacionalização (i18n) em C# (.NET): Guia Completo
Internacionalização (frequentemente abreviada como i18n — do inglês "internationalization", onde entre a primeira letra 'i' e a última 'n' existem 18 caracteres) — é o processo de projetar software de forma que ele possa ser facilmente adaptado para diferentes idiomas e padrões regionais sem a necessidade de alterar o código-fonte. No ecossistema C# (.NET), a internacionalização é uma funcionalidade nativa e poderosa que permite aos desenvolvedores criar aplicações verdadeiramente multilíngues.
Neste artigo, veremos detalhadamente como implementar i18n no .NET (incluindo .NET Core, .NET 5/6/7/8 e .NET Framework). Você aprenderá sobre conceitos-chave — culturas, arquivos de recurso (RESX), localização de strings, imagens e formatação de dados.
Conceitos Principais
Antes de ir para o código, é importante entender dois termos-chave:
- Globalização (Globalization): O processo de projetar uma aplicação que suporte interfaces localizadas e dados regionais para usuários de diferentes culturas. No .NET, isso é alcançado através das classes
CultureInfoeRegionInfo. - Localização (Localization): O processo de adaptar uma aplicação já globalizada para um idioma/região específico (por exemplo, tradução de textos, configuração de formatos de data e moeda).
O .NET usa culturas (Cultures), que são definidas no formato idioma-região (por exemplo, pt-BR — português (Brasil), en-US — inglês (EUA), de-DE — alemão (Alemanha)).
Passo 1: Criando arquivos de recurso (.resx)
A principal forma de armazenar strings localizadas no .NET são os arquivos de recurso (.resx). Eles são arquivos XML que são compilados no assembly.
Vamos considerar um exemplo. Criaremos arquivos para os idiomas russo e inglês:
- Resources.resx — arquivo de recurso padrão (geralmente em inglês).
- Resources.ru.resx — arquivo para o idioma russo.
- Resources.de.resx — arquivo para o idioma alemão.
Dentro de cada arquivo, adicionaremos recursos de string com os mesmos nomes, mas valores diferentes:
Resources.resx (idioma padrão — en-US):
Name: GreetingValue: Hello, World!
Name: WelcomeMessageValue: Welcome to our application!Resources.ru.resx (Russo):
Name: GreetingValue: Привет, мир!
Name: WelcomeMessageValue: Добро пожаловать в наше приложение!Passo 2: Acessando recursos no código C#
O .NET gera automaticamente uma classe fortemente tipada para acessar os recursos. Suponha que os arquivos estejam na pasta Resources do projeto. Então o acesso será assim:
using System;using System.Globalization;using System.Threading;
class Program{ static void Main(string[] args) { // Define a cultura para a thread atual Thread.CurrentThread.CurrentUICulture = new CultureInfo("ru-RU"); Thread.CurrentThread.CurrentCulture = new CultureInfo("ru-RU");
// Obtém as strings localizadas string greeting = Resources.Messages.Greeting; string welcome = Resources.Messages.WelcomeMessage;
Console.WriteLine(greeting); // Exibirá: Привет, мир! Console.WriteLine(welcome); // Exibirá: Добро пожаловать в наше приложение! }}Observe: Resources.Messages é uma classe gerada automaticamente, baseada no nome do seu arquivo RESX (se o arquivo for chamado Messages.resx).
Passo 3: Localização no ASP.NET Core
Em aplicações web ASP.NET Core, o processo