🌍

Sistema de traducciones — Legacy vs Moderno

Actualizado: 2024-12-01

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

AspectoSistema Moderno (Symfony)Sistema Legacy
Activado si...isUsingNewTranslationSystem() = truemetodo no existe o retorna false
PHP$this->trans('Text', [], 'Dominio')$this->l('Text')
Smarty{l s='Text' d='Dominio'}{l s='Text' mod='modulo'}
Archivostranslations/{locale}/Modulos*.xlftranslations/es.php (hashes MD5)
DominioModules.Mymodule.Section (PascalCase)Nombre del modulo
Recomendado paraPS 1.7.6+, 8.x, 9.xPS 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').

ReglaMalBien
Cadenas literales$this->trans($var, [], $dom)$this->trans('Literal', [], 'Dom')
Dominio PascalCasemodules.mymodule.adminModules.Mymodule.Admin
Nombre del modulo en dominioModules.ecom_mymodule.AdminModules.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

SintomaCausa probableSolucion
Cadena no aparece en el traductor BOVariable en lugar de literalUsar cadena literal en el codigo
Traduccion no se aplicaCache de Symfony activaphp bin/console cache:clear
Archivo XLIFF ignoradoLocale incorrecto (es vs es-ES)Verificar locale con iso_code del idioma
Trans en AJAX no funcionaMetodo incorrecto en controllerUsar $this->module->getTranslator()->trans()
Dominio no encontradoPascalCase incorrectoModulo 'ecom_mymodule' → dominio 'Ecommymodule' (sin guiones)
Descargar en Markdown Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.