Rozszerzalność lokalizacjiLocalization Extensibility

Według Hisham bin AteyaBy Hisham Bin Ateya

W tym artykule:This article:

  • Wyświetla listę punktów rozszerzalności w interfejsach API lokalizacji.Lists the extensibility points on the localization APIs.
  • Zawiera instrukcje dotyczące sposobu rozbudowania lokalizacji aplikacji ASP.NET Core.Provides instructions on how to extend ASP.NET Core app localization.

Rozszerzalne punkty w interfejsach API lokalizacjiExtensible Points in Localization APIs

Interfejsy API lokalizacji ASP.NET Core są kompilowane do rozszerzalności.ASP.NET Core localization APIs are built to be extensible. Rozszerzalność umożliwia deweloperom dostosowanie lokalizacji zgodnie z ich potrzebami.Extensibility allows developers to customize the localization according to their needs. Na przykład OrchardCore ma POStringLocalizer .For instance, OrchardCore has a POStringLocalizer. POStringLocalizer szczegółowo opisano przy użyciu lokalizacji obiektów przenośnych do PO przechowywania zasobów lokalizacji.POStringLocalizer describes in detail using Portable Object localization to use PO files to store localization resources.

W tym artykule wymieniono dwa główne punkty rozszerzalności zapewniane przez interfejsy API lokalizacji:This article lists the two main extensibility points that localization APIs provide:

Dostawcy kultury lokalizacjiLocalization Culture Providers

Interfejsy API lokalizacji ASP.NET Core mają czterech dostawców domyślnych, którzy mogą określić bieżącą kulturę żądania wykonania:ASP.NET Core localization APIs have four default providers that can determine the current culture of an executing request:

Poprzedni dostawcy są szczegółowo opisane w dokumentacji oprogramowania pośredniczącego .The preceding providers are described in detail in the Localization Middleware documentation. Jeśli dostawcy domyślnie nie spełnią Twoich potrzeb, należy utworzyć niestandardowego dostawcę przy użyciu jednej z następujących metod:If the default providers don't meet your needs, build a custom provider using one of the following approaches:

Użyj CustomRequestCultureProviderUse CustomRequestCultureProvider

CustomRequestCultureProvider zapewnia niestandardowy RequestCultureProvider , który używa prostego delegata do określenia bieżącej kultury lokalizacji:CustomRequestCultureProvider provides a custom RequestCultureProvider that uses a simple delegate to determine the current localization culture:

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);
}));
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);
}));

Użyj nowego Jawna implementacja RequestCultureProviderUse a new implemetation of RequestCultureProvider

Można utworzyć nową implementację RequestCultureProvider , która określa informacje o kulturze żądania ze źródła niestandardowego.A new implementation of RequestCultureProvider can be created that determines the request culture information from a custom source. Na przykład źródło niestandardowe może być plikiem konfiguracji lub bazą danych.For example, the custom source can be a configuration file or database.

Poniższy przykład pokazuje AppSettingsRequestCultureProvider , że rozszerza, RequestCultureProvider Aby określić informacje o kulturze żądań z appsettings.json :The following example shows AppSettingsRequestCultureProvider, which extends the RequestCultureProvider to determine the request culture information from 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);
    }
}

Zasoby lokalizacjiLocalization resources

Zapewnia ASP.NET Core lokalizacji ResourceManagerStringLocalizer .ASP.NET Core localization provides ResourceManagerStringLocalizer. ResourceManagerStringLocalizer jest implementacją programu IStringLocalizer , która jest stosowana resx do przechowywania zasobów lokalizacji.ResourceManagerStringLocalizer is an implementation of IStringLocalizer that is uses resx to store localization resources.

Nie można używać resx plików.You aren't limited to using resx files. Implementując IStringLocalized , można użyć dowolnego źródła danych.By implementing IStringLocalized, any data source can be used.

Następujące przykładowe projekty implementują IStringLocalizer :The following example projects implement IStringLocalizer: