Add Language Management Module: Created Language resource with CRUD pages, schemas, and models to support the universal translation system. Implemented localization for English and Turkish, ensuring consistent user experience. Added necessary policies and seeder for initial language data, enhancing the overall language management functionality.
This commit is contained in:
@@ -0,0 +1,431 @@
|
||||
# Universal Dynamic Translation System
|
||||
|
||||
## 🌟 Genel Bakış
|
||||
|
||||
Citrus Platform için geliştirilmiş **evrensel, dinamik ve role-based** çeviri sistemi. Bu sistem, herhangi bir modelin çeviri desteğine sahip olmasını sağlar ve kullanıcı bazlı dil yönetimi sunar.
|
||||
|
||||
## 📋 Sistem Mimarisi
|
||||
|
||||
```
|
||||
┌─────────────────┐
|
||||
│ languages │ → Dinamik dil tanımları (TR, EN, DE, FR, AR...)
|
||||
└─────────────────┘
|
||||
↓
|
||||
┌─────────────────┐
|
||||
│ translations │ → Evrensel çeviri tablosu (polymorphic)
|
||||
└─────────────────┘
|
||||
↓
|
||||
┌─────────────────┐
|
||||
│ user_languages │ → Kullanıcı-Dil ilişkisi (yetkiler)
|
||||
└─────────────────┘
|
||||
↓
|
||||
┌─────────┐ ┌─────────┐ ┌─────────┐ ┌──────────┐
|
||||
│ pages │ │ blogs │ │products │ │ news │ → Herhangi bir model
|
||||
└─────────┘ └─────────┘ └─────────┘ └──────────┘
|
||||
```
|
||||
|
||||
## ✅ Kurulum ve Yapılandırma
|
||||
|
||||
### 1. Database Tabloları
|
||||
|
||||
```bash
|
||||
php artisan migrate
|
||||
```
|
||||
|
||||
Oluşturulan tablolar:
|
||||
- `languages` - Dil tanımları
|
||||
- `translations` - Çeviri veriler (polymorphic)
|
||||
- `user_languages` - Kullanıcı-dil yetkileri
|
||||
|
||||
### 2. Varsayılan Diller
|
||||
|
||||
```bash
|
||||
php artisan db:seed --class=LanguageSeeder
|
||||
```
|
||||
|
||||
Eklenen diller:
|
||||
- 🇹🇷 Türkçe (tr) - Varsayılan, Aktif
|
||||
- 🇬🇧 İngilizce (en) - Aktif
|
||||
- 🇩🇪 Almanca (de) - Pasif
|
||||
- 🇫🇷 Fransızca (fr) - Pasif
|
||||
- 🇸🇦 Arapça (ar) - Pasif, RTL
|
||||
|
||||
### 3. Model Entegrasyonu
|
||||
|
||||
Herhangi bir modele çeviri desteği eklemek için:
|
||||
|
||||
```php
|
||||
use App\Traits\HasTranslations;
|
||||
|
||||
class YourModel extends Model
|
||||
{
|
||||
use HasTranslations;
|
||||
|
||||
protected $translatable = [
|
||||
'title',
|
||||
'description',
|
||||
'content',
|
||||
];
|
||||
}
|
||||
```
|
||||
|
||||
## 🎯 Kullanım
|
||||
|
||||
### Çeviri Kaydetme
|
||||
|
||||
```php
|
||||
// Basit çeviri kaydetme
|
||||
$blog->setTranslation('title', 'en', 'My Blog Post');
|
||||
|
||||
// Status ile kaydetme
|
||||
$blog->setTranslation('title', 'en', 'My Blog Post', 'published');
|
||||
|
||||
// Kullanıcı ID ile
|
||||
$blog->setTranslation('title', 'en', 'My Blog Post', 'draft', auth()->id());
|
||||
```
|
||||
|
||||
### Çeviri Okuma
|
||||
|
||||
```php
|
||||
// Mevcut dilde
|
||||
$title = $blog->translate('title');
|
||||
|
||||
// Belirli bir dilde
|
||||
$title = $blog->translate('title', 'en');
|
||||
|
||||
// Fallback olmadan
|
||||
$title = $blog->translate('title', 'en', false);
|
||||
```
|
||||
|
||||
### Toplu İşlemler
|
||||
|
||||
```php
|
||||
// Tüm çevirileri al (bir alan için)
|
||||
$translations = $blog->getTranslations('title');
|
||||
// ['tr' => 'Blog Yazım', 'en' => 'My Blog Post']
|
||||
|
||||
// Bir dildeki tüm çevirileri al
|
||||
$translations = $blog->getTranslationsForLanguage('en');
|
||||
// ['title' => 'My Blog Post', 'content' => '...']
|
||||
|
||||
// Çeviri var mı kontrol et
|
||||
if ($blog->hasTranslation('title', 'en')) {
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
### Translation Progress
|
||||
|
||||
```php
|
||||
// Tüm diller için ilerleme
|
||||
$progress = $blog->getTranslationProgress();
|
||||
// ['tr' => 100, 'en' => 75, 'de' => 0]
|
||||
|
||||
// Eksik çevirileri bul
|
||||
$missing = $blog->getMissingTranslations('en');
|
||||
// ['meta_description', 'excerpt']
|
||||
|
||||
// Çeviri durumu
|
||||
$status = $blog->getTranslationStatus('en');
|
||||
// 'complete', 'partial', 'missing'
|
||||
```
|
||||
|
||||
### Translation Workflow
|
||||
|
||||
```php
|
||||
// Çeviri oluştur (draft)
|
||||
$translation = $blog->setTranslation('title', 'en', 'My Title', 'draft');
|
||||
|
||||
// Onaya gönder
|
||||
$translation->submitForReview();
|
||||
|
||||
// Onayla
|
||||
$translation->approve(auth()->id());
|
||||
|
||||
// Yayınla
|
||||
$translation->publish(auth()->id());
|
||||
|
||||
// Reddet
|
||||
$translation->reject();
|
||||
```
|
||||
|
||||
### Dil Değiştirme
|
||||
|
||||
```php
|
||||
// Runtime'da dil değiştir
|
||||
switch_language('en');
|
||||
|
||||
// Uygulama dili
|
||||
app()->setLocale('tr');
|
||||
```
|
||||
|
||||
## 🔐 Kullanıcı Yetkilendirme
|
||||
|
||||
### Kullanıcıya Dil Atama
|
||||
|
||||
```php
|
||||
// Tam yetki ile dil ata
|
||||
$user->assignLanguage('tr',
|
||||
canCreate: true,
|
||||
canEdit: true,
|
||||
canApprove: true,
|
||||
canPublish: true
|
||||
);
|
||||
|
||||
// Sadece oluşturma ve düzenleme yetkisi
|
||||
$user->assignLanguage('en',
|
||||
canCreate: true,
|
||||
canEdit: true,
|
||||
canApprove: false,
|
||||
canPublish: false
|
||||
);
|
||||
```
|
||||
|
||||
### Yetki Kontrolleri
|
||||
|
||||
```php
|
||||
// Kullanıcı bu dili yönetebilir mi?
|
||||
if ($user->canManageLanguage('en')) {
|
||||
// ...
|
||||
}
|
||||
|
||||
// Specific permissions
|
||||
if ($user->canCreateInLanguage('en')) { }
|
||||
if ($user->canEditInLanguage('en')) { }
|
||||
if ($user->canApproveInLanguage('en')) { }
|
||||
if ($user->canPublishInLanguage('en')) { }
|
||||
|
||||
// Kullanıcının yönettiği diller
|
||||
$languages = $user->getManagedLanguages();
|
||||
$codes = $user->getManagedLanguageCodes(); // ['tr', 'en']
|
||||
```
|
||||
|
||||
### Query Filtering
|
||||
|
||||
```php
|
||||
// Sadece belirli dildeki içerikleri getir
|
||||
Blog::whereHasTranslation('en')->get();
|
||||
|
||||
// Kullanıcının yönettiği dillerdeki içerikleri getir
|
||||
Blog::whereHasTranslationForUser(auth()->user())->get();
|
||||
```
|
||||
|
||||
## 🛠️ Helper Functions
|
||||
|
||||
```php
|
||||
// Mevcut dil
|
||||
$language = current_language(); // Language model
|
||||
$code = current_language_code(); // 'tr'
|
||||
|
||||
// Varsayılan dil
|
||||
$defaultLang = default_language();
|
||||
$defaultCode = default_language_code();
|
||||
|
||||
// Aktif diller
|
||||
$languages = available_languages(); // Collection
|
||||
$codes = available_language_codes(); // ['tr', 'en']
|
||||
|
||||
// Model çevirisi
|
||||
$value = translate_model($blog, 'title', 'en');
|
||||
|
||||
// Çeviri kontrolü
|
||||
$exists = has_translation($blog, 'title', 'en');
|
||||
|
||||
// İlerleme
|
||||
$progress = translation_progress($blog, 'en'); // 75
|
||||
|
||||
// Kullanıcı yetkileri
|
||||
$can = user_can_manage_language('en');
|
||||
$languages = user_managed_languages();
|
||||
$codes = user_managed_language_codes();
|
||||
|
||||
// Dil bilgileri
|
||||
$flag = get_language_flag('tr'); // 🇹🇷
|
||||
$name = format_language_name('tr'); // Turkish (Türkçe)
|
||||
|
||||
// Status
|
||||
$badge = get_translation_status_badge('published');
|
||||
$color = get_translation_status_color('draft');
|
||||
```
|
||||
|
||||
## 📊 Filament Admin Panel
|
||||
|
||||
### Language Management
|
||||
|
||||
Admin panelde **Languages** resource'u üzerinden:
|
||||
- ✅ Dil ekleme/düzenleme/silme
|
||||
- ✅ Dil aktif/pasif yapma
|
||||
- ✅ Varsayılan dil seçme
|
||||
- ✅ Sıralama düzenleme
|
||||
- ✅ RTL/LTR desteği
|
||||
|
||||
### Permissions
|
||||
|
||||
Spatie Permission ile entegre:
|
||||
- `language::viewAny`
|
||||
- `language::view`
|
||||
- `language::create`
|
||||
- `language::update`
|
||||
- `language::delete`
|
||||
- `language::restore`
|
||||
- `language::forceDelete`
|
||||
- `language::activate`
|
||||
- `language::setDefault`
|
||||
|
||||
### Policy Kuralları
|
||||
|
||||
- Varsayılan dil silinemez
|
||||
- Varsayılan dil pasif edilemez
|
||||
- Super admin tüm yetkilere sahip
|
||||
- Diğer kullanıcılar permission'lara göre erişir
|
||||
|
||||
## 🎨 Translation Workflow Statuses
|
||||
|
||||
| Status | Açıklama | Badge Color |
|
||||
|--------|----------|-------------|
|
||||
| `draft` | Taslak, henüz onaylanmamış | Gray |
|
||||
| `review` | Onay bekliyor | Warning |
|
||||
| `approved` | Onaylanmış, yayınlanmayı bekliyor | Success |
|
||||
| `published` | Yayınlanmış, görünür | Primary |
|
||||
|
||||
## 📦 Database Schema
|
||||
|
||||
### languages
|
||||
|
||||
```sql
|
||||
id, code (unique), name, native_name, flag, direction,
|
||||
is_active, is_default, sort_order,
|
||||
created_by, updated_by, created_at, updated_at, deleted_at
|
||||
```
|
||||
|
||||
### translations
|
||||
|
||||
```sql
|
||||
id, translatable_type, translatable_id, language_code,
|
||||
field_name, field_value, status, version,
|
||||
created_by, updated_by, approved_by, approved_at, published_at,
|
||||
created_at, updated_at, deleted_at
|
||||
|
||||
UNIQUE: translatable_type + translatable_id + language_code + field_name
|
||||
```
|
||||
|
||||
### user_languages
|
||||
|
||||
```sql
|
||||
id, user_id, language_code,
|
||||
can_create, can_edit, can_approve, can_publish,
|
||||
created_at, updated_at
|
||||
|
||||
UNIQUE: user_id + language_code
|
||||
```
|
||||
|
||||
## 🚀 Örnekler
|
||||
|
||||
### Yeni Model için Çeviri Ekle
|
||||
|
||||
```php
|
||||
// 1. Model oluştur
|
||||
class Product extends Model
|
||||
{
|
||||
use HasTranslations;
|
||||
|
||||
protected $translatable = ['name', 'description', 'features'];
|
||||
}
|
||||
|
||||
// 2. Çeviri ekle
|
||||
$product = Product::create(['name' => 'Ürün', 'slug' => 'urun']);
|
||||
$product->setTranslation('name', 'en', 'Product', 'published');
|
||||
$product->setTranslation('description', 'en', 'Product description', 'published');
|
||||
|
||||
// 3. Kullan
|
||||
echo $product->translate('name'); // Mevcut dilde
|
||||
echo $product->translate('name', 'en'); // İngilizce'de
|
||||
```
|
||||
|
||||
### Çeviri İlerlemesi Widget
|
||||
|
||||
```php
|
||||
$progress = $blog->getTranslationProgress();
|
||||
foreach ($progress as $langCode => $percentage) {
|
||||
$language = Language::findByCode($langCode);
|
||||
echo "{$language->flag} {$language->name}: {$percentage}%";
|
||||
}
|
||||
```
|
||||
|
||||
### Kullanıcı Dil Yönetimi
|
||||
|
||||
```php
|
||||
// Turkish Editor oluştur
|
||||
$user = User::find(1);
|
||||
$user->assignLanguage('tr', true, true, false, true);
|
||||
|
||||
// English Translator oluştur
|
||||
$translator = User::find(2);
|
||||
$translator->assignLanguage('en', true, true, false, false);
|
||||
|
||||
// Multi-language Manager
|
||||
$manager = User::find(3);
|
||||
$manager->assignLanguage('tr', true, true, true, true);
|
||||
$manager->assignLanguage('en', true, true, true, true);
|
||||
```
|
||||
|
||||
## ⚡ Performans
|
||||
|
||||
- ✅ Indexed queries (translatable_type, translatable_id, language_code)
|
||||
- ✅ Eager loading desteği
|
||||
- ✅ Cache-ready yapı
|
||||
- ✅ Efficient polymorphic relationships
|
||||
- ✅ Unique constraints
|
||||
|
||||
## 🔄 Migration
|
||||
|
||||
Mevcut projeden yeni sisteme geçiş için:
|
||||
|
||||
```php
|
||||
// Eski sistem
|
||||
$blog->title_tr
|
||||
$blog->title_en
|
||||
|
||||
// Yeni sisteme migrate
|
||||
$blog->setTranslation('title', 'tr', $blog->title_tr, 'published');
|
||||
$blog->setTranslation('title', 'en', $blog->title_en, 'published');
|
||||
```
|
||||
|
||||
## 📝 Notlar
|
||||
|
||||
1. **Zero Configuration**: Yeni model için sadece trait ekle
|
||||
2. **Dynamic**: Runtime'da dil ekle/çıkar
|
||||
3. **Role-Based**: Her kullanıcı farklı dilleri yönetebilir
|
||||
4. **Workflow**: Draft → Review → Approved → Published
|
||||
5. **Fallback**: Çeviri yoksa default dile düş
|
||||
6. **Version Control**: Her çevirinin versiyonu
|
||||
7. **Soft Delete**: Tüm tablolar soft delete destekli
|
||||
|
||||
## 🎯 Gelecek Özellikler (TODO)
|
||||
|
||||
- [ ] Translation approval notifications
|
||||
- [ ] Bulk translation import/export
|
||||
- [ ] Translation memory (önceki çevirilerden öner)
|
||||
- [ ] AI-powered translation suggestions
|
||||
- [ ] Translation dashboard widget
|
||||
- [ ] Language-specific user roles
|
||||
- [ ] Translation history/audit log
|
||||
- [ ] Compare translations side-by-side
|
||||
- [ ] Missing translations report
|
||||
|
||||
## 📚 İlgili Dosyalar
|
||||
|
||||
- Models: `app/Models/Language.php`, `Translation.php`, `UserLanguage.php`
|
||||
- Trait: `app/Traits/HasTranslations.php`
|
||||
- Helpers: `app/Helpers/translation_helpers.php`
|
||||
- Resource: `app/Filament/Admin/Resources/Languages/`
|
||||
- Policy: `app/Policies/LanguagePolicy.php`
|
||||
- Migrations: `database/migrations/*_create_languages_table.php`
|
||||
- Translations: `lang/tr/language.php`, `lang/en/language.php`
|
||||
|
||||
---
|
||||
|
||||
**Geliştirici:** Citrus Platform Team
|
||||
**Versiyon:** 1.0.0
|
||||
**Tarih:** 1 Ekim 2025
|
||||
|
||||
Reference in New Issue
Block a user