วิธีการใช้การแปลใน CSV ของแม่แบบการออกแบบแพคเกจ? echo $ this -> __ ('Text') ทำงานอย่างไร


29

ฉันมีการติดตั้งแพ็คเกจการออกแบบเช่น:

design/frontend/package_name/theme_name/locale/

ภายใต้ที่ฉันมี

de_DE, en_GBฯลฯ ตามที่ผมได้สอดคล้องtranslate.csvไฟล์ที่มีสายต่างๆ:"Key", "Translation"

ฉันพยายามที่จะใช้สตริงต่าง ๆ ในชุดรูปแบบของฉันโดยใช้ echo $this->__('Text')

อย่างไรก็ตามดูเหมือนว่าจะใช้งานไม่ได้ (ฉันเห็นเฉพาะสตริงด้านในที่('Text')แสดง) ฉันคิดว่าฉันขาดความเข้าใจพื้นฐานเมื่อวีโอไอพีดึงสตริงจาก CSV เพื่อแปล ใครช่วยกรุณาอธิบายวิธีรับไฟล์ csv เหล่านี้ให้ใช้งานได้?


Magento รุ่นใดที่คุณใช้อยู่
philwinkle

ฉันใช้ Magento v: 1.7.0.2
waffl

คุณกำลังเรียกสิ่งนี้นอกไฟล์แม่แบบวีโอไอพีปกติหรือไม่? บางทีคุณอาจต้องเรียกคลาสผู้ช่วยและทำให้เป็นเหมือน <? php echo Mage :: helper ('core') -> __ ('Text'); ?> ลองเปิดใช้งาน "Translate Inline" บน Frontend ในระบบ> การกำหนดค่า> ผู้พัฒนา
SaveTheMage

คำตอบ:


84

TL; DR

ถ้าคุณไม่ได้สนใจในรายละเอียดวิธีการทำงานของการแปลข้ามเนื้อหาขึ้นอยู่กับ
สิ่งที่ต้องตรวจสอบว่าการแปลของคุณไม่ได้ทำงานด้านล่างโดยเฉพาะหมวดโซลูชั่นสำหรับโมดูลความขัดแย้งแปลขอบเขต

ภาพรวมการแปลวีโอไอพี

Magento จัดลำดับความสำคัญของแหล่งการแปล (จากสูงสุดไปต่ำสุด):

  1. DB ( core_translateตาราง)
  2. translate.csvไฟล์ธีม
  3. ส่วนapp/locale/*/*.csvไฟล์

อาร์เรย์การแปลถูกสร้างขึ้นอย่างไร

การแปลโมดูล

ก่อนอื่นไฟล์ทั้งหมดapp/locale/*/*.csvที่อ้างถึงจากetc/config.xmlไฟล์โมดูลที่ใช้งานจะถูกแยกวิเคราะห์ นี่คือคำแนะนำของกระบวนการ:
สมมติว่า Magento ค้นหาconfig.xmlส่วนต่อไปนี้:

<!-- excerpt from Mage/Catalog/etc/config.xml -->
<frontend>
    <translate>
        <modules>
            <Mage_Catalog>
                <files>
                    <default>Mage_Catalog.csv</default>
                </files>
            </Mage_Catalog>
        </modules>
    </translate>
</frontend>

และในไฟล์นั้นจะมีการระบุการแปลต่อไปนี้สำหรับโลแคลที่กำหนดค่าสำหรับมุมมองร้านค้าปัจจุบัน:

"AAA","BBB"

ภายใต้สถานการณ์เหล่านี้วีโอไอพีสร้างระเบียนต่อไปนี้ในอาร์เรย์การแปล:

array(
    "AAA" => "BBB",
    "Mage_Catalog::AAA" => "BBB"
)

ค่าที่สองคือโมดูลแปลขอบเขต ชื่อโมดูลที่นำหน้ามาจากโหนด XML config ที่มีการประกาศไฟล์แปล

