🌍
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
| 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) |
Descargar en Markdown
Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.