Điểm:0

Làm cách nào để thay đổi tiêu đề trang "Tạo X" thành "Thêm X" cho tất cả X?

lá cờ kz

Trong Drupal 7, đã có drupal_get_title()drupal_set_title(). Họ là Môn lịch sử.

Tôi muốn thay đổi tiêu đề trang "Tạo X" thành "Thêm X" cho tất cả X và tôi nghĩ hook_pre process_page_title() trong tệp .theme của tôi là nơi thích hợp để làm điều đó. (Nếu bạn không đồng ý, xin vui lòng nói như vậy.)

I E. Tôi muốn nó là 'Thêm X' cho bất kỳ 'X' nào khi nó ban đầu là 'Tạo X'. Ví dụ: 'Tạo bài viết' sẽ trở thành 'Thêm bài viết'. Và nếu tiêu đề là 'Bài viết về quán bar', thì tôi nên để nguyên như vậy.

Về cơ bản, tôi muốn đánh hơi chuỗi tiêu đề và nếu nó bắt đầu bằng 'Tạo', hãy thay đổi nó thành 'Thêm'. Điều này cho đến nay tôi đã nhận được và điều này rõ ràng là chưa đầy đủ:

/**
 * Triển khai hook_pre process_page_title().
 */

Nỗ lực đầu tiên:

function mytheme_pre process_page_title(&$variables) {
  $request = \Drupal::request();
  $route_match = \Drupal::routeMatch();
  $title = \Drupal::service('title_resolver')->getTitle($request, $route_match->getRouteObject());
}

Lần thử thứ hai, dựa trên đề xuất của 4k4:

function mytheme_pre process_page_title(&$variables) {
  $title = $variables['title'];
  if ($title instanceof TranslatableMarkup) {
    $title = $title->getUntranslatedString();
    $title = str_replace('Tạo', 'Thêm', $title);
    $variables['title'] = t($title);
  }
  khác {
    $variables['title'] = Đánh dấu::create(str_replace('Tạo', 'Thêm', $title));
  }  
}

Các tiêu đề tôi muốn thay đổi đến từ lõi Drupal và chúng có thể dịch được, vì vậy đó là instanceof TranslatableMarkup nhánh được thực thi, nhưng tôi đồng ý với việc có một dự phòng trong trường hợp chúng không được thực thi, là một ý tưởng hay.

Tuy nhiên, trong khi một khởi đầu tốt, đây không phải là một giải pháp hoàn chỉnh. Nó thay đổi tiêu đề hiển thị của biểu mẫu thêm bài viết từ "Tạo bài viết" thành "Thêm @name".

nhập mô tả hình ảnh ở đây

Tôi đã nâng cao câu trả lời bằng 4k4, vì nó hướng tới một giải pháp xa hơn nhiều so với lần thử đầu tiên của tôi, nhưng nó vẫn chưa hoàn thành.

tôi không muốn sử dụng Ghi đè chuỗi module cho điều này vì một số lý do, chủ yếu là vì chủ đề này sẽ hoạt động trên các bản dịch mà không yêu cầu cấu hình bổ sung khi triển khai.

