javascript - React-Intl 如何从变量切换语言环境和消息

标签 javascript reactjs ecmascript-6 create-react-app react-intl

我正在尝试弄清楚如何使用 React-Intl 更改语言。这是我的第一个 React 应用程序,它是用 create-react-app 制作的,我没有使用 Redux 或 Flux。

在我的 index.js 中有以下代码:

import React from 'react';
import ReactDOM from 'react-dom';
import TodoApp from './components/TodoApp';
import registerServiceWorker from './registerServiceWorker';
import './index.css';

// Bootstrap CSS libraries
import 'bootstrap/dist/css/bootstrap.css';
import 'bootstrap/dist/css/bootstrap-theme.css';

import { IntlProvider, addLocaleData } from 'react-intl';
import intlEN from 'react-intl/locale-data/en';
import intlES from 'react-intl/locale-data/es';
import intlMessagesES from './i18n/locales/es.json';
import intlMessagesEN from './i18n/locales/en.json';

addLocaleData([...intlEN, ...intlES]);

/* Define your translations */
let i18nConfig = {
    locale: 'es',
    messages: intlMessagesES
};

let changeLanguage = (lang) => {
    i18nConfig = { locale: lang, messages: intlMessagesEN };
    return i18nConfig;
}

ReactDOM.render(
    <IntlProvider locale={ i18nConfig.locale } key={ i18nConfig.locale } messages={ i18nConfig.messages }>
        <TodoApp onChangeLanguage={changeLanguage} />
    </IntlProvider>,
    document.getElementById('root'));
registerServiceWorker();

TodoApp 正在通过 props(即:“es”或“en”)在“lang”参数上发送一个字符串,当我更改 i18nConfig 时,IntlProvider 似乎没有任何变化。我的想法是更改我的 i18nConfig 变量,然后我所有的应用程序也会更改语言。

我在 TodoApp 中有 FormattedMessages,我的两条 JSON 消息是这样填充的:

// i18n/locales/en.json
{
  "footer.add.placeholder": "Enter a name ...",
  "footer.add.priority0.text": "No priority",
  "footer.add.priority1.text": "Priority 1",
   ...
}

你知道我的代码遗漏了什么吗??也许我对 React-Intl 的理解有些不对。任何建议都会有所帮助,谢谢。

最佳答案

如果您从根目录中删除所有内容,它会起作用:

ReactDOM.render(<TodoApp />, document.getElementById('root'));

但是现在我们像这样更改 TodoApp 组件:

1) 我们添加“locale”作为组件状态并导入 React-Intl:

import { IntlProvider, addLocaleData } from 'react-intl';
import intlEN from 'react-intl/locale-data/en';
import intlES from 'react-intl/locale-data/es';
import intlMessagesES from './../i18n/locales/es.json';
import intlMessagesEN from './../i18n/locales/en.json';

addLocaleData([...intlEN, ...intlES]);

/* Define your default translations */
let i18nConfig = {
    locale: 'en',
    messages: intlMessagesEN
};

2) 更改我们的 changeLanguage 函数(这次称为“onChangeLanguage”),此函数从子组件语言选择器接收“lang”:

onChangeLanguage(lang) {
        switch (lang) {
            case 'ES': i18nConfig.messages = intlMessagesES; break;
            case 'EN': i18nConfig.messages = intlMessagesEN; break;
            default: i18nConfig.messages = intlMessagesEN; break;
        }
        this.setState({ locale: lang });
        i18nConfig.locale = lang;
}

最后渲染:

render() {
        return (
            <IntlProvider key={ i18nConfig.locale } locale={ i18nConfig.locale }  messages={ i18nConfig.messages }>
                <div>
                    <Header onChangeLanguage={this.onChangeLanguage} />
                    // Other components ...
                </div>
            </IntlProvider>
        );
    }

如果有人根本不明白,请在评论中提问!感谢@TomásEhrich

关于javascript - React-Intl 如何从变量切换语言环境和消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44635584/

相关文章:

javascript - 从 1 到 100,如果是 3 的倍数则打印 "ping",如果是 5 的倍数则打印 "pong",否则打印数字

javascript - 只有某些跨源请求使用 npm cors() 工作

javascript - 获取 ES6 中值的类型

javascript - jquery 的append()中出现意外的字符串

javascript - 我如何进行同步 ReactDOM.render

javascript - Electron main.js NODE_ENV 不可用

javascript - 浅克隆 Map 或 Set

javascript - ES6 构造函数对象参数默认值

javascript - 通过javascript将onkeyup和blur应用到文本框

javascript - 使用 react-router-redux 访问参数