问题描述

我有一个父主题正确使用 load_theme_textdomain()加载所有翻译的字符串在许多语言。

然后我创建了一个使用 load_child_theme_textdomain()的子主题,为其字符串实现同样的功能。

在父主题中有一些特定语言的翻译字符串,我想在子主题中替换/覆盖。

我知道如果他们在一个模板文件,我可以替换文件,只是改变这些字符串的文本域,但不幸的是,我在说的是在许多地方,也在仪表板中使用 (所以在一些过滤器/动作功能) 。

所以我的问题是:有没有办法替换这些翻译的字符串的子主题,而不必替换父模板文件或函数?

我不知道,也许在这个孩子主题的 languages 文件夹里面添加一个 parent-theme.mo 文件,只有这些字符串被翻译,或者是这样的。

最佳解决方案

我想我找到了一个解决方案,但之前有一点

Premise

load_theme_textdomain()load_child_theme_textdomain()基本相同,唯一的区别是使用默认路径:

  • 他们获得当前语言 (使用 get_locale()),并将相对的.mo 文件添加到作为参数传递的路径;

  • 然后他们将 load_textdomain()作为参数传递给.mo 文件的文本域和生成的路径。

然后 load_textdomain 将.mo 文件加载到全局文本域变量中,但是我们可以从 source 读取:

If the domain already exists, the translations will be merged.

If both sets have the same string, the translation from the original value will be taken.

因此,为了覆盖/替换我们想要的主题父项的字符串,我们需要在父主题加载.mo 文件之前加载父文本域的自定义.mo 文件,其中只包含那些已翻译的字符串。


解决方案

最后,我创建了一个文件夹,其父主题名称 (仅为了方便起见) 到子主题语言文件夹中,并将其自定义的.mo 文件放在父文本域中 (一个用于语言,在 xx_XX.mo 表单中) ,其中 xx_XX 是语言代码) 。

然后在 after_setup_theme 操作期间在我的小孩主题 functions.php 文件中添加了一行,靠近为我的子主题文本域加载.mo 文件的行:

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' );
} );

因为孩子主题的 functions.php 文件是在父母之前加载的,所以这组字符串将优先于父主题翻译 (或者我可以使用 add_action 函数的第三个参数设置优先级) 。


注意:我可以使用 load_child_theme_textdomain 而不是 load_theme_textdomain,如前所述,它将是一样的。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。