Mehrsprachigkeit in ASP.NET Core

Maurice J. | Softwareentwickler
08/2020

ASP.NET Core zur Entwicklung mehrsprachiger Webseiten

Die Anforderung, eine Website mehrsprachig zu gestalten, tritt sehr häufig 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 Startup-Klassen

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

1public void ConfigureServices(IServiceCollection services)
2{
3    services.AddControllersWithViews();
4    services.AddLocalization(opts => { opts.ResourcesPath = "Resources"; });
5    services.AddMvc()
6            .AddViewLocalization(LanguageViewLocationExpanderFormat.SubFolder, 
7                opts => { opts.ResourcesPath = "Resources"; })
8            .AddDataAnnotationsLocalization();
9
10    services.Configure<RequestLocalizationOptions>(opts =>
11    {
12        var supportedCultures = new List<CultureInfo> {
13                new CultureInfo("de-DE"),
14                new CultureInfo("en-GB"),
15        };
16
17        opts.DefaultRequestCulture = new RequestCulture("de-DE");
18        // Formatting numbers, dates, etc.
19        opts.SupportedCultures = supportedCultures;
20        // UI strings that we have localized.
21        opts.SupportedUICultures = supportedCultures; 
22    });
23}

IStringLocalizer-Schnittstelle

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

1using Microsoft.AspNetCore.Mvc;
2using Microsoft.Extensions.Localization;
3
4namespace Mehrsprachigkeit.Controllers
5{
6    public class HomeController : Controller
7    {
8        private readonly IStringLocalizer<HomeController> _localizer;
9        public HomeController(IStringLocalizer<HomeController> localizer)
10        {
11            _localizer = localizer;
12        }
13
14        public IActionResult Index()
15        {
16            ViewData["Title"] = _localizer["Hallo Welt vom Controller"];
17            return View();
18        }
19    }
20}

Dependency Injection (DI)

Die DataAnnotations in den Klassen werden im Folgenden beispielhaft gezeigt. Diese Klasse wird anschließend ebenfalls in der View verwendet.

1using System.ComponentModel.DataAnnotations;
2
3namespace Mehrsprachigkeit.Models
4{
5    public class Contact
6    {
7        [Display(Name = "Firstname")]
8        public string Firstname { get; set; }
9
10        [Display(Name = "Lastname")]
11        public string Lastname { get; set; }
12    }
13}

In der View muss die IViewLocalizer-Schnittstelle per DI eingebunden werden, um – wie im Controller-Beispiel gezeigt – die Zeichenfolge mit dem Localizer umschließen zu können. Die Felder aus der Klasse Contact werden hier ebenfalls aufgelistet, um Ressourcen beim Hinzufügen direkt testen zu können.

1@using Microsoft.AspNetCore.Mvc.Localization
2@model Mehrsprachigkeit.Models.Contact
3
4@inject IViewLocalizer Localizer
5
6<h1>@ViewData["Title"]</h1>
7<h3>@Localizer["Hallo Welt von der View"]</h3>
8
9@Html.LabelFor(c => c.Firstname)
10@Html.LabelFor(c => c.Lastname)

Ressourcendatei (.resx)

Zusätzlich zu den Zeichenfolgen werden anschließend Ressourcendateien (.resx) angelegt. Hierbei ist es wichtig, dass im Ordner „Resources“ die gleiche Ordnerstruktur beibehalten wird wie in den Klassen, in denen die Lokalisierung verwendet wird.

In den .resx-Dateien werden die Zeichenfolgen aus den jeweiligen Bereichen mit den passenden Übersetzungswerten aufgelistet.

Hinzufügen einer weiteren Sprache

Um Ressourcendateien für die englische Sprache zu implementieren, muss die jeweilige Ressourcendatei kopiert, in z. B. HomeController.en-GB.resx umbenannt und anschließend auf die Übersetzungswerte der jeweiligen Sprache angepasst werden.

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

Das Ergebnis

Die Implementierung der Mehrsprachigkeit unter .NET Core ist in kleinen Projekten noch recht unkompliziert. Sofern alle Zeichenfolgen 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 Ressourcendateien in einer separaten Assembly ausgelagert werden sollen.

No items found.
Maurice J. | Softwareentwickler
Zurück zur Übersicht

Gemeinsam Großes schaffen

Wir freuen uns auf ein kostenloses Erstgespräch mit Ihnen!
Unser Geschäftsführer Tibor Csizmadia und unser Kundenbetreuer Jens Walter stehen Ihnen persönlich zur Verfügung. Profitieren Sie von unserer langjährigen Erfahrung und erhalten Sie eine kompetente Erstberatung in einem unverbindlichen Austausch.
Foto von Tibor

Tibor Csizmadia

Geschäftsführer
Foto von Jens

Jens Walter

Projektmanager
Devware GmbH verpflichtet sich, Ihre Privatsphäre zu schützen. Wir benötigen Ihre Kontaktinformationen, um Sie bezüglich unserer Produkte und Dienstleistungen zu kontaktieren. Mit Klick auf Absenden geben Sie sich damit einverstanden. Weitere Informationen finden Sie unter Datenschutz.
Vielen Dank für Ihre Nachricht!

Wir haben Ihre Anfrage erhalten und melden uns in Kürze bei Ihnen.

Falls Sie in der Zwischenzeit Fragen haben, können Sie uns jederzeit unter Kontaktanfrage@devware.de erreichen.

Wir freuen uns auf die Zusammenarbeit!
Oops! Something went wrong while submitting the form.
KontaktImpressumDatenschutz