Ist es immer schlecht, eine Variable durch t () zu übergeben?

14

Ich habe eine kleine Hilfsfunktion für mein hook_schema:

function _bbcmap_schema_asr_field($description) {
  return array(
    'type' => 'int',
    'unsigned' => TRUE,
    'size' => 'small', // Up to ~66k with MySQL (equivalent up to ~660.00 adjusted)
    'not null' => FALSE,
    'description' => t($description),
  );
}

Und dann kann ich so etwas benutzen:

/**
 * Implements hook_schema().
 */
function bbcmap_schema() {
  $schema['la_data'] = array(
    'fields' => array(
      ...
      'mort_asr_male' =>    _bbcmap_schema_asr_field('The age standardised mortality amongst men (fixed point with scale factor 1/100)'),
      'mort_asr_female' =>  _bbcmap_schema_asr_field('The age standardised mortality amongst women (fixed point with scale factor 1/100)'),
      'incid_asr_male' =>   _bbcmap_schema_asr_field('The age standardised incidence amongst men (fixed point with scale factor 1/100)'),
      'incid_asr_female' => _bbcmap_schema_asr_field('The age standardised incidence amongst women (fixed point with scale factor 1/100)'),
      ...
    ),
  );
}

Ich weiß, dass die Richtlinie keine Variablen durchlässt, t()aber dies scheint sehr ähnlich zu sein, wie das Menüsystem den Titel des Rückrufs durchlässt t()(standardmäßig). Irgendwelche Kommentare dazu, ob das ein guter oder ein schlechter Stil ist?

Andy
quelle

Antworten:

17

Das erste Argument von t()muss eine wörtliche Zeichenfolge sein, die Folgendes ausschließt:

  • Variablen, auch die Parameter einer Funktion: t($description)
  • eine Verkettung von Zeichenfolgen: t('If you want to add a link, click on' . '<a href="http://example.com">this link</a>.')
  • Der von einer Funktion zurückgegebene Wert:t(get_menu_description())
  • eine Konstante: t(MYMODULE_MY_WIDGET_TITLE),t(MyClass::WIDGET_TITLE)

Der Grund dafür ist , dass neben einigen spezifischen Haken (zB hook_menu(), hook_perm(), hook_permission()), die Zeichenfolge aus einem Skript, das den Code eines Moduls scannen gefunden zu übersetzen, für die Code - Suche wie t('This is an example.'); Wenn ein von der Laufzeit abhängiger Wert gefunden wird, z. B. der Wert einer Variablen, kann das Skript den zu übersetzenden String nicht verstehen, da eine Variable bei jeder Codeausführung einen anderen Wert enthalten kann. Tatsächlich meldet http://localize.drupal.org eine Warnung ähnlich der folgenden, falls das Argument für t()keine wörtliche Zeichenfolge ist:

Der erste Parameter t()sollte eine Literalzeichenfolge sein. Es sollten keine Variablen, Verkettungen, Konstanten oder andere nicht-wörtliche Zeichenfolgen vorhanden sein. At t($filter['name'])in customfilter / customfilter.module in Zeile 30.

Wenn Sie einen dynamischen Wert übergeben t(), extrahiert das Skript, das die zu übersetzenden Zeichenfolgen extrahiert, in diesem Fall keinen Wert. Der Effekt ist, dass das Argument, an das übergeben t()wird, nicht übersetzt wird. Dies hat den gleichen Effekt, t()dass die dynamische Ausgabe nicht direkt in der Benutzeroberfläche verwendet wird. Der einzige Fall, in dem die Zeichenfolge übersetzt wird, ist, wenn die dynamische Zeichenfolge der Literalzeichenfolge entspricht, an die eine Funktion übergeben wird t(). Angenommen, Sie haben eine Bibliothek, die nicht für Drupal gedacht ist und eine Funktion enthält, die den Namen des aktuellen Monats zurückgibt. Mit dem folgenden Code würde der von dieser Funktion zurückgegebene Wert übersetzt.

function mymodule_calendar_page_title() {
  return t(Calendar::getCurrentMonth());
}

function mymodule_calendar_translations() {
  $translations = array(
    t('January'),
    t('February'),
    t('March'),
    t('April'),
    t('May'),
    t('June'),
    t('July'),
    t('August'),
    t('September'),
    t('October'),
    t('November'),
    t('December'),
  );
}

