Skip to content

HasLocalization

File: app/Traits/Common/HasLocalization.php

Trait Eloquent Laravel yang otomatis meresolve kolom JSON terlokalisasi ke nilai string sesuai locale saat ini — sehingga $model->name mengembalikan nama Bahasa Indonesia ketika aplikasi di locale id, tanpa harus menulis $model->name['id'] di mana-mana.

Ringkasan

Banyak model menyimpan konten multi-bahasa sebagai kolom JSON:

json
{"en": "School Name", "id": "Nama Sekolah"}

Tanpa trait ini, setiap akses butuh $model->name['en'] ?? $model->name['id']. Dengan trait, $model->name otomatis mengembalikan locale yang benar.


Kenapa Ada

  • Ergonomi developer: Baca nilai lokal = $room->name, bukan $room->name['en']
  • Konsistensi: Semua lokalisasi pakai struktur JSON sama ({en: "...", id: "..."})
  • Fallback chain: Jika locale saat ini tidak punya nilai, fallback ke locale lain, lalu -
  • Backward compatible: Kolom non-lokal tidak terpengaruh

Method

getAttribute($key): mixed

Override getAttribute() milik Eloquent untuk intercept kolom terlokalisasi.

Algoritma:

  1. Ambil nilai mentah dari parent
  2. Cek apakah key ada di array $localizations
  3. Jika ya → resolve sebagai JSON terlokalisasi
  4. Jika tidak → return nilai mentah (perilaku Eloquent standar)

getLocalizationRaw(string $key): array

Mengembalikan objek JSON lengkap tanpa resolusi, berguna untuk API atau admin panel.

php
$model->name;                 // "Nama Sekolah" (teresolve)
$model->getLocalizationRaw('name'); // ["en" => "School Name", "id" => "Nama Sekolah"]

resolveLocalizedValue(mixed $value): string

Algoritma resolusi inti. Fallback chain:

Locale saat ini → Locale mana pun yang tersedia → "-"

resolveBaseLocale(): string

Menentukan locale yang diprioritaskan. Bisa di-override per-instance.


Cara Pakai

1. Tambahkan trait ke model

php
use App\Traits\Common\HasLocalization;

class Room extends Model
{
    use HasLocalization;
    protected array $localizations = ['name', 'description'];
}

2. Simpan data sebagai JSON

php
$room->name = ['en' => 'Classroom A', 'id' => 'Ruang Kelas A'];
$room->save();

3. Baca nilai terlokalisasi

php
// App locale: en → $room->name = "Classroom A"
// App locale: id → $room->name = "Ruang Kelas A"

// JSON mentah (untuk API)
$room->getLocalizationRaw('name');

4. Override locale per-instance

php
$room->localizationBaseLocale = 'en';
$room->name; // Selalu English, terlepas dari app locale

File Penting

FileTujuan
app/Traits/Common/HasLocalization.phpTrait — override getAttribute(), resolve JSON terlokalisasi
app/Models/Model mana pun yang pakai use HasLocalization + definisi $localizations