वर्ग $ के बजाय अनुवाद के लिए एक सहायक का उपयोग क्यों करते हैं?


27

मुख्य मॉड्यूल और कभी-कभी टेम्पलेट्स में, मैं देखता हूं कि अनुवाद के लिए सहायक कक्षाएं इस्तेमाल की जा रही हैं:

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

क्यों यह बेहतर है:

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

हे ब्रेंडन, यह प्रश्न अपवादस्वरूप अच्छा है और मैं आपके प्रयास की सराहना करता हूं। उसके लिए +1। हालाँकि एलनस्टॉर्म आपको अपने प्रश्न के लिए एक मान्य उत्तर देता है। इसलिए उपलब्ध उत्तरों में से उत्तर को स्वीकार करना अच्छा होगा। धन्यवाद :-)
राजीव के टॉमी

भाई आपसे ज्यादा शक्ति :-)
राजीव के टॉमी

जवाबों:


24

बस सिद्धांत, लेकिन जब आप कहते हैं

$this->__('Foo')

टेम्पलेट में, कौन सा मॉड्यूल CSV अनुवाद फ़ाइल Magento Foo का अनुवाद करने के लिए उपयोग करेगा?

यह हमेशा स्पष्ट नहीं होता है कि किस मॉड्यूल का हेल्पर मैगेंटो अंततः स्ट्रिंग / कुंजी का अनुवाद करने के लिए कॉल करेगा। चूंकि मैगेंटो आपको अलग-अलग तारों के लिए अलग-अलग मॉड्यूल में एक ही कुंजी का उपयोग करने की अनुमति देता है, इसलिए यह जानना महत्वपूर्ण है कि आप किस मॉड्यूल का उपयोग कर रहे हैं। वास्तव में, यदि किसी टेम्पलेट का उपयोग कई मॉड्यूल में किया जाता है, तो $this->__()"हानिकारक माना जा सकता है" का उपयोग किया जा सकता है, क्योंकि यह ब्लॉक के संदर्भ में विभिन्न मूल्यों को लौटाएगा, जिसमें लेआउट सिस्टम टेम्पलेट का उपयोग करता है।

मेरा अनुमान है कि सुविधा सहायकों को आगे जोड़ा गया था, लेकिन त्वरित रूप से शुरू करने वाले टेम्पलेट्स का निर्माण करने वाले डेवलपर्स को मदद मिलती है ताकि वे जान सकें कि कौन सी मॉड्यूल की अनुवाद फ़ाइल एक स्ट्रिंग का अनुवाद करेगी, और यह पैटर्न फ्रेमवर्क के परीक्षण में फैल गया। कोड की यह लाइन, अपने आप में अस्पष्ट है।

$this->__('Foo');

लेकिन आप यह सुनिश्चित कर सकते हैं कि कोड की यह रेखा Mage_Catalogस्थानीयकरण की जानकारी का उपयोग करेगी ।

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

हम्म, मुझे वह तर्क मिलता है। व्यवहार में मैंने केवल CSVs को सक्रिय थीम के लिए फ्रंट पैकेज के भीतर बनाया है जैसे /locale/unningxyzenders/translate.csv (प्रति मॉड्यूल नहीं)। मेरे पास "स्ट्रिंग अलग-अलग मॉड्यूल में मौजूद है और विभिन्न अनुवादों की आवश्यकता है" समस्या है, लेकिन "इस स्ट्रिंग में इस मॉड्यूल में कई उदाहरण हैं और विभिन्न अनुवादों की आवश्यकता है" जो सहायकों को हल नहीं करते हैं। आम तौर पर, मैं शायद इस विषय पर $ और एक सीएसवी के साथ चिपका सकता हूं।
ब्रेंडन फल्कोव्स्की

@BrendanFalkowski हाँ, यह "मॉड्यूल डेवलपर" बनाम "थीम डेवलपर" चीज़ की तरह लगता है। मैं कहता हूँ कि आप सहायकों में निर्मित का उपयोग कर पाएंगे।
एलन स्टॉर्म

@AlanStorm निश्चित रूप से आपके लिए एक उत्थान है।
एमटीएम

20

क्योंकि आप एक स्पष्ट मॉड्यूल का उपयोग करना चाहते हैं।

यदि आप $this->__()एक ब्लॉक संदर्भ में उपयोग करते हैं , तो ब्लॉक के मॉड्यूल का उपयोग अनुवाद के लिए किया जाता है। इसलिए यदि आप एक विशेष मॉड्यूल का उपयोग करना चाहते हैं, तो आपको उपयोग करना होगाMage::helper('mymodule')->__()


1
सभी मामलों में, अनुवाद एक निश्चित मॉड्यूल से जुड़े होते हैं। केवल इस $ को कॉल करते समय, आप वर्तमान मॉड्यूल का जिक्र कर रहे हैं और जब लंबे दाना :: सहायक ('mymodule') को कॉल कर रहे हैं -> __ () आप उस मॉड्यूल के साथ शब्द का अनुवाद कर रहे हैं, जैसे एक मॉड्यूल से CSV डिफ़ॉल्ट CSV।
मुलपर्दा

सही बात। यदि आप एक सहायक का उपयोग करते हैं, तो आप इसे स्पष्ट करते हैं।
फेबियन ब्लेसश्मिड

1
हालांकि स्पष्ट होने का क्या फायदा है? अनुवाद CSV मॉड्यूल के बीच अंतर नहीं करते हैं, या वे करते हैं? उनके लिए किसी भी पदानुक्रम / विरासत में गिरावट के बारे में नहीं सुना गया है।
ब्रेंडन फाल्कोस्की

नहीं, सभी CSV विलय किए गए हैं, लेकिन Mage_Checkout::My Cartसिंटैक्स के कारण आपके दो अलग-अलग स्थान हो सकते हैं । और इसलिए यह महत्वपूर्ण है कि अनुवाद के लिए किस मॉड्यूल का उपयोग किया जाता है
फाबियन ब्लेचस्मीट

1
अहा, इसलिए मदद करने वाले मॉड्यूल के लिए बहुत अधिक समझ रखते हैं क्योंकि वे फ्रंटएंड पैकेज में करते हैं, जो केवल अपने सीएसवी के साथ प्रतिस्पर्धा करने के लिए कोर को ओवरराइड करते हैं।
ब्रेंडन फाल्कोस्की

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->__आपके ब्लॉक (ब्लॉक को भी रेंडर करने वाले टेम्प्लेट) का उपयोग करने वाले सभी ग्रंथ कैटलॉग मॉड्यूल का उपयोग करके अनुवादित होने जा रहे हैं।


अच्छा लगा। ब्रेडक्रंब सिद्धांत भयानक था। मुझे यह पसंद आया। +1 के लिए :-)
राजीव के टॉमी

2

एक कारण (जो सिर्फ मेरी धारणा है), जब आप हेल्पर का उपयोग करते हैं तो आप अनुवाद फ़ाइल के बारे में अधिक विशिष्ट होते हैं, जैसे कि Mage::helper('catalog')यह कैटलॉग फ़ाइल में वाक्य मिलेगा, जबकि जब आप इसका उपयोग $thisकरेंगे तो सभी अनुवाद फ़ाइलों में यादृच्छिक रूप से खोज करेंगे। यही मैं सोचता हूं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.