Score:0

จะเปลี่ยนชื่อหน้า "สร้าง X" เป็น "เพิ่ม X" สำหรับ X ทั้งหมดได้อย่างไร

ธง kz

ใน Drupal 7 มี drupal_get_title()และ drupal_set_title(). พวกเขากำลัง ประวัติศาสตร์.

ฉันต้องการเปลี่ยนชื่อเพจ "สร้าง X" เป็น "เพิ่ม X" สำหรับ X ทั้งหมด และฉันคิดว่า hook_preprocess_page_title() ใน .theme-file ของฉันเป็นที่ที่เหมาะสมที่จะทำ (ถ้าคุณไม่เห็นด้วยโปรดพูดอย่างนั้น)

เช่น. ฉันต้องการให้เป็น 'เพิ่ม X' สำหรับ 'X' ใด ๆ เมื่อเดิมเป็น 'สร้าง X' ตัวอย่างเช่น: 'สร้างบทความ' ควรกลายเป็น 'เพิ่มบทความ' และถ้าชื่อเรื่องเป็น 'Bar Article' ฉันควรจะปล่อยไว้ตามที่เป็นอยู่

โดยพื้นฐานแล้ว ฉันต้องการดมกลิ่นของชื่อเรื่องและถ้ามันขึ้นต้นด้วย 'สร้าง' ให้เปลี่ยนเป็น 'เพิ่ม' จนถึงตอนนี้ฉันได้รับแล้ว และเห็นได้ชัดว่ามันไม่สมบูรณ์:

/**
 * ใช้ hook_preprocess_page_title()
 */

ความพยายามครั้งแรก:

ฟังก์ชัน mytheme_preprocess_page_title(&$ตัวแปร) {
  $request = \Drupal::request();
  $route_match = \Drupal::routeMatch();
  $title = \Drupal::service('title_resolver')->getTitle($request, $route_match->getRouteObject());
}

ความพยายามครั้งที่สอง ตามคำแนะนำของ 4k4:

ฟังก์ชัน mytheme_preprocess_page_title(&$ตัวแปร) {
  $title = $ตัวแปร['ชื่อเรื่อง'];
  ถ้า (อินสแตนซ์ชื่อ $ ของ TranslatableMarkup) {
    $title = $title->getUntranslatedString();
    $title = str_replace('สร้าง', 'เพิ่ม', $title);
    $variables['title'] = t($title);
  }
  อื่น {
    $variables['title'] = Markup::create(str_replace('Create', 'Add', $title));
  }  
}

ชื่อเรื่องที่ฉันต้องการเปลี่ยนมาจาก Drupal core และสามารถแปลได้ ดังนั้นมันจึงเป็น ตัวอย่าง TranslatableMarkup สาขาที่ถูกดำเนินการ แต่ฉันเห็นด้วยกับการมีทางเลือกในกรณีที่ไม่ใช่เป็นความคิดที่ดี

อย่างไรก็ตาม แม้จะเป็นการเริ่มต้นที่ดี แต่นี่ไม่ใช่วิธีแก้ปัญหาที่สมบูรณ์ มันเปลี่ยนชื่อที่แสดงของแบบฟอร์มเพิ่มบทความจาก "สร้างบทความ" เป็น "เพิ่ม @name"

ป้อนคำอธิบายรูปภาพที่นี่

ฉันได้โหวตคำตอบโดย 4k4 เนื่องจากมันไปไกลกว่าการแก้ปัญหามากกว่าความพยายามครั้งแรกของฉัน แต่ก็ยังไม่สมบูรณ์

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

