Prefiero usar StringTranslationTrait: t porque es más fácil burlarse del string_translationservicio.
mradcliffe
Respuestas:
24
La mejor práctica depende de dónde se coloca el código.
Código OOP
Uso $this->t().
Si extiende una clase base de drupal como un controlador o un complemento, la función t () se proporciona como método de clase $this->t()fuera de la caja y debe usarla. Esto hace que su código sea comprobable.
Para la mayoría de las tareas, encontrará una clase de drupal adecuada para extender desde la que se ha $this->t()definido, pero si necesita construir su propia clase desde cero, la mejor práctica sería usar el rasgo de traducción de cadena e inyectarlo como servicio si usa esta clase en un contexto de servicio:
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');// ...}}
Tenga en cuenta que al extender algunos tipos de clases, por ejemplo, extender ControllerBase al crear un controlador, $ this-> t () ya se proporciona sin necesidad de usar StringTranslationTrait.
Jaypan
Sí, hay muchas clases base que proporcionan $this->t()de fábrica, hay más de cien en el núcleo. El ejemplo de código solo es necesario si no se extiende desde una de estas clases.
4k4
¿Y qué pasa con el caso cuando desarrollamos un comando drush? ¿Deberíamos usar StringTranslationTrait o drush una función específica dt ()?
Артем Ильин
Esa es una gran explicación. ¿Por qué necesitamos esto use StringTranslationTrait;dentro de la clase?
David
Es mejor usar$this->setStringTranslation($string_translation);
mpp
4
La mejor práctica es usar $ this-> t (), en lugar de t (). El uso del módulo no cambiará, sin embargo, con la llegada de Drupal 8, ahora tenemos pruebas PHPUnit integradas en el núcleo. Las pruebas de PHPUnit permiten que se escriban pruebas para confirmar que todo funciona, de modo que cada vez que se cambia el código, las pruebas se pueden ejecutar para garantizar que no se haya roto nada. La relevancia de esto es que las pruebas de prueba de PHPUnit solo se realizan contra una sola clase (también conocida como una unidad), lo que significa que el núcleo no se inicia para estas pruebas. Por lo tanto, las funciones globales como t () no existen, y arrojarán un error, evitando que se ejecuten las pruebas.
Si nunca crea pruebas unitarias, nunca verá la diferencia entre usar t () y $ this-> t (), sin embargo, crear pruebas también es una práctica recomendada y, por lo tanto, si realmente quiere hacer las cosas bien, deberías usar $ this-> t () y crear pruebas de Unidad para cada una de tus clases.
* Editar *
Actualización después de leer la publicación de 4k4.
Mis comentarios anteriores solo se refieren al código OOP, no al código de procedimiento. El código de procedimiento no se prueba unitariamente, ni tiene el constructor $ this. En el código de procedimiento, t () es correcto.
string_translation
servicio.Respuestas:
La mejor práctica depende de dónde se coloca el código.
Código OOP
Uso
$this->t()
.Si extiende una clase base de drupal como un controlador o un complemento, la función t () se proporciona como método de clase
$this->t()
fuera de la caja y debe usarla. Esto hace que su código sea comprobable.Para la mayoría de las tareas, encontrará una clase de drupal adecuada para extender desde la que se ha
$this->t()
definido, pero si necesita construir su propia clase desde cero, la mejor práctica sería usar el rasgo de traducción de cadena e inyectarlo como servicio si usa esta clase en un contexto de servicio:Fuente: https://www.drupal.org/docs/8/api/translation-api-code-text
Código de procedimiento
Uso
t()
.Si tiene un código de procedimiento, por ejemplo, un enlace, use
t()
, que es una función global.La mejor práctica no sería utilizar el procedimiento
t()
en el Código OOP.fuente
$this->t()
de fábrica, hay más de cien en el núcleo. El ejemplo de código solo es necesario si no se extiende desde una de estas clases.use StringTranslationTrait;
dentro de la clase?$this->setStringTranslation($string_translation);
La mejor práctica es usar $ this-> t (), en lugar de t (). El uso del módulo no cambiará, sin embargo, con la llegada de Drupal 8, ahora tenemos pruebas PHPUnit integradas en el núcleo. Las pruebas de PHPUnit permiten que se escriban pruebas para confirmar que todo funciona, de modo que cada vez que se cambia el código, las pruebas se pueden ejecutar para garantizar que no se haya roto nada. La relevancia de esto es que las pruebas de prueba de PHPUnit solo se realizan contra una sola clase (también conocida como una unidad), lo que significa que el núcleo no se inicia para estas pruebas. Por lo tanto, las funciones globales como t () no existen, y arrojarán un error, evitando que se ejecuten las pruebas.
Si nunca crea pruebas unitarias, nunca verá la diferencia entre usar t () y $ this-> t (), sin embargo, crear pruebas también es una práctica recomendada y, por lo tanto, si realmente quiere hacer las cosas bien, deberías usar $ this-> t () y crear pruebas de Unidad para cada una de tus clases.
* Editar *
Actualización después de leer la publicación de 4k4.
Mis comentarios anteriores solo se refieren al código OOP, no al código de procedimiento. El código de procedimiento no se prueba unitariamente, ni tiene el constructor $ this. En el código de procedimiento, t () es correcto.
fuente