Multilingual the painless way
Czech and English paired by translation key, a language switcher that just works, and not a single duplicated template.
Multilingual support is a source of pain in most systems — duplicated templates, drifting translations, broken links between languages. Hugo handles it surprisingly elegantly, and HugoPress only smooths a few rough edges.
One layout, two languages
The section data lives in each page’s front matter; the layout is shared. The same
layouts/blog/list.html template reads .Params.* and renders both the cs and en
variant — no duplicated logic.
Pairing via translationKey
Give both versions the same translationKey:
# content/cs/blog/_index.md
translationKey: blog
# content/en/blog/_index.md
translationKey: blog
Hugo turns that into a pair, and the language switcher in the header links to the right counterpart. When a translation is missing, the switcher degrades gracefully to the home page of the other language.
Labels via i18n
Template labels (date, “read more”, “related articles”) are never hardcoded — they
go through {{ i18n "key" }} and are added to both i18n/cs.toml and
i18n/en.toml. Article content, by contrast, is authored separately per language
so it reads naturally rather than machine-translated.
Rule of thumb: labels via i18n, content by hand per language.
The result? Adding a new language is a matter of one new content/<lang>/ folder
and a single column in the translation files.