Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

react-intl-redux

ratson53.3kMIT2.4.1TypeScript support: definitely-typed

Redux binding for React Intl

react, reactjs, react-intl, react-redux, intl, i18n, redux

readme

React Intl Redux

Redux binding for React Intl.

Building idiomatic React Redux Application by having translations in store and dispatching action to update it.

Installation

npm install react-intl-redux react react-intl react-redux redux --save

Usage

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'))

Provide locale and messages on load

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.

Switch locale and messages on request

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.

Provider vs IntlProvider

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>
)

Formatting Data

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,
}))

Use with redux-immutable

See the usage in test.

Examples

There are some examples under the examples folder for reference.

Troubleshooting

  1. 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 in props.
    • Set key when dispatching updateIntl.
    • Provide custom intlSelector for IntlProvider.
  2. How to use intl in asynchronous action?

    A simple solution would be retrive intl object using injectIntl and pass it in the action payload.

changelog

Next

v2.3.0

  • Added support for react-intl@^4.0.0 and react-intl@^5.0.0
  • Updated peerDependencies

v2.1.1

  • Include react-redux@^7.0.0" in peerDependencies

v2.1.0

  • Include react-redux@^6.0.0" in peerDependencies

v2.0.2

  • Rebuild lib

v2.0.1

  • Use .babelrc, close #50

v2.0.0

Breaking Changes
  • Use locale as key for IntlProvider by default.

v1.0.0

Enhancements
  • Set sideEffects to false for webpack

v0.7.0

Breaking Changes
  • Remove deprecated update action, updateIntl should always be used
  • Remove key hack, see #7
Documentation

v0.6.0

Breaking Changes
Internal
  • Change to use ava for testing
  • Update example to use create-react-app

v0.5.0

  • React 15.5 compatibility

v0.4.1

  • Remove usage of storeShape

v0.4.0

Breaking Changes
  • Change react-intl, react-redux, redux to be peerDependencies

v0.3.0

Breaking Changes
  • Update react-redux from ^4.4.6 to ^5.0.1
  • Remove unnecessary React propTypes from the production build
Enhancements
  • Export initialState

v0.2.0

Breaking Changes
  • Update redux from ^3.5.2 to ^3.6.0
Enhancements
  • IntlProvider accept optional intlSelector function

v0.1.1

Deprecations
  • Warn for usage of update

v0.1.0

Breaking Changes
  • Do not accept props for Provider
General
  • Export IntlProvider
Deprecations
  • Deprecate update in favor of updateIntl