Search code examples
magentocsvtranslate

How does Magento translate works?


I want to translate a frontend Magento store using only one csv file. So I've done this:

I've created a custom module called Translator. In its config.xml I've put these lines:

<config>
....
<translate>
<modules>
<MyPackage_Translator>
<files>
<default>MyPackage_Translator.csv</default>
</files>
</MyPackage_Translator>
</modules>
</translate>

</config>

Then I've created de default Data.php helper in my Helper folder.

Then in app/locale/de_DE I've created the MyPackage_Translator.csv file where I put all my strings.

Now, if in a phtml(regardless the module) file, if I do something like:

echo $this->__('My string'); 

it works pretty well. But I'm curios why does Magento looks in the MyPackage_Translator.csv for the string?

I also noticed that, if I'm using $this->__('some string'); in the Customer module, Magento will look first in app/locale/de_DE/Mage_Customer.csv file for the string, and if it doesn't find the string there, then it will look in my MyPackage_Translator.csv file. Why is that? Why it doesn't look in Enterprise_Customer.csv file for example?

Can someone explain me the workflow Magento does when it's looking for the translation file?


Solution

  • When you call $this->__('some text');

    You can start by looking at Mage_Core_Helper_Abstract

    /**
     * Translate
     *
     * @return string
     */
    public function __()
    {
        $args = func_get_args();
        $expr = new Mage_Core_Model_Translate_Expr(array_shift($args), $this->_getModuleName());
        array_unshift($args, $expr);
        return Mage::app()->getTranslator()->translate($args);
    }
    

    Next is Mage_Core_Model_App

    /**
     * Retrieve translate object
     *
     * @return Mage_Core_Model_Translate
     */
    public function getTranslator()
    {
        if (!$this->_translator) {
            $this->_translator = Mage::getSingleton('core/translate');
        }
        return $this->_translator;
    }
    

    Which is handed to Mage_Core_Model_Translate

    /**
     * Translate
     *
     * @param   array $args
     * @return  string
     */
    public function translate($args)
    {
        $text = array_shift($args);
    
        if (is_string($text) && ''==$text
            || is_null($text)
            || is_bool($text) && false===$text
            || is_object($text) && ''==$text->getText()) {
            return '';
        }
        if ($text instanceof Mage_Core_Model_Translate_Expr) {
            $code = $text->getCode(self::SCOPE_SEPARATOR);
            $module = $text->getModule();
            $text = $text->getText();
            $translated = $this->_getTranslatedString($text, $code);
        }
        else {
            if (!empty($_REQUEST['theme'])) {
                $module = 'frontend/default/'.$_REQUEST['theme'];
            } else {
                $module = 'frontend/default/default';
            }
            $code = $module.self::SCOPE_SEPARATOR.$text;
            $translated = $this->_getTranslatedString($text, $code);
        }
    
        //array_unshift($args, $translated);
        //$result = @call_user_func_array('sprintf', $args);
    
        $result = @vsprintf($translated, $args);
        if ($result === false) {
            $result = $translated;
        }
    
        if ($this->_translateInline && $this->getTranslateInline()) {
            if (strpos($result, '{{{')===false || strpos($result, '}}}')===false || strpos($result, '}}{{')===false) {
                $result = '{{{'.$result.'}}{{'.$translated.'}}{{'.$text.'}}{{'.$module.'}}}';
            }
        }
    
        return $result;
    }
    

    which returns the resulting text. This is a quick walk through of how everything would be handled, you should view the classes themselves to get a more in depth understanding.