国际化

开始使用

pro 通过 umi 插件 umi-plugin-locale 来实现全球化的功能,并且默认开启。 umi-plugin-locale 约定 在 src/locales 中引入 相应的 js,例如 en-US.js 和 zh-CN.js,并且在 config/config.js 中做如下配置:

  1. plugins:[
  2. ...,
  3. locale: {
  4. enable: true,
  5. default: 'zh-CN',
  6. baseNavigator: true,
  7. },
  8. ....
  9. ]

就可以在代码中使用全球化的功能了。详细配置参见config

umi-plugin-locale 封装了react-intl, api 与 react-intl 基本相同,并做了封装使用起来更加方便。全部 api 如下:

  1. import { formatMessage, setLocale, getLocale, FormattedMessage } from 'umi/locale';

格式化字符串

如果我们在 en-US.jszh-CN.js 中分别作了如下配置:

  1. // en-US.js
  2. export default {
  3. 'navbar.lang': '中文',
  4. }
  5. // zh-CN.js
  6. export default {
  7. 'navbar.lang': 'English',
  8. }

我们就可以在组件中这样使用

  1. import { FormattedMessage } from 'umi/locale';
  2. export default () => {
  3. return (
  4. <div>
  5. <FormattedMessage id="navbar.lang" />
  6. </div>
  7. );
  8. };

在某些情况下,你可能需要直接返回 string。你可以这样使用:

  1. import { formatMessage } from 'umi/locale';
  2. export default () => {
  3. return <div>{formatMessage({ id: 'navbar.lang' })}</div>;
  4. };

设置区域

umi-plugin-locale 暴露了名为 setLocalegetLocale 的 api,通过这两个 api 可以方便的切换区域。代码看起来像这样的:

  1. ...
  2. changLang = () => {
  3. const locale = getLocale();
  4. if (!locale || locale === 'zh-CN') {
  5. setLocale('en-US');
  6. } else {
  7. setLocale('zh-CN');
  8. }
  9. };
  10. render(){
  11. <Button
  12. size="small"
  13. ghost={theme === 'dark'}
  14. style={{
  15. margin: '0 8px',
  16. }}
  17. onClick={() => {
  18. this.changLang();
  19. }}
  20. >
  21. <FormattedMessage id="navbar.lang" />
  22. </Button>
  23. }

更多高级的用法可以参照 react-intl 的 api