是子主题所必需的文本域

时间:2016-12-16 作者:Ayanize

对不起,我问了你一个问题。

子主题是否需要文本域?我正在构建一个没有声明文本域的简单子主题。因此,当我使用要翻译的字符串时,我应该使用父主题文本域(是的,父主题加载了文本域,并且还有.mo/.po文件)。

例如,在我的子主题模板中添加此行

<?php __(\'Some String\', \'parent-text-domain\');> 
上面的字符串会被翻译吗?

提前感谢

2 个回复
最合适的回答,由SO网友:gmazzap 整理而成

TL;DR: 如果使用父主题中的字符串,例如它们在父主题中的使用方式,则不需要为子主题设置文本域。

但如果您使用父主题中未使用的字符串,为了使其可翻译,您将需要另一个具有相关翻译的文本域(.mo) 文件。

翻译工作流当WordPress在翻译函数中遇到字符串时,它:

检查是否已加载所需文本域的翻译(通过load_plugin_textdomainload_theme_textdomainload_textdomain), 如果是,则转到第3点

  • 检查翻译文件夹(默认情况下wp-content/languages) 包含匹配的textdomain文件。匹配的textdomain文件为"{$domain}-{$locale}.mo" 哪里$domain 是要翻译的字符串的文本域,并且$locale 是网站的当前区域设置。如果找不到该文件,则返回原始字符串,否则将加载该字符串并将WP转发到下一点_n()) 这些都完成了。否则,WP将转发到下一点https://developer.wordpress.org/?s=gettext&post_type%5B%5D=wp-parser-hook) 最后返回结果当您在子主题的翻译功能中使用父主题文本域时(假设父主题发货并加载textdomain文件,或者在翻译文件夹中有翻译文件),WordPress将到达第3点在上面的列表中,因此如果字符串在文件中可用(因为用于父主题),它将被转换,否则不会被转换。

    这意味着父主题中的自定义字符串需要自己的翻译文件。

    理论上,可以在另一个翻译文件中使用父textdomain,因为WordPress能够多次加载同一个文本域;“合并”;但这有问题,因为该格式中可能只存在一个文件"{$domain}-{$locale}.mo" 在翻译文件夹中(请参见上面列表中的第2点)。

    因此,总而言之,如果子主题包含父主题中未使用的字符串,使其可翻译的唯一可行方法是使用自己的文本域和翻译文件。

  • SO网友:docker

    如果子主题包含与父主题不同的字符串。

    在子主题中使用不同textdomain的正确方法是load_child_theme_textdomain() 立即运行。您可以使用与其他load\\uUb相同的方法_textdomain函数。

    Beware!

    与插件语言文件不同,像my\\u child\\u theme-de\\u de.mo这样的名称将不起作用。虽然插件语言文件允许您在文件名中指定文本域,但这不适用于主题和子主题。主题的语言文件should include the language shortcut ONLY.