Substituir tradução principal do WordPress padrão

11

WordPress está definido para o idioma holandês. Quando eu uso get_the_archive_title()meu tema, gera corretamente "Categorie: Category-name" em uma página de arquivo da categoria. No entanto, eu gostaria que lesse "Sectie: Category-name".

Não quero alterar o arquivo de idioma holandês na pasta wp-content / languages, porque isso será atualizado pelas atualizações do WordPress.

Tentei copiar esse arquivo de tradução, alterar a tradução "category" e colocar o novo arquivo nl_NL.mo em my-theme / languages. Isso não teve nenhum efeito.

Como posso obter uma tradução diferente para algumas strings sem alterar os arquivos principais de tradução?

Florian
fonte

Respostas:

15

Você pode usar o 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;
}

Se você precisar filtrar uma tradução com 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;
}

Uma tradução com contexto significa que um contexto é fornecido na função gettext usada para traduzir a sequência. Por exemplo, isso é sem contexto:

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

E isso é com contexto:

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

Filtros semelhantes estão disponíveis para traduções no plural ( [_n()][2]e [_nx()][2]): ngettexte ngettext_with_context.

cybmeta
fonte
1
Isso funcionou! Eu tive que fazer "Categorie:% s" e "Sectie:% s" porque o texto deve ser exatamente como no arquivo de tradução.
Florian
Ah, sim, isso está correto. Não sabia o texto exato a traduzir.
22418 cybmeta
1
Grande parte do código - esteja ciente de que o gettextfiltro não capturará traduções que usam uma string "context", elas precisarão de gettext_with_context .
Manu
Obrigado por esta ótima solução. Como estou criando um tema filho e desejando substituir algumas das traduções do tema pai, substituí o corpo da função proposta pela seguinte linha return $domain != 'child-domain' && ( $new = __( $original, 'child-domain' ) ) != $original ? $new : $translated;. Dessa maneira, eu posso manter as traduções substituídas no arquivo PO do tema filho em vez de tê-las cabeadas no código de função.
Franco
Obrigado cybmeta! Usei essa técnica para alterar o texto principal com um plug-in que publiquei no repositório. Eu creditei esta postagem no código. wordpress.org/plugins/…
John Dee