2016-03-03 11 views

risposta

7

Ho affrontato lo stesso problema e questo è quello che ho scoperto:

Per cambiare la lingua che ho usato soluzione fornita here, che è fondamentalmente vincolante IntlProvider a ReduxStore con funzione Connect. Inoltre, non dimenticare di includere la chiave per ri-rendering dei componenti sul cambio di lingua. Questo è fondamentalmente tutto il codice:

Questo è ConnectedIntlProvider.js, si lega solo difetto IntlProvider (si noti il ​​puntello chiave che manca nel commento originale su GitHub)

import { connect } from 'react-redux'; 
import { IntlProvider } from 'react-intl'; 

// This function will map the current redux state to the props for the component that it is "connected" to. 
// When the state of the redux store changes, this function will be called, if the props that come out of 
// this function are different, then the component that is wrapped is re-rendered. 
function mapStateToProps(state) { 
    const { lang, messages } = state.locales; 
    return { locale: lang, key: lang, messages }; 
} 

export default connect(mapStateToProps)(IntlProvider); 

E poi nel file punto di ingresso:

// index.js (your top-level file) 

import ConnectedIntlProvider from 'ConnectedIntlProvider'; 

const store = applyMiddleware(thunkMiddleware)(createStore)(reducers); 

ReactDOM.render((
    <Provider store={store}> 
    <ConnectedIntlProvider> 
     <Router history={createHistory()}>{routes}</Router> 
    </ConnectedIntlProvider> 
    </Provider> 
), document.getElementById(APP_DOM_CONTAINER)); 

La prossima cosa da fare è quella di implementare solo riduttore per la gestione locale e fare creatori di azione per cambiare la lingua su richiesta.

Per quanto riguarda il modo migliore per archiviare le traduzioni - Ho trovato molte discussioni su questo argomento e la situazione sembra essere abbastanza confusa, onestamente sono abbastanza sconcertato che i produttori di react-intl si concentrino tanto sui formati di data e numero e dimenticano traduzione. Quindi, non conosco il modo assolutamente corretto per gestirlo, ma questo è quello che faccio:

Creare la cartella "locales" e all'interno creare un sacco di file come "en.js", "fi.js", "ru.js", ecc. Fondamentalmente tutte le lingue con cui lavori.
In ogni esportazione oggetto JSON file con le traduzioni di questo tipo:

export const ENGLISH_STATE = { 
    lang: 'en', 
    messages: { 
     'app.header.title': 'Awesome site', 
     'app.header.subtitle': 'check it out', 
     'app.header.about': 'About', 
     'app.header.services': 'services', 
     'app.header.shipping': 'Shipping & Payment', 
    } 
} 

Altri file hanno stessa struttura esatta, ma con le stringhe tradotte all'interno.
Quindi nel riduttore responsabile della modifica della lingua importare tutti gli stati da questi file e caricarli in un nuovo negozio non appena vengono inviate le azioni per cambiare lingua. Il componente creato nel passaggio precedente propagherà le modifiche a IntlProvider e si verificherà una nuova locale. Pubblicalo a pagina usando <FormattedMessage> o intl.formatMessage({id: 'app.header.title'})}, leggi di più su questo al wiki di github.
Hanno una funzione DefineMessages lì, ma sinceramente non sono riuscito a trovare alcuna informazione valida su come usarlo, in pratica puoi dimenticarlo ed essere OK.

+0

In mobx è possibile utilizzare https://github.com/Sqooba/mobx-react-intl –

Problemi correlati