ถ้าแปลเดียวกันจะระบุอีกครั้งโดยไฟล์โมดูลที่สองเช่นในSome_Module.csvการแปลเป็น"AAA","CCC"ก็จะไม่เขียนทับ"AAA"การตั้งค่า แต่จะเพิ่มระเบียนใหม่ด้วยชื่อโมดูลที่สอง"Some_Module::AAA" => "CCC"เท่านั้น

หากเปิดใช้งานโหมดผู้พัฒนาระบบจะยกเลิกการตั้งค่า"AAA"ระเบียนหากพบระเบียนที่สองที่มีคีย์เดียวกันในการแปลโมดูลอื่น สิ่งนี้ทำให้ง่ายต่อการตรวจพบข้อขัดแย้งของการแปลโมดูลระหว่างการพัฒนา

การแปลธีม

ประการที่สองการแปลโหลดจากtranslate.csvไฟล์แรกในธีมทางเลือกสำหรับสถานที่ปัจจุบันเพียงแทนที่ระเบียนที่มีอยู่ในอาร์เรย์การแปล
ดังนั้นการดำเนินการต่อจากตัวอย่างก่อนหน้านี้translate.csvระเบียน"AAA","DDD"จะนำไปสู่ข้อมูลการแปลต่อไปนี้:

array(
    "AAA" => "DDD", // This is overwritten by the translate.csv file
    "Mage_Catalog::AAA" => "BBB",
    "Some_Module::AAA" => "CCC"
)

บันทึกของหลักสูตรในtranslate.csvกับคีย์การแปลใหม่จะถูกเพิ่มไปยังอาร์เรย์

การแปลฐานข้อมูล

การแปลจากcore_translateตารางจะถูกรวมเข้ากับอาร์เรย์การแปลเหมือนกับการแปลธีม
คีย์ที่มีอยู่จากการแปลโมดูลหรือชุดรูปแบบจะถูกเขียนทับโดยบันทึกฐานข้อมูลที่เพิ่มเข้ามาใหม่

ค้นหาคำแปล

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

// Excerpt from Mage/Core/Block/Abstract.php
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;
}

วิธีการใน Helpers and Controllers ทำงานอย่างสอดคล้องกัน

ตัวอย่างสถานการณ์การค้นหา

ยกตัวอย่างเช่นสมมติ$this->__('AAA')ว่าเรียกว่าในไฟล์แม่แบบ หากบล็อกที่เกี่ยวข้องมีประเภทMage_Core_Block_TemplateวีโอไอพีจะตรวจสอบMage_Core::AAAบันทึกก่อน AAAถ้ามันไม่ได้พบว่ามันก็จะถอยกลับไปแปลสำหรับคีย์
ในสถานการณ์ตัวอย่างสิ่งนี้จะส่งผลให้เกิดการแปลDDD(จากtranslate.csvไฟล์)

Mage_Catalog_Block_Product_Viewในสถานการณ์ที่แตกต่างกันบล็อกที่เกี่ยวข้องที่อาจจะ ในกรณีนี้วีโอไอพีครั้งแรกจะตรวจสอบบันทึกการแปลและจะพบการแปลMage_Catalog::AAAAAA

ดังนั้นการแปลขอบเขตโมดูลจะมีลำดับความสำคัญสูงกว่าดังนั้นการแปลทั่วไปใด ๆ การแปลใดที่ใช้จะขึ้นอยู่กับโมดูลที่คลาสนั้นเรียกจาก__()เมธอด

สิ่งที่ต้องตรวจสอบว่าการแปลของคุณไม่ทำงาน

หากtranslate.csvไม่ได้ใช้การแปลของคุณจากไฟล์ให้ทำตามรายการตรวจสอบนี้:

  1. แคชการแปลถูกปิด / รีเฟรชหรือไม่ (โซลูชัน: ล้างแคช)
  2. เป็นtranslate.csvไฟล์จริงๆในทางเลือกรูปแบบสำหรับการจัดเก็บปัจจุบันหรือไม่? (โซลูชัน: แก้ไขการกำหนดค่าชุดรูปแบบ)
  3. มีบันทึกที่ขัดแย้งกันสำหรับการแปลในcore_translateตารางหรือไม่ (โซลูชัน: ลบบันทึกที่ขัดแย้งกันออกจากcore_translate)
  4. หากประเด็นทั้งหมดก่อนหน้านี้ไม่ใช่สาเหตุต้องมีการแปลที่ขัดแย้งกันจากโมดูลอื่น (วิธีแก้ไข: ดูด้านล่าง)

