在多网站多域设置中按网站转换维护模式


12

在多网站-多域设置中按网站翻译维护模式

在多网站和多域环境中翻译(本地化)维护页面的正确方法是什么?

设置成:

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

假设通过以下方式可使用商店:

我可以很容易地看到一些解决方案,但是与实际的,干净的解决方案相比,所有这些解决方案似乎都是一种解决方法。

您如何解决这个问题?


Answers:


10

默认情况下,Magento不支持错误页面的开箱即用翻译,并且需要进行一些自定义以允许此类功能。因此,从技术上讲,没有合适的方法可以做到这一点。

由于在错误生成期间未初始化完整堆栈,因此正常的翻译功能$this->__('foobar');将无法在模板中使用。

有关如何生成错误页面的一些详细信息,可以在MageBase上找到:

一种选择是简单地复制errors/到每个语言的子目录中ukus等和修改模板,以反映最终用户的网站入口点的语言。

只需注意您index.php的每个视图即可包括子相对错误文档:

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

另外请注意,所有错误都有一个基本模板,包括 page.html

可能有更优雅的解决方案,但是由于您已经在复制index.php不同的视图,因此再添加几个文件可能不会太混乱。您也可以修改模板以包括顶级CSS和图像,以节省一些冗余。

您还可以像在Magento的标准本地化中一样创建一个语言文件,并读取process.php文件中的值,因为在那里设置了标题和一些需要本地化的其他数据。使用Varien_File_Csv读取语言.CSV文件的简单示例:

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

附加说明:由于当前运行时的堆栈可能不允许Varien_File_Csv使用内部PHP函数fgetcsv包含类,因此是更好的选择。

并解析在文件中填充所需数据所需的语言CSV process.php文件。

另一种选择是仅添加Google翻译或此类第三方工具即可将错误页面自动翻译为最终用户的语言。

参考文献:


2

如前所述,没有简单的方法可以翻译维护页面。但是,有一个解决方法(它有很多优点/缺点)-使用一些维护模式扩展,例如:

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

加载Magento堆栈后,它将显示维护模式页面,这意味着您需要建立数据库连接以及其他一些事情。因此,它也比较慢,并且需要更多资源。但是,如果这不是您的问题,它将使维护页面完全可定制。


如果与数据库的连接中断,将输出什么?
versedi

1
我说过,这是解决方法,并不适合所有情况。如果数据库不存在,Magento将显示错误消息。
2015年

2

更新:

找到了翻译维护页面的另一种方法:

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

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

维护页面的构造函数接受skinPOST参数来更改布局。这似乎是故意的方式,但尚未记录(至今)...

  1. 向您添加一些重写规则,以 .htaccessskin参数附加到URL。例如。

    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. 复制errors/defaulterrors/french

  3. 根据您的需要更改/翻译模板文件

也许有点晚,但是是一个很好的解决方案,无需将error目录复制到每个子文件夹中。

“缺点”:

  • 您必须编辑三个核心文件。为了尽可能避免在核心中进行编辑,我只是​​更改了错误/报告页面的路径,并扩展processor.php为读取修改的local.xml
  • 它仍然需要每种语言的模板文件(目前暂不翻译- 可能稍后再翻译)

基本设定

像这样的多网站多商店设置,唯一的区别是我设置MAGE_RUN_CODE.htaccess而不是index.php。对于第一个域,我不使用RUN_CODE看起来像是的所有其他域...

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

除了联答案,我必须设置RewriteBase.htaccess相匹配的区域设置目录和编辑index.phpenfr而变化

$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;
}

编辑errors/404.php503.php然后report.php

更换

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

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

并将其添加到 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;
            }
        }
    }
}

local.xml结构

与其<skin>在第一级进行设置,不如先查找网站运行代码/语言环境

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

范本

添加503.phtml,...,CSS到目录匹配<runcode>-<locale>

  • default-default (第一域默认语言)
  • default-en
  • default-fr
  • website1-default (第二域默认语言)
  • ...

没有重复的CSS /图像

  • 将您网站的特定CSS /图像文件放在一个目录中,然后将<skin_base>节点添加到local.xml
  • 将文件中的所有静态链接page.phtml从即href="css/styles.css"更改为<?php echo $this->getSkinBaseUrl('css/styles.css')?>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.