You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现Hugo记住用户语言选择(基于i18n与active类)

Hugo i18n 语言选择持久化实现

问题说明

Hugo自带的i18n支持多语言自动生成,但当前语言选择功能存在缺陷:用户切换语言后关闭浏览器,再次打开会恢复默认英文。需要基于现有带active类的语言选择HTML结构,实现语言选择的持久化存储,直到用户主动切换。

现有语言选择HTML结构:

<ul>
      <li>
        <a href="#">en<span>▾</span></a>
        <ul>
          <li>
            <a class="active" href="/">English</a>
          </li>
          <li>
            <a href="/fr/">French</a>
          </li>
        </ul>
      </li>
</ul>

实现方案

1. 给语言链接添加标识(方便JS识别)

先给每个语言切换链接加上data-lang属性,关联对应的语言代码:

<ul>
  <li>
    <a href="#">en<span>▾</span></a>
    <ul>
      <li>
        <a class="active" href="/" data-lang="en">English</a>
      </li>
      <li>
        <a href="/fr/" data-lang="fr">French</a>
      </li>
    </ul>
  </li>
</ul>

2. 用localStorage实现持久化逻辑

添加JavaScript代码,处理语言选择的存储和页面加载时的恢复:

document.addEventListener('DOMContentLoaded', function() {
  const langLinks = document.querySelectorAll('[data-lang]');
  
  // 页面加载时读取保存的语言设置
  const savedLang = localStorage.getItem('preferredLang');
  if (savedLang) {
    const targetLink = document.querySelector(`[data-lang="${savedLang}"]`);
    // 如果当前页面不是用户保存的语言,自动跳转
    if (targetLink && !targetLink.classList.contains('active')) {
      window.location.href = targetLink.href;
    }
  }
  
  // 监听语言切换点击事件,保存选择到localStorage
  langLinks.forEach(link => {
    link.addEventListener('click', function() {
      const selectedLang = this.getAttribute('data-lang');
      localStorage.setItem('preferredLang', selectedLang);
    });
  });
});

3. Hugo模板层面优化(可选)

为了让页面加载时更快恢复用户语言,可以在模板的<head>中添加内联脚本,提前检查存储并跳转:

<script>
  (function() {
    const savedLang = localStorage.getItem('preferredLang');
    const currentLang = '{{ .Site.Language.Lang }}';
    if (savedLang && savedLang !== currentLang) {
      // 动态获取对应语言的站点URL
      const langUrl = '{{ range .Site.Languages }}{{ if eq .Lang "__LANG__" }}{{ .RelURL }}{{ end }}{{ end }}'.replace('__LANG__', savedLang);
      window.location.href = langUrl;
    }
  })();
</script>

这样用户每次切换语言时,选择会被存在浏览器的localStorage中,下次打开页面时会自动跳转到用户上次选择的语言版本,同时active类也会对应更新。

内容的提问来源于stack exchange,提问作者user18336975

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 20:10:23