You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何拦截Nuxt i18n的前缀变更以实现自定义语言跳转逻辑?

如何拦截Nuxt i18n的前缀变更以实现自定义语言跳转逻辑?

嗨,这个需求我之前做过好几次,其实不难搞定,给你分两种场景(Nuxt3/Nuxt2)来详细说,你按需选就行:

Nuxt3 实现方案

方法一:自定义路由中间件拦截根路径跳转

这种方式更灵活,能完全掌控跳转逻辑:

  1. 在项目根目录的 middleware 文件夹下新建一个中间件文件,比如 locale-redirect.ts
export default defineNuxtRouteMiddleware((to) => {
  const i18n = useI18n()
  // 只处理根路径的跳转请求
  if (to.path === '/') {
    // 仅在客户端读取localStorage(服务端没有这个对象)
    if (process.client) {
      const savedLocale = localStorage.getItem('user-locale')
      // 检查保存的语言是否在我们支持的列表里
      if (savedLocale && i18n.locales.some(loc => loc.code === savedLocale)) {
        // 跳转到保存的语言对应的路径
        return navigateTo(`/${savedLocale}`)
      }
    }
    // 没有保存的语言就用默认逻辑跳转到默认语言
  }
})
  1. nuxt.config.ts 里全局注册这个中间件,确保所有路由跳转前都会执行它:
export default defineNuxtConfig({
  // ...其他配置
  router: {
    middleware: ['locale-redirect']
  },
  i18n: {
    strategy: 'prefix', // 保持你原来的前缀策略
    defaultLocale: 'en',
    locales: [
      { code: 'en', name: 'English' },
      { code: 'fr', name: 'Français' },
      // 你的其他语言配置
    ]
  }
})

方法二:利用i18n内置的自定义检测逻辑

如果不想写中间件,也可以直接在i18n配置里自定义语言检测逻辑:

export default defineNuxtConfig({
  modules: ['@nuxtjs/i18n'],
  i18n: {
    strategy: 'prefix',
    defaultLocale: 'en',
    locales: [/* 你的语言列表 */],
    detectBrowserLanguage: {
      useCookie: false, // 不需要用cookie存储,我们用localStorage
      // 自定义检测函数
      async detector() {
        if (process.client) {
          const savedLocale = localStorage.getItem('user-locale')
          // 有保存的语言就返回它,没有就返回默认语言
          return savedLocale || 'en'
        }
        return 'en' // 服务端直接返回默认语言
      }
    }
  }
})

Nuxt2 实现方案

Nuxt2的思路和Nuxt3类似,只是语法稍有不同:

  1. middleware 文件夹下新建 locale.js
export default function ({ app, route, redirect }) {
  if (route.path === '/') {
    if (process.client) {
      const savedLocale = localStorage.getItem('user-locale')
      if (savedLocale && app.i18n.locales.some(loc => loc.code === savedLocale)) {
        return redirect(`/${savedLocale}`)
      }
    }
    // 没有保存的语言就跳转到默认语言
    return redirect(`/${app.i18n.defaultLocale}`)
  }
}
  1. nuxt.config.js 里注册中间件并配置i18n:
export default {
  modules: ['nuxt-i18n'],
  i18n: {
    strategy: 'prefix',
    defaultLocale: 'en',
    locales: [/* 你的语言列表 */]
  },
  router: {
    middleware: ['locale']
  }
}

最后别忘了补充语言切换的逻辑

当用户手动切换语言时,要把选中的语言保存到localStorage里,比如:

// Nuxt3示例
const i18n = useI18n()
const changeLocale = (localeCode) => {
  i18n.setLocale(localeCode)
  localStorage.setItem('user-locale', localeCode)
}

// Nuxt2示例
methods: {
  changeLocale(localeCode) {
    this.$i18n.setLocale(localeCode)
    localStorage.setItem('user-locale', localeCode)
  }
}

这样用户下次打开网站时,就会自动跳转到上次选择的语言啦~

备注:内容来源于stack exchange,提问作者van_folmert

火山引擎 最新活动