2012-04-06 70 views
5

Tôi muốn dịch một cửa hàng Magento giao diện người dùng chỉ sử dụng một tệp csv. Vì vậy, tôi đã thực hiện điều này:Dịch Magento hoạt động như thế nào?

Tôi đã tạo mô-đun tùy chỉnh có tên là Translator. Trong config.xml của tôi, tôi đã đặt những dòng này:

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

</config> 

Sau đó, tôi đã tạo trình trợ giúp Data.php mặc định trong thư mục Trình trợ giúp của tôi.

Sau đó, trong app/locale/de_DE tôi đã tạo tệp MyPackage_Translator.csv nơi tôi đặt tất cả các chuỗi của mình.

Bây giờ, nếu trong một phtml (không phân biệt các mô-đun) tập tin, nếu tôi làm điều gì đó như:

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

nó hoạt động khá tốt. Nhưng tôi là curios tại sao Magento nhìn vào MyPackage_Translator.csv cho chuỗi?

Tôi cũng nhận thấy rằng, nếu tôi đang sử dụng $ this -> __ ('some string'); trong mô-đun Khách hàng, Magento sẽ tìm kiếm đầu tiên trong tệp app/locale/de_DE/Mage_Customer.csv cho chuỗi và nếu nó không tìm thấy chuỗi đó, thì nó sẽ tìm trong tệp MyPackage_Translator.csv của tôi. Tại sao vậy? Tại sao nó không có trong tệp Enterprise_Customer.csv chẳng hạn?

Ai đó có thể giải thích cho tôi về quy trình làm việc mà Magento thực hiện khi tìm kiếm tệp dịch không?

Trả lời

10

Khi bạn gọi $ this -> __ ('some text');

Bạn có thể bắt đầu bằng cách nhìn vào 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); 
} 

Tiếp theo là 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; 
} 

Đó là giao cho 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; 
} 

mà trả về văn bản kết quả. Đây là một bước đi nhanh chóng về cách tất cả mọi thứ sẽ được xử lý, bạn nên xem các lớp học của mình để có được một sự hiểu biết sâu sắc hơn.

+0

Có thể bạn có thể dịch trực tiếp tại Mage_Core.csv –

+0

Tôi sẽ không đề xuất một hành động như vậy vì không khuyên bạn nên thay đổi bất kỳ tệp lõi nào mà Magento cung cấp. Nó sẽ không được nâng cấp bằng chứng. Anh ấy đang di chuyển đúng hướng với quá tải lớp cốt lõi cho Dịch –

+0

Ý tôi là, sử dụng Mage_Core.csv bằng ngôn ngữ cụ thể của bạn. Không ghi đè bản gốc. –

Các vấn đề liên quan