在子主题上覆盖父主题翻译


12

我有一个父主题,可以正确使用load_theme_textdomain()多种语言来加载所有已翻译的字符串。

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

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

我知道它们是否在模板文件中,我可以替换该文件,只需更改这些字符串的文本域,但是不幸的是,我所谈论的字符串在很多地方以及仪表板中都使用过(因此在某些过滤器/动作函数中) )。

所以我的问题是:是否有一种方法可以替换子主题中的那些翻译后的字符串而不必替换父模板文件或函数?

我不知道,也许在子主题的languages文件夹内添加一个parent-theme.mo文件,只翻译了那些字符串,或者类似的东西。

Answers:


9

我想我找到了解决方案,但是在此之前

前提

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,就像前提条件中所说的一样。


4

您可以使用子主题文件夹中的语言文件。首先,您必须知道父主题正在使用哪个文本域。然后,仅使用您的语言作为文件名(例如de_DE.po / de_DE.mo或nl_NL.po / nl_NL.mo)创建.po和.mo文件,并将它们放入子主题目录中的“语言”文件夹中例如。

然后,您可以使用来初始化文本域load_child_theme_textdomain()

load_child_theme_textdomain( 'the_text_domain', get_stylesheet_directory() . '/languages/' );

请注意,您可以通过查找功能找到的文本域调用像__()_e()父主题PHP文件中。第二个参数是文本域:__( 'Translated text string', 'text_domain' );


谢谢@redelschaap,最后,只要您为父文本域使用的文件夹与子文本域使用的文件夹不同,您的解决方案就可以使用:这很重要!:)
d79 2015年

您可以从子主题中加载多个文本域。但是您也可以仅对所有翻译使用父主题文本域,因为在加载相同文本域的文件时会合并翻译。
redelschaap 2015年

0

Wordpress 5.0.1的2019年更新。

  1. 档案中不得有父母或孩子。例如,提供西班牙语的墨西哥语翻译应包含文件child-theme-name / languages / es_MX.po和/child-theme-name/languages/es_MX.mo
  2. 子主题functions.php应该具有以下代码。注意,函数load_child_theme_textdomain()的第一个参数是PARENT主题,而不是子主题:
function child_theme_slug_setup() {
    load_child_theme_textdomain( 'parent-theme-slug', get_stylesheet_directory() . '/languages' );
}
add_action( 'after_setup_theme', 'child_theme_slug_setup' );
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.