อะไรคือจุดสนใจในไวยากรณ์ของ gettext


9

จนถึงตอนนี้ฉันจัดการการแปลใน Wordpress และพยายามอ่านเอกสาร gettext อย่างเป็นทางการ แต่จะไม่ได้รับสิ่งหนึ่งที่เข้าใจง่าย: ความแตกต่างระหว่างการเริ่มต้นเหล่านั้นเช่น __ (, _e (, ฯลฯ ) และแม้กระทั่ง เพิ่มเติม: มีคนอื่นอยู่ข้างๆไหมขอบคุณล่วงหน้า!

ตรงไปตรงมา


ขอบคุณทุกคนสำหรับคำตอบที่บรรจง! ฉันซาบซึ้งจริง ๆ ที่นี่!
Circuit Circus

... อาจมีคำถามเพิ่มเติมอีกข้อหนึ่งต่อไปนี้: การป้อนข้อความโดเมนจะหมดไปได้ไหม ฉันเริ่มนำมันไปยังทุก ๆ สตริงที่ฉันต้องการแปล แต่แล้วก็จำตัวอย่างบางส่วนใน Codex ของ Wordpress ซึ่งไม่ได้บรรจุเลย ...
Circuit Circus

... เอาล่ะตอนนี้ฉันเจอมันในหน้า codex - ขออภัยสำหรับคำถามซ้ำซ้อนนี้ :-)
Circus Circus

คำตอบ:


13

__(เครื่องหมายขีดล่างคู่) เป็นฟังก์ชันการแปลพื้นฐาน มันแปลสตริงและส่งกลับเป็นสตริง

_eทำเช่นเดียวกัน__แต่สะท้อนผลลัพธ์ทันที

_xเป็นฟังก์ชั่นการแปลตามบริบท มันมีตัวเลือกที่สองเพื่อให้บริบทกับคนที่ทำการแปล

_exเป็นเช่นเดียวกับ_xแต่สะท้อนถึงผลลัพธ์

ตัวอย่างการใช้งาน_x:

$string = _x( 'Buffalo', 'an animal', 'plugin-domain' );
$string = _x( 'Buffalo', 'a city in New York', 'plugin-domain' );
$string = _x( 'Buffalo', 'a verb meaning to confuse somebody', 'plugin-domain' );

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

ฟังก์ชั่นทางลัด:

  • esc_attr__: คิดแต่ยังทำงานผลผ่าน__esc_attr
  • esc_html__: คิดแต่ยังทำงานผลผ่าน__esc_html
  • esc_attr_e: คิดแต่ยังทำงานผลผ่าน_eesc_attr
  • esc_html_e: คิดแต่ยังทำงานผลผ่าน_eesc_html
  • esc_attr_x: คิดแต่ยังทำงานผลผ่าน_xesc_attr
  • esc_html_x: คิดแต่ยังทำงานผลผ่าน_xesc_html

_nเป็นตัวจัดการพหูพจน์ ตัวอย่าง:

$string = sprintf( _n(
        'You have %d taco.', 
        'You have %d tacos.', 
        $number, 
        'plugin-domain'), 
    $number );

ในตัวอย่างนั้นมีสองวิธีในการพูดจำนวนทาโก้ขึ้นอยู่กับว่าเป็นเอกพจน์หรือไม่ การใช้ $ number ครั้งแรกจะเป็นการบอก_nฟังก์ชั่นว่าต้องใช้รุ่นใด การใช้ $ number ครั้งที่สองเกิดขึ้นใน sprintf เพื่อแทนที่% d ด้วยจำนวนจริงในสตริง

ไม่มีฟังก์ชั่นสะท้อนเทียบเท่าเป็นแต่มีฟังก์ชั่นการตั้งชื่อ_n _nxมันรวมกันของและ_n _xความหลากหลายและบริบท

