Substitui a tradução do tema pai no tema filho

12

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

Em seguida, criei um tema filho que usa load_child_theme_textdomain() para obter a mesma coisa para suas strings.

Há determinadas strings traduzidas para um idioma específico no tema pai que 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 textdomain para essas strings, mas infelizmente os que eu estou falando são usados em muitos lugares e também no painel (então dentro de algum filtro / funções de ação).

Então, minha pergunta é: existe uma maneira de substituir as strings traduzidas dentro do tema filho sem ter que 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 aquelas strings traduzidas, ou algo assim.

    
por d79 01.05.2015 / 02:32

2 respostas

10

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;
  • , em seguida, chamam load_textdomain() passando como argumento o textdomain e o caminho resultante para o arquivo .mo.

Em seguida, load_textdomain carrega o arquivo .mo na variável global textdomain, mas como podemos ler no source :

  

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

     

Se os dois conjuntos tiverem a mesma string, a tradução do valor original será obtida.

Assim, para substituir / substituir apenas as strings do pai do tema que desejamos, precisamos carregar um arquivo .mo personalizado para o textdomain pai, contendo apenas as strings traduzidas, antes do o tema pai carrega seu arquivo .mo.

Solução

No final, eu 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 textdomain pai (um para o idioma, em o xx_XX.mo form, onde xx_XX é o código do idioma.

Em seguida, adicionei uma linha no meu arquivo de functions.php do tema filho durante a ação after_setup_theme , perto da que carrega o arquivo .mo do textdomain 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 arquivo functions.php do tema filho é carregado antes do pai, esse conjunto de cadeias terá precedência sobre a tradução do tema pai (ou eu poderia ter definido a prioridade usando o terceiro parâmetro do add_action function).

Nota: eu poderia ter usado load_child_theme_textdomain em vez de load_theme_textdomain , como dito na premissa de que teria sido o mesmo.

    
por d79 20.05.2015 / 00:48
4

Você pode usar arquivos de idioma que estão na pasta do tema filho. 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 dentro do diretório do tema filho, "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 de texto procurando por chamadas de função como __() ou _e() nos arquivos PHP do tema pai. O segundo parâmetro é o domínio de texto: __( 'Translated text string', 'text_domain' );

    
por redelschaap 15.05.2015 / 09:31