วิธีสร้างข้อความด้วยไฮเปอร์ลิงก์ที่สามารถแปลได้ใน WordPress?


15

ฉันเห็นวิธีต่าง ๆ ในการทำข้อความด้วยการเชื่อมโยงหลายมิติที่แปลได้ อย่างไรก็ตามฉันไม่สามารถหาแนวปฏิบัติที่ดีที่สุดเพียงข้อเดียวได้

ดังนั้นนี่คือคำตอบบางส่วนที่ฉันพบ:

// METHOD 1
sprintf( __( 'Please read %1$sthis%2$s.', 'tacoverdo-example-domain' ), '<a target="_blank" href="' . esc_url( 'https://goo.gl' ) . '">', '</a>' );

// METHOD 2
echo '<a target="_blank" href="' . esc_url( 'https://goo.gl' ) . '">';
_e( 'Please read this.', 'tacoverdo-example-domain' );
echo '</a>';

// METHOD 3
sprintf( __( 'Please read <a href="%s">this</a>.', 'tacoverdo-example-domain' ), esc_url( 'https://goo.gl' ) );

// METHOD 4
sprintf( __( 'Please read %sthis%s.', 'tacoverdo-example-domain' ), '<a target="_blank" href="' . esc_url( 'https://goo.gl' ) . '">', '</a>' );

// METHOD 5
_e( 'Please read <a target="_blank" href="' . esc_url( 'https://goo.gl' ) . '">this</a>', 'tacoverdo-example-domain' );

ความคิดแรกของฉันคือวิธีที่ 1 จะดีที่สุด ไม่ต้องการให้นักแปลของคุณรู้ HTML แต่มันก็ไม่อนุญาตให้คนที่ทำไปยุ่งกับมัน นอกจากนี้ยังค่อนข้างแห้ง (ไม่ต้องทำซ้ำตัวเอง) เนื่องจากคุณไม่ต้องแปลทั้งส่วน HTML ซ้ำแล้วซ้ำอีก

แต่เมื่อโพสต์คำถามนี้บน Twitter คนตอบว่าวิธีที่ 3 จะดีที่สุดที่คุณสามารถดูที่นี่

ดังนั้นฉันควรสร้างข้อความด้วยไฮเปอร์ลิงก์ที่สามารถแปลได้ใน WordPress ได้อย่างไร

คำตอบ:


17

นี่เป็นปัญหาที่เห็นได้ชัดมาก มันรวมปัญหาเนื้อหา HTML โดยเนื้อแท้กับภาระการแปลใหม่ทั้งหมดเช่นการสแกนหาสตริงกระบวนการแปลเองและการตรวจสอบ

ดังนั้นเราต้องรวม:

  1. ข้อความ (ในรูปแบบที่แปลได้)
  2. HTML มาร์กอัป (ในรูปแบบที่ยากจะหัก แต่ควรมีความยืดหยุ่นมากกว่า)
  3. ปลายทาง URL (ในรูปแบบที่ปลอดภัยและสามารถแปลได้ดีกว่าอาจมีความเฉพาะกับภาษา!)

นอกจากนี้เรายังต้องพิจารณาความคุ้นเคยและศิลปะก่อนหน้าในคำอื่น ๆ - สิ่งที่สำคัญจะทำ ตกลงมันไม่ได้ช่วยอะไรเลยจากการตรวจสอบอย่างรวดเร็วว่าแกนประมวลผลส่วนใหญ่ (ถ้าไม่ใช่ทั้งหมด) ด้วยวิธีการเหล่านี้

จากปัจจัยเหล่านี้และการอภิปรายโดยรอบฉันจะบอกว่ามีวิธีการสามถังขึ้นอยู่กับความต้องการและลำดับความสำคัญ

ง่าย - สตริงเดียวที่มีทุกสิ่ง

__( 'Please read <a href="https://goo.gl">this</a>', 'example-domain' );
  • ง่ายต่อการติดตามในรหัส
  • อนุญาตให้แปลทุกส่วน (ข้อความมาร์กอัป URL) โดยรวม
  • URL hardcoded
  • มีแนวโน้มที่จะแบ่ง HTML
  • เป็นที่นิยมในหลัก

ยอดคงเหลือ - URL แตกออก

