SPQRobin has uploaded a new change for review.
https://gerrit.wikimedia.org/r/137033
Change subject: Improve page language functions
......................................................................
Improve page language functions
First patch; work in progress
Change-Id: I0ad0e4f47cf7624067f89384f67bfe76c57bd820
---
M includes/Title.php
M includes/content/ContentHandler.php
M includes/content/CssContentHandler.php
M includes/content/JavaScriptContentHandler.php
4 files changed, 126 insertions(+), 78 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/core
refs/changes/33/137033/1
diff --git a/includes/Title.php b/includes/Title.php
index d8f6b75..88ea65e 100644
--- a/includes/Title.php
+++ b/includes/Title.php
@@ -150,6 +150,8 @@
/** @var bool The (string) language code of the page's language and
content code. */
private $mPageLanguage = false;
+ private $mDBPageLanguage = null;
+
/** @var TitleValue A corresponding TitleValue object */
private $mTitleValue = null;
// @}
@@ -438,6 +440,9 @@
$this->mContentModel = strval(
$row->page_content_model );
} else {
$this->mContentModel = false; # initialized
lazily in getContentModel()
+ }
+ if ( isset( $row->page_lang ) ) {
+ $this->mDBPageLanguage =
(string)$row->page_lang;
}
} else { // page not found
$this->mArticleID = 0;
@@ -4958,6 +4963,71 @@
}
/**
+ * @since 1.24
+ * @return array 'pagelanguage', 'pageviewlanguage', 'usedb'
+ */
+ public function getPageLanguageSettings() {
+ global $wgContLang, $wgLang, $wgLanguageCode;
+ wfProfileIn( __METHOD__ );
+ $settings = array(
+ 'pagelanguage' => $wgContLang,
+ 'pageviewlanguage' => 'pagelanguage',
+ 'usedb' => false, // whether it is changeable on-wiki
using the DB
+ );
+
+ if( $this->isSpecialPage() ) {
+ // special pages are in the user language
+ $settings['pagelanguage'] =
$settings['pageviewlanguage'] = $wgLang;
+ return $settings;
+ wfProfileOut( __METHOD__ );
+ }
+
+ $contentHandler = ContentHandler::getForTitle( $this );
+
+ // backwards compatibility for ContentHandlers that are not yet
updated
+ if( !method_exists( $contentHandler, 'getPageLanguageSettings'
) ) {
+ $settings['pagelanguage'] =
$contentHandler->getPageLanguage();
+ $settings['pageviewlanguage'] =
$contentHandler->getPageViewLanguage();
+ } else {
+ $settings = $contentHandler->getPageLanguageSettings(
$settings, $this );
+ }
+
+ if ( !$this->mPageLanguage || $this->mPageLanguage[1] !==
$wgLanguageCode ) {
+ // NOTE: ContentHandler::getPageLanguage() may need to
load the
+ // content to determine the page language!
+ // Checking $wgLanguageCode hasn't changed for the
benefit of unit
+ // tests.
+ $contentHandler = ContentHandler::getForTitle( $this );
+ $langObj = wfGetLangObj( $settings['pagelanguage'] );
+ $this->mPageLanguage = array( $langObj->getCode(),
$wgLanguageCode );
+ } else {
+ $settings['pagelanguage'] = wfGetLangObj(
$this->mPageLanguage[0] );
+ }
+
+ if( $this->mDBPageLanguage ) {
+ // if the page content lang is defined on-wiki, use that
+ $settings['pagelanguage'] = wfGetLangObj(
$this->mDBPageLanguage );
+ }
+
+ if( $settings['pageviewlanguage'] == 'pagelanguage' ) {
+ // if not explicitly set, it should probably assume
+ // it is a normal text/string that can be converted
+ // when the user chooses a variant.
+ // Then the content displayed is actually
+ // in a language whose code is the variant code.
+ $variant =
$settings['pagelanguage']->getPreferredVariant();
+ if ( $settings['pagelanguage']->getCode() !== $variant
) {
+ $settings['pageviewlanguage'] =
Language::factory( $variant );
+ } else {
+ $settings['pageviewlanguage'] =
$settings['pagelanguage'];
+ }
+ }
+ wfProfileOut( __METHOD__ );
+
+ return $settings;
+ }
+
+ /**
* Get the language in which the content of this page is written in
* wikitext. Defaults to $wgContLang, but in certain cases it can be
* e.g. $wgLang (such as special pages, which are in the user language).
@@ -4966,29 +5036,8 @@
* @return Language
*/
public function getPageLanguage() {
- global $wgLang, $wgLanguageCode;
- wfProfileIn( __METHOD__ );
- if ( $this->isSpecialPage() ) {
- // special pages are in the user language
- wfProfileOut( __METHOD__ );
- return $wgLang;
- }
-
- if ( !$this->mPageLanguage || $this->mPageLanguage[1] !==
$wgLanguageCode ) {
- // Note that this may depend on user settings, so the
cache should
- // be only per-request.
- // NOTE: ContentHandler::getPageLanguage() may need to
load the
- // content to determine the page language!
- // Checking $wgLanguageCode hasn't changed for the
benefit of unit
- // tests.
- $contentHandler = ContentHandler::getForTitle( $this );
- $langObj = wfGetLangObj(
$contentHandler->getPageLanguage( $this ) );
- $this->mPageLanguage = array( $langObj->getCode(),
$wgLanguageCode );
- } else {
- $langObj = wfGetLangObj( $this->mPageLanguage[0] );
- }
- wfProfileOut( __METHOD__ );
- return $langObj;
+ $settings = $this->getPageLanguageSettings();
+ return $settings['pagelanguage'];
}
/**
@@ -5000,25 +5049,8 @@
* @return Language
*/
public function getPageViewLanguage() {
- 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 = $wgLang->getPreferredVariant();
- if ( $wgLang->getCode() !== $variant ) {
- return Language::factory( $variant );
- }
-
- return $wgLang;
- }
-
- // @note Can't be cached persistently, 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;
+ $settings = $this->getPageLanguageSettings();
+ return $settings['pageviewlanguage'];
}
/**
diff --git a/includes/content/ContentHandler.php
b/includes/content/ContentHandler.php
index b5b4d13..506ed9c 100644
--- a/includes/content/ContentHandler.php
+++ b/includes/content/ContentHandler.php
@@ -643,7 +643,44 @@
* 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.24
+ *
+ * @param array $settings The settings array from
Title::getPageLanguageSettings().
+ * @param Title $title The page to determine the language for.
+ * @param Content $content The page's content, if you have it handy, to
avoid reloading it.
+ *
+ * @return Language The page's language
+ */
+ public function getPageLanguageSettings( $settings, Title $title,
$content = null ) {
+ global $wgLang;
+ if ( $title->getNamespace() == NS_MEDIAWIKI ) {
+ // Parse mediawiki messages with correct target language
+ list( /* $unused */, $lang ) =
MessageCache::singleton()->figureMessage( $title->getText() );
+ $settings['pagelanguage'] = wfGetLangObj( $lang );
+ } else {
+ // it's a normal wikitext page, let users set the
language on-wiki
+ $settings['usedb'] = true;
+ }
+
+ wfRunHooks( 'PageContentLanguage', array( $title,
&$settings['pagelanguage'], $wgLang ) );
+
+ return $settings;
+ }
+
+ /**
+ * Get the language in which the content of the given page is written.
+ *
+ * This default implementation just returns $wgContLang (except for
pages
+ * in the MediaWiki namespace)
+ *
+ * Note that the pages language is not cacheable, since it may in some
+ * cases depend 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.21
+ * @deprecated 1.24
*
* @param Title $title The page to determine the language for.
* @param Content $content The page's content, if you have it handy, to
avoid reloading it.
@@ -679,6 +716,7 @@
* that is, this method may load the content in order to determine the
language.
*
* @since 1.21
+ * @deprecated 1.24
*
* @param Title $title The page to determine the language for.
* @param Content $content The page's content, if you have it handy, to
avoid reloading it.
diff --git a/includes/content/CssContentHandler.php
b/includes/content/CssContentHandler.php
index 85059a8..7217777 100644
--- a/includes/content/CssContentHandler.php
+++ b/includes/content/CssContentHandler.php
@@ -62,29 +62,18 @@
/**
* Returns the english language, because CSS is english, and should be
handled as such.
*
+ * @param array $settings
* @param Title $title
* @param Content $content
*
- * @return Language wfGetLangObj( 'en' )
+ * @return array
*
- * @see ContentHandler::getPageLanguage()
+ * @see ContentHandler::getPageLanguageSettings()
*/
- 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.
- *
- * @param Title $title
- * @param Content $content
- *
- * @return Language wfGetLangObj( 'en' )
- *
- * @see ContentHandler::getPageViewLanguage()
- */
- public function getPageViewLanguage( Title $title, Content $content =
null ) {
- return wfGetLangObj( 'en' );
+ public function getPageLanguageSettings( $settings, Title $title,
Content $content = null ) {
+ $settings['pagelanguage'] = wfGetLangObj( 'en' );
+ $settings['pageviewlanguage'] = wfGetLangObj( 'en' );
+ return $settings;
}
}
diff --git a/includes/content/JavaScriptContentHandler.php
b/includes/content/JavaScriptContentHandler.php
index 2e98976..7a94023 100644
--- a/includes/content/JavaScriptContentHandler.php
+++ b/includes/content/JavaScriptContentHandler.php
@@ -62,29 +62,18 @@
/**
* Returns the english language, because JS is english, and should be
handled as such.
*
+ * @param array $settings
* @param Title $title
* @param Content $content
*
- * @return Language wfGetLangObj( 'en' )
+ * @return array
*
- * @see ContentHandler::getPageLanguage()
+ * @see ContentHandler::getPageLanguageSettings()
*/
- public function getPageLanguage( Title $title, Content $content = null
) {
- return wfGetLangObj( 'en' );
- }
-
- /**
- * Returns the english language, because JS is english, and should be
handled as such.
- *
- * @param Title $title
- * @param Content $content
- *
- * @return Language wfGetLangObj( 'en' )
- *
- * @see ContentHandler::getPageViewLanguage()
- */
- public function getPageViewLanguage( Title $title, Content $content =
null ) {
- return wfGetLangObj( 'en' );
+ public function getPageLanguageSettings( $settings, Title $title,
Content $content = null ) {
+ $settings['pagelanguage'] = wfGetLangObj( 'en' );
+ $settings['pageviewlanguage'] = wfGetLangObj( 'en' );
+ return $settings;
}
}
--
To view, visit https://gerrit.wikimedia.org/r/137033
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I0ad0e4f47cf7624067f89384f67bfe76c57bd820
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/core
Gerrit-Branch: master
Gerrit-Owner: SPQRobin <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits