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, aus slug)

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:

  1. :Hugo new legt das Bundle mit index.md in der Default-Sprache an.
  2. index.md zu index.<lang>.md duplizieren, das machst Du von Hand.
  3. title übersetzen.
  4. slug: explizit setzen, damit der Default-Sprache-Slug nicht erbt.
  5. description übersetzen.
  6. cover.alt übersetzen, falls vorhanden.
  7. 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.