Come implementare traduzioni in Modello di disegno del pacchetto CSV? Come funziona echo $ this -> __ ( 'Text') lavoro?
-
16-10-2019 - |
Domanda
Ho una messa a punto del pacchetto di progettazione in questo modo:
design/frontend/package_name/theme_name/locale/
in cui ho
de_DE
, en_GB
ecc, in base al quale ho corrispondenti file translate.csv
con le varie stringhe: "Key", "Translation"
Sto cercando di implementare varie stringhe in mio tema utilizzando echo $this->__('Text')
Tuttavia, non sembra al lavoro (vedo solo la stringa all'interno del ('Text')
visualizzato). Penso che mi manca un po 'di comprensione fondamentale di quando Magento tira le stringhe dal CSV da tradurre. Qualcuno può spiegare come ottenere questi file CSV per lavoro?
Soluzione
TL; DR
Se non si è interessato ai dettagli come funziona traduzione, salta il contenuto fino alla
Cosa controllare se la vostra traduzione non funziona in basso, in particolare il comma
Soluzione per il modulo di conflitti Ambito di traduzione .
Magento Traduzione Panoramica
Magento priorità fonti traduzioni (dal più alto al più basso):
- DB (tabella
core_translate
) - Il file del tema
translate.csv
- I file
app/locale/*/*.csv
Come è la matrice di traduzione costruito?
Modulo Traduzioni
In primo luogo tutti i file dal app/locale/*/*.csv
cui si fa riferimento da moduli attivi file etc/config.xml
vengono analizzati. Ecco una procedura dettagliata del processo:
Si supponga Magento trova la seguente sezione config.xml
:
<!-- 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, la seguente traduzione è specificato per la lingua configurata per la vista attuale del serbatoio:
"AAA","BBB"
In queste circostanze, Magento crea i seguenti record nella matrice di traduzione:
array(
"AAA" => "BBB",
"Mage_Catalog::AAA" => "BBB"
)
Il secondo valore è la portata Modulo utile . Il nome del modulo prefissato è preso dal nodo di configurazione XML contenente la dichiarazione, file di traduzione.
Se la stessa definizione viene nuovamente specificato da un file secondo modulo , ad esempio nel Some_Module.csv
la traduzione è "AAA","CCC"
, sarà non sovrascrive l'impostazione "AAA"
. Invece, sarà solo aggiungere un nuovo record con il secondo nome del modulo "Some_Module::AAA" => "CCC"
.
Se la modalità sviluppatore è abilitata, lo farà anche unset il record "AAA"
se trova un secondo record con la stessa chiave in un'altra traduzione modulo. Questo rende più facile individuare i conflitti di traduzione del modulo durante lo sviluppo.
Tema Traduzioni
In secondo luogo, le traduzioni caricati dal primo file translate.csv
nella fallback tema per il locale corrente è sufficiente sostituire i record esistenti nella matrice di traduzione.
Così, riprendendo l'esempio precedente, un record di translate.csv
"AAA","DDD"
porterebbe ad i seguenti dati di traduzione:
array(
"AAA" => "DDD", // This is overwritten by the translate.csv file
"Mage_Catalog::AAA" => "BBB",
"Some_Module::AAA" => "CCC"
)
di record nel corso translate.csv
con nuove chiavi di traduzione sono semplicemente aggiunti alla matrice.
Database Traduzioni
traduzioni dalla tabella core_translate
sono fondamentalmente fuse nella matrice di traduzione proprio come le traduzioni a tema.
le chiavi attuali dal modulo o tema traduzioni vengono sovrascritti dai record del database, vengono aggiunti di nuovi.
Traduzione Lookup
Quando il metodo viene chiamato __()
, Magento primi cerca una traduzione in serie corrispondenti al modulo corrente.
Il modulo corrente è determinata dal nome della classe su cui è chiamata la classe __()
. Ad esempio, in blocchi il metodo sembra responsabili come questo:
// 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 funziona di conseguenza.
Scenari Esempio di ricerca diretta ??h2>
Per un esempio, permette di dire $this->__('AAA')
viene chiamato in un file di modello.
Se il blocco associato ha il tipo Mage_Core_Block_Template
, Magento controllerà prima per un record Mage_Core::AAA
. Se non lo trova, cadrà di nuovo alla traduzione per la AAA
chiave.
Nello scenario di esempio, questo si tradurrà in DDD
traduzioni (dal file translate.csv
).
In uno scenario diverso il blocco associato potrebbe essere Mage_Catalog_Block_Product_View
. In questo caso Magento dovrebbe prima verificare la presenza di un Mage_Catalog::AAA
record di traduzione, e avrebbe trovato la AAA
traduzione.
Quindi, in effetti, le traduzioni portata modulo hanno una priorità superiore rispetto al qualsiasi generici traduzioni.
Quale traduzione utilizzato dipende which modulo la classe è di chiamare il metodo __()
.
Cosa controllare se la vostra traduzione non funziona
Se non si utilizza la vostra traduzione da un file translate.csv
, seguire questa lista di controllo:
- è la cache di traduzione spento / rinfrescato? (Soluzione: cancellare la cache)
- è il file
translate.csv
davvero nel fallback tema per l'archivio corrente? (Soluzione: configurazione del tema fisso) - C'è un record in conflitto per la traduzione nella tabella
core_translate
? (Soluzione: rimuovere il record in conflitto dacore_translate
) - Se tutti i punti precedenti non sono la causa, ci deve essere una traduzione in conflitto da un modulo differente. (Soluzione: vedi sotto)
Soluzione per il modulo di conflitti Ambito di traduzione
Se si trova l'ultimo caso è vero, è sufficiente aggiungere la traduzione per la seconda volta al translate.csv
il campo di applicazione del modulo del modulo fare la traduzione.
Nell'esempio, se avete sempre voluto AAA
essere tradotto come DDD
via la traduzione tema, si potrebbe fare questo nel vostro translate.csv
:
"AAA","DDD"
"Mage_Catalog::AAA","DDD"
"Some_Module::AAA","DDD"
In pratica, aggiungo soltanto il campo modulo per la definizione se c'è un conflitto, che è, se la traduzione non funziona.
Note aggiuntive
Inline Traduzione
La funzione di traduzione in linea di Magento aggiunge anche le traduzioni personalizzati alla tabella core_translate
utilizzando il prefisso ambito modulo.
Backward Compatibility
La priorità delle traduzioni tema usato per essere superiore quindi le traduzioni del database fino alla versione Magento 1.3 o giù di lì.
XML Traduzione
Magento volte valutare translate=""
arguments in config.xml
, system.xml
e XML layout per tradurre i valori di nodi figlio.
Una classe di supporto può essere specificato in quei casi che utilizzano l'argomento module=""
per specificare il modulo per l'ambito di traduzione.
Se nessun argomento module
viene specificato nel XML, l'assistente core/data
viene utilizzato per tradurre i valori di nodi figlio.
Ulteriori informazioni
confesso ho sorvolato alcuni dettagli del processo di traduzione Magento in questo post, ma solo perché non voglio troppe informazioni.
- Alcuni dettagli tecnici, mentre la matrice di traduzione è costruito
- La possibilità di utilizzare i file di traduzione supplementari per i moduli
- Conservare vista oscilloscopio per i record
core_translate
- Pro e contro utilizzando i diversi metodi di traduzione
Si prega di chiedere una domanda separata, se è richiesto ulteriori informazioni.
Altri suggerimenti
Fonti di traduzione
traduzioni sono fusi da diverse fonti: Modulo traduzioni dai rispettivi file XML, tema traduzioni dal translate.csv
del tema corrente, e in linea traduzioni dal database.
Le traduzioni possono essere strettamente specifico modulo (valido solo all'interno di un modulo), che è sempre il caso per le traduzioni in linea e, facoltativamente, per le traduzioni a tema. Per raggiungere questo obiettivo, è necessario definirli con il prefisso modulo nel translate.csv:
"Mage_Catalog::Add to cart","In die Einkaufstüte legen"
Translations da moduli (come Mage_Catalog.csv
) sono solo specifico strettamente modulo, se la modalità sviluppatore è acceso. Altrimenti il ??fom definizione del primo modulo caricato è usato globalmente per tutti i moduli che non dispongono di una traduzione del testo.
I assemblato un diagramma di flusso che mostra come ogni testo da diverse fonti è fusa nella matrice Traduzione:
data
indica la matrice di traduzione
mal partito Bordo
Se la stringa tradotta è uguale alla stringa non tradotta, la traduzione viene ignorato. Che suona come l'ottimizzazione utile a prima vista, ma in questo modo non si può facilmente tradurre una stringa immutata in un modulo e ha cambiato in un altro modulo, perché la traduzione modificata sarà l'unico e diventare globale.
Traduzione Lookup
Per quale modulo la traduzione viene cercato, dipende dal modulo della classe, su cui è stato chiamato il metodo __()
. Quindi, la ricerca nella matrice metodo è il seguente:
data
indica la matrice di traduzione
Definizione dell'ambito
Ci sono possibilità di cambiare il modulo per una classe, che è particolarmente utile per i blocchi e aiutanti. Le migliori pratiche è quello di impostare sempre il nome del modulo in modo esplicito per la riscrittura di una classe principale. Come funziona, varia tra Helpers, Blocks e contollers (come di Magento CE 1.9.1)
Esempio per un blocco:
class IntegerNet_AwesomeModule_Block_Catalog_Product extends Mage_Catalog_Block_Product
{
public function getModuleName()
{
return 'Mage_Catalog';
}
}
Per i blocchi, è anche possibile impostare il parametro module_name
nel layout XML:
<block type="integernet_awesomemodule/catalog_product" name="test" module_name="Mage_Catalog" />
Esempio di Helper:
class IntegerNet_AwesomeModule_Helper_Catalog extends Mage_Catalog_Helper_Data
{
protected $_moduleName = 'Mage_Catalog';
}
Per i controller di frontend, è possibile impostare la _realModuleName
proprietà, per i controller di amministrazione, _usedModuleName
(yay per la coerenza)
Altri metodi di traduzione
I file in XML (config.xml, System.Xml, layout) è possibile specificare se i nodi devono essere tradotti con l'attributo translate
. Si dovrebbe anche aggiungere l'attributo module
per specificare il campo di applicazione, ma qui il valore deve essere il helper alias , non il nome del modulo di cui sopra.
<one_column module="page" translate="label">
<label>1 column</label>
<template>page/1column.phtml</template>
<layout_handle>page_one_column</layout_handle>
<is_default>1</is_default>
</one_column>
In JavaScript è possibile utilizzare l'oggetto Translator
che è disponibile a livello globale:
Translator.translate('Please wait, loading...');
, ma bisogna fare le traduzioni che si desidera utilizzare in JavaScript a disposizione l'oggetto traduttore. Questo viene fatto attraverso i file nelle directory jstranslator.xml
etc
di moduli.
<?xml version="1.0"?>
<jstranslator>
<loading translate="message" module="core">
<message>Please wait, loading...</message>
</loading>
</jstranslator>
loading
può essere qualsiasi stringa, ma deve essere univoco. Gli attributi translate
e module
sono utilizzati come in altri file XML. Il valore di message
e la sua traduzione viene aggiunto l'oggetto traduttore JS.
Risoluzione dei problemi
Anche se si conoscono tutte le regole complicate, a volte è difficile capire perché alcune traduzioni funziona come è (o non funziona). Per facilitare questa operazione, ho sviluppato un modulo "Traduzione Suggerimenti", che mostra dove traduzioni sono provenienti da:
Scarica la suae: https://github.com/schmengler/TranslationHints
Sulla base delle mie post del blog e diapositive sul tema:
Hai svuotato la cache?
È il set di sistema alle impostazioni internazionali del file che si sta testando?
Can Magento trovare il file che sta cercando quando carica la traduzione tema (alcuni var_dump
temporanea; uscita;. Affermazioni dovrebbero aiutare
#File: app/code/core/Mage/Core/Model/Translate.php
protected function _loadThemeTranslation($forceReload = false)
{
$file = Mage::getDesign()->getLocaleFileName('translate.csv');
$this->_addData($this->_getFileData($file), false, $forceReload);
return $this;
}
Può il metodo _getTranslatedString
trovare ciò che sta cercando nella matrice di dati?
#File: app/code/core/Mage/Core/Model/Translate.php
protected function _getTranslatedString($text, $code)
{
$translated = '';
if (array_key_exists($code, $this->getData())) {
$translated = $this->_data[$code];
}
elseif (array_key_exists($text, $this->getData())) {
$translated = $this->_data[$text];
}
else {
$translated = $text;
}
return $translated;
}