vue2项目实现国际化(若依框架示例)

news/2024/9/19 13:06:41/ 标签: vue.js

本文主要梳理vue2项目实现全项目格式化,在导航栏中切换,页面中所有的组件的默认语言随之切换,搭配vue-i18n插件

文章目录

  • 基础准备
      • 引入插件vue-i18n
  • 实现示例流程
      • 1. 创建国际化文件
          • 1.1 element文件夹
          • 1.2 locales文件夹
          • 1.3 index.js
          • 1.4 change-language.vue 切换组件
      • 2. 全局引入(main.js)
      • 3. 在导航栏navbar.vue组件切换逻辑
      • 4. 在首页示例展示效果


基础准备

引入插件vue-i18n

安装插件

npm i vue-i18n

【注】安装过程中报错
npm ERR! Cannot read properties of null (reading ‘matches‘)
解决方案:
先清除npm缓存:

npm cache clean --force

再使用pnpm进行安装(未安装的话就npm i pnpm一下即可)

pnpm i vue-i18n

或者在package.json文件中直接添加 “vue-i18n”: “^8.27.1”,版本,在进行重新进行npm install一下也可以
在这里插入图片描述

实现示例流程

1. 创建国际化文件

在src文件目录下创建i18n文件夹,文件夹下创建:element、locales、change-language.vue、index.js四个文件
【en.js文件】

1.1 element文件夹

创建两个文件:en.js,zh-CN.js,
主要用于存放elementUI组件,一些相对固定的文本描述翻译
【en.js】

