ترجمة وضع الصيانة لكل موقع ويب في إعداد متعدد المواقع ومتعدد المجالات
-
13-12-2019 - |
سؤال
ترجمة وضع الصيانة لكل موقع ويب في إعداد مواقع ويب متعددة النطاق
ما هو سليم طريقة ترجمة (التعريب) صفحة الصيانة في بيئة متعددة المواقع ومتعددة المجالات؟
تم الإعداد إلى:
- MAGENTO_ROOT/index.php
- MAGENTO_ROOT/uk/index.php
- MAGENTO_ROOT/us/index.php
- MAGENTO_ROOT/somecode/index.php
لنفترض أنه يمكن الوصول إلى المتاجر من خلال:
- http://MagentoExample.com/index.php (تقصير)
- http://MagentoExample.uk/ (المملكة المتحدة)
- http://MagentoExample.us/ (نحن)
- http://MagentoExample.com (رمز ما)
يمكنني بسهولة رؤية بعض الحلول لذلك، ولكن يبدو أن جميعها بمثابة حل بديل أكثر من كونها حلولًا لطيفة ونظيفة.
كيف يمكنك حل هذه المشكلة؟
المحلول
بشكل افتراضي، لا يدعم Magento الترجمة الجاهزة لصفحات الأخطاء، ويتطلب بعض التخصيصات للسماح بمثل هذه الميزات.لذلك من الناحية الفنية لا يوجد سليم طريقة للقيام بذلك.
نظرًا لعدم تهيئة المكدس الكامل أثناء إنشاء الأخطاء، فإن وظيفة الترجمة عادية $this->__('foobar');
لن تعمل في القوالب
يمكن العثور على بعض التفاصيل حول كيفية إنشاء صفحات الخطأ على MageBase:
أحد الخيارات هو النسخ ببساطة errors/
في كل من الأدلة الفرعية للغاتك uk
, us
, ، إلخ.وتعديل القوالب لتعكس لغات نقطة دخول موقع الويب للمستخدم النهائي.
فقط لاحظ الخاص بك index.php
من كل عرض لتضمين مستندات الأخطاء النسبية الفرعية:
if (file_exists($maintenanceFile)) {
include_once dirname(__FILE__) . '/errors/503.php';
exit;
}
انتبه أيضًا إلى وجود قالب أساسي لجميع الأخطاء، بما في ذلك 404 في ملف 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 أو أداة خارجية لترجمة صفحات الخطأ تلقائيًا إلى لغة المستخدمين النهائيين.
مراجع:
نصائح أخرى
كما هو مذكور قبل عدم وجود طريقة سهلة لترجمة صفحة الصيانة.هناك حلوة واحدة لذلك (الذي يحتوي على عدد مميزات / عيوب) - استخدم بعض ملحقات وضع الصيانة، مثل هذا واحد:
http://www.magentocommerce.com/magento-connect/store-Maintenance.html
يعرض صفحة وضع الصيانة بعد تحميل مكدس Magento، مما يعني أنك بحاجة إلى اتصال قاعدة بيانات وعدد قليل من الأشياء الأخرى.بسبب ذلك، فإن الأمر أبطأ أيضا ويتطلب المزيد من الموارد.ولكن إذا لم تكن مشكلة بالنسبة لك، فإنها تجعل صفحة الصيانة قابلة للتخصيص بالكامل.
تحديث:
وجدت طريقة أخرى لصفحة الصيانة المترجمة:
https://github.com/OpenMage/magento-lts/blob/1.9.3.x/errors/processor.php#L160-L162
if (isset($_GET['skin'])) {
$this->_setSkin($_GET['skin']);
}
يقبل مُنشئ صفحة الصيانة أ skin
معلمة POST لتغيير التخطيط.يبدو أنها الطريقة مقصودة، لكنها لم يتم توثيقها (بعد)...
أضف بعض قواعد إعادة الكتابة إلى ملفك
.htaccess
الذي يلحق أskin
المعلمة إلى عنوان 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]
ينسخ
errors/default
لerrors/french
- تغيير/ترجمة ملفات القالب حسب احتياجاتك
ربما متأخرا بعض الشيء، ولكن أ جيد حل العمل، دون النسخ 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.php
في en
, fr
والتغيير
$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.php
, 503.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>
في المستوى الأول، ابحث عن مواقع الويب 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>
قوالب
يضيف 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')?>