http://www.mediawiki.org/wiki/Special:Code/MediaWiki/75617

Revision: 75617
Author:   philip
Date:     2010-10-28 16:58:39 +0000 (Thu, 28 Oct 2010)
Log Message:
-----------
1. Revert the complicated redirection I made in r59754;
2. Add more Accept-Language XVO cache name for IE;
3. Use hreflang to specify canonical and alternate links, it's search engine 
friendly
   when a wiki has multiple variant languages.

Modified Paths:
--------------
    trunk/phase3/RELEASE-NOTES
    trunk/phase3/includes/DefaultSettings.php
    trunk/phase3/includes/OutputPage.php
    trunk/phase3/includes/Skin.php
    trunk/phase3/includes/Title.php
    trunk/phase3/includes/User.php
    trunk/phase3/includes/Wiki.php
    trunk/phase3/languages/Language.php
    trunk/phase3/languages/LanguageConverter.php

Modified: trunk/phase3/RELEASE-NOTES
===================================================================
--- trunk/phase3/RELEASE-NOTES  2010-10-28 15:32:43 UTC (rev 75616)
+++ trunk/phase3/RELEASE-NOTES  2010-10-28 16:58:39 UTC (rev 75617)
@@ -186,6 +186,8 @@
   is usually to set it to -1 to disable the limit)
 * (bug 25397) Allow uploading (not displaying) of WebP images, disabled by 
default
 * (bug 23194) Special:ListFiles now has thumbnails
+* Use hreflang to specify canonical and alternate links, search engine friendly
+  when a wiki has multiple variant languages.
 
 === Bug fixes in 1.17 ===
 * (bug 17560) Half-broken deletion moved image files to deletion archive

Modified: trunk/phase3/includes/DefaultSettings.php
===================================================================
--- trunk/phase3/includes/DefaultSettings.php   2010-10-28 15:32:43 UTC (rev 
75616)
+++ trunk/phase3/includes/DefaultSettings.php   2010-10-28 16:58:39 UTC (rev 
75617)
@@ -1971,6 +1971,9 @@
 /** Whether to enable language variant conversion for links. */
 $wgDisableTitleConversion = false;
 
+/** Whether to enable language cononical in meta data. */
+$wgDisableLangCanonical = false;
+
 /** Default variant code, if false, the default will be the language code */
 $wgDefaultLanguageVariant = false;
 

Modified: trunk/phase3/includes/OutputPage.php
===================================================================
--- trunk/phase3/includes/OutputPage.php        2010-10-28 15:32:43 UTC (rev 
75616)
+++ trunk/phase3/includes/OutputPage.php        2010-10-28 16:58:39 UTC (rev 
75617)
@@ -1430,7 +1430,17 @@
                                if( $variant === $wgContLang->getCode() ) {
                                        continue;
                                } else {
-                                       $aloption[] = 
"string-contains=$variant";
+                                       $aloption[] = 'string-contains=' . 
$variant;
+                                       
+                                       // IE and some other browsers use 
another form of language code
+                                       // in their Accept-Language header, 
like "zh-CN" or "zh-TW".
+                                       // We should handle these too.
+                                       $ievariant = explode( '-', $variant );
+                                       if ( count( $ievariant ) == 2 ) {
+                                               $ievariant[1] = strtoupper( 
$ievariant[1] );
+                                               $ievariant = implode( '-', 
$ievariant );
+                                               $aloption[] = 
'string-contains=' . $ievariant;
+                                       }
                                }
                        }
                        $this->addVaryHeader( 'Accept-Language', $aloption );

Modified: trunk/phase3/includes/Skin.php
===================================================================
--- trunk/phase3/includes/Skin.php      2010-10-28 15:32:43 UTC (rev 75616)
+++ trunk/phase3/includes/Skin.php      2010-10-28 16:58:39 UTC (rev 75617)
@@ -249,12 +249,23 @@
        }
 
        /**
-        * Adds metadata links (Creative Commons/Dublin Core/copyright) to the 
HTML
-        * output.
+        * Adds metadata links below to the HTML output.
+        * <ol>
+        *  <li>Creative Commons
+        *   <br />See http://wiki.creativecommons.org/Extend_Metadata.
+        *  </li>
+        *  <li>Dublin Core</li>
+        *  <li>Use hreflang to specify canonical and alternate links
+        *   <br />See 
http://www.google.com/support/webmasters/bin/answer.py?answer=189077
+        *  </li>
+        *  <li>Copyright</li>
+        * <ol>
+        * 
         * @param $out Object: instance of OutputPage
         */
        function addMetadataLinks( OutputPage $out ) {
                global $wgEnableDublinCoreRdf, $wgEnableCreativeCommonsRdf;
+               global $wgDisableLangConversion, $wgDisableLangCanonical, 
$wgContLang;
                global $wgRightsPage, $wgRightsUrl;
 
                if ( $out->isArticleRelated() ) {
@@ -275,6 +286,29 @@
                                );
                        }
                }
