r23699 MediaWiki - Code Review archive

Repository:MediaWiki
Revision:r23698‎ | r23699 | r23700 >
Date:10:36, 4 July 2007
Author:catrope
Status:old
Tags:
Comment:
apiedit: Merging revisions 23679, 23686, 23693, 23695, 23696 and 23698 from trunk
Modified paths:
  • /branches/apiedit/phase3 (modified) (history)
  • /branches/apiedit/phase3/RELEASE-NOTES (modified) (history)
  • /branches/apiedit/phase3/includes/AutoLoader.php (modified) (history)
  • /branches/apiedit/phase3/includes/SpecialWatchlist.php (modified) (history)
  • /branches/apiedit/phase3/includes/WatchlistEditor.php (added) (history)
  • /branches/apiedit/phase3/languages/classes/LanguageKu.php (modified) (history)
  • /branches/apiedit/phase3/languages/messages/MessagesDe.php (modified) (history)
  • /branches/apiedit/phase3/languages/messages/MessagesEn.php (modified) (history)
  • /branches/apiedit/phase3/languages/messages/MessagesJa.php (modified) (history)
  • /branches/apiedit/phase3/maintenance/language/messages.inc (modified) (history)

Diff [purge]

Index: branches/apiedit/phase3/maintenance/language/messages.inc
@@ -1080,10 +1080,6 @@
10811081 'nowatchlist',
10821082 'watchlistanontext',
10831083 'watchlistcount',
1084 - 'clearwatchlist',
1085 - 'watchlistcleartext',
1086 - 'watchlistclearbutton',
1087 - 'watchlistcleardone',
10881084 'watchnologin',
10891085 'watchnologintext',
10901086 'addedwatch',
@@ -1101,11 +1097,7 @@
11021098 'wlheader-showupdated',
11031099 'watchmethod-recent',
11041100 'watchmethod-list',
1105 - 'removechecked',
11061101 'watchlistcontains',
1107 - 'watcheditlist',
1108 - 'removingchecked',
1109 - 'couldntremove',
11101102 'iteminvalidname',
11111103 'wlnote',
11121104 'wlshowlast',
@@ -1116,7 +1108,6 @@
11171109 'watchlist-hide-own',
11181110 'watchlist-show-minor',
11191111 'watchlist-hide-minor',
1120 - 'wldone',
11211112 ),
11221113 'watching' => array(
11231114 'watching',
@@ -2131,6 +2122,26 @@
21322123 'lag-warn-normal',
21332124 'lag-warn-high',
21342125 ),
 2126+ 'watchlisteditor' => array(
 2127+ 'watchlistedit-numitems',
 2128+ 'watchlistedit-noitems',
 2129+ 'watchlistedit-clear-title',
 2130+ 'watchlistedit-clear-legend',
 2131+ 'watchlistedit-clear-confirm',
 2132+ 'watchlistedit-clear-submit',
 2133+ 'watchlistedit-clear-done',
 2134+ 'watchlistedit-normal-title',
 2135+ 'watchlistedit-normal-legend',
 2136+ 'watchlistedit-normal-explain',
 2137+ 'watchlistedit-normal-submit',
 2138+ 'watchlistedit-normal-done',
 2139+ 'watchlistedit-raw-title',
 2140+ 'watchlistedit-raw-legend',
 2141+ 'watchlistedit-raw-explain',
 2142+ 'watchlistedit-raw-titles',
 2143+ 'watchlistedit-raw-submit',
 2144+ 'watchlistedit-raw-done',
 2145+ ),
21352146 );
21362147 /** Comments for each block */
21372148 $wgBlockComments = array(
@@ -2297,6 +2308,7 @@
22982309 'sizeunits' => 'Size units',
22992310 'livepreview' => 'Live preview',
23002311 'lagwarning' => 'Friendlier slave lag warnings',
 2312+ 'watchlisteditor' => 'Watchlist editor',
23012313 );
23022314
23032315 /** Short comments for standalone messages */
Index: branches/apiedit/phase3/includes/AutoLoader.php
@@ -252,6 +252,7 @@
253253 'ZhClient' => 'includes/ZhClient.php',
254254 'memcached' => 'includes/memcached-client.php',
255255 'EmaillingJob' => 'includes/JobQueue.php',
 256+ 'WatchlistEditor' => 'includes/WatchlistEditor.php',
