Substituir tradução do tema pai no tema filho

11

Eu tenho um tema pai que usa corretamente load_theme_textdomain()para carregar todas as seqüências traduzidas em vários idiomas.

Então eu criei um tema filho que usa load_child_theme_textdomain()para conseguir a mesma coisa para suas seqüências de caracteres.

Há certas sequências traduzidas para um idioma específico no tema pai que eu gostaria de substituir / substituir no tema filho.

Eu sei que se eles estivessem em um arquivo de modelo, eu poderia substituir o arquivo e simplesmente alterar o domínio de texto para essas strings, mas infelizmente as de que estou falando são usadas em muitos lugares e também no painel (portanto, em algumas funções de filtro / ação )

Então, minha pergunta é: existe uma maneira de substituir as seqüências traduzidas dentro do tema filho sem precisar substituir arquivos ou funções de modelo pai?

Eu não sei, talvez adicionando um arquivo parent-theme.mo dentro da pasta de idiomas do tema filho com apenas as strings traduzidas, ou algo assim.

d79
fonte

Respostas:

9

Acho que encontrei uma solução, mas antes de um pouco

Premissa

load_theme_textdomain()e load_child_theme_textdomain()são basicamente iguais, a única diferença é o caminho padrão que eles usam:

  • eles obtêm o idioma atual (usando get_locale()) e adicionam o arquivo .mo relativo ao caminho passado como argumento;
  • eles chamam load_textdomain()passando como argumento o domínio de texto e o caminho resultante para o arquivo .mo.

Em seguida, load_textdomaincarrega o arquivo .mo na variável global de domínio de texto, mas como podemos ler a partir da fonte :

Se o domínio já existir, as traduções serão mescladas.

Se ambos os conjuntos tiverem a mesma sequência, a tradução do valor original será realizada.

Portanto, para substituir / substituir apenas as cadeias de caracteres do tema pai que desejamos, precisamos carregar um arquivo .mo personalizado para o domínio de texto pai, contendo apenas as cadeias traduzidas, antes que o tema pai carregue seu arquivo .mo.


Solução

No final, simplesmente criei uma pasta com o nome do tema pai (apenas por conveniência) na pasta de idiomas do tema filho e coloquei nela meus arquivos .mo personalizados para o domínio de texto pai (um para o idioma, no xx_XX.moformato, onde xx_XXestá o código do idioma).

E, em seguida, adicionei uma linha no meu functions.phparquivo de tema filho durante a after_setup_themeação, próximo à que carrega o arquivo .mo para o domínio de texto do meu tema filho:

add_action( 'after_setup_theme', function () {
    // load custom translation file for the parent theme
    load_theme_textdomain( 'parent-textdomain', get_stylesheet_directory() . '/languages/parent-theme' );
    // load translation file for the child theme
    load_child_theme_textdomain( 'my-child-theme', get_stylesheet_directory() . '/languages' );
} );

Como o functions.phparquivo do tema filho é carregado antes do pai, esse conjunto de seqüências terá precedência sobre a tradução do tema pai (ou eu poderia ter definido a prioridade usando o terceiro parâmetro da add_actionfunção).


Nota: Eu poderia ter usado em load_child_theme_textdomainvez de load_theme_textdomain, como dito na premissa, seria o mesmo.

d79
fonte
4

Você pode usar arquivos de idioma que estão na pasta de temas filhos. Primeiro, você precisa saber qual domínio de texto o tema pai está usando. Em seguida, crie os arquivos .po e .mo com apenas seu idioma como o nome do arquivo (por exemplo, de_DE.po / de_DE.mo ou nl_NL.po / nl_NL.mo) e coloque-os em uma pasta no diretório de temas filhos, "languages" por exemplo.

Você pode inicializar o domínio de texto com load_child_theme_textdomain():

load_child_theme_textdomain( 'the_text_domain', get_stylesheet_directory() . '/languages/' );

Observe que você pode encontrar o domínio do texto procurando chamadas de função como __()ou _e()nos arquivos PHP do tema pai. O segundo parâmetro é o domínio do texto:__( 'Translated text string', 'text_domain' );

redelschaap
fonte
obrigado @redelschaap, no final, sua solução funcionaria contanto que você usasse uma pasta diferente para o domínio de texto pai da pasta usada para o domínio de texto filho: essa era a pegadinha! :)
d79
Você pode carregar vários domínios de texto de dentro do seu tema filho. Mas você também pode usar o domínio de texto do tema pai para todas as traduções, pois as traduções são mescladas ao carregar arquivos para o mesmo domínio de texto.
Redelschaap 20/05
0

Uma atualização de 2019 para o Wordpress 5.0.1.

  1. Os arquivos NÃO devem conter o slug pai ou filho. Por exemplo, fornecer tradução mexicana para o espanhol deve ter arquivos nome do tema filho / languages ​​/ es_MX.po e /child-theme-name/languages/es_MX.mo
  2. O tema filho functions.php deve ter o seguinte código. Observe que o primeiro parâmetro da função load_child_theme_textdomain () é o slug do tema PARENT, não o filho:
function child_theme_slug_setup() {
    load_child_theme_textdomain( 'parent-theme-slug', get_stylesheet_directory() . '/languages' );
}
add_action( 'after_setup_theme', 'child_theme_slug_setup' );
Cesar
fonte