แทนที่การแปลธีมหลักในธีมลูก


12

ฉันมีธีมหลักที่ใช้อย่างถูกต้องload_theme_textdomain()เพื่อโหลดสตริงที่แปลทั้งหมดในหลายภาษา

จากนั้นฉันสร้างธีมลูกที่ใช้load_child_theme_textdomain()เพื่อให้ได้สิ่งเดียวกันสำหรับสตริง

มีสตริงที่แปลแล้วสำหรับภาษาหนึ่ง ๆ ในธีมหลักที่ฉันต้องการแทนที่ / ลบล้างในธีมลูก

ฉันรู้ว่าพวกเขาอยู่ในไฟล์เทมเพลตฉันสามารถแทนที่ไฟล์และเปลี่ยน textdomain สำหรับสตริงเหล่านั้นได้ แต่น่าเสียดายที่ไฟล์ที่ฉันพูดถึงนั้นถูกใช้ในหลาย ๆ ที่และในแดชบอร์ด (ดังนั้นภายในฟังก์ชันตัวกรอง / การกระทำ )

ดังนั้นคำถามของฉันคือ: มีวิธีการแทนที่สตริงที่แปลแล้วภายในธีมลูกโดยไม่ต้องแทนที่แม่แบบไฟล์หรือฟังก์ชั่นหรือไม่?

ฉันไม่รู้ว่าอาจเพิ่มไฟล์parent-theme.moในโฟลเดอร์ภาษาของชุดรูปแบบลูกด้วยการแปลเฉพาะสตริงเหล่านั้นหรืออะไรทำนองนั้น

คำตอบ:


9

ฉันคิดว่าฉันพบวิธีแก้ปัญหา แต่ก่อนหน้าเล็กน้อย

หลักฐาน

load_theme_textdomain()และload_child_theme_textdomain()โดยทั่วไปแล้วมีความแตกต่างเพียงอย่างเดียวคือเส้นทางเริ่มต้นที่ใช้:

  • พวกเขาได้รับภาษาปัจจุบัน (โดยใช้get_locale()) และเพิ่มไฟล์. mo แบบสัมพัทธ์ลงในพา ธ ที่ส่งเป็นอาร์กิวเมนต์
  • จากนั้นพวกเขาเรียกload_textdomain()ผ่านเป็นอาร์กิวเมนต์ทั้ง textdomain และเส้นทางผลลัพธ์ไปยังไฟล์. mo

จากนั้นload_textdomainโหลดไฟล์. mo ลงในตัวแปรโดเมนข้อความทั่วโลก แต่อย่างที่เราสามารถอ่านได้จากแหล่งที่มา :

หากโดเมนมีอยู่แล้วการแปลจะถูกรวมเข้าด้วยกัน

หากทั้งสองชุดมีสตริงเดียวกันการแปลจากค่าดั้งเดิมจะถูกนำมาใช้

ดังนั้นเพื่อแทนที่ / แทนที่เฉพาะสตริงของธีมพาเรนต์ที่เราต้องการเราต้องโหลดไฟล์. mo แบบกำหนดเองสำหรับเทมเพลตโดเมนหลักที่มีเพียงการแปลสตริงเหล่านั้นก่อนที่ธีมหลักจะโหลดไฟล์. mo


วิธีการแก้

ในที่สุดฉันก็สร้างโฟลเดอร์ที่มีชื่อของชุดรูปแบบหลัก (เพียงเพื่อความสะดวก) ในโฟลเดอร์ภาษาชุดรูปแบบของเด็กและวางไว้ในนั้นไฟล์. mo ที่กำหนดเองของฉันสำหรับผู้ปกครอง textdomain (หนึ่งสำหรับภาษาในxx_XX.moรูปแบบxx_XXรหัสภาษาอยู่ที่ไหน)

จากนั้นฉันเพิ่มบรรทัดในfunctions.phpไฟล์ชุดรูปแบบลูกของฉันระหว่างการafter_setup_themeดำเนินการใกล้กับบรรทัดที่โหลดไฟล์. mo สำหรับ textdomain ชุดรูปแบบลูกของฉัน:

add_action( 'after_setup_theme', function () {
    // load custom translation file for the parent theme
    load_theme_textdomain( 'parent-textdomain', get_stylesheet_directory() . '/languages/parent-theme' );
    // load translation file for the child theme
    load_child_theme_textdomain( 'my-child-theme', get_stylesheet_directory() . '/languages' );
} );

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


หมายเหตุ:ฉันสามารถใช้load_child_theme_textdomainแทนได้load_theme_textdomainดังที่กล่าวไว้ในหลักฐานว่าคงเหมือนเดิม


4

คุณสามารถใช้ไฟล์ภาษาที่อยู่ในโฟลเดอร์ชุดรูปแบบลูกของคุณ ก่อนอื่นคุณต้องรู้ว่าโดเมนข้อความใดที่ธีมหลักใช้อยู่ จากนั้นสร้างไฟล์. po และ. mo ด้วยภาษาของคุณเป็นชื่อไฟล์เท่านั้น (เช่น de_DE.po / de_DE.mo หรือ nl_NL.po / nl_NL.mo) และวางไว้ในโฟลเดอร์ภายในไดเรกทอรีธีมลูกของคุณ "languages" ตัวอย่างเช่น.

จากนั้นคุณสามารถเริ่มต้นโดเมนข้อความด้วยload_child_theme_textdomain():

load_child_theme_textdomain( 'the_text_domain', get_stylesheet_directory() . '/languages/' );

โปรดทราบว่าคุณสามารถค้นหาโดเมนข้อความโดยค้นหาการเรียกใช้ฟังก์ชันเช่น__()หรือ_e()ภายในไฟล์ PHP ของธีมหลัก พารามิเตอร์ที่สองคือโดเมนข้อความ:__( 'Translated text string', 'text_domain' );


ขอบคุณ @redelschaap ในที่สุดคุณแก้ปัญหาจะทำงานตราบใดที่คุณใช้โฟลเดอร์ที่แตกต่างกันสำหรับโดเมนข้อความแม่จากที่คุณใช้สำหรับโดเมนข้อความเด็ก: นั่นคือการจับ! :)
d79

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

0

อัปเดต 2019 สำหรับ Wordpress 5.0.1

  1. ไฟล์จะต้องไม่มีแม่หรือลูกกระสุนในพวกเขา ตัวอย่างเช่นการให้การแปลภาษาเม็กซิกันภาษาสเปนควรมีไฟล์ child-theme-name / languages ​​/ es_MX.po และ /child-theme-name/languages/es_MX.mo
  2. ฟังก์ชั่นธีมลูกฟังก์ชั่น php ควรมีรหัสต่อไปนี้ ขอให้สังเกตว่าฟังก์ชั่น load_child_theme_textdomain () พารามิเตอร์ตัวแรกคือกระสุนธีม PARENT ไม่ใช่ของเด็ก:
function child_theme_slug_setup() {
    load_child_theme_textdomain( 'parent-theme-slug', get_stylesheet_directory() . '/languages' );
}
add_action( 'after_setup_theme', 'child_theme_slug_setup' );
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.