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_translate
tabella)
- Il
translate.csv
file del tema
- I
app/locale/*/*.csv
file
Come viene costruito l'array di traduzione?
Traduzioni di moduli
Innanzitutto vengono analizzati tutti i file a app/locale/*/*.csv
cui si fa riferimento dai etc/config.xml
file dei moduli attivi . Ecco una procedura dettagliata del processo:
Supponiamo che Magento trovi la seguente config.xml
sezione:
<!-- 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.csv
traduzione "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.csv
file nel fallback del tema per la locale corrente sostituiscono semplicemente i record esistenti nell'array di traduzione.
Quindi, continuando l'esempio precedente, un translate.csv
record "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.csv
con le nuove chiavi di traduzione vengono semplicemente aggiunti all'array.
Traduzioni di database
Le traduzioni dalla core_translate
tabella 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::AAA
record. Se non lo trova, tornerà alla traduzione della chiave AAA
.
Nello scenario di esempio, ciò comporterà la traduzione DDD
(dal translate.csv
file).
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::AAA
e 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.csv
file non viene utilizzata, segui questo elenco di controllo:
- La cache di traduzione è disattivata / aggiornata? (Soluzione: svuota la cache)
- Il
translate.csv
file è 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_translate
tabella? (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 AAA
essere tradotto come DDD
tramite 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_translate
tabella 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.xml
e 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 module
viene specificato alcun argomento nell'XML, l' core/data
helper 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_translate
record
- Pro e contro utilizzando i diversi metodi di traduzione
Si prega di porre una domanda separata se sono necessarie ulteriori informazioni.