_n_noopเป็นคนพิเศษ มันใช้สำหรับการแปลสตริงพหูพจน์ แต่ไม่ได้ทำการแปลทันที สิ่งนี้มีประโยชน์หากคุณต้องการทำให้สตริงเป็นศูนย์กลาง แต่จริงๆแล้วทำงานที่อื่น ฟังก์ชั่นที่ไม่จริงอื่น ๆ translate_nooped_pluralการทำงานคือ

ตัวอย่าง:

$holder = _n_noop('You have %d taco.', 'You have %d tacos.', 'plugin-domain');
// ... later ...
$string = sprintf( translate_nooped_plural( $holder, $count ), $count );

มันไม่ได้ใช้มากนัก แต่มีประโยชน์สำหรับองค์กร หากคุณใส่สายของคุณทั้งหมดในหนึ่งแฟ้มเช่นนั้นอ้างอิงพวกเขาที่อื่น ๆ นี้จะไม่ได้มีเพียงแค่_nคุณจะต้องสิ่งที่ต้องการ_n_noopจะทำอย่างนั้น

_nx_noopเหมือนกัน_n_noopแต่ยังสามารถใช้บริบทสำหรับนักแปลได้เช่น_xกัน

โปรดทราบว่าคุณสามารถใส่โดเมนในการเรียกใช้ฟังก์ชัน noop หรือในการเรียกใช้ฟังก์ชัน translate_nooped_plural แล้วแต่ความเหมาะสมสำหรับองค์กรของคุณ หากทั้งสองมีโดเมนแล้วทั้งที่ผ่านไปยังการโทร noop ชนะ

number_format_i18nเทียบเท่ากับnumber_formatในตัวของ PHP แต่เพิ่มในการจัดการสิ่งต่าง ๆ เช่นทศนิยมและอื่น ๆ ซึ่งแตกต่างกันในโลแคลอื่น ๆ

date_i18nเป็นเทียบเท่ากับของ PHP ในตัววันที่มีทั้งหมดจัดการมีทั้งที่เกี่ยวข้อง ชื่อเดือนชื่อวัน ฯลฯ

นอกจากนี้ยังไม่เคยทำลายกฎหมาย เพียงเตือนความจำ :)


ว้าวนี่เป็นคำอธิบายที่ดีจริงๆ! ขอบคุณมากสำหรับความช่วยเหลือ! ตอนนี้ฉันเห็นชัดเจน
Circuit Circus

6

__ (), _e () และ _x (), _ex ()

__()และ_e()เป็นหลักทั้งเสื้อคลุมของtranslate()(อย่าใช้โดยตรง) และเกือบจะเหมือนกัน

ความแตกต่างอยู่ที่การ__()ส่งคืนสตริงที่แปลและ_e()สะท้อนกลับ ทั้งคู่จะต้องป้อนสตริงเป็นพารามิเตอร์ที่ต้องการและโดยปกติจะเป็นตัวเลือกหรือไม่ก็เป็นโดเมนข้อความ

คล้ายกันมี_x()และ_ex()ที่ให้คุณระบุบริบทที่สามารถอธิบายที่สตริงปรากฏ หากโครงการของคุณมีสตริงที่แปลได้มากกว่าสองสามสิบรายการการใช้บริบทจะสมเหตุสมผล

นอกจากนี้ให้สังเกตการมีอยู่ของ_n()และ_nx()สำหรับพหูพจน์

ตัวอย่างการใช้งานทั่วไป

$output = '<label for="some_field">' .
        _x( 'Some Information.', 'Some Form Field', 'your-text-domain' ) .
    '</label>' .
    '<input type="text" name="some_field" value="" />' .
    '<p class="description">' .
        _x( 'Here you can enter some info.', 'Some Form Field', 'your-text-domain' ) .
    '</p>';

return $output;

พารามิเตอร์

__( $text, $domain )
_e( $text, $domain )
_x( $text, $context, $domain )
_ex( $text, $context, $domain )
_n( $single, $plural, $number $domain )
_nx( $single, $plural, $number, $context, $domain )

