通过页面添加国际化数据,实现vue的国际化

news2024/10/28 3:37:53

element ui

  • 写在前面
  • 1. 原有的vue的国际化处理
    • 1.1 语言文件
    • 1.2 lang的index.js
    • 1.3 入口文件导入
    • 1.3 应用
  • 2. 通过页面添加国际化数据
    • 2.1 做法
    • 2.2 lang的index.js文件修改
    • 2.3 需要注意的点
  • 总结
  • 写在最后

写在前面

需求:在系统的国际化管理页面添加国际化数据,实现系统的国际化

1. 原有的vue的国际化处理

1.1 语言文件

lang目录下的en文件(相对应的英文)

import user from "./user";
import log from "./log";
import role from "./role";
export default {
    // 操作按钮
    button: {
        search: 'Search',
        reset: 'Reset',
        remove: 'Remove',
        batchRemove: 'Remove',
        detail: 'Detail',
        edit: 'Edit',
        close: 'Close',
        cancel: 'Cancel',
        submit: 'Submit',
        save: 'Save',
        confirm: 'Confirm',
        management: 'Management',
        create: 'Create',
        modify: 'Modify',
        open: 'Open',
        packUp: 'PackUp',
        check: 'Check',
        back: 'Back',
        import: 'Import',
        export: 'Export',
        send: "Send Eph",
        sendMacro: 'Send Macro',
        ok:'OK',
        erase:'Erase',
        calc: 'Calc',
        resend: 'Resend File',
        copy:'Copy',
        paste:'Paste',
        visible: 'Visible Columns',
        delete:'Delete All',
    },
    // 常用
    commonColumn: {
        startTime: 'Start Time',
        endTime: 'End Time',
        yes: 'Yes',
        no: 'No',
        selectPlaceholder: 'Please select',
        inputPlaceholder: 'Please enter',
        operation: 'Operation',
        status: 'Status',
        type: 'Type',
        name: 'Name',
        englishName: 'English Name',
        value: 'Value',
        code: 'Code',
        sort: 'Sort',
        selectDelete: 'Please select Delete',
        createdDate: 'Created Date',
        all: 'All',
        setDefault: 'Set Default',
        noData: 'None',
        colon: ':',
        logDetail: 'Log Detail',
        language: 'Language',
        systemParameterConfig:'System Parameter Config',
    },
    // 平台管理主页
    home: {
        deviceMonitor:'Device Monitoring',
        centralMonitor:'Central Monitoring',
        macro: 'Macro Configuration',
        planList:'Plan List',
        createPlan:'Create Plan',
        comeBackHome: 'Back To Home',
        personalCenter: 'Personal Center',
        clearCache: 'Clear Cache',
        changePassword: 'Change Password',
        taskManage: 'Manage Task',
        fullscreen: 'Fullscreen',
        exitFullscreen: 'Exit Fullscreen',
        deviceManage:'Equipment Resource',
        systemParameterConfig:'System Parameter Config',
    },
    // 用户管理
    user,
    // 日志管理
    log,
    // 角色管理
    role,
}

zh文件(相对应的中文)

