* @since 1.21
*/
public static function isSupportedLanguage( $code ) {
- return is_readable( self::getMessagesFileName( $code ) );
+ return $code === strtolower( $code ) && is_readable( self::getMessagesFileName( $code ) );
}
/**
public static function isValidBuiltInCode( $code ) {
if ( !is_string( $code ) ) {
- $type = gettype( $code );
- if ( $type === 'object' ) {
+ if ( is_object( $code ) ) {
$addmsg = " of class " . get_class( $code );
} else {
$addmsg = '';
}
+ $type = gettype( $code );
throw new MWException( __METHOD__ . " must be passed a string, $type given$addmsg" );
}
/**
* Resets all of the namespace caches. Mainly used for testing
*/
- public function resetNamespaces( ) {
+ public function resetNamespaces() {
$this->namespaceNames = null;
$this->mNamespaceIds = null;
$this->namespaceAliases = null;
return $number;
}
+ /**
+ * Front-end for non-commafied formatNum
+ *
+ * @param mixed $number the string to be formatted, should be an integer
+ * or a floating point number.
+ * @since 1.21
+ * @return string
+ */
+ public function formatNumNoSeparators( $number ) {
+ return $this->formatNum( $number, true );
+ }
+
/**
* @param $number string
* @return string
if ( $start < 0 ) {
$start = 0;
}
- $groupedNumber = substr( $number , $start, $end -$start ) . $groupedNumber ;
+ $groupedNumber = substr( $number, $start, $end -$start ) . $groupedNumber ;
$end = $start;
if ( $numMatches > 1 ) {
// use the last pattern for the rest of the number
return '';
}
- // Handle explicit 0= and 1= forms
+ // Handle explicit n=pluralform cases
foreach ( $forms as $index => $form ) {
- if ( isset( $form[1] ) && $form[1] === '=' ) {
- if ( $form[0] === (string) $count ) {
- return substr( $form, 2 );
+ if ( preg_match( '/\d+=/i', $form ) ) {
+ $pos = strpos( $form, '=' );
+ if ( substr( $form, 0, $pos ) === (string) $count ) {
+ return substr( $form, $pos + 1 );
}
unset( $forms[$index] );
}
}
}
+ /**
+ * Get the ordered list of fallback languages, ending with the fallback
+ * language chain for the site language.
+ *
+ * @since 1.21
+ * @param $code string Language code
+ * @return array
+ */
+ public static function getFallbacksIncludingSiteLanguage( $code ) {
+ global $wgLanguageCode;
+
+ // Usually, we will only store a tiny number of fallback chains, so we
+ // keep them in static memory.
+ static $fallbackLanguageCache = array();
+ $cacheKey = "{$code}-{$wgLanguageCode}";
+
+ if ( !array_key_exists( $cacheKey, $fallbackLanguageCache ) ) {
+ $fallbacks = self::getFallbacksFor( $code );
+
+ // Take the final 'en' off of the array before splicing
+ if ( end( $fallbacks ) === 'en' ) {
+ array_pop( $fallbacks );
+ }
+ // Append the site's fallback chain
+ $siteFallbacks = self::getFallbacksFor( $wgLanguageCode );
+
+ // Eliminate any languages already included in the chain
+ $siteFallbacks = array_intersect( array_diff( $siteFallbacks, $fallbacks ), $siteFallbacks );
+ if ( $siteFallbacks ) {
+ $fallbacks = array_merge( $fallbacks, $siteFallbacks );
+ }
+ if ( end( $fallbacks ) !== 'en' ) {
+ $fallbacks[] = 'en';
+ }
+ $fallbackLanguageCache[$cacheKey] = $fallbacks;
+ }
+ return $fallbackLanguageCache[$cacheKey];
+ }
+
/**
* Get all messages for a given language
* WARNING: this may take a long time. If you just need all message *keys*