No Sssweat avatar
lá cờ ua
Chưa được kiểm tra, nhưng bạn có thể thử giải qua tệp mẫu. [page-title.html.twig](https://api.drupal.org/api/drupal/core%21modules%21system%21templates%21page-title.html.twig/8.2.x) thay đổi `{{ title } }` thành `{{ title|replace({'Tạo X': "Thêm X"}) }}`
Free Radical avatar
lá cờ kz
Cảm ơn @NoSssweat! Có nó hoạt động. Tôi vẫn hy vọng có câu trả lời giải thích cách thực hiện trong PHP. Điều này sẽ không hoạt động với các tiêu đề đã dịch.
No Sssweat avatar
lá cờ ua
Hmm thử `|replace({'Create X'|t: "Add X"|t})`
Điểm:1
lá cờ cn

Tôi muốn thay đổi tiêu đề trang "Tạo X" thành "Thêm X" cho tất cả X và tôi nghĩ rằng hook_pre process_page_title() trong tệp .theme của tôi là đúng nơi để làm điều đó. (Nếu bạn không đồng ý, xin vui lòng nói như vậy.)

Bạn chỉ có thể thay đổi tiêu đề được hiển thị trong thẻ body chứ không thể thay đổi thẻ meta tiêu đề trong thẻ html.

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

Điều này chỉ mang lại cho bạn tiêu đề từ định nghĩa tuyến đường hoặc gọi lại, không phải tiêu đề được đặt bởi #Tiêu đề trong đầu ra kết xuất.

$title không phải là một chuỗi. Chuỗi ở đâu đó trong đó, nhưng làm thế nào để tôi giải nén nó để xem những gì nó bắt đầu với?

Đó là một đối tượng đánh dấu. Hoặc là một cái đơn giản hoặc một cái có thể dịch được. Nhìn thấy Làm cách nào để bạn chỉnh sửa nội dung của phiên bản Drupal\Core\Render\Markup thông qua chức năng tiền xử lý trong Drupal 8? hoặc Làm cách nào để thay đổi văn bản trên nút gửi ở dạng nút?

Làm cách nào để tôi thực sự thay đổi nó trong ngữ cảnh của móc tiền xử lý. I E. tương đương với drupal_set_title() trong ngữ cảnh này là gì?

Trong hook tiền xử lý, bạn chỉ có thể thay đổi các biến mà mẫu đang hiển thị, trong trường hợp này:

$variables['title'] = 'Tiêu đề foo';

Nếu nó chứa đánh dấu HTML để tránh thoát tự động:

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

Nếu nó có thể dịch được:

$variables['title'] = t('Foo title');

Mã ví dụ:

sử dụng Drupal\Core\StringTranslation\TranslatableMarkup;
sử dụng Drupal\Core\Render\Markup;
    
/**
 * Triển khai hook_pre process_page_title().
 */
function mymodule_pre process_page_title(&$variables) {
  $title = $variables['title'];
  if ($title instanceof TranslatableMarkup) {
    $title_untranslated = $title->getUntranslatedString();
    $title_replaced = str_replace('Tạo', 'Thêm', $title_untranslated);
    $variables['title'] = t($title_replaced, $title->getArguments());
  }
}

  
Free Radical avatar
lá cờ kz
Tôi muốn nó có thể dịch được. Tuy nhiên, tôi không muốn tiêu đề là 'Tiêu đề Foo', tôi muốn nó là 'Thêm X' cho bất kỳ 'X' nào khi ban đầu là 'Tạo X'. (ví dụ: 'Tạo bài viết' sẽ trở thành 'Thêm bài viết'. Và nếu tiêu đề là 'Bài viết trên thanh', tôi không muốn làm gì cả.Tôi sẽ xem xét kỹ hơn các liên kết bạn cung cấp về các đối tượng đánh dấu, nhưng tôi vẫn chưa tìm ra cách tìm hiểu xem chuỗi có bắt đầu bằng 'Tạo' hay không.
4uk4 avatar
lá cờ cn
OK, vì vậy bạn muốn thay thế bản gốc tiếng Anh và sau đó dịch bản đã thay thế. Điều này phức tạp hơn một chút vì đánh dấu có thể dịch trả về dưới dạng chuỗi chuỗi đã được dịch và bạn phải sử dụng một phương thức thay vì truyền nó thành một chuỗi. Tôi thêm một ví dụ về mã, cùng với dự phòng cho đánh dấu đơn giản hoạt động với truyền chuỗi.
4uk4 avatar
lá cờ cn
Tôi đã thêm các đối số t() cho trình giữ chỗ. Ngoài ra, tôi đã xóa dự phòng vì biến tiêu đề có thể chứa nội dung khác, cũng như toàn bộ mảng kết xuất.
Free Radical avatar
lá cờ kz
Tuyệt quá! Hóa thân cuối cùng hoạt động.
4uk4 avatar
lá cờ cn
BTW, ảnh chụp màn hình bạn đã thêm là tuyến node.add. Bạn có thể thay thế lệnh gọi lại tiêu đề này trong định nghĩa tuyến đường và nó cũng hoạt động trong breadcrumbs và thẻ meta: https://api.drupal.org/api/drupal/core%21modules%21node%21src%21Controller%21NodeController.php/feft/NodeController %3A%3AaddPageTitle/9.2.x
Free Radical avatar
lá cờ kz
Hướng dẫn của bạn được đánh giá cao, nhưng một số trong số đó đi qua đầu tôi. Bạn có thể vui lòng cho tôi biết định nghĩa tuyến đường của tôi tồn tại ở đâu và cách thay đổi nó (hoặc chỉ cho tôi một hướng dẫn phù hợp).
4uk4 avatar
lá cờ cn
Xem ví dụ (bạn chỉ phải thay thế tên tuyến đường): https://drupal.stackexchange.com/questions/217680/override-user-edit-page-title

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.