Traduire le mode de maintenance par site Web dans une configuration multi-sites Web / multi-domaines


12

Traduire le mode de maintenance par site Web dans la configuration multi-sites Web multi-domaines

Quelle est la bonne façon de traduire la page de maintenance (de localisation) dans un environnement multi-site Web et multi-domaine?

La configuration est transformée en:

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

Supposons que les magasins soient accessibles via:

Je peux facilement voir quelques solutions pour cela, mais toutes semblent être plus une solution de contournement que de belles solutions propres et réelles.

Comment résolvez-vous ce problème?


Réponses:


10

Par défaut, Magento ne prend pas en charge la traduction prête à l'emploi pour les pages d'erreur et nécessite certaines personnalisations pour permettre de telles fonctionnalités. Donc, techniquement, il n'y a pas de moyen approprié de le faire.

Étant donné que la pile complète n'est PAS initialisée lors de la génération d'erreur, la fonctionnalité de traduction normale $this->__('foobar');ne fonctionnera pas dans les modèles.

Quelques détails sur la façon dont les pages d'erreur sont générées peuvent être trouvés sur MageBase:

Une option consiste à copier simplement errors/dans chacun de vos sous-répertoires de vos langues uk, usetc., et à modifier les modèles pour refléter les langues du point d'entrée du site Web de l'utilisateur final.

Notez simplement votre index.phpde chaque vue pour inclure les documents relatifs aux erreurs relatives:

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

Sachez également qu'il existe un modèle de base pour toutes les erreurs, y compris 404 dans le page.html

Il existe probablement des solutions plus élégantes, mais comme vous dupliquez déjà index.phppour différentes vues, quelques fichiers supplémentaires peuvent ne pas être trop encombrants. Vous pouvez également modifier les modèles pour inclure le CSS et les images de niveau supérieur pour enregistrer une certaine redondance.

Vous pouvez également créer un fichier de langue comme vous le faites dans la localisation standard de Magento et lire les valeurs avec le process.phpfichier, car le titre et d'autres données qui nécessiteraient une localisation y sont définis. Un exemple simple d'utilisation de Varien_File_Csv pour lire un fichier .CSV de langue:

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

Remarque supplémentaire: Étant donné que la pile au point d'exécution en cours peut ne pas permettre l' Varien_File_Csvinclusion de classe à l'aide de la fonction PHP interne, fgetcsv peut être une meilleure alternative.

Et analysez le fichier CSV de langue nécessaire pour remplir les données requises dans le process.phpfichier.

Une autre alternative serait d'ajouter simplement Google translate ou un tel outil tiers pour traduire automatiquement les pages d'erreur dans la langue de l'utilisateur final.

Les références:


2

Comme mentionné précédemment, il n'y a pas de moyen facile de traduire la page de maintenance. Il existe cependant une solution de contournement (qui a son propre nombre d'avantages / inconvénients) - utilisez certaines des extensions du mode de maintenance, comme celle-ci:

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

Il affiche la page du mode de maintenance APRÈS que la pile Magento a été chargée, ce qui signifie que vous devez avoir une connexion à la base de données et quelques autres choses. De ce fait, il est également plus lent et nécessite plus de ressources. Mais si ce n'est pas un problème pour vous, cela rend la page de maintenance entièrement personnalisable.


Quelle sera la sortie si, par exemple, la connexion à la base de données est interrompue?
versedi

1
J'ai dit, c'est une solution de contournement et ne convient pas à tous les cas. Si la base de données n'est pas là, Magento affichera un message d'erreur.
Pronto

2

Mise à jour:

Trouvé une autre façon de traduire la 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']);
    }

Le constructeur de la page de maintenance accède à un skinparamètre POST pour modifier la disposition. Cela semble être la voie intentionnelle, mais ce n'est pas (encore) documenté ...

  1. Ajoutez des règles de réécriture à votre .htaccessqui ajoutent un skinparamètre à 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]
  2. Copier errors/defaultverserrors/french

  3. Modifiez / traduisez les fichiers de modèle selon vos besoins

Peut-être un peu en retard, mais une bonne solution de travail, sans copier le errorrépertoire dans chaque sous-dossier ...

"Inconvénients":

  • vous devez éditer trois fichiers principaux. Pour éviter autant que possible les modifications dans le noyau, je viens de changer le chemin des pages d'erreur / rapport et de l'étendre processor.phppour lire un fichier modifié local.xml.
  • il nécessite toujours des fichiers modèles pour chaque langue (pas de traduction pour le moment - peut - être plus tard )

Configuration de base

Configuration multi-sites Web multi-magasins comme celle-ci, la seule différence est que je l'ai installé MAGE_RUN_CODEà la .htaccessplace de index.php. Pour le 1er domaine, je n'utilise pas RUN_CODEtous les autres, cela 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 plus de la réponse liée que je devais mettre RewriteBaseen .htaccesscorrespondre répertoire locale et modifier index.phpdans en, fret le changement

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

à

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

Modifier errors/404.php, 503.phpetreport.php

Remplacer

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

avec

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

Et ajoutez ceci à 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;
            }
        }
    }
}

Nouvelle local.xmlstructure

Au lieu de définir <skin>au premier niveau, recherchez d'abord les sites 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>

Modèles

Ajouter 503.phtml, ..., CSS aux répertoires correspondants<runcode>-<locale>

  • default-default (Langue par défaut du 1er domaine)
  • default-en
  • default-fr
  • website1-default (Langue par défaut du 2ème domaine)
  • ...

Pas de CSS / images en double

  • mettre les fichiers CSS / images spécifiques à votre site Web dans un répertoire et ajouter un <skin_base>nœud àlocal.xml
  • changer TOUS les liens statiques dans les page.phtmlfichiers de ie href="css/styles.css"à<?php echo $this->getSkinBaseUrl('css/styles.css')?>
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.