Hugo Deutsche Umlaute

Hugo lässt deutsche Umlaute bei Categorien und Tags unverändert (zuletzt getestet mit Version: 0.62).
So führt beispielsweise die Categorie Köln zu der URL ../categories/köln/. Und der Tag Köln zu der URL ../tags/köln/.

Umlaute in URL’s sind mittlerweile technisch möglich aber nicht empfehlenswert.
Zum Problem von Umlauten in URLs siehe auch Umlaute in URL: Technisch möglich – aber auch empfehlenswert?

Besser wäre daher eine automatische Umsetzung von köln zu koeln.
Siehe auch: [SOLVED] German umlauts in tags und Support for German umlauts in taxonomy slugs .

Leider unterstützt HUGO dies aktuell nicht1 (zuletzt getestet mit Version: 0.62).

Was kann man machen? - HUGO patchen

Das ist einfacher als befürchtet.

go und mage installieren, um HUGO lokal bauen zu können. Näheres ist in HUGO im Dokument Contributing.md beschrieben.

In der Datei helpers/path.go

    ...
    s = text.RemoveAccentsString(s)
}

// NEU
replacer := strings.NewReplacer("ä", "ae", "ö", "oe", "ü", "ue", "ß", "ss")
s = replacer.Replace(s)
// NEU-ENDE

source := []rune(s)
...

einfügen.

Allerdings sind die Macher von HUGO extrem fleissig und erzeugen immer neue Versionen …
und da muss man dann immer wieder selber ran.

Mein Workflow

HUGO clonen:

git clone https://github.com/gohugoio/hugo.git

Änderung in einem eigenen Branch, z.B. replaceInPath, einfügen und im Branch mit mage hugo bauen.
Diese hugo Version dann zum Bauen der Seite nutzen.

Die HUGO Macher sind extrem fleissig, darum muss das Projekt immer wieder aktualisiert und HUGO neu gebaut werden.

Aktuellen Stand aus dem Repository holen:

git checkout master
git pull

Dann auf Branch (hier replaceInPath) wechseln:

git checkout replaceInPath

Branch wieder an den (neuen) Anfang beginnen lassen. Achtung, nur wenn branch noch lokal ist.
Das funktioniert nur, wenn Änderungen im Branch(hier replaceInPath) bereits committed, zurückgenommen oder gestached wurden.

git rebase master

HUGO lokal bauen (im Branch replaceInPath)

mage hugo

Eine generelle Lösung in HUGO könnte so aussehen

Den Ersetzungsstring per Config übergeben:

a) hugolib/paths/paths.go

RemovePathAccents   bool
ReplaceInPath       []string                                // NEU
UglyURLs            bool

...
RemovePathAccents:  cfg.GetBool("removePathAccents"),
ReplaceInPath:      cfg.GetStringSlice("replaceInPath"),   // NEU
UglyURLs:           cfg.GetBool("uglyURLs"),

b) hugolib/config.go

v.SetDefault("removePathAccents", false)
v.SetDefault("replaceInPath", make([]string,0))             // NEU
v.SetDefault("titleCaseStyle", "AP")

c) helpers/path.go

s = text.RemoveAccentsString(s)

// NEU Anfang
if len(p.ReplaceInPath) > 0 {
    // replace path
    // example: replaceInPath = ["ä", "ae", "ö", "oe", "ü", "ue", "ß", "ss"]
    replacer := strings.NewReplacer(p.ReplaceInPath...)
    s = replacer.Replace(s)
}
// NEU Ende

source := []rune(s)
...

Ob das der perfekte Ort in HUGO ist, weiß ich nicht, da ich go nicht kenne und verstehe. Diese Lösung funktioniert bei mir.

Und in der HUGO Anwendung:

d) config.toml

replaceInPath = ["ä", "ae", "ö", "oe", "ü", "ue", "ß", "ss"]

eintragen.

Das würde auch für beliebige Ersetzungen und damit auch für andere Sprachen funktionieren und wäre damit eine sprachunabhängige Lösung.


  1. Aber meckern ist leicht, machen ist schwer. Darum vielen Dank an die Macher von HUGO! ↩︎

Hugo