9

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

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

同时,我想从我的模板目录中加载一个副本。我已经尝试了多种方法,例如:

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

或与

add_filter('override_load_textdomain', …)

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

有没有办法在加载时替换插件翻译文件?我也使用 WPML,但在“使用 .mo 文件翻译”模式下而不是在“使用 WPML 翻译”模式下,所以我无法即时更改插件翻译。也许 WPML 可以加载我自己的活动日历翻译?

4

3 回答 3

9

您可以在 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 文件。

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

于 2016-12-19T15:05:50.783 回答
7

我是 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;
}
于 2013-10-01T22:42:43.817 回答
3

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

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

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

  1. 将上面提到的 .po 和 .mo 文件复制到目录wp-content/languages/my-plugin中。如果该目录不存在,请创建它。
  2. 根据需要编辑翻译文件并保存。
于 2018-08-06T18:16:55.923 回答