Redux binding for React Intl.
Building idiomatic React Redux Application by having translations in store and dispatching action to update it.
npm install react-intl-redux react react-intl react-redux redux --save
import React from 'react' import ReactDOM from 'react-dom' import { createStore, combineReducers } from 'redux' import { FormattedNumber } from 'react-intl' import { Provider, intlReducer } from 'react-intl-redux' import reducers from '<project-path>/reducers' const reducer = combineReducers({ ...reducers, intl: intlReducer, }) const store = createStore(reducer) const App = () => ( <Provider store={store}> <FormattedNumber value={1000} /> </Provider> ) ReactDOM.render(<App />, document.getElementById('container'))
You should provide a different locale
and messages
if your user is not using en
locale.
const initialState = { intl: { locale: 'it', messages: { 'app.greeting': 'Ciao!', }, }, // ...other initialState } const store = createStore(reducer, initialState)
Refer to the initial-locale
example for more details.
You could also switch locale
on user's request by dispatching updateIntl
action.
import { updateIntl } from 'react-intl-redux' store.dispatch(updateIntl({ locale, messages, }))
React Intl in browsers only contain locale data for basic English by default, see Loading Locale Data for loading locale data in browsers.
In most cases, react-intl-redux
will be wrapped immediately after Provider
from react-redux
. For convenient, react-intl-redux
provides Provider
to do that for you.
However, if you don't want it, you could do it manually via IntlProvider
. For example,
import React from 'react' import { IntlProvider } from 'react-intl-redux' import { Provider } from 'react-redux' const App = () => ( <Provider store={store}> <IntlProvider> <App /> </IntlProvider> </Provider> )
react-intl
provides two ways to format data, see the official docs.
To change formats
through React components,
import { updateIntl } from 'react-intl-redux' store.dispatch(updateIntl({ locale, formats, messages, }))
See the usage in test.
There are some examples under the examples
folder for reference.
- Why my connected component does not update after locale change?
By default, locale
is used as key
for IntlProvider
, which will trigger re-render when locale changes, things should just work.
If it doesn't, here are few solutions could be tried,
- Do a
forceUpdate
after changing locale. - Mark the connecting compoent
{pure: false}
. - Pass
locale
inprops
. - Set
key
when dispatchingupdateIntl
. - Provide custom
intlSelector
forIntlProvider
.
- How to use
intl
in asynchronous action?
A simple solution would be retrive intl
object using injectIntl
and pass it in the action payload.