Rozszerzalność lokalizacji

Autor: Hisham Bin Ateya

W tym artykule:

  • Wyświetla listę punktów rozszerzalności w interfejsach API lokalizacji.
  • Zawiera instrukcje dotyczące rozszerzania lokalizacji aplikacji ASP.NET Core.

Rozszerzalne punkty w interfejsach API lokalizacji

ASP.NET Podstawowe interfejsy API lokalizacji są kompilowane w celu rozszerzenia. Rozszerzalność umożliwia deweloperom dostosowywanie lokalizacji zgodnie z ich potrzebami. Na przykład SadCore ma wartość POStringLocalizer. POStringLocalizer w tym artykule opisano szczegółowo używanie lokalizacji obiektu przenośnego do przechowywania zasobów lokalizacji za pomocą PO plików.

W tym artykule wymieniono dwa główne punkty rozszerzalności, które zapewniają interfejsy API lokalizacji:

Dostawcy kultury lokalizacji

ASP.NET Podstawowe interfejsy API lokalizacji mają czterech domyślnych dostawców, którzy mogą określić bieżącą kulturę wykonywania żądania:

Poprzedni dostawcy szczegółowo opisano w dokumentacji oprogramowania pośredniczącego lokalizacji. Jeśli domyślni dostawcy nie spełniają Twoich potrzeb, utwórz dostawcę niestandardowego przy użyciu jednego z następujących metod:

Korzystanie z elementu CustomRequestCultureProvider

CustomRequestCultureProvider Udostępnia niestandardowy, RequestCultureProvider który używa prostego delegata do określania bieżącej kultury lokalizacji:

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

Używanie nowej implementacji elementu RequestCultureProvider

Można utworzyć nową implementację RequestCultureProvider , która określa informacje o kulturze żądania z niestandardowego źródła. Na przykład źródło niestandardowe może być plikiem konfiguracji lub bazą danych.

W poniższym przykładzie pokazano AppSettingsRequestCultureProviderRequestCultureProvider element , który rozszerza element w celu określenia informacji o kulturze żądania z appsettings.jsonelementu :

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 lokalizacji

lokalizacja ASP.NET Core zapewnia .ResourceManagerStringLocalizer ResourceManagerStringLocalizer to implementacja IStringLocalizer , która służy resx do przechowywania zasobów lokalizacji.

Korzystanie z resx plików nie jest ograniczone. IStringLocalizerImplementując element , można użyć dowolnego źródła danych.

Następujące przykładowe projekty implementują:IStringLocalizer