vue3 项目配置多语言支持,如何从服务端拿多语言配置

在 Vue3 项目中实现多语言支持并从服务端获取配置,可以使用 Vue I18n 库。在初始化阶段可以发送请求获取多语言配置或者通过本地文件加载json文件的方式,都可以实现。我这里是tauri项目,所以使用的是invoke从tauri端拿到配置文件,然后根据配置文件获取多语言配置。

Vue3 项目配置多语言支持(从服务端获取配置)

在 Vue3 项目中实现多语言支持并从服务端获取配置,可以使用 Vue I18n 库。以下是完整的实现方案:

1. 安装依赖

首先安装 vue-i18n:

npm install vue-i18n@next

2. 基础配置

创建 i18n 实例

// src/i18n.js
import { createI18n } from 'vue-i18n'const i18n = createI18n({legacy: false, // 使用 Composition API 模式locale: 'en', // 默认语言fallbackLocale: 'en', // 回退语言messages: {}, // 初始为空,从服务端加载silentTranslationWarn: true // 禁止警告
})export default i18n

在 main.js 中引入

import { createApp } from 'vue'
import App from './App.vue'
import i18n from './i18n'const app = createApp(App)
app.use(i18n)
app.mount('#app')

3. 从服务端获取语言配置

创建 API 服务

// src/api/i18n.js
import axios from 'axios'export async function fetchTranslations(lang) {try {const response = await axios.get(`/api/translations/${lang}`)return response.data} catch (error) {console.error('Error fetching translations:', error)return {}}
}

动态加载语言

// src/utils/i18n-loader.js
import { fetchTranslations } from '@/api/i18n'export async function loadLanguageAsync(i18n, lang) {if (i18n.global.locale.value === lang) {return Promise.resolve()}// 如果已经加载过该语言,直接设置if (i18n.global.availableLocales.includes(lang)) {i18n.global.locale.value = langreturn Promise.resolve()}// 从服务器获取翻译const messages = await fetchTranslations(lang)// 设置语言i18n.global.setLocaleMessage(lang, messages)i18n.global.locale.value = lang// 可以在这里保存语言偏好到本地存储localStorage.setItem('userLanguage', lang)return Promise.resolve()
}

4. 在应用中使用

语言切换组件示例

<template><div><select v-model="currentLocale" @change="changeLanguage"><option value="en">English</option><option value="zh">中文</option><option value="es">Español</option></select></div>
</template><script setup>
import { ref, watch } from 'vue'
import { useI18n } from 'vue-i18n'
import { loadLanguageAsync } from '@/utils/i18n-loader'const { locale } = useI18n()
const currentLocale = ref(locale.value)// 初始化时加载用户偏好语言
const initLanguage = async () => {const savedLanguage = localStorage.getItem('userLanguage') || navigator.language.slice(0, 2)await loadLanguageAsync(i18n, savedLanguage)currentLocale.value = savedLanguage
}initLanguage()const changeLanguage = async () => {await loadLanguageAsync(i18n, currentLocale.value)
}
</script>

在组件中使用翻译

<template><div><h1>{{ t('welcome') }}</h1><p>{{ t('greeting', { name: 'John' }) }}</p></div>
</template><script setup>
import { useI18n } from 'vue-i18n'const { t } = useI18n()
</script>

5. 服务端 API 设计

服务端应该提供一个端点返回指定语言的翻译,例如:

GET /api/translations/:lang

响应格式示例:

{"welcome": "Welcome","greeting": "Hello, {name}!","buttons": {"submit": "Submit","cancel": "Cancel"}
}

6. 高级优化

缓存策略

// 修改 i18n-loader.js
const translationCache = new Map()export async function loadLanguageAsync(i18n, lang) {// ... 前面的代码// 检查缓存if (translationCache.has(lang)) {i18n.global.setLocaleMessage(lang, translationCache.get(lang))i18n.global.locale.value = langreturn Promise.resolve()}// 从服务器获取const messages = await fetchTranslations(lang)translationCache.set(lang, messages)// ... 后面的代码
}

加载状态

