|
|
|
---
|
|
|
|
title: 国际化
|
|
|
|
lang: zn-CN
|
|
|
|
---
|
|
|
|
# 国际化
|
|
|
|
vue-antd-admin 采用 [vue-i18n](https://kazupon.github.io/vue-i18n/) 插件来实现国际化,该项目已经内置并且加载好了基础配置。可以直接上手使用。
|
|
|
|
|
|
|
|
> 如果你还没有看快速入门,请先移步查看: [页面 -> i18n国际化配置](../develop/page.html#i18n国际化配置)
|
|
|
|
|
|
|
|
|
|
|
|
## 菜单和路由
|
|
|
|
|
|
|
|
### 默认情况
|
|
|
|
如果你没有对菜单进行国际化配置,admin 默认会从路由数据中提取数据作为国际化配置。route.name 作为中文语言,route.path 作为英文语言。
|
|
|
|
国际化提取函数定义在 `@/utils/i18n.js` 文件中,会在路由加载时调用,如下:
|
|
|
|
```js
|
|
|
|
/**
|
|
|
|
* 从路由提取国际化数据
|
|
|
|
* @param i18n
|
|
|
|
* @param routes
|
|
|
|
*/
|
|
|
|
function mergeI18nFromRoutes(i18n, routes) {
|
|
|
|
formatFullPath(routes)
|
|
|
|
const CN = generateI18n(new Object(), routes, 'name')
|
|
|
|
const US = generateI18n(new Object(), routes, 'path')
|
|
|
|
i18n.mergeLocaleMessage('CN', CN)
|
|
|
|
i18n.mergeLocaleMessage('US', US)
|
|
|
|
const messages = routesI18n.messages
|
|
|
|
Object.keys(messages).forEach(lang => {
|
|
|
|
i18n.mergeLocaleMessage(lang, messages[lang])
|
|
|
|
})
|
|
|
|
}
|
|
|
|
```
|
|
|
|
### 自定义
|
|
|
|
如果你想自定义菜单国际化数据,可在 `@/router/i18n.js` 文件中配置。我们以路由的 path 作为 key(嵌套path 的写法也会被解析),name 作为 国际化语言的值。
|
|
|
|
假设你有一个路由的配置如下:
|
|
|
|
```js
|
|
|
|
[{
|
|
|
|
path: 'parent',
|
|
|
|
...
|
|
|
|
children: [{
|
|
|
|
path: 'self',
|
|
|
|
...
|
|
|
|
}]
|
|
|
|
}]
|
|
|
|
|
|
|
|
or
|
|
|
|
|
|
|
|
[{
|
|
|
|
path: 'other',
|
|
|
|
...
|
|
|
|
children: [{
|
|
|
|
path: '/parent/self', // 在国际化配置中 key 会解析为 parent.self
|
|
|
|
...
|
|
|
|
}]
|
|
|
|
}]
|
|
|
|
```
|
|
|
|
那么你需要在 `@/router/i18n.js` 中这样配置:
|
|
|
|
```jsx
|
|
|
|
messages: {
|
|
|
|
CN: {
|
|
|
|
parent: {
|
|
|
|
name: '父級菜單',
|
|
|
|
self: {name: '菜單名'},
|
|
|
|
},
|
|
|
|
US: {
|
|
|
|
parent: {
|
|
|
|
name: 'parent menu',
|
|
|
|
self: {name: 'menu name'},
|
|
|
|
},
|
|
|
|
HK: {
|
|
|
|
parent: {
|
|
|
|
name: '父級菜單',
|
|
|
|
self: {name: '菜單名'},
|
|
|
|
},
|
|
|
|
```
|
|
|
|
|
|
|
|
## 添加语言
|
|
|
|
|
|
|
|
首先在 `@/layouts/header/AdminHeader.vue` ,新增一门语言 (多个同理)。
|
|
|
|
|
|
|
|
```vue {15}
|
|
|
|
<template>
|
|
|
|
...
|
|
|
|
</template>
|
|
|
|
<script>
|
|
|
|
...
|
|
|
|
export default {
|
|
|
|
...
|
|
|
|
data() {
|
|
|
|
return {
|
|
|
|
langList: [
|
|
|
|
{key: 'CN', name: '简体中文', alias: '简体'},
|
|
|
|
{key: 'HK', name: '繁體中文', alias: '繁體'},
|
|
|
|
{key: 'US', name: 'English', alias: 'English'},
|
|
|
|
// 新增一个语言选项, key是i18n的索引,name是菜单显示名称
|
|
|
|
{key: 'JP', name: 'Japanese', alias: 'Japanese'}
|
|
|
|
],
|
|
|
|
searchActive: false
|
|
|
|
}
|
|
|
|
},
|
|
|
|
}
|
|
|
|
</script>
|
|
|
|
```
|
|
|
|
|
|
|
|
> TIP: 后续开发建议把这里改成动态配置的方式!
|
|
|
|
|
|
|
|
然后开始往 `@/router/i18n.js` 和 `@/pages/你的页面/i18n.js` 里面分别添加上语言的翻译。
|
|
|
|
|
|
|
|
```vue {12,13,14}
|
|
|
|
module.exports = {
|
|
|
|
messages: {
|
|
|
|
CN: {
|
|
|
|
home: {name: '首页'},
|
|
|
|
},
|
|
|
|
US: {
|
|
|
|
home: {name: 'home'},
|
|
|
|
},
|
|
|
|
HK: {
|
|
|
|
home: {name: '首頁'},
|
|
|
|
},
|
|
|
|
JP: {
|
|
|
|
home: {name: '最初のページ'},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
> Notice: 更多用法请移步到 [vue-i18n](https://kazupon.github.io/vue-i18n/) 。
|