Follow-up to r90265: directionality improvements as part of bug 6100 (under $wgBetter...
authorRobin Pepermans <robin@users.mediawiki.org>
Fri, 17 Jun 2011 21:48:43 +0000 (21:48 +0000)
committerRobin Pepermans <robin@users.mediawiki.org>
Fri, 17 Jun 2011 21:48:43 +0000 (21:48 +0000)
* Use ParserOptions()->getTargetLanguage() for setting the page language/direction
* Set headings on categories in user language/direction
* Only set language/direction when viewing a page (or editing but only preview and textarea)

includes/CategoryPage.php
includes/EditPage.php
includes/SkinTemplate.php
includes/parser/ParserOptions.php

index 7ffaec8..4b8ba03 100644 (file)
@@ -179,6 +179,12 @@ class CategoryViewer {
                        $r = wfMsgExt( 'category-empty', array( 'parse' ) );
                }
 
+               global $wgBetterDirectionality, $wgLang;
+               if( $wgBetterDirectionality ) {
+                       $langAttribs = array( 'lang' => $wgLang->getCode(), 'dir' => $wgLang->getDir() );
+                       $r = Html::rawElement( 'div', $langAttribs, $r );
+               }
+
                wfProfileOut( __METHOD__ );
                return $wgContLang->convert( $r );
        }
@@ -501,12 +507,21 @@ class CategoryViewer {
         */
        function formatList( $articles, $articles_start_char, $cutoff = 6 ) {
                if ( count ( $articles ) > $cutoff ) {
-                       return self::columnList( $articles, $articles_start_char );
+                       $list = self::columnList( $articles, $articles_start_char );
                } elseif ( count( $articles ) > 0 ) {
                        // for short lists of articles in categories.
-                       return self::shortList( $articles, $articles_start_char );
+                       $list = self::shortList( $articles, $articles_start_char );
                }
-               return '';
+               global $wgBetterDirectionality;
+               if( $wgBetterDirectionality ) {
+                       global $wgOut, $wgContLang;
+                       $getPageLang = $wgOut->parserOptions()->getTargetLanguage();
+                       $pageLang = ( $getPageLang ? Language::factory( $getPageLang ) : $wgContLang );
+                       $realBodyAttribs = array( 'lang' => $pageLang->getCode(), 'dir' => $pageLang->getDir() );
+                       $list = Html::rawElement( 'div', $realBodyAttribs, $list );
+               }
+
+               return $list;
        }
 
        /**
index 578ebbc..e3e2c06 100644 (file)
@@ -1815,6 +1815,14 @@ HTML
                        'style' => '' // avoid php notices when appending preferences (appending allows customAttribs['style'] to still work
                );
 
+               global $wgBetterDirectionality, $wgContLang;
+               if( $wgBetterDirectionality ) {
+                       $getPageLang = $wgOut->parserOptions()->getTargetLanguage( $this->mTitle );
+                       $pageLang = ( $getPageLang ? $getPageLang : $wgContLang );
+                       $attribs['lang'] = $pageLang->getCode();
+                       $attribs['dir'] = $pageLang->getDir();
+               }
+
                $wgOut->addHTML( Html::textarea( $name, $wikitext, $attribs ) );
        }
 
@@ -2058,13 +2066,6 @@ HTML
 
                                wfRunHooks( 'EditPageGetPreviewText', array( $this, &$toparse ) );
 
-                               // Parse mediawiki messages with correct target language
-                               if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
-                                       list( /* $unused */, $lang ) = MessageCache::singleton()->figureMessage( $this->mTitle->getText() );
-                                       $obj = wfGetLangObj( $lang );
-                                       $parserOptions->setTargetLanguage( $obj );
-                               }
-
                                $parserOptions->setTidy( true );
                                $parserOptions->enableLimitReport();
                                $parserOutput = $wgParser->parse( $this->mArticle->preSaveTransform( $toparse ),
@@ -2091,6 +2092,13 @@ HTML
                        $wgOut->parse( $note ) . $conflict . "</div>\n";
 
                wfProfileOut( __METHOD__ );
+               global $wgBetterDirectionality, $wgContLang;
+               if( $wgBetterDirectionality ) {
+                       $getPageLang = $wgOut->parserOptions()->getTargetLanguage( $this->mTitle );
+                       $pageLang = ( $getPageLang ? $getPageLang : $wgContLang );
+                       $realBodyAttribs = array( 'lang' => $pageLang->getCode(), 'dir' => $pageLang->getDir() );
+                       $previewHTML = Html::rawElement( 'div', $realBodyAttribs, $previewHTML );
+               }
                return $previewhead . $previewHTML . $this->previewTextAfterContent;
        }
 
