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

12

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

Luego creé un tema secundario que usa 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 de instrumentos (así que dentro de un filtro / funciones de acción).

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

No lo 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í.

    
pregunta d79 01.05.2015 - 02:32

2 respuestas

10

Creo que encontré una solución, pero antes de 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 relativo .mo a la ruta que se pasa como argumento;
  • luego llaman a load_textdomain() pasando como argumento tanto el dominio de texto como la ruta resultante al archivo .mo.

Luego, load_textdomain carga el archivo .mo en la variable de dominio de texto global, pero como podemos leer en source :

  

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.

Por lo tanto, para anular / reemplazar solo las cadenas del tema principal que queremos, necesitamos cargar un archivo .mo personalizado para el dominio de texto principal, que contiene solo las cadenas traducidas, antes del El tema principal carga 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 en ella mis archivos personalizados .mo para el dominio de texto principal (uno para el idioma, en la forma xx_XX.mo , donde xx_XX es el código de idioma).

Y luego agregué una línea en el archivo functions.php de mi tema secundario durante la acción after_setup_theme , cerca de la que carga el archivo .mo para el dominio de texto del 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 archivo functions.php 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% co_de función%).

Nota: podría haber usado add_action en lugar de load_child_theme_textdomain , como se dijo en la premisa de que hubiera sido lo mismo.

    
respondido por el d79 20.05.2015 - 00:48
4

Puede usar archivos de idioma que se encuentran en la carpeta de temas de su hijo. Primero tienes que saber qué dominio de texto está usando 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 del directorio de temas de su hijo, "idiomas" por ejemplo.

Luego puedes 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 de tema principal. El segundo parámetro es el dominio de texto: __( 'Translated text string', 'text_domain' );

    
respondido por el redelschaap 15.05.2015 - 09:31

Lea otras preguntas en las etiquetas