Was bringt die gettext-Syntax?

9

Bisher habe ich einige Übersetzungen in Wordpress bearbeitet und versucht, die offizielle gettext-Dokumentation zu lesen, aber ich verstehe nicht eine vielleicht einfache Sache: Was sind die Unterschiede zwischen diesen Starts wie __ (, _e (usw.?) Und sogar mehr: welche anderen gibt es daneben? Danke im Voraus!

Frank

Circuit Circus
quelle
Vielen Dank für Ihre ausführlichen Antworten! Ich weiß das hier wirklich zu schätzen!
Circuit Circus
... Vielleicht noch eine Frage dazu: Kann der Eintrag der Textdomäne weggelassen werden? Ich fing aufrecht an, es zu jedem String zu bringen, den ich übersetzen wollte, erkannte dann aber einige Beispiele im Wordpress-Codex, die es überhaupt nicht enthielten ...
Circuit Circus
... Okay, jetzt bin ich auf dieser Codex-Seite darauf gestoßen - Entschuldigung für diese überflüssige Frage :-)
Circuit Circus

Antworten:

12

__(doppelter Unterstrich) ist die Basisübersetzungsfunktion. Es übersetzt eine Zeichenfolge und gibt sie als Zeichenfolge zurück.

_emacht das gleiche wie __, aber Echo ist das Ergebnis sofort.

_xist die kontextbezogene Übersetzungsfunktion. Es gibt eine zweite Option, um den Personen, die die Übersetzung durchführen, einen Kontext bereitzustellen.

_exist das gleiche wie _x, aber Echo ist das Ergebnis.

Anwendungsbeispiel _x:

$string = _x( 'Buffalo', 'an animal', 'plugin-domain' );
$string = _x( 'Buffalo', 'a city in New York', 'plugin-domain' );
$string = _x( 'Buffalo', 'a verb meaning to confuse somebody', 'plugin-domain' );

Manchmal kann dieselbe Zeichenfolge in anderen Sprachen unterschiedlich sein. Durch die Bereitstellung von Kontext für die Übersetzer können sie die richtigen Wörter auswählen.

Verknüpfungsfunktionen:

  • esc_attr__: Entspricht __dem Ergebnis, führt es aber auch durch esc_attr.
  • esc_html__: Entspricht __dem Ergebnis, führt es aber auch durch esc_html.
  • esc_attr_e: Entspricht _edem Ergebnis, führt es aber auch durch esc_attr.
  • esc_html_e: Entspricht _edem Ergebnis, führt es aber auch durch esc_html.
  • esc_attr_x: Entspricht _xdem Ergebnis, führt es aber auch durch esc_attr.
  • esc_html_x: Entspricht _xdem Ergebnis, führt es aber auch durch esc_html.

_nist der Pluralisierungshandler. Beispiel:

$string = sprintf( _n(
        'You have %d taco.', 
        'You have %d tacos.', 
        $number, 
        'plugin-domain'), 
    $number );

In diesem Beispiel gibt es zwei Möglichkeiten, die Anzahl der Tacos zu bestimmen, je nachdem, ob sie singulär sind oder nicht. Die erste Verwendung von $ number teilt der _nFunktion mit, welche Version verwendet werden soll. Die zweite Verwendung von $ number erfolgt im Sprintf, um% d durch die tatsächliche Zahl in der Zeichenfolge zu ersetzen.

Es gibt keine äquivalente Echofunktion für _n, aber es gibt eine Funktion mit dem Namen _nx. Es ist eine Kombination aus _nund _x. Pluralisierung und Kontext.

_n_noopist eine besondere. Es wird zum Übersetzen pluralisierter Zeichenfolgen verwendet, führt die Übersetzung jedoch nicht sofort durch. Dies ist nützlich, wenn Sie die Zeichenfolgen zentralisieren möchten, die Arbeit jedoch an einer anderen Stelle ausführen möchten. Die Funktion, die die Arbeit tatsächlich woanders erledigt, ist translate_nooped_plural.

Beispiel:

$holder = _n_noop('You have %d taco.', 'You have %d tacos.', 'plugin-domain');
// ... later ...
$string = sprintf( translate_nooped_plural( $holder, $count ), $count );

Dies wird nicht viel verwendet, kann aber für die Organisation nützlich sein. Wenn Sie beispielsweise alle Ihre Zeichenfolgen in einer Datei ablegen und dann an anderer Stelle referenzieren, ist dies nicht möglich _n. Sie benötigen dazu so etwas _n_noop.

_nx_noopist das gleiche wie _n_noop, kann aber auch einen Kontext für die Übersetzer annehmen, das gleiche wie _x.

Beachten Sie, dass Sie die Domäne entweder in den Funktionsaufruf noop oder in den Funktionsaufruf translate_nooped_plural einfügen können. Was für Ihre Organisation sinnvoller ist. Wenn beide eine Domain haben, gewinnt die an den Noop-Anruf übergebene.

number_format_i18nist das Äquivalent zu PHPs integriertem number_format , fügt jedoch die Behandlung für Dinge wie Dezimalstellen usw. hinzu, die sich in anderen Ländereinstellungen unterscheiden.

date_i18nist das Äquivalent zum integrierten Datum von PHP , mit all den relevanten Handhabungen auch dort. Monatsnamen, Tagesnamen usw.

Brechen Sie auch niemals die Gesetze . Nur eine Erinnerung. :) :)

Otto
quelle
Wow, das ist wirklich eine gute Erklärung dafür! Vielen Dank für Ihre Hilfe! Jetzt sehe ich klar.
Circuit Circus
6

__ (), _e () und _x (), _ex ()

__()und _e()sind im Wesentlichen sowohl ein Wrapper von translate()(nicht direkt verwenden) als auch fast gleich.

Der Unterschied besteht darin, dass __()die übersetzte Zeichenfolge zurückgegeben und wiedergegeben _e()wird. Beiden muss eine Zeichenfolge als erforderlicher Parameter und normalerweise, obwohl optional, auch eine Textdomäne zugeführt werden.

Analog gibt es _x()und _ex(), mit denen Sie einen Kontext angeben können, der beschreiben kann, wo die Zeichenfolge angezeigt wird. Wenn Ihr Projekt mehr als ein paar zehn übersetzbare Zeichenfolgen enthält, ist die Verwendung des Kontexts sehr sinnvoll.

Beachten Sie auch die Existenz von _n()und _nx()für Pluralformen.

Beispiel für die allgemeine Verwendung

$output = '<label for="some_field">' .
        _x( 'Some Information.', 'Some Form Field', 'your-text-domain' ) .
    '</label>' .
    '<input type="text" name="some_field" value="" />' .
    '<p class="description">' .
        _x( 'Here you can enter some info.', 'Some Form Field', 'your-text-domain' ) .
    '</p>';

return $output;

Parameter

__( $text, $domain )
_e( $text, $domain )
_x( $text, $context, $domain )
_ex( $text, $context, $domain )
_n( $single, $plural, $number $domain )
_nx( $single, $plural, $number, $context, $domain )

Alle Parameter außer $numbersind Zeichenfolgen. Alle außer $domainsind erforderlich.

Weitere Flexibilität mit Variablen und sprintf ()

Wenn Ihre Zeichenfolgen variable Zahlen oder Wörter enthalten, verwenden Sie sprintf():

$stars = get_post_meta( $post->ID, 'rating', true );
$title = get_the_title( $post->ID );

$output = '<p>' .
        sprintf(
            _x(
                'The movie titled %2$s received a %1$d star rating.',
                'Movie Description',
                'your-text-domain'
            ),
            $stars,
            $title
        ) .
    '</p>';

return $output;

Zusätzliche Ressourcen

Einige zusätzliche Ressourcen für das kommende WordPress I18n Ninja:

Johannes Pille
quelle
Unter "Lokalisierung" unter "Verschiedenes" im Codex finden Sie auch eine vollständige Aufschlüsselung der Funktionen und detaillierte Erklärungen.
TheDeadMedic
& hier treffen sich wp-polyglots .
Brasofilo
@Johannes Pille: Ich habe deine Antwort erst bemerkt, als ich meine gepostet hatte. Soll ich meinen Beitrag löschen?
Jeremy Jared
@ JeremyJared Nein, warum? Weitere Informationen können keine schlechte Sache sein, oder?! Ich denke, Ihre Antwort ist gut durchdacht. +1 von mir.
Johannes Pille
@TheDeadMedic Bearbeitet in "zusätzliche Ressourcen".
Johannes Pille
3

Ich bin kein Experte für Übersetzungen, aber die WordPress-Codex-Seite enthält eine gute Dokumentation und erklärt den Grund für die Verwendung jeder Instanz.

Von den Codex-Seiten:

__()

Wird verwendet, wenn die Nachricht als Argument an eine andere Funktion übergeben wird. _e()wird verwendet, um die Nachricht direkt auf die Seite zu schreiben. Weitere Details zu diesen beiden Funktionen:

__('message')

Durchsucht das Lokalisierungsmodul nach der Übersetzung von 'message' und übergibt die Übersetzung an die PHP-return-Anweisung. Wenn für 'message' keine Übersetzung gefunden wird, wird nur 'message' zurückgegeben.

_e('message')

Durchsucht das Lokalisierungsmodul nach der Übersetzung von 'message' und übergibt die Übersetzung an die PHP-Echoanweisung. Wenn für 'message' keine Übersetzung gefunden wird, wird nur 'message' wiedergegeben.

Beachten Sie, dass Sie bei der Internationalisierung eines Themes oder Plugins a verwenden sollten "Text Domain" .

Das gettext Framework kümmert sich um den größten Teil von WordPress. Es gibt jedoch einige Stellen in der WordPress-Distribution, an denen gettext nicht verwendet werden kann:

  • Die Hauptdatei von WordPress README - es ist eine statische HTML-Datei, keine PHP-Datei, daher kann sie nicht über die gettext-Funktionen ausgeführt werden.
  • Einige Fehlermeldungen werden sehr früh im Ladezyklus von WordPress generiert, bevor gettext geladen wird.

Link zur Codex-Seite

Zusätzliche Informationen darüber, wann gettext nicht funktioniert

Hoffentlich beantwortet das Ihre Frage, wenn nicht, lassen Sie es uns wissen und vielleicht kann jemand anderes helfen oder ich kann noch etwas recherchieren.

Jeremy Jared
quelle