electron+vue3全家桶+vite项目搭建【六】集成vue-i18n 国际化

news2025/1/18 11:03:41

文章目录

    • 注意
    • 引入
    • 1.引入依赖
    • 2.集成vue i18n
    • 3.测试代码
    • 4.封装多语言切换组件
    • 5.测试多语言切换
    • 6.优化代码

注意

已发现 9.2.2版本的vue-i18n 如果使用cnpm安装,打包会报错,使用npm或者pnpm安装依赖没有问题

引入

如果需要多语言支持,那么最好在项目搭建之初我们就集成好国际化

vue i18n官网

demo项目地址

1.引入依赖

npm install vue-i18n@9

2.集成vue i18n

1.我们现在src下面创建locals目录,里面创建packages目录,然后分别创建en.ts和zh-cn.ts

// src\locales\package\en.ts
export default {
  // app相关文本
  app: {
    title: 'demo'
  },
};
// src\locales\package\zh-cn.ts
export default {
  // app相关文本
  app: {
    title: '精彩案例'
  },
};

2.我们在locals目录下创建index.ts

// src\locales\index.ts
import { createI18n } from 'vue-i18n';
import zhCn from './package/zh-cn';
import en from './package/en';
import CacheUtils from '@utils/cacheUtils';

// 创建 i18n
const i18n = createI18n({
  legacy: false, // 解决Not available in legacy mode报错
  globalInjection: true, // 全局模式,可以直接使用 $t
  locale: 'zhCn',
  messages: {
    zhCn,
    en
  }
});

export default i18n;

目录结构如图所示:

请添加图片描述

3.调整main.ts

// src\main.ts
import i18n from './locales';

// ...
// 配置国际化
app.use(i18n)

3.测试代码

接着我们在HelloWorld页面补充国际化代码:

// src\components\HelloWorld.vue
<template>
  <h1>{{ $t('app.title') }}</h1>
</template>

显示效果如图所示:

  • 并且随着我们切换 i18n的 locale字段,可以看到文本自动变成对应语言

请添加图片描述

4.封装多语言切换组件

我们知道只要改变i18n的locale的值就能修改应用的语言,那么我们完全可以基于element-plus封装一个多语言切换的组件:

// src\components\Language.vue
<template>
  <el-dropdown @command="handleCommand">
    <span class="el-dropdown-link">
      {{ currentLang == 'zhCn' ? '中文' : 'English' }}
      <el-icon class="el-icon--right">
        <arrow-down />
      </el-icon>
    </span>
    <template #dropdown>
      <el-dropdown-menu>
        <el-dropdown-item command="zhCn" :disabled="currentLang == 'zhCn'">中文</el-dropdown-item>
        <el-dropdown-item command="en" :disabled="currentLang == 'en'">English</el-dropdown-item>
      </el-dropdown-menu>
    </template>
  </el-dropdown>
</template>

<script lang="ts" setup>
import { ArrowDown } from '@element-plus/icons-vue'
import { useI18n } from 'vue-i18n';
import { computed } from 'vue';

const i18n = useI18n()

// 计算属性获取i18n的值
const currentLang = computed(() => i18n.locale.value)

// 切换语言
function handleCommand(command: string) {
  i18n.locale.value = command
}

</script>
<style scoped>
.example-showcase .el-dropdown-link {
  cursor: pointer;
  color: var(--el-color-primary);
  display: flex;
  align-items: center;
}
</style>

5.测试多语言切换

我们在HelloWorld.vue文件中引入多语言插件:

请添加图片描述
运行查看效果:

请添加图片描述

6.优化代码

我们可以发现不管是文本的使用还是组件的封装,都存在着大量的魔法值,假如后续调整了语言字段,改动将是巨大的,那么其实我们是可以正对映射关系封装一个kv对象的:

// src\locales\LangMap.ts

export default {
  /**key - value 形式关联所有语言和对应描述 */
  languageMap: new Map([
    ["zhCn", "中文"],
    ["en", "English"],
  ]),

  /**所有属性路径描述 */
  app_title: 'app.title'
}

在helloWOrld中我们可以这样调用
请添加图片描述

我们调整语言切换组件

<template>
  <el-dropdown @command="handleCommand">
    <span class="el-dropdown-link">
      {{ langMap.languageMap.get(currentLang) }}
      <el-icon class="el-icon--right">
        <arrow-down />
      </el-icon>
    </span>
    <template #dropdown>
      <el-dropdown-menu>
        <el-dropdown-item :command="langEntry[0]" :key="langEntry[0]" :disabled="currentLang == langEntry[0]"
          v-for="langEntry in langMap.languageMap.entries()">{{
            langEntry[1] }}</el-dropdown-item>
      </el-dropdown-menu>
    </template>
  </el-dropdown>
