В чем разница между использованием $ this-> t ('text') и t ('text') в блочном плагине

7

Я заметил во многих руководствах по созданию блочных плагинов,

$this->t('text')

используется для создания переводимого текста, особенно в функции блочной формы. Однако используя

t('text') 

не выдает никаких ошибок. Есть ли разница между использованием любого из них? А если нет, что лучше?

Matt
источник

Ответы:

6

Если быть точным по вашему вопросу: нет разницы во внутренней реализации.

Но, как лучшая практика , вы должны использовать $this->tвместо глобальных tвезде, где это возможно. Если вы проверите функцию, tвозвращает новый объект TranslateableMarkup .

Если ваш класс говорит, что $this->tон не определен, вы можете добавить StringTranslationTrait, чтобы добавить поведение или внедрить его как зависимость.

Использование этой черты добавит в класс методы t () и formatPlural (). Они должны использоваться для каждой переводимой строки, подобно тому, как процедурный код должен использовать глобальные функции t () и \ Drupal :: translation () -> formatPlural (). Это позволяет инструментам извлечения строк находить переводимые строки.

Если класс способен внедрять сервисы из контейнера, он должен внедрить сервис 'string_translation' и назначить его для $ this-> stringTranslation.

Так что, как правило, вы не хотите смешивать процедурный процесс внутри ООП, если это совершенно не неизбежно (например, функции PHP).

Kevin
источник
4

Документация для t () гласит:

По возможности используйте \Drupal\Core\StringTranslation\StringTranslationTrait::t(). В противном случае создайте новый \Drupal\Core\StringTranslation\TranslatableMarkupобъект напрямую.

Это не объясняет причину этого, но если вы посмотрите на комментарий на странице документации , это даст вам причину для использования этого метода или этого класса.

Классы могут тестироваться индивидуально с помощью PHPUnit, который работает без начальной загрузки ядра, но t()функция доступна только при начальной загрузке ядра.
Использование $this->t()и StringTranslationTraitпозволяет высмеивать перевод, поэтому класс можно тестировать изолированно с помощью PHPUnit.

киамлалуно
источник