โซลูชันสำหรับขอบเขตการแปลโมดูลขัดแย้งกัน

หากคุณพบว่ากรณีสุดท้ายเป็นความจริงเพียงแค่เพิ่มการแปลเป็นครั้งที่สองที่คุณtranslate.csv มีขอบเขตโมดูลของโมดูลทำการแปล
ในตัวอย่างหากคุณต้องการAAAได้รับการแปลDDDผ่านการแปลธีมคุณสามารถทำได้ในtranslate.csv:

"AAA","DDD"
"Mage_Catalog::AAA","DDD"
"Some_Module::AAA","DDD"

ในทางปฏิบัติฉันจะเพิ่มขอบเขตโมดูลให้กับการแปลหากมีข้อขัดแย้งนั่นคือหากการแปลไม่ทำงาน

หมายเหตุเพิ่มเติม

การแปลแบบอินไลน์

คุณสมบัติการแปลแบบอินไลน์ของ Magento ยังเพิ่มการแปลที่กำหนดเองลงในcore_translateตารางโดยใช้คำนำหน้าขอบเขตโมดูล

ความเข้ากันได้ย้อนหลัง

ลำดับความสำคัญของการแปลชุดรูปแบบเคยสูงกว่าจากนั้นแปลฐานข้อมูลสูงถึง Magento เวอร์ชัน 1.3 หรือมากกว่านั้น

การแปล XML

วีโอไอพีบางครั้งการประเมินtranslate=""ข้อโต้แย้งในconfig.xml, system.xmlและรูปแบบ XML เพื่อแปลค่าโหนดเด็ก
คลาสผู้ช่วยสามารถระบุได้ในกรณีเหล่านั้นโดยใช้module=""อาร์กิวเมนต์เพื่อระบุโมดูลสำหรับขอบเขตการแปล
หากไม่มีการmoduleระบุอาร์กิวเมนต์ใน XML ตัวcore/dataช่วยจะถูกใช้เพื่อแปลค่าโหนดลูก

ข้อมูลเพิ่มเติม

ฉันสารภาพว่าฉันคัดค้านรายละเอียดบางส่วนของกระบวนการแปล Magento ในโพสต์นี้ แต่เพียงเพราะฉันไม่ต้องการข้อมูลมากเกินไป

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

โปรดถามคำถามแยกต่างหากหากต้องการข้อมูลเพิ่มเติม


1
ตกลงฉันขอโทษอย่างไม่น่าเชื่อทุกคน แต่มีคนอื่นเปิดแคชโดยไม่บอกฉัน ... อาจเป็นไปได้ว่าฉันเริ่มทำงานการแปล ถอนหายใจ ข้อมูลนี้มีประโยชน์อย่างไม่น่าเชื่อสำหรับฉันที่เข้าใจกระบวนการแปลใน Magento ขอบคุณมากนี่เป็นคำตอบที่แน่นอนทุกคำถามที่ฉันมีเกี่ยวกับการ__()ทำงานของฟังก์ชั่น
วาฟเฟิล

ภาพรวมที่ดีของสถาปัตยกรรมการแปลของวีโอไอพีสามารถพบได้ที่นี่: gist.github.com/antonmakarenko/7538216
thdoan

@Vinai คำตอบที่ยอดเยี่ยม จริงๆมันช่วยให้ฉันเพื่อแก้ปัญหาการแปลผมโพสต์คำถามเกี่ยวกับที่นี่ Mage_Tax น่าประหลาดใจที่ขัดแย้งกับการแปลธีมของฉันซึ่งดูเหมือนว่าขัดกับความหมายของ Magento ในการจัดลำดับความสำคัญการแปล
Holly

14

แหล่งการแปล

การแปลถูกผสานจากแหล่งต่าง ๆ : การแปลโมดูลจากไฟล์ XML ที่เกี่ยวข้องการแปลชุดรูปแบบจากtranslate.csvชุดรูปแบบปัจจุบันและการแปลแบบอินไลน์จากฐานข้อมูล