</template>

<script lang="ts" setup>
import { ArrowDown } from '@element-plus/icons-vue'
import { useI18n } from 'vue-i18n';
import { computed } from 'vue';
import langMap from '../locales/LangMap'

const i18n = useI18n()
// 计算属性获取i18n的值
const currentLang = computed(() => i18n.locale.value)

// 切换语言
function handleCommand(command: string) {
  i18n.locale.value = command
}

</script>
<style scoped>
.example-showcase .el-dropdown-link {
  cursor: pointer;
  color: var(--el-color-primary);
  display: flex;
  align-items: center;
}
</style>

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

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

相关文章

【100个 Unity实用技能】 | Lua中获取当前时间戳,时间戳和时间格式相互转换、时间戳转换为多久之前

Unity 小科普 老规矩&#xff0c;先介绍一下 Unity 的科普小知识&#xff1a; Unity是 实时3D互动内容创作和运营平台 。包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者&#xff0c;借助 Unity 将创意变成现实。Unity 平台提供一整套完善的软件解决方案&#xff…

【AI大比拼】文心一言 VS ChatGPT-4

摘要&#xff1a;本文将对比分析两款知名的 AI 对话引擎&#xff1a;文心一言和 OpenAI 的 ChatGPT&#xff0c;通过实际案例让大家对这两款对话引擎有更深入的了解&#xff0c;以便大家选择合适的 AI 对话引擎。 亲爱的 CSDN 朋友们&#xff0c;大家好&#xff01;近年来&…

Python自动录入ERP系统数据

大家好&#xff0c;我是毕加锁。 今天给大家带来的是用Python解决Excel问题的最佳姿势 文末送书&#xff01; 文末送书&#xff01; 文末送书&#xff01; 项目总体情况 软件&#xff1a;Pycharm 环境: Python 3.7.9(考虑到客户可能会有不同操作系统&#xff0c;为了兼容性…

【小程序】django学习笔记3

今天我们来做数据库和django的关联。 根据之前的代码应该看得出来我想做一个获取访客的ip地址并计算访问次数的app&#xff0c;所以必然会用到数据库。 这里选择用的是mysql(因为免费) 不一样的是这里我们打算用django提供的orm框架对数据库进行操作。 一. 环境准备 首先安…

SLAM面试笔记(3) - 视觉SLAM

目录 1 紧耦合、松耦合的区别 &#xff08;1&#xff09;紧耦合和松耦合的区别 &#xff08;2&#xff09;紧耦合和松耦合的分类 &#xff08;3&#xff09;为什么要使用紧耦合 2 SIFT和SUFT的区别 3 视差与深度的关系 4 闭环检测常用方法 5 描述PnP算法 6 梯度下降法…

SQL基础

目录 1.库操作 2.表操作 3.表操作--修改 4.表操作 --删表 5.添加数据 管理数据 查询表中数据&#xff08;重点&#xff09; 判空条件 1.模糊条件查询 2.聚合查询&#xff08;函数&#xff09; 3.排序查询 4.分页查询 5.分组查询&#xff08;配合聚合函数用于统计&a…

C++模拟实现读写锁

文章目录一、读者写者问题二、读写锁1.读写锁的概念2.读写锁的设计(1)成员变量(2)构造函数和析构函数(3)readLock函数(4)readUnlock函数(5)writeLock函数(6)writeUnlock函数3.RWLock类代码三、测试读写锁一、读者写者问题 在编写多线程的时候&#xff0c;有一种情况是非常常见…

为什么黑客不黑/攻击赌博网站?如何入门黑客?

攻击了&#xff0c;只是你不知道而已&#xff01; 同样&#xff0c;对方也不会通知你&#xff0c;告诉你他黑了赌博网站。 攻击赌博网站的不一定是正义的黑客&#xff0c;也可能是因赌博输钱而误入歧途的法外狂徒。之前看过一个警方破获的真实案件&#xff1a;28岁小伙因赌博…

Linux 操作系统原理作业 - 行人与机动车问题

大三上学期操作系统原理这门课中&#xff0c;老师给了一道作业《行人与机动车问题》&#xff1b; 即Linux多线程下处理行人与机动车谁优先的问题&#xff0c;需要用到多线程和互斥量&#xff1b; 行人 - 机动 车问题 假设有一个路口&#xff0c;有很多行人和机动车需要通过&a…

