Truyền các biến có chứa HTML thông qua hàm t () -! giữ chỗ đã bị xóa


9

Trong Drupal 8, có vẻ như sử dụng! (dấu chấm than) giữ chỗ với hàm t () đã bị xóa.

Tôi có một biến chứa HTML:

<span class="fullname_wrapper"><span class="first_name">John</span> <span class="last_name">Hancock</span> <span class="account_name_wrapper">(@JohnH)</span></span>

Tôi muốn giữ HTML này, vì nó sẽ được tạo kiểu cụ thể ở bất cứ nơi nào nó xuất hiện trên trang web.

Trong Drupal 7, tôi đã có thể làm điều này:

t('Your name is !name', array('!name' => $name));

Trong đó $ name chứa HTML được hiển thị ở trên. Tuy nhiên, trong Drupal 8, điều này không hoạt động vì dấu giữ dấu chấm qua dấu chấm than đã bị xóa.

Tôi đã thử điều này:

t('Your name is :name', array(':name' => $name));

Nhưng HTML vẫn thoát.

Dấu @ cũng thoát khỏi HTML.

Có ai biết làm thế nào HTML có thể được chuyển qua hàm t () trong D8 không?

CẬP NHẬT:

Theo nhận xét của No Sssweat, có vẻ như là của tôi! đánh dấu dường như làm việc trong t (). Vì vậy, đây là mã thực tế của tôi:

drupal_set_message(
  $this->t(
    "@amount has been transferred to !account",
    array(
      '@amount' => '¥' . $form_state->getValue('amount'),
      '!account' => $this->accountService->formatAccountName($account)
    )
  )
);

Và tôi nhận được ngăn xếp lỗi này:

User error: Invalid placeholder (!account) in string: @amount has been transferred to !account in Drupal\Component\Render\FormattableMarkup::placeholderFormat() (line 235 of core/lib/Drupal/Component/Render/FormattableMarkup.php).

Drupal\Component\Render\FormattableMarkup::placeholderFormat('@amount has been transferred to !user', Array) (Line: 204)
Drupal\Core\StringTranslation\TranslatableMarkup->render() (Line: 15)
Drupal\Core\StringTranslation\TranslatableMarkup->__toString() (Line: 451)
drupal_set_message(Object) (Line: 128)

Lỗi người dùng là những gì làm tôi nghĩ rằng! đánh dấu là không được phép, nhưng tôi phải chẩn đoán sai nó. Có ai biết những gì đang xảy ra ở đây?


1
Trong D8, thử nghiệm với khối Devel Execude PHP $test = "<b>test</b>"; drupal_set_message(t('Something !var just happened.', array('!var' => $test)), 'warning'); tôi nhận được thông báo cảnh báo, từ này testđược in đậm và không thoát. Do đó, sử dụng !dường như hoạt động tốt trong D8.
Không có Sssweat


1
Cảm ơn, tôi đã cập nhật bài viết gốc với mã thực tế của mình và thông báo lỗi tôi đang thấy.
Jaypan

1
thử sử dụng '!account' => '<b>test</b>'cho mục đích thử nghiệm. Xem nếu bạn vẫn nhận được lỗi đó. Nguyên nhân có lẽ $this->accountService->formatAccountName($account)không phải là một mã hợp lệ. Ngoài ra, lưu ý về thông báo thử nghiệm của tôi , tôi không sử dụng$this->t(
Không có Sssweat

2
Đây không phải là chèn HTML vào hệ thống dịch thuật - chuỗi là "@amount đã được chuyển sang @account" - không có HTML nào trong đó.
Jaypan

Câu trả lời:


23

Dường như mọi đối số được truyền cho hàm t () đều được thoát trừ khi chúng thực hiện MarkupInterface . Vì vậy, bạn cần phải đại diện cho tên như là một đối tượng.

use Drupal\Component\Render\FormattableMarkup;

$formatted_name = new FormattableMarkup(
  '<span class="fullname-wrapper">
    <span class="first-name">@first_name</span>
    <span class="last-name">@second_name</span>
    <span class="account-name-wrapper">(@user_name)</span>
   </span>',
  [
    '@first_name' => 'John',
    '@second_name' => 'Hancock',
    '@user_name' => '@JohnH',
  ]
);

drupal_set_message(t('Your name is @name', ['@name' => $formatted_name]));

1
Cảm ơn bạn, đó chính xác là những gì tôi cần. Nó hoạt động hoàn hảo.
Jaypan

2
Tôi nghĩ rằng đó là thực tế xấu để sử dụng chức năng t như vậy.
Mắt

4
Không, đó chính xác là cách sử dụng chức năng t () (Tôi đã sử dụng Drupal kể từ D5).
Jaypan

2
@Eyal Tại sao bạn nghĩ rằng đó là thực hành xấu? Nó đang được sử dụng để dịch '@amount has been transferred to @account'là một chuỗi bình thường với trình giữ chỗ. Bạn không sử dụng t()như trong $amount . t(' has been transferred to ') . $account. Đó là thực hành xấu.
kiamlaluno

1
SQL tiêm, đó là lý do! giữ chỗ đã bị hủy trong D8
Eyal

5

Có, lỗi người dùng bạn đang thấy có nghĩa là trình giữ chỗ bạn đang sử dụng không được nhận ra t(). FormattableMarkup::placeholderFormat(), phương thức thực hiện công việc đằng sau hiện trường, chỉ nhận ra 3 loại giữ chỗ: @variable , % biến: biến . Nếu trình giữ chỗ bắt đầu bằng một ký tự khác, nó sẽ thực thi đoạn mã sau, điều này gây ra hành vi bạn đang thấy.

  default:
    // We do not trigger an error for placeholder that start with an
    // alphabetic character.
    // @todo https://www.drupal.org/node/2807743 Change to an exception
    //   and always throw regardless of the first character.
    if (!ctype_alpha($key[0])) {
      // We trigger an error as we may want to introduce new placeholders
      // in the future without breaking backward compatibility.
      trigger_error('Invalid placeholder (' . $key . ') in string: ' . $string, E_USER_ERROR);
    }
    elseif (strpos($string, $key) !== FALSE) {
      trigger_error('Invalid placeholder (' . $key . ') in string: ' . $string, E_USER_DEPRECATED);
    }
    // No replacement possible therefore we can discard the argument.
    unset($args[$key]);
    break;

Mô tả cho @variable nói rằng giá trị của biến có thể là:

Trong trường hợp của bạn, tôi sẽ chỉ sử dụng mã sau đây.

use Drupal\Component\Render\FormattableMarkup;

drupal_set_message(
  $this->t(
    "@amount has been transferred to @account",
    [
      '@amount' => '¥' . $form_state->getValue('amount'),
      '@account' => new FormattableMarkup($this->accountService->formatAccountName($account), [])
    ]
  )
);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.