问题描述
我有一个父主题正确使用 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。