Anular la traducción del tema principal en el tema secundario

12

Tengo un tema principal que se usa correctamente load_theme_textdomain()para cargar todas las cadenas traducidas en muchos idiomas.

Luego creé un tema secundario que utiliza load_child_theme_textdomain()para lograr lo mismo para sus cadenas.

Hay ciertas cadenas traducidas para un idioma en particular en el tema principal que me gustaría reemplazar / anular en el tema secundario.

Sé que si estuvieran en un archivo de plantilla, podría reemplazar el archivo y simplemente cambiar el dominio de texto para esas cadenas, pero desafortunadamente las que estoy hablando se usan en muchos lugares y también en el tablero (así que dentro de algunas funciones de filtro / acción )

Entonces mi pregunta es: ¿hay alguna forma de reemplazar esas cadenas traducidas dentro del tema secundario sin tener que reemplazar los archivos o funciones de la plantilla principal?

No sé, tal vez agregue un archivo parent-theme.mo dentro de la carpeta de idiomas del tema secundario con solo esas cadenas traducidas, o algo así.

d79
fuente

Respuestas:

9

Creo que encontré una solución, pero antes un poco

Premisa

load_theme_textdomain()y load_child_theme_textdomain()son básicamente iguales, la única diferencia es la ruta predeterminada que usan:

  • obtienen el idioma actual (usando get_locale()) y agregan el archivo .mo relativo a la ruta pasada como argumento;
  • luego llaman load_textdomain()pasar como argumento tanto el dominio de texto como la ruta resultante al archivo .mo.

Luego load_textdomaincarga el archivo .mo en la variable global de dominio de texto, pero como podemos leer en la fuente :

Si el dominio ya existe, las traducciones se fusionarán.

Si ambos conjuntos tienen la misma cadena, se tomará la traducción del valor original.

Entonces, para anular / reemplazar solo las cadenas del tema principal que queremos, necesitamos cargar un archivo .mo personalizado para el dominio de texto principal, que contenga solo esas cadenas traducidas, antes de que el tema principal cargue su archivo .mo.


Solución

Al final, simplemente creé una carpeta con el nombre del tema principal (solo por conveniencia) en la carpeta de idiomas del tema secundario, y puse dentro mis archivos personalizados .mo para el dominio de texto primario (uno para el idioma, en el xx_XX.moformulario, donde xx_XXestá el código del idioma).

Y luego agregué una línea en mi functions.phparchivo de tema secundario durante la after_setup_themeacción, cerca de la que carga el archivo .mo para mi dominio de texto de tema secundario:

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

Debido a que el functions.phparchivo del tema secundario se carga antes que el principal, este conjunto de cadenas tendrá prioridad sobre la traducción del tema principal (o podría haber establecido la prioridad usando el tercer parámetro de la add_actionfunción).


Nota: podría haber usado en load_child_theme_textdomainlugar de load_theme_textdomain, como se dijo en la premisa, habría sido lo mismo.

d79
fuente
4

Puede usar archivos de idioma que se encuentran en la carpeta de temas de su hijo. Primero debe saber qué dominio de texto está utilizando el tema principal. Luego cree los archivos .po y .mo con solo su idioma como nombre de archivo (por ejemplo, de_DE.po / de_DE.mo o nl_NL.po / nl_NL.mo) y colóquelos en una carpeta dentro de su directorio de temas hijo, "idiomas" por ejemplo.

Luego puede inicializar el dominio de texto con load_child_theme_textdomain():

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

Tenga en cuenta que puede encontrar el dominio de texto buscando llamadas a funciones como __()o _e()dentro de los archivos PHP del tema principal. El segundo parámetro es el dominio de texto:__( 'Translated text string', 'text_domain' );

redelschaap
fuente
gracias @redelschaap, al final tu solución funcionaría siempre y cuando uses una carpeta diferente para el dominio de texto primario de la que usas para el dominio de texto secundario: ¡ese fue el truco! :)
d79
Puede cargar varios dominios de texto desde el tema de su hijo. Pero también puede usar el dominio de texto del tema principal para todas las traducciones, ya que las traducciones se combinan al cargar archivos para el mismo dominio de texto.
redelschaap
0

Una actualización de 2019 para Wordpress 5.0.1.

  1. Los archivos NO deberán tener la babosa principal o secundaria en ellos. Por ejemplo, la traducción mexicana al español debe tener archivos child-theme-name / languages ​​/ es_MX.po y /child-theme-name/languages/es_MX.mo
  2. El tema hijo functions.php debería tener el siguiente código. Observe que el primer parámetro de la función load_child_theme_textdomain () es la babosa del tema PADRE, no la del niño:
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
fuente