背景
umi提供的国际化函数formatMessage 如果在自己封装的ts文件而非函数组件中使用,如果使用
import { formatMessage } from 'umi';
会报如下警告:
devScripts.js:5035 Warning: Using this API will cause automatic refresh when switching languages, please use useIntl or injectIntl.
使用此 api 会造成切换语言的时候无法自动刷新,请使用 useIntl 或 injectIntl。
但是useIntl
又只能在hook函数式组件中使用。
解决方案:
getIntl + getLocale
组合
getIntl中第一个参数是传当前语言环境,如果不传参,会默认使用zh-CN,所以使用getLocale()函数获取一下当前的语言环境
参考:
import { getIntl, getLocale } from 'umi';
// getIntl中第一个参数是传当前语言环境,如果不传参,会默认使用zh-CN,所以使用getLocale函数获取一下当前的语言环境
const { formatMessage } = getIntl(getLocale());
// 此时使用不会报警告,也不会出现语言切换后不刷新问题
formatMessage({ id: 'msg.notOpened' }),
注意:
如果切换语言还是没成功,可以检查在使用umi的切换语言方法setLocale(language)
时,第二个参数要保持默认为true