Answers:
最佳实践取决于代码的放置位置。
OOP代码
使用$this->t()
。
如果您扩展了诸如控制器或插件之类的drupal基类$this->t()
,则开箱即用t()函数作为类方法提供,您应该使用它。这使您的代码可测试。
对于大多数任务,您会找到一个合适的drupal类,从该类中可以扩展$this->t()
定义的类,但是如果您需要从头开始构建自己的类,则最佳实践是使用字符串翻译特性并将其作为服务注入(如果您在服务上下文:
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\Core\StringTranslation\TranslationInterface;
class MyClass {
use StringTranslationTrait;
/**
* Constructs a MyClass object.
*
* @param \Drupal\Core\StringTranslation\TranslationInterface $string_translation
* The string translation service.
*/
public function __construct(TranslationInterface $string_translation) {
// You can skip injecting this service, the trait will fall back to \Drupal::translation()
// but it is recommended to do so, for easier testability,
$this->stringTranslation = $string_translation;
}
/**
* Does something.
*/
public function doSth() {
// ...
$string = $this->t('Something');
// ...
}
}
资料来源:https : //www.drupal.org/docs/8/api/translation-api-code-text
程序代码
使用t()
。
如果您具有过程代码(例如,钩子),请使用t()
,它是全局函数。
最佳实践不是使用t()
OOP代码中的程序。
$this->t()
了许多开箱即用的基类,有超过一百个核心类。仅当您不从这些类之一扩展时,才需要代码示例。
use StringTranslationTrait;
在课堂上需要这个?
$this->setStringTranslation($string_translation);
最佳实践是使用$ this-> t(),而不是t()。模块的用法不会改变,但是,随着Drupal 8的出现,我们现在已经将PHPUnit测试内置到核心中。PHPUnit测试允许编写测试以确认一切正常,因此,只要更改代码,就可以运行测试以确保没有损坏。与此相关的是,PHPUnit测试仅针对单个类(也称为单元)进行测试,这意味着这些测试不会引导内核。因此,不存在诸如t()之类的全局函数,它们会引发错误,从而阻止运行测试。
如果您从不创建任何单元测试,那么您将永远不会看到使用t()和$ this-> t()之间的区别,但是创建测试也是一种最佳做法,因此,如果您确实想做正确的事情,您应该使用$ this-> t(),并为每个类创建单元测试。
*编辑*
阅读4k4的帖子后进行更新。
我在上面的评论仅涉及OOP代码,而不涉及过程代码。程序代码未经单元测试,也没有$ this构造函数。在过程代码中,t()是正确的。
string_translation
服务。