本文へ移動
aapp-hacks
← 記事一覧へ
著者
app-hacks
公開日
更新日
確認日

Astro / i18n / 多言語サイト

Astro標準i18nで日本語URLを維持する多言語サイト構築

Astro標準i18nで日本語を既定URL、英語を/en/に置く静的構成と、既存日本語URLを維持する設計を解説します。

Astro標準i18nで日本語URLを維持した多言語サイト構築

既に公開している日本語サイトへ英語版を追加するとき、URLをどう扱うかは後から直しにくい設計です。日本語ページを突然/ja/へ移すと、既存リンク、検索結果、共有済みURLをまとめて変更することになります。日本語を既定言語にするサイトでは、日本語URLをそのまま残し、英語版だけを/en/配下に置く構成が扱いやすくなります。

この記事では、AstroのファイルベースルーティングとContent Collectionsを使い、日本語を/、英語を/en/に分ける方法と、確認すべきポイントを説明します。

日本語は既定URL、英語はen配下に置く日英ルート対応図

URLの方針を先に固定する

この構成では、トップページと記事一覧のURLを次のように対応させます。

内容 日本語 英語
トップ / /en/
記事一覧 /blog/ /en/blog/
記事 /blog/slug/ /en/blog/slug/
固定ページ /about/ /en/about/

URLを決めるときは、記事IDと末尾スラッシュの方針も同時にそろえます。日英で同じ記事IDを使えば、言語切り替えリンクやhreflangの対応先を機械的に求めやすくなります。一方で、言語ごとに無関係なslugを付ける場合は、対応表を別に管理する必要があります。

ページを言語ごとに分ける

Astroでは、src/pages/のファイルがURLになります。日本語を既定URLに残す場合、日本語ページは通常の場所に置き、英語ページだけをsrc/pages/en/へ置きます。

src/pages/
├── index.astro
├── blog/
│   ├── index.astro
│   └── [...slug].astro
└── en/
    ├── index.astro
    └── blog/
        ├── index.astro
        └── [...slug].astro

画面の文言は、ナビゲーション、ページタイトル、フォームのラベル、エラーメッセージまで対象です。本文だけを英訳しても、<html lang>、ページ説明、言語切り替えのリンクが日本語のままでは、利用者にも検索エンジンにも一貫したページになりません。

コンテンツを別コレクションで管理する

日英の記事本文は別のMarkdownファイルとして保持します。たとえば日本語をsrc/content/blog/、英語をsrc/content/blog-en/に分け、それぞれをContent Collectionとして定義します。

const blog = defineCollection({
  loader: glob({ base: './src/content/blog', pattern: '**/*.md' }),
  schema: blogSchema,
});

const blogEn = defineCollection({
  loader: glob({ base: './src/content/blog-en', pattern: '**/*.md' }),
  schema: blogSchema,
});

同じIDのファイルを日英に置くと、21-astro-i18n-japanese-default-urlのような識別子を両言語の対応に利用できます。title、description、タグも各言語で持たせます。本文だけを翻訳して、検索結果用の説明を既定言語のまま使い回さないことが大切です。

言語切り替えで強制移動しない

ブラウザ言語は、英語版を案内するための参考情報にはなりますが、現在のURLを勝手に置き換える根拠にはなりません。リンクを表示し、移動するかは利用者に選んでもらいます。ブックマーク、共有リンク、明示的に選んだ言語を尊重できるためです。

記事ページでは、現在の記事IDから対応する言語URLを作ります。対応する翻訳がないページでは、存在しないURLへの切り替えリンクを出さないようにします。言語切り替えの仕組みとSEO用のhreflangは関連しますが、役割は異なります。表示上の導線と、HTMLメタデータの両方を確認してください。

ビルド後にURLを確認する

開発サーバーで表示できても、本番ビルドで期待しないルートが生成される場合があります。公開前には少なくとも次を確認します。

  • 日本語の既存URLが/en/へ変わっていない
  • 日英のトップ、固定ページ、記事一覧、記事詳細が生成されている
  • 各言語のtitle、description、lang属性が対応している
  • 言語切り替えリンクが存在する対応ページだけを指している
  • canonicalとhreflangが、実際に生成されたHTTPS URLを指している

少数言語・静的Markdownのサイトでは、ページとコンテンツを明示的に分ける構成は理解しやすく、URLの意図も保ちやすくなります。言語数や翻訳フローが増えた時点で、CMSや翻訳管理の導入を改めて検討すれば十分です。

関連記事