全局封装vue-i18n组件以及几个的问题解决

1、Vue-i18n是什么?

答:Vue I18n是一个用于Vue.js的国际化插件,它使您可以轻松地在Vue应用程序中实现国际化和本地化。该插件提供了一种简单的方式来管理和加载不同语言的翻译文本,并在Vue组件中使用它们。Vue-I18n支持基于组件的翻译、动态翻译、复数形式、日期和数字格式化等功能。通过Vue-I18n,您可以为您的应用程序提供多语言支持,使其可以适应不同的用户群体和市场。

2、安装vue-i18n

首先, 我们需要安装一下vue-i18n插件 (如果你有vite+vue3项目): pnpm install --save vue-i18n

3、基本配置

(1)在"./src"文件夹下创建两个文件夹分别是"locale"和"lang","locale"文件夹下的index.js用于存放其他与语言相关的辅助文件或配置。"lang"文件夹存放各种语言的翻译文件

(2)在lang文件夹下的文件, 需要我们将各种语言配置好, 我截取一下大概配置 (3)现在, 我们写index.js部分 在这个文件中, 我们主要做了什么呢?其实在这里面, 我们主要是配置了国际化, 并将配置好的进行了导出. 第一步, 我们需要将createI18n进行导入 import { createI18n } from "vue-i18n";

导入之后, 我们还需要将我们lang文件中的文件进行导入

js 复制代码
import zhCN from "./lang/zh-CN"; // 中文
import enUS from "./lang/en-US"; // 英文

(4)导入完成之后, 我们创建一个变量, 用于优先设置哪国语言
const defaultLocale = localStorage.getItem("locale") || "zh-CN";

(5)剩下的就是创建国际化i18n并导出了

js 复制代码
const i18n = createI18n({
  locale: defaultLocale,
  legacy: false,
  messages: {
    "zh-CN": zhCN,
    "en-US": enUS,
  },
});
export default i18n;

(6)我们先将该文件在main.js中进行导入并挂载app应用实例身上

js 复制代码
import i18n from "@/locale";
app.use(i18n);

(补充): 首先在vite.config.js文件里设置:(方便在src文件夹下查找所需的文件)

js 复制代码
export default defineConfig(() => {
          ....
           resolve: {
             alias: {
        // 设置路径
        "~": path.resolve(__dirname, "./"),
        // 设置别名
        "@": path.resolve(__dirname, "./src"),
      },
      extensions: [".mjs", ".js", ".ts", ".jsx", ".tsx", ".json", ".vue"],
    },
          
}

(7)然后我们还需要在lang/index.js中导出一个数组, 用于我们后面的下拉选择

js 复制代码
export const LOCALE_OPTIONS = [
  { label: "中文", value: "zh-CN" },
  { label: "English", value: "en-US" },
];

4、全局封装切换语言组件

(1)在src/components文件夹下创建"LangSelect"文件夹和index.vue

(2)我们在"LangSelect"文件夹下的index.vue组件上进行导入
import { LOCALE_OPTIONS } from '@/locale/index'

(3)并使用element-plus的下拉框组件, 并绑定一个change事件**

js 复制代码
import { useI18n } from 'vue-i18n'
import { LOCALE_OPTIONS } from '@/locale/index'
const { locale } = useI18n()

//用来切换语言
function handleLanguageChange(lang) {
//往本地存储
    localStorage.setItem('locale', lang)
    locale.value = lang
    isChangeLang.value = !isChangeLang.value;
}

这样, 切换语言的下拉框就写完了:

(4)在语言选择时,我们会将其备份到本地,这样刷新时就能保留,而我们则会优先从本地获取,避免遗失:

使用的时候, 我们只需要使用t包裹即可 ($t是i18n注入的一个函数,直接在模板中使用即可,ts脚本中需要使用useI18n获取到t(语言转换函数),或者通过i18n实例下的global属性获取t函数。)

(5)$t的不同用法:

i18n.global.t("XXXX")是一个函数调用,使用了 i18n 对象的 global 属性来获取文本的本地化版本,方便在某函数方法或JS文件里调用,比如:

(6)全局监听切换语言的设置:

在store/index.js下设置:

js 复制代码
// 导入 Element Plus 中英文语言包
import zhCn from "element-plus/es/locale/lang/zh-cn";
import en from "element-plus/es/locale/lang/en";

const useAppStore = defineStore("app", {
computed: () => ({
    /**
     * 根据语言标识读取对应的语言包
     */
    locale: computed(() => {
      if (useAppStore().language === "en") {
        return en;
      } else {
        return zhCn;
      }
    }),
  }),
});

(7)几个问题的需要解决的方案:

7.1 比如在router.js里设置i18n.global.t本地化,但每次切换时不及时更新切换别的语言。

解决办法:在LangSelect/index.vue文件下导入useRouter,并设置router.go()在切换语言的handleLanguageChange函数方法里

js 复制代码
import { useRouter } from 'vue-router'
const router = useRouter()
function handleLanguageChange(lang) {
    localStorage.setItem('locale', lang)
    locale.value = lang
    isChangeLang.value = !isChangeLang.value;
    router.go()
}

7.2 页面挂载Element Plus组件的切换语言Select选择器来检查当前语言并正确配置
:placeholder="isChangeLang ? 'please enter change language' : '请切换语言'"

js 复制代码
const isChangeLang = ref(false)
// 当组件挂载时,检查当前语言
onMounted(() => {
    if (locale.value === 'en-US') {
        isChangeLang.value = true
    }
})

7.3 切换语言的其他方法:

举例子:首先定义了两个变量nihaoZhnihaoEn,分别存储了中文和英文版本的问候语。然后,通过首先配置好的locale.value === 'en-US'这个条件判断环境来决定使用哪个版本的问候语。最后,使用ElMessageBox.confirm()方法来显示警告消息框。 用途: 这个例子展示了如何在Vue.js组件中根据用户的语言设置显示不同的问候语。这种做法可以有效地处理多语言用户体验。

这是我作为前端菜鸟写的第一篇技术文章,如果有地方写得不够好或者不够完整,欢迎大家多多指教哦!

相关推荐
_.Switch40 分钟前
Python Web 应用中的 API 网关集成与优化
开发语言·前端·后端·python·架构·log4j
一路向前的月光44 分钟前
Vue2中的监听和计算属性的区别
前端·javascript·vue.js
长路 ㅤ   44 分钟前
vite学习教程06、vite.config.js配置
前端·vite配置·端口设置·本地开发
长路 ㅤ   1 小时前
vue-live2d看板娘集成方案设计使用教程
前端·javascript·vue.js·live2d
Fan_web1 小时前
jQuery——事件委托
开发语言·前端·javascript·css·jquery
安冬的码畜日常1 小时前
【CSS in Depth 2 精译_044】第七章 响应式设计概述
前端·css·css3·html5·响应式设计·响应式
莹雨潇潇2 小时前
Docker 快速入门(Ubuntu版)
java·前端·docker·容器
Jiaberrr2 小时前
Element UI教程:如何将Radio单选框的圆框改为方框
前端·javascript·vue.js·ui·elementui
Tiffany_Ho3 小时前
【TypeScript】知识点梳理(三)
前端·typescript
安冬的码畜日常4 小时前
【D3.js in Action 3 精译_029】3.5 给 D3 条形图加注图表标签(上)
开发语言·前端·javascript·信息可视化·数据可视化·d3.js