r15503 MediaWiki - Code Review archive

Repository:MediaWiki
Revision:r15502‎ | r15503 | r15504 >
Date:18:10, 10 July 2006
Author:brion
Status:old
Tags:
Comment:
merge from trunk, 15482:15502
Modified paths:
  • /branches/snapshot-work/RELEASE-NOTES (modified) (history)
  • /branches/snapshot-work/includes/Block.php (modified) (history)
  • /branches/snapshot-work/includes/LinkCache.php (modified) (history)
  • /branches/snapshot-work/includes/Linker.php (modified) (history)
  • /branches/snapshot-work/includes/LoadBalancer.php (modified) (history)
  • /branches/snapshot-work/includes/MagicWord.php (modified) (history)
  • /branches/snapshot-work/includes/Math.php (modified) (history)
  • /branches/snapshot-work/includes/Namespace.php (modified) (history)
  • /branches/snapshot-work/includes/Parser.php (modified) (history)
  • /branches/snapshot-work/includes/ParserCache.php (modified) (history)
  • /branches/snapshot-work/includes/RecentChange.php (modified) (history)
  • /branches/snapshot-work/includes/Revision.php (modified) (history)
  • /branches/snapshot-work/includes/Sanitizer.php (modified) (history)
  • /branches/snapshot-work/includes/Skin.php (modified) (history)
  • /branches/snapshot-work/includes/SpecialLockdb.php (modified) (history)
  • /branches/snapshot-work/includes/SpecialNewpages.php (modified) (history)
  • /branches/snapshot-work/includes/SpecialPage.php (modified) (history)
  • /branches/snapshot-work/includes/SpecialUnlockdb.php (modified) (history)
  • /branches/snapshot-work/includes/Title.php (modified) (history)
  • /branches/snapshot-work/includes/Xml.php (modified) (history)
  • /branches/snapshot-work/languages/Messages.php (modified) (history)
  • /branches/snapshot-work/languages/MessagesDe.php (modified) (history)
  • /branches/snapshot-work/languages/MessagesHe.php (modified) (history)
  • /branches/snapshot-work/languages/MessagesId.php (modified) (history)
  • /branches/snapshot-work/languages/MessagesPt_br.php (modified) (history)
  • /branches/snapshot-work/maintenance/archives/patch-ipb_anon_only.sql (modified) (history)
  • /branches/snapshot-work/maintenance/archives/patch-recentchanges-utindex.sql (added) (history)
  • /branches/snapshot-work/maintenance/archives/patch-recentchanges-utindex.sql (added) (history)
  • /branches/snapshot-work/maintenance/mysql5/tables.sql (modified) (history)
  • /branches/snapshot-work/maintenance/parserTests.inc (modified) (history)
  • /branches/snapshot-work/maintenance/tables.sql (modified) (history)
  • /branches/snapshot-work/maintenance/updaters.inc (modified) (history)

Diff [purge]

Index: branches/snapshot-work/maintenance/parserTests.inc
@@ -360,7 +360,7 @@
361361 $GLOBALS['wgContLang'] = $langObj;
362362
363363 $GLOBALS['wgLoadBalancer']->loadMasterPos();
364 - $GLOBALS['wgMessageCache'] = new MessageCache( new BagOStuff(), false, 0, $GLOBALS['wgDBname'] );
 364+ //$GLOBALS['wgMessageCache'] = new MessageCache( new BagOStuff(), false, 0, $GLOBALS['wgDBname'] );
365365 $this->setupDatabase();
366366
367367 global $wgUser;
Index: branches/snapshot-work/maintenance/mysql5/tables.sql
@@ -809,7 +809,8 @@
810810 INDEX rc_namespace_title (rc_namespace, rc_title),
811811 INDEX rc_cur_id (rc_cur_id),
812812 INDEX new_name_timestamp(rc_new,rc_namespace,rc_timestamp),
813 - INDEX rc_ip (rc_ip)
 813+ INDEX rc_ip (rc_ip),
 814+ INDEX rc_ns_usertext ( rc_namespace, rc_user_text )
814815
815816 ) TYPE=InnoDB, DEFAULT CHARSET=utf8;
816817
Index: branches/snapshot-work/maintenance/updaters.inc
@@ -762,6 +762,23 @@
763763 echo "Done. Please run maintenance/refreshLinks.php for a more thorough templatelinks update.\n";
764764 }
765765
 766+# July 2006
 767+# Add ( rc_namespace, rc_user_text ) index [R. Church]
 768+function do_rc_indices_update() {
 769+ global $wgDatabase;
 770+ echo( "Checking for additional recent changes indices...\n" );
 771+ # See if we can find the index we want
 772+ $info = $wgDatabase->indexInfo( 'recentchanges', 'rc_ns_usertext', __METHOD__ );
 773+ if( !$info ) {
 774+ # None, so create
 775+ echo( "...index on ( rc_namespace, rc_user_text ) not found; creating\n" );
 776+ dbsource( archive( 'patch-recentchanges-utindex.sql' ) );
 777+ } else {
 778+ # Index seems to exist
 779+ echo( "...seems to be ok\n" );
 780+ }
 781+}
 782+
766783 function do_all_updates( $doShared = false ) {
767784 global $wgNewTables, $wgNewFields, $wgRenamedTables, $wgSharedDB, $wgDatabase;
768785
@@ -820,6 +837,8 @@
821838 do_logging_timestamp_index(); flush();
822839
823840 do_page_random_update(); flush();
 841+
 842+ do_rc_indices_update(); flush();
824843
825844 initialiseMessages(); flush();
826845 }
Index: branches/snapshot-work/maintenance/archives/patch-ipb_anon_only.sql
@@ -33,8 +33,8 @@
3434 ) TYPE=InnoDB;
3535
3636 INSERT IGNORE INTO /*$wgDBprefix*/ipblocks_newunique
37 - (ipb_id, ipb_address, ipb_user, ipb_by, ipb_reason, ipb_timestamp, ipb_auto, ipb_expiry, ipb_range_start, ipb_range_end)
38 - SELECT ipb_id, ipb_address, ipb_user, ipb_by, ipb_reason, ipb_timestamp, ipb_auto, ipb_expiry, ipb_range_start, ipb_range_end
 37+ (ipb_id, ipb_address, ipb_user, ipb_by, ipb_reason, ipb_timestamp, ipb_auto, ipb_expiry, ipb_range_start, ipb_range_end, ipb_anon_only, ipb_create_account)
 38+ SELECT ipb_id, ipb_address, ipb_user, ipb_by, ipb_reason, ipb_timestamp, ipb_auto, ipb_expiry, ipb_range_start, ipb_range_end, 0 , ipb_user=0
3939 FROM /*$wgDBprefix*/ipblocks;
4040
4141 DROP TABLE IF EXISTS /*$wgDBprefix*/ipblocks_old;
Index: branches/snapshot-work/maintenance/archives/patch-recentchanges-utindex.sql
@@ -0,0 +1,4 @@
 2+--- July 2006
 3+--- Index on recentchanges.( rc_namespace, rc_user_text )
 4+--- Helps the username filtering in Special:Newpages
 5+ALTER TABLE /*$wgDBprefix*/recentchanges ADD INDEX `rc_ns_usertext` ( `rc_namespace` , `rc_user_text` );
\ No newline at end of file
Property changes on: branches/snapshot-work/maintenance/archives/patch-recentchanges-utindex.sql
___________________________________________________________________
Added: svn:eol-style
16 + native
Index: branches/snapshot-work/maintenance/tables.sql
@@ -795,7 +795,8 @@
796796 INDEX rc_namespace_title (rc_namespace, rc_title),
797797 INDEX rc_cur_id (rc_cur_id),
798798 INDEX new_name_timestamp(rc_new,rc_namespace,rc_timestamp),
799 - INDEX rc_ip (rc_ip)
 799+ INDEX rc_ip (rc_ip),
 800+ INDEX rc_ns_usertext ( rc_namespace, rc_user_text )
