Pergunta

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

O que é apropriado forma de traduzir (localização) Página de manutenção em um ambiente multi-website e multi-domínio?

A configuraçã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:

Posso facilmente ver algumas soluções para isso, mas todas elas parecem ser mais uma solução alternativa do que soluções realmente agradáveis ​​e limpas.

Como você resolve esse problema?

Foi útil?

Solução

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

Como a pilha completa NÃO é inicializada durante a geração de erros, a funcionalidade normal de tradução $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 subdiretórios de seus idiomas uk, us, etc.e modificar os modelos para refletir os idiomas do ponto de entrada do site do usuário final.

Basta anotar o seu index.php de cada visualização para incluir os documentos de erros subrelativos:

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

Esteja ciente também de que existe um modelo base para todos os erros, incluindo 404 no page.html

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

Você também pode criar um arquivo de idioma da mesma forma que faz na localização padrão do Magento e ler os valores com o process.php arquivo, como 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 o Varien_File_Csv inclusão de classe usando a função interna do PHP fgetcsv pode ser uma alternativa melhor.

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

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

Referências:

Outras dicas

Como mencionado antes, não há maneira fácil de traduzir a página de manutenção.Há uma solução alternativa para ele, no entanto, (que tem o 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-manutenção.html

Exibe a página do modo de manutenção depois que a pilha Magento foi carregada, o que significa que você precisa ter conexão de banco de dados e algumas outras coisas.Por causa disso, também é mais lento e requer mais recursos.Mas se não for um problema para você, ele renderiza a página de manutenção totalmente personalizável.

Atualizar:

Encontrei outra maneira de traduzir a página de manutenção:

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 skin Parâmetro POST para alterar o layout.Parece ser a forma intencional, mas (ainda) não está documentada ...

  1. Adicione algumas regras de reescrita ao seu .htaccess que acrescenta um skin parâmetro para 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. cópia de errors/default para errors/french

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

Talvez um pouco tarde, mas um bom solução funcional, sem copiar error diretório para cada subpasta ...

"Desvantagens":

  • você tem que editar três arquivos principais.Para evitar ao máximo edições no núcleo, acabei de alterar o caminho de inclusão das páginas de erro/relatório e extensão processor.php ler um modificado local.xml.
  • ainda requer arquivos de modelo para cada idioma (sem tradução no momento - talvez mais tarde)

Configuração básica

Configuração de várias lojas e vários sites assim, a única diferença é que eu configurei MAGE_RUN_CODE em .htaccess em vez de index.php.Para o primeiro domínio eu uso não RUN_CODE todos os outros 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]

Além da resposta vinculada, tive que definir RewriteBase em .htaccess para corresponder ao diretório local e editar index.php em en, fr e mudar

$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.php e report.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;
            }
        }
    }
}

Novo local.xml estrutura

Em vez de definir<skin> no primeiro nível, procure primeiro os sites 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>

Modelos

Adicionar 503.phtml, ..., CSS para diretórios correspondentes <runcode>-<locale>

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

Sem CSS/imagens duplicadas

  • coloque os arquivos CSS/imagens específicos do seu site em um diretório e adicione <skin_base> nó para local.xml
  • mude tudo estático links em page.phtml arquivos de, ou seja, href="css/styles.css" para <?php echo $this->getSkinBaseUrl('css/styles.css')?>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a magento.stackexchange
scroll top