Beim Erstellen dieser Website mit Hugo wollte ich gerne das Datum von Posts auf deutsch oder englisch anzeigen. Dies ist jedoch aktuell (Hugo Version 0.61) nicht so einfach möglich. Deshalb möchte ich hier meine Lösung vorstellen.

Das Ziel

In meinem Fall, der hier als Beispiel dienen soll, hat die Webseite zwei Sprachen: deutsch und englisch. Bei jedem Post wird das Datum der Erstellung angezeigt. Dieses soll für die deutsche Version 12. Dezember 2019 und für die englische Version December 12, 2019 lauten.

Das Problem

Hugo bietet mithilfe der .Format-Methode die Möglichkeit, ein Datum nach Wünschen zu formatieren (siehe Dokumentation). Dabei gibt man das magische Datum Mon Jan 2 15:04:05 MST 2006 in der gewünschten Formatierung an. Zum Beispiel bewirkt .Date.Format "January 2, 2006" in einem Hugo-Template, dass das Datum dieses Posts als December 12, 2019 formatiert wird.

Wie sieht es aber nun für den deutschen Fall aus? .Date.Format "2. Januar 2006" erzeugt die Ausgabe 12. Januar 2019, der Monat wird also nicht wie gewünscht übersetzt. Noch schlimmer: Januar wird gar nicht erst als Monat erkannt, sondern als fester String eingebaut. Wie können wir jetzt einen deutsch formatierten String einbauen?

Eine Lösung

Meine folgende Lösung basiert auf einem Vorschlag aus der Hugo-Dokumentation.

Zuerst erstellen wir ein Data Template unter data/monate.yml mit folgendem Inhalt:

1: "Januar"
2: "Februar"
3: "März"
4: "April"
5: "Mai"
6: "Juni"
7: "Juli"
8: "August"
9: "September"
10: "Oktober"
11: "November"
12: "Dezember"

Wir führen ein neues Partial Template layouts/partials/date.html zur Darstellung des mehrsprachigen Datums ein, mit folgendem Inhalt:

{{ if eq "de" .language.Lang }}
    {{ .date.Day }}. {{ index .monate (printf "%d" .date.Month) }} {{ .date.Year }}
{{ else }}
    {{ .date.Format "January 2, 2006" }}
{{ end }}

Unser Template nimmt drei Parameter in Form: date ist das Datum, welches dargestellt werden soll. language ist die Sprache, in der das Datum dargestellt werden soll. Und schließlich beschreibt monate unsere eben erstellten Daten der Monatsnamen auf deutsch. Um das Template zu verwenden, müssen wir an der gewünschten Stelle, z.B. in einem single.html-Template, folgende Zeile einfügen:

{{ partial "date.html" (dict "date" . "language" $.Page.Language "monate" $.Site.Data.monate) }}

Dabei muss im aktuellen Block das Datum stehen, z.B. in einem {{ with .Date }}-Block. Auf diese (zugegebenermaßen etwas umständliche) Weise können wir mehrsprachige Datums-Angaben in Hugo erreichen. Weitere Sprachen können analog zur deutschen Sprache mit weiteren Data Templates sowie neuen Einträgen im date.html-Template erfolgen.