Vue3.2+TS通过i18n实现国际化全流程,使用Vue3.2+TS+i18n来给大家实现一下项目的国际化,并且单独封装一个切换语种的组件,解决出现的bug

news/2024/7/7 20:03:16

前端开发项目时,很多的时候都会用到国际化,今天我使用Vue3.2+TS+i18n来给大家实现一下项目的国际化,并且单独封装一个切换语种的组件,解决出现的bug,大家一步一步往下看。

1.安装i18n
npm install vue-i18n --save
//我的版本是  "vue-i18n": "^9.2.2"
2.在src目录下,新建一个locales文件夹,此文件夹内新建一个index.ts文件,并写入如下内容

import { createI18n } from "vue-i18n";
import en from './language/en'
import zhCn from "./language/zhCn";

const i18n = createI18n({
  //这里是语种的持久化,刷新也存在
  locale:localStorage.getItem('language') || 'zhCn', // 默认是中文
  fallbackLocale: 'en', // 语言切换的时候是英文
  globalInjection:true,//全局配置
  legacy:false,//vue3写法
  messages:{en,zhCn}//本地message,也就是你需要做国际化的语种

})

export default i18n
3.这里大家可以看到,我把两种语言分别放到了不同的文件夹,所以这里大家需要在locales下新建一个language文件夹,并在下方新建en.ts和zhCn.ts文件,并分别写入如下内容
//en
export default {
  message: {
    hello: 'hello world',
    language:'language'
  }
}

//zh
export default {
  message: {
    hello: '你好,世界',
    language:'语言'
  }
}
4.都完成后需要在main.ts中注册,另外,本次我本次使用的ui框架是字节的ArcoDesign,大家使用其他的element或者antdesign也可以,都不影响。
import { createApp } from 'vue'
import './style.css'
import i18n from './locales' //这里
import ArcoVue from '@arco-design/web-vue';
import '@arco-design/web-vue/dist/arco.css';
import ArcoVueIcon from '@arco-design/web-vue/es/icon';

import App from './App.vue'

const app = createApp(App)
app.use(i18n)//这里
app.use(ArcoVue);
app.use(ArcoVueIcon);
app.mount('#app')

5.我们封装一个组件来切换语种
<template>
    <a-dropdown @select="handleSelect" :popup-max-height="false">
      <a-button>{{curLanguage == 'zhCn' ? '中文': 'Endlish'}}<icon-down/></a-button>
      <template #content>
        <a-doption :value="'zhCn'" :disabled="curLanguage == 'zhCn'">中文</a-doption>
        <a-doption :value="'en'" :disabled="curLanguage == 'en'">Endlish</a-doption>
      </template>
    </a-dropdown>
</template>

<script setup lang="ts">
import { useI18n } from "vue-i18n";
import { Message } from '@arco-design/web-vue';
import { computed } from "vue";

const i18n = useI18n()
//储存语种并进行切换
const handleSelect = (v:any) => {
  localStorage.setItem('language',v)
  i18n.locale.value = v
  Message.success({
    content:v=='zhCn'?'当前语种为中文':'The current language is English',
    duration: 2000
  })
};

// 计算当前语种
const curLanguage = computed(()=>{
  return i18n.locale.value
})

</script>
<style scoped lang="less">
.arco-btn{
  position: absolute;
  right: 10px;
  top: 5px;
}
.arco-dropdown-open .arco-icon-down {
  transform: rotate(180deg);
}
</style>

6.使用,直接通过调用{{ $t(“message.hello”) }}
<template>
  <div>
    {{ $t("message.hello") }}
    <ChangeLan></ChangeLan>
  </div>
</template>

<script setup lang="ts">
import ChangeLan from './components/tabLang.vue'

</script>
<style scoped lang="less">
ul {
  list-style-type: none;
  li {
    height: 30px;
    line-height: 30px;
    background-color: aqua;
    margin-bottom: 10px;
  }
}
</style>
7.这里可能会报一个警告,You are running the esm-bundler build of vue-i18n. It is recommended to configure your bundler to explicitly replace feature flag globals with boolean literals to get proper tree-shaking in the final bundle.
那我们在vite.config.ts里面添加如下代码即可
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

export default defineConfig({
  plugins: [vue()],
  resolve: {
    alias: {
      'vue-i18n': 'vue-i18n/dist/vue-i18n.cjs.js' // 加入这行
    }
  }
})

