Ganz gleich, wie Sie vorgehen, für Ihr Problem ist eine "kreative" Lösung erforderlich, die einen Hinweis für Entwickler verdient, damit nachfolgende Entwickler / Betreuer sie verwenden können. Zunächst einiger Hintergrund mit einer Note, gefolgt von einer einfachen und ich denke , vernünftige Lösung am Ende <--
tl; dr .
Wie Zyava betonte , unterliegt die Übersetzung dem Modul, das die Übersetzung vornimmt . Vorlagen werden in Blockinstanzen gerendert, und Blockinstanzen verfügen über eine module_name
Eigenschaft, die beim Aufrufen der Übersetzung verwendet wird. 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);
}
Die module_name
Eigenschaft wird (normalerweise) nach Bedarf abgeleitet und basiert auf dem Klassennamen (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;
}
Wenn also die module_name
Eigenschaft bereits festgelegt ist , gilt diese Modulübersetzung. Für vorhandene Blöcke aus dem Core-Layout kann diese Eigenschaft über Layout-XML festgelegt werden. beispielsweise:
<default>
<action block="root" method="setModuleName">
<name>Your_Module</name>
</action>
</default>
Voilà! Ihr Modul CSV besitzt die Übersetzung für diese Instanz. Dies könnte ein Ansatz sein. Natürlich bleibt die Situation, dass die Übersetzung anderer Module über einen modulspezifischen Helfer in Blockinstanzen (natürlich auch in Vorlagendateien) angewendet wird, unverändert, und dies gilt immer für Layout-XML-Übersetzungen. Außerdem wird durch diesen Ansatz das Verhalten " module_name
Modulausgabe deaktivieren" , bei dem der Parameter verwendet wird, unterbrochen.
Lösung
Wie sich herausstellt, können für ein Modul mehrere Übersetzungsdateien angegeben werden. Es wird nicht im Kern ausgeführt (jedes Modul deklariert nur eine CSV- Datei), aber die Funktionalität ist in Folgendem enthalten 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;
}
und
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;
}
Da der Inhalt der Dateien zusammengeführt wird (von mir getestet), können nur die Zeichenfolgen angegeben werden, die Sie in Ihren benutzerdefinierten CSVs überschreiben möchten. Wenn Sie beispielsweise die Zeichenfolge " Zusätzliche Informationen" auf der Produktseite (vom Mage_Catalog
Modul übersetzt) übersetzen möchten, funktioniert Folgendes:
app / locale / Custom.csv :
"Additional Information","More Info, Dude"
In Ihrem Modul Config - das sollte <depends />
auf Mage_Catalog
seinen Inhalt , um sicherzustellen , fusionieren nach - folgenden wird die verursachen Custom.csv Übersetzungspaare fusionieren oben auf das Original:
<frontend>
<translate>
<modules>
<Mage_Catalog>
<files>
<additional>Custom.csv</additional>
</files>
</Mage_Catalog>
</modules>
</translate>
</frontend>
Das Schöne an diesem Ansatz ist, dass Sie Ihre übergeordneten Kernübersetzungen in einer Datei zusammenfassen können.