前端Vue实现国际化

news2025/2/24 6:57:45

国际化实现原理

假设我们有一个变量 msg,但是这个 msg 有两个值,一个是 hello,一个是 你好,现在需要我们根据需要切换 msg 的值,如何做呢?

// 定义 msg 值的数据源
const msgList = {
  en: {
    msg: 'hello'
  },
  zh: {
    msg: '你好'
  }
}
// 定义切换变量
let locale = 'en'
// 定义赋值函数
function t(key) {
  return msgList[locale][key]
}
// 为 msg 赋值
let msg = t('msg')
console.log(msg) // hello

总结

  • 通过一个变量来控制语言环境
  • 所有语言环境下的数据源要预先定义好
  • 通过一个方法来获取当前语言下指定属性的值
  • 该值为国际化下展示值

基于 vue-i18n V9(Vue3 适用) 的国际化实现方案

安装 vue-i8n

npm install vue-i18n@next

src目录下创建 i18n/index.js 文件

创建数据源、创建 locale 语言变量、初始化 i18n 实例

// index.js
import { createI18n } from 'vue-i18n'

const messages = {
  en: {
    msg: {
      test: 'hello'
    }
  },
  zh: {
    msg: {
      test: '你好'
    }
  }
}

const locale = 'en'
const i18n = createI18n({
  legacy: false, // 使用了Vue3 composition API的话这项一定要为false
  globalInjection: true, // 全局使用 t 函数
  locale,
  messages
})

export default i18n

注册 i18n 实例

// main.js
import i18n from '@/i18n'
app.use(i18n).mount('#app')

测试

<template>
  <div class="">
    {{ $t('msg.test') }} <!-- 页面上会显示 hello -->
  </div>
</template>

<script setup>
import {} from 'vue'
</script>

<style lang="scss" scoped></style>

项目中完成国际化

封装 langSelect 组件用于修改 locale

  1. 定义 store/app.js
export default {
  namespaced: true,
  state: {
    language: window.localStorage.getItem('language') || 'zh'
  },
  mutations: {
    /**
     * 设置国际化
     */
    setLanguage(state, lang) {
      window.localStorage.setItem('language', lang)
      state.language = lang
    }
  },
  actions: {}
}
  1. 创建 LangSelect 组件
<template>
  <el-dropdown
    trigger="click"
    class="international"
    @command="handleSetLanguage"
  >
    <div>
      <el-tooltip content="国际化">
        <svg-icon icon="language"></svg-icon>
      </el-tooltip>
    </div>
    <template #dropdown>
      <el-dropdown-menu>
        <el-dropdown-item :disabled="language === 'zh'" command="zh">
          中文
        </el-dropdown-item>
        <el-dropdown-item :disabled="language === 'en'" command="en">
          English
        </el-dropdown-item>
      </el-dropdown-menu>
    </template>
  </el-dropdown>
</template>

<script setup>
import { computed } from 'vue'
import { useStore } from 'vuex'
import { useI18n } from 'vue-i18n'

const store = useStore()
const language = computed(() => store.getters.language)

// 切换语言
const i18n = useI18n()
const handleSetLanguage = lang => {
  i18n.locale.value = lang // 切换 i18n 的 locale
  store.commit('app/setLanguage', lang) // 修改 vuex 中的 language
}
</script>

<style scoped></style>

在这里插入图片描述

导入 el-locale 语言包

在ElementUi中可以配合vue-i18n进行国际化,详细可看文档
但是在ElementPlus中不行(切换完语言需要刷新页面才能生效),只能临时进行处理:

import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import zhCn from 'element-plus/es/locale/lang/zh-cn'
import en from 'element-plus/lib/locale/lang/en'
import store from '@/store'

export default (app) => {
  app.use(ElementPlus, {
    locale: store.getters.language === 'en' ? en : zhCn
  })
}

注意:使用的elementPlus版本为1.1.0-beta.15,版本不同不同文件位置可能不一样,引入的时候需要注意

创建自定义语言包

在 i18n 下新建 lang 文件夹,下面有 en.js 和 zh.js 两个语言包,在 i18n 下的 index.js 中引入

import { createI18n } from 'vue-i18n'
import zhLocale from './lang/zh'
import enLocale from './lang/en'

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

const locale = 'zh'
const i18n = createI18n({
  legacy: false, // 使用了Vue3 composition API的话这项一定要为false
  globalInjection: true, // 全局使用 t 函数
  locale,
  messages
})

export default i18n

en.js 和 zh.js 需要自己编写,分别是英文与中文环境下字段的数据:

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

处理项目国际化内容

