Come implementare traduzioni in Modello di disegno del pacchetto CSV? Come funziona echo $ this -> __ ( 'Text') lavoro?

magento.stackexchange https://magento.stackexchange.com/questions/6722

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?

È stato utile?

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):

  1. DB (tabella core_translate)
  2. Il file del tema translate.csv
  3. 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

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:

  1. è la cache di traduzione spento / rinfrescato? (Soluzione: cancellare la cache)
  2. è il file translate.csv davvero nel fallback tema per l'archivio corrente? (Soluzione: configurazione del tema fisso)
  3. C'è un record in conflitto per la traduzione nella tabella core_translate? (Soluzione: rimuovere il record in conflitto da core_translate)
  4. 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 DDDvia 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:

 Merge 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:

 Ricerca Traduzione 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

Cattura schermo: Suggerimenti di traduzione


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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top