Answers:
确切地说,您的问题是:内部实现没有区别。
但作为最佳实践,应尽可能使用$this->t
而不是全局t
变量。如果您检查该函数,t
则返回一个新的TranslateableMarkup对象。
如果您的类说的$this->t
是未定义的,则可以添加StringTranslationTrait来添加行为或将其作为依赖项注入。
使用此特征将向类添加t()和formatPlural()方法。这些必须用于每个可翻译字符串,类似于程序代码必须使用全局函数t()和\ Drupal :: translation()-> formatPlural()的方式。这允许字符串提取器工具查找可翻译的字符串。
如果该类能够从容器中注入服务,则应注入“ string_translation”服务并将其分配给$ this-> stringTranslation。
因此,作为最佳实践规则,除非完全无法避免(例如,本机PHP函数),否则通常不希望在OOP中混合过程。
t()的文档指出:
如果可能,请使用
\Drupal\Core\StringTranslation\StringTranslationTrait::t()
。否则,\Drupal\Core\StringTranslation\TranslatableMarkup
直接创建一个新对象。
它没有解释造成这种情况的原因,但是,如果您查看文档页面上的注释,它将为您提供使用该trait方法或该类的原因。
可以使用不带自举核心的PHPUnit单独测试类,但是该
t()
功能仅在自举核心时可用。
使用$this->t()
和StringTranslationTrait
允许模拟翻译,因此可以使用PHPUnit单独测试该类。