閱讀463 返回首頁    go 阿裏雲 go 技術社區[雲棲]


magento -- 修正又一個翻譯上的bug,同時了解了下Magento解析xml的方式

Magento在翻譯上的bug可謂多入牛毛,有些地方你會發現無論你如何在CSV文件裏配置翻譯項,英文的依然是英文。Magento是用helper類的魔術方法來做多語言的處理,比如

Mage::helper('adminhtml')->__('-- Please select --') 

 

而無法翻譯的地方大多數就是因為需要翻得詞沒有用Mage::helper('XXX')->__()來做處理,或者說Magento官方遺漏了。對於非英語國家來說,想要完整的翻譯完Magento就得把這些地方都給找出來,一個個處理掉。

今天處理掉的一個地方是後台產品頁的自定義選項,給產品添加自定義選項需要先選擇輸入類型,如文本框或下拉框,而可選擇的類型都是英文顯示,這些詞在Adminhtml.csv中都有翻譯項,不過明顯不起作用。

同樣的原因,這裏也是因為官方遺漏了這些詞的處理,打開/app/code/core/Mage/Adminhtml/Model/System/Config/Source/Product/Options/Type.php,找到如下代碼

 

foreach (Mage::getConfig()->getNode($typesPath)->children() as $type) { $labelPath = self::PRODUCT_OPTIONS_GROUPS_PATH . '/' . $group->getName() . '/types/' . $type->getName() . '/label'; $types[] = array( 'label' => (string) Mage::getConfig()->getNode($labelPath), 'value' => $type->getName() ); } $labelPath = self::PRODUCT_OPTIONS_GROUPS_PATH . '/' . $group->getName() . '/label'; $groups[] = array( 'label' => (string) Mage::getConfig()->getNode($labelPath), 'value' => $types ); 

 

這裏的兩個'label'就是可選輸入類型的標簽,可以看到賦值的時候並沒有使用Mage::helper('XXX')->__(),加上處理的代碼,修改後的如下

foreach (Mage::getConfig()->getNode($typesPath)->children() as $type) { $labelPath = self::PRODUCT_OPTIONS_GROUPS_PATH . '/' . $group->getName() . '/types/' . $type->getName() . '/label'; $types[] = array( 'label' => Mage::helper('adminhtml')->__((string) Mage::getConfig()->getNode($labelPath)), 'value' => $type->getName() ); } $labelPath = self::PRODUCT_OPTIONS_GROUPS_PATH . '/' . $group->getName() . '/label'; $groups[] = array( 'label' => Mage::helper('adminhtml')->__((string) Mage::getConfig()->getNode($labelPath)), 'value' => $types ); 

 

這樣這裏就會去讀取csv文件裏的翻譯項來做翻譯了,效果如下

 

 

今天處理這個bug的時候還有意外收獲,之前一直沒注意過Magento是怎麼在處理解析xml文件的,因為上麵的各種類型是從config.xml裏讀取的,所以看到了Magento解析xml的過程。

const PRODUCT_OPTIONS_GROUPS_PATH = 'global/catalog/product/options/custom/groups'; foreach (Mage::getConfig()->getNode(self::PRODUCT_OPTIONS_GROUPS_PATH)->children() as $group) { ………………………………………… 

 

Mage::getConfig()->getNode()這個函數可以根據節點來獲得節點下的內容,參數就是你要解析的節點,如'global/catalog/product/options/custom/groups',根據這個參數,Magento就能準確的找到xml文件裏你要的內容,比如'global/catalog/product/options/custom/groups'這個對應的就是/app/code/core/Mage/Catalog/etc/config.xml裏的代碼

<options> <custom> <groups> <text translate="label" module="adminhtml"> <label>Text</label> <render>adminhtml/catalog_product_edit_tab_options_type_text</render> <types> <field translate="label" module="adminhtml"> <label>Field</label> </field> <area translate="label" module="adminhtml"> <label>Area</label> </area> </types> </text> <file translate="label" module="adminhtml"> <label>File</label> <render>adminhtml/catalog_product_edit_tab_options_type_file</render> <types> <file translate="label" module="adminhtml"> <label>File</label> </file> </types> </file> <select translate="label" module="adminhtml"> ………………………………………………………………………………………… 

最後更新:2017-04-02 06:51:29

  上一篇:go hgeSprite類
  下一篇:go Magento 模塊基礎架構文件包