当前位置: 首页 > article >正文

探索 Vue 中的多语言切换:<lang-radio /> 组件详解!!!

探索 Vue 中的多语言切换:<lang-radio /> 组件详解 🌍

嗨,大家好!👋 今天我们来聊聊如何在 Vue 项目中实现一个优雅的多语言切换功能——<lang-radio /> 组件。这是一个小而美的组件,出现在登录页面的右上角,让用户轻松切换语言。让我们一起拆解它的代码,探索背后的实现逻辑吧!🚀


背景:多语言需求的起源 🌐

在一个全球化的项目中,支持多语言是必不可少的。比如,我们的登录页面需要同时支持中文、英文和日文。<lang-radio /> 组件就是为此而生,它被集成到登录页面中,提供直观的语言选择功能。接下来,我们将从代码入手,逐步揭开它的神秘面纱!😎


组件代码:<lang-radio /> 的完整实现

<lang-radio /> 是一个独立的 Vue 组件,定义在 @/components/LangRadio/index.vue 中。以下是它的完整代码:

模板部分

<template><div class="box"><div class="top-box"><div class="login-box"><el-image :src="require(`@/assets/images/lang-zh${language === 'zh' ? '-active' : ''}.jpg`)" style="width: 30px; height: 30px; cursor: pointer;" @click="handleSetLanguage('zh')" /><el-image :src="require(`@/assets/images/lang-en${language === 'en' ? '-active' : ''}.jpg`)" style="width: 30px; height: 30px; cursor: pointer;" @click="handleSetLanguage('en')" /><el-image :src="require(`@/assets/images/lang-ja${language === 'ja' ? '-active' : ''}.jpg`)" style="width: 30px; height: 30px; cursor: pointer;" @click="handleSetLanguage('ja')" /></div></div></div>
</template>

脚本部分

<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator'
import { AppModule } from '@/store/modules/app'@Component({name: 'LangRadio',components: {}
})
export default class extends Vue {private language: any = AppModule.language@Prop({ default: '' })private topType: stringprivate handleSetLanguage(lang: string) {this.$i18n.locale = langAppModule.SetLanguage(lang)window.location.reload()}
}
</script>

样式部分

<style lang="scss" scoped>
.box {width: 100vw;display: flex;flex-direction: column;justify-content: space-between;align-items: center;.top-box {width: 100%;display: flex;justify-content: space-between;align-items: center;.login-box {padding-right: 20px;display: flex;justify-content: center;align-items: center;gap: 10px;font-size: 16px;}}
}
</style>

登录页面中的使用

<lang-radio /> 被集成到登录页面(Login3.vue)中,位置在右上角。以下是相关代码片段:

模板中的引用

<template><div class="login-wrap"><div style="width: 240px; position: fixed; top: 0.5vh; right: 1vw; z-index: 9;"><lang-radio /></div><!-- 其他登录页面内容 --></div>
</template>

脚本中的注册

import LangRadio from '@/components/LangRadio/index.vue'@Component({name: 'Login3',components: {LangRadio}
})

样式(部分)

.login-wrap {width: 100%;height: 100vh;box-sizing: border-box;user-select: none;background: url(~@/assets/images/login-banner.jpeg);background-size: 100% 100%;background-repeat: no-repeat;
}

可以看到,<lang-radio /> 被固定在页面右上角(position: fixed),宽度为 240pxz-index: 9 确保它始终在最上层。🎨


工作原理:语言切换的魔法 ✨

<lang-radio /> 的核心功能是通过点击图标切换语言。让我们分解一下它的实现:

  1. 动态图标显示 🎨

    • 使用 require() 动态加载图片:
      • 当前语言为 zh 时,显示 lang-zh-active.jpg(高亮)。
      • 否则显示 lang-zh.jpg(普通状态)。
    • 英文 (en) 和日文 (ja) 同理。
  2. 点击事件处理 🖱️

    • 点击图标时,调用 handleSetLanguage(lang) 方法,传入语言代码(如 'zh')。
  3. 语言切换逻辑 🔄

    • this.$i18n.locale = lang:更新 vue-i18n 的当前语言。
    • AppModule.SetLanguage(lang):同步更新 Vuex 的语言状态。
    • window.location.reload():刷新页面以应用新语言。

流程图:语言切换的过程

以下是用 Mermaid 绘制的语言切换流程图:

用户点击语言图标
调用 handleSetLanguage(lang)
设置 $i18n.locale = lang
调用 AppModule.SetLanguage(lang)
刷新页面 window.location.reload()
界面显示新语言

这个流程简单明了,用户点击后,语言状态更新,页面刷新,完成切换!🚀


优点与不足 ⚖️

优点

  • 简单直观 ✅:用图标表示语言,用户一看就懂。
  • 易于集成 🛠️:作为一个独立组件,可以复用到任何页面。
  • 视觉反馈 🌟:高亮图标提示当前语言。

