国際化ガイド
Astro Plain の国際化(i18n)ガイド:翻訳関数の使い方、設定仕様、新しい言語の追加手順。
NOTE
本記事はAIを用いて翻訳されています。
機能概要
- スマートリダイレクト:Cookie またはブラウザの言語設定に基づいて、対応する言語のトップページへ自動的にリダイレクトします。
- Props 不要のコンテキスト注入:
ts-intl-astroを採用し、Astro コンポーネント間でlangをバケツリレーすることなく、直接useTranslationsやuseLocaleを利用できます。 - 多言語記事の自動リンク:サブディレクトリを作成することなく、Frontmatter の
translationKeyで各言語の記事を関連付け、適切な SEO タグ(canonical/hreflang)を自動生成します。
ファイル構成
ディレクトリi18n/
- index.ts 国際化の初期化とエクスポート
ディレクトリmessages/ 各言語の翻訳辞書
- zh-Hans.ts 中国語辞書
- en-US.ts 英語辞書
- ja-JP.ts 日本語辞書
ディレクトリsrc/content/
ディレクトリblog/ ブログ記事(
translationKeyでリンク)- …
ディレクトリauthor/ 著者情報(言語ごとにフォルダ分け)
- …
ディレクトリproject/ プロジェクト紹介(言語ごとにフォルダ分け)
- …
ディレクトリmdx/ その他の MDX コンテンツ(言語ごとにフォルダ分け)
ディレクトリ[lang]/
- hero.mdx ヒーローセクション
- astro.config.mjs Astro 設定(
tsIntl()統合を登録) - site.config.ts サイト共通設定
翻訳関数の使い方
本プロジェクトの国際化は ts-intl-astro (新しいタブで開く) を採用しており、Astro コンポーネントツリーに現在のロケールコンテキストを自動注入します。
基本的な使い方(名前空間のバインド)
コンポーネントで名前空間を指定して初期化すると、キー名を指定するだけで翻訳を取得できます:
---import { useTranslations } from "~/i18n";
// `common` 名前空間をバインドconst t = useTranslations("common");---
<header> <h1>{t("header_title")}</h1> <a href="/">{t("home")}</a></header>グローバル名前空間アクセス
引数なしで useTranslations を呼び出すと、ドット記法(namespace.key)で任意のエントリを取得できます:
---import { useTranslations } from "~/i18n";
const t = useTranslations();---
<p>{t("common.home")}</p><p>{t("search.placeholder")}</p>現在の言語コードの取得
多言語 URL の組み立てや外部コンポーネントへの受け渡しには、useLocale() を使用します:
---import { useLocale } from "~/i18n";
const lang = useLocale();---
<a href={`/${lang}/about`}>概要</a>パラメータの補間
辞書内の {param} プレースホルダーに対応する値をオブジェクトで渡します:
---import { useTranslations } from "~/i18n";
const t = useTranslations("common");// 辞書定義: link_to: "{title}へのリンク"---
<p>{t("link_to", { title: "Astro" })}</p>{/* 出力: Astroへのリンク */}コンポーネント外での呼び出し
API エンドポイント(rss.xml.ts)や静的パス生成(getStaticPaths)など、Astro コンテキストが存在しない環境では、言語コードを明示的に指定する getTranslations を使用します:
import { getTranslations } from "~/i18n";
const t = getTranslations("ja-JP", "common");const siteTitle = t("site_title");新しい言語の追加
サイトに新しい言語(例:フランス語 fr-FR)を追加する手順は以下の 4 ステップです:
-
サイト設定に言語マッピングを追加
site.config.tsのlanguageNameMapに新しい言語コードと表示名を追加します:site.config.ts const SiteConfig = {// ...languageNameMap: {"en-US": "English","ja-JP": "日本語","zh-Hans": "简体中文","fr-FR": "Français",},}; -
翻訳辞書ファイルを作成
i18n/messages/配下にfr-FR.tsを新規作成します。既存のファイルを複製して書き換えることを推奨します:i18n/messages/fr-FR.ts const frFR = {common: {home: "Accueil",about: "À propos",link_to: "Lien vers {title}",page_num: "Page {num}",// ... その他のキー},} as const;export default frFR; -
新しい辞書を登録
i18n/index.tsで辞書をインポートし、createAstroI18nに登録します:i18n/index.ts import zhHans from "./messages/zh-Hans";import enUS from "./messages/en-US";import jaJP from "./messages/ja-JP";import frFR from "./messages/fr-FR";export const {useTranslations,useLocale,useFormatter,getTranslations,// ...} = createAstroI18n({defaultLanguage: "zh-Hans",messages: {"zh-Hans": zhHans,"en-US": enUS,"ja-JP": jaJP,"fr-FR": frFR,},}); -
著者情報とヒーローコンテンツを追加
src/content/author/およびsrc/content/mdx/配下にディレクトリとファイルを作成します:src/content/author/fr-FR/default.mdxsrc/content/mdx/fr-FR/hero.mdx
多言語記事の執筆
すべてのブログ記事は言語ごとのサブディレクトリを作らず、src/content/blog/ に直接配置します。Frontmatter の translationKey に基づき、各言語バージョンが自動的に関連付けられます:
---title: "Astro Plain 介绍"summary: "博客模板介绍"translationKey: "my-first-post"language: "zh-Hans"date: "2026-09-01T12:00:00Z"isCanonical: true---文章中文内容...---title: "Introducing Astro Plain"summary: "Introduction to the blog template"translationKey: "my-first-post"language: "en-US"date: "2026-09-01T12:00:00Z"isCanonical: false---Post content in English...NOTE
translationKey:同じ記事のすべての言語バージョンで完全に同一のキーを使用してください。isCanonical:デフォルト言語バージョンでtrueを指定することで、正規リンク(canonicalおよびx-default)が正確に生成されます。