web-dev-qa-db-fra.com

Implémentation de la traduction gettext conditionnelle

J'ai ajouté un bouton de message sur mon site (j'utilise un plugin qui permet la messagerie privée) en ajoutant le shortcode du plugin à mon footer.php:

<div class="msgshort"><?php echo do_shortcode('[ultimatemember_message_button user_id=1]'); ?></div>

Voici une capture d'écran de son apparence sur mon site: https://ibb.co/hLTkmQ

Voici le code derrière ce shortcode:

/***
*** @shortcode
***/
function ultimatemember_message_button( $args = array() ) {
    global $ultimatemember, $um_messaging;

    $defaults = array(
        'user_id' => 0
    );
    $args = wp_parse_args( $args, $defaults );
    extract( $args );

    $current_url = $ultimatemember->permalinks->get_current_url();

    if( um_get_core_page('user') ){
        do_action("um_messaging_button_in_profile", $current_url, $user_id );
    }

    if ( !is_user_logged_in() ) {
        $redirect = um_get_core_page('login');
        $redirect = add_query_arg('redirect_to', $current_url, $redirect );
        $btn = '<a href="' . $redirect . '" class="um-login-to-msg-btn um-message-btn um-button" data-message_to="'.$user_id.'">'. __('Message','um-messaging'). '</a>';
        return $btn;
    } else if ( $user_id != get_current_user_id() ) {

        if ( $um_messaging->api->can_message( $user_id ) ) {
            $btn = '<a href="#" class="um-message-btn um-button" data-message_to="'.$user_id.'"><span>'. __('Message','um-messaging'). '</span></a>';
            return $btn;
        }

    }

}

Ce bouton est codé pour que le texte du bouton soit "Message". Ce bouton apparaît déjà sur mes pages de profil utilisateur, mais maintenant que je l'ai ajouté à mon pied de page, je souhaite modifier le texte indiquant "Message" dans mon pied de page, mais pas dans la zone de modèle de profil utilisateur.

Donc, j'utilise ce code pour renommer le texte du bouton de message sur mon site:

//rename messagetxt
function um_rename_messagetxt( $translated_text, $text, $text_domain ) {
if ( 'Message' === $text ) {
       $translated_text = 'Contact Us';
}
return $translated_text;
}

add_filter ( 'gettext', 'um_rename_messagetxt', 10, 3);

Bien sûr, cela modifie le texte du bouton pour tous mes boutons qui disent à l'origine dire "Message" (donc le bouton de message footer.php que j'ai ajouté avec le shortcode et le bouton de message dans le modèle de profil d'utilisateur change).

J'ai juste besoin de changer le texte du bouton que j'ai ajouté via shortcode dans mon fichier footer.php. Comment puis-je isoler la traduction du texte afin de ne traduire que le texte d'un élément spécifique? Par exemple, y a-t-il un moyen de ne traduire que "Message" lorsqu'il se trouve dans footer.php et si oui, comment pourrais-je l'écrire? J'apprécierais vraiment toute aide à ce sujet!

Note latérale: Je suis un membre premium de ce plugin et j'ai déjà contacté leur support payant, qui leur a dit qu'ils n'étaient pas sûrs de savoir comment faire cela et m'a demandé d'utiliser Poedit solution appropriée pour cela. Merci beaucoup à Dave Romsey qui a essayé de m'aider malgré mon déficit de compétences en php :)

1
kosmicbird

WordPress fournit la fonction _x() qui ressemble à __() , mais elle ajoute le paramètre $context utilisé pour différencier les chaînes identiques.

Dans l'exemple ci-dessous, une sortie est générée dans le pied de page. La chaîne traduisible est Message est utilisée dans les deux cas, mais dans la première instance, Message reçoit le contexte for use in footer text.

Ensuite, nous utilisons les filtres gettext_with_context et gettext respectivement pour traduire chacune des chaînes indépendamment.

// Generate output for our example.
add_action( 'wp_footer', 'wpse_example_strings' );
function wpse_example_strings() {
    // Note that concatenating strings is not translation friendly. It's done here for simplicity.
    echo 'Message string with context: ' . _x( 'Message', 'for use in footer text', 'text_domain' ) . '<br>';
    echo 'Message string without context: ' . __( 'Message', 'text_domain' ) . '<br>';
}

/**
 * Translate text with context.
 *
 * https://codex.wordpress.org/Plugin_API/Filter_Reference/gettext_with_context
 *
 * @param string $translation  Translated text.
 * @param string $text         Text to translate.
 * @param string $context      Context information for the translators.
 * @param string $domain       Text domain. Unique identifier for retrieving translated strings.
 *
 * @return string
 */
add_filter( 'gettext_with_context', 'wpse_gettext_with_context', 10, 4 );
function wpse_gettext_with_context( $translation, $text, $context, $domain ) {
    if ( 'text_domain' === $domain ) {
        if ( 'Message' === $text && 'for use in footer text' === $context ) {
            $translation = 'Message Us';
        }
    }

    return $translation;
}

/**
 * Translate text without context.
 *
 * @param string $translation  Translated text.
 * @param string $text         Text to translate.
 * @param string $domain       Text domain. Unique identifier for retrieving translated strings.
 *
 * @return string
 */
