Traducir el modo de mantenimiento por sitio web en la configuración de múltiples sitios web-multidominio

12

Traducir el modo de mantenimiento por sitio web en la configuración de múltiples dominios

¿Cuál es la forma correcta de traducir (localización) la página de mantenimiento en un entorno de múltiples sitios web y dominios múltiples?

La configuración se realiza en:

  • MAGENTO_ROOT / index.php
  • MAGENTO_ROOT / uk / index.php
  • Raíz_manto / us / index.php
  • MAGENTO_ROOT / somecode / index.php

Supongamos que las tiendas son accesibles a través de:

Puedo ver fácilmente algunas soluciones para ello, pero todos ellos parecen ser más una solución que soluciones agradables y limpias.

¿Cómo resuelves este problema?

versedi
fuente

Respuestas:

10

De manera predeterminada, Magento no admite la traducción inmediata para páginas de error, y requiere algunas personalizaciones para permitir tales características. Entonces, técnicamente no hay una manera adecuada de hacerlo.

Como la pila completa NO se inicializa durante la generación de errores, la funcionalidad de traducción normal $this->__('foobar');no funcionará en las plantillas.

Algunos detalles sobre cómo se generan las páginas de error se pueden encontrar en MageBase:

Una opción es simplemente copiar errors/en cada uno de los subdirectorios de sus idiomas uk, usetc. y modificar las plantillas para reflejar los idiomas del punto de entrada del sitio web del usuario final.

Solo tenga en cuenta su index.phpde cada vista para incluir los documentos de errores relativos relativos:

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

También tenga en cuenta que hay una plantilla base para todos los errores, incluido 404 en el page.html

Probablemente haya soluciones más elegantes, pero como ya está duplicando index.phppara diferentes vistas, algunos archivos más pueden no ser demasiado desordenados. También puede modificar las plantillas para incluir el CSS y las imágenes de nivel superior para ahorrar algo de redundancia.

También puede crear un archivo de idioma del mismo modo que lo hace en la localización estándar de Magento y leer los valores con el process.phparchivo, ya que el título y algunos otros datos que necesitarían localización se están configurando allí. Un ejemplo simple de uso de Varien_File_Csv para leer un archivo de lenguaje .CSV:

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

Nota adicional: dado que la pila en el punto actual del tiempo de ejecución puede no permitir la Varien_File_Csvinclusión de la clase utilizando la función interna de PHP, fgetcsv puede ser una mejor alternativa.

Y analice el idioma del archivo CSV necesario para completar los datos requeridos en el process.phparchivo.

Otra alternativa sería simplemente agregar el traductor de Google o una herramienta de terceros para traducir automáticamente las páginas de error al idioma del usuario final.

Referencias

B00MER
fuente
2

Como se mencionó anteriormente, no hay una manera fácil de traducir la página de mantenimiento. Sin embargo, hay una solución alternativa (que tiene su propio número de ventajas / desventajas): use algunas de las extensiones del modo de mantenimiento, como esta:

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

Muestra la página de modo de mantenimiento DESPUÉS de que se haya cargado la pila de Magento, lo que significa que necesita tener una conexión a la base de datos y algunas otras cosas. Por eso también es más lento y requiere más recursos. Pero si no es un problema para usted, hace que la página de mantenimiento sea totalmente personalizable.

Pronto
fuente
¿Cuál será el resultado si, por ejemplo, se interrumpe la conexión a la base de datos?
versedi
1
Dije que es una solución alternativa y no es adecuada para todos los casos. Si la base de datos no está allí, Magento mostrará un mensaje de error.
Pronto
2

Actualizar:

Encontré otra forma de traducir la página de mantenimiento:

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

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

El constructor de la página de mantenimiento acepta un skinparámetro POST para cambiar el diseño. Parece ser la forma intencional, pero no está documentada (todavía) ...

  1. Agregue algunas reglas de reescritura .htaccessque agreguen un skinparámetro a su URL. P.ej.

    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. Copiar errors/defaultaerrors/french

  3. Cambiar / traducir archivos de plantilla a sus necesidades

Tal vez un poco tarde, pero es una buena solución de trabajo, sin copiar el errordirectorio a cada subcarpeta ...

"Desventajas":

  • tienes que editar tres archivos principales. Para evitar las ediciones en el núcleo tanto como sea posible, acabo de cambiar la ruta de acceso de las páginas de error / informe y la extendí processor.phppara leer una modificación local.xml.
  • todavía requiere archivos de plantilla para cada idioma (no hay traducción en este momento, tal vez más tarde )

Configuración básica

Configuración de múltiples sitios web y varias tiendas como esta, la única diferencia es que he configurado MAGE_RUN_CODEen .htaccesslugar de index.php. Para el primer dominio, no uso RUN_CODEtodos los demás, parece que ...

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

Además de la respuesta ligado tuve que fijar RewriteBaseen .htaccesshacer coincidir directorio locale y editar index.phpen en, fry el cambio

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

a

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

Editar errors/404.php, 503.phpyreport.php

Reemplazar

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

con

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

Y agregue esto 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;
            }
        }
    }
}

Nueva local.xmlestructura

En lugar de establecer <skin>en el primer nivel, primero busque sitios 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>

Plantillas

Agregar 503.phtml, ..., CSS a directorios que coincidan<runcode>-<locale>

  • default-default (Idioma predeterminado del primer dominio)
  • default-en
  • default-fr
  • website1-default (Idioma predeterminado del segundo dominio)
  • ...

No hay CSS / imágenes duplicadas

  • coloque los archivos CSS / imágenes específicos de su sitio web en un directorio y agregue el <skin_base>nodo alocal.xml
  • cambiar TODOS los enlaces estáticos en page.phtmlarchivos de ie href="css/styles.css"a<?php echo $this->getSkinBaseUrl('css/styles.css')?>
sv3n
fuente