8.假如我们的语种比较多,那么如果我们要新增语种,就需要全部改一下这样就很不方便,那么我们直接封装一个语言的映射文件,在locales文件夹下,新增一个langMap.ts文件,写入如下内容
// 语言映射,通过Map的key和value来控制语言的切换,也就是键值对控制
export default  {
  langMap:new Map([
    ['en','English'],
    ['zhCn','中文'],
    ['ja','わご'],//这里就是我新添加的语种
  ])
}
9.我们的组件现在也需要进行变化
<template>
  <a-dropdown @select="handleSelect" :popup-max-height="false">
    <!-- 这里就是通过他的key,或者他的值 -->
    <a-button>{{langMap.langMap.get(curLanguage)}}<icon-down/>
    </a-button>
    <template #content>
      <!-- langMap.langMap.entries() 返回一个新的迭代器对象 比如  ['en','English'] -->
      <!-- 第一个是他的key 可以写成item[0],第二个是他的值 item[1] -->
      <a-doption
        v-for="item in langMap.langMap.entries()"
        :key="item[0]"
        :value="item[0]"
        :disabled="curLanguage == item[0]"
        >{{ item[1] }}</a-doption>
    </template>
  </a-dropdown>
</template>

<script setup lang="ts">
import { useI18n } from "vue-i18n";
import { Message } from "@arco-design/web-vue";
import { computed } from "vue";
import langMap from "../locales/langMap";

const i18n = useI18n();

const handleSelect = (v: any) => {
  localStorage.setItem("language", v);
  i18n.locale.value = v;
  Message.success({
    content: `${langMap.langMap.get(v)}`,
    duration: 2000,
  });
};

const curLanguage = computed(() => {
  return i18n.locale.value;
});


</script>
<style scoped lang="less">
.arco-btn {
  position: absolute;
  right: 10px;
  top: 5px;
}
.arco-dropdown-open .arco-icon-down {
  transform: rotate(180deg);
}
</style>

至此,Vue3.2+TS+Vite的国际化实现,并且解决了部分bug,封装了国际化切换组件,有需要的直接拿去用吧。


http://lihuaxi.xjx100.cn/news/1430813.html

相关文章

关于@JSONField的使用

1.此注解来自jar包com.alibaba.fastjson 今天分享一个有意思的事情。这个注解作用与类的属性上&#xff0c;如下&#xff1a; ApiModelProperty(value"开始时间,格式:yyyy-MM-dd",required true) JSONField(name"start_date",ordinal 1) private String…

ssm新生报到系统源码和论文PPT

ssm新生报到系统源码和论文PPT004 开发环境 开发工具&#xff1a;idea 数据库mysql5.7(mysql5.7最佳) 数据库链接工具&#xff1a;navcat,小海豚等 开发技术&#xff1a;java ssm tomcat8.5 选题依据及意义 每学年九月份随着新生的入校&#xff0c;学校工作中的重点都会集…

手动创建一个DOCKER镜像

1. 我们先使用C语言写一个hello-world程序 vim hello.c # include <stdio.h>int main() {print("hello docker\n"); } 2. 将hello.c文件编译成二进制文件, 需要安装工具 yum install gcc yum install glibc-static 开始编译 gcc -static hello.c -o hello 编译…

如何通过Pytest的插件,轻松切换自动化测试的环境地址?

前言 前面小编介绍了如何通过Pytest的插件来实现自动化测试的环境的切换&#xff0c;当时使用的方法是通过钩子函数进行获取命令行参数值&#xff0c;然后通过提前配置好的参数进行切换测试环境地址。加我VX&#xff1a;atstudy-js 回复“测试”&#xff0c;进入 自动化测试学…

Structure needs cleaning fsimage文件系统损坏修复

最近清除数据的时候发现有些文件无法rm [rootnode101 application_1691504014432_0002]# rm -rf ls:* [rootnode101 application_1691504014432_0002]# ls ls: 无法访问flink-dist-cache-8f72398e-9254-42d4-a14d-a0def99b493d: Structure needs cleaning以下操作可能会删除文件…

iview+treeSelect组件,我是如何一步步手动实现全选功能的

如果我掏出下图&#xff0c;阁下除了私信我加入学习群&#xff0c;还能如何应对&#xff1f; 正文开始 前言一、历史问题二、通过监听select事件实现全选不靠谱&#xff01;&#xff01;&#xff01;三、 通过外部事件控制树选择组件四、render函数创建组件4.1 不得不说的h函数…

taro h5列表拖拽排序 --- sortablejs 和 react-sortable-hoc

描述&#xff1a;列表&#xff0c;拖拽排序&#xff0c;只测试了h5 一、sortablejs 文档&#xff1a;http://www.sortablejs.com/ 1.安装sortablejs 2、引入 import Sortable from sortablejs3、页面 const [list, setList] useState([{id: item-1,content: 选项1 }, {id…

消息队列常见问题(1)-如何保障不丢消息

目录 1. 为什么消息队列会丢消息&#xff1f; 2. 怎么保障消息可靠传递&#xff1f; 2.1 生产者不丢消息 2.2 服务端不丢消息 2.3 消费者不丢消息 3. 消息丢失如何快速止损&#xff1f; 3.1 完善监控 3.2 完善止损工具 1. 为什么消息队列会丢消息&#xff1f; 现在主流…