mymodule_calendar_translations()muss nicht aufgerufen werden, noch einen Wert zurückgeben. Wenn der Code des Moduls analysiert wird, wird der Aufruf t()von über den Code gefunden, der nach Literalzeichenfolgen sucht, die an übergeben wurden t().

Das Übersetzen der angegebenen Beschreibung für eine Datenbanktabelle und ihre Felder ist dann nicht erforderlich, da dies bei keinem der Drupal-Kernmodule der Fall ist. Beispielsweise enthält node_schema () den folgenden Code:

function node_schema() {
  $schema['node'] = array(
    'description' => 'The base table for nodes.', 
    'fields' => array(
      'nid' => array(
        'description' => 'The primary identifier for a node.', 
        'type' => 'serial', 
        'unsigned' => TRUE, 
        'not null' => TRUE,
      ), 
      'vid' => array(
        'description' => 'The current {node_revision}.vid version identifier.', 
        'type' => 'int', 
        'unsigned' => TRUE, 
        'not null' => TRUE, 
        'default' => 0,
      ), 
      // …
    );
    // …
  );

  // …

  return $schema;
}

Der Bericht, der dazu führte, dass die Aufrufe t()von allen Drupal- Kernimplementierungen von entfernt wurden, hook_schema()lautet Remove t () aus allen Schemabeschreibungen , die von webchick (Drupal 7-Co-Betreuer) geöffnet wurden .

In Szeged hatten wir eine lange Diskussion über t()die Schemabeschreibungen und es war der Konsens aller am Tisch Beteiligten (einschließlich Dries), dass t()sie aus diesen Beschreibungen entfernt werden sollten. Sie bringen die Dinge durcheinander, weil sie t()nicht so früh verfügbar sind, und die Leute diskutierten, dass sich niemand die Zeit nehmen wird, technische Beschreibungen von Dingen zu übersetzen, und das ist nicht wirklich sinnvoll, da wir auch keine Codekommentare übersetzen, z Beispiel.

Der Artikel über die Konvertierung eines Drupal 6-Moduls in Drupal 7 enthält einen eigenen Absatz: Schema-Beschreibungen werden nicht mehr übersetzt .

kiamlaluno
quelle
2
Weitere Informationen zur Verwendung von t () bei der Installation / Aktualisierung von Hooks: drupal.org/node/322731
AyeshK
2

Sie sind unveränderliche Zeichenfolgen, daher ist es gut, sie durchzugehen t(). Es gibt eine Überarbeitung des t () - Systems für solche Dinge, aber ich bin nicht sicher, ob es in D8 passieren wird.

Derzeit ist es nur schlecht, wenn Sie so etwas wie " t($count . ' books')where" übergeben, $countdas einen beliebigen Wert annehmen kann, da dadurch zu viele Zeichenfolgen für die Übersetzung generiert werden.

jcisio
quelle
-1

Es ist jedoch möglich, t () um eine Variable herum zu verwenden und damit zu arbeiten. Ich habe es mit $ title in page.tpl.php gemacht.

EDIT: Vielleicht werden die Strings nicht übersetzt, aber sie können für String-Overrides verwendet werden.

naomi
quelle
1
Siehe kiamlalunos Antwort, warum das eine schlechte Idee ist.
Andy
kiamlalunos antwort scheint zu lauten, dass der string nicht übersetzt wird. Eine andere Verwendung von t () ist das Aktivieren von Zeichenfolgenüberschreibungen. Ich kann bestätigen, dass das mit Variablen funktioniert.
Naomi
1
@naomi Ja, es wird funktionieren. Wenn Sie jedoch Übersetzungen aktiviert haben, werden alle Titel, die mit t () übergeben wurden, in der Liste der Übersetzungszeichenfolgen angezeigt. Sie sollten keine Zeichenfolgenüberschreibungen verwenden, um die Knotentitel IMO zu ändern. Erstellen Sie ein Feld und ändern Sie den Knotentitel in den Wert des Felds in einem hook_preprocess_node oder einer Seite. (Sie können auch hook_node_load oder einen verwandten Hook verwenden)
AyeshK