在加载时覆盖WordPress插件转换文件

LeB*_*Ben 6 wordpress wordpress-plugin wpml

我正在使用带有插件The Events Calendar的法语WordPress .

这个插件附带一个捆绑的法语翻译,但它有一些错误.我想修复它们但更换原始文件是一个坏主意,因为它将被下一次更新所取代.我联系了开发人员提交修复程序但可能需要一些时间.

在此期间,我想从我的模板目录加载一个副本.我已经尝试过多种方式:

load_plugin_textdomain( 'tribe-events-calendar', get_template_directory() . '/languages' );
Run Code Online (Sandbox Code Playgroud)

或者

add_filter('override_load_textdomain', …)
Run Code Online (Sandbox Code Playgroud)

在我的functions.php中,但它似乎不起作用.我唯一能做的就是禁用原始翻译文件的加载.

有没有办法在加载时替换插件转换文件?我也使用WPML,但在"Translate with .mo files"模式中没有"Translate with WPML",所以我无法动态更改插件翻译.也许WPML可以加载我自己的事件日历翻译?

小智 7

我是 Transposh 插件的作者,

您的答案实际上是在以下四个过滤器中:

   add_filter('gettext', ......, 3);
   add_filter('gettext_with_context', ......, 3);
   add_filter('ngettext', ......, 4);
   add_filter('ngettext_with_context', ....., 4);
Run Code Online (Sandbox Code Playgroud)

(当然,您需要添加功能和优先级而不是.....)

这些函数将获取字符串和域,您可以使用它们来执行以下功能:

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


Jiw*_*oks 5

您可以在您的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 );
Run Code Online (Sandbox Code Playgroud)

您必须将两个文件变量替换为实际的语言文件。

但是我们假设法语文件在插件语言文件夹中,而您的替代语言文件在语言主题文件夹中。

这个想法是:

  • 卸载已由WP自动加载的语言
  • 首先加载您的替代文件。首先加载它很重要,因为当您为此文本域加载另一个语言文件时,将跳过已经定义的翻译(请参阅WP core)。
  • 加载原始翻译文件,实际上将加载替代文件的所有未翻译的字符串。

这仅适用于已编译的mo文件。

您只能将要覆盖的几个字符串添加到覆盖文件中。