经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » Vue.js » 查看文章
vue3实现国际化的过程与遇到的问题详解
来源:jb51  时间:2022/5/9 12:22:07  对本文有异议

前言

开发了一个国际化的项目,技术栈是vue3 + TS + vite + vant + pinia, 需要设置多语言,采用的是vue-i18n这一个国际化插件,貌似只看到英文文档,而且网上找的其他教程大部分是针对vue2的,对应vue3的比较少,所以自己整理了一下

安装引入

  1. npm install vue-i18n

在src下新建locals文件夹,包含index.js,en.js,zh.js(只做中英文切换)

  1. // zh.js
  2. export default {
  3. login: {
  4. login: '登录',
  5. userName: '用户名'
  6. password: '密码'
  7. }
  8. }
  1. // en.js
  2. export default {
  3. login: {
  4. login: 'login',
  5. userName: 'userName'
  6. password: 'password'
  7. }
  8. }
  1. // index.js
  2. import { createI18n } from 'vue-i18n'
  3. import zh from './zh'
  4. import en from './en'
  5.  
  6. const messages = {
  7. en,
  8. zh,
  9. }
  10. const language = (navigator.language || 'en').toLocaleLowerCase() // 这是获取浏览器的语言
  11. const i18n = createI18n({
  12. locale: localStorage.getItem('lang') || language.split('-')[0] || 'en', // 首先从缓存里拿,没有的话就用浏览器语言,
  13. fallbackLocale: 'en', // 设置备用语言
  14. messages,
  15. })
  16.  
  17. export default i18n

有个注意的地方就是上面用了缓存,待会会说到为什么要这样做

最后在main.js引入就好了

  1. import { createApp } from 'vue'
  2. import i18n from './locals'
  3.  
  4. const app = createApp(App)
  5. app.use(i18n)
  6.  
  7. app.mount('#app')

至此插件就算配置好了,接下来使用的话基本上就两种场景,一是在<template>里面,一种是在setup里面

使用

  • 在<template>中使用

要用到一个$t()的方法,或者使用v-t也行

  1. <div>
  2. {{`$t('login.userName')`}}
  3. </div>
  4. <div v-t="'login.password'"></div>

关于$t()还有很多用法,可以动态传参等,具体还是去官网看看

  • 在setup中使用
  1. <script setup lang="ts">
  2. import { useI18n } from 'vue-i18n'
  3.  
  4. const { t } = useI18n()
  5.  
  6. console.log(t('login.useName'))
  7. </script>

目前项目中只采用这两种方式,还有其他的就不展开了

  • 切换语言

vue-i18n提供了一个全局变量locale,直接修改即可

  1. <template>
  2. <div class="menu">
  3. <div class="menu-item" @click="changeLang('en')">English</div>
  4. <div class="menu-item" @click="changeLang('zh')">中文</div>
  5. </div>
  6. </template>
  7. <script setup lang="ts">
  8. import { useI18n } from 'vue-i18n'
  9. const { locale } = useI18n()
  10.  
  11. const changeLang = (lang: string) => {
  12. locale.value = lang
  13. localStorage.setItem('lang', lang)// 重要!下面遇到问题里解释
  14. }
  15. </script>

遇到的问题

  • 切换语言后,跳转页面或者刷新当前页后语言又重置了

这是因为切换语言是修改的全局变量locale,当页面一刷新,相当于又重置为默认值了,所以上面采用缓存来解决

  • 使用ref或者reactive设置的文字,切换语言后不更新

这是因为这里的数据是初始化产生的,并不能跟着local变化而响应变化,关于这一点,我是放在了computed里面解决的

  1. <template>
  2. <div class="ilst">
  3. <div
  4. v-for="item in list"
  5. :key="item">
  6. {{item}}
  7. </div>
  8. </div>
  9. </template>
  10. <script setup lang="ts">
  11. import { useI18n } from 'vue-i18n'
  12. import { ref, computed } from 'vue'
  13. const { t } = useI18n()
  14. // 使用ref定义之后再改语言无效
  15. //const list = ref([
  16. // t('c100018'),
  17. // t('c100019'),
  18. // t('c100020'),
  19. // t('c100021'),
  20. // t('c100020'),
  21. ])
  22. // 采用computed可解决
  23. const list = computed(() => [
  24. t('c100018'),
  25. t('c100019'),
  26. t('c100020'),
  27. t('c100021'),
  28. t('c100020'),
  29. ])
  30.  
  31. </script>

当然啦解决方法不止这一种,还可以使用watch等,自己去找资料看看吧~

总结

按照目前的生态来看,做国际化项目还是比较多资料来参考的,ui框架用的是vant,这也可以通过设置locale来改变组件的语言。

  1. import { Locale } from 'vant'
  2. import enUS from 'vant/es/locale/lang/en-US'
  3. Locale.use('en-US', enUS)

业务代码使用vue-i18n也很简单,是个不错的选择

到此这篇关于vue3实现国际化的过程与遇到问题的文章就介绍到这了,更多相关vue3实现国际化内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号