Senza un pacchetto di stringhe

Gli utenti devono tradurre le stringhe una per una, senza l'opzione della traduzione automatica.
Scopri come creare pacchetti di stringhe per i tuoi plugin e temi per aiutare gli utenti a tradurre facilmente i contenuti con WPML.
I pacchetti di stringhe sono gruppi di stringhe “raggruppate” insieme in un contesto specifico. Il loro scopo è aiutare gli utenti finali a tradurre i contenuti in modo più efficiente, eliminando la necessità di tradurre ogni stringa individualmente.
Ad esempio, ecco come gli utenti tradurrebbero i campi personalizzati utente, con e senza un pacchetto di stringhe:
Come puoi vedere, i pacchetti di stringhe semplificano il processo di traduzione permettendo agli utenti di tradurre più campi personalizzati utente contemporaneamente. Per offrire ai tuoi utenti la migliore esperienza di traduzione, segui i passaggi seguenti per creare i tuoi pacchetti di stringhe.
Se vuoi vedere l'implementazione completa del pacchetto di stringhe che trattiamo nei passaggi seguenti, dai un'occhiata a questo repo GitHub (si apre in una nuova scheda) contenente il plugin di test che abbiamo utilizzato.
Il primo passaggio è identificare i contenuti che gli utenti vorranno tradurre, come titoli, etichette e contenuti generati dagli utenti.
Successivamente, devi dichiarare il tipo di pacchetto. Questo passaggio aiuta WPML a rilevare quali pacchetti di stringhe sono collegati a plugin attivi e a tradurre solo quei pacchetti.
Per fare un confronto, questo filtro funziona per i pacchetti di stringhe esattamente come il filtro register_post_types funziona per i tipi di post.
Per dichiarare un tipo di pacchetto, usa il filtro wpml_active_string_package_kinds (si apre in una nuova scheda):
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 – il titolo del tipo, dovrebbe essere uguale a kind per i pacchetti.plural – la forma plurale del titolo.slug – lo slug del tipo, dovrebbe essere uguale a kind_slug per i pacchetti.
Successivamente, devi creare un pacchetto e registrare le stringhe che andrà a raggruppare utilizzando l'hook wpml_register_string (si apre in una nuova scheda):
$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 – l'etichetta del namespace dell'entità (ad es., Gravity Forms).$kind_slug – lo slug del namespace dell'entità (ad es., gravity-form). Se mancante, sarà una versione slug del “kind”.$name – l'identificatore univoco dell'entità all'interno del tipo, può essere una stringa (ad es., slug) o un numero intero (ad es., ID).$title – il titolo dell'entità all'interno del tipo. Si consiglia di utilizzare il titolo dell'entità reale.
Anche se non è necessario, puoi includere anche due argomenti aggiuntivi:$edit_link – un URL per modificare l'oggetto.$view_link – un URL per visualizzare l'oggetto.
Infine, per visualizzare le traduzioni sul front-end, devi usare l'hook wpml_translate_string (si apre in una nuova scheda):
$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 );
}
Ogni volta che gli utenti aggiornano i contenuti, WPML deve essere in grado di identificare le nuove stringhe, così come quelle che sono state rimosse. Per notificare a WPML queste modifiche, racchiudi il tuo codice di registrazione con due funzioni:
wpml_start_string_package_registration (si apre in una nuova scheda)wpml_delete_unused_package_strings (si apre in una nuova scheda)
$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 );
Quando gli utenti rimuovono i contenuti, dovresti rimuovere anche il pacchetto di stringhe associato. Questo include tutte le stringhe, le traduzioni e i lavori di traduzione correlati. Effettuando questa pulizia, ti assicuri che il sito rimanga efficiente senza dati residui che ingombrano il database.
Per rimuovere un pacchetto di stringhe, agganciati a un'azione appropriata all'interno del tuo plugin o tema e chiama la funzione wpml_delete_package (si apre in una nuova scheda):
$userId = 123; do_action( 'wpml_delete_package', $userId, FOO_USER_FIELD_PACKAGE_KIND_SLUG );