详细介绍Vue中i18n的使用方法:

news2025/1/8 12:03:08

1.i18n的基础介绍

      i18n(Internationalization的缩写,18代表首尾字母之间的字母数)是"国际化"的简称。它的主要目的是让应用程序能够适应不同的语言和地区的需求。为什么需要i18n?全球化需求,应用需要服务不同国家的用户,满足多语言市场的业务拓展需求,提升产品的国际竞争力。i18n不仅仅是一个翻译工具,而是一个完整的国际化解决方案,它能够帮助我们更好地开发和维护国际化应用,提升用户体验和开发效率。在现代web开发中,i18n已经成为构建全球化应用的必要工具。

2.安装配置

# 1. 安装 vue-i18n
npm install vue-i18n@next    # Vue 3.x
# 或
npm install vue-i18n@8      # Vue 2.x

3.基础配置

// i18n/index.js

import { createI18n } from 'vue-i18n'

// 语言包配置
const messages = {
  // 中文语言包
  zh: {
    message: {
      hello: '你好',
      welcome: '欢迎来到{name}',
      // 导航
      nav: {
        home: '首页',
        about: '关于我们',
        user: '用户中心'
      },
      // 表单
      form: {
        username: '用户名',
        password: '密码',
        submit: '提交',
        reset: '重置'
      }
    }
  },
  // 英文语言包
  en: {
    message: {
      hello: 'Hello',
      welcome: 'Welcome to {name}',
      nav: {
        home: 'Home',
        about: 'About',
        user: 'User Center'
      },
      form: {
        username: 'Username',
        password: 'Password',
        submit: 'Submit',
        reset: 'Reset'
      }
    }
  }
}

// 创建 i18n 实例
const i18n = createI18n({
  locale: 'zh', // 设置默认语言
  fallbackLocale: 'en', // 设置备用语言
  messages, // 语言包
  legacy: false, // 使用组合式API
  globalInjection: true // 全局注入 $t 函数
})

export default i18n

4.在 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')

5.基础用法

<!-- 1. 模板中使用 -->
<template>
  <!-- 基本翻译 -->
  <h1>{{ $t('message.hello') }}</h1>
  
  <!-- 带参数翻译 -->
  <p>{{ $t('message.welcome', { name: 'Vue' }) }}</p>
  
  <!-- 切换语言 -->
  <select v-model="$i18n.locale">
    <option value="zh">中文</option>
    <option value="en">English</option>
  </select>
</template>

<!-- 2. 组合式API中使用 -->
<script setup>
import { useI18n } from 'vue-i18n'

const { t, locale } = useI18n()

// 使用翻译
console.log(t('message.hello'))

// 切换语言
const changeLanguage = (lang) => {
  locale.value = lang
}
</script>

6.进阶用法

// 1. 数字格式化
const i18n = createI18n({
  numberFormats: {
    zh: {
      currency: {
        style: 'currency',
        currency: 'CNY'
      }
    },
    en: {
      currency: {
        style: 'currency',
        currency: 'USD'
      }
    }
  }
})

// 使用
<template>
  <p>{{ $n(100, 'currency') }}</p>
</template>

// 2. 日期格式化
const i18n = createI18n({
  datetimeFormats: {
    zh: {
      short: {
        year: 'numeric',
        month: 'short',
        day: 'numeric'
      }
    },
    en: {
      short: {
        year: 'numeric',
        month: 'short',
        day: 'numeric'
      }
    }
  }
})

// 使用
<template>
  <p>{{ $d(new Date(), 'short') }}</p>
</template>

7.动态加载语言包

// i18n/loader.js
export const loadLanguageAsync = async (lang) => {
  // 动态导入语言文件
  const messages = await import(`./locales/${lang}.js`)
  
  // 设置语言包
  i18n.global.setLocaleMessage(lang, messages.default)
  
  // 切换语言
  i18n.global.locale.value = lang
  
  // 存储语言选择
  localStorage.setItem('language', lang)
  
  return messages.default
}

// 使用
const changeLanguage = async (lang) => {
  await loadLanguageAsync(lang)
}

8.语言包管理

// locales/zh.js
export default {
  message: {
    // 通用
    common: {
      confirm: '确认',
      cancel: '取消',
      save: '保存'
    },
    // 错误信息
    error: {
      network: '网络错误',
      timeout: '请求超时',
      notFound: '资源不存在'
    },
    // 业务模块
    user: {
      login: '登录',
      register: '注册',
      profile: '个人资料'
    }
  }
}

9.持久化语言选择

