使用插件i18n实现国际化多语言

news2024/11/13 21:45:10

1、安装

npm install vue-i18n@next --save
或者
yarn add vue-i18n@next --save

 2、配置

  •    新建目录及文件夹

- src

    - locales

        - lang

            - zh.js   //   中文,

            - en.js   //   英语,

            - ar.js    //   法语,

            - jp.js    //   日语,

            - fr.js     //   阿拉伯语

        - index.js

  • lang/zh.js 
const zh = {
    test: "測試",
    Credits: "積分"
}
export default zh; 

  •  lang/en.js
 const en = {
    test: "test",
    Credits: "Credits"
}
export default en;

      其他几种语言仿照即可 

------------------------------------------ 

  • lang/index.js
import { createI18n } from "vue-i18n";     // 引入vue-i18n组件
import zh from "./lang/zh";     // 引入zh.js 模块
import en from "./lang/en";     // 引入en.js 模块
import jp from "./lang/jp";     // 引入日语模块
import ar from "./lang/ar";     // 引入阿拉伯语 模块
import fr from "./lang/fr";     // 引入法语模块
 
 
export const getCurrLang = () => {
    // const localLang = navigator.language.split('-')[0]; // 浏览器语言
    const localStorageLang = localStorage.getItem("localeKey");// 本地存储语言
    return localStorageLang || 'en';
}
 
//注册i18n实例并引入语言文件
const i18n = createI18n({
    legacy: false,
    locale: 'en', // 语言标识
    fallbackLocale: "en", //没有英文的时候默认中文语言
    messages: {
        zh,
        en,
        jp,
        ar,
        fr
    },
});
export default i18n;
 
 
  • src/main.js 引入i18n 
import { createApp } from 'vue'
import App from './App.vue'
import i18n from "./locales/i18n";
 
const app = createApp(App)
app.use(i18n).mount('#app');

3、安装及配置路由

npm install vue-router --save
或者
yarn add vue-router --save

  • 配置路由 
import { createRouter, createWebHistory } from 'vue-router'
import HomeView from '@/views/HomeView.vue'
 
const routes = [
  {
    path: '/',
    redirect: `/homeView`
  },
  {
    path: '/:locale?/homeView',
    name: 'HomeView',
    component: HomeView,
    meta: {
      title: 'HomeView'
    }
  }
]
 
const router = createRouter({
  history: createWebHistory(process.env.BASE_URL),
  routes
})
 
export default router
  •   在main.js 引入router
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
 
const app = createApp(App)
app.use(router).mount('#app')
  • 在App.vue 设置路由守卫 
<template>
  <div>
    <router-view />
  </div>
</template>
 
<script>
import { defineComponent } from "vue";
import { useI18n } from "vue-i18n";
import { useRouter } from "vue-router";
 
export default defineComponent({
  setup() {
    // 路由守卫
    const router = useRouter();
    const i18n = useI18n();
    router.beforeEach((to, from, next) => {
      // 检查to.params.locale 是否存在,并设置相应的语言环境或执行其他逻辑
      const lang = to.params.locale;
      localStorage.setItem("localeKey", lang || "en");
      i18n.locale.value = lang || "en";
      // 放这才能根据语言设title标签内容
      document.title =
        to.meta.title || "home";
      next(); // 确保要调用next方法
    });
  },
});
</script>
 

 4、切换语言下拉框及逻辑

<template>
  <div style="display: flex;">
    <div style="margin: 25px;">{{ credits }}</div>
    <div class="item lang">
      <a-dropdown :trigger="['click']" v-model:visible="visible" placement="top">
        <a class="ant-dropdown-link" @click.prevent>
          <span class="text">{{ currentLang }}</span>
          <DownOutlined class="icon" v-show="visible" />
          <UpOutlined class="icon" v-show="!visible" />
        </a>
        <template #overlay>
          <a-menu @click="onClickMenu">
            <a-menu-item v-for="item in localArr" :key="item.key"> {{ item.name }} </a-menu-item>
          </a-menu>
        </template>
      </a-dropdown>
    </div>
  </div>
