Next.jsのnext-translateでi18nの多言語対応
前置き
入社3ヶ月目の駆け出しフロントエンドエンジニアによる備忘録です。
Next.js プロジェクトで実装する i18n の多言語対応についての記事となります。
◎ 今回やってみたいこと
今回は、Next.js アプリケーション内で多言語対応機能を提供するための拡張ライブラリ next-translate
を導入して Next.js プロジェクトの多言語対応 を実現してみたいと思います。
next-translate ライブラリの主な機能
next-translate
ライブラリが提供する主な機能は以下のとおりです。
- 多言語翻訳ファイルの管理
- コンポーネントごとに、翻訳後の文字列を取得する
useTranslation
フック - 言語切り替えリンクの作成
- ユーザーの言語設定に基づいた自動リダイレクト
- サーバーサイドレンダリング(SSR)時の言語検出とローカリゼーション
実装に必要な準備
next-translate
ライブラリの実装には、next.config.mjs
ファイルの設定と、
ライブラリ機能をビルド時に統合するための Next.js プラグイン next-translate-plugin
のインストールが必要です。
◎ 使用技術と環境
項目 | 選択した技術 | バージョン |
---|---|---|
OS | MacOS | Sonoma 14.4 |
フレームワーク | Next.js | 14.1.3 |
言語 | TypeScript | ^5 |
ライブラリ | next-translate | 2.6.2 |
プラグイン | next-translate-plugin | 2.6.2 |
◎ さっそくやってみよう
ライブラリのインストール
まずターミナルで多言語対応させたいプロジェクトのディレクトリまで移動し、そこで next-translate
ライブラリをインストールします。
cd your-next-app
npm install next-translate
うまくインストールできていれば package.json
の "dependencies"
フィールドに "next-translate": "^2.6.2"
などの記載が自動で追加されます。
プラグインのインストール
続いて、next-translate-plugin
をインストールします。
npm install --save-dev next-translate-plugin
先程のライブラリと同様に、うまくインストールができていれば package.json
の "devDependencies"
フィールドに "next-translate-plugin": "^2.6.2"
のような表記が自動で追加されています。
next.confing.mjs の設定
next.config.json
で next-translate-plugin
をインポートし、Next.js プロジェクトを多言語対応化するための設定を行っていきます。
+ import nextTranslate from 'next-translate-plugin';
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
};
- export default nextConfig;
+ export default nextTranslate(nextConfig); // Next.jsの設定オブジェクトに、多言語対応の設定を組み込む役割
i18n.jsonの作成と設定
next.config.json
の設定が完了したら、次はルートディレクトリに i18n.json
ファイルを新規作成します。中身は以下の通りです。
+ {
+ "locales": ["en", "ja"],
+ "defaultlocale": "ja",
+ "pages": {
+ "*": ["common"],
+ "/": ["top"]
+ }
+ }
翻訳ファイルを作成
ルートディレクトリに以下の翻訳ファイルを順番に追加して下さい。
ファイルパスは ./locales/言語/翻訳ファイル
となるようにフォルダを作成して下さい。
+ {
+ "TITLE": "日本語"
+ }
+ {
+ "TITLE": "English"
+ }
+ {
+ "TITLE": "トップページ"
+ "HEADING": "こんにちは、世界!"
+ }
+ {
+ "TITLE": "TOP-Page"
+ "HEADING": "Hello World!"
+ }
上記の通りにファイルを作成すれば、ディレクトリ構造は以下のようになります。
./locales/
├── en/
│ ├── common.json
│ └── top.json
└── ja/
├── common.json
└── top.json
各種ページへの翻訳ファイルの読み込み
それでは、ページに先程作成した翻訳ファイルの情報を読み込んでいきます。
import Head from 'next/head';
+ import useTranslation from 'next-translate/useTranslation';
次に言語を切り替えたい箇所に t
関数を使って翻訳ファイルの情報を埋め込んでいきます。
export default function App({ Component, pageProps, router }: AppProps) {
+ const { t } = useTranslation('common');
return (
<>
<Head>
+ <title>{t('TITLE')}</title>
</Head>
<Component key={router.asPath} {...pageProps} />
</>
);
}
これでタブに 日本語 または English と表示されます。
export default function Top() {
+ const { t } = useTranslation('top');
return (
<>
<main>
+ <h2>{t('HEADING')}</h2>
</main>
</>
);
}
これでトップページに こんにちは、世界! または Hello World! と表示されます。
localhost:3000 で動作確認
無事翻訳ファイルの情報をインポートできたら、ローカルホストでサブパスごとに言語の表示を切り替えができているかどうかを確認します。
npm run dev
開発用サーバーを立ち上げたら、http://localhost:3000/ にアクセスします。
そこで http://localhost:3000/ または http://localhost:3000/ja にて、タブが 日本語 となっており、画面に こんにちは、世界! と表示されていることを確認して下さい。
同様に http://localhost:3000/en にて、タブが English となっており、画面に Hello World! と表示されていることを確認して下さい。
以上で簡単にではありますが、Next.js プロジェクトの i18n 多言語対応 を実現できました。
最後に
公式ドキュメントを見てみると、どうやら引数で変数を渡して翻訳ファイルの情報をページ側で操作することも可能なようです。また、const { t, lang } = useTranslation('common')
とすれば、lang
にて現在表示されている言語の情報を取得することもできるみたいですね。
これからも少しずつ next-translate
の機能について勉強していき、ある程度知見がまとまったタイミングで改めて記事にしたいと思います。
参考
Next.jsプラグイン next-translate
のドキュメント
Next.jsで多言語対応のサイトを作るのが簡単すぎた件
next-i18nextの多言語化の設定と日本語をルートにするまで
【SSG】Next.jsで多言語対応のサイトを作るのが簡単ではなかった件
【Next.js + TypeScript】多言語対応(i18n)のやり方
Discussion