Traducir el modo de mantenimiento por sitio web en una configuración multisitio web y multidominio
-
13-12-2019 - |
Pregunta
Traducir el modo de mantenimiento por sitio web en una configuración de múltiples sitios web y múltiples dominios
Cuál es el adecuado ¿Cómo traducir (localización) la página de mantenimiento en un entorno de múltiples sitios web y múltiples dominios?
La configuración se realiza en:
- MAGENTO_ROOT/index.php
- MAGENTO_ROOT/es/index.php
- MAGENTO_ROOT/es/index.php
- MAGENTO_ROOT/algún código/index.php
Supongamos que se puede acceder a las tiendas a través de:
- http://MagentoExample.com/index.php (por defecto)
- http://MagentoExample.uk/ (Reino Unido)
- http://MagentoExample.us/ (a nosotros)
- http://MagentoExample.com (algún código)
Puedo ver fácilmente algunas soluciones, pero todas parecen ser más una solución alternativa que soluciones limpias y agradables.
¿Cómo se soluciona este problema?
Solución
De forma predeterminada, Magento no admite la traducción inmediata de páginas de error y requiere algunas personalizaciones para permitir dichas funciones.Así que técnicamente no hay adecuado manera de hacerlo.
Dado que 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.
Se pueden encontrar algunos detalles sobre cómo se generan las páginas de error en MageBase:
Una opción es simplemente copiar errors/
en cada uno de sus subdirectorios de sus idiomas uk
, us
, etc.y modificar las plantillas para reflejar los idiomas del punto de entrada del sitio web del usuario final.
Sólo ten en cuenta tu index.php
de cada vista para incluir los documentos de errores subrelativos:
if (file_exists($maintenanceFile)) {
include_once dirname(__FILE__) . '/errors/503.php';
exit;
}
También tenga en cuenta que existe una plantilla base para todos los errores, incluido el 404 en el page.html
Probablemente haya soluciones más elegantes, pero como ya estás duplicando index.php
para diferentes vistas, es posible que algunos archivos más no sean demasiado desordenados.También puede modificar las plantillas para incluir CSS e imágenes de nivel superior para ahorrar algo de redundancia.
También puede crear un archivo de idioma igual que lo hace en la localización estándar de Magento y leer los valores con el process.php
archivo, ya que allí se configuran el título y algunos otros datos que necesitarían localización.Un ejemplo sencillo del uso de Varien_File_Csv para leer un archivo .CSV de idioma:
$csvObject = new Varien_File_Csv();
$csvObject->getData($file);
Nota adicional:Dado que la pila en el momento actual de ejecución puede no permitir la Varien_File_Csv
inclusión de clases usando la función interna de PHP fgetcsv puede ser una mejor alternativa.
Y analice el archivo CSV de idioma necesario para completar los datos requeridos en el process.php
archivo.
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:
Otros consejos
Como se mencionó anteriormente, no hay una manera fácil de traducir la página de mantenimiento.Sin embargo, hay una solución para ello (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-Mantenimiento.html
Muestra la página de modo de mantenimiento después de que se haya cargado Magento Stack, lo que significa que necesita tener conexión de base de datos y pocas 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 completamente personalizable.
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 skin
Parámetro POST para cambiar el diseño.Parece ser la forma intencional, pero no está documentada (aún)...
Añade algunas reglas de reescritura a tu
.htaccess
que añade unskin
pará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]
Copiar
errors/default
aerrors/french
- Cambie/traduzca archivos de plantilla según sus necesidades
Quizás un poco tarde, pero un bien solución de trabajo, sin copiar error
directorio a cada subcarpeta...
"Desventajas":
- Tienes que editar tres archivos principales.Para evitar ediciones en el núcleo tanto como sea posible, simplemente cambié la ruta de inclusión de las páginas de error/informe y extendí
processor.php
leer una modificaciónlocal.xml
. - todavía requiere archivos de plantilla para cada idioma (no hay traducción en este momento). quizas mas tarde)
Configuración básica
Configuración de múltiples sitios web y múltiples tiendas así, la única diferencia es que lo he configurado MAGE_RUN_CODE
en .htaccess
en lugar de index.php
.Para el primer dominio no uso RUN_CODE
todos los demás parece...
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 vinculada, tuve que configurar RewriteBase
en .htaccess
para coincidir con el directorio local y editar index.php
en en
, fr
y 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.php
y report.php
Reemplazar
require_once 'processor.php';
$processor = new Error_Processor();
con
require_once 'processor_multiwebsite.php';
$processor = new Error_Processor_Multiwebsite();
Y agrega 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;
}
}
}
}
Nuevo local.xml
estructura
en lugar de establecer<skin>
en el primer nivel, busque primero el código de ejecución/localización de los sitios web
<?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 coincidentes <runcode>-<locale>
default-default
(Idioma predeterminado del primer dominio)default-en
default-fr
website1-default
(Idioma predeterminado del segundo dominio)- ...
Sin CSS/imágenes duplicadas
- coloque los archivos CSS/imágenes específicos de su sitio web en un directorio y agregue
<skin_base>
nodo alocal.xml
- cambia todo estático enlaces en
page.phtml
archivos de es decirhref="css/styles.css"
a<?php echo $this->getSkinBaseUrl('css/styles.css')?>