+
+               if ( !$wgDisableLangConversion && !$wgDisableLangCanonical
+                       && $wgContLang->hasVariants() ) {
+
+                       $urlvar = $wgContLang->getURLVariant();
+
+                       if ( !$urlvar ) {
+                               $variants = $wgContLang->getVariants();
+                               foreach ( $variants as $_v ) {
+                                       $out->addLink( array(
+                                               'rel' => 'alternate',
+                                               'hreflang' => $_v,
+                                               'href' => 
$this->mTitle->getLocalURL( '', $_v ) )
+                                       );
+                               }
+                       } else {
+                               $out->addLink( array(
+                                       'rel' => 'canonical',
+                                       'href' => $this->mTitle->getFullURL() )
+                               );
+                       }
+               }
+               
                $copyright = '';
                if ( $wgRightsPage ) {
                        $copy = Title::newFromText( $wgRightsPage );

Modified: trunk/phase3/includes/Title.php
===================================================================
--- trunk/phase3/includes/Title.php     2010-10-28 15:32:43 UTC (rev 75616)
+++ trunk/phase3/includes/Title.php     2010-10-28 16:58:39 UTC (rev 75617)
@@ -869,14 +869,6 @@
                        $query = wfArrayToCGI( $query );
                }
 
-               // internal links should point to same variant as current page 
(only anonymous users)
-               if ( !$variant && $wgContLang->hasVariants() && 
!$wgUser->isLoggedIn() ) {
-                       $pref = $wgContLang->getPreferredVariant( false );
-                       if ( $pref != $wgContLang->getCode() ) {
-                               $variant = $pref;
-                       }
-               }
-
                if ( $this->isExternal() ) {
                        $url = $this->getFullURL();
                        if ( $query ) {

Modified: trunk/phase3/includes/User.php
===================================================================
--- trunk/phase3/includes/User.php      2010-10-28 15:32:43 UTC (rev 75616)
+++ trunk/phase3/includes/User.php      2010-10-28 16:58:39 UTC (rev 75617)
@@ -1024,7 +1024,7 @@
                /**
                 * default language setting
                 */
-               $variant = $wgContLang->getPreferredVariant( false );
+               $variant = $wgContLang->getDefaultVariant();
                $defOpt['variant'] = $variant;
                $defOpt['language'] = $variant;
                foreach( SearchEngine::searchableNamespaces() as $nsnum => 
$nsname ) {

Modified: trunk/phase3/includes/Wiki.php
===================================================================
--- trunk/phase3/includes/Wiki.php      2010-10-28 15:32:43 UTC (rev 75616)
+++ trunk/phase3/includes/Wiki.php      2010-10-28 16:58:39 UTC (rev 75617)
@@ -208,19 +208,11 @@
                                throw new ErrorPageError( 'badtitle', 
'badtitletext' );
                        }
                // Redirect loops, no title in URL, $wgUsePathInfo URLs, and 
URLs with a variant
-               } else if( $action == 'view' && !$request->wasPosted() &&
-                       ( ( !$request->getVal( 'title' ) || 
$title->getPrefixedDBKey() != $request->getText( 'title' ) ) ||
-                         // No valid variant in URL (if the main-language has 
multi-variants), to ensure
-                         // anonymous access would always be redirect to a URL 
with 'variant' parameter
-                         ( !$request->getVal( 'variant' ) && 
$wgContLang->hasVariants() && !$wgUser->isLoggedIn() ) ) &&
-                       !count( array_diff( array_keys( $request->getValues() 
), array( 'action', 'title' ) ) ) )
+               } else if( $action == 'view' && !$request->wasPosted()
+                       && ( ( !$request->getVal( 'title' ) || 
$title->getPrefixedDBKey() != $request->getText( 'title' ) ) )
+                       && !count( array_diff( array_keys( 
$request->getValues() ), array( 'action', 'title' ) ) ) )
                {
-                       if( !$wgUser->isLoggedIn() ) {
-                               $pref = $wgContLang->getPreferredVariant( 
false, $fromHeader = true );
-                               $targetUrl = $title->getFullURL( '', $variant = 
$pref );
-                       }
-                       else
-                               $targetUrl = $title->getFullURL();
+                       $targetUrl = $title->getFullURL();
                        // Redirect to canonical url, make it a 301 to allow 
caching
                        if( $targetUrl == $request->getFullRequestURL() ) {
                                $message = "Redirect loop detected!\n\n" .

Modified: trunk/phase3/languages/Language.php
===================================================================
--- trunk/phase3/languages/Language.php 2010-10-28 15:32:43 UTC (rev 75616)
+++ trunk/phase3/languages/Language.php 2010-10-28 16:58:39 UTC (rev 75617)
@@ -44,6 +44,8 @@
        function convertTitle( $t ) { return $t->getPrefixedText(); }
        function getVariants() { return array( $this->mLang->getCode() ); }
        function getPreferredVariant() { return $this->mLang->getCode(); }
+       function getDefaultVariant() { return $this->mLang->getCode(); }
+       function getURLVariant() { return ''; }
        function getConvRuleTitle() { return false; }
        function findVariantLink( &$l, &$n, $ignoreOtherCond = false ) { }
        function getExtraHashOptions() { return ''; }
@@ -2673,9 +2675,17 @@
                return $this->mConverter->getVariants();
        }
 
-       function getPreferredVariant( $fromUser = true, $fromHeader = false ) {
-               return $this->mConverter->getPreferredVariant( $fromUser, 
$fromHeader );
+       function getPreferredVariant() {
+               return $this->mConverter->getPreferredVariant();
        }
+       
+       function getDefaultVariant() {
+               return $this->mConverter->getDefaultVariant();
+       }
+       
+       function getURLVariant() {
+               return $this->mConverter->getURLVariant();
+       }
 
        /**
         * If a language supports multiple variants, it is

Modified: trunk/phase3/languages/LanguageConverter.php
===================================================================
--- trunk/phase3/languages/LanguageConverter.php        2010-10-28 15:32:43 UTC 
(rev 75616)
+++ trunk/phase3/languages/LanguageConverter.php        2010-10-28 16:58:39 UTC 
(rev 75617)
@@ -134,20 +134,18 @@
 
        /**
         * Get preferred language variant.
-        * @param $fromUser Boolean: get it from $wgUser's preferences
-        * @param $fromHeader Boolean: get it from Accept-Language
         * @return String: the preferred language code
         */
-       public function getPreferredVariant( $fromUser = true, $fromHeader = 
false ) {
-               global $wgDefaultLanguageVariant;
+       public function getPreferredVariant() {
+               global $wgDefaultLanguageVariant, $wgUser;
 
                $req = $this->getURLVariant();
 
-               if ( $fromUser && !$req ) {
+               if ( $wgUser->isLoggedIn() && !$req ) {
                        $req = $this->getUserVariant();
                }
 
-               if ( $fromHeader && !$req ) {
+               elseif ( !$req ) {
                        $req = $this->getHeaderVariant();
                }
 
@@ -166,6 +164,26 @@
        }
 
        /**
+        * Get default variant.
+        * This function would not be affected by user's settings or headers
+        * @return String: the default variant code
+        */
+       public function getDefaultVariant() {
+               global $wgDefaultLanguageVariant;
+
+               $req = $this->getURLVariant();
+
+               if ( $wgDefaultLanguageVariant && !$req ) {
+                       $req = $this->validateVariant( 
$wgDefaultLanguageVariant );
+               }
+
+               if ( $req ) {
+                       return $req;
+               }
+               return $this->mMainLanguageCode;
+       }
+
+       /**
         * Validate the variant
         * @param $variant String: the variant to validate
         * @return Mixed: returns the variant if it is valid, null otherwise
@@ -183,7 +201,7 @@
         *
         * @return Mixed: variant if one found, false otherwise.
         */
-       protected function getURLVariant() {
+       public function getURLVariant() {
                global $wgRequest;
 
                if ( $this->mURLVariant ) {


_______________________________________________
MediaWiki-CVS mailing list
MediaWiki-CVS@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs

Reply via email to