Traduzir Modo de manutenção por site na configuração de vários sites e vários domínios

12

Traduzir Modo de manutenção por site na configuração de vários sites e vários domínios

Qual é a maneira correta de traduzir a página de Manutenção (localização) em um ambiente de vários sites e vários domínios?

A instalação é feita em:

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

Vamos supor que as lojas sejam acessíveis através de:

Eu posso ver facilmente algumas soluções para isso, mas todos parecem ser uma solução alternativa do que soluções limpas e agradáveis.

Como você resolve esse problema?

versedi
fonte

Respostas:

10

Por padrão, o Magento não suporta tradução pronta para páginas de erro e requer algumas personalizações para permitir esses recursos. Portanto, tecnicamente, não há maneira adequada de fazer isso.

Como a pilha completa NÃO é inicializada durante a geração de erros, a funcionalidade de tradução normal $this->__('foobar');não funcionará nos modelos.

Alguns detalhes sobre como as páginas de erro são geradas podem ser encontrados no MageBase:

Uma opção é simplesmente copiar errors/em cada um dos seus sub-diretórios de suas línguas uk, usetc. e modificar os modelos para refletir as línguas do ponto de entrada website do usuário final.

Observe index.phpcada uma das visualizações para incluir os documentos de erros relativos relativos:

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

Lembre-se também de que existe um modelo básico para todos os erros, incluindo 404 no page.html

Provavelmente, existem soluções mais elegantes, mas como você já está duplicando index.phppara visualizações diferentes, mais alguns arquivos podem não ser muito complicados. Você também pode modificar os modelos para incluir CSS e imagens de nível superior para economizar redundância.

Você também pode criar um arquivo de idioma da mesma forma que na localização padrão do Magento e ler os valores com o process.phparquivo, pois o título e alguns outros dados que precisariam de localização estão sendo definidos lá. Um exemplo simples de uso de Varien_File_Csv para ler um arquivo .CSV de idioma:

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

Nota adicional: Como a pilha no ponto atual do tempo de execução pode não permitir a Varien_File_Csvinclusão de classe usando a função PHP interna fgetcsv, pode ser uma alternativa melhor.

E analise o arquivo CSV do idioma necessário para preencher os dados necessários no process.phparquivo.

Outra alternativa seria simplesmente adicionar o Google translate ou essa ferramenta de terceiros para traduzir automaticamente as páginas de erro no idioma do usuário final.

Referências:

B00MER
fonte
2

Como mencionado anteriormente, não há uma maneira fácil de traduzir a página de manutenção. No entanto, existe uma solução alternativa (que possui seu próprio número de vantagens / desvantagens) - use algumas das extensões do modo de manutenção, como esta:

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

Ele exibe a página do modo de manutenção APÓS a pilha do Magento ter sido carregada, o que significa que você precisa ter conexão com o banco de dados e algumas outras coisas. Por isso, também é mais lento e requer mais recursos. Mas se isso não for um problema para você, a página de manutenção será totalmente personalizada.

Pronto
fonte
Qual será a saída se, por exemplo, a conexão com o banco de dados for interrompida?
versedi
1
Eu disse, é uma solução alternativa e não é adequada para todos os casos. Se o banco de dados não estiver lá, o Magento exibirá uma mensagem de erro.
Pronto
2

Atualizar:

Encontrou outra maneira de página de manutenção traduzida:

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

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

O construtor da página de manutenção aceita um skinparâmetro POST para alterar o layout. Parece ser o caminho intencional, mas ainda não está documentado ...

  1. Adicione algumas regras de reescrita ao seu .htaccessque adicionem um skinparâmetro ao seu URL. Por exemplo.

    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/defaultparaerrors/french

  3. Altere / traduza arquivos de modelo de acordo com suas necessidades

Talvez um pouco tarde, mas uma boa solução de trabalho, sem copiar o errordiretório para todas as subpastas ...

"Desvantagens":

  • você precisa editar três arquivos principais. Para evitar edições no núcleo, tanto quanto possível, acabei de alterar o caminho das páginas de erro / relatório e estendido processor.phppara ler uma modificação local.xml.
  • ainda requer arquivos de modelo para todos os idiomas (sem tradução no momento - talvez mais tarde )

Configuração básica

Configuração de várias lojas e vários sites como esse, a única diferença é que eu configurei MAGE_RUN_CODEem .htaccessvez de index.php. Para o 1º domínio, eu não uso RUN_CODEtodos os outros que parecem ...

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

Além da resposta vinculada eu tive que definir RewriteBaseem .htaccesscombinar diretório local e editar index.phpem en, fre mudança

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

para

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

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

Substituir

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

com

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

E adicione isso 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;
            }
        }
    }
}

Nova local.xmlestrutura

Em vez de definir <skin>no primeiro nível, procure primeiro o código de idioma / local dos sites

<?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>

Modelos

Adicione 503.phtml, ..., CSS aos diretórios correspondentes<runcode>-<locale>

  • default-default (Idioma padrão do 1º domínio)
  • default-en
  • default-fr
  • website1-default (Idioma padrão do segundo domínio)
  • ...

Sem CSS / imagens duplicadas

  • coloque os arquivos CSS / imagens específicos do seu site em um diretório e adicione um <skin_base>nó aolocal.xml
  • altere TODOS os links estáticos nos page.phtmlarquivos de ie href="css/styles.css"para<?php echo $this->getSkinBaseUrl('css/styles.css')?>
sv3n
fonte