前端偶尔需要—Vue3+Vuetify国际化

一、技术背景

在前端开发中,国际化(i18n)已成为多语言应用的标配。Vue3配合Vuetify框架时,需要兼顾响应式数据绑定与Material Design组件库的特性。本方案基于vue-i18n v9+版本,实现与Vuetify3的深度整合。

二、核心实现方案

2.1 环境搭建

js 复制代码
# 安装依赖
npm install vue-i18n@next vuetify@next 

2.2 基础配置

js 复制代码
// plugins/i18n.js 
import { createI18n } from 'vue-i18n' 
import en from '@/locales/en' 
import zh from '@/locales/zh'  
const i18n = createI18n({   
legacy: false,  
locale: import.meta.env.VITE_APP_LOCALE || 'en',   
fallbackLocale: 'en',   
messages: {     en,     zh   },   
localeMatcher: 'lookup',   missing: (locale, key) => {     
    console.warn(`Missing translation: ${locale}.${key}`)     
    return key   
    } 
})  
export default i18n 

三、Vuetify组件集成

3.1 动态表单元素

js 复制代码
<template>   
  <v-form>    
   <v-text-field       
      v-model="formData.name"       
      :label="$t('common.name')"       
      required/>   
  </v-form> 
</template>  
<script setup> 
import { useI18n } from 'vue-i18n' 
const { t } = useI18n() 
</script> 

3.2 日期格式化

js 复制代码
import { defineComponent } from 'vue' 
import { useI18n } from 'vue-i18n'  
export default defineComponent({   
 setup() {    
  const { locale } = useI18n()         
  const formatter = new Intl.DateTimeFormat(locale.value, {       
      year: 'numeric',       
      month: 'long',        
      day: 'numeric'    
   })          
  return { formatter }  
 } 
}) 

四、高级功能实现

4.1 动态语言切换

js 复制代码
<template>  
  <v-menu>     
  <template v-slot:activator>      
    <v-btn>{{ t('language.current') }}: {{ currentLocale }}</v-btn>     
  </template>    
  <v-list>     
    <v-list-item          
     v-for="lang in availableLocales"         
     :key="lang.value"         
     @click="switchLanguage(lang.value)">
       {{ lang.text }} 
    </v-list-item>     
  </v-list>   
  </v-menu> 
  </template>  
  <script setup> 
  const { locale } = useI18n() 
  const currentLocale = computed(() => locale.value.toUpperCase()) 
  const availableLocales = [{ value: 'en', text: 'English' }, { value: 'zh', text: '中文' } ]  
  const switchLanguage = (lang) => {  
  locale.value = lang   
  localStorage.setItem('i18n-locale', lang) 
  } 
  </script> 

4.2 按需加载语言包

js 复制代码
// plugins/i18n.js 
const loadLocaleMessages = async (locale) => {   
try {    
const messages = await import(`@/locales/${locale}.json`)     
return messages.default   
} catch (err) {    
console.error(`Failed to load locale: ${locale}`)     
return {}  
} }  
 const i18n = createI18n({   
  // ...其他配置   
  messages: {    
   async [locale]() {      
   return await loadLocaleMessages(locale)     
   }   
  }
}) 
相关推荐
hpoenixf4 分钟前
一天上线 + 零返工:我如何给复杂前端需求建立“安全感”
前端
广州华水科技43 分钟前
单北斗GNSS变形监测系统在水利工程安全保障中的应用与优势分析
前端
yqcoder1 小时前
CSS 外边距重叠(Margin Collapsing):现象、原理与完美解决方案
前端·css
山楂树の2 小时前
图像标注大坑:img图片 + Canvas 叠加标注,同步放大后标注位置偏移、对不齐?详解修复方案及亚像素处理原理
前端·css·学习·canva可画
本山德彪2 小时前
我做了一个拼豆图纸生成器,把照片秒变图纸
前端
DTrader2 小时前
用TS无法实盘量化? - 实盘均线策略
前端·api
进击的夸父2 小时前
vfojs:Vue 超集架构,外壳React灵魂Vue
前端
编程老船长2 小时前
解决不同项目需要不同 Node.js 版本的问题
前端·vue.js
Wect2 小时前
LeetCode 5. 最长回文子串:DP + 中心扩展
前端·算法·typescript
漫游的渔夫2 小时前
前端开发者做 Agent:别写成一次请求,用 5 步受控循环防止 AI 乱跑
前端·人工智能·typescript