ความต้องการของคุณ:
เพื่อให้เว็บไซต์ของฉันทำงานในหลายภาษา
ในฐานะผู้ใช้ที่ได้รับการรับรองความถูกต้อง
ฉันจะต้องสามารถแปลได้ทันทีและการแปลทั้งหมดที่พบในรหัสฐานของเว็บไซต์ของฉันที่ทำด้วยฟังก์ชัน t ()
คำอธิบายความต้องการนั้นอยู่ใกล้กับสิ่งที่คุณต้องการหรือไม่
โปรแกรมรวบรวมข้อมูล
เหมือนใครบางคนกล่าวว่า - ซอฟต์แวร์รวบรวมข้อมูลสามารถในทางทฤษฎีไปผ่านเว็บไซต์ทั้งหมดที่จะบังคับให้ลงทะเบียนของเสื้อทุกสาย () แต่ 1) โปรแกรมรวบรวมข้อมูลไม่ทราบว่าจะรวบรวมข้อมูลหน้าใด 2) เราไม่ต้องการรักษารายการหน้าเว็บที่จะรวบรวมข้อมูลดังนั้น 3) เราไม่ต้องการใช้โปรแกรมรวบรวมข้อมูลประจำเดือน eww แค่ eww ขวา?
ปัญหา
- เราไม่มีรายการสตริงการแปลทั้งหมด
- Drupal / PHP เป็นภาษาแบบไดนามิกซึ่งแตกต่างจาก C ซึ่งรวบรวม ดังนั้นเราจึงไม่สามารถไปและพูดเช่น: รวบรวม codebase ทั้งหมดนี้จากนั้นหาอินสแตนซ์ทั้งหมดของฟังก์ชันนี้
t()
จากนั้นลงทะเบียนอินสแตนซ์เหล่านั้นในฐานข้อมูลแล้วแปลอินสแตนซ์ที่ลงทะเบียนทั้งหมดt()
ในครั้งเดียว ฉันไม่คิดว่าเป็นตัวเลือกที่เรามีบนโต๊ะของเรา
- เครื่องมือวิเคราะห์รหัสแบบคงที่จะทำอะไรไม่ถูกด้วยเหตุผลเดียวกับที่โปรแกรมรวบรวมข้อมูลจะทำอะไรไม่ถูก ฉันพบสิ่งนี้
t()
ในไฟล์นี้ ที่ดี! มันใช้ URL อะไร บริบทคืออะไร
โจมตีปัญหาด้วยเครื่องมือปัจจุบัน (Drupal และโมดูล contrib บางส่วน) และด้วยข้อ จำกัด ในปัจจุบัน (อาศัยการโทรตามธีมแบบเรียลไทม์ -> ไฟล์เทมเพลต -> การt()
โทร) ดูเหมือนกับตรอกซอกซอยที่นี่ เราอาจต้องคิดนอกกรอบสักหน่อย
สิ่งที่เราต้องการ
- เราต้องการแหล่งข้อมูลแบบจำลองที่บอกฉันว่าเรามีสตริงการแปลปัจจุบันและบริบทของพวกเขาคืออะไร -
- แบบจำลองข้อมูลเชิงรุก รูปแบบข้อมูลปัจจุบันเป็นปฏิกิริยา (รุ่นได้รับการปรับปรุงทุกครั้งที่
t()
เกิดการโทร) เราต้องการโมเดลข้อมูลเชิงรุกซึ่งเป็นหนึ่งในแอปพลิเคชันที่ดูแลการค้นหาt()
อินสแตนซ์ก่อนที่ลูกค้าจะถูกดำเนินการจริง
- เราต้องการบริบท
t()
เพียงอย่างเดียวไม่ได้ตัด - เพราะ - เราไม่รู้ว่าเรากำลังแปล 'foo' แต่ภาษาเป้าหมายที่เราแปลนั้นขึ้นอยู่กับ URL ของที่ที่t()
เกิดขึ้น แม้ว่าเราสามารถ hardcode ภาษาเป้าหมายในการt()
โทรพูดโดยใช้การเรียก wrapper มันจะไม่ทำงานสำหรับวัตถุประสงค์ของคุณ
ฉันได้ระบุเครื่องมือบางอย่างที่ - ถ้าเรามี - จะช่วยปัญหาของเรา ด้วยเครื่องมือเหล่านี้เราสามารถเข้าไปในตัวแบบข้อมูลและพูดว่า: ให้สตริงทั้งหมดที่อยู่ในt()
นั้นซึ่งยังไม่ได้บรรจุ ตอนนี้แทรกคำแปลเหล่านี้ ขอขอบคุณ.
และในครั้งต่อไปที่ลูกค้ามาจะมีการแปลภาษา
เราจะ ... สร้างเครื่องมือเหล่านี้ได้อย่างไร
ข้อ จำกัด
- ภาษาเป้าหมายไม่สามารถอยู่ในเทมเพลตที่ตัดสินใจโดย URL สมมติว่าสตริงต้องสนับสนุนภาษาใด ๆ
- สตริงที่แปลไม่สามารถอยู่บนเทมเพลต การแปลจะอยู่ในฐานข้อมูล
ตอนนี้ที่ฉันได้รับปัญหามากขึ้นคิดและระบุความท้าทายและข้อ จำกัด บางอย่างฉันสามารถคิดเกี่ยวกับการมองหาวิธีการแก้ปัญหาใด ๆ ที่มีอยู่หรือที่จะทำให้การแก้ปัญหาที่กำหนดเองใด ๆ
ระดมสมองแก้ปัญหา
ฉันต้องการบางสิ่งที่เชื่อมโยง "ทุกสิ่ง" เข้าด้วยกัน สิ่งที่เกี่ยวกับ ... นิติบุคคล?
- เอนทิตีสามารถเก็บผลิตภัณฑ์ที่ต้องการแปล
- เอนทิตีสามารถให้ความสัมพันธ์ - กาว - ระหว่างผลิตภัณฑ์ที่ต้องการแปลและบริบท
- เอนทิตีสามารถระบุพูดในฟิลด์ที่ตั้ง URL เริ่มต้นของผลิตภัณฑ์
- สามารถใช้โทเค็นเพื่อระบุตำแหน่งทางเลือก (ภาษา?) ที่ผลิตภัณฑ์จะปรากฏ
- หน่วยงานให้ข้อมูลโมเดลเชิงรุกที่เราต้องการและเป็นบริบท ซึ่งในทางกลับกันทำให้เราสามารถทำสิ่งต่าง ๆ เช่น: เข้าไปในฐานข้อมูลคว้าหน่วยงานผลิตภัณฑ์ทั้งหมดและถ้าไม่มีสตริงการแปลสำหรับเขตข้อมูล X, Y และ Z ให้สร้างสตริงการแปลเหล่านั้น
เมื่อลูกค้าคว้า/pl/product/200
คุณเดินทางไปที่ฐานข้อมูลค้นหาผลิตภัณฑ์ 200 และรับการpl
แปลที่มีอยู่แล้ว คุณมีฟิลด์ชื่อเรื่องและคำบรรยายสำหรับผลิตภัณฑ์นั้นด้วยหรือไม่ การแปลควรจะมี
โปรดทราบว่าฉันเป็นคนคลุมเครือและเป็นคนทั่วไปที่นี่ในแง่ของโมดูลการแปลที่คุณใช้ คุณสามารถจบลงด้วยการใช้โมดูลการแปลของคุณเอง - เป็นไปได้มากว่าในกรณีนี้ แบบจำลองการแปลทั้งหมดที่ฉันเคยเห็นใน Drupal จนถึงตอนนี้ (ตั้งแต่ D7 ยังไม่ได้ดู D8 เลย) นั้นมีปฏิกิริยาตอบโต้ไม่ใช่เชิงรุก
โดยสังเขป
ในทางทฤษฎีเครื่องมือในการสร้างสิ่งที่คุณต้องการมีหน่วยงานที่เป็นองค์ประกอบสำคัญที่จะรวมทุกอย่างเข้าด้วยกัน: - ข้อมูล (สตริงการแปล) - ภาษาเป้าหมาย ไม่จำเป็นต้องอยู่ในเอนทิตี้ของตัวเองโดยเฉพาะอย่างยิ่งคำศัพท์อนุกรมวิธานพูดสำหรับภาษาผลิตภัณฑ์ หรืออาจเป็นอนุกรมวิธานทั่วไปสำหรับหน่วยงานอื่นเช่นกัน - บริบท. URL ที่เอนทิตีปรากฏขึ้น URL จะมีโทเค็นและโทเค็นจะอ้างอิงอนุกรมวิธานภาษาเป้าหมาย
ด้วยส่วนผสมทั้งสามที่คุณสามารถพูดได้: หยิบproduct
เอนทิตีทั้งหมดไปที่ URL alias
ฟิลด์รับโทเค็นอนุกรมวิธานวัฏจักรผ่านชุดค่าผสมที่เป็นไปได้ทั้งหมดนำเสนอชุดค่าผสมทั้งหมดให้กับผู้ใช้ปัจจุบันโดยใช้รูปแบบน่าเกลียดขนาดใหญ่มากหรือ AJAX แบบฟอร์มหลายขั้นตอน (เช่นนี้) และเมื่อผู้ใช้ที่เข้าสู่ระบบในปัจจุบันแปลภาษาต่าง ๆ สำหรับผลิตภัณฑ์ 200 ให้บันทึกสิ่งเหล่านั้นลงในฐานข้อมูล
บางที่ในฐานข้อมูลอาจเป็นฟิลด์ Field API ในเอนทิตีฟิลด์การตั้งค่าที่เป็นของแต่ละเอนทิตี (ไม่ใช่ Field API อย่างแน่นอน แต่ก็ยังสามารถเก็บข้อมูล) หรือตารางแยกต่างหากที่คุณใช้สำหรับสิ่งนี้ ฉันคิดว่าการบันทึกข้อมูลลงใน Entity จะทำให้ทั้งรหัสและข้อมูลเป็นระเบียบและง่ายขึ้น
สร้างมัน: ทางออกที่เป็นไปได้
- D8MI (Drupal 8 Multilingual Initiative)
- รหัสที่กำหนดเอง: การแปล "ดัชนี" มีให้ในเทมเพลตโดย t () โดยการสอบถามทางโปรแกรมและการแสดงผลบันเดิลที่มีอยู่และการใช้งานชุดรูปแบบที่เกี่ยวข้อง
pseudocode
เอนทิตี Foreach (จากประเภท x),
ค้นหาทุกภาษา (อนุกรมวิธานหรือภาษาหลักที่เกี่ยวข้องกับผลิตภัณฑ์),
ทำให้เอนทิตี้ของ
- เพื่อตรวจสอบว่ามัน t () สตริงการแปล
- ชุดรูปแบบการโทร () ซึ่งจัดการเลเยอร์การนำเสนอหลายภาษาของ ผลิตภัณฑ์ไม่ใช่ตัวแบบข้อมูลผลิตภัณฑ์เอง
ผลลัพธ์:
- การโทรครั้งแรกเพื่อแสดงเท็มเพลตเอนทิตีในแต่ละภาษาจะส่งคืนการใช้ภาษาเริ่มต้นสำหรับการโทรแต่ละครั้ง
- ตอนนี้พารามิเตอร์ t () บนเทมเพลตถูกแคชไว้ใน Drupal และพร้อมสำหรับการแปล (สำหรับแต่ละอินสแตนซ์ภาษาไม่ใช่แต่ละอินสแตนซ์ผลิตภัณฑ์)
- ผู้ใช้ที่มีบทบาท“ นักแปล” สามารถไปที่อินเทอร์เฟซการแปลและแปลพารามิเตอร์ t () ที่มีอยู่ทั้งหมดสำหรับแต่ละภาษา
- เจ้าของไซต์ไม่จำเป็นต้องรอให้ลูกค้าเยี่ยมชมหน้าผลิตภัณฑ์แต่ละหน้าหรือเยี่ยมชมหน้าผลิตภัณฑ์แต่ละหน้าด้วยตนเอง
คำถามเปิด:
- บริบทคืออะไร? ถ้าฉันโทรไปที่ธีม () สำหรับแต่ละเอนทิตี“ ผลิตภัณฑ์” บันเดิลมันจะบันทึกตำแหน่งที่โทรนั้นทำหรือไม่? มันบันทึก URL ของโหนดหรือไม่ “ บริบท” สามารถเปลี่ยนแปลงได้หรือไม่? บริบทบันทึกอยู่ที่ไหน จะเกิดอะไรขึ้นเมื่อคุณมีเทมเพลต "ไดนามิก" - เช่นเมื่อคุณมีเทมเพลตมากกว่าหนึ่งรายการต่อผลิตภัณฑ์และวิธีการตรวจจับการเปลี่ยนแปลงเหล่านั้น
เช่นเคยการสร้างทฤษฎีและรหัสเทียมเป็นสิ่งที่ดีสำหรับการระดมสมอง แต่ในการพัฒนาเราแทบจะไม่รู้ว่าเรากำลังทำอะไรอยู่จนกระทั่งเราเริ่มต้นแบบ ดังนั้นเมื่อมีข้อ จำกัด สองสามข้อแนวทางที่เป็นไปได้และปัญหาหรือคำถามที่เป็นไปได้ - ตอนนี้ฉันสามารถดำเนินการพิสูจน์แนวคิดหรือต้นแบบการทำงานได้แล้ว คำถามที่เปิดกว้างบางข้อสามารถตอบได้ด้วยวิธีนี้เท่านั้นและเป็นแบบอย่างที่เร็วที่สุด (โดยไม่คำนึงถึงความสำเร็จหรือความล้มเหลว) เราสามารถเริ่มตอบคำถามเหล่านั้น - หรือเปลี่ยนวิธีการทั้งหมด คอยติดตาม ~
wget
หรืออะไรก็ตาม แฮ็ก แต่คุณพูดว่าได้รับอนุญาต (: