Интернационализация (i18n) в C# (.NET)
Интернационализация (сокращённо i18n — от английского "internationalization", где 18 — количество букв между первой "i" и последней "n") — это процесс проектирования программного обеспечения, позволяющий адаптировать его под различные языки, регионы и культурные особенности без внесения изменений в исходный код. В платформе .NET (C#) i18n реализуется через механизмы локализации и глобализации, которые встроены в ядро фреймворка.
Основные концепции i18n в .NET
- Глобализация — проектирование приложения с учётом поддержки множества культур (например, форматирование дат, чисел, валют).
- Локализация — адаптация интерфейса под конкретную культуру (перевод текстов, изображений, звуков).
- Культура (Culture) — комбинация языка и региональных настроек, обозначаемая кодом вида
ru-RU,en-US,de-DE. - Ресурсные файлы (.resx) — XML-файлы, содержащие пары "ключ-значение" для каждой локали.
Как работает i18n в C# (.NET)
В .NET для локализации используются ресурсные файлы. Основной файл (например, Strings.resx) содержит строки на языке по умолчанию (обычно английском). Для каждого дополнительного языка создаётся отдельный файл с суффиксом кода культуры: Strings.ru.resx (русский), Strings.de.resx (немецкий). При компиляции эти файлы преобразуются в сборки-сателлиты, которые загружаются в зависимости от текущей культуры потока.
// Пример ресурсного файла (Strings.resx)
// Key: HelloMessage, Value: "Hello, World!"
// Strings.ru.resx
// Key: HelloMessage, Value: "Привет, мир!"
Пошаговая реализация локализации в консольном приложении
- Создайте ресурсный файл в проекте: правой кнопкой по проекту → Add → New Item → Resources File. Назовите его
Strings.resx. - Добавьте строки: вставьте ключ
Greetingи значениеHello, user!. - Создайте файл для русского языка:
Strings.ru.resxс тем же ключом и значениемПривет, пользователь!. - Напишите код для установки культуры и получения локализованной строки:
using System.Globalization;
using System.Resources;
using System.Threading;
class Program
{
static void Main()
{
// Устанавливаем русскую культуру
Thread.CurrentThread.CurrentUICulture = new CultureInfo("ru-RU");
Thread.CurrentThread.CurrentCulture = new CultureInfo("ru-RU");
// Получаем менеджер ресурсов
ResourceManager rm = new ResourceManager("YourNamespace.Strings", typeof(Program).Assembly);
string greeting = rm.GetString("Greeting");
Console.WriteLine(greeting); // Выведет: "Привет, пользователь!"
}
}
Локализация ASP.NET Core веб-приложений
В ASP.NET Core i18n реализуется через middleware и встроенные сервисы. Рассмотрим пример настройки для MVC или Razor Pages.
1. Настройка в Program.cs
using Microsoft.AspNetCore.Localization;
using System.Globalization;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddLocalization(options => options.ResourcesPath = "Resources");
builder.Services.AddControllersWithViews()
.AddViewLocalization()
.AddDataAnnotationsLocalization();
var app = builder.Build();
var supportedCultures = new[] { new CultureInfo("en-US"), new CultureInfo("ru-RU") };
app.UseRequestLocalization(new RequestLocalizationOptions
{
DefaultRequestCulture = new RequestCulture("en-US"),
SupportedCultures = supportedCultures,
SupportedUICultures = supportedCultures
});
app.UseStaticFiles();
app.UseRouting();
app.MapDefaultControllerRoute();
app.Run();
2. Создание ресурсных файлов
Создайте папку Resources в корне проекта. Внутри — файлы:
Views.Home.Index.en.resx(для английского)Views.Home.Index.ru.resx(для русского)
В каждый файл добавьте ключ Title со значениями Home Page и Главная страница соответственно.
3. Использование в представлении (Razor)
@using Microsoft.AspNetCore.Mvc.Localization