แทนที่การแปลหลัก WordPress เริ่มต้น


11

WordPress ถูกตั้งค่าเป็นภาษาดัตช์ เมื่อฉันใช้get_the_archive_title()ชุดรูปแบบของฉันถูกต้องแสดงผล "Categorie: หมวดหมู่ชื่อ" ในหน้าเก็บหมวดหมู่ อย่างไรก็ตามฉันต้องการอ่าน "Sectie: Category-name"

ฉันไม่ต้องการเปลี่ยนไฟล์ภาษาดัตช์ในโฟลเดอร์ wp-content / languages ​​เพราะมันจะได้รับการปรับปรุงโดยการอัปเดต WordPress

ฉันพยายามคัดลอกไฟล์แปลนั้นแก้ไขการแปล "หมวดหมู่" และวางไฟล์ nl_NL.mo ใหม่ลงในธีม / ภาษาของฉัน สิ่งนี้ไม่มีผลกระทบใด ๆ

ฉันจะบรรลุการแปลที่แตกต่างกันสำหรับบางสตริงโดยไม่ต้องแก้ไขไฟล์การแปลหลักได้อย่างไร

คำตอบ:


15

คุณสามารถใช้ตัวกรอง gettext :

add_filter( 'gettext', 'cyb_filter_gettext', 10, 3 );
function cyb_filter_gettext( $translated, $original, $domain ) {

    // Use the text string exactly as it is in the translation file
    if ( $translated == "Categorie: %s" ) {
        $translated = "Sectie: %s";
    }

    return $translated;
}

หากคุณต้องการกรองการแปลตามบริบทให้ใช้gettext_with_contextตัวกรอง :

add_filter( 'gettext_with_context', 'cyb_filter_gettext_with_context', 10, 4 );
function cyb_filter_gettext_with_context( $translated, $original, $context, $domain ) {

    // Use the text string exactly as it is in the translation file
    if ( $translated == "Categorie: %s" ) {
        $translated = "Sectie: %s";
    }

    return $translated;
}

การแปลที่มีบริบทหมายความว่าบริบทได้รับในฟังก์ชัน gettext ที่ใช้ในการแปลสตริง ตัวอย่างเช่นสิ่งนี้ไม่มีบริบท:

$translated = __( 'Search', 'textdomain' );

และนี่คือบริบท:

$translated = _x( 'Search', 'form placeholder', 'textdomain' );

ฟิลเตอร์ที่คล้ายกันที่มีอยู่สำหรับการแปลพหูพจน์ ( [_n()][2]และ[_nx()][2]) และngettextngettext_with_context


1
นั่นได้ผล! ฉันต้องทำ "Categorie:% s" และ "Sectie:% s" เพราะข้อความจะต้องเหมือนกับในไฟล์การแปล
Florian

โอ้ใช่ถูกต้องแล้ว ฉันไม่ทราบคำแปลที่แน่นอน
cybmeta

1
ชิ้นใหญ่ของรหัส - เพียงแค่ทราบว่าgettextตัวกรองจะไม่จับแปลว่าใช้ "บริบท" สตริงเหล่านั้นจะต้องgettext_with_context
มนู

ขอบคุณสำหรับวิธีแก้ปัญหาที่ยอดเยี่ยมนี้ return $domain != 'child-domain' && ( $new = __( $original, 'child-domain' ) ) != $original ? $new : $translated;ขณะที่ผมกำลังสร้างธีมเด็กและเต็มใจที่จะแทนที่บางส่วนของการแปลรูปแบบของผู้ปกครองที่ฉันแทนร่างกายฟังก์ชั่นที่นำเสนอมีบรรทัดต่อไปนี้ ด้วยวิธีนี้ฉันสามารถดูแลการแปลที่สำคัญในไฟล์ PO ของธีมลูกได้โดยไม่ต้องใช้สายในรหัสฟังก์ชั่น
Franco

ขอบคุณ cybmeta! ฉันใช้เทคนิคนี้เพื่อเปลี่ยนข้อความหลักด้วยปลั๊กอินที่ฉันเผยแพร่ใน repo ฉันให้เครดิตโพสต์นี้ในรหัส wordpress.org/plugins/…
John Dee
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.