存放语言文件的 Context.js

    1. import {createContext} from 'react';
    2. const { Provider, Consumer } = createContext({
    3. locale: '',
    4. messages: {},
    5. formatMessage: () => {},
    6. });
    7. export {
    8. Provider,
    9. Consumer,
    10. };

    语言文件在应用运行时,不要经常更新
    避免 Context 中的数据变化引起应用整体重绘所带来的性能问题

    通过 props 传入的国家码、语言文件及读取语言文件中某一个 key 值的函数注入到 Context 的 value 对象中

    1. import { Provider } from './IntlContext';
    2. class IntlProvider extends Component {
    3. constructor(props) {
    4. super(props);
    5. this.state = {
    6. value: {
    7. locale: props.locale,
    8. messages: props.messages,
    9. formatMessage: this.formatMessage,
    10. },
    11. };
    12. }
    13. formatMessage = (config) => {
    14. const { id } = config;
    15. const message = this.state.value.messages[id];
    16. if (message === undefined) {
    17. console.warn(`[react-intl-context]: Message key ${id} is undefined. Fallback to empty string.`);
    18. return '';
    19. }
    20. return message;
    21. }
    22. render() {
    23. return (
    24. <Provider value={this.state.value}>
    25. {this.props.children}
    26. </Provider>
    27. );
    28. }
    29. }

    再封装一个高阶组件作为 Context 的 Consumer

    1. import React from 'react';
    2. import { Consumer } from './IntlContext';
    3. const injectIntl = (WrappedComponent) => {
    4. const InjectIntl = props => (
    5. <Consumer>
    6. {value => <WrappedComponent {...props} intl={value} />}
    7. </Consumer>
    8. );
    9. return InjectIntl;
    10. };
    11. export default injectIntl;

    最后,将页面组件包裹在 injectIntl 这个高阶组件中,页面组件接收到一个名为 intl 的 props;
    调用 props.intl.formatMessage 并传入相应的占位符 key 值,即可读取到语言文件中的相应翻译。

    1. import { injectIntl } from 'react-intl-context';
    2. class OutletDetail extends Component {
    3. render() {
    4. const { intl } = this.props;
    5. return (
    6. <div className="view-outletDetail">
    7. <Button>
    8. {intl.formatMessage({ id: 'outletDetail_showNotification' })}
    9. </Button>
    10. </div>
    11. );
    12. }
    13. }
    14. export default injectIntl(OutletDetail);

    https://github.com/AlanWei/react-intl-context/tree/master/src