ตัวยึดตำแหน่ง Gettext

ฉันกำลังสร้างแอปพลิเคชันหลายภาษาใน PHP + CodeIgniter ฉันตัดสินใจใช้ gettext สำหรับการแปลข้อความ UI แล้ว และจนถึงตอนนี้ก็ได้รับการพิสูจน์แล้วว่ามีประสิทธิภาพและใช้งานง่าย

แต่ตอนนี้ฉันกำลังเผชิญกับสิ่งที่น่ารำคาญจริงๆ: ฟังก์ชัน gettext() ยอมรับเพียงหนึ่งพารามิเตอร์เท่านั้น ในขณะที่ฉันต้องการพฤติกรรมที่เหมือน printf ที่ฉันได้รับจากอะแดปเตอร์ gettext ของ Zend Framework ซึ่งฉันสามารถใช้ %1$s, %2$s ฯลฯ เป็นตัวยึดตำแหน่ง จากนั้นระบุ สตริงการแทนที่เป็นพารามิเตอร์เพิ่มเติมสำหรับฟังก์ชัน translate() ของ Zend view

ฉันไม่ต้องการละทิ้ง gettext เนื่องจากการจัดการการแปลที่ง่ายดายด้วยไฟล์ .po และ poEdit (ฉันสามารถอัปเดตได้ด้วยคลิกเดียว) ฉันมีตัวเลือกอะไรบ้าง?

ฉันได้ลองเขียนตัวช่วยเพื่อโต้ตอบกับ gettext แล้ว: เรียกใช้อาร์กิวเมนต์แรกผ่าน gettext จากนั้นเรียกใช้ strtr บนสตริงผลลัพธ์ มีวิธีอื่น/ดีกว่าที่คุณอยากจะแนะนำหรือไม่?


person mingos    schedule 26.03.2011    source แหล่งที่มา
comment
ฉันตระหนักดีว่าคุณบอกว่าคุณไม่ต้องการทิ้ง gettext แต่คุณควรตระหนักว่าคุณ สามารถ ใช้ Zend_Translate และ CI ร่วมกันได้โดยไม่มีปัญหามากเกินไป คู่มือแจ้งว่าสามารถอ่านไฟล์ .mo ได้ ฉันไม่แน่ใจว่าสิ่งเหล่านั้นแตกต่างจากไฟล์ .po อย่างไร ดังนั้นเหตุผลที่ฉันโพสต์สิ่งนี้เป็นความคิดเห็นแทนที่จะเป็นคำตอบ คู่มือบอกว่า POEdit ใช้งานได้กับรูปแบบนั้น   -  person Charles    schedule 27.03.2011
comment
.mo คือสิ่งที่ .po เกิดขึ้นหลังจากคอมไพล์แล้ว Gettext อ่าน .mo แต่ .po นั้นมนุษย์สามารถอ่านได้ และนั่นคือสิ่งที่คุณแก้ไข :) ใช่ การใช้ Zend_Translate เป็นตัวเลือกที่ต้องพิจารณาอย่างแน่นอน   -  person mingos    schedule 27.03.2011


คำตอบ (1)


จริงๆ แล้ว มันค่อนข้างง่าย คุณกำหนดฟังก์ชันแปรผันได้ดังนี้:

function myGettext($id)
{
    return vsprintf(gettext($id), array_slice(func_get_args(), 1));
}

ตอนนี้การทำ myGettext('%u %s in a %s', 3, 'monkeys', 'tree') จะส่งคืนสตริงที่คาดหวังพร้อมกับตัวยึดตำแหน่งที่แทนที่ด้วยอาร์กิวเมนต์ที่เหลือ เห็นได้ชัดว่าคุณต้องใช้ฟังก์ชันรับรู้พหูพจน์ที่เรียก ngettext() แทน

เกี่ยวกับ poEdit คุณต้องแก้ไขคีย์เวิร์ดที่ค้นหา ใช้งานมาระยะหนึ่งแล้ว แต่มันค่อนข้างง่าย ปัญหาเดียวที่ฉันเผชิญคือการระบุคีย์เวิร์ดสำหรับการสนับสนุนพหูพจน์ (ดูสิ่งนี้)

หวังว่ามันจะช่วยได้!

person Alix Axel    schedule 27.03.2011
comment
นี่คือสิ่งที่ผู้ช่วยของฉันทำไม่มากก็น้อย แต่โค้ดนั้นง่ายกว่า (บรรทัดเดียวกับสี่บรรทัด อิอิ) poEdit มีความเป็นไปได้ที่จะกำหนดคำหลัก - นี่คือวิธีที่ฉันเลือกสตริงที่แปลได้ในฟังก์ชัน translate, setLabel และ setDescription ของ Zend Framework :) ขอบคุณ ฉันชอบแนวทางของคุณ - person mingos; 27.03.2011
comment
มันไม่ใช่ปัญหาเลย แต่ใช่ ฉันเปลี่ยนผู้ช่วยของฉันเป็นสิ่งที่คุณแนะนำและไม่เพียงแต่ใช้งานได้อย่างมีเสน่ห์เท่านั้น แต่ฉันก็ชอบโค้ดที่ต้องใช้ในปริมาณมากด้วย :D ขอบคุณอีกครั้ง. - person mingos; 27.03.2011
comment
@mingos: โอ้เยี่ยมเลย ฉันดีใจที่สามารถช่วยได้บ้าง ;) - person Alix Axel; 27.03.2011