256257
257258 # filerepo
258259 'ArchivedFile' => 'includes/filerepo/ArchivedFile.php',
Index: branches/apiedit/phase3/includes/WatchlistEditor.php
@@ -0,0 +1,397 @@
 2+<?php
 3+
 4+/**
 5+ * Provides the UI through which users can perform editing
 6+ * operations on their watchlist
 7+ *
 8+ * @addtogroup Watchlist
 9+ * @author Rob Church <robchur@gmail.com>
 10+ */
 11+class WatchlistEditor {
 12+
 13+ /**
 14+ * Editing modes
 15+ */
 16+ const EDIT_CLEAR = 1;
 17+ const EDIT_RAW = 2;
 18+ const EDIT_NORMAL = 3;
 19+
 20+ /**
 21+ * Main execution point
 22+ *
 23+ * @param User $user
 24+ * @param OutputPage $output
 25+ * @param WebRequest $request
 26+ * @param int $mode
 27+ */
 28+ public function execute( $user, $output, $request, $mode ) {
 29+ if( wfReadOnly() ) {
 30+ $output->readOnlyPage();
 31+ return;
 32+ }
 33+ switch( $mode ) {
 34+ case self::EDIT_CLEAR:
 35+ $output->setPageTitle( wfMsg( 'watchlistedit-clear-title' ) );
 36+ if( $request->wasPosted() && $this->checkToken( $request, $user ) ) {
 37+ $this->clearWatchlist( $user );
 38+ $user->invalidateCache();
 39+ $output->addHtml( wfMsgExt( 'watchlistedit-clear-done', 'parse' ) );
 40+ } else {
 41+ $this->showClearForm( $output, $user );
 42+ }
 43+ break;
 44+ case self::EDIT_RAW:
 45+ $output->setPageTitle( wfMsg( 'watchlistedit-raw-title' ) );
 46+ if( $request->wasPosted() && $this->checkToken( $request, $user ) ) {
 47+ $titles = $this->extractTitles( $request->getText( 'titles' ) );
 48+ $this->clearWatchlist( $user );
 49+ $this->watchTitles( $titles, $user );
 50+ $user->invalidateCache();
 51+ $output->addHtml( wfMsgExt( 'watchlistedit-raw-done', 'parse' ) );
 52+ }
 53+ $this->showRawForm( $output, $user );
 54+ break;
 55+ case self::EDIT_NORMAL:
 56+ $output->setPageTitle( wfMsg( 'watchlistedit-normal-title' ) );
 57+ if( $request->wasPosted() && $this->checkToken( $request, $user ) ) {
 58+ $titles = $this->extractTitles( $request->getArray( 'titles' ) );
 59+ $this->unwatchTitles( $titles, $user );
 60+ $user->invalidateCache();
 61+ $output->addHtml( wfMsgExt( 'watchlistedit-normal-done', 'parse',
 62+ $GLOBALS['wgLang']->formatNum( count( $titles ) ) ) );
 63+ $this->showTitles( $titles, $output, $user->getSkin() );
 64+ }
 65+ $this->showNormalForm( $output, $user );
 66+ }
 67+ }
 68+
 69+ /**
 70+ * Check the edit token from a form submission
 71+ *
 72+ * @param WebRequest $request
 73+ * @param User $user
 74+ * @return bool
 75+ */
 76+ private function checkToken( $request, $user ) {
 77+ return $user->matchEditToken( $request->getVal( 'token' ), 'watchlistedit' );
 78+ }
 79+
 80+ /**
 81+ * Extract a list of titles from a text list; if we're given
 82+ * an array, convert each item into a Title
 83+ *
 84+ * @param mixed $list
 85+ * @return array
 86+ */
 87+ private function extractTitles( $list ) {
 88+ $titles = array();
 89+ if( !is_array( $list ) ) {
 90+ $list = explode( "\n", trim( $list ) );
 91+ if( !is_array( $list ) )
 92+ return array();
 93+ }
 94+ foreach( $list as $text ) {
 95+ $text = trim( $text );
 96+ if( strlen( $text ) > 0 ) {
 97+ $title = Title::newFromText( $text );
 98+ if( $title instanceof Title )
 99+ $titles[] = $title;
 100+ }
 101+ }
 102+ return $titles;
 103+ }
 104+
 105+ /**
 106+ * Print out a list of linked titles
 107+ *
 108+ * @param array $titles
 109+ * @param OutputPage $output
 110+ * @param Skin $skin
 111+ */
 112+ private function showTitles( $titles, $output, $skin ) {
 113+ $talk = htmlspecialchars( $GLOBALS['wgContLang']->getFormattedNsText( NS_TALK ) );
 114+ // Do a batch existence check
 115+ $batch = new LinkBatch();
 116+ foreach( $titles as $title ) {
 117+ $batch->addObj( $title );
 118+ $batch->addObj( $title->getTalkPage() );
 119+ }
 120+ $batch->execute();
 121+ // Print out the list
 122+ $output->addHtml( "<ul>\n" );
 123+ foreach( $titles as $title )
 124+ $output->addHtml( "<li>" . $skin->makeLinkObj( $title )
 125+ . ' (' . $skin->makeLinkObj( $title->getTalkPage(), $talk ) . ")</li>\n" );
 126+ $output->addHtml( "</ul>\n" );
 127+ }
 128+
 129+ /**
 130+ * Count the number of titles on a user's watchlist, excluding talk pages
 131+ *
 132+ * @param User $user
 133+ * @return int
 134+ */
 135+ private function countWatchlist( $user ) {
 136+ $dbr = wfGetDB( DB_SLAVE );
 137+ $res = $dbr->select( 'watchlist', 'COUNT(*) AS count', array( 'wl_user' => $user->getId() ), __METHOD__ );
 138+ $row = $dbr->fetchObject( $res );
 139+ return ceil( $row->count / 2 ); // Paranoia
 140+ }
 141+
 142+ /**
 143+ * Get a list of titles on a user's watchlist, excluding talk pages,
 144+ * and return as a two-dimensional array with namespace, title and
 145+ * redirect status
 146+ *
 147+ * @param User $user
 148+ * @return array
 149+ */
 150+ private function getWatchlist( $user ) {
 151+ $titles = array();
 152+ $dbr = wfGetDB( DB_SLAVE );
 153+ $uid = intval( $user->getId() );
 154+ list( $watchlist, $page ) = $dbr->tableNamesN( 'watchlist', 'page' );
 155+ $sql = "SELECT wl_namespace, wl_title, page_id, page_is_redirect
 156+ FROM {$watchlist} LEFT JOIN {$page} ON ( wl_namespace = page_namespace
 157+ AND wl_title = page_title ) WHERE wl_user = {$uid}";
 158+ $res = $dbr->query( $sql, __METHOD__ );
 159+ if( $res && $dbr->numRows( $res ) > 0 ) {
 160+ $cache = LinkCache::singleton();
 161+ while( $row = $dbr->fetchObject( $res ) ) {
 162+ $title = Title::makeTitleSafe( $row->wl_namespace, $row->wl_title );
 163+ if( $title instanceof Title ) {
 164+ // Update the link cache while we're at it
 165+ if( $row->page_id ) {
 166+ $cache->addGoodLinkObj( $row->page_id, $title );
 167+ } else {
 168+ $cache->addBadLinkObj( $title );
 169+ }
 170+ // Ignore non-talk
 171+ if( !$title->isTalkPage() )
 172+ $titles[$row->wl_namespace][$row->wl_title] = $row->page_is_redirect;
 173+ }
 174+ }
 175+ }
 176+ return $titles;
 177+ }
 178+
 179+ /**
 180+ * Show a message indicating the number of items on the user's watchlist,
 181+ * and return this count for additional checking
 182+ *
 183+ * @param OutputPage $output
 184+ * @param User $user
 185+ * @return int
 186+ */
 187+ private function showItemCount( $output, $user ) {
 188+ if( ( $count = $this->countWatchlist( $user ) ) > 0 ) {
 189+ $output->addHtml( wfMsgExt( 'watchlistedit-numitems', 'parse',
 190+ $GLOBALS['wgLang']->formatNum( $count ) ) );
 191+ } else {
 192+ $output->addHtml( wfMsgExt( 'watchlistedit-noitems', 'parse' ) );
 193+ }
 194+ return $count;
 195+ }
 196+
 197+ /**
 198+ * Remove all titles from a user's watchlist
 199+ *
 200+ * @param User $user
 201+ */
 202+ private function clearWatchlist( $user ) {
 203+ $dbw = wfGetDB( DB_MASTER );
 204+ $dbw->delete( 'watchlist', array( 'wl_user' => $user->getId() ), __METHOD__ );
 205+ }
 206+
 207+ /**
 208+ * Add a list of titles to a user's watchlist
 209+ *
 210+ * @param array $titles
 211+ * @param User $user
 212+ */
 213+ private function watchTitles( $titles, $user ) {
 214+ $dbw = wfGetDB( DB_MASTER );
 215+ $rows = array();
 216+ foreach( $titles as $title ) {
 217+ $rows[] = array(
 218+ 'wl_user' => $user->getId(),
 219+ 'wl_namespace' => ( $title->getNamespace() & ~1 ),
 220+ 'wl_title' => $title->getDBkey(),
 221+ 'wl_notificationtimestamp' => null,
 222+ );
 223+ $rows[] = array(
 224+ 'wl_user' => $user->getId(),
 225+ 'wl_namespace' => ( $title->getNamespace() | 1 ),
 226+ 'wl_title' => $title->getDBkey(),
 227+ 'wl_notificationtimestamp' => null,
 228+ );
 229+ }
 230+ $dbw->insert( 'watchlist', $rows, __METHOD__, 'IGNORE' );
 231+ }
 232+
 233+ /**
 234+ * Remove a list of titles from a user's watchlist
 235+ *
 236+ * @param array $titles
 237+ * @param User $user
 238+ */
 239+ private function unwatchTitles( $titles, $user ) {
 240+ $dbw = wfGetDB( DB_MASTER );
 241+ foreach( $titles as $title ) {
 242+ $dbw->delete(
 243+ 'watchlist',
 244+ array(
 245+ 'wl_user' => $user->getId(),
 246+ 'wl_namespace' => ( $title->getNamespace() & ~1 ),
 247+ 'wl_title' => $title->getDBkey(),
 248+ ),
 249+ __METHOD__
 250+ );
 251+ $dbw->delete(
 252+ 'watchlist',
 253+ array(
 254+ 'wl_user' => $user->getId(),
 255+ 'wl_namespace' => ( $title->getNamespace() | 1 ),
 256+ 'wl_title' => $title->getDBkey(),
 257+ ),
 258+ __METHOD__
 259+ );
 260+ }
 261+ }
 262+
 263+ /**
 264+ * Show a confirmation form for users wishing to clear their watchlist
 265+ *
 266+ * @param OutputPage $output
 267+ * @param User $user
 268+ */
 269+ private function showClearForm( $output, $user ) {
 270+ if( ( $count = $this->showItemCount( $output, $user ) ) > 0 ) {
 271+ $self = SpecialPage::getTitleFor( 'Watchlist' );
 272+ $form = Xml::openElement( 'form', array( 'method' => 'post',
 273+ 'action' => $self->getLocalUrl( 'action=clear' ) ) );
 274+ $form .= Xml::hidden( 'token', $user->editToken( 'watchlistedit' ) );
 275+ $form .= '<fieldset><legend>' . wfMsgHtml( 'watchlistedit-clear-legend' ) . '</legend>';
 276+ $form .= wfMsgExt( 'watchlistedit-clear-confirm', 'parse' );
 277+ $form .= '<p>' . Xml::submitButton( wfMsg( 'watchlistedit-clear-submit' ) ) . '</p>';
 278+ $form .= '</fieldset></form>';
 279+ $output->addHtml( $form );
 280+ }
 281+ }
 282+
 283+ /**
 284+ * Show the standard watchlist editing form
 285+ *
 286+ * @param OutputPage $output
 287+ * @param User $user
 288+ */
 289+ private function showNormalForm( $output, $user ) {
 290+ if( ( $count = $this->showItemCount( $output, $user ) ) > 0 ) {
 291+ $self = SpecialPage::getTitleFor( 'Watchlist' );
 292+ $form = Xml::openElement( 'form', array( 'method' => 'post',
 293+ 'action' => $self->getLocalUrl( 'action=edit' ) ) );
 294+ $form .= Xml::hidden( 'token', $user->editToken( 'watchlistedit' ) );
 295+ $form .= '<fieldset><legend>' . wfMsgHtml( 'watchlistedit-normal-legend' ) . '</legend>';
 296+ $form .= wfMsgExt( 'watchlistedit-normal-explain', 'parse' );
 297+ foreach( $this->getWatchlist( $user ) as $namespace => $pages ) {
 298+ $form .= '<h2>' . $this->getNamespaceHeading( $namespace ) . '</h2>';
 299+ $form .= '<ul>';
 300+ foreach( $pages as $dbkey => $redirect ) {
 301+ $title = Title::makeTitleSafe( $namespace, $dbkey );
 302+ $form .= $this->buildRemoveLine( $title, $redirect, $user->getSkin() );
 303+ }
 304+ $form .= '</ul>';
 305+ }
 306+ $form .= '<p>' . Xml::submitButton( wfMsg( 'watchlistedit-normal-submit' ) ) . '</p>';
 307+ $form .= '</fieldset></form>';
 308+ $output->addHtml( $form );
 309+ }
 310+ }
 311+
 312+ /**
 313+ * Get the correct "heading" for a namespace
 314+ *
 315+ * @param int $namespace
 316+ * @return string
 317+ */
 318+ private function getNamespaceHeading( $namespace ) {
 319+ return $namespace == NS_MAIN
 320+ ? wfMsgHtml( 'blanknamespace' )
 321+ : htmlspecialchars( $GLOBALS['wgContLang']->getFormattedNsText( $namespace ) );
 322+ }
 323+
 324+ /**
 325+ * Build a single list item containing a check box selecting a title
 326+ * and a link to that title, with various additional bits
 327+ *
 328+ * @param Title $title
 329+ * @param bool $redirect
 330+ * @param Skin $skin
 331+ * @return string
 332+ */
 333+ private function buildRemoveLine( $title, $redirect, $skin ) {
 334+ $link = $skin->makeLinkObj( $title );
 335+ if( $redirect )
 336+ $link = '<span class="watchlistredir">' . $link . '</span>';
 337+ $tools[] = $skin->makeLinkObj( $title->getTalkPage(),
 338+ htmlspecialchars( $GLOBALS['wgContLang']->getFormattedNsText( NS_TALK ) ) );
 339+ if( $title->exists() )
 340+ $tools[] = $skin->makeKnownLinkObj( $title, wfMsgHtml( 'history_short' ), 'action=history' );
 341+ return '<li>'
 342+ . Xml::check( 'titles[]', false, array( 'value' => $title->getPrefixedText() ) )
 343+ . $link . ' (' . implode( ' | ', $tools ) . ')' . '</li>';
 344+ }
 345+
 346+ /**
 347+ * Show a form for editing the watchlist in "raw" mode
 348+ *
 349+ * @param OutputPage $output
 350+ * @param User $user
 351+ */
 352+ public function showRawForm( $output, $user ) {
 353+ $this->showItemCount( $output, $user );
 354+ $self = SpecialPage::getTitleFor( 'Watchlist' );
 355+ $form = Xml::openElement( 'form', array( 'method' => 'post',
 356+ 'action' => $self->getLocalUrl( 'action=raw' ) ) );
 357+ $form .= Xml::hidden( 'token', $user->editToken( 'watchlistedit' ) );
 358+ $form .= '<fieldset><legend>' . wfMsgHtml( 'watchlistedit-raw-legend' ) . '</legend>';
 359+ $form .= wfMsgExt( 'watchlistedit-raw-explain', 'parse' );
 360+ $form .= Xml::label( wfMsg( 'watchlistedit-raw-titles' ), 'titles' );
 361+ $form .= Xml::openElement( 'textarea', array( 'id' => 'titles', 'name' => 'titles',
 362+ 'rows' => 6, 'cols' => 80 ) );
 363+ foreach( $this->getWatchlist( $user ) as $namespace => $pages ) {
 364+ foreach( $pages as $dbkey => $redirect ) {
 365+ $title = Title::makeTitleSafe( $namespace, $dbkey );
 366+ if( $title instanceof Title )
 367+ $form .= htmlspecialchars( $title->getPrefixedText() ) . "\n";
 368+ }
 369+ }
 370+ $form .= '</textarea>';
 371+ $form .= '<p>' . Xml::submitButton( wfMsg( 'watchlistedit-raw-submit' ) ) . '</p>';
 372+ $form .= '</fieldset></form>';
 373+ $output->addHtml( $form );
 374+ }
 375+
 376+ /**
 377+ * Determine whether we are editing the watchlist, and if so, what
 378+ * kind of editing operation
 379+ *
 380+ * @param WebRequest $request
 381+ * @param mixed $par
 382+ * @return int
 383+ */
 384+ public static function getMode( $request, $par ) {
 385+ $mode = strtolower( $request->getVal( 'action', $par ) );
 386+ switch( $mode ) {
 387+ case 'clear':
 388+ return self::EDIT_CLEAR;
 389+ case 'raw':
 390+ return self::EDIT_RAW;
 391+ case 'edit':
 392+ return self::EDIT_NORMAL;
 393+ default:
 394+ return false;
 395+ }
 396+ }
 397+
 398+}
Property changes on: branches/apiedit/phase3/includes/WatchlistEditor.php
___________________________________________________________________
Added: svn:eol-style
1399 + native
Index: branches/apiedit/phase3/includes/SpecialWatchlist.php
@@ -35,10 +35,17 @@
3636 $wgOut->setSubtitle( wfMsgWikiHtml( 'watchlistfor', htmlspecialchars( $wgUser->getName() ) ) );
3737 }
3838
39 - if( wlHandleClear( $wgOut, $wgRequest, $par ) ) {
 39+ if( ( $mode = WatchlistEditor::getMode( $wgRequest, $par ) ) !== false ) {
 40+ $editor = new WatchlistEditor();
 41+ $editor->execute( $wgUser, $wgOut, $wgRequest, $mode );
4042 return;
4143 }
4244
 45+ $uid = $wgUser->getId();
 46+ if( $wgEnotifWatchlist && $wgRequest->getVal( 'reset' ) && $wgRequest->wasPosted() ) {
 47+ $wgUser->clearAllNotifications( $uid );
 48+ }
 49+
4350 $defaults = array(
4451 /* float */ 'days' => floatval( $wgUser->getOption( 'watchlistdays' ) ), /* 3.0 or 0.5, watch further below */
4552 /* bool */ 'hideOwn' => (int)$wgUser->getBoolOption( 'watchlisthideown' ),
@@ -72,37 +79,6 @@
7380 $nameSpaceClause = '';
7481 }
7582
76 - # Watchlist editing
77 - $action = $wgRequest->getVal( 'action' );
78 - $remove = $wgRequest->getVal( 'remove' );
79 - $id = $wgRequest->getArray( 'id' );
80 -
81 - $uid = $wgUser->getID();
82 - if( $wgEnotifWatchlist && $wgRequest->getVal( 'reset' ) && $wgRequest->wasPosted() ) {
83 - $wgUser->clearAllNotifications( $uid );
84 - }
85 -
86 - # Deleting items from watchlist
87 - if(($action == 'submit') && isset($remove) && is_array($id)) {
88 - $wgOut->addWikiText( wfMsg( 'removingchecked' ) );
89 - $wgOut->addHTML( "<ul id=\"mw-unwatch-list\">\n" );
90 - foreach($id as $one) {
91 - $t = Title::newFromURL( $one );
92 - if( !is_null( $t ) ) {
93 - $wl = WatchedItem::fromUserTitle( $wgUser, $t );
94 - if( $wl->removeWatch() === false ) {
95 - $wgOut->addHTML( '<li class="mw-unwatch-failure">' . wfMsg( 'couldntremove', htmlspecialchars($one) ) . "</li>\n" );
96 - } else {
97 - wfRunHooks('UnwatchArticle', array(&$wgUser, new Article($t)));
98 - $wgOut->addHTML( '<li class="mw-unwatch-success">[[' . htmlspecialchars($one) . "]]</li>\n" );
99 - }
100 - } else {
101 - $wgOut->addHTML( '<li class="mw-unwatch-invalid">' . wfMsg( 'iteminvalidname', htmlspecialchars($one) ) . "</li>\n" );
102 - }
103 - }
104 - $wgOut->addHTML( "</ul>\n<p>" . wfMsg( 'wldone' ) . "</p>\n" );
105 - }
106 -
10783 $dbr = wfGetDB( DB_SLAVE, 'watchlist' );
10884 list( $page, $watchlist, $recentchanges ) = $dbr->tableNamesN( 'page', 'watchlist', 'recentchanges' );
10985
@@ -155,81 +131,6 @@
156132 $npages = 40000 * $days;
157133 }
158134
159 - /* Edit watchlist form */
160 - if($wgRequest->getBool('edit') || $par == 'edit' ) {
161 - $wgOut->addWikiText( wfMsgExt( 'watchlistcontains', array( 'parseinline' ), $wgLang->formatNum( $nitems ) ) .
162 - "\n\n" . wfMsg( 'watcheditlist' ) );
163 -
164 - $wgOut->addHTML( '<form action=\'' .
165 - $specialTitle->escapeLocalUrl( 'action=submit' ) .
166 - "' method='post'>\n" );
167 -
168 -# Patch A2
169 -# The following was proposed by KTurner 07.11.2004 to T.Gries
170 -# $sql = "SELECT distinct (wl_namespace & ~1),wl_title FROM $watchlist WHERE wl_user=$uid";
171 - $sql = "SELECT wl_namespace, wl_title, page_is_redirect FROM $watchlist LEFT JOIN $page ON wl_namespace = page_namespace AND wl_title = page_title WHERE wl_user=$uid";
172 -
173 - $res = $dbr->query( $sql, $fname );
174 -
175 - # Batch existence check
176 - $linkBatch = new LinkBatch();
177 - while( $row = $dbr->fetchObject( $res ) )
178 - $linkBatch->addObj( Title::makeTitleSafe( $row->wl_namespace, $row->wl_title ) );
179 - $linkBatch->execute();
180 -
181 - if( $dbr->numRows( $res ) > 0 )
182 - $dbr->dataSeek( $res, 0 ); # Let's do the time warp again!
183 -
184 - $sk = $wgUser->getSkin();
185 -
186 - $list = array();
187 - while( $s = $dbr->fetchObject( $res ) ) {
188 - $list[$s->wl_namespace][$s->wl_title] = $s->page_is_redirect;
189 - }
190 -
191 - // TODO: Display a TOC
192 - foreach($list as $ns => $titles) {
193 - if (Namespace::isTalk($ns))
194 - continue;
195 - if ($ns != NS_MAIN)
196 - $wgOut->addHTML( '<h2>' . $wgContLang->getFormattedNsText( $ns ) . '</h2>' );
197 - $wgOut->addHTML( '<ul>' );
198 - foreach( $titles as $title => $redir ) {
199 - $titleObj = Title::makeTitle( $ns, $title );
200 - if( is_null( $titleObj ) ) {
201 - $wgOut->addHTML(
202 - '<!-- bad title "' .
203 - htmlspecialchars( $s->wl_title ) . '" in namespace ' . $s->wl_namespace . " -->\n"
204 - );
205 - } else {
206 - global $wgContLang;
207 - $toolLinks = array();
208 - $pageLink = $sk->makeLinkObj( $titleObj );
209 - $toolLinks[] = $sk->makeLinkObj( $titleObj->getTalkPage(), $wgLang->getNsText( NS_TALK ) );
210 - if( $titleObj->exists() )
211 - $toolLinks[] = $sk->makeKnownLinkObj( $titleObj, wfMsgHtml( 'history_short' ), 'action=history' );
212 - $toolLinks = '(' . implode( ' | ', $toolLinks ) . ')';
213 - $checkbox = '<input type="checkbox" name="id[]" value="' . htmlspecialchars( $titleObj->getPrefixedText() ) . '" /> ' . ( $wgContLang->isRTL() ? '&rlm;' : '&lrm;' );
214 - if( $redir ) {
215 - $spanopen = '<span class="watchlistredir">';
216 - $spanclosed = '</span>';
217 - } else {
218 - $spanopen = $spanclosed = '';
219 - }
220 -
221 - $wgOut->addHTML( "<li>{$checkbox}{$spanopen}{$pageLink}{$spanclosed} {$toolLinks}</li>\n" );
222 - }
223 - }
224 - $wgOut->addHTML( '</ul>' );
225 - }
226 - $wgOut->addHTML(
227 - wfSubmitButton( wfMsg('removechecked'), array('name' => 'remove') ) .
228 - "\n</form>\n"
229 - );
230 -
231 - return;
232 - }
233 -
234135 # If the watchlist is relatively short, it's simplest to zip
235136 # down its entirety and then sort the results.
236137
@@ -463,54 +364,4 @@
464365 $count = floor( $count / 2 );
465366
466367 return( $count );
467 -}
468 -
469 -/**
470 - * Allow the user to clear their watchlist
471 - *
472 - * @param $out Output object
473 - * @param $request Request object
474 - * @param $par Parameters passed to the watchlist page
475 - * @return bool True if it's been taken care of; false indicates the watchlist
476 - * code needs to do something further
477 - */
478 -function wlHandleClear( &$out, &$request, $par ) {
479 - global $wgLang;
480 -
481 - # Check this function has something to do
482 - if( $request->getText( 'action' ) == 'clear' || $par == 'clear' ) {
483 - global $wgUser;
484 - $out->setPageTitle( wfMsgHtml( 'clearwatchlist' ) );
485 - $count = wlCountItems( $wgUser );
486 - if( $count > 0 ) {
487 - # See if we're clearing or confirming
488 - if( $request->wasPosted() && $wgUser->matchEditToken( $request->getText( 'token' ), 'clearwatchlist' ) ) {
489 - # Clearing, so do it and report the result
490 - $dbw = wfGetDB( DB_MASTER );
491 - $dbw->delete( 'watchlist', array( 'wl_user' => $wgUser->mId ), 'wlHandleClear' );
492 - $out->addWikiText( wfMsgExt( 'watchlistcleardone', array( 'parsemag', 'escape'), $wgLang->formatNum( $count ) ) );
493 - $out->returnToMain();
494 - } else {
495 - # Confirming, so show a form
496 - $wlTitle = SpecialPage::getTitleFor( 'Watchlist' );
497 - $out->addHTML( wfElement( 'form', array( 'method' => 'post', 'action' => $wlTitle->getLocalUrl( 'action=clear' ) ), NULL ) );
498 - $out->addWikiText( wfMsgExt( 'watchlistcount', array( 'parsemag', 'escape'), $wgLang->formatNum( $count ) ) );
499 - $out->addWikiText( wfMsg( 'watchlistcleartext' ) );
500 - $out->addHTML(
501 - wfHidden( 'token', $wgUser->editToken( 'clearwatchlist' ) ) .
502 - wfElement( 'input', array( 'type' => 'submit', 'name' => 'submit', 'value' => wfMsgHtml( 'watchlistclearbutton' ) ), '' ) .
503 - wfCloseElement( 'form' )
504 - );
505 - }
506 - return( true );
507 - } else {
508 - # Nothing on the watchlist; nothing to do here
509 - $out->addWikiText( wfMsg( 'nowatchlist' ) );
510 - $out->returnToMain();
511 - return( true );
512 - }
513 - } else {
514 - return( false );
515 - }
516 -}
517 -
 368+}
\ No newline at end of file
Index: branches/apiedit/phase3/RELEASE-NOTES
@@ -117,9 +117,11 @@
118118 * New javascript for upload page that will show a warning if a file with the
119119 "destination filename" already exists.
120120 * Add 'editsection-brackets' message to allow localization (or removal) of the
121 - brackets in the "[edit]" link for sections.
122 -* (bug 10437) Move texvc styling to shared.css.
123 -* (bug 10438) HTML TeX formulas should not wrap.
 121+ brackets in the "[edit]" link for sections
 122+* (bug 10437) Move texvc styling to shared.css
 123+* (bug 10438) HTML TeX formulas should not wrap
 124+* Introduce "raw editing" mode for the watchlist, to allow bulk additions,
 125+ removals, and convenient exporting of watchlist contents
124126
125127 == Bugfixes since 1.10 ==
126128
Index: branches/apiedit/phase3/languages/classes/LanguageKu.php
@@ -19,17 +19,18 @@
2020 'ڵ' => 'll', #ll
2121 'ڕ' => 'rr', #rr
2222 'ا' => 'a',
23 - # 'ئێ' => 'ê', # Anfangs-e
 23+ # 'ئێ' => 'ê', # initial e
2424 'ە' => 'e',
25 - 'ه‌' => 'e', # mit einem non-joiner
26 - 'ه‌‌' => 'e', # mit zwei non-joinern
 25+ 'ه‌' => 'e', # with one non-joiner
 26+ 'ه‌‌' => 'e', # with two non-joiner
2727 'ة' => 'e',
2828 'ێ' => 'ê',
2929 'ي' => 'î',
30 - 'ی' => 'î',
 30+ 'ی' => 'î', # U+06CC db 8c ARABIC LETTER FARSI YEH
 31+ 'ى' => 'î', # U+0649 d9 89 ARABIC LETTER ALEF MAKSURA
3132 'ۆ' => 'o',
3233 'و' => 'w',
33 - 'ئ' => '', # initiales hemze soll verschluckt werden
 34+ 'ئ' => '', # initial hemze should not be shown
3435 '،' => ',',
3536 'ع' => '\'', # ayn
3637 '؟' => '?',
Index: branches/apiedit/phase3/languages/messages/MessagesJa.php
@@ -395,6 +395,7 @@
396396 'yourvariant' => '字体変換',
397397 'yournick' => 'ニックネーム(署名用):',
398398 'badsig' => '署名が正しくありません。HTMLタグを見直してください。',
 399+'badsiglength' => '署名が長すぎます。$1文字以下である必要があります。',
399400 'email' => 'メールアドレス',
400401 'prefs-help-realname' => '* 本名 (任意): 本名を入力すると、ページ・クレジットに利用者名(アカウント名)の代わりに本名が表示されます。',
401402 'loginerror' => 'ログイン失敗',
@@ -488,10 +489,11 @@
489490 $1 または他の[[{{int:grouppage-sysop}}|{{int:group-sysop}}]]にこの件についてメールで問い合わせることができます。ただし、[[Special:Preferences|オプション]]に正しいメールアドレスが登録されていない場合、「{{int:emailuser}}」機能が使えないことに注意してください。
490491
491492 あなたのIPアドレスは「$3」、ブロックIDは &#x23;$5 です。問い合わせを行う際には、この情報を必ず書いてください。',
492 -'autoblockedtext' => 'ご利用のIPアドレスは $1 にとって投稿をブロックされています。その理由は次の通りです。
 493+'autoblockedtext' => 'ご利用のIPアドレスは $1 によって投稿をブロックされています。その理由は次の通りです。
493494 :$2
494495
495 -ブロック解除予定: $6
 496+ブロック解除予定: $6<br />
 497+ブロック対象: $7
496498
497499 $1 または他の[[{{int:grouppage-sysop}}|{{int:group-sysop}}]]にこの件について問い合わせることができます。
498500
@@ -568,7 +570,11 @@
569571 'edittools' => '<!-- ここに書いたテキストは編集及びアップロードのフォームの下に表示されます。 -->',
570572 'nocreatetitle' => 'ページを作成できません',
571573 'nocreatetext' => 'このサイトではページの新規作成を制限しています。元のページに戻って既存のページを編集するか、[[Special:Userlogin|ログイン]]してください。',
 574+'recreate-deleted-warn' => "'''注意: あなたは以前に削除されたページを再作成しようとしています。'''
572575
 576+本当に編集を続行してよいか確認してください。
 577+このページの削除記録は以下の通りです:",
 578+
573579 # "Undo" feature
574580 'undo-success' => '編集の取り消しに成功しました。保存ボタンを押すと変更が確定されます。',
575581 'undo-failure' => '中間の版での編集と競合したため、自動取り消しできませんでした。',
@@ -732,6 +738,7 @@
733739 'resultsperpage' => '1ページあたりの表示件数:',
734740 'contextlines' => '1件あたりの行数:',
735741 'contextchars' => '1行あたりの文字数:',
 742+'stub-threshold' => '<a href="#" class="stub">スタブリンク</a>として表示するしきい値:',
736743 'recentchangesdays' => '最近更新したページの表示日数:',
737744 'recentchangescount' => '最近更新したページの表示件数:',
738745 'savedprefs' => 'オプションを保存しました',
@@ -839,7 +846,7 @@
840847 'uploadedfiles' => 'アップロードされたファイル',
841848 'ignorewarning' => '警告を無視し、保存してしまう',
842849 'ignorewarnings' => '警告を無視',
843 -'minlength' => 'ファイル名は3文字以上である必要があります。',
 850+'minlength1' => 'ファイル名は1文字以上である必要があります。',
844851 'illegalfilename' => 'ファイル名 "$1" にページ・タイトルとして使えない文字が含まれています。ファイル名を変更してからもう一度アップロードしてください。',
845852 'badfilename' => 'ファイル名は "$1" へ変更されました。',
846853 'filetype-badmime' => 'MIME タイプ "$1" のファイルのアップロードは許可されていません。',
@@ -1002,6 +1009,7 @@
10031010 'uncategorizedpages' => 'カテゴリ未導入のページ',
10041011 'uncategorizedcategories' => 'カテゴリ未導入のカテゴリ',
10051012 'uncategorizedimages' => 'カテゴリ未導入の画像',
 1013+'uncategorizedtemplates' => 'カテゴリ未導入のテンプレート',
10061014 'unusedcategories' => '使われていないカテゴリ',
10071015 'unusedimages' => '使われていない画像',
10081016 'popularpages' => '人気のページ',
@@ -1009,6 +1017,7 @@
10101018 'wantedpages' => '投稿が望まれているページ',
10111019 'mostlinked' => '被リンクの多いページ',
10121020 'mostlinkedcategories' => '項目の多いカテゴリ',
 1021+'mostlinkedtemplates' => '使用箇所の多いテンプレート',
10131022 'mostcategories' => 'カテゴリの多い項目',
10141023 'mostimages' => 'リンクの多い画像',
10151024 'mostrevisions' => '版の多い項目',
@@ -1054,6 +1063,7 @@
10551064 'specialloguserlabel' => '利用者名:',
10561065 'speciallogtitlelabel' => 'タイトル:',
10571066 'log' => 'ログ',
 1067+'all-logs-page' => '全てのログ',
10581068 'log-search-legend' => 'ログの検索',
10591069 'log-search-submit' => '検索',
10601070 'alllogstext' => 'アップロード、削除、保護、投稿ブロック、権限変更のログがまとめて表示されています。ログの種類、実行した利用者、影響を受けたページ(利用者)による絞り込みができます。',
@@ -1072,6 +1082,7 @@
10731083 'allpagessubmit' => '表示',
10741084 'allpagesprefix' => '次の文字列から始まるページを表示:',
10751085 'allpagesbadtitle' => '指定したタイトルは無効か、正しくない inter-language または inter-wiki のタイトルです。ページタイトルに使用できない文字が含まれている可能性があります。',
 1086+'allpages-bad-ns' => '{{SITENAME}}に "$1" という名前空間はありません。',
10761087
10771088 # Special:Listusers
10781089 'listusersfrom' => 'この文字から表示:',
@@ -1159,6 +1170,7 @@
11601171 'enotif_mailer' => '{{SITENAME}} 通知メール',
11611172 'enotif_reset' => 'すべてのページを訪問済みにする',
11621173 'enotif_newpagetext' => '(新規ページ)',
 1174+'enotif_impersonal_salutation' => '{{SITENAME}} 利用者',
11631175 'changed' => '変更',
11641176 'created' => '作成',
11651177 'enotif_subject' => '{{SITENAME}} のページ "$PAGETITLE" が $PAGEEDITOR によって$CHANGEDORCREATEDされました',
@@ -1168,6 +1180,7 @@
11691181 'enotif_lastdiff' => '
11701182 変更内容を見るには以下のURLにアクセスしてください:
11711183 $1',
 1184+'enotif_anon_editor' => '匿名利用者 $1',
11721185 'enotif_body' => 'Dear $WATCHINGUSERNAME,
11731186
11741187 {{SITENAME}}のページ $PAGETITLE が $PAGEEDITDATE に
@@ -1227,8 +1240,9 @@
12281241 'sessionfailure' => 'あなたのログイン・セッションに問題が発生しました。この動作はセッションハイジャックを防ぐために取り消されました。ブラウザの「戻る」を押してからページを再読込し、もう一度送信してください。',
12291242 'protectlogpage' => '保護記録',
12301243 'protectlogtext' => '以下はページの保護・保護解除の一覧です。',
1231 -'protectedarticle' => '"$1" を保護しました。',
1232 -'unprotectedarticle' => '"$1" の保護を解除しました。',
 1244+'protectedarticle' => '"[[$1]]" を保護しました。',
 1245+'modifiedarticleprotection' => '"[[$1]]" の保護レベルを変更しました。',
 1246+'unprotectedarticle' => '"[[$1]]" の保護を解除しました。',
12331247 'protectsub' => '"$1" の保護',
12341248 'confirmprotect' => '保護の確認',
12351249 'protectcomment' => '保護・保護解除の理由',
@@ -1308,6 +1322,8 @@
13091323 'ucnote' => '利用者 <b>$1</b> によるここ <b>$2</b> 日間の編集です。',
13101324 'uclinks' => '過去 $2 日間の $1 編集',
13111325 'uctop' => '(最新)',
 1326+'month' => '月:',
 1327+'year' => '年:',
13121328
13131329 'sp-contributions-newest' => '最新',
13141330 'sp-contributions-oldest' => '最古',
@@ -1334,6 +1350,7 @@
13351351 'istemplate' => 'テンプレート呼出',
13361352 'whatlinkshere-prev' => '前 $1',
13371353 'whatlinkshere-next' => '次 $1',
 1354+'whatlinkshere-links'=> '← リンク',
13381355
13391356 # Block/unblock
13401357 'blockip' => '投稿ブロック',
@@ -1354,6 +1371,7 @@
13551372 ** 不適切な利用者名',
13561373 'ipbanononly' => '匿名利用者のみブロック',
13571374 'ipbcreateaccount' => 'アカウント作成をブロック',
 1375+'ipbemailban' => 'メール送信をブロック',
13581376 'ipbenableautoblock' => 'この利用者が最後に使用したIPアドレスを自動的にブロック(ブロック後に使用したIPアドレスも含む)',
13591377 'ipbsubmit' => '投稿ブロックする',
13601378 'ipbother' => '期間 (その他のとき)',
@@ -1383,6 +1401,7 @@
13841402 'anononlyblock' => '匿名のみ',
13851403 'noautoblockblock' => '自動ブロックなし',
13861404 'createaccountblock' => 'アカウント作成のブロック',
 1405+'emailblock' => 'メール送信のブロック',
