目次
概要
今期あのブログポストではTypeScript
をベースにしたNext.js
プロジェクトにnext-translate
を使って多言語をサポートする方法について説明します。
ここで紹介するソースコードは下記のリンクで確認できます。
ブログリスト
このブログポストはシリーズで作成されています。次はNext.js
のシリーズリストです。
- [Next.js] 始まる
- [Next.js] TypeScript
- [Next.js] Prettier
- [Next.js] 絶対パスでコンポーネント追加
- [Next.js] テスト
- [Next.js] Storybook
- [Next.js] Storybookのバックグラウンド変更
- [Next.js] 多言語
- [Next.js] MUI
TypeScriptベースのNext.jsプロジェクトを生成
TypeScript
が適用されたNext.js
プロジェクトでnext-translate
を使って多言語をサポートする方法を確認するため、次のコマンドを実行してTypeScript
が適用されたNext.js
プロジェクトを生成します。
npx create-next-app --typescript my-app
next-translateのインストール
Next.js
プロジェクトでnext-translate
を使って多言語をサポートするため、next-translate
をインストールする必要があります。次のコマンドを使ってnext-translate
をインストールします。
npm install --save next-translate
next-translateの設定
このようにインストールしたnext-translate
を使うため、next-translate
を設定する必要があります。まず、./next.config.js
ファイルを開いて次のように修正します。
const nextTranslate = require('next-translate');
module.exports = nextTranslate();
そして、./i18n.json
ファイルを生成して次のように修正します。
{
"locales": ["ja", "en", "ko"],
"defaultLocale": "en",
"localeDetection": false,
"pages": {
"*": ["common"]
}
}
今回のブログポストではja
(Japanese), en
(English), ko
(Korean)を支援する予定です。そして、基本言語はen
を設定しました。
{
"locales": ["ja", "en", "ko"],
"defaultLocale": "en",
...
}
Next.js
が自動でブラウザの言語を感知して当該言語を表示することを防止するため、localeDetection
をfalse
で設定しました。
{
...
"localeDetection": false,
...
}
next-translate
は全てのページで共通で使う言語セットと特定したページ飲みで使える言語セットを提供することができます。
{
...
"pages": {
"*": ["common"]
}
}
今回のブログでは全てのページ(*
)で共通で使える言語セットをcommon
に保存して提供する予定です。
言語ファイル
今度は多言語を提供するため言語ファイルを生成してみましょう。./locales/en/common.json
ファイルを開いて下記のように修正します。
{
"Japanese": "Japanese",
"English": "English",
"Korean": "Korean"
}
そして、./locales/ja/common.json
ファイルを生成して次のように修正します。
{
"Japanese": "日本語",
"English": "英語",
"Korean": "韓国語"
}
最後に、./locales/ko/common.json
ファイルを生成して次のように修正します。
{
"Japanese": "일본어",
"English": "영어",
"Korean": "한국어"
}
Next.jsで多言語をサポート
このように設定したnext-translate
を使ってNext.js
プロジェクトで多言語をサポートする方法について説明します。./pages/index.tsx
ファイルを開いて次のように修正します。
...
import useTranslation from 'next-translate/useTranslation';
const Home: NextPage = () => {
const { t } = useTranslation();
return (
<div className={styles.container}>
...
<main className={styles.main}>
...
<h2>{t('common:Japanese')}</h2>
<h2>{t('common:English')}</h2>
<h2>{t('common:Korean')}</h2>
...
</main>
...
</div>
);
};
next-translate
が提供するuseTranslation
フックのt
関数を使うと多言語を提供することができます。
t('common:Japanese')
t
関数を使う時にはどの言語ファイル(common
)のどの単語(Japanese
)を使うか渡す必要があります。
多言語確認
Next.js
で適用したnext-translate
が上手く動作してるか確認するため、次のコマンドを実行してNext.js
プロジェクトを実行します。
npm run dev
実行されたら、ブラウザでhttp://localhost:3000/
を開いてみると次のように多言語の基本言語であるen
が表示されることが確認できます。
他の言語も上手く表示されるか確認するためhttp://localhost:3000/ja
を開いてみると次のようにja
言語が上手く表示されることが確認できます。
次はhttp://localhost:3000/ko
を開いてみると次のようにko
言語が上手く表示されることが確認できます。
テスト
Next.js
に適用したnext-translate
をテストする方法について説明します。Next.js
にテスト環境を構築する方法については以前のブログポストを確認してください。
以前のブログポストで作成したテストコードは次のようになります。
import { render, screen } from '@testing-library/react';
import Home from '../../pages/index';
describe('Home', () => {
it('renders a heading', () => {
const { container } = render(<Home />);
const heading = screen.getByRole('heading', {
name: /welcome to next\.js!/i,
});
expect(heading).toBeInTheDocument();
expect(container).toMatchSnapshot();
});
});
このコードを次のコマンドを使って実行します。
npm run test
そしたらスナップショットテスト結果が./test/index/__snapshots__/index.test.tsx.snap
ファイルに保存されることが確認できます。このファイルを開いてみると次のように言語が上手く表示されないことが分かります。
<h2>
common:Japanese
</h2>
<h2>
common:English
</h2>
<h2>
common:Korean
</h2>
これを表示されて欲しい言語に変えるためには次のようにI18nProvider
と言語ファイルを提供する必要があります。
...
import commonEN from '../../locales/en/common.json';
import I18nProvider from 'next-translate/I18nProvider';
describe('Home', () => {
it('renders a heading', () => {
const { container } = render(
<I18nProvider lang="en" namespaces={{ common: commonEN }}>
<Home />
</I18nProvider>
);
...
});
});
このように修正してスナップショットテストをアップデートして、スナップショット結果ファイル(./test/index/__snapshots__/index.test.tsx.snap
)を再び開いてみると、次のように私たちが設定した言語が上手く表示されることが確認できます。
<h2>
Japanese
</h2>
<h2>
English
</h2>
<h2>
Korean
</h2>
完了
今回のブログポストではTypeScript
をベースにしたNext.js
プロジェクトでnext-translate
を使って多言語を提供する方法についてみてみました。また、Jest
を使うテスト環境でnext-translate
をテストする方法についても確認しました。
私のブログが役に立ちましたか?下にコメントを残してください。それは私にとって大きな大きな力になります!
アプリ広報
Deku
が開発したアプリを使ってみてください。Deku
が開発したアプリはFlutterで開発されています。興味がある方はアプリをダウンロードしてアプリを使ってくれると本当に助かります。