## 国际化
Element Plus 组件内部默认使用英语,若希望使用其他语言,则需要进行多语言设置。以中文为例,在 main.js 中
:::warning
我们在 **1.0.2-beta.59(包含59)** 之后的国际化按需引入有破坏性变动,请往下查看,该变动**不适用于 1.0.2-beta.58 之前的版本**
:::
### 1.0.2-beta.59(包含59)之后的更新:
在 `1.0.2-beta.58(包含59)`之后,我们重新组织了代码,让国际化功能能够被正常的使用(不论是全引入还是按需引入),一共有两种方式在项目中使用。
#### 1. 通过 ConfigProvider 的方式来使用,详细的使用方法请查阅 ConfigProvider 的文档
如果你的项目中还在使用 `options API`, 那么你应该使用此方法,我们更加建议用户使用该方法,因为这样会减少使用的负担,但如果你在项目中深度使用 `Composition API`,那么你可以使用第二种方法来为整个应用提供语言支持。
```html
```
#### 有用的链接:
- [支持的语言列表](https://github.com/element-plus/element-plus/tree/dev/packages/locale/lang)
- [ConfigProvider 文档](#/zh-CN/component/config-provider)
#### 2. 通过 Composable 的 Hook 使用
该方法基本就是通过你自己写一个 [ConfigProvider](https://element-plus.org/#/zh-CN/component/config-provider) 的方式,来注入所有配置
```ts
import { useLocale, useLocaleProps } from 'element-plus'
// Locale Wrapper 入口
const Provider = defineComponent({
props: {
// 如果你需要你的应用可以相应式的更新语言,那么这里的 props 必须包含下面这个 props
...useLocaleProps,
},
setup() {
// 不需要任何参数,但是需要你的这个组件可以接受
// ` { locale?: Language, i18n?: (...args: any[]) => string }` 作为参数
useLocale()
}
})
createApp(
{
// ...
template: `
`
}
)
```
### 设置 Day.js 国际化
Element Plus 直接使用了 [Day.js](https://day.js.org/) 项目的时间日期国际化设置,如月份名称、每周第一天是周几等。并且会自动全局设置已经导入的 Day.js 国际化配置。
```typescript
import locale from 'element-plus/lib/locale/lang/zh-cn'
import 'dayjs/locale/zh-cn'
// 将自动设置 Day.js 的国际化设置为 'zh-cn'
app.use(ElementPlus, { locale })
```
当然,如果有需要,你也可以手动设置成其他 Day.js 国际化配置
```typescript
import 'dayjs/locale/fr'
dayjs.locale('fr')
```
如果使用其它语言,默认情况下英文语言包依旧是被引入的,可以使用 webpack 的 NormalModuleReplacementPlugin 替换默认语言包。
**webpack.config.js**
```typescript
{
plugins: [
new webpack.NormalModuleReplacementPlugin(
/element-plus[\/\\]lib[\/\\]locale[\/\\]lang[\/\\]en/,
'element-plus/lib/locale/lang/zh-cn',
),
]
}
```
### 兼容 `vue-i18n@9.x`
如果需要查看 [VueI18n的文档](https://vue-i18n-next.intlify.dev/guide/#html), 请点击这个链接去查看
```typescript
import { createApp } from 'vue'
import { createI18n } from 'vue-i18n'
import ElementPlus from 'element-plus'
import enLocale from 'element-plus/lib/locale/lang/en'
import zhLocale from 'element-plus/lib/locale/lang/zh-cn'
import App from './App.vue'
const messages = {
[enLocale.name]: {
// el 这个属性很关键,一定要保证有这个属性,
el: enLocale.el,
// 定义你自己的字典,但是请不要和 `el` 重复,这样会导致 ElementPlus 内部组件的翻译失效.
message: {
hello: 'hello world',
},
},
[zhLocale.name]: {
el: zhLocale.el,
// 定义你自己的字典,但是请不要和 `el` 重复,这样会导致 ElementPlus 内部组件的翻译失效.
message: {
hello: '你好,世界',
},
},
testLocale: {
el: {},
// 没有定义 message 字段,会 fallback 回到 en 去, fallbackLocale 的定义在下方 👇
},
}
const i18n = createI18n({
locale: zhLocale.name,
fallbackLocale: enLocale.name,
messages,
})
const app = createApp(App)
app.use(ElementPlus, {
i18n: i18n.global.t,
})
// 要记得使用这个插件.
app.use(i18n)
```
### 兼容其他 i18n 插件
如果不使用 `vue-i18n@9.x`,而是用其他的 i18n 插件,Element Plus 将无法兼容,但是可以自定义 Element Plus 的 i18n 的处理方法。
:::tip
一旦设置了这个方法,ElementPlus 内置的翻译功能就会失效,会使用用户定义的翻译功能,所以一定要确保翻译方法能够正确的翻译 `el.scope.subName` 的格式,如果自定义的方法无法翻译 `el.select.noData` 的格式,将会使组件的文本失效.
:::
```typescript
import Vue from 'vue'
import ElementPlus from 'element-plus'
import enLocale from 'element-plus/lib/locale/lang/en'
import zhLocale from 'element-plus/lib/locale/lang/zh-cn'
// 这是 i18n 函数的函数签名.
type i18n = (...args: any[]) => string
Vue.use(Element, {
i18n: function(path, options) {
// ...
},
// others.
})
```
### 按需加载里定制 i18n
如果你需要按需加载翻译文件,请查看[按需加载](https://vue-i18n-next.intlify.dev/guide/advanced/lazy.html)
```typescript
import { createApp } from 'vue'
import { createI18n } from 'vue-i18n'
import ElementPlus from 'element-plus'
import enLocale from 'element-plus/lib/locale/lang/en'
import zhLocale from 'element-plus/lib/locale/lang/zh-cn'
import ElementLocale from 'element-plus/lib/locale'
import App from './App.vue'
const messages = {
[enLocale.name]: {
// el 这个属性很关键,一定要保证有这个属性,
el: enLocale.el,
// 定义你自己的字典,但是请不要和 `el` 重复,这样会导致 ElementPlus 内部组件的翻译失效.
message: {
hello: 'hello world',
},
},
[zhLocale.name]: {
el: zhLocale.el,
// 定义你自己的字典,但是请不要和 `el` 重复,这样会导致 ElementPlus 内部组件的翻译失效.
message: {
hello: '你好,世界',
},
},
testLocale: {
el: {},
// 没有定义 message 字段,会 fallback 回到 en 去, fallbackLocale 的定义在下方 👇
},
}
const i18n = createI18n({
locale: zhLocale.name,
fallbackLocale: enLocale.name,
messages,
})
ElementLocale.i18n(i18n.global.t)
const app = createApp(App)
app.use(i18n)
```
### 通过 CDN 的方式加载语言文件
```html
```
搭配 `vue-i18n` 使用
```html
```
目前 Element Plus 内置了以下语言:
- 简体中文(zh-cn)
- 英语(en)
- 德语(de)
- 葡萄牙语(pt)
- 西班牙语(es)
- 丹麦语(da)
- 法语(fr)
- 挪威语(nb-no)
- 繁体中文(zh-tw)
- 意大利语(it)
- 韩语(ko)
- 日语(ja)
- 荷兰语(nl)
- 越南语(vi)
- 俄语(ru)
- 土耳其语(tr)
- 巴西葡萄牙语(pt-br)
- 波斯语(fa)
- 泰语(th)
- 印尼语(id)
- 保加利亚语(bg)
- 波兰语(pl)
- 芬兰语(fi)
- 瑞典语(sv)
- 希腊语(el)
- 斯洛伐克语(sk)
- 加泰罗尼亚语(ca)
- 捷克语(cs)
- 乌克兰语(uk)
- 土库曼语(tk)
- 泰米尔语(ta)
- 拉脱维亚语(lv)
- 南非荷兰语(af)
- 爱沙尼亚语(et)
- 斯洛文尼亚语(sl)
- 阿拉伯语(ar)
- 希伯来语(he)
- 立陶宛语(lt)
- 蒙古语(mn)
- 哈萨克斯坦语(kk)
- 匈牙利语(hu)
- 罗马尼亚语(ro)
- 库尔德语(ku)
- 维吾尔语(ug-cn)
- 高棉语(km)
- 塞尔维亚语(sr)
- 巴斯克语(eu)
- 吉尔吉斯语(ky)
- 亚美尼亚语 (hy-am)
- 克罗地亚 (hr)
- 世界语 (eo)
如果你需要使用其他的语言,欢迎贡献 PR:只需在 [这里](https://github.com/element-plus/element-plus/tree/dev/packages/locale/lang) 添加一个语言配置文件即可。