🌐 言語: 🇻🇳 Tiếng Việt · 🇬🇧 English · 🇯🇵 日本語(現在)
GP247 システムでの言語(多言語/i18n)の使い方
はじめに
このドキュメントでは、**GP247 の多言語システム(i18n)**の仕組みを説明します。翻訳文字列がどこに 保存されるか、システムがどの優先順位で表示言語を選ぶか、そしてパッケージをアップグレードしたときに 新しい言語を追加する方法、文言を1つずつ編集する方法、翻訳文字列を更新し直す方法を解説します。 GP247 サイトの開発者と管理者向けのドキュメントです。読み終えると仕組みを理解でき、サイトや管理画面に 表示される1行の文言を変えるには、どこを操作すればよいかが正確にわかります。
ℹ️ 用語メモ: locale(ロケール) =
vi、enのような短い言語コード。翻訳文字列(translation string) =「コード → 文言」の組(例:action.save→保存)。管理画面(Admin) = サイトの管理エリア。
1. 仕組み
GP247 は データベース優先(DB-first) のモデルを使います。2つの別々の概念があり、それぞれ DB の2つのテーブルに対応します。
| テーブル | 役割 | 内容の例 |
|---|---|---|
admin_language |
サイトにインストール済みの言語の一覧(有効/無効、並び順、旗、RTL) | vi — Tiếng Việt · en — English |
languages |
実際の文言の保管場所(コード → テキスト、ロケールごと) | action.save / ja → 保存 |
(実際のテーブル名には GP247_DB_PREFIX による接頭辞が付きます。既定は gp247_ です。例: gp247_languages。)
1.1. 翻訳文字列はどこにあるか?
- 主な取得元は DB の
languagesテーブルです。 表示されるすべての文言はここから読み込まれます。 - ディスク上の言語ファイルは予備にすぎません。 各パッケージには
Lang/{en,vi}/フォルダーがあり (例:vendor/gp247/core/src/Lang/)、Laravel にgp247::名前空間で登録されています。これらが 使われるのは、DB に対応するコードがない場合だけです。 languagesテーブルの初期データは、各パッケージの seeder から入ります(言語ファイルからではありません)。 4 章 を参照してください。
languages テーブルのカラム:
code // 翻訳文字列のコード。例: "action.save" (location との組み合わせで一意)
text // 翻訳済みの文言。例: "保存"
position // グループ/エリア。例: "action", "store.admin" (管理画面での絞り込みに使用)
location // ロケール。例: "en" または "vi"
admin_language テーブルのカラム: name(表示名)、code(ロケールコード、一意)、icon(旗)、
status(1 = 有効)、rtl(1 = 右から左のレイアウト)、sort(並び順)。
1.2. 文言が表示される流れ
コードや view では、ヘルパー関数 gp247_language_render() で文言を取得します。
gp247_language_render('action.save'); // -> "保存" (現在のロケールが ja の場合)
gp247_language_render('welcome', ['name' => 'An']); // 文字列内の :name を "An" に置き換えます
この関数は次の順序で動きます。
gp247_get_locale()(Laravel のapp()->getLocale()と同じ)で現在のロケールを判定します。- そのロケールのすべての文字列を DB から取得します:
Languages::getListAll($locale)→code => textのマップを返します。 結果は 1リクエストの範囲でキャッシュされます(同じページ読み込み中に何度も問い合わせません)。 - コードが DB にある場合 → その
textを返します(:key形式のパラメーターがあれば置き換えます)。 - ない場合 → 予備として Laravel の
trans($string)を使います(ディスク上の言語ファイルを読みます)。
関連するヘルパー関数:
| 関数 | 用途 |
|---|---|
gp247_language_render($key, $replace, $locale) |
コードから文言を取得します(最もよく使います) |
gp247_language_quickly($key, $default) |
上と同じですが、既定値を指定できます |
gp247_get_locale() |
表示中のロケールを取得します |
gp247_lang_switch($code) |
現在の言語を切り替えます(有効性を確認し、session に保存) |
gp247_language_all() |
有効な言語の一覧を取得します(admin_language から) |
⚠️ 技術的な注意: 言語関数を
__constructや早い段階で動く middleware の中で呼ばないでください。 その時点ではロケールがまだ設定されていないことがあり、間違った言語で表示される原因になります。
2. 優先順位
区別すべき2つの優先順位の層があります。
2.1. 表示ロケールの選択の優先順位(このリクエストでどの言語が有効か)
middleware Localization(vendor/gp247/core/src/Middleware/Localization.php)が、
高いものから低いものへ次の順で決めます。
session('locale')— ユーザーがすでに言語を選んでいる(session に残っている)場合 → 最優先です。gp247_store_info('language')— ストアに設定された既定の言語です。config('app.locale')— Laravel の既定ロケールです(.env/config/app.php)。- 選ばれた値は、有効な言語の一覧(
admin_language、status = 1)と照合し直されます。 有効でない場合は、sortの順で最初の有効な言語が使われます。
確定すると、middleware は app()->setLocale(...) を呼び、値を session に保存し直します。
URL の接頭辞(例:
/vi/...)で言語を判定する仕組みはありません。ロケールは session + ストアの既定言語で制御されます。ユーザーは画面上の言語切り替えボタン (gp247_lang_switch()を呼びます)で言語を変更し、新しい値は以降のリクエストのために session に保存されます。
2.2. 文言の取得元の優先順位(あるコードのテキストをどこから取るか)
同じコードの翻訳文字列について:
- DB のレコード(
languages、location+codeが一致)— 最優先です。 - ディスク上の言語ファイル(
trans()経由)— DB にそのコードがない場合だけ使われます。
→ 重要な結論: 文言を変えたいときは、DB で(管理画面から)編集してください。 DB の内容は常に
ファイルより優先されるためです。DB に対応するコードがすでにある場合、vendor/ 内の言語ファイルを編集しても通常は効果がありません。
3. 追加と編集の方法
作業は2種類あります。言語の追加・編集(admin_language の行)と、文言の追加・編集
(languages の行)です。どちらも管理画面で行います。
3.1. 新しい言語を追加する
- 管理画面にログインし、**「言語」**画面(パス
/{admin_prefix}/language)を開きます。 - 新規追加ボタンをクリックし、次を入力します。
- 「名前」(Name)— 表示名(例:
日本語)。 - 「コード」(Code)— ロケールコード。小文字で、一意にします(例:
ja)。 - 「アイコン」(Icon)— 旗・アイコン(任意)。
- RTL — 右から左に読む言語(例: アラビア語)の場合にオンにします。
- 「並び順」(Sort)— 表示の順番。「ステータス」(Status)— 言語を有効にするにはオン(1)にします。
- 「名前」(Name)— 表示名(例:
- 保存します。成功すると、新しい言語が一覧と、サイト上の言語切り替えボタンに表示されます。
この時点では、新しい言語には
languagesの文言がまだ1つもありません。手順 3.3 に進んで翻訳を入力してください。
3.2. 言語の編集・有効化/無効化・削除
- 「言語」画面に戻り、該当する行の「編集」(Edit)を選んで、名前・旗・並び順を変更したり、
Statusを切り替えたりします。 - 安全のための制約:
- システムは有効な言語を常に1つ以上残します。すべてを無効にすることはできません。
- 基本の2言語
viとenは削除できません(定数GP247_GUARD_LANGUAGEで保護されています)。
3.3. 文言(翻訳)の追加・編集
- **「言語管理」**画面(パス
/{admin_prefix}/language_manager)を開きます。 - 編集する言語を選びます。position(グループ)で絞り込んだり、キーワードを入力してすばやく検索したりできます。
en以外の言語を表示しているときは、比較できるように英語の原文が横に表示されます。 - 既存の文言を編集する: テキスト欄を直接編集して保存します。システムは
location+codeの組で 該当する行を上書き(upsert)します。 - 新しい文言を追加する: 新規追加をクリックし、
code(コード)とtextを入力します。- ⚠️ 新しく追加した文言は、必ず最初に
enロケール用に作成されます(codeは一意です)。その後、 他の言語を1つずつ開き、手順3で同じコードの翻訳を入力してください。
- ⚠️ 新しく追加した文言は、必ず最初に
期待される結果: 保存したら、サイトや管理画面の該当ページを再読み込みしてください。新しい文言がすぐに 表示されます(DB が優先して読み込まれるためです)。変わらない場合は、表示中の正しいロケールを 編集しているか確認してください(2.1 章 を参照)。
4. 更新方法
ここでいう「言語の更新」とは、パッケージの既定の翻訳文字列を DB に反映し直すことです(例えば、
composer update で新しい文言や修正された文字列が入った後)。2つのモードがあり、あなたの編集内容を
上書きするかどうかが異なります。
| 実行方法 | モード | 影響 |
|---|---|---|
gp247:install / gp247:update |
insertOrIgnore(安全) | 足りないコードを追加するだけです。あなたが編集した文言はそのまま残ります |
gp247:language-update |
upsert(上書き) | すべてのコードについて、テキストをパッケージの既定版に上書きします |
安全な更新(編集内容を保持)
Composer でパッケージを更新した後に実行します。
php artisan gp247:update
このコマンドの言語処理のステップは、足りない翻訳文字列だけを追加し、管理画面でカスタマイズした文言には触れません。
上書き更新(パッケージの標準版に戻す)
php artisan gp247:language-update
- コマンドは core → front → shop の順に自動で実行されます。インストールされていないパッケージはスキップします。
- ⚠️ 注意: このコマンドは、管理画面で編集したすべての文言を上書きし、パッケージの最新の既定版に
戻します。多くカスタマイズしている場合は、実行前に
languagesテーブルをバックアップしてください。
ℹ️ 言語ファイル用の
vendor:publishはありません。 翻訳文字列は、外部に公開される言語ファイルではなく、 DB に書き込む seeder で配布されます。そのため、標準の更新方法は上の2つの artisan コマンドです。
よくある質問(Q&A)
Q1: vendor/gp247/core/src/Lang/vi/... の言語ファイルを編集したのに、サイトの文言が変わりません。なぜですか?
→ 設計どおりの動作です。DB(languages)の内容は、ファイルより常に優先されます。ファイルを編集する代わりに、
管理画面 → 言語管理 で文言を編集してください。
Q2: 文言を1つ変えるには、どこで操作するのが一番早いですか?
→ 管理画面 → 「言語管理」(/language_manager)です。キーワードで絞り込み、その場で編集して保存します。
デプロイやコマンドの実行は不要です。
Q3: gp247:update と gp247:language-update の違いは何ですか?
→ gp247:update は安全です。言語のステップでは足りないコードを追加するだけで、あなたの編集内容は残ります。
gp247:language-update は、すべての文字列をパッケージの既定版に上書きします。カスタマイズを残したい →
gp247:update を使います。最新の標準版に戻したい → gp247:language-update(または
gp247:update --overwrite-lang)を実行します。事前のバックアップを忘れないでください。
Q4: 新しい言語を追加したのに、その言語ではサイトの文言が空のままです。なぜですか?
→ 言語の追加は admin_language に行を作るだけで、翻訳はまだありません。言語管理(3.3 章)でその
ロケールの文言を入力するか、独自の seeder を用意する必要があります。
Q5: ベトナム語・英語を削除できないのはなぜですか?
→ 基本の2言語(vi、en)は、システムが常に予備として使える標準言語を持てるよう、定数
GP247_GUARD_LANGUAGE で保護されています。他の方法で表示をオフにすることはできますが、一覧から削除することはできません。
Q6: サイトの既定言語はどこで変更しますか?
→ 表示ロケールは session('locale') → ストアの既定言語 → config('app.locale') の順で優先されます。
サイト全体の既定を変えるには、ストアの既定言語(ストアの設定)と、必要に応じて .env の APP_LOCALE
を変更してください。
Q7: GP247 は /vi/... のような URL で言語を判定しますか?
→ いいえ。言語は URL の接頭辞ではなく、session + ストアの既定言語で制御されます。
Q8: languages テーブルの position は何のためにありますか?
→ 管理画面で文言を絞り込み・検索するためのグループのラベルです(例: action、store.admin)。
どの文言が表示されるかには影響しません。それは code + location の組で決まります。
Q9: 翻訳文字列は長期間キャッシュされますか?
→ いいえ。あるのは 1リクエストの範囲のキャッシュだけです(ページの読み込みごとに、ロケールごとに DB へ 1回問い合わせます)。管理画面での編集は、次のページ読み込みからすぐに反映されます。
Q10: shop パッケージにはディスク上の言語フォルダーがありません。文言はどこから来るのですか?
→ shop のすべての文字列は DB(languages)にあり、インストール・更新時に DataShopLanguageSeeder が
読み込みます。そのため、shop にはディスク上の言語ファイルが必要ありません。
📅 最終更新: 2026-10-22 · ✍️ 作成者 (Author): GP247