No Sssweat avatar
ua flag
ยังไม่ทดสอบ แต่คุณสามารถลองแก้ไขได้โดยใช้ไฟล์เทมเพลต [page-title.html.twig](https://api.drupal.org/api/drupal/core%21modules%21system%21templates%21page-title.html.twig/8.2.x) เปลี่ยน `{{ ชื่อเรื่อง } }` ถึง `{{ ชื่อ|แทนที่({'สร้าง X': "เพิ่ม X"}) }}`
Free Radical avatar
kz flag
ขอบคุณ @NoSssweat! ใช่มันใช้งานได้ ฉันยังคงหวังว่าจะได้คำตอบที่อธิบายวิธีการทำใน PHP สิ่งนี้จะใช้ไม่ได้กับชื่อที่แปลแล้ว
No Sssweat avatar
ua flag
อืม ลอง `|replace({'Create X'|t: "Add X"|t})`
Score:1
ธง cn

ฉันต้องการเปลี่ยนชื่อหน้า "สร้าง X" เป็น "เพิ่ม X" สำหรับ X และ I ทั้งหมด คิดว่า hook_preprocess_page_title() ใน .theme-file ของฉันถูกต้อง สถานที่ที่จะทำ (ถ้าคุณไม่เห็นด้วยโปรดพูดอย่างนั้น)

คุณสามารถเปลี่ยนชื่อที่แสดงในแท็ก body เท่านั้น ไม่สามารถเปลี่ยนเมตาแท็กชื่อในแท็ก html

$title = \Drupal::service('title_resolver')->getTitle($request, $route_match->getRouteObject());

สิ่งนี้ทำให้คุณได้รับเฉพาะชื่อจากการกำหนดเส้นทางหรือการโทรกลับ ไม่ใช่ชื่อที่ตั้งโดย #ชื่อ ในเอาต์พุตที่เรนเดอร์

$title ไม่ใช่สตริง สตริงอยู่ที่ไหนสักแห่งในนั้น แต่ฉันจะทำอย่างไร แตกออกมาดูว่าขึ้นต้นด้วยอะไร?

มันเป็นวัตถุมาร์กอัป ทั้งแบบธรรมดาหรือแบบแปล ดู คุณจะแก้ไขเนื้อหาของอินสแตนซ์ Drupal\Core\Render\Markup ผ่านฟังก์ชันการประมวลผลล่วงหน้าใน Drupal 8 ได้อย่างไร หรือ ฉันจะเปลี่ยนข้อความบนปุ่มส่งในแบบฟอร์มโหนดได้อย่างไร

ฉันจะเปลี่ยนได้อย่างไรในบริบทของเบ็ดการประมวลผลล่วงหน้า เช่น. drupal_set_title() เทียบเท่ากับอะไรในบริบทนี้

ใน preprocess hook คุณสามารถเปลี่ยนตัวแปรที่เทมเพลตแสดงอยู่เท่านั้น ในกรณีนี้:

$variables['title'] = 'ชื่อเรื่อง';

หากมีมาร์กอัป HTML เพื่อหลีกเลี่ยงการหนีอัตโนมัติ:

$variables['title'] = \Drupal\Core\Render\Markup::create('<i>Foo</i> title');

ถ้าแปลได้:

$variables['title'] = t('ชื่อเรื่อง');

ตัวอย่างโค้ด:

ใช้ Drupal\Core\StringTranslation\TranslatableMarkup;
ใช้ Drupal\Core\Render\Markup;
    
/**
 * ใช้ hook_preprocess_page_title()
 */
ฟังก์ชัน mymodule_preprocess_page_title(&$ตัวแปร) {
  $title = $ตัวแปร['ชื่อเรื่อง'];
  ถ้า (อินสแตนซ์ชื่อ $ ของ TranslatableMarkup) {
    $title_untranslated = $title->getUntranslatedString();
    $title_replaced = str_replace('สร้าง', 'เพิ่ม', $title_untranslated);
    $variables['title'] = t($title_replaced, $title->getArguments());
  }
}

  
Free Radical avatar
kz flag
ฉันต้องการแปล อย่างไรก็ตาม ฉันไม่ต้องการให้ชื่อเป็น 'ชื่อ Foo' ฉันต้องการให้เป็น 'เพิ่ม X' สำหรับ 'X' ใดๆ เมื่อเดิมเป็น 'สร้าง X' (เช่น 'สร้างบทความ' ควรกลายเป็น 'เพิ่มบทความ' และหากชื่อเรื่องเป็น 'Bar Article' ฉันไม่ต้องการทำอะไรฉันจะตรวจสอบลิงก์ที่คุณให้ไว้อย่างละเอียดเกี่ยวกับมาร์กอัปออบเจกต์ แต่ฉันยังไม่ทราบว่าจะทราบได้อย่างไรว่าสตริงนั้นขึ้นต้นด้วย 'สร้าง' หรือไม่
4uk4 avatar
cn flag
ตกลง ดังนั้นคุณต้องการแทนที่เวอร์ชันต้นฉบับภาษาอังกฤษแล้วแปลเวอร์ชันที่ถูกแทนที่ สิ่งนี้ซับซ้อนกว่าเล็กน้อยเนื่องจากมาร์กอัปที่แปลได้ส่งคืนสตริงที่แปลแล้วเป็นสตริง และคุณต้องใช้วิธีการแทนการส่งไปยังสตริง ฉันเพิ่มตัวอย่างโค้ดพร้อมกับตัวเลือกสำรองสำหรับมาร์กอัปแบบธรรมดาซึ่งใช้ได้กับการแคสต์สตริง
4uk4 avatar
cn flag
ฉันได้เพิ่มอาร์กิวเมนต์ t() สำหรับตัวยึด นอกจากนี้ ฉันได้ลบทางเลือกสำรองออกเนื่องจากตัวแปรหัวเรื่องสามารถมีเนื้อหาที่แตกต่างกัน รวมถึงอาร์เรย์เรนเดอร์ทั้งหมดด้วย
Free Radical avatar
kz flag
ยอดเยี่ยม! ชาติที่แล้วทำงาน
4uk4 avatar
cn flag
BTW ภาพหน้าจอที่คุณเพิ่มคือเส้นทาง node.add คุณสามารถแทนที่การเรียกกลับชื่อนี้ในการกำหนดเส้นทางและใช้งานได้ใน breadcrumbs และเมตาแท็ก: https://api.drupal.org/api/drupal/core%21modules%21node%21src%21Controller%21NodeController.php/function/NodeController %3A%3AaddPageTitle/9.2.x
Free Radical avatar
kz flag
คำแนะนำของคุณมีค่ามาก แต่บางส่วนก็เกินหัวของฉัน คุณช่วยบอกฉันทีว่าคำนิยามเส้นทางของฉันอยู่ที่ใดและจะเปลี่ยนได้อย่างไร (หรือชี้ให้ฉันเห็นคำแนะนำที่เหมาะสม)
4uk4 avatar
cn flag
ดูตัวอย่าง (คุณต้องเปลี่ยนชื่อเส้นทางเท่านั้น): https://drupal.stackexchange.com/questions/217680/override-user-edit-page-title

โพสต์คำตอบ

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