不足

  • 页面刷新 😕:window.location.reload() 会导致整个页面重载,体验不够流畅。
  • 硬编码语言 📝:目前只支持 zhenja,扩展性有限。

优化建议:让它更强大 💪

  1. 移除页面刷新 🚫

    • 通过事件通知或状态管理动态更新界面:
      private handleSetLanguage(lang: string) {this.$i18n.locale = langAppModule.SetLanguage(lang)this.$emit('language-changed', lang)
      }
      
    • 父组件监听 language-changed 事件,更新相关内容。
  2. 支持动态语言列表 🌍

    • 将语言配置抽取为数组,方便扩展:
      private languages = [{ code: 'zh', icon: 'lang-zh' },{ code: 'en', icon: 'lang-en' },{ code: 'ja', icon: 'lang-ja' }
      ]
      
  3. 添加动画效果 🎉

    • 为图标切换添加淡入淡出动画,提升交互感。

思维导图:<lang-radio /> 的全貌

以下是用 Mermaid 绘制的思维导图,梳理组件的结构和功能:

LangRadio 组件
模板
脚本
样式
三个语言图标
中文 zh
英文 en
日文 ja
动态加载图片
点击事件 handleSetLanguage
语言状态 language
方法 handleSetLanguage
更新 $i18n.locale
更新 AppModule
页面刷新
Flex 布局
固定宽度 240px
右上角定位

结语:小组件,大作用 🎈

<lang-radio /> 虽小,却在多语言支持中扮演了重要角色。它简单易用,同时也给我们留下了优化空间。希望这篇博客能帮你理解它的实现原理,并在自己的项目中灵活运用!有什么想法或问题,欢迎留言讨论哦!😊

Happy coding! 🎉

在这里插入图片描述

相关文章:

探索 Vue 中的多语言切换:<lang-radio /> 组件详解!!!

探索 Vue 中的多语言切换&#xff1a;<lang-radio /> 组件详解 &#x1f30d; 嗨&#xff0c;大家好&#xff01;&#x1f44b; 今天我们来聊聊如何在 Vue 项目中实现一个优雅的多语言切换功能——<lang-radio /> 组件。这是一个小而美的组件&#xff0c;出现在登…...

安卓的布局方式

一、RelativeLayout 相对布局 特点&#xff1a;每个组件相对其他的某一个组件进行定位。 (一)主要属性 1、设置和父组件的对齐&#xff1a; alignParentTop &#xff1a; 设置为true&#xff0c;代表和父布局顶部对齐。 其他对齐只需要改变后面的Top为 Left、Right 或者Bottom&…...

Kotlin基础知识学习(五)

Lambda表达式 Lambda表达式是一种简洁的方式来定义匿名函数。Kotlin的Lambda表达式非常灵活&#xff0c;常用于函数式编程、集合操作、高阶函数等场景。 无参数的Lambda表达式 格式&#xff1a;{函数体} 调用&#xff1a;{函数体}() val greet { println("Hello, Kotl…...

搭建私人对外git空间

# 创建用户&#xff0c;指定不可登录的 Shell&#xff08;git-shell 或 /usr/sbin/nologin&#xff09; sudo adduser --system --shell /usr/bin/git-shell --group git # 验证用户配置 grep git /etc/passwd # 预期输出&#xff1a;git:x:998:998::/home/git:/usr/bin/git-s…...

5种特效融合愚人节搞怪病毒

内容供学习使用,不得转卖,代码复制后请1小时内删除,此代码会危害计算机安全,谨慎操作 并在虚拟机里运行此代码!&#xff0c;病毒带来后果自负! #include <windows.h> #include <cmath> #include <thread> using namespace std; // 屏幕特效函数声明 void In…...

DeepSeek本地部署(linux)

一、下载并安装Ollama 1.下载Ollama Ollama官网:Ollama 点击"Download",会跳转至下载页面。 1.1在线下载安装 可复制此命令到Linux服务器进行在线下载,如下载速度过慢,可选择离线下载安装。 curl -fsSL https://ollama.com/install.sh | sh1.2离线下载安装 …...

MySQL的基础语法1(增删改查、DDL、DML、DQL和DCL)

目录 一、基本介绍 二、SQL通用语法 三、SQL分类(DDL、DML、DQL、DCL) 1.DDL 1.1数据库操作 1.2表操作 1.2.1表操作-查询创建 1.2.2表操作-数据类型 1&#xff09;数值类型 2&#xff09;字符串类型 3&#xff09;日期时间类型​编辑 4&#xff09;表操作-案例 1.2.3…...

Oracle数据库数据编程SQL<3.3 PL/SQL 游标>

