React-intlで多言語化 ~ Redux + redux-sagaで言語設定をredux内で取得する
react-intelを使うとサイトの多言語化がいいかんじにできます。 ただ、reduxの処理内に書いたテキストを翻訳するためのAPIとかはありません。redux向けに作られたものではないので当然ですよね。 reduce […]
広告ここから
広告ここまで
目次
react-intelを使うとサイトの多言語化がいいかんじにできます。
ただ、reduxの処理内に書いたテキストを翻訳するためのAPIとかはありません。redux向けに作られたものではないので当然ですよね。
reducerに言語設定を入れる
とりあえずredux内で扱えるようにデータを入れましょう。まずはアクションを作ります。
export function updateLanguage(lang = 'ja') {
return {
type: 'UPDATE_LANG',
lang,
};
}
続いてreducerを用意します
export function lang(state = 'ja', action) {
switch (action.type) {
case 'UPDATE_LANG':
return action.lang;
default:
return state;
}
}
combineReducers
もわすれずに。
const rootReducer = combineReducers({
router: routerReducer,
intl: intlReducer,
lang:
})
初期設定をreducerに保存する
configureStore
で言語の初期設定を行いますので、以下のようにしてactionを発行しておきましょう。
const initialLang = 'ja'; const initialState = { intl: { defaultLocale: initialLang, locale: initialLang, messages: messages[initialLang], }, }; const store = configureStore(initialState); store.dispatch(updateLanguage(initialLang));
redux-sagaのselectで取得する
redux-sagaにはselectでreducerにストアされた値にアクセスできます。
以下のようなjsファイルを用意しておきましょう。
export const langSelector = state => state.lang;
あとはsagaの中でyield select(langSelector)
のようにすればOKです。
取得した値を使ってメッセージを出し分けましょう。
export function * example() {
while (true) {
yield take('EXAMPLE_ACTION')
const lang = yield select(langSelector)
if (lang === 'ja') {
console.log('日本語')
} else {
console.log('English')
}
}
}
おわりに
正直あまりスマートな感じはしてません。が、とりあえずこれで目的は達成できるので、いい感じのライブラリが見つかるまではこれで頑張ろうと思います。