web-dev-qa-db-fra.com

Comment traduire automatiquement les rôles d'utilisateur personnalisés?

J'ai développé un petit plugin qui ajoute (ou pour être plus précis: supprime d'abord puis ajoute à nouveau) des rôles d'utilisateur personnalisés. Chacun de ces rôles est configuré de la manière suivante:

function wpdev_141551_add_role_someone() {

    $role = 'someone';

    remove_role( $role );

    $capabilities = array(
        'read'          => TRUE,
        'publish_posts' => TRUE,
        'edit_posts'    => TRUE,
        'delete_posts'  => FALSE,
        // ...
    );

    add_role( $role, 'Someone', $capabilities );
}

Le problème est que ces rôles d’utilisateur personnalisés ne sont pas traduits du tout.

Les traductions des rôles d'utilisateur par défaut (Auteur, Contributeur, etc.) sont incluses dans le domaine de texte par défaut de WordPress. Alors, comment et où devrais-je intervenir et traduire ces noms de rôle personnalisés?

Si j'ajoute le rôle avec un appel gettext pour son nom __( 'Someone', 'plugin-text-domain' ), la chaîne écrite dans la base de données sera traduite en fonction de la langue actuelle. Ce que je voudrais, cependant, c’est une solution qui me permette de changer de langue comme je le souhaite et d’afficher les rôles en conséquence - sans avoir à désamorcer puis réactiver le plugin (c’est-à-dire supprimer et ajouter le rôle , encore).


Je vais poster ma solution actuelle à cela, mais je suis toujours très intéressé par toute autre (éventuellement plus efficace) approche .

5
tfrommen

La fonction translate_user_role n'est qu'un wrapper pour translate_with_gettext_context , définissant le contexte 'Rôle d'utilisateur'.

Dans cette dernière fonction, il y a le crochet de filtrage gettext_with_context, qui fournit le contexte ainsi que le domaine actuellement utilisé.

Pour que nous puissions faire ceci:

function wpdev_141551_translate_user_roles( $translations, $text, $context, $domain ) {

    $plugin_domain = 'plugin-text-domain';

    $roles = array(
        'Someone',
        'Nobody',
        // ...
    );

    if (
        $context === 'User role'
        && in_array( $text, $roles )
        && $domain !== $plugin_domain
    ) {
        return translate_with_gettext_context( $text, $context, $plugin_domain );
    }

    return $translations;
}
add_filter( 'gettext_with_context', 'wpdev_141551_translate_user_roles', 10, 4 );

Pour que cela fonctionne, nous devons faire un appel factice de gettext, comme suit:

_x( 'Someone', 'User role', 'plugin-text-domain' );

Nous pourrions simplement mettre ceci juste après add_role.

Cela fonctionne, mais cela ne semble pas être une approche efficace, car chaque appel gettext avec un contexte doit passer notre (s) fonction (s).

2
tfrommen