2012-04-06 78 views
5

我想僅使用一個csv文件翻譯前端Magento商店。所以我這樣做了:Magento如何翻譯作品?

我已經創建了一個名爲Translator的自定義模塊。在其config.xml中我已經把這些行:

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

</config> 

然後我在我的助手去夾默認Data.php助手創建。

然後在app /區域/ de_DE這個我已經創建了,我把我所有的字符串MyPackage_Translator.csv文件。現在

,如果在一個PHTML(無論模塊)文件,如果我這樣做:

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

它工作得很好。但我很好奇爲什麼Magento在MyPackage_Translator.csv中查找字符串?

我也注意到,如果我使用$此 - > __( '一些字符串');在Customer模塊中,Magento會首先在app/locale/de_DE/Mage_Customer.csv文件中查找該字符串,如果它沒有在該字符串中找到該字符串,那麼它會查看MyPackage_Translator.csv文件。這是爲什麼?爲什麼它沒有在Enterprise_Customer.csv文件中查找?

有人可以解釋我的工作流程的Magento做時,它尋找的翻譯文件?

回答

10

當您調用$ this - > __('some text');

您可以通過查看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); 
} 

下一頁開始是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; 
} 

這是交給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; 
} 

返回結果文本。這是一個快速瀏覽一切如何處理的過程,您應該自己查看這些類以獲得更深入的瞭解。

+0

也許你可以在Mage_Core.csv – 2012-12-05 18:00:47

+0

直接轉化我不建議這樣的行動,因爲它是不建議更改任何的Magento提供的核心文件。這不會是升級證明。他正朝着正確的方向前進,翻譯核心類翻譯 – 2012-12-06 15:09:16

+0

我的意思是,使用您的特定語言的Mage_Core.csv。不會覆蓋原來的一個。 – 2014-07-11 20:29:05