Cronjobs con soporte de traducciones en Magento

Mage_Core_Model_Translate

A aquellos que nos toca trabajar mucho con integraciones y automatizaciones de procesos, en particular cuando se deben generar reportes o enviar información; ya nos resulta natural encontrar el siguiente detalle:

En Magento, ni los cronjobs ni las shell class hacen uso del método __() de traducción.

Es por eso que, normalmente, o bien veremos los mensajes en inglés o bien, en el idioma del programador de turno.

Esto podría no ser considerado un problema… salvo que justo estemos haciendo integraciones de una complejidad superior o necesitemos enviar emails que no sólo recibirán una variable sino que usarán plantillas más avanzadas que incluirán bloques y subplantillas.

Cuando nos encontremos con éstas situaciones, si veremos como un problema la falta de traducciones.

Como bien decía al comienzo, este problema se da tanto para los cronjobs como para las shell class.

Para el ejemplo, voy a usar una clase de shell ya que será más rápido. Si no recuerdan cómo armar una mínima clase para usar por consola, aquí hay una breve explicación.

Basado en ese ejemplo, tengo un método llamado test(), que contiene el siguiente código.

private function test()
{
    Zend_Debug::dump(Mage::helper('dc')->__('Installed Extensions'));
}

Ahora, si invoco al método desde mi consola, el mensaje que veré será:

string(20) "Installed Extensions"

Como se puede ver, estoy haciendo uso del helper de un módulo y de la función de traducción (y, claro está, el archivo de traducción para el locale es_AR existe correctamente).

Esto sucede porque a nivel de cronjobs y shell, el traductor nunca es inicializado en Magento.

Para solucionarlo, en nuestro método tenemos que hacer esa inicialización (en el método, en un __construct() o podemos usar una clase abstracta, según el tamaño y la arquitectura del módulo que estemos desarrollando).

Volviendo a nuestro ejemplo, el método debería agregar una línea.

private function test()
{
    Mage::app()->getTranslator()->init(Mage_Core_Model_App_Area::AREA_ADMINHTML);
    Zend_Debug::dump(Mage::helper('dc')->__('Installed Extensions'));
}

Ahora, si ejecutamos, la salida se verá traducida.

string(22) "Extensiones Instaladas"

El motivo por el que se aplica la traducción a es_AR, en mi caso, se debe a que ese es el locale que tiene el backend configurado.