import user from "./user";
import log from "./log";
import role from "./role";
export default {
    // 操作按钮
    button: {
        search: '查 询',
        reset: '重 置',
        remove: '删 除',
        batchRemove: '删 除',
        detail: '详 情',
        edit: '编 辑',
        close: '关 闭',
        cancel: '取 消',
        submit: '提 交',
        save: '保 存',
        confirm: '确 定',
        management: '管理',
        create: '新 建',
        modify: '修 改',
        open: '展开',
        packUp: '收起',
        check: '查看',
        back: '返 回',
        import: '导 入',
        export: '导 出',
        send: "发送EPH",
        sendMacro: '下发宏',
        ok:'确认',
        erase:'清除',
        calc: '计算',
        resend: '重新下发文件',
        copy:'复制',
        paste:'粘贴',
        visible: '显隐列',
        delete:'删除所有'
    },
    // 常用
    commonColumn: {
        startTime: '开始时间',
        endTime: '结束时间',
        yes: '是',
        no: '否',
        selectPlaceholder: '请选择',
        inputPlaceholder: '请输入',
        operation: '操作',
        status: '状态',
        type: '类型',
        name: '名称',
        englishName: '英文名',
        value: '值',
        code: '编码',
        sort: '序号',
        selectDelete: '请选择删除项',
        createdDate: '创建时间',
        all: '全部',
        setDefault: '设为默认',
        noData: '无',
        colon: ':',
        logDetail: '日志详情',
        language: '系统语言',
        systemParameterConfig:'系统参数配置',
    },
    // 平台管理主页
    home: {
        deviceMonitor:'设备监控框图',
        centralMonitor:'集中监控界面',
        macro: '设置宏配置',
        planList:'计划列表界面',
        createPlan:'新建计划界面',
        comeBackHome: '回到主页',
        personalCenter: '个人中心',
        clearCache: '清除缓存',
        changePassword: '修改密码',
        taskManage: '任务管理',
        fullscreen: '全屏',
        exitFullscreen: '退出全屏',
        deviceManage:'设备资源管理',
        systemParameterConfig:'系统参数配置',
    },
    // 用户管理
    user,
    // 日志管理
    log,
    // 角色管理
    role,
 }

1.2 lang的index.js

import Vue from 'vue'
import VueI18n from 'vue-i18n'
import elementEnLocale from 'element-ui/lib/locale/lang/en' // element-ui 英文包
import elementZhLocale from 'element-ui/lib/locale/lang/zh-CN' // element-ui 中文包
import enLocale from './en/index'
import zhLocale from './zh/index'
import Cookies from 'js-cookie'

Vue.use(VueI18n)

const messages = {
    en: {
        ...enLocale,
        ...elementEnLocale
    },
    zh: {
        ...zhLocale,
        ...elementZhLocale
    }
}

const i18n = new VueI18n({
    // 设置语言 en || zh
    locale: Cookies.get('language') || 'en',
    // 设置文本内容
    messages
})

export default i18n

1.3 入口文件导入

import Vue from 'vue'

import Cookies from 'js-cookie'

import 'normalize.css/normalize.css' // A modern alternative to CSS resets

import Element from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'

import App from './App.vue'
import router from './router'
import store from './store'

import { i18n } from './lang'; // Internationalization
import Axios from 'axios'

Vue.use(Element, { size: Cookies.get('size') || 'medium', i18n: (key, value) => i18n.t(key, value) })
Vue.config.productionTip = false

new Vue({
        router,
        store,
        i18n, // 语言国际化
        render: h => h(App)
    }).$mount('#app')

1.3 应用

注: 以$t(‘login.username’)这种方式切换中英文