// 添加加载状态管理
const loadingLanguages = new Set()export async function loadLanguageAsync(i18n, lang) {if (loadingLanguages.has(lang)) {return}loadingLanguages.add(lang)try {// ... 加载逻辑} finally {loadingLanguages.delete(lang)}
}

错误处理

export async function loadLanguageAsync(i18n, lang) {try {// ... 加载逻辑} catch (error) {console.error(`Failed to load language ${lang}:`, error)// 回退到默认语言if (lang !== i18n.global.fallbackLocale.value) {i18n.global.locale.value = i18n.global.fallbackLocale.value}throw error}
}

7. TypeScript 支持 (可选)

为翻译键添加类型支持:

// src/i18n.d.ts
declare module 'vue-i18n' {export interface DefineLocaleMessage {welcome: stringgreeting: stringbuttons: {submit: stringcancel: string}// 添加更多翻译键...}
}

这样在组件中使用 t() 函数时会有类型提示和检查。

通过以上步骤,你的 Vue3 应用就可以从服务端动态加载多语言配置,并支持语言切换功能了。

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

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

相关文章

使用ssh-audit扫描ssh过期加密算法配置

使用ssh-audit扫描ssh过期加密算法配置 安装检查ssh的加密算法配置修改ssh的加密算法配置 安装 # pip3安装ssh-audit pip3 instal ssh-audit检查ssh的加密算法配置 # 检查ssh的配置 ssh-audit 192.168.50.149修改ssh的加密算法配置 # 查看ssh加密配置文件是否存在 ls /etc/c…

LeetCode 高频 SQL 50 题(基础版)之 【连接】部分 · 下

前五道题&#xff1a;LeetCode 高频 SQL 50 题&#xff08;基础版&#xff09;之 【连接】部分 上 题目&#xff1a;577. 员工奖金 题解&#xff1a; select r.name,b.bonus from Employee r left join Bonus b on r.empIdb.empId where b.bonus <1000 or b.bonus is nul…

[yolov11改进系列]基于yolov11引入感受野注意力卷积RFAConv的python源码+训练源码

[RFAConv介绍] 1、RFAConv 在传统卷积操作中&#xff0c;每个感受野都使用相同的卷积核参数&#xff0c;无法区分不同位置的信息差异&#xff0c;这都限制了网络性能。此外&#xff0c;由于空间注意力以及现有空间注意力机制的局限性&#xff0c;虽然能够突出关键特征&#xf…

【软件设计】通过软件设计提高 Flash 的擦写次数

目录 0. 个人简介 && 授权须知1. Flash 和 EEROM 基本情况2. 场景要求3. 软件设计思路4. 代码展示4.1 flash.h4.2 flash.c 0. 个人简介 && 授权须知 &#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是喜欢记录零碎知识点的菜鸟…

OpenCV CUDA模块直方图计算------在 GPU 上计算输入图像的直方图(histogram)函数histEven()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数用于在 GPU 上计算输入图像的直方图&#xff08;histogram&#xff09;。它将像素值区间均匀划分为若干个 bin&#xff08;桶&#xff09;…

龙虎榜——20250530

上证指数阳包阴&#xff0c;量能较前期下跌有放大&#xff0c;但个股跌多涨少&#xff0c;下跌超过4000个。 深证指数和上涨总体相同。 2025年5月30日龙虎榜行业方向分析 1. 医药&#xff08;创新药原料药&#xff09; 代表标的&#xff1a;华纳药厂、舒泰神、睿智医药、华…

HarmonyNext使用request.agent.download实现断点下载

filedownlaod(API12) &#x1f4da;简介 filedownload 这是一款支持大文件断点下载的开源插件&#xff0c;退出应用程序进程杀掉以后或无网络情况下恢复网络后&#xff0c;可以在上次位置继续恢复下载等 版本更新—请查看更新日志!!! 修复已知bug,demo已经更新 &#x1f4d…

nginx: [emerg] bind() to 0.0.0.0:80 failed (10013: 80端口被占用

Nginx启动报错&#xff1a;nginx: [emerg] bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forbidden by its access permissions) 这个报错代表80端口被占用 先查看占用80的端口 netstat -aon | findstr :80 把它杀掉&#xff0c;强…

embbeding 视频截图

Embedding是什么&#xff1f;有什么作用&#xff1f;是怎么得到的&#xff1f;_哔哩哔哩_bilibili

服务器tty2终端如何关机

在服务器的 tty2 或其他虚拟终端上&#xff0c;要安全地进行关机操作&#xff0c;可以使用以下命令之一&#xff1a; 1.1 使用 shutdown 命令&#xff1a; shutdown 命令可以计划系统关机。默认需要超级用户权限。 sudo shutdown -h now-h 选项表示关机&#xff08;halt&…

时序数据库IoTDB启动方式及集群迁移指南

IoTDB启动方式 IoTDB在配置启动时有两种推荐方式&#xff1a; ‌主机名启动‌&#xff1a; ‌推荐理由‌&#xff1a;主机名启动方式更为灵活&#xff0c;便于在不同网络环境中部署相同的IoTDB实例。‌工作原理‌&#xff1a;IoTDB启动后会维护一张节点编号与网络地址的映射表…

如何在Qt中绘制一个带有动画的弧形进度条?

如何在Qt中绘制一个弧形的进度条 在图形用户界面开发中&#xff0c;进度指示控件&#xff08;Progress Widget&#xff09;是非常常见且实用的组件。CCArcProgressWidget 是一个继承自 QWidget 的自定义控件&#xff0c;用于绘制圆弧形进度条。当然&#xff0c;笔者看了眼公开…

在 Mac 下 VSCode 中的终端使用 option + b 或 f 的快捷键变成输入特殊字符的解决方案

前言 在终端里&#xff0c;我们可以使用 option b 和 option f 来在我们输入的命令中进行快速的前后调整光标&#xff0c;但是&#xff0c;在未设置的情况下&#xff0c;在 MacOS 中&#xff0c;会变成输入特殊字符。 普通键盘上是 alt b 和 alt f &#xff0c;只是叫法不…

Android bindservice绑定服务,并同步返回service对象的两个方法

先上一段代码&#xff1a; private IDeviceService deviceService null; private ServiceConnection connnull; private synchronized void bindyourservice() { Intent intent new Intent();intent.setPackage("servicepackagename");intent.setAction("…

Go语言之空接口与类型断言

Go 语言中&#xff0c;接口是一种强大的抽象机制。其中&#xff0c;空接口&#xff08;interface{}&#xff09;和类型断言为我们提供了处理任意类型与类型检查的能力。 一、空接口&#xff08;interface{}&#xff09; 空接口是 Go 中最特殊的接口&#xff1a;不包含任何方法…

三、OrcaSlicer预设显示

一、界面类 主框架使用的是wxWidgets库&#xff1b;3D模型的渲染区的控件&#xff0c;使用的是imgui库。 1、Plater 此类在OrcaSlicer\src\slic3r\GUI\Plater.hpp文件中定义 1.1 Plater::priv 此结构体是Plater的数据类&#xff0c;各种数据的对象和指针保存在此结构体中。如…

00 QEMU源码中文注释与架构讲解

QEMU源码中文注释与架构讲解 先占坑&#xff1a;等后续完善后再更新此文章 注释作者将狼才鲸创建日期2025-05-30更新日期NULL CSDN阅读地址&#xff1a;00 QEMU源码中文注释与架构讲解Gitee源码仓库地址&#xff1a;才鲸嵌入式/qemu 一、前言 参考网址 QEMU 源码目录简介qe…

一、Sqoop历史发展及原理

作者&#xff1a;IvanCodes 日期&#xff1a;2025年5月30日 专栏&#xff1a;Sqoop教程 在大数据时代&#xff0c;数据往往分散存储在各种不同类型的系统中。其中&#xff0c;传统的关系型数据库 (RDBMS) 如 MySQL, Oracle, PostgreSQL 等&#xff0c;仍然承载着大量的关键业务…

【Halcon】图像分割中的 regiongrowing 与dyn_threshold 动态阈值 算法详解对比

图像分割中的 regiongrowing 与动态阈值算法详解对比 在使用 HALCON 进行图像处理时&#xff0c;图像分割是最常见也最关键的操作之一。本文将深入讲解 regiongrowing 算子的原理与使用方法&#xff0c;并与另一常见方法——动态阈值 (dyn_threshold) 进行详细对比&#xff0c…

Docker部署项目无法访问,登录超时完整排查攻略

项目背景&#xff1a;迁移前后端应用&#xff0c;prod环境要求保留443端口&#xff0c;开发环境37800端口&#xff0c;后端容器端口为8000&#xff0c;前端为80&#xff0c;fastAPI对外端口为41000 生产环境部署在VM01,开发环境部署在VM03&#xff0c;在VM01配置nginx转发 [r…