前言
React 做國際化,我推薦使用 React-intl , 這個庫提供了 React 組件和Api兩種方式來格式化日期,數字和字符串等。知道這個庫了,那讓我們開始使用它
組件用法
為了和React 比較融和,我們可以使用組件的方式
1.安裝
npm install react-intl --save
2.添加引用
import {IntlProvider, addLocaleData} from 'react-intl';
3.添加 locale 配置文件
zh-CN.js
const zh_CN = { 'intl.hello': "你好", 'intl.name': '我的名字是 {name}' } export default zh_CN;
en-US.js
const en_US = { 'intl.hello': "hello", 'intl.name': 'my name is {name}' } export default en_US;
4.使用<IntlProvider />
這個組件用于設置 i18n 的上下文,它將包裝應用程序的根組件,以便整個應用程序將配置在 i18n 的上下文中.
最主要的兩個配置項是: loacle 當前的語言環境 messages 當前語言的內容。
我們要動態切換語言,需要動態改這兩個配置。
import zhCN from './locale/zh.js'; //導入 i18n 配置文件
import enUS from './locale/en.js';
addLocaleData([...en, ...zh]);
export default class Root extends Component {
static propTypes = {
store: PropTypes.object.isRequired,
history: PropTypes.object.isRequired
}
render() {
const { store , history } = this.props;
return (
<IntlProvider locale='zh' messages={zhCN}>
<Provider store={store}>
<Router history={history}>
</Router>
</Provider>
</IntlProvider>
)
}
}
5.使用<FormattedMessage />
基礎用法
<FormattedMessage
id="intl.hello"
defaultMessage={'hello'}
/>
如果當前語言環境是 中文,它會顯示你好 ,如果是英文環境,會顯示Hello.
動態傳值
<FormattedMessage
id="intl.name"
values={{name: <b>{name}</b>}}
/>
我們定義 intl.name
的時候模板里用到了{name}
,這個代表我們可以動態傳值,我們可以通過FormattedMessage中的 values 屬性傳一個JSON對象,這是就會動態顯示我們的內容了。
6.其它組件用法
Ract-intl 為我們提供了豐富的組件,可以幫我們很好的處理字符串,時間,日期 ,大家可以自己查看 API,如有不明白的地方,我可以留言。
API用法
有時候我們可能需要在代碼中動態做 國際化,這就需要動態API 了。下面我簡單介紹下怎么用
1.導入 injectIntl
import { injectIntl, FormattedMessage } from 'react-intl'
;
2.在組件中注入
export default connect(mapStateToProps,mapActionCreators)(injectIntl(App))
我在項目中用到了Redux,注入的時候應該向上面那樣,如果你沒有用Redux ,只需要 export defuault injectIntl(App)
3.使用 intl 對象
我們通過第二步的注入,現在在我們在 組件的 props
上會得到一個 intl
對象,它提供的方法和咱們上邊介紹的組件基本相對應,這時候我們想要顯示字符串,可以使用formatMessage
方法:
const {intl} = this.props;
let tmp = intl.formatMessage({id: 'intl.name'},{name: 'joe'});
formatMessage的第一個參數可以傳入Id, 第二個參數傳入 values ,更詳細的了解,請查看 API
結束語
教程的代碼,我已放到github 上,大家如果需要,自行查看 React-intl
文章列表