Hugo多语言列表排序与切换URL实现问题求助
解决Hugo 0.40.1多语言切换控件的三个问题
我来帮你逐个搞定这些Hugo老版本的多语言问题——0.40.1确实有点年头,但咱们还是能找到适配的解决方案:
问题1:.LanguageName显示异常或为空
这大概率是你的config.yaml格式出了问题!YAML对缩进要求极其严格,你原来的配置里weight和LanguageName没有缩进在对应语言代码的下方,导致Hugo根本读不到这些字段。另外,旧版本Hugo的上下文变量有时候需要注意根上下文的引用,但核心问题还是配置格式。
修复步骤:
- 先修正
config.yaml的缩进,确保每个语言的子键(weight、LanguageName)都缩进2个空格:
languages: en: weight: 1 LanguageName: English es: weight: 2 LanguageName: Español fr: weight: 3 LanguageName: Français
- 调整模板代码,确保正确遍历语言列表:
{{ range $.Site.Languages }} <span>{{ .Lang }} - {{ .LanguageName }}</span> {{ end }}
如果是在partial模板里调用,记得把根上下文传进去(比如{{ partial "lang-switcher.html" . }}),避免上下文丢失导致变量读取失败。
问题2:语言列表不按weight排序
Hugo 0.40.1版本默认不会自动对.Site.Languages按weight排序,得手动用sort函数指定排序规则。
修复代码:
在遍历的时候加上排序逻辑,按Weight字段升序排列:
{{ range sort $.Site.Languages "Weight" }} <span>{{ .Lang }} - {{ .LanguageName }}</span> {{ end }}
这样就会严格按照你配置的weight顺序(1→2→3)展示语言选项了。
问题3:构建当前页面的多语言版本URL
旧版本Hugo里,单纯遍历语言列表拿不到当前页面的对应语言URL,得用.Site.Sites——这个集合包含了每个语言的完整站点实例,每个实例里直接带着当前页面的对应语言版本链接。
最终完整的语言切换控件代码:
{{ range sort .Site.Sites "Language.Weight" }} <a href="{{ .RelPermalink }}">{{ .Language.Lang }} - {{ .Language.LanguageName }}</a> {{ end }}
.Site.Sites:所有语言站点的集合.Language.Lang/.Language.LanguageName:当前站点对应的语言代码和名称.RelPermalink:当前页面在该语言站点下的相对URL(用.Permalink可以获取绝对URL)
如果只想显示当前页面存在的语言版本,可以加上判断:
{{ range sort .Site.Sites "Language.Weight" }} {{ if .IsTranslated }} <a href="{{ .RelPermalink }}">{{ .Language.Lang }} - {{ .Language.LanguageName }}</a> {{ end }} {{ end }}
内容的提问来源于stack exchange,提问作者Andrew Schetinin
相关产品推荐
相关产品推荐

