WPML

Erfahren Sie, wie Sie String-Pakete für Ihre Plugins und Themes erstellen, um Benutzern die einfache Übersetzung von Inhalten mit WPML zu ermöglichen.

String-Pakete sind Gruppen von Strings, die in einem bestimmten Kontext „gebündelt“ werden. Ihr Zweck ist es, Endbenutzern zu helfen, Inhalte effizienter zu übersetzen, indem die Notwendigkeit entfällt, jeden String einzeln zu übersetzen.

Hier sehen Sie beispielsweise, wie Benutzer benutzerdefinierte Benutzerfelder mit und ohne String-Paket übersetzen würden:

Ohne String-Paket

Die vier Felder als separate Strings unter WPML → Übersetzungen → Strings
Die vier Felder als separate Strings unter WPML → Übersetzungen → Strings

Benutzer müssen Strings einzeln übersetzen, ohne die Option der automatischen Übersetzung.

Mit String-Paket

Dieselben vier Felder als ein Paket im Übersetzungs-Dashboard
Dieselben vier Felder als ein Paket im Übersetzungs-Dashboard

Benutzer können mehrere Strings in einem Durchgang zusammen übersetzen, mit der Option der automatischen Übersetzung.

Wie Sie sehen, vereinfachen String-Pakete den Übersetzungsprozess, indem sie es Benutzern ermöglichen, mehrere benutzerdefinierte Benutzerfelder auf einmal zu übersetzen. Um Ihren Benutzern das beste Übersetzungserlebnis zu bieten, befolgen Sie die unten stehenden Schritte, um Ihre eigenen String-Pakete zu erstellen.

Wenn Sie die vollständige Implementierung von String-Paketen sehen möchten, die wir in den folgenden Schritten behandeln, sehen Sie sich dieses GitHub-Repo (wird in einem neuen Tab geöffnet) an, das das von uns verwendete Test-Plugin enthält.

1. Identifizieren Sie übersetzbare Inhalte

Der erste Schritt besteht darin, Inhalte zu identifizieren, die Benutzer übersetzen möchten, wie z. B. Titel, Beschriftungen und benutzergenerierte Inhalte.

2. Deklarieren Sie die Paketart

Als Nächstes müssen Sie Ihre Paketart deklarieren. Dieser Schritt hilft WPML zu erkennen, welche String-Pakete mit aktiven Plugins verbunden sind, und nur diese Pakete zu übersetzen.

Zum Vergleich: Dieser Filter funktioniert für String-Pakete genauso, wie der Filter register_post_types für Beitragstypen funktioniert.

Um eine Paketart zu deklarieren, verwenden Sie den Filter wpml_active_string_package_kinds (wird in einem neuen Tab geöffnet):

define( 'FOO_USER_FIELD_PACKAGE_KIND_TITLE', 'OTGS Foo User Fields' );

define( 'FOO_USER_FIELD_PACKAGE_KIND_SLUG', 'otgs-foo-user-fields' );

add_filter( 'wpml_active_string_package_kinds', function( $kinds ) {

   $kinds[ FOO_USER_FIELD_PACKAGE_KIND_SLUG ] = [

            'title'  => FOO_USER_FIELD_PACKAGE_KIND_TITLE,

            'slug'   => FOO_USER_FIELD_PACKAGE_KIND_SLUG,

            'plural' => FOO_USER_FIELD_PACKAGE_KIND_TITLE,

    ];

    return $kinds;

} );
Definition der Argumente

title – der Titel der Art, sollte derselbe sein wie die Art (kind) für Pakete.
plural – die Pluralform des Titels.
slug – der Slug der Art, sollte derselbe sein wie der kind_slug für Pakete.

3. Erstellen Sie ein Paket und registrieren Sie Strings

Als Nächstes müssen Sie ein Paket erstellen und die Strings, die es gruppieren soll, mit dem Hook wpml_register_string (wird in einem neuen Tab geöffnet) registrieren:

$userId = 123;

$user   = get_user_by( 'id', $userId );

$package = [

    'kind'      => FOO_USER_FIELD_PACKAGE_KIND_TITLE, // The "namespace".

    'kind_slug' => FOO_USER_FIELD_PACKAGE_KIND_SLUG, // The "namespace" slug.

    'name'      => $userId, // Can be a string or an integer, but should be unique inside the "kind" namespace.

    'title'     => $user->display_name, // The title for the package entity inside the "kind" namespace.

];

$fooUserFields = get_option( 'otgs_foo_user_fields' );

