Traduci la modalità di manutenzione per sito Web nell'impostazione multi-sito-multidominio


12

Traduci la modalità di manutenzione per sito Web nella configurazione di più siti Web e domini multipli

Qual è il modo corretto di tradurre la pagina di manutenzione (localizzazione) in un ambiente multi-sito Web e multi-dominio?

Il programma di installazione è composto da:

  • MAGENTO_ROOT / index.php
  • MAGENTO_ROOT / it / index.php
  • MAGENTO_ROOT / us / index.php
  • MAGENTO_ROOT / somecode / index.php

Supponiamo che i negozi siano accessibili attraverso:

Riesco facilmente a vedere poche soluzioni, ma tutto sembra essere più una soluzione alternativa delle soluzioni belle e pulite.

Come risolvi questo problema?


Risposte:


10

Per impostazione predefinita Magento non supporta la traduzione predefinita per le pagine di errore e richiede alcune personalizzazioni per consentire tali funzionalità. Quindi tecnicamente non esiste un modo adeguato per farlo.

Poiché lo stack completo NON è inizializzato durante la generazione dell'errore, la normale funzionalità di traduzione $this->__('foobar');non funzionerà nei modelli.

Alcuni dettagli su come vengono generate le pagine di errore su MageBase:

Un'opzione è semplicemente copiare errors/in ciascuna delle tue sottodirectory delle tue lingue uk, usecc. E modificare i modelli per riflettere le lingue del punto di ingresso del sito Web dell'utente finale.

Basta notare il tuo index.phpdi ogni vista per includere i documenti relativi agli errori secondari:

if (file_exists($maintenanceFile)) {
    include_once dirname(__FILE__) . '/errors/503.php';
    exit;
}

Inoltre, è presente un modello di base per tutti gli errori, incluso 404 nel file page.html

Probabilmente ci sono soluzioni più eleganti, ma poiché stai già duplicando index.phpper diverse viste, alcuni file potrebbero non essere troppo ingombranti. È inoltre possibile modificare i modelli per includere il CSS di livello superiore e le immagini per risparmiare un po 'di ridondanza.

Puoi anche creare un file di lingua come nella localizzazione standard di Magento e leggere i valori con il process.phpfile, poiché qui vengono impostati il ​​titolo e alcuni altri dati che avrebbero bisogno di localizzazione. Un semplice esempio dell'uso di Varien_File_Csv per leggere un file .CSV in lingua:

$csvObject = new Varien_File_Csv();
$csvObject->getData($file);

Nota aggiuntiva: poiché lo stack nel momento corrente del runtime potrebbe non consentire l' Varien_File_Csvinclusione della classe utilizzando la funzione PHP interna, fgetcsv potrebbe essere un'alternativa migliore.

E analizzare il file CSV in lingua necessario per popolare i dati richiesti nel process.phpfile.

Un'altra alternativa sarebbe quella di aggiungere semplicemente Google traduttore o tale strumento di terze parti per tradurre automaticamente le pagine di errore nella lingua degli utenti finali.

Riferimenti:


2

Come accennato in precedenza, non esiste un modo semplice per tradurre la pagina di manutenzione. C'è comunque una soluzione alternativa (che ha il proprio numero di vantaggi / svantaggi): utilizzare alcune delle estensioni della modalità di manutenzione, come questa:

http://www.magentocommerce.com/magento-connect/store-maintenance.html

Visualizza la pagina della modalità di manutenzione DOPO che lo stack Magento è stato caricato, il che significa che è necessario disporre di una connessione al database e poche altre cose. Per questo motivo è anche più lento e richiede più risorse. Ma se non è un problema per te, rende la pagina di manutenzione completamente personalizzabile.


Quale sarà l'output se cioè la connessione al database verrà interrotta?
versedi

1
Ho detto, è una soluzione alternativa e non adatta a tutti i casi. Se il database non è presente, Magento visualizzerà un messaggio di errore.
Pronto

2

Aggiornare:

Trovato un altro modo per la pagina di manutenzione tradotta:

https://github.com/OpenMage/magento-lts/blob/1.9.3.x/errors/processor.php#L160-L162

    if (isset($_GET['skin'])) {
        $this->_setSkin($_GET['skin']);
    }

Il costruttore della pagina di manutenzione esegue un skinparametro POST per modificare il layout. Sembra essere il modo intenzionale, ma non documentato (ancora) ...

  1. Aggiungi alcune regole di riscrittura al tuo .htaccessche aggiunge un skinparametro al tuo URL. Per esempio.

    RewriteCond %{HTTP_HOST} ^french.example.com$
    RewriteCond %{DOCUMENT_ROOT}/.maintenance.flag -f
    RewriteCond %{QUERY_STRING} !(^|&)skin=french(&|$) [NC]
    RewriteRule ^ %{REQUEST_URI}?skin=french[L]
  2. Copia errors/defaultinerrors/french

  3. Modifica / traduci i file modello in base alle tue esigenze

Forse un po 'in ritardo, ma una buona soluzione funzionante, senza copiare la errordirectory in ogni sottocartella ...