// 英语
exports.default = {el: {colorpicker: {confirm: 'OK',clear: 'Clear'},datepicker: {now: 'Now',today: 'Today',cancel: 'Cancel',clear: 'Clear',confirm: 'OK',selectDate: 'Select date',selectTime: 'Select time',startDate: 'Start Date',startTime: 'Start Time',endDate: 'End Date',endTime: 'End Time',prevYear: 'Previous Year',nextYear: 'Next Year',prevMonth: 'Previous Month',nextMonth: 'Next Month',year: 'year',month1: 'January',month2: 'February',month3: 'March',month4: 'April',month5: 'May',month6: 'June',month7: 'July',month8: 'August',month9: 'September',month10: 'October',month11: 'November',month12: 'December',week: 'week',weeks: {sun: 'Sun',mon: 'Mon',tue: 'Tue',wed: 'Wed',thu: 'Thu',fri: 'Fri',sat: 'Sat'},months: {jan: 'Jan',feb: 'Feb',mar: 'Mar',apr: 'Apr',may: 'May',jun: 'Jun',jul: 'Jul',aug: 'Aug',sep: 'Sep',oct: 'Oct',nov: 'Nov',dec: 'Dec'}},select: {loading: 'Loading',noMatch: 'No matching data',noData: 'No data',placeholder: 'Select'},cascader: {noMatch: 'No matching data',loading: 'Loading',placeholder: 'Select',noData: 'No data'},pagination: {goto: 'Go to',pagesize: '/page',total: 'Total {total}',pageClassifier: ''},messagebox: {title: 'Message',confirm: 'OK',cancel: 'Cancel',error: 'Illegal input'},upload: {deleteTip: 'press delete to remove',delete: 'Delete',preview: 'Preview',continue: 'Continue'},table: {emptyText: 'No Data',confirmFilter: 'Confirm',resetFilter: 'Reset',clearFilter: 'All',sumText: 'Sum'},tree: {emptyText: 'No Data'},transfer: {noMatch: 'No matching data',noData: 'No data',titles: ['List 1', 'List 2'], // to be translatedfilterPlaceholder: 'Enter keyword', // to be translatednoCheckedFormat: '{total} items', // to be translatedhasCheckedFormat: '{checked}/{total} checked' // to be translated},image: {error: 'FAILED'},pageHeader: {title: 'Back' // to be translated},popconfirm: {confirmButtonText: 'Yes',cancelButtonText: 'No'},empty: {description: 'No Data'}},
};

【zh-CN.js】

// 中文
exports.default = {el: {colorpicker: {confirm: '确定',clear: '清空'},datepicker: {now: '此刻',today: '今天',cancel: '取消',clear: '清空',confirm: '确定',selectDate: '选择日期',selectTime: '选择时间',startDate: '开始日期',startTime: '开始时间',endDate: '结束日期',endTime: '结束时间',prevYear: '前一年',nextYear: '后一年',prevMonth: '上个月',nextMonth: '下个月',year: '年',month1: '1 月',month2: '2 月',month3: '3 月',month4: '4 月',month5: '5 月',month6: '6 月',month7: '7 月',month8: '8 月',month9: '9 月',month10: '10 月',month11: '11 月',month12: '12 月',// week: '周次',weeks: {sun: '日',mon: '一',tue: '二',wed: '三',thu: '四',fri: '五',sat: '六'},months: {jan: '一月',feb: '二月',mar: '三月',apr: '四月',may: '五月',jun: '六月',jul: '七月',aug: '八月',sep: '九月',oct: '十月',nov: '十一月',dec: '十二月'}},select: {loading: '加载中',noMatch: '无匹配数据',noData: '无数据',placeholder: '请选择'},cascader: {noMatch: '无匹配数据',loading: '加载中',placeholder: '请选择',noData: '暂无数据'},pagination: {goto: '前往',pagesize: '条/页',total: '共 {total} 条',pageClassifier: '页'},messagebox: {title: '提示',confirm: '确定',cancel: '取消',error: '输入的数据不合法!'},upload: {deleteTip: '按 delete 键可删除',delete: '删除',preview: '查看图片',continue: '继续上传'},table: {emptyText: '暂无数据',confirmFilter: '筛选',resetFilter: '重置',clearFilter: '全部',sumText: '合计'},tree: {emptyText: '暂无数据'},transfer: {noMatch: '无匹配数据',noData: '无数据',titles: ['列表 1', '列表 2'],filterPlaceholder: '请输入搜索内容',noCheckedFormat: '共 {total} 项',hasCheckedFormat: '已选 {checked}/{total} 项'},image: {error: '加载失败'},pageHeader: {title: '返回'},popconfirm: {confirmButtonText: '确定',cancelButtonText: '取消'},empty: {description: '暂无数据'}},};
1.2 locales文件夹

创建两个文件:en.js,zh-CN.js,
主要用于存放页面中所需要的除了elementUI自带其他的页面文本描述元素
【en.js】

export default {Language: 'English',system: {homePage: {title1: 'title1',title2: 'title2',description1: 'Last 7 days',description2: 'Nearly six months',}}
};

【zh-CN.js】

export default {Language: '中文',system: {homePage: {title1: '标题1',title2: '标题2',description1: '近7日',description2: '近6个月',}}
};
1.3 index.js

文本集成文件,用于导入到入口文件main.js中,基本结构就是将两个element和locales文件集成导入,为了实现全局控制使用了本地储存localStorage来进行全局控制切换值,默认中文

import Vue from 'vue';
import VueI18n from 'vue-i18n';Vue.use(VueI18n);// 各个国家的key
const localeKeys = ['en', 'zh-CN'];// 各个国家语言包
const messages = {};
for (const key of localeKeys) {const langObj = require(`./locales/${key}`).default;const langElement = require(`./element/${key}`);messages[key] = {...langObj,...langElement ? langElement.default : {}};
}export default new VueI18n({locale: localStorage.getItem('change-language') || 'zh-CN',messages,silentTranslationWarn: true // 忽略翻译警告
});

解析:

  • locale属性:用于控制语言的标识,默认中文,此处使用了localStorage本地储存,方便全局且页面刷新都可以保持选中值

  • messages属性:切换文本的主要内容值,当locale的属性切换,所对应的语言的文本展示

  • silentTranslationWarn:是否忽略翻译警告

1.4 change-language.vue 切换组件

封装国际化语言切换组件,方便调用使用

<template><el-dropdown @command="handle"style="cursor: pointer;"><span class="el-dropdown-link">{{$t('Language')}}<i class="el-icon-caret-bottom el-icon--right"></i></span><el-dropdown-menu slot="dropdown"><el-dropdown-item v-for="(item, index) of list":key="index":disabled="$t('Language') == item.name":command="item.key">{{item.name}}</el-dropdown-item></el-dropdown-menu></el-dropdown>
</template><script>
export default {name: 'change-language',data() {return {list: [{ key: 'en', name: 'English' }, // 英语{ key: 'zh-CN', name: '中文' }, // 中文],}},methods: {handle(value) {this.$i18n.locale = valuelocalStorage.setItem('change-language', value)location.reload()},},
}
</script>
<style scoped lang="scss">
</style>

2. 全局引入(main.js)

在入口文件main.js文件中进行引入,方便全局使用,

import i18n from './i18n';Vue.use(Element, {i18n: (key, value) => i18n.t(key, value),
});new Vue({el: '#app',router,store,i18n,render: h => h(App)
});

3. 在导航栏navbar.vue组件切换逻辑

直接在导航栏引入封装组件

引入:

<ChangeLanguage />
import ChangeLanguage from '@/i18n/change-language'export default {components: {ChangeLanguage,},}

效果:
在这里插入图片描述

4. 在首页示例展示效果

示例组件:
直接使用$t函数直接双向绑定

<template><div class="newMain-container homePage">示例代码:<br>我是title1==={{ $t('system.homePage.title1') }}<br>我是title2==={{ $t('system.homePage.title2') }}<br>我是description1===<el-button type="primary">{{ $t('system.homePage.description1') }}</el-button><br>我是description2===<el-button type="primary">{{ $t('system.homePage.description2') }}</el-button></div>
</template>

效果:

在这里插入图片描述
在这里插入图片描述


http://www.ppmy.cn/news/1527649.html

相关文章

Vue 3有哪些新特性

Composition API&#xff1a; 这是 Vue 3 中最引人注目的新特性之一。Composition API 提供了一种全新的方式来组织和重用逻辑。它允许你将组件的逻辑按功能组织成可复用的代码块&#xff08;称为“组合式函数”&#xff09;&#xff0c;而不是像 Vue 2 那样按选项&#xff08;…

【乐企-业务篇】开票前置校验服务-规则链服务接口实现(发票基础信息校验)

开票前置校验服务-规则链服务接口实现(发票基础信息校验) 代码 import liquibase.pro.packaged.L; import org.apache.commons.collections4.Collec

wpf 使用Oxyplot 库制作图表示例

方法&#xff1a; InitTable 方法&#xff1a;负责初始化图表模型&#xff0c;包括设置图表的样式、坐标轴、系列和注释。这个方法包括多个 Init 方法的调用&#xff0c;表示图表的初始化过程可以分步骤进行。 InitGoalPoint 方法&#xff1a;当前未实现&#xff0c;但预留了子…

渗透测试综合靶场 DC-2 通关详解

一、准备阶段 准备工具如Kali Linux&#xff0c;下载并设置DC-2靶场机。确保攻击机和靶机在同一网络段&#xff0c;通常设置为桥接模式或NAT模式。 1.1 靶机描述 Much like DC-1, DC-2 is another purposely built vulnerable lab for the purpose of gaining experience in …

Flutter - Win32程序是如何执行main函数

Win32程序的主体结构 int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,_In_ wchar_t *command_line, _In_ int show_command) {// Attach to console when present (e.g., flutter run) or create a// new console when running with a debugger.if …

软件编程随想

已经做了16年左右的软件开发&#xff0c;从最初的Delphi开发&#xff0c;到后来的Web开发&#xff08;.net)再到Java Web&#xff08;Spring MCV,SpringBoot&#xff09;开发&#xff0c;以后Python&#xff0c;NodeJS等开发&#xff0c;做了这么多年&#xff0c;全部是以解决单…

C++ 元编程

目录 C 元编程1. 术语2. 元函数1. 数值元函数示例&#xff1a;阶乘计算 2. 类型元函数示例&#xff1a;类型选择 3. 混合编程1. 常规的计算点积范例2. 混合元编程计算点积 4. typelist实现设计和基本操作接口&#xff08;算法&#xff09;完整代码 5. tuple 实现基础知识1. 左值…

HTML讲解(一)body部分

目录 1.什么是HTML 2.HTML基本框架 3.标题声明 4.修改标题位置 5.段落声明 6.修改段落位置 7.超链接访问 8.图像访问 9.改变网页背景及文本颜色 10.添加网页背景图 11.超链接改变颜色 12.设置网页边距 小心&#xff01;VS2022不可直接接触&#xff0c;否则&#xff…

Linux文件IO(一)-open使用详解

在 Linux 系统中要操作一个文件&#xff0c;需要先打开该文件&#xff0c;得到文件描述符&#xff0c;然后再对文件进行相应的读写操作&#xff08;或其他操作&#xff09;&#xff0c;最后在关闭该文件&#xff1b;open 函数用于打开文件&#xff0c;当然除了打开已经存在的文…

最新EmlogPro影视主题模版/简约暗黑纯净Mould主题模板/博客网站源码

源码简介&#xff1a; 最新EmlogPro影视主题模版&#xff0c;它是一个简约暗黑纯净Mould主题模板&#xff0c;也能做博客网站源码。 Mould这个主题模板啊&#xff0c;真的是设计得特别有感觉。它的布局和设计都超级流畅&#xff0c;用起来特别直观&#xff0c;简单多了。不管是…

c++206 友元类

#include<iostream> using namespace std; class A { public://声明的位置 和public private无关friend void modifyA(A* pA, int _a);//函数modifyA是A的好朋友A(int a, int b){this->a a;this->b b;}int getA(){return this->a;} private:int a;int b; };vo…

力扣题解2332

大家好&#xff0c;欢迎来到无限大的频道。 今日继续给大家带来力扣题解。 题目描述&#xff08;中等&#xff09;​&#xff1a; 坐上公交的最晚时间 给你一个下标从 0 开始长度为 n 的整数数组 buses &#xff0c;其中 buses[i] 表示第 i 辆公交车的出发时间。同时给你一…

Spring Boot-Session管理问题

Spring Boot 中的 Session 管理问题及其解决方案 1. 引言 在 Spring Boot Web 应用中&#xff0c;Session 是用来维护用户状态的重要机制。由于 HTTP 协议本质上是无状态的&#xff0c;Session 提供了一种方式来存储和共享用户的会话数据。Spring Boot 提供了多种方式来管理 …

SpringMVC后续4

文件上传下载 导入maven <dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.2</version></dependency> 配置MultipartResolver <bean id"multipartRes…

PointNet2(一)分类

发现PVN3D中使用到了pointnet2和 densfusion等网络&#xff0c;为了看懂pvn3d&#xff0c;因此得看看pointnet2&#xff0c;然而带cpp&#xff0c;cu文件的程序一时办事编译不成功&#xff0c;因此找到了一个 Pointnet_Pointnet2_pytorch-master&#xff0c;里面有pointnet和po…

孙怡带你深度学习(2)--PyTorch框架认识

文章目录 PyTorch框架认识1. Tensor张量定义与特性创建方式 2. 下载数据集下载测试展现下载内容 3. 创建DataLoader&#xff08;数据加载器&#xff09;4. 选择处理器5. 神经网络模型构建模型 6. 训练数据训练集数据测试集数据 7. 提高模型学习率 总结 PyTorch框架认识 PyTorc…

java-springboot 实现文件 图片的上传 以及渲染

在 Java Spring Boot 应用中实现文件和图片的上传以及渲染&#xff0c;通常涉及以下几个步骤&#xff1a; 配置文件上传&#xff1a;使用 Spring Boot 的 MultipartResolver 来配置文件上传。 创建上传接口&#xff1a;创建一个 REST 控制器来处理上传请求。 保存文件到服务器&…

C#基础(14)冒泡排序

前言 其实到上一节结构体我们就已经将c#的基础知识点大概讲完&#xff0c;接下来我们会讲解一些关于算法相关的东西。 我们一样来问一下gpt吧&#xff1a; Q:解释算法 A: 算法是一组有序的逻辑步骤&#xff0c;用于解决特定问题或执行特定任务。它可以是一个计算过程、一个…

linux-Shell 编程-常用 Shell 脚本技巧

Linux Shell 编程&#xff1a;常用 Shell 脚本技巧 一、概述 Shell 脚本是 Linux 系统管理员和开发人员日常自动化任务的重要工具。通过编写 Shell 脚本&#xff0c;用户可以自动化重复性工作、简化系统维护、管理服务器资源等。Shell 脚本的强大之处在于其简洁和灵活性&…

手势识别-Yolov5模型-自制数据集训练

1、源码下载&#xff1a; 大家可以直接在浏览器搜索yolov5即可找到官方链接&#xff0c;跳转进github进行下载&#xff1a; 这里对yolov5模型补充说明一下&#xff0c;它是存在较多版本的&#xff0c;具体信息可在master->tags中查看&#xff0c;大家根据需要下载。这些不同…