ทำไมคลาสใช้ตัวช่วยในการแปลแทนที่จะเป็น $ นี่?


27

ในโมดูลหลักและบางครั้งแม่แบบฉันเห็นชั้นผู้ช่วยที่ใช้สำหรับการแปล:

Mage::helper('someModule')->__('translate me');

ทำไมสิ่งนี้ถึงดีกว่า:

$this->__('translate me');

เฮ้เบรนแดนคำถามนี้ดีมากและฉันซาบซึ้งในความพยายามของคุณ +1 สำหรับสิ่งนั้น อย่างไรก็ตาม Alanstorm ให้คำตอบที่ถูกต้องสำหรับคำถามของคุณ ดังนั้นจะเป็นการดีถ้าคุณยอมรับคำตอบจากคำตอบที่มี ขอบคุณ :-)
Rajeev K Tomy

มีอำนาจมากขึ้นกับพี่ชายของคุณ :-)
Rajeev K Tomy

คำตอบ:


24

เพียงสร้างทฤษฎี แต่เมื่อคุณโทร

$this->__('Foo')

ในเทมเพลตไฟล์การแปล CSV ของโมดูลใดที่วีโอไอพีจะใช้ในการแปลฟู

ไม่ชัดเจนเสมอไปว่าวีโอไอพีผู้ช่วยการแปลของโมดูลตัวใดจะโทรมาแปลสตริง / คีย์ในท้ายที่สุด เนื่องจาก Magento ช่วยให้คุณสามารถใช้คีย์เดียวกันในโมดูลที่แตกต่างกันสำหรับสตริงที่แตกต่างกันดังนั้นจึงเป็นเรื่องสำคัญที่จะต้องทราบข้อมูลการแปลของโมดูลที่คุณใช้ ในความเป็นจริงหากมีการใช้แม่แบบในหลาย ๆ โมดูลการใช้$this->__()อาจเป็น "ถือว่าเป็นอันตราย" เนื่องจากจะส่งคืนค่าที่แตกต่างกันขึ้นอยู่กับบริบทของบล็อกระบบโครงร่างที่ใช้แม่แบบนั้น

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

$this->__('Foo');

แต่คุณสามารถมั่นใจได้ว่าบรรทัดของรหัสนี้จะใช้Mage_Catalogข้อมูลการแปลเป็นภาษาท้องถิ่น

Mage::helper('catalog')->__('Foo')

อืมฉันได้รับตรรกะนั้น ในทางปฏิบัติฉันเพิ่งเห็น CSVs ที่สร้างขึ้นภายในแพ็คเกจส่วนหน้าสำหรับธีมที่ใช้งานเป็น /locale/{xyz}/translate.csv (ไม่ใช่ต่อโมดูล) ฉันเคยมี "สตริงที่มีอยู่ในโมดูลที่แตกต่างกันและต้องการการแปลที่แตกต่างกัน" แต่ยัง "สตริงนี้มีหลายอินสแตนซ์ในโมดูลนี้และต้องการการแปลที่แตกต่าง" ซึ่งผู้ช่วยเหลือไม่ได้แก้ไข โดยทั่วไปแล้วฉันสามารถใช้ $ $ และหนึ่ง CSV ต่อชุดรูปแบบ
Brendan Falkowski

@BrendanFalkowski ใช่ดูเหมือนว่าเป็น "ผู้พัฒนาโมดูล" กับ "ผู้พัฒนาธีม" ฉันว่าคุณพบว่าใช้ตัวช่วยในตัว
อลันสตอร์ม

@ AlanStorm แน่นอน upvote สำหรับคุณ
MTM

20

เพราะคุณต้องการใช้โมดูลที่ชัดเจน

หากคุณใช้$this->__()ในบริบทบล็อกโมดูลของบล็อกนั้นจะใช้สำหรับการแปล ดังนั้นหากคุณต้องการใช้โมดูลพิเศษคุณจะต้องใช้Mage::helper('mymodule')->__()


1
ในทุกกรณีการแปลจะเชื่อมโยงกับโมดูลที่แน่นอน เมื่อเรียกใช้ $ $ นี้คุณกำลังอ้างอิงถึงโมดูลปัจจุบันและเมื่อเรียก Mage :: helper ('mymodule') -> __ () ที่คุณกำลังแปลคำนั้นด้วยโมดูลนั้นเหมือนกับ CSV จากโมดูลแทนที่จะเป็น CSV เริ่มต้น
mbalparda

