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 .
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,$count
das einen beliebigen Wert annehmen kann, da dadurch zu viele Zeichenfolgen für die Übersetzung generiert werden.quelle
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.
quelle