Magento के कोर टेम्पलेट को मेरे मॉड्यूल की अनुवाद फ़ाइल का उपयोग करें


15

मैं जिस एक्सटेंशन पर काम कर रहा हूं, उसमें मॉड्यूल के config.xml द्वारा जोड़ा गया एक लेआउट XML है। इस लेआउट में फ्रंटेंड के कुछ संशोधन हैं। हालांकि, इनमें से कुछ ब्लॉक, Magento के कोर मॉड्यूल से संबंधित हैं। टेम्पलेट सभी उम्मीद के मुताबिक सही ढंग से दिखाई दे रहे हैं।

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

यदि Magento के कोर मॉड्यूल के लिए कोई अनुवाद फ़ाइलें नहीं मिल सकती हैं तो क्या Magento के मेरे मॉड्यूल की अनुवाद फ़ाइल का उपयोग करने का कोई तरीका है? क्या मैं यहां कुछ और कर सकता हूं?


आप अपने अनुवादों को वर्तमान थीम अनुवाद फ़ाइल में जोड़ सकते हैं या बैकएंड में इनलाइन अनुवाद इंटरफ़ेस का उपयोग कर सकते हैं।
Dmytro Zavalkin

मैं अनुवाद को विस्तार के साथ पैकेज करना चाहता था, उपरोक्त को इसे स्थापित करने वाले किसी भी व्यक्ति के लिए निर्देश जोड़ने की आवश्यकता होगी। क्या कोई विकल्प है जहां मैं इसे कोड से कर सकता हूं?
मृदुल अग्रवाल

4
यह इस बात पर निर्भर करता है कि कैसे अनुवाद का उपयोग टेम्प्लेट में किया जाता है, $this->__()या Mage::helper('...')->__()। मुट्ठी के मामले में आप अपने अनुवाद सहायक का उपयोग करने के लिए ब्लॉक को बाध्य कर सकते हैं। लेकिन मेरा मानना ​​है कि सामान्य मामले में एकमात्र विकल्प core_translateतालिका के लिए डेटा अपग्रेड है । यहाँ अंतर्राष्ट्रीयकरण के विवरणों का विवरण दिया गया है: blog.belvg.com/…
Dmytro Zavalkin

एक आसान हाथों पर समाधान के लिए एक ब्लॉक को ओवरराइट करते समय अनुवाद के नुकसान से भी बचें
हैकर

जवाबों:


20

कोई फर्क नहीं पड़ता कि आप इसे कैसे लेते हैं, आपकी समस्या के लिए एक "रचनात्मक" समाधान की आवश्यकता है, बाद में देवों / अनुरक्षकों के लिए एक डेवलपर नोट के योग्य। सबसे पहले, कुछ पृष्ठभूमि, एक नोट द्वारा पीछा किया जाता है, उसके बाद एक आसान और मुझे लगता है कि एंड <--टीएल; डॉ

जैसा कि ज़ायवा ने बताया , अनुवाद अनुवाद करने वाले मॉड्यूल के अधीन है। टेम्पलेट ब्लॉक इंस्टेंसेस में रेंडर करते हैं, और ब्लॉक इंस्टेंसेस में एक 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(। रेफरी संपत्ति (सामान्य रूप से) मांग पर प्राप्त होता है और वर्ग के नाम पर आधारित है ::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संपत्ति पहले से ही सेट है, तो वह मॉड्यूल अनुवाद लागू होता है। कोर लेआउट से अतिरिक्त ब्लॉक के लिए, यह संपत्ति लेआउट एक्सएमएल के माध्यम से सेट की जा सकती है; उदाहरण के लिए:

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

देखा! आपका मॉड्यूल 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;
}

क्योंकि फ़ाइलों की सामग्री विलय कर दी गई है (मैंने परीक्षण किया है), केवल उन तारों को निर्दिष्ट करना संभव है जिन्हें आप अपने कस्टम सीएसवी (ओं) में ओवरराइड करना चाहते हैं। उदाहरण के लिए, यदि आप उत्पाद पृष्ठ पर अतिरिक्त सूचना स्ट्रिंग का अनुवाद करना चाहते हैं ( 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

मैं यह पुष्टि करता हूं कि यह $> _ और सहायक दोनों के साथ काम करेगा। आप सही हैं, यह मेरी गलती थी (मैंने पिछली गलत टिप्पणी को हटा दिया है)
फ्रा डे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.