TL; DR
Se non sei interessato ai dettagli su come funziona la traduzione, salta il contenuto fino alla sezione
Cosa controllare se la traduzione non funziona di seguito, in particolare la sottosezione
Soluzione per conflitti di traduzione dell'ambito del modulo .
Panoramica sulla traduzione di Magento
Magento dà la priorità alle fonti di traduzione (dal più alto al più basso):
- DB (la
core_translatetabella)
- Il
translate.csvfile del tema
- I
app/locale/*/*.csvfile
Come viene costruito l'array di traduzione?
Traduzioni di moduli
Innanzitutto vengono analizzati tutti i file a app/locale/*/*.csvcui si fa riferimento dai etc/config.xmlfile dei moduli attivi . Ecco una procedura dettagliata del processo:
Supponiamo che Magento trovi la seguente config.xmlsezione:
<!-- excerpt from Mage/Catalog/etc/config.xml -->
<frontend>
<translate>
<modules>
<Mage_Catalog>
<files>
<default>Mage_Catalog.csv</default>
</files>
</Mage_Catalog>
</modules>
</translate>
</frontend>
E in quel file, viene specificata la seguente traduzione per le impostazioni locali configurate per la vista dell'archivio corrente:
"AAA","BBB"
In queste circostanze, Magento crea i seguenti record nell'array di traduzione:
array(
"AAA" => "BBB",
"Mage_Catalog::AAA" => "BBB"
)
Il secondo valore è la traduzione dell'ambito del modulo . Il nome del modulo con prefisso viene preso dal nodo XML di configurazione contenente la dichiarazione del file di traduzione.
Se la stessa traduzione viene nuovamente specificata da un secondo file del modulo , ad es. Nella Some_Module.csvtraduzione "AAA","CCC", NON SOVRACCARICERÀ l' "AAA"impostazione. Invece, aggiungerà solo un nuovo record con il secondo nome del modulo "Some_Module::AAA" => "CCC".
Se la modalità sviluppatore è abilitata, sarà anche disinserire il "AAA"record se si trova un secondo record con la stessa chiave in un'altra traduzione modulo. Ciò semplifica l'individuazione dei conflitti di traduzione dei moduli durante lo sviluppo.
Traduzioni tematiche
In secondo luogo, le traduzioni caricate dal primo translate.csvfile nel fallback del tema per la locale corrente sostituiscono semplicemente i record esistenti nell'array di traduzione.
Quindi, continuando l'esempio precedente, un translate.csvrecord "AAA","DDD"porterebbe ai seguenti dati di traduzione:
array(
"AAA" => "DDD", // This is overwritten by the translate.csv file
"Mage_Catalog::AAA" => "BBB",
"Some_Module::AAA" => "CCC"
)
Naturalmente i record translate.csvcon le nuove chiavi di traduzione vengono semplicemente aggiunti all'array.
Traduzioni di database
Le traduzioni dalla core_translatetabella vengono fondamentalmente unite nell'array di traduzioni proprio come le traduzioni dei temi.
Le chiavi esistenti dal modulo o le traduzioni dei temi vengono sovrascritte dai record del database, nuove vengono aggiunte.
Ricerca di traduzione
Quando __()viene chiamato il metodo, Magento cerca innanzitutto una traduzione in array corrispondente al modulo corrente.
Il modulo corrente è determinato dal nome della classe su cui __()viene chiamata la classe. Ad esempio, in blocchi il metodo responsabile è simile al seguente:
// 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;
}
I metodi in Helpers e Controller funzionano in modo corrispondente.
Scenari di ricerca di esempio
Per un esempio, supponiamo che $this->__('AAA')venga chiamato in un file modello. Se il blocco associato ha il tipo Mage_Core_Block_Template, Magento controllerà prima un Mage_Core::AAArecord. Se non lo trova, tornerà alla traduzione della chiave AAA.
Nello scenario di esempio, ciò comporterà la traduzione DDD(dal translate.csvfile).
In uno scenario diverso potrebbe essere il blocco associato Mage_Catalog_Block_Product_View. In questo caso Magento controlla prima la presenza di un record di traduzione Mage_Catalog::AAAe trova la traduzione AAA.
Quindi, in effetti, le traduzioni dell'ambito del modulo hanno una priorità più alta rispetto a qualsiasi traduzione generica . La traduzione utilizzata dipende dal modulo utilizzato dalla classe per chiamare il __()metodo.
Cosa verificare se la traduzione non funziona
Se la tua traduzione da un translate.csvfile non viene utilizzata, segui questo elenco di controllo:
- La cache di traduzione è disattivata / aggiornata? (Soluzione: svuota la cache)
- Il
translate.csvfile è davvero nel fallback del tema per l'archivio corrente? (Soluzione: correzione della configurazione del tema)
- Esiste un record in conflitto per la traduzione nella
core_translatetabella? (Soluzione: rimuovere il record in conflitto da core_translate)
- Se tutti i punti precedenti non sono la causa, deve esserci una traduzione in conflitto da un modulo diverso. (Soluzione: vedi sotto)
Soluzione per conflitti di traduzione dell'ambito del modulo
Se si trova l'ultimo caso è vero, è sufficiente aggiungere la traduzione una seconda volta per la vostra translate.csv con il campo di applicazione del modulo del modulo fare la traduzione.
Nell'esempio, se hai sempre voluto AAAessere tradotto come DDDtramite la traduzione del tema, potresti farlo nel tuo translate.csv:
"AAA","DDD"
"Mage_Catalog::AAA","DDD"
"Some_Module::AAA","DDD"
In pratica, aggiungo l'ambito del modulo alla traduzione solo in caso di conflitto, ovvero se una traduzione non funziona.
Note aggiuntive
Traduzione in linea
La funzione di traduzione in linea di Magento aggiunge anche le traduzioni personalizzate alla core_translatetabella usando il prefisso dell'ambito del modulo.
Retrocompatibilità
La priorità delle traduzioni del tema era maggiore delle traduzioni del database fino a Magento versione 1.3 o giù di lì.
Traduzione XML
Magento volte valutare translate=""argomenti config.xml, system.xmle XML layout per tradurre i valori nodo figlio.
In questi casi è possibile specificare una classe helper utilizzando l' module=""argomento per specificare il modulo per l'ambito della traduzione.
Se non moduleviene specificato alcun argomento nell'XML, l' core/datahelper viene utilizzato per tradurre i valori del nodo figlio.
Ulteriori informazioni
Confesso di aver analizzato alcuni dettagli del processo di traduzione di Magento in questo post, ma solo perché non voglio troppe informazioni.
- Alcuni dettagli tecnici durante la creazione dell'array di traduzioni
- La possibilità di utilizzare file di traduzione aggiuntivi per i moduli
- Archiviare l'ambito della vista per i
core_translaterecord
- Pro e contro utilizzando i diversi metodi di traduzione
Si prega di porre una domanda separata se sono necessarie ulteriori informazioni.