From: daniel Date: Wed, 5 Sep 2012 16:27:32 +0000 (+0200) Subject: introducing ContentHandler::getPageViewLanguage X-Git-Tag: 1.31.0-rc.0~22097^2^2~27 X-Git-Url: http://git.cyclocoop.org/%40spipnet%40?a=commitdiff_plain;h=a98607815f6d3387e88ca65313530ff1eb873bfa;p=lhc%2Fweb%2Fwiklou.git introducing ContentHandler::getPageViewLanguage Change-Id: I5b7aabaab48b30a9b6620a0cb4272bc5e348c014 --- diff --git a/includes/ContentHandler.php b/includes/ContentHandler.php index 03e430b99a..614082498c 100644 --- a/includes/ContentHandler.php +++ b/includes/ContentHandler.php @@ -549,10 +549,11 @@ abstract class ContentHandler { /** * Get the language in which the content of the given page is written. * - * This default implementation returns $wgContLang->getCode(). + * This default implementation just returns $wgContLang (except for pages in the MediaWiki namespace) * * Note that a page's language must be permanent and cacheable, that is, it must not depend - * on user preferences, request parameters or session state. + * on user preferences, request parameters or session state. The only exception is pages in the + * MediaWiki namespace. * * Also note that the page language may or may not depend on the actual content of the page, * that is, this method may load the content in order to determine the language. @@ -566,9 +567,51 @@ abstract class ContentHandler { */ public function getPageLanguage( Title $title, Content $content = null ) { global $wgContLang; + + if ( $title->getNamespace() == NS_MEDIAWIKI ) { + // Parse mediawiki messages with correct target language + list( /* $unused */, $lang ) = MessageCache::singleton()->figureMessage( $title->getText() ); + return wfGetLangObj( $lang ); + } + return $wgContLang; } + /** + * Get the language in which the content of this page is written when + * viewed by user. Defaults to $this->getPageLanguage(), but if the user + * specified a preferred variant, the variant will be used. + * + * This default implementation just returns $this->getPageLanguage( $title, $content ) unless + * the user specified a preferred variant. + * + * Note that the pages view language is not cacheable, since it depends on user settings. + * + * Also note that the page language may or may not depend on the actual content of the page, + * that is, this method may load the content in order to determine the language. + * + * @since 1.WD + * + * @param Title $title the page to determine the language for. + * @param Content|null $content the page's content, if you have it handy, to avoid reloading it. + * + * @return Language the page's language code for viewing + */ + public function getPageViewLanguage( Title $title, Content $content = null ) { + $pageLang = $this->getPageLanguage( $title, $content ); + + if ( $title->getNamespace() !== NS_MEDIAWIKI ) { + // If the user chooses a variant, the content is actually + // in a language whose code is the variant code. + $variant = $pageLang->getPreferredVariant(); + if ( $pageLang->getCode() !== $variant ) { + $pageLang = Language::factory( $variant ); + } + } + + return $pageLang; + } + /** * Returns the name of the diff engine to use. * @@ -1022,6 +1065,17 @@ class JavaScriptContentHandler extends TextContentHandler { public function getPageLanguage( Title $title, Content $content = null ) { return wfGetLangObj( 'en' ); } + + /** + * Returns the english language, because CSS is english, and should be handled as such. + * + * @return Language wfGetLangObj( 'en' ) + * + * @see ContentHandler::getPageViewLanguage() + */ + public function getPageViewLanguage( Title $title, Content $content = null ) { + return wfGetLangObj( 'en' ); + } } /** @@ -1053,4 +1107,15 @@ class CssContentHandler extends TextContentHandler { public function getPageLanguage( Title $title, Content $content = null ) { return wfGetLangObj( 'en' ); } + + /** + * Returns the english language, because CSS is english, and should be handled as such. + * + * @return Language wfGetLangObj( 'en' ) + * + * @see ContentHandler::getPageViewLanguage() + */ + public function getPageViewLanguage( Title $title, Content $content = null ) { + return wfGetLangObj( 'en' ); + } } diff --git a/includes/Title.php b/includes/Title.php index 7918b5c0a6..15757b0a76 100644 --- a/includes/Title.php +++ b/includes/Title.php @@ -4588,10 +4588,6 @@ class Title { if ( $this->isSpecialPage() ) { // special pages are in the user language return $wgLang; - } elseif ( $this->getNamespace() == NS_MEDIAWIKI ) { - // Parse mediawiki messages with correct target language - list( /* $unused */, $lang ) = MessageCache::singleton()->figureMessage( $this->getText() ); - return wfGetLangObj( $lang ); } //TODO: use the LinkCache to cache this! @@ -4613,19 +4609,24 @@ class Title { * @return Language */ public function getPageViewLanguage() { - $pageLang = $this->getPageLanguage(); - // If this is nothing special (so the content is converted when viewed) - if ( !$this->isSpecialPage() - && !$this->isCssOrJsPage() && !$this->isCssJsSubpage() - && $this->getNamespace() !== NS_MEDIAWIKI - ) { + global $wgLang; + + if ( $this->isSpecialPage() ) { // If the user chooses a variant, the content is actually // in a language whose code is the variant code. - $variant = $pageLang->getPreferredVariant(); - if ( $pageLang->getCode() !== $variant ) { - $pageLang = Language::factory( $variant ); + $variant = $wgLang->getPreferredVariant(); + if ( $wgLang->getCode() !== $variant ) { + return Language::factory( $variant ); } + + return $wgLang; } + + //NOTE: can't be cached, depends on user settings + //NOTE: ContentHandler::getPageViewLanguage() may need to load the content to determine the page language! + $contentHandler = ContentHandler::getForTitle( $this ); + $pageLang = $contentHandler->getPageViewLanguage( $this ); + return $pageLang; } }