InfraGuard

表示言語の切り替え · 多言語対応

InfraGuard コンソールの表示言語を変更する方法 — 8言語、管理者が選ぶ有効な言語の部分集合、そして セッション→クッキー→プロフィール→サイト既定 という解決ルール。

InfraGuard は、本社の既定を韓国語、グローバルのフォールバックを英語とする 8言語対応のコンソール です。この記事では、(1) 利用者がヘッダーのスイッチャーから言語を切り替える方法、(2) リクエストごとに表示言語が決定される仕組み、(3) 管理者がスイッチャーに表示する言語を選ぶ方法 を説明します。

概要 — 何をする機能か

コンソール内のラベル・メニュー項目・メッセージはすべて、英語をハードコードするのではなく翻訳キー(__('menu.security') など)を経由します。言語を変更すると、次のリクエストから、サーバーはその言語の翻訳ファイル(resources/lang/{locale}/*.php)を使って UI を描画します。

対応言語のカタログは、config/locales.php の admin にある8件です。各言語は、現在有効なロケールに関係なく、常に その言語自身の表記 で表示されます。

コード ネイティブ表記 タグ 実翻訳
ko 한국어 KO ✅ 完全に翻訳済み(本社の既定)
en English EN ✅ 完全に翻訳済み(グローバルのフォールバック)
ja 日本語 JA ⏳ en にフォールバック
zh 中文(简体) ZH ⏳ en にフォールバック
es Español ES ⏳ en にフォールバック
fr Français FR ⏳ en にフォールバック
de Deutsch DE ⏳ en にフォールバック
ru Русский RU ⏳ en にフォールバック

当初は ko と en だけが実際に翻訳されています(config/locales.php の priority => ['ko','en'])。残りの6言語(ja·zh·es·fr·de·ru)にはまだ翻訳ファイルがなく、自動的に en にフォールバック します(config/app.php の fallback_locale = en)。したがって現時点で ja を選んでも、未翻訳の文字列は英語のまま表示されます — スイッチャーには8言語すべてが並び、フォールバックするのは文言だけです。

こんなときに使う

画面構成

ヘッダーの言語スイッチャー(全画面)

ヘッダーの言語ドロップダウン(layouts.partials.locale-switch + ui/locale-dd.js)には、管理者が有効にした言語だけ が並びます。各項目はネイティブ表記と短いタグ(例:KO、EN)を表示し、現在のロケールには有効を示す印が付きます。

管理 ▸ 多言語設定(有効な言語の管理)

管理 ▸ 多言語設定 の画面(右上のボタンから開けます)では、8言語のカタログに対して次の操作ができます。

使い方

1) ヘッダーのスイッチャーから切り替える

  1. ヘッダーの言語ドロップダウンを開きます。
  2. 言語を選ぶと、ブラウザーが GET /lang/{locale} に遷移します。
  3. サーバーは選択を保存し、直前のページへ リダイレクトで戻します(redirect()->back())。新しい言語は次の描画から適用されます。

切り替えのエンドポイントは次のとおりです。

GET /lang/ko      # 韓国語に切り替え
GET /lang/en      # 英語に切り替え
GET /lang/ja      # 日本語(未翻訳 → en にフォールバック)

切り替え時にサーバー(LocaleController@switch)が行うことは次のとおりです。

保存先 キー 値 有効期間
セッション infr_locale 選択したコード セッションの間
セッション infr_lang 選択したコード セッションの間(プロフィール言語の同期用)
クッキー infr_locale 選択したコード 1年(訪問をまたいで保持)
DB users.lang 選択したコード 永続(ログイン中の利用者のみ)

ログイン中の利用者が切り替えると、その選択は users.lang(プロフィール言語)にも保存されるため、次回ログインしても言語が引き継がれます。ゲスト(未ログイン)の選択は、セッションとクッキーにのみ保持されます。

非対応の(あるいは管理者が無効にした)コードで /lang/{locale} を呼び出しても 黙って無視され、現在の言語が維持されます — エラーは発生しません。

2) 表示言語が決まる仕組み(SetLocale)

SetLocale ミドルウェアは、すべての Web リクエスト(ログイン画面を含む)で、次の優先順位に従ってロケールを決定します。各候補は 現在有効な言語である場合にかぎり 採用されます。

1. session infr_locale   (このセッションでスイッチャーから明示的に選択)
2. cookie  infr_locale   (訪問をまたぐ永続的な選択 · セッション前のログイン画面にも適用)
3. session infr_lang     (ログイン利用者のプロフィール users.lang → ログイン時にセッションへ読み込み)
4. サイト全体の既定       (Locales::primary() = 有効な言語リストの先頭)

ブラウザーの Accept-Language による自動判定は行いません。 セッション・クッキー・プロフィールのいずれにも選択がない初回訪問は、ブラウザーの言語ではなく、管理者が定めたサイト既定言語 で決定的に配信されます(サイト全体の設定が優先)。訪問者はヘッダーのスイッチャーでいつでも変更できます。

3) 有効な言語の管理(管理者)

  1. 管理 ▸ 多言語設定 を開きます。
  2. 公開する言語をオンにします(スイッチャー・言語切り替え・プロフィール言語・インベントリの多言語編集は、いずれもこの集合を経由します)。残りはオフにします。
  3. ドラッグで並べ替えます — 最上位の有効な言語が既定になります。
  4. 保存します。保存は localization.save として infr_audit_log に監査記録されます。

有効な言語を減らすと、ヘッダーのスイッチャーの選択肢もただちに狭まります。安全策として、少なくとも1言語は有効なままである必要があり(0件での保存は 422 を返します)、有効なコードが1つも残らない場合はシステムがカタログ全体にフォールバックするため、常に最低1言語が保証されます。

データソース

項目 場所
言語カタログ(8言語+ラベル) config/locales.php → admin
実翻訳の優先対象 config/locales.php → priority = ['ko','en']
フォールバックのロケール config/app.php → fallback_locale = en
翻訳ファイル resources/lang/{locale}/{msg,menu,infra,security,...}.php(bootstrap/app.php の useLangPath で再バインド)
有効な言語の部分集合 infr_setting(group=i18n, key=enabled)— CSV
表示順 infr_setting(group=i18n, key=order)— CSV
プロフィール言語 users.lang
セッションの選択 セッション infr_locale / infr_lang
永続的な選択 クッキー infr_locale(1年)

有効な言語と並び順の設定は、App\Support\Locales が 60秒キャッシュ で読み取ります。DB エラー時や設定がない場合は、安全に空配列へフォールバックします(→ カタログ全体)。保存後は Locales::flush() がただちにキャッシュを無効化します。

-- 有効な言語の集合と並び順が保存される場所(例)
SELECT `group`, `key`, `value` FROM infr_setting WHERE `group` = 'i18n';
-- group | key     | value
-- i18n  | order   | ko,en,ja,zh,es,fr,de,ru
-- i18n  | enabled | ko,en

フロントエンドへの受け渡し

サーバーは、有効なロケールとメッセージパックをビューのブートストラップに渡します(例:window.__t = @json(__('msg'))、window.__locale)。Vue のページとミックスインはこれらを使って、クライアント側の文字列を描画し、有効な UI ロケールに合わせて日付を整形します。

アクセス権限

操作 必要な最小レベル
言語の切り替え GET /lang/{locale} ゲスト可 — ログイン不要(ログイン画面でも動作します)
有効な言語の閲覧・保存 管理 ▸ 多言語設定 admin = 10

トラブルシューティングと FAQ

使いたい言語がスイッチャーに出てこない

管理者によって 無効化 されている可能性が高いです。管理 ▸ 多言語設定 でその言語のトグルをオンにしてください。スイッチャー・言語切り替え・プロフィール言語は、いずれも有効な言語の集合を経由します。

言語を切り替えたのに一部の文字が英語のまま

ja·zh·es·fr·de·ru には まだ実際の翻訳ファイルがなく、en にフォールバックします(初期の方針)。未翻訳の文字列だけが英語で表示されるのは想定どおりです。ko と en は完全に翻訳済みです。

初回訪問がブラウザーの言語で開かない

仕様どおりです。InfraGuard は Accept-Language を読みません。管理者が定めた サイト既定言語(有効な言語リストの先頭)で開きます。一度切り替えれば、その選択はセッションとクッキーに保存され、以降の訪問でも保持されます。

ログアウトして再ログインすると言語が戻る

クッキー(infr_locale、1年)があれば保持されます。ログイン中の利用者の場合、選択は users.lang にも保存され、次回ログイン時にプロフィール言語として復元されます。クッキーもプロフィールもない場合は、サイト既定で開きます。

/lang/xx のような未知のコードを指定するとどうなりますか

非対応のコードは 黙って無視され、現在の言語が維持されます(エラーなし)。有効なコードは、8言語のうち有効化されているものだけです。

すべての言語を無効にしたらどうなりますか

ブロックされます。保存時に最低1件という下限が課されます(0件での保存は 422 を返します)。仮に設定が壊れた場合でも、システムはカタログ全体にフォールバックするため、スイッチャーが空になることはありません。

関連項目

언어 · 지역화 화면
언어 · 지역화 화면