Index: trunk/phase3/maintenance/language/messages.inc |
— | — | @@ -1285,7 +1285,6 @@ |
1286 | 1286 | 'nextpage', |
1287 | 1287 | 'prevpage', |
1288 | 1288 | 'allpagesfrom', |
1289 | | - 'allpagesto', |
1290 | 1289 | 'allarticles', |
1291 | 1290 | 'allinnamespace', |
1292 | 1291 | 'allnotinnamespace', |
Index: trunk/phase3/includes/specials/SpecialAllpages.php |
— | — | @@ -2,7 +2,6 @@ |
3 | 3 | /** |
4 | 4 | * @file |
5 | 5 | * @ingroup SpecialPage |
6 | | - * Note that Special:Prefixindex.php depends on this |
7 | 6 | */ |
8 | 7 | |
9 | 8 | /** |
— | — | @@ -14,23 +13,24 @@ |
15 | 14 | global $wgRequest, $wgOut, $wgContLang; |
16 | 15 | |
17 | 16 | # GET values |
18 | | - $from = $wgRequest->getVal( 'from', '' ); |
19 | | - $to = $wgRequest->getVal( 'to', '' ); |
| 17 | + $from = $wgRequest->getVal( 'from' ); |
20 | 18 | $namespace = $wgRequest->getInt( 'namespace' ); |
21 | 19 | |
22 | 20 | $namespaces = $wgContLang->getNamespaces(); |
23 | 21 | |
| 22 | + $indexPage = new SpecialAllpages(); |
| 23 | + |
24 | 24 | $wgOut->setPagetitle( ( $namespace > 0 && in_array( $namespace, array_keys( $namespaces) ) ) ? |
25 | 25 | wfMsg( 'allinnamespace', str_replace( '_', ' ', $namespaces[$namespace] ) ) : |
26 | 26 | wfMsg( 'allarticles' ) |
27 | 27 | ); |
28 | | - |
29 | | - if( isset($par) ) { |
30 | | - $indexPage = new SpecialPrefixIndex(); |
31 | | - $indexPage->showPrefixChunk( $namespace, $par, $specialPage->including(), $from ); |
| 28 | + |
| 29 | + if ( isset($par) ) { |
| 30 | + $indexPage->showChunk( $namespace, $par, $specialPage->including() ); |
| 31 | + } elseif ( isset($from) ) { |
| 32 | + $indexPage->showChunk( $namespace, $from, $specialPage->including() ); |
32 | 33 | } else { |
33 | | - $indexPage = new SpecialAllpages(); |
34 | | - $indexPage->showToplevel( $namespace, $from, $to, $specialPage->including() ); |
| 34 | + $indexPage->showToplevel ( $namespace, $specialPage->including() ); |
35 | 35 | } |
36 | 36 | } |
37 | 37 | |
— | — | @@ -40,19 +40,9 @@ |
41 | 41 | */ |
42 | 42 | class SpecialAllpages { |
43 | 43 | /** |
44 | | - * Maximum number of pages to show on single list subpage. |
| 44 | + * Maximum number of pages to show on single subpage. |
45 | 45 | */ |
46 | | - protected $maxPerPage = 345; |
47 | | - |
48 | | - /** |
49 | | - * Maximum number of pages to show on single index subpage. |
50 | | - */ |
51 | | - protected $maxLineCount = 200; |
52 | | - |
53 | | - /** |
54 | | - * Maximum number of chars to show for an entry. |
55 | | - */ |
56 | | - protected $maxPageLength = 70; |
| 46 | + protected $maxPerPage = 960; |
57 | 47 | |
58 | 48 | /** |
59 | 49 | * Name of this special page. Used to make title objects that reference back |
— | — | @@ -60,13 +50,17 @@ |
61 | 51 | */ |
62 | 52 | protected $name = 'Allpages'; |
63 | 53 | |
| 54 | + /** |
| 55 | + * Determines, which message describes the input field 'nsfrom'. |
| 56 | + */ |
| 57 | + protected $nsfromMsg = 'allpagesfrom'; |
| 58 | + |
64 | 59 | /** |
65 | 60 | * HTML for the top form |
66 | 61 | * @param integer $namespace A namespace constant (default NS_MAIN). |
67 | | - * @param string $from dbKey we are starting listing at. |
68 | | - * @param string $to dbKey we are ending listing at. |
| 62 | + * @param string $from Article name we are starting listing at. |
69 | 63 | */ |
70 | | -function namespaceForm( $namespace = NS_MAIN, $from = '', $to = '' ) { |
| 64 | +function namespaceForm ( $namespace = NS_MAIN, $from = '' ) { |
71 | 65 | global $wgScript; |
72 | 66 | $t = SpecialPage::getTitleFor( $this->name ); |
73 | 67 | |
— | — | @@ -78,22 +72,14 @@ |
79 | 73 | $out .= Xml::openElement( 'table', array( 'id' => 'nsselect', 'class' => 'allpages' ) ); |
80 | 74 | $out .= "<tr> |
81 | 75 | <td class='mw-label'>" . |
82 | | - Xml::label( wfMsg( 'allpagesfrom' ), 'nsfrom' ) . |
| 76 | + Xml::label( wfMsg( $this->nsfromMsg ), 'nsfrom' ) . |
83 | 77 | "</td> |
84 | 78 | <td class='mw-input'>" . |
85 | | - Xml::input( 'from', 30, str_replace('_',' ',$from), array( 'id' => 'nsfrom' ) ) . |
| 79 | + Xml::input( 'from', 20, $from, array( 'id' => 'nsfrom' ) ) . |
86 | 80 | "</td> |
87 | 81 | </tr> |
88 | 82 | <tr> |
89 | 83 | <td class='mw-label'>" . |
90 | | - Xml::label( wfMsg( 'allpagesto' ), 'nsto' ) . |
91 | | - "</td> |
92 | | - <td class='mw-input'>" . |
93 | | - Xml::input( 'to', 30, str_replace('_',' ',$to), array( 'id' => 'nsto' ) ) . |
94 | | - "</td> |
95 | | - </tr> |
96 | | - <tr> |
97 | | - <td class='mw-label'>" . |
98 | 84 | Xml::label( wfMsg( 'namespace' ), 'namespace' ) . |
99 | 85 | "</td> |
100 | 86 | <td class='mw-input'>" . |
— | — | @@ -111,7 +97,7 @@ |
112 | 98 | /** |
113 | 99 | * @param integer $namespace (default NS_MAIN) |
114 | 100 | */ |
115 | | -function showToplevel( $namespace = NS_MAIN, $from = '', $to = '', $including = false ) { |
| 101 | +function showToplevel ( $namespace = NS_MAIN, $including = false ) { |
116 | 102 | global $wgOut, $wgContLang; |
117 | 103 | $align = $wgContLang->isRtl() ? 'left' : 'right'; |
118 | 104 | |
— | — | @@ -121,54 +107,45 @@ |
122 | 108 | $dbr = wfGetDB( DB_SLAVE ); |
123 | 109 | $out = ""; |
124 | 110 | $where = array( 'page_namespace' => $namespace ); |
125 | | - |
126 | | - $from = Title::makeTitleSafe( $namespace, $from ); |
127 | | - $to = Title::makeTitleSafe( $namespace, $to ); |
128 | | - $from = ( $from && $from->isLocal() ) ? $from->getDBKey() : null; |
129 | | - $to = ( $to && $to->isLocal() ) ? $to->getDBKey() : null; |
130 | | - |
131 | | - if( isset($from) ) |
132 | | - $where[] = 'page_title >= '.$dbr->addQuotes( $from ); |
133 | | - if( isset($to) ) |
134 | | - $where[] = 'page_title <= '.$dbr->addQuotes( $to ); |
135 | 111 | |
136 | 112 | global $wgMemc; |
137 | | - $key = wfMemcKey( 'allpages', 'ns', $namespace, $from, $to ); |
| 113 | + $key = wfMemcKey( 'allpages', 'ns', $namespace ); |
138 | 114 | $lines = $wgMemc->get( $key ); |
139 | | - |
140 | | - $count = $dbr->estimateRowCount( 'page', '*', $where, __METHOD__ ); |
141 | | - $maxPerSubpage = intval($count/$this->maxLineCount); |
142 | | - $maxPerSubpage = max($maxPerSubpage,$this->maxPerPage); |
143 | 115 | |
144 | 116 | if( !is_array( $lines ) ) { |
145 | 117 | $options = array( 'LIMIT' => 1 ); |
146 | | - $options['ORDER BY'] = 'page_title ASC'; |
| 118 | + if ( ! $dbr->implicitOrderby() ) { |
| 119 | + $options['ORDER BY'] = 'page_title'; |
| 120 | + } |
147 | 121 | $firstTitle = $dbr->selectField( 'page', 'page_title', $where, __METHOD__, $options ); |
148 | 122 | $lastTitle = $firstTitle; |
| 123 | + |
149 | 124 | # This array is going to hold the page_titles in order. |
150 | 125 | $lines = array( $firstTitle ); |
| 126 | + |
151 | 127 | # If we are going to show n rows, we need n+1 queries to find the relevant titles. |
152 | 128 | $done = false; |
153 | | - while( !$done ) { |
| 129 | + for( $i = 0; !$done; ++$i ) { |
154 | 130 | // Fetch the last title of this chunk and the first of the next |
155 | 131 | $chunk = is_null( $lastTitle ) |
156 | 132 | ? '' |
157 | 133 | : 'page_title >= ' . $dbr->addQuotes( $lastTitle ); |
158 | | - $chunk = array($chunk); |
159 | | - $res = $dbr->select( 'page', /* FROM */ |
| 134 | + $res = $dbr->select( |
| 135 | + 'page', /* FROM */ |
160 | 136 | 'page_title', /* WHAT */ |
161 | | - array_merge($where,$chunk), |
| 137 | + $where + array($chunk), |
162 | 138 | __METHOD__, |
163 | | - array ('LIMIT' => 2, 'OFFSET' => $maxPerSubpage - 1, 'ORDER BY' => 'page_title ASC') |
164 | | - ); |
| 139 | + array ('LIMIT' => 2, 'OFFSET' => $this->maxPerPage - 1, 'ORDER BY' => 'page_title') ); |
165 | 140 | |
166 | | - if( $s = $dbr->fetchObject( $res ) ) { |
| 141 | + if ( $s = $dbr->fetchObject( $res ) ) { |
167 | 142 | array_push( $lines, $s->page_title ); |
168 | 143 | } else { |
169 | 144 | // Final chunk, but ended prematurely. Go back and find the end. |
170 | 145 | $endTitle = $dbr->selectField( 'page', 'MAX(page_title)', |
171 | | - array_merge($where,$chunk), |
172 | | - __METHOD__ ); |
| 146 | + array( |
| 147 | + 'page_namespace' => $namespace, |
| 148 | + $chunk |
| 149 | + ), __METHOD__ ); |
173 | 150 | array_push( $lines, $endTitle ); |
174 | 151 | $done = true; |
175 | 152 | } |
— | — | @@ -188,39 +165,35 @@ |
189 | 166 | // If there are only two or less sections, don't even display them. |
190 | 167 | // Instead, display the first section directly. |
191 | 168 | if( count( $lines ) <= 2 ) { |
192 | | - if( !empty($lines) ) { |
193 | | - $this->showChunk( $namespace, $lines[0], $lines[count($lines)-1], $including ); |
194 | | - } else { |
195 | | - $wgOut->addHtml( $this->namespaceForm( $namespace, $from, $to ) ); |
196 | | - } |
| 169 | + $this->showChunk( $namespace, '', $including ); |
197 | 170 | return; |
198 | 171 | } |
199 | 172 | |
200 | 173 | # At this point, $lines should contain an even number of elements. |
201 | 174 | $out .= "<table class='allpageslist' style='background: inherit;'>"; |
202 | | - while( count ( $lines ) > 0 ) { |
203 | | - $inpoint = array_shift( $lines ); |
204 | | - $outpoint = array_shift( $lines ); |
205 | | - $out .= $this->showline( $inpoint, $outpoint, $namespace ); |
| 175 | + while ( count ( $lines ) > 0 ) { |
| 176 | + $inpoint = array_shift ( $lines ); |
| 177 | + $outpoint = array_shift ( $lines ); |
| 178 | + $out .= $this->showline ( $inpoint, $outpoint, $namespace, false ); |
206 | 179 | } |
207 | 180 | $out .= '</table>'; |
208 | | - $nsForm = $this->namespaceForm( $namespace, $from, $to ); |
| 181 | + $nsForm = $this->namespaceForm( $namespace, '', false ); |
209 | 182 | |
210 | 183 | # Is there more? |
211 | | - if( $including ) { |
| 184 | + if ( $including ) { |
212 | 185 | $out2 = ''; |
213 | 186 | } else { |
214 | | - if( isset($from) || isset($to) ) { |
215 | | - global $wgUser; |
| 187 | + $morelinks = ''; |
| 188 | + if ( $morelinks != '' ) { |
216 | 189 | $out2 = '<table style="background: inherit;" width="100%" cellpadding="0" cellspacing="0" border="0">'; |
217 | 190 | $out2 .= '<tr valign="top"><td>' . $nsForm; |
218 | | - $out2 .= '</td><td align="' . $align . '" style="font-size: smaller; margin-bottom: 1em;">' . |
219 | | - $wgUser->getSkin()->makeKnownLink( $wgContLang->specialPage( "Allpages" ), wfMsgHtml ( 'allpages' ) ); |
220 | | - $out2 .= "</td></tr></table><hr />"; |
| 191 | + $out2 .= '</td><td align="' . $align . '" style="font-size: smaller; margin-bottom: 1em;">'; |
| 192 | + $out2 .= $morelinks . '</td></tr></table><hr />'; |
221 | 193 | } else { |
222 | 194 | $out2 = $nsForm . '<hr />'; |
223 | 195 | } |
224 | 196 | } |
| 197 | + |
225 | 198 | $wgOut->addHtml( $out2 . $out ); |
226 | 199 | } |
227 | 200 | |
— | — | @@ -234,17 +207,14 @@ |
235 | 208 | $align = $wgContLang->isRtl() ? 'left' : 'right'; |
236 | 209 | $inpointf = htmlspecialchars( str_replace( '_', ' ', $inpoint ) ); |
237 | 210 | $outpointf = htmlspecialchars( str_replace( '_', ' ', $outpoint ) ); |
238 | | - // Don't let the length runaway |
239 | | - $inpointf = $wgContLang->truncate( $inpointf, $this->maxPageLength, '...' ); |
240 | | - $outpointf = $wgContLang->truncate( $outpointf, $this->maxPageLength, '...' ); |
| 211 | + $queryparams = ($namespace ? "namespace=$namespace" : ''); |
| 212 | + $special = SpecialPage::getTitleFor( $this->name, $inpoint ); |
| 213 | + $link = $special->escapeLocalUrl( $queryparams ); |
241 | 214 | |
242 | | - $queryparams = $namespace ? "namespace=$namespace&" : ''; |
243 | | - $special = SpecialPage::getTitleFor( $this->name ); |
244 | | - $link = $special->escapeLocalUrl( $queryparams . 'from=' . urlencode($inpoint) . '&to=' . urlencode($outpoint) ); |
245 | | - |
246 | | - $out = wfMsgHtml( 'alphaindexline', |
247 | | - "<a href=\"$link\">$inpointf</a></td><td>", |
248 | | - "</td><td><a href=\"$link\">$outpointf</a>" |
| 215 | + $out = wfMsgHtml( |
| 216 | + 'alphaindexline', |
| 217 | + "<a href=\"$link\">$inpointf</a></td><td><a href=\"$link\">", |
| 218 | + "</a></td><td><a href=\"$link\">$outpointf</a>" |
249 | 219 | ); |
250 | 220 | return '<tr><td align="' . $align . '">'.$out.'</td></tr>'; |
251 | 221 | } |
— | — | @@ -252,22 +222,19 @@ |
253 | 223 | /** |
254 | 224 | * @param integer $namespace (Default NS_MAIN) |
255 | 225 | * @param string $from list all pages from this name (default FALSE) |
256 | | - * @param string $from list all pages to this name (default FALSE) |
257 | 226 | */ |
258 | | -function showChunk( $namespace = NS_MAIN, $from = false, $to = false, $including = false ) { |
| 227 | +function showChunk( $namespace = NS_MAIN, $from, $including = false ) { |
259 | 228 | global $wgOut, $wgUser, $wgContLang; |
260 | 229 | |
261 | 230 | $sk = $wgUser->getSkin(); |
262 | 231 | |
263 | | - $fromList = $this->getNamespaceKeyAndText( $namespace, $from ); |
264 | | - $toList = $this->getNamespaceKeyAndText( $namespace, $to ); |
265 | | - |
| 232 | + $fromList = $this->getNamespaceKeyAndText($namespace, $from); |
266 | 233 | $namespaces = $wgContLang->getNamespaces(); |
267 | 234 | $align = $wgContLang->isRtl() ? 'left' : 'right'; |
268 | 235 | |
269 | 236 | $n = 0; |
270 | 237 | |
271 | | - if ( !$fromList || !$toList ) { |
| 238 | + if ( !$fromList ) { |
272 | 239 | $out = wfMsgWikiHtml( 'allpagesbadtitle' ); |
273 | 240 | } elseif ( !in_array( $namespace, array_keys( $namespaces ) ) ) { |
274 | 241 | // Show errormessage and reset to NS_MAIN |
— | — | @@ -275,19 +242,17 @@ |
276 | 243 | $namespace = NS_MAIN; |
277 | 244 | } else { |
278 | 245 | list( $namespace, $fromKey, $from ) = $fromList; |
279 | | - list( $namespace, $toKey, $to ) = $toList; |
280 | 246 | |
281 | 247 | $dbr = wfGetDB( DB_SLAVE ); |
282 | 248 | $res = $dbr->select( 'page', |
283 | 249 | array( 'page_namespace', 'page_title', 'page_is_redirect' ), |
284 | 250 | array( |
285 | 251 | 'page_namespace' => $namespace, |
286 | | - 'page_title >= ' . $dbr->addQuotes( $fromKey ), |
287 | | - 'page_title <= ' . $dbr->addQuotes( $toKey ), |
| 252 | + 'page_title >= ' . $dbr->addQuotes( $fromKey ) |
288 | 253 | ), |
289 | 254 | __METHOD__, |
290 | 255 | array( |
291 | | - 'ORDER BY' => 'page_title ASC', |
| 256 | + 'ORDER BY' => 'page_title', |
292 | 257 | 'LIMIT' => $this->maxPerPage + 1, |
293 | 258 | 'USE INDEX' => 'name_title', |
294 | 259 | ) |
— | — | @@ -326,15 +291,87 @@ |
327 | 292 | if ( $including ) { |
328 | 293 | $out2 = ''; |
329 | 294 | } else { |
330 | | - $nsForm = $this->namespaceForm( $namespace, $from, $to ); |
| 295 | + if( $from == '' ) { |
| 296 | + // First chunk; no previous link. |
| 297 | + $prevTitle = null; |
| 298 | + } else { |
| 299 | + # Get the last title from previous chunk |
| 300 | + $dbr = wfGetDB( DB_SLAVE ); |
| 301 | + $res_prev = $dbr->select( |
| 302 | + 'page', |
| 303 | + 'page_title', |
| 304 | + array( 'page_namespace' => $namespace, 'page_title < '.$dbr->addQuotes($from) ), |
| 305 | + __METHOD__, |
| 306 | + array( 'ORDER BY' => 'page_title DESC', 'LIMIT' => $this->maxPerPage, 'OFFSET' => ($this->maxPerPage - 1 ) ) |
| 307 | + ); |
| 308 | + |
| 309 | + # Get first title of previous complete chunk |
| 310 | + if( $dbr->numrows( $res_prev ) >= $this->maxPerPage ) { |
| 311 | + $pt = $dbr->fetchObject( $res_prev ); |
| 312 | + $prevTitle = Title::makeTitle( $namespace, $pt->page_title ); |
| 313 | + } else { |
| 314 | + # The previous chunk is not complete, need to link to the very first title |
| 315 | + # available in the database |
| 316 | + $options = array( 'LIMIT' => 1 ); |
| 317 | + if ( ! $dbr->implicitOrderby() ) { |
| 318 | + $options['ORDER BY'] = 'page_title'; |
| 319 | + } |
| 320 | + $reallyFirstPage_title = $dbr->selectField( 'page', 'page_title', array( 'page_namespace' => $namespace ), __METHOD__, $options ); |
| 321 | + # Show the previous link if it s not the current requested chunk |
| 322 | + if( $from != $reallyFirstPage_title ) { |
| 323 | + $prevTitle = Title::makeTitle( $namespace, $reallyFirstPage_title ); |
| 324 | + } else { |
| 325 | + $prevTitle = null; |
| 326 | + } |
| 327 | + } |
| 328 | + } |
| 329 | + |
| 330 | + $nsForm = $this->namespaceForm( $namespace, $from ); |
331 | 331 | $out2 = '<table style="background: inherit;" width="100%" cellpadding="0" cellspacing="0" border="0">'; |
332 | 332 | $out2 .= '<tr valign="top"><td>' . $nsForm; |
333 | 333 | $out2 .= '</td><td align="' . $align . '" style="font-size: smaller; margin-bottom: 1em;">' . |
334 | | - $sk->makeKnownLink( $wgContLang->specialPage( "Allpages" ), wfMsgHtml ( 'allpages' ) ); |
| 334 | + $sk->makeKnownLink( $wgContLang->specialPage( "Allpages" ), |
| 335 | + wfMsgHtml ( 'allpages' ) ); |
| 336 | + |
| 337 | + $self = SpecialPage::getTitleFor( 'Allpages' ); |
| 338 | + |
| 339 | + # Do we put a previous link ? |
| 340 | + if( isset( $prevTitle ) && $pt = $prevTitle->getText() ) { |
| 341 | + $q = 'from=' . $prevTitle->getPartialUrl() |
| 342 | + . ( $namespace ? '&namespace=' . $namespace : '' ); |
| 343 | + $prevLink = $sk->makeKnownLinkObj( $self, |
| 344 | + wfMsgHTML( 'prevpage', htmlspecialchars( $pt ) ), $q ); |
| 345 | + $out2 .= ' | ' . $prevLink; |
| 346 | + } |
| 347 | + |
| 348 | + if( $n == $this->maxPerPage && $s = $dbr->fetchObject($res) ) { |
| 349 | + # $s is the first link of the next chunk |
| 350 | + $t = Title::MakeTitle($namespace, $s->page_title); |
| 351 | + $q = 'from=' . $t->getPartialUrl() |
| 352 | + . ( $namespace ? '&namespace=' . $namespace : '' ); |
| 353 | + $nextLink = $sk->makeKnownLinkObj( $self, |
| 354 | + wfMsgHtml( 'nextpage', htmlspecialchars( $t->getText() ) ), $q ); |
| 355 | + $out2 .= ' | ' . $nextLink; |
| 356 | + } |
335 | 357 | $out2 .= "</td></tr></table><hr />"; |
336 | 358 | } |
337 | 359 | |
338 | 360 | $wgOut->addHtml( $out2 . $out ); |
| 361 | + if( isset($prevLink) or isset($nextLink) ) { |
| 362 | + $wgOut->addHtml( '<hr /><p style="font-size: smaller; float: ' . $align . '">' ); |
| 363 | + if( isset( $prevLink ) ) { |
| 364 | + $wgOut->addHTML( $prevLink ); |
| 365 | + } |
| 366 | + if( isset( $prevLink ) && isset( $nextLink ) ) { |
| 367 | + $wgOut->addHTML( ' | ' ); |
| 368 | + } |
| 369 | + if( isset( $nextLink ) ) { |
| 370 | + $wgOut->addHTML( $nextLink ); |
| 371 | + } |
| 372 | + $wgOut->addHTML( '</p>' ); |
| 373 | + |
| 374 | + } |
| 375 | + |
339 | 376 | } |
340 | 377 | |
341 | 378 | /** |
— | — | @@ -344,7 +381,7 @@ |
345 | 382 | * @static (sort of) |
346 | 383 | * @access private |
347 | 384 | */ |
348 | | -function getNamespaceKeyAndText( $ns, $text ) { |
| 385 | +function getNamespaceKeyAndText ($ns, $text) { |
349 | 386 | if ( $text == '' ) |
350 | 387 | return array( $ns, '', '' ); # shortcut for common case |
351 | 388 | |
— | — | @@ -364,5 +401,4 @@ |
365 | 402 | return NULL; |
366 | 403 | } |
367 | 404 | } |
368 | | - |
369 | 405 | } |
Index: trunk/phase3/languages/messages/MessagesEn.php |
— | — | @@ -2004,7 +2004,6 @@ |
2005 | 2005 | 'nextpage' => 'Next page ($1)', |
2006 | 2006 | 'prevpage' => 'Previous page ($1)', |
2007 | 2007 | 'allpagesfrom' => 'Display pages starting at:', |
2008 | | -'allpagesto' => 'Display pages ending at:', |
2009 | 2008 | 'allarticles' => 'All pages', |
2010 | 2009 | 'allinnamespace' => 'All pages ($1 namespace)', |
2011 | 2010 | 'allnotinnamespace' => 'All pages (not in $1 namespace)', |