覆盖默认的WordPress核心翻译


11

WordPress设置为荷兰语。当我使用get_the_archive_title()主题时,会在类别存档页面上正确输出“类别:类别名称”。但是,我希望阅读“ Sectie:类别名称”。

我不想更改wp-content / languages文件夹中的荷兰语文件,因为它将通过WordPress更新来更新。

我尝试复制该翻译文件,更改“类别”翻译,然后将新的nl_NL.mo文件放入my-theme / languages中。这没有任何作用。

如何在不更改核心翻译文件的情况下为某些字符串实现不同的翻译?

Answers:


15

您可以使用gettext过滤器

add_filter( 'gettext', 'cyb_filter_gettext', 10, 3 );
function cyb_filter_gettext( $translated, $original, $domain ) {

    // Use the text string exactly as it is in the translation file
    if ( $translated == "Categorie: %s" ) {
        $translated = "Sectie: %s";
    }

    return $translated;
}

如果您需要使用上下文过滤翻译,请使用gettext_with_contextfilter

add_filter( 'gettext_with_context', 'cyb_filter_gettext_with_context', 10, 4 );
function cyb_filter_gettext_with_context( $translated, $original, $context, $domain ) {

    // Use the text string exactly as it is in the translation file
    if ( $translated == "Categorie: %s" ) {
        $translated = "Sectie: %s";
    }

    return $translated;
}

带上下文的翻译意味着在用于翻译字符串的gettext函数中提供了上下文。例如,这是没有上下文的:

$translated = __( 'Search', 'textdomain' );

这是与上下文相关的:

$translated = _x( 'Search', 'form placeholder', 'textdomain' );

类似的过滤器可用于复数翻译([_n()][2][_nx()][2]):ngettextngettext_with_context


1
可行!我必须执行“类别:%s”和“ Sectie:%s”,因为文本必须与翻译文件中的文本完全相同。
弗洛里安2015年

哦,是的,这是正确的。我不知道要翻译的确切文字。
cybmeta 2015年

1
很棒的代码–请注意,gettext过滤器不会捕获使用“上下文”字符串的翻译,而这些将需要gettext_with_context
Manu

感谢您提供的出色解决方案。在构建子主题并愿意覆盖父主题的某些译文时,我用下面的行替换了建议的函数体return $domain != 'child-domain' && ( $new = __( $original, 'child-domain' ) ) != $original ? $new : $translated;。这样,我可以将主要翻译保留在子主题的PO文件中,而不用将它们连接到功能代码中。
佛朗哥

谢谢cybmeta!我使用此技术通过在存储库中发布的插件来更改核心文本。我将此帖子归功于代码。wordpress.org/plugins/…–
约翰·迪
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.