sprintf( 
    __( 'Please read <a href="%s">this</a>', 'example-domain' ), 
    esc_url( 'https://goo.gl' ) 
);
  • ง่ายต่อการติดตาม
  • สามารถแปลได้ทุกส่วน แต่ URL ต้องมีการเรียกคำแปลแยกต่างหาก
  • URL สามารถเป็นแบบไดนามิกและหนีออกมาได้
  • มีแนวโน้มที่จะแบ่ง HTML
  • เป็นที่นิยมในหลัก
  • ได้รับความนิยมอย่างมากจากนักพัฒนา / นักแปล

ทีละน้อย - มาร์กอัปแตกออก

sprintf( 
    __( 'Please read %1$sthis%2$s.', 'example-domain' ), 
    '<a href="' . esc_url( 'https://goo.gl' ) . '">',
    '</a>' 
);

หรือผ่านการต่อข้อมูล

'<a href="' . esc_url( 'https://goo.gl' ) . '">' 
. __( 'Please read this.', 'example-domain' );
. '</a>';
  • อ่านน้อย
  • มีความยืดหยุ่นในการแบ่ง HTML มากกว่า
  • ความนิยมน้อยลงในแกน
  • ต้องการบริบทเพิ่มเติมสำหรับการแปล

กฎของหัวแม่มือ (เท่าที่ฉันเห็น)

  1. ง่ายเพื่อให้ง่ายที่สุด
  2. ทีละน้อยเพื่อป้องกันการแบ่ง HTML
  3. สมดุลสำหรับกรณีอื่น ๆ ทั้งหมด (มีแนวโน้มมากที่สุด)

+1 ฉันชอบตัวเลือก "สมดุล" อาจจะสามารถปรับปรุงการเพิ่มบริบทโดยใช้_xแทน__
gmazzap

ฉันตั้งใจจะเป็นตัวอย่างพื้นฐานแทนที่จะเป็นตัวอย่างที่ครอบคลุม อาจจะมีการเปลี่ยนแปลงในแต่ละเนื่องจากจำนวนสถานการณ์และฟังก์ชั่นการแปล
Rarst

ตัวเลือกที่สมดุลก็มีปัญหาเช่นกันผู้แปลสามารถสร้างมาร์กอัปที่ไม่ถูกต้อง สำหรับการแปลที่แน่นอนและปลอดภัยดีกว่าคุณควรยกเว้น html ฉันยังโหวตให้ฟังก์ชั่นการแปลพร้อมบริบท ที่เปิดโอกาสให้นักแปลเข้าใจวิธีการโดยไม่มีความรู้เกี่ยวกับตำแหน่งบริบทในปลั๊กอินธีม
bueltge

ฉันเคยได้ยิน 'ผู้แปลต้องการบริบท' มาก่อน แต่มันทำให้ฉันประหลาดใจ พวกเขาจะทำอะไรต้องบริบทสำหรับในตัวอย่างนี้ ? ฉันคิดว่ามันเป็นแนวปฏิบัติที่ดีที่จะจัดเตรียมบริบทเมื่อจำเป็น แต่ผู้แปลต้องการในกรณีนี้จริงหรือ พวกเขาจำเป็นต้องรู้ว่า%sย่อมาจาก<strong>หรือ<a href target="#">? มันมีอิทธิพลต่อการแปลของพวกเขา?
Taco Verdo

@TacoVerdo หากลิงก์แตกออกฉันจะถือว่าข้อความโดยที่มันอาจจะคลุมเครือในกรณีนั้นบริบทควรบอกว่าปลายทางนั้นมีข้อความอะไร บริบททำหน้าที่รวบรวมข้อมูลจนกว่าจะเสร็จสมบูรณ์และไม่คลุมเครือ ในขณะที่คุณแบ่งข้อความเป็นชิ้นส่วนขนาดเล็กแบบสแตนด์อโลนแต่ละส่วนจะต้องการบริบทที่เหมาะสมกว่าโดยรวม
Rarst

8