การแปลสามารถเป็นโมดูลเฉพาะอย่างเคร่งครัด (ใช้ได้เฉพาะในโมดูล) นั่นคือกรณีของการแปลแบบอินไลน์และเป็นทางเลือกสำหรับการแปลธีม เพื่อให้บรรลุสิ่งนี้คุณต้องกำหนดด้วยคำนำหน้าโมดูลใน translate.csv:

"Mage_Catalog::Add to cart","In die Einkaufstüte legen"

การแปลจากโมดูล (เช่นMage_Catalog.csv) เป็นเพียงโมดูลเฉพาะอย่างเคร่งครัดหากโหมดผู้พัฒนาใช้งาน มิฉะนั้นการแปล fom โมดูลที่โหลดครั้งแรกจะถูกใช้ทั่วโลกสำหรับโมดูลทั้งหมดที่ไม่มีการแปลข้อความของตัวเอง

ฉันรวบรวมแผนภูมิลำดับงานที่แสดงวิธีการรวมข้อความแต่ละข้อความจากแหล่งต่าง ๆ ในอาร์เรย์การแปล:

การผสานการแปล data เป็นอาร์เรย์การแปล

เคส Evil Edge

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

ค้นหาคำแปล

สำหรับโมดูลที่การค้นหาถูกแปลนั้นขึ้นอยู่กับโมดูลของคลาสซึ่งเมธอด__()ถูกเรียกใช้ จากนั้นการค้นหาในอาเรย์การแปลจะเป็นดังนี้:

ค้นหาคำแปล data เป็นอาร์เรย์การแปล

คำจำกัดความขอบเขต

มีความเป็นไปได้ที่จะเปลี่ยนโมดูลสำหรับชั้นหนึ่งซึ่งเป็นประโยชน์อย่างยิ่งสำหรับบล็อกและผู้ช่วยเหลือ แนวปฏิบัติที่เหมาะสมที่สุดคือตั้งค่าชื่อโมดูลอย่างชัดเจนเสมอเมื่อเขียนคลาสหลัก วิธีการทำงานแตกต่างกันระหว่างผู้ช่วยเหลือบล็อกและผู้ควบคุม (เช่น Magento CE 1.9.1)

ตัวอย่างสำหรับ A Block:

class IntegerNet_AwesomeModule_Block_Catalog_Product extends Mage_Catalog_Block_Product
{
    public function getModuleName()
    {
        return 'Mage_Catalog';
    }
}

สำหรับบล็อกคุณยังสามารถตั้งค่าmodule_nameพารามิเตอร์ในโครงร่าง XML:

<block type="integernet_awesomemodule/catalog_product" name="test" module_name="Mage_Catalog" />

ตัวอย่างสำหรับผู้ช่วย:

class IntegerNet_AwesomeModule_Helper_Catalog extends Mage_Catalog_Helper_Data
{
    protected $_moduleName = 'Mage_Catalog';
}

สำหรับตัวควบคุมส่วนหน้าคุณสามารถตั้งค่าคุณสมบัติ_realModuleNameสำหรับตัวควบคุมผู้ดูแลระบบ_usedModuleName(yay สำหรับความสอดคล้อง)

วิธีการแปลอื่น ๆ

ในไฟล์ XML (config.xml, system.xml, โครงร่าง) คุณสามารถระบุได้ว่าควรแปลโหนดด้วยtranslateแอตทริบิวต์หรือไม่ คุณควรเพิ่มแอmoduleททริบิวเพื่อระบุขอบเขต แต่ที่นี่ค่าต้องเป็นนามแฝงของผู้ช่วยเหลือไม่ใช่ชื่อโมดูลดังกล่าวข้างต้น

<one_column module="page" translate="label">
    <label>1 column</label>
    <template>page/1column.phtml</template>
    <layout_handle>page_one_column</layout_handle>
    <is_default>1</is_default>
</one_column>

ใน JavaScript คุณสามารถใช้Translatorวัตถุที่มีอยู่ทั่วโลก:

