---
title: Sistema de traducciones — Legacy vs Moderno
section: trucos
slug: translations
description: "Guia completa del sistema de traducciones de PrestaShop: diferencias entre Legacy (MD5 hashes) y Moderno (Symfony/XLIFF), dominios PascalCase, escaner del BO y checklist de exito."
keywords: prestashop traducciones trans xlf xliff dominio legacy moderno symfony modulo
last_updated: 2024-12-01
source_url: "https://ayudaprestashop.es/trucos/translations"
---

# Sistema de traducciones — Legacy vs Moderno

> Guia completa del sistema de traducciones de PrestaShop: diferencias entre Legacy (MD5 hashes) y Moderno (Symfony/XLIFF), dominios PascalCase, escaner del BO y checklist de exito.

PrestaShop convive con **dos sistemas de traduccion**. El uso de uno u otro depende del valor de `isUsingNewTranslationSystem()` en el modulo. Es critico entender cual usar en cada escenario para evitar que las traducciones no aparezcan en el BackOffice.

## Los dos sistemas de traduccion

| Aspecto | Sistema Moderno (Symfony) | Sistema Legacy |
| --- | --- | --- |
| Activado si... | isUsingNewTranslationSystem() = true | metodo no existe o retorna false |
| PHP | $this->trans('Text', [], 'Dominio') | $this->l('Text') |
| Smarty | {l s='Text' d='Dominio'} | {l s='Text' mod='modulo'} |
| Archivos | translations/{locale}/Modulos*.xlf | translations/es.php (hashes MD5) |
| Dominio | Modules.Mymodule.Section (PascalCase) | Nombre del modulo |
| Recomendado para | PS 1.7.6+, 8.x, 9.x | PS 1.6, PS 1.7 antiguo |

## Sistema Moderno (Symfony) — RECOMENDADO

*Activar el sistema moderno en el modulo*

```php
<?php

class MyModule extends Module
{
    public function isUsingNewTranslationSystem(): bool
    {
        return true; // Activa el sistema Symfony/XLIFF
    }

    // Uso en PHP:
    public function someMethod(): string
    {
        // $this->trans('cadena', [params], 'Dominio')
        // El dominio SIEMPRE en PascalCase
        return $this->trans(
            'Hello %name%!',
            ['%name%' => 'World'],
            'Modules.Mymodule.Admin'   // PascalCase del nombre del modulo
        );
    }
}
```

*Uso en templates Smarty (FO)*

```smarty
{l s='Add to cart' d='Modules.Mymodule.Shop'}
{l s='Hello %name%!' sprintf=['%name%' => $customer.firstname] d='Modules.Mymodule.Shop'}
```

*Uso en templates Twig (BO moderno)*

```twig
{{ 'Configure'|trans({}, 'Modules.Mymodule.Admin') }}
{{ 'Hello %name%!'|trans({'%name%': customer.firstname}, 'Modules.Mymodule.Admin') }}
```

## Reglas de oro para el sistema moderno

> **[!!] Critico: cadenas literales (no variables)**
>
> El escaner del BackOffice NO puede leer variables. Si usas `$this->trans($variable, [], $dominio)`, la cadena nunca aparecera en el traductor. Siempre escribe la cadena directamente: `$this->trans('Mi cadena', [], 'Dominio')`.

| Regla | Mal | Bien |
| --- | --- | --- |
| Cadenas literales | $this->trans($var, [], $dom) | $this->trans('Literal', [], 'Dom') |
| Dominio PascalCase | modules.mymodule.admin | Modules.Mymodule.Admin |
| Nombre del modulo en dominio | Modules.ecom_mymodule.Admin | Modules.Ecommymodule.Admin |
| Trans en AJAX controllers | $this->trans('...') | $this->module->getTranslator()->trans(...) |

## Archivos XLIFF (PS 8/9)

Para distribuir traducciones con el modulo sin que el cliente tenga que configurar nada, usa archivos XLIFF en `translations/{locale}/`.

*Ruta del archivo XLIFF*

```bash
translations/
└── es-ES/
    ├── ModulesMymoduleAdmin.es-ES.xlf    # BO
    └── ModulesMymoduleShop.es-ES.xlf     # FO

# Convencion: {Modules}{NombreModuloPascalCase}{Seccion}.{locale}.xlf
```

*Estructura del archivo XLIFF*

```xml
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
  <file source-language="en-US"
        target-language="es-ES"
        datatype="plaintext"
        original="ModulesMymoduleAdmin">
    <body>
      <trans-unit id="Configure">
        <source>Configure</source>
        <target>Configurar</target>
      </trans-unit>
      <trans-unit id="Save">
        <source>Save</source>
        <target>Guardar</target>
      </trans-unit>
      <trans-unit id="Hello name">
        <source>Hello %name%!</source>
        <target>!Hola %name%!</target>
      </trans-unit>
    </body>
  </file>
</xliff>
```

## Checklist de exito

*Checklist antes de probar traducciones*

```bash
# 1. ¿isUsingNewTranslationSystem() devuelve true?
# 2. ¿Las cadenas son literales (no variables)?
# 3. ¿El dominio es PascalCase exacto? (Modules.Mymodule.Admin)
# 4. ¿El locale del archivo XLIFF coincide con el idioma de la tienda? (es-ES)
# 5. ¿Se ha borrado la cache?

# Limpiar cache PS 8/9:
php bin/console cache:clear

# O desde el BO: Parametros Avanzados > Rendimiento > Vaciar cache
```

## Troubleshooting

| Sintoma | Causa probable | Solucion |
| --- | --- | --- |
| Cadena no aparece en el traductor BO | Variable en lugar de literal | Usar cadena literal en el codigo |
| Traduccion no se aplica | Cache de Symfony activa | php bin/console cache:clear |
| Archivo XLIFF ignorado | Locale incorrecto (es vs es-ES) | Verificar locale con iso_code del idioma |
| Trans en AJAX no funciona | Metodo incorrecto en controller | Usar $this->module->getTranslator()->trans() |
| Dominio no encontrado | PascalCase incorrecto | Modulo 'ecom_mymodule' → dominio 'Ecommymodule' (sin guiones) |


---

*Fuente: [https://ayudaprestashop.es/trucos/translations](https://ayudaprestashop.es/trucos/translations). Version Markdown generada automaticamente para consumo por LLMs.*