<template>
  <div class="manage">
    <div class="manageList">
      <!-- 操作栏 -->
      <div class="title">
        <el-row>
          <el-col :span="16">
            <el-form inline :model="searchParams">
              <el-form-item prop="loginId">
                <el-input v-model="searchParams.loginId" :placeholder="$t('login.username')" clearable />
              </el-form-item>
              <el-form-item prop="name">
                <el-input v-model="searchParams.name" :placeholder="$t('user.username')" clearable />
              </el-form-item>
              <el-form-item>
                <el-button class="light-blue-btn" icon="el-icon-search" @click="searchClick">{{ $t('button.search') }}</el-button>
                <el-button class="reset-button" icon="el-icon-refresh" @click="resetFun">{{ $t('button.reset') }}</el-button>
              </el-form-item>
            </el-form>
          </el-col>
          <el-col :span="8" style="text-align: right;">
            <el-button
              class="green-btn"
              icon="el-icon-plus"
              @click="addUser"
              v-if="saveEnable"
            >
              {{ $t('button.create') }}
            </el-button>
          </el-col>
        </el-row>
      </div>
      <!-- 表格 -->
      <div class="tableList">
        <el-table
          :data="userListData"
          @selection-change="handleSelectionChange"
          height="100%"
          width="100%"
          @row-click="detail"
          class="elTableStyle"
        >
          <el-table-column prop="loginId" :label="$t('login.username')" align="center" :show-overflow-tooltip="true" />
          <el-table-column prop="name" :label="$t('user.username')" align="center" :show-overflow-tooltip="true" />
          <el-table-column
            :label="$t('commonColumn.operation')"
            width="500"
            align="center"
            v-if="saveEnable || resetEnable"
          >
            <template slot-scope="scope">
              <el-button
                type="text"
                icon="el-icon-edit"
                :disabled="user.id === scope.row.id"
                @click.stop="edit(scope.row)"
                v-if="saveEnable"
              >
                {{ $t('button.edit') }}
              </el-button>
              <el-button
                type="text"
                icon="el-icon-edit"
                :disabled="user.id === scope.row.id"
                @click.stop="resetPw(scope.row)"
                v-if="resetEnable"
              >
                {{ $t('user.resetPassword') }}
              </el-button>
              <el-button
                type="text"
                icon="el-icon-edit"
                :disabled="user.id === scope.row.id"
                @click.stop="changePw(scope.row)"
                v-if="USER_LOGINID === $store.getters.user.loginId"
              >
                {{ $t('home.changePassword') }}
              </el-button>
                <el-button
                    type="text"
                    icon="el-icon-delete"
                    :disabled="USER_LOGINID === scope.row.loginId || user.id === scope.row.id"
                    @click.stop="remove([scope.row])"
                    v-if="deleteEnable"
                >
                    {{ $t('button.remove') }}
                </el-button>
            </template>
          </el-table-column>
        </el-table>
      </div>
      <pagination :total="table.total" :page.sync="table.page" :limit.sync="table.size" @pagination="searchFun" />
    </div>
  </div>
</template>

2. 通过页面添加国际化数据

现在的需求:不在是将国际化数据在文件里面,而是在系统上的页面添加数据即可。