</template>
<script>
import { computed, defineComponent, ref, getCurrentInstance, watch } from "vue";
import { DownOutlined, UpOutlined } from "@ant-design/icons-vue";
import { useI18n } from "vue-i18n";
import i18nLanguage from "@/locales/i18n";
import { useRouter } from "vue-router";
export default defineComponent({
  components: {
    DownOutlined,
    UpOutlined,
  },
  props: {},
  setup() {
    // 定义key对应的语言
    const localArr = [
      { key: "zh", name: "中文" },
      { key: "en", name: "English" },
      { key: "jp", name: "日本です" },
      { key: "ar", name: "العربية" },
      { key: "fr", name: "français" },
    ]
 
    const getCurrentLang = (lang) => {
      return localArr.find(item => item.key == lang).name || "English"
    }
 
    // 在js中使用多语言,第一种
    // const credits = computed(() => {
    //   return i18nLanguage.global.t("Credits")
    // })
 
    //第二种:也可以通过组件实例,getCurrentInstance 只能在 setup 或生命周期钩子中使用
    const _this = getCurrentInstance().appContext.config.globalProperties;
    const credits = computed(() => _this.$t("Credits"))
 
    const visible = ref(false);
    const i18n = useI18n();
    const router = useRouter();
 
    let currentLang = ref(getCurrentLang(localStorage.getItem("localeKey") || "en"));
    watch(() => i18n.locale.value, (val) => {
      currentLang.value = getCurrentLang(val)
    }, {
      immediate: true
    })
    const onClickMenu = (e) => {
      i18n.locale.value = e.key;
      // 存入缓存
      localStorage.setItem("localeKey", e.key);
      // 设置页面显示的语言
      currentLang.value = getCurrentLang(e.key);
      // 下拉框收起
      visible.value = false;
      // 改变路由路径
      if (e.key !== "en") {
        router.push({ params: { locale: i18n.locale.value } });
      } else {
        router.push({ params: { locale: "" } });
      }
    };
    return {
      localArr,
      visible,
      onClickMenu,
      currentLang,
      credits
    };
  },
});
</script>

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2085141.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

上万人苦心研究数年的数据,备份怎么做才保险?-Infortrend

业界领先的应用研究机构&#xff0c;拥有上万名员工。需要一套存储设备&#xff0c;能够长期保存大量备份数据。他们从事的研究项目周期&#xff0c;往往持续数月甚至数年&#xff0c;涉及大量的数据收集和分析。为了确保研究的连续性&#xff0c;并且保护关键数据&#xff0c;…

效率提升关键

在当今快节奏的工作环境中&#xff0c;效率软件成为了提升个人和团队生产力的重要工具。这些软件可以帮助人们更好地管理时间、优化工作流程以及增强团队协作。具体分析如下&#xff1a; 1 亿可达 ◦ 简介&#xff1a;亿可达作为一款自动化工具&#xff0c;亿可达被誉为国…

为什么要学习 CCRC-PIPP

背景&#xff1a; 在数字化时代背景下&#xff0c;数据已成为重要的生产要素和国家战略资源&#xff0c;个人信息的保护尤为关键。 保障公民的个人信息权益&#xff0c;促进其依法合理有效利用&#xff0c;是政府和企业推动数字经济健康发展的首要任务。 中国网络安全审查技…

TypeScript入门简介

TypeScript&#xff08;TS&#xff09;是JavaScript的超集&#xff0c;其可以编译出纯净、 简洁的JavaScript代码&#xff0c;并且可以运行在任何浏览器上、Node.js环境中和任何支持ECMAScript 3&#xff08;或更高版本&#xff09;的JavaScript引擎中。TypeScript提供最新的和…

【如何在MacOS升级ruby版本】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

如何在手机上设置国内代理IP地址:详细指南

在某些情况下&#xff0c;我们可能需要在手机上设置国内代理IP地址&#xff0c;以便访问特定的网络服务或提高网络连接的稳定性。本文将详细介绍如何在Android和iOS设备上设置代理IP地址。 在Android设备上设置代理IP地址 在Android设备上设置代理IP地址非常简单&#xff0c;只…

AD7046 GD32 SPI驱动设计

硬件设计 AD7046简介&#xff1a;ADS7046 12 位&#xff0c; 3 MSPS&#xff0c; 单端输入&#xff0c; 小型低功耗 SAR ADC。ADS7046 是一款 12 位 3 MSPS SAR ADC&#xff0c; 支持0V到 AVDD 范围内的单端输入&#xff0c; AVDD 的范围为2.35V至 3.6V。内部失调电压校准功能…

深度解读SGM41511电源管理芯片I2C通讯协议REG05寄存器解释

REG05 是 SGM41511 的第六个寄存器&#xff0c;地址为 0x05。它是一个可读写的寄存器&#xff0c;上电复位值&#xff08;PORV&#xff09;为 10011111。这个寄存器控制多个重要的充电安全和管理功能&#xff1a; EN_TERM (D[7])&#xff1a; 控制充电终止功能 0 禁用 1 …

