在块插件中使用$ this-> t('text')和t('text')有什么区别


7

我在许多教程中注意到了构建块插件的过程,

$this->t('text')

用于创建可翻译文本,尤其是在块形式函数中。但是使用

t('text') 

不会产生任何错误。使用这两种方法之间有什么区别吗?如果没有,最佳实践是什么?


Answers:


6

确切地说,您的问题是:内部实现没有区别

但作为最佳实践,应尽可能使用$this->t而不是全局t变量。如果您检查该函数,t则返回一个新的TranslateableMarkup对象

如果您的类说的$this->t是未定义的,则可以添加StringTranslationTrait来添加行为或将其作为依赖项注入。

使用此特征将向类添加t()和formatPlural()方法。这些必须用于每个可翻译字符串,类似于程序代码必须使用全局函数t()和\ Drupal :: translation()-> formatPlural()的方式。这允许字符串提取器工具查找可翻译的字符串。

如果该类能够从容器中注入服务,则应注入“ string_translation”服务并将其分配给$ this-> stringTranslation。

因此,作为最佳实践规则,除非完全无法避免(例如,本机PHP函数),否则通常不希望在OOP中混合过程。


4

t()的文档指出:

如果可能,请使用\Drupal\Core\StringTranslation\StringTranslationTrait::t()。否则,\Drupal\Core\StringTranslation\TranslatableMarkup直接创建一个新对象。

它没有解释造成这种情况的原因,但是,如果您查看文档页面的注释,它将为您提供使用该trait方法或该类的原因。

可以使用不带自举核心的PHPUnit单独测试类,但是该t()功能仅在自举核心时可用。
使用$this->t()StringTranslationTrait允许模拟翻译,因此可以使用PHPUnit单独测试该类。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.