In Lektion 2.5.12 haben Sie die Buchungsseite zweisprachig gemacht: Texte in .resx-Dateien, IStringLocalizer<T>, die Sprache aus der Adresse, ein Umschalter. Der siebte Meilenstein zieht das durch die ganze öffentliche Kladde. Jede Seite, die ein Besucher ohne Anmeldung sieht, gibt es danach auf Deutsch und auf Englisch, und die Mails einer Buchung kommen in der Sprache, in der gebucht wurde.

Das klingt nach Fleißarbeit, und ein Teil ist es auch. Die eigentlichen Fragen liegen woanders: Wer entscheidet, welche Sprache eine Anfrage bekommt? Wie merkt man, dass eine Seite ihre zweite Sprache vergessen hat? Und in welcher Sprache schreibt ein Hintergrunddienst, der gar keine Anfrage hat?

Pull Request Branch Bringt Wo in dieser Lektion
1 feature/m7-language-from-address die Adresse entscheidet über die Sprache, <html lang> folgt ihr „Pull Request 1“
2 feature/m7-public-layout hreflang und Sprachumschalter im öffentlichen Layout „Pull Request 2“
3 feature/m7-all-public-pages alle öffentlichen Seiten unter beiden Adressen, der Test über alle Seiten „Pull Request 3“ und Übung 1
4 feature/m7-mail-language die Buchung merkt sich ihre Sprache, Mails und ihre Links folgen ihr Übung 2

Wo die Kladde steht

Nach Modul 2.5 und Meilenstein 6 gilt in den Lösungen:

  • Seit Lektion 2.5.12 entscheidet die Adresse über die Sprache: PathCultureProvider macht /en/… englisch und alles andere deutsch; ?culture= und Accept-Language fragt die Kladde nicht. Für interaktive Inseln setzt sie zusätzlich das Kultur-Cookie, und <html lang> folgt der Kultur.
  • Die Texte stehen in .resx-Dateien neben ihren Komponenten (Home, BookAppointment, MainLayout, SkipLink, je Deutsch und Englisch), die Meldungen der Buchung in BookingTexts.resx. ResourceTests prüft, dass jede Datei einen englischen Zwilling mit denselben Namen hat.
  • Languages baut Links in der Sprache der Seite (Languages.Link, GermanOf, EnglishOf), und LanguageLinks im öffentlichen Layout MainLayout aus Lektion 2.5.3 schreibt hreflang und den Umschalter. Das interne Layout bleibt Deutsch.
  • Zweisprachig sind die Startseite und die Buchungsseite unter /termin und /en/termin. Die Seiten aus den Meilensteinen 3 und 4 sind nur Deutsch: „Fast geschafft“ unter /termin/danke, Bestätigen, Absagen, dazu „nicht gefunden“ und die Seite der Ratenbegrenzung. Die Mails schreibt BookingMails auf Deutsch.

Die Beispiele dieser Lektion bauen die Pull Requests 1 und 2 von Grund auf und mit anderen Namen: eine gemeinsame Ressourcendatei Resources/Texts.resx für IStringLocalizer<Texts>, KladdeLanguages für den Anbieter, LanguagePaths statt Languages und ein öffentliches Layout mit dem Umschalter. Mit der Lösung von Lektion 2.5.12 haben Sie das meiste davon schon. Lesen Sie die beiden Abschnitte dann als Prüfliste, übernehmen Sie nur, was Ihrer Kladde fehlt, etwa UseRequestLocalization vor der Ratenbegrenzung, und setzen Sie in den Beispielen Languages.Link für LanguagePaths.Current, die .resx-Dateien neben der Seite für Texts.resx und MainLayout für das öffentliche Layout. Die eigentliche Arbeit dieses Meilensteins steckt in den Pull Requests 3 und 4. Heißen Ihre Dateien, Klassen oder Ordner anders, behalten Sie Ihre Namen und übertragen Sie die Schritte.