CSV के डिज़ाइन टेम्प्लेट पैकेज में अनुवाद कैसे लागू करें? इको $ कैसे बनता है -> __ ('पाठ') काम करता है?


29

मेरे पास एक डिज़ाइन पैकेज सेटअप है जैसे:

design/frontend/package_name/theme_name/locale/

जिसके तहत मेरे पास है

de_DE, en_GBआदि, जिसके तहत मेरे पास translate.csvविभिन्न स्ट्रिंग्स के साथ संबंधित फाइलें हैं:"Key", "Translation"

मैं अपने विषय में विभिन्न स्ट्रिंग्स को लागू करने का प्रयास कर रहा हूं echo $this->__('Text')

हालांकि, यह काम नहीं करता है (मैं केवल ('Text')प्रदर्शित स्ट्रिंग को अंदर देखता हूं )। मुझे लगता है कि जब मैगेंटो सीएसवी से स्ट्रिंग का अनुवाद करने के लिए खींचता है तो मुझे कुछ मौलिक समझ याद आ रही है। क्या कोई कृपया बता सकता है कि इन सीएसवी फ़ाइलों को काम करने के लिए कैसे प्राप्त करें?


Magento के कौन से संस्करण चल रहे हैं?
17

मैं Magento v: 1.7.0.2
waffl

क्या आप इसे सामान्य मैगनेटो टेम्पलेट फ़ाइल के बाहर बुला रहे हैं? हो सकता है कि आपको सहायक वर्ग को कॉल करने और इसे कुछ बनाने की आवश्यकता हो <; php इको मैज :: हेल्पर ('कोर') -> __ ('टेक्स्ट'); >> सिस्टम में विन्यास पर "ट्रांसलेट इनलाइन" को सक्षम करने का भी प्रयास करें> कॉन्फ़िगरेशन> डेवलपर
SaveTheMage

जवाबों:


84

टी एल; डॉ

यदि आप विवरण में रुचि नहीं रखते हैं कि अनुवाद कैसे काम करता है, तो सामग्री को
व्हाट्स अप करने के लिए छोड़ दें कि क्या आपका अनुवाद नीचे काम नहीं कर रहा है , विशेष रूप से
मॉड्यूल स्कोप ट्रांसलेशन टकराव के लिए समाधान

Magento अनुवाद अवलोकन

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"

इन परिस्थितियों में, Magento अनुवाद सरणी में निम्नलिखित रिकॉर्ड बनाता है:

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

दूसरा मान मॉड्यूल स्कोप अनुवाद है । उपसर्ग मॉड्यूल का नाम कॉन्फ़िगर XML नोड से लिया गया है जिसमें अनुवाद फ़ाइल घोषणा है।

एक ही अनुवाद एक करके फिर से निर्दिष्ट है, तो दूसरे मॉड्यूल फ़ाइल , जैसे में 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तालिका से अनुवाद मूल रूप से थीम अनुवाद की तरह अनुवाद सरणी में विलय कर दिए जाते हैं।
मॉड्यूल या थीम अनुवादों से मौजूदा चाबियाँ डेटाबेस रिकॉर्ड द्वारा अधिलेखित की जाती हैं, नए जोड़े जाते हैं।

अनुवाद लुकअप

जब __()विधि को बुलाया जाता है, तो Magento पहली बार वर्तमान मॉड्यूल से मेल खाने वाले सरणी में अनुवाद की तलाश करता है।
वर्तमान मॉड्यूल उस वर्ग के नाम से निर्धारित होता है जिस पर __()कक्षा को बुलाया जाता है। उदाहरण के लिए, ब्लॉक में जिम्मेदार विधि इस तरह दिखती है:

// 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;
}

हेल्पर्स और कंट्रोलर्स के तरीके समान रूप से काम करते हैं।

उदाहरण लुकअप परिदृश्य

उदाहरण के लिए, मान लें कि $this->__('AAA')इसे टेम्पलेट फ़ाइल में कहा जाता है। यदि संबंधित ब्लॉक में प्रकार है Mage_Core_Block_Template, तो Magento पहले Mage_Core::AAAरिकॉर्ड की जांच करेगा । यदि यह नहीं मिलता है, तो यह कुंजी के लिए अनुवाद पर वापस आ जाएगा AAA
उदाहरण के परिदृश्य में इसका परिणाम अनुवाद में DDD(से) होगाtranslate.csv फ़ाइल से) होगा।

