7月底開始,公的要把之前的一個項目增加國際化的需求。現在基本做完了,在轉測階段,就把之前的東西記錄一下。
效果圖
react-intl-universal包
由于項目是react的,是以使用的是react-intl-universal。其實這個npm包的使用還是很簡單友善的。
具體實作
看過我之前的文章的同學,估計知道我之前的頁面結構和代碼。在國際化之前我适當的修改了一下。但是展示的結構不變。實際效果最上面的gif圖有展示了。
- 引入react-intl-universal,這個看文檔即可;
- 增加兩個json檔案;
- en-US.json 用于存放英文對應的資料
{ "key1": "Internationalization" }
- zh-CN.json 用于存放中文對應的資料
{ "key1": "國際化" }
這裡用到的key 就是這兩個json檔案中的key值。intl.get(key)
- en-US.json 用于存放英文對應的資料
- 新增一個
的頁面檔案;locale.js
- 修改App.js檔案,代碼如下:
import React, { Component } from 'react';
import { BrowserRouter as Router} from 'react-router-dom';
import MyRoute from './router.js';
import {emit} from './emit.js'
import zh_CN from 'antd/es/locale/zh_CN';
import en_US from 'antd/es/locale/en_US';
import intl from 'react-intl-universal';
import { ConfigProvider } from 'antd';
import './App.css';
import './index.less';
const locales = {
'en-US': require('./locales/en-US.json'),
'zh-CN': require('./locales/zh-CN.json'),
};
class App extends Component {
constructor(props) {
super(props);
this.state = {
antdLang: zh_CN, // 修改antd 元件的國際化
}
}
componentDidMount() {
emit.on('change_language', lang => this.loadLocales(lang)); // 監聽語言改變事件
this.loadLocales(); // 初始化語言
}
loadLocales(lang = 'zh-CN') {
intl.init({
currentLocale: lang, // 設定初始語音
locales,
}).then(() => {
this.setState({
antdLang: lang === 'zh-CN' ? zh_CN : en_US
});
});
}
render() {
return (
// ConfigProvider antd 元件的國際化
<ConfigProvider locale={this.state.antdLang}>
<Router>
<MyRoute />
</Router>
</ConfigProvider>
);
}
}
export default App;
這裡有幾點需要注意的:
-
antd 的國際化:https://ant-design.gitee.io/docs/react/i18n-cn 這裡需要看這個文檔
我使用的antd 是 3.16.2版本,是以使用的是
元件用于antd元件的全局國際化,有的版本使用的是ConfigProvider
,兩個元件用法一樣,大家根據自己的版本選擇。LocaleProvider
- 事件監聽,這裡是通過
實作的,就是導航欄在改變語言時,把改變事件傳遞到App.js中;傳遞到其他檔案也可以的,隻需要增加對應的監聽時間即可events
- 事件監聽的實作:
- emit.js 檔案:
const EventEmitter = require('events').EventEmitter; const emit = new EventEmitter(); export { emit };
-
發送消息
發送消息是在
元件中做的,Header
檔案内容Header.js
import React, { Component } from 'react'; import { Select } from 'antd'; import {emit} from '../../emit.js' import '../../assets/css/index.less' const { Option } = Select; class Header extends Component { handleChange(val) { // 發送消息 emit.emit('change_language', val); } render() { return ( <div className='header'> Header <Select defaultValue="中文" onChange={this.handleChange.bind(this)}> <Option value="zh-CN">中文</Option> <Option value="en-US">English</Option> </Select> </div> ); } componentDidMount() { } } export default Header;
-
接收消息
這個在
檔案中,這裡不多說了。App.js
- 頁面國際化的實作
import React from 'react';
import intl from 'react-intl-universal';
class Locale extends React.Component {
render() {
return (
<div className='locale'>
<p>國際化測試: {intl.get('key1')}</p>
</div>
);
}
componentDidMount() {
}
}
export default Locale;
到這裡一個簡單的國家化demo基本完成。
小結
其實國際化的實作不難。但是在項目中有很多細節需要處理,比如: antd 元件的國際化,antd 月曆元件的處理,下拉元件的處理。在做的時候,要注意antd 提供的國際化元件,也要注意react-intl-universal的使用。很多細節,坑,需要大家自己踩了自己才會知道。項目代碼下載下傳位址:https://gitee.com/hgdq/myblog.git