游标(Cursor)是Oracle数据库中用于处理查询结果集的重要机制&#xff0c;它允许开发者逐行处理SQL语句返回的数据。 目录 一、游标基本概念 1. 游标定义 2. 游标分类 二、静态游标 &#xff08;一&#xff09;显式游标 【一】不带参数&#xff0c;普通的显示游标 1. 显式…...

畅享电脑流畅运行:深度卸载、智能监视与空间释放

软件介绍 在数字化办公与娱乐高度融合的当下&#xff0c;电脑承载着我们诸多重要任务&#xff0c;然而&#xff0c;随着软件的频繁安装与卸载&#xff0c;系统逐渐被各种顽固软件及其残留 “拖垮”&#xff0c;运行速度变慢、磁盘空间告急等问题接踵而至。别愁&#xff0c;今天…...

R --- Error in library(***) : there is no package called ‘***’ (服务器非root用户)

步骤 步骤一&#xff1a;在自己目录下创建R包安装路径步骤二&#xff1a;配置用户本地的R库路径步骤三&#xff1a;安装缺失的包&#xff08;在终端&#xff09;步骤四&#xff1a;验证安装 步骤一&#xff1a;在自己目录下创建R包安装路径 mkdir -p ~/R_libs步骤二&#xff1…...

Visual Studio Code 无法打开源文件解决方法

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Linux &#x1f525; 系列专栏&#xff1a;C从入门到精通 目录 一&#xff1a;&#x1f525; 突发状况 二&#xff1a;&#x1f525; 共勉 一&#xff1a;&#x1f525; 突发状况 &#x1f42c;…...

核函数(机器学习深度学习)

一、核函数的基本概念 核函数&#xff08;Kernel Function&#xff09; 是机器学习中处理非线性问题的核心工具&#xff0c;通过隐式映射将数据从原始空间转换到高维特征空间&#xff0c;从而在高维空间中实现线性可分或线性建模。其数学本质是计算两个样本在高维空间中的内积…...

【工具】BioPred一个用于精准医疗中生物标志物分析的 R 软件包

介绍 R 语言包 BioPred 提供了一系列用于精准医疗中的亚组分析和生物标志物分析的工具。它借助极端梯度提升&#xff08;XGBoost&#xff09;算法&#xff0c;并结合倾向得分加权和 A 学习方法&#xff0c;帮助优化个体化治疗规则&#xff0c;从而简化亚组识别过程。BioPred 还…...

【银河麒麟系统常识】命令:dotnet --list-sdks(列出已安装的 .NET SDK 版本)

命令&#xff1a; dotnet --list-sdks 功能 列出当前系统中所有已安装的 .NET SDK 版本&#xff1b; 返回值规则 # 1. 格式&#xff1a;<版本号>[<安装路径>]&#xff1b; # 2. 排序&#xff1a;按版本号从低到高排序&#xff1b;示例...

【深度学习】不管理论,入门从手写数字识别开始

1. 环境安装 学习深度学习&#xff0c;开发语言是Python。Python开发工具有很多。其中 anaconda vscode的Python开发环境很好用&#xff0c;建议使用这个组合。 编写手写数字识别测试代码&#xff0c;需要在使用Anaconda安装以下4个库&#xff1a; NumpyScipymatplotlibsci…...

3.使用epoll实现单线程并发服务器

目录 1. epoll的概述 2. 多线程与epoll的处理流程 2.1 多线程处理流程 2.2 epoll处理流程 3. epoll与多线程的比较 4. epoll的操作函数 4.1 epoll_create() 4.2 epoll_ctl() 4.3 epoll_wait() 5. 示例代码 6. epoll的工作模式 7. 使用O_NONBLOCK防止阻塞 8.运行代…...

关于JVM和OS中的栈帧的区别和内存浅析

关于JVM和OS中的栈帧的区别和内存浅析 刚看了黑马JVM中的栈帧的讲解&#xff0c;感觉和自己理解的栈帧有一定出入&#xff0c;查询资料研究了一下发现的确有天壤之别&#xff0c;可惜黑马并没有讲。 故写下这篇文章巩固一下, OS的栈帧&#xff1a; ​ OS的栈帧会在调用一个函…...

拥抱健康生活,开启养生之旅

在快节奏的现代生活中&#xff0c;健康养生愈发重要。它不仅能让我们拥有强健体魄&#xff0c;还能提升生活质量。​ 均衡饮食是养生的基石。多吃蔬菜和水果&#xff0c;它们富含维生素与膳食纤维。比如西兰花&#xff0c;堪称 “蔬菜皇冠”&#xff0c;不仅含有丰富的维生素 …...

测试用例管理工具

一、免费/开源工具 TestLink 适用场景&#xff1a;传统手工测试团队&#xff0c;需基础用例管理与测试计划跟踪。 关键功能&#xff1a;用例分层管理、执行结果记录、基础报告生成。 局限&#xff1a;界面陈旧&#xff0c;自动化集成需插件支持。 Kiwi TCMS 适用场景&#xff1…...

