Интернационализация (i18n) в C# (.NET): полное руководство

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Интернационализация (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: "Привет, мир!"

Пошаговая реализация локализации в консольном приложении

  1. Создайте ресурсный файл в проекте: правой кнопкой по проекту → Add → New Item → Resources File. Назовите его Strings.resx.
  2. Добавьте строки: вставьте ключ Greeting и значение Hello, user!.
  3. Создайте файл для русского языка: Strings.ru.resx с тем же ключом и значением Привет, пользователь!.
  4. Напишите код для установки культуры и получения локализованной строки:
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                    

Рекомендаций