🐻‍❄️

Next.jsのnext-translateでi18nの多言語対応

2024/03/18に公開

前置き

入社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.jsonnext-translate-plugin をインポートし、Next.js プロジェクトを多言語対応化するための設定を行っていきます。

next.config.mjs
+ 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 ファイルを新規作成します。中身は以下の通りです。

i18n.json
+ {
+   "locales": ["en", "ja"],
+   "defaultlocale": "ja",
+   "pages": {
+     "*": ["common"],
+     "/": ["top"]
+   }
+ }

翻訳ファイルを作成

ルートディレクトリに以下の翻訳ファイルを順番に追加して下さい。
ファイルパスは ./locales/言語/翻訳ファイル となるようにフォルダを作成して下さい。

./locales/ja/common.json
+ {
+   "TITLE": "日本語"
+ }
./locales/en/common.json
+ {
+   "TITLE": "English"
+ }
./locales/ja/top.json
+ {
+   "TITLE": "トップページ"
+   "HEADING": "こんにちは、世界!"
+ }
./locales/en/top.json
+ {
+   "TITLE": "TOP-Page"
+   "HEADING": "Hello World!"
+ }

上記の通りにファイルを作成すれば、ディレクトリ構造は以下のようになります。

./locales/
    ├── en/
    │   ├── common.json
    │   └── top.json
    └── ja/
        ├── common.json
        └── top.json

各種ページへの翻訳ファイルの読み込み

それでは、ページに先程作成した翻訳ファイルの情報を読み込んでいきます。

./src/pages/_app.tsxやindex.tsx
 import Head from 'next/head';
+  import useTranslation from 'next-translate/useTranslation';

次に言語を切り替えたい箇所に t 関数を使って翻訳ファイルの情報を埋め込んでいきます。

./src/pages/_app.tsx
 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 と表示されます。

./src/pages/index.tsx
 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 のドキュメント
https://github.com/aralroca/next-translate

Next.jsで多言語対応のサイトを作るのが簡単すぎた件
https://zenn.dev/steelydylan/articles/nextjs-with-i18n

next-i18nextの多言語化の設定と日本語をルートにするまで
https://qiita.com/akifumii/items/4f92d5fdff75471eda68

【SSG】Next.jsで多言語対応のサイトを作るのが簡単ではなかった件
https://qiita.com/ItsukiN32/items/19ab0bc94c591c5a157a

【Next.js + TypeScript】多言語対応(i18n)のやり方
https://btj0.com/blog/react/nextjs-i18n/

Discussion