如何拦截Nuxt i18n的前缀变更以实现自定义语言跳转逻辑?
如何拦截Nuxt i18n的前缀变更以实现自定义语言跳转逻辑?
嗨,这个需求我之前做过好几次,其实不难搞定,给你分两种场景(Nuxt3/Nuxt2)来详细说,你按需选就行:
Nuxt3 实现方案
方法一:自定义路由中间件拦截根路径跳转
这种方式更灵活,能完全掌控跳转逻辑:
- 在项目根目录的
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}`) } } // 没有保存的语言就用默认逻辑跳转到默认语言 } })
- 在
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类似,只是语法稍有不同:
- 在
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}`) } }
- 在
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




