0
私は、ルートの変更時にページの翻訳を動的に読み込みます。私は各ルートに対してonEnterを使って行った。React-RouterとReact-Intl:翻訳のルートを動的に読み込むためのより良い方法はありますか?
これを実装するより良い方法はありますか?各ルートにonEnterコールバック関数を使用することを避けることはできますか?
var Root = React.createClass({
baseTranslations : {},
getInitialState: function(){
return {
lang: 'it',
translations: null,
};
},
componentWillMount: function() {
// load the common translation for all routes
this.setState({
lang: this.getLocale().lang
});
this.loadTranslation("base");
},
onChangeRoute: function(nextState, replace){
// load the specific route's translation
this.loadTranslation(nextState.location.pathname);
},
getLocale: function(what){
// return lang and user region (ex: it-IT)
},
loadTranslation: function(route){
var lcl = route;
var mapping = {
'/' : 'home',
'auth' : 'dashboard'
};
if(route in mapping){
lcl = mapping[route];
}
$.ajax({
url: './locales/' + this.state.lang +'/' + lcl + '.json',
dataType: "text",
}).done(function(res) {
if(lcl === "base"){
this.baseTranslations = JSON.parse(res);
}
this.setState({
translations: $.extend(true, this.baseTranslations, JSON.parse(res))
});
}.bind(this));
},
render: function() {
var children;
if (this.state.translations) {
children = (
<IntlProvider locale={this.state.lang} messages={this.state.translations}>
<Router history={browserHistory}>
<Route path="/" component={App}>
<IndexRoute component={Home}/>
<Route path="signup" onEnter={this.onChangeRoute} getComponents={(location, cb) => {
require.ensure([], (require) => {
cb(null, require('./components/Signup.jsx'))
}, "Signup")
}} />
<Route path="*" component={NoMatch}/>
</Route>
</Router>
</IntlProvider>
);
}
return <div>{children}</div>;
}
});
ReactDOM.render(
<Root/>,
document.getElementById('rct-cont')
);
アプリケーションの状態をどのように管理しますか? 1つのオプションは、あなたの状態管理ソリューションにそれをプッシュし、オンデマンドでi18nを照会することです。 –
@bebraw Fluxで管理するつもりです – Webman
どのように翻訳を構造化しましたか?コードに基づいて、ルートごとにあるようです。翻訳する必要がない場合は、i18nデータ全体を1つのクエリで読み込むことができます。現在のソリューションをクリーンアップする場合は、Fluxストアにi18n状態をプッシュすることを検討できます。 –