Ответ
**Локализация (L10n)** — это процесс адаптации приложения для конкретных языков и культурных регионов. Это не просто перевод текста, а также корректное форматирование дат, чисел, валют, календарей и учёт других локальных соглашений.
В **ASP.NET Core** локализация построена вокруг следующих ключевых компонентов:
* **Файлы ресурсов (.resx):** XML-файлы, хранящие строки для разных культур (например, `Resources.fr-FR.resx` для французского).
* **`IStringLocalizer` и `IHtmlLocalizer`:** Основные интерфейсы для извлечения локализованных строк в коде и представлениях.
* **ПО промежуточного слоя (Middleware) для локализации:** Автоматически определяет и устанавливает культуру запроса.
**Базовая настройка в `Program.cs`:**
```csharp
builder.Services.AddLocalization(options => options.ResourcesPath = "Resources");
builder.Services.Configure(options =>
{
var supportedCultures = new[] { "en-US", "fr-FR", "de-DE" };
options.SetDefaultCulture("en-US");
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
// Стратегии определения культуры: из QueryString, Cookie, заголовка Accept-Language
options.ApplyCurrentCultureToResponseHeaders = true;
});
app.UseRequestLocalization();
```
**Использование в классе:**
```csharp
public class HomeController : Controller
{
private readonly IStringLocalizer _localizer;
public HomeController(IStringLocalizer localizer)
{
_localizer = localizer;
}
public IActionResult Index()
{
ViewData["Greeting"] = _localizer["HelloWorld"];
return View();
}
}
```
**Использование в представлении (Razor):**
```html
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
@Localizer["WelcomeHeader"]
@DateTime.Now.ToString("D")
``` **Ключевые различия:** * **`CultureInfo.CurrentCulture`** (Культура) — влияет на форматирование (даты, числа). * **`CultureInfo.CurrentUICulture`** (Культура интерфейса) — влияет на выбор файла ресурсов для строк. **Best Practice:** Всегда используйте интерфейсы локализации (`IStringLocalizer`), а не прямое обращение к `ResourceManager`. Это обеспечивает более гибкую архитектуру и упрощает тестирование.