एक अलग परिदृश्य में संबंधित ब्लॉक हो सकता है Mage_Catalog_Block_Product_View। इस मामले में Magento पहले एक अनुवाद रिकॉर्ड की जाँच Mage_Catalog::AAAकरेगा, और अनुवाद खोजेगा AAA

तो वास्तव में, मॉड्यूल गुंजाइश अनुवाद एक उच्च प्राथमिकता तो किसी भी सामान्य अनुवाद है। किस अनुवाद का उपयोग किया जाता है यह इस बात पर निर्भर करता है कि __()विधि को कॉल करने के लिए कौन सा मॉड्यूल है ।

अगर आपका अनुवाद काम नहीं कर रहा है, तो क्या जाँचें

यदि किसी 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"

व्यवहार में, मैं केवल अनुवाद में मॉड्यूल गुंजाइश जोड़ता हूं यदि कोई विरोध है, तो यदि अनुवाद काम नहीं कर रहा है।

अतिरिक्त नोट्स

इनलाइन अनुवाद

मैगेंटो की इनलाइन अनुवाद सुविधा भी core_translateमॉड्यूल गुंजाइश उपसर्ग का उपयोग करके तालिका में कस्टम अनुवाद जोड़ता है ।

अनिच्छुक अनुकूलता

थीम अनुवादों की प्राथमिकता तब अधिक हुआ करती थी जब डेटाबेस मैगेंटो संस्करण 1.3 या इसके बाद तक अनुवाद करता था।

XML अनुवाद

Magento कभी कभी का मूल्यांकन translate=""में तर्क config.xml, system.xmlऔर लेआउट एक्सएमएल चाइल्ड नोड मूल्यों का अनुवाद करने में। अनुवाद के दायरे के लिए मॉड्यूल निर्दिष्ट करने के
लिए module=""तर्क का उपयोग करके उन मामलों में एक सहायक वर्ग निर्दिष्ट किया जा सकता है ।
यदि moduleXML में कोई तर्क निर्दिष्ट नहीं किया गया है, तो core/dataसहायक का उपयोग बाल नोड मानों को अनुवाद करने के लिए किया जाता है।

अग्रिम जानकारी

मैं स्वीकार करता हूं कि मैं इस पोस्ट में मैगेंटो अनुवाद प्रक्रिया के कुछ विवरणों से जुड़ा हुआ हूं, लेकिन केवल इसलिए कि मैं बहुत अधिक जानकारी नहीं चाहता हूं।

  • अनुवाद सरणी का निर्माण करते समय कुछ तकनीकी विवरण
  • मॉड्यूल के लिए अतिरिक्त अनुवाद फ़ाइलों का उपयोग करने की संभावना
  • core_translateरिकॉर्ड के लिए स्टोर व्यू स्कोप
  • अनुवाद के विभिन्न तरीकों का उपयोग करके पेशेवरों और विपक्षों

यदि अधिक जानकारी की आवश्यकता हो तो कृपया एक अलग प्रश्न पूछें।


1
ठीक है, मुझे अविश्वसनीय रूप से सभी के लिए खेद है, लेकिन किसी और ने मुझे बताए बिना कैश चालू कर दिया ... संभवतः जिस क्षण मैंने अनुवादों पर काम करना शुरू किया। आह। यह जानकारी हालांकि मैगेंटो में अनुवाद प्रक्रिया की मेरी समझ के लिए अविश्वसनीय रूप से सहायक थी। बहुत से धन्यवाद, यह निश्चित रूप से सभी सवालों का जवाब देता है कि __()फ़ंक्शन कैसे काम करता है।
वफ़ल


@Vinai, उत्कृष्ट जवाब। यह वास्तव में मुझे एक अनुवाद समस्या को हल करने में मदद करता है जिसे मैंने यहां एक प्रश्न पोस्ट किया है । आश्चर्यजनक रूप से Mage_Tax मेरे विषय के अनुवादों के साथ विरोध कर रहा था, जो इसके विपरीत प्रतीत होता है कि कैसे Magento अनुवाद को प्राथमिकता देने के लिए है
Holly

14

अनुवाद के सूत्र

अनुवाद विभिन्न स्रोतों से मर्ज किए जाते हैं: संबंधित XML फ़ाइलों से मॉड्यूल अनुवाद , वर्तमान विषय से विषय अनुवादtranslate.csv और डेटाबेस से इनलाइन अनुवाद

अनुवाद कड़ाई से मॉड्यूल विशिष्ट (केवल एक मॉड्यूल के भीतर मान्य) हो सकते हैं, यह हमेशा इनलाइन अनुवाद के लिए और वैकल्पिक रूप से विषय अनुवाद के लिए मामला है। इसे प्राप्त करने के लिए, आपको उन्हें अनुवाद में मॉड्यूल उपसर्ग के साथ परिभाषित करना होगा।

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

