多语言配置
Dux Vue Admin 使用 vue-i18n 实现多语言支持,默认提供中文和英文两种语言。
基础配置
1. 配置语言
在全局配置中设置默认语言:
typescript
interface Config {
lang?: "en-US" | "zh-CN"; // 默认语言
}
const config = {
lang: "zh-CN",
};
2. 语言包
系统内置了两个语言包:
en-US
: 英文zh-CN
: 中文
语言包结构:
typescript
{
common: {
home: '首页',
menu: '菜单',
search: '搜索'
// ...
},
pages: {
login: {
// ...
},
// ...
},
// ...
}
使用方法
1. 在组件中使用
typescript
import { useI18n } from "vue-i18n";
const { t } = useI18n();
// 使用翻译
t("common.home"); // 首页
t("common.menu"); // 菜单
// 带参数的翻译
t("message.error", { content: "错误信息" });
2. 在模板中使用
vue
<template>
<div>
<!-- 基础翻译 -->
{{ t("common.home") }}
<!-- 带参数翻译 -->
{{ t("message.error", { content: "错误信息" }) }}
</div>
</template>
3. 切换语言
系统提供了语言切换的方法:
typescript
import { setLanguage } from "@duxweb/dux-vue-admin";
// 切换到英文
setLanguage("en-US");
// 切换到中文
setLanguage("zh-CN");
多语言组件
1. 语言切换组件
系统提供了一个内置的语言切换组件:
vue
<template>
<DuxLocale
v-model:value="translations"
:langs="[
{ name: 'en-US', label: 'English' },
{ name: 'zh-CN', label: '中文' },
]"
field="title"
>
<n-input v-model:value="defaultValue" />
</DuxLocale>
</template>
<script setup>
import { ref } from "vue";
const translations = ref({
"en-US": {
title: "Hello",
},
"zh-CN": {
title: "你好",
},
});
const defaultValue = ref("");
</script>
2. 组件属性
typescript
interface Props {
value: object; // 多语言数据对象
langs: {
// 语言配置
name: string; // 语言标识
label: string; // 语言名称
}[];
field: string; // 字段名
}
内置翻译
系统内置了以下常用的翻译:
1. 通用翻译
typescript
{
common: {
home: '首页',
menu: '菜单',
search: '搜索',
logout: '退出登录',
admin: '管理员',
list: '列表',
form: '表单'
}
}
2. 页面翻译
typescript
{
pages: {
login: {
placeholder: {
username: '请输入账号',
password: '请输入密码'
},
buttons: {
login: '登录'
}
},
404: {
title: '页面不存在',
desc: '抱歉,您访问的页面不存在'
}
// ...
}
}
3. 按钮翻译
typescript
{
buttons: {
list: '列表',
create: '创建',
save: '保存',
delete: '删除',
edit: '编辑',
cancel: '取消',
confirm: '确定'
// ...
}
}
4. 消息翻译
typescript
{
message: {
success: '成功',
error: '错误:{content}',
requestSuccess: '提交成功',
requestError: '请求失败',
validateError: '验证失败'
}
}
扩展语言包
如果需要扩展或覆盖现有的语言包,可以使用以下方法:
typescript
import { i18n } from "@duxweb/dux-vue-admin";
// 添加新的语言
i18n.global.setLocaleMessage("ja-JP", {
common: {
home: "ホーム",
// ...
},
});
// 扩展现有语言
i18n.global.mergeLocaleMessage("zh-CN", {
custom: {
title: "自定义标题",
},
});
变量使用
1. 基础变量
在语言包中定义带变量的文本:
typescript
{
"message": {
"welcome": "你好,{name}",
"count": "共有 {count} 条记录",
"status": "当前状态:{status}"
}
}
使用方式:
typescript
import { useI18n } from "vue-i18n";
const { t } = useI18n();
// 单个变量
t("message.welcome", { name: "张三" }); // 输出:你好,张三
// 多个变量
t("message.status", {
count: 100,
status: "正常",
});
2. 复数使用
在语言包中定义复数形式:
typescript
{
"items": {
"apple": "没有苹果 | 1个苹果 | {count}个苹果"
}
}
使用方式:
typescript
// 复数形式
t("items.apple", 0); // 输出:没有苹果
t("items.apple", 1); // 输出:1个苹果
t("items.apple", { count: 10 }); // 输出:10个苹果
3. 日期和数字格式化
typescript
import { useI18n } from "vue-i18n";
const { n, d } = useI18n();
// 数字格式化
n(100000); // 输出:100,000
n(100000, "currency"); // 输出:¥100,000.00 或 $100,000.00
// 日期格式化
d(new Date(), "short"); // 输出:2024/1/1
d(new Date(), "long"); // 输出:2024年1月1日
4. HTML 内容
在语言包中定义带 HTML 的文本:
typescript
{
"message": {
"tip": "点击<a href='{url}'>这里</a>查看详情",
"status": "当前状态:<span class='status'>{status}</span>"
}
}
使用方式:
vue
<template>
<!-- 使用 v-html 渲染 HTML -->
<div v-html="t('message.tip', { url: 'https://example.com' })"></div>
<!-- 使用组件渲染 HTML -->
<i18n-t keypath="message.status" tag="div">
<template #status>
<span class="status">{{ status }}</span>
</template>
</i18n-t>
</template>
5. 条件判断
在语言包中定义条件文本:
typescript
{
"status": {
"message": "{status === 'success' ? '成功' : '失败'}"
}
}
使用方式:
typescript
// 条件判断
t("status.message", { status: "success" }); // 输出:成功
t("status.message", { status: "error" }); // 输出:失败
6. 嵌套翻译
在语言包中定义嵌套的文本:
typescript
{
"nested": {
"parent": "父级 {child}",
"child": "子级 {name}"
}
}
使用方式:
typescript
// 嵌套翻译
const child = t("nested.child", { name: "测试" });
t("nested.parent", { child }); // 输出:父级 子级 测试