Skip to content

feat: 英語版 /en ルートを追加(別URL・lang=en・hreflang相互リンク) (#48)#49

Merged
kako-jun merged 3 commits into
mainfrom
seo/en-route
Jun 15, 2026
Merged

feat: 英語版 /en ルートを追加(別URL・lang=en・hreflang相互リンク) (#48)#49
kako-jun merged 3 commits into
mainfrom
seo/en-route

Conversation

@kako-jun

Copy link
Copy Markdown
Owner

概要

英語圏SEOの本格対応。同一URL制約を外し、JA は今まで通り /、英語版を /en に追加。
別URL・<html lang="en">・hreflang 相互リンクで、英語の検索でも拾われる土台にする。

仕組み

Next の route group で root layout を2つに分けた(<html lang> をルート別に正しく静的出力するため):

  • app/(ja)/{layout,page}.tsx → URL /<html lang="ja">・JA メタ)
  • app/(en)/{layout.tsx, en/page.tsx} → URL /en<html lang="en">・EN メタ・forcedLang="en"
  • components/HomePage.tsx に本体を共有化、両ルートで描画
  • lib/seo.ts に言語別 metadata/JSON-LD を集約

SEO 出力(ビルド実物で確認)

/(out/index.html) /en(out/en.html)
html lang ja en
title 小エビの間違いサラダ Machigai Salad — spot-the-difference helper
canonical / /en
hreflang ja=/, en=/en, x-default=/(両ページに) 同左
og:locale / alternate ja_JP / en_US en_US / ja_JP
JSON-LD inLanguage [ja,en], alternateName "Machigai Salad" inLanguage [ja,en], alternateName 日本語名

UX 設計(要レビュー)

  • 言語トグルは URL を切り替えるナビに(JA→/、EN→/en)。クリック時に選択を localStorage 保存し、/ の auto-detect が選択を尊重する
  • / は従来挙動を維持(初回訪問は navigator から自動判定、英語ユーザーは / でも英語UI)。/en は常に英語固定
  • 別 root layout 間の遷移なのでフルロード(静的サイトなので問題なし)

検証

  • npm run build 成功(//en を静的生成)
  • 静的HTMLに lang/title/hreflang/canonical/OG/JSON-LD 反映を確認
  • / は日本語UI・/en は英語UIで描画(JA字幕が /en に出ないことも確認)
  • lint クリーン・test 24/24・dev サーバーで //en を実機スクショ確認

正直な限界

  • これで英語の head term も狙えるが、順位は被リンク・本文量にも依存。/en の本文を英語で厚くする等は別途
  • 記事 / 使い方リンク / Nostalgic はこのPRに含めない

Refs #48

route group で root layout を ja/en に分割し、英語圏SEOを本格対応。
JA は今まで通り root /、英語版を /en に追加。

- app/(ja)/{layout,page}.tsx … URL /(html lang=ja)
- app/(en)/{layout.tsx, en/page.tsx} … URL /en(html lang=en, forcedLang=en)
- lib/seo.ts … 言語別 metadata/JSON-LD を集約。hreflang(ja/en/x-default)・
  canonical・og:locale/alternateLocale・inLanguage[ja,en]・alternateName
- components/HomePage.tsx … Home 本体を共有化(両ルートで描画)
- lib/i18n.tsx … I18nProvider に forcedLang(/en は en 固定で auto-detect 抑止)
- components/LangToggle.tsx … 2ルート間ナビ(JA→/・EN→/en、選択を保存)
- 旧 app/{layout,page}.tsx は削除

build で out/index.html(lang=ja)・out/en.html(lang=en) 生成、両者に正しい
hreflang/canonical/OG。lint・test(24) green。dev で /・/en を実機確認。

Refs #48
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Jun 15, 2026

Copy link
Copy Markdown

Deploying machigai-salad with  Cloudflare Pages  Cloudflare Pages

Latest commit: 6a28600
Status: ✅  Deploy successful!
Preview URL: https://1347d4f4.machigai-salad.pages.dev
Branch Preview URL: https://seo-en-route.machigai-salad.pages.dev

View logs

kako-jun added 2 commits June 15, 2026 20:49
- README: 日英対応を /(ja)+ /en(en, hreflang)に更新
- architecture.md: route group による2 root layout 構成・lib/seo.ts・
  forcedLang・LangToggle ナビ化の節を追加、実装済みに SEO土台と /en を追記
- sitemap.ts: / と /en の2エントリ化、各エントリに hreflang alternates
  (英語ページをクロール対象に明示。should 指摘)
- seo.ts buildJsonLd: url の冗長な三項を ${siteUrl}${PATH[lang]} に簡略化(nit)
@kako-jun
kako-jun merged commit abbd10c into main Jun 15, 2026
2 checks passed
@kako-jun
kako-jun deleted the seo/en-route branch June 15, 2026 11:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant