Index: branches/apiedit/phase3/maintenance/language/messages.inc |
— | — | @@ -1080,10 +1080,6 @@ |
1081 | 1081 | 'nowatchlist', |
1082 | 1082 | 'watchlistanontext', |
1083 | 1083 | 'watchlistcount', |
1084 | | - 'clearwatchlist', |
1085 | | - 'watchlistcleartext', |
1086 | | - 'watchlistclearbutton', |
1087 | | - 'watchlistcleardone', |
1088 | 1084 | 'watchnologin', |
1089 | 1085 | 'watchnologintext', |
1090 | 1086 | 'addedwatch', |
— | — | @@ -1101,11 +1097,7 @@ |
1102 | 1098 | 'wlheader-showupdated', |
1103 | 1099 | 'watchmethod-recent', |
1104 | 1100 | 'watchmethod-list', |
1105 | | - 'removechecked', |
1106 | 1101 | 'watchlistcontains', |
1107 | | - 'watcheditlist', |
1108 | | - 'removingchecked', |
1109 | | - 'couldntremove', |
1110 | 1102 | 'iteminvalidname', |
1111 | 1103 | 'wlnote', |
1112 | 1104 | 'wlshowlast', |
— | — | @@ -1116,7 +1108,6 @@ |
1117 | 1109 | 'watchlist-hide-own', |
1118 | 1110 | 'watchlist-show-minor', |
1119 | 1111 | 'watchlist-hide-minor', |
1120 | | - 'wldone', |
1121 | 1112 | ), |
1122 | 1113 | 'watching' => array( |
1123 | 1114 | 'watching', |
— | — | @@ -2131,6 +2122,26 @@ |
2132 | 2123 | 'lag-warn-normal', |
2133 | 2124 | 'lag-warn-high', |
2134 | 2125 | ), |
| 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 | + ), |
2135 | 2146 | ); |
2136 | 2147 | /** Comments for each block */ |
2137 | 2148 | $wgBlockComments = array( |
— | — | @@ -2297,6 +2308,7 @@ |
2298 | 2309 | 'sizeunits' => 'Size units', |
2299 | 2310 | 'livepreview' => 'Live preview', |
2300 | 2311 | 'lagwarning' => 'Friendlier slave lag warnings', |
| 2312 | + 'watchlisteditor' => 'Watchlist editor', |
2301 | 2313 | ); |
2302 | 2314 | |
2303 | 2315 | /** Short comments for standalone messages */ |
Index: branches/apiedit/phase3/includes/AutoLoader.php |
— | — | @@ -252,6 +252,7 @@ |
253 | 253 | 'ZhClient' => 'includes/ZhClient.php', |
254 | 254 | 'memcached' => 'includes/memcached-client.php', |
255 | 255 | 'EmaillingJob' => 'includes/JobQueue.php', |
| 256 | + 'WatchlistEditor' => 'includes/WatchlistEditor.php', |
256 | 257 | |
257 | 258 | # filerepo |
258 | 259 | '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 |
1 | 399 | + native |
Index: branches/apiedit/phase3/includes/SpecialWatchlist.php |
— | — | @@ -35,10 +35,17 @@ |
36 | 36 | $wgOut->setSubtitle( wfMsgWikiHtml( 'watchlistfor', htmlspecialchars( $wgUser->getName() ) ) ); |
37 | 37 | } |
38 | 38 | |
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 ); |
40 | 42 | return; |
41 | 43 | } |
42 | 44 | |
| 45 | + $uid = $wgUser->getId(); |
| 46 | + if( $wgEnotifWatchlist && $wgRequest->getVal( 'reset' ) && $wgRequest->wasPosted() ) { |
| 47 | + $wgUser->clearAllNotifications( $uid ); |
| 48 | + } |
| 49 | + |
43 | 50 | $defaults = array( |
44 | 51 | /* float */ 'days' => floatval( $wgUser->getOption( 'watchlistdays' ) ), /* 3.0 or 0.5, watch further below */ |
45 | 52 | /* bool */ 'hideOwn' => (int)$wgUser->getBoolOption( 'watchlisthideown' ), |
— | — | @@ -72,37 +79,6 @@ |
73 | 80 | $nameSpaceClause = ''; |
74 | 81 | } |
75 | 82 | |
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 | | - |
107 | 83 | $dbr = wfGetDB( DB_SLAVE, 'watchlist' ); |
108 | 84 | list( $page, $watchlist, $recentchanges ) = $dbr->tableNamesN( 'page', 'watchlist', 'recentchanges' ); |
109 | 85 | |
— | — | @@ -155,81 +131,6 @@ |
156 | 132 | $npages = 40000 * $days; |
157 | 133 | } |
158 | 134 | |
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() ? '‏' : '‎' ); |
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 | | - |
234 | 135 | # If the watchlist is relatively short, it's simplest to zip |
235 | 136 | # down its entirety and then sort the results. |
236 | 137 | |
— | — | @@ -463,54 +364,4 @@ |
464 | 365 | $count = floor( $count / 2 ); |
465 | 366 | |
466 | 367 | 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 @@ |
118 | 118 | * New javascript for upload page that will show a warning if a file with the |
119 | 119 | "destination filename" already exists. |
120 | 120 | * 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 |
124 | 126 | |
125 | 127 | == Bugfixes since 1.10 == |
126 | 128 | |
Index: branches/apiedit/phase3/languages/classes/LanguageKu.php |
— | — | @@ -19,17 +19,18 @@ |
20 | 20 | 'ڵ' => 'll', #ll |
21 | 21 | 'ڕ' => 'rr', #rr |
22 | 22 | 'ا' => 'a', |
23 | | - # 'ئێ' => 'ê', # Anfangs-e |
| 23 | + # 'ئێ' => 'ê', # initial e |
24 | 24 | 'ە' => '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 |
27 | 27 | 'ة' => 'e', |
28 | 28 | 'ێ' => 'ê', |
29 | 29 | 'ي' => 'î', |
30 | | - 'ی' => 'î', |
| 30 | + 'ی' => 'î', # U+06CC db 8c ARABIC LETTER FARSI YEH |
| 31 | + 'ى' => 'î', # U+0649 d9 89 ARABIC LETTER ALEF MAKSURA |
31 | 32 | 'ۆ' => 'o', |
32 | 33 | 'و' => 'w', |
33 | | - 'ئ' => '', # initiales hemze soll verschluckt werden |
| 34 | + 'ئ' => '', # initial hemze should not be shown |
34 | 35 | '،' => ',', |
35 | 36 | 'ع' => '\'', # ayn |
36 | 37 | '؟' => '?', |
Index: branches/apiedit/phase3/languages/messages/MessagesJa.php |
— | — | @@ -395,6 +395,7 @@ |
396 | 396 | 'yourvariant' => '字体変換', |
397 | 397 | 'yournick' => 'ニックネーム(署名用):', |
398 | 398 | 'badsig' => '署名が正しくありません。HTMLタグを見直してください。', |
| 399 | +'badsiglength' => '署名が長すぎます。$1文字以下である必要があります。', |
399 | 400 | 'email' => 'メールアドレス', |
400 | 401 | 'prefs-help-realname' => '* 本名 (任意): 本名を入力すると、ページ・クレジットに利用者名(アカウント名)の代わりに本名が表示されます。', |
401 | 402 | 'loginerror' => 'ログイン失敗', |
— | — | @@ -488,10 +489,11 @@ |
489 | 490 | $1 または他の[[{{int:grouppage-sysop}}|{{int:group-sysop}}]]にこの件についてメールで問い合わせることができます。ただし、[[Special:Preferences|オプション]]に正しいメールアドレスが登録されていない場合、「{{int:emailuser}}」機能が使えないことに注意してください。 |
490 | 491 | |
491 | 492 | あなたのIPアドレスは「$3」、ブロックIDは #$5 です。問い合わせを行う際には、この情報を必ず書いてください。', |
492 | | -'autoblockedtext' => 'ご利用のIPアドレスは $1 にとって投稿をブロックされています。その理由は次の通りです。 |
| 493 | +'autoblockedtext' => 'ご利用のIPアドレスは $1 によって投稿をブロックされています。その理由は次の通りです。 |
493 | 494 | :$2 |
494 | 495 | |
495 | | -ブロック解除予定: $6 |
| 496 | +ブロック解除予定: $6<br /> |
| 497 | +ブロック対象: $7 |
496 | 498 | |
497 | 499 | $1 または他の[[{{int:grouppage-sysop}}|{{int:group-sysop}}]]にこの件について問い合わせることができます。 |
498 | 500 | |
— | — | @@ -568,7 +570,11 @@ |
569 | 571 | 'edittools' => '<!-- ここに書いたテキストは編集及びアップロードのフォームの下に表示されます。 -->', |
570 | 572 | 'nocreatetitle' => 'ページを作成できません', |
571 | 573 | 'nocreatetext' => 'このサイトではページの新規作成を制限しています。元のページに戻って既存のページを編集するか、[[Special:Userlogin|ログイン]]してください。', |
| 574 | +'recreate-deleted-warn' => "'''注意: あなたは以前に削除されたページを再作成しようとしています。''' |
572 | 575 | |
| 576 | +本当に編集を続行してよいか確認してください。 |
| 577 | +このページの削除記録は以下の通りです:", |
| 578 | + |
573 | 579 | # "Undo" feature |
574 | 580 | 'undo-success' => '編集の取り消しに成功しました。保存ボタンを押すと変更が確定されます。', |
575 | 581 | 'undo-failure' => '中間の版での編集と競合したため、自動取り消しできませんでした。', |
— | — | @@ -732,6 +738,7 @@ |
733 | 739 | 'resultsperpage' => '1ページあたりの表示件数:', |
734 | 740 | 'contextlines' => '1件あたりの行数:', |
735 | 741 | 'contextchars' => '1行あたりの文字数:', |
| 742 | +'stub-threshold' => '<a href="#" class="stub">スタブリンク</a>として表示するしきい値:', |
736 | 743 | 'recentchangesdays' => '最近更新したページの表示日数:', |
737 | 744 | 'recentchangescount' => '最近更新したページの表示件数:', |
738 | 745 | 'savedprefs' => 'オプションを保存しました', |
— | — | @@ -839,7 +846,7 @@ |
840 | 847 | 'uploadedfiles' => 'アップロードされたファイル', |
841 | 848 | 'ignorewarning' => '警告を無視し、保存してしまう', |
842 | 849 | 'ignorewarnings' => '警告を無視', |
843 | | -'minlength' => 'ファイル名は3文字以上である必要があります。', |
| 850 | +'minlength1' => 'ファイル名は1文字以上である必要があります。', |
844 | 851 | 'illegalfilename' => 'ファイル名 "$1" にページ・タイトルとして使えない文字が含まれています。ファイル名を変更してからもう一度アップロードしてください。', |
845 | 852 | 'badfilename' => 'ファイル名は "$1" へ変更されました。', |
846 | 853 | 'filetype-badmime' => 'MIME タイプ "$1" のファイルのアップロードは許可されていません。', |
— | — | @@ -1002,6 +1009,7 @@ |
1003 | 1010 | 'uncategorizedpages' => 'カテゴリ未導入のページ', |
1004 | 1011 | 'uncategorizedcategories' => 'カテゴリ未導入のカテゴリ', |
1005 | 1012 | 'uncategorizedimages' => 'カテゴリ未導入の画像', |
| 1013 | +'uncategorizedtemplates' => 'カテゴリ未導入のテンプレート', |
1006 | 1014 | 'unusedcategories' => '使われていないカテゴリ', |
1007 | 1015 | 'unusedimages' => '使われていない画像', |
1008 | 1016 | 'popularpages' => '人気のページ', |
— | — | @@ -1009,6 +1017,7 @@ |
1010 | 1018 | 'wantedpages' => '投稿が望まれているページ', |
1011 | 1019 | 'mostlinked' => '被リンクの多いページ', |
1012 | 1020 | 'mostlinkedcategories' => '項目の多いカテゴリ', |
| 1021 | +'mostlinkedtemplates' => '使用箇所の多いテンプレート', |
1013 | 1022 | 'mostcategories' => 'カテゴリの多い項目', |
1014 | 1023 | 'mostimages' => 'リンクの多い画像', |
1015 | 1024 | 'mostrevisions' => '版の多い項目', |
— | — | @@ -1054,6 +1063,7 @@ |
1055 | 1064 | 'specialloguserlabel' => '利用者名:', |
1056 | 1065 | 'speciallogtitlelabel' => 'タイトル:', |
1057 | 1066 | 'log' => 'ログ', |
| 1067 | +'all-logs-page' => '全てのログ', |
1058 | 1068 | 'log-search-legend' => 'ログの検索', |
1059 | 1069 | 'log-search-submit' => '検索', |
1060 | 1070 | 'alllogstext' => 'アップロード、削除、保護、投稿ブロック、権限変更のログがまとめて表示されています。ログの種類、実行した利用者、影響を受けたページ(利用者)による絞り込みができます。', |
— | — | @@ -1072,6 +1082,7 @@ |
1073 | 1083 | 'allpagessubmit' => '表示', |
1074 | 1084 | 'allpagesprefix' => '次の文字列から始まるページを表示:', |
1075 | 1085 | 'allpagesbadtitle' => '指定したタイトルは無効か、正しくない inter-language または inter-wiki のタイトルです。ページタイトルに使用できない文字が含まれている可能性があります。', |
| 1086 | +'allpages-bad-ns' => '{{SITENAME}}に "$1" という名前空間はありません。', |
1076 | 1087 | |
1077 | 1088 | # Special:Listusers |
1078 | 1089 | 'listusersfrom' => 'この文字から表示:', |
— | — | @@ -1159,6 +1170,7 @@ |
1160 | 1171 | 'enotif_mailer' => '{{SITENAME}} 通知メール', |
1161 | 1172 | 'enotif_reset' => 'すべてのページを訪問済みにする', |
1162 | 1173 | 'enotif_newpagetext' => '(新規ページ)', |
| 1174 | +'enotif_impersonal_salutation' => '{{SITENAME}} 利用者', |
1163 | 1175 | 'changed' => '変更', |
1164 | 1176 | 'created' => '作成', |
1165 | 1177 | 'enotif_subject' => '{{SITENAME}} のページ "$PAGETITLE" が $PAGEEDITOR によって$CHANGEDORCREATEDされました', |
— | — | @@ -1168,6 +1180,7 @@ |
1169 | 1181 | 'enotif_lastdiff' => ' |
1170 | 1182 | 変更内容を見るには以下のURLにアクセスしてください: |
1171 | 1183 | $1', |
| 1184 | +'enotif_anon_editor' => '匿名利用者 $1', |
1172 | 1185 | 'enotif_body' => 'Dear $WATCHINGUSERNAME, |
1173 | 1186 | |
1174 | 1187 | {{SITENAME}}のページ $PAGETITLE が $PAGEEDITDATE に |
— | — | @@ -1227,8 +1240,9 @@ |
1228 | 1241 | 'sessionfailure' => 'あなたのログイン・セッションに問題が発生しました。この動作はセッションハイジャックを防ぐために取り消されました。ブラウザの「戻る」を押してからページを再読込し、もう一度送信してください。', |
1229 | 1242 | 'protectlogpage' => '保護記録', |
1230 | 1243 | 'protectlogtext' => '以下はページの保護・保護解除の一覧です。', |
1231 | | -'protectedarticle' => '"$1" を保護しました。', |
1232 | | -'unprotectedarticle' => '"$1" の保護を解除しました。', |
| 1244 | +'protectedarticle' => '"[[$1]]" を保護しました。', |
| 1245 | +'modifiedarticleprotection' => '"[[$1]]" の保護レベルを変更しました。', |
| 1246 | +'unprotectedarticle' => '"[[$1]]" の保護を解除しました。', |
1233 | 1247 | 'protectsub' => '"$1" の保護', |
1234 | 1248 | 'confirmprotect' => '保護の確認', |
1235 | 1249 | 'protectcomment' => '保護・保護解除の理由', |
— | — | @@ -1308,6 +1322,8 @@ |
1309 | 1323 | 'ucnote' => '利用者 <b>$1</b> によるここ <b>$2</b> 日間の編集です。', |
1310 | 1324 | 'uclinks' => '過去 $2 日間の $1 編集', |
1311 | 1325 | 'uctop' => '(最新)', |
| 1326 | +'month' => '月:', |
| 1327 | +'year' => '年:', |
1312 | 1328 | |
1313 | 1329 | 'sp-contributions-newest' => '最新', |
1314 | 1330 | 'sp-contributions-oldest' => '最古', |
— | — | @@ -1334,6 +1350,7 @@ |
1335 | 1351 | 'istemplate' => 'テンプレート呼出', |
1336 | 1352 | 'whatlinkshere-prev' => '前 $1', |
1337 | 1353 | 'whatlinkshere-next' => '次 $1', |
| 1354 | +'whatlinkshere-links'=> '← リンク', |
1338 | 1355 | |
1339 | 1356 | # Block/unblock |
1340 | 1357 | 'blockip' => '投稿ブロック', |
— | — | @@ -1354,6 +1371,7 @@ |
1355 | 1372 | ** 不適切な利用者名', |
1356 | 1373 | 'ipbanononly' => '匿名利用者のみブロック', |
1357 | 1374 | 'ipbcreateaccount' => 'アカウント作成をブロック', |
| 1375 | +'ipbemailban' => 'メール送信をブロック', |
1358 | 1376 | 'ipbenableautoblock' => 'この利用者が最後に使用したIPアドレスを自動的にブロック(ブロック後に使用したIPアドレスも含む)', |
1359 | 1377 | 'ipbsubmit' => '投稿ブロックする', |
1360 | 1378 | 'ipbother' => '期間 (その他のとき)', |
— | — | @@ -1383,6 +1401,7 @@ |
1384 | 1402 | 'anononlyblock' => '匿名のみ', |
1385 | 1403 | 'noautoblockblock' => '自動ブロックなし', |
1386 | 1404 | 'createaccountblock' => 'アカウント作成のブロック', |
| 1405 | +'emailblock' => 'メール送信のブロック', |
1387 | 1406 | 'ipblocklist-empty' => '{{int:ipblocklist}}はありません。', |
1388 | 1407 | 'ipblocklist-no-results' => '指定されたIPアドレスまたは利用者名はブロックされていません。', |
1389 | 1408 | 'blocklink' => 'ブロック', |
— | — | @@ -1396,6 +1415,7 @@ |
1397 | 1416 | 'block-log-flags-anononly' => '匿名のみ', |
1398 | 1417 | 'block-log-flags-nocreate' => 'アカウント作成のブロック', |
1399 | 1418 | 'block-log-flags-noautoblock' => '自動ブロック無効', |
| 1419 | +'block-log-flags-noemail' => 'メール送信のブロック', |
1400 | 1420 | 'range_block_disabled' => '広域ブロックは無効に設定されています。', |
1401 | 1421 | 'ipb_expiry_invalid' => '不正な期間です。', |
1402 | 1422 | 'ipb_already_blocked' => '"$1" は既にブロックされています。', |
— | — | @@ -1449,7 +1469,7 @@ |
1450 | 1470 | 'move-watch' => '移動するページをウォッチ', |
1451 | 1471 | 'movepagebtn' => 'ページを移動', |
1452 | 1472 | 'pagemovedsub' => '無事移動しました。', |
1453 | | -'pagemovedtext' => 'ページ "[[$1]]" は "[[$2]]" に移動しました。', |
| 1473 | +'movepage-moved' => 'ページ "$1" は "$2" に移動されました。', |
1454 | 1474 | 'articleexists' => '指定された移動先には既にページが存在するか、名前が不適切です。', |
1455 | 1475 | 'talkexists' => 'ページ自身は移動されましたが、付随のノートページは移動先のページが存在したため移動できませんでした。手動で内容を統合してください。', |
1456 | 1476 | 'movedto' => '移動先:', |
— | — | @@ -1978,6 +1998,7 @@ |
1979 | 1999 | 'watchlistall1' => 'すべて', |
1980 | 2000 | 'watchlistall2' => 'すべて', |
1981 | 2001 | 'namespacesall' => 'すべて', |
| 2002 | +'monthsall' => 'すべて', |
1982 | 2003 | |
1983 | 2004 | # E-mail address confirmation |
1984 | 2005 | 'confirmemail' => 'メールアドレスの確認', |
— | — | @@ -2065,8 +2086,6 @@ |
2066 | 2087 | 'articletitles' => "''$1'' からはじまる項目", |
2067 | 2088 | 'hideresults' => '結果を隠す', |
2068 | 2089 | |
2069 | | -# DISPLAYTITLE |
2070 | | -'displaytitle' => '(このページへリンクするには [[$1]] を使用)', |
2071 | 2090 | |
2072 | 2091 | 'loginlanguagelabel' => '言語: $1', |
2073 | 2092 | |
— | — | @@ -2074,6 +2093,7 @@ |
2075 | 2094 | 'imgmultipageprev' => '← 前ページ', |
2076 | 2095 | 'imgmultipagenext' => '次ページ →', |
2077 | 2096 | 'imgmultigo' => '表示', |
| 2097 | +'imgmultigotopre' => '', |
2078 | 2098 | 'imgmultigotopost' => 'ページ目を', |
2079 | 2099 | 'imgmultiparseerror' => '画像ファイルが壊れているか正しくないため、ページのリストを生成できませんでした。', |
2080 | 2100 | |
— | — | @@ -2115,3 +2135,4 @@ |
2116 | 2136 | ); |
2117 | 2137 | |
2118 | 2138 | |
| 2139 | + |
Index: branches/apiedit/phase3/languages/messages/MessagesDe.php |
— | — | @@ -1308,10 +1308,6 @@ |
1309 | 1309 | 'nowatchlist' => 'Sie haben keine Einträge auf Ihrer Beobachtungsliste.', |
1310 | 1310 | 'watchlistanontext' => 'Sie müssen sich $1, um Ihre Beobachtungsliste zu sehen oder Einträge auf ihr zu bearbeiten.', |
1311 | 1311 | '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.', |
1316 | 1312 | 'watchnologin' => 'Sie sind nicht angemeldet', |
1317 | 1313 | 'watchnologintext' => 'Sie müssen [[Special:Userlogin|angemeldet]] |
1318 | 1314 | sein, um Ihre Beobachtungsliste zu bearbeiten.', |
— | — | @@ -1335,11 +1331,7 @@ |
1336 | 1332 | 'wlheader-showupdated' => "Seiten mit noch nicht gesehenen Änderungen werden '''fett''' dargestellt.<br />", |
1337 | 1333 | 'watchmethod-recent' => 'Überprüfen der letzten Bearbeitungen für die Beobachtungsliste', |
1338 | 1334 | 'watchmethod-list' => 'Überprüfen der Beobachtungsliste nach letzten Bearbeitungen', |
1339 | | -'removechecked' => 'Markierte Einträge löschen', |
1340 | 1335 | '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.', |
1344 | 1336 | 'iteminvalidname' => 'Problem mit dem Eintrag „$1“, ungültiger Name.', |
1345 | 1337 | 'wlnote' => "Es {{PLURAL:$1|folgt die letzte Änderung|folgen die letzten '''$1''' Änderungen}} der letzten {{PLURAL:$2|Stunde|'''$2''' Stunden}}.", |
1346 | 1338 | 'wlshowlast' => 'Zeige die Änderungen der letzten $1 Stunden, $2 Tage oder $3 (in den letzten 30 Tagen).', |
— | — | @@ -1350,7 +1342,6 @@ |
1351 | 1343 | 'watchlist-hide-own' => 'eigene Änderungen ausblenden', |
1352 | 1344 | 'watchlist-show-minor' => 'kleine Änderungen einblenden', |
1353 | 1345 | 'watchlist-hide-minor' => 'kleine Änderungen ausblenden', |
1354 | | -'wldone' => 'Erfolgreich ausgeführt.', |
1355 | 1346 | |
1356 | 1347 | # Displayed when you click the "watch" button and it's in the process of watching |
1357 | 1348 | 'watching' => 'Beobachten …', |
— | — | @@ -2293,4 +2284,29 @@ |
2294 | 2285 | 'lag-warn-normal' => 'Bearbeitungen der letzten $1 Sekunden werden in dieser Liste noch nicht angezeigt.', |
2295 | 2286 | 'lag-warn-high' => 'Auf Grund hoher Datenbankauslastung werden die Bearbeitungen der letzten $1 Sekunden in dieser Liste noch nicht angezeigt.', |
2296 | 2287 | |
| 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 | + |
2297 | 2313 | ); |
Index: branches/apiedit/phase3/languages/messages/MessagesEn.php |
— | — | @@ -1692,10 +1692,6 @@ |
1693 | 1693 | 'nowatchlist' => 'You have no items on your watchlist.', |
1694 | 1694 | 'watchlistanontext' => 'Please $1 to view or edit items on your watchlist.', |
1695 | 1695 | '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.', |
1700 | 1696 | 'watchnologin' => 'Not logged in', |
1701 | 1697 | 'watchnologintext' => 'You must be [[Special:Userlogin|logged in]] to modify your watchlist.', |
1702 | 1698 | 'addedwatch' => 'Added to watchlist', |
— | — | @@ -1720,13 +1716,7 @@ |
1721 | 1717 | 'wlheader-showupdated' => "* Pages which have been changed since you last visited them are shown in '''bold'''", |
1722 | 1718 | 'watchmethod-recent' => 'checking recent edits for watched pages', |
1723 | 1719 | 'watchmethod-list' => 'checking watched pages for recent edits', |
1724 | | -'removechecked' => 'Remove checked items from watchlist', |
1725 | 1720 | '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'...", |
1731 | 1721 | 'iteminvalidname' => "Problem with item '$1', invalid name...", |
1732 | 1722 | 'wlnote' => "Below {{PLURAL:$1|is the last change|are the last '''$1''' changes}} in the last {{PLURAL:$2|hour|'''$2''' hours}}.", |
1733 | 1723 | 'wlshowlast' => 'Show last $1 hours $2 days $3', |
— | — | @@ -1737,7 +1727,6 @@ |
1738 | 1728 | 'watchlist-hide-own' => 'Hide my edits', |
1739 | 1729 | 'watchlist-show-minor' => 'Show minor edits', |
1740 | 1730 | 'watchlist-hide-minor' => 'Hide minor edits', |
1741 | | -'wldone' => 'Done.', |
1742 | 1731 | |
1743 | 1732 | # Displayed when you click the "watch" button and it's in the process of watching |
1744 | 1733 | 'watching' => 'Watching...', |
— | — | @@ -2896,4 +2885,29 @@ |
2897 | 2886 | 'lag-warn-normal' => 'Changes newer than $1 seconds may not be shown in this list.', |
2898 | 2887 | 'lag-warn-high' => 'Due to high database server lag, changes newer than $1 seconds may not be shown in this list.', |
2899 | 2888 | |
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 |
2901 | 2915 | - /trunk/phase3:1-23668 |
2902 | 2916 | + /trunk/phase3:1-23698 |