视频结构化从入门到精通——认识视频结构化

认识视频结构化 1. 视频结构化与非结构化 1. 非结构化数据 非结构化数据指的是未经处理、以原始形式存在的数据。这类数据是直接采集、记录的&#xff0c;包含了音频、视频等多维信息&#xff0c;且没有任何标签、注释或分类来表示其中的内容。非结构化数据需要进一步处理和…

scrapy--伪分布式redis操作

免责声明:本文仅做分享... 目录 scrapy分布式爬虫 伪分布式 redis 快速学习使用 字 符 串 类 型 列 表 类 型 hash 类型 set 类型 zset 类型 小结: scrapy-redis 安装第三方库: settings.py配置: spider文件修改: redis数据库添加 键 值 启动 scrapy总结 scrap…

IS-IS路由配置--路由聚合

目录 不熟悉和理解IS-IS动态协议的可以回顾IS-IS详解&#xff0c;IS-IS相关的实验都不再做过多的解释 一. 实验拓扑 二. 实验配置 不熟悉和理解IS-IS动态协议的可以回顾IS-IS详解&#xff0c;IS-IS相关的实验都不再做过多的解释 IS-IS路由原理详解https://blog.csdn.net/23…

js Object.keys--filter 遍历对象中的数组,排查为空字段

Object.keys(filter).forEach(function(key) { if(key filters){ filter[key] filter[key].filter((item) > item.tagName ! "") } });

CTF—杂项学习

1 文件操作隐写 1.1 文件类型识别 1.1.1 File命令 当文件没有后缀名或有后缀名而无法打开时&#xff0c;根据识别出的文件类型来修改后缀名即可正常打开文件&#xff0c;file是Linux下的文件识别命令。 file 文件名 使用场景&#xff1a;不知道后缀名&#xff0c;无法打开文件…

低代码技术在业务流程自动化中的应用与挑战

在数字化转型的浪潮中&#xff0c;低代码平台和业务流程自动化&#xff08;BPA&#xff09;成为了企业提升效率和灵活性的关键工具。今天&#xff0c;我们将探讨低代码技术如何推动BPA的实施&#xff0c;及其带来的挑战和解决方案。 低代码技术概述 低代码平台是现代软件开发的…

HR告诉你:PMP证书到底是职场神话还是锦上添花?真相大解析!

HR在评价PMP证书时&#xff0c;需要根据招聘要求来考量。目前大多数项目管理岗位都要求应聘者“持有PMP等相关证书优先考虑”&#xff0c;简而言之&#xff1a;PMP证书就像是敲门砖。 对于大多数人而言&#xff0c;拥有PMP证书意味着有机会获得面试机会。毕竟在项目管理领域&a…

ASO优化之如何准确定位目标用户

如今应用商店中APP层出不穷&#xff0c;市场那么大&#xff0c;用户的需求也是各种各样&#xff0c;那么怎么才能用ASO优化来准确的定位目标用户呢&#xff0c;以下是一些关键策略和方法&#xff0c;用于实现这一目标&#xff1a; 1. 深入市场与用户研究 市场趋势分析&#x…

企业级数据库 DevOps 最佳实践,通过 NineData 实现高效安全的数据库开发

第15届中国数据库技术大会&#xff08;DTCC2024&#xff09;于8月22日-24日在北京隆重召开&#xff0c;本次大会由 IT168 联合旗下 ITPUB、ChinaUnix 两大技术社区主办。玖章算术 NineData 受邀首次参展&#xff0c;并由 NineData 联合创始人周振兴发表了《企业级数据库 DevOps…

乾元通渠道商中标湖南省煤业集团公司安全生产预防和应急救援能力建设装备配备采购项目

近日&#xff0c;乾元通渠道商中标湖南省煤业集团安全生产预防和应急救援能力建设装备配备采购项目&#xff0c;乾元通作为聚合通讯保障技术厂家&#xff0c;为项目一标段卫星通讯指挥车提供车载聚合路由器终端及系统。 乾元通经过多年发展&#xff0c;逐步建起车载系列多链路聚…

minio创建用户并访问指定的bucket

目录 bucket的命名规则一、创建权限1、参数含义2、示例&#xff0c;实现读写test, 读test2目录但无下载权限3、自己新建的权限 二、创建用户并关联权限三、用新用户登录四、mc命令1、mc安装用docker容器运行直接安装在操作系统 2、mc配置mc配置文件查看mc配置mc alias list查看…

力扣题/回溯/电话号码的字母组合

电话号码的字母组合 力扣原题 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输入&#xff1a;digi…