"Lati negativi":

  • devi modificare tre file core. Per evitare il più possibile le modifiche nel core, ho appena cambiato il percorso di errore / pagine di report ed esteso processor.phpper leggere una modifica local.xml.
  • richiede ancora file modello per ogni lingua (nessuna traduzione al momento - forse più tardi )

Installazione di base

Multi-sito multi-store set-up come questo, solo differnce è che ho impostato MAGE_RUN_CODEnel .htaccessposto di index.php. Per il 1 ° dominio non uso RUN_CODEtutti gli altri sembra ...

RewriteCond %{HTTP_HOST} ^www.example.com$
RewriteRule .* - [E=MAGE_RUN_CODE:website1]
RewriteCond %{HTTP_HOST} ^www.example.com$
RewriteRule .* - [E=MAGE_RUN_TYPE:website]

Oltre alla risposta legata ho dovuto impostare RewriteBasein .htaccessmodo che corrisponda directory locale e modificare index.phpin en, fre il cambiamento

$maintenanceFile = 'maintenance.flag';
...
if (file_exists($maintenanceFile)) {
    include_once dirname(__FILE__) . '/errors/503.php';
    exit;
}

per

$maintenanceFile = '../maintenance.flag';
...
if (file_exists($maintenanceFile)) {
    include_once '../errors/503.php';
    exit;
}

Modifica errors/404.php, 503.phpereport.php

Sostituire

require_once 'processor.php';
$processor = new Error_Processor();

con

require_once 'processor_multiwebsite.php';
$processor = new Error_Processor_Multiwebsite();

E aggiungi questo a errors/processor_multiwebsite.php

<?php
require_once 'processor.php';
class Error_Processor_Multiwebsite extends Error_Processor
{
    const DEFAULT_RUNCODE = 'default';
    const DEFAULT_LOCALE = 'default';

    /**
     * Magento run code
     *
     * @var string
    */
    protected $_runCode;

    /**
     * Magento run code
     *
     * @var string
    */
    protected $_locale;

    public function __construct()
    {
        $this->_runCode = self::DEFAULT_RUNCODE;
        if (isset($_SERVER['MAGE_RUN_CODE'])) {
            $this->_runCode = $_SERVER['MAGE_RUN_CODE'];
        }

        $this->_locale = self::DEFAULT_LOCALE;
        $path = array_filter(explode('/', str_replace('index.php', '', $_SERVER['SCRIPT_NAME'])));
        if (end($path)) {
            $this->_locale = end($path);
        }

        parent::__construct();
    }

    /**
     * Retrieve skin URL
     *
     * @return string
     */
    public function getSkinUrl()
    {
        $baseUrl = str_replace($this->_locale . '/', '', $this->getBaseUrl());
        return $baseUrl . self::ERROR_DIR. '/' . $this->_config->skin . '/';
    }


    /**
     * Retrieve skin base URL
     *
     * @return string
     */
    public function getSkinBaseUrl($file)
    {
        return $this->_config->skin_base ? "../{$this->_config->skin_base}/{$file}" : $file;
    }

    /**
     * Prepare config data
     */
    protected function _prepareConfig()
    {
        parent::_prepareConfig();

        $local  = $this->_loadXml(self::MAGE_ERRORS_LOCAL_XML);
        if (!is_null($local)) {
            if ((string)$local->{$this->_runCode}->{$this->_locale}->skin) {
                $this->_config->skin = (string)$local->{$this->_runCode}->{$this->_locale}->skin;
            }
            # add skin base URL
            if ((string)$local->{$this->_runCode}->{$this->_locale}->skin_base) {
                $this->_config->skin_base = (string)$local->{$this->_runCode}->{$this->_locale}->skin_base;
            }
        }
    }
}

Nuova local.xmlstruttura

Invece di impostare <skin>al primo livello, cerca prima i siti web runcode / locale

<?xml version="1.0"?>
<config>
    <!-- 1st domain w/o runcode -->
    <default>
        <!-- no locale sub dir -->
        <default>
            <skin>default-default</skin>
            ...
        </default>
        <en>
            <skin>default-en</skin>
            <skin_base>default-default</skin_base>
            ...
        </en>
        <fr>
            <skin>default-fr</skin>
            <skin_base>default-default</skin_base>
            ...
        </fr>
    </default>
    <!-- runcode website1 -->
    <website1>
        <!-- no locale sub dir -->
        <default>
            <skin>website1-default</skin>
            ...
        </default>
        ...
    </website1>
</config>

Modelli

Aggiungi 503.phtml, ..., CSS alle directory corrispondenti<runcode>-<locale>

  • default-default (Prima lingua predefinita del dominio)
  • default-en
  • default-fr
  • website1-default (Lingua predefinita 2 ° dominio)
  • ...

Nessun CSS / immagini duplicati

  • inserisci i file CSS / immagini specifici del tuo sito web in una directory e aggiungi il <skin_base>nodo alocal.xml
  • cambia TUTTI i collegamenti statici nei page.phtmlfile da ie href="css/styles.css"a<?php echo $this->getSkinBaseUrl('css/styles.css')?>
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.