13871406 'ipblocklist-empty' => '{{int:ipblocklist}}はありません。',
13881407 'ipblocklist-no-results' => '指定されたIPアドレスまたは利用者名はブロックされていません。',
13891408 'blocklink' => 'ブロック',
@@ -1396,6 +1415,7 @@
13971416 'block-log-flags-anononly' => '匿名のみ',
13981417 'block-log-flags-nocreate' => 'アカウント作成のブロック',
13991418 'block-log-flags-noautoblock' => '自動ブロック無効',
 1419+'block-log-flags-noemail' => 'メール送信のブロック',
14001420 'range_block_disabled' => '広域ブロックは無効に設定されています。',
14011421 'ipb_expiry_invalid' => '不正な期間です。',
14021422 'ipb_already_blocked' => '"$1" は既にブロックされています。',
@@ -1449,7 +1469,7 @@
14501470 'move-watch' => '移動するページをウォッチ',
14511471 'movepagebtn' => 'ページを移動',
14521472 'pagemovedsub' => '無事移動しました。',
1453 -'pagemovedtext' => 'ページ "[[$1]]" は "[[$2]]" に移動しました。',
 1473+'movepage-moved' => 'ページ "$1" は "$2" に移動されました。',
14541474 'articleexists' => '指定された移動先には既にページが存在するか、名前が不適切です。',
14551475 'talkexists' => 'ページ自身は移動されましたが、付随のノートページは移動先のページが存在したため移動できませんでした。手動で内容を統合してください。',
14561476 'movedto' => '移動先:',
@@ -1978,6 +1998,7 @@
19791999 'watchlistall1' => 'すべて',
19802000 'watchlistall2' => 'すべて',
19812001 'namespacesall' => 'すべて',
 2002+'monthsall' => 'すべて',
19822003
19832004 # E-mail address confirmation
19842005 'confirmemail' => 'メールアドレスの確認',
@@ -2065,8 +2086,6 @@
20662087 'articletitles' => "''$1'' からはじまる項目",
20672088 'hideresults' => '結果を隠す',
20682089
2069 -# DISPLAYTITLE
2070 -'displaytitle' => '(このページへリンクするには [[$1]] を使用)',
20712090
20722091 'loginlanguagelabel' => '言語: $1',
20732092
@@ -2074,6 +2093,7 @@
20752094 'imgmultipageprev' => '&larr; 前ページ',
20762095 'imgmultipagenext' => '次ページ &rarr;',
20772096 'imgmultigo' => '表示',
 2097+'imgmultigotopre' => '',
20782098 'imgmultigotopost' => 'ページ目を',
20792099 'imgmultiparseerror' => '画像ファイルが壊れているか正しくないため、ページのリストを生成できませんでした。',
20802100
@@ -2115,3 +2135,4 @@
21162136 );
21172137
21182138
 2139+
Index: branches/apiedit/phase3/languages/messages/MessagesDe.php
@@ -1308,10 +1308,6 @@
13091309 'nowatchlist' => 'Sie haben keine Einträge auf Ihrer Beobachtungsliste.',
13101310 'watchlistanontext' => 'Sie müssen sich $1, um Ihre Beobachtungsliste zu sehen oder Einträge auf ihr zu bearbeiten.',
13111311 'watchlistcount' => "'''Sie haben $1 {{PLURAL:$1|Eintrag|Einträge}} auf Ihrer Beobachtungsliste (inkl. Diskussionsseiten).'''",
1312 -'clearwatchlist' => 'Beobachtungsliste löschen',
1313 -'watchlistcleartext' => 'Sind Sie sicher, dass Sie diese vollständig löschen wollen?',
1314 -'watchlistclearbutton' => 'Beobachtungsliste löschen',
1315 -'watchlistcleardone' => 'Ihre Beobachtungsliste wurde gelöscht. {{PLURAL:$1|Ein Eintrag wurde|$1 Einträge wurden}} entfernt.',
13161312 'watchnologin' => 'Sie sind nicht angemeldet',
13171313 'watchnologintext' => 'Sie müssen [[Special:Userlogin|angemeldet]]
13181314 sein, um Ihre Beobachtungsliste zu bearbeiten.',
@@ -1335,11 +1331,7 @@
13361332 'wlheader-showupdated' => "Seiten mit noch nicht gesehenen Änderungen werden '''fett''' dargestellt.<br />",
13371333 'watchmethod-recent' => 'Überprüfen der letzten Bearbeitungen für die Beobachtungsliste',
13381334 'watchmethod-list' => 'Überprüfen der Beobachtungsliste nach letzten Bearbeitungen',
1339 -'removechecked' => 'Markierte Einträge löschen',
13401335 'watchlistcontains' => 'Ihre Beobachtungsliste enthält $1 {{PLURAL:$1|Seite|Seiten}}.',
1341 -'watcheditlist' => 'Dies ist eine alphabetische und nach Namensräumen gruppierte Liste aller von Ihnen beobachteten Seiten. Wenn Sie Einträge von der Beobachtungsliste wieder entfernen möchten, markieren Sie diese und klicken auf die Schaltfläche „Markierte Einträge löschen“ am Ende dieser Seite.',
1342 -'removingchecked' => 'Die ausgewählten Einträge werden aus der Beobachtungsliste entfernt...',
1343 -'couldntremove' => 'Der Eintrag „$1“ kann nicht gelöscht werden.',
13441336 'iteminvalidname' => 'Problem mit dem Eintrag „$1“, ungültiger Name.',
13451337 'wlnote' => "Es {{PLURAL:$1|folgt die letzte Änderung|folgen die letzten '''$1''' Änderungen}} der letzten {{PLURAL:$2|Stunde|'''$2''' Stunden}}.",
13461338 'wlshowlast' => 'Zeige die Änderungen der letzten $1 Stunden, $2 Tage oder $3 (in den letzten 30 Tagen).',
@@ -1350,7 +1342,6 @@
13511343 'watchlist-hide-own' => 'eigene Änderungen ausblenden',
13521344 'watchlist-show-minor' => 'kleine Änderungen einblenden',
13531345 'watchlist-hide-minor' => 'kleine Änderungen ausblenden',
1354 -'wldone' => 'Erfolgreich ausgeführt.',
13551346
13561347 # Displayed when you click the "watch" button and it's in the process of watching
13571348 'watching' => 'Beobachten …',
@@ -2293,4 +2284,29 @@
22942285 'lag-warn-normal' => 'Bearbeitungen der letzten $1 Sekunden werden in dieser Liste noch nicht angezeigt.',
22952286 'lag-warn-high' => 'Auf Grund hoher Datenbankauslastung werden die Bearbeitungen der letzten $1 Sekunden in dieser Liste noch nicht angezeigt.',
22962287
 2288+# Watchlist editor
 2289+'watchlistedit-numitems' => 'Ihre Beobachtungsliste enthält {{PLURAL:$1|1 Eintrag |$1 Einträge}}, Diskussionsseiten werden nicht gezählt.',
 2290+'watchlistedit-noitems' => 'Ihre Beobachtungsliste ist leer.',
 2291+'watchlistedit-clear-title' => 'Beobachtungsliste löschen',
 2292+'watchlistedit-clear-legend' => 'Beobachtungsliste löschen',
 2293+'watchlistedit-clear-confirm' => 'Hiermit löschen Sie alle Einträge von Ihrer Beobachtungsliste. Sind Sie sicher?
 2294+ Sie können die Beobachtungsliste auch [[Special:Watchlist/edit|im Listenformat bearbeiten]], um einzelne Bereiche individuell zu entfernen.',
 2295+'watchlistedit-clear-submit' => 'Beobachtungsliste löschen',
 2296+'watchlistedit-clear-done' => 'Ihre Beobachtungsliste wurde gelöscht. Alle Einträge wurden entfernt.',
 2297+'watchlistedit-normal-title' => 'Beobachtungsliste bearbeiten',
 2298+'watchlistedit-normal-legend' => 'Einträge von der Beobachtungsliste entfernen',
 2299+'watchlistedit-normal-explain' => 'Dies sind die Einträge Ihrer Beobachtungsliste. Um Einträge zu entfernen, markieren Sie die Kästchen neben den Einträgen
 2300+ und klicken Sie auf „Einträge entfernen“. Sie können Ihre Beobachtungsliste auch im [[Special:Watchlist/raw|Listenformat bearbeiten]]
 2301+ oder sie [[Special:Watchlist/clear|komplett löschen]].',
 2302+'watchlistedit-normal-submit' => 'Einträge entfernen',
 2303+'watchlistedit-normal-done' => '{{PLURAL:$1|1 Eintrag wurde|$1 Einträge wurden}} von Ihrer Beobachtungsliste entfernt:',
 2304+'watchlistedit-raw-title' => 'Beobachtungsliste im Listenformat bearbeiten',
 2305+'watchlistedit-raw-legend' => 'Beobachtungsliste im Listenformat bearbeiten',
 2306+'watchlistedit-raw-explain' => 'Dies sind die Einträge Ihrer Beobachtungsliste im Listenformat. Die Einträge können zeilenweise gelöscht oder hinzugefügt werden.
 2307+ Pro Zeile ist ein Eintrag erlaubt. Wenn Sie fertig sind, klicken Sie auf „Beobachtungsliste speichern“.
 2308+ Sie können auch die [[Special:Watchlist/edit|Standard-Bearbeitungsseite]] benutzen.',
 2309+'watchlistedit-raw-titles' => 'Einträge:',
 2310+'watchlistedit-raw-submit' => 'Beobachtungsliste speichern',
 2311+'watchlistedit-raw-done' => 'Ihre Beobachtungsliste wurde gespeichert.',
 2312+
