# 🌍 Módulo de Traducciones

## Descripción

El módulo de traducciones permite gestionar contenido multiidioma en el sistema CD-System. Es un módulo opcional que se activa/desactiva desde la configuración.

## Características

- ✅ Módulo opcional (activar/desactivar con `active: true/false`)
- ✅ JSON separados por idioma (blog-es.json, blog-en.json, etc.)
- ✅ Compatible con el sistema actual (si está desactivado, funciona normal)
- ✅ Trait `Translatable` reutilizable para cualquier modelo
- ✅ Middleware automático para detectar idioma del usuario
- ✅ Fallback al idioma por defecto si no hay traducción

## Estructura del Módulo

```
app/Modules/Translations/
  ├── Models/
  │   ├── Language.php
  │   ├── PostTranslation.php
  │   └── ProductTranslation.php
  ├── Traits/
  │   └── Translatable.php
  ├── Services/
  │   └── TranslationService.php
  └── Middleware/
      └── SetLocale.php
```

## Configuración

### 1. Activar el módulo

En `database/seeders/project-data/cd-system.json`:

```json
{
  "modules": {
    "translations": {
      "active": true,
      "default_locale": "es",
      "available_locales": ["es", "en", "fr"]
    }
  }
}
```

### 2. Ejecutar migraciones

```bash
php artisan migrate
```

Esto crea las tablas:
- `languages`
- `post_translations`
- `product_translations`
- `post_category_translations`
- `product_category_translations`

### 3. Seedear idiomas

```bash
php artisan db:seed --class=LanguagesSeeder
```

### 4. Seedear contenido traducido

```bash
php artisan db:seed --class=BlogSeeder
php artisan db:seed --class=ProductsSeeder
```

## Uso en Modelos

Para hacer un modelo traducible, usa el trait `Translatable`:

```php
use App\Modules\Translations\Traits\Translatable;

class Post extends Model
{
    use Translatable;
    
    // Campos traducibles
    protected $translatable = ['title', 'slug', 'description', 'content'];
}
```

El trait automáticamente:
- Detecta si el módulo está activo
- Obtiene traducciones según el locale actual
- Hace fallback al idioma por defecto si no hay traducción

## Uso en Controladores

```php
// Cambiar idioma desde el frontend
public function changeLanguage($locale)
{
    if (in_array($locale, TranslationService::getAvailableLocales())) {
        session(['locale' => $locale]);
        app()->setLocale($locale);
    }
    return redirect()->back();
}
```

## Middleware

El middleware `SetLocale` se ejecuta automáticamente y:
1. Detecta idioma de la sesión
2. Detecta idioma de la URL (ej: /en/blog)
3. Detecta idioma del header Accept-Language
4. Usa idioma por defecto como fallback

## Estructura de JSON

### Formato con traducciones activas

```
database/seeders/project-data/
  ├── blog-es.json
  ├── blog-en.json
  ├── products-es.json
  └── products-en.json
```

### Formato sin traducciones (módulo desactivado)

```
database/seeders/project-data/
  ├── blog.json
  └── products.json
```

## Ejemplo de JSON traducido

**blog-es.json** (idioma por defecto):
```json
{
  "posts": [
    {
      "title": "Guía Completa",
      "slug": "guia-completa",
      "description": "...",
      "content": "...",
      "header": "image.jpg",
      "user_id": 1,
      "status": "published"
    }
  ]
}
```

**blog-en.json** (traducción):
```json
{
  "posts": [
    {
      "title": "Complete Guide",
      "slug": "complete-guide",
      "description": "...",
      "content": "..."
    }
  ]
}
```

**Nota**: En las traducciones solo necesitas los campos traducibles. Los demás campos se toman del JSON por defecto.

## API del Servicio

```php
use App\Modules\Translations\Services\TranslationService;

// Verificar si está activo
TranslationService::isActive();

// Obtener locales disponibles
TranslationService::getAvailableLocales();

// Obtener locale por defecto
TranslationService::getDefaultLocale();

// Cargar JSON por idioma
$data = TranslationService::loadJsonData('blog', 'en');
```

## Extender a Otros Modelos

Para agregar traducciones a otros modelos:

1. Crear migración para `{model}_translations`
2. Crear modelo `{Model}Translation`
3. Agregar trait `Translatable` al modelo
4. Definir `$translatable` con los campos traducibles
5. Actualizar seeder para leer JSON por idioma

## Troubleshooting

### Las traducciones no se muestran

1. Verificar que el módulo esté activo: `config('cd-system.modules.translations.active')`
2. Verificar que existan los JSON por idioma
3. Verificar que el locale esté en `available_locales`
4. Verificar que el middleware `SetLocale` esté en `Kernel.php`

### Error al seedear

1. Verificar que el JSON del idioma por defecto exista
2. Verificar que los slugs coincidan entre idiomas
3. Verificar que las categorías existan antes de seedear posts/productos

