Drupal สนับสนุนแนวคิดของภาษาอินเทอร์เฟซและภาษาเนื้อหา ฉัน (และลูกค้าทุกคนที่ฉันเคยถาม) ดูเหมือนจะมีความคิดเห็นที่แตกต่างกันว่าอะไรคือ "เนื้อหา" และอะไรคือ "ส่วนต่อประสาน" มากกว่าที่ Drupal มี (ในกรณีส่วนใหญ่) ฉันถือว่าอินเทอร์เฟซเป็นรายการที่ผู้ดูแลระบบหรือผู้แก้ไขจะใช้ในการทำงาน (เมนูผู้ดูแลระบบ แท็บแก้ไข รายละเอียดวิธีใช้ในแบบฟอร์ม ฯลฯ) และเนื้อหาคือสิ่งที่ผู้ที่ไม่ใช่ผู้ดูแลระบบ (มักจะเป็น Anon แต่ไม่เสมอไป) จะเห็น
มุมมองที่ฉันสร้างขึ้นเพื่อนำเสนอ "เนื้อหา" บนเว็บไซต์ ฉันคิดว่าเป็นเนื้อหาโดยธรรมชาติ แต่ Drupal มีแนวคิดที่ไม่สอดคล้องกันและมักจะไม่ถูกต้องเกี่ยวกับสิ่งนี้
เริ่มต้นด้วย ฉันได้ตั้งค่าไซต์เพื่อให้ภาษาอินเทอร์เฟซถูกกำหนดโดยภาษาที่ผู้ใช้ต้องการ (ตามที่ผู้ดูแลไซต์/บรรณาธิการจะตั้งค่า) และภาษาเนื้อหาถูกกำหนดโดยคำนำหน้ารหัสภาษาของ URL
มุมมองการทดสอบตัวอย่างมีลักษณะเช่นนี้ใน FR (url คือ /fr/test) - ภาษาอินเทอร์เฟซถูกตั้งค่าเป็น EN:
สิ่งนี้ไม่ถูกต้องอย่างชัดเจนที่สามารถเห็นได้จากการแสดงผลที่เหมาะสม เมื่อฉันตั้งค่าภาษาอินเทอร์เฟซเป็น FR:
Views มีตัวเลือกมากมายในการตั้งค่าวิธีกำหนดภาษาที่แสดง "เนื้อหา" สำหรับตัวอย่างของฉันด้านบน มีการตั้งค่าให้แสดงผลตาม "ภาษาของเนื้อหา" ของหน้า (และตามด้วย URL) วิธีนี้ใช้ได้กับข้อมูลภาคสนามส่วนใหญ่ (ชื่อเรื่อง เงื่อนไขอนุกรมวิธาน ฟิลด์ข้อความที่แปล) แต่น่าเศร้าที่ใช้ไม่ได้กับฟิลด์ Datetime - ดูเหมือนว่าจะถูกเข้ารหัสอย่างหนักเพื่อแปลอย่างไม่ถูกต้องโดยใช้ส่วนต่อประสาน แต่คุณยังสามารถดูส่วนการกำหนดค่าของมุมมอง (ชื่อมุมมอง ป้ายชื่อฟิลด์ ฯลฯ) ได้เช่นกัน ซึ่งแปลว่าส่วนต่อประสาน
มีวิธีใดบ้างที่จะบอกมุมมองให้แปลโดยใช้ภาษาของเนื้อหา
ฉันใช้รหัสต่อไปนี้:
$languageManager = \Drupal::languageManager();
$langcode = $languageManager->getCurrentLanguage(LanguageInterface::TYPE_CONTENT)->getId();
$language = $languageManager->getLanguage($langcode);
$languageManager->setConfigOverrideLanguage($ภาษา);
ภายในฟังก์ชันประมวลผลล่วงหน้าของบล็อกเพื่อให้ชิ้นส่วนบล็อกบางส่วนที่ใช้ภาษาอินเทอร์เฟซไม่ถูกต้องแปลด้วยภาษาของเนื้อหา มีวิธีที่คล้ายกันในการแทนที่ภาษาอินเทอร์เฟซที่มุมมองใช้สำหรับการแปลหรือไม่ ฉันหวังว่ามันจะเป็นเหมือนโค้ดด้านบน แต่ฉันไม่ได้ใส่ในตำแหน่งที่ถูกต้อง (ฉันลองใช้ hooks for pre-build, pre-render, query_alter ไม่สำเร็จ)
หากสามารถทำได้ ฉันชอบที่จะเขียนโมดูลสนับสนุนเพื่อใช้ UI ที่มีอยู่ใน View เพื่อตั้งค่าภาษาเรนเดอร์และให้มันเรนเดอร์ทุกอย่างแทนที่จะเป็นแค่บางฟิลด์