Merge "Fixed some @params documentation (includes/[specialpage|specials])"
[lhc/web/wiklou.git] / languages / Language.php
index fb73b1e..6400786 100644 (file)
@@ -180,7 +180,7 @@ class Language {
 
        /**
         * Get a cached or new language object for a given language code
-        * @param $code String
+        * @param string $code
         * @return Language
         */
        static function factory( $code ) {
@@ -205,7 +205,7 @@ class Language {
 
        /**
         * Create a language object for a given language code
-        * @param $code String
+        * @param string $code
         * @throws MWException
         * @return Language
         */
@@ -261,7 +261,10 @@ class Language {
         * @since 1.21
         */
        public static function isSupportedLanguage( $code ) {
-               return $code === strtolower( $code ) && is_readable( self::getMessagesFileName( $code ) );
+               return self::isValidBuiltInCode( $code )
+                       && ( is_readable( self::getMessagesFileName( $code ) )
+                               || is_readable( self::getJsonMessagesFileName( $code ) )
+               );
        }
 
        /**
@@ -273,8 +276,8 @@ class Language {
         * Based on regexes by Mark Davis of the Unicode Consortium:
         * http://unicode.org/repos/cldr/trunk/tools/java/org/unicode/cldr/util/data/langtagRegex.txt
         *
-        * @param $code string
-        * @param $lenient boolean Whether to allow '_' as separator. The default is only '-'.
+        * @param string $code
+        * @param bool $lenient Whether to allow '_' as separator. The default is only '-'.
         *
         * @return bool
         * @since 1.21
@@ -329,7 +332,7 @@ class Language {
         * not it exists. This includes codes which are used solely for
         * customisation via the MediaWiki namespace.
         *
-        * @param $code string
+        * @param string $code
         *
         * @return bool
         */
@@ -351,9 +354,9 @@ class Language {
 
        /**
         * Returns true if a language code is of a valid form for the purposes of
-        * internal customisation of MediaWiki, via Messages*.php.
+        * internal customisation of MediaWiki, via Messages*.php or *.json.
         *
-        * @param $code string
+        * @param string $code
         *
         * @throws MWException
         * @since 1.18
@@ -377,7 +380,7 @@ class Language {
        /**
         * Returns true if a language code is an IETF tag known to MediaWiki.
         *
-        * @param $code string
+        * @param string $code
         *
         * @since 1.21
         * @return bool
@@ -406,8 +409,8 @@ class Language {
        }
 
        /**
-        * @param $code
-        * @return String Name of the language class
+        * @param string $code
+        * @return string Name of the language class
         */
        public static function classFromCode( $code ) {
                if ( $code == 'en' ) {
@@ -420,7 +423,7 @@ class Language {
        /**
         * Includes language class files
         *
-        * @param $class string Name of the language class
+        * @param string $class Name of the language class
         */
        public static function preloadLanguageClass( $class ) {
                global $IP;
@@ -477,7 +480,7 @@ class Language {
        /**
         * Same as getFallbacksFor for current language.
         * @return array|bool
-        * @deprecated in 1.19
+        * @deprecated since 1.19
         */
        function getFallbackLanguageCode() {
                wfDeprecated( __METHOD__, '1.19' );
@@ -542,7 +545,7 @@ class Language {
 
        /**
         * Arbitrarily set all of the namespace names at once. Mainly used for testing
-        * @param $namespaces Array of namespaces (id => name)
+        * @param array $namespaces Array of namespaces (id => name)
         */
        public function setNamespaces( array $namespaces ) {
                $this->namespaceNames = $namespaces;
@@ -581,8 +584,8 @@ class Language {
         * echo $mw_ns; // prints 'MediaWiki'
         * </code>
         *
-        * @param $index Int: the array key of the namespace to return
-        * @return mixed, string if the namespace value exists, otherwise false
+        * @param int $index The array key of the namespace to return
+        * @return string|bool String if the namespace value exists, otherwise false
         */
        function getNsText( $index ) {
                $ns = $this->getNamespaces();
@@ -610,9 +613,9 @@ class Language {
        /**
         * Returns gender-dependent namespace alias if available.
         * See https://www.mediawiki.org/wiki/Manual:$wgExtraGenderNamespaces
-        * @param $index Int: namespace index
-        * @param $gender String: gender key (male, female... )
-        * @return String
+        * @param int $index Namespace index
+        * @param string $gender Gender key (male, female... )
+        * @return string
         * @since 1.18
         */
        function getGenderNsText( $index, $gender ) {
@@ -649,8 +652,8 @@ class Language {
         * Only matches namespace names for the current language, not the
         * canonical ones defined in Namespace.php.
         *
-        * @param $text String
-        * @return mixed An integer if $text is a valid value otherwise false
+        * @param string $text
+        * @return int|bool An integer if $text is a valid value otherwise false
         */
        function getLocalNsIndex( $text ) {
                $lctext = $this->lc( $text );
@@ -730,8 +733,8 @@ class Language {
         * Get a namespace key by value, case insensitive.  Canonical namespace
         * names override custom ones defined for the current language.
         *
-        * @param $text String
-        * @return mixed An integer if $text is a valid value otherwise false
+        * @param string $text
+        * @return int|bool An integer if $text is a valid value otherwise false
         */
        function getNsIndex( $text ) {
                $lctext = $this->lc( $text );
@@ -746,8 +749,8 @@ class Language {
        /**
         * short names for language variants used for language conversion links.
         *
-        * @param $code String
-        * @param $usemsg bool Use the "variantname-xyz" message if it exists
+        * @param string $code
+        * @param bool $usemsg Use the "variantname-xyz" message if it exists
         * @return string
         */
        function getVariantname( $code, $usemsg = true ) {
@@ -765,7 +768,7 @@ class Language {
        }
 
        /**
-        * @param $name string
+        * @param string $name
         * @return string
         */
        function specialPage( $name ) {
@@ -811,7 +814,7 @@ class Language {
        }
 
        /**
-        * @param  $image
+        * @param string $image
         * @return array|null
         */
        function getImageFile( $image ) {
@@ -826,7 +829,7 @@ class Language {
        }
 
        /**
-        * @param  $tog
+        * @param string $tog
         * @return string
         */
        function getUserToggle( $tog ) {
@@ -838,10 +841,10 @@ class Language {
         * Only those defined in MediaWiki, no other data like CLDR.
         * If $customisedOnly is true, only returns codes with a messages file
         *
-        * @param $customisedOnly bool
+        * @param bool $customisedOnly
         *
         * @return array
-        * @deprecated in 1.20, use fetchLanguageNames()
+        * @deprecated since 1.20, use fetchLanguageNames()
         */
        public static function getLanguageNames( $customisedOnly = false ) {
                return self::fetchLanguageNames( null, $customisedOnly ? 'mwfile' : 'mw' );
@@ -851,10 +854,10 @@ class Language {
         * Get translated language names. This is done on best effort and
         * by default this is exactly the same as Language::getLanguageNames.
         * The CLDR extension provides translated names.
-        * @param $code String Language code.
-        * @return Array language code => language name
+        * @param string $code Language code.
+        * @return array Language code => language name
         * @since 1.18.0
-        * @deprecated in 1.20, use fetchLanguageNames()
+        * @deprecated since 1.20, use fetchLanguageNames()
         */
        public static function getTranslatedLanguageNames( $code ) {
                return self::fetchLanguageNames( $code, 'all' );
@@ -862,13 +865,13 @@ class Language {
 
        /**
         * Get an array of language names, indexed by code.
-        * @param $inLanguage null|string: Code of language in which to return the names
+        * @param null|string $inLanguage Code of language in which to return the names
         *              Use null for autonyms (native names)
-        * @param $include string:
+        * @param string $include One of:
         *              'all' all available languages
         *              'mw' only if the language is defined in MediaWiki or wgExtraLanguageNames (default)
         *              'mwfile' only if the language is in 'mw' *and* has a message file
-        * @return array: language code => language name
+        * @return array Language code => language name
         * @since 1.20
         */
        public static function fetchLanguageNames( $inLanguage = null, $include = 'mw' ) {
@@ -911,21 +914,25 @@ class Language {
                        # We do this using a foreach over the codes instead of a directory
                        # loop so that messages files in extensions will work correctly.
                        foreach ( $returnMw as $code => $value ) {
-                               if ( is_readable( self::getMessagesFileName( $code ) ) ) {
+                               if ( is_readable( self::getMessagesFileName( $code ) )
+                                       || is_readable( self::getJsonMessagesFileName( $code ) )
+                               ) {
                                        $namesMwFile[$code] = $names[$code];
                                }
                        }
+
                        return $namesMwFile;
                }
+
                # 'mw' option; default if it's not one of the other two options (all/mwfile)
                return $returnMw;
        }
 
        /**
-        * @param $code string: The code of the language for which to get the name
-        * @param $inLanguage null|string: Code of language in which to return the name (null for autonyms)
-        * @param $include string: 'all', 'mw' or 'mwfile'; see fetchLanguageNames()
-        * @return string: Language name or empty
+        * @param string $code The code of the language for which to get the name
+        * @param null|string $inLanguage Code of language in which to return the name (null for autonyms)
+        * @param string $include 'all', 'mw' or 'mwfile'; see fetchLanguageNames()
+        * @return string Language name or empty
         * @since 1.20
         */
        public static function fetchLanguageName( $code, $inLanguage = null, $include = 'all' ) {
@@ -937,7 +944,7 @@ class Language {
        /**
         * Get a message from the MediaWiki namespace.
         *
-        * @param $msg String: message name
+        * @param string $msg Message name
         * @return string
         */
        function getMessageFromDB( $msg ) {
@@ -947,16 +954,16 @@ class Language {
        /**
         * Get the native language name of $code.
         * Only if defined in MediaWiki, no other data like CLDR.
-        * @param $code string
+        * @param string $code
         * @return string
-        * @deprecated in 1.20, use fetchLanguageName()
+        * @deprecated since 1.20, use fetchLanguageName()
         */
        function getLanguageName( $code ) {
                return self::fetchLanguageName( $code );
        }
 
        /**
-        * @param $key string
+        * @param string $key
         * @return string
         */
        function getMonthName( $key ) {
@@ -975,7 +982,7 @@ class Language {
        }
 
        /**
-        * @param $key string
+        * @param string $key
         * @return string
         */
        function getMonthNameGen( $key ) {
@@ -983,7 +990,7 @@ class Language {
        }
 
        /**
-        * @param $key string
+        * @param string $key
         * @return string
         */
        function getMonthAbbreviation( $key ) {
@@ -1002,7 +1009,7 @@ class Language {
        }
 
        /**
-        * @param $key string
+        * @param string $key
         * @return string
         */
        function getWeekdayName( $key ) {
@@ -1010,7 +1017,7 @@ class Language {
        }
 
        /**
-        * @param $key string
+        * @param string $key
         * @return string
         */
        function getWeekdayAbbreviation( $key ) {
@@ -1018,7 +1025,7 @@ class Language {
        }
 
        /**
-        * @param $key string
+        * @param string $key
         * @return string
         */
        function getIranianCalendarMonthName( $key ) {
@@ -1026,7 +1033,7 @@ class Language {
        }
 
        /**
-        * @param $key string
+        * @param string $key
         * @return string
         */
        function getHebrewCalendarMonthName( $key ) {
@@ -1034,7 +1041,7 @@ class Language {
        }
 
        /**
-        * @param $key string
+        * @param string $key
         * @return string
         */
        function getHebrewCalendarMonthNameGen( $key ) {
@@ -1042,7 +1049,7 @@ class Language {
        }
 
        /**
-        * @param $key string
+        * @param string $key
         * @return string
         */
        function getHijriCalendarMonthName( $key ) {
@@ -1104,11 +1111,11 @@ class Language {
         * time zone, if any. Note that the format characters crUeIOPTZ will assume
         * $ts is UTC if $zone is not given.
         *
-        * @param $format String
-        * @param $ts String: 14-character timestamp
+        * @param string $format
+        * @param string $ts 14-character timestamp
         *      YYYYMMDDHHMMSS
         *      01234567890123
-        * @param $zone DateTimeZone: Timezone of $ts
+        * @param DateTimeZone $zone Timezone of $ts
         * @todo handling of "o" format character for Iranian, Hebrew, Hijri & Thai?
         *
         * @throws MWException
@@ -1428,7 +1435,7 @@ class Language {
         *
         * Link: http://www.farsiweb.info/jalali/jalali.c
         *
-        * @param $ts string
+        * @param string $ts
         *
         * @return string
         */
@@ -1486,7 +1493,7 @@ class Language {
         *
         * @see http://phpnuke.org/modules.php?name=News&file=article&sid=8234&mode=thread&order=0&thold=0
         *
-        * @param $ts string
+        * @param string $ts
         *
         * @return string
         */
@@ -1536,7 +1543,7 @@ class Language {
         * The months are counted from Tishrei = 1. In a leap year, Adar I is 13
         * and Adar II is 14. In a non-leap year, Adar is 6.
         *
-        * @param $ts string
+        * @param string $ts
         *
         * @return string
         */
@@ -1677,7 +1684,7 @@ class Language {
         * Based on Carl Friedrich Gauss algorithm for finding Easter date.
         * Used for Hebrew date.
         *
-        * @param $year int
+        * @param int $year
         *
         * @return string
         */
@@ -1715,9 +1722,9 @@ class Language {
         *       http://en.wikipedia.org/wiki/Minguo_calendar
         *       http://en.wikipedia.org/wiki/Japanese_era_name
         *
-        * @param $ts String: 14-character timestamp
-        * @param $cName String: calender name
-        * @return Array: converted year, month, day
+        * @param string $ts 14-character timestamp
+        * @param string $cName Calender name
+        * @return array Converted year, month, day
         */
        private static function tsToYear( $ts, $cName ) {
                $gy = substr( $ts, 0, 4 );
@@ -1792,7 +1799,7 @@ class Language {
        /**
         * Roman number formatting up to 10000
         *
-        * @param $num int
+        * @param int $num
         *
         * @return string
         */
@@ -1822,7 +1829,7 @@ class Language {
        /**
         * Hebrew Gematria number formatting up to 9999
         *
-        * @param $num int
+        * @param int $num
         *
         * @return string
         */
@@ -1885,9 +1892,9 @@ class Language {
        /**
         * Used by date() and time() to adjust the time output.
         *
-        * @param $ts Int the time in date('YmdHis') format
-        * @param $tz Mixed: adjust the time by this amount (default false, mean we
-        *            get user timecorrection setting)
+        * @param int $ts The time in date('YmdHis') format
+        * @param mixed $tz Adjust the time by this amount (default false, mean we
+        *   get user timecorrection setting)
         * @return int
         */
        function userAdjust( $ts, $tz = false ) {
@@ -1970,9 +1977,9 @@ class Language {
         * }
         *</code>
         *
-        * @param $usePrefs Mixed: if true, the user's preference is used
-        *                         if false, the site/language default is used
-        *                         if int/string, assumed to be a format.
+        * @param int|string|bool $usePrefs If true, the user's preference is used
+        *   if false, the site/language default is used
+        *   if int/string, assumed to be a format.
         * @return string
         */
        function dateFormat( $usePrefs = true ) {
@@ -1998,8 +2005,8 @@ class Language {
 
        /**
         * Get a format string for a given type and preference
-        * @param $type string May be date, time or both
-        * @param $pref string The format name as it appears in Messages*.php
+        * @param string $type May be date, time or both
+        * @param string $pref The format name as it appears in Messages*.php
         *
         * @since 1.22 New type 'pretty' that provides a more readable timestamp format
         *
@@ -2028,13 +2035,13 @@ class Language {
        }
 
        /**
-        * @param $ts Mixed: the time format which needs to be turned into a
-        *            date('YmdHis') format with wfTimestamp(TS_MW,$ts)
-        * @param $adj Bool: whether to adjust the time output according to the
-        *             user configured offset ($timecorrection)
-        * @param $format Mixed: true to use user's date format preference
-        * @param $timecorrection String|bool the time offset as returned by
-        *                        validateTimeZone() in Special:Preferences
+        * @param mixed $ts The time format which needs to be turned into a
+        *   date('YmdHis') format with wfTimestamp(TS_MW,$ts)
+        * @param bool $adj Whether to adjust the time output according to the
+        *   user configured offset ($timecorrection)
+        * @param mixed $format True to use user's date format preference
+        * @param string|bool $timecorrection The time offset as returned by
+        *   validateTimeZone() in Special:Preferences
         * @return string
         */
        function date( $ts, $adj = false, $format = true, $timecorrection = false ) {
@@ -2047,13 +2054,13 @@ class Language {
        }
 
        /**
-        * @param $ts Mixed: the time format which needs to be turned into a
-        *            date('YmdHis') format with wfTimestamp(TS_MW,$ts)
-        * @param $adj Bool: whether to adjust the time output according to the
-        *             user configured offset ($timecorrection)
-        * @param $format Mixed: true to use user's date format preference
-        * @param $timecorrection String|bool the time offset as returned by
-        *                        validateTimeZone() in Special:Preferences
+        * @param mixed $ts The time format which needs to be turned into a
+        *   date('YmdHis') format with wfTimestamp(TS_MW,$ts)
+        * @param bool $adj Whether to adjust the time output according to the
+        *   user configured offset ($timecorrection)
+        * @param mixed $format True to use user's date format preference
+        * @param string|bool $timecorrection The time offset as returned by
+        *   validateTimeZone() in Special:Preferences
         * @return string
         */
        function time( $ts, $adj = false, $format = true, $timecorrection = false ) {
@@ -2066,14 +2073,14 @@ class Language {
        }
 
        /**
-        * @param $ts Mixed: the time format which needs to be turned into a
-        *            date('YmdHis') format with wfTimestamp(TS_MW,$ts)
-        * @param $adj Bool: whether to adjust the time output according to the
-        *             user configured offset ($timecorrection)
-        * @param $format Mixed: what format to return, if it's false output the
-        *                default one (default true)
-        * @param $timecorrection String|bool the time offset as returned by
-        *                        validateTimeZone() in Special:Preferences
+        * @param mixed $ts The time format which needs to be turned into a
+        *   date('YmdHis') format with wfTimestamp(TS_MW,$ts)
+        * @param bool $adj Whether to adjust the time output according to the
+        *   user configured offset ($timecorrection)
+        * @param mixed $format What format to return, if it's false output the
+        *   default one (default true)
+        * @param string|bool $timecorrection The time offset as returned by
+        *   validateTimeZone() in Special:Preferences
         * @return string
         */
        function timeanddate( $ts, $adj = false, $format = true, $timecorrection = false ) {
@@ -2090,7 +2097,7 @@ class Language {
         *
         * @since 1.20
         *
-        * @param integer $seconds The amount of seconds.
+        * @param int $seconds The amount of seconds.
         * @param array $chosenIntervals The intervals to enable.
         *
         * @return string
@@ -2116,7 +2123,7 @@ class Language {
         *
         * @since 1.20
         *
-        * @param integer $seconds The amount of seconds.
+        * @param int $seconds The amount of seconds.
         * @param array $chosenIntervals The intervals to enable.
         *
         * @return array
@@ -2147,21 +2154,21 @@ class Language {
        /**
         * Internal helper function for userDate(), userTime() and userTimeAndDate()
         *
-        * @param $type String: can be 'date', 'time' or 'both'
-        * @param $ts Mixed: the time format which needs to be turned into a
-        *            date('YmdHis') format with wfTimestamp(TS_MW,$ts)
-        * @param $user User object used to get preferences for timezone and format
-        * @param $options Array, can contain the following keys:
-        *        - 'timecorrection': time correction, can have the following values:
-        *             - true: use user's preference
-        *             - false: don't use time correction
-        *             - integer: value of time correction in minutes
-        *        - 'format': format to use, can have the following values:
-        *             - true: use user's preference
-        *             - false: use default preference
-        *             - string: format to use
+        * @param string $type Can be 'date', 'time' or 'both'
+        * @param mixed $ts The time format which needs to be turned into a
+        *   date('YmdHis') format with wfTimestamp(TS_MW,$ts)
+        * @param User $user User object used to get preferences for timezone and format
+        * @param array $options Array, can contain the following keys:
+        *   - 'timecorrection': time correction, can have the following values:
+        *     - true: use user's preference
+        *     - false: don't use time correction
+        *     - int: value of time correction in minutes
+        *   - 'format': format to use, can have the following values:
+        *     - true: use user's preference
+        *     - false: use default preference
+        *     - string: format to use
         * @since 1.19
-        * @return String
+        * @return string
         */
        private function internalUserTimeAndDate( $type, $ts, User $user, array $options ) {
                $ts = wfTimestamp( TS_MW, $ts );
@@ -2187,20 +2194,20 @@ class Language {
         * Get the formatted date for the given timestamp and formatted for
         * the given user.
         *
-        * @param $ts Mixed: the time format which needs to be turned into a
-        *            date('YmdHis') format with wfTimestamp(TS_MW,$ts)
-        * @param $user User object used to get preferences for timezone and format
-        * @param $options Array, can contain the following keys:
-        *        - 'timecorrection': time correction, can have the following values:
-        *             - true: use user's preference
-        *             - false: don't use time correction
-        *             - integer: value of time correction in minutes
-        *        - 'format': format to use, can have the following values:
-        *             - true: use user's preference
-        *             - false: use default preference
-        *             - string: format to use
+        * @param mixed $ts Mixed: the time format which needs to be turned into a
+        *   date('YmdHis') format with wfTimestamp(TS_MW,$ts)
+        * @param User $user User object used to get preferences for timezone and format
+        * @param array $options Array, can contain the following keys:
+        *   - 'timecorrection': time correction, can have the following values:
+        *     - true: use user's preference
+        *     - false: don't use time correction
+        *     - int: value of time correction in minutes
+        *   - 'format': format to use, can have the following values:
+        *     - true: use user's preference
+        *     - false: use default preference
+        *     - string: format to use
         * @since 1.19
-        * @return String
+        * @return string
         */
        public function userDate( $ts, User $user, array $options = array() ) {
                return $this->internalUserTimeAndDate( 'date', $ts, $user, $options );
@@ -2210,20 +2217,20 @@ class Language {
         * Get the formatted time for the given timestamp and formatted for
         * the given user.
         *
-        * @param $ts Mixed: the time format which needs to be turned into a
-        *            date('YmdHis') format with wfTimestamp(TS_MW,$ts)
-        * @param $user User object used to get preferences for timezone and format
-        * @param $options Array, can contain the following keys:
-        *        - 'timecorrection': time correction, can have the following values:
-        *             - true: use user's preference
-        *             - false: don't use time correction
-        *             - integer: value of time correction in minutes
-        *        - 'format': format to use, can have the following values:
-        *             - true: use user's preference
-        *             - false: use default preference
-        *             - string: format to use
+        * @param mixed $ts The time format which needs to be turned into a
+        *   date('YmdHis') format with wfTimestamp(TS_MW,$ts)
+        * @param User $user User object used to get preferences for timezone and format
+        * @param array $options Array, can contain the following keys:
+        *   - 'timecorrection': time correction, can have the following values:
+        *     - true: use user's preference
+        *     - false: don't use time correction
+        *     - int: value of time correction in minutes
+        *   - 'format': format to use, can have the following values:
+        *     - true: use user's preference
+        *     - false: use default preference
+        *     - string: format to use
         * @since 1.19
-        * @return String
+        * @return string
         */
        public function userTime( $ts, User $user, array $options = array() ) {
                return $this->internalUserTimeAndDate( 'time', $ts, $user, $options );
@@ -2233,20 +2240,20 @@ class Language {
         * Get the formatted date and time for the given timestamp and formatted for
         * the given user.
         *
-        * @param $ts Mixed: the time format which needs to be turned into a
-        *            date('YmdHis') format with wfTimestamp(TS_MW,$ts)
-        * @param $user User object used to get preferences for timezone and format
-        * @param $options Array, can contain the following keys:
-        *        - 'timecorrection': time correction, can have the following values:
-        *             - true: use user's preference
-        *             - false: don't use time correction
-        *             - integer: value of time correction in minutes
-        *        - 'format': format to use, can have the following values:
-        *             - true: use user's preference
-        *             - false: use default preference
-        *             - string: format to use
+        * @param mixed $ts the time format which needs to be turned into a
+        *   date('YmdHis') format with wfTimestamp(TS_MW,$ts)
+        * @param User $user User object used to get preferences for timezone and format
+        * @param array $options Array, can contain the following keys:
+        *   - 'timecorrection': time correction, can have the following values:
+        *     - true: use user's preference
+        *     - false: don't use time correction
+        *     - int: value of time correction in minutes
+        *   - 'format': format to use, can have the following values:
+        *     - true: use user's preference
+        *     - false: use default preference
+        *     - string: format to use
         * @since 1.19
-        * @return String
+        * @return string
         */
        public function userTimeAndDate( $ts, User $user, array $options = array() ) {
                return $this->internalUserTimeAndDate( 'both', $ts, $user, $options );
@@ -2328,7 +2335,7 @@ class Language {
        }
 
        /**
-        * @param $key string
+        * @param string $key
         * @return array|null
         */
        function getMessage( $key ) {
@@ -2343,9 +2350,9 @@ class Language {
        }
 
        /**
-        * @param $in
-        * @param $out
-        * @param $string
+        * @param string $in
+        * @param string $out
+        * @param string $string
         * @return string
         */
        function iconv( $in, $out, $string ) {
@@ -2365,7 +2372,7 @@ class Language {
        // callback functions for uc(), lc(), ucwords(), ucwordbreaks()
 
        /**
-        * @param $matches array
+        * @param array $matches
         * @return mixed|string
         */
        function ucwordbreaksCallbackAscii( $matches ) {
@@ -2373,7 +2380,7 @@ class Language {
        }
 
        /**
-        * @param $matches array
+        * @param array $matches
         * @return string
         */
        function ucwordbreaksCallbackMB( $matches ) {
@@ -2381,7 +2388,7 @@ class Language {
        }
 
        /**
-        * @param $matches array
+        * @param array $matches
         * @return string
         */
        function ucCallback( $matches ) {
@@ -2390,7 +2397,7 @@ class Language {
        }
 
        /**
-        * @param $matches array
+        * @param array $matches
         * @return string
         */
        function lcCallback( $matches ) {
@@ -2399,7 +2406,7 @@ class Language {
        }
 
        /**
-        * @param $matches array
+        * @param array $matches
         * @return string
         */
        function ucwordsCallbackMB( $matches ) {
@@ -2407,7 +2414,7 @@ class Language {
        }
 
        /**
-        * @param $matches array
+        * @param array $matches
         * @return string
         */
        function ucwordsCallbackWiki( $matches ) {
@@ -2418,7 +2425,7 @@ class Language {
        /**
         * Make a string's first character uppercase
         *
-        * @param $str string
+        * @param string $str
         *
         * @return string
         */
@@ -2437,8 +2444,8 @@ class Language {
        /**
         * Convert a string to uppercase
         *
-        * @param $str string
-        * @param $first bool
+        * @param string $str
+        * @param bool $first
         *
         * @return string
         */
@@ -2468,7 +2475,7 @@ class Language {
        }
 
        /**
-        * @param $str string
+        * @param string $str
         * @return mixed|string
         */
        function lcfirst( $str ) {
@@ -2486,8 +2493,8 @@ class Language {
        }
 
        /**
-        * @param $str string
-        * @param $first bool
+        * @param string $str
+        * @param bool $first
         * @return mixed|string
         */
        function lc( $str, $first = false ) {
@@ -2516,7 +2523,7 @@ class Language {
        }
 
        /**
-        * @param $str string
+        * @param string $str
         * @return bool
         */
        function isMultibyte( $str ) {
@@ -2524,7 +2531,7 @@ class Language {
        }
 
        /**
-        * @param $str string
+        * @param string $str
         * @return mixed|string
         */
        function ucwords( $str ) {
@@ -2556,7 +2563,7 @@ class Language {
        /**
         * capitalize words at word breaks
         *
-        * @param $str string
+        * @param string $str
         * @return mixed
         */
        function ucwordbreaks( $str ) {
@@ -2602,7 +2609,7 @@ class Language {
         * uses this function when it should be using a more general normalisation
         * function, then fix the caller.
         *
-        * @param $s string
+        * @param string $s
         *
         * @return string
         */
@@ -2611,7 +2618,7 @@ class Language {
        }
 
        /**
-        * @param $s string
+        * @param string $s
         * @return string
         */
        function checkTitleEncoding( $s ) {
@@ -2648,8 +2655,8 @@ class Language {
         * Some languages such as Chinese require word segmentation,
         * Specify such segmentation when overridden in derived class.
         *
-        * @param $string String
-        * @return String
+        * @param string $string
+        * @return string
         */
        function segmentByWord( $string ) {
                return $string;
@@ -2659,8 +2666,8 @@ class Language {
         * Some languages have special punctuation need to be normalized.
         * Make such changes here.
         *
-        * @param $string String
-        * @return String
+        * @param string $string
+        * @return string
         */
        function normalizeForSearch( $string ) {
                return self::convertDoubleWidth( $string );
@@ -2670,7 +2677,7 @@ class Language {
         * convert double-width roman characters to single-width.
         * range: ff00-ff5f ~= 0020-007f
         *
-        * @param $string string
+        * @param string $string
         *
         * @return string
         */
@@ -2690,8 +2697,8 @@ class Language {
        }
 
        /**
-        * @param $string string
-        * @param $pattern string
+        * @param string $string
+        * @param string $pattern
         * @return string
         */
        protected static function insertSpace( $string, $pattern ) {
@@ -2701,7 +2708,7 @@ class Language {
        }
 
        /**
-        * @param $termsArray array
+        * @param array $termsArray
         * @return array
         */
        function convertForSearchResult( $termsArray ) {
@@ -2713,7 +2720,7 @@ class Language {
        /**
         * Get the first character of a string.
         *
-        * @param $s string
+        * @param string $s
         * @return string
         */
        function firstChar( $s ) {
@@ -2776,7 +2783,7 @@ class Language {
        }
 
        /**
-        * @param $s string
+        * @param string $s
         * @return string
         */
        function recodeForEdit( $s ) {
@@ -2792,7 +2799,7 @@ class Language {
        }
 
        /**
-        * @param $s string
+        * @param string $s
         * @return string
         */
        function recodeInput( $s ) {
@@ -2817,7 +2824,7 @@ class Language {
         *
         * This is language-specific for performance reasons only.
         *
-        * @param $s string
+        * @param string $s
         *
         * @return string
         */
@@ -2840,8 +2847,8 @@ class Language {
         * The data is cached in process memory. This will go faster if you have the
         * FastStringSearch extension.
         *
-        * @param $file string
-        * @param $string string
+        * @param string $file
+        * @param string $string
         *
         * @throws MWException
         * @return string
@@ -2868,7 +2875,7 @@ class Language {
 
        /**
         * Return the correct HTML 'dir' attribute value for this language.
-        * @return String
+        * @return string
         */
        function getDir() {
                return $this->isRTL() ? 'rtl' : 'ltr';
@@ -2880,7 +2887,7 @@ class Language {
         *
         * Should be equivalent to CSS3 'start' text-align value....
         *
-        * @return String
+        * @return string
         */
        function alignStart() {
                return $this->isRTL() ? 'right' : 'left';
@@ -2892,7 +2899,7 @@ class Language {
         *
         * Should be equivalent to CSS3 'end' text-align value....
         *
-        * @return String
+        * @return string
         */
        function alignEnd() {
                return $this->isRTL() ? 'left' : 'right';
@@ -2905,7 +2912,7 @@ class Language {
         * because it makes the output HTML source code more readable. When
         * the output is plain text or can be escaped, getDirMark() should be used.
         *
-        * @param $opposite Boolean Get the direction mark opposite to your language
+        * @param bool $opposite Get the direction mark opposite to your language
         * @return string
         * @since 1.20
         */
@@ -2923,7 +2930,7 @@ class Language {
         * when the output is plain text or can be escaped. When the output is
         * HTML, use getDirMarkEntity() instead.
         *
-        * @param $opposite Boolean Get the direction mark opposite to your language
+        * @param bool $opposite Get the direction mark opposite to your language
         * @return string
         */
        function getDirMark( $opposite = false ) {
@@ -2945,7 +2952,7 @@ class Language {
        /**
         * An arrow, depending on the language direction.
         *
-        * @param $direction String: the direction of the arrow: forwards (default), backwards, left, right, up, down.
+        * @param string $direction The direction of the arrow: forwards (default), backwards, left, right, up, down.
         * @return string
         */
        function getArrow( $direction = 'forwards' ) {
@@ -2998,7 +3005,7 @@ class Language {
        /**
         * Fill a MagicWord object with data from here
         *
-        * @param $mw
+        * @param MagicWord $mw
         */
        function getMagic( $mw ) {
                // Saves a function call
@@ -3024,7 +3031,7 @@ class Language {
        /**
         * Add magic words to the extension array
         *
-        * @param $newWords array
+        * @param array $newWords
         */
        function addMagicWordsByLang( $newWords ) {
                $fallbackChain = $this->getFallbackLanguages();
@@ -3056,7 +3063,7 @@ class Language {
        /**
         * Italic is unsuitable for some languages
         *
-        * @param $text String: the text to be emphasized.
+        * @param string $text The text to be emphasized.
         * @return string
         */
        function emphasize( $text ) {
@@ -3079,11 +3086,10 @@ class Language {
         * See $separatorTransformTable on MessageIs.php for
         * the , => . and . => , implementation.
         *
-        * @todo check if it's viable to use localeconv() for the decimal
-        *       separator thing.
-        * @param $number Mixed: the string to be formatted, should be an integer
-        *        or a floating point number.
-        * @param $nocommafy Bool: set to true for special numbers like dates
+        * @todo check if it's viable to use localeconv() for the decimal separator thing.
+        * @param int|float $number The string to be formatted, should be an integer
+        *   or a floating point number.
+        * @param bool $nocommafy Set to true for special numbers like dates
         * @return string
         */
        public function formatNum( $number, $nocommafy = false ) {
@@ -3109,7 +3115,7 @@ class Language {
        /**
         * Front-end for non-commafied formatNum
         *
-        * @param mixed $number the string to be formatted, should be an integer
+        * @param int|float $number The string to be formatted, should be an integer
         *        or a floating point number.
         * @since 1.21
         * @return string
@@ -3119,7 +3125,7 @@ class Language {
        }
 
        /**
-        * @param $number string
+        * @param string $number
         * @return string
         */
        function parseFormattedNumber( $number ) {
@@ -3140,7 +3146,7 @@ class Language {
        /**
         * Adds commas to a given number
         * @since 1.19
-        * @param $number mixed
+        * @param mixed $number
         * @return string
         */
        function commafy( $number ) {
@@ -3193,7 +3199,7 @@ class Language {
        }
 
        /**
-        * @return String
+        * @return string
         */
        function digitGroupingPattern() {
                return self::$dataCache->getItem( $this->mCode, 'digitGroupingPattern' );
@@ -3219,7 +3225,7 @@ class Language {
         * The last two strings are chained with an "and".
         * NOTE: This function will only work with standard numeric array keys (0, 1, 2…)
         *
-        * @param $l Array
+        * @param string[] $l
         * @return string
         */
        function listToText( array $l ) {
@@ -3248,7 +3254,7 @@ class Language {
        /**
         * Take a list of strings and build a locale-friendly comma-separated
         * list, using the local comma-separator message.
-        * @param $list array of strings to put in a comma list
+        * @param string[] $list Array of strings to put in a comma list
         * @return string
         */
        function commaList( array $list ) {
@@ -3261,7 +3267,7 @@ class Language {
        /**
         * Take a list of strings and build a locale-friendly semicolon-separated
         * list, using the local semicolon-separator message.
-        * @param $list array of strings to put in a semicolon list
+        * @param string[] $list Array of strings to put in a semicolon list
         * @return string
         */
        function semicolonList( array $list ) {
@@ -3273,7 +3279,7 @@ class Language {
 
        /**
         * Same as commaList, but separate it with the pipe instead.
-        * @param $list array of strings to put in a pipe list
+        * @param string[] $list Array of strings to put in a pipe list
         * @return string
         */
        function pipeList( array $list ) {
@@ -3293,10 +3299,10 @@ class Language {
         *
         * If $length is negative, the string will be truncated from the beginning
         *
-        * @param $string String to truncate
-        * @param $length Int: maximum length (including ellipses)
-        * @param $ellipsis String to append to the truncated text
-        * @param $adjustLength Boolean: Subtract length of ellipsis from $length.
+        * @param string $string String to truncate
+        * @param int $length Maximum length (including ellipses)
+        * @param string $ellipsis String to append to the truncated text
+        * @param bool $adjustLength Subtract length of ellipsis from $length.
         *      $adjustLength was introduced in 1.18, before that behaved as if false.
         * @return string
         */
@@ -3346,7 +3352,7 @@ class Language {
         * Remove bytes that represent an incomplete Unicode character
         * at the end of string (e.g. bytes of the char are missing)
         *
-        * @param $string String
+        * @param string $string
         * @return string
         */
        protected function removeBadCharLast( $string ) {
@@ -3371,7 +3377,7 @@ class Language {
         * Remove bytes that represent an incomplete Unicode character
         * at the start of string (e.g. bytes of the char are missing)
         *
-        * @param $string String
+        * @param string $string
         * @return string
         */
        protected function removeBadCharFirst( $string ) {
@@ -3511,11 +3517,11 @@ class Language {
         * truncateHtml() helper function
         * like strcspn() but adds the skipped chars to $ret
         *
-        * @param $ret
-        * @param $text
-        * @param $search
-        * @param $start
-        * @param $len
+        * @param string $ret
+        * @param string $text
+        * @param string $search
+        * @param int $start
+        * @param null|int $len
         * @return int
         */
        private function truncate_skip( &$ret, $text, $search, $start, $len = null ) {
@@ -3536,10 +3542,10 @@ class Language {
         * truncateHtml() helper function
         * (a) push or pop $tag from $openTags as needed
         * (b) clear $tag value
-        * @param &$tag string Current HTML tag name we are looking at
-        * @param $tagType int (0-open tag, 1-close tag)
-        * @param $lastCh string Character before the '>' that ended this tag
-        * @param &$openTags array Open tag stack (not accounting for $tag)
+        * @param string &$tag Current HTML tag name we are looking at
+        * @param int $tagType (0-open tag, 1-close tag)
+        * @param string $lastCh Character before the '>' that ended this tag
+        * @param array &$openTags Open tag stack (not accounting for $tag)
         */
        private function truncate_endBracket( &$tag, $tagType, $lastCh, &$openTags ) {
                $tag = ltrim( $tag );
@@ -3559,8 +3565,8 @@ class Language {
         * Grammatical transformations, needed for inflected languages
         * Invoked by putting {{grammar:case|word}} in a message
         *
-        * @param $word string
-        * @param $case string
+        * @param string $word
+        * @param string $case
         * @return string
         */
        function convertGrammar( $word, $case ) {
@@ -3572,7 +3578,7 @@ class Language {
        }
        /**
         * Get the grammar forms for the content language
-        * @return array of grammar forms
+        * @return array Array of grammar forms
         * @since 1.20
         */
        function getGrammarForms() {
@@ -3596,8 +3602,8 @@ class Language {
         * If fewer than three forms are given, the default is to use the first (masculine) form.
         * These details can be overridden in subclasses.
         *
-        * @param $gender string
-        * @param $forms array
+        * @param string $gender
+        * @param array $forms
         *
         * @return string
         */
@@ -3626,8 +3632,8 @@ class Language {
         *
         * Example: {{plural:{{NUMBEROFARTICLES}}|article|articles}}
         *
-        * @param $count Integer: non-localized number
-        * @param $forms Array: different plural forms
+        * @param int $count Non-localized number
+        * @param array $forms Different plural forms
         * @return string Correct form of plural for $count in this language
         */
        function convertPlural( $count, $forms ) {
@@ -3677,8 +3683,8 @@ class Language {
         * Checks that convertPlural was given an array and pads it to requested
         * amount of forms by copying the last one.
         *
-        * @param $count Integer: How many forms should there be at least
-        * @param $forms Array of forms given to convertPlural
+        * @param int $count How many forms should there be at least
+        * @param array $forms Array of forms given to convertPlural
         * @return array Padded array of forms or an exception if not an array
         */
        protected function preConvertPlural( /* Array */ $forms, $count ) {
@@ -3695,7 +3701,7 @@ class Language {
         * on old expiry lengths recorded in log entries. You'd need to provide the start date to
         * match up with it.
         *
-        * @param $str String: the validated block duration in English
+        * @param string $str The validated block duration in English
         * @return string Somehow translated block duration
         * @see LanguageFi.php for example implementation
         */
@@ -3740,8 +3746,8 @@ class Language {
         * languages like Chinese need to be segmented in order for the diff
         * to be of any use
         *
-        * @param $text String
-        * @return String
+        * @param string $text
+        * @return string
         */
        public function segmentForDiff( $text ) {
                return $text;
@@ -3750,8 +3756,8 @@ class Language {
        /**
         * and unsegment to show the result
         *
-        * @param $text String
-        * @return String
+        * @param string $text
+        * @return string
         */
        public function unsegmentForDiff( $text ) {
                return $text;
@@ -3770,7 +3776,7 @@ class Language {
        /**
         * convert text to all supported variants
         *
-        * @param $text string
+        * @param string $text
         * @return array
         */
        public function autoConvertToAllVariants( $text ) {
@@ -3780,7 +3786,7 @@ class Language {
        /**
         * convert text to different variants of a language.
         *
-        * @param $text string
+        * @param string $text
         * @return string
         */
        public function convert( $text ) {
@@ -3790,7 +3796,7 @@ class Language {
        /**
         * Convert a Title object to a string in the preferred variant
         *
-        * @param $title Title
+        * @param Title $title
         * @return string
         */
        public function convertTitle( $title ) {
@@ -3800,7 +3806,7 @@ class Language {
        /**
         * Convert a namespace index to a string in the preferred variant
         *
-        * @param $ns int
+        * @param int $ns
         * @return string
         */
        public function convertNamespace( $ns ) {
@@ -3820,7 +3826,7 @@ class Language {
         * Check if the language has the specific variant
         *
         * @since 1.19
-        * @param $variant string
+        * @param string $variant
         * @return bool
         */
        public function hasVariant( $variant ) {
@@ -3830,7 +3836,7 @@ class Language {
        /**
         * Put custom tags (e.g. -{ }-) around math to prevent conversion
         *
-        * @param $text string
+        * @param string $text
         * @return string
         * @deprecated since 1.22 is no longer used
         */
@@ -3840,8 +3846,8 @@ class Language {
 
        /**
         * Perform output conversion on a string, and encode for safe HTML output.
-        * @param $text String text to be converted
-        * @param $isTitle Bool whether this conversion is for the article title
+        * @param string $text Text to be converted
+        * @param bool $isTitle Whether this conversion is for the article title
         * @return string
         * @todo this should get integrated somewhere sane
         */
@@ -3850,7 +3856,7 @@ class Language {
        }
 
        /**
-        * @param $key string
+        * @param string $key
         * @return string
         */
        public function convertCategoryKey( $key ) {
@@ -3894,10 +3900,10 @@ class Language {
         * actually exists in another variant. this function
         * tries to find it. See e.g. LanguageZh.php
         *
-        * @param $link String: the name of the link
-        * @param $nt Mixed: the title object of the link
-        * @param $ignoreOtherCond Boolean: to disable other conditions when
-        *      we need to transclude a template or update a category's link
+        * @param string $link The name of the link
+        * @param Title $nt The title object of the link
+        * @param bool $ignoreOtherCond To disable other conditions when
+        *   we need to transclude a template or update a category's link
         * @return null the input parameters may be modified upon return
         */
        public function findVariantLink( &$link, &$nt, $ignoreOtherCond = false ) {
@@ -3933,9 +3939,9 @@ class Language {
         * This function is called "markNoConversion" for historical
         * reasons.
         *
-        * @param $text String: text to be used for external link
-        * @param $noParse bool: wrap it without confirming it's a real URL first
-        * @return string the tagged text
+        * @param string $text Text to be used for external link
+        * @param bool $noParse Wrap it without confirming it's a real URL first
+        * @return string The tagged text
         */
        public function markNoConversion( $text, $noParse = false ) {
                // Excluding protocal-relative URLs may avoid many false positives.
@@ -4031,7 +4037,7 @@ class Language {
        }
 
        /**
-        * @param $code string
+        * @param string $code
         */
        public function setCode( $code ) {
                $this->mCode = $code;
@@ -4042,17 +4048,14 @@ class Language {
 
        /**
         * Get the name of a file for a certain language code
-        * @param $prefix string Prepend this to the filename
-        * @param $code string Language code
-        * @param $suffix string Append this to the filename
+        * @param string $prefix Prepend this to the filename
+        * @param string $code Language code
+        * @param string $suffix Append this to the filename
         * @throws MWException
         * @return string $prefix . $mangledCode . $suffix
         */
        public static function getFileName( $prefix = 'Language', $code, $suffix = '.php' ) {
-               // Protect against path traversal
-               if ( !Language::isValidCode( $code )
-                       || strcspn( $code, ":/\\\000" ) !== strlen( $code )
-               ) {
+               if ( !self::isValidBuiltInCode( $code ) ) {
                        throw new MWException( "Invalid language code \"$code\"" );
                }
 
@@ -4061,9 +4064,9 @@ class Language {
 
        /**
         * Get the language code from a file name. Inverse of getFileName()
-        * @param $filename string $prefix . $languageCode . $suffix
-        * @param $prefix string Prefix before the language code
-        * @param $suffix string Suffix after the language code
+        * @param string $filename $prefix . $languageCode . $suffix
+        * @param string $prefix Prefix before the language code
+        * @param string $suffix Suffix after the language code
         * @return string Language code, or false if $prefix or $suffix isn't found
         */
        public static function getCodeFromFileName( $filename, $prefix = 'Language', $suffix = '.php' ) {
@@ -4077,7 +4080,7 @@ class Language {
        }
 
        /**
-        * @param $code string
+        * @param string $code
         * @return string
         */
        public static function getMessagesFileName( $code ) {
@@ -4088,7 +4091,22 @@ class Language {
        }
 
        /**
-        * @param $code string
+        * @param string $code
+        * @return string
+        * @since 1.23
+        */
+       public static function getJsonMessagesFileName( $code ) {
+               global $IP;
+
+               if ( !self::isValidBuiltInCode( $code ) ) {
+                       throw new MWException( "Invalid language code \"$code\"" );
+               }
+
+               return "$IP/languages/i18n/$code.json" ;
+       }
+
+       /**
+        * @param string $code
         * @return string
         */
        public static function getClassFileName( $code ) {
@@ -4099,7 +4117,7 @@ class Language {
        /**
         * Get the first fallback for a given language.
         *
-        * @param $code string
+        * @param string $code
         *
         * @return bool|string
         */
@@ -4117,7 +4135,7 @@ class Language {
         * Get the ordered list of fallback languages.
         *
         * @since 1.19
-        * @param $code string Language code
+        * @param string $code Language code
         * @return array
         */
        public static function getFallbacksFor( $code ) {
@@ -4168,7 +4186,7 @@ class Language {
         * WARNING: this may take a long time. If you just need all message *keys*
         * but need the *contents* of only a few messages, consider using getMessageKeysFor().
         *
-        * @param $code string
+        * @param string $code
         *
         * @return array
         */
@@ -4179,8 +4197,8 @@ class Language {
        /**
         * Get a message for a given language
         *
-        * @param $key string
-        * @param $code string
+        * @param string $key
+        * @param string $code
         *
         * @return string
         */
@@ -4193,7 +4211,7 @@ class Language {
         * array_keys( Language::getMessagesFor( $code ) )
         *
         * @since 1.19
-        * @param $code string Language code
+        * @param string $code Language code
         * @return array of message keys (strings)
         */
        public static function getMessageKeysFor( $code ) {
@@ -4201,7 +4219,7 @@ class Language {
        }
 
        /**
-        * @param $talk
+        * @param string $talk
         * @return mixed
         */
        function fixVariableInNamespace( $talk ) {
@@ -4222,7 +4240,7 @@ class Language {
        }
 
        /**
-        * @param $m string
+        * @param string $m
         * @return string
         */
        function replaceGrammarInNamespace( $m ) {
@@ -4256,10 +4274,10 @@ class Language {
         *
         * @todo FIXME: why are we returnings DBMS-dependent strings???
         *
-        * @param $expiry String: Database expiry String
-        * @param $format Bool|Int true to process using language functions, or TS_ constant
+        * @param string $expiry Database expiry String
+        * @param bool|int $format True to process using language functions, or TS_ constant
         *     to return the expiry in a given timestamp
-        * @return String
+        * @return string
         * @since 1.18
         */
        public function formatExpiry( $expiry, $format = true ) {
@@ -4281,8 +4299,8 @@ class Language {
 
        /**
         * @todo Document
-        * @param $seconds int|float
-        * @param $format Array Optional
+        * @param int|float $seconds
+        * @param array $format Optional
         *              If $format['avoid'] == 'avoidseconds' - don't mention seconds if $seconds >= 1 hour
         *              If $format['avoid'] == 'avoidminutes' - don't mention seconds/minutes if $seconds > 48 hours
         *              If $format['noabbrevs'] is true - use 'seconds' and friends instead of 'seconds-abbrev' and friends
@@ -4385,7 +4403,7 @@ class Language {
         * This use base 1000. For base 1024 use formatSize(), for another base
         * see formatComputingNumbers()
         *
-        * @param $bps int
+        * @param int $bps
         * @return string
         */
        function formatBitrate( $bps ) {
@@ -4393,9 +4411,9 @@ class Language {
        }
 
        /**
-        * @param $size int Size of the unit
-        * @param $boundary int Size boundary (1000, or 1024 in most cases)
-        * @param $messageKey string Message key to be uesd
+        * @param int $size Size of the unit
+        * @param int $boundary Size boundary (1000, or 1024 in most cases)
+        * @param string $messageKey Message key to be uesd
         * @return string
         */
        function formatComputingNumbers( $size, $boundary, $messageKey ) {
@@ -4433,7 +4451,7 @@ class Language {
         * This method use base 1024. For base 1000 use formatBitrate(), for
         * another base see formatComputingNumbers()
         *
-        * @param $size int Size to format
+        * @param int $size Size to format
         * @return string Plain text (not HTML)
         */
        function formatSize( $size ) {
@@ -4443,11 +4461,11 @@ class Language {
        /**
         * Make a list item, used by various special pages
         *
-        * @param $page String Page link
-        * @param $details String Text between brackets
-        * @param $oppositedm Boolean Add the direction mark opposite to your
-        *                    language, to display text properly
-        * @return String
+        * @param string $page Page link
+        * @param string $details Text between brackets
+        * @param bool $oppositedm Add the direction mark opposite to your
+        *   language, to display text properly
+        * @return string
         */
        function specialList( $page, $details, $oppositedm = true ) {
                $dirmark = ( $oppositedm ? $this->getDirMark( true ) : '' ) .
@@ -4460,12 +4478,12 @@ class Language {
        /**
         * Generate (prev x| next x) (20|50|100...) type links for paging
         *
-        * @param $title Title object to link
-        * @param $offset Integer offset parameter
-        * @param $limit Integer limit parameter
-        * @param $query array|String optional URL query parameter string
-        * @param $atend Bool optional param for specified if this is the last page
-        * @return String
+        * @param Title $title Title object to link
+        * @param int $offset
+        * @param int $limit
+        * @param array|string $query Optional URL query parameter string
+        * @param bool $atend Optional param for specified if this is the last page
+        * @return string
         */
        public function viewPrevNext( Title $title, $offset, $limit, array $query = array(), $atend = false ) {
                // @todo FIXME: Why on earth this needs one message for the text and another one for tooltip?
@@ -4502,14 +4520,14 @@ class Language {
        /**
         * Helper function for viewPrevNext() that generates links
         *
-        * @param $title Title object to link
-        * @param $offset Integer offset parameter
-        * @param $limit Integer limit parameter
-        * @param $query Array extra query parameters
-        * @param $link String text to use for the link; will be escaped
-        * @param $tooltipMsg String name of the message to use as tooltip
-        * @param $class String value of the "class" attribute of the link
-        * @return String HTML fragment
+        * @param Title $title Title object to link
+        * @param int $offset
+        * @param int $limit
+        * @param array $query Extra query parameters
+        * @param string $link Text to use for the link; will be escaped
+        * @param string $tooltipMsg Name of the message to use as tooltip
+        * @param string $class Value of the "class" attribute of the link
+        * @return string HTML fragment
         */
        private function numLink( Title $title, $offset, $limit, array $query, $link, $tooltipMsg, $class ) {
                $query = array( 'limit' => $limit, 'offset' => $offset ) + $query;