2012-04-06 15 views
5

Voglio tradurre un negozio Magento frontend usando solo un file csv. Così ho fatto questo:Come funziona Magento translate?

Ho creato un modulo personalizzato chiamato Traduttore. Nella sua config.xml Ho messo queste righe:

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

</config> 

Poi ho creato de predefinita aiutante Data.php nella mia cartella Helper.

Quindi in app/locale/de_DE ho creato il file MyPackage_Translator.csv dove ho messo tutte le mie stringhe.

Ora, se in un file phtml (indipendentemente dal modulo), se faccio qualcosa di simile:

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

funziona piuttosto bene. Ma sono curioso perché Magento guarda nel MyPackage_Translator.csv per la stringa?

Ho anche notato che, se sto usando $ this -> __ ('some string'); nel modulo Cliente, Magento cercherà per prima cosa nel file app/locale/de_DE/Mage_Customer.csv per la stringa, e se non trova la stringa lì, allora apparirà nel mio file MyPackage_Translator.csv. Perché? Perché non appare nel file Enterprise_Customer.csv per esempio?

Qualcuno può spiegarmi il flusso di lavoro di Magento quando sta cercando il file di traduzione?

risposta

10

Quando si chiama $ this -> __ ('some text');

si può iniziare, cercando in 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); 
} 

successivo è 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; 
} 

Che è consegnato al 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; 
} 

che restituisce il testo risultante. Questa è una breve descrizione di come tutto sarebbe gestito, dovresti visualizzare le classi stesse per ottenere una comprensione più approfondita.

+0

Forse è possibile tradurre direttamente su Mage_Core.csv –

+0

Non consiglierei un'azione del genere in quanto non è consigliabile modificare alcun file di base fornito da Magento. Non sarebbe una prova di aggiornamento. Si stava muovendo nella giusta direzione, sovraccaricando la core class per Translate –

+0

Voglio dire, usa Mage_Core.csv nella tua lingua specifica. Non sovrascrivere quello originale. –

Problemi correlati