---
localeCode: zh-CN
order: 76
category: 其他
title: LocaleProvider 多语言
icon: doc-i18n
dir: column
brief: 国际化组件,为 Semi 组件提供多语言支持
---
## 目前支持语言
| 最低支持版本 | 语言 |
| ----------- | ----------- |
| v0.0.1 | 简体中文: zh_CN |
| v0.7.0 | 英语: en_GB、日语: ja_JP、韩语: ko_KR |
| v1.8.0 | 阿拉伯语: ar |
| v1.11.0 | 越南语: vi_VN、俄罗斯语: ru_RU、印尼语: id_ID、马来语: ms_MY、泰语: th_TH、土耳其语: tr_TR |
| v1.17.0 | 葡萄牙语(巴西): pt_BR |
| v1.28.0 | 繁体中文: zh_TW |
| v2.2.0 | 西班牙语: es |
| v2.15.0 | 意大利语: it、法语:fr、德语:de |
| v2.21.0 | 罗马尼亚语: ro |
| v2.29.0 | 瑞典语: sv_SE、波兰语: pl_PL 、荷兰语: nl_NL |
## 已支持组件
> DatePicker、TimePicker、Modal、Pagination、Select、Table、Cascader、Calendar、TreeSelect、List、Typography、Transfer、Nav、Upload、Form、Navigation、Image
## 使用
LocaleProvider 使用了 React 的 context 上下文特性,你只需要在应用外围包裹一次即可全局生效
当需要切换语言时,直接切换 props 传入的 locale 即可
```jsx hideInDSM
import React from 'react';
import zh_CN from '@douyinfe/semi-ui/lib/es/locale/source/zh_CN';
import en_GB from '@douyinfe/semi-ui/lib/es/locale/source/en_GB';
import en_US from '@douyinfe/semi-ui/lib/es/locale/source/en_US';
import ko_KR from '@douyinfe/semi-ui/lib/es/locale/source/ko_KR';
import ja_JP from '@douyinfe/semi-ui/lib/es/locale/source/ja_JP';
import vi_VN from '@douyinfe/semi-ui/lib/es/locale/source/vi_VN';
import ru_RU from '@douyinfe/semi-ui/lib/es/locale/source/ru_RU';
import id_ID from '@douyinfe/semi-ui/lib/es/locale/source/id_ID';
import ms_MY from '@douyinfe/semi-ui/lib/es/locale/source/ms_MY';
import th_TH from '@douyinfe/semi-ui/lib/es/locale/source/th_TH';
import tr_TR from '@douyinfe/semi-ui/lib/es/locale/source/tr_TR';
import pt_BR from '@douyinfe/semi-ui/lib/es/locale/source/pt_BR';
import zh_TW from '@douyinfe/semi-ui/lib/es/locale/source/zh_TW';
import sv_SE from '@douyinfe/semi-ui/lib/es/locale/source/sv_SE';
import pl_PL from '@douyinfe/semi-ui/lib/es/locale/source/pl_PL';
import nl_NL from '@douyinfe/semi-ui/lib/es/locale/source/nl_NL';
import ar from '@douyinfe/semi-ui/lib/es/locale/source/ar';
import es from '@douyinfe/semi-ui/lib/es/locale/source/es';
import it from '@douyinfe/semi-ui/lib/es/locale/source/it';
import de from '@douyinfe/semi-ui/lib/es/locale/source/de';
import fr from '@douyinfe/semi-ui/lib/es/locale/source/fr';
import ro from '@douyinfe/semi-ui/lib/es/locale/source/ro';
import { LocaleProvider } from '@douyinfe/semi-ui';
// 在locale中传入相应的语言包即可
() => {
return (
{/* eslint-disable-next-line react/jsx-no-undef */}
);
};
```
## 代码示例
### 国际化
```jsx live=true dir="column" hideInDSM
import React from 'react';
import en_GB from '@douyinfe/semi-ui/lib/es/locale/source/en_GB';
import ja_JP from '@douyinfe/semi-ui/lib/es/locale/source/ja_JP';
import { LocaleProvider, Pagination } from '@douyinfe/semi-ui';
class I18nDemo extends React.Component {
constructor(props) {
super(props);
}
render() {
return (
<>
>
);
}
}
```
### 自定义国际化组件
当你的自定义组件,也希望消费 Semi LocaleProvider Context 中的 localeCode 或者读取具体某个组件的 i18n 文本 localeData时,你可以使用 LocaleConsumer 进行获取;
```jsx live=true dir="column" noInline=true
import React from 'react';
import zh_CN from '@douyinfe/semi-ui/lib/es/locale/source/zh_CN';
import en_GB from '@douyinfe/semi-ui/lib/es/locale/source/en_GB';
import ko_KR from '@douyinfe/semi-ui/lib/es/locale/source/ko_KR';
import { LocaleProvider, LocaleConsumer } from '@douyinfe/semi-ui';
class GetLocaleFromSemi extends React.Component {
render() {
return
{
(localeData, localeCode, dateFnsLocale) => (
{localeCode} : {localeData.begin}
)
}
;
}
}
class ExtractComponent extends React.Component {
render() {
return
{
(localeData, localeCode, dateFnsLocale) => (
{localeData.customKey}
)
}
;
}
}
class I18nCustomDemo extends React.Component {
render() {
const new_zh_CN = { ...zh_CN, ComponentA: { customKey: 'semi' } };
const new_ko_KR = { ...ko_KR, ComponentA: { customKey: 'design' } };
const new_en_GB = { ...en_GB, ComponentA: { customKey: 'dsm' } };
return (
<>
>
);
}
}
render(I18nCustomDemo);
```
### 支持多语言的组件
示例给出了目前所有支持多语言的组件
当你的网站有RTL适配需求时,推荐直接使用ConfigProvider,除了可配置locale外,还可以直接同时配置direction='rtl'/'ltr'
若无RTL适配需求,直接使用LocaleProvider即可
```jsx live=true dir="column" hideInDSM
import React from 'react';
import zh_CN from '@douyinfe/semi-ui/lib/es/locale/source/zh_CN';
import en_GB from '@douyinfe/semi-ui/lib/es/locale/source/en_GB';
import en_US from '@douyinfe/semi-ui/lib/es/locale/source/en_US';
import ko_KR from '@douyinfe/semi-ui/lib/es/locale/source/ko_KR';
import ja_JP from '@douyinfe/semi-ui/lib/es/locale/source/ja_JP';
import ar from '@douyinfe/semi-ui/lib/es/locale/source/ar';
import vi_VN from '@douyinfe/semi-ui/lib/es/locale/source/vi_VN';
import ru_RU from '@douyinfe/semi-ui/lib/es/locale/source/ru_RU';
import id_ID from '@douyinfe/semi-ui/lib/es/locale/source/id_ID';
import ms_MY from '@douyinfe/semi-ui/lib/es/locale/source/ms_MY';
import th_TH from '@douyinfe/semi-ui/lib/es/locale/source/th_TH';
import tr_TR from '@douyinfe/semi-ui/lib/es/locale/source/tr_TR';
import pt_BR from '@douyinfe/semi-ui/lib/es/locale/source/pt_BR';
import zh_TW from '@douyinfe/semi-ui/lib/es/locale/source/zh_TW';
import sv_SE from '@douyinfe/semi-ui/lib/es/locale/source/sv_SE';
import pl_PL from '@douyinfe/semi-ui/lib/es/locale/source/pl_PL';
import nl_NL from '@douyinfe/semi-ui/lib/es/locale/source/nl_NL';
import es from '@douyinfe/semi-ui/lib/es/locale/source/es';
import it from '@douyinfe/semi-ui/lib/es/locale/source/it';
import de from '@douyinfe/semi-ui/lib/es/locale/source/de';
import fr from '@douyinfe/semi-ui/lib/es/locale/source/fr';
import ro from '@douyinfe/semi-ui/lib/es/locale/source/ro';
import { LocaleProvider, ConfigProvider, Pagination, Modal, Button, Select, Cascader, DatePicker, TreeSelect, Table, TimePicker, List, Calendar, Typography, Transfer, ImagePreview, Image, Form, Nav } from '@douyinfe/semi-ui';
import { IconUser, IconSemiLogo, IconStar } from '@douyinfe/semi-icons';
class I18nDemo extends React.Component {
constructor(props) {
super(props);
this.state = {
locale: zh_CN,
localeCode: 'zh_CN',
};
this.onLanguageChange = this.onLanguageChange.bind(this);
}
onLanguageChange(code) {
let language = {
'zh_CN': zh_CN,
'en_GB': en_GB,
'en_US': en_US,
'ko_KR': ko_KR,
'ja_JP': ja_JP,
'ar': ar,
'vi_VN': vi_VN,
'ru_RU': ru_RU,
'id_ID': id_ID,
'ms_MY': ms_MY,
'th_TH': th_TH,
'tr_TR': tr_TR,
'pt_BR': pt_BR,
'zh_TW': zh_TW,
'es': es,
'sv_SE': sv_SE,
'pl_PL': pl_PL,
'nl_NL': nl_NL,
de,
it,
fr,
ro
};
this.setState({ locale: language[code], localeCode: code });
}
render() {
const { locale, localeCode } = this.state;
const treeData = [
{
label: 'Asia',
value: 'asia',
key: '1',
children: [
{
label: 'China',
value: 'china',
key: '1-0',
children: [
{ label: 'Beijing', value: 'beijing', key: '1-0-0' },
{ label: 'Shanghai', value: 'shanghai', key: '1-0-1' },
],
},
{
label: 'Japan',
value: 'japan',
key: '1-1',
children: [ { label: 'Osaka', value: 'osaka', key: '1-1-0' } ]
},
]
}
];
const I18nComponent = () => {
const [modalVisible, setModalVisible] = useState(false);
const columns = useMemo(() => [
{
title: 'Name',
width: 250,
dataIndex: 'name',
},
{
title: 'Age',
width: 150,
dataIndex: 'age',
},
{
title: 'Address',
dataIndex: 'address',
},
]);
const dataSource = useMemo(() => {
const data = [];
for (let i = 0; i < 46; i++) {
data.push({
key: '' + i,
name: `Bytedance ${i}`,
age: 32,
address: `Beijing, Haidian. Zhichun Road ${i}`,
});
}
return data;
});
const transferData = useMemo(() => {
return Array.from({ length: 100 }, (v, i) => {
return {
label: `选项名称 ${i}`,
value: i,
disabled: false,
key: i,
};
});
});
const srcList = useMemo(() => ([
"https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/abstract.jpg",
"https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/sky.jpg",
"https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/greenleaf.jpg",
"https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/colorful.jpg",
]), []);
const style = { margin: 10 };
return (
<>
Pagination
Modal
setModalVisible(false)}
onCancel={() => setModalVisible(false)}
>
This is the content of a basic modal.
More content...
Select & Cascader
DatePicker
TimePicker
TreeSelect
Table
Table - Empty
List - Empty
List} dataSource={[]}/>
Calendar
Typography - Copyable
Click to copy text.
Typography - Collapsible
支持展开和折叠:Semi Design 是由抖音前端团队与 UED 团队共同设计开发并维护的设计系统。设计系统包含设计语言以及一整套可复用的前端组件,帮助设计师与开发者更容易地打造高质量的、用户体验一致的、符合设计规范的 Web 应用。
Transfer
Image
{srcList.map((src, index) => {
return (
);
})}
Form
Navigation
},
{ itemKey: 'union', text: '活动管理', icon: },
]}
header={{
logo: ,
text: 'Semi 数据后台'
}}
footer={{
collapseButton: true,
}}
/>
>
);
};
return (
<>
>
);
}
}
```