vue路由守卫需配合vue-i18n实现多语言权限提示,应在router创建前导出i18n实例,在守卫中调用t()方法获取翻译文案,并按模块定义语义化key,动态用于跳转或通知,同时监听locale变化复用校验逻辑。

Vue 路由守卫本身不直接处理提示文案的国际化,但可以与 vue-i18n 无缝配合,在权限拦截时动态获取对应语言的提示信息,实现真正的多语言权限提示。
在路由守卫中注入 i18n 实例
全局守卫(如 beforeEach)运行时,i18n 实例通常尚未挂载到 app 上,因此不能直接通过 getCurrentInstance() 或 useI18n() 获取。正确做法是:在创建 router 前,先创建并导出 i18n 实例,再在守卫中按需调用其 t() 方法。
- 确保
i18n实例在router/index.js之前初始化(例如放在src/i18n/index.js中并导出i18n对象) - 在路由守卫中导入该实例:
import { i18n } from '@/i18n' - 使用
i18n.t('common.noPermission')或i18n.t('route.unauthorized')获取当前 locale 下的提示文案
定义多语言权限提示文案
在语言包中为权限相关场景预留语义化 key,避免硬编码中文或英文。推荐按模块组织,例如:
-
auth.loginRequired→ “请先登录” / “Please log in first” -
auth.insufficientRole→ “权限不足,无法访问此页面” / “Insufficient role to access this page” -
auth.redirectToLogin→ “正在跳转至登录页…” / “Redirecting to login…”
这些 key 应统一维护在 zh-CN.js 和 en-US.js 等语言文件中,便于后续扩展其他语言。
分析 Vue 3 Composition API 使用情况——审计响应式模式、可组合函数设计、ref 与 reactive 的选择、计算属性、watcher 使用及组件……
在守卫逻辑中动态使用翻译结果
将原本写死的提示字符串(如 alert('无权限') 或 next({ name: '403' }))替换为带 i18n 的行为。常见做法有两类:
- 跳转到通用错误页,并传入 i18n key 作为参数:
next({ name: 'ErrorPage', params: { code: '403', messageKey: 'auth.insufficientRole' } }),由目标组件读取并渲染 - 在守卫中直接调用通知组件(如 Element Plus 的
ElMessage),传入翻译后的文案:ElMessage.warning(i18n.t('auth.loginRequired'))
注意:若使用通知类 API,需确保该组件已在全局注册,且 i18n locale 变更后能响应式更新文案(vue-i18n@v9 默认支持)。
处理 locale 切换时的守卫重触发
用户切换语言时,当前路由不会自动重走守卫,但某些权限提示可能依赖语言上下文(比如角色名翻译)。此时可监听 i18n.locale 变化,在变化后手动触发一次路由刷新(谨慎使用)或重新校验当前路由:
- 监听方式示例:
i18n.onLocaleChange((newLocale) => { if (router.currentRoute.value.meta.requiresAuth) checkAuthAndNotify() }) - 更稳妥的做法是:把权限校验逻辑抽成独立函数,既供
beforeEach调用,也供 locale 变更后复用
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!









