Traduire le mode de Maintenance par site dans multiwebsite-multidomaine d'installation
-
13-12-2019 - |
Question
Traduire le mode de Maintenance par site en multi site-multi-domaine de l'installation
Qu'est-ce que l' bon de la traduction (localisation) page de Maintenance dans un environnement multi-site et multi-domaine de l'environnement?
L'installation est faite dans:
- MAGENTO_ROOT/index.php
- MAGENTO_ROOT/uk/index.php
- MAGENTO_ROOT/us/index.php
- MAGENTO_ROOT/somecode/index.php
Supposons que les magasins sont accessibles par le biais de:
- http://MagentoExample.com/index.php (par défaut)
- http://MagentoExample.uk/ (royaume-uni)
- http://MagentoExample.us/ (états-unis)
- http://MagentoExample.com (somecode)
Je peux facilement voir quelques solutions pour elle, mais tout de theem semble être plus d'une solution de contournement que le réel nice, propres solutions.
Comment voulez-vous résoudre ce problème?
La solution
Par défaut de Magento ne prend pas en charge la traduction out-of-box pour les pages d'erreur, et nécessite quelques personnalisations afin de permettre à ces fonctions.Donc, techniquement, il n'y a pas de bon façon de faire de telles.
Depuis la pile n'est PAS initialisé lors de l'erreur de génération, normal la fonctionnalité de traduction $this->__('foobar');
ne fonctionne pas dans les modèles.
Quelques détails sur la façon dont les pages d'erreur sont générés peuvent être trouvés sur MageBase:
Une option est de simplement copier errors/
dans chacun de vos sous-répertoires de votre langues uk
, us
, etc.et modifier les modèles pour refléter les langues du site web du point d'entrée de l'utilisateur final.
Il suffit de noter votre index.php
de chaque point de vue d'inclure les sous-erreurs relatives docs:
if (file_exists($maintenanceFile)) {
include_once dirname(__FILE__) . '/errors/503.php';
exit;
}
Également être consciente de l'existence d'un modèle de base pour toutes les erreurs, y compris 404 dans la page.html
Il y a probablement plus élégant des solutions, mais puisque vous êtes déjà dupliquer index.php
différents points de vue, un peu plus de fichiers peuvent ne pas être trop encombré.Vous pouvez également modifier les modèles pour inclure le haut niveau de la CSS et des images à enregistrer une certaine redondance.
Vous pouvez également créer un fichier de langue de la même manière que dans Magento standard de localisation et de lire les valeurs dans la process.php
fichier, comme le titre et quelques autres données qui auraient besoin de localisation est mis là.Un exemple simple d'utilisation de Varien_File_Csv à lire une langue .Fichier CSV:
$csvObject = new Varien_File_Csv();
$csvObject->getData($file);
Note supplémentaire:Depuis la pile au point en cours d'exécution ne permettent pas l' Varien_File_Csv
la classe d'inclusion à l'aide de l'interne en fonction PHP fgetcsv peut-être une meilleure alternative.
Et analyser la langue de fichier CSV nécessaires pour renseigner les données nécessaires dans le process.php
fichier.
Une autre alternative serait de simplement ajouter Google translate ou tel outil 3ème partie de traduire automatiquement les pages d'erreur à la fin les utilisateurs de la langue.
Références:
Autres conseils
Comme mentionné avant qu'il n'y ait pas de moyen facile de traduire la page de maintenance.Il y a cependant une solution de contournement (qui a son propre nombre d'avantages / inconvénients) - Utilisez certaines des extensions de mode de maintenance, telles que celle-ci:
http://www.magentocommerce.com/magento-connect/store-maintenance.html
Il affiche la page du mode de maintenance après la charge de Magento Stack, ce qui signifie que vous devez avoir une connexion de base de données et peu d'autres choses.À cause de cela, il est également plus lent et nécessite plus de ressources.Mais si ce n'est pas un problème pour vous, il rend la page de maintenance entièrement personnalisable.
Mise à jour:
Trouvé un autre moyen de traduction de page de maintenance:
https://github.com/OpenMage/magento-lts/blob/1.9.3.x/errors/processor.php#L160-L162
if (isset($_GET['skin'])) {
$this->_setSkin($_GET['skin']);
}
La page de maintenance constructeur accecpts un skin
POST paramètre de mise en page.Il semble être la manière intentionnelle, mais il n'est pas pour rédaction (encore) ...
Ajouter quelques règles de réécriture pour votre
.htaccess
qui ajoute uneskin
paramètre de votre URL.Par exemple.RewriteCond %{HTTP_HOST} ^french.example.com$ RewriteCond %{DOCUMENT_ROOT}/.maintenance.flag -f RewriteCond %{QUERY_STRING} !(^|&)skin=french(&|$) [NC] RewriteRule ^ %{REQUEST_URI}?skin=french[L]
Copie
errors/default
pourerrors/french
- Modifier/traduire les fichiers de modèle à vos besoins
Peut-être peu en retard, mais un bon solution de travail, sans copier error
répertoire pour chaque sous-dossier ...
"Inconvénients":
- vous devez modifier les trois fichiers de base.Pour éviter les modifications dans la base, autant que possible, j'ai juste changé le chemin d'inclusion de l'erreur/les pages du rapport et de l'étendue
processor.php
pour lire une version modifiée delocal.xml
. - il nécessite encore des fichiers de modèle pour toutes les langues (pas de traduction pour le moment - peut-être plus tard)
La configuration de base
Multi-site, multi-magasins comme cela, seule la differnce est que j'ai mis MAGE_RUN_CODE
dans .htaccess
au lieu de index.php
.Pour la 1ère domaine je n'utilise pas RUN_CODE
tous les autres, il ressemble ...
RewriteCond %{HTTP_HOST} ^www.example.com$
RewriteRule .* - [E=MAGE_RUN_CODE:website1]
RewriteCond %{HTTP_HOST} ^www.example.com$
RewriteRule .* - [E=MAGE_RUN_TYPE:website]
En outre, les liens entre la réponse que j'ai eu à définir RewriteBase
dans .htaccess
au match locale répertoire et modifier index.php
dans en
, fr
et le changement
$maintenanceFile = 'maintenance.flag';
...
if (file_exists($maintenanceFile)) {
include_once dirname(__FILE__) . '/errors/503.php';
exit;
}
pour
$maintenanceFile = '../maintenance.flag';
...
if (file_exists($maintenanceFile)) {
include_once '../errors/503.php';
exit;
}
Modifier errors/404.php
, 503.php
et report.php
Remplacer
require_once 'processor.php';
$processor = new Error_Processor();
avec
require_once 'processor_multiwebsite.php';
$processor = new Error_Processor_Multiwebsite();
Et les ajouter à 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;
}
}
}
}
Nouveau local.xml
structure
Au lieu de mettre<skin>
au premier niveau pour les sites web exécutercode/locale première
<?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>
Modèles
Ajouter 503.phtml
, ..., CSS pour les répertoires correspondant à <runcode>-<locale>
default-default
(1er domaine de la langue par défaut)default-en
default-fr
website1-default
(2e domaine de la langue par défaut)- ...
Aucun duplicata CSS/images
- mettre votre site internet spécifique CSS/images fichiers dans un répertoire et ajouter
<skin_base>
nœud àlocal.xml
- changement de TOUS les statique liens dans
page.phtml
c'est à dire des fichiers à partir dehref="css/styles.css"
pour<?php echo $this->getSkinBaseUrl('css/styles.css')?>