Übersetzen Sie den Wartungsmodus pro Website im Multiwebsite-Multidomain-Setup

12

Übersetzen Sie den Wartungsmodus pro Website im Setup für mehrere Websites und Domains

Was ist die richtige Methode zum Übersetzen (Lokalisieren) der Wartungsseite in einer Umgebung mit mehreren Websites und Domänen?

Setup's gemacht in:

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

Nehmen wir an, die Geschäfte sind erreichbar über:

Ich sehe leicht ein paar Lösungen dafür, aber alle scheinen eher eine Problemumgehung zu sein als tatsächliche nette, saubere Lösungen.

Wie lösen Sie dieses Problem?

versedi
quelle

Antworten:

10

Standardmäßig unterstützt Magento die sofortige Übersetzung von Fehlerseiten nicht und erfordert einige Anpassungen, um solche Funktionen zu ermöglichen. Also technisch gibt es keine richtigen Weg, um dies zu tun.

Da der vollständige Stapel während der Fehlererzeugung NICHT initialisiert wird, funktioniert $this->__('foobar');die normale Übersetzungsfunktion in den Vorlagen nicht.

Einige Details zur Generierung der Fehlerseiten finden Sie in MageBase:

Eine Möglichkeit ist, einfach errors/in jedes Ihrer Unterverzeichnisse Ihre Sprachen zu kopieren uk,us usw. , und ändern Sie die Vorlagen , die Sprachen der Website Eintrittspunkt des Endbenutzers zu reflektieren.

Notieren Sie sich einfach Ihre index.phpAnsichten, um die Dokumente mit den subrelativen Fehlern einzuschließen:

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

Beachten Sie auch, dass es eine Basisvorlage für alle Fehler gibt, einschließlich 404 in der page.html

Es gibt wahrscheinlich elegantere Lösungen, aber da Sie bereits index.phpfür verschiedene Ansichten duplizieren , sind ein paar weitere Dateien möglicherweise nicht zu übersichtlich. Sie können die Vorlagen auch so ändern, dass sie CSS und Bilder der obersten Ebene enthalten, um Redundanz zu sparen.

Sie können auch eine process.phpSprachdatei wie in Magentos Standardlokalisierung erstellen und die Werte in die Datei einlesen , da dort der Titel und einige andere Daten festgelegt werden, für die eine Lokalisierung erforderlich wäre. Ein einfaches Beispiel für die Verwendung von Varien_File_Csv zum Lesen einer CSV-Sprachdatei:

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

Zusätzlicher Hinweis: Da der Stack zum aktuellen Zeitpunkt der Laufzeit möglicherweise nicht die Varien_File_CsvEinbeziehung von Klassen mit der internen PHP-Funktion fgetcsv zulässt möglicherweise eine bessere Alternative.

Analysieren Sie die CSV-Sprachdatei, die zum Auffüllen der erforderlichen Daten in der process.phpDatei erforderlich ist .

Eine andere Alternative wäre, einfach Google Übersetzer oder ein solches Drittanbieter-Tool hinzuzufügen, um die Fehlerseiten automatisch in die Sprache des Endbenutzers zu übersetzen.

Verweise:

B00MER
quelle
2

Wie bereits erwähnt, gibt es keine einfache Möglichkeit, die Wartungsseite zu übersetzen. Es gibt jedoch eine Problemumgehung (die eine Reihe von Vor- und Nachteilen hat): Verwenden Sie einige der Erweiterungen für den Wartungsmodus, z.

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

Es wird die Wartungsmodus-Seite angezeigt, NACHDEM der Magento-Stapel geladen wurde. Dies bedeutet, dass Sie eine Datenbankverbindung und einige andere Dinge benötigen. Aus diesem Grund ist es auch langsamer und erfordert mehr Ressourcen. Wenn dies jedoch kein Problem für Sie darstellt, kann die Wartungsseite vollständig angepasst werden.

Pronto
quelle
Was wird ausgegeben, wenn zB die Verbindung zur Datenbank unterbrochen wird?
Versedi
1
Ich sagte, es ist Workaround und nicht für jeden Fall geeignet. Wenn die Datenbank nicht vorhanden ist, zeigt Magento eine Fehlermeldung an.
Pronto
2

Aktualisieren:

Einen anderen Weg für übersetzte Wartungsseite gefunden:

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

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

Der Konstruktor der Wartungsseite akzeptiert einen skinPOST-Parameter, um das Layout zu ändern. Es scheint der absichtliche Weg zu sein, aber es ist (noch) nicht dokumentiert ...

  1. Fügen Sie Ihrer URL einige Umschreibungsregeln .htaccesshinzu, die einen skinParameter an Ihre URL anhängen . Z.B.

    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. Kopieren errors/defaultnacherrors/french

  3. Ändern / übersetzen Sie Vorlagendateien nach Ihren Wünschen

Vielleicht etwas spät, aber a gute Lösung, ohne das errorVerzeichnis in jeden Unterordner zu kopieren ...

"Nachteile":

  • Sie müssen drei Kerndateien bearbeiten. Um Änderungen im Kern so weit wie möglich zu vermeiden, habe ich den Pfad der Fehler- / Berichtsseiten geändert und erweitertprocessor.php geändert zum Lesen einer geändertenlocal.xml .
  • Es werden weiterhin Vorlagendateien für jede Sprache benötigt (derzeit keine Übersetzung - möglicherweise später) )

Grundeinstellung

Multi-Website Multi-Store - Set-up wie diese, nur differnce ist , dass ich eingestellt habe MAGE_RUN_CODEin .htaccessstatt index.php. Für die 1. Domain verwende ich keine RUN_CODEanderen wie es aussieht ...

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

Zusätzlich zu der verknüpften Antwort musste ich gesetzt RewriteBasein .htaccessLandverzeichnis und bearbeiten anzupassen index.phpin en, frund ändern

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

zu

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

Bearbeiten errors/404.php, 503.phpundreport.php

Ersetzen

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

mit

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

Und füge dies hinzu 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;
            }
        }
    }
}

Neue local.xmlStruktur

Anstatt <skin>auf der ersten Ebene zu setzen, suchen Sie zuerst nach dem Runcode / Gebietsschema der Website

<?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>

Vorlagen

Fügen Sie 503.phtmlden entsprechenden Verzeichnissen CSS hinzu<runcode>-<locale>

  • default-default (Standardsprache der 1. Domain)
  • default-en
  • default-fr
  • website1-default (Standardsprache der 2. Domain)
  • ...

Keine doppelten CSS / Bilder

  • Legen Sie Ihre Website-spezifischen CSS / Bilder-Dateien in ein Verzeichnis und fügen Sie einen <skin_base>Knoten hinzulocal.xml
  • ändere ALLE statischen Links in page.phtmlDateien von zB href="css/styles.css"nach<?php echo $this->getSkinBaseUrl('css/styles.css')?>
sv3n
quelle