add_filter( 'gettext', 'um_rename_messagetxt', 10, 3);
function um_rename_messagetxt( $translation, $text, $domain ) {
    if ( 'text_domain' === $domain ) {
        if ( 'Message' === $text ) {
            $translation = 'Contact Us';
        }
    }

    return $translation;
}

Éditer: Personnalisation du bouton de messagerie du membre ultime

J'y ai jeté un œil attentif et, malheureusement, les auteurs du plug-in n'ont pas rendu très facile la modification du texte du bouton.

Voici une solution qui remplacera le shortcode du bouton de message du membre ultime par défaut par notre propre version forkée. Notez que nous pouvons recycler le nom ultimatemember_message_button. Je suggérerais de créer un plugin avec ce code:

<?php
/*
Plugin Name: Ulimate Member Custom Message Button Shortcode
Plugin URI: 
Description: 
Version: 0.0.1
Author:
Author URI:
License: GPL2/Creative Commons
*/

/**
 * Remove the default UM Message shortcode and wire up our forked version.
 */ 
add_action( 'init', 'wpse_ultimatemember_message_button_custom' );
function wpse_ultimatemember_message_button_custom() {
    global $um_messaging;
    remove_shortcode( 'ultimatemember_message_button', [ $um_messaging->shortcode, 'ultimatemember_message_button' ] );
    add_shortcode( 'ultimatemember_message_button', 'wpse_ultimatemember_message_button' );
}

/**
 * Customized version of ultimatemember_message_button shortcode, which allows
 * for the button's label to be specified using the 'label' parameter.
 */
function wpse_ultimatemember_message_button( $args = array() ) {
    global $ultimatemember, $um_messaging;

        $defaults = array(
            'user_id' => 0,
            'label' => __( 'Message','um-messaging' ),
        );
    $args = wp_parse_args( $args, $defaults );
    extract( $args );

    $current_url = $ultimatemember->permalinks->get_current_url();

    if( um_get_core_page('user') ){
        do_action("um_messaging_button_in_profile", $current_url, $user_id );
    }

    if ( !is_user_logged_in() ) {
        $redirect = um_get_core_page('login');
        $redirect = add_query_arg('redirect_to', $current_url, $redirect );
        $btn = '<a href="' . $redirect . '" class="um-login-to-msg-btn um-message-btn um-button" data-message_to="'.$user_id.'">'. $label .'</a>';
        return $btn;
    } else if ( $user_id != get_current_user_id() ) {

        if ( $um_messaging->api->can_message( $user_id ) ) {
            $btn = '<a href="#" class="um-message-btn um-button" data-message_to="'.$user_id.'"><span>'. $label .'</span></a>';
            return $btn;
        }

    }

}

Mettez à jour votre modèle pour appeler le shortcode ultimatemember_message_button avec notre nouveau paramètre label comme ceci:

<div class="msgshort">
    <?php echo do_shortcode('[ultimatemember_message_button user_id=2 label="Contact US"]'); ?>
</div>

Ce n'est pas vraiment la meilleure solution, mais nos options sont limitées par la manière dont le plugin est implémenté. Je suggère de faire une demande de fonctionnalité pour le paramètre label à ajouter.

2
Dave Romsey

Eh bien, je suis devenu sans espoir alors j'ai résolu cela d'une autre manière (cette méthode n'est pas idéale mais au moins, le travail est fait)

Je viens d'ajouter une deuxième fonction de shortcode au fichier shortcode.php du plugin et de changer le "Message" en "Contactez-nous" dans la nouvelle fonction:

/***
*** @shortcode
***/
function ultimatemember_message_button2( $args = array() ) {
    global $ultimatemember, $um_messaging;

    $defaults = array(
        'user_id' => 0
    );
    $args = wp_parse_args( $args, $defaults );
    extract( $args );

    $current_url = $ultimatemember->permalinks->get_current_url();

    if( um_get_core_page('user') ){
        do_action("um_messaging_button_in_profile", $current_url, $user_id );
    }

    if ( !is_user_logged_in() ) {
        $redirect = um_get_core_page('login');
        $redirect = add_query_arg('redirect_to', $current_url, $redirect );
        $btn = '<a href="' . $redirect . '" class="um-login-to-msg-btn um-message-btn um-button" data-message_to="'.$user_id.'">'. __('Contact Us','um-messaging'). '</a>';
        return $btn;
    } else if ( $user_id != get_current_user_id() ) {

        if ( $um_messaging->api->can_message( $user_id ) ) {
            $btn = '<a href="#" class="um-message-btn um-button" data-message_to="'.$user_id.'"><span>'. __('Contact Us','um-messaging'). '</span></a>';
            return $btn;
        }

    }

}

Ensuite, je viens d'appeler le "nouveau" shortcode dans mon fichier footer.php:

<div class="msgshort"><?php echo do_shortcode('[ultimatemember_message_button2 user_id=1]'); ?></div>

Ce n'est pas vraiment génial car je voulais utiliser la traduction et ajouter du contenu au fichier function.php de mon thème enfant pour que je ne perde pas les modifications lors de la mise à jour ... j'apprécierais néanmoins une meilleure solution si quelqu'un en avait une. Merci encore pour votre aide!

0
kosmicbird