วันนี้ฉันทำงานกับเว็บไซต์หลายภาษาและฉันต้องพูดว่า:

  1. URL ของลิงก์มักจะต้องสามารถแปลได้
  2. ความน่าเชื่อถือเอาท์พุทฟังก์ชั่นการแปลไม่ดี ผมสวยมากไม่เคยใช้__()แต่เสมอ/esc_html__() esc_attr__()ซึ่งหมายความว่าสตริงที่จะแปลต้องไม่มี HTML ของการเรียงลำดับใด ๆ
  3. การเขียนเป็นภาษาอังกฤษเรามักจะไม่ทราบว่าในภาษาอื่นคำหนึ่งอาจเขียนด้วยวิธีที่แตกต่างกันขึ้นอยู่กับบริบท ดังนั้นเมื่อข้อความมี 1 หรือไม่กี่คำดีกว่าเสมอในการใช้*_x()ฟังก์ชั่นการแปลที่หลากหลาย
  4. เพื่อรวมตัวยึดตำแหน่งมากกว่าหนึ่งตัวสำหรับแต่ละสตริงที่แปลได้อาจเป็น "อันตราย" หากนักแปลไม่ใช่นักพัฒนาพวกเขาจะทำลายการแสดงผลหน้าเว็บได้อย่างง่ายดาย ในตัวอย่าง%1$sthis%2$sแปลไม่ใช่ทางด้านเทคนิคไม่เข้าใจว่าsก่อนที่จะthisเป็นสิ่งจำเป็นสำหรับการแสดงผลที่เหมาะสมและยังอาจคิดว่านักพัฒนาที่ต้องการที่จะพิมพ์แต่พิมพ์ผิดและเขียนthissthis

ด้วยเหตุผลทั้งหมดนี้ "ถูกต้อง" การแปลข้อความที่มีลิงก์เป็นเรื่องยาก ทางออกที่ทำงานได้เท่านั้นที่คำนึงถึงทั้งหมดที่กล่าวข้างต้นคือ:

$anchor = esc_html_x( 'Google', 'link text for google.com', 'txt-domain' );
$domain = esc_url( __( 'google.com', 'txt-domain' ) );  
$link   = sprintf( '<a href="https://%s">%s</a>', $domain, $anchor );

 /* translators: 1 is a link with text "Google" and URL google.com */
echo sprintf( esc_html__( 'Use %1$s to search.', 'example-domain' ), $link );

ซึ่งปลอดภัยและง่ายต่อการแปลโดยคนที่ไม่ใช่ด้านเทคนิค แต่ยัง verbose และ PITA ที่จะดำเนินการโดยเฉพาะอย่างยิ่งถ้ามันต้องทำเพื่อเชื่อมโยงหลาย ...

อย่างไรก็ตามสำหรับรหัสที่วางจำหน่ายในป่าที่มีผู้ใช้ (จริงหรือมีศักยภาพ) นับพันที่พูดหลายภาษานี่คือวิธีที่ฉันจะใช้

นี่เป็นวิธีที่ฉันใช้แม้แต่กับรหัสภายในเท่านั้น แต่นั่นคือฉัน


หมายเหตุ :

มันอาจปรากฏมากเกินไปที่จะทำให้คำว่า "Google" แปลได้แยกกันและอาจเป็นจริงสำหรับกรณีนี้โดยเฉพาะ แต่บางครั้งถึงกับคิดว่ายี่ห้อนั้นผิด เพียงเพื่อชื่อตัวอย่างเช่นในอิตาลีเรามีแบรนด์"Algida"ซึ่งเป็นที่รู้จักกับ~ 30 ชื่อแตกต่างกันทั่วโลก

ในกรณีเช่นนี้การเข้ารหัส URL และ / หรือชื่อแบรนด์จะทำให้เกิดปัญหา

จัดเตรียมบริบทสำหรับการแปลจะช่วยให้นักแปลตัดสินใจว่าพวกเขาจำเป็นต้องแปลชื่อแบรนด์หรือไม่


2

คุณต้องเก็บมาร์กอัพไว้ในสตริงที่แปลได้เนื่องจากผู้แปลต้องรู้ว่ามีลิงค์ ในบางภาษาข้อความลิงก์ที่เป็นผลลัพธ์อาจมีหลายคำแม้อาจมีเครื่องหมายจุลภาค (หรือเทียบเท่า) ภายในหรือมาร์กอัปอื่น ๆ ที่จำเป็นต้องซ้อนกันอย่างถูกต้อง

ยังเป็นสิ่งสำคัญที่จะสร้างการเชื่อมโยงข้อความพูดไม่ได้นี่หรือที่นี่

2 หรือ 3 เป็นเพียงตัวเลือกที่แปลได้ แต่คุณควรทำให้ URL แปลได้เช่นกัน

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