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

时间:2013-09-16 11:36:08

标签: wordpress wordpress-plugin wpml

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

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

与此同时,我想从我的模板目录加载一个副本。我已经尝试过多种方式:

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

或者

add_filter('override_load_textdomain', …)

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

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

3 个答案:

答案 0 :(得分:4)

您可以在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 );

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

但是我们假设法语文件位于插件语言文件夹中,而覆盖语言文件位于语言主题文件夹中。

这个想法是:

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

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

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

答案 1 :(得分:2)

我是Transposh插件的作者,

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

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

(当然,你需要添加函数和优先级而不是.....)

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

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

答案 2 :(得分:1)

此解决方案使用wordpress的自动加载程序来覆盖插件,并且不需要其他编程逻辑,而是让CMS进行覆盖。

假设您要翻译一个名为my-plugin的插件。一个正确构建的插件将在目录wp-content/languages/plugins/中有两个翻译的文件,分别称为my-plugin-fr_FR.pomy-plugin-fr_FR.mo

如果您的插件具有此结构,则以下步骤将覆盖翻译,如果没有,您仍然可以尝试查看:

  1. 将上述.po和.mo文件复制到目录wp-content/languages/my-plugin中。如果该目录不存在,请创建它。
  2. 根据需要编辑翻译文件并保存。