My proposed fix to bug 34987: gender not working in many special pages.
authorNiklas Laxström <nikerabbit@users.mediawiki.org>
Wed, 7 Mar 2012 10:13:58 +0000 (10:13 +0000)
committerNiklas Laxström <nikerabbit@users.mediawiki.org>
Wed, 7 Mar 2012 10:13:58 +0000 (10:13 +0000)
I haven't checked if there are other places whereh context is set to Message class, but if there are they might need a fix too.

includes/Message.php
includes/SpecialPage.php

index 3c5d5d7..73914d7 100644 (file)
@@ -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
index c9c6f02..3f8b88e 100644 (file)
@@ -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;
        }
 
        /**