Translator.translate('Please wait, loading...');

แต่คุณต้องทำการแปลที่คุณต้องการใช้ใน JavaScript สำหรับวัตถุนักแปล สิ่งนี้ทำได้ผ่านjstranslator.xmlไฟล์ในetcไดเรกทอรีของโมดูล

<?xml version="1.0"?>
<jstranslator>
    <loading translate="message" module="core">
        <message>Please wait, loading...</message>
    </loading>
</jstranslator>

loadingสามารถเป็นสตริงใดก็ได้ แต่ต้องไม่ซ้ำกันทั่วโลก translateและmoduleแอตทริบิวต์ที่ใช้เป็นในไฟล์ XML อื่น ๆ ค่าของmessageและการแปลจะถูกเพิ่มไปยังวัตถุ JS Translator

การแก้ไขปัญหา

แม้ว่าคุณจะรู้กฎที่ซับซ้อนทั้งหมดบางครั้งก็ยากที่จะเห็นว่าทำไมการแปลบางอย่างจึงทำงานเหมือนเดิม (หรือไม่ทำงาน) เพื่อให้ง่ายขึ้นฉันได้พัฒนาโมดูล "คำแนะนำการแปล" ซึ่งแสดงว่าการแปลมาจากไหน:

รับได้ที่นี่: https://github.com/schmengler/Translation คำแนะนำ

ภาพหน้าจอ: คำแนะนำการแปล


อ้างอิงจากโพสต์บล็อกและสไลด์ของฉันในหัวข้อ:


2
ฉันหวังว่าฉันจะไม่สแปมโดยกล่าวว่าโมดูล Yireo EmailOverride ฟรีของฉันจะอนุญาตให้วางไฟล์โมดูล CSV ที่กำหนดเองไว้ในชุดรูปแบบได้เช่นกัน ไม่ใช่แค่ Translate.csv
Jisse Reitsma

6

คุณล้างแคชแล้วหรือยัง

ระบบของคุณถูกตั้งค่าเป็นโลแคลของไฟล์ที่คุณกำลังทดสอบหรือไม่?

Magento สามารถหาไฟล์ที่กำลังมองหาเมื่อมันโหลดการแปลธีม (บางส่วนชั่วคราวvar_dump; exit; คำสั่งควรช่วยได้

#File: app/code/core/Mage/Core/Model/Translate.php
protected function _loadThemeTranslation($forceReload = false)
{
    $file = Mage::getDesign()->getLocaleFileName('translate.csv');
    $this->_addData($this->_getFileData($file), false, $forceReload);
    return $this;
}

_getTranslatedStringวิธีสามารถค้นหาสิ่งที่ต้องการในอาเรย์ข้อมูลได้หรือไม่

#File: app/code/core/Mage/Core/Model/Translate.php
protected function _getTranslatedString($text, $code)
{
    $translated = '';
    if (array_key_exists($code, $this->getData())) {
        $translated = $this->_data[$code];
    }
    elseif (array_key_exists($text, $this->getData())) {
        $translated = $this->_data[$text];
    }
    else {
        $translated = $text;
    }
    return $translated;
}

ไม่มีแคชใช้งานอยู่ฉันไม่แน่ใจว่าระบบของฉันถูกตั้งค่าเป็นสถานที่ แต่การแปลทำงานในไฟล์เทมเพลตบางอย่างตามลำดับ (โดยการเปลี่ยนร้านค้า) ตัวอย่างเช่นสตริงในการtranslate.csvแปลของฉันถูกต้อง/app/design/frontend/package_name/default/template/catalog/product/view.phtmlแต่ไม่ได้อยู่ใน/app/design/frontend/package_name/default/template/page/html/topmenu.phtml
waffl

คุณพูดถูกบางคนเปิดแคชโดยไม่บอกฉัน โอ๊ะขอโทษด้วยและขอบคุณสำหรับข้อมูล!
วาฟเฟิล

3
@waffl ไม่จำเป็นต้องขอโทษ - ฉันคิดว่านักพัฒนา Magento ทุกคนทำอย่างน้อยสัปดาห์ละครั้ง
Alan Storm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.