22972313 );
Index: branches/apiedit/phase3/languages/messages/MessagesEn.php
@@ -1692,10 +1692,6 @@
16931693 'nowatchlist' => 'You have no items on your watchlist.',
16941694 'watchlistanontext' => 'Please $1 to view or edit items on your watchlist.',
16951695 'watchlistcount' => "'''You have {{PLURAL:$1|$1 item|$1 items}} on your watchlist, including talk pages.'''",
1696 -'clearwatchlist' => 'Clear watchlist',
1697 -'watchlistcleartext' => 'Are you sure you wish to remove them?',
1698 -'watchlistclearbutton' => 'Clear watchlist',
1699 -'watchlistcleardone' => 'Your watchlist has been cleared. {{PLURAL:$1|$1 item was|$1 items were}} removed.',
17001696 'watchnologin' => 'Not logged in',
17011697 'watchnologintext' => 'You must be [[Special:Userlogin|logged in]] to modify your watchlist.',
17021698 'addedwatch' => 'Added to watchlist',
@@ -1720,13 +1716,7 @@
17211717 'wlheader-showupdated' => "* Pages which have been changed since you last visited them are shown in '''bold'''",
17221718 'watchmethod-recent' => 'checking recent edits for watched pages',
17231719 'watchmethod-list' => 'checking watched pages for recent edits',
1724 -'removechecked' => 'Remove checked items from watchlist',
17251720 'watchlistcontains' => 'Your watchlist contains $1 {{PLURAL:$1|page|pages}}.',
1726 -'watcheditlist' => "Here's an alphabetical list of your
1727 -watched content pages. Check the boxes of pages you want to remove from your watchlist and click the 'remove checked' button
1728 -at the bottom of the screen (deleting a content page also deletes the accompanying talk page and vice versa).",
1729 -'removingchecked' => 'Removing requested items from watchlist...',
1730 -'couldntremove' => "Couldn't remove item '$1'...",
17311721 'iteminvalidname' => "Problem with item '$1', invalid name...",
17321722 'wlnote' => "Below {{PLURAL:$1|is the last change|are the last '''$1''' changes}} in the last {{PLURAL:$2|hour|'''$2''' hours}}.",
17331723 'wlshowlast' => 'Show last $1 hours $2 days $3',
@@ -1737,7 +1727,6 @@
17381728 'watchlist-hide-own' => 'Hide my edits',
17391729 'watchlist-show-minor' => 'Show minor edits',
17401730 'watchlist-hide-minor' => 'Hide minor edits',
1741 -'wldone' => 'Done.',
17421731
17431732 # Displayed when you click the "watch" button and it's in the process of watching
17441733 'watching' => 'Watching...',
@@ -2896,4 +2885,29 @@
28972886 'lag-warn-normal' => 'Changes newer than $1 seconds may not be shown in this list.',
28982887 'lag-warn-high' => 'Due to high database server lag, changes newer than $1 seconds may not be shown in this list.',
28992888
2900 -);
 2889+# Watchlist editor
 2890+'watchlistedit-numitems' => 'Your watchlist contains {{PLURAL:$1|1 title|$1 titles}}, excluding talk pages.',
 2891+'watchlistedit-noitems' => 'Your watchlist contains no titles.',
 2892+'watchlistedit-clear-title' => 'Clear watchlist',
 2893+'watchlistedit-clear-legend' => 'Clear watchlist',
 2894+'watchlistedit-clear-confirm' => 'This will remove all titles from your watchlist. Are you sure you
 2895+ want to do this? You can also [[Special:Watchlist/edit|remove individual titles]].',
 2896+'watchlistedit-clear-submit' => 'Clear',
 2897+'watchlistedit-clear-done' => 'Your watchlist has been cleared. All titles were removed.',
 2898+'watchlistedit-normal-title' => 'Edit watchlist',
 2899+'watchlistedit-normal-legend' => 'Remove titles from watchlist',
 2900+'watchlistedit-normal-explain' => 'Titles on your watchlist are shown below. To remove a title, check
 2901+ the box next to it, and click Remove Titles. You can also [[Special:Watchlist/raw|edit the raw list]],
 2902+ or [[Special:Watchlist/clear|remove all titles]].',
 2903+'watchlistedit-normal-submit' => 'Remove Titles',
 2904+'watchlistedit-normal-done' => '{{PLURAL:$1|1 title was|$1 titles were}} removed from your watchlist:',
 2905+'watchlistedit-raw-title' => 'Edit raw watchlist',
 2906+'watchlistedit-raw-legend' => 'Edit raw watchlist',
 2907+'watchlistedit-raw-explain' => 'Titles on your watchlist are shown below, and can be edited by
 2908+ adding to and removing from the list; one title per line. When finished, click Update Watchlist.
 2909+ You can also [[Special:Watchlist/edit|use the standard editor]].',
 2910+'watchlistedit-raw-titles' => 'Titles:',
 2911+'watchlistedit-raw-submit' => 'Update Watchlist',
 2912+'watchlistedit-raw-done' => 'Your watchlist has been updated.',
 2913+
 2914+);
\ No newline at end of file
Property changes on: branches/apiedit/phase3
___________________________________________________________________
Modified: svnmerge-integrated
29012915 - /trunk/phase3:1-23668
29022916 + /trunk/phase3:1-23698

Status & tagging log