前端若依框架vue3+Element Plus实现i18n国际语言切换
wenlimin00 2024-07-28 09:33:01 阅读 72
最近要完成一个国际化的后台管理系统,但是遇到了一个问题,就是我在切换语言的时候,element 组件不更新,主要是main.js里头的 locale 语言没有更新,也就是main.js 只能在项目启动的时候后走一遍,其他页面跳转都不会走main.js, 所以导致了element plus 组件的国际语言没有更新,只能每次退出或者手动强制刷新项目或者页面才可能有效果,这样的话不符合前端需求呀,
花了几天的时间终于把这个问题解决了, 1.每次登录成功后,刷新整个项目页面 location.reload()
2.每次切换语言也刷新整个项目 location.reload()
第一步 下载 i18n依赖
第二步 编写好中文,英文文件,封装并创建 i18n文件
第三步. main.js中引入
整个i18n前端配置内容就都已完成 主要注意的一点就 main.js中 app.use中element 中英切换后 main.js不会重新执行 我们就得用location.reload() 可刷新整个页面
第四步 登录页面中的中英切换 登录成功 location.reload() 刷新页面
第五步 封装切换语言的组件 可在内部页面需要的地方调用组件 (element中中英切换主要是分页是否中英文切换了,如果每次中英文切换 分页组件库变成中文或者英文,那就成功了)
<code><template>
<div class="language_title">code>
<el-dropdown @command="handleCommand" trigger="click">code>
<div class="language_wrapper">code>
<span class="svg">code>
<svg preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24" width="1.2em" height="1.2em" data-v-12008bb2=""><path fill="currentColor" d="m18.5 10l4.4 11h-2.155l-1.201-3h-4.09l-1.199 3h-2.154L16.5 10h2zM10 2v2h6v2h-1.968a18.222 18.222 0 0 1-3.62 6.301a14.864 14.864 0 0 0 2.336 1.707l-.751 1.878A17.015 17.015 0 0 1 9 13.725a16.676 16.676 0 0 1-6.201 3.548l-.536-1.929a14.7 14.7 0 0 0 5.327-3.042A18.078 18.078 0 0 1 4.767 8h2.24A16.032 16.032 0 0 0 9 10.877a16.165 16.165 0 0 0 2.91-4.876L2 6V4h6V2h2zm7.5 10.885L16.253 16h2.492L17.5 12.885z"></path></svg>code>
</span>
<p>
<span v-if="proxy.$i18n.locale == 'zh-CN'">简体中文</span>code>
<span v-else>English</span>
</p>
<el-icon><caret-bottom /></el-icon>
</div>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item command="zh-CN">code>
<span>简体中文</span>
</el-dropdown-item>
<el-dropdown-item divided command="en-US">code>
<span>English</span>
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</div>
</template>
<script setup>
const { proxy } = getCurrentInstance();
const router = useRouter();
const redirect = ref(undefined);
// 切换语言
const handleCommand = (command) => {
proxy.$i18n.locale = command
sessionStorage.setItem('language', command)
// 获取当前路由的路径
redirect.value = router.currentRoute.value.path;
//存本地
sessionStorage.setItem('redirect', redirect.value)
router.push({ path: redirect.value || "/index" });
//登录后再次刷新整个项目走main.js 解决element-plus 语言切换问题
location.reload()
}
</script>
<style lang='scss' scoped>code>
.language_title{
display: flex;
align-items: center;
justify-content: center;
.language_wrapper{
display: flex;
align-items: center;
justify-content: center;
span.svg{
font-size: 24px;
color:#333;
}
i.el-icon{
color:#333;
}
p{
color:#333;
margin: 0 10px;
font-size: 16px;
}
}
}
</style>
切换语言解决后 下面就是每个页面怎么去使用啦
html中使用
<h2 class="title">{ { $t('title.name') }}</h2>code>
script中使用
//引入
import { $t } from '@/lang/i18n'
定义data中使用
const data = reactive({
loginRules:{
username: [{ required: true, trigger: "blur", message: $t('login.captcha.username') }],
password: [{ required: true, trigger: "blur", message: $t('login.captcha.password') }],
code: [{ required: true, trigger: "change", message: $t('login.captcha.code') }]
}
})
方法中使用
const handleCommand = (command) => {
proxy.$i18n.locale = command
sessionStorage.setItem('language', command)
loginRules.value.username[0].message = $t('login.captcha.username')
loginRules.value.password[0].message = $t('login.captcha.password')
loginRules.value.code[0].message = $t('login.captcha.code')
proxy.$modal.msgSuccess($t('language.message'));
}
下面就是若依框架中的菜单如何中英切换,和 字典的中英切换,前端如何处理,缺点就是每次项目需要迭代添加字典或者菜单,前端需要调整, 最好的办法是 后端做处理返回给前端,前端在请求头把语言发送给后端
可直接在菜单渲染在页面的时候做文章,
可直接在字典渲染在页面的时候做文章,
上一篇: CesiumJS第3篇,前端使用Vue和Element实现可拖动弹框效果,并使用mixins混入特性实现,不影响底层元素操作(Cesium上可拖拽的实时视频播放弹框,底层元素可以正常操作)
下一篇: vue3中lottie-web封装组件和api的使用
本文标签
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。