将页面中写死的数据改为用 $t 函数,比如登录页的标题:

<h1 class="title">用户登录</div>
<h1 class="title">{{ $t('msg.login.title') }}</div>

vue 组件中:

const loginRules = ref({
  username: [
    {
      required: true,
      trigger: 'blur',
      message: '用户名为必填项'
    }
  ]
})
import { useI18n } from 'vue-i18n'

const i18n = useI18n()
const loginRules = ref({
  username: [
    {
      required: true,
      trigger: 'blur',
      message: i18n.t('msg.login.usernameRule')
    }
  ]
})

js 中:

import i18n from '@/i18n'
export const validatePassword = (rule, value, callback) => {
  if (value.length < 6) {
    callback(new Error(i18n.global.t('msg.login.passwordRule')))
  } else {
    callback()
  }
}

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

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

相关文章

智能批量复制文件,轻松实现文件批量复制并实现编号

您有没有遇到过需要将相同类型的多个文件复制到不同文件夹的情况&#xff1f;这个过程可能会非常耗时&#xff0c;尤其当文件的数量很大且需要进行重复编号时&#xff0c;更是一项非常烦琐的工作。细有一个快手的方法可以实现&#xff0c;如下&#xff1a; 首先&#xff0c;第…

基于spring boot框架访问zookeeper

本地部署zookeeper&#xff1a; 进入zookeeper-3.3.6/conf目录下&#xff0c;将zoo_sample.cfg文件改名为zoo.cfg&#xff0c;再用文本编辑器打开这个文件&#xff0c;修改如下红框位置的内容&#xff0c;改成本地一个可以访问的已有目录&#xff1a; 打开命令行窗口&#xff…

高考开始了,计算机专业未来还会火吗?

2023年高考&#xff0c;今天开始第一场考试。而走出考场&#xff0c;考生们也将面临选报专业的难题。高考人数逐年攀升&#xff0c;录取率却不断下降。 过去10年&#xff0c;计算机专业可谓红透半边天&#xff0c;早早进入这个行业的&#xff0c;基本都吃到了很高的红利。然而…

动态规划母题:01背包问题

1. 前置知识 动态规划与图论&#xff0c;前缀和与差分等有模板的算法不同&#xff0c;动态规划更考察思维能力&#xff0c;而不是运用模板的能力。 个人认为 Acwing 关于动态规划的讲解比较容易理解。我会根据 Acwing 的动态规划解题思路来讲解题目。 虽说动态规划没有固定的模…

基于Locust实现MQTT协议服务的压测脚本

一、背景简介 业务背景大概介绍一下&#xff0c;就是按照国标规定&#xff0c;车辆需要上传一些指定的数据到ZF的指定平台&#xff0c;同时车辆也会把数据传到企业云端服务上&#xff0c;于是乎就产生了一些性能需求。 目前我们只是先简单的进行了一个性能场景的测试&#xf…

PMP考试到底难在哪里?

那么&#xff0c;PMP考试到底难在哪&#xff1f; 01涉及面广 目前PMP考试内容大部分来源于教材《PMBOK指南》和《敏捷实践指南》。 作为考试出题的知识基础《PMBOK指南》&#xff0c;总共有700多页&#xff0c;所覆盖的知识面很广。 另一方面&#xff0c;根据最新版考纲&am…

使用大型语言模(LLM)构建系统(二):内容审核、预防Prompt注入

今天我学习了DeepLearning.AI的 Building Systems with LLM 的在线课程&#xff0c;我想和大家一起分享一下该门课程的一些主要内容。 下面是我们访问大型语言模(LLM)的主要代码&#xff1a; import openai#您的openai的api key openai.api_key YOUR-OPENAI-API-KEY def get_…

媒体邀约分步详解

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网 胡老师。 邀请媒体参加活动的有哪些步骤&#xff1a; 活动落地执行&#xff1a;在整个活动方案中&#xff0c;邀请媒体来报道活动&#xff0c;往往会安排在整个活动的中期去做&#xff0c;因此在…

spring-boot集成spring-brick实现动态插件

spring-boot集成spring-brick实现动态插件 spring-boot集成spring-brick实现动态插件 项目结构 & 需求实现spring-boot集成spring-brick 环境说明1. 主程序集成spring-brick 第一步&#xff1a;引入相关依赖第二步&#xff1a;修改程序入口方法第三步&#xff1a;编写配置…

软件测试太卷了,我实在是做不到啊~