index ad309aa..fad14f5 100644 (file)
@@ -455,20 +455,17 @@ class SkinTemplate extends Skin {
                $tpl->set( 'printfooter', $this->printSource() );
 
                global $wgBetterDirectionality;
-               if ( $wgBetterDirectionality && $this->getTitle()->getNamespace() != NS_SPECIAL ) {
-                       if( $this->getTitle()->getNamespace() == NS_MEDIAWIKI ) {
-                               // If the page is in the MediaWiki NS, the lang and dir attribute should depend on that,
-                               // i.e. MediaWiki:Message/ar -> lang=ar, dir=rtl. This assumes every message is translated,
-                               // but it's anyway better than assuming it is always in the content lang
-                               $nsMWTitle = $wgContLang->lcfirst( $this->getTitle()->getText() );
-                               list( $nsMWName, $nsMWLang ) = MessageCache::singleton()->figureMessage( $nsMWTitle );
-                               $nsMWDir = Language::factory( $nsMWLang )->getDir();
-                               $realBodyAttribs = array( 'lang' => $nsMWLang, 'dir' => $nsMWDir );
-                       } else {
-                               // Body text is in the site content language (see also bug 6100 and 28970)
-                               $realBodyAttribs = array( 'lang' => $wgLanguageCode, 'dir' => $wgContLang->getDir() );
+               if ( $wgBetterDirectionality ) {
+                       // not for special pages AND only when viewing AND if the page exists
+                       // (or is in MW namespace, because that has default content)
+                       if( $this->getTitle()->getNamespace() != NS_SPECIAL &&
+                               in_array( $action, array( 'view', 'render', 'print' ) ) &&
+                               ( $this->getTitle()->exists() || $this->getTitle()->getNamespace() == NS_MEDIAWIKI ) ) {
+                               $getPageLang = $out->parserOptions()->getTargetLanguage( $this->getTitle() );
+                               $pageLang = ( $getPageLang ? $getPageLang : $wgContLang );
+                               $realBodyAttribs = array( 'lang' => $pageLang->getCode(), 'dir' => $pageLang->getDir() );
+                               $out->mBodytext = Html::rawElement( 'div', $realBodyAttribs, $out->mBodytext );
                        }
-                       $out->mBodytext = Html::rawElement( 'div', $realBodyAttribs, $out->mBodytext );
                }
                $tpl->setRef( 'bodytext', $out->mBodytext );
 
index 3b9b2d7..0ce4354 100644 (file)
@@ -66,7 +66,15 @@ class ParserOptions {
        function getAllowSpecialInclusion()         { return $this->mAllowSpecialInclusion; }
        function getTidy()                          { return $this->mTidy; }
        function getInterfaceMessage()              { return $this->mInterfaceMessage; }
-       function getTargetLanguage()                { return $this->mTargetLanguage; }
+       function getTargetLanguage( $title = null ) {
+               // Parse mediawiki messages with correct target language
+               if ( $title && $title->getNamespace() == NS_MEDIAWIKI ) {
+                       list( /* $unused */, $lang ) = MessageCache::singleton()->figureMessage( $title->getText() );
+                       $obj = wfGetLangObj( $lang );
+                       return $obj;
+               }
+       return $this->mTargetLanguage;
+}
        function getMaxIncludeSize()                { return $this->mMaxIncludeSize; }
        function getMaxPPNodeCount()                { return $this->mMaxPPNodeCount; }
        function getMaxPPExpandDepth()              { return $this->mMaxPPExpandDepth; }