From: Robert Leverington Date: Thu, 24 Apr 2008 11:59:32 +0000 (+0000) Subject: * MessageCache::get $forContent parameter replaced with $langcode parameter so X-Git-Tag: 1.31.0-rc.0~48095 X-Git-Url: http://git.cyclocoop.org/%40spipnet%40?a=commitdiff_plain;h=932aa091c7fdf94f3f726f1857d9a38cbe83d9e3;p=lhc%2Fweb%2Fwiklou.git * MessageCache::get $forContent parameter replaced with $langcode parameter so that messages can be retreieved for any language. * wfLoadExtensionMessages() now has the option to load messages for all the languages it contains. * 'language' option added to wfMsgExt() so that a message can be retreieved from a specific language. --- diff --git a/includes/GlobalFunctions.php b/includes/GlobalFunctions.php index 4e56dbda89..72742e84fc 100644 --- a/includes/GlobalFunctions.php +++ b/includes/GlobalFunctions.php @@ -444,16 +444,18 @@ function wfMsgWeirdKey ( $key ) { * Fetch a message string value, but don't replace any keys yet. * @param string $key * @param bool $useDB - * @param bool $forContent + * @param string $langcode Code of the language to get the message for, or + * behaves as a content language switch if it is a + * boolean. * @return string * @private */ -function wfMsgGetKey( $key, $useDB, $forContent = false, $transform = true ) { +function wfMsgGetKey( $key, $useDB, $langCode = false, $transform = true ) { global $wgParser, $wgContLang, $wgMessageCache, $wgLang; # If $wgMessageCache isn't initialised yet, try to return something sensible. if( is_object( $wgMessageCache ) ) { - $message = $wgMessageCache->get( $key, $useDB, $forContent ); + $message = $wgMessageCache->get( $key, $useDB, $langCode ); if ( $transform ) { $message = $wgMessageCache->transform( $message ); } @@ -552,6 +554,8 @@ function wfMsgWikiHtml( $key ) { * replaceafter: parameters are substituted after parsing or escaping * parsemag: transform the message using magic phrases * content: fetch message for content language instead of interface + * language: language code to fetch message for (overriden by content), its behaviour + * with parser, parseinline and parsemag is undefined. * Behavior for conflicting options (e.g., parse+parseinline) is undefined. */ function wfMsgExt( $key, $options ) { @@ -565,12 +569,22 @@ function wfMsgExt( $key, $options ) { $options = array($options); } - $forContent = false; if( in_array('content', $options) ) { $forContent = true; + $langCode = true; + } elseif( array_key_exists('language', $options) ) { + $forContent = false; + $langCode = $options['language']; + $validCodes = array_keys( Language::getLanguageNames() ); + if( !in_array($options['language'], $validCodes) ) { + $langCode = false; + } + } else { + $forContent = false; + $langCode = false; } - $string = wfMsgGetKey( $key, /*DB*/true, $forContent, /*Transform*/false ); + $string = wfMsgGetKey( $key, /*DB*/true, $langCode, /*Transform*/false ); if( !in_array('replaceafter', $options) ) { $string = wfMsgReplaceArgs( $string, $args ); @@ -2429,13 +2443,18 @@ function wfBoolToStr( $value ) { /** * Load an extension messages file + * + * @param string $extensionName Name of extension to load messages from\for. + * @param boolean $all Whether or not to load all languages. */ -function wfLoadExtensionMessages( $extensionName ) { +function wfLoadExtensionMessages( $extensionName, $all = false ) { global $wgExtensionMessagesFiles, $wgMessageCache; if ( !empty( $wgExtensionMessagesFiles[$extensionName] ) ) { - $wgMessageCache->loadMessagesFile( $wgExtensionMessagesFiles[$extensionName] ); - // Prevent double-loading - $wgExtensionMessagesFiles[$extensionName] = false; + $wgMessageCache->loadMessagesFile( $wgExtensionMessagesFiles[$extensionName], $all ); + // Prevent double-loading if all the messages have been loaded. + if( $all ) { + $wgExtensionMessagesFiles[$extensionName] = false; + } } } diff --git a/includes/MessageCache.php b/includes/MessageCache.php index 3a11444c65..c1e6c09b17 100644 --- a/includes/MessageCache.php +++ b/includes/MessageCache.php @@ -397,18 +397,46 @@ class MessageCache { * * @param string $key The message cache key * @param bool $useDB Get the message from the DB, false to use only the localisation - * @param bool $forContent Get the message from the content language rather than the - * user language + * @param string $langcode Code of the language to get the message for, if + * it is a valid code create a language for that + * language, if it is a string but not a valid code + * then make a basic language object, if it is a + * false boolean then use the current users + * language (as a fallback for the old parameter + * functionality), or if it is a true boolean then + * use the wikis content language (also as a + * fallback). * @param bool $isFullKey Specifies whether $key is a two part key "lang/msg". */ - function get( $key, $useDB = true, $forContent = true, $isFullKey = false ) { + function get( $key, $useDB = true, $langcode = true, $isFullKey = false ) { global $wgContLanguageCode, $wgContLang, $wgLang; - if( $forContent ) { + + $validCodes = array_keys( Language::getLanguageNames() ); + + # Identify which language to get or create a language object for. + if( $langcode === $wgContLang->getCode() ) { + # $langcode is the language code of the wikis content language object. $lang =& $wgContLang; - } else { + } elseif( $langcode === $wgLang->getCode() ) { + # $langcode is the language code of user language object. + $lang =& $wgLang; + } elseif( in_array( $langcode, $validCodes ) ) { + # $langcode corresponds to a valid language. + $lang = Language::factory( $langcode ); + } elseif( is_string( $langcode ) ) { + # $langcode is a string, but not a valid language code; use content language. + $lang =& $wgContLang; + wfDebug( 'Invalid language code passed to MessageCache::get, falling back to content language.' ); + } elseif( !$langcode ) { + # $langcode is set to false, use the user language (fallback for old parameters). $lang =& $wgLang; + } else { + # $language is set to true, use the content language (fallback for old parameters). + $lang =& $wgContLang; } + $langcode = $lang->getCode(); + # If uninitialised, someone is trying to call this halfway through Setup.php if( !$this->mInitialised ) { return '<' . htmlspecialchars($key) . '>'; @@ -687,29 +715,30 @@ class MessageCache { /** * Load messages from a given file + * + * @param string $filename Filename of file to load. + * @param boolean $all Whether or not to load all languages. */ - function loadMessagesFile( $filename ) { + function loadMessagesFile( $filename, $all = false ) { global $wgLang, $wgContLang; $messages = $magicWords = false; require( $filename ); - /* - * Load only languages that are usually used, and merge all fallbacks, - * except English. - */ - $langs = array_unique( array( 'en', $wgContLang->getCode(), $wgLang->getCode() ) ); - foreach( $langs as $code ) { - $fbcode = $code; - $mergedMessages = array(); - do { - if ( isset($messages[$fbcode]) ) { - $mergedMessages += $messages[$fbcode]; + if( $all ) { + # Load all messages, regardless of language. + $validCodes = array_keys( Language::getLanguageNames() ); + foreach( $messages as $code => $array ) { + if( in_array( $code, $validCodes ) ) { + $this->processMessagesArray( $messages, $code ); } - $fbcode = Language::getFallbackfor( $fbcode ); - } while( $fbcode && $fbcode !== 'en' ); - - if ( !empty($mergedMessages) ) - $this->addMessages( $mergedMessages, $code ); + } + } else { + # Load only languages that are usually used, and merge all + # fallbacks, except English. + $langs = array_unique( array( 'en', $wgContLang->getCode(), $wgLang->getCode() ) ); + foreach( $langs as $code ) { + $this->processMessagesArray( $messages, $code ); + } } if ( $magicWords !== false ) { @@ -717,4 +746,25 @@ class MessageCache { $wgContLang->addMagicWordsByLang( $magicWords ); } } + + /** + * Process an array of messages, loading it into the message cache. + * + * @param array $messages Messages array. + * @param string $language Language code to process. + */ + function processMessagesArray( $messages, $language ) { + $fallbackCode = $language; + $mergedMessages = array(); + do { + if ( isset($messages[$fallbackCode]) ) { + $mergedMessages += $messages[$fallbackCode]; + } + $fallbackCode = Language::getFallbackfor( $fallbackCode ); + } while( $fallbackCode && $fallbackCode !== 'en' ); + + if ( !empty($mergedMessages) ) + $this->addMessages( $mergedMessages, $language ); + } + }