web-dev-qa-db-fra.com

Traduire un message d'erreur

J'aimerais traduire un message d'erreur d'un plugin qui bloque le spam de nos formulaires, mais bloque parfois les soumissions légitimes (de personnes réelles). Le message est codé pour être traduit - dans le plugin lui-même, la ligne est la suivante:

$err_msg = __( 'That action is currently not allowed.' );

Mon problème est, mon site est déjà en anglais américain, tout comme le plugin, et techniquement, lorsque je "traduis" cette chaîne de sorte que les visiteurs voient un "ce n'est pas votre faute; s'il vous plaît contactez untel pour que nous puissions résoudre ce problème pour vous "message, il sera toujours en anglais américain. J'ai défini un domaine de texte dans mon thème et j'ai pu générer les fichiers .pot, .po et .mo afin de traduire cette chaîne. Le problème est que, puisque je mets wp-config sur en_US, cela ne change rien en réalité.

Etant donné que je n'ai pas de processus exact pour déclencher l'erreur sur les formulaires eux-mêmes, j'ai configuré un widget de tableau de bord administrateur pour tester la traduction. Effectivement, si le contenu du widget est

$err_msg = __( 'That action is currently not allowed.' );
echo $err_msg;

Je reçois 'Cette action n'est actuellement pas autorisée.' Si je change le contenu du widget en

$err_msg = __( 'That action is currently not allowed.', 'mytextdomain' );
echo $err_msg;

Je reçois le message personnalisé que j'essaie de réaliser.

Je ne veux pas éditer les fichiers du plugin eux-mêmes, car ils reviendraient chaque fois qu'il y aurait une mise à jour. Il n'y a pas de filtre ou de lien dans le plugin pour ce message particulier - il existe des filtres pour d'autres erreurs, mais pas celle-ci générique. Existe-t-il une meilleure approche pour faire modifier cette chaîne de texte destinée à l'utilisateur? Je veux quelque chose côté serveur plutôt qu'une solution JS/jQuery, si possible.

4
WebElaine

Le filtre gettext peut être utilisé pour modifier les chaînes qui utilisent les fonctions gettext.

add_filter( 'gettext', 'wpse_change_error_string', 10, 3 );
/**
 * Translate text.
 *
 * @param string $translation  Translated text.
 * @param string $text         Text to translate.
 * @param string $domain       Text domain. Unique identifier for retrieving translated strings.
 *
 * @return string
 */
function wpse_change_error_string( $translation, $text, $domain ) {
    // The 'default' text domain is reserved for the WP core. If no text domain
    // is passed to a gettext function, the 'default' domain will be used.
    if ( 'default' === $domain && 'That action is currently not allowed.' === $text ) {
        $translation = "This is the modified version of the original string...";
    }

    return $translation;
}

Remarque: Heureusement, le noyau WordPress n'utilise pas actuellement la chaîne Cette action n'est actuellement pas autorisée. , afin que le message ne soit pas modifié de manière indésirable à l'aide du code ci-dessus. Mais cela se produirait si le noyau utilisait ce message. C'est l'une des raisons pour lesquelles il est important que les plugins et les thèmes utilisent leur propre domaine de texte unique.

La famille de fonctions gettext (__(), _e, etc.) doit toujours être transmise à un domaine de texte. L'exception à cette règle concerne le noyau WordPress, qui ne passe pas explicitement un domaine de texte, mais qui en a toujours un nommé default.

Je contacterais les auteurs du plugin pour leur suggérer d'ajouter leur propre domaine de texte à leurs appels de fonction gettext.

5
Dave Romsey