ทำเทมเพลต core คุณภาพเยี่ยมใช้ไฟล์แปลของโมดูล


15

ในส่วนขยายที่ฉันใช้งานอยู่ฉันได้เพิ่มโครงร่าง XML ผ่านโมดูล config.xml ของโมดูล เลย์เอาต์นี้มีการดัดแปลงบางส่วนสำหรับส่วนหน้า อย่างไรก็ตามบล็อกเหล่านี้บางส่วนอยู่ในโมดูลหลักของ Magento แม่แบบทั้งหมดแสดงอย่างถูกต้องตามที่คาดไว้

เทมเพลตที่ฉันทำแพ็กเกจด้วยโมดูลนั้นกำลังใช้ไฟล์แปลของโมดูลของฉันเอง แม่แบบที่บรรจุด้วยแกนวีโอไอพีจะแสดงการแปล หากฉันเพิ่มไฟล์การแปลสำหรับโมดูลหลักที่เกี่ยวข้องไฟล์การแปลนั้นจะถูกใช้ & เทมเพลตจะแสดงการแปล

มีวิธีทำให้ Magento ใช้ไฟล์แปลของโมดูลของฉันหรือไม่หากไม่พบไฟล์การแปลสำหรับโมดูลหลักของ Magento? มีอะไรอีกบ้างที่ฉันสามารถทำได้ที่นี่?


คุณสามารถเพิ่มการแปลของคุณไปยังไฟล์การแปลธีมปัจจุบันหรือใช้อินเทอร์เฟซการแปลแบบอินไลน์ในแบ็กเอนด์
Dmytro Zavalkin

ฉันต้องการที่จะแปลแพคเกจด้วยส่วนขยายตัวเองข้างต้นจะต้องเพิ่มคำแนะนำสำหรับทุกคนที่ติดตั้งมัน มีตัวเลือกที่ฉันสามารถทำได้จากรหัสหรือไม่
Mridul Aggarwal

4
มันขึ้นอยู่กับวิธีการแปลภาษาที่ใช้ในการ tempalte, หรือ$this->__() Mage::helper('...')->__()ในกรณีที่มีกำปั้นคุณสามารถบังคับให้บล็อคใช้ตัวช่วยแปลของคุณ แต่ฉันเชื่อว่าในกรณีทั่วไปตัวเลือกเดียวคือการอัพเกรดข้อมูลสำหรับcore_translateตาราง นี่ qestions สากลอธิบายไว้ในรายละเอียด: blog.belvg.com/...
Dmytro Zavalkin

ดูเช่นกันหลีกเลี่ยงการสูญเสียการแปลเมื่อเขียนทับบล็อกเพื่อแก้ปัญหาได้ง่ายขึ้น
hakre

คำตอบ:


20

ไม่ว่าคุณจะเข้าหาที่ใดปัญหาของคุณต้องใช้วิธีการ "สร้างสรรค์" ที่มีค่าหมายเหตุผู้พัฒนาสำหรับผู้พัฒนา / ผู้ดูแลระบบคนต่อไปที่จะใช้ ขั้นแรกพื้นฐานบางอย่างตามมาด้วยการบันทึกตามมาด้วยการที่ง่ายและผมคิดว่าวิธีการแก้ปัญหาที่เหมาะสมในตอนท้ายTL;<-- DR

เมื่อ Zyava ชี้ให้เห็นการแปลจะขึ้นอยู่กับโมดูลที่ทำการแปล เทมเพลตแสดงในอินสแตนซ์บล็อกและอินสแตนซ์บล็อกมีmodule_nameคุณสมบัติที่ใช้เมื่อเรียกใช้การแปล อ้างอิงMage_Core_Block_Abstract::__() :

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);
}

module_nameทรัพย์สิน (ปกติ) ที่มากับความต้องการและขึ้นอยู่กับชื่อชั้น (Ref. ::getModuleName()):

public function getModuleName()
{
    $module = $this->getData('module_name');
    if (is_null($module)) {
        $class = get_class($this);
        $module = substr($class, 0, strpos($class, '_Block'));
        $this->setData('module_name', $module);
    }
    return $module;
}

