隨着前端項目的業務邊界不斷擴大,“國際化”早已不是可選功能,而是面向全球用户的必備能力。 對於Vue3項目而言,vue-i18n作為官方推薦的國際化解決方案,以其輕量、靈活、易集成的特點,成 為眾多開發者的首選。今天就帶大家從0到1掌握vue-i18n,輕鬆搞定多語言適配!
一、為什麼Vue3項目要選vue-i18n?
在聊具體用法前,先明確一個問題:市面上國際化插件不少,為什麼vue-i18n能脱穎而出?核心原因 在於它與Vue生態的“原生契合度”。
作為Vue官方維護的國際化庫,vue-i18n完美適配Vue3的Composition API,支持Teleport、 Suspense等新特性,還能與Vuex/Pinia、Vue Router等生態工具無縫銜接。此外,它還提供了豐富的功能:
- 簡潔的語法:模板和JS中都能輕鬆調用多語言文案
- 動態切換:無需刷新頁面即可實時切換語言
- 佔位符與格式化:支持數字、日期等數據的多語言格式化
- 兼容性強:適配Vue2和Vue3,遷移成本低
對於Vue3項目來説,選擇vue-i18n就意味着“少踩坑、高兼容、易維護”,這也是它成為主流方案的關鍵。
二、從安裝到配置,3步完成初始化
vue-i18n的初始化流程非常清晰,無論是Vite還是Webpack構建的Vue3項目,都能快速上手。我們以 Vite+Vue3項目為例,一步步操作。
第一步:安裝依賴 Vue3項目需要安裝vue-i18n的最新版本(當前穩定版為v9+),直接通過npm或yarn安裝:
# npm
npm install vue-i18n@next --save
# yarn
yarn add vue-i18n@next --save
這裏的@next指定安裝適配Vue3的版本,避免安裝到Vue2兼容版。
第二步:創建多語言配置文件
在src目錄下新建lang文件夾,用於存放不同語言的配置文件。通常我們會創建中文(zh-CN.js)和英 文(en-US.js)兩個基礎文件,後續可根據需求擴展其他語言。
▌src/lang/zh-CN.js(中文配置)
export default {
common: {
welcome: '歡迎使用Vue3國際化方案',
switchLang: '切換語言',
confirm: '確認',
cancel: '取消'
},
user: {
login: '登錄',
register: '註冊',
username: '用户名',
password: '密碼'
}
}
▌src/lang/en-US.js(英文配置)
export default {
common: {
welcome: 'Welcome to Vue3 Internationalization Solution',
switchLang: 'Switch Language',
confirm: 'Confirm',
cancel: 'Cancel'
},
user: {
login: 'Login',
register: 'Register',
username: 'Username',
password: 'Password'
}
}
配置文件採用鍵值對形式,建議按業務模塊(如common、user)劃分,方便後續維護。
第三步:初始化i18n實例並掛載
在lang文件夾下新建index.js,用於創建i18n實例並配置基礎參數:
import { createI18n } from 'vue-i18n'
// 導入語言配置文件
import zhCN from './zh-CN'
import enUS from './en-US'
// 定義語言庫
const messages = {
'zh-CN': zhCN,
'en-US': enUS
}
// 檢測瀏覽器默認語言(可選)
const getDefaultLanguage = () => {
const navLang = navigator.language
if (messages[navLang]) {
return navLang
}
// 默認返回中文
return 'zh-CN'
}
// 創建i18n實例
const i18n = createI18n({
// 採用Composition API模式
legacy: false,
// 全局注入$t方法
globalInjection: true,
// 默認語言
locale: getDefaultLanguage(),
// 語言庫
messages
})
export default i18n
這裏有兩個關鍵參數需要注意:
- legacy: false:開啓Composition API模式,必須設置為false才能在Vue3的setup中正常使用
- globalInjection: true:全局注入$t方法,這樣在模板中無需導入即可直接使用
最後在main.js中掛載i18n實例:
import { createApp } from 'vue'
import App from './App.vue'
import i18n from './lang'
const app = createApp(App)
// 掛載i18n
app.use(i18n)
app.mount('#app')
至此,vue-i18n的初始化工作就完成了,接下來就能在項目中使用多語言功能了。
三、核心用法:模板與JS中調用多語言
vue-i18n提供了簡潔的調用方式,無論是模板還是JS/TS代碼中,都能輕鬆獲取多語言文案。
1. 模板中使用$t方法
由於開啓了globalInjection,模板中可直接通過$t('鍵名')調用對應文案,鍵名對應配置文件中的層級 結構:
<template>
<div class="international-demo">
<h1>{{ $t('common.welcome') }}</h1>
<form class="user-form">
<label>{{ $t('user.username') }}:</label>
<input type="text" placeholder="{{ $t('user.username') }}">
<label>{{ $t('user.password') }}:</label>
<input type="password" placeholder="{{ $t('user.password') }}">
<button>{{ $t('user.login') }}</button>
<button>{{ $t('user.register') }}</button>
</form>
</div>
</template>
2. JS/TS中調用(Composition API)
在setup語法糖中,需要通過useI18n鈎子獲取t方法,這也是Composition API的標準用法:
<script setup>
import { useI18n } from 'vue-i18n'
// 獲取t方法和當前語言
const { t, locale } = useI18n()
// 在邏輯中使用多語言
const handleLogin = () => {
alert(t('user.login') + ' ' + t('common.success')) // 拼接多語言文案
}
</script>
3. 帶佔位符的多語言文案
實際開發中,經常需要在文案中插入動態數據(如用户名、數量等),此時可在配置文件中使用佔位符,調用時傳入參數:
▌修改zh-CN.js:
export default {
common: {
// 佔位符用{ }表示
welcomeWithName: '歡迎您,{name}!您今天有{count}條消息'
}
}
▌調用時傳入參數:
<template>
<p>{{ $t('common.welcomeWithName', { name: '張三', count: 3 }) }}</p>
</template>
<script setup>
import { useI18n } from 'vue-i18n'
const { t } = useI18n()
// JS中調用
const message = t('common.welcomeWithName', { name: '張三', count: 3 })
</script>
四、進階功能:動態切換語言與數據格式化
除了基礎的文案調用,vue-i18n還支持動態切換語言、日期/數字格式化等實用功能,滿足複雜場景需求。
1. 動態切換語言
切換語言的核心是修改i18n實例的locale屬性,結合UI組件即可實現語言切換按鈕的功能:
<template>
<div class="lang-switch">
<button @click="switchLang('zh-CN')" :class="{ active: locale === 'zh-CN' }">中文</button>
<button @click="switchLang('en-US')" :class="{ active: locale === 'en-US' }">English</button>
</div>
</template>
<script setup>
import { useI18n } from 'vue-i18n'
const { locale } = useI18n()
// 切換語言方法
const switchLang = (lang) => {
locale.value = lang
// 可選:將語言存入localStorage,下次打開保持狀態
localStorage.setItem('defaultLang', lang)
}
// 初始化時從localStorage讀取語言(優化體驗)
onMounted(() => {
const savedLang = localStorage.getItem('defaultLang')
if (savedLang) {
locale.value = savedLang
}
})
</script>
通過localStorage存儲語言偏好,能讓用户下次打開頁面時保持上次選擇的語言,提升用户體驗。
2. 日期與數字格式化
不同語言區域的日期、數字格式存在差異(如中文用“年/月/日”,英文用“月/日/年”),vue-i18n提供了$d(日期格式化)和$n(數字格式化)方法:
<template>
<div class="format-demo">
<p>{{ $t('common.currentDate') }}:{{ $d(new Date(), 'long') }}</p>
<p>{{ $t('common.amount') }}:{{ $n(12345.67, 'currency') }}</p>
</div>
</template>
需要在i18n初始化時配置格式化規則,具體可參考vue-i18n官方文檔的“格式化”章節,根據業務需求自定義格式。
五、避坑指南:這些問題要注意
在使用vue-i18n的過程中,新手容易遇到一些細節問題,這裏整理了常見坑點及解決方案:
- 坑點1:setup中無法使用$t → 原因是未開啓globalInjection,或未通過useI18n獲取t方法,需檢查i18n配置中的globalInjection是否為true,setup中必須用useI18n。
- 坑點2:切換語言後部分文案不更新 → 確保文案都是通過$t或t方法調用,而非硬編碼;如果是在Pinia/Vuex中使用,需確保狀態更新時觸發組件重新渲染。
- 坑點3:瀏覽器默認語言識別錯誤 → 部分瀏覽器返回的navigator.language是“zh”而非“zh-CN”,可在getDefaultLanguage方法中增加判斷,如將“zh”映射為“zh-CN”。
六、總結:vue-i18n的核心優勢
作為Vue3生態的官方國際化方案,vue-i18n的核心優勢在於“輕量、適配、易擴展”:
1. 與Vue3 Composition API深度契合,開發體驗統一;
2. 配置簡單,從安裝到使用僅需3步,新手易上手;
3. 功能全面,支持動態切換、數據格式化等複雜需求;
4. 官方維護,兼容性和穩定性有保障。
如果你的Vue3項目正在做國際化適配,vue-i18n絕對是值得優先選擇的方案。按照本文的步驟操作,相信你能快速搞定多語言功能,讓項目輕鬆面向全球。