Vue 3中的国际化(i18n)是一个重要的功能,它允许开发者为不同语言和地区的用户提供本地化的用户体验。vue-i18n
是 Vue 官方推荐的国际化解决方案,支持 Vue 3 的 Composition API 和 Options API。本文将详细介绍如何在 Vue 3 中使用 vue-i18n
实现国际化,并分享一些最佳实践。
vue-i18n
是一个轻量级的国际化插件,适用于 Vue.js 应用程序。它提供了以下核心功能:
Vue 3 版本的 vue-i18n
已经完全重构以支持 Composition API 和新的生命周期钩子,因此在使用时需要特别注意与 Vue 2 版本的区别。
首先,通过 npm 或 yarn 安装 vue-i18n
:
npm install vue-i18n@next
# 或者
yarn add vue-i18n@next
在项目中创建一个 i18n.js
文件,用于初始化 vue-i18n
插件。以下是基本配置示例:
// src/i18n.js
import { createI18n } from 'vue-i18n';
const messages = {
en: {
message: {
hello: 'Hello',
welcome: 'Welcome to Vue i18n'
}
},
zh: {
message: {
hello: '你好',
welcome: '欢迎使用 Vue i18n'
}
}
};
const i18n = createI18n({
legacy: false, // Vue 3 必须设置为 false
locale: 'en', // 默认语言
fallbackLocale: 'en', // 回退语言
messages // 多语言资源对象
});
export default i18n;
在项目的入口文件(如 main.js
)中引入并挂载 i18n
:
import { createApp } from 'vue';
import App from './App.vue';
import i18n from './i18n';
const app = createApp(App);
app.use(i18n);
app.mount('#app');
$t
方法翻译文本在模板中,可以使用 $t
方法来翻译字符串:
<template>
<div>
<p>{{ $t('message.hello') }}</p>
<p>{{ $t('message.welcome') }}</p>
</div>
</template>
如果需要传递动态参数,可以在 $t
方法中使用占位符:
const messages = {
en: {
greeting: 'Hello, {name}!'
},
zh: {
greeting: '你好,{name}!'
}
};
<template>
<p>{{ $t('greeting', { name: 'John' }) }}</p>
</template>
可以通过修改 locale
属性来切换语言:
<template>
<button @click="changeLanguage('en')">English</button>
<button @click="changeLanguage('zh')">中文</button>
</template>
<script>
export default {
methods: {
changeLanguage(lang) {
this.$i18n.locale = lang;
}
}
};
</script>
vue-i18n
支持基于语言规则的复数形式:
const messages = {
en: {
books: '{count} book|{count} books'
},
zh: {
books: '{count} 本书'
}
};
<template>
<p>{{ $tc('books', 1) }} <!-- 输出 "1 book" --></p>
<p>{{ $tc('books', 2) }} <!-- 输出 "2 books" --></p>
</template>
借助 Intl.DateTimeFormat
,可以实现日期和时间的本地化格式化:
const messages = {
en: {
date: 'Today is {date, datetime}'
},
zh: {
date: '今天是 {date, datetime}'
}
};
<template>
<p>{{ $d(new Date(), 'long') }}</p>
</template>
支持货币、百分比等数字的本地化显示:
<template>
<p>{{ $n(123456, 'currency') }}</p> <!-- 输出 "$123,456.00" -->
<p>{{ $n(0.75, 'percent') }}</p> <!-- 输出 "75%" -->
</template>
为了优化性能,可以将语言资源拆分为独立文件,并按需加载:
function loadLocaleMessages() {
const locales = require.context('./locales', true, /[A-Za-z0-9-_,\s]+\.json$/i);
const messages = {};
locales.keys().forEach(key => {
const matched = key.match(/([A-Za-z0-9-_]+)\./i);
if (matched && matched.length > 1) {
const locale = matched[1];
messages[locale] = locales(key).default || locales(key);
}
});
return messages;
}
const messages = loadLocaleMessages();
如果项目使用 TypeScript,可以通过类型定义提升开发体验:
declare module 'vue-i18n' {
interface DefineLocaleMessage {
greeting: string;
books: string;
}
}
对于组件内部的国际化需求,可以使用 useI18n
钩子:
import { useI18n } from 'vue-i18n';
export default {
setup() {
const { t } = useI18n();
return { t };
}
};
通过 vue-i18n
,我们可以轻松实现 Vue 3 应用程序的国际化功能。从基础的文本翻译到高级的时间、数字格式化,再到动态参数和复数形式的支持,vue-i18n
提供了强大的工具集。同时,结合最佳实践(如按需加载语言包、TypeScript 类型定义等),可以进一步优化项目的性能和可维护性。