Ответ
**Локализация (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`. Это обеспечивает более гибкую архитектуру и упрощает тестирование.Ответ 18+ 🔞
Слушай, а вот локализация — это ж та ещё тема, когда твой софт должен говорить с людьми на их языке, и не только словами, а ещё и даты правильно показывать, и валюту, и всю эту хуйню. В ASP.NET Core это не просто перевод, это целый цирк с адаптацией под регион.
Короче, там всё крутится вокруг трёх китов:
* **Файлы ресурсов (.resx):** Это такие XML-файлики, где для каждой культуры свои тексты зашиты. Хочешь французам? Пожалуйста — `Resources.fr-FR.resx`. Немцам? `Resources.de-DE.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;
// А тут он смотрит, откуда культуру брать: из строки запроса, куки или заголовка браузера
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`** — это про язык интерфейса: из какого файла ресурсов строки тащить. **И главный совет, чтоб потом не было мучительно больно:** Не лезь напрямую к `ResourceManager`, это прошлый век. Держись за интерфейсы — `IStringLocalizer` твой друг. И тестировать проще, и архитектура чище. В общем, не усложняй, идиот, там и так всё придумано.