国際化の使用方法
Nexty.devはnext-intl
ライブラリを使用して完全な多言語サポートを実装し、ルートレベルの言語切り替え、自動言語検出などの機能を含む柔軟な国際化ソリューションを提供します。
このドキュメントを通じて、next-intl
の基本的な使用方法、新しい言語と翻訳コンテンツを拡張する方法、そしてNexty.devがサポートする高度な多言語機能について学習できます。
ファイル構造
i18n/
├── messages/ # 翻訳ファイルディレクトリ
│ ├── en/ # 英語翻訳
│ │ └── common.json
│ ├── zh/ # 中国語翻訳
│ │ └── common.json
│ └── ja/ # 日本語翻訳
│ └── common.json
├── request.ts # next-intlリクエスト設定
└── routing.ts # ルートと言語設定
components/
├── LocaleSwitcher.tsx # 言語切り替えコンポーネント
└── LanguageDetectionAlert.tsx # 言語検出アラートコンポーネント
stores/
└── localeStore.ts # 言語状態管理
middleware.ts # ミドルウェア設定
next.config.mjs # Next.js設定
基本的な使用方法
コンポーネントでの翻訳使用
フロントエンドコンポーネントでは、useLocale
を使用して現在の言語を取得し、useTranslations
を使用して翻訳コンテンツを取得します。
import { useLocale, useTranslations } from 'next-intl';
export default function MyComponent() {
const locale = useLocale();
const t = useTranslations('Home');
return (
<div>
<h1>{t('title')}</h1>
<p>{t('description')}</p>
</div>
);
}
サーバーコンポーネントでの使用
サーバーコンポーネントでは、getLocale
を使用して現在の言語を取得し、getTranslations
を使用して翻訳コンテンツを取得します。
import { getLocale, getTranslations } from 'next-intl/server';
export default async function ServerComponent() {
const locale = await getLocale();
const t = await getTranslations('Home');
return (
<div>
<h1>{t('title')}</h1>
</div>
);
}
注目すべき点
サーバーコンポーネントが
async
を使用していない場合は、useLocale
とuseTranslations
を使用することもでき、next-intl
が自動的に処理します。
パラメータ付き翻訳の使用
JSONファイル内:
{
"welcome": "ようこそ、{name}さん!",
"countdown": "{countdown}秒後に閉じます"
}
コンポーネント内:
const message = t('welcome', { name: 'John' });
const timer = t('countdown', { countdown: countdown.toString() });
生データの使用
複雑なデータ構造(配列、オブジェクトなど)にはt.raw()
を使用します:
const headerLinks = t.raw('Header.links') as HeaderLink[];
const features = t.raw('Landing.Features.items');
国際化Linkコンポーネント
@/i18n/routing
が公開するLink
コンポーネントを使用します。href
に言語プレフィックスを記述する必要はありません。next-intl
が現在の言語に基づいて自動的に処理します。
import { Link as I18nLink } from '@/i18n/routing';
<I18nLink href="/about">
{t('aboutUs')}
</I18nLink>
国際化useRouter
@/i18n/routing
が公開するuseRouter
コンポーネントを使用します。同様に、言語プレフィックスを記述する必要はありません。next-intl
が現在の言語に基づいて自動的に処理します。
import { useRouter } from '@/i18n/routing';
const router = useRouter();
const handleClick = () => {
router.push('/dashboard');
};
新しい言語を追加する手順
ステップ1. 言語設定の修正
i18n/routing.ts
で新しい言語を追加します:
export const LOCALES = ['en', 'zh', 'ja', 'ko'] // 韓国語を追加
export const DEFAULT_LOCALE = 'en'
export const LOCALE_NAMES: Record<string, string> = {
'en': "English",
'zh': "中文",
'ja': "日本語",
'ko': "한국어", // 韓国語表示名を追加
};
ステップ2. 翻訳ファイルの作成
新しい言語ディレクトリと翻訳ファイルを作成します:
mkdir i18n/messages/ko
cp i18n/messages/en/common.json i18n/messages/ko/common.json
ステップ3. コンテンツの翻訳
i18n/messages/ko/common.json
を編集し、すべての英語コンテンツを韓国語に翻訳します。
ステップ4. ルートリダイレクトの更新(オプション)
必要に応じて、next.config.mjs
に対応するリダイレクトルールを追加します:
{
source: "/ko/dashboard",
destination: "/ko/dashboard/settings",
permanent: true,
}
マルチファイル翻訳アーキテクチャ
翻訳コンテンツが多い場合、翻訳ファイルを複数のモジュールに分割することを推奨します:
モジュラーファイル構造の作成
i18n/messages/en/
├── common.json # 共通翻訳
├── Landing.json # 認証関連
├── Dashboard.json # ダッシュボード
└── Blog.json # ブログ
request.ts設定の修正
import { getRequestConfig } from 'next-intl/server';
import { routing } from './routing';
export default getRequestConfig(async ({ requestLocale }) => {
let locale = await requestLocale;
if (!locale || !routing.locales.includes(locale as any)) {
locale = routing.defaultLocale;
}
// すべての翻訳ファイルを動的にインポート
const common = (await import(`./messages/${locale}/common.json`)).default;
const Landing = (await import(`./messages/${locale}/Landing.json`)).default;
const Dashboard = (await import(`./messages/${locale}/Dashboard.json`)).default;
const Blog = (await import(`./messages/${locale}/Blog.json`)).default;
return {
locale,
messages: {
...common,
Landing,
Dashboard,
Blog,
}
};
});
名前空間の使用
// 特定の名前空間を使用
const t = useTranslations('Dashboard.User.Settings');
const tLanding = useTranslations('Landing');
const tBlog = useTranslations('Blog');
ファイル組織の推奨事項
// common.json - サイト全体共通
{
"header": {...},
"footer": {...},
"common": {...}
}
// Landing.json - ランディングページ
{
"login": {...},
"register": {...},
"forgotPassword": {...}
}
// Dashboard.json - ダッシュボードモジュール
{
"sidebar": {...},
"settings": {...},
"profile": {...}
}
Nexty.devの高度な機能
言語検出とアラート
ユーザーが初回訪問時にシステムが自動的にブラウザ言語を検出します。現在のWebサイト言語と一致しない場合、切り替え促進画面が表示されます:
- 10秒カウントダウンで自動クローズ
- ユーザーが手動でクローズ可能
- クローズ状態を30日間保存(Cookieを通じて)
Cookie有効期間内に再度Webサイトを訪問すると、言語が自動的に切り替わります。
SEO最適化
各言語版は独立したURLとメタデータを生成します:
import { constructMetadata } from "@/lib/metadata";
export async function generateMetadata({ params }: MetadataProps): Promise<Metadata> {
const { locale } = await params;
const t = await getTranslations({ locale, namespace: "Home" });
return constructMetadata({
page: "Home",
title: t("title"),
description: t("description"),
locale: locale as Locale,
path: `/`,
});
}