Ohne String-Paket

Benutzer müssen Strings einzeln übersetzen, ohne die Option der automatischen Übersetzung.
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:
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.
Der erste Schritt besteht darin, Inhalte zu identifizieren, die Benutzer übersetzen möchten, wie z. B. Titel, Beschriftungen und benutzergenerierte Inhalte.
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;
} );
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.
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' );
}
$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.
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 );
}
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:
wpml_start_string_package_registration (wird in einem neuen Tab geöffnet)wpml_delete_unused_package_strings (wird in einem neuen Tab geöffnet)
$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 );
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 );