Internacionalización (i18n) en C# (.NET): Guía completa
La internacionalización (a menudo abreviada como i18n — del inglés «internationalization», donde entre la primera letra 'i' y la última 'n' hay 18 caracteres) es el proceso de diseñar software de manera que pueda adaptarse fácilmente a diferentes idiomas y estándares regionales sin realizar cambios en el código fuente. En el ecosistema C# (.NET), la internacionalización es una capacidad integrada y potente que permite a los desarrolladores crear aplicaciones verdaderamente multilingües.
En este artículo, analizaremos en detalle cómo implementar i18n en .NET (incluyendo .NET Core, .NET 5/6/7/8 y .NET Framework). Conocerá conceptos clave como culturas, archivos de recursos (RESX), localización de cadenas, imágenes y formato de datos.
Conceptos principales
Antes de pasar al código, es importante comprender dos términos clave:
- Globalización (Globalization): El proceso de diseñar una aplicación que admita interfaces localizadas y datos regionales para usuarios de diferentes culturas. En .NET, esto se logra mediante las clases
CultureInfoyRegionInfo. - Localización (Localization): El proceso de adaptar una aplicación ya globalizada para un idioma/región específico (por ejemplo, traducir textos, configurar formatos de fecha y moneda).
.NET utiliza culturas (Cultures), que se especifican en el formato idioma-región (por ejemplo, ru-RU — ruso (Rusia), en-US — inglés (EE. UU.), de-DE — alemán (Alemania)).
Paso 1: Creación de archivos de recursos (.resx)
La forma principal de almacenar cadenas localizadas en .NET son los archivos de recursos (.resx). Son archivos XML que se compilan en el ensamblado.
Veamos un ejemplo. Crearemos archivos para los idiomas ruso e inglés:
- Resources.resx — archivo de recursos predeterminado (generalmente en inglés).
- Resources.ru.resx — archivo para el idioma ruso.
- Resources.de.resx — archivo para el idioma alemán.
Dentro de cada archivo, agregaremos recursos de cadena con los mismos nombres pero valores diferentes:
Resources.resx (idioma predeterminado — en-US):
Name: GreetingValue: Hello, World!
Name: WelcomeMessageValue: Welcome to our application!Resources.ru.resx (Ruso):
Name: GreetingValue: Привет, мир!
Name: WelcomeMessageValue: Добро пожаловать в наше приложение!Paso 2: Acceso a los recursos en código C#
.NET genera automáticamente una clase fuertemente tipada para acceder a los recursos. Supongamos que los archivos están en la carpeta Resources del proyecto. Entonces, el acceso sería así:
using System;using System.Globalization;using System.Threading;
class Program{ static void Main(string[] args) { // Establecemos la cultura para el hilo actual Thread.CurrentThread.CurrentUICulture = new CultureInfo("ru-RU"); Thread.CurrentThread.CurrentCulture = new CultureInfo("ru-RU");
// Obtenemos las cadenas localizadas string greeting = Resources.Messages.Greeting; string welcome = Resources.Messages.WelcomeMessage;
Console.WriteLine(greeting); // Mostrará: Привет, мир! Console.WriteLine(welcome); // Mostrará: Добро пожаловать в наше приложение! }}Tenga en cuenta: Resources.Messages es una clase generada automáticamente basada en el nombre de su archivo RESX (si el archivo se llama Messages.resx).
Paso 3: Localización en ASP.NET Core
En aplicaciones web ASP.NET Core, el proceso
También en la biblioteca
Caché en C++: Redis, memcached, LevelDB y otras herramientas
tsyringe TypeScript: guía completa con ejemplos prácticos
Trabajo con Apache Kafka en Java: guía completa para desarrolladores
Envío de SMS en Go (Golang): Biblioteca API
Trabajo con imágenes en Java: desde la lectura hasta el procesamiento