visual studio 2017配置QT5.9.4环境

前提是已经安装完毕vs 2017以及QT5.9.4&#xff0c;然后再进行下列的操作 一 环境配置 修改成如下所示&#xff0c;然后关闭vs 打开浏览器&#xff0c;搜索网站download.qt.io 如果2.4.1版本出现问题&#xff0c;可以换版本&#xff0c;如2.3.1&#xff0c;2.7.1都比较稳定 …...

基于EFISH-SBC-RK3576的无人机智能飞控与数据存储方案

一、方案背景 民用无人机在电力巡检、农业植保、应急救援等领域快速普及&#xff0c;但传统方案面临‌多协议设备兼容性差‌、‌野外环境数据易丢失‌、‌复杂电磁干扰‌三大痛点。 电鱼智能推出‌EFISH-SBC-RK3576‌&#xff0c;可集成双冗余总线接口与工业级加固存储&#x…...

c++的特性——多态

目录 概念 多态实现条件 虚函数 虚函数的重写/覆盖 练习题 析构函数的重写 override和final关键字 重载/隐藏/重载的区别 纯虚函数和抽象类 多态 虚函数表指针 多态的原理 动态绑定与静态绑定 虚函数表总结 前面学习了C的三个特性中的两个特性&#xff0c;今天我们…...

MySQL基础语法DDLDML

目录 #1.创建和删除数据库 ​#2.如果有lyt就删除,没有则创建一个新的lyt #3.切换到lyt数据库下 #4.创建数据表并设置列及其属性,name是关键词要用name包围 ​编辑 #5.删除数据表 #5.查看创建的student表 #6.向student表中添加数据,数据要与列名一一对应 #7.查询studen…...

性能测试理论基础-性能指标及jmeter中的指标

1、什么是性能测试 通过一定的手段,在多并发下情况下,获取被测系统的各项性能指标,验证被测系统在高并发下的处理能力、响应能力,稳定性等,能否满足预期。定位性能瓶颈,排查性能隐患,保障系统的质量,提升用户体验。 2、什么样的系统需要做性能测试 用户量大,页面访问…...

Postman CORS 测试完全指南:轻松模拟跨域请求,排查 CORS 相关问题

在使用 Postman 进行 API 测试时&#xff0c;通常不会遇到跨域问题&#xff0c;因为 Postman 是一个独立的客户端应用程序&#xff0c;不同于在浏览器中运行的 JavaScript 代码&#xff0c;它没有同源策略&#xff08;SOP&#xff09;的限制。跨域资源共享&#xff08;CORS&…...

iOS抓包-charles和Stream

简单介绍几种抓包工具 1、Charles Charles是一款流行的跨平台HTTP代理软件&#xff0c;常用于Web调试&#xff0c;它可以帮助你在开发过程中检查、修改或模拟HTTP/HTTPS请求和响应。以下是如何在iOS设备上使用Charles进行抓包的基本步骤&#xff1a; 第一步&#xff1a;安装…...

三个核心文件:src\App.vue文件,index.html文件,src\main.js文件 的关系与运行流程解析(通俗形象)

一、三个文件的角色定位 用生活比喻理解它们的关系&#xff1a; index.html → “空房子” 像一栋毛坯房&#xff0c;只有基本的墙面和预留的插座&#xff08;空白的HTML结构&#xff09;。它的作用是提供一个容器&#xff0c;告诉Vue&#xff1a;“请把装修好的房间&#xf…...

云原生系列-K8S实战

K8S实战 1. K8S 资源创建方式2. NameSpace 资源创建3. Pod4. Deployment5. Service6. Ingress7. 存储抽象1. 环境准备2. PV&PVC1&#xff09; 创建PV池2&#xff09; PVC创建与绑定 3. ConfigMap 抽取应用配置&#xff0c;并且可以自动更新1&#xff09; redis 示例2) 创建…...

从责任链模式聊到aware接口

从责任链模式聊到aware接口 责任链是什么&#xff1f; 责任链模式是一种行为型设计模式&#xff0c;将多个对象连接成一条链&#xff0c;并且沿着这条链传递请求&#xff0c;让多个对象都有机会处理这个请求&#xff0c;请求会顺着链传递&#xff0c;直到某个对象处理它为止。…...

ArcGIS地理信息系统空间分析实验教程学习

ArcGIS 作为地理信息系统领域的经典软件&#xff0c;以其强大的功能和广泛的应用场景&#xff0c;成为了众多学者、研究人员和专业人士的首选工具。它不仅可以高效地处理和可视化地理空间数据&#xff0c;还能通过复杂的空间分析模型&#xff0c;揭示地理现象背后的规律和趋势。…...