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