// i18n/persistence.js
export const setupI18nPersistence = (i18n) => {
  // 从本地存储获取语言设置
  const savedLanguage = localStorage.getItem('language')
  
  if (savedLanguage) {
    i18n.global.locale.value = savedLanguage
  } else {
    // 获取浏览器语言
    const browserLang = navigator.language.split('-')[0]
    i18n.global.locale.value = browserLang
    localStorage.setItem('language', browserLang)
  }
}

10.最佳实践

// 1. 创建语言切换组件
const LanguageSwitcher = {
  setup() {
    const { locale, t } = useI18n()
    
    const languages = [
      { code: 'zh', name: '中文' },
      { code: 'en', name: 'English' }
    ]
    
    const changeLanguage = async (lang) => {
      await loadLanguageAsync(lang)
      document.querySelector('html').setAttribute('lang', lang)
    }
    
    return { locale, languages, changeLanguage }
  }
}

// 2. 路由标题国际化
router.beforeEach((to, from, next) => {
  const { t } = i18n.global
  document.title = t(to.meta.title) || '默认标题'
  next()
})

// 3. 错误信息国际化
const handleError = (error) => {
  const { t } = i18n.global
  showMessage(t(`error.${error.code}`))
}

11.使用建议:

  • 合理组织语言包结构
  • 使用命名空间避免冲突
  • 实现语言选择持久化
  • 考虑动态加载优化性能
  • 注意日期和数字的本地化
  • 做好错误信息的国际化
  • 保持语言包的同步更新

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

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

相关文章

FPGA实现UART对应的电路和单片机内部配合寄存器实现的电路到底有何区别?

一、UART相关介绍 UART是我们常用的全双工异步串行总线&#xff0c;常用TTL电平标准&#xff0c;由TXD和RXD两根收发数据线组成。 那么&#xff0c;利用硬件描述语言实现UART对应的电路和51单片机内部配合寄存器实现的电路到底有何区别呢&#xff1f;接下来我们对照看一下。 …

patchwork++地面分割学习笔记

参考资料&#xff1a;古月居 - ROS机器人知识分享社区 https://zhuanlan.zhihu.com/p/644297447 patchwork算法一共包含四部分内容&#xff1a;提出了以下四个部分&#xff1a;RNR、RVPF、A-GLE 和 TGR。 1&#xff09;基于 3D LiDAR 反射模型的反射噪声消除 (RNR)&#xff…

【VScode】设置代理,通过代理连接服务器

文章目录 VScode编辑器设置代理1.图形化界面1.1 进入proxy设置界面1.2 配置代理服务器 2.配置文件&#xff08;推荐&#xff09;2.1 打开setting.json 文件2.2 配置代理 VScode编辑器设置代理 根据情况安装nmap 1.图形化界面 1.1 进入proxy设置界面 或者使用快捷键ctrl , 。…

【HarmonyOS】鸿蒙应用点9图的处理(draw9patch)

【HarmonyOS】鸿蒙应用点9图的处理&#xff08;draw9patch&#xff09; 一、前言&#xff1a; 首先在鸿蒙中是不支持安卓 .9图的图片直接使用。只有类似拉伸的处理方案&#xff0c;鸿蒙提供的Image组件有与点九图相同功能的API设置。 可以通过设置resizable属性来设置Resiza…

光伏仿真与设计系统应用架构深度剖析

在光伏产业蓬勃发展的时代背景下&#xff0c;绿虫光伏仿真与设计系统成为推动其高效发展的核心力量。其应用架构涵盖多个关键步骤&#xff0c;每个环节都紧密相扣&#xff0c;共同构建起精准且高效的设计体系。 气象分析作为开篇之笔&#xff0c;起着基石般的重要作用。系统全…

k8s dashboard离线部署步骤

确定k8s版本&#xff0c;以1.23为例。 部署metrics-server服务&#xff0c;最好用v0.5.2。 用v0.6.0&#xff0c;可能会报以下错误&#xff1a; nodekubemaster:~/Desktop/metric$ kubectl top nodes Error from server (ServiceUnavailable): the server is currently unabl…

05-Linux系统编程之进程(下)

一、子进程资源回收 1.概述 在每个进程退出的时候&#xff0c;内核释放该进程所有的资源&#xff0c;包括一些存储在栈区、全局区的数据、打开的文件、占用的内存等。但是仍有一部分信息没有释放&#xff0c;这些信息主要指进程控制块 PCB 的信息&#xff08;包括进程号、退出…

HDFS异构存储和存储策略

一、HDFS异构存储类型 1.1 冷、热、温、冻数据 通常&#xff0c;公司或者组织总是有相当多的历史数据占用昂贵的存储空间。典型的数据使用模式是新传入的数据被应用程序大量使用&#xff0c;从而该数据被标记为"热"数据。随着时间的推移&#xff0c;存储的数据每周…

【51单片机】02LED流水灯实验

