我创建了一个模块(扩展了 Mage_Core_Model_Abstract)和一个管理控制器。
当我运行这个模块时,在线翻译是正确的。
当我将此模块作为 cronjob 运行时,一切正常,但翻译未完成,我在 config.xml 中指定了翻译文件,并将前端指定为 adminhtml。
我做错了什么?
我创建了一个模块(扩展了 Mage_Core_Model_Abstract)和一个管理控制器。
当我运行这个模块时,在线翻译是正确的。
当我将此模块作为 cronjob 运行时,一切正常,但翻译未完成,我在 config.xml 中指定了翻译文件,并将前端指定为 adminhtml。
我做错了什么?
我看到这是一个非常古老的问题。我已在此处发布以供将来参考和其他人参考。
快速而肮脏的解决方案
// Fix unitialized translator
Mage::app()->getTranslator()->init('frontend', true);
刚过
$initialEnvironmentInfo = $appEmulation>startEnvironmentEmulation($storeId);
例如。或者在foreach
您自己的循环中,通过 cron/admin 调用。既然你在谈论 crons,我假设你知道你在做什么。
真正的问题
在Mage_Core_Model_App_Emulation
(in app/code/core/Mage/Core/Model/App/Emulation.php
) 中的 Magento 1.9 中,有这个功能:
/**
* Apply locale of the specified store
*
* @param integer $storeId
* @param string $area
*
* @return string initial locale code
*/
protected function _emulateLocale($storeId, $area = Mage_Core_Model_App_Area::AREA_FRONTEND)
{
$initialLocaleCode = $this->_app->getLocale()->getLocaleCode();
$newLocaleCode = $this->_getStoreConfig(Mage_Core_Model_Locale::XML_PATH_DEFAULT_LOCALE, $storeId);
if ($initialLocaleCode != $newLocaleCode) {
$this->_app->getLocale()->setLocaleCode($newLocaleCode);
$this->_factory->getSingleton('core/translate')->setLocale($newLocaleCode)->init($area, true);
}
return $initialLocaleCode;
}
$initialLocaleCode != $newLocaleCode
似乎是这里的问题。当迭代 orders/customers/subscribers/* 时,区域设置可能保持不变,这会阻止执行语句中的代码。Mage::app()->getTranslator()
因此,在 Translator ( )中未设置语言环境。
我们尚未解决此问题,但您可以if ($initialLocaleCode != $newLocaleCode) {
直接if (true) {
在核心源中进行更改。当然,这很丑陋。我建议像扩展课程然后:
/**
* Apply locale of the specified store. Extended
* to fix Magento's uninitialized translator.
*
* @see http://stackoverflow.com/questions/19940733/magento-translations-ok-in-online-program-but-not-run-as-cronjob#
* @param integer $storeId
* @param string $area
*
* @return string initial locale code
*/
protected function _emulateLocale($storeId, $area = Mage_Core_Model_App_Area::AREA_FRONTEND)
{
$initialLocaleCode = $this->_app->getLocale()->getLocaleCode();
$newLocaleCode = $this->_getStoreConfig(Mage_Core_Model_Locale::XML_PATH_DEFAULT_LOCALE, $storeId);
$this->_app
->getLocale()
->setLocaleCode($newLocaleCode);
$this->_factory
->getSingleton('core/translate')
->setLocale($newLocaleCode)
->init($area, true);
return $initialLocaleCode;
}
Magento 2
我猜开发人员意识到它很糟糕,他们更改了 Magento 2 中的代码。该_emulateLocale()
函数一起消失了,他们将这一行添加到startEnvironmentEmulation()
函数中,没有任何条件:
$this->_localeResolver->setLocale($newLocaleCode);
即使使用 ! 也是一个错误CE 1.9.0.1
!
看看我做了什么: