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言語すべてが並び、フォールバックするのは文言だけです。
こんなときに使う
- 利用者が使い慣れた言語でコンソールを見たいとき — ヘッダーの言語スイッチャーを使います。
- セッションが存在する前のログイン画面でも言語を切り替えたいとき —
/lang/{locale}はゲストにも許可されています。 - 組織全体で特定の言語だけを公開し、初回訪問時の既定言語を決めたいとき — 管理者が 有効な言語の集合と並び順 を編集します(後述の「有効な言語の管理」を参照)。
画面構成
ヘッダーの言語スイッチャー(全画面)
ヘッダーの言語ドロップダウン(layouts.partials.locale-switch + ui/locale-dd.js)には、管理者が有効にした言語だけ が並びます。各項目はネイティブ表記と短いタグ(例:KO、EN)を表示し、現在のロケールには有効を示す印が付きます。
管理 ▸ 多言語設定(有効な言語の管理)
管理 ▸ 多言語設定 の画面(右上のボタンから開けます)では、8言語のカタログに対して次の操作ができます。
- 各言語の オン/オフ を切り替える(スイッチャーに表示するかどうか)。
- ドラッグで並べ替える — 最上位の有効な言語がサイトの 既定 言語になります。
- 少なくとも1言語という下限のもとで保存する(0件での保存は拒否されます)。
使い方
1) ヘッダーのスイッチャーから切り替える
- ヘッダーの言語ドロップダウンを開きます。
- 言語を選ぶと、ブラウザーが
GET /lang/{locale}に遷移します。 - サーバーは選択を保存し、直前のページへ リダイレクトで戻します(
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) 有効な言語の管理(管理者)
管理 ▸ 多言語設定を開きます。- 公開する言語をオンにします(スイッチャー・言語切り替え・プロフィール言語・インベントリの多言語編集は、いずれもこの集合を経由します)。残りはオフにします。
- ドラッグで並べ替えます — 最上位の有効な言語が既定になります。
- 保存します。保存は
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 |
- 言語の切り替え自体は誰でも行えます(機微な操作ではありません)。
- スイッチャーに表示する言語を決める管理画面は管理者専用です。ルートグループの
infr.level:10とコントローラー側の自己ガード(user_level >= 10)による 二重防御 です。レベルの区分は demo=1 · staff=5 · admin=10 です(アクセスレベル · RBAC を参照)。
トラブルシューティングと FAQ
使いたい言語がスイッチャーに出てこない
管理者によって 無効化 されている可能性が高いです。管理 ▸ 多言語設定 でその言語のトグルをオンにしてください。スイッチャー・言語切り替え・プロフィール言語は、いずれも有効な言語の集合を経由します。
言語を切り替えたのに一部の文字が英語のまま
ja·zh·es·fr·de·ru には まだ実際の翻訳ファイルがなく、en にフォールバックします(初期の方針)。未翻訳の文字列だけが英語で表示されるのは想定どおりです。ko と en は完全に翻訳済みです。
初回訪問がブラウザーの言語で開かない
仕様どおりです。InfraGuard は Accept-Language を読みません。管理者が定めた サイト既定言語(有効な言語リストの先頭)で開きます。一度切り替えれば、その選択はセッションとクッキーに保存され、以降の訪問でも保持されます。
ログアウトして再ログインすると言語が戻る
クッキー(infr_locale、1年)があれば保持されます。ログイン中の利用者の場合、選択は users.lang にも保存され、次回ログイン時にプロフィール言語として復元されます。クッキーもプロフィールもない場合は、サイト既定で開きます。
/lang/xx のような未知のコードを指定するとどうなりますか
非対応のコードは 黙って無視され、現在の言語が維持されます(エラーなし)。有効なコードは、8言語のうち有効化されているものだけです。
すべての言語を無効にしたらどうなりますか
ブロックされます。保存時に最低1件という下限が課されます(0件での保存は 422 を返します)。仮に設定が壊れた場合でも、システムはカタログ全体にフォールバックするため、スイッチャーが空になることはありません。
関連項目
