Eu prefiro usar StringTranslationTrait: t porque é mais fácil zombar do string_translationserviço.
Mckcliffe
Respostas:
24
A melhor prática depende de onde o código é colocado.
Código OOP
Use $this->t().
Se você estender uma classe base drupal como um controlador ou um plug-in, a função t () é fornecida como método de classe imediatamente $this->t()e você deve usá-la. Isso torna seu código testável.
Para a maioria das tarefas, você encontrará uma classe drupal adequada para estender a partir da qual foi $this->t()definida, mas se precisar criar sua própria classe a partir do zero, a melhor prática seria usar o recurso de conversão de string e injetar isso como serviço se você usar essa classe em um contexto de serviço:
useDrupal\Core\StringTranslation\StringTranslationTrait;useDrupal\Core\StringTranslation\TranslationInterface;classMyClass{useStringTranslationTrait;/**
* Constructs a MyClass object.
*
* @param \Drupal\Core\StringTranslation\TranslationInterface $string_translation
* The string translation service.
*/publicfunction __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.
*/publicfunction doSth(){// ...
$string = $this->t('Something');// ...}}
Observe que, estendendo alguns tipos de classes, por exemplo, estendendo ControllerBase ao criar um controlador, $ this-> t () já é fornecido sem a necessidade de usar o StringTranslationTrait.
Jaypan
Sim, existem muitas classes básicas que são fornecidas prontas $this->t()para uso, existem mais de cem no núcleo. O exemplo de código é necessário apenas se você não estender de uma dessas classes.
4k4 5/01
E o caso quando desenvolvemos o comando drush? Devemos usar StringTranslationTrait ou drush função específica dt ()?
187188 #
Essa é uma ótima explicação. Por que precisamos disso use StringTranslationTrait;dentro da sala de aula?
David David
É melhor usar$this->setStringTranslation($string_translation);
MPP
4
A melhor prática é usar $ this-> t (), em vez de t (). O uso do módulo não será alterado, no entanto, com o advento do Drupal 8, agora temos o teste do PHPUnit incorporado ao núcleo. O teste do PHPUnit permite que testes sejam gravados para confirmar que tudo funciona, para que, a qualquer momento que o código seja alterado, os testes possam ser executados para garantir que nada tenha sido quebrado. A relevância disso é que o teste do PHPUnit testa apenas uma classe (unidade), o que significa que o núcleo não é inicializado para esses testes. Portanto, funções globais como t () não existem e geram um erro, impedindo a execução dos testes.
Se você nunca criar testes de unidade, nunca verá a diferença entre usar t () e $ this-> t (); no entanto, criar testes também é uma prática recomendada e, portanto, se você realmente deseja fazer as coisas corretamente, você deve usar $ this-> t () e criar testes de unidade para cada uma de suas classes.
* Editar *
Atualizando depois de ler a postagem de 4k4.
Meus comentários acima referem-se apenas ao código OOP, não ao código processual. O código de procedimento não é testado por unidade, nem possui o construtor $ this. No código processual, t () está correto.
string_translation
serviço.Respostas:
A melhor prática depende de onde o código é colocado.
Código OOP
Use
$this->t()
.Se você estender uma classe base drupal como um controlador ou um plug-in, a função t () é fornecida como método de classe imediatamente
$this->t()
e você deve usá-la. Isso torna seu código testável.Para a maioria das tarefas, você encontrará uma classe drupal adequada para estender a partir da qual foi
$this->t()
definida, mas se precisar criar sua própria classe a partir do zero, a melhor prática seria usar o recurso de conversão de string e injetar isso como serviço se você usar essa classe em um contexto de serviço:Fonte: https://www.drupal.org/docs/8/api/translation-api-code-text
Código processual
Use
t()
.Se você tiver um código de procedimento, por exemplo, um gancho, use
t()
, que é uma função global.A melhor prática não seria usar o procedimento
t()
no Código OOP.fonte
$this->t()
para uso, existem mais de cem no núcleo. O exemplo de código é necessário apenas se você não estender de uma dessas classes.use StringTranslationTrait;
dentro da sala de aula?$this->setStringTranslation($string_translation);
A melhor prática é usar $ this-> t (), em vez de t (). O uso do módulo não será alterado, no entanto, com o advento do Drupal 8, agora temos o teste do PHPUnit incorporado ao núcleo. O teste do PHPUnit permite que testes sejam gravados para confirmar que tudo funciona, para que, a qualquer momento que o código seja alterado, os testes possam ser executados para garantir que nada tenha sido quebrado. A relevância disso é que o teste do PHPUnit testa apenas uma classe (unidade), o que significa que o núcleo não é inicializado para esses testes. Portanto, funções globais como t () não existem e geram um erro, impedindo a execução dos testes.
Se você nunca criar testes de unidade, nunca verá a diferença entre usar t () e $ this-> t (); no entanto, criar testes também é uma prática recomendada e, portanto, se você realmente deseja fazer as coisas corretamente, você deve usar $ this-> t () e criar testes de unidade para cada uma de suas classes.
* Editar *
Atualizando depois de ler a postagem de 4k4.
Meus comentários acima referem-se apenas ao código OOP, não ao código processual. O código de procedimento não é testado por unidade, nem possui o construtor $ this. No código processual, t () está correto.
fonte