แก้ไข. หากคุณใช้ผู้ช่วยคุณต้องระบุอย่างชัดเจน
Fabian Blechschmidt

1
อะไรคือข้อดีของการมีความชัดเจน? CSV แปลไม่แยกความแตกต่างระหว่างโมดูลหรือพวกเขา? ยังไม่เคยได้ยินเกี่ยวกับลำดับชั้น / การสืบทอดทางเลือกใด ๆ สำหรับพวกเขา
Brendan Falkowski

ไม่ CSV ทั้งหมดถูกรวมเข้าด้วยกัน แต่คุณสามารถมีสถานที่ได้สองแห่งเนื่องจากมีMage_Checkout::My Cartไวยากรณ์ ดังนั้นจึงเป็นเรื่องสำคัญที่โมดูลใดที่จะใช้สำหรับการแปล
Fabian Blechschmidt

1
อ๊ะผู้ช่วยเข้าใจมากขึ้นสำหรับโมดูลมากกว่าที่พวกเขาทำในแพ็คเกจส่วนหน้าซึ่งมี แต่ CSV ของตัวเองเท่านั้นที่เอาชนะแกนหลักในการต่อสู้
Brendan Falkowski

9

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

ตัวอย่างเช่นลองMage_Adminhtml_Block_Catalog_Product_Gridบล็อก

'header'=> Mage::helper('catalog')->__('Name'),สำหรับส่วนหัวของคอลัมน์มีคือ: ถ้าแทนที่จะใช้ตัวช่วยแคตตาล็อก$this->__ข้อความจะถูกแปลโดยใช้Mage_Adminhtmlโมดูล

แต่นี่เป็นกรณีที่ตรรกะเบื้องหลังการใช้ตัวช่วยที่ตั้งชื่อมีความสมเหตุสมผล

ฉันแค่ต้องการแสดงกรณีที่การใช้$this->__('..')วิธีการช่วยเหลือแทนที่จะนำไปสู่ปัญหา ฉันพูดจากประสบการณ์

มาบล็อกMage_Catalog_Block_Breadcrumbsกันก่อน Mage::helper('catalog')->__('Home')มีสายหนึ่งที่มีลักษณะเช่นนี้คือ:

คุณจะคิดว่าคุณอยู่ในcatalogโมดูลเพื่อให้คุณสามารถใช้$thisแทน แต่ถ้าคุณแทนที่บล็อกโดยบล็อกของคุณที่เรียกว่าNamespace_Module_Block_Breadcrumbs?

หาก$thisมีการใช้งานโมดูลที่ใช้สำหรับการแปลจะเป็นเช่นนั้นNamespace_Moduleและคุณอาจไม่ต้องการสิ่งนั้น

มีสองตัวเลือกเพื่อหลีกเลี่ยงปัญหานี้ อาจใช้ผู้ช่วยที่ตั้งชื่อตามที่เกิดขึ้นกับบล็อกหลักเกือบทั้งหมด

หรือคุณในฐานะนักพัฒนาสามารถเพิ่มสิ่งนี้ในคลาสบล็อก:

public function getModuleName() {
    return 'Mage_Catalog';
}

จากนั้นคุณแน่ใจว่าข้อความทั้งหมดที่ใช้$this->__จากบล็อกของคุณ (เทมเพลตที่แสดงบล็อกรวมอยู่ด้วย) จะถูกแปลโดยใช้โมดูลแคตตาล็อก


ดี ทฤษฎี Breadcrumb นั้นยอดเยี่ยมฉันชอบมาก +1 สำหรับสิ่งนั้น :-)
Rajeev K Tomy

2

เหตุผลหนึ่ง (ซึ่งเป็นเพียงการรับรู้ของฉัน) เมื่อคุณใช้ผู้ช่วยคุณจะเฉพาะเจาะจงมากขึ้นเกี่ยวกับไฟล์การแปลเช่นMage::helper('catalog')จะหาประโยคในไฟล์แคตตาล็อกในขณะที่เมื่อคุณใช้$thisมันจะสุ่มค้นหาไฟล์การแปลทั้งหมด นั่นคือสิ่งที่ฉันคิด

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