Hugo v0.127.0多语言切换器开发遇两类错误求助
Hugo多语言切换器短代码问题解决方案
问题1:模板字段错误(.Page不存在于*langs.Language类型)
错误原因
遍历.Site.Languages得到的是语言配置对象(类型为*langs.Language),并非页面对象,因此该对象不存在.Page属性,调用.Page.Permalink会触发字段不存在的错误。
正确写法
需要获取当前页面在对应语言下的关联页面,推荐使用Page.AllTranslations直接获取当前页面的所有语言版本:
<ul> {{ range .Page.AllTranslations }} <li> <a href="{{ .Permalink }}" {{ if eq .Lang $.Page.Lang }}class="active"{{ end }}> {{ .Language.LanguageName }} </a> </li> {{ end }} </ul>
.Page.AllTranslations返回当前页面的全语言版本(含当前语言),每个项为页面对象,可直接调用.Permalink- 通过
.Language.LanguageName获取语言显示名称 - 可通过
eq .Lang $.Page.Lang给当前语言添加激活样式
如果需要遍历所有站点语言并兼容无对应翻译的页面:
<ul> {{ range .Site.Languages }} {{ $lang := .Lang }} {{ $translatedPage := $.Page.Translations | where "Lang" $lang | first }} <li> <a href="{{ if $translatedPage }}{{ $translatedPage.Permalink }}{{ else }}{{ .Lang | relURL }}{{ end }}"> {{ .LanguageName }} </a> </li> {{ end }} </ul>
- 若当前页面无对应语言翻译,自动跳转到该语言的首页
问题2:语言切换路径错误(路径嵌套)
错误原因
relLangURL过滤器的作用是将相对路径转换为对应语言的URL,但直接传入.Lang(如en)时,Hugo会将其视为相对路径,在当前页面路径后拼接,导致example.com/en/de这类错误嵌套路径。
正确写法
直接调用语言对象的.Permalink属性,该属性对应语言的首页URL:
<ul> {{ range .Site.Languages }} <li> <a href="{{ .Permalink }}">{{ .LanguageName }}</a> </li> {{ end }} </ul>
.Permalink对于语言配置对象来说,就是对应语言的根路径(如example.com/de/、example.com/en/),避免路径嵌套问题
配置检查
你的hugo.toml配置无问题:
defaultContentLanguage = "de"配合defaultContentLanguageInSubdir = true确保默认语言也生成子目录路径- 各语言的
contentDir、menu配置符合Hugo多语言规范,未使用废弃语法
内容的提问来源于stack exchange,提问作者MrJoky
相关产品推荐
相关产品推荐

