diff --git a/includes/Message.php b/includes/Message.php index 3c5d5d7d655..73914d7b922 100644 --- a/includes/Message.php +++ b/includes/Message.php @@ -90,8 +90,7 @@ * ->plain(); * @endcode * - * @note You cannot parse the text except in the content or interface - * @note languages + * @note You can parse the text only in the content or interface languages * * @section message_compare_old Comparison with old wfMsg* functions: * @@ -341,6 +340,18 @@ class Message { return $this; } + /** + * Allows manipulating the interface message flag directly. + * Can be used to restore the flag after setting a language. + * @param $value bool + * @return Message: $this + * @since 1.20 + */ + public function setInterfaceMessageFlag( $value ) { + $this->interface = (bool) $value; + return $this; + } + /** * Enable or disable database use. * @param $value Boolean diff --git a/includes/SpecialPage.php b/includes/SpecialPage.php index c9c6f025bb7..3f8b88e1d3a 100644 --- a/includes/SpecialPage.php +++ b/includes/SpecialPage.php @@ -768,7 +768,15 @@ class SpecialPage { // Works fine as the first parameter, which appears elsewhere in the // code base. Sighhhh. $args = func_get_args(); - return call_user_func_array( array( $this->getContext(), 'msg' ), $args ); + $message = call_user_func_array( array( $this->getContext(), 'msg' ), $args ); + // RequestContext passes context to wfMessage, and the language is set from + // the context, but setting the language for Message class removes the + // interface message status, which breaks for example usernameless gender + // invokations. Restore the flag when not including special page in content. + if ( !$this->including() ) { + $message->setInterfaceMessageFlag( true ); + } + return $message; } /**