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_name
wł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_name
Nieruchomość 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_name
wł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_name
parametr.
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_Catalog
moduł), 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.