Mehrsprachigkeit ASP.NET Core

Mehrsprachigkeit in ASP.NET Core

Maurice Jungmann | Softwareentwickler | 20.08.2020

ASP.NET Core zur Entwicklung mehrsprachiger Webseiten

 

Die Anforderung eine Website mehrsprachig zu gestalten tritt sehr häuft auf, da die Anwendungen für unterschiedlichste Sprachen und Kulturen zur Verfügung gestellt werden sollen.  

ASP.NET Core bietet passende Dienste und Middleware zur Lokalisierung in verschiedenen Sprachen und Kulturen an.  

Die Schnittstelle IStringLocalizer, die mit ASP.NET Core eingeführt wurde, stellt kulturspezifische Ressourcen zur Laufzeit bereit. Sie können damit eine App entwickeln, die für die Lokalisierung ausgelegt ist, und müssen zu Beginn noch keine Ressourcen-Dateien anlegen. Zu einem späteren Zeitpunkt, wenn die Anwendung mehrsprachig gestaltet werden soll, können Sie die Anwendung problemlos erweitern.

Erstellung von Start-Up Klassen

Zu Beginn werden folgende Änderungen in der Startup Klasse benötigt, um anschließend problemlos die Mehrsprachigkeit im Controller, den Models sowie Views umsetzen können. Der sogenannte ResourcePath definiert hierbei den Ordner in dem die Ressourcen später angelegt werden sollen.

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
    services.AddLocalization(opts => { opts.ResourcesPath = "Resources"; });
    services.AddMvc()
            .AddViewLocalization(LanguageViewLocationExpanderFormat.SubFolder, 
                opts => { opts.ResourcesPath = "Resources"; })
            .AddDataAnnotationsLocalization();
            
    services.Configure<RequestLocalizationOptions>(opts =>
    {
        var supportedCultures = new List<CultureInfo> {
                new CultureInfo("de-DE"),
                new CultureInfo("en-GB"),
        };

        opts.DefaultRequestCulture = new RequestCulture("de-DE");
        // Formatting numbers, dates, etc.
        opts.SupportedCultures = supportedCultures;
        // UI strings that we have localized.
        opts.SupportedUICultures = supportedCultures; 
    });
}

 

IStringLocalizer Schnittstelle

Für den ersten Schritt werden alle Zeichenfolgen der Anwendung mit der IStringLocalizer Schnittstelle umfasst. Damit die Schnittstelle verwendet werden kann, muss diese per DI (Dependency Injection) eingebunden werden. Sofern kein Eintrag mit der Zeichenfolge „Hallo Welt…“ in einer Ressourcendatei existiert, wird der Inhalt wie gewünscht ausgegeben. Demnach wird in diesem Beispiel der Text „Hallo Welt vom Controller“ zurück gegeben.

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Localization;

namespace Mehrsprachigkeit.Controllers
{
    public class HomeController : Controller
    {
        private readonly IStringLocalizer<HomeController> _localizer;
        public HomeController(IStringLocalizer<HomeController> localizer)
        {
            _localizer = localizer;
        }

        public IActionResult Index()
        {
            ViewData["Title"] = _localizer["Hallo Welt vom Controller"];
            return View();
        }
    }
}

 

DI (Dependency Injection)

Die DataAnnotation in den Klassen wird im folgenden beispielhaft aufgezeigt. Diese Klasse wird anschließend ebenfalls in der View verwendet.

using System.ComponentModel.DataAnnotations;

namespace Mehrsprachigkeit.Models
{
    public class Contact
    {
        [Display(Name = "Firstname")]
        public string Firstname { get; set; }

        [Display(Name = "Lastname")]
        public string Lastname { get; set; }
    }
}

 

In der sogenannten View muss die IViewLocalizer Schnittstellle per DI eingebunden werden, um – wie das Controller Beispiel zeigen soll – die Zeichenfolge mit dem Localizer umschlossen werden kann. Die Felder aus der Klasse Comtact werden hier ebenfalls aufgelistet, um Resourcen beim Hinzufügen direkt testen zu können.

@using Microsoft.AspNetCore.Mvc.Localization
@model Mehrsprachigkeit.Models.Contact

@inject IViewLocalizer Localizer

<h1>@ViewData["Title"]</h1>
<h3>@Localizer["Hallo Welt von der View"]</h3>

@Html.LabelFor(c => c.Firstname)
@Html.LabelFor(c => c.Lastname)

 

Ressourcendatei (.resx)

Zusätzlich zu den Zeichenfolgen werden anschließend Ressourcendatei (.resx) angelegt. Hierbei ist es wichtig, dass wir in dem Ordner „Resources“ die gleiche Ordner-Struktur beibehalten, wie in den Klassen in denen wir die Lokalisierung verwenden.

In den resx-Dateien wird die Zeichenfolge aus den jeweiligen Bereichen mit den passenden Übersetzungs-Werten aufgelistet.

Das Ergebnis

Hinzufügen einer weiteren Sprache

Um Resourcendateien für die englische Sprache implementieren zu können, muss die jeweilige Resourcendatei kopiert werden, in z.B.: HomeController.en-GB.resx umbenannt und anschließend auf die Übersetzungs-Werte der jeweilige Sprache angepasst werden.

Das Testen der unterschiedlichen Sprachen, kann über die Spracheinstellung in den Internetoptionen erfolgen.

 

Die Implementierung der Mehrsprachigkeit unter .Net Core ist in kleinen Projekten noch recht unkompliziert. Sofern alle Zeichenketten mit den Localizer Schnittstellen umschlossen sind, ist es zu Beginn der Entwicklungsphase noch nicht notwendig sich um verschiedene Ressourcendateien zu kümmern. Anspruchsvoller wird es, sobald Resourcendateien in einer separaten Assembly ausgelagert werden sollen.

Maurice Jungmann| Softwareentwickler | 20.08.2020

 

 

Sie möchten eine erfolgreiche Webseite?
Alle Informationen zu unseren Leistungen