Terjemahkan mode Pemeliharaan per situs web dalam pengaturan multiwebsite-multidomain

12

Terjemahkan mode Pemeliharaan per situs web dalam pengaturan multi-situs web multi-domain

Apa cara yang tepat untuk menerjemahkan halaman Pemeliharaan (pelokalan) di lingkungan multi-situs web dan multi-domain?

Pengaturan dibuat menjadi:

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

Mari kita asumsikan bahwa toko dapat diakses melalui:

Saya dapat dengan mudah melihat beberapa solusi untuk itu tetapi semua dari mereka tampaknya lebih merupakan solusi daripada solusi yang bagus dan bersih.

Bagaimana Anda mengatasi masalah ini?

versedi
sumber

Jawaban:

10

Secara default Magento tidak mendukung terjemahan out-of-box untuk halaman kesalahan, dan memerlukan beberapa penyesuaian untuk memungkinkan fitur tersebut. Jadi secara teknis tidak ada cara yang tepat untuk melakukan itu.

Karena tumpukan penuh TIDAK diinisialisasi selama pembuatan kesalahan, fungsi terjemahan normal $this->__('foobar');tidak akan berfungsi dalam template.

Beberapa detail tentang bagaimana halaman kesalahan dihasilkan dapat ditemukan di MageBase:

Salah satu pilihan adalah dengan hanya menyalin errors/ke masing-masing sub direktori Anda bahasa Anda uk, us, dll dan memodifikasi template untuk mencerminkan bahasa entry point website pengguna akhir.

Perhatikan index.phpsaja setiap tampilan Anda untuk menyertakan sub kesalahan relatif dokumen:

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

Perlu diketahui juga ada template dasar untuk semua kesalahan, termasuk 404 di page.html

Mungkin ada solusi yang lebih elegan tetapi karena Anda sudah menduplikasi index.phpuntuk tampilan yang berbeda, beberapa file mungkin tidak terlalu berantakan. Anda juga dapat memodifikasi template untuk menyertakan CSS tingkat atas dan gambar untuk menghemat redundansi.

Anda juga dapat membuat file bahasa sama seperti yang Anda lakukan di lokalisasi standar Magento dan membaca nilai-nilai dengan process.phpfile, sebagai judul dan beberapa data lain yang akan membutuhkan lokalisasi sedang diatur di sana. Contoh sederhana menggunakan Varien_File_Csv untuk membaca file .CSV bahasa:

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

Catatan tambahan: Karena tumpukan pada titik waktu berjalan saat ini mungkin tidak memungkinkan untuk Varien_File_Csvinklusi kelas menggunakan fungsi PHP internal fgetcsv mungkin merupakan alternatif yang lebih baik.

Dan parsing file CSV bahasa yang diperlukan untuk mengisi data yang diperlukan dalam process.phpfile.

Alternatif lain adalah dengan menambahkan Google translate atau alat pihak ketiga tersebut untuk secara otomatis menerjemahkan halaman kesalahan ke bahasa pengguna akhir.

Referensi:

B00MER
sumber
2

Seperti disebutkan sebelumnya, tidak ada cara mudah untuk menerjemahkan halaman perawatan. Namun ada satu solusi untuk itu (yang memiliki sejumlah kelebihan / kekurangan) - gunakan beberapa ekstensi mode pemeliharaan, seperti ini:

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

Ini menampilkan halaman mode pemeliharaan SETELAH tumpukan Magento telah dimuat, yang berarti bahwa Anda perlu memiliki koneksi database dan beberapa hal lainnya. Karena itu juga lebih lambat dan membutuhkan lebih banyak sumber daya. Tetapi jika itu bukan masalah bagi Anda, itu membuat halaman pemeliharaan sepenuhnya dapat disesuaikan.

Segera
sumber
Apa yang akan menjadi output jika koneksi ke basis data akan terputus?
versedi
1
Saya katakan, ini solusi dan tidak cocok untuk setiap kasus. Jika basis data tidak ada, Magento akan menampilkan pesan kesalahan.
Pronto
2

Memperbarui:

Temukan cara lain untuk halaman pemeliharaan yang diterjemahkan:

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

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

Konstruktor halaman pemeliharaan menerima skinparameter POST untuk mengubah tata letak. Tampaknya menjadi cara yang disengaja, tetapi tidak didokumentasikan (belum) ...

  1. Tambahkan beberapa aturan penulisan ulang ke Anda .htaccessyang menambahkan skinparameter ke URL Anda. Misalnya.

    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. Salin errors/defaultkeerrors/french

  3. Ubah / terjemahkan file templat sesuai kebutuhan Anda

Mungkin sedikit terlambat, tapi baik solusi bekerja, tanpa menyalin errordirektori untuk setiap subfolder ...

"Kerugian":

  • Anda harus mengedit tiga file inti. Untuk menghindari suntingan dalam inti sebanyak mungkin saya baru saja mengubah termasuk jalur kesalahan / laporan halaman dan diperluas processor.phpuntuk membaca yang dimodifikasi local.xml.
  • masih memerlukan file templat untuk setiap bahasa (tidak ada terjemahan saat ini - mungkin nanti )

Pengaturan dasar

Multi-situs multi-store set-up seperti ini, hanya differnce adalah bahwa saya telah menetapkan MAGE_RUN_CODEdi .htaccessbukan index.php. Untuk domain 1 saya tidak menggunakan yang RUN_CODElainnya seperti ...

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

Selain jawaban terkait aku harus mengatur RewriteBasedalam .htaccessuntuk mencocokkan direktori lokal dan mengedit index.phpdi en, frdan perubahan

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

untuk

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

Edit errors/404.php, 503.phpdanreport.php

Menggantikan

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

dengan

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

Dan tambahkan ini ke 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.xmlStruktur baru

Alih-alih pengaturan <skin>di tingkat pertama mencari situs web runcode / lokal terlebih dahulu

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

Templat

Tambahkan 503.phtml, ..., CSS ke direktori yang cocok<runcode>-<locale>

  • default-default (Bahasa default domain 1)
  • default-en
  • default-fr
  • website1-default (Bahasa default domain 2)
  • ...

Tidak ada duplikat CSS / gambar

  • letakkan file CSS / gambar khusus situs web Anda ke dalam satu direktori dan tambahkan <skin_base>node kelocal.xml
  • ubah SEMUA tautan statis dalam page.phtmlfile dari mis. href="css/styles.css"ke<?php echo $this->getSkinBaseUrl('css/styles.css')?>
sv3n
sumber