MHM Rentiva v4.27.1: i18n Locale-Leak Hotfix — Araç Ayarları Etiketleri Artık İlk Kurulum Dilinde Donmuyor
v4.27.0 WordPress.org gönderim hazırlığından birkaç saat sonra kritik bir bug yakalandı: İngilizce bir WordPress sitesinde Araç Ayarları sayfası Türkçe etiketler gösteriyordu. Eklenti global bir eklenti, İngilizce birincil dil. Bu hata submission-blocker seviyesinde. v4.27.1 bunu düzeltiyor.
🐛 Hata Senaryosu
Tipik tekrarlama:
- Eklenti Türkçe bir WordPress sitesinde kurulu, Araç Ayarları sayfası bir kez ziyaret edildi.
- Site İngilizce'ye çevrildi (veya Türkçe bir DB yedeği İngilizce siteye restore edildi).
- Admin paneli hâlâ Türkçe etiketler gösteriyor: Günlük Fiyat, Model Yılı, Plaka, Klima, Yedek Lastik...
Oysa kaynak koddaki her __( 'Daily Price', 'mhm-rentiva' ) çağrısı güncel WordPress yerel ayarına göre doğru İngilizce değerini döndürüyor. Peki neden admin UI Türkçe gösteriyordu?
🔍 Kök Neden
VehicleMeta::ensure_default_options() fonksiyonu, ilk admin page load'da şöyle bir işlem yapıyordu:
$default_details = self::get_default_details(); // __() çağrılarıyla CHEVİRİLMİŞ array
// ...
if (get_option('mhm_vehicle_details', array()) === array()) {
update_option('mhm_vehicle_details', $default_details); // 🔥 Türkçe değerleri DB'ye yazdı
}
get_default_details() içinde:
return array(
'price_per_day' => __('Daily Price', 'mhm-rentiva'), // Türkçe site → "Günlük Fiyat"
'year' => __('Model Year', 'mhm-rentiva'), // Türkçe site → "Model Yılı"
// ...
);
__() çağrıldığı anın yerel ayarına göre çeviri döner. İlk site Türkçe'yken bu "Günlük Fiyat" döndü ve wp_options'a yazıldı.
Sonrasında get_all_available_details() render akışında:
$details = self::get_default_details(); // canlı __() → İngilizce (site EN şimdi)
$stored = get_option('mhm_vehicle_details'); // DONMUŞ Türkçe
foreach ($stored as $key => $label) {
$details[$key] = $label; // Override: Türkçe kazanıyor
}
Donmuş çeviri daima canlı çeviriyi eziyordu.
🛠️ Çözüm
1. Otomatik persisti durdur
VehicleMeta::ensure_default_options() içindeki üç update_option('mhm_vehicle_*', $translated_defaults) çağrısı tamamen kaldırıldı. mhm_selected_* (sadece KEY listesi, çeviri içermez) seed etmeye devam ediyor.
2. Mevcut install'ları temizle
Yeni method VehicleMeta::migrate_remove_auto_populated_labels() — tek seferlik migrasyon, mhm_rentiva_v4271_labels_migrated flag ile korunuyor:
foreach (['mhm_vehicle_details', 'mhm_vehicle_features', 'mhm_vehicle_equipment'] as $key) {
$stored = get_option($key, null);
if (is_array($stored) && !empty($stored)) {
delete_option($key);
}
}
Migrasyon plugins_loaded hook'unda mevcut version-drift bloğu içinde tetikleniyor — admin, cron ve WP-CLI akışlarında hepsinde çalışıyor.
3. Kullanıcı custom alanları korunuyor
mhm_custom_details, mhm_custom_features, mhm_custom_equipment — kullanıcının "Özel Ekle" ile eklediği alanlar başka options'ta duruyor. Migrasyon bunlara dokunmuyor.
⚖️ Trade-off
"İsimleri Düzenle" (Edit Names) ile bir çekirdek alanı yeniden adlandırdıysan (örn. "Daily Price" → "Rental Rate"), upgrade sonrası bu rename'i tek sefer yeniden uygulaman gerekiyor. Bu nadir bir senaryo — ama bug her install'ı etkiliyordu. Takas adil.
🧪 Testler
tests/Migration/LocaleLeakLabelsMigrationTest.php — 4 yeni regresyon testi, 13 assertion:
- Sızmış etiket array'leri temizleniyor (Türkçe, İngilizce, karışık içeriklerde)
- Migrasyon idempotent — ikinci çağrı no-op, meşru post-migration rename'i ezmiyor
- Fresh install — legacy option yok, flag yine de set ediliyor (sonraki çağrılar atlanıyor)
mhm_custom_*— kullanıcı custom alanlarına dokunulmuyor
✅ Doğrulama
| Kontrol | Sonuç |
|---|---|
| PHPCS release scope | 0 error, 0 warning |
| PHPUnit | 732/732 (+4 yeni), 6 skipped, 0 regresyon |
| Plugin Check (PCP) | 0 error, 3 trivial warning (.distignore-excluded) |
📦 Kurulum
mhm-rentiva.4.27.1.zip → Eklentiler → Yeni Ekle → Eklenti Yükle, veya Rentiva Pro otomatik güncelleyicisi.
Gereksinimler: PHP 8.1+, WordPress 6.7+.
🔜 Sıradaki
- v4.27.2: Arama Sonuçları UX iyileştirmeleri + Shortcode Review Backlog (birleşik patch)
- v4.28.0: Popüler Rotalar shortcode/block/widget (yeni özellik)
- v4.29.0: Vendor Report / Appeal System (yeni alt sistem)
🎓 Ders
Bu bug v4.27.0 WordPress.org submission readiness release'inden birkaç saat sonra yakalandı. Zero PHPCS / zero PCP doğrulama suite'i geçmişti ama runtime bir hatayı (mevcut DB state'in __() çıktılarını ezmesi) ne PHPCS ne PCP görebilirdi. Gerçek kullanıcı admin UI testi tek güvence. WordPress.org gönderiminden önce smoke test tur atmamız gerekiyordu — v4.27.1 ile bu pattern kazanıldı: test kaynağı çeviri katmanlarından geçen her UI için manuel doğrulama zorunlu.
GitHub Release: v4.27.1
