Hugo 多語言網站設定
有兩種方案可以完成,分別是以檔案名稱(index.en.md index.zh.md)以及以目錄(en/p1/index.md zh/p1/index.md)翻譯,不知道兩者的差別是正常的,因為文檔沒寫,XD。
一般用戶
兩種方案對一般用戶來說體感上沒有差別,可以說是完全等效,不是開發者基本上完全沒差,上游主題怎麼建議你就怎麼設定。
多語言設定的方案差別
你不去論壇「剛好」翻到這篇文章,你絕對不知道差在哪裡。直接貼上官方回覆的表格
Feature Translating by directory Translating by file name Primary mechanism Creates logical pages by mirroring files Complements collections with existing pages Navigation Prevents crossing language boundaries Allows crossing language boundaries Logic Mimics source directory to target Global equivalent of the lang.MergefunctionConfiguration Module mounts Cascade sites.complements
另外還有一點是如果用檔案名稱設定多語言如 index.en.md,當 Markdown linter 如 rumdl 檢查連結正確性時,指向檔案名稱這個功能會讓你的多語言很麻煩,因為每個語言都要寫出「不同語言」的檔案後綴([link](file.en.md) 和 [link](file.zh.md))都要手動修改,使用目錄方式就沒有後綴問題)。同樣的連結問題也發生在 VS Code 頁面跳轉上,用目錄翻譯的多語言直接跳轉完全沒問題,用檔案名稱翻譯的多語言一樣也要寫出完整檔案名稱才能跳轉。
此外,目錄翻譯也更符合人體工學:不同語言就該不同人寫,把不同語言的改動湊到同一個目錄很奇怪,只有個人網站、AI 網站才相對適合用檔名翻譯,這樣內容就會在同一目錄中,因為這種情況「方便」比「明確」更重要。
最後,多語言的相同目錄的資產是共享的,如 content/en/p1/a.jpg 可以在 content/zh/p1/index.md 中使用 ,這同樣的也是 undocumented,我的天。
關於多語言的問題,同樣的問題被問了一遍又一遍,Hugo 官方寧願重複回答就是不在文檔記錄... https://discourse.gohugo.io/t/do-all-page-bundles-need-localized-copies-once-you-add-a-new-language/37225/12
多語言翻譯回退 (language fallback)
使用 module.mounts 完成,這是官方推薦做法,lang.Merge 只幫你找到頁面不會渲染。