Przetłumacz Tryb konserwacji na stronę internetową w konfiguracji z wieloma witrynami i wieloma domenami


12

Przetłumacz Tryb konserwacji na witrynę w konfiguracji wielu witryn i wielu domen

Jaki jest właściwy sposób tłumaczenia strony konserwacji (lokalizacja) w środowisku wielu witryn i wielu domen?

Konfiguracja składa się z:

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

Załóżmy, że sklepy są dostępne poprzez:

Z łatwością widzę kilka rozwiązań, ale wydaje się, że to bardziej obejście niż rzeczywiste ładne, czyste rozwiązania.

Jak rozwiązać ten problem?


Odpowiedzi:


10

Domyślnie Magento nie obsługuje tłumaczenia gotowych stron błędów i wymaga pewnych dostosowań, aby umożliwić takie funkcje. Więc technicznie nie ma właściwego sposobu, aby to zrobić.

Ponieważ pełny stos NIE jest inicjowany podczas generowania błędów, normalna funkcja tłumaczenia $this->__('foobar');nie będzie działać w szablonach.

Niektóre szczegóły dotyczące sposobu generowania stron błędów można znaleźć w MageBase:

Jedną z opcji jest po prostu skopiować errors/do każdego z katalogów podrzędnych swoich języków uk, usitp i modyfikowania szablonów w celu odzwierciedlenia języków punktu wejścia internetowej użytkownika końcowego.

Po prostu zanotuj swój index.phpkażdy widok, aby dołączyć podrzędne błędy względne:

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

Należy również pamiętać, że istnieje podstawowy szablon dla wszystkich błędów, w tym 404 w page.html

Prawdopodobnie istnieją bardziej eleganckie rozwiązania, ale ponieważ już kopiujesz index.phpróżne widoki, kilka innych plików może nie być zbyt zagraconych. Możesz także zmodyfikować szablony, aby uwzględnić CSS najwyższego poziomu i obrazy, aby zaoszczędzić trochę nadmiarowości.

Możesz także utworzyć plik językowy tak samo jak w standardowej lokalizacji Magento i odczytać wartości w process.phppliku, ponieważ ustawia się w nim tytuł i inne dane, które wymagałyby lokalizacji. Prosty przykład użycia Varien_File_Csv do odczytu pliku .CSV języka:

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

Dodatkowa uwaga: Ponieważ stos w bieżącym momencie wykonywania może nie pozwolić na Varien_File_Csvwłączenie klasy za pomocą wewnętrznej funkcji PHP, fgetcsv może być lepszą alternatywą.

I przeanalizuj plik CSV języka wymagany do wypełnienia wymaganych danych w process.phppliku.

Inną alternatywą byłoby po prostu dodanie tłumaczenia Google lub takiego narzędzia innej firmy, aby automatycznie tłumaczyć strony błędów na język użytkowników końcowych.

Bibliografia:


2

Jak wspomniano wcześniej, nie ma łatwego sposobu na przetłumaczenie strony konserwacji. Jest jednak jedno obejście tego problemu (które ma swoje zalety i wady) - skorzystaj z niektórych rozszerzeń trybu konserwacji, takich jak ten:

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

Wyświetla stronę trybu konserwacji PO załadowaniu stosu Magento, co oznacza, że ​​musisz mieć połączenie z bazą danych i kilka innych rzeczy. Z tego powodu jest również wolniejszy i wymaga więcej zasobów. Ale jeśli nie stanowi to dla Ciebie problemu, strona konfiguracyjna jest w pełni konfigurowalna.


Jaki będzie wynik, jeśli np. Połączenie z bazą danych zostanie przerwane?
versedi

1
Powiedziałem, że jest to obejście i nie jest odpowiednie dla każdego przypadku. Jeśli bazy danych nie ma, Magento wyświetli komunikat o błędzie.
Pronto,

2

Aktualizacja:

Znalazłem inny sposób na przetłumaczoną stronę konserwacji:

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 strony konserwacji przyjmuje skinparametr POST w celu zmiany układu. Wydaje się to być celowe, ale nie zostało (jeszcze) udokumentowane ...

  1. Dodaj do przepisu kilka reguł, .htaccessktóre dołączą skinparametr do adresu URL. Na przykład.

    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. Skopiuj errors/defaultdoerrors/french

  3. Zmień / przetłumacz pliki szablonów na swoje potrzeby

Może trochę spóźniony, ale dobre rozwiązanie, bez kopiowania errorkatalogu do każdego podfolderu ...

„Wady”:

  • musisz edytować trzy podstawowe pliki. Aby jak najbardziej uniknąć edycji w rdzeniu, właśnie zmieniłem ścieżkę stron błędów / raportów i rozszerzyłem, processor.phpaby przeczytać zmodyfikowane local.xml.
  • wciąż wymaga plików szablonów dla każdego języka (obecnie brak tłumaczenia - może później )

Podstawowe ustawienia

Multi-multi-sklep www set-up w ten sposób, tylko differnce jest, że mam ustawiony MAGE_RUN_CODEw .htaccesszamiast index.php. Dla 1. domeny nie używam RUN_CODEwszystkich innych, wygląda na to ...

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

Oprócz połączonej odpowiedzi musiałem ustawić RewriteBasew .htaccesscelu dopasowania lokalizacji katalogu i edytować index.phpw en, fri zmiany

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

do

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

Edycja errors/404.php, 503.phpareport.php

Zastąpić

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

z

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

I dodaj to do 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;
            }
        }
    }
}

Nowa local.xmlstruktura

Zamiast ustawiać <skin>na pierwszym poziomie, najpierw wyszukaj strony 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>

Szablony

Dodaj 503.phtml, ..., CSS do dopasowania katalogów<runcode>-<locale>

  • default-default (Domyślny język 1. domeny)
  • default-en
  • default-fr
  • website1-default (Domyślny język drugiej domeny)
  • ...

Brak duplikatów CSS / obrazów

  • umieść pliki CSS / images swojej witryny w jednym katalogu i dodaj <skin_base>węzeł dolocal.xml
  • zmień WSZYSTKIE statyczne łącza w page.phtmlplikach z np. href="css/styles.css"na<?php echo $this->getSkinBaseUrl('css/styles.css')?>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.