使用react-intl,antd前端函数组件国际化实现

一、首先,添加dependencies,我使用的版本是react-intl 2.4.0

在这里插入图片描述
然后在最根部的页面导入react-intl

import { IntlProvider, addLocaleData } from 'react-intl'

以下是我项目的根部index.tsx文件,仅供参考

import React from 'react'
import ReactDOM from 'react-dom'
import localZh from './locales/zh-CN'
import localEn from './locales/en-US'
import { IntlProvider, addLocaleData } from 'react-intl'
import * as serviceWorker from './serviceWorker'
import { ConfigProvider } from 'are-common'
import App from './App'
import {
  THEME_MODE_LIGHT,
  LOCAL_THEME_MODE_KEY,
  bindAppOnMessage,
  unbindAppOnMessage
} from 'are-common/lib/utils/themeWorkflow'

import './index.less'

const { enUS, zhCN } = ConfigProvider.locale

const lang = localStorage.getItem('umi_locale') || 'zh-CN'
let locale = localZh,
  antdLocale = zhCN
if (lang === 'zh-CN') {
  locale = localZh
  antdLocale = zhCN
} else if (lang === 'en-US') {
  locale = localEn
  antdLocale = enUS
}
addLocaleData(locale.data)

interface RootState {
  appAreConfigs: object
}

class Root extends React.Component<{}, RootState> {
  state = {
    appAreConfigs: {
      themeMode: localStorage.getItem(LOCAL_THEME_MODE_KEY) || THEME_MODE_LIGHT,
      localeValue: lang
    }
  }

  componentDidMount(): void {
    bindAppOnMessage(this.onMessageHandler)
  }

  componentWillUnmount(): void {
    unbindAppOnMessage(this.onMessageHandler)
  }

  private onMessageHandler = (themeMode: string): void => {
    this.setState((prevState) => ({
      appAreConfigs: {
        ...prevState.appAreConfigs,
        themeMode
      }
    }))
  }

  render(): JSX.Element {
    const { appAreConfigs } = this.state
    return (
      <IntlProvider locale={locale.locale} messages={locale.messages}>
        <ConfigProvider locale={antdLocale} areconfigs={appAreConfigs}>
          <App />
        </ConfigProvider>
      </IntlProvider>
    )
  }
}

ReactDOM.render(<Root />, document.getElementById('root') as HTMLElement)

// If you want your app to work offline and load faster, you can change
// unregister() to register() below. Note this comes with some pitfalls.
// Learn more about service workers: https://bit.ly/CRA-PWA
serviceWorker.unregister()

主要是以下两个地方:

在这里插入图片描述
在这里插入图片描述

二、在需要使用国际化的组件中导入 injectIntl

import { injectIntl } from "react-intl";

在这里插入图片描述

三、export的时候使用injectIntl将组件进行包裹

export default injectIntl(Form.create<CreateFormProps>()(connect(mapStateToProps)(TableList)))

在这里插入图片描述
injectIntl需要放在export的外层,格式参考上图

四、使用

4.1函数组件
需要把intl从props中获取出来
在这里插入图片描述
在这里插入图片描述
然后使用intl.formatMessage({ id: 'oms.pipe.pressurePoint' })就可以实现前端国际化

intl.formatMessage({ id: '键' })

其中的键即为zh-CN中的键,如下示例:
zh-CN文件:
在这里插入图片描述
在这里插入图片描述
4.2类组件
类组件使用injectIntl包裹之后直接使用this.props.intl从props取出来就可以了,如:
在这里插入图片描述

this.props.intl.formatMessage({ id: `menu.${item.title}` })

参数和函数组件导入injectIntl以及使用injectIntl包裹方式是一样的,只是取的方式不同。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值