点亮你的LED 一、点亮第一个LED1.GPIO介绍2.P1、P2、P3端口 二、LED实验2.尝试点亮LED3.LED流水灯 一、点亮第一个LED 1.GPIO介绍 这块内容这里可以做简单的了解&#xff0c;与数电知识强相关。后续可以再回过头来学习 GPIO (general purpose input output) 通用输入输出端口…

springboot 集成 etcd

springboot 集成 etcd 往期内容 ETCD 简介docker部署ETCD 前言 好久不见各位小伙伴们&#xff0c;上两期内容中&#xff0c;我们对于分布式kv存储中间件有了简单的认识&#xff0c;完成了docker-compose 部署etcd集群以及可视化工具 etcd Keeper&#xff0c;既然有了认识&a…

云安全相关博客阅读(一)

2024-03-04 Cloudflare announces Firewall for AI 关注问题&#xff1a; 传统的WAF功能能够保护web和api安全&#xff0c;但是随着LLM等AI模型等出现&#xff0c;保护这些AI相关应用等安全是一个新出现的问题虽然AI应用是新的场景&#xff0c;但是以往的攻击方法也能够直接用…

2025年01月07日Github流行趋势

项目名称&#xff1a;khoj 项目地址url&#xff1a;https://github.com/khoj-ai/khoj项目语言&#xff1a;Python历史star数&#xff1a;20105今日star数&#xff1a;363项目维护者&#xff1a;debanjum, sabaimran, MythicalCow, aam-at, shantanuSakpal项目简介&#xff1a;你…

从零手写线性回归模型:PyTorch 实现深度学习入门教程

系列文章目录 01-PyTorch新手必看&#xff1a;张量是什么&#xff1f;5 分钟教你快速创建张量&#xff01; 02-张量运算真简单&#xff01;PyTorch 数值计算操作完全指南 03-Numpy 还是 PyTorch&#xff1f;张量与 Numpy 的神奇转换技巧 04-揭秘数据处理神器&#xff1a;PyTor…

【python】matplotlib(radar chart)

文章目录 1、功能描述和原理介绍2、代码实现3、效果展示4、完整代码5、多个雷达图绘制在一张图上6、参考 1、功能描述和原理介绍 基于 matplotlib 实现雷达图的绘制 一、雷达图的基本概念 雷达图&#xff08;Radar Chart&#xff09;&#xff0c;也被称为蛛网图或星型图&…

数据库环境安装(day1)

网址&#xff1a;MySQL 下载&#xff08;环境准备&#xff09;&#xff1a; &#xff08;2-5点击此处&#xff0c;然后选择合适的版本&#xff09; 1.linux在线YUM仓库 下载/安装: wget https://repo.mysql.com//mysql84-community-release-el9-1.noarch.rpm rpm -i https://r…

Fabric链码部署测试

参考链接&#xff1a;运行 Fabric 应用程序 — Hyperledger Fabric Docs 主文档 (hyperledger-fabric.readthedocs.io) &#xff08;2&#xff09;fabric2.4.3部署运行自己的链码 - 知乎 (zhihu.com) Fabric2.0测试网络部署链码 - 辉哥哥~ - 博客园 (cnblogs.com) 1.启动测试…

数据结构与算法之二叉树: LeetCode 107. 二叉树的层序遍历 II (Ts版)

二叉树的层序遍历 II https://leetcode.cn/problems/binary-tree-level-order-traversal-ii/description/ 描述 给你二叉树的根节点 root &#xff0c;返回其节点值 自底向上的层序遍历 。 &#xff08;即按从叶子节点所在层到根节点所在的层&#xff0c;逐层从左向右遍历&a…

Python插件化开发实战:开发个图片浏览器

在本篇教程中&#xff0c;我将详细介绍如何使用Python开发一个基于插件架构的图片浏览器。这个项目将展示如何实现插件系统、如何处理图片显示,以及如何使用wxPython构建GUI界面。 “C:\pythoncode\pythonplugin\your_project\main_app.py” 项目概述 我们将开发一个具有以下…

根据python代码自动生成类图的实现方法[附带python源码]

概述 利用python库抽象语法树(AST)和类图描述语言(PlantUML),实现自动将python代码生成类图的目的。 环境 windowsvscodepythonplantuml ✒️网上好像大部分都是用Pyreverse库来实现的&#xff0c;但是我实际测试发现只能在一个文件中才能行&#xff0c;当然应该有解决方法…

下载b站高清视频

需要使用的edge上的一个扩展插件&#xff0c;所以选择使用edge浏览器。 1、在edge浏览器上下载 强力视频下载合并 扩展插件 2、在edge上打开b站&#xff0c;登录自己账号&#xff08;登录后才能下载到高清&#xff01;&#xff01;&#xff09;。打开一个视频&#xff0c;选择自…