Note 06 / Internationalisierung
Django i18n: Sprache, URLs und Metadaten prüfen
Übersetzter Text genügt nicht. Sprachwechsel, interne Links und SEO-Metadaten müssen dieselbe Seitenfassung beschreiben.
Eine Sprache, mehrere widersprüchliche Signale
Eine italienische Seite kann übersetzten Text zeigen und trotzdem deutsche interne Links, einen deutschen canonical und anderssprachige Codekommentare enthalten. Ein Screenreader kann zudem Text mit der falschen Aussprache lesen, wenn lang nicht zum Inhalt passt. Ein grüner Übersetzungskatalog sagt darüber wenig aus.
Legen Sie zuerst fest, welche Seiten vollständig übersetzt sind. Nur diese Fassungen gehören in Sprachwechsler, hreflang und Sitemap. Ein deutscher Fallback auf einer englischen Liste braucht eine klare Kennzeichnung und lang="de" am deutschen Text; er ist keine englische Artikelübersetzung.
Django die Route auflösen lassen
Für vollständig übersetzte Seiten kann eine benannte Route unter i18n_patterns die Quelle der URL sein. Mit prefix_default_language=False behält Deutsch den ursprünglichen Pfad; Italienisch und Englisch erhalten ihren Präfix. reverse() läuft jeweils im passenden override()-Kontext. Dadurch bleibt die Zuordnung korrekt, wenn sich später die URL-Struktur ändert.
from django.urls import reverse
from django.utils.translation import override
LANGUAGES = ("de", "it", "en")
def page_metadata(route_name, language, host="https://codlab.de"):
if language not in LANGUAGES:
raise ValueError("unsupported language")
# Vollständig übersetzte Seiten, mit realen Django-Routen.
urls = {}
for code in LANGUAGES:
with override(code):
urls[code] = host + reverse(route_name)
return {
"canonical": urls[language],
"alternates": {**urls, "x-default": urls["de"]},
"inLanguage": language,
}
Die ausgelieferte Seite als Vertrag
Prüfen Sie pro Sprache den HTTP-Status, html lang, genau einen Haupttitel, description, canonical und og:url. Jeder hreflang muss auf eine vorhandene Übersetzung derselben Seite zeigen und von dieser zurückverweisen. x-default kann auf die deutsche Fassung zeigen. Bei TechArticle muss inLanguage mit der Edition übereinstimmen.
Der lokale Test führt diese Funktion mit den echten Engineering-Routen des Clones aus. Er prüft die drei URL-Fassungen, eine nicht unterstützte Sprache und die Wiederherstellung der zuvor aktiven Sprache. Der zusätzliche Browserlauf kontrolliert die tatsächlich gerenderten Metadaten und internen Links. Keine dieser Prüfungen ersetzt das Lesen der Übersetzung.
Kataloge und vollständige Editionen
gettext eignet sich für die gemeinsame Oberfläche. Längere redaktionelle Inhalte können eigene versionierte Editionen haben, solange fehlende Editionen sichtbar scheitern und nicht unbemerkt auf Deutsch zurückfallen. Kompilieren Sie geänderte PO-Dateien vor dem Test; eine alte MO-Datei kann einen korrekten Quelltext verdecken.
Das Beispiel setzt dieselbe benannte Route für alle drei vollständigen Editionen voraus. Bei nur teilweise übersetzten Blogbeständen brauchen Sie ein Verzeichnis vorhandener Übersetzungen und gegebenenfalls je Sprache andere Slugs. Auch Caches müssen die Sprache berücksichtigen. Prüfen Sie zusätzlich Kommentare in Codeblöcken und Datumsausgabe: Beide sind sichtbarer Inhalt.