Do Child-Themes carrega automaticamente a Tradução a partir do Tema-pai?

Basta criar um tema infantil – digamos tecnicamente, sem adicionar nada além do mínimo style.css – para que a tradução do tema pai seja usada automaticamente para o tema infantil também?

child-theme/style.css

 /** * Theme Name: Child-Theme Child * Theme URI: http://example.com/ * Description: Child theme for the Twentytwelve theme * Author: Theme Author * Author URI: http://example.com/ * Template: twentytwelve * Version: 0.1.0 */ 

O tema twentytwelve tem os arquivos de tradução de idiomas padrão.

E se isso não acontecer automaticamente no meu site, qual seria um bom lugar para começar a solucionar problemas da tradução perdida?

Solutions Collecting From Web of "Do Child-Themes carrega automaticamente a Tradução a partir do Tema-pai?"

Basta criar um tema infantil – digamos tecnicamente, sem adicionar nada além do mínimo estilo.css – para que a tradução do tema pai seja usada automaticamente para o tema infantil também?

Basicamente, a resposta é NÃO , … mas … há uma opção:

Adicione um plugin mu.

Este (MU-) Plugin faz várias coisas:

  1. Ele se after_setup_theme em after_setup_theme em uma prioridade de 20 – supondo que o arquivo de texto original / i18n .mo seja carregado corretamente na prioridade padrão no gancho correto.
  2. Em seguida, ele recupera uma instanceof do WP_Theme – neste caso, o tema filho.
  3. Em seguida, verifica se realmente existe um tema infantil em uso.
  4. Se isso fosse verdade, basta carregar o domínio do texto no arquivo pai.

Na verdade, é bastante fácil, pois a class principal faz muitos cheques para nós: ele recupera outra instância do WP_Theme para o tema pai. Em seguida, verifica se o header TextDomain está configurado, usando: $current_theme->get( 'TextDomain' ); . O ponto, portanto, é que vem uma convenção no jogo: Este plugin funcionará, se o tema principal obtiver um Text Domain e (!) Um header de Domain Path definido.

 < ?php /** * Plugin Name: (#113391) Parent Theme i18n Autoloader * Description: Load Twenty12 Child theme translation files automagically from Parent */ add_action( 'after_setup_theme', 'wpse113391_parent_theme_i18n_autoloader', 20 ); function wpse113391_parent_theme_i18n_autoloader() { $current_theme = wp_get_theme(); if ( is_child_theme() ) $current_theme->parent()->load_textdomain(); } 

Agora, vem o problema: os temas padrão / padrão vinte * enviados pelo núcleo não (!) Possuem a input do header do Domain Path . E isso é algo que devemos corrigir instantaneamente, pois load_theme_textdomain() procura outro arquivo de tradução na pasta do tema pai, mas

  • primeiro na pasta do tema infantil: get_stylesheet_directory().WP_Theme::get( 'DomainPath' ) , o que significa que (A) o Domain Path do Domain Path precisa ser definido e precisa ser prefixado com uma barra: / .
  • então na pasta do tema filho: `get_stylesheet_directory (). ‘/ languages’.
  • e último no WP_LANGUAGE_DIR.'/themes' .

Nota: acho que é apenas um erro que nunca será corrigido para “compatibilidade com versões anteriores”, o que – em outras palavras – significa que há um bug, mas pode haver desenvolvedores que já estão trabalhando em torno dele. : P

Depois, há outro problema. O método de class load_textdomain() passa internamente $path para load_theme_textdomain() . E este parâmetro é $this->get_stylesheet_directory() . E este método retorna $this->theme_root . '/' . $this->stylesheet $this->theme_root . '/' . $this->stylesheet $this->theme_root . '/' . $this->stylesheet . Então, a function realmente funcionaria bastante bem , mas está desordenando simplesmente chamando uma substituição interna para get_stylesheet_directory() (que teria sido filtrada). Pode-se pensar agora

“Ei! A class implements ArrayAccess ! Então, simplesmente configure a chave da matriz faltando do Domain Path de Domain Path !”

Errado. Todas as propriedades da class são marcadas como private e inacessíveis.

Então você pode pensar

“Por que não simplesmente extend a class WP_Theme e definir um método set() para que possamos definir manualmente as inputs de header ausentes?”

Errado. A class em si é final e não extensível.

Resultado: ficamos com o que load_theme_textdomain() – a última function na cadeia de chamadas – nos oferece. Agora temos um plugin maior que intercepta a chamada load_theme_textdomain() para carregar o arquivo correto . Para não perturbar outras cargas de arquivos i18n, ele remove instantaneamente o retorno de chamada do filtro para manter seu ambiente arrumado.

 < ?php /** * Plugin Name: (#113391) Parent Theme i18n Autoloader * Description: Load Twenty12 Child theme translation files automagically from Parent */ add_action( 'muplugins_loaded', array( 'WPSE113391Parenti18nLoader', 'getInstance' ) ); class WPSE113391Parenti18nLoader { public static $instance = null; private $theme = null; public static function getInstance() { null === self::$instance AND self::$instance = new self; return self::$instance; } public function __construct() { add_action( 'after_setup_theme', array( $this, 'i18nAutoloader' ), 20 ); } public function setTheme( $theme ) { return $this->theme = $theme; } public function getTheme() { return $this->theme; } public function i18nAutoloader() { if ( ! is_child_theme() ) return; $current_theme = wp_get_theme(); if ( '' === $current_theme->parent()->get( 'DomainPath' ) ) { $this->setTheme( $current_theme->parent() ); add_filter( 'override_load_textdomain', array( $this, 'overrideI18nLoader' ), 10, 3 ); } $current_theme->parent()->load_textdomain(); } public function overrideI18nLoader( $activate, $domain, $mofile ) { // Don't intercept anything else: Self removing remove_filter( current_filter(), __FUNCTION__ ); // Rebuild the internals of WP_Theme::get_stylesheet_directory() and load_theme_textdomain() $theme = $this->getTheme(); $path = trailingslashit( $theme->get_theme_root() ).$theme->get_template(); $locale = apply_filters( 'theme_locale', get_locale(), $domain ); load_textdomain( $domain, "{$path}/{$locale}.mo" ); // Return true to abort further attempts return true; } } 

Por padrão, isso só funciona fora da checkbox. Se o tema principal oferecer tradução, o tema-filho leva-o a cabo.

Se não funcionar, algo está errado. Isso foi no meu caso, aqui é como eu fiz problemas – dispare isso:

  1. Eu ativava o tema dos pais para ver se a tradução estava funcionando lá – não.
  2. Então eu instalei o plugin Debug Translations para saber quais arquivos de idioma foram tentados para carregar.
  3. Em seguida, comecei uma session de debugging Xdebug ( ?XDEBUG_SESSION_START=1 ) e verifiquei a posição de carregamento que foi relatada quebrada, colocando um ponto de interrupção e entrando nela.

Então, descobriu que o WordPress procurava um nome de arquivo diferente. Corri o nome do arquivo e então funcionou.

Moral da história: os arquivos de idiomas dentro dos temas devem ser nomeados apenas com o local, como de_DE.mo no meu caso.


Falha:

 + wp-content +--+ themes | +--+ child-theme | | `--- style.css . . ... | `--+ twentytwelve | +--+ languages | | `--- twentytwelve-de_DE.mo < << . ... 

Trabalhando:

 + wp-content +--+ themes | +--+ child-theme | | `--- style.css . . ... | `--+ twentytwelve | +--+ languages | | `--- de_DE.mo < << . ...