HTML ในสตริงการแปลภาษา __ () หรือ _e ()


24

วิธีการที่เหมาะสมในการสร้างสตริงการแปลคืออะไร?

ตัวอย่างเช่น,

echo __( 'Hello ' . $first . ' you owe me money.' );
echo __( '<div><p>Top: ' . $t_margin . '</p>' . '<p>Bottom: ' . $b_margin . '</p></div>' )

มันเป็นการตกลงที่จะเพิ่มสตริงและ / หรือ HTML หรือควรจะทำก่อนแล้วจึงทำงานผ่านการแปลเช่น:

$html = '<div><p>Top: ' . $t_margin . '</p>' . '<p>Bottom: ' . $b_margin . '</p></div>';
echo __( $html ); 

คำตอบ:


41

มีข้อโต้แย้งที่สองใน__()ฟังก์ชั่น ควรตั้งค่าเป็นโดเมนที่คุณใช้สำหรับปลั๊กอินหรือธีมของคุณ 'text_domain'ในตัวอย่างด้านล่างที่ผมใช้ สตริงโดเมนของคุณควรไม่ซ้ำกัน ไม่ควรตรงกับสตริงโดเมนอื่น การไม่ใช้อาร์กิวเมนต์โดเมนข้อความจะใช้ค่าเริ่มต้น'default'เป็นชื่อโดเมน WordPress ดูลิงค์สำหรับรายละเอียดเพิ่มเติม

ใช้สตริง ( 'text_domain') เสมอ อย่าใช้ตัวแปรฟังก์ชั่นหรือค่าคงที่กับสตริง โปรแกรมการแปล (ทั้งหมด?) ส่วนใหญ่จะไม่เห็นมันหากไม่มีสตริง

รหัสของคุณ:

echo __( 'Hello ' . $first . ' you own me money.' );

ห้ามรวมตัวแปรในสตริง

วิธีที่ดีกว่า:

echo sprintf( __( 'Hello %s you own me money.', 'text_domain' ), $first );

หรือเพียงแค่:

printf( __( 'Hello %s you own me money.', 'text_domain' ), $first );

%sยึดบอกแปลว่ามนุษย์สตริงเป็นไปในนั้น ใช้%dสำหรับตัวเลข นอกจากนี้ยังมีตัวยึดตำแหน่งอื่น

(ประโยคนี้เป็นภาษาอังกฤษที่ไม่ถูกต้องตามหลักไวยากรณ์ใช้อย่างใดอย่างหนึ่ง'Hello %s, you owe me money.'หรือ'Hello %s, you own my money.'ขึ้นอยู่กับความหมายที่คุณตั้งใจ)


รหัสของคุณ:

$html = '<div><p>Top: ' . $t_margin . '</p>' . <p>Bottom: ' . $b_margin . '</p></div>';

อย่าแปล HTML มันเหมือนกันในทุกภาษา

วิธีที่ดีกว่า:

$html = sprintf( '<div><p>%s</p><p>%s</p></div>', __( 'Top: ', 'text_domain' ) .  $t_margin, __( 'Bottom: ', 'text_domain' ) . $b_margin );

หรือแบ่งออกเป็นหลายบรรทัด:

$html = sprintf(
    '<div><p>%s</p><p>%s</p></div>',
    __( 'Top: ', 'text_domain' ) .  $t_margin,
    __( 'Bottom: ', 'text_domain' ) . $b_margin
);

หากไม่ชัดเจนว่าTopและBottomคืออะไรคุณอาจใช้_x()เพื่ออธิบายบริบทของข้อกำหนดเหล่านี้


คุณสามารถค้นหากรณีการแปลอื่น ๆ ได้ที่นี่: ความเป็นสากล: คุณอาจทำผิด


คุณพูดว่าอย่าแปล HTML ฉันอาจชี้ให้เห็นว่ามันไม่ได้ถูกแปลมันกำลังถูกค้นหาในตาราง / s ของสตริงการแปลที่มีอยู่แล้ว การมี HTML ในสตริงทำให้ไม่มีความแตกต่างหากนักแปลไม่ได้ลบออก ในความเป็นจริงในบางสถานการณ์มันทำให้ประสิทธิภาพที่ดีกว่าการค้นหาและแทนที่ regex
Twifty

ไม่เกี่ยวข้อง แต่สังเกตได้: ตัวที่textdomainจะต้องเป็นสตริงตัวอักษรมันไม่สามารถเป็นตัวแปร / ค่าคงที่ / คุณสมบัติได้
brasofilo

@brasofilo คำแนะนำนั้นเขียนขึ้นในคำตอบใกล้ด้านบน แต่หมีซ้ำ ฉันทำผิดพลาดในปลั๊กอินที่กำหนดเองหลายตัวที่ฉันเขียนให้กับลูกค้า
Charles Clarkson

+1 sprintf()สำหรับ นั่นเป็นวิธีที่มี HTML ในสตริงที่แปลได้
helgatheviking

ฉันไม่เห็นวิธีการใช้ความsprintf()ช่วยเหลือในทางอื่นนอกจากวิธีที่ดูสะอาดตามากกว่านี้ ถ้าคุณมีประโยคกับ HTML ภายในเช่นSome text with a <strong>strong</strong> word inside.วิธีการที่จะเป็นไปได้ในการแปลประโยคโดยรวมและไม่แปลSome text with a, strongและword insideรายบุคคล (ซึ่งทำให้รู้สึกไม่)
phpheini

4

ฉันจะไม่แก้ไขปัญหาของตัวแปรในสตริงเนื่องจากมีการพูดถึงแล้ว

คุณต้องการให้สตริงของคุณคงที่ซึ่งหมายความว่าเนื้อหาจะไม่เปลี่ยนแปลง คุณต้องการป้องกัน HTML ที่ไม่จำเป็น

__( '<p>Hello World!</p>' );
__( '<h1>Hello World!</h1>' );

ด้านบนจะใช้สองแถวในตารางของคุณสำหรับสิ่งที่เป็นข้อความเดียวกัน พวกเขาสามารถเขียนใหม่เป็น:

'<p>' . __( 'Hello World!' ) . '</p>'
'<h1>' . __( 'Hello World!' ) . '</h1>'

ลดให้เหลือเพียงแถวเดียว

บางครั้ง HTML ในข้อความไม่สามารถหลีกเลี่ยงได้ ยกตัวอย่างเช่น

__( 'You currently owe <b>%s</b> dollars' );

เนื่องจากภาษามีไวยกรณ์การแยกข้อความจึงทำให้เกิดปัญหากับผู้แปล

หลักการง่ายๆ. แท็กการจัดรูปแบบข้อความ HTML ประโยคกลางประโยคตกลง ประโยคเริ่มต้นและลงท้ายด้วย HTML เพียงแค่เสียพื้นที่


"<b>$string</b>"ในตัวอย่างที่ผ่านมาคุณสามารถห่อแท็กตัวหนารอบอาร์กิวเมนต์ที่ถูกแทรก 'You currently owe %s dollars'คุณสามารถใช้ มันอาจจะ แต่ต้องการที่จะอยู่ถ้าคุณใช้มันกับ_n()ฟังก์ชั่นที่ต้องใช้%dตัวยึด
Charles Clarkson

@CharlesClarkson โทรดีมาก บางทีฉันควรจะออก%sไปเพื่อให้ชัดเจนขึ้นเล็กน้อย
Twifty
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.