# 🌍 Internationalisation CHAPS

Architecture d'internationalisation (i18n) mise en place pour CHAPS Admin.

## 📁 Structure des Fichiers

```
app/
├── Constants/              # Constantes réorganisées
│   ├── Status.php         # Codes de statuts
│   ├── Modules.php        # Noms de modules
│   ├── Business.php       # Règles métier
│   └── ApiEndpoints.php   # URLs API externes
│
├── Helpers/
│   ├── TranslationHelper.php  # Classe helper
│   └── helpers.php           # Fonctions globales
│
├── Http/Middleware/
│   └── SetLocale.php      # Middleware de détection de langue
│
resources/lang/
├── fr/
│   ├── status.php         # Traductions des statuts
│   ├── common.php         # Termes communs
│   ├── modules.php        # Noms de modules
│   └── message.php        # Messages existants
└── en/
    ├── status.php
    ├── common.php
    └── modules.php
```

## 🚀 Utilisation

### 1. Dans les Controllers/Services PHP

```php
use App\Constants\Status;
use App\Constants\Modules;

// Utiliser les constantes (stockage en BDD)
$document->status = Status::PENDING;  // Stocke "pending"

// Afficher traduit
echo trans_status($document->status);  // "À traiter" (FR) / "Pending" (EN)
echo trans_module(Modules::DOCUMENTS); // "Documents" (FR) / "Documents" (EN)
echo trans_common('save');             // "Enregistrer" (FR) / "Save" (EN)
```

### 2. Dans les Vues Blade

```blade
{{-- Méthode 1 : Helpers --}}
{{ trans_status($document->status) }}
{{ trans_module('documents') }}
{{ trans_common('save') }}

{{-- Méthode 2 : Directives Blade personnalisées --}}
@transStatus($document->status)
@transModule('documents')
@transCommon('save')

{{-- Méthode 3 : Laravel standard --}}
{{ __('status.pending') }}
{{ __('modules.documents') }}
{{ __('common.save') }}
```

### 3. Changer de Langue

#### Option A : Via URL
```
http://localhost/admin?lang=en
http://localhost/admin?lang=fr
```

#### Option B : Via Session
```php
Session::put('locale', 'en');
```

#### Option C : Via Préférence Utilisateur (BDD)
Ajouter une colonne `locale` à la table `users` :
```php
$user->locale = 'en';
$user->save();
```

## 📊 Exemples de Migration BDD

### Avant (Strings FR en BDD)
```php
// ❌ Mauvaise pratique
$document->status = "À traiter";
$document->status = "En cours";
```

### Après (Codes en BDD)
```php
// ✅ Bonne pratique
use App\Constants\Status;

$document->status = Status::PENDING;     // Stocke "pending"
$document->status = Status::IN_PROGRESS; // Stocke "in_progress"

// Affichage automatiquement traduit
echo trans_status($document->status);
```

## 🔧 Configuration

### Langue par Défaut
Fichier : `config/app.php`
```php
'locale' => 'fr',
'fallback_locale' => 'fr',
'available_locales' => ['fr', 'en'],
```

### Middleware Actif
Le middleware `SetLocale` est automatiquement activé pour toutes les routes web.

Ordre de priorité :
1. Paramètre URL (`?lang=en`)
2. Session utilisateur
3. Préférence utilisateur (colonne `locale` en BDD)
4. Langue par défaut (`config/app.php`)

## 📝 Ajouter une Nouvelle Traduction

### 1. Ajouter la Constante
```php
// app/Constants/Status.php
const VALIDATED = 'validated';
```

### 2. Ajouter les Traductions
```php
// resources/lang/fr/status.php
'validated' => 'Validé',

// resources/lang/en/status.php
'validated' => 'Validated',
```

### 3. Utiliser
```php
use App\Constants\Status;

$document->status = Status::VALIDATED;
echo trans_status($document->status); // "Validé" ou "Validated"
```

## 🌐 Ajouter une Nouvelle Langue (ex: ES)

1. **Créer les fichiers** :
   ```
   resources/lang/es/status.php
   resources/lang/es/common.php
   resources/lang/es/modules.php
   ```

2. **Mettre à jour la config** :
   ```php
   // config/app.php
   'available_locales' => ['fr', 'en', 'es'],
   ```

3. **Optionnel : Ajouter un helper** :
   ```php
   // app/Helpers/TranslationHelper.php
   public static function isSpanish(): bool {
       return App::getLocale() === 'es';
   }
   ```

## ✅ Avantages

- ✅ **Maintenance centralisée** : Constantes dans un seul endroit
- ✅ **Multi-langue** : Ajout de langues sans modifier le code
- ✅ **BDD propre** : Codes au lieu de labels traduits
- ✅ **Évolutif** : Nouvelles langues = nouveaux fichiers
- ✅ **Type-safe** : Constantes de classe (autocomplétion IDE)
- ✅ **Performance** : Pas de requête BDD pour les traductions

## 🔄 Script de Migration (Optionnel)

Pour convertir les anciennes valeurs FR en codes :

```php
// database/migrations/YYYY_MM_DD_migrate_status_to_codes.php
use App\Constants\Status;

$mapping = [
    'À traiter' => Status::PENDING,
    'En cours' => Status::IN_PROGRESS,
    'Terminé' => Status::COMPLETED,
    'Archivé' => Status::ARCHIVED,
];

DB::table('documents')->get()->each(function($doc) use ($mapping) {
    if (isset($mapping[$doc->status])) {
        DB::table('documents')
            ->where('id', $doc->id)
            ->update(['status' => $mapping[$doc->status]]);
    }
});
```

## 📚 Références

- Laravel Localization : https://laravel.com/docs/11.x/localization
- Constants PHP : https://www.php.net/manual/en/language.constants.php
- Blade Directives : https://laravel.com/docs/11.x/blade#custom-directives
