我想翻译一个插件的错误消息,该插件阻止我们表单中的垃圾邮件,但偶尔会阻止合法(活人)表单提交。消息被编码为可翻译的-在插件本身中,行是:
$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解决方案。
最合适的回答,由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函数调用中。