Расширяемость локализации
Примечание.
Это не последняя версия этой статьи. В текущем выпуске см . версию .NET 8 этой статьи.
Предупреждение
Эта версия ASP.NET Core больше не поддерживается. Дополнительные сведения см. в статье о политике поддержки .NET и .NET Core. В текущем выпуске см . версию .NET 8 этой статьи.
Внимание
Эта информация относится к предварительному выпуску продукта, который может быть существенно изменен до его коммерческого выпуска. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
В текущем выпуске см . версию .NET 8 этой статьи.
Автор: Хишам Бин Атея (Hisham Bin Ateya)
В этой статье:
- Перечисляет точки расширения в API локализации.
- В этой статье приводятся инструкции по расширениям локализации в приложениях ASP.NET Core.
Точки расширения в API локализации
API локализации ASP.NET Core созданы с учетом потребностей расширения. Расширяемость позволяет разработчикам настраивать локализацию в соответствии со своими потребностями. Например, OrchardCore имеет POStringLocalizer
. В POStringLocalizer
приводится подробное описание использования локализации переносимых объектов для использования файлов PO
для хранения ресурсов локализации.
В этой статье описаны две основные точки расширения, предоставляемые API локализации.
Поставщики языка и региональных параметров локализации
API локализации ASP.NET Core имеют четыре поставщика по умолчанию, которые могут определить текущий язык и региональные параметры выполняемого запроса:
- QueryStringRequestCultureProvider
- CookieRequestCultureProvider
- AcceptLanguageHeaderRequestCultureProvider
- CustomRequestCultureProvider
Указанные выше поставщики подробно описаны в документации ПО промежуточного слоя локализации. Если поставщики по умолчанию не отвечают вашим потребностям, создайте свой поставщик, используя один из следующих подходов:
Используя CustomRequestCultureProvider
CustomRequestCultureProvider предоставляет пользовательский RequestCultureProvider, использующий простой делегат для определения текущего языка и региональных параметров локализации:
options.AddInitialRequestCultureProvider(new CustomRequestCultureProvider(async context =>
{
var currentCulture = "en";
var segments = context.Request.Path.Value.Split(new char[] { '/' },
StringSplitOptions.RemoveEmptyEntries);
if (segments.Length > 1 && segments[0].Length == 2)
{
currentCulture = segments[0];
}
var requestCulture = new ProviderCultureResult(currentCulture);
return Task.FromResult(requestCulture);
}));
options.RequestCultureProviders.Insert(0, new CustomRequestCultureProvider(async context =>
{
var currentCulture = "en";
var segments = context.Request.Path.Value.Split(new char[] { '/' },
StringSplitOptions.RemoveEmptyEntries);
if (segments.Length > 1 && segments[0].Length == 2)
{
currentCulture = segments[0];
}
var requestCulture = new ProviderCultureResult(currentCulture);
return Task.FromResult(requestCulture);
}));
Использование новой реализации RequestCultureProvider
Можно создать новую реализацию RequestCultureProvider, которая определяет сведения о языке и региональных параметрах запроса из пользовательского источника. Например, пользовательский источник может быть файлом конфигурации или базой данных.
В следующем примере показан класс AppSettingsRequestCultureProvider
, который расширяет класс RequestCultureProvider для определения сведений о языке и региональных параметрах запроса из appsettings.json
:
public class AppSettingsRequestCultureProvider : RequestCultureProvider
{
public string CultureKey { get; set; } = "culture";
public string UICultureKey { get; set; } = "ui-culture";
public override Task<ProviderCultureResult> DetermineProviderCultureResult(HttpContext httpContext)
{
if (httpContext == null)
{
throw new ArgumentNullException();
}
var configuration = httpContext.RequestServices.GetService<IConfigurationRoot>();
var culture = configuration[CultureKey];
var uiCulture = configuration[UICultureKey];
if (culture == null && uiCulture == null)
{
return Task.FromResult((ProviderCultureResult)null);
}
if (culture != null && uiCulture == null)
{
uiCulture = culture;
}
if (culture == null && uiCulture != null)
{
culture = uiCulture;
}
var providerResultCulture = new ProviderCultureResult(culture, uiCulture);
return Task.FromResult(providerResultCulture);
}
}
Ресурсы локализации
Для локализации в ASP.NET Core есть ResourceManagerStringLocalizer. ResourceManagerStringLocalizer — это реализация IStringLocalizer, которая использует resx
для хранения ресурсов локализации.
Вы не ограничены использованием файлов resx
. При реализации IStringLocalizer
можно использовать любой источник данных.
В следующих примерах проектов реализуется IStringLocalizer:
ASP.NET Core