ดังนั้นถ้าmodule_nameการตั้งค่าคุณสมบัติแล้วว่าแปลโมดูลใช้ สำหรับบล็อกที่มีอยู่จากโครงร่างหลักคุณสมบัตินี้สามารถตั้งค่าผ่านโครงร่าง XML ตัวอย่างเช่น:

<default>
    <action block="root" method="setModuleName">
        <name>Your_Module</name>
    </action>
</default>

Voila! CSV โมดูลของคุณเป็นเจ้าของการแปลสำหรับอินสแตนซ์นั้น นี่อาจเป็นแนวทาง แน่นอนว่ายังมีสถานการณ์ที่เหนียวแน่นของการแปลโมดูลอื่น ๆ ที่ถูกนำไปใช้ผ่านตัวช่วยเฉพาะโมดูลในอินสแตนซ์บล็อก (รวมถึงไฟล์เทมเพลตแน่นอน) และเป็นจริงเสมอสำหรับการแปล XML โครงร่าง นอกจากนี้วิธีการนี้จะหยุดการทำงานของโมดูลปิดการใช้งานเอาต์พุตซึ่งใช้module_nameพารามิเตอร์

วิธีการแก้

เมื่อปรากฎว่าเป็นไปได้ที่จะระบุไฟล์แปลหลายไฟล์สำหรับโมดูล มันไม่ได้ทำในคอร์ (แต่ละโมดูลจะประกาศไฟล์. csvไฟล์เดียวเท่านั้น) แต่การทำงานมีอยู่ในMage_Core_Model_Translate:

public function getModulesConfig()
{
    if (!Mage::getConfig()->getNode($this->getConfig(self::CONFIG_KEY_AREA).'/translate/modules')) {
        return array();
    }

    $config = Mage::getConfig()->getNode($this->getConfig(self::CONFIG_KEY_AREA).'/translate/modules')->children();
    if (!$config) {
        return array();
    }
    return $config;
}

และ

protected function _loadModuleTranslation($moduleName, $files, $forceReload=false)
{
    foreach ($files as $file) {
        $file = $this->_getModuleFilePath($moduleName, $file);
        $this->_addData($this->_getFileData($file), $moduleName, $forceReload);
    }
    return $this;
}

เนื่องจากเนื้อหาของไฟล์ถูกรวมเข้าด้วยกัน (ฉันทดสอบแล้ว) จึงเป็นไปได้ที่จะระบุเฉพาะสตริงที่คุณต้องการแทนที่ใน CSV ที่คุณกำหนดเอง ตัวอย่างเช่นหากคุณต้องการแปลสตริงข้อมูลเพิ่มเติมในหน้าผลิตภัณฑ์ (แปลโดยMage_Catalogโมดูล) สิ่งต่อไปนี้จะใช้ได้:

แอพ / สถานที่ / Custom.csv :

"Additional Information","More Info, Dude"

ในโมดูลการกำหนดค่าของคุณ - ซึ่งควร<depends />เปิดMage_Catalogเพื่อให้แน่ใจว่าเนื้อหาของมันผสานหลังจาก - ต่อไปนี้จะทำให้คู่การแปลCustom.csvรวมอยู่ด้านบนของต้นฉบับ:

<frontend>
    <translate>
        <modules>
            <Mage_Catalog>
                <files>
                    <additional>Custom.csv</additional>
                </files>
            </Mage_Catalog>
        </modules>
    </translate>
</frontend>

สิ่งที่ดีเกี่ยวกับวิธีนี้คือคุณสามารถรวบรวมการแปลที่สำคัญของคุณในไฟล์เดียว


@ Francesco มันควรจะเป็น ล้างแคชการแปลหรือไม่ หากดูเหมือนว่าจะใช้งานไม่ได้โปรดโพสต์คำถามนี้เป็นคำถามใหม่ (และเชื่อมโยงที่นี่เพื่อลูกหลาน)
benmarks

ฉันยืนยันว่าใช้งานได้ทั้ง $ this> _ และกับผู้ช่วย คุณมีสิทธิมันเป็นความผิดของฉัน (ฉันได้ลบความคิดเห็นที่ผิดพลาดก่อนหน้า)
รา
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.