मॉड्यूल से अनुवाद (जैसे Mage_Catalog.csv) केवल कड़ाई से मॉड्यूल विशिष्ट हैं, अगर DEVELOPER MODE चालू है। अन्यथा ट्रांसलेशन फॉम फर्स्ट लोडेड मॉड्यूल उन सभी मॉड्यूल्स के लिए विश्व स्तर पर उपयोग किया जाता है जिनका टेक्स्ट के लिए अपना अनुवाद नहीं है।

मैंने एक फ्लो चार्ट इकट्ठा किया, जिसमें दिखाया गया है कि विभिन्न स्रोतों के प्रत्येक पाठ को अनुवाद सरणी में कैसे मिलाया जाता है:

अनुवाद मर्ज data अनुवाद सरणी है

ईविल एज केस

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

अनुवाद लुकअप

किस मॉड्यूल के लिए अनुवाद देखा जाता है, यह उस वर्ग के मॉड्यूल पर निर्भर करता है, जिस पर विधि __()को बुलाया गया है। फिर, अनुवाद सरणी में लुकअप निम्नानुसार है:

अनुवाद लुकअप data अनुवाद सरणी है

दायरा परिभाषा

एक वर्ग के लिए मॉड्यूल को बदलने की संभावनाएं हैं, जो विशेष रूप से ब्लॉक और हेल्पर्स के लिए उपयोगी है। सबसे अच्छा अभ्यास हमेशा एक कोर क्लास को पुनर्लेखन करते समय मॉड्यूल नाम को स्पष्ट रूप से सेट करना है। यह कैसे काम करता है, हेल्पर्स, ब्लॉक और कंटोलर्स के बीच भिन्न होता है (मैगेंटो सीई 1.9.1 के अनुसार)

एक ब्लॉक के लिए उदाहरण:

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(स्थिरता के लिए याय)

अन्य अनुवाद विधियाँ

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>

जावास्क्रिप्ट में आप उस Translatorवस्तु का उपयोग कर सकते हैं जो विश्व स्तर पर उपलब्ध है:

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

लेकिन आपको उन अनुवादों को करना होगा जिन्हें आप जावास्क्रिप्ट में उपयोग करना चाहते हैं जो अनुवादक वस्तु के लिए उपलब्ध हैं। यह मॉड्यूल jstranslator.xmlकी etcनिर्देशिका में फ़ाइलों के माध्यम से किया जाता है ।

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

loadingकोई भी तार हो सकता है लेकिन विश्व स्तर पर अद्वितीय होना चाहिए। translateऔर moduleविशेषताओं अन्य एक्सएमएल फाइल के रूप में उपयोग किया जाता है। का messageऔर इसके अनुवाद का मूल्य JS Translator ऑब्जेक्ट में जोड़ा गया है।

समस्या निवारण

यहां तक ​​कि अगर आप सभी जटिल नियमों को जानते हैं, तो कभी-कभी यह देखना मुश्किल है कि कुछ अनुवाद क्यों काम कर रहे हैं जैसा कि यह है (या काम नहीं कर रहा है)। इसे आसान बनाने के लिए, मैंने एक "ट्रांसलेशन संकेत" मॉड्यूल विकसित किया जो दिखाता है कि अनुवाद कहाँ से आ रहे हैं:

इसे यहां प्राप्त करें: https://github.com/schmengler/TranslationHints

स्क्रीनशॉट: अनुवाद के संकेत


मेरे ब्लॉग पोस्ट और विषय पर स्लाइड के आधार पर:


2
मुझे आशा है कि मैं यह उल्लेख करके स्पैमिंग नहीं कर रहा हूं कि मेरा मुफ्त Yireo EmailOverride मॉड्यूल कस्टम CSV मॉड्यूल फ़ाइलों को थीम में भी रखा जाएगा। सिर्फ ट्रांसलेशन नहीं। टीसीवी।
जिस्से रीटमा

6

क्या आपने अपना कैश साफ़ किया है?

क्या आपका सिस्टम आपके द्वारा परीक्षण की जा रही फ़ाइल के स्थान पर सेट है?

क्या Magento उस फ़ाइल को खोज सकता है, जिसे वह तब खोज रहा है जब वह थीम अनुवाद (कुछ अस्थायी var_dump; निकास; वक्तव्य;

#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 डेवलपर सप्ताह में कम से कम एक बार ऐसा करता है।
एलन स्टॉर्म
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.