HTML in __ () oder _e () Sprachübersetzung


24

Was ist der richtige Ansatz zum Erstellen von Übersetzungszeichenfolgen?

Beispielsweise,

echo __( 'Hello ' . $first . ' you owe me money.' );
echo __( '<div><p>Top: ' . $t_margin . '</p>' . '<p>Bottom: ' . $b_margin . '</p></div>' )

Ist es in Ordnung, die Zeichenfolgen und / oder HTML hinzuzufügen, oder sollte dies zuerst geschehen und dann die Übersetzung wie folgt durchlaufen:

$html = '<div><p>Top: ' . $t_margin . '</p>' . '<p>Bottom: ' . $b_margin . '</p></div>';
echo __( $html ); 

Antworten:


41

Es gibt ein zweites Argument in der __()Funktion. Es sollte auf die Domain eingestellt sein, die Sie für Ihr Plugin oder Theme verwenden. In den folgenden Beispielen verwende ich 'text_domain'. Ihre Domain-Zeichenfolge sollte eindeutig sein. Es sollte keiner anderen Domain-Zeichenfolge entsprechen. Wenn Sie kein Textdomänenargument verwenden, wird standardmäßig 'default'der WordPress-Domänenname verwendet. Siehe den Link für weitere Details.

Verwenden Sie immer die Zeichenfolge ( 'text_domain'). Verwenden Sie niemals eine Variable, Funktion oder Konstante mit der Zeichenfolge darin. Die meisten (alle?) Übersetzungsprogramme werden es ohne die Zeichenfolge dort nicht sehen.

Dein Code:

echo __( 'Hello ' . $first . ' you own me money.' );

Fügen Sie keine Variablen in die Zeichenfolge ein.

Ein besserer Weg:

echo sprintf( __( 'Hello %s you own me money.', 'text_domain' ), $first );

Oder nur:

printf( __( 'Hello %s you own me money.', 'text_domain' ), $first );

Der %sPlatzhalter teilt dem menschlichen Übersetzer mit, dass dort ein String eingeht. Verwenden Sie %dfür Zahlen. Es gibt auch andere Platzhalter .

(Dieser Satz ist grammatikalisch falsches Englisch. Verwenden Sie entweder 'Hello %s, you owe me money.'oder 'Hello %s, you own my money.'je nach der beabsichtigten Bedeutung.)


Dein Code:

$html = '<div><p>Top: ' . $t_margin . '</p>' . <p>Bottom: ' . $b_margin . '</p></div>';

Übersetzen Sie kein HTML. Das ist in jeder Sprache gleich.

Ein besserer Weg:

$html = sprintf( '<div><p>%s</p><p>%s</p></div>', __( 'Top: ', 'text_domain' ) .  $t_margin, __( 'Bottom: ', 'text_domain' ) . $b_margin );

Oder teilen Sie es in mehrere Zeilen auf:

$html = sprintf(
    '<div><p>%s</p><p>%s</p></div>',
    __( 'Top: ', 'text_domain' ) .  $t_margin,
    __( 'Bottom: ', 'text_domain' ) . $b_margin
);

Wenn nicht klar ist, was oben und unten ist, können Sie das verwenden _x(), um den Kontext dieser Begriffe zu erläutern.


Weitere Übersetzungsfälle finden Sie hier: Internationalisierung: Sie machen es wahrscheinlich falsch


Sie sagen, Sie übersetzen kein HTML. Darf ich darauf hinweisen, dass es nicht übersetzt wird, sondern in einer oder mehreren vorhandenen Tabellen mit vorübersetzten Zeichenfolgen nachgeschlagen wird. HTML in der Zeichenkette zu haben, macht keinen Unterschied, vorausgesetzt, der Übersetzer hat sie nicht entfernt. In einigen Situationen ist die Leistung sogar besser als beim Suchen und Ersetzen mit regulären Ausdrücken.
15.

Unabhängig davon, aber nicht zu bemerken: Das textdomainmuss eine wörtliche Zeichenfolge sein, es kann keine Variable / Konstante / Eigenschaft sein.
Brasofilo

@brasofilo, dieser Hinweis steht in der Antwort ganz oben, muss aber wiederholt werden. Ich habe diesen Fehler in mehreren benutzerdefinierten Plugins gemacht, die ich für Kunden geschrieben habe.
Charles Clarkson

+1 für sprintf(). Das ist wirklich die Art und Weise, wie HTML in der übersetzbaren Zeichenfolge enthalten ist.
Helgatheviking

Ich verstehe nicht, wie die Verwendung von sprintf()in irgendeiner Weise anders hilft, als vielleicht etwas sauberer auszusehen. Wenn Sie einen Satz mit HTML haben, Some text with a <strong>strong</strong> word inside.wie ist es möglich, den Satz als Ganzes zu übersetzen und nicht zu übersetzen Some text with a, strongund zwar word insideeinzeln (was keinen Sinn ergibt ).
Phpheini

4

Ich werde das Problem der Variablen in der Zeichenfolge nicht ansprechen, da dies bereits gesagt wurde.

Sie möchten, dass Ihre Zeichenfolge statisch bleibt, sodass sich der Inhalt nicht ändert. Sie möchten auch unnötiges HTML fernhalten.

__( '<p>Hello World!</p>' );
__( '<h1>Hello World!</h1>' );

Das Obige nimmt zwei Zeilen in Ihrer Tabelle für den im Wesentlichen gleichen Text ein. Sie können umgeschrieben werden als:

'<p>' . __( 'Hello World!' ) . '</p>'
'<h1>' . __( 'Hello World!' ) . '</h1>'

Reduzieren Sie es auf eine einzelne Zeile.

Manchmal ist HTML im Text unvermeidlich. Nehmen Sie zum Beispiel:

__( 'You currently owe <b>%s</b> dollars' );

Da Sprachen grammatikalisch sind, würde das Teilen des Textes für jeden, der übersetzt, Probleme verursachen.

Faustregel. HTML- Textformatierungs- Tags im mittleren Satz sind in Ordnung. Sätze, die mit HTML beginnen und enden, verschwenden nur Platz.


Im letzten Beispiel könnten Sie die fett gedruckten Tags um das eingefügte Argument setzen "<b>$string</b>". Dann können Sie verwenden 'You currently owe %s dollars'. Möglicherweise muss es jedoch beibehalten werden, wenn Sie es mit der _n()Funktion verwenden, die einen %dPlatzhalter erfordert .
Charles Clarkson

@ Charles Clarkson Guter Anruf. Vielleicht hätte ich das weglassen sollen %s, um es etwas klarer zu machen.
15.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.