Translating an error message

时间:2017-05-17 作者:WebElaine

我想翻译一个插件的错误消息,该插件阻止我们表单中的垃圾邮件,但偶尔会阻止合法(活人)表单提交。消息被编码为可翻译的-在插件本身中,行是:

$err_msg = __( \'That action is currently not allowed.\' );
我的问题是,我的网站已经像插件一样使用了美国英语,从技术上讲,当我“翻译”这个字符串以便访问者看到“这不是你的错;请联系某某以便我们可以为你解决这个问题”的消息时,它仍然是美国英语。我已经在我的主题中设置了一个textdomain,并且能够生成。锅采购订单和。mo文件来翻译这一字符串。问题是,由于我将wp config设置为en\\u US,因此实际上并没有改变任何东西。

由于我没有在表单本身上触发错误的确切过程,所以我设置了一个管理仪表板小部件来测试翻译。如果小部件的内容

$err_msg = __( \'That action is currently not allowed.\' );
echo $err_msg;
我得到“当前不允许该操作。”如果我将小部件内容更改为

$err_msg = __( \'That action is currently not allowed.\', \'mytextdomain\' );
echo $err_msg;
我得到了我想要实现的自定义消息。

我不想自己编辑插件的文件,因为它们会在每次更新时恢复。插件中没有针对这条特定消息的过滤器或挂钩-有针对其他错误的过滤器,只是没有这个通用的过滤器。有没有更好的方法来更改这一串面向用户的文本?如果可能的话,我想要服务器端的东西,而不是JS/jQuery解决方案。

1 个回复
最合适的回答,由SO网友:Dave Romsey 整理而成

这个gettext 筛选器可用于更改使用gettext 功能。

add_filter( \'gettext\', \'wpse_change_error_string\', 10, 3 );
/**
 * Translate text.
 *
 * @param string $translation  Translated text.
 * @param string $text         Text to translate.
 * @param string $domain       Text domain. Unique identifier for retrieving translated strings.
 *
 * @return string
 */
function wpse_change_error_string( $translation, $text, $domain ) {
    // The \'default\' text domain is reserved for the WP core. If no text domain
    // is passed to a gettext function, the \'default\' domain will be used.
    if ( \'default\' === $domain && \'That action is currently not allowed.\' === $text ) {
        $translation = "This is the modified version of the original string...";
    }

    return $translation;
}
注意:幸运的是,WordPress核心当前没有使用当前不允许的字符串,这样就不会使用上述代码对消息进行不必要的更改。但是,如果核心确实使用了这一信息,就会发生这种情况。这就是为什么插件和主题使用自己独特的文本域很重要的原因之一。

这个gettext 函数系列(__(), _e, etc)应始终传递文本域。此规则的例外是WordPress核心,它没有显式传递文本域,但仍有一个名为default.

我会联系插件的作者,建议他们将自己的文本域添加到gettext函数调用中。

结束

相关推荐

Post types translation

我尝试翻译帖子类型名称(帖子、页面和附件)。我有以下代码:function create_skip_post_types_box () { $post_types = get_post_types(array(\'public\'=>true), \'names\' ); $opt = $this->_get_option(); $skip_types = is_array(@$opt[\'skip_post_types\