前言 本科计算机专业&#xff0c;做了四年软件测试工作&#xff0c;从一开始一脸懵的点点点&#xff0c;到现在会自动化测试了&#xff0c;浅谈一下计算机专业人员从事软件测试的一点点心得体会&#xff0c;仅供参考交流。 如果你本科学的是计算机专业&#xff0c;觉得开发那…

1092 To Buy or Not to Buy (PAT甲级)

1092. To Buy or Not to Buy (20)-PAT甲级真题_柳婼的博客-CSDN博客 柳婼的解法要更清晰一些。 下面是我的解法…… #include <iostream> #include <string>int main(){std::string a, b;bool flag true;int extra, missing;int cntA[62] {0};int cntB[62] {…

银行项目:如何大规模、高效率的做自动化测试

背景 近几年&#xff0c;各家商业银行均在大力发展自动化测试。在这一进程中&#xff0c;自动化测试的设计理念不断完善&#xff0c;新的技术不断应用&#xff0c;使得自动化测试资产的积累代价和维护代价不断降低&#xff0c;自动化测试资产的数量不断增长。 在短短几年间&…

【STM32CubeMX项目】DHT11模块

前言 在我的另一篇里文章里已经介绍过DHT11的时序理论了&#xff0c;这里介绍下&#xff0c;我写DHT11的数据获取的思路和调用。程序验证后&#xff0c;发现下述问题&#xff0c;暂时解决不了&#xff0c;但是还是会把个人的代码流程&#xff0c;函数的编写思路和工程写下&…

通过Python封装接口商品ID获取京东商品历史价格数据,京东历史价格数据,京东API接口

京东商品历史价格数据展示了该商品在一段时间内的价格变化情况&#xff0c;可作为购物决策的重要参考因素。用户可以根据历史价格数据来判断当前商品的价格是否处于一个合理水平&#xff0c;并对接下来的价格趋势进行预测。 京东商品历史价格数据可以在商品详情页面中查看&…

【华为自研】| 国产数据库 GaussDB崛起

目录 GaussDBGaussDB 简介产品优势GaussDB(for openGauss)GaussDB(for MySQL)GaussDB(for Cassandra)GaussDB(for Mongo)GaussDB(for Redis)GaussDB(for Influx) GaussDB GaussDB采用一体化架构&#xff0c;同时支持关系型和非关系型数据库引擎&#xff0c;能够满足政企全方位…

2023面试题合集(建议收藏)

写在前面 个人强烈感觉面试因人而异&#xff0c;对于简历上有具体项目经历的同学&#xff0c;个人感觉面试官会着重让你介绍自己的项目&#xff0c;包括但不限于介绍一次真实攻防/渗透/挖洞/CTF/代码审计的经历 > 因此对于自己的项目&#xff0c;面试前建议做一次复盘&…

125760-30-7,Fmoc-Ser(Ac4Galβ1-3Ac2GalNAcα)-OH,由不同糖的混合物组成,包括单糖和双糖

●常用名&#xff1a;O-[4,6-二-O-乙酰基-2-(乙酰氨基)-2-脱氧-3-O-(2,3,4,6-四-O-乙酰基-BETA-D-吡喃半乳糖基)-ALPHA-D-吡喃半乳糖基]-N-[芴甲氧羰基]-L-丝氨酸 ●英文名&#xff1a;Fmoc-Ser(Ac4Galβ1-3Ac2GalNAcα)-OH●外观以及性质&#xff1a; 陕西新研博美生物科技有限…

基于simulink仿真机械手将负载从一个灰色圆柱形平台移动到另一个平台

一、前言 此示例说明了在 Simulink 3D 动画™模型中使用全局坐标。全局坐标可以在模型中以多种方式用于对象跟踪和操作、简单的碰撞检测、触觉效果模拟等。 二、示例 虚拟世界中对象的全局坐标可通过VR源块获得。对于场景中的每个变换&#xff0c;VR 源块的“参数”对话框中的树…

第一次做SDK测试,做个笔记

一、认识SDK 1、含义 SDK是为客户端提供的特定的软件包、软件框架、硬件平台、操作系统等建立应用软件时的开发工具的集合。如拨打电话&#xff0c;摄像机&#xff0c;视频播放/录制&#xff0c;图片保存&#xff0c;预览图片&#xff0c;刷新窗口&#xff0c;显示成功状态页面…

CnOpenData短视频播主排名数据

一、数据简介 短视频即短片视频&#xff0c;是一种互联网内容传播方式&#xff0c;一般是指在互联网新媒体上传播的时长在5分钟以内的视频。随着网红经济的出现&#xff0c;视频行业逐渐崛起一批优质UGC内容制作者&#xff0c;微博、秒拍、快手、今日头条纷纷入局短视频行业&am…