800801
801802 ) TYPE=InnoDB;
802803
Index: branches/snapshot-work/includes/Sanitizer.php
@@ -327,7 +327,7 @@
328328 * @param array $args for the processing callback
329329 * @return string
330330 */
331 - function removeHTMLtags( $text, $processCallback = null, $args = array() ) {
 331+ static function removeHTMLtags( $text, $processCallback = null, $args = array() ) {
332332 global $wgUseTidy, $wgUserHtml;
333333 $fname = 'Parser::removeHTMLtags';
334334 wfProfileIn( $fname );
@@ -501,7 +501,7 @@
502502 * @param string $text
503503 * @return string
504504 */
505 - function removeHTMLcomments( $text ) {
 505+ static function removeHTMLcomments( $text ) {
506506 $fname='Parser::removeHTMLcomments';
507507 wfProfileIn( $fname );
508508 while (($start = strpos($text, '<!--')) !== false) {
@@ -551,7 +551,7 @@
552552 * @todo Check for legal values where the DTD limits things.
553553 * @todo Check for unique id attribute :P
554554 */
555 - function validateTagAttributes( $attribs, $element ) {
 555+ static function validateTagAttributes( $attribs, $element ) {
556556 $whitelist = array_flip( Sanitizer::attributeWhitelist( $element ) );
557557 $out = array();
558558 foreach( $attribs as $attribute => $value ) {
@@ -626,7 +626,7 @@
627627 * @param string $element
628628 * @return string
629629 */
630 - function fixTagAttributes( $text, $element ) {
 630+ static function fixTagAttributes( $text, $element ) {
631631 if( trim( $text ) == '' ) {
632632 return '';
633633 }
@@ -649,7 +649,7 @@
650650 * @param $text
651651 * @return HTML-encoded text fragment
652652 */
653 - function encodeAttribute( $text ) {
 653+ static function encodeAttribute( $text ) {
654654 $encValue = htmlspecialchars( $text );
655655
656656 // Whitespace is normalized during attribute decoding,
@@ -670,7 +670,7 @@
671671 * @param $text
672672 * @return HTML-encoded text fragment
673673 */
674 - function safeEncodeAttribute( $text ) {
 674+ static function safeEncodeAttribute( $text ) {
675675 $encValue = Sanitizer::encodeAttribute( $text );
676676
677677 # Templates and links may be expanded in later parsing,
@@ -713,7 +713,7 @@
714714 * @param string $id
715715 * @return string
716716 */
717 - function escapeId( $id ) {
 717+ static function escapeId( $id ) {
718718 static $replace = array(
719719 '%3A' => ':',
720720 '%' => '.'
@@ -730,7 +730,7 @@
731731 * @return string
732732 * @private
733733 */
734 - function armorLinksCallback( $matches ) {
 734+ private static function armorLinksCallback( $matches ) {
735735 return str_replace( ':', '&#58;', $matches[1] );
736736 }
737737
@@ -742,7 +742,7 @@
743743 * @param string
744744 * @return array
745745 */
746 - function decodeTagAttributes( $text ) {
 746+ static function decodeTagAttributes( $text ) {
747747 $attribs = array();
748748
749749 if( trim( $text ) == '' ) {
@@ -780,7 +780,7 @@
781781 * @return string
782782 * @private
783783 */
784 - function getTagAttributeCallback( $set ) {
 784+ private static function getTagAttributeCallback( $set ) {
785785 if( isset( $set[6] ) ) {
786786 # Illegal #XXXXXX color with no quotes.
787787 return $set[6];
@@ -814,7 +814,7 @@
815815 * @return string
816816 * @private
817817 */
818 - function normalizeAttributeValue( $text ) {
 818+ private static function normalizeAttributeValue( $text ) {
819819 return str_replace( '"', '&quot;',
820820 preg_replace(
821821 '/\r\n|[\x20\x0d\x0a\x09]/',
@@ -836,7 +836,7 @@
837837 * @return string
838838 * @private
839839 */
840 - function normalizeCharReferences( $text ) {
 840+ static function normalizeCharReferences( $text ) {
841841 return preg_replace_callback(
842842 MW_CHAR_REFS_REGEX,
843843 array( 'Sanitizer', 'normalizeCharReferencesCallback' ),
@@ -846,7 +846,7 @@
847847 * @param string $matches
848848 * @return string
849849 */
850 - function normalizeCharReferencesCallback( $matches ) {
 850+ static function normalizeCharReferencesCallback( $matches ) {
851851 $ret = null;
852852 if( $matches[1] != '' ) {
853853 $ret = Sanitizer::normalizeEntity( $matches[1] );
@@ -871,8 +871,9 @@
872872 *
873873 * @param string $name
874874 * @return string
 875+ * @static
875876 */
876 - function normalizeEntity( $name ) {
 877+ static function normalizeEntity( $name ) {
877878 global $wgHtmlEntities;
878879 if( isset( $wgHtmlEntities[$name] ) ) {
879880 return "&$name;";
@@ -881,7 +882,7 @@
882883 }
883884 }
884885
885 - function decCharReference( $codepoint ) {
 886+ static function decCharReference( $codepoint ) {
886887 $point = intval( $codepoint );
887888 if( Sanitizer::validateCodepoint( $point ) ) {
888889 return sprintf( '&#%d;', $point );
@@ -890,7 +891,7 @@
891892 }
892893 }
893894
894 - function hexCharReference( $codepoint ) {
 895+ static function hexCharReference( $codepoint ) {
895896 $point = hexdec( $codepoint );
896897 if( Sanitizer::validateCodepoint( $point ) ) {
897898 return sprintf( '&#x%x;', $point );
@@ -904,7 +905,7 @@
905906 * @param int $codepoint
906907 * @return bool
907908 */
908 - function validateCodepoint( $codepoint ) {
 909+ private static function validateCodepoint( $codepoint ) {
909910 return ($codepoint == 0x09)
910911 || ($codepoint == 0x0a)
911912 || ($codepoint == 0x0d)
@@ -920,8 +921,9 @@
921922 * @param string $text
922923 * @return string
923924 * @public
 925+ * @static
924926 */
925 - function decodeCharReferences( $text ) {
 927+ public static function decodeCharReferences( $text ) {
926928 return preg_replace_callback(
927929 MW_CHAR_REFS_REGEX,
928930 array( 'Sanitizer', 'decodeCharReferencesCallback' ),
@@ -932,7 +934,7 @@
933935 * @param string $matches
934936 * @return string
935937 */
936 - function decodeCharReferencesCallback( $matches ) {
 938+ static function decodeCharReferencesCallback( $matches ) {
937939 if( $matches[1] != '' ) {
938940 return Sanitizer::decodeEntity( $matches[1] );
939941 } elseif( $matches[2] != '' ) {
@@ -953,7 +955,7 @@
954956 * @return string
955957 * @private
956958 */
957 - function decodeChar( $codepoint ) {
 959+ static function decodeChar( $codepoint ) {
958960 if( Sanitizer::validateCodepoint( $codepoint ) ) {
959961 return codepointToUtf8( $codepoint );
960962 } else {
@@ -969,7 +971,7 @@
970972 * @param string $name
971973 * @return string
972974 */
973 - function decodeEntity( $name ) {
 975+ static function decodeEntity( $name ) {
974976 global $wgHtmlEntities;
975977 if( isset( $wgHtmlEntities[$name] ) ) {
976978 return codepointToUtf8( $wgHtmlEntities[$name] );
@@ -985,7 +987,7 @@
986988 * @param string $element
987989 * @return array
988990 */
989 - function attributeWhitelist( $element ) {
 991+ static function attributeWhitelist( $element ) {
990992 static $list;
991993 if( !isset( $list ) ) {
992994 $list = Sanitizer::setupAttributeWhitelist();
@@ -996,9 +998,10 @@
997999 }
9981000
9991001 /**
 1002+ * @todo Document it a bit
10001003 * @return array
10011004 */
1002 - function setupAttributeWhitelist() {
 1005+ static function setupAttributeWhitelist() {
10031006 $common = array( 'id', 'class', 'lang', 'dir', 'title', 'style' );
10041007 $block = array_merge( $common, array( 'align' ) );
10051008 $tablealign = array( 'align', 'char', 'charoff', 'valign' );
@@ -1082,9 +1085,9 @@
10831086 # 11.2.1
10841087 'table' => array_merge( $common,
10851088 array( 'summary', 'width', 'border', 'frame',
1086 - 'rules', 'cellspacing', 'cellpadding',
1087 - 'align', 'bgcolor', 'frame', 'rules',
1088 - 'border' ) ),
 1089+ 'rules', 'cellspacing', 'cellpadding',
 1090+ 'align', 'bgcolor', 'rules',
 1091+ ) ),
10891092
10901093 # 11.2.2
10911094 'caption' => array_merge( $common, array( 'align' ) ),
@@ -1142,7 +1145,7 @@
11431146 * @param string $text HTML fragment
11441147 * @return string
11451148 */
1146 - function stripAllTags( $text ) {
 1149+ static function stripAllTags( $text ) {
11471150 # Actual <tags>
11481151 $text = preg_replace( '/ < .*? > /x', '', $text );
11491152
@@ -1169,7 +1172,7 @@
11701173 * @return string
11711174 * @static
11721175 */
1173 - function hackDocType() {
 1176+ static function hackDocType() {
11741177 global $wgHtmlEntities;
11751178 $out = "<!DOCTYPE html [\n";
11761179 foreach( $wgHtmlEntities as $entity => $codepoint ) {
Index: branches/snapshot-work/includes/SpecialNewpages.php
@@ -11,10 +11,13 @@
1212 * @subpackage SpecialPage
1313 */
1414 class NewPagesPage extends QueryPage {
 15+
1516 var $namespace;
 17+ var $username = '';
1618
17 - function NewPagesPage( $namespace = NS_MAIN ) {
 19+ function NewPagesPage( $namespace = NS_MAIN, $username = '' ) {
1820 $this->namespace = $namespace;
 21+ $this->username = $username;
1922 }
2023
2124 function getName() {
@@ -26,12 +29,18 @@
2730 return false;
2831 }
2932
 33+ function makeUserWhere( &$dbo ) {
 34+ return $this->username ? ' AND rc_user_text = ' . $dbo->addQuotes( $this->username ) : '';
 35+ }
 36+
3037 function getSQL() {
3138 global $wgUser, $wgUseRCPatrol;
3239 $usepatrol = ( $wgUseRCPatrol && $wgUser->isAllowed( 'patrol' ) ) ? 1 : 0;
3340 $dbr =& wfGetDB( DB_SLAVE );
3441 extract( $dbr->tableNames( 'recentchanges', 'page', 'text' ) );
3542
 43+ $uwhere = $this->makeUserWhere( $dbr );
 44+
3645 # FIXME: text will break with compression
3746 return
3847 "SELECT 'Newpages' as type,
@@ -50,7 +59,8 @@
5160 page_latest as rev_id
5261 FROM $recentchanges,$page
5362 WHERE rc_cur_id=page_id AND rc_new=1
54 - AND rc_namespace=" . $this->namespace . " AND page_is_redirect=0";
 63+ AND rc_namespace=" . $this->namespace . " AND page_is_redirect=0
 64+ {$uwhere}";
5565 }
5666
5767 function preprocessResults( &$dbo, &$res ) {
@@ -112,34 +122,20 @@
113123 }
114124
115125 /**
116 - * Show a namespace selection form for filtering
 126+ * Show a form for filtering namespace and username
117127 *
118128 * @return string
119129 */
120130 function getPageHeader() {
121 - $thisTitle = Title::makeTitle( NS_SPECIAL, $this->getName() );
122 - $form = wfOpenElement( 'form', array(
123 - 'method' => 'post',
124 - 'action' => $thisTitle->getLocalUrl() ) );
125 - $form .= wfElement( 'label', array( 'for' => 'namespace' ),
126 - wfMsg( 'namespace' ) ) . ' ';
127 - $form .= HtmlNamespaceSelector( $this->namespace );
128 - # Preserve the offset and limit
129 - $form .= wfElement( 'input', array(
130 - 'type' => 'hidden',
131 - 'name' => 'offset',
132 - 'value' => $this->offset ) );
133 - $form .= wfElement( 'input', array(
134 - 'type' => 'hidden',
135 - 'name' => 'limit',
136 - 'value' => $this->limit ) );
137 - $form .= wfElement( 'input', array(
138 - 'type' => 'submit',
139 - 'name' => 'submit',
140 - 'id' => 'submit',
141 - 'value' => wfMsg( 'allpagessubmit' ) ) );
142 - $form .= wfCloseElement( 'form' );
143 - return( $form );
 131+ $self = Title::makeTitle( NS_SPECIAL, $this->getName() );
 132+ $form = wfOpenElement( 'form', array( 'method' => 'post', 'action' => $self->getLocalUrl() ) );
 133+ $form .= '<table><tr><td align="right">' . wfMsgHtml( 'namespace' ) . '</td>';
 134+ $form .= '<td>' . HtmlNamespaceSelector( $this->namespace ) . '</td><tr>';
 135+ $form .= '<tr><td align="right">' . wfMsgHtml( 'newpages-username' ) . '</td>';
 136+ $form .= '<td>' . wfInput( 'username', 30, $this->username ) . '</td></tr>';
 137+ $form .= '<tr><td></td><td>' . wfSubmitButton( wfMsg( 'allpagessubmit' ) ) . '</td></tr></table>';
 138+ $form .= wfHidden( 'offset', $this->offset ) . wfHidden( 'limit', $this->limit ) . '</form>';
 139+ return $form;
144140 }
145141
146142 /**
@@ -148,7 +144,7 @@
149145 * @return array
150146 */
151147 function linkParameters() {
152 - return( array( 'namespace' => $this->namespace ) );
 148+ return( array( 'namespace' => $this->namespace, 'username' => $this->username ) );
153149 }
154150
155151 }
@@ -161,6 +157,7 @@
162158
163159 list( $limit, $offset ) = wfCheckLimits();
164160 $namespace = NS_MAIN;
 161+ $username = '';
165162
166163 if ( $par ) {
167164 $bits = preg_split( '/\s*,\s*/', trim( $par ) );
@@ -184,12 +181,14 @@
185182 } else {
186183 if( $ns = $wgRequest->getInt( 'namespace', 0 ) )
187184 $namespace = $ns;
 185+ if( $un = $wgRequest->getText( 'username' ) )
 186+ $username = $un;
188187 }
189188
190189 if ( ! isset( $shownavigation ) )
191190 $shownavigation = ! $specialPage->including();
192191
193 - $npp = new NewPagesPage( $namespace );
 192+ $npp = new NewPagesPage( $namespace, $username );
194193
195194 if ( ! $npp->doFeed( $wgRequest->getVal( 'feed' ), $limit ) )
196195 $npp->doQuery( $offset, $limit, $shownavigation );
Index: branches/snapshot-work/includes/MagicWord.php
@@ -196,7 +196,7 @@
197197 * Factory: creates an object representing an ID
198198 * @static
199199 */
200 - function &get( $id ) {
 200+ static function &get( $id ) {
201201 global $wgMagicWords;
202202
203203 if ( !is_array( $wgMagicWords ) ) {
Index: branches/snapshot-work/includes/Title.php
@@ -108,7 +108,7 @@
109109 * @static
110110 * @access public
111111 */
112 - function newFromText( $text, $defaultNamespace = NS_MAIN ) {
 112+ public static function newFromText( $text, $defaultNamespace = NS_MAIN ) {
113113 $fname = 'Title::newFromText';
114114
115115 if( is_object( $text ) ) {
@@ -233,7 +233,7 @@
234234 * @static
235235 * @access public
236236 */
237 - function &makeTitle( $ns, $title ) {
 237+ public static function &makeTitle( $ns, $title ) {
238238 $t =& new Title();
239239 $t->mInterwiki = '';
240240 $t->mFragment = '';
@@ -256,7 +256,7 @@
257257 * @static
258258 * @access public
259259 */
260 - function makeTitleSafe( $ns, $title ) {
 260+ public static function makeTitleSafe( $ns, $title ) {
261261 $t = new Title();
262262 $t->mDbkeyform = Title::makeName( $ns, $title );
263263 if( $t->secureAndSplit() ) {
@@ -273,7 +273,7 @@
274274 * @return Title the new object
275275 * @access public
276276 */
277 - function newMainPage() {
 277+ public static function newMainPage() {
278278 return Title::newFromText( wfMsgForContent( 'mainpage' ) );
279279 }
280280
@@ -285,7 +285,7 @@
286286 * @static
287287 * @access public
288288 */
289 - function newFromRedirect( $text ) {
 289+ public static function newFromRedirect( $text ) {
290290 $mwRedir = MagicWord::get( MAG_REDIRECT );
291291 $rt = NULL;
292292 if ( $mwRedir->matchStart( $text ) ) {
@@ -336,7 +336,7 @@
337337 * @static
338338 * @access public
339339 */
340 - function legalChars() {
 340+ public static function legalChars() {
341341 global $wgLegalTitleChars;
342342 return $wgLegalTitleChars;
343343 }
@@ -376,7 +376,7 @@
377377 * @param string $title the DB key form the title
378378 * @return string the prefixed form of the title
379379 */
380 - /* static */ function makeName( $ns, $title ) {
 380+ public static function makeName( $ns, $title ) {
381381 global $wgContLang;
382382
383383 $n = $wgContLang->getNsText( $ns );
Index: branches/snapshot-work/includes/RecentChange.php
@@ -243,9 +243,14 @@
244244 return( $rc->mAttribs['rc_id'] );
245245 }
246246
247 - # Makes an entry in the database corresponding to page creation
248 - # Note: the title object must be loaded with the new id using resetArticleID()
249 - /*static*/ function notifyNew( $timestamp, &$title, $minor, &$user, $comment, $bot = "default",
 247+ /**
 248+ * Makes an entry in the database corresponding to page creation
 249+ * Note: the title object must be loaded with the new id using resetArticleID()
 250+ * @todo Document parameters and return
 251+ * @public
 252+ * @static
 253+ */
 254+ public static function notifyNew( $timestamp, &$title, $minor, &$user, $comment, $bot = "default",
250255 $ip='', $size = 0, $newId = 0 )
251256 {
252257 if ( !$ip ) {
Index: branches/snapshot-work/includes/Namespace.php
@@ -65,7 +65,7 @@
6666 * Check if the give namespace is a talk page
6767 * @return bool
6868 */
69 - function isTalk( $index ) {
 69+ static function isTalk( $index ) {
7070 return ($index > NS_MAIN) // Special namespaces are negative
7171 && ($index % 2); // Talk namespaces are odd-numbered
7272 }
Index: branches/snapshot-work/includes/SpecialUnlockdb.php
@@ -11,10 +11,11 @@
1212 function wfSpecialUnlockdb() {
1313 global $wgUser, $wgOut, $wgRequest;
1414
15 - if ( ! $wgUser->isAllowed('siteadmin') ) {
16 - $wgOut->developerRequired();
 15+ if( !$wgUser->isAllowed( 'siteadmin' ) ) {
 16+ $wgOut->permissionRequired( 'siteadmin' );
1717 return;
1818 }
 19+
1920 $action = $wgRequest->getVal( 'action' );
2021 $f = new DBUnlockForm();
2122
Index: branches/snapshot-work/includes/Linker.php
@@ -1081,7 +1081,7 @@
10821082 *
10831083 * @static
10841084 */
1085 - function splitTrail( $trail ) {
 1085+ static function splitTrail( $trail ) {
10861086 static $regex = false;
10871087 if ( $regex === false ) {
10881088 global $wgContLang;
Index: branches/snapshot-work/includes/Block.php
@@ -24,7 +24,7 @@
2525 const EB_FOR_UPDATE = 2;
2626 const EB_RANGE_ONLY = 4;
2727
28 - function Block( $address = '', $user = '', $by = 0, $reason = '',
 28+ function Block( $address = '', $user = 0, $by = 0, $reason = '',
2929 $timestamp = '' , $auto = 0, $expiry = '', $anonOnly = 0, $createAccount = 0 )
3030 {
3131 $this->mId = 0;
@@ -339,6 +339,12 @@
340340 $dbw =& wfGetDB( DB_MASTER );
341341 $dbw->begin();
342342
 343+ # Unset ipb_anon_only and ipb_create_account for user blocks, makes no sense
 344+ if ( $this->mUser ) {
 345+ $this->mAnonOnly = 0;
 346+ $this->mCreateAccount = 0;
 347+ }
 348+
343349 # Don't collide with expired blocks
344350 Block::purgeExpired();
345351
Index: branches/snapshot-work/includes/Parser.php
@@ -1325,7 +1325,7 @@
13261326 * the URL differently; as a workaround, just use the output for
13271327 * statistical records, not for actual linking/output.
13281328 */
1329 - function replaceUnusualEscapes( $url ) {
 1329+ static function replaceUnusualEscapes( $url ) {
13301330 return preg_replace_callback( '/%[0-9A-Fa-f]{2}/',
13311331 array( 'Parser', 'replaceUnusualEscapesCallback' ), $url );
13321332 }
@@ -1336,7 +1336,7 @@
13371337 * @static
13381338 * @private
13391339 */
1340 - function replaceUnusualEscapesCallback( $matches ) {
 1340+ private static function replaceUnusualEscapesCallback( $matches ) {
13411341 $char = urldecode( $matches[0] );
13421342 $ord = ord( $char );
13431343 // Is it an unsafe or HTTP reserved character according to RFC 1738?
@@ -4573,7 +4573,7 @@
45744574 * Get parser options
45754575 * @static
45764576 */
4577 - function newFromUser( &$user ) {
 4577+ static function newFromUser( &$user ) {
45784578 return new ParserOptions( $user );
45794579 }
45804580
Index: branches/snapshot-work/includes/SpecialPage.php
@@ -313,7 +313,7 @@
314314 * @param $title a title object
315315 * @param $including output is being captured for use in {{special:whatever}}
316316 */
317 - function executePath( &$title, $including = false ) {
 317+ static function executePath( &$title, $including = false ) {
318318 global $wgOut, $wgTitle;
319319 $fname = 'SpecialPage::executePath';
320320 wfProfileIn( $fname );
Index: branches/snapshot-work/includes/ParserCache.php
@@ -13,7 +13,7 @@
1414 /**
1515 * Get an instance of this object
1616 */
17 - function &singleton() {
 17+ public static function &singleton() {
1818 static $instance;
1919 if ( !isset( $instance ) ) {
2020 global $parserMemc;
Index: branches/snapshot-work/includes/LinkCache.php
@@ -21,7 +21,7 @@
2222 /**
2323 * Get an instance of this class
2424 */
25 - function &singleton() {
 25+ static function &singleton() {
2626 static $instance;
2727 if ( !isset( $instance ) ) {
2828 $instance = new LinkCache;
Index: branches/snapshot-work/includes/Revision.php
@@ -25,7 +25,7 @@
2626 * @static
2727 * @access public
2828 */
29 - function newFromId( $id ) {
 29+ public static function newFromId( $id ) {
3030 return Revision::newFromConds(
3131 array( 'page_id=rev_page',
3232 'rev_id' => intval( $id ) ) );
@@ -42,7 +42,7 @@
4343 * @access public
4444 * @static
4545 */
46 - function newFromTitle( &$title, $id = 0 ) {
 46+ public static function newFromTitle( &$title, $id = 0 ) {
4747 if( $id ) {
4848 $matchId = intval( $id );
4949 } else {
@@ -66,7 +66,7 @@
6767 * @return Revision
6868 * @access public
6969 */
70 - function loadFromPageId( &$db, $pageid, $id = 0 ) {
 70+ public static function loadFromPageId( &$db, $pageid, $id = 0 ) {
7171 $conds=array('page_id=rev_page','rev_page'=>intval( $pageid ), 'page_id'=>intval( $pageid ));
7272 if( $id ) {
7373 $conds['rev_id']=intval($id);
@@ -130,7 +130,7 @@
131131 * @static
132132 * @access private
133133 */
134 - function newFromConds( $conditions ) {
 134+ private static function newFromConds( $conditions ) {
135135 $db =& wfGetDB( DB_SLAVE );
136136 $row = Revision::loadFromConds( $db, $conditions );
137137 if( is_null( $row ) ) {
@@ -150,7 +150,7 @@
151151 * @static
152152 * @access private
153153 */
154 - function loadFromConds( &$db, $conditions ) {
 154+ private static function loadFromConds( &$db, $conditions ) {
155155 $res = Revision::fetchFromConds( $db, $conditions );
156156 if( $res ) {
157157 $row = $res->fetchObject();
@@ -192,7 +192,7 @@
193193 * @static
194194 * @access public
195195 */
196 - function fetchRevision( &$title ) {
 196+ public static function fetchRevision( &$title ) {
197197 return Revision::fetchFromConds(
198198 wfGetDB( DB_SLAVE ),
199199 array( 'rev_id=page_latest',
@@ -212,7 +212,7 @@
213213 * @static
214214 * @access private
215215 */
216 - function fetchFromConds( &$db, $conditions ) {
 216+ private static function fetchFromConds( &$db, $conditions ) {
217217 $res = $db->select(
218218 array( 'page', 'revision' ),
219219 array( 'page_namespace',
Index: branches/snapshot-work/includes/Xml.php
@@ -56,8 +56,8 @@
5757 }
5858
5959 // Shortcuts
60 - function openElement( $element, $attribs = null ) { return self::element( $element, $attribs, null ); }
61 - function closeElement( $element ) { return "</$element>"; }
 60+ public static function openElement( $element, $attribs = null ) { return self::element( $element, $attribs, null ); }
 61+ public static function closeElement( $element ) { return "</$element>"; }
6262
6363 /**
6464 * Create a namespace selector
@@ -216,7 +216,7 @@
217217 * @param string $string
218218 * @return string
219219 */
220 - function escapeJsString( $string ) {
 220+ public static function escapeJsString( $string ) {
221221 // See ECMA 262 section 7.8.4 for string literal format
222222 $pairs = array(
223223 "\\" => "\\\\",
Index: branches/snapshot-work/includes/SpecialLockdb.php
@@ -11,10 +11,18 @@
1212 function wfSpecialLockdb() {
1313 global $wgUser, $wgOut, $wgRequest;
1414
15 - if ( ! $wgUser->isAllowed('siteadmin') ) {
16 - $wgOut->developerRequired();
 15+ if( !$wgUser->isAllowed( 'siteadmin' ) ) {
 16+ $wgOut->permissionRequired( 'siteadmin' );
1717 return;
1818 }
 19+
 20+ # If the lock file isn't writable, we can do sweet bugger all
 21+ global $wgReadOnlyFile;
 22+ if( !is_writable( dirname( $wgReadOnlyFile ) ) ) {
 23+ DBLockForm::notWritable();
 24+ return;
 25+ }
 26+
1927 $action = $wgRequest->getVal( 'action' );
2028 $f = new DBLockForm();
2129
@@ -91,10 +99,13 @@
92100 $this->showForm( wfMsg( 'locknoconfirm' ) );
93101 return;
94102 }
95 - $fp = fopen( $wgReadOnlyFile, 'w' );
 103+ $fp = @fopen( $wgReadOnlyFile, 'w' );
96104
97105 if ( false === $fp ) {
98 - $wgOut->showFileNotFoundError( $wgReadOnlyFile );
 106+ # This used to show a file not found error, but the likeliest reason for fopen()
 107+ # to fail at this point is insufficient permission to write to the file...good old
 108+ # is_writable() is plain wrong in some cases, it seems...
 109+ $this->notWritable();
99110 return;
100111 }
101112 fwrite( $fp, $this->reason );
@@ -113,6 +124,12 @@
114125 $wgOut->setSubtitle( wfMsg( 'lockdbsuccesssub' ) );
115126 $wgOut->addWikiText( wfMsg( 'lockdbsuccesstext' ) );
116127 }
 128+
 129+ function notWritable() {
 130+ global $wgOut;
 131+ $wgOut->errorPage( 'lockdb', 'lockfilenotwritable' );
 132+ }
 133+
117134 }
118135
119136 ?>
Index: branches/snapshot-work/includes/Skin.php
@@ -33,7 +33,7 @@
3434 * @return array of strings
3535 * @static
3636 */
37 - function &getSkinNames() {
 37+ static function &getSkinNames() {
3838 global $wgValidSkinNames;
3939 static $skinsInitialised = false;
4040 if ( !$skinsInitialised ) {
@@ -68,7 +68,7 @@
6969 * @return string
7070 * @static
7171 */
72 - function normalizeKey( $key ) {
 72+ static function normalizeKey( $key ) {
7373 global $wgDefaultSkin;
7474 $skinNames = Skin::getSkinNames();
7575
@@ -107,7 +107,7 @@
108108 * @return Skin
109109 * @static
110110 */
111 - function &newFromKey( $key ) {
 111+ static function &newFromKey( $key ) {
112112 global $wgStyleDirectory;
113113
114114 $key = Skin::normalizeKey( $key );
Index: branches/snapshot-work/includes/LoadBalancer.php
@@ -50,7 +50,7 @@
5151 $this->mAllowLag = false;
5252 }
5353
54 - function newFromParams( $servers, $failFunction = false, $waitTimeout = 10 )
 54+ static function newFromParams( $servers, $failFunction = false, $waitTimeout = 10 )
5555 {
5656 $lb = new LoadBalancer;
5757 $lb->initialise( $servers, $failFunction, $waitTimeout );
Index: branches/snapshot-work/includes/Math.php
@@ -259,7 +259,7 @@
260260 return $path;
261261 }
262262
263 - function renderMath( $tex ) {
 263+ public static function renderMath( $tex ) {
264264 global $wgUser;
265265 $math = new MathRenderer( $tex );
266266 $math->setOutputMode( $wgUser->getOption('math'));
Index: branches/snapshot-work/RELEASE-NOTES
@@ -41,15 +41,22 @@
4242 attempts to create an account. Fixed inefficiency of Special:Ipblocklist in
4343 the presence of large numbers of blocks; added indexes and implemented an
4444 indexed pager.
 45+* (bug 6448) Allow filtering of Special:Newpages according to username
 46+* (bug 6618) Improve permissions/error detection in Special:Lockdb
 47+* Quick hack for extension testing: parser test doesn't create new message
 48+ cache object.
4549
 50+
4651 == Languages updated ==
4752
4853 * Albanian (sq)
 54+* Brazilian Portuguese (pt-br)
4955 * Catalan (ca)
5056 * English (en)
5157 * German (de)
5258 * Hebrew (he)
5359 * Hungarian (hu)
 60+* Indonesian (id)
5461 * Russian (ru)
5562 * Telugu (te)
5663
Index: branches/snapshot-work/languages/MessagesDe.php
@@ -483,6 +483,9 @@
484484 'nocreatetext' => 'Der Server hat das Erstellen neuer Seiten eingeschränkt.
485485
486486 Sie können bestehende Seiten ändern oder sich [[{{ns:special}}:Userlogin|anmelden]].',
 487+'cantcreateaccounttitle' => 'Benutzerkonto kann nicht erstellt werden',
 488+'cantcreateaccounttext' => 'Die Erstellung eines Benutzerkontos von dieser IP-Adresse (<b>$1</b>) wurde gesperrt.
 489+Dies geschah vermutlich auf Grund von wiederholtem Vandalismus von Ihrer Bildungseinrichtung oder anderen Benutzern Ihres Internet-Service-Provider.',
487490
488491 # History pages
489492 #
@@ -817,6 +820,7 @@
818821 'recentchangeslinked' => 'Änderungen an verlinkten Seiten',
819822 'rclsub' => '(auf Artikel von „$1“)',
820823 "newpages" => "Neue Artikel",
 824+'newpages-username' => 'Benutzername:',
821825 'ancientpages' => 'Lange unbearbeitete Artikel',
822826 "movethispage" => "Artikel verschieben",
823827 'unusedimagestext' => '<p>Bitte beachten Sie, dass andere Wikis möglicherweise einige dieser Dateien verwenden.',
@@ -1068,6 +1072,8 @@
10691073 "ipaddress" => "IP-Adresse",
10701074 'ipadressorusername' => 'IP-Adresse oder Benutzername',
10711075 'ipbreason' => 'Begründung',
 1076+'ipbanononly' => 'Nur anonyme Benutzer sperren',
 1077+'ipbcreateaccount' => 'Erstellung von Benutzerkonten verhindern',
10721078 'ipbsubmit' => 'Benutzer blockieren',
10731079 'ipbother' => 'Andere Dauer',
10741080 'ipboptions' => '1 Stunde:1 hour,2 Stunden:2 hours,6 Stunden:6 hours,1 Tag:1 day,3 Tage:3 days,1 Woche:1 week,2 Wochen:2 weeks,1 Monat:1 month,3 Monate:3 months,1 Jahr:1 year,Unbeschränkt:indefinite',
@@ -1086,6 +1092,8 @@
10871093 "blocklistline" => "$1, $2 blockierte $3 ($4)",
10881094 'infiniteblock' => 'unbegrenzt',
10891095 'expiringblock' => 'erlischt $1',
 1096+'anononlyblock' => 'nur Anonyme',
 1097+'createaccountblock' => 'Erstellung von Benutzerkonten gesperrt',
10901098 "blocklink" => "blockieren",
10911099 "unblocklink" => "freigeben",
10921100 "contribslink" => "Beiträge",
@@ -1107,6 +1115,7 @@
11081116 "lockdbsuccesstext" => "Die {{SITENAME}}-Datenbank wurde gesperrt.
11091117 <br />Bitte geben Sie die Datenbank wieder frei, sobald die Wartung abgeschlossen ist.",
11101118 "unlockdbsuccesstext" => "Die {{SITENAME}}-Datenbank wurde freigegeben.",
 1119+'lockfilenotwritable' => 'Die Datenbank-Sperrdatei ist nicht beschreibbar. Zum Sperren oder Freigeben der Datenbank muss diese für den Webserver beschreibbar sein.',
11111120
11121121 # User levels special page
11131122 #
@@ -1304,6 +1313,7 @@
13051314 'unblocklogentry' => 'Blockade von [[{{ns:user}}:$1]] aufgehoben',
13061315 "range_block_disabled" => "Die Möglichkeit, ganze Adressräume zu sperren, ist nicht aktiviert.",
13071316 "ipb_expiry_invalid" => "Die angegebeben Ablaufzeit ist ungültig.",
 1317+'ipb_already_blocked' => '„$1“ ist bereits gesperrt',
13081318 "ip_range_invalid" => "Ungültiger IP-Addressbereich.",
13091319 "confirmprotect" => "Sperrung bestätigen",
13101320 'protectmoveonly' => 'Nur vor dem Verschieben schützen',
@@ -1315,6 +1325,7 @@
13161326 'protect-viewtext' => 'Sie sind nicht berechtigt, den Seitenschutzstatus zu ändern. Hier ist der aktuelle Schutzstatus der Seite: [[$1]]',
13171327 'protect-default' => '(Standard)',
13181328 "proxyblocker" => "Proxyblocker",
 1329+'ipb_cant_unblock' => 'Fehler: Block ID $1 nicht gefunden. Die Sperre wurde vermutlich bereits aufgehoben.',
13191330 "proxyblockreason" => "Ihre IP-Adresse wurde gesperrt, da sie ein offener Proxy ist. Bitte kontaktieren Sie Ihren Provider oder Ihre Systemtechnik und informieren Sie sie über dieses mögliche Sicherheitsproblem.",
13201331 "proxyblocksuccess" => "Fertig.",
13211332 'sorbs' => 'SORBS DNSbl',
Index: branches/snapshot-work/languages/Messages.php
@@ -981,6 +981,7 @@
982982 'recentchangeslinked' => 'Related changes',
983983 'rclsub' => "(to pages linked from \"$1\")",
984984 'newpages' => 'New pages',
 985+'newpages-username' => 'Username:',
985986 'ancientpages' => 'Oldest pages',
986987 'intl' => 'Interlanguage links',
987988 'move' => 'Move',
@@ -1343,6 +1344,7 @@
13441345 'lockdbsuccesstext' => 'The database has been locked.
13451346 <br />Remember to remove the lock after your maintenance is complete.',
13461347 'unlockdbsuccesstext' => 'The database has been unlocked.',
 1348+'lockfilenotwritable' => 'The database lock file is not writable. To lock or unlock the database, this needs to be writable by the web server.',
13471349
13481350 # Make sysop
13491351 'makesysoptitle' => 'Make a user into a sysop',
Index: branches/snapshot-work/languages/MessagesHe.php
@@ -513,6 +513,8 @@
514514 "edittools" => "<!-- הטקסט הנכתב כאן יוצג מתחת לטפסי עריכת דפים והעלאת קבצים, ולפיכך ניתן לכתוב להציג בו תווים קשים לכתיבה, קטעים מוכנים של טקסט ועוד. -->",
515515 "nocreatetitle" => "יצירת הדפים הוגבלה",
516516 "nocreatetext" => "אתר זה מגביל את האפשרות ליצור דפים חדשים. באפשרותכם לחזור אחורה ולערוך דף קיים, או [[{{ns:special}}:Userlogin|להיכנס לחשבון]].",
 517+"cantcreateaccounttitle" => "לא ניתן ליצור את החשבון",
 518+"cantcreateaccounttext" => "אפשרות יצירת החשבונות מכתובת ה־IP הזו (<b>$1</b>) נחסמה, כנראה עקב השחתות מתמשכות מבית־הספר או ספק האינטרנט שלך.",
517519
518520 # History pages
519521 "revhistory" => "היסטוריית שינויים",
@@ -886,6 +888,7 @@
887889 "recentchangeslinked" => "שינויים בדפים המקושרים",
888890 "rclsub" => '(לדפים המקושרים מהדף "$1")',
889891 "newpages" => "דפים חדשים",
 892+"newpages-username" => "שם משתמש:",
890893 "ancientpages" => "דפים מוזנחים",
891894 "intl" => "קישורים בינלשוניים",
892895 "move" => "העבר",
@@ -1140,9 +1143,11 @@
11411144 "ipadressorusername" => "כתובת IP או שם משתמש",
11421145 "ipbexpiry" => "פקיעה",
11431146 "ipbreason" => "סיבה",
 1147+"ipbanononly" => "חסום משתמשים אנונימיים בלבד",
 1148+"ipbcreateaccount" => "חסום יצירת חשבונות",
11441149 "ipbsubmit" => "חסום משתמש זה",
11451150 "ipbother" => "זמן אחר",
1146 -"ipboptions" => "5 דקות:5 minutes,10 דקות:10 minutes,חצי שעה:30 minutes,שעה:1 hours,שעתיים:2 hours,יום:1 day,שלושה ימים:3 days,שבוע:1 week,שבועיים:2 weeks,חודש:1 month,שלושה חודשים:3 months,חצי שנה:6 months,שנה:1 year,לצמיתות:infinite",
 1151+"ipboptions" => "שעתיים:2 hours,יום:1 day,שלושה ימים:3 days,שבוע:1 week,שבועיים:2 weeks,חודש:1 month,שלושה חודשים:3 months,חצי שנה:6 months,שנה:1 year,לצמיתות:infinite",
11471152 "ipbotheroption" => "אחר",
11481153 "badipaddress" => "משתמש או כתובת IP שגויים.",
11491154 "blockipsuccesssub" => "החסימה הושלמה בהצלחה",
@@ -1157,6 +1162,8 @@
11581163 "blocklistline" => '$1 $2 חסם את $3 ($4)',
11591164 "infiniteblock" => "לצמיתות",
11601165 "expiringblock" => "פוקע $1",
 1166+"anononlyblock" => "משתמשים אנונימיים בלבד",
 1167+"createaccountblock" => "יצירת חשבונות נחסמה",
11611168 "ipblocklistempty" => "רשימת המשתמשים החסומים ריקה.",
11621169 "blocklink" => "חסום",
11631170 "unblocklink" => "שחרר חסימה",
@@ -1170,7 +1177,9 @@
11711178 "unblocklogentry" => "שיחרר את [[$1]]",
11721179 "range_block_disabled" => "היכולת לחסום טווח כתובות איננה פעילה.",
11731180 "ipb_expiry_invalid" => "זמן פקיעת חסימה בלתי חוקי",
 1181+"ipb_already_blocked" => 'המשתמש "$1" כבר נחסם',
11741182 "ip_range_invalid" => "טווח IP שגוי.",
 1183+"ipb_cant_unblock" => "שגיאה: חסימה מספר $1 לא נמצאה. ייתכן שהיא כבר שוחררה.",
11751184 "proxyblocker" => "חוסם פרוקסי",
11761185 "proxyblockreason" => "כתובת ה־IP שלכם נחסמה משום שהיא כתובת פרוקסי פתוחה. אנא צרו קשר עם ספק האינטרנט שלכם והודיעו לו על בעיית האבטחה החמורה הזו.",
11771186 "proxyblocksuccess" => "בוצע.",
@@ -1197,6 +1206,7 @@
11981207
11991208 זכרו לשחרר את הנעילה לאחר שפעולת התחזוקה הסתיימה.",
12001209 "unlockdbsuccesstext" => "שוחררה הנעילה של בסיס הנתונים",
 1210+"lockfilenotwritable" => "קובץ נעילת מסד הנתונים אינו ניתן לכתיבה. כדי שאפשר יהיה לנעול את מסד הנתונים או לבטל את נעילתו, שרת האינטרנט צריך לקבל הרשאות לכתוב אליו.",
12011211
12021212 # Make sysop
12031213 "makesysoptitle" => "הפוך משתמש למפעיל מערכת",
Index: branches/snapshot-work/languages/MessagesId.php
@@ -454,6 +454,9 @@
455455 'edittools' => '<!-- Teks di sini akan dimunculkan dibawah isian suntingan dan pemuatan.-->',
456456 'nocreatetitle' => 'Pembuatan halaman baru dibatasi',
457457 'nocreatetext' => 'Situs ini membatasi kemampuan membuat halaman baru. Anda dapat kembali dan menyunting halaman yang telah ada, atau silakan [[{{ns:special}}:Userlogin|masuk log atau mendaftar]]',
 458+'cantcreateaccounttitle' => 'Akun tak dapat dibuat',
 459+'cantcreateaccounttext' => 'Pembuatan akun dari alamat IP ini (<b>$1</b>) diblokir.
 460+Hal ini mungkin disebabkan adanya vandalisme berulang yang berasal dari sekolah atau penyedia jasa Internet Anda.',
458461
459462 # History pages
460463 #
@@ -821,6 +824,7 @@
822825 "recentchangeslinked" => "Perubahan terkait",
823826 "rclsub" => "(untuk halaman yang berpaut dari \"$1\")",
824827 "newpages" => "Halaman baru",
 828+'newpages-username' => 'Nama pengguna:',
825829 "ancientpages" => "Artikel tertua",
826830 "intl" => "Pranala antarbahasa",
827831 'move' => 'Pindahkan',
@@ -1071,6 +1075,8 @@
10721076 'ipadressorusername' => 'Alamat IP atau nama pengguna',
10731077 "ipbexpiry" => "Kadaluwarsa",
10741078 "ipbreason" => "Alasan",
 1079+'ipbanononly' => 'Hanya blokir pengguna anonim',
 1080+'ipbcreateaccount' => 'Cegah pembuatan akun',
10751081 "ipbsubmit" => "Kirimkan",
10761082 'ipbother' => 'Waktu lain',
10771083 'ipboptions' => '2 jam:2 hours,1 hari:1 day,3 hari:3 days,1 minggu:1 week,2 minggu:2 weeks,1 bulan:1 month,3 bulan:3 months,6 bulan:6 months,1 tahun:1 year,selamanya:infinite',
@@ -1086,6 +1092,8 @@
10871093 "blocklistline" => "$1, $2 memblokir $3 ($4)",
10881094 'infiniteblock' => 'tak terbatas',
10891095 'expiringblock' => 'kadaluwarsa $1',
 1096+'anononlyblock' => 'hanya anon',
 1097+'createaccountblock' => 'pembuatan akun diblokir',
10901098 'ipblocklistempty' => 'Daftar pemblokiran kosong.',
10911099 "blocklink" => "blokir",
10921100 "unblocklink" => "hilangkan blokir",
@@ -1097,8 +1105,10 @@
10981106 "unblocklogentry" => 'menghilangkan blokir "$1"',
10991107 "range_block_disabled" => "Kemampuan pengurus dalam membuat blokir blok IP dimatikan.",
11001108 "ipb_expiry_invalid" => "Waktu kadaluwarsa tidak sah.",
 1109+'ipb_already_blocked' => '"$1" telah diblokir',
11011110 "ip_range_invalid" => "Blok IP tidak sah.",
11021111 "proxyblocker" => "Pemblokir proxy",
 1112+'ipb_cant_unblock' => 'Kesalahan: Blokir dengan ID $1 tidak ditemukan. Blokir tersebut kemungkinan telah dibuka.',
11031113 "proxyblockreason" => "Alamat IP Anda telah diblokir karena alamat IP Anda adalah proxy terbuka. Silakan hubungi penyedia jasa internet Anda atau dukungan teknis dan beritahukan mereka masalah keamanan serius ini.",
11041114 "proxyblocksuccess" => "Selesai.",
11051115 'sorbs' => 'SORBS DNSBL',
@@ -1142,6 +1152,7 @@
11431153 "unlockdbsuccesssub" => "Pembukaan kunci basis data berhasil",
11441154 "lockdbsuccesstext" => "Basis data telah dikunci. <br />Pastikan Anda membuka kuncinya setelah pemeliharaan selesai.",
11451155 "unlockdbsuccesstext" => "Kunci basis data telah dibuka.",
 1156+'lockfilenotwritable' => 'Berkas kunci basis data tidak dapat ditulis. Untuk mengunci atau membuka basis data, berkas ini harus dapat ditulis oleh server web.',
11461157
11471158 # Move page
11481159 #
@@ -1216,7 +1227,7 @@
12171228 "thumbnail-more" => "Perbesar",
12181229 "missingimage" => "<strong>Gambar hilang</strong><br /><em>$1</em>",
12191230 'filemissing' => 'Berkas hilang',
1220 -'thumbnail_error' => 'Kesalahan sewaktu pembuatan gambar kecil (<em>thumbnail</em>): $1',
 1231+'thumbnail_error' => 'Kesalahan sewaktu pembuatan gambar kecil (thumbnail): $1',
12211232
12221233 # Special:Import
12231234 "import" => "Impor halaman",
Index: branches/snapshot-work/languages/MessagesPt_br.php
@@ -159,7 +159,7 @@
160160 com a função\"$2\".
161161 MySQL retornou o erro \"$3: $4\".",
162162 "noconnect" => "Desculpe! O wiki está passando por algumas
163 -dificuldades técnicas, e não pode contatar o servidor de bando de dados.",
 163+dificuldades técnicas, e não pode contactar o servidor de bando de dados.",
164164 "nodb" => "Não foi possível selecionar o banco de dados $1",
165165 "cachederror" => "O que segue é uma cópia em cache da página
166166 solicitada, e pode não estar atualizada.",
@@ -188,8 +188,8 @@
189189 "badarticleerror" => "Esta acção não pode ser performada nesta página.",
190190 "cannotdelete" => "Não foi possível excluir página ou imagem especificada. (Ela já pode ter sido deletada por alguém.)",
191191 "badtitle" => "Título ruim",
192 -"badtitletext" => "O título de pagina requisitado era inválido, vazio, ou
193 -uma ligação incorreta de inter-linguagem ou título inter-wiki .",
 192+"badtitletext" => "O título de página requisitado era inválido, vazio, ou
 193+um link incorreto de inter-linguagem ou título inter-wiki .",
194194 "perfdisabled" => "Desculpe! Esta opção foi temporariamente desabilitada
195195 porque tornava o banco de dados lento demais a ponto de impossibilitar o wiki.",
196196 "perfdisabledsub" => "Aqui está uma cópia salva de $1:",
@@ -264,16 +264,16 @@
265265 "accmailtext" => "A senha de '$1' foi enviada para $2.",
266266 "newarticle" => "(Novo)",
267267 "newarticletext" =>
268 -"Você seguiu um link para um artigo que não existe mais.
269 -Para criar a página, começe escrevendo na caixa a baixo
270 -(veja [[{{ns:4}}:Ajuda| a página de ajuda]] para mais informações).
271 -Se você chegou aqui por engano, apenas clique no botão '''volta''' do seu navegador.",
 268+"Você seguiu um link para um artigo que não existe.
 269+Para criá-lo, começe escrevendo na caixa abaixo
 270+(veja [[{{ns:4}}:Ajuda|a página de ajuda]] para mais informações).
 271+Se você chegou aqui por engano, apenas clique no botão '''voltar''' do seu navegador.",
272272
273 -"anontalkpagetext" => "---- ''Esta é a página de discussão para um usuário anônimo que não criou uma conta ainda ou que não a usa. Então nós temos que usar o endereço numérico de IP para identificá-lo(la). Um endereço de IP pode ser compartilhado por vários usuários. Se você é um usuário anônimo e acha irrelevante que os comentários sejam direcionados a você, por favor [[Especial:Userlogin|crie uma conta ou autentifique-se]] para evitar futuras confusões com outros usuários anônimos.'' ",
 273+"anontalkpagetext" => "---- ''Esta é a página de discussão para um usuário anônimo que não criou uma conta ainda ou que não a usa. Então nós temos que usar o endereço numérico de IP para identificá-lo. Um endereço de IP pode ser compartilhado por vários usuários. Se você é um usuário anônimo e acha irrelevante que os comentários sejam direcionados a você, por favor [[Especial:Userlogin|crie uma conta ou autentique-se]] para evitar futuras confusões com outros usuários anônimos.'' ",
274274 "noarticletext" => "(Não há atualmente nenhum texto nesta página)",
275275 "updated" => "(Atualizado)",
276276 "note" => "<strong>Nota:</strong> ",
277 -"previewnote" => "Lembre-se que isto é apenas uma previsão, e não foi ainda salvo!",
 277+"previewnote" => "Lembre-se que isto é apenas uma previsão. O conteúdo ainda não foi salvo!",
278278 "previewconflict" => "Esta previsão reflete o texto que está na área de edição acima e como ele aparecerá se você escolher salvar.",
279279 "editing" => "Editando $1",
280280 "editingsection" => "Editando $1 (seção)",
@@ -281,7 +281,7 @@
282282 "editconflict" => "Conflito de edição: $1",
283283 "explainconflict" => "Alguém mudou a página enquanto você a estava editando.
284284 A área de texto acima mostra o texto original.
285 -Suas mudanças são mostradas na área a baixo.
 285+Suas mudanças são mostradas na área abaixo.
286286 Você terá que mesclar suas modificações no texto existente.
287287 <b>SOMENTE</b> o texto na área acima será salvo quando você pressionar \"Salvar página\".<br />",
288288 "yourtext" => "Seu texto",
@@ -296,9 +296,9 @@
297297 <strong>NÃO ENVIE TRABALHO SOB COPYRIGHT SEM PERMISSÃO!</strong>",*/
298298 "longpagewarning" => "<strong>CUIDADO: Esta página tem $1 kilobytes ; alguns browsers podem ter problemas ao editar páginas maiores que 32kb.
299299 Por favor considere quebrar a página em sessões menores.</strong>",
300 -"readonlywarning" => "<strong>CUIDADO: O banco de dados está sendo bloqueado para manutenção,
301 -você não está habilitado a salvar suas edições. Você pode copiar e colar o texto em um arquivo de texto e salvá-lo em seu computador para adicioná-lo mais tarde.</strong>",
302 -"protectedpagewarning" => "<strong>CUIDADO: Está página foi bloqueada então apenas os usuários com privilégios de sysop podem editá-la. Certifique-se de que você está seguindo o [[Project:Guia_de_páginas_protegidas|guia de páginas protegidas]].</strong>",
 300+"readonlywarning" => "<strong>CUIDADO: O banco de dados está sendo bloqueado para manutenção.
 301+No momento não é possível salvar suas edições. Você pode copiar e colar o texto em um arquivo de texto e salvá-lo em seu computador para adicioná-lo ao wiki mais tarde.</strong>",
 302+"protectedpagewarning" => "<strong>CUIDADO: Apenas os usuários com privilégios de sysop podem editar esta página pois ela foi bloqueada. Certifique-se de que você está seguindo o [[Project:Guia_de_páginas_protegidas|guia de páginas protegidas]].</strong>",
303303
304304 # History pages
305305 #
@@ -333,7 +333,7 @@
334334 "badquery" => "Linha de busca incorretamente formada",
335335 "badquerytext" => "Nós não pudemos processar seu pedido de busca.
336336 Isto acoenteceu provavelmente porque você tentou procurar uma palavra de menos que três letras, coisa que o software ainda não consegue realizar. Isto também pode ter ocorrido porque você digitou incorretamente a expressão, por
337 -exemplo \"peixes <strong>and and</strong> scales\".
 337+exemplo: \"peixes <strong>and and</strong> scales\".
338338 Por favor realize ouro pedido de busca.",
339339 "matchtotals" => "A pesquisa \"$1\" resultou $2 títulos de artigos
340340 e $3 artigos com o texto procurado.",
@@ -366,7 +366,7 @@
367367 "qbsettings" => "Configurações da Barra Rápida",
368368 "changepassword" => "Mudar senha",
369369 "skin" => "Aparência(Skin)",
370 -"math" => "Rendering math",
 370+"math" => "Renderização matemática",
371371 "dateformat" => "Formato da Data",
372372 "math_failure" => "Falhou ao checar gramática(parse)",
373373 "math_unknown_error" => "erro desconhecido",
@@ -374,11 +374,11 @@
375375 "math_lexing_error" => "erro léxico",
376376 "math_syntax_error" => "erro de síntaxe",
377377 "saveprefs" => "Salvar preferências",
378 -"resetprefs" => "Reconfigurar preferências",
 378+"resetprefs" => "Redefinir preferências",
379379 "oldpassword" => "Senha antiga",
380380 "newpassword" => "Nova senha",
381381 "retypenew" => "Redigite a nova senha",
382 -"textboxsize" => "Tamanho da Caixa de texto",
 382+"textboxsize" => "Tamanho da caixa de texto",
383383 "rows" => "Linhas",
384384 "columns" => "Colunas",
385385 "searchresultshead" => "Configurar resultados de pesquisas",
@@ -554,7 +554,7 @@
555555 "wantedpages" => "Páginas procuradas",
556556 "nlinks" => "$1 links",
557557 "allpages" => "Todas as páginas",
558 -"randompage" => "Página randômica",
 558+"randompage" => "Página aleatória",
559559 "shortpages" => "Páginas Curtas",
560560 "longpages" => "Paginas Longas",
561561 "listusers" => "Lista de Usuários",
@@ -569,7 +569,7 @@
570570 "intl" => "Links interlínguas",
571571 "movethispage" => "Mover esta página",
572572 "unusedimagestext" => "<p>Por favor note que outros websites como
573 -as Wikipedias internacionais podem apontar para uma imagem com uma URL direta, e por isto pode estar aparecendo aqui mesmo estando em uso ativo.",
 573+as Wikipédias internacionais podem apontar para uma imagem com uma URL direta, e por isto pode estar aparecendo aqui mesmo estando em uso ativo.",
574574 "booksources" => "Fontes de livros",
575575 "booksourcetext" => "Segue uma lista de links para outros sites que vendem livros novos e usados , e podem ter informações adicionais sobre livros que você esteja procurando.
576576 A {{SITENAME}} não é afiliada a nenhum destes empreendimentos, e a lista não deve ser construída como apoio.",
@@ -577,14 +577,14 @@
578578
579579 # Email this user
580580 #
581 -"mailnologin" => "No send address",
 581+"mailnologin" => "Sem endereço ed envio",
582582 "mailnologintext" => "Você deve estar [[Special:Userlogin|autenticado]]
583583 e ter um e-mail válido em suas [[Special:Preferences|preferências]]
584584 para poder enviar e-mails para outros usuários.",
585585 "emailuser" => "Contactar usuário",
586586 "emailpage" => "Enviar e-mail ao usuário",
587 -"emailpagetext" => "Se este usuário disponibilizou um endereço válido de -mail em suas preferências, o formulário a seguir enviará uma mensagem única.
588 -O endereço de e-mail que você disponibilizou em suas preferências aparecerá como Remetente da mensagem, então, o usuário poderá responder a você diretamente.",
 587+"emailpagetext" => "Se este usuário disponibilizou um endereço válido de e-mail em suas preferências, o formulário a seguir enviará uma mensagem única.
 588+O endereço de e-mail que você disponibilizou em suas preferências aparecerá como remetente da mensagem, então, o usuário poderá responder a você diretamente.",
589589 "noemailtitle" => "Sem endereço de e-mail",
590590 "noemailtext" => "Este usuário não especificou um endereço de e-mail válido, ou optou por não receber mensagens de outros usuários.",
591591 "emailfrom" => "De",
@@ -602,21 +602,21 @@
603603 "nowatchlist" => "Você não está monitorando nenhum artigo.",
604604 "watchnologin" => "Não está autenticado",
605605 "watchnologintext" => "Você deve estar [[Special:Userlogin|autenticado]]
606 -para modificar sua lista de artigos interessantes.",
 606+para modificar a lista de artigos do seu interesse.",
607607 /*"addedwatch" => "Adicionados � lista",*/
608 -"addedwatchtext" => "A página \"$1\" foi adicionada a sua <a href=\"{{localurle:Special:Watchlist}}\">lista de artigos de vosso interesse</a>.
609 -Modificações futuras neste artigo e páginas Talk associadas serão listadas aqui,
610 -e a página aparecerá <b>negritada</b> na <a href=\"{{localurle:Special:Recentchanges}}\">lista de mudanças recentes</a> para que
611 -possa pegá-lo com maior facilidade.</p>
 608+"addedwatchtext" => "A página \"$1\" foi adicionada à <a href=\"{{localurle:Special:Watchlist}}\">lista de artigos do seu interesse</a>.
 609+Modificações futuras neste artigo e páginas de discussão associadas serão listadas aqui,
 610+e a página aparecerá <b>em negrito</b> na <a href=\"{{localurle:Special:Recentchanges}}\">lista de mudanças recentes</a> para que
 611+possa achá-la com maior facilidade.</p>
612612
613 -<p>Se você quiser remover futuramente o artigo da sua lista monitoramento, clique em \"Desinteressar-se\" na barra lateral.",
614 -"removedwatch" => "Removida da lista de observações",
 613+<p>Se você quiser remover futuramente o artigo da sua lista de artigos vigiados, clique em \"Desinteressar-se\" na barra lateral.",
 614+"removedwatch" => "Removida da lista de monitoramento",
615615 "removedwatchtext" => "A página \"$1\" não é mais de seu interesse e portanto foi removida de sua lista de monitoramento.",
616616 "watchthispage" => "Interessar-se por esta página",
617617 "unwatchthispage" => "Desinteressar-se",
618618 "notanarticle" => "Não é um artigo",
619619 "watchnochange" => "Nenhum dos itens monitorados foram editados no período exibido.",
620 -"watchdetails" => "($1 páginas monitoradas excluindo-se as páginas talk;
 620+"watchdetails" => "($1 páginas monitoradas excluindo-se as páginas de discussão;
621621 $2 páginas editadas desde data limite;
622622 $3...
623623 [$4 mostrar e editar a lista completa].)",
@@ -640,9 +640,9 @@
641641 "exblank" => "página estava vazia",
642642 "confirmdelete" => "Confirmar deleção",
643643 "deletesub" => "(Apagando \"$1\")",
644 -"historywarning" => "Atenção: A página que você quer deletar tem um histório: ",
 644+"historywarning" => "Atenção: A página que você quer deletar tem um histórico: ",
645645 "confirmdeletetext" => "Você está prestes a deletar permanentemente uma página ou imagem junto com todo seu histórico do banco de dados.
646 -Por favor, confirme que você realmente pretende fazer isto, que você compreende as consequências, e que você está fazendo isto em acordo com a [[{{ns:4}}:Policy| Política da Wkipedia]].",
 646+Por favor, confirme que você realmente pretende fazer isto, que você compreende as consequências, e que você está fazendo isto em acordo com a [[{{ns:4}}:Policy| Política da {{SITENAME}}]].",
647647 "actioncomplete" => "Ação efetuada com sucesso",
648648 "deletedtext" => "\"$1\" foi deletada.
649649 Veja $2 para um registro de deleções recentes.",
@@ -661,7 +661,7 @@
662662 "rollbackfailed" => "Rollback falhou",
663663 "cantrollback" => "Não foi possível reverter a edição; o último contribuidor é o único autor deste artigo.",
664664 "alreadyrolled" => "Não foi possível reverter as edições de [[$1]]
665 -por [[User:$2|$2]] ([[User talk:$2|Talk]]); alguém o editou ou já o reverteu.
 665+por [[User:$2|$2]] ([[User talk:$2|discussão]]); alguém o editou ou já o reverteu.
666666
667667 A última edição foi de [[User:$3|$3]] ([[User talk:$3|Conversar com ele]]). ",
668668 # only shown if there is an edit comment
@@ -680,7 +680,7 @@
681681 "undeletebtn" => "Restaurar!",
682682 "undeletedarticle" => " \"$1\" restaurado",
683683 "undeletedtext" => "O artigo [[:$1|$1]] foi restaurado com sucesso.
684 -Veja [[{{ns:4}}:Deletion_log]] for a record of recent deletions and restorations.",
 684+Veja [[{{ns:4}}:Deletion_log]] para um registro das deleções e das restaurações recentes.",
685685
686686 # Contributions
687687 #
@@ -697,8 +697,8 @@
698698 "whatlinkshere" => "Artigos Relacionado",
699699 "notargettitle" => "Sem alvo",
700700 "notargettext" => "Você não especificou um alvo ou usuário para performar esta função.",
701 -"linklistsub" => "(Lista de ligações)",
702 -"linkshere" => "Os seguintes artigos contém ligações que apontam para cá:",
 701+"linklistsub" => "(Lista de links)",
 702+"linkshere" => "Os seguintes artigos contém links que apontam para cá:",
703703 /*"nolinkshere" => "Nenhuma página relaciona-se � esta.",*/
704704 "isredirect" => "página de redirecionamento",
705705
@@ -729,9 +729,9 @@
730730 #
731731 "lockdb" => "Trancar Banco de Dados",
732732 "unlockdb" => "Destrancar Banco de Dados",
733 -"lockdbtext" => "Trancar o banco de dados suspenderá a abilidade de todos os usuários de editarem páginas, mudarem suas preferências, lista de monitoração e outras coisas que requerem mudanças no banco de dados.
 733+"lockdbtext" => "Trancar o banco de dados suspenderá a habilidade de todos os usuários de editarem páginas, mudarem suas preferências, listas de monitoramento e outras coisas que requerem mudanças no banco de dados.
734734 Por favor confirme que você realmente pretende fazer isto, e que você vai desbloquear o banco de dados quando sua manutenção estiver completa.",
735 -"unlockdbtext" => "Desbloquear o banco de dados vai restaurar a abilidade de todos os usuários de editar artigos, mudar suas preferências, editar suas listas de monitoramento e outras coisas que requerem mudanças no banco de dados. Por favor , confirme que você realmente pretende fazer isto.",
 735+"unlockdbtext" => "Desbloquear o banco de dados vai restaurar a habilidade de todos os usuários de editar artigos, mudar suas preferências, editar suas listas de monitoramento e outras coisas que requerem mudanças no banco de dados. Por favor, confirme que você realmente pretende fazer isto.",
736736 "lockconfirm" => "SIM, eu realmente pretendo trancar o banco de dados.",
737737 "unlockconfirm" => "SIM, eu realmente pretendo destrancar o banco de dados.",
738738 "lockbtn" => "Trancar banco",
@@ -746,7 +746,7 @@
747747 # Move page
748748 #
749749 "movepage" => "Mover página",
750 -"movepagetext" => "Usando o formulário a seguir você poderá renomear uma página , movendo todo o histórico para o novo nome.
 750+"movepagetext" => "Usando o formulário a seguir você poderá renomear uma página, movendo todo o histórico para o novo nome.
751751 O título antigo será transformado num redirecionamento para o novo título.
752752 Links para as páginas antigas não serão mudados; certifique-se de checar redirecionamentos quebrados ou artigos duplos.
753753 Você é responsável por certificar-se que os links continuam apontando para onde eles deveriam apontar.
@@ -772,11 +772,11 @@
773773 "pagemovedtext" => "Página \"[[$1]]\" movida para \"[[$2]]\".",
774774 "articleexists" => "Uma página com este nome já existe, ou o nome que você escolheu é inválido.
775775 Por favor, escolha outro nome.",
776 -"talkexists" => "A página em si foi movida com sucesso, porém a página talk não pode ser movida por que já existe uma com este nome. Por favor, mescle-as manualmente.",
 776+"talkexists" => "A página em si foi movida com sucesso, porém a página de discussão não pode ser movida por que já existe uma com este nome. Por favor, mescle-as manualmente.",
777777 "movedto" => "movido para",
778 -"movetalk" => "Mover página \"talk\" também, se aplicável.",
779 -"talkpagemoved" => "A página talk correspondente foi movida com sucesso.",
780 -"talkpagenotmoved" => "A página talk correspondente <strong>não</strong> foi movida.",
 778+"movetalk" => "Mover página de discussão também, se aplicável.",
 779+"talkpagemoved" => "A página de discussão correspondente foi movida com sucesso.",
 780+"talkpagenotmoved" => "A página de discussão correspondente <strong>não</strong> foi movida.",
781781 # Math
782782 'mw_math_png' => "Sempre renderizar PNG",
783783 'mw_math_simple' => "HTML se for bem simples e PNG",
@@ -788,4 +788,4 @@
789789 );
790790
791791
792 -?>
\ No newline at end of file
 792+?>