Anular la traducción básica predeterminada de WordPress

11

WordPress está configurado en idioma holandés. Cuando uso get_the_archive_title()mi tema correctamente, aparece "Categoría: nombre de categoría" en una página de archivo de categoría. Sin embargo, me gustaría que lea "Sectie: Nombre de categoría".

No quiero cambiar el archivo de idioma holandés en la carpeta wp-content / languages, porque eso se actualizará con las actualizaciones de WordPress.

Intenté copiar ese archivo de traducción, alterando la traducción de "categoría" y colocando el nuevo archivo nl_NL.mo en my-theme / languages. Esto no tuvo ningún efecto.

¿Cómo puedo lograr una traducción diferente para algunas cadenas sin alterar los archivos de traducción principales?

Florian
fuente

Respuestas:

15

Puede usar el filtro 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 necesita filtrar una traducción con contexto, use gettext_with_contextfilter :

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;
}

Una traducción con contexto significa que se proporciona un contexto en la función gettext utilizada para traducir la cadena. Por ejemplo, esto es sin contexto:

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

Y esto es con contexto:

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

Hay filtros similares disponibles para traducciones en plural ( [_n()][2]y [_nx()][2]): ngettexty ngettext_with_context.

cybmeta
fuente
1
¡Eso funciono! Tuve que hacer "Categoría:% s" y "Sectie:% s" porque el texto tiene que ser exactamente como en el archivo de traducción.
Florian
Oh sí, eso es correcto. No sabía el texto exacto para traducir.
cybmeta
1
Excelente código: solo tenga en cuenta que el gettextfiltro no detectará las traducciones que usan una cadena de "contexto", esas necesitarán gettext_with_context .
Manu
Gracias por esta gran solución. Cuando estoy creando un tema secundario y estoy dispuesto a anular algunas de las traducciones del tema principal, sustituí el cuerpo de la función propuesta con la siguiente línea return $domain != 'child-domain' && ( $new = __( $original, 'child-domain' ) ) != $original ? $new : $translated;. De esta manera, puedo mantener las traducciones primordiales en el archivo PO del tema secundario en lugar de tenerlas cableadas en el código de función.
Franco
Gracias cybmeta! Utilicé esta técnica para cambiar el texto principal con un complemento que publiqué en el repositorio. He acreditado esta publicación en el código. wordpress.org/plugins/…
John Dee