foreach ( $fooUserFields as $fooUserField ) {

$fieldValue = get_user_meta( $userId, $fooUserField, true );

do_action( 'wpml_register_string', $fieldValue, sanitize_key( $fooUserField ), $package, $fooUserField, 'LINE' );

}
Definition der Argumente

$kind – die Namespace-Beschriftung der Entität (z. B. Gravity Form).
$kind_slug – der Namespace-Slug der Entität (z. B. gravity-form). Wenn dieser fehlt, wird eine Slug-Version der Art („kind“) verwendet.
$name – die eindeutige Kennung der Entität innerhalb der Art, kann ein String (z. B. Slug) oder ein Integer (z. B. ID) sein.
$title – der Titel der Entität innerhalb der Art. Es wird empfohlen, den Titel der echten Entität zu verwenden.

Obwohl nicht zwingend erforderlich, können Sie auch zwei zusätzliche Argumente einschließen:
$edit_link – eine URL zum Bearbeiten des Objekts.
$view_link – eine URL zum Anzeigen des Objekts.

4. Rufen Sie Übersetzungen ab

Um schließlich Übersetzungen im Frontend anzuzeigen, müssen Sie den Hook wpml_translate_string (wird in einem neuen Tab geöffnet) verwenden:

$userId = 123;

$user   = get_user_by( 'id', $userId );

$package = [

        'kind'      => FOO_USER_FIELD_PACKAGE_KIND_TITLE, // The "namespace".

        'kind_slug' => FOO_USER_FIELD_PACKAGE_KIND_SLUG, // The "namespace" slug.

        'name'      => $userId, // Can be a string or an integer, but should be unique inside the "kind" namespace.

        'title'     => $user->display_name, // The title for the package entity inside the "kind" namespace.

];

$fooUserFields = get_option( 'otgs_foo_user_fields' );

$translatedFieldValues = [];

foreach ( $fooUserFields as $fooUserField ) {

    $fieldValue              = get_user_meta( $userId, $fooUserField, true );

    $translatedFieldValues[ $fooUserField ] = apply_filters( 'wpml_translate_string', $fieldValue, sanitize_key( $fooUserField ), $package );

}

Strings aktualisieren und entfernen

Wann immer Benutzer Inhalte aktualisieren, muss WPML in der Lage sein, die neuen Strings sowie die entfernten zu identifizieren. Um WPML über diese Änderungen zu benachrichtigen, umschließen Sie Ihren Registrierungscode mit zwei Funktionen:

$userId = 123;

$package = [

        'kind'      => FOO_USER_FIELD_PACKAGE_KIND_TITLE, // The "namespace".

        'kind_slug' => FOO_USER_FIELD_PACKAGE_KIND_SLUG, // The "namespace" slug.

        'name'      => $userId, // Can be a string or an integer, but should be unique inside the "kind" namespace.

        // The 'title' key is not not required in the "translate" context.

];

do_action( 'wpml_start_string_package_registration', $package );

$fooUserFields = get_option( 'otgs_foo_user_fields' );

foreach ( $fooUserFields as $fooUserField ) {

    $fieldValue = get_user_meta( $userId, $fooUserField, true );

    do_action( 'wpml_register_string', $fieldValue, sanitize_key( $fooUserField ), $package, $fooUserField, 'LINE' );

}

do_action( 'wpml_delete_unused_package_strings',$package );

String-Pakete löschen

Wenn Benutzer Inhalte entfernen, sollten Sie auch das zugehörige String-Paket entfernen. Dies umfasst alle zugehörigen Strings, Übersetzungen und Übersetzungsaufträge. Durch diese Bereinigung stellen Sie sicher, dass die Website effizient bleibt, ohne dass übrig gebliebene Daten die Datenbank überladen.

Um ein String-Paket zu entfernen, nutzen Sie einen entsprechenden Hook innerhalb Ihres Plugins oder Themes und rufen Sie die Funktion wpml_delete_package (wird in einem neuen Tab geöffnet) auf:

$userId = 123;

do_action( 'wpml_delete_package', $userId, FOO_USER_FIELD_PACKAGE_KIND_SLUG );

Zusätzliche Ressourcen

  • WPML-Sprachkonfigurationsdatei – ein Leitfaden zur Verwendung von wpml-config.xml, der Datei, die angibt, welche Texte WPML in Plugins und Themes übersetzen soll.
  • Multilingual Tools – ein Tool zum Testen Ihrer Konfigurationseinrichtung und zur Bestätigung der Kompatibilität mit WPML.

Geschrieben vonAmir