Fix Message::newFromSpecifier for nested RawMessage
[lhc/web/wiklou.git] / includes / Message.php
index 8ac73b3..712d3f1 100644 (file)
@@ -384,21 +384,30 @@ class Message implements MessageSpecifier, Serializable {
 
        /**
         * Transform a MessageSpecifier or a primitive value used interchangeably with
-        * specifiers (a message key string, or a key + params array) into a proper Message
+        * specifiers (a message key string, or a key + params array) into a proper Message.
+        *
+        * Also accepts a MessageSpecifier inside an array: that's not considered a valid format
+        * but is an easy error to make due to how StatusValue stores messages internally.
+        * Further array elements are ignored in that case.
+        *
         * @param string|array|MessageSpecifier $value
         * @return Message
         * @throws InvalidArgumentException
+        * @since 1.27
         */
        public static function newFromSpecifier( $value ) {
+               $params = [];
+               if ( is_array( $value ) ) {
+                       $params = $value;
+                       $value = array_shift( $params );
+               }
+
                if ( $value instanceof RawMessage ) {
                        $message = new RawMessage( $value->getKey(), $value->getParams() );
                } elseif ( $value instanceof MessageSpecifier ) {
                        $message = new Message( $value );
-               } elseif ( is_array( $value ) ) {
-                       $key = array_shift( $value );
-                       $message = new Message( $key, $value );
                } elseif ( is_string( $value ) ) {
-                       $message = new Message( $value );
+                       $message = new Message( $value, $params );
                } else {
                        throw new InvalidArgumentException( __METHOD__ . ': invalid argument type '
                                . gettype( $value ) );
@@ -446,12 +455,12 @@ class Message implements MessageSpecifier, Serializable {
        public function getTitle() {
                global $wgContLang, $wgForceUIMsgAsContentMsg;
 
-               $code = $this->getLanguage()->getCode();
                $title = $this->key;
                if (
-                       $wgContLang->getCode() !== $code
+                       !$this->language->equals( $wgContLang )
                        && in_array( $this->key, (array)$wgForceUIMsgAsContentMsg )
                ) {
+                       $code = $this->language->getCode();
                        $title .= '/' . $code;
                }