Mehrsprachige Hugo-Sites haben ein paar Stellen, an denen es leise auseinanderläuft, wenn Du nicht aufpasst. URLs in der falschen Sprache, Cover-Texte die nicht passen, Übersetzungen die rausfallen. hugo-cms.nvim hilft an einigen davon, den Rest erledigt Disziplin am Frontmatter.
Die Befehle aus der Walkthrough-Reihe setze ich hier voraus, hier geht es um die Sprach-Schicht obendrauf.
URLs pro Sprache
Hugo leitet die URL aus dem Pfad des Bundles ab. Bei einem mehrsprachigen Bundle:
content/blog/2026/markdown-und-theme-features/
├── index.md # Default-Sprache (de)
└── index.en.md # Übersetzung
Standardmäßige URLs:
/blog/2026/markdown-und-theme-features/(de)/en/blog/2026/markdown-und-theme-features/(en, gleicher Slug)
Die englische Seite erbt den deutschen Slug. Schlecht für SEO, schlecht in der Adresszeile.
Lösung ist slug: im Frontmatter pro Sprache:
# index.en.md
---
title: "Template: Markdown & Theme Features"
slug: "markdown-and-theme-features"
---
Ergebnis:
/blog/2026/markdown-und-theme-features/(de, aus dem Ordnernamen)/en/blog/2026/markdown-and-theme-features/(en, ausslug)
Der Ordner-Name bleibt trotzdem wichtig, er bestimmt die Section-Zugehörigkeit, wird von {{< ref >}} als Pfad genutzt, und macht Git und Editor lesbar. Faustregel: Ordner-Name = Default-Sprache-Slug, slug: nur in den Nicht-Default-Files setzen.
Übersetzungs-Workflow
Für einen neuen übersetzten Beitrag:
:Hugo newlegt das Bundle mitindex.mdin der Default-Sprache an.index.mdzuindex.<lang>.mdduplizieren, das machst Du von Hand.titleübersetzen.slug:explizit setzen, damit der Default-Sprache-Slug nicht erbt.descriptionübersetzen.cover.altübersetzen, falls vorhanden.- Body übersetzen.
hugo-cms.nvim synchronisiert sprachunabhängige Felder automatisch über die Geschwister-Files. :Hugo draft schaltet das Draft-Flag in allen Sprachen, :Hugo tags und :Hugo categories schreiben denselben Tag- und Kategorie-Satz auf alle Files (Taxonomien sind in der Regel sprachübergreifend), :Hugo media cover setzt cover.image über alle Sprach-Geschwister.
Cover-Bilder mit Alt-Text pro Sprache
Hugo Page Bundles teilen sich ihre Ressourcen. Ein cover.jpg unter content/blog/2026/post/cover.jpg ist für alle Sprachen dasselbe Bild.
cover.image zeigt in allen Sprach-Files auf denselben Dateinamen, :Hugo media cover schreibt das auf einen Schlag in alle. cover.alt dagegen sollte pro Sprache eigen sein, weil Alt-Text beschreibender Text ist. Deutscher Alt-Text auf der englischen Version ist ein Accessibility-Patzer. hugo-cms.nvim fragt nach Alt-Text nur für die aktuelle Buffer-Sprache und nur dann, wenn das Feld im Frontmatter schon existiert.
Wer wirklich pro Sprache ein anderes Cover-Bild will, braucht getrennte Bundles, verliert dann aber den Resource-Sharing-Vorteil. In der Praxis ist ein gemeinsames Bild mit Sprach-spezifischem Alt-Text fast immer der richtige Kompromiss.
Wie es weitergeht
Damit laufen Übersetzungen sauber. Was vor dem Veröffentlichen kurz zu prüfen ist, wie der Publishing-Loop aussieht und ein paar Stolperstellen aus der Praxis stehen im Beitrag über Workflow und Stolperstellen.