Perché le classi usano un aiuto per la traduzione anziché $ this?


27

Nei moduli core e talvolta nei template, vedo le classi di supporto utilizzate per la traduzione:

Mage::helper('someModule')->__('translate me');

Perché è preferibile:

$this->__('translate me');

Ehi Brendan, questa domanda è eccezionalmente buona e apprezzo il tuo sforzo. +1 per quello. Tuttavia Alanstorm ti dà una risposta valida per la tua domanda. Quindi sarebbe bello accettare una risposta dalle risposte disponibili. Grazie :-)
Rajeev K Tomy,

Più potere a te fratello :-)
Rajeev K Tomy,

Risposte:


24

Teorizzando, ma quando chiami

$this->__('Foo')

in un modello, quale file di traduzione CSV del modulo verrà utilizzato da Magento per tradurre Foo?

Non è sempre chiaro quale assistente di traduzione del modulo Magento alla fine chiamerà per tradurre la stringa / chiave. Poiché Magento ti consente di utilizzare la stessa chiave in moduli diversi per stringhe diverse, è spesso importante sapere quali dati di traduzione del modulo stai utilizzando. In effetti, se un modello viene utilizzato su più moduli, l'utilizzo $this->__()potrebbe essere "considerato dannoso", poiché restituirebbe valori diversi a seconda del contesto del blocco in cui il sistema di layout ha utilizzato il modello.

La mia ipotesi è che gli helper di convenienza siano stati aggiunti in anticipo, ma gli sviluppatori che hanno creato rapidamente i modelli avviando un'istanza aiutano a sapere quale file di traduzione del modulo avrebbe tradotto una stringa e quel modello si è diffuso al test del framework. Questa riga di codice, di per sé, è ambigua.

$this->__('Foo');

Ma puoi essere sicuro che questa riga di codice utilizzerà le Mage_Cataloginformazioni sulla localizzazione.

Mage::helper('catalog')->__('Foo')

Hmm, ho questa logica. In pratica ho visto solo CSV creati all'interno del pacchetto frontend per il tema attivo come /locale/{xyz}/translate.csv (non per modulo). Ho avuto il problema "la stringa esiste in moduli diversi e necessita di traduzioni diverse", ma anche "questa stringa ha più istanze in questo modulo e necessita di traduzioni diverse" che gli helper non risolvono. In generale, probabilmente posso rimanere con $ this e un CSV per tema.
Brendan Falkowski,

@BrendanFalkowski Sì, sembra una cosa da "sviluppatore di moduli" vs. "sviluppatore di temi". Direi che stai usando gli helper integrati.
Alan Storm,

@AlanStorm sicuramente un voto per te.
MTM

20

Perché vuoi usare un modulo esplicito.

Se si utilizza $this->__()in un contesto di blocco, il modulo del blocco viene utilizzato per la traduzione. Quindi, se si desidera utilizzare un modulo speciale, è necessario utilizzareMage::helper('mymodule')->__()


1
In tutti i casi, le traduzioni sono legate a un determinato modulo. Quando chiami solo $ questo, ti riferisci al modulo corrente e quando chiami il lungo Mage :: helper ('mymodule') -> __ () stai traducendo la parola con quel modulo, proprio come un CSV da un modulo invece di il CSV predefinito.
mbalparda,

Corretta. Se usi un aiutante, lo rendi esplicito.
Fabian Blechschmidt,

1
Qual è il vantaggio di essere esplicito però? I CSV di traduzione non distinguono tra i moduli o no? Non hanno sentito parlare di gerarchia / ereditarietà fallback per loro.
Brendan Falkowski,

No, tutti i CSV vengono uniti, ma puoi avere due posizioni diverse, a causa della Mage_Checkout::My Cartsintassi. E quindi è importante quale modulo viene utilizzato per la traduzione
Fabian Blechschmidt,

1
Ah, quindi gli helper hanno molto più senso per i moduli di quanto non facciano nei pacchetti frontend, che solo il loro CSV ha la precedenza sul core con cui combattere.
Brendan Falkowski,

9

Fondamentalmente sto per dire la stessa cosa degli altri ragazzi.
Se lo usi Mage::helper(...), assicurati di utilizzare un aiuto specifico per la traduzione.

Ad esempio prendiamo il Mage_Adminhtml_Block_Catalog_Product_Gridblocco.

Per le intestazioni delle colonne c'è questo: 'header'=> Mage::helper('catalog')->__('Name'),. se invece dell'helper del catalogo $this->__fosse stato utilizzato, il testo sarebbe stato tradotto utilizzando il Mage_Adminhtmlmodulo.

Ma questo è un caso in cui la logica alla base dell'utilizzo di helper nominati ha senso.

Volevo solo mostrare un caso in cui l'utilizzo $this->__('..')anziché l'approccio di supporto può portare a problemi. Parlo per esperienza.

Prendiamo il blocco Mage_Catalog_Block_Breadcrumbs. C'è una linea che assomiglia a questo: Mage::helper('catalog')->__('Home').

Penseresti di essere nel catalogmodulo in modo da poter usare $thisinvece. Ma cosa succede se si ignora il blocco dal blocco chiamato Namespace_Module_Block_Breadcrumbs?

Se $thisfosse usato, lo sarebbe il modulo usato per la traduzione Namespace_Modulee probabilmente non lo vorrai.

Ci sono due opzioni per evitarlo. O usando un helper chiamato come già accade per la maggior parte dei blocchi core.

Oppure tu come sviluppatore puoi aggiungere questo nella classe di blocco:

public function getModuleName() {
    return 'Mage_Catalog';
}

Quindi sei sicuro che tutti i testi che usano $this->__dal tuo blocco (inclusi anche i modelli che rendono incluso il blocco) saranno tradotti usando il modulo del catalogo.


Bello. La teoria di Breadcrumb era fantastica, l'ho adorato. +1 per quello :-)
Rajeev K Tomy

2

Una ragione (che è solo la mia percezione), quando usi l'helper sei più specifico sul file di traduzione, come Mage::helper('catalog')se trovasse la frase nel file di catalogo, mentre quando la usi $thiscerca casualmente in tutti i file di traduzione. Questo è quello che penso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.