Anular un archivo de traducción de complemento de WordPress en carga

5 minutos de lectura

Estoy usando WordPress en francés con el complemento El calendario de eventos.

Este complemento viene con una traducción al francés incluida, pero tiene algunos errores. Quiero corregirlos, pero reemplazar el archivo original es una mala idea, ya que se reemplazará con la próxima actualización. Me puse en contacto con el desarrollador para enviar una solución, pero puede llevar algo de tiempo.

Mientras tanto, me gustaría cargar un duplicado que hice desde mi directorio de plantillas. Ya probé varias cosas como:

load_plugin_textdomain( 'tribe-events-calendar', get_template_directory() . '/languages' );

O con

add_filter('override_load_textdomain', …)

en mi functions.php pero no parece funcionar. Lo único que pude hacer fue deshabilitar la carga del archivo de traducción original.

¿Hay alguna forma de reemplazar un archivo de traducción de complemento en la carga? También uso WPML, pero en el modo “Traducir con archivos .mo” no en “Traducir con WPML”, por lo que no puedo cambiar la traducción del complemento sobre la marcha. ¿Tal vez WPML pueda cargar mi propia traducción del Calendario de eventos?

avatar de usuario
Jiwoks

Puede agregar estas pocas líneas en su archivo de tema functions.php

$text_domain = 'the-events-calendar';
$original_language_file = ABSPATH . DIRECTORY_SEPARATOR . 'wp-content' . DIRECTORY_SEPARATOR . 'plugins' . DIRECTORY_SEPARATOR . 'the-events-calendar' . DIRECTORY_SEPARATOR . 'languages' . DIRECTORY_SEPARATOR . 'the-events-calendar-fr_FR.mo';
$override_language_file = ABSPATH . DIRECTORY_SEPARATOR . 'wp-content' . DIRECTORY_SEPARATOR . 'themes' . DIRECTORY_SEPARATOR . 'your-own-theme' . DIRECTORY_SEPARATOR . 'languages' . DIRECTORY_SEPARATOR . 'the-events-calendar-fr_FR.override.mo'; 

// Unload the translation for the text domain of the plugin
unload_textdomain($text_domain);
// Load first the override file
load_textdomain($text_domain, $override_language_file );
// Then load the original translation file
load_textdomain($text_domain, $original_language_file );

Deberá reemplazar las dos variables de archivo con el archivo de idioma real.

Pero supondremos que el archivo de idioma francés está en la carpeta de idioma del complemento y su archivo de idioma de anulación está en la carpeta de tema de idioma.

La idea es:

  • Descarga el idioma que ya ha sido cargado automáticamente por WP
  • Cargue su archivo de anulación primero. Esto es importante para cargarlo primero, porque las traducciones ya definidas se omitirán cuando cargue otro archivo de idioma para este dominio de texto (ver Núcleo de WP).
  • Cargue el archivo de traducción original, que de hecho cargará todas las cadenas no traducidas del archivo de anulación.

Esto funciona solo con el archivo mo compilado.

Solo puede agregar a su archivo de anulación las pocas cadenas que desea anular.

  • Esta debería ser la respuesta aceptada. Creo que esta es la forma de WordPress

    – Alexandre Bourlier

    31 de enero de 2017 a las 17:16

  • Excelente. Deberías deshacerte de la “$ruta”. en la última línea

    – Christer Fernström

    20 de marzo de 2017 a las 13:40

  • @ChristerFernstrom tienes razón, lo acabo de quitar

    – Jiwoks

    20 de marzo de 2017 a las 15:07

  • Esto anulará TODOS los idiomas.

    – uve

    11 de abril de 2017 a las 12:23

  • Sí solución corta aquí. Sería mejor usar el gancho load_textdomain para verificar si el archivo cargado es o no el archivo que desea anular

    – Jiwoks

    12 de abril de 2017 a las 10:24

avatar de usuario
oferwald

Soy el autor del complemento Transposh,

Su respuesta en realidad está en los siguientes cuatro filtros:

   add_filter('gettext', ......, 3);
   add_filter('gettext_with_context', ......, 3);
   add_filter('ngettext', ......, 4);
   add_filter('ngettext_with_context', ....., 4);

(Naturalmente, debe agregar la función y la prioridad en lugar de …..)

Esas funciones obtendrán las cadenas y el dominio, y puede usarlas para hacer funciones como:

function gettext_filter($translation, $orig, $domain) {
    if ($domain == 'plugin_domain') {
        if ($orig == 'some text') {
            return "some translation";
        }
    }
    return $translation;
}

  • En realidad, me gustaría reemplazar todo el archivo de traducción, no cada cadena manualmente. Gracias de cualquier manera.

    – LeBen

    8 de octubre de 2013 a las 9:08

  • Estaba buscando lo mismo para otro plugin. Esta solución es útil, pero parece bastante pobre desde la perspectiva del rendimiento. Agregar un filtro para ejecutar una función para todas y cada una de las llamadas a gettext, con una verificación condicional para ver si una cadena que se está manejando en el momento dado sería, por cualquier cambio, la que nos interesa … esto requiere el gettext_filter para ejecutar tal vez cientos de veces para cada carga de página solo para traducir una cadena que estará allí solo una fracción del tiempo. Esto no puede ser bueno si desea optimizar el rendimiento de un sitio ocupado.

    – mikkelbreum

    5 de diciembre de 2013 a las 14:07


  • La mejor manera de hacer esto sería anular todo el archivo .mo de la misma manera que muchas plantillas de complementos permiten anular las plantillas simplemente colocando versiones alternativas en la raíz del tema.

    – mikkelbreum

    5 de diciembre de 2013 a las 14:12

  • Parece que la forma correcta de hacerlo es anular todo el archivo mo. Todavía no he trabajado mucho con esto, y no estoy seguro de si requiere soporte específico por parte del complemento en cuestión, pero eche un vistazo a este hilo para obtener orientación: wordpress.stackexchange.com/questions/30555/…

    – mikkelbreum

    5 de diciembre de 2013 a las 14:16

  • Sin embargo, tenga en cuenta que reemplazar todo el archivo mo significa que no obtendrá ninguna actualización para las traducciones del complemento, incluso si las cadenas cambian en el PHP de origen. Si el complemento cambia una de sus cadenas, no tendrá una traducción en su propio archivo.

    – Ariane

    22 de abril de 2020 a las 20:08

avatar de usuario
Jorge Dimitriadis

Esta solución utiliza los cargadores automáticos de wordpress para anular el complemento y no necesita una lógica de programación adicional, sino que permite que el CMS haga la anulación.

Digamos que quieres traducir un complemento llamado my-plugin. Un complemento creado correctamente tendría dos archivos traducidos en el directorio wp-content/languages/plugins/ llamó my-plugin-fr_FR.po y my-plugin-fr_FR.mo. (El lugar fr_FR es solo mi ejemplo para la traducción al francés, funciona respectivamente para otras traducciones de idiomas).

Si su complemento tiene esta estructura, los pasos a continuación anularán las traducciones, si no, puede intentar ver de todos modos:

  1. Copie los archivos .po y .mo mencionados anteriormente en el directorio wp-content/languages/my-plugin. Si el directorio no existe, créelo.
  2. Edite los archivos de traducción como desee y guárdelos.

¿Ha sido útil esta solución?