Skip to content

ブラウザの言語設定からロケールを自動判定する - #14

Merged
uswebk merged 1 commit into
mainfrom
feature/accept-language-detection
Jul 14, 2026
Merged

ブラウザの言語設定からロケールを自動判定する#14
uswebk merged 1 commit into
mainfrom
feature/accept-language-detection

Conversation

@uswebk

@uswebk uswebk commented Jul 13, 2026

Copy link
Copy Markdown
Owner

背景

ログイン前の画面(/login /signup /verify-otp)は必ず VITE_DEFAULT_LOCALE(既定 en)で表示されていた。i18n/config.ts の検出順が ["cookie", "htmlTag"] でブラウザ言語の判定を行っておらず、切替UI(LanguageSwitcher)もサイドバーにしかないため、日本語環境のユーザーでもログインするまで英語のままだった。

変更内容

ロケールの解決順を Cookie(ユーザーの明示的な選択) → Accept-LanguageVITE_DEFAULT_LOCALE に変更する。

  • i18n/accept-language.ts(新規): pickLocaleFromAcceptLanguage()ja,en-US;q=0.9,en;q=0.8 を q 値の降順(同値なら記述順)に並べ、最初にサポート対象だったものを返す。q=0 は無視し、対応言語がなければ undefined を返して既定値にフォールバックする
  • i18n/server.ts: detectLocale が Cookie 不在時に accept-language ヘッダを見る
  • i18n/config.tsdetection.order変更しない。SSRで決めたロケールが <html lang> として出力され、クライアントは htmlTag からそれを読むため、サーバーとクライアントの判断が一致し hydration mismatch が起きない(navigator を足すとこの一致が壊れるので、その旨をコメントに残した)
  • README(英日)の VITE_DEFAULT_LOCALE の説明を新しい優先順位に合わせて更新

判定に User-Agent は使わない(UAにはブラウザ・OSの情報しか含まれず、言語設定は入っていないため)。

動作確認

pnpm vitest(新規7件を含む63件)がグリーン。加えて dev サーバーに実際にヘッダを付けて確認済み。

リクエスト 結果
Accept-Language: ja,en;q=0.9 lang="ja"
Accept-Language: en-US,en;q=0.9 lang="en"
Accept-Language: ja;q=0.7,en;q=0.9 lang="en"(q値が効く)
Accept-Language: fr lang="en"(既定値)
Accept-Language: ja + Cookie: i18next=en lang="en"(Cookieが最優先)

スコープ外

認証画面への LanguageSwitcher 設置(自動判定が外れたユーザーはログイン後に切り替えれば Cookie が残る)。

🤖 Generated with Claude Code

ログイン前の画面は VITE_DEFAULT_LOCALE(既定 en)で固定表示され、
言語の切替UIはサイドバーにしかないため、日本語環境のユーザーでも
ログインするまで英語のままだった。

ロケールの解決順を Cookie → Accept-Language → 既定値 に変更する。
判定はSSRの detectLocale で行い、結果は <html lang> として出力される。
クライアントの検出順は cookie → htmlTag のままなので、サーバーと
クライアントの判断が一致し hydration mismatch は起きない。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@uswebk
uswebk merged commit 805796f into main Jul 14, 2026
3 checks passed
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