Open1
【React】多言語対応調査

多言語対応調査
ライブラリ
- Reactで多言語対応を実装する方法として、react-i18nextライブラリを使用することが多い
- i18nextをベースとしたReact/React Native用の国際化フレームワークである
ライセンス
実装方法
- ライブラリのインストール
- 下記のコマンドで、i18nextの依存関係をインストールする。
npm install i18next react-i18next
i18next:^22.5.1
react-i18next:^15.0.1
- 設定ファイルの作成
- 例として、src/i18n ディレクトリ配下にconfig.tsファイルを作成する。
// src/i18n/config.ts
import { initReactI18next } from 'react-i18next';
import i18n from 'i18next';
i18n.use(initReactI18next).init({
fallbackLng: 'en', // デフォルトの言語を設定
reaturnEmptyString: false, // 空文字での定義を許可に
resources: {} // 翻訳ファイルを設定する
});
export default i18n;
- 翻訳ファイルの作成
- src/i18n/locales/に英語と日本語用の翻訳ファイルをそれぞれ作成する。
// src/i18n/locales/en/hoge.json
{
"hoge": "Hoge",
"huga": "Fuga",
"a": {
"aa": "Aa",
"aaa": "Aaa",
}
}
// src/i18n/locales/ja/hoge.json
{
"hoge": "ほげ",
"huga": "ふが",
"a": {
"aa": "ああ",
"aaa": "あああ",
}
}
- 設定ファイルで翻訳ファイルを読み込む
// src/i18n/config.ts
import { initReactI18next } from 'react-i18next';
import i18n from 'i18next';
import hoge_en from './locales/en/hoge.json'
import hoge_ja from './locales/ja/hoge.json'
i18n.use(initReactI18next).init({
fallbackLng: 'en', // デフォルトの言語を設定
reaturnEmptyString: false, // 空文字での定義を許可に
resources: {
// 辞書情報
// 用意した翻訳ファイルを読み込む
en: {
hoge: hoge_en,
},
ja: {
hoge: hoge_ja
},
} // 翻訳ファイルを設定する
});
export default i18n;
- index.tsで設定ファイルを読み込む
import React from 'react';
import { createRoot } from 'react-dom/client';
import './index.css';
import App from './App';
// import i18n (needs to be bundled ;))
import './i18n';
const root = createRoot(document.getElementById('root'))
root.render(
<React.StrictMode>
<App />
</React.StrictMode>
);
- tsconfig.jsonに設定を追加する。
// TypeScriptはデフォルトでJSONファイルの型検証をサポートしていないため、下記設定でJSONファイルの読み込みを許可する
"resolveJsonModule": true
- コンポーネントで文言の設定を行う。
import { useTranslation } from 'react-i18next';
const AaaComponent = () => {
const { t } = useTranslation(['hoge']); // 使用する翻訳ファイルを設定する。
…
<div className="flex justify-center space-x-2">
<Button onClick={stopSound}>{t('hoge.hoge')}</Button> //翻訳ファイルで設定した文言
</div>
上記のような記載を行うことで、デフォルトに設定した言語(この例では英語が適用される。)
言語切替
- 切り替えボタンの追加
- アプリ起動後は、config.tsで設定したデフォルトの言語が適用されるが、ユーザーによって言語を変えたい場合もあるため、言語切替機能を作成する。
import { useTranslation } from 'react-i18next';
...
type Resource {
[key: string]: {
nativeName: string;
}
}
const lngs: Resource = {
en: { nativeName: 'English' },
ja: { nativeName: 'Japanese' },
};
...
const AaaComponent = () => {
const { i18n } = useTranslation();
…
return(
// 下記のような感じで言語切替ボタンを設置し、changeLanguage関数で言語を切り替える。
{Object.keys(lngs).map(lng => (
<button key={lng} type="button" onClick={() => i18n.changeLanguage(lng)}>
{lngs[lng].nativeName}
</button>
))}
)
翻訳キーを自動で抽出する
- 参考: https://zenn.dev/aldagram_tech/articles/2551d2a969829a#翻訳キーを自動で抽出するための設定
- ライブラリ: babel-plugin-i18next-extract
実装方法
-
関連プラグインをインストールする。
npm i --save-dev babel-plugin-i18next-extract @babel/cli @babel/preset-react @babel/preset-typescript -
babel.config.tsファイルを作成する。
- locales: 外部JSONに書き出す言語の定義
- outputPath: 抽出された翻訳キーを書き出すファイルの指定
- discardOldKeys: ビルド時に既存のキー(メッセージ)が見つからない場合に、それらを破棄するかどうかのフラグ
- keySeparator:
- キーを分割するために使用したい文字列の設定方法。デフォルトは'.'
- キーを分割したくない場合やキーをそのまま値として使用したい場合は、nullに設定する。
- 英文を翻訳キーにしているときに有効な設定。
- 今回は翻訳ファイルを複数作成できるようにするため、':'でネームスペースとキーを分割する。
// src/i18n/babel.config.json
{
"presets": ["@babel/preset-typescript", "@babel/preset-react"],
"plugins": [
[
"i18next-extract",
{
"locales": ["en", "ja"],
"keySeparator": ':',
"outputPath": "./src/i18n/locales/{{locale}}/{{ns}}.json",
"discardOldKeys": false,
}
]
];
return {
presents,
plugins
}
}
- package.jsonに設定を加える。
// package.json
{
"scripts": {
...
"i18next-extract": "babel --config-file ./src/i18n/babel.conifg.ts" './src/**/*.{js,jsx,ts,tsx}'"
},
- コンポーネントに翻訳キーを設定
import { useTranslation } from 'react-i18next';
const AaaComponent = () => {
const { t } = useTranslation(['hoge', 'fuga']); // 使用する翻訳ファイルを配列で設定する。今回'fuga'は使わないため、記載しなくても良い
…
<div className="flex justify-center space-x-2">
<Button onClick={stopSound}>{t('hoge:ふが')}</Button> // 使用する設定ファイルとキー名を':'で区切って記載する。
</div>
- コマンドを実行
npm run i18next-extractを実行するとbabel.config.tsのoutputPathで指定したパスにファイルが作成される。ファイル名は、':'の前のネームスペースが適用される。
//hoge.json
{
"ほげ": ""
}
- 翻訳ファイルに翻訳を追加する。
npm run i18next-extractを実行すると、英語と日本語それぞれの翻訳ファイルが作成されるため、それぞれに翻訳を追加する。