ในโมดูลหลักและบางครั้งแม่แบบฉันเห็นชั้นผู้ช่วยที่ใช้สำหรับการแปล:
Mage::helper('someModule')->__('translate me');
ทำไมสิ่งนี้ถึงดีกว่า:
$this->__('translate me');
ในโมดูลหลักและบางครั้งแม่แบบฉันเห็นชั้นผู้ช่วยที่ใช้สำหรับการแปล:
Mage::helper('someModule')->__('translate me');
ทำไมสิ่งนี้ถึงดีกว่า:
$this->__('translate me');
คำตอบ:
เพียงสร้างทฤษฎี แต่เมื่อคุณโทร
$this->__('Foo')
ในเทมเพลตไฟล์การแปล CSV ของโมดูลใดที่วีโอไอพีจะใช้ในการแปลฟู
ไม่ชัดเจนเสมอไปว่าวีโอไอพีผู้ช่วยการแปลของโมดูลตัวใดจะโทรมาแปลสตริง / คีย์ในท้ายที่สุด เนื่องจาก Magento ช่วยให้คุณสามารถใช้คีย์เดียวกันในโมดูลที่แตกต่างกันสำหรับสตริงที่แตกต่างกันดังนั้นจึงเป็นเรื่องสำคัญที่จะต้องทราบข้อมูลการแปลของโมดูลที่คุณใช้ ในความเป็นจริงหากมีการใช้แม่แบบในหลาย ๆ โมดูลการใช้$this->__()
อาจเป็น "ถือว่าเป็นอันตราย" เนื่องจากจะส่งคืนค่าที่แตกต่างกันขึ้นอยู่กับบริบทของบล็อกระบบโครงร่างที่ใช้แม่แบบนั้น
ฉันเดาว่าผู้ช่วยด้านความสะดวกสบายถูกเพิ่มไว้ล่วงหน้า แต่นักพัฒนาสร้างเทมเพลตเริ่มต้นการเริ่มต้นอินสแตนซ์อย่างรวดเร็วช่วยให้พวกเขารู้ว่าไฟล์แปลของโมดูลใดที่จะแปลสตริงและรูปแบบนั้นแพร่กระจายไปสู่การทดสอบกรอบ บรรทัดของโค้ดนี้เองนั้นคลุมเครือ
$this->__('Foo');
แต่คุณสามารถมั่นใจได้ว่าบรรทัดของรหัสนี้จะใช้Mage_Catalog
ข้อมูลการแปลเป็นภาษาท้องถิ่น
Mage::helper('catalog')->__('Foo')
เพราะคุณต้องการใช้โมดูลที่ชัดเจน
หากคุณใช้$this->__()
ในบริบทบล็อกโมดูลของบล็อกนั้นจะใช้สำหรับการแปล ดังนั้นหากคุณต้องการใช้โมดูลพิเศษคุณจะต้องใช้Mage::helper('mymodule')->__()
Mage_Checkout::My Cart
ไวยากรณ์ ดังนั้นจึงเป็นเรื่องสำคัญที่โมดูลใดที่จะใช้สำหรับการแปล
โดยทั่วไปฉันจะพูดในสิ่งเดียวกันกับที่คนอื่นพูด
ถ้าคุณใช้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->__
จากบล็อกของคุณ (เทมเพลตที่แสดงบล็อกรวมอยู่ด้วย) จะถูกแปลโดยใช้โมดูลแคตตาล็อก
เหตุผลหนึ่ง (ซึ่งเป็นเพียงการรับรู้ของฉัน) เมื่อคุณใช้ผู้ช่วยคุณจะเฉพาะเจาะจงมากขึ้นเกี่ยวกับไฟล์การแปลเช่นMage::helper('catalog')
จะหาประโยคในไฟล์แคตตาล็อกในขณะที่เมื่อคุณใช้$this
มันจะสุ่มค้นหาไฟล์การแปลทั้งหมด นั่นคือสิ่งที่ฉันคิด