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:
{"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:
- Ambil nilai mentah dari parent
- Cek apakah key ada di array
$localizations - Jika ya → resolve sebagai JSON terlokalisasi
- Jika tidak → return nilai mentah (perilaku Eloquent standar)
getLocalizationRaw(string $key): array
Mengembalikan objek JSON lengkap tanpa resolusi, berguna untuk API atau admin panel.
$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
use App\Traits\Common\HasLocalization;
class Room extends Model
{
use HasLocalization;
protected array $localizations = ['name', 'description'];
}2. Simpan data sebagai JSON
$room->name = ['en' => 'Classroom A', 'id' => 'Ruang Kelas A'];
$room->save();3. Baca nilai terlokalisasi
// 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
$room->localizationBaseLocale = 'en';
$room->name; // Selalu English, terlepas dari app localeFile Penting
| File | Tujuan |
|---|---|
app/Traits/Common/HasLocalization.php | Trait — override getAttribute(), resolve JSON terlokalisasi |
app/Models/ | Model mana pun yang pakai use HasLocalization + definisi $localizations |