Lokalisierungserweiterbarkeit

Von Hisham Bin Ateya

Dieser Artikel:

  • Listet die Erweiterbarkeitspunkte für die Lokalisierungs-APIs auf.
  • Enthält Anweisungen zum Erweitern der ASP.NET Core-App-Lokalisierung.

Erweiterbare Punkte in Lokalisierungs-APIs

ASP.NET Core-Lokalisierungs-APIs sind für Erweiterbarkeit konzipiert. Erweiterbarkeit ermöglicht es Entwicklern, die Lokalisierung entsprechend ihren Anforderungen anzupassen. Beispielsweise verfügt OrchardCore über einen POStringLocalizer. POStringLocalizer beschreibt ausführlich die Verwendung der Lokalisierung portabler Objekte, um PO-Dateien zum Speichern von Lokalisierungsressourcen zu verwenden.

In diesem Artikel werden die beiden wichtigsten Erweiterbarkeitspunkte aufgelistet, die von Lokalisierungs-APIs bereitgestellt werden:

Lokalisierungskulturanbieter

ASP.NET Core-Lokalisierungs-APIs verfügen über vier Standardanbieter, die die aktuelle Kultur einer aktuell ausgeführten Anforderung bestimmen können:

Die oben genannten Anbieter werden ausführlich in der Dokumentation zur Lokalisierungsmiddleware beschrieben. Wenn die Standardanbieter Ihre Anforderungen nicht erfüllen, erstellen Sie einen benutzerdefinierten Anbieter, indem Sie einen der folgenden Ansätze verwenden:

Verwenden von CustomRequestCultureProvider

CustomRequestCultureProvider stellt einen benutzerdefinierten RequestCultureProvider bereit, der einen einfachen Delegaten verwendet, um die aktuelle Lokalisierungskultur zu ermitteln:

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

Verwenden einer neuen Implementierung von RequestCultureProvider

Eine neue Implementierung von RequestCultureProvider kann erstellt werden, die die Informationen zur Anforderungskultur aus einer benutzerdefinierten Quelle bestimmt. Beispielsweise kann es sich bei der benutzerdefinierten Quelle um eine Konfigurationsdatei oder Datenbank handeln.

Das folgende Beispiel zeigt AppSettingsRequestCultureProvider, wodurch RequestCultureProvider erweitert wird, um die Anforderungskulturinformationen aus appsettings.json zu ermitteln:

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

Lokalisierungsressourcen

Die ASP.NET Core-Lokalisierung stellt ResourceManagerStringLocalizer bereit. ResourceManagerStringLocalizer ist eine Implementierung von IStringLocalizer, die resx verwendet, um Lokalisierungsressourcen zu speichern.

Sie sind nicht auf die Verwendung von resx-Dateien beschränkt. Durch Implementieren von IStringLocalizer kann jede beliebige Datenquelle verwendet werden.

Die folgenden Beispielprojekte implementieren IStringLocalizer: