Spraw, aby szablon rdzenia magento używał pliku tłumaczenia mojego modułu


15

W rozszerzeniu, nad którym pracuję, dodałem układ XML za pośrednictwem pliku config.xml modułu. Ten układ ma pewne modyfikacje w interfejsie użytkownika. Niektóre z tych bloków należą jednak do podstawowych modułów Magento. Wszystkie szablony są wyświetlane poprawnie zgodnie z oczekiwaniami.

Szablony, które spakowałem z samym modułem, używają plików tłumaczenia własnego modułu. Szablony pakowane z rdzeniem Magento pokazują nieprzetłumaczone. Jeśli dodam plik tłumaczenia dla odpowiedniego modułu podstawowego, wówczas ten plik tłumaczenia zostanie użyty, a szablon wyświetli przetłumaczony tekst.

Czy istnieje sposób, aby Magento używał pliku tłumaczenia mojego modułu, jeśli nie może znaleźć żadnych plików tłumaczenia dla modułu podstawowego Magento? Czy jest coś jeszcze, co mogę tutaj zrobić?


Możesz dodać swoje tłumaczenia do bieżącego pliku tłumaczenia motywu lub użyć wbudowanego interfejsu tłumaczenia w backend.
Dmytro Zavalkin

Chciałem spakować tłumaczenia z samym rozszerzeniem, powyższe wymagałoby dodania instrukcji dla każdego, kto je zainstaluje. Czy jest jakaś opcja, w której mogę to zrobić z kodu?
Mridul Aggarwal

4
To zależy od tego, jak tłumaczenie jest używane w tempalte, $this->__()lub Mage::helper('...')->__(). W przypadku pięści możesz zmusić blok do użycia pomocnika tłumacza. Ale wierzę, że w ogólnym przypadku jedyną opcją jest aktualizacja danych dla core_translatetabeli. Tutaj pytania dotyczące internacjonalizacji zostały szczegółowo opisane: blog.belvg.com/… .
Dmytro Zavalkin

Zobacz także Unikaj utraty tłumaczenia podczas nadpisywania bloku, aby ułatwić praktyczne rozwiązanie.
hakre

Odpowiedzi:


20

Bez względu na to, jak do tego podejdziesz, twój problem wymaga „kreatywnego” rozwiązania, godnego uwagi dewelopera do wykorzystania przez kolejnych programistów / opiekunów. Najpierw trochę tła, następnie notatka, a następnie łatwe i myślę, że rozsądne rozwiązanie na końcu <--tl; dr .

Jak zauważył Zyava , tłumaczenie podlega modułowi wykonującemu tłumaczenie. Szablony są renderowane w instancjach blokowych, a instancje blokowe mają module_namewłaściwość, która jest używana podczas wywoływania tłumaczenia; ref 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_nameNieruchomość jest (zazwyczaj) pochodzi na żądanie i na podstawie nazwy klasy (ref. ::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;
}

Tak więc, jeśli module_namewłaściwość jest już ustawiona, zastosowanie ma tłumaczenie tego modułu. W przypadku istniejących bloków z układu podstawowego tę właściwość można ustawić za pomocą układu XML; na przykład:

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

Voilà! Twój moduł CSV jest właścicielem tłumaczenia dla tego wystąpienia. To może być podejście. Oczywiście nadal istnieje lepka sytuacja, w której tłumaczenie innych modułów jest stosowane za pośrednictwem pomocnika specyficznego dla modułu w instancjach bloków (w tym oczywiście plików szablonów), i zawsze dotyczy to tłumaczeń XML układu. Takie podejście spowoduje także przerwanie działania Wyłączanie wyjścia modułów, które wykorzystuje module_nameparametr.

Rozwiązanie

Jak się okazuje, możliwe jest określenie wielu plików tłumaczeń dla modułu. Nie odbywa się to w rdzeniu (każdy moduł deklaruje tylko jeden plik .csv plik ), ale funkcjonalność jest w 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;
}

i

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

Ponieważ zawartość plików jest scalona (przetestowałem), można określić tylko te ciągi, które chcesz przesłonić w niestandardowych plikach CSV. Na przykład, jeśli chcesz przetłumaczyć ciąg informacji dodatkowych na stronie produktu (przetłumaczony przez Mage_Catalogmoduł), działałyby następujące czynności:

app / locale / Custom.csv :

"Additional Information","More Info, Dude"

W konfiguracji modułu - która powinna <depends />się włączyć,Mage_Catalog aby zapewnić scalenie zawartości po - następujące elementy spowodują scalenie par tłumaczeń Custom.csv z oryginałem:

<frontend>
    <translate>
        <modules>
            <Mage_Catalog>
                <files>
                    <additional>Custom.csv</additional>
                </files>
            </Mage_Catalog>
        </modules>
    </translate>
</frontend>

Zaletą tego podejścia jest to, że możesz zebrać swoje nadrzędne tłumaczenia podstawowe w jednym pliku.


@Francesco Powinno. Wyczyść pamięć podręczną tłumaczenia? Jeśli to nie działa, opublikuj to jako nowe pytanie (i link tutaj dla potomności).
oznacza

Potwierdzam, że działa zarówno $ this> _ jak i z pomocnikiem. masz rację, to moja wina (usunąłem poprzedni błędny komentarz)
Fra
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.