Wartungsmodus pro Website in Multiwebsite übersetzen-Multidomain-Einrichtung
-
13-12-2019 - |
Frage
Übersetzen Sie den Wartungsmodus pro Website in Multi-Website-Multi-Domain-Setup
Was ist der richtig art der Übersetzung (Lokalisierung) von Wartungsseiten in einer Umgebung mit mehreren Websites und Domänen?
Setup ist gemacht in:
- MAGENTO_WURZEL/index.PHP
- MAGENTO_ROOT/deutsch/index.PHP
- MAGENTO_ROOT/us/index.PHP
- MAGENTO_ROOT/ein Code/index.PHP
Nehmen wir an, dass die Geschäfte über erreichbar sind:
- http://MagentoExample.com/index.php (Standard)
- http://MagentoExample.uk/ (Großbritannien)
- http://MagentoExample.us/ (US)
- http://MagentoExample.com (irgendein Code)
Ich kann leicht einige Lösungen dafür sehen, aber alles scheint eher eine Problemumgehung zu sein als tatsächlich nette, saubere Lösungen.
Wie lösen Sie dieses Problem?
Lösung
Standardmäßig unterstützt Magento keine Out-of-Box-Übersetzung für Fehlerseiten und erfordert einige Anpassungen, um solche Funktionen zu ermöglichen.Technisch gibt es also keine richtig weg, dies zu tun.
Da der vollständige Stapel während der Fehlergenerierung NICHT initialisiert wird, normale Übersetzungsfunktionalität $this->__('foobar');
funktioniert nicht in den Vorlagen.
Einige Details darüber, wie die Fehlerseiten generiert werden, finden Sie auf MageBase:
Eine Möglichkeit besteht darin, einfach zu kopieren errors/
in jedes Ihrer Unterverzeichnisse Ihrer Sprachen uk
, us
, usw.und ändern Sie die Vorlagen so, dass sie die Sprachen des Website-Einstiegspunkts des Endbenutzers widerspiegeln.
Notieren Sie einfach Ihre index.php
jeder Ansicht, um die subrelativen Fehlerdokumente 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 duplizieren index.php
für verschiedene Ansichten sind ein paar weitere Dateien möglicherweise nicht zu viel Unordnung.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 Sprachdatei wie in der Standardlokalisierung von Magento erstellen und die Werte mit dem einlesen process.php
datei als Titel und einige andere Daten, die lokalisiert werden müssten, werden dort festgelegt.Ein einfaches Beispiel für die Verwendung von Varien_File_Csv zum Lesen einer Sprache .CSV-Datei:
$csvObject = new Varien_File_Csv();
$csvObject->getData($file);
Zusätzlicher Hinweis:Da der Stapel zum aktuellen Zeitpunkt der Laufzeit möglicherweise nicht zulässt, dass die Varien_File_Csv
Klasseneinschluss mit der internen PHP-Funktion fgetcsv könnte eine bessere Alternative sein.
Und analysieren Sie die Sprach-CSV-Datei, die zum Auffüllen der erforderlichen Daten in der process.php
Datei.
Eine andere Alternative wäre, einfach Google Translate oder ein solches 3rd-Party-Tool hinzuzufügen, um die Fehlerseiten automatisch in die Sprache des Endbenutzers zu übersetzen.
Verweis:
Andere Tipps
Wie bereits erwähnt, gibt es keine einfache Möglichkeit, die Wartungsseite zu übersetzen.Es gibt jedoch eine Problemumgehung dafür (was seine eigene Anzahl von Vorteilen / Nachteilen hat) - Verwenden Sie einige der Wartungsmodus-Erweiterungen, z. B. diese ein:
http://www.magentocommerce.com/magento-connect/store-WARMAGE.HTML
es zeigt die Wartungsmodusseite an, nachdem der Magento-Stack geladen wurde, was bedeutet, dass Sie Datenbankverbindung und wenige andere Dinge haben müssen.Dadurch ist es auch langsamer und erfordert mehr Ressourcen.Aber wenn es kein Problem für Sie ist, macht es die Wartungsseite vollständig anpassbar.
Update:
Einen anderen Weg für die ü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 eine skin
POST-Parameter zum Ändern des Layouts.Es scheint der beabsichtigte Weg zu sein, aber es ist (noch) nicht dokumentiert...
Fügen Sie Ihrem Einige Umschreibregeln hinzu
.htaccess
das hängt einskin
parameter zu Ihrer URL.Z.RewriteCond %{HTTP_HOST} ^french.example.com$ RewriteCond %{DOCUMENT_ROOT}/.maintenance.flag -f RewriteCond %{QUERY_STRING} !(^|&)skin=french(&|$) [NC] RewriteRule ^ %{REQUEST_URI}?skin=french[L]
Kopieren
errors/default
zuerrors/french
- Vorlagendateien nach Ihren Bedürfnissen ändern / übersetzen
Vielleicht etwas spät, aber ein gut arbeitslösung, ohne zu kopieren error
verzeichnis zu jedem Unterordner...
"Nachteil":
- sie müssen drei Kerndateien bearbeiten.Um Änderungen im Kern so weit wie möglich zu vermeiden, habe ich gerade den Include-Pfad der Fehler- / Berichtsseiten geändert und erweitert
processor.php
so lesen Sie eine modifiziertelocal.xml
. - es werden weiterhin Vorlagendateien für jede Sprache benötigt (derzeit keine Übersetzung - vielleicht später)
Grundlegende Einrichtung
Einrichtung mehrerer Websites mit mehreren Geschäften so ist der einzige Unterschied, den ich eingestellt habe MAGE_RUN_CODE
in .htaccess
statt index.php
.Für die 1. Domain verwende ich keine RUN_CODE
bei allen anderen sieht es so aus ...
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 einstellen RewriteBase
in .htaccess
so passen Sie das Gebietsschemaverzeichnis an und bearbeiten es index.php
in en
, fr
und Veränderung
$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.php
und report.php
Ersetzen
require_once 'processor.php';
$processor = new Error_Processor();
mit
require_once 'processor_multiwebsite.php';
$processor = new Error_Processor_Multiwebsite();
Und fügen Sie 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;
}
}
}
}
Neu local.xml
Struktur
Anstatt zu setzen<skin>
suchen Sie auf der ersten Ebene zuerst nach Websites Runcode / Gebietsschema
<?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
Hinzufügen 503.phtml
, ..., CSS zu Verzeichnissen passend <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- / Bilddateien in ein Verzeichnis und fügen Sie sie hinzu
<skin_base>
knoten zulocal.xml
- ALLES ändern statisch links auf
page.phtml
dateien von z.B.href="css/styles.css"
zu<?php echo $this->getSkinBaseUrl('css/styles.css')?>