我想我找到了解决方案,但是在此之前
前提
load_theme_textdomain()
并且load_child_theme_textdomain()
基本上相等,唯一的区别是它们使用的默认路径:
- 他们获取当前语言(使用
get_locale()
),并将相对的.mo文件添加到作为参数传递的路径中;
- 然后,他们会调用
load_textdomain()
textdomain和.mo文件的生成路径作为参数传递。
然后load_textdomain
将.mo文件加载到全局textdomain变量中,但是正如我们可以从源代码中读取的那样:
如果该域已经存在,则翻译将被合并。
如果两个集合具有相同的字符串,则将采用原始值的转换。
因此,为了仅覆盖/替换我们想要的主题父级的字符串,我们需要在父主题加载其.mo文件之前为父文本域加载一个自定义.mo文件,其中仅包含已转换的字符串。
解
最后,我只是简单地在子主题语言文件夹中创建了一个带有父主题名称的文件夹(为方便起见),并将用于父文本域的自定义.mo文件(其中一个用于语言,xx_XX.mo
形式为xx_XX
语言代码在哪里)。
然后functions.php
,在after_setup_theme
操作期间,我在子主题文件中添加了一行,靠近为我的子主题textdomain加载.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
,就像前提条件中所说的一样。