Remplacer la traduction principale de WordPress par défaut

11

WordPress est réglé sur la langue néerlandaise. Lorsque j'utilise get_the_archive_title()mon thème, il affiche correctement "Catégorie: nom de catégorie" sur une page d'archive de catégorie. Cependant, je voudrais lire "Sectie: nom de catégorie".

Je ne souhaite pas modifier le fichier de langue néerlandaise dans le dossier wp-content / languages, car il sera mis à jour par les mises à jour de WordPress.

J'ai essayé de copier ce fichier de traduction, de modifier la traduction "catégorie" et de mettre le nouveau fichier nl_NL.mo dans mon-thème / langues. Cela n'a eu aucun effet.

Comment puis-je obtenir une traduction différente pour certaines chaînes sans modifier les fichiers de traduction principaux?

Florian
la source

Réponses:

15

Vous pouvez utiliser le filtre gettext :

add_filter( 'gettext', 'cyb_filter_gettext', 10, 3 );
function cyb_filter_gettext( $translated, $original, $domain ) {

    // Use the text string exactly as it is in the translation file
    if ( $translated == "Categorie: %s" ) {
        $translated = "Sectie: %s";
    }

    return $translated;
}

Si vous devez filtrer une traduction avec le contexte, utilisez le gettext_with_contextfiltre :

add_filter( 'gettext_with_context', 'cyb_filter_gettext_with_context', 10, 4 );
function cyb_filter_gettext_with_context( $translated, $original, $context, $domain ) {

    // Use the text string exactly as it is in the translation file
    if ( $translated == "Categorie: %s" ) {
        $translated = "Sectie: %s";
    }

    return $translated;
}

Une traduction avec contexte signifie qu'un contexte est donné dans la fonction gettext utilisée pour traduire la chaîne. Par exemple, c'est sans contexte:

$translated = __( 'Search', 'textdomain' );

Et c'est avec le contexte:

$translated = _x( 'Search', 'form placeholder', 'textdomain' );

Des filtres similaires sont disponibles pour plusieurs traductions ( [_n()][2]et [_nx()][2]): ngettextet ngettext_with_context.

cybmeta
la source
1
Ça a marché! J'ai dû faire "Catégorie:% s" et "Sectie:% s" car le texte doit être exactement comme dans le fichier de traduction.
Florian
Oh, oui, c'est exact. Je ne connaissais pas le texte exact à traduire.
cybmeta
1
Grand morceau de code - sachez simplement que le gettextfiltre n'attrapera pas les traductions qui utilisent une chaîne "contextuelle", celles-ci auront besoin de gettext_with_context .
Manu
Merci pour cette excellente solution. Comme je crée un thème enfant et que je souhaite remplacer certaines des traductions du thème parent, j'ai remplacé le corps de fonction proposé par la ligne suivante return $domain != 'child-domain' && ( $new = __( $original, 'child-domain' ) ) != $original ? $new : $translated;. De cette façon, je peux gérer les traductions prioritaires dans le fichier PO du thème enfant au lieu de les avoir câblées dans le code de fonction.
Franco
Merci cybmeta! J'ai utilisé cette technique pour changer le texte de base avec un plugin que j'ai publié dans le repo. J'ai crédité ce post dans le code. wordpress.org/plugins/…
John Dee