พารามิเตอร์ทั้งหมดยกเว้น$numberสตริง ทั้งหมดยกเว้น แต่$domainจำเป็น

ความยืดหยุ่นเพิ่มเติมกับตัวแปรและ sprintf ()

หากสตริงของคุณจะมีตัวเลขหรือคำที่หลากหลายให้ใช้sprintf():

$stars = get_post_meta( $post->ID, 'rating', true );
$title = get_the_title( $post->ID );

$output = '<p>' .
        sprintf(
            _x(
                'The movie titled %2$s received a %1$d star rating.',
                'Movie Description',
                'your-text-domain'
            ),
            $stars,
            $title
        ) .
    '</p>';

return $output;

แหล่งข้อมูลเพิ่มเติม

แหล่งข้อมูลเพิ่มเติมสำหรับ WordPress I18n Ninja:


นอกจากนี้ลองดู"การแปล" ใต้ "เบ็ดเตล็ด" ใน codexเพื่อดูรายละเอียดฟังก์ชั่นและคำอธิบายโดยละเอียด
TheDeadMedic

และนี้เป็นสถานที่ที่ WP-polyglots ตอบสนอง
brasofilo

@Johannes Pille: ฉันไม่ได้สังเกตคำตอบของคุณจนกว่าฉันจะโพสต์ของฉันฉันควรลบโพสต์ของฉันหรือไม่
Jeremy Jared

@JeremyJared ไม่ทำไม ข้อมูลเพิ่มเติมไม่สามารถเป็นสิ่งที่เลวร้ายได้ไหม! ฉันคิดว่าคำตอบของคุณเป็นความคิดที่ดี +1 จากฉัน
Johannes Pille

@TheDeadMedic แก้ไขเป็น "ทรัพยากรเพิ่มเติม"
Johannes Pille

3

ฉันไม่ใช่ผู้เชี่ยวชาญด้านการแปล แต่ WordPress Codex Page มีเอกสารที่ดีและอธิบายถึงเหตุผลที่ใช้แต่ละอินสแตนซ์

จากหน้า codex:

__()

ใช้เมื่อข้อความถูกส่งเป็นอาร์กิวเมนต์ให้กับฟังก์ชันอื่น _e()ใช้ในการเขียนข้อความโดยตรงไปยังหน้า รายละเอียดเพิ่มเติมของทั้งสองฟังก์ชั่น:

__('message')

ค้นหาโมดูลการแปลภาษาสำหรับการแปล 'ข้อความ' และส่งการแปลไปยังคำสั่งการส่งคืน PHP หากไม่พบการแปลสำหรับ 'ข้อความ' ก็แค่ส่งคืน 'ข้อความ'

_e('message')

ค้นหาโมดูลการแปลสำหรับการแปล 'ข้อความ' และส่งการแปลไปยังคำสั่ง PHP echo หากไม่พบการแปลสำหรับ 'ข้อความ' แสดงว่าเป็น 'ข้อความ' echoes

โปรดทราบว่าหากคุณกำลังสากลธีมหรือปลั๊กอิน, "Text Domain"คุณควรใช้

เฟรมเวิร์ก gettext ดูแลเวิร์ดเพรสส่วนใหญ่ อย่างไรก็ตามมีบางสถานที่ในการแจกจ่าย WordPress ที่ไม่สามารถใช้ gettext ได้:

  • ไฟล์ WordPress README หลัก - เป็นไฟล์ HTML แบบคงที่ไม่ใช่ไฟล์ PHP ดังนั้นจึงไม่สามารถเรียกใช้ผ่านฟังก์ชั่น gettext
  • ข้อความแสดงข้อผิดพลาดเล็กน้อยจะถูกสร้างขึ้นเร็วมากในรอบการโหลด WordPress ก่อนที่จะโหลด gettext

เชื่อมโยงไปยังเพจ Codex

ข้อมูลเพิ่มเติมเกี่ยวกับเมื่อ gettext ไม่ทำงาน

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

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