CREATE TABLE `internationalize`  (
  `id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `code_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `zh_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `en_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `version_` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = DYNAMIC;

SET FOREIGN_KEY_CHECKS = 1;

直接在这个页面添加数据,即可实现国际化,而不需要去更改内部文件
在这里插入图片描述

2.1 做法

既然lang的index.js中从文件读取数据去实现国际化,我为了最大程度不影响其他代码,我想着更改这个文件的读取方式**(数据是从后台读取,然后将后端数据转换为 VueI18n 所需的格式,在数据加载完成后,重新设置 i18n 实例)**,这样不就改一下这个文件就能摒弃掉哪些配置文件,并且不需要变动其他代码。

2.2 lang的index.js文件修改

/* eslint-disable indent */
/* eslint-disable eol-last */
import Vue from 'vue'
import VueI18n from 'vue-i18n'
import elementEnLocale from 'element-ui/lib/locale/lang/en' // element-ui 英文包
import elementZhLocale from 'element-ui/lib/locale/lang/zh-CN' // element-ui 中文包
import { internationalize } from '@/api/system'
import Cookies from 'js-cookie'

Vue.use(VueI18n)

let messages = {
    en: {
        ...elementEnLocale
    },
    zh: {
        ...elementZhLocale
    }
}

// 初始化国际化信息
async function loadLocaleData() {
    try {
        // 后端国际化数据接口,记得放行   
        const response = await internationalize.findAll();
        const localeData = response.data;

        if (response.status === 1) { // 检查状态是否成功
            localeData.forEach(item => {
                // 将后端数据转换为 VueI18n 所需的格式
                messages.en[item.code] = item.en; // 为英文消息设置
                messages.zh[item.code] = item.zh; // 为中文消息设置
            });

            // 在数据加载完成后,重新设置 i18n 实例
            i18n.setLocaleMessage('en', messages.en);
            i18n.setLocaleMessage('zh', messages.zh);
        } else {
            console.error('Failed to load locale data: ');
        }
    } catch (error) {
        console.error('Failed to load locale data:');
    }
}

const i18n = new VueI18n({
    // 设置语言 en || zh
    locale: Cookies.get('language') || 'en',
    // 设置文本内容
    messages
})

// 调用方法加载国际化数据
loadLocaleData();

// export default i18n;
export { i18n, loadLocaleData };

入口文件不需要变化

2.3 需要注意的点

   // 在修改和添加数据时,需要重新加载国际化数据,实时获取最新数据
   import {loadLocaleData} from '@/lang'
   
   // vue中添加和修改
   internationalize.saveUpdate(form).then((res) => {
                            _this.$message({
                                type: 'success',
                                message: res.message
                            })
                            _this.visible = false;
                            _this.getList();

                            // 重新加载国际化数据
                            loadLocaleData(); // 你需要导入 loadLocaleData 函数并调用它
                            }

总结

写这篇博客主要的目的是让自己更深刻,有回忆点,然后就是分享自己的做法;有需要的根据自己的需求进行修改

写在最后

如果此文对您有所帮助,请帅戈靓女们务必不要吝啬你们的Zan,感谢!!不懂的可以在评论区评论,有空会及时回复。

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

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

相关文章

机器视觉-相机、镜头、光源(总结)

目录 1、机器视觉光源概述 2、光源的作用 3、光谱 4、工业场景常见光源 4.1、白炽灯 4.2、卤素灯 4.3、 荧光灯 4.4、LED灯 4.5、激光灯 5、光源的基本性能 5.1、光通量 5.2、光效率 5.3、发光强度 5.4、光照度 5.5、均匀性 5.6、色温 5.7、显色性 6、基本光学…

嵌入式软开项目——电子手环开发——学习引导和资料网址

文末附所有资料下载链接 1、需要将该文件夹放置到英文路径下&#xff0c;否则无法运行 2、目录下总共四个文件夹 2.1 第一个文件夹“0、OV-Watch-main(原版)”&#xff0c;为开源代码的原版资料 2.2第二个文件夹” OV-Watch-main”&#xff0c;为本人对开源代码的学习&…

Java-I/O框架02:使用文件字节流复制文件

package com.yundait.Demo03;import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream;/*** 使用文件字节流实现文件的复制* author zhang*/ public class FileInputStreamDemo03 {public static void main(String[] args) th…

多线程——线程的状态

线程状态的意义 ‌线程状态的意义在于描述线程在执行过程中的不同阶段和条件&#xff0c;帮助开发者更好地管理和调度线程资源。 线程的多种状态 线程的状态是一个枚举类型&#xff08;Thread.State&#xff09;&#xff0c;可以通过线程名.getState&#xff08;&#xff09…

基于Springboot+Vue 高考志愿咨询管理系统(源码+LW+部署讲解+数据库+ppt)

&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 会持续一直更新下去 有问必答 一键收藏关注不迷路 源码获取&#xff1a;https://pan.baidu.com/s/1aRpOv3f2sdtVYOogQjb8jg?pwdjf1d 提取码: jf1d &#…

react 总结+复习+应用加深

文章目录 一、React生命周期1. 挂载阶段&#xff08;Mounting&#xff09;补充2. 更新阶段&#xff08;Updating&#xff09;补充 static getDerivedStateFromProps 更新阶段应用补充 getSnapshotBeforeUpdate3. 卸载阶段&#xff08;Unmounting&#xff09; 二、React组件间的…

智能合约分享

智能合约练习 一、solidity初学者经典示例代码&#xff1a; 1.存储和检索数据&#xff1a; // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // 声明 Solidity 编译器版本// 定义一个名为 SimpleStorage 的合约 contract SimpleStorage {// 声明一个公共状态变量 d…

计算机网络:数据链路层 —— 虚拟局域网 VLAN

文章目录 局域网虚拟局域网 VLAN虚拟局域网 VLAN 概述实现机制IEEE 802.1Q帧以太网交换机的接口类型Access 接口Trunk 接口Hybrid 接口不进行人为的VLAN划分划分两个不同VLANTrunk接口去标签后进行转发Trunk接口直接转发 局域网 局域网&#xff08;Local Area Network&#xf…

工地安全新突破:AI视频监控提升巡检与防护水平

在建筑工地和其他劳动密集型行业&#xff0c;工人的安全一直是管理工作的重中之重。为了确保工地的安全管理更加高效和智能化&#xff0c;AI视频监控卫士。通过人工智能技术&#xff0c;系统不仅能实时监控&#xff0c;还能自动识别工地现场的安全隐患&#xff0c;为工地管理者…

HeterGCL 论文写作分析

HeterGCL 论文写作分析 这篇文章&#xff0c;由于理论证明较少&#xff0c;因此写作风格了polygcl是两种风格的。polygcl偏向理论的写作风格&#xff0c;而hetergcl就是实践派的风格 首先看标题&#xff0c;其的重点是Graph contrastive learning Framework。其重点是framewo…

标准日志插件项目【C/C++】

博客主页&#xff1a;花果山~程序猿-CSDN博客 文章分栏&#xff1a;项目日记_花果山~程序猿的博客-CSDN博客 关注我一起学习&#xff0c;一起进步&#xff0c;一起探索编程的无限可能吧&#xff01;让我们一起努力&#xff0c;一起成长&#xff01; 目录 一&#xff0c;项目介…

HTML+CSS实现超酷超炫的3D立方体相册

效果演示 HTML和CSS实现一个简单的3D立方体加载动画的相册。它使用了HTML来构建立方体的结构&#xff0c;并通过CSS来添加样式和动画效果。 HTML <div class"loader3d"><div class"cube"><div class"face"><img src&qu…

LabVIEW偏振调制激光高精度测距系统

在航空航天、汽车制造、桥梁建筑等先进制造领域&#xff0c;许多大型零件的装配精度要求越来越高&#xff0c;传统的测距方法在面对大尺寸、高精度测量时&#xff0c;难以满足工业应用的要求。绝对测距技术在大尺度测量上往往会因受环境影响大、测距精度低而无法满足需求。基于…

社交媒体视频素材平台推荐

在内容创作日益重要的今天&#xff0c;社交媒体视频素材的需求不断增加。适合各种平台的视频素材不仅可以提升内容质量&#xff0c;还能吸引更多观众。以下是一些推荐的社交媒体视频素材平台&#xff0c;帮助你找到适合的资源。 蛙学网 蛙学网 是一个专注于社交媒体视频素材的平…

Sora高端制造业WordPress外贸主题

Sora是一款专为高端制造业设计的WordPress主题&#xff0c;由国内知名wordpress开发团队简站wordpress主题开发&#xff0c;它以红色为主色调&#xff0c;适合外贸企业出海建独立站的模板。这个主题适用于WordPress 6.0及以上版本&#xff0c;并且只服务于真正有需要的用户。主…

C++ | Leetcode C++题解之第504题七进制数

题目&#xff1a; 题解&#xff1a; class Solution { public:string convertToBase7(int num) {if (num 0) {return "0";}bool negative num < 0;num abs(num);string digits;while (num > 0) {digits.push_back(num % 7 0);num / 7;}if (negative) {dig…

论文阅读(二十六):Dual Attention Network for Scene Segmentation

文章目录 1.Introduction3.DANet3.1Position Attention Module3.2Channel Attention Module 论文&#xff1a;Dual Attention Network for Scene Segmentation   论文链接&#xff1a;Dual Attention Network for Scene Segmentation   代码链接&#xff1a;Github 1.Intr…

Vue3 学习笔记(五)Vue3 模板语法详解

在 Vue3 的世界里&#xff0c;模板语法是我们构建用户界面的基石。今天&#xff0c;让我们一起深入了解 Vue3 的模板语法&#xff0c;我将用通俗易懂的语言和实用的例子&#xff0c;带你掌握这项必备技能。 1、文本插值&#xff1a;最基础的开始 想在页面上显示数据&#xff1f…

深度学习模型入门教程:从基础到应用

深度学习模型入门教程&#xff1a;从基础到应用 前言 在人工智能的浪潮中&#xff0c;深度学习作为一种强大的技术&#xff0c;正在各行各业中发挥着越来越重要的作用。从图像识别到自然语言处理&#xff0c;深度学习正在改变我们的生活和工作方式。本文将带您深入了解深度学…

OpenCV视觉分析之运动分析(3)背景减除类:BackgroundSubtractorKNN的一系列get函数的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 BackgroundSubtractorKNN类有一系列的get函数&#xff0c;下面我们一一列举他们的名字和用法。 一系列函数 函数getDetectShadows() getDetec…