Index: trunk/extensions/FlaggedRevs/FlaggedRevs.php |
— | — | @@ -71,7 +71,8 @@ |
72 | 72 | # This will only distinguish "sigted", "quality", and unreviewed |
73 | 73 | # A small icon will show in the upper right hand corner |
74 | 74 | $wgSimpleFlaggedRevsUI = false; |
75 | | -# Add stable/current revision tabs. May be redundant due to the tags. |
| 75 | +# Add stable/draft revision tabs. May be redundant due to the tags. |
| 76 | +# If you have an open wiki, with the simple UI, you may want to enable these. |
76 | 77 | $wgFlaggedRevTabs = false; |
77 | 78 | |
78 | 79 | # Allowed namespaces of reviewable pages |
— | — | @@ -149,8 +150,8 @@ |
150 | 151 | 'userpage' => true |
151 | 152 | ); |
152 | 153 | |
153 | | -# |
154 | | -############ Variables below this point should probably not be modified ############ |
| 154 | +# Variables below this point should probably not be modified |
| 155 | +######### |
155 | 156 | |
156 | 157 | # Add review log |
157 | 158 | $wgLogTypes[] = 'review'; |
— | — | @@ -203,12 +204,12 @@ |
204 | 205 | * All included pages/arguments are expanded out |
205 | 206 | */ |
206 | 207 | public static function expandText( $text='', $title, $id=null ) { |
207 | | - global $wgParser; |
| 208 | + global $wgParser, $wgUser; |
208 | 209 | # Make our hooks to trigger |
209 | 210 | $wgParser->isStable = true; |
210 | 211 | $wgParser->includesMatched = true; |
211 | 212 | # Parse with default options |
212 | | - $options = new ParserOptions; |
| 213 | + $options = new ParserOptions($wgUser); |
213 | 214 | $options->setRemoveComments( true ); // Save some bandwidth ;) |
214 | 215 | $outputText = $wgParser->preprocess( $text, $title, $options, $id ); |
215 | 216 | $expandedText = array( $outputText, $wgParser->includesMatched ); |
— | — | @@ -220,23 +221,23 @@ |
221 | 222 | } |
222 | 223 | |
223 | 224 | /** |
224 | | - * @param Title $title |
| 225 | + * @param Article $article |
225 | 226 | * @param string $text |
226 | 227 | * @param int $id |
227 | | - * @param ParserOptions $options |
228 | | - * @param int $timeframe, when the revision was reviewed |
229 | 228 | * @returns ParserOutput |
230 | 229 | * Get the HTML of a revision based on how it was during $timeframe |
231 | 230 | */ |
232 | | - public static function parseStableText( $title, $text, $id=NULL, $options ) { |
233 | | - global $wgParser; |
| 231 | + public static function parseStableText( $article, $text, $id=NULL ) { |
| 232 | + global $wgParser, $wgUser; |
| 233 | + # Default options for anons if not logged in |
| 234 | + $options = ParserOptions::newFromUser($wgUser); |
234 | 235 | # Make our hooks to trigger |
235 | 236 | $wgParser->isStable = true; |
236 | | - # Don't show section-edit links |
237 | | - # They can be old and misleading |
| 237 | + # Don't show section-edit links, they can be old and misleading |
238 | 238 | $options->setEditSection(false); |
| 239 | + //$options->setEditSection( $id==$article->getLatest() ); |
239 | 240 | # Parse the new body, wikitext -> html |
240 | | - $parserOut = $wgParser->parse( $text, $title, $options, true, true, $id ); |
| 241 | + $parserOut = $wgParser->parse( $text, $article->getTitle(), $options, true, true, $id ); |
241 | 242 | # Reset $wgParser |
242 | 243 | $wgParser->isStable = false; // Done! |
243 | 244 | |
— | — | @@ -257,7 +258,7 @@ |
258 | 259 | $text = gzdeflate( $text ); |
259 | 260 | $flags[] = 'gzip'; |
260 | 261 | } else { |
261 | | - wfDebug( "Revision::compressRevisionText() -- no zlib support, not compressing\n" ); |
| 262 | + wfDebug( "FlaggedRevs::compressText() -- no zlib support, not compressing\n" ); |
262 | 263 | } |
263 | 264 | } |
264 | 265 | return implode( ',', $flags ); |
— | — | @@ -648,13 +649,13 @@ |
649 | 650 | |
650 | 651 | /** |
651 | 652 | * @param Article $article |
652 | | - * @param parerOutput $parserOutput |
653 | | - * Updates the stable cache of a page with the given $parserOutput |
| 653 | + * @param parerOutput $parserOut |
| 654 | + * Updates the stable cache of a page with the given $parserOut |
654 | 655 | */ |
655 | | - public static function updatePageCache( $article, $parserOutput=NULL ) { |
| 656 | + public static function updatePageCache( $article, $parserOut=NULL ) { |
656 | 657 | global $wgUser, $parserMemc, $wgFlaggedRevsExpire; |
657 | 658 | // Make sure it is valid |
658 | | - if( is_null($parserOutput) || !$article ) return false; |
| 659 | + if( is_null($parserOut) || !$article ) return false; |
659 | 660 | |
660 | 661 | // Update the cache... |
661 | 662 | $article->mTitle->invalidateCache(); |
— | — | @@ -663,20 +664,20 @@ |
664 | 665 | $key = 'sv-' . $parserCache->getKey( $article, $wgUser ); |
665 | 666 | // Add cache mark to HTML |
666 | 667 | $now = wfTimestampNow(); |
667 | | - $parserOutput->setCacheTime( $now ); |
| 668 | + $parserOut->setCacheTime( $now ); |
668 | 669 | |
669 | 670 | // Save the timestamp so that we don't have to load the revision row on view |
670 | | - $parserOutput->mTimestamp = $article->getTimestamp(); |
| 671 | + $parserOut->mTimestamp = $article->getTimestamp(); |
671 | 672 | |
672 | | - $parserOutput->mText .= "\n<!-- Saved in stable version parser cache with key $key and timestamp $now -->"; |
| 673 | + $parserOut->mText .= "\n<!-- Saved in stable version parser cache with key $key and timestamp $now -->"; |
673 | 674 | // Set expire time |
674 | | - if( $parserOutput->containsOldMagic() ){ |
| 675 | + if( $parserOut->containsOldMagic() ){ |
675 | 676 | $expire = 3600; # 1 hour |
676 | 677 | } else { |
677 | 678 | $expire = $wgFlaggedRevsExpire; |
678 | 679 | } |
679 | 680 | // Save to objectcache |
680 | | - $parserMemc->set( $key, $parserOutput, $expire ); |
| 681 | + $parserMemc->set( $key, $parserOut, $expire ); |
681 | 682 | // Purge squid for this page only |
682 | 683 | $article->mTitle->purgeSquid(); |
683 | 684 | |
— | — | @@ -767,25 +768,24 @@ |
768 | 769 | if( !$sv ) |
769 | 770 | return true; |
770 | 771 | # Parse the revision |
771 | | - $options = new ParserOptions; |
| 772 | + $article = new Article( $linksUpdate->mTitle ); |
772 | 773 | $text = self::uncompressText( $sv->fr_text, $sv->fr_flags ); |
773 | | - $parserOutput = self::parseStableText( $linksUpdate->mTitle, $text, $sv->fr_rev_id, $options ); |
| 774 | + $parserOut = self::parseStableText( $article, $text, $sv->fr_rev_id ); |
774 | 775 | # Might as well update the stable cache while we're at it |
775 | | - $article = new Article( $linksUpdate->mTitle ); |
776 | | - FlaggedRevs::updatePageCache( $article, $parserOutput ); |
| 776 | + FlaggedRevs::updatePageCache( $article, $parserOut ); |
777 | 777 | # Update page fields |
778 | 778 | FlaggedRevs::updateArticleOn( $article, $sv->fr_rev_id ); |
779 | 779 | # Update the links tables to include these |
780 | 780 | # We want the UNION of links between the current |
781 | 781 | # and stable version. Therefore, we only care about |
782 | 782 | # links that are in the stable version and not the regular one. |
783 | | - $linksUpdate->mLinks += $parserOutput->getLinks(); |
784 | | - $linksUpdate->mImages += $parserOutput->getImages(); |
785 | | - $linksUpdate->mTemplates += $parserOutput->getTemplates(); |
786 | | - $linksUpdate->mExternals += $parserOutput->getExternalLinks(); |
787 | | - $linksUpdate->mCategories += $parserOutput->getCategories(); |
| 783 | + $linksUpdate->mLinks += $parserOut->getLinks(); |
| 784 | + $linksUpdate->mImages += $parserOut->getImages(); |
| 785 | + $linksUpdate->mTemplates += $parserOut->getTemplates(); |
| 786 | + $linksUpdate->mExternals += $parserOut->getExternalLinks(); |
| 787 | + $linksUpdate->mCategories += $parserOut->getCategories(); |
788 | 788 | # Interlanguage links |
789 | | - $ill = $parserOutput->getLanguageLinks(); |
| 789 | + $ill = $parserOut->getLanguageLinks(); |
790 | 790 | foreach( $ill as $link ) { |
791 | 791 | list( $key, $title ) = explode( ':', $link, 2 ); |
792 | 792 | $linksUpdate->mInterlangs[$key] = $title; |
— | — | @@ -895,8 +895,8 @@ |
896 | 896 | /** |
897 | 897 | * Insert image timestamps/SHA-1s into page output |
898 | 898 | */ |
899 | | - static function outputInjectImageTimestamps( $out, $parserOutput ) { |
900 | | - $out->mImageSHA1Keys = $parserOutput->mImageSHA1Keys; |
| 899 | + static function outputInjectImageTimestamps( $out, $parserOut ) { |
| 900 | + $out->mImageSHA1Keys = $parserOut->mImageSHA1Keys; |
901 | 901 | |
902 | 902 | return true; |
903 | 903 | } |
— | — | @@ -955,15 +955,18 @@ |
956 | 956 | * When an edit is made by a reviwer, if the current revision is the stable |
957 | 957 | * version, try to automatically review it. |
958 | 958 | */ |
959 | | - public static function maybeMakeEditReviewed( $article, $user, $text, $c, $flags, $a, $b, $flags, $rev ) { |
| 959 | + public static function maybeMakeEditReviewed( $article, $user, $text, $c, $m, $a, $b, $flags, $rev ) { |
960 | 960 | global $wgFlaggedRevsAutoReview, $wgFlaggedRevs; |
961 | 961 | |
962 | 962 | if( !$wgFlaggedRevsAutoReview || !$user->isAllowed( 'review' ) ) |
963 | 963 | return true; |
| 964 | + # Revision will be null for null edits |
964 | 965 | if( !$rev ) { |
965 | 966 | $wgFlaggedRevs->skipReviewDiff = true; // Don't jump to diff... |
966 | 967 | return true; |
967 | 968 | } |
| 969 | + # Check if this new revision is now the current one. |
| 970 | + # ArticleSaveComplete may trigger even though a confict blocked insertion. |
968 | 971 | $prev_id = $article->mTitle->getPreviousRevisionID( $rev->getID() ); |
969 | 972 | if( !$prev_id ) |
970 | 973 | return true; |
— | — | @@ -995,6 +998,7 @@ |
996 | 999 | |
997 | 1000 | if( !$wgFlaggedRevsAutoReviewNew || !$user->isAllowed( 'review' ) ) |
998 | 1001 | return true; |
| 1002 | + # Revision will be null for null edits |
999 | 1003 | if( !$rev ) { |
1000 | 1004 | $wgFlaggedRevs->skipReviewDiff = true; // Don't jump to diff... |
1001 | 1005 | return true; |
— | — | @@ -1017,7 +1021,7 @@ |
1018 | 1022 | * fields will be up to date. This updates the stable version. |
1019 | 1023 | */ |
1020 | 1024 | public static function autoReviewEdit( $article, $user, $text, $rev, $flags ) { |
1021 | | - global $wgParser, $parserCache, $wgFlaggedRevsAutoReview, $wgFlaggedRevs; |
| 1025 | + global $wgParser, $wgFlaggedRevsAutoReview, $wgFlaggedRevs; |
1022 | 1026 | |
1023 | 1027 | $quality = 0; |
1024 | 1028 | if( FlaggedRevs::isQuality($flags) ) { |
— | — | @@ -1031,11 +1035,17 @@ |
1032 | 1036 | 'frt_value' => $value |
1033 | 1037 | ); |
1034 | 1038 | } |
1035 | | - # Parse the text, we cannot rely on cache, may be out of date or not used. |
1036 | | - # Also, we need the expanded text anyway. |
1037 | | - $options = new ParserOptions; |
1038 | | - $options->setTidy(true); |
1039 | | - $poutput = $wgParser->parse( $text, $article->mTitle, $options, true, true, $rev->getID() ); |
| 1039 | + # Try the parser cache, should be set on the edit before this is called. |
| 1040 | + # If not set or up to date, then parse it... |
| 1041 | + $parserCache =& ParserCache::singleton(); |
| 1042 | + $poutput = $parserCache->get( $article, $user ); |
| 1043 | + if( $poutput==false ) { |
| 1044 | + $options = ParserOptions::newFromUser($user); |
| 1045 | + $options->setTidy(true); |
| 1046 | + $poutput = $wgParser->parse( $text, $article->mTitle, $options, true, true, $rev->getID() ); |
| 1047 | + # Might as well save the cache while we're at it |
| 1048 | + $parserCache->save( $poutput, $article, $user ); |
| 1049 | + } |
1040 | 1050 | # NS:title -> rev ID mapping |
1041 | 1051 | foreach( $poutput->mTemplateIds as $namespace => $title ) { |
1042 | 1052 | foreach( $title as $dbkey => $id ) { |
— | — | @@ -1163,6 +1173,7 @@ |
1164 | 1174 | $dbr = wfGetDB( DB_SLAVE ); |
1165 | 1175 | $lower = $dbr->selectField( 'revision', 'rev_timestamp', |
1166 | 1176 | array( 'rev_user' => $user->getID() ), |
| 1177 | + __METHOD__, |
1167 | 1178 | array( 'ORDER BY' => 'rev_timestamp ASC', |
1168 | 1179 | 'USE INDEX' => 'user_timestamp' ) ); |
1169 | 1180 | # Recursevly check for for an edit $spacing days later, until we are done. |
— | — | @@ -1178,7 +1189,7 @@ |
1179 | 1190 | if( $lower !==false ) |
1180 | 1191 | $benchmarks++; |
1181 | 1192 | } |
1182 | | - if( $benchmarks < $wgFlaggedRevsAutopromote['benchmarks'] ) |
| 1193 | + if( $benchmarks < $needed ) |
1183 | 1194 | return true; |
1184 | 1195 | } |
1185 | 1196 | # Add editor rights |
— | — | @@ -1205,11 +1216,11 @@ |
1206 | 1217 | return true; |
1207 | 1218 | |
1208 | 1219 | $parserCache =& ParserCache::singleton(); |
1209 | | - $parserOutput = $parserCache->get( $article, $wgUser ); |
1210 | | - if( $parserOutput ) { |
| 1220 | + $parserOut = $parserCache->get( $article, $wgUser ); |
| 1221 | + if( $parserOut ) { |
1211 | 1222 | // Clear older, incomplete, cached versions |
1212 | 1223 | // We need the IDs of templates and timestamps of images used |
1213 | | - if( !isset($parserOutput->mTemplateIds) || !isset($parserOutput->mImageSHA1Keys) ) |
| 1224 | + if( !isset($parserOut->mTemplateIds) || !isset($parserOut->mImageSHA1Keys) ) |
1214 | 1225 | $article->mTitle->invalidateCache(); |
1215 | 1226 | } |
1216 | 1227 | return true; |
— | — | @@ -1345,21 +1356,20 @@ |
1346 | 1357 | } |
1347 | 1358 | } |
1348 | 1359 | # Try the stable page cache |
1349 | | - $parserOutput = parent::getPageCache( $article ); |
| 1360 | + $parserOut = parent::getPageCache( $article ); |
1350 | 1361 | # If no cache is available, get the text and parse it |
1351 | | - if( $parserOutput==false ) { |
| 1362 | + if( $parserOut==false ) { |
1352 | 1363 | $text = parent::getFlaggedRevText( $vis_id ); |
1353 | | - $options = ParserOptions::newFromUser($wgUser); |
1354 | | - $parserOutput = parent::parseStableText( $wgTitle, $text, $vis_id, $options ); |
| 1364 | + $parserOut = parent::parseStableText( $article, $text, $vis_id ); |
1355 | 1365 | # Update the general cache |
1356 | | - parent::updatePageCache( $article, $parserOutput ); |
| 1366 | + parent::updatePageCache( $article, $parserOut ); |
1357 | 1367 | } |
1358 | | - $wgOut->mBodytext = $parserOutput->getText(); |
| 1368 | + $wgOut->mBodytext = $parserOut->getText(); |
1359 | 1369 | # Show stable categories and interwiki links only |
1360 | 1370 | $wgOut->mCategoryLinks = array(); |
1361 | | - $wgOut->addCategoryLinks( $parserOutput->getCategories() ); |
| 1371 | + $wgOut->addCategoryLinks( $parserOut->getCategories() ); |
1362 | 1372 | $wgOut->mLanguageLinks = array(); |
1363 | | - $wgOut->addLanguageLinks( $parserOutput->getLanguageLinks() ); |
| 1373 | + $wgOut->addLanguageLinks( $parserOut->getLanguageLinks() ); |
1364 | 1374 | $notes = parent::ReviewNotes( $tfrev ); |
1365 | 1375 | # Tell MW that parser output is done |
1366 | 1376 | $outputDone = true; |
— | — | @@ -1519,21 +1529,28 @@ |
1520 | 1530 | // change the edit tab to a "current revision" tab |
1521 | 1531 | $tfrev = $this->getOverridingRev(); |
1522 | 1532 | // No quality revs? Find the last reviewed one |
1523 | | - if( !is_object($tfrev) ) |
| 1533 | + if( !is_object($tfrev) ) |
1524 | 1534 | return true; |
| 1535 | + /* |
| 1536 | + // If the stable version is the same is the current, move along... |
| 1537 | + if( $article->getLatest() == $tfrev->fr_rev_id ) { |
| 1538 | + return true; |
| 1539 | + } |
| 1540 | + */ |
1525 | 1541 | if( !$wgFlaggedRevTabs ) { |
1526 | 1542 | if( $this->pageOverride() ) { |
1527 | | - # Remove edit option altogether |
1528 | | - unset( $content_actions['edit']); |
1529 | | - unset( $content_actions['viewsource']); |
| 1543 | + # Remove edit option altogether, unless it's the current revision |
| 1544 | + unset( $content_actions['edit'] ); |
| 1545 | + unset( $content_actions['viewsource'] ); |
1530 | 1546 | } |
1531 | 1547 | return true; |
1532 | 1548 | } |
1533 | 1549 | // Note that revisions may not be set to override for users |
1534 | 1550 | if( $this->pageOverride() ) { |
1535 | 1551 | # Remove edit option altogether |
1536 | | - unset( $content_actions['edit']); |
1537 | | - unset( $content_actions['viewsource']); |
| 1552 | + unset( $content_actions['edit'] ); |
| 1553 | + unset( $content_actions['viewsource'] ); |
| 1554 | + |
1538 | 1555 | $new_actions = array(); $counter = 0; |
1539 | 1556 | # Straighten out order |
1540 | 1557 | foreach( $content_actions as $tab_action => $data ) { |
— | — | @@ -1860,7 +1877,6 @@ |
1861 | 1878 | */ |
1862 | 1879 | function getLatestStableRev( $getText=false ) { |
1863 | 1880 | global $wgTitle; |
1864 | | - |
1865 | 1881 | // Cached results available? |
1866 | 1882 | if( isset($this->latestfound) ) { |
1867 | 1883 | return ( $this->latestfound ) ? $this->latestrev : NULL; |
Index: trunk/extensions/FlaggedRevs/FlaggedRevsPage_body.php |
— | — | @@ -401,7 +401,9 @@ |
402 | 402 | $poutput = $parserCache->get( $article, $wgUser ); |
403 | 403 | if( $poutput==false ) { |
404 | 404 | $text = $article->getContent(); |
405 | | - $poutput = $wgParser->parse($text, $article->mTitle, ParserOptions::newFromUser($wgUser)); |
| 405 | + $options = ParserOptions::newFromUser($wgUser); |
| 406 | + $options->setTidy(true); |
| 407 | + $poutput = $wgParser->parse( $text, $article->mTitle, $options ); |
406 | 408 | } |
407 | 409 | $u = new LinksUpdate( $this->page, $poutput ); |
408 | 410 | $u->doUpdate(); // Will trigger our hook to add stable links too... |
— | — | @@ -555,8 +557,7 @@ |
556 | 558 | } |
557 | 559 | |
558 | 560 | function showStableRevision( $frev ) { |
559 | | - global $wgParser, $wgLang, $wgUser, $wgOut, $wgTitle, $wgFlaggedRevs; |
560 | | - |
| 561 | + global $wgParser, $wgLang, $wgUser, $wgOut, $wgFlaggedRevs; |
561 | 562 | // Get the revision |
562 | 563 | $frev = FlaggedRevs::getFlaggedRev( $this->oldid ); |
563 | 564 | // Revision must exists |
— | — | @@ -578,8 +579,8 @@ |
579 | 580 | '</span>'; |
580 | 581 | // Parse the text... |
581 | 582 | $text = $wgFlaggedRevs->getFlaggedRevText( $this->oldid ); |
582 | | - $options = ParserOptions::newFromUser($wgUser); |
583 | | - $parserOutput = $wgFlaggedRevs->parseStableText( $page, $text, $this->oldid, $options ); |
| 583 | + $article = new Article( $page ); |
| 584 | + $parserOutput = $wgFlaggedRevs->parseStableText( $article, $text, $this->oldid ); |
584 | 585 | $notes = $wgFlaggedRevs->ReviewNotes( $frev ); |
585 | 586 | // Set the new body HTML, place a tag on top |
586 | 587 | $wgOut->addHTML('<div id="mwrevisiontag" class="flaggedrevs_notice plainlinks">'.$tag.'</div>' . $parserOutput->getText() . $notes); |
Index: trunk/extensions/FlaggedRevs/FlaggedRevsPage.i18n.php |
— | — | @@ -14,17 +14,17 @@ |
15 | 15 | 'group-reviewer-member' => 'Reviewer', |
16 | 16 | 'grouppage-reviewer' => '{{ns:project}}:Reviewer', |
17 | 17 | |
18 | | - 'revreview-current' => 'Current revision', |
| 18 | + 'revreview-current' => 'Draft (editable)', |
19 | 19 | 'revreview-stable' => 'Stable version', |
20 | 20 | 'revreview-oldrating' => 'It was rated as:', |
21 | 21 | 'revreview-noflagged' => 'There are no reviewed revisions of this page, so it may \'\'\'not\'\'\' have been |
22 | 22 | [[Help:Article validation|checked]] for quality.', |
23 | 23 | |
24 | | - 'revreview-quick-see-quality' => '\'\'\'Current\'\'\'. [{{fullurl:{{FULLPAGENAMEE}}|stable=1}} See latest quality revision]', |
25 | | - 'revreview-quick-see-basic' => '\'\'\'Current\'\'\'. [{{fullurl:{{FULLPAGENAMEE}}|stable=1}} See latest sighted revision]', |
26 | | - 'revreview-quick-basic' => '\'\'\'Sighted\'\'\'. [{{fullurl:{{FULLPAGENAMEE}}|stable=0}} See current revision] |
| 24 | + 'revreview-quick-see-quality' => '\'\'\'Current\'\'\'. [[{{fullurl:{{FULLPAGENAMEE}}|stable=1}} See latest quality revision]]', |
| 25 | + 'revreview-quick-see-basic' => '\'\'\'Current\'\'\'. [[{{fullurl:{{FULLPAGENAMEE}}|stable=1}} See latest sighted revision]]', |
| 26 | + 'revreview-quick-basic' => '\'\'\'[[Help:Article validation|Sighted]]\'\'\'. [[{{fullurl:{{FULLPAGENAMEE}}|stable=0}} See current revision]] |
27 | 27 | ($2 [{{fullurl:{{FULLPAGENAMEE}}|oldid=$1&diff=cur&editreview=1}} {{plural:$2|change|changes}}])', |
28 | | - 'revreview-quick-quality' => '\'\'\'Quality\'\'\'. [{{fullurl:{{FULLPAGENAMEE}}|stable=0}} See current revision] |
| 28 | + 'revreview-quick-quality' => '\'\'\'[[Help:Article validation|Quality]]\'\'\'. [[{{fullurl:{{FULLPAGENAMEE}}|stable=0}} See current revision]] |
29 | 29 | ($2 [{{fullurl:{{FULLPAGENAMEE}}|oldid=$1&diff=cur&editreview=1}} {{plural:$2|change|changes}}])', |
30 | 30 | 'revreview-quick-none' => '\'\'\'Current\'\'\'. No reviewed revisions.', |
31 | 31 | 'revreview-newest-basic' => 'The [{{fullurl:{{FULLPAGENAMEE}}|stable=1}} latest sighted revision] |