TL; DR
ถ้าคุณไม่ได้สนใจในรายละเอียดวิธีการทำงานของการแปลข้ามเนื้อหาขึ้นอยู่กับ
สิ่งที่ต้องตรวจสอบว่าการแปลของคุณไม่ได้ทำงานด้านล่างโดยเฉพาะหมวดโซลูชั่นสำหรับโมดูลความขัดแย้งแปลขอบเขต
ภาพรวมการแปลวีโอไอพี
Magento จัดลำดับความสำคัญของแหล่งการแปล (จากสูงสุดไปต่ำสุด):
- DB (
core_translate
ตาราง)
translate.csv
ไฟล์ธีม
- ส่วน
app/locale/*/*.csv
ไฟล์
อาร์เรย์การแปลถูกสร้างขึ้นอย่างไร
การแปลโมดูล
ก่อนอื่นไฟล์ทั้งหมดapp/locale/*/*.csv
ที่อ้างถึงจากetc/config.xml
ไฟล์โมดูลที่ใช้งานจะถูกแยกวิเคราะห์ นี่คือคำแนะนำของกระบวนการ:
สมมติว่า Magento ค้นหาconfig.xml
ส่วนต่อไปนี้:
<!-- excerpt from Mage/Catalog/etc/config.xml -->
<frontend>
<translate>
<modules>
<Mage_Catalog>
<files>
<default>Mage_Catalog.csv</default>
</files>
</Mage_Catalog>
</modules>
</translate>
</frontend>
และในไฟล์นั้นจะมีการระบุการแปลต่อไปนี้สำหรับโลแคลที่กำหนดค่าสำหรับมุมมองร้านค้าปัจจุบัน:
"AAA","BBB"
ภายใต้สถานการณ์เหล่านี้วีโอไอพีสร้างระเบียนต่อไปนี้ในอาร์เรย์การแปล:
array(
"AAA" => "BBB",
"Mage_Catalog::AAA" => "BBB"
)
ค่าที่สองคือโมดูลแปลขอบเขต ชื่อโมดูลที่นำหน้ามาจากโหนด XML config ที่มีการประกาศไฟล์แปล
ถ้าแปลเดียวกันจะระบุอีกครั้งโดยไฟล์โมดูลที่สองเช่นในSome_Module.csv
การแปลเป็น"AAA","CCC"
ก็จะไม่เขียนทับ"AAA"
การตั้งค่า แต่จะเพิ่มระเบียนใหม่ด้วยชื่อโมดูลที่สอง"Some_Module::AAA" => "CCC"
เท่านั้น
หากเปิดใช้งานโหมดผู้พัฒนาระบบจะยกเลิกการตั้งค่า"AAA"
ระเบียนหากพบระเบียนที่สองที่มีคีย์เดียวกันในการแปลโมดูลอื่น สิ่งนี้ทำให้ง่ายต่อการตรวจพบข้อขัดแย้งของการแปลโมดูลระหว่างการพัฒนา
การแปลธีม
ประการที่สองการแปลโหลดจากtranslate.csv
ไฟล์แรกในธีมทางเลือกสำหรับสถานที่ปัจจุบันเพียงแทนที่ระเบียนที่มีอยู่ในอาร์เรย์การแปล
ดังนั้นการดำเนินการต่อจากตัวอย่างก่อนหน้านี้translate.csv
ระเบียน"AAA","DDD"
จะนำไปสู่ข้อมูลการแปลต่อไปนี้:
array(
"AAA" => "DDD", // This is overwritten by the translate.csv file
"Mage_Catalog::AAA" => "BBB",
"Some_Module::AAA" => "CCC"
)
บันทึกของหลักสูตรในtranslate.csv
กับคีย์การแปลใหม่จะถูกเพิ่มไปยังอาร์เรย์
การแปลฐานข้อมูล
การแปลจากcore_translate
ตารางจะถูกรวมเข้ากับอาร์เรย์การแปลเหมือนกับการแปลธีม
คีย์ที่มีอยู่จากการแปลโมดูลหรือชุดรูปแบบจะถูกเขียนทับโดยบันทึกฐานข้อมูลที่เพิ่มเข้ามาใหม่
ค้นหาคำแปล
เมื่อมี__()
การเรียกใช้เมธอดวีโอไอพีจะค้นหาคำแปลในอาร์เรย์ที่ตรงกับโมดูลปัจจุบันก่อน
โมดูลปัจจุบันถูกกำหนดโดยชื่อคลาสที่__()
คลาสนั้นถูกเรียก ตัวอย่างเช่นในบล็อกเมธอดที่รับผิดชอบมีลักษณะดังนี้:
// Excerpt from Mage/Core/Block/Abstract.php
public function getModuleName()
{
$module = $this->getData('module_name');
if (is_null($module)) {
$class = get_class($this);
$module = substr($class, 0, strpos($class, '_Block'));
$this->setData('module_name', $module);
}
return $module;
}
วิธีการใน Helpers and Controllers ทำงานอย่างสอดคล้องกัน
ตัวอย่างสถานการณ์การค้นหา
ยกตัวอย่างเช่นสมมติ$this->__('AAA')
ว่าเรียกว่าในไฟล์แม่แบบ หากบล็อกที่เกี่ยวข้องมีประเภทMage_Core_Block_Template
วีโอไอพีจะตรวจสอบMage_Core::AAA
บันทึกก่อน AAA
ถ้ามันไม่ได้พบว่ามันก็จะถอยกลับไปแปลสำหรับคีย์
ในสถานการณ์ตัวอย่างสิ่งนี้จะส่งผลให้เกิดการแปลDDD
(จากtranslate.csv
ไฟล์)
Mage_Catalog_Block_Product_View
ในสถานการณ์ที่แตกต่างกันบล็อกที่เกี่ยวข้องที่อาจจะ ในกรณีนี้วีโอไอพีครั้งแรกจะตรวจสอบบันทึกการแปลและจะพบการแปลMage_Catalog::AAA
AAA
ดังนั้นการแปลขอบเขตโมดูลจะมีลำดับความสำคัญสูงกว่าดังนั้นการแปลทั่วไปใด ๆ การแปลใดที่ใช้จะขึ้นอยู่กับโมดูลที่คลาสนั้นเรียกจาก__()
เมธอด
สิ่งที่ต้องตรวจสอบว่าการแปลของคุณไม่ทำงาน
หากtranslate.csv
ไม่ได้ใช้การแปลของคุณจากไฟล์ให้ทำตามรายการตรวจสอบนี้:
- แคชการแปลถูกปิด / รีเฟรชหรือไม่ (โซลูชัน: ล้างแคช)
- เป็น
translate.csv
ไฟล์จริงๆในทางเลือกรูปแบบสำหรับการจัดเก็บปัจจุบันหรือไม่? (โซลูชัน: แก้ไขการกำหนดค่าชุดรูปแบบ)
- มีบันทึกที่ขัดแย้งกันสำหรับการแปลใน
core_translate
ตารางหรือไม่ (โซลูชัน: ลบบันทึกที่ขัดแย้งกันออกจากcore_translate
)
- หากประเด็นทั้งหมดก่อนหน้านี้ไม่ใช่สาเหตุต้องมีการแปลที่ขัดแย้งกันจากโมดูลอื่น (วิธีแก้ไข: ดูด้านล่าง)
โซลูชันสำหรับขอบเขตการแปลโมดูลขัดแย้งกัน
หากคุณพบว่ากรณีสุดท้ายเป็นความจริงเพียงแค่เพิ่มการแปลเป็นครั้งที่สองที่คุณtranslate.csv
มีขอบเขตโมดูลของโมดูลทำการแปล
ในตัวอย่างหากคุณต้องการAAA
ได้รับการแปลDDD
ผ่านการแปลธีมคุณสามารถทำได้ในtranslate.csv
:
"AAA","DDD"
"Mage_Catalog::AAA","DDD"
"Some_Module::AAA","DDD"
ในทางปฏิบัติฉันจะเพิ่มขอบเขตโมดูลให้กับการแปลหากมีข้อขัดแย้งนั่นคือหากการแปลไม่ทำงาน
หมายเหตุเพิ่มเติม
การแปลแบบอินไลน์
คุณสมบัติการแปลแบบอินไลน์ของ Magento ยังเพิ่มการแปลที่กำหนดเองลงในcore_translate
ตารางโดยใช้คำนำหน้าขอบเขตโมดูล
ความเข้ากันได้ย้อนหลัง
ลำดับความสำคัญของการแปลชุดรูปแบบเคยสูงกว่าจากนั้นแปลฐานข้อมูลสูงถึง Magento เวอร์ชัน 1.3 หรือมากกว่านั้น
การแปล XML
วีโอไอพีบางครั้งการประเมินtranslate=""
ข้อโต้แย้งในconfig.xml
, system.xml
และรูปแบบ XML เพื่อแปลค่าโหนดเด็ก
คลาสผู้ช่วยสามารถระบุได้ในกรณีเหล่านั้นโดยใช้module=""
อาร์กิวเมนต์เพื่อระบุโมดูลสำหรับขอบเขตการแปล
หากไม่มีการmodule
ระบุอาร์กิวเมนต์ใน XML ตัวcore/data
ช่วยจะถูกใช้เพื่อแปลค่าโหนดลูก
ข้อมูลเพิ่มเติม
ฉันสารภาพว่าฉันคัดค้านรายละเอียดบางส่วนของกระบวนการแปล Magento ในโพสต์นี้ แต่เพียงเพราะฉันไม่ต้องการข้อมูลมากเกินไป
- รายละเอียดทางเทคนิคบางอย่างในขณะที่อาร์เรย์การแปลถูกสร้างขึ้น
- ความเป็นไปได้ที่จะใช้ไฟล์แปลเพิ่มเติมสำหรับโมดูล
- จัดเก็บขอบเขตการดูสำหรับ
core_translate
บันทึก
- ข้อดีและข้อเสียโดยใช้วิธีการแปลที่แตกต่างกัน
โปรดถามคำถามแยกต่างหากหากต้องการข้อมูลเพิ่มเติม