Reactで多言語対応する

こんにちは、たかしです。

Reactで多言語対応をする機会があったので、方法についてまとめます。

react-i18next を使います。

create-react-appで作ったプロジェクトをいじっていきます。

また、今回書いたコードはgithubに上げてます。

takashiTkg/i18n-sample

準備

とりあえずcreate-react-appします。

npx create-react-app i18n-sample 今回使うreact-i18nextと必要なライブラリを追加します。

1
yarn add react-i18next i18next i18next-browser-languagedetector i18next-http-backend

言語ファイルの作成

プロジェクトのpublicフォルダ内に言語ファイルを配置していきます。

日本語ファイルから

public/locales/ja/translation.json
1
2
3
4
5
6
{
 "sample":{
 "text1": "テキスト1",
 "text2":"テキスト2"
 }
}

次は英語ファイル

public/locales/en/translation.json
1
2
3
4
5
6
{
 "sample":{
 "text1": "text1",
 "text2":"text2"
 }
}

設定ファイル(i18n.js)の作成

プロジェクトのsrcフォルダ内にi18n.jsを作成します。

設定を記述していきます。

基本的に公式のものを丸パクリです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import i18n from 'i18next';
import Backend from 'i18next-http-backend';
import LanguageDetector from 'i18next-browser-languagedetector';
import { initReactI18next } from 'react-i18next';

i18n
 .use(Backend)
 .use(LanguageDetector)
 .use(initReactI18next)
 .init({
 fallbackLng: 'en',
 debug: true,

 interpolation: {
 escapeValue: false, // not needed for react as it escapes by default
 },
 });

export default i18n;
設定ファイルをindex.js内でインポートします。


import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
// i18n
import './i18n';

ReactDOM.render(
 <React.StrictMode>
 <App />
 </React.StrictMode>,
 document.getElementById('root')
);

言語切替の実装

hooksで書けるので楽に使えます。

App.jsを編集していきます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import logo from './logo.svg';
import './App.css';
import { useTranslation } from 'react-i18next';

const App = () => {
 const { t, i18n } = useTranslation();

 const changeLanguage = (lang) => {
 i18n.changeLanguage(lang);
 }

 return (
 <div className="App">
 <header className="App-header">
 <img src={logo} className="App-logo" alt="logo" />
 <p>
 {t('sample.text1')}
 </p>
 <p>
 {t('sample.text2')}
 </p>
 <div>
 <button onClick={() => changeLanguage('en')}>
 English
 </button>
 <button onClick={() => changeLanguage('ja')}>
 日本語
 </button>
 </div>
 </header>
 </div>
 );
}

export default App;

t('sample.text1')のようにすると囲んだ部分が翻訳されます。

i18n.changeLanguage('ja'); のように言語切替できるようになります。

まとめ

SSRをする場合やクラスコンポーネントを使いたい場合などは公式のドキュメントにきちんと書いてあるので読んでみてください。

思ったより簡単に実装できて良かったです。

Home