1673_MIT 6.828 Homework xv6 lazy page allocation要求翻译

全部学习汇总&#xff1a; GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 在计划表中看到了这样一份作业&#xff0c;做一个简单的翻译整理。原来的页面&#xff1a;Homework: xv6 lazy page allocation (mit.edu) 家庭作业&#xff1a;x…

代码版本M、RC、GA、Release等标识的区别

引言 最近听说spring framework有了重大版本调整&#xff0c;出了6.0的GA版本了 那GA是啥意思呢&#xff1f; 看了下spring 官网和代码仓库&#xff0c;除了GA&#xff0c;还有M、RC、Release等 Spring FrameworkLevel up your Java code and explore what Spring can do f…

[Java Web]element | 一个由饿了么公司开发的前端框架,让你快速构建现代化、美观的 Web 应用程序。

⭐作者介绍&#xff1a;大二本科网络工程专业在读&#xff0c;持续学习Java&#xff0c;努力输出优质文章 ⭐作者主页&#xff1a;逐梦苍穹 ⭐所属专栏&#xff1a;Java Web ⭐如果觉得文章写的不错&#xff0c;欢迎点个关注一键三连&#x1f609;有写的不好的地方也欢迎指正&a…

【mybatis】mybatis的工作原理

目录一、工作流程二、说明2.1 构建SqlSessionFactory2.2 SqlSession的获取2.3 SqlSession执行语句三、源码结构3.1 接口层3.2 核心处理3.3 核心处理层四、代码示例4.1 通过inputStream构建SqlSessionFactory4.2 通过configuration构建SqlSessionFactory4.3 mybatis-config.xml示…

groovy环境搭建

什么是DSL? 领域特定语言DSL&#xff08;全称&#xff1a;domain specific language&#xff09; 常见的DSL语言有&#xff1a;UML、HTML、SQL、XML、Groovy 作用&#xff1a;解决某一特定领域的问题 什么是groovy? groovy是一种基于JVM的敏捷开发语言。 结合了Python、Ruby和…

Vite4+Vuejs3项目初步搭建,并部署多个vue项目到nginx

前提条件 1、熟悉命令行 2、已安装 16.0 或更高版本的 Node.js 参照vuejs官网的步骤&#xff0c;创建一个vue前端项目 当前vuejs的版本&#xff1a;3.2.47 npm init vuelatestVue.js - The Progressive JavaScript Framework√ Project name: ... vuejs3-project√ Add Type…

BitDock桌面美化工具 一直在后台偷偷上传东西,具体上传什么东西不知,一天耗费我几十个G的流量

通过流量防火墙监控发现bitdock一直在上传东西&#xff0c;目前截止发现已上传了40G的流量 ――――――――――――――――――――――― 程序名称&#xff1a;SystemAudioDetection.exe 程序说明&#xff1a; 路径&#xff1a;D:\BitDock\AudioEngine\SystemAudioDetecti…

【C 字符串】02 字符串函数(命令行参数)

Navigator一、strlen()函数—统计长度二、strcat()函数—拼接三、strncat()函数—strcat()的升级四、strcmp()和strncmp()—比较五、strcpy()和strncpy()—拷贝六、sprintf()函数—合并多个字符串七、其他可能用到的字符串函数八、ctype.h中的字符函数九、把字符串转换为数字十…

在线文章生成工具-原创文章生成工具

在线文章生成器 在线文章生成器是指一种可以在线使用的自动化创造文章的工具。它可以使用自然语言处理&#xff08;NLP&#xff09;技术和人工智能算法提供需要的信息&#xff0c;基于标题、关键字&#xff0c;句子关联性等元素自动创造文章内容&#xff0c;涵盖各种类型&…

双端队列 码蹄集

题目来源&#xff1a;码蹄集 题目描述&#xff1a; 题意分析&#xff1a; 这道题目需要使用到双端队列的数据结构。我们可以借助 STL 中的 deque 来实现这个数据结构。具体来说&#xff0c;我们可以通过 deque 的 push_front 和 push_back 操作在队列的头部和尾部添加元素&am…

地球系统模式(CESM)实践技术应用

目前通用地球系统模式&#xff08;Community Earth System Model&#xff0c;CESM&#xff09;在研究地球的过去、现在和未来的气候状况中具有越来越普遍的应用。于2010年07月推出以来&#xff0c;一直受到气候学界的密切关注。近年升级的CESM2.0在大气、陆地、海洋、海冰、陆冰…