r62862 MediaWiki - Code Review archive

Repository:MediaWiki
Revision:r62861‎ | r62862 | r62863 >
Date:01:09, 23 February 2010
Author:soxred93
Status:deferred
Tags:
Comment:
Update to current code
Modified paths:
  • /branches/new-checkuser/CheckUser.alias.php (replaced) (history)
  • /branches/new-checkuser/CheckUser.i18n.php (replaced) (history)
  • /branches/new-checkuser/CheckUser.php (replaced) (history)
  • /branches/new-checkuser/CheckUser_api.php (deleted) (history)
  • /branches/new-checkuser/CheckUser_body.php (replaced) (history)
  • /branches/new-checkuser/SpecialCheckUser.php (deleted) (history)
  • /branches/new-checkuser/archives (replaced) (history)
  • /branches/new-checkuser/archives/patch-cu_changes_indexes.sql (added) (history)
  • /branches/new-checkuser/archives/patch-cu_changes_indexes2.sql (added) (history)
  • /branches/new-checkuser/checkuser.js (replaced) (history)
  • /branches/new-checkuser/cu_changes.pg.sql (replaced) (history)
  • /branches/new-checkuser/cu_changes.sql (replaced) (history)
  • /branches/new-checkuser/cu_log.pg.sql (replaced) (history)
  • /branches/new-checkuser/cu_log.sql (replaced) (history)
  • /branches/new-checkuser/cu_log_import.inc (replaced) (history)
  • /branches/new-checkuser/importLog.php (replaced) (history)
  • /branches/new-checkuser/install.inc (replaced) (history)
  • /branches/new-checkuser/install.php (replaced) (history)

Diff [purge]

Index: branches/new-checkuser/CheckUser_api.php
@@ -1,148 +0,0 @@
2 -<?php
3 -
4 -/*
5 - * Created on Jan 14, 2009
6 - *
7 - * Copyright (C) 2009 Soxred93 soxred93 [-at-] gee mail [-dot-] com,
8 - *
9 - * This program is free software; you can redistribute it and/or modify
10 - * it under the terms of the GNU General Public License as published by
11 - * the Free Software Foundation; either version 2 of the License, or
12 - * (at your option) any later version.
13 - *
14 - * This program is distributed in the hope that it will be useful,
15 - * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 - * GNU General Public License for more details.
18 - *
19 - * You should have received a copy of the GNU General Public License along
20 - * with this program; if not, write to the Free Software Foundation, Inc.,
21 - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22 - * http://www.gnu.org/copyleft/gpl.html
23 - */
24 -
25 -if (!defined('MEDIAWIKI')) {
26 - // Eclipse helper - will be ignored in production
27 - require_once ('ApiBase.php');
28 -}
29 -
30 -class CheckUserApi extends ApiBase {
31 -
32 - public function execute() {
33 - global $wgUser;
34 - $this->getMain()->requestWriteMode();
35 - $params = $this->extractRequestParams();
36 -
37 - if(is_null($params['user']))
38 - $this->dieUsageMsg(array('missingparam', 'user'));
39 - if(is_null($params['type']))
40 - $this->dieUsageMsg(array('missingparam', 'type'));
41 - if(is_null($params['duration']))
42 - $this->dieUsageMsg(array('missingparam', 'duration'));
43 - if(!isset($params['reason'])) {
44 - $reason = '';
45 - }
46 - else {
47 - $reason = $params['reason'];
48 - }
49 - if(!$wgUser->isAllowed('checkuser'))
50 - $this->dieUsageMsg(array('cantcheckuser'));
51 -
52 - $user = $params['user'];
53 - $checktype = $params['type'];
54 - $period = $params['duration'];
55 -
56 - # An IPv4?
57 - if( preg_match( '#^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(/\d{1,2}|)$#', $user ) ) {
58 - $ip = $user;
59 - $name = '';
60 - $xff = '';
61 - # An IPv6?
62 - } else if( preg_match( '#^[0-9A-Fa-f]{1,4}(:[0-9A-Fa-f]{1,4})+(/\d{1,3}|)$#', $user ) ) {
63 - $ip = IP::sanitizeIP($user);
64 - $name = '';
65 - $xff = '';
66 - # An IPv4 XFF string?
67 - } else if( preg_match( '#^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(/\d{1,2}|)/xff$#', $user, $matches ) ) {
68 - list( $junk, $xffip, $xffbit) = $matches;
69 - $ip = '';
70 - $name = '';
71 - $xff = $xffip . $xffbit;
72 - # An IPv6 XFF string?
73 - } else if( preg_match( '#^([0-9A-Fa-f]{1,4}(:[0-9A-Fa-f]{1,4})+)(/\d{1,3}|)/xff$#', $user, $matches ) ) {
74 - list( $junk, $xffip, $xffbit ) = $matches;
75 - $ip = '';
76 - $name = '';
77 - $xff = IP::sanitizeIP( $xffip ) . $xffbit;
78 - # A user?
79 - } else {
80 - $ip = '';
81 - $name = $user;
82 - $xff = '';
83 - }
84 -
85 - if( $checktype=='subuserips' ) {
86 - $res = $this->doUserIPsRequest( $name, $reason, $period );
87 - } else if( $xff && $checktype=='subipedits' ) {
88 - $res = $this->doIPEditsRequest( $xff, true, $reason, $period );
89 - } else if( $checktype=='subipedits' ) {
90 - $res = $this->doIPEditsRequest( $ip, false, $reason, $period );
91 - } else if( $xff && $checktype=='subipusers' ) {
92 - $res = $this->doIPUsersRequest( $xff, true, $reason, $period );
93 - } else if( $checktype=='subipusers' ) {
94 - $res = $this->doIPUsersRequest( $ip, false, $reason, $period );
95 - } else if( $checktype=='subuseredits' ) {
96 - $res = $this->doUserEditsRequest( $user, $reason, $period );
97 - }
98 -
99 - if( !is_null( $res ) ) {
100 - $this->getResult()->setIndexedTagName($res, 'cu');
101 - $this->getResult()->addValue(null, $this->getModuleName(), $res);
102 - }
103 - }
104 -
105 - public function __construct($main, $action) {
106 - parent :: __construct($main, $action);
107 - ApiBase::$messageMap['cantcheckuser'] = array('code' => 'cantcheckuser', 'info' => "You dont have permission to run a checkuser");
108 - ApiBase::$messageMap['checkuserlogfail'] = array('code' => 'checkuserlogfail', 'info' => "Inserting a log entry failed");
109 - ApiBase::$messageMap['nomatch'] = array('code' => 'nomatch', 'info' => "No matches found");
110 - ApiBase::$messageMap['nomatchedit'] = array('code' => 'nomatch', 'info' => "No matches found. Last edit was on $1 at $2");
111 - }
112 -
113 - public function mustBePosted() { return true; }
114 -
115 - public function getAllowedParams() {
116 - return array (
117 - 'user' => null,
118 - 'type' => null,
119 - 'duration' => null,
120 - 'reason' => null,
121 - );
122 - }
123 -
124 - public function getParamDescription() {
125 - return array (
126 - 'user' => 'The user (or IP) you want to check',
127 - 'type' => 'The type of check you want to make (subuserips, subipedits, subipusers, or subuseredits)',
128 - 'duration' => 'How far back you want to check',
129 - 'reason' => 'The reason for checking',
130 - );
131 - }
132 -
133 - public function getDescription() {
134 - return array (
135 - 'Run a CheckUser on a username or IP address'
136 - );
137 - }
138 -
139 - protected function getExamples() {
140 - return array(
141 - 'api.php?action=checkuser&user=127.0.0.1/xff&type=subipedits&duration=all',
142 - 'api.php?action=checkuser&user=Example&type=subuserips&duration=2_weeks',
143 - );
144 - }
145 -
146 - public function getVersion() {
147 - return __CLASS__ . ': $Id: CheckUser_api.php 45575 2009-01-14 22:50:32Z soxred93 $';
148 - }
149 -}
\ No newline at end of file
Index: branches/new-checkuser/SpecialCheckUser.php
@@ -1,1285 +0,0 @@
2 -<?php
3 -
4 -if ( !defined( 'MEDIAWIKI' ) ) {
5 - echo "CheckUser extension\n";
6 - exit( 1 );
7 -}
8 -
9 -
10 -class SpecialCheckUser extends SpecialPage
11 -{
12 - function SpecialCheckUser() {
13 - global $wgUser;
14 - if ( $wgUser->isAllowed( 'checkuser' ) || !$wgUser->isAllowed( 'checkuser-log' ) ) {
15 - SpecialPage::SpecialPage('CheckUser', 'checkuser');
16 - } else {
17 - SpecialPage::SpecialPage('CheckUser', 'checkuser-log');
18 - }
19 - wfLoadExtensionMessages('SpecialCheckUser');
20 - }
21 -
22 - function execute( $subpage ) {
23 - global $wgRequest, $wgOut, $wgUser, $wgContLang;
24 -
25 - $this->setHeaders();
26 - $this->sk = $wgUser->getSkin();
27 -
28 - // This is horribly shitty.
29 - // Lacking formal aliases, it's tough to ensure we have compatibility.
30 - // Links may break, which sucks.
31 - // Language fallbacks will not always be properly utilized.
32 - $logMatches = array(
33 - wfMsgForContent( 'checkuser-log-subpage' ),
34 - 'Log'
35 - );
36 -
37 - foreach( $logMatches as $log ) {
38 - if ( str_replace( '_', ' ', $wgContLang->lc( $subpage ) )
39 - == str_replace( '_ ', ' ', $wgContLang->lc( $log ) ) ) {
40 - if( !$wgUser->isAllowed( 'checkuser-log' ) ) {
41 - $wgOut->permissionRequired( 'checkuser-log' );
42 - return;
43 - }
44 -
45 - $this->showLog();
46 - return;
47 - }
48 - }
49 -
50 - if( !$wgUser->isAllowed( 'checkuser' ) ) {
51 - if ( $wgUser->isAllowed( 'checkuser-log' ) ) {
52 - $wgOut->addWikiText( wfMsg( 'checkuser-summary' ) .
53 - "\n\n[[" . $this->getLogSubpageTitle()->getPrefixedText() .
54 - '|' . wfMsg( 'checkuser-showlog' ) . ']]'
55 - );
56 - return;
57 - }
58 -
59 - $wgOut->permissionRequired( 'checkuser' );
60 - return;
61 - }
62 -
63 - $user = $wgRequest->getText( 'user' ) ?
64 - $wgRequest->getText( 'user' ) : $wgRequest->getText( 'ip' );
65 - $user = trim($user);
66 - $reason = $wgRequest->getText( 'reason' );
67 - $blockreason = $wgRequest->getText( 'blockreason' );
68 - $checktype = $wgRequest->getVal( 'checktype' );
69 - $period = $wgRequest->getInt( 'period' );
70 - $users = $wgRequest->getArray( 'users' );
71 - $tag = $wgRequest->getBool('usetag') ? trim( $wgRequest->getVal( 'tag' ) ) : "";
72 - $talkTag = $wgRequest->getBool('usettag') ? trim( $wgRequest->getVal( 'talktag' ) ) : "";
73 -
74 - # An IPv4? An IPv6? CIDR included?
75 - if( IP::isIPAddress($user) ) {
76 - $ip = IP::sanitizeIP($user);
77 - $name = '';
78 - $xff = '';
79 - # An IPv4/IPv6 XFF string? CIDR included?
80 - } else if( preg_match('/^(.+)\/xff$/',$user,$m) && IP::isIPAddress($m[1]) ) {
81 - $ip = '';
82 - $name = '';
83 - $xff = IP::sanitizeIP($m[1]);
84 - # A user?
85 - } else {
86 - $ip = '';
87 - $name = $user;
88 - $xff = '';
89 - }
90 -
91 - $this->doForm( $user, $reason, $checktype, $ip, $xff, $name, $period );
92 - # Perform one of the various submit operations...
93 - if( $wgRequest->wasPosted() ) {
94 - if( $wgRequest->getVal('action') === 'block' ) {
95 - $this->doMassUserBlock( $users, $blockreason, $tag, $talkTag );
96 - } else if( $checktype=='subuserips' ) {
97 - $this->doUserIPsRequest( $name, $reason, $period );
98 - } else if( $xff && $checktype=='subipedits' ) {
99 - $this->doIPEditsRequest( $xff, true, $reason, $period );
100 - } else if( $checktype=='subipedits' ) {
101 - $this->doIPEditsRequest( $ip, false, $reason, $period );
102 - } else if( $xff && $checktype=='subipusers' ) {
103 - $this->doIPUsersRequest( $xff, true, $reason, $period, $tag, $talkTag );
104 - } else if( $checktype=='subipusers' ) {
105 - $this->doIPUsersRequest( $ip, false, $reason, $period, $tag, $talkTag );
106 - } else if( $checktype=='subuseredits' ) {
107 - $this->doUserEditsRequest( $user, $reason, $period );
108 - }
109 - }
110 - # Add CIDR calculation convenience form
111 - $this->addJsCIDRForm();
112 - $this->addStyles();
113 - }
114 -
115 - /**
116 - * As we use the same small set of messages in various methods and that
117 - * they are called often, we call them once and save them in $this->message
118 - */
119 - protected function preCacheMessages() {
120 - // Precache various messages
121 - if( !isset( $this->message ) ) {
122 - foreach( explode(' ', 'diff hist minoreditletter newpageletter blocklink log' ) as $msg ) {
123 - $this->message[$msg] = wfMsgExt( $msg, array( 'escape') );
124 - }
125 - }
126 - }
127 -
128 - public function getLogSubpageTitle() {
129 - if ( !isset( $this->logSubpageTitle ) ) {
130 - $this->logSubpageTitle = $this->getTitle( wfMsgForContent( 'checkuser-log-subpage' ) );
131 - }
132 - return $this->logSubpageTitle;
133 - }
134 -
135 - protected function doForm( $user, $reason, $checktype, $ip, $xff, $name, $period ) {
136 - global $wgOut, $wgUser;
137 - $action = $this->getTitle()->escapeLocalUrl();
138 - # Fill in requested type if it makes sense
139 - $encipusers = $encipedits = $encuserips = $encuseredits = 0;
140 - if( $checktype=='subipusers' && ( $ip || $xff ) )
141 - $encipusers = 1;
142 - else if( $checktype=='subipedits' && ( $ip || $xff ) )
143 - $encipedits = 1;
144 - else if( $checktype=='subuserips' && $name )
145 - $encuserips = 1;
146 - else if( $checktype=='subuseredits' && $name )
147 - $encuseredits = 1;
148 - # Defaults otherwise
149 - else if( $ip || $xff )
150 - $encipedits = 1;
151 - else
152 - $encuserips = 1;
153 - # Compile our nice form
154 - # User box length should fit things like "2001:0db8:85a3:08d3:1319:8a2e:0370:7344/100/xff"
155 - if( $wgUser->isAllowed( 'checkuser-log' ) ) {
156 - $wgOut->addWikiText( wfMsg( 'checkuser-summary' ) .
157 - "\n\n[[" . $this->getLogSubpageTitle()->getPrefixedText() .
158 - '|' . wfMsg( 'checkuser-showlog' ) . ']]'
159 - );
160 - }
161 - $form = "<form name='checkuserform' id='checkuserform' action=\"$action\" method='post'>";
162 - $form .= "<fieldset><legend>".wfMsgHtml( "checkuser-query" )."</legend>";
163 - $form .= "<table border='0' cellpadding='2'><tr>";
164 - $form .= "<td>".wfMsgHtml( "checkuser-target" ).":</td>";
165 - $form .= "<td>".Xml::input( 'user', 46, $user, array( 'id' => 'checktarget' ) );
166 - $form .= "&nbsp;".$this->getPeriodMenu( $period ) . "</td>";
167 - $form .= "</tr><tr>";
168 - $form .= "<td></td><td class='checkuserradios'><table border='0' cellpadding='3'><tr>";
169 - $form .= "<td>".Xml::radio( 'checktype', 'subuserips', $encuserips, array('id' => 'subuserips') );
170 - $form .= " ".Xml::label( wfMsgHtml("checkuser-ips"), 'subuserips' )."</td>";
171 - $form .= "<td>".Xml::radio( 'checktype', 'subipedits', $encipedits, array('id' => 'subipedits') );
172 - $form .= " ".Xml::label( wfMsgHtml("checkuser-edits"), 'subipedits' )."</td>";
173 - $form .= "<td>".Xml::radio( 'checktype', 'subipusers', $encipusers, array('id' => 'subipusers') );
174 - $form .= " ".Xml::label( wfMsgHtml("checkuser-users"), 'subipusers' )."</td>";
175 - $form .= "<td>".Xml::radio( 'checktype', 'subuseredits', $encuseredits, array('id' => 'subuseredits') );
176 - $form .= " ".Xml::label( wfMsgHtml("checkuser-account"), 'subuseredits' )."</td>";
177 - $form .= "</tr></table></td>";
178 - $form .= "</tr><tr>";
179 - $form .= "<td>".wfMsgHtml( "checkuser-reason" )."</td>";
180 - $form .= "<td>".Xml::input( 'reason', 46, $reason, array( 'maxlength' => '150', 'id' => 'checkreason' ) );
181 - $form .= "&nbsp; &nbsp;".Xml::submitButton( wfMsgHtml('checkuser-check'),
182 - array('id' => 'checkusersubmit','name' => 'checkusersubmit') )."</td>";
183 - $form .= "</tr></table></fieldset></form>";
184 - # Output form
185 - $wgOut->addHTML( $form );
186 - }
187 -
188 - /**
189 - * Add CSS/JS
190 - */
191 - protected function addStyles() {
192 - global $wgScriptPath, $wgCheckUserStyleVersion, $wgOut;
193 - $encJSFile = htmlspecialchars( "$wgScriptPath/extensions/CheckUser/checkuser.js?$wgCheckUserStyleVersion" );
194 - $wgOut->addScript( "<script type=\"text/javascript\" src=\"$encJSFile\"></script>" );
195 - }
196 -
197 - /**
198 - * Get a selector of time period options
199 - * @param int $selected, selected level
200 - */
201 - protected function getPeriodMenu( $selected=null ) {
202 - $s = "<label for='period'>" . wfMsgHtml('checkuser-period') . "</label>&nbsp;";
203 - $s .= Xml::openElement( 'select', array('name' => 'period','id' => 'period','style' => 'margin-top:.2em;') );
204 - $s .= Xml::option( wfMsg( "checkuser-week-1" ), 7, $selected===7 );
205 - $s .= Xml::option( wfMsg( "checkuser-week-2" ), 14, $selected===14 );
206 - $s .= Xml::option( wfMsg( "checkuser-month" ), 31, $selected===31 );
207 - $s .= Xml::option( wfMsg( "checkuser-all" ), 0, $selected===0 );
208 - $s .= Xml::closeElement('select')."\n";
209 - return $s;
210 - }
211 -
212 - /**
213 - * Make a quick JS form for admins to calculate block ranges
214 - */
215 - protected function addJsCIDRForm() {
216 - global $wgOut;
217 - $s = '<fieldset id="mw-checkuser-cidrform" style="display:none; clear:both;">'.
218 - '<legend>'.wfMsgHtml('checkuser-cidr-label').'</legend>';
219 - $s .= '<textarea id="mw-checkuser-iplist" rows="5" cols="50" onkeyup="updateCIDRresult()" onclick="updateCIDRresult()"></textarea><br/>';
220 - $s .= wfMsgHtml('checkuser-cidr-res') . '&nbsp;' .
221 - Xml::input( 'mw-checkuser-cidr-res',35,'',array('id'=>'mw-checkuser-cidr-res') ) .
222 - '&nbsp;<strong id="mw-checkuser-ipnote"></strong>';
223 - $s .= '</fieldset>';
224 - $wgOut->addHTML( $s );
225 - }
226 -
227 - /**
228 - * Block a list of selected users
229 - * @param array $users
230 - * @param string $reason
231 - * @param string $tag
232 - */
233 - protected function doMassUserBlock( $users, $reason = '', $tag = '', $talkTag = '' ) {
234 - global $wgOut, $wgUser, $wgCheckUserMaxBlocks, $wgLang;
235 - if( empty($users) || $wgUser->isBlocked(false) ) {
236 - $wgOut->addWikiText( wfMsgExt('checkuser-block-failure',array('parsemag')) );
237 - return;
238 - } else if( count($users) > $wgCheckUserMaxBlocks ) {
239 - $wgOut->addWikiText( wfMsgExt('checkuser-block-limit',array('parsemag')) );
240 - return;
241 - } else if( !$reason ) {
242 - $wgOut->addWikiText( wfMsgExt('checkuser-block-noreason',array('parsemag')) );
243 - return;
244 - }
245 - $safeUsers = IPBlockForm::doMassUserBlock( $users, $reason, $tag, $talkTag );
246 - if( !empty( $safeUsers ) ) {
247 - $n = count( $safeUsers );
248 - $ulist = $wgLang->listToText( $safeUsers );
249 - $wgOut->addWikiText( wfMsgExt( 'checkuser-block-success', 'parsemag', $ulist, $wgLang->formatNum( $n ) ) );
250 - } else {
251 - $wgOut->addWikiText( wfMsgExt( 'checkuser-block-failure', 'parsemag' ) );
252 - }
253 - }
254 -
255 - protected function noMatchesMessage( $userName ) {
256 - global $wgLang;
257 - $dbr = wfGetDB( DB_SLAVE );
258 - $user_id = User::idFromName($userName);
259 - if( $user_id ) {
260 - $revEdit = $dbr->selectField( 'revision',
261 - 'rev_timestamp',
262 - array( 'rev_user' => $user_id ),
263 - __METHOD__,
264 - array( 'ORDER BY' => 'rev_timestamp DESC')
265 - );
266 - } else {
267 - $revEdit = $dbr->selectField( 'revision',
268 - 'rev_timestamp',
269 - array( 'rev_user_text' => $userName ),
270 - __METHOD__,
271 - array( 'ORDER BY' => 'rev_timestamp DESC')
272 - );
273 - }
274 - $logEdit = 0;
275 - if( $user_id ) {
276 - $logEdit = $dbr->selectField( 'logging',
277 - 'log_timestamp',
278 - array( 'log_user' => $user_id ),
279 - __METHOD__,
280 - array( 'ORDER BY' => 'log_timestamp DESC')
281 - );
282 - }
283 - $lastEdit = max( $revEdit, $logEdit );
284 - if( $lastEdit ) {
285 - $lastEditDate = $wgLang->date( wfTimestamp(TS_MW,$lastEdit), true );
286 - $lastEditTime = $wgLang->time( wfTimestamp(TS_MW,$lastEdit), true );
287 - return wfMsgHtml( 'checkuser-nomatch-edits', $lastEditDate, $lastEditTime );
288 - }
289 - return wfMsgExt('checkuser-nomatch','parse');
290 - }
291 -
292 - /**
293 - * @param string $ip
294 - * @param bool $xfor
295 - * @param string $reason
296 - * Get all IPs used by a user
297 - * Shows first and last date and number of edits
298 - */
299 - protected function doUserIPsRequest( $user , $reason = '', $period = 0 ) {
300 - global $wgOut, $wgLang, $wgUser;
301 -
302 - $userTitle = Title::newFromText( $user, NS_USER );
303 - if( !is_null( $userTitle ) ) {
304 - // normalize the username
305 - $user = $userTitle->getText();
306 - }
307 - # IPs are passed in as a blank string
308 - if( !$user ) {
309 - $wgOut->addWikiMsg( 'nouserspecified' );
310 - return;
311 - }
312 - # Get ID, works better than text as user may have been renamed
313 - $user_id = User::idFromName($user);
314 -
315 - # If user is not IP or nonexistent
316 - if( !$user_id ) {
317 - $s = wfMsgExt('nosuchusershort',array('parse'),$user);
318 - $wgOut->addHTML( $s );
319 - return;
320 - }
321 -
322 - if( !$this->addLogEntry( 'userips', 'user', $user, $reason, $user_id ) ) {
323 - $wgOut->addHTML( '<p>'.wfMsgHtml('checkuser-log-fail').'</p>' );
324 - }
325 - $dbr = wfGetDB( DB_SLAVE );
326 - $time_conds = $this->getTimeConds( $period );
327 - # Ordering by the latest timestamp makes a small filesort on the IP list
328 - $cu_changes = $dbr->tableName( 'cu_changes' );
329 - $use_index = $dbr->useIndexClause( 'cuc_user_ip_time' );
330 - $sql = "SELECT cuc_ip,cuc_ip_hex, COUNT(*) AS count,
331 - MIN(cuc_timestamp) AS first, MAX(cuc_timestamp) AS last
332 - FROM $cu_changes $use_index WHERE cuc_user = $user_id AND $time_conds
333 - GROUP BY cuc_ip,cuc_ip_hex ORDER BY last DESC LIMIT 5001";
334 -
335 - $ret = $dbr->query( $sql, __METHOD__ );
336 - if( !$dbr->numRows( $ret ) ) {
337 - $s = $this->noMatchesMessage($user)."\n";
338 - } else {
339 - $blockip = SpecialPage::getTitleFor( 'blockip' );
340 - $ips_edits = array();
341 - $counter = 0;
342 - while( $row = $dbr->fetchObject($ret) ) {
343 - if( $counter >= 5000 ) {
344 - $wgOut->addHTML( wfMsgExt('checkuser-limited',array('parse')) );
345 - break;
346 - }
347 - $ips_edits[$row->cuc_ip] = $row->count;
348 - $ips_first[$row->cuc_ip] = $row->first;
349 - $ips_last[$row->cuc_ip] = $row->last;
350 - $ips_hex[$row->cuc_ip] = $row->cuc_ip_hex;
351 - ++$counter;
352 - }
353 - // Count pinging might take some time...make sure it is there
354 - wfSuppressWarnings();
355 - set_time_limit(60);
356 - wfRestoreWarnings();
357 -
358 - $logs = SpecialPage::getTitleFor( 'Log' );
359 - $blocklist = SpecialPage::getTitleFor( 'Ipblocklist' );
360 - $s = '<div id="checkuserresults"><ul>';
361 - foreach( $ips_edits as $ip => $edits ) {
362 - $s .= '<li>';
363 - $s .= '<a href="' .
364 - $this->getTitle()->escapeLocalURL( 'user='.urlencode($ip) . '&reason='.urlencode($reason) ) . '">' .
365 - htmlspecialchars($ip) . '</a>';
366 - $s .= ' (<a href="' . $blockip->escapeLocalURL( 'ip='.urlencode($ip) ).'">' .
367 - wfMsgHtml('blocklink') . '</a>)';
368 - if( $ips_first[$ip] == $ips_last[$ip] ) {
369 - $s .= ' (' . $wgLang->timeanddate( wfTimestamp(TS_MW,$ips_first[$ip]), true ) . ') ';
370 - } else {
371 - $s .= ' (' . $wgLang->timeanddate( wfTimestamp(TS_MW,$ips_first[$ip]), true ) .
372 - ' -- ' . $wgLang->timeanddate( wfTimestamp(TS_MW,$ips_last[$ip]), true ) . ') ';
373 - }
374 - $s .= ' <strong>[' . $edits . ']</strong>';
375 -
376 - # If we get some results, it helps to know if the IP in general
377 - # has a lot more edits, e.g. "tip of the iceberg"...
378 - $ipedits = $dbr->estimateRowCount( 'cu_changes', '*',
379 - array( 'cuc_ip_hex' => $ips_hex[$ip] ),
380 - __METHOD__ );
381 - # If small enough, get a more accurate count
382 - if( $ipedits <= 1000 ) {
383 - $ipedits = $dbr->selectField( 'cu_changes', 'COUNT(*)',
384 - array( 'cuc_ip_hex' => $ips_hex[$ip] ),
385 - __METHOD__ );
386 - }
387 - if( $ipedits > $ips_edits[$ip] ) {
388 - $s .= ' <i>(' . wfMsgHtml('checkuser-ipeditcount',$ipedits) . ')</i>';
389 - }
390 -
391 - # If this IP is blocked, give a link to the block log
392 - $block = new Block();
393 - $block->fromMaster( false ); // use slaves
394 - if( $block->load( $ip, 0 ) ) {
395 - if( IP::isIPAddress($block->mAddress) && strpos($block->mAddress,'/') ) {
396 - $userpage = Title::makeTitle( NS_USER, $block->mAddress );
397 - $blocklog = $this->sk->makeKnownLinkObj( $logs, wfMsgHtml('checkuser-blocked'),
398 - 'type=block&page=' . urlencode( $userpage->getPrefixedText() ) );
399 - $s .= ' <strong>(' . $blocklog . ' - ' . $block->mAddress . ')</strong>';
400 - } else if( $block->mAuto ) {
401 - $blocklog = $this->sk->makeKnownLinkObj( $blocklist, wfMsgHtml('checkuser-blocked'),
402 - 'ip=' . urlencode( "#$block->mId" ) );
403 - $s .= ' <strong>(' . $blocklog . ')</strong>';
404 - } else {
405 - $userpage = Title::makeTitle( NS_USER, $ip );
406 - $blocklog = $this->sk->makeKnownLinkObj( $logs, wfMsgHtml('checkuser-blocked'),
407 - 'type=block&page=' . urlencode( $userpage->getPrefixedText() ) );
408 - $s .= ' <strong>(' . $blocklog . ')</strong>';
409 - }
410 - }
411 - $s .= "<div style='margin-left:5%'>";
412 - $s .= "<small>" . wfMsgExt('checkuser-toollinks',array('parseinline'),urlencode($ip)) . "</small>";
413 - $s .= "</div>";
414 - $s .= "</li>\n";
415 - }
416 - $s .= '</ul></div>';
417 - }
418 - $wgOut->addHTML( $s );
419 - $dbr->freeResult( $ret );
420 - }
421 -
422 - /**
423 - * @param string $ip
424 - * @param bool $xfor
425 - * @param string $reason
426 - * Shows all edits in Recent Changes by this IP (or range) and who made them
427 - */
428 - protected function doIPEditsRequest( $ip, $xfor = false, $reason = '', $period = 0 ) {
429 - global $wgUser, $wgOut, $wgLang;
430 - $dbr = wfGetDB( DB_SLAVE );
431 - # Invalid IPs are passed in as a blank string
432 - $ip_conds = $this->getIpConds( $dbr, $ip, $xfor );
433 - if( !$ip || $ip_conds === false ) {
434 - $wgOut->addWikiMsg( 'badipaddress' );
435 - return;
436 - }
437 -
438 - $logType = 'ipedits';
439 - if( $xfor ) {
440 - $logType .= '-xff';
441 - }
442 - # Record check...
443 - if( !$this->addLogEntry( $logType, 'ip', $ip, $reason ) ) {
444 - $wgOut->addWikiMsg( 'checkuser-log-fail' );
445 - }
446 -
447 - $ip_conds = $dbr->makeList( $ip_conds, LIST_AND );
448 - $time_conds = $this->getTimeConds( $period );
449 - $cu_changes = $dbr->tableName( 'cu_changes' );
450 - # Ordered in descent by timestamp. Can cause large filesorts on range scans.
451 - # Check how many rows will need sorting ahead of time to see if this is too big.
452 - # Also, if we only show 5000, too many will be ignored as well.
453 - $index = $xfor ? 'cuc_xff_hex_time' : 'cuc_ip_hex_time';
454 - if( strpos($ip,'/') !== false ) {
455 - # Quick index check only OK if no time constraint
456 - if( $period ) {
457 - $rangecount = $dbr->selectField( 'cu_changes', 'COUNT(*)',
458 - array( $ip_conds, $time_conds ),
459 - __METHOD__,
460 - array( 'USE INDEX' => $index ) );
461 - } else {
462 - $rangecount = $dbr->estimateRowCount( 'cu_changes', '*',
463 - array( $ip_conds ),
464 - __METHOD__,
465 - array( 'USE INDEX' => $index ) );
466 - }
467 - // Sorting might take some time...make sure it is there
468 - wfSuppressWarnings();
469 - set_time_limit(60);
470 - wfRestoreWarnings();
471 - }
472 - $counter = 0;
473 - # See what is best to do after testing the waters...
474 - if( isset($rangecount) && $rangecount > 5000 ) {
475 - $use_index = $dbr->useIndexClause( $index );
476 - $sql = "SELECT cuc_ip_hex, COUNT(*) AS count,
477 - MIN(cuc_timestamp) AS first, MAX(cuc_timestamp) AS last
478 - FROM $cu_changes $use_index
479 - WHERE $ip_conds AND $time_conds
480 - GROUP BY cuc_ip_hex ORDER BY cuc_ip_hex LIMIT 5001";
481 - $ret = $dbr->query( $sql, __METHOD__ );
482 - # List out each IP that has edits
483 - $s = wfMsgExt('checkuser-too-many',array('parse'));
484 - $s .= '<ol>';
485 - while( $row = $ret->fetchObject() ) {
486 - if( $counter >= 5000 ) {
487 - $wgOut->addHTML( wfMsgExt('checkuser-limited',array('parse')) );
488 - break;
489 - }
490 - # Convert the IP hexes into normal form
491 - if( strpos($row->cuc_ip_hex,'v6-') !==false ) {
492 - $ip = substr( $row->cuc_ip_hex, 3 );
493 - $ip = IP::HextoOctet( $ip );
494 - } else {
495 - $ip = long2ip( wfBaseConvert($row->cuc_ip_hex, 16, 10, 8) );
496 - }
497 - $s .= '<li><a href="'.
498 - $this->getTitle()->escapeLocalURL( 'user='.urlencode($ip).'&reason='.urlencode($reason).'&checktype=subipusers' ) .
499 - '">'.$ip.'</a>';
500 - if( $row->first == $row->last ) {
501 - $s .= ' (' . $wgLang->timeanddate( wfTimestamp(TS_MW,$row->first), true ) . ') ';
502 - } else {
503 - $s .= ' (' . $wgLang->timeanddate( wfTimestamp(TS_MW,$row->first), true ) .
504 - ' -- ' . $wgLang->timeanddate( wfTimestamp(TS_MW,$row->last), true ) . ') ';
505 - }
506 - $s .= " [<strong>" . $row->count . "</strong>]</li>\n";
507 - ++$counter;
508 - }
509 - $s .= '</ol>';
510 - $dbr->freeResult( $ret );
511 -
512 - $wgOut->addHTML( $s );
513 - return;
514 - } else if( isset($rangecount) && !$rangecount ) {
515 - $s = $this->noMatchesMessage($ip)."\n";
516 - $wgOut->addHTML( $s );
517 - return;
518 - }
519 - # OK, do the real query...
520 - $use_index = $dbr->useIndexClause( $index );
521 - $sql = "SELECT cuc_namespace,cuc_title,cuc_user,cuc_user_text,cuc_comment,cuc_actiontext,
522 - cuc_timestamp,cuc_minor,cuc_page_id,cuc_type,cuc_this_oldid,cuc_last_oldid,cuc_ip,cuc_xff,cuc_agent
523 - FROM $cu_changes $use_index WHERE $ip_conds AND $time_conds ORDER BY cuc_timestamp DESC LIMIT 5001";
524 - $ret = $dbr->query( $sql, __METHOD__ );
525 -
526 - if( !$dbr->numRows( $ret ) ) {
527 - $s = $this->noMatchesMessage($ip)."\n";
528 - } else {
529 - # Cache common messages
530 - $this->preCacheMessages();
531 - # Try to optimize this query
532 - $lb = new LinkBatch;
533 - while( $row = $ret->fetchObject() ) {
534 - $userText = str_replace( ' ', '_', $row->cuc_user_text );
535 - $lb->add( $row->cuc_namespace, $row->cuc_title );
536 - $lb->add( NS_USER, $userText );
537 - $lb->add( NS_USER_TALK, $userText );
538 - }
539 - $lb->execute();
540 - $ret->seek( 0 );
541 - # List out the edits
542 - $s = '<div id="checkuserresults">';
543 - while( $row = $ret->fetchObject() ) {
544 - if( $counter >= 5000 ) {
545 - $wgOut->addHTML( wfMsgExt('checkuser-limited',array('parse')) );
546 - break;
547 - }
548 - $s .= $this->CUChangesLine( $row, $reason );
549 - ++$counter;
550 - }
551 - $s .= '</ul></div>';
552 - $dbr->freeResult( $ret );
553 - }
554 -
555 - $wgOut->addHTML( $s );
556 - }
557 -
558 - /**
559 - * @param string $nuser
560 - * @param string $reason
561 - * Shows all edits in Recent Changes by this user
562 - */
563 - protected function doUserEditsRequest( $user, $reason = '', $period = 0 ) {
564 - global $wgUser, $wgOut, $wgLang;
565 -
566 - $userTitle = Title::newFromText( $user, NS_USER );
567 - if( !is_null( $userTitle ) ) {
568 - // normalize the username
569 - $user = $userTitle->getText();
570 - }
571 - # IPs are passed in as a blank string
572 - if( !$user ) {
573 - $wgOut->addWikiMsg( 'nouserspecified' );
574 - return;
575 - }
576 - # Get ID, works better than text as user may have been renamed
577 - $user_id = User::idFromName($user);
578 -
579 - # If user is not IP or nonexistent
580 - if( !$user_id ) {
581 - $s = wfMsgExt('nosuchusershort',array('parse'),$user);
582 - $wgOut->addHTML( $s );
583 - return;
584 - }
585 -
586 - # Record check...
587 - if( !$this->addLogEntry( 'useredits', 'user', $user, $reason, $user_id ) ) {
588 - $wgOut->addHTML( '<p>'.wfMsgHtml('checkuser-log-fail').'</p>' );
589 - }
590 -
591 - $dbr = wfGetDB( DB_SLAVE );
592 - $user_cond = "cuc_user = '$user_id'";
593 - $time_conds = $this->getTimeConds( $period );
594 - $cu_changes = $dbr->tableName( 'cu_changes' );
595 - # Ordered in descent by timestamp. Causes large filesorts if there are many edits.
596 - # Check how many rows will need sorting ahead of time to see if this is too big.
597 - # If it is, sort by IP,time to avoid the filesort.
598 - if( $period ) {
599 - $count = $dbr->selectField( 'cu_changes', 'COUNT(*)',
600 - array( $user_cond, $time_conds ),
601 - __METHOD__,
602 - array( 'USE INDEX' => 'cuc_user_ip_time' ) );
603 - } else {
604 - $count = $dbr->estimateRowCount( 'cu_changes', '*',
605 - array( $user_cond, $time_conds ),
606 - __METHOD__,
607 - array( 'USE INDEX' => 'cuc_user_ip_time' ) );
608 - }
609 - # Cache common messages
610 - $this->preCacheMessages();
611 - # See what is best to do after testing the waters...
612 - if( $count > 5000 ) {
613 - $wgOut->addHTML( wfMsgExt('checkuser-limited',array('parse')) );
614 - $use_index = $dbr->useIndexClause( 'cuc_user_ip_time' );
615 - $sql = "SELECT * FROM $cu_changes $use_index
616 - WHERE $user_cond AND $time_conds
617 - ORDER BY cuc_ip ASC, cuc_timestamp DESC LIMIT 5000";
618 - $ret = $dbr->query( $sql, __METHOD__ );
619 - # Try to optimize this query
620 - $lb = new LinkBatch;
621 - while( $row = $ret->fetchObject() ) {
622 - $lb->add( $row->cuc_namespace, $row->cuc_title );
623 - }
624 - $lb->execute();
625 - $ret->seek( 0 );
626 - $s = '';
627 - while( $row = $ret->fetchObject() ) {
628 - if( !$ip = htmlspecialchars($row->cuc_ip) ) {
629 - continue;
630 - }
631 - if( !isset($lastIP) ) {
632 - $lastIP = $row->cuc_ip;
633 - $s .= "\n<h2>$ip</h2>\n<div class=\"special\">";
634 - } else if( $lastIP != $row->cuc_ip ) {
635 - $s .= "</ul></div>\n<h2>$ip</h2>\n<div class=\"special\">";
636 - $lastIP = $row->cuc_ip;
637 - unset($this->lastdate); // start over
638 - }
639 - $s .= $this->CUChangesLine( $row, $reason );
640 - }
641 - $s .= '</ul></div>';
642 - $dbr->freeResult( $ret );
643 -
644 - $wgOut->addHTML( $s );
645 - return;
646 - }
647 - // Sorting might take some time...make sure it is there
648 - wfSuppressWarnings();
649 - set_time_limit(60);
650 - wfRestoreWarnings();
651 - # OK, do the real query...
652 - $use_index = $dbr->useIndexClause( 'cuc_user_ip_time' );
653 - $sql = "SELECT * FROM $cu_changes $use_index
654 - WHERE $user_cond AND $time_conds ORDER BY cuc_timestamp DESC LIMIT 5000";
655 - $ret = $dbr->query( $sql, __METHOD__ );
656 -
657 - if( !$dbr->numRows( $ret ) ) {
658 - $s = $this->noMatchesMessage($user)."\n";
659 - } else {
660 - # Try to optimize this query
661 - $lb = new LinkBatch;
662 - while( $row = $ret->fetchObject() ) {
663 - $lb->add( $row->cuc_namespace, $row->cuc_title );
664 - }
665 - $lb->execute();
666 - $ret->seek( 0 );
667 - # List out the edits
668 - $s = '<div id="checkuserresults">';
669 - while( $row = $ret->fetchObject() ) {
670 - $s .= $this->CUChangesLine( $row, $reason );
671 - }
672 - $s .= '</ul></div>';
673 - $dbr->freeResult( $ret );
674 - }
675 -
676 - $wgOut->addHTML( $s );
677 - }
678 -
679 - /**
680 - * @param string $ip
681 - * @param bool $xfor
682 - * @param string $reason
683 - * @param int $period
684 - * @param string $tag
685 - * @param string $talkTag
686 - * Lists all users in recent changes who used an IP, newest to oldest down
687 - * Outputs usernames, latest and earliest found edit date, and count
688 - * List unique IPs used for each user in time order, list corresponding user agent
689 - */
690 - protected function doIPUsersRequest( $ip, $xfor = false, $reason = '', $period = 0, $tag='', $talkTag='' ) {
691 - global $wgUser, $wgOut, $wgLang;
692 - $dbr = wfGetDB( DB_SLAVE );
693 - # Invalid IPs are passed in as a blank string
694 - $ip_conds = $this->getIpConds( $dbr, $ip, $xfor );
695 - if( !$ip || $ip_conds === false ) {
696 - $wgOut->addWikiMsg( 'badipaddress' );
697 - return;
698 - }
699 -
700 - $logType = 'ipusers';
701 - if( $xfor ) {
702 - $logType .= '-xff';
703 - }
704 - # Log the check...
705 - if( !$this->addLogEntry( $logType, 'ip', $ip, $reason ) ) {
706 - $wgOut->addHTML( '<p>'.wfMsgHtml('checkuser-log-fail').'</p>' );
707 - }
708 -
709 - $ip_conds = $dbr->makeList( $ip_conds, LIST_AND );
710 - $time_conds = $this->getTimeConds( $period );
711 - $cu_changes = $dbr->tableName( 'cu_changes' );
712 - $index = $xfor ? 'cuc_xff_hex_time' : 'cuc_ip_hex_time';
713 - # Ordered in descent by timestamp. Can cause large filesorts on range scans.
714 - # Check how many rows will need sorting ahead of time to see if this is too big.
715 - if( strpos($ip,'/') !==false ) {
716 - # Quick index check only OK if no time constraint
717 - if( $period ) {
718 - $rangecount = $dbr->selectField( 'cu_changes', 'COUNT(*)',
719 - array( $ip_conds, $time_conds ),
720 - __METHOD__,
721 - array( 'USE INDEX' => $index ) );
722 - } else {
723 - $rangecount = $dbr->estimateRowCount( 'cu_changes', '*',
724 - array( $ip_conds ),
725 - __METHOD__,
726 - array( 'USE INDEX' => $index ) );
727 - }
728 - // Sorting might take some time...make sure it is there
729 - wfSuppressWarnings();
730 - set_time_limit(120);
731 - wfRestoreWarnings();
732 - }
733 - // Are there too many edits?
734 - if( isset($rangecount) && $rangecount > 10000 ) {
735 - $use_index = $dbr->useIndexClause( $index );
736 - $sql = "SELECT cuc_ip_hex, COUNT(*) AS count,
737 - MIN(cuc_timestamp) AS first, MAX(cuc_timestamp) AS last
738 - FROM $cu_changes $use_index WHERE $ip_conds AND $time_conds
739 - GROUP BY cuc_ip_hex ORDER BY cuc_ip_hex LIMIT 5001";
740 - $ret = $dbr->query( $sql, __METHOD__ );
741 - # List out each IP that has edits
742 - $s = '<h5>' . wfMsg('checkuser-too-many') . '</h5>';
743 - $s .= '<ol>';
744 - $counter = 0;
745 - while( $row = $ret->fetchObject() ) {
746 - if( $counter >= 5000 ) {
747 - $wgOut->addHTML( wfMsgExt('checkuser-limited',array('parse')) );
748 - break;
749 - }
750 - # Convert the IP hexes into normal form
751 - if( strpos($row->cuc_ip_hex,'v6-') !==false ) {
752 - $ip = substr( $row->cuc_ip_hex, 3 );
753 - $ip = IP::HextoOctet( $ip );
754 - } else {
755 - $ip = long2ip( wfBaseConvert($row->cuc_ip_hex, 16, 10, 8) );
756 - }
757 - $s .= '<li><a href="'.
758 - $this->getTitle()->escapeLocalURL( 'user='.urlencode($ip).'&reason='.urlencode($reason).'&checktype=subipusers' ) .
759 - '">'.$ip.'</a>';
760 - if( $row->first == $row->last ) {
761 - $s .= ' (' . $wgLang->timeanddate( wfTimestamp(TS_MW,$row->first), true ) . ') ';
762 - } else {
763 - $s .= ' (' . $wgLang->timeanddate( wfTimestamp(TS_MW,$row->first), true ) .
764 - ' -- ' . $wgLang->timeanddate( wfTimestamp(TS_MW,$row->last), true ) . ') ';
765 - }
766 - $s .= " [<strong>" . $row->count . "</strong>]</li>\n";
767 - ++$counter;
768 - }
769 - $s .= '</ol>';
770 - $dbr->freeResult( $ret );
771 -
772 - $wgOut->addHTML( $s );
773 - return;
774 - } else if( isset($rangecount) && !$rangecount ) {
775 - $s = $this->noMatchesMessage($ip)."\n";
776 - $wgOut->addHTML( $s );
777 - return;
778 - }
779 -
780 - global $wgMemc;
781 - # OK, do the real query...
782 - $use_index = $dbr->useIndexClause( $index );
783 - $sql = "SELECT cuc_user_text, cuc_timestamp, cuc_user, cuc_ip, cuc_agent, cuc_xff
784 - FROM $cu_changes $use_index WHERE $ip_conds AND $time_conds
785 - ORDER BY cuc_timestamp DESC LIMIT 10000";
786 - $ret = $dbr->query( $sql, __METHOD__ );
787 -
788 - $users_first = $users_last = $users_edits = $users_ids = array();
789 - if( !$dbr->numRows( $ret ) ) {
790 - $s = $this->noMatchesMessage($ip)."\n";
791 - } else {
792 - global $wgAuth;
793 - while( ($row = $dbr->fetchObject($ret) ) != false ) {
794 - if( !array_key_exists( $row->cuc_user_text, $users_edits ) ) {
795 - $users_last[$row->cuc_user_text] = $row->cuc_timestamp;
796 - $users_edits[$row->cuc_user_text] = 0;
797 - $users_ids[$row->cuc_user_text] = $row->cuc_user;
798 - $users_infosets[$row->cuc_user_text] = array();
799 - $users_agentsets[$row->cuc_user_text] = array();
800 - }
801 - $users_edits[$row->cuc_user_text] += 1;
802 - $users_first[$row->cuc_user_text] = $row->cuc_timestamp;
803 - # Treat blank or NULL xffs as empty strings
804 - $xff = empty($row->cuc_xff) ? null : $row->cuc_xff;
805 - $xff_ip_combo = array( $row->cuc_ip, $xff );
806 - # Add this IP/XFF combo for this username if it's not already there
807 - if( !in_array($xff_ip_combo,$users_infosets[$row->cuc_user_text]) ) {
808 - $users_infosets[$row->cuc_user_text][] = $xff_ip_combo;
809 - }
810 - # Add this agent string if it's not already there; 10 max.
811 - if( count($users_agentsets[$row->cuc_user_text]) < 10 ) {
812 - if( !in_array($row->cuc_agent,$users_agentsets[$row->cuc_user_text]) ) {
813 - $users_agentsets[$row->cuc_user_text][] = $row->cuc_agent;
814 - }
815 - }
816 - }
817 - $dbr->freeResult( $ret );
818 -
819 - $logs = SpecialPage::getTitleFor( 'Log' );
820 - $blocklist = SpecialPage::getTitleFor( 'Ipblocklist' );
821 -
822 - $action = $this->getTitle()->escapeLocalUrl( 'action=block' );
823 - $s = "<form name='checkuserblock' id='checkuserblock' action=\"$action\" method='post'>";
824 - $s .= '<div id="checkuserresults"><ul>';
825 - foreach( $users_edits as $name => $count ) {
826 - $s .= '<li>';
827 - $s .= Xml::check( 'users[]', false, array( 'value' => $name ) ) . '&nbsp;';
828 - # Load user object
829 - $user = User::newFromName( $name, false );
830 - # Add user tool links
831 - $s .= $this->sk->userLink( -1 , $name ) . $this->sk->userToolLinks( -1 , $name );
832 - # Add CheckUser link
833 - $s .= ' (<a href="' . $this->getTitle()->escapeLocalURL( 'user='.urlencode($name) .
834 - '&reason='.urlencode($reason) ) . '">' . wfMsgHtml('checkuser-check') . '</a>)';
835 - # Show edit time range
836 - if( $users_first[$name] == $users_last[$name] ) {
837 - $s .= ' (' . $wgLang->timeanddate( wfTimestamp(TS_MW,$users_first[$name]), true ) . ') ';
838 - } else {
839 - $s .= ' (' . $wgLang->timeanddate( wfTimestamp(TS_MW,$users_first[$name]), true ) .
840 - ' -- ' . $wgLang->timeanddate( wfTimestamp(TS_MW,$users_last[$name]), true ) . ') ';
841 - }
842 - # Total edit count
843 - $s .= ' [<strong>' . $count . '</strong>]<br />';
844 - # Check if this user or IP is blocked. If so, give a link to the block log...
845 - $block = new Block();
846 - $block->fromMaster( false ); // use slaves
847 - $ip = IP::isIPAddress( $name ) ? $name : '';
848 - $flags = array();
849 - if( $block->load( $ip, $users_ids[$name] ) ) {
850 - // Range blocked?
851 - if( IP::isIPAddress($block->mAddress) && strpos($block->mAddress,'/') ) {
852 - $userpage = Title::makeTitle( NS_USER, $block->mAddress );
853 - $blocklog = $this->sk->makeKnownLinkObj( $logs, wfMsgHtml('checkuser-blocked'),
854 - 'type=block&page=' . urlencode( $userpage->getPrefixedText() ) );
855 - $flags[] = '<strong>(' . $blocklog . ' - ' . $block->mAddress . ')</strong>';
856 - // Auto blocked?
857 - } else if( $block->mAuto ) {
858 - $blocklog = $this->sk->makeKnownLinkObj( $blocklist,
859 - wfMsgHtml('checkuser-blocked'), 'ip=' . urlencode( "#{$block->mId}" ) );
860 - $flags[] = '<strong>(' . $blocklog . ')</strong>';
861 - } else {
862 - $userpage = Title::makeTitle( NS_USER, $name );
863 - $blocklog = $this->sk->makeKnownLinkObj( $logs, wfMsgHtml('checkuser-blocked'),
864 - 'type=block&page=' . urlencode( $userpage->getPrefixedText() ) );
865 - $flags[] = '<strong>(' . $blocklog . ')</strong>';
866 - }
867 - // IP that is blocked on all wikis?
868 - } else if( $ip === $name && $user->isBlockedGlobally( $ip ) ) {
869 - $flags[] = '<strong>(' . wfMsgHtml('checkuser-gblocked') . ')</strong>';
870 - } else if( self::userWasBlocked( $name ) ) {
871 - $userpage = Title::makeTitle( NS_USER, $name );
872 - $blocklog = $this->sk->makeKnownLinkObj( $logs, wfMsgHtml('checkuser-wasblocked'),
873 - 'type=block&page=' . urlencode( $userpage->getPrefixedText() ) );
874 - $flags[] = '<strong>(' . $blocklog . ')</strong>';
875 - }
876 - # Show if account is local only
877 - $authUser = $wgAuth->getUserInstance( $user );
878 - if( $user->getId() && $authUser->getId() === 0 ) {
879 - $flags[] = '<strong>(' . wfMsgHtml('checkuser-localonly') . ')</strong>';
880 - }
881 - # Check for extra user rights...
882 - if( $users_ids[$name] ) {
883 - $user = User::newFromId( $users_ids[$name] );
884 - if( $user->isLocked() ) {
885 - $flags[] = '<b>(' . wfMsgHtml('checkuser-locked') . ')</b>';
886 - }
887 - $list = array();
888 - foreach( $user->getGroups() as $group ) {
889 - $list[] = self::buildGroupLink( $group );
890 - }
891 - $groups = $wgLang->commaList( $list );
892 - if( $groups ) {
893 - $flags[] = '<i>(' . $groups . ')</i>';
894 - }
895 - }
896 - # Check how many accounts the user made recently?
897 - if( $ip ) {
898 - $key = wfMemcKey( 'acctcreate', 'ip', $ip );
899 - $count = intval( $wgMemc->get( $key ) );
900 - if( $count ) {
901 - $flags[] = '<strong>[' . wfMsgExt( 'checkuser-accounts', 'parsemag', $wgLang->formatNum( $count ) ) . ']</strong>';
902 - }
903 - }
904 - $s .= implode(' ',$flags);
905 - $s .= '<ol>';
906 - # List out each IP/XFF combo for this username
907 - for( $i = (count($users_infosets[$name]) - 1); $i >= 0; $i-- ) {
908 - $set = $users_infosets[$name][$i];
909 - # IP link
910 - $s .= '<li>';
911 - $s .= '<a href="'.$this->getTitle()->escapeLocalURL( 'user='.urlencode($set[0]) ).'">'.htmlspecialchars($set[0]).'</a>';
912 - # XFF string, link to /xff search
913 - if( $set[1] ) {
914 - # Flag our trusted proxies
915 - list($client,$trusted) = efGetClientIPfromXFF($set[1],$set[0]);
916 - $c = $trusted ? '#F0FFF0' : '#FFFFCC';
917 - $s .= '&nbsp;&nbsp;&nbsp;<span style="background-color: '.$c.'"><strong>XFF</strong>: ';
918 - $s .= $this->sk->makeKnownLinkObj( $this->getTitle(),
919 - htmlspecialchars( $set[1] ),
920 - "user=" . urlencode( $client ) . "/xff" )."</span>";
921 - }
922 - $s .= "</li>\n";
923 - }
924 - $s .= '</ol><br /><ol>';
925 - # List out each agent for this username
926 - for( $i = (count($users_agentsets[$name]) - 1); $i >= 0; $i-- ) {
927 - $agent = $users_agentsets[$name][$i];
928 - $s .= "<li><i>" . htmlspecialchars($agent) . "</i></li>\n";
929 - }
930 - $s .= '</ol>';
931 - $s .= '</li>';
932 - }
933 - $s .= "</ul></div>\n";
934 - if( $wgUser->isAllowed('block') && !$wgUser->isBlocked() ) {
935 - $s .= "<fieldset>\n";
936 - $s .= "<legend>" . wfMsgHtml('checkuser-massblock') . "</legend>\n";
937 - $s .= "<p>" . wfMsgExt('checkuser-massblock-text',array('parseinline')) . "</p>\n";
938 - $s .= '<table><tr>' .
939 - '<td>' . Xml::check( 'usetag', false, array('id' => 'usetag') ) . '</td>' .
940 - '<td>' . Xml::label( wfMsgHtml( "checkuser-blocktag" ), 'usetag' ) . '</td>' .
941 - '<td>' . Xml::input( 'tag', 46, $tag, array('id' => 'blocktag') ) . '</td>' .
942 - '</tr><tr>' .
943 - '<td>' . Xml::check( 'usettag', false, array('id' => 'usettag') ) . '</td>' .
944 - '<td>' . Xml::label( wfMsgHtml( "checkuser-blocktag-talk" ), 'usettag' ) . '</td>' .
945 - '<td>' . Xml::input( 'talktag', 46, $talkTag, array('id' => 'talktag') ).'</td>'.
946 - '</tr></table>';
947 - $s .= "<p>" . wfMsgHtml( "checkuser-reason" ) . '&nbsp;';
948 - $s .= Xml::input( 'blockreason', 46, '', array( 'maxlength' => '150', 'id' => 'blockreason' ) );
949 - $s .= '&nbsp;' . Xml::submitButton( wfMsgHtml('checkuser-massblock-commit'),
950 - array('id' => 'checkuserblocksubmit','name' => 'checkuserblock') ) . "</p>\n";
951 - $s .= "</fieldset>\n";
952 - }
953 - $s .= '</form>';
954 - }
955 -
956 - $wgOut->addHTML( $s );
957 - }
958 -
959 - /**
960 - * @param $row
961 - * @return a streamlined recent changes line with IP data
962 - */
963 - protected function CUChangesLine( $row, $reason ) {
964 - global $wgLang;
965 - # Add date headers
966 - $date = $wgLang->date( wfTimestamp(TS_MW,$row->cuc_timestamp), true, true );
967 - if( !isset($this->lastdate) ) {
968 - $this->lastdate = $date;
969 - $line = "\n<h4>$date</h4>\n<ul class=\"special\">";
970 - } else if( $date != $this->lastdate ) {
971 - $line = "</ul>\n<h4>$date</h4>\n<ul class=\"special\">";
972 - $this->lastdate = $date;
973 - } else {
974 - $line = '';
975 - }
976 - $line .= "<li>";
977 - # Create diff/hist/page links
978 - $line .= $this->getLinksFromRow( $row );
979 - # Show date
980 - $line .= ' . . ' . $wgLang->time( wfTimestamp(TS_MW,$row->cuc_timestamp), true, true ) . ' . . ';
981 - # Userlinks
982 - $line .= $this->sk->userLink( $row->cuc_user, $row->cuc_user_text );
983 - $line .= $this->sk->userToolLinks( $row->cuc_user, $row->cuc_user_text );
984 - # Action text, hackish ...
985 - if( $row->cuc_actiontext )
986 - $line .= ' ' . $this->sk->formatComment( $row->cuc_actiontext ) . ' ';
987 - # Comment
988 - $line .= $this->sk->commentBlock( $row->cuc_comment );
989 -
990 - $cuTitle = SpecialPage::getTitleFor( 'CheckUser' );
991 - $line .= '<br />&nbsp; &nbsp; &nbsp; &nbsp; <small>';
992 - # IP
993 - $line .= ' <strong>IP</strong>: '.$this->sk->makeKnownLinkObj( $cuTitle,
994 - htmlspecialchars( $row->cuc_ip ),
995 - "user=".urlencode( $row->cuc_ip ).'&reason='.urlencode($reason) );
996 - # XFF
997 - if( $row->cuc_xff !=null ) {
998 - # Flag our trusted proxies
999 - list($client,$trusted) = efGetClientIPfromXFF($row->cuc_xff,$row->cuc_ip);
1000 - $c = $trusted ? '#F0FFF0' : '#FFFFCC';
1001 - $line .= '&nbsp;&nbsp;&nbsp;<span class="mw-checkuser-xff" style="background-color: '.$c.'">'.
1002 - '<strong>XFF</strong>: ';
1003 - $line .= $this->sk->makeKnownLinkObj( $cuTitle,
1004 - htmlspecialchars( $row->cuc_xff ),
1005 - "user=".urlencode($client)."/xff&reason=".urlencode($reason) )."</span>";
1006 - }
1007 - # User agent
1008 - $line .= '&nbsp;&nbsp;&nbsp;<span class="mw-checkuser-agent" style="color:#888;">' .
1009 - htmlspecialchars( $row->cuc_agent )."</span>";
1010 -
1011 - $line .= "</small></li>\n";
1012 -
1013 - return $line;
1014 - }
1015 -
1016 - /**
1017 - * @param $row
1018 - * @create diff/hist/page link
1019 - */
1020 - protected function getLinksFromRow( $row ) {
1021 - // Log items (old format) and events to logs
1022 - if( $row->cuc_type == RC_LOG && $row->cuc_namespace == NS_SPECIAL ) {
1023 - list( $specialName, $logtype ) = SpecialPage::resolveAliasWithSubpage( $row->cuc_title );
1024 - $logname = LogPage::logName( $logtype );
1025 - $title = Title::makeTitle( $row->cuc_namespace, $row->cuc_title );
1026 - $links = '(' . $this->sk->makeKnownLinkObj( $title, $logname ) . ')';
1027 - // Log items
1028 - } elseif( $row->cuc_type == RC_LOG ) {
1029 - $title = Title::makeTitle( $row->cuc_namespace, $row->cuc_title );
1030 - $links = '(' . $this->sk->makeKnownLinkObj( SpecialPage::getTitleFor( 'Log' ), $this->message['log'],
1031 - wfArrayToCGI( array('page' => $title->getPrefixedText() ) ) ) . ')';
1032 - } else {
1033 - $title = Title::makeTitle( $row->cuc_namespace, $row->cuc_title );
1034 - # New pages
1035 - if( $row->cuc_type == RC_NEW ) {
1036 - $links = '(' . $this->message['diff'] . ') ';
1037 - } else {
1038 - # Diff link
1039 - $links = ' (' . $this->sk->makeKnownLinkObj( $title, $this->message['diff'],
1040 - wfArrayToCGI( array(
1041 - 'curid' => $row->cuc_page_id,
1042 - 'diff' => $row->cuc_this_oldid,
1043 - 'oldid' => $row->cuc_last_oldid ) ) ) . ') ';
1044 - }
1045 - # History link
1046 - $links .= ' (' . $this->sk->makeKnownLinkObj( $title, $this->message['hist'],
1047 - wfArrayToCGI( array(
1048 - 'curid' => $row->cuc_page_id,
1049 - 'action' => 'history' ) ) ) . ') . . ';
1050 - # Some basic flags
1051 - if( $row->cuc_type == RC_NEW )
1052 - $links .= '<span class="newpage">' . $this->message['newpageletter'] . '</span>';
1053 - if( $row->cuc_minor )
1054 - $links .= '<span class="minor">' . $this->message['minoreditletter'] . '</span>';
1055 - # Page link
1056 - $links .= ' ' . $this->sk->makeLinkObj( $title );
1057 - }
1058 - return $links;
1059 - }
1060 -
1061 - protected static function userWasBlocked( $name ) {
1062 - $userpage = Title::makeTitle( NS_USER, $name );
1063 - return wfGetDB( DB_SLAVE )->selectField( 'logging', '1',
1064 - array( 'log_type' => array('block','suppress'),
1065 - 'log_action' => 'block',
1066 - 'log_namespace' => $userpage->getNamespace(),
1067 - 'log_title' => $userpage->getDBKey() ),
1068 - __METHOD__,
1069 - array( 'USE INDEX' => 'page_time' ) );
1070 - }
1071 -
1072 - /**
1073 - * Format a link to a group description page
1074 - *
1075 - * @param string $group
1076 - * @return string
1077 - */
1078 - protected static function buildGroupLink( $group ) {
1079 - static $cache = array();
1080 - if( !isset( $cache[$group] ) )
1081 - $cache[$group] = User::makeGroupLinkHtml( $group, User::getGroupMember( $group ) );
1082 - return $cache[$group];
1083 - }
1084 -
1085 - /**
1086 - * @param Database $db
1087 - * @param string $ip
1088 - * @param string $xfor
1089 - * @return mixed array/false conditions
1090 - */
1091 - protected function getIpConds( $db, $ip, $xfor = false ) {
1092 - $type = ( $xfor ) ? 'xff' : 'ip';
1093 - // IPv4 CIDR, 16-32 bits
1094 - if( preg_match( '#^(\d+\.\d+\.\d+\.\d+)/(\d+)$#', $ip, $matches ) ) {
1095 - if( $matches[2] < 16 || $matches[2] > 32 )
1096 - return false; // invalid
1097 - list( $start, $end ) = IP::parseRange( $ip );
1098 - return array( 'cuc_'.$type.'_hex BETWEEN ' . $db->addQuotes( $start ) . ' AND ' . $db->addQuotes( $end ) );
1099 - } else if( preg_match( '#^\w{1,4}:\w{1,4}:\w{1,4}:\w{1,4}:\w{1,4}:\w{1,4}:\w{1,4}:\w{1,4}/(\d+)$#', $ip, $matches ) ) {
1100 - // IPv6 CIDR, 96-128 bits
1101 - if( $matches[1] < 96 || $matches[1] > 128 )
1102 - return false; // invalid
1103 - list( $start, $end ) = IP::parseRange6( $ip );
1104 - return array( 'cuc_'.$type.'_hex BETWEEN ' . $db->addQuotes( $start ) . ' AND ' . $db->addQuotes( $end ) );
1105 - } else if( preg_match( '#^(\d+)\.(\d+)\.(\d+)\.(\d+)$#', $ip ) ) {
1106 - // 32 bit IPv4
1107 - $ip_hex = IP::toHex( $ip );
1108 - return array( 'cuc_'.$type.'_hex' => $ip_hex );
1109 - } else if( preg_match( '#^\w{1,4}:\w{1,4}:\w{1,4}:\w{1,4}:\w{1,4}:\w{1,4}:\w{1,4}:\w{1,4}$#', $ip ) ) {
1110 - // 128 bit IPv6
1111 - $ip_hex = IP::toHex( $ip );
1112 - return array( 'cuc_'.$type.'_hex' => $ip_hex );
1113 - }
1114 - // throw away this query, incomplete IP, these don't get through the entry point anyway
1115 - return false; // invalid
1116 - }
1117 -
1118 - protected function getTimeConds( $period ) {
1119 - if( !$period ) {
1120 - return "1 = 1";
1121 - }
1122 - $dbr = wfGetDB( DB_SLAVE );
1123 - $cutoff_unixtime = time() - ($period * 24 * 3600);
1124 - $cutoff_unixtime = $cutoff_unixtime - ($cutoff_unixtime % 86400);
1125 - $cutoff = $dbr->addQuotes( $dbr->timestamp( $cutoff_unixtime ) );
1126 - return "cuc_timestamp > $cutoff";
1127 - }
1128 -
1129 - protected function showLog() {
1130 - global $wgRequest, $wgOut;
1131 - $type = $wgRequest->getVal( 'cuSearchType' );
1132 - $target = $wgRequest->getVal( 'cuSearch' );
1133 - $year = $wgRequest->getIntOrNull( 'year' );
1134 - $month = $wgRequest->getIntOrNull( 'month' );
1135 - $error = false;
1136 - $dbr = wfGetDB( DB_SLAVE );
1137 - $searchConds = false;
1138 -
1139 - $wgOut->setPageTitle( wfMsg( 'checkuser-log' ) );
1140 -
1141 - $wgOut->addHTML( $this->sk->makeKnownLinkObj( $this->getTitle(), wfMsgHtml( 'checkuser-log-return' ) ) );
1142 -
1143 - if ( $type === null ) {
1144 - $type = 'target';
1145 - } elseif ( $type == 'initiator' ) {
1146 - $user = User::newFromName( $target );
1147 - if ( !$user || !$user->getID() ) {
1148 - $error = 'checkuser-user-nonexistent';
1149 - } else {
1150 - $searchConds = array( 'cul_user' => $user->getID() );
1151 - }
1152 - } else /* target */ {
1153 - $type = 'target';
1154 - // Is it an IP?
1155 - list( $start, $end ) = IP::parseRange( $target );
1156 - if ( $start !== false ) {
1157 - if ( $start == $end ) {
1158 - $searchConds = array( 'cul_target_hex = ' . $dbr->addQuotes( $start ) . ' OR ' .
1159 - '(cul_range_end >= ' . $dbr->addQuotes( $start ) . ' AND ' .
1160 - 'cul_range_start <= ' . $dbr->addQuotes( $end ) . ')'
1161 - );
1162 - } else {
1163 - $searchConds = array(
1164 - '(cul_target_hex >= ' . $dbr->addQuotes( $start ) . ' AND ' .
1165 - 'cul_target_hex <= ' . $dbr->addQuotes( $end ) . ') OR ' .
1166 - '(cul_range_end >= ' . $dbr->addQuotes( $start ) . ' AND ' .
1167 - 'cul_range_start <= ' . $dbr->addQuotes( $end ) . ')'
1168 - );
1169 - }
1170 - } else {
1171 - // Is it a user?
1172 - $user = User::newFromName( $target );
1173 - if ( $user && $user->getID() ) {
1174 - $searchConds = array(
1175 - 'cul_type' => 'userips',
1176 - 'cul_target_id' => $user->getID(),
1177 - );
1178 - } else if ( $target ) {
1179 - $error = 'checkuser-user-nonexistent';
1180 - }
1181 - }
1182 - }
1183 -
1184 - $searchTypes = array( 'initiator', 'target' );
1185 - $select = "<select name=\"cuSearchType\" style='margin-top:.2em;'>\n";
1186 - foreach ( $searchTypes as $searchType ) {
1187 - if ( $type == $searchType ) {
1188 - $checked = 'selected="selected"';
1189 - } else {
1190 - $checked = '';
1191 - }
1192 - $caption = wfMsgHtml( 'checkuser-search-' . $searchType );
1193 - $select .= "<option value=\"$searchType\" $checked>$caption</option>\n";
1194 - }
1195 - $select .= "</select>";
1196 -
1197 - $encTarget = htmlspecialchars( $target );
1198 - $msgSearch = wfMsgHtml( 'checkuser-search' );
1199 - $input = "<input type=\"text\" name=\"cuSearch\" value=\"$encTarget\" size=\"40\"/>";
1200 - $msgSearchForm = wfMsgHtml( 'checkuser-search-form', $select, $input );
1201 - $formAction = $this->getLogSubpageTitle()->escapeLocalURL();
1202 - $msgSearchSubmit = '&nbsp;&nbsp;' . wfMsgHtml( 'checkuser-search-submit' ) . '&nbsp;&nbsp;';
1203 -
1204 - $s = "<form method='get' action=\"$formAction\">\n" .
1205 - "<fieldset><legend>$msgSearch</legend>\n" .
1206 - "<p>$msgSearchForm</p>\n" .
1207 - "<p>" . $this->getDateMenu( $year, $month ) . "&nbsp;&nbsp;&nbsp;\n" .
1208 - "<input type=\"submit\" name=\"cuSearchSubmit\" value=\"$msgSearchSubmit\"/></p>\n" .
1209 - "</fieldset></form>\n";
1210 - $wgOut->addHTML( $s );
1211 -
1212 - if ( $error !== false ) {
1213 - $wgOut->addWikiText( '<div class="errorbox">' . wfMsg( $error ) . '</div>' );
1214 - return;
1215 - }
1216 -
1217 - $pager = new CheckUserLogPager( $this, $searchConds, $year, $month );
1218 - $wgOut->addHTML(
1219 - $pager->getNavigationBar() .
1220 - $pager->getBody() .
1221 - $pager->getNavigationBar() );
1222 - }
1223 -
1224 - /**
1225 - * @return string Formatted HTML
1226 - * @param int $year
1227 - * @param int $month
1228 - */
1229 - protected function getDateMenu( $year, $month ) {
1230 - # Offset overrides year/month selection
1231 - if( $month && $month !== -1 ) {
1232 - $encMonth = intval( $month );
1233 - } else {
1234 - $encMonth = '';
1235 - }
1236 - if ( $year ) {
1237 - $encYear = intval( $year );
1238 - } else if( $encMonth ) {
1239 - $thisMonth = intval( gmdate( 'n' ) );
1240 - $thisYear = intval( gmdate( 'Y' ) );
1241 - if( intval($encMonth) > $thisMonth ) {
1242 - $thisYear--;
1243 - }
1244 - $encYear = $thisYear;
1245 - } else {
1246 - $encYear = '';
1247 - }
1248 - return Xml::label( wfMsg( 'year' ), 'year' ) . ' '.
1249 - Xml::input( 'year', 4, $encYear, array('id' => 'year', 'maxlength' => 4) ) .
1250 - ' '.
1251 - Xml::label( wfMsg( 'month' ), 'month' ) . ' '.
1252 - Xml::monthSelector( $encMonth, -1 );
1253 - }
1254 -
1255 - protected function addLogEntry( $logType, $targetType, $target, $reason, $targetID = 0 ) {
1256 - global $wgUser;
1257 -
1258 - if ( $targetType == 'ip' ) {
1259 - list( $rangeStart, $rangeEnd ) = IP::parseRange( $target );
1260 - $targetHex = $rangeStart;
1261 - if ( $rangeStart == $rangeEnd ) {
1262 - $rangeStart = $rangeEnd = '';
1263 - }
1264 - } else {
1265 - $targetHex = $rangeStart = $rangeEnd = '';
1266 - }
1267 -
1268 - $dbw = wfGetDB( DB_MASTER );
1269 - $cul_id = $dbw->nextSequenceValue( 'cu_log_cul_id_seq' );
1270 - $dbw->insert( 'cu_log',
1271 - array(
1272 - 'cul_id' => $cul_id,
1273 - 'cul_timestamp' => $dbw->timestamp(),
1274 - 'cul_user' => $wgUser->getID(),
1275 - 'cul_user_text' => $wgUser->getName(),
1276 - 'cul_reason' => $reason,
1277 - 'cul_type' => $logType,
1278 - 'cul_target_id' => $targetID,
1279 - 'cul_target_text' => $target,
1280 - 'cul_target_hex' => $targetHex,
1281 - 'cul_range_start' => $rangeStart,
1282 - 'cul_range_end' => $rangeEnd,
1283 - ), __METHOD__ );
1284 - return true;
1285 - }
1286 -}
\ No newline at end of file
Index: branches/new-checkuser/CheckUser_body.php
@@ -5,9 +5,1325 @@
66 exit( 1 );
77 }
88
 9+class CheckUser extends SpecialPage {
910
10 -class CheckUser
11 -{
 11+ /**
 12+ * Constructor -- set up the new special page
 13+ */
 14+ public function __construct() {
 15+ global $wgUser;
 16+ if ( $wgUser->isAllowed( 'checkuser' ) || !$wgUser->isAllowed( 'checkuser-log' ) ) {
 17+ parent::__construct( 'CheckUser', 'checkuser' );
 18+ } else {
 19+ parent::__construct( 'CheckUser', 'checkuser-log' );
 20+ }
 21+ wfLoadExtensionMessages( 'CheckUser' );
 22+ }
 23+
 24+ public function execute( $subpage ) {
 25+ global $wgRequest, $wgOut, $wgUser, $wgContLang;
 26+
 27+ $this->setHeaders();
 28+ $this->sk = $wgUser->getSkin();
 29+
 30+ // This is horribly shitty.
 31+ // Lacking formal aliases, it's tough to ensure we have compatibility.
 32+ // Links may break, which sucks.
 33+ // Language fallbacks will not always be properly utilized.
 34+ $logMatches = array(
 35+ wfMsgForContent( 'checkuser-log-subpage' ),
 36+ 'Log'
 37+ );
 38+
 39+ foreach( $logMatches as $log ) {
 40+ if ( str_replace( '_', ' ', $wgContLang->lc( $subpage ) )
 41+ == str_replace( '_ ', ' ', $wgContLang->lc( $log ) ) ) {
 42+ if( !$wgUser->isAllowed( 'checkuser-log' ) ) {
 43+ $wgOut->permissionRequired( 'checkuser-log' );
 44+ return;
 45+ }
 46+
 47+ $this->showLog();
 48+ return;
 49+ }
 50+ }
 51+
 52+ if( !$wgUser->isAllowed( 'checkuser' ) ) {
 53+ if ( $wgUser->isAllowed( 'checkuser-log' ) ) {
 54+ $wgOut->addWikiText( wfMsg( 'checkuser-summary' ) .
 55+ "\n\n[[" . $this->getLogSubpageTitle()->getPrefixedText() .
 56+ '|' . wfMsg( 'checkuser-showlog' ) . ']]'
 57+ );
 58+ return;
 59+ }
 60+
 61+ $wgOut->permissionRequired( 'checkuser' );
 62+ return;
 63+ }
 64+
 65+ $user = $wgRequest->getText( 'user' ) ?
 66+ $wgRequest->getText( 'user' ) : $wgRequest->getText( 'ip' );
 67+ $user = trim( $user );
 68+ $reason = $wgRequest->getText( 'reason' );
 69+ $blockreason = $wgRequest->getText( 'blockreason' );
 70+ $checktype = $wgRequest->getVal( 'checktype' );
 71+ $period = $wgRequest->getInt( 'period' );
 72+ $users = $wgRequest->getArray( 'users' );
 73+ $tag = $wgRequest->getBool('usetag') ? trim( $wgRequest->getVal( 'tag' ) ) : '';
 74+ $talkTag = $wgRequest->getBool('usettag') ? trim( $wgRequest->getVal( 'talktag' ) ) : '';
 75+
 76+ # An IPv4? An IPv6? CIDR included?
 77+ if( IP::isIPAddress( $user ) ) {
 78+ $ip = IP::sanitizeIP( $user );
 79+ $name = '';
 80+ $xff = '';
 81+ # An IPv4/IPv6 XFF string? CIDR included?
 82+ } elseif( preg_match( '/^(.+)\/xff$/', $user, $m ) && IP::isIPAddress( $m[1] ) ) {
 83+ $ip = '';
 84+ $name = '';
 85+ $xff = IP::sanitizeIP( $m[1] );
 86+ # A user?
 87+ } else {
 88+ $ip = '';
 89+ $name = $user;
 90+ $xff = '';
 91+ }
 92+
 93+ $this->doForm( $user, $reason, $checktype, $ip, $xff, $name, $period );
 94+ # Perform one of the various submit operations...
 95+ if( $wgRequest->wasPosted() ) {
 96+ if( $wgRequest->getVal( 'action' ) === 'block' ) {
 97+ $this->doMassUserBlock( $users, $blockreason, $tag, $talkTag );
 98+ } elseif( !$this->checkReason( $reason ) ) {
 99+ $wgOut->addWikiText( wfMsgExt( 'checkuser-noreason', array( 'parsemag' ) ) );
 100+ } elseif( $checktype == 'subuserips' ) {
 101+ $this->doUserIPsRequest( $name, $reason, $period );
 102+ } elseif( $xff && $checktype == 'subipedits' ) {
 103+ $this->doIPEditsRequest( $xff, true, $reason, $period );
 104+ } elseif( $checktype == 'subipedits' ) {
 105+ $this->doIPEditsRequest( $ip, false, $reason, $period );
 106+ } elseif( $xff && $checktype == 'subipusers' ) {
 107+ $this->doIPUsersRequest( $xff, true, $reason, $period, $tag, $talkTag );
 108+ } elseif( $checktype == 'subipusers' ) {
 109+ $this->doIPUsersRequest( $ip, false, $reason, $period, $tag, $talkTag );
 110+ } elseif( $checktype == 'subuseredits' ) {
 111+ $this->doUserEditsRequest( $user, $reason, $period );
 112+ }
 113+ }
 114+ # Add CIDR calculation convenience form
 115+ $this->addJsCIDRForm();
 116+ $this->addStyles();
 117+ }
 118+
 119+ /**
 120+ * As we use the same small set of messages in various methods and that
 121+ * they are called often, we call them once and save them in $this->message
 122+ */
 123+ protected function preCacheMessages() {
 124+ // Precache various messages
 125+ if( !isset( $this->message ) ) {
 126+ foreach( explode( ' ', 'diff hist minoreditletter newpageletter blocklink log' ) as $msg ) {
 127+ $this->message[$msg] = wfMsgExt( $msg, array( 'escape' ) );
 128+ }
 129+ }
 130+ }
 131+
 132+ public function getLogSubpageTitle() {
 133+ if ( !isset( $this->logSubpageTitle ) ) {
 134+ $this->logSubpageTitle = $this->getTitle( wfMsgForContent( 'checkuser-log-subpage' ) );
 135+ }
 136+ return $this->logSubpageTitle;
 137+ }
 138+
 139+ protected function doForm( $user, $reason, $checktype, $ip, $xff, $name, $period ) {
 140+ global $wgOut, $wgUser;
 141+ $action = $this->getTitle()->escapeLocalUrl();
 142+ # Fill in requested type if it makes sense
 143+ $encipusers = $encipedits = $encuserips = $encuseredits = 0;
 144+ if( $checktype == 'subipusers' && ( $ip || $xff ) ) {
 145+ $encipusers = 1;
 146+ } elseif( $checktype == 'subipedits' && ( $ip || $xff ) ) {
 147+ $encipedits = 1;
 148+ } elseif( $checktype == 'subuserips' && $name ) {
 149+ $encuserips = 1;
 150+ } elseif( $checktype == 'subuseredits' && $name ) {
 151+ $encuseredits = 1;
 152+ # Defaults otherwise
 153+ } elseif( $ip || $xff ) {
 154+ $encipedits = 1;
 155+ } else {
 156+ $encuserips = 1;
 157+ }
 158+ # Compile our nice form
 159+ # User box length should fit things like "2001:0db8:85a3:08d3:1319:8a2e:0370:7344/100/xff"
 160+ if( $wgUser->isAllowed( 'checkuser-log' ) ) {
 161+ $wgOut->addWikiText( wfMsg( 'checkuser-summary' ) .
 162+ "\n\n[[" . $this->getLogSubpageTitle()->getPrefixedText() .
 163+ '|' . wfMsg( 'checkuser-showlog' ) . ']]'
 164+ );
 165+ }
 166+ $form = "<form name='checkuserform' id='checkuserform' action=\"$action\" method='post'>";
 167+ $form .= '<fieldset><legend>' . wfMsgHtml( 'checkuser-query' ) . '</legend>';
 168+ $form .= '<table border="0" cellpadding="2"><tr>';
 169+ $form .= '<td>' . wfMsgHtml( 'checkuser-target' ) . '</td>';
 170+ $form .= '<td>' . Xml::input( 'user', 46, $user, array( 'id' => 'checktarget' ) );
 171+ $form .= '&nbsp;' . $this->getPeriodMenu( $period ) . '</td>';
 172+ $form .= '</tr><tr>';
 173+ $form .= '<td></td><td class="checkuserradios"><table border="0" cellpadding="3"><tr>';
 174+ $form .= '<td>' . Xml::radio( 'checktype', 'subuserips', $encuserips, array( 'id' => 'subuserips' ) );
 175+ $form .= ' ' . Xml::label( wfMsgHtml( 'checkuser-ips' ), 'subuserips' ) . '</td>';
 176+ $form .= '<td>' . Xml::radio( 'checktype', 'subipedits', $encipedits, array( 'id' => 'subipedits' ) );
 177+ $form .= ' ' . Xml::label( wfMsgHtml( 'checkuser-edits' ), 'subipedits' ) . '</td>';
 178+ $form .= '<td>' . Xml::radio( 'checktype', 'subipusers', $encipusers, array( 'id' => 'subipusers' ) );
 179+ $form .= ' ' . Xml::label( wfMsgHtml( 'checkuser-users' ), 'subipusers' ) . '</td>';
 180+ $form .= '<td>' . Xml::radio( 'checktype', 'subuseredits', $encuseredits, array( 'id' => 'subuseredits' ) );
 181+ $form .= ' ' . Xml::label( wfMsgHtml( 'checkuser-account' ), 'subuseredits' ) . '</td>';
 182+ $form .= '</tr></table></td>';
 183+ $form .= '</tr><tr>';
 184+ $form .= '<td>' . wfMsgHtml( 'checkuser-reason' ) . '</td>';
 185+ $form .= '<td>' . Xml::input( 'reason', 46, $reason, array( 'maxlength' => '150', 'id' => 'checkreason' ) );
 186+ $form .= '&nbsp; &nbsp;' . Xml::submitButton( wfMsgHtml( 'checkuser-check' ),
 187+ array( 'id' => 'checkusersubmit', 'name' => 'checkusersubmit' ) ) . '</td>';
 188+ $form .= '</tr></table></fieldset></form>';
 189+ # Output form
 190+ $wgOut->addHTML( $form );
 191+ }
 192+
 193+ /**
 194+ * Add CSS/JS
 195+ */
 196+ protected function addStyles() {
 197+ global $wgScriptPath, $wgCheckUserStyleVersion, $wgOut;
 198+ $encJSFile = htmlspecialchars( "$wgScriptPath/extensions/CheckUser/checkuser.js?$wgCheckUserStyleVersion" );
 199+ $wgOut->addScript( "<script type=\"text/javascript\" src=\"$encJSFile\"></script>" );
 200+ }
 201+
 202+ /**
 203+ * Get a selector of time period options
 204+ * @param int $selected, selected level
 205+ */
 206+ protected function getPeriodMenu( $selected = null ) {
 207+ $s = '<label for="period">' . wfMsgHtml( 'checkuser-period' ) . '</label>&nbsp;';
 208+ $s .= Xml::openElement( 'select', array( 'name' => 'period', 'id' => 'period', 'style' => 'margin-top:.2em;' ) );
 209+ $s .= Xml::option( wfMsg( 'checkuser-week-1' ), 7, $selected === 7 );
 210+ $s .= Xml::option( wfMsg( 'checkuser-week-2' ), 14, $selected === 14 );
 211+ $s .= Xml::option( wfMsg( 'checkuser-month' ), 31, $selected === 31 );
 212+ $s .= Xml::option( wfMsg( 'checkuser-all' ), 0, $selected === 0 );
 213+ $s .= Xml::closeElement( 'select' ) . "\n";
 214+ return $s;
 215+ }
 216+
 217+ /**
 218+ * Make a quick JS form for admins to calculate block ranges
 219+ */
 220+ protected function addJsCIDRForm() {
 221+ global $wgOut;
 222+ $s = '<fieldset id="mw-checkuser-cidrform" style="display:none; clear:both;">' .
 223+ '<legend>' . wfMsgHtml( 'checkuser-cidr-label' ) . '</legend>';
 224+ $s .= '<textarea id="mw-checkuser-iplist" rows="5" cols="50" onkeyup="updateCIDRresult()" onclick="updateCIDRresult()"></textarea><br />';
 225+ $s .= wfMsgHtml( 'checkuser-cidr-res' ) . '&nbsp;' .
 226+ Xml::input( 'mw-checkuser-cidr-res', 35, '', array( 'id' => 'mw-checkuser-cidr-res' ) ) .
 227+ '&nbsp;<strong id="mw-checkuser-ipnote"></strong>';
 228+ $s .= '</fieldset>';
 229+ $wgOut->addHTML( $s );
 230+ }
 231+
 232+ /**
 233+ * Block a list of selected users
 234+ * @param array $users
 235+ * @param string $reason
 236+ * @param string $tag
 237+ */
 238+ protected function doMassUserBlock( $users, $reason = '', $tag = '', $talkTag = '' ) {
 239+ global $wgOut, $wgUser, $wgCheckUserMaxBlocks, $wgLang;
 240+ if( empty( $users ) || $wgUser->isBlocked( false ) ) {
 241+ $wgOut->addWikiText( wfMsgExt( 'checkuser-block-failure', array( 'parsemag' ) ) );
 242+ return;
 243+ } elseif( count( $users ) > $wgCheckUserMaxBlocks ) {
 244+ $wgOut->addWikiText( wfMsgExt( 'checkuser-block-limit', array( 'parsemag' ) ) );
 245+ return;
 246+ } elseif( !$reason ) {
 247+ $wgOut->addWikiText( wfMsgExt( 'checkuser-block-noreason', array( 'parsemag' ) ) );
 248+ return;
 249+ }
 250+ $safeUsers = IPBlockForm::doMassUserBlock( $users, $reason, $tag, $talkTag );
 251+ if( !empty( $safeUsers ) ) {
 252+ $n = count( $safeUsers );
 253+ $ulist = $wgLang->listToText( $safeUsers );
 254+ $wgOut->addWikiText( wfMsgExt( 'checkuser-block-success', 'parsemag',
 255+ $ulist, $wgLang->formatNum( $n ) ) );
 256+ } else {
 257+ $wgOut->addWikiText( wfMsgExt( 'checkuser-block-failure', 'parsemag' ) );
 258+ }
 259+ }
 260+
 261+ protected function noMatchesMessage( $userName ) {
 262+ global $wgLang;
 263+ $dbr = wfGetDB( DB_SLAVE );
 264+ $user_id = User::idFromName( $userName );
 265+ if( $user_id ) {
 266+ $revEdit = $dbr->selectField( 'revision',
 267+ 'rev_timestamp',
 268+ array( 'rev_user' => $user_id ),
 269+ __METHOD__,
 270+ array( 'ORDER BY' => 'rev_timestamp DESC')
 271+ );
 272+ } else {
 273+ $revEdit = $dbr->selectField( 'revision',
 274+ 'rev_timestamp',
 275+ array( 'rev_user_text' => $userName ),
 276+ __METHOD__,
 277+ array( 'ORDER BY' => 'rev_timestamp DESC')
 278+ );
 279+ }
 280+ $logEdit = 0;
 281+ if( $user_id ) {
 282+ $logEdit = $dbr->selectField( 'logging',
 283+ 'log_timestamp',
 284+ array( 'log_user' => $user_id ),
 285+ __METHOD__,
 286+ array( 'ORDER BY' => 'log_timestamp DESC')
 287+ );
 288+ }
 289+ $lastEdit = max( $revEdit, $logEdit );
 290+ if( $lastEdit ) {
 291+ $lastEditDate = $wgLang->date( wfTimestamp( TS_MW, $lastEdit ), true );
 292+ $lastEditTime = $wgLang->time( wfTimestamp( TS_MW, $lastEdit ), true );
 293+ return wfMsgExt( 'checkuser-nomatch-edits', 'parse', $lastEditDate, $lastEditTime );
 294+ }
 295+ return wfMsgExt( 'checkuser-nomatch','parse' );
 296+ }
 297+
 298+ protected function checkReason( $reason ) {
 299+ global $wgCheckUserForceSummary;
 300+ return ( !$wgCheckUserForceSummary || strlen( $reason ) );
 301+ }
 302+
 303+ /**
 304+ * @param string $ip
 305+ * @param bool $xfor
 306+ * @param string $reason
 307+ * Get all IPs used by a user
 308+ * Shows first and last date and number of edits
 309+ */
 310+ protected function doUserIPsRequest( $user , $reason = '', $period = 0 ) {
 311+ global $wgOut, $wgLang, $wgUser;
 312+
 313+ $userTitle = Title::newFromText( $user, NS_USER );
 314+ if( !is_null( $userTitle ) ) {
 315+ // normalize the username
 316+ $user = $userTitle->getText();
 317+ }
 318+ # IPs are passed in as a blank string
 319+ if( !$user ) {
 320+ $wgOut->addWikiMsg( 'nouserspecified' );
 321+ return;
 322+ }
 323+ # Get ID, works better than text as user may have been renamed
 324+ $user_id = User::idFromName( $user );
 325+
 326+ # If user is not IP or nonexistent
 327+ if( !$user_id ) {
 328+ $s = wfMsgExt( 'nosuchusershort', array( 'parse' ), $user );
 329+ $wgOut->addHTML( $s );
 330+ return;
 331+ }
 332+
 333+ # Record check...
 334+ if( !$this->addLogEntry( 'userips', 'user', $user, $reason, $user_id ) ) {
 335+ $wgOut->addHTML( '<p>' . wfMsgHtml( 'checkuser-log-fail' ) . '</p>' );
 336+ }
 337+ $dbr = wfGetDB( DB_SLAVE );
 338+ $time_conds = $this->getTimeConds( $period );
 339+ # Ordering by the latest timestamp makes a small filesort on the IP list
 340+ $cu_changes = $dbr->tableName( 'cu_changes' );
 341+ $use_index = $dbr->useIndexClause( 'cuc_user_ip_time' );
 342+ $sql = "SELECT cuc_ip,cuc_ip_hex, COUNT(*) AS count,
 343+ MIN(cuc_timestamp) AS first, MAX(cuc_timestamp) AS last
 344+ FROM $cu_changes $use_index WHERE cuc_user = $user_id AND $time_conds
 345+ GROUP BY cuc_ip,cuc_ip_hex ORDER BY last DESC LIMIT 5001";
 346+
 347+ $ret = $dbr->query( $sql, __METHOD__ );
 348+ if( !$dbr->numRows( $ret ) ) {
 349+ $s = $this->noMatchesMessage( $user ) . "\n";
 350+ } else {
 351+ $blockip = SpecialPage::getTitleFor( 'Blockip' );
 352+ $ips_edits = array();
 353+ $counter = 0;
 354+ while( $row = $dbr->fetchObject( $ret ) ) {
 355+ if( $counter >= 5000 ) {
 356+ $wgOut->addHTML( wfMsgExt( 'checkuser-limited', array( 'parse' ) ) );
 357+ break;
 358+ }
 359+ $ips_edits[$row->cuc_ip] = $row->count;
 360+ $ips_first[$row->cuc_ip] = $row->first;
 361+ $ips_last[$row->cuc_ip] = $row->last;
 362+ $ips_hex[$row->cuc_ip] = $row->cuc_ip_hex;
 363+ ++$counter;
 364+ }
 365+ // Count pinging might take some time...make sure it is there
 366+ wfSuppressWarnings();
 367+ set_time_limit( 60 );
 368+ wfRestoreWarnings();
 369+
 370+ $logs = SpecialPage::getTitleFor( 'Log' );
 371+ $s = '<div id="checkuserresults"><ul>';
 372+ foreach( $ips_edits as $ip => $edits ) {
 373+ $s .= '<li>';
 374+ $s .= '<a href="' .
 375+ $this->getTitle()->escapeLocalURL( 'user=' . urlencode( $ip ) . '&reason=' . urlencode( $reason ) ) . '">' .
 376+ htmlspecialchars( $ip ) . '</a>';
 377+ $s .= ' (<a href="' . $blockip->escapeLocalURL( 'ip=' . urlencode( $ip ) ) . '">' .
 378+ wfMsgHtml( 'blocklink' ) . '</a>)';
 379+ if( $ips_first[$ip] == $ips_last[$ip] ) {
 380+ $s .= ' (' . $wgLang->timeanddate( wfTimestamp( TS_MW, $ips_first[$ip] ), true ) . ') ';
 381+ } else {
 382+ $s .= ' (' . $wgLang->timeanddate( wfTimestamp( TS_MW, $ips_first[$ip] ), true ) .
 383+ ' -- ' . $wgLang->timeanddate( wfTimestamp( TS_MW, $ips_last[$ip] ), true ) . ') ';
 384+ }
 385+ $s .= ' <strong>[' . $edits . ']</strong>';
 386+
 387+ # If we get some results, it helps to know if the IP in general
 388+ # has a lot more edits, e.g. "tip of the iceberg"...
 389+ $ipedits = $dbr->estimateRowCount( 'cu_changes', '*',
 390+ array( 'cuc_ip_hex' => $ips_hex[$ip], $time_conds ),
 391+ __METHOD__ );
 392+ # If small enough, get a more accurate count
 393+ if( $ipedits <= 1000 ) {
 394+ $ipedits = $dbr->selectField( 'cu_changes', 'COUNT(*)',
 395+ array( 'cuc_ip_hex' => $ips_hex[$ip], $time_conds ),
 396+ __METHOD__ );
 397+ }
 398+ if( $ipedits > $ips_edits[$ip] ) {
 399+ $s .= ' <i>(' . wfMsgHtml( 'checkuser-ipeditcount', $ipedits ) . ')</i>';
 400+ }
 401+
 402+ # If this IP is blocked, give a link to the block log
 403+ $s.= $this->getIPBlockInfo( $ip );
 404+ $s .= '<div style="margin-left:5%">';
 405+ $s .= '<small>' . wfMsgExt( 'checkuser-toollinks', array( 'parseinline' ), urlencode( $ip ) ) . '</small>';
 406+ $s .= '</div>';
 407+ $s .= "</li>\n";
 408+ }
 409+ $s .= '</ul></div>';
 410+ }
 411+ $wgOut->addHTML( $s );
 412+ $dbr->freeResult( $ret );
 413+ }
 414+
 415+ protected function getIPBlockInfo( $ip ) {
 416+ static $blocklist;
 417+ $blocklist = SpecialPage::getTitleFor( 'Ipblocklist' );
 418+ $block = new Block();
 419+ $block->fromMaster( false ); // use slaves
 420+ if( $block->load( $ip, 0 ) ) {
 421+ if( IP::isIPAddress( $block->mAddress ) && strpos( $block->mAddress, '/' ) ) {
 422+ $userpage = Title::makeTitle( NS_USER, $block->mAddress );
 423+ $blocklog = $this->sk->makeKnownLinkObj( $logs, wfMsgHtml( 'checkuser-blocked' ),
 424+ 'type=block&page=' . urlencode( $userpage->getPrefixedText() ) );
 425+ return ' <strong>(' . $blocklog . ' - ' . $block->mAddress . ')</strong>';
 426+ } elseif( $block->mAuto ) {
 427+ $blocklog = $this->sk->makeKnownLinkObj( $blocklist, wfMsgHtml( 'checkuser-blocked' ),
 428+ 'ip=' . urlencode( "#$block->mId" ) );
 429+ return ' <strong>(' . $blocklog . ')</strong>';
 430+ } else {
 431+ $userpage = Title::makeTitle( NS_USER, $ip );
 432+ $blocklog = $this->sk->makeKnownLinkObj( $logs, wfMsgHtml( 'checkuser-blocked' ),
 433+ 'type=block&page=' . urlencode( $userpage->getPrefixedText() ) );
 434+ return ' <strong>(' . $blocklog . ')</strong>';
 435+ }
 436+ }
 437+ return '';
 438+ }
 439+
 440+ /**
 441+ * @param string $ip
 442+ * @param bool $xfor
 443+ * @param string $reason
 444+ * Shows all edits in Recent Changes by this IP (or range) and who made them
 445+ */
 446+ protected function doIPEditsRequest( $ip, $xfor = false, $reason = '', $period = 0 ) {
 447+ global $wgUser, $wgOut, $wgLang;
 448+ $dbr = wfGetDB( DB_SLAVE );
 449+ # Invalid IPs are passed in as a blank string
 450+ $ip_conds = $this->getIpConds( $dbr, $ip, $xfor );
 451+ if( !$ip || $ip_conds === false ) {
 452+ $wgOut->addWikiMsg( 'badipaddress' );
 453+ return;
 454+ }
 455+
 456+ $logType = 'ipedits';
 457+ if( $xfor ) {
 458+ $logType .= '-xff';
 459+ }
 460+ # Record check...
 461+ if( !$this->addLogEntry( $logType, 'ip', $ip, $reason ) ) {
 462+ $wgOut->addWikiMsg( 'checkuser-log-fail' );
 463+ }
 464+
 465+ $ip_conds = $dbr->makeList( $ip_conds, LIST_AND );
 466+ $time_conds = $this->getTimeConds( $period );
 467+ $cu_changes = $dbr->tableName( 'cu_changes' );
 468+ # Ordered in descent by timestamp. Can cause large filesorts on range scans.
 469+ # Check how many rows will need sorting ahead of time to see if this is too big.
 470+ # Also, if we only show 5000, too many will be ignored as well.
 471+ $index = $xfor ? 'cuc_xff_hex_time' : 'cuc_ip_hex_time';
 472+ if( strpos( $ip, '/' ) !== false ) {
 473+ # Quick index check only OK if no time constraint
 474+ if( $period ) {
 475+ $rangecount = $dbr->selectField( 'cu_changes', 'COUNT(*)',
 476+ array( $ip_conds, $time_conds ),
 477+ __METHOD__,
 478+ array( 'USE INDEX' => $index ) );
 479+ } else {
 480+ $rangecount = $dbr->estimateRowCount( 'cu_changes', '*',
 481+ array( $ip_conds ),
 482+ __METHOD__,
 483+ array( 'USE INDEX' => $index ) );
 484+ }
 485+ // Sorting might take some time...make sure it is there
 486+ wfSuppressWarnings();
 487+ set_time_limit( 60 );
 488+ wfRestoreWarnings();
 489+ }
 490+ $counter = 0;
 491+ # See what is best to do after testing the waters...
 492+ if( isset( $rangecount ) && $rangecount > 5000 ) {
 493+ $use_index = $dbr->useIndexClause( $index );
 494+ $sql = "SELECT cuc_ip_hex, COUNT(*) AS count,
 495+ MIN(cuc_timestamp) AS first, MAX(cuc_timestamp) AS last
 496+ FROM $cu_changes $use_index
 497+ WHERE $ip_conds AND $time_conds
 498+ GROUP BY cuc_ip_hex ORDER BY cuc_ip_hex LIMIT 5001";
 499+ $ret = $dbr->query( $sql, __METHOD__ );
 500+ # List out each IP that has edits
 501+ $s = wfMsgExt( 'checkuser-too-many', array( 'parse' ) );
 502+ $s .= '<ol>';
 503+ while( $row = $ret->fetchObject() ) {
 504+ if( $counter >= 5000 ) {
 505+ $wgOut->addHTML( wfMsgExt( 'checkuser-limited', array( 'parse' ) ) );
 506+ break;
 507+ }
 508+ # Convert the IP hexes into normal form
 509+ if( strpos( $row->cuc_ip_hex, 'v6-' ) !==false ) {
 510+ $ip = substr( $row->cuc_ip_hex, 3 );
 511+ $ip = IP::HextoOctet( $ip );
 512+ } else {
 513+ $ip = long2ip( wfBaseConvert( $row->cuc_ip_hex, 16, 10, 8 ) );
 514+ }
 515+ $s .= '<li><a href="' .
 516+ $this->getTitle()->escapeLocalURL( 'user=' . urlencode( $ip ) . '&reason=' . urlencode( $reason ) . '&checktype=subipusers' ) .
 517+ '">' . $ip . '</a>';
 518+ if( $row->first == $row->last ) {
 519+ $s .= ' (' . $wgLang->timeanddate( wfTimestamp( TS_MW, $row->first ), true ) . ') ';
 520+ } else {
 521+ $s .= ' (' . $wgLang->timeanddate( wfTimestamp( TS_MW, $row->first ), true ) .
 522+ ' -- ' . $wgLang->timeanddate( wfTimestamp( TS_MW, $row->last ), true ) . ') ';
 523+ }
 524+ $s .= ' [<strong>' . $row->count . "</strong>]</li>\n";
 525+ ++$counter;
 526+ }
 527+ $s .= '</ol>';
 528+ $dbr->freeResult( $ret );
 529+
 530+ $wgOut->addHTML( $s );
 531+ return;
 532+ } elseif( isset( $rangecount ) && !$rangecount ) {
 533+ $s = $this->noMatchesMessage( $ip ) . "\n";
 534+ $wgOut->addHTML( $s );
 535+ return;
 536+ }
 537+ # OK, do the real query...
 538+ $use_index = $dbr->useIndexClause( $index );
 539+ $sql = "SELECT cuc_namespace,cuc_title,cuc_user,cuc_user_text,cuc_comment,cuc_actiontext,
 540+ cuc_timestamp,cuc_minor,cuc_page_id,cuc_type,cuc_this_oldid,cuc_last_oldid,cuc_ip,cuc_xff,cuc_agent
 541+ FROM $cu_changes $use_index WHERE $ip_conds AND $time_conds ORDER BY cuc_timestamp DESC LIMIT 5001";
 542+ $ret = $dbr->query( $sql, __METHOD__ );
 543+
 544+ if( !$dbr->numRows( $ret ) ) {
 545+ $s = $this->noMatchesMessage( $ip ) . "\n";
 546+ } else {
 547+ # Cache common messages
 548+ $this->preCacheMessages();
 549+ # Try to optimize this query
 550+ $lb = new LinkBatch;
 551+ while( $row = $ret->fetchObject() ) {
 552+ $userText = str_replace( ' ', '_', $row->cuc_user_text );
 553+ $lb->add( $row->cuc_namespace, $row->cuc_title );
 554+ $lb->add( NS_USER, $userText );
 555+ $lb->add( NS_USER_TALK, $userText );
 556+ }
 557+ $lb->execute();
 558+ $ret->seek( 0 );
 559+ # List out the edits
 560+ $s = '<div id="checkuserresults">';
 561+ while( $row = $ret->fetchObject() ) {
 562+ if( $counter >= 5000 ) {
 563+ $wgOut->addHTML( wfMsgExt( 'checkuser-limited', array( 'parse' ) ) );
 564+ break;
 565+ }
 566+ $s .= $this->CUChangesLine( $row, $reason );
 567+ ++$counter;
 568+ }
 569+ $s .= '</ul></div>';
 570+ $dbr->freeResult( $ret );
 571+ }
 572+
 573+ $wgOut->addHTML( $s );
 574+ }
 575+
 576+ /**
 577+ * @param string $user
 578+ * @param string $reason
 579+ * Shows all edits in Recent Changes by this user
 580+ */
 581+ protected function doUserEditsRequest( $user, $reason = '', $period = 0 ) {
 582+ global $wgUser, $wgOut, $wgLang;
 583+
 584+ $userTitle = Title::newFromText( $user, NS_USER );
 585+ if( !is_null( $userTitle ) ) {
 586+ // normalize the username
 587+ $user = $userTitle->getText();
 588+ }
 589+ # IPs are passed in as a blank string
 590+ if( !$user ) {
 591+ $wgOut->addWikiMsg( 'nouserspecified' );
 592+ return;
 593+ }
 594+ # Get ID, works better than text as user may have been renamed
 595+ $user_id = User::idFromName( $user );
 596+
 597+ # If user is not IP or nonexistent
 598+ if( !$user_id ) {
 599+ $s = wfMsgExt( 'nosuchusershort', array( 'parse' ), $user );
 600+ $wgOut->addHTML( $s );
 601+ return;
 602+ }
 603+
 604+ # Record check...
 605+ if( !$this->addLogEntry( 'useredits', 'user', $user, $reason, $user_id ) ) {
 606+ $wgOut->addHTML( '<p>' . wfMsgHtml( 'checkuser-log-fail' ) . '</p>' );
 607+ }
 608+
 609+ $dbr = wfGetDB( DB_SLAVE );
 610+ $user_cond = "cuc_user = '$user_id'";
 611+ $time_conds = $this->getTimeConds( $period );
 612+ $cu_changes = $dbr->tableName( 'cu_changes' );
 613+ # Ordered in descent by timestamp. Causes large filesorts if there are many edits.
 614+ # Check how many rows will need sorting ahead of time to see if this is too big.
 615+ # If it is, sort by IP,time to avoid the filesort.
 616+ if( $period ) {
 617+ $count = $dbr->selectField( 'cu_changes', 'COUNT(*)',
 618+ array( $user_cond, $time_conds ),
 619+ __METHOD__,
 620+ array( 'USE INDEX' => 'cuc_user_ip_time' ) );
 621+ } else {
 622+ $count = $dbr->estimateRowCount( 'cu_changes', '*',
 623+ array( $user_cond, $time_conds ),
 624+ __METHOD__,
 625+ array( 'USE INDEX' => 'cuc_user_ip_time' ) );
 626+ }
 627+ # Cache common messages
 628+ $this->preCacheMessages();
 629+ # See what is best to do after testing the waters...
 630+ if( $count > 5000 ) {
 631+ $wgOut->addHTML( wfMsgExt( 'checkuser-limited', array( 'parse' ) ) );
 632+ $use_index = $dbr->useIndexClause( 'cuc_user_ip_time' );
 633+ $sql = "SELECT * FROM $cu_changes $use_index
 634+ WHERE $user_cond AND $time_conds
 635+ ORDER BY cuc_ip ASC, cuc_timestamp DESC LIMIT 5000";
 636+ $ret = $dbr->query( $sql, __METHOD__ );
 637+ # Try to optimize this query
 638+ $lb = new LinkBatch;
 639+ while( $row = $ret->fetchObject() ) {
 640+ $lb->add( $row->cuc_namespace, $row->cuc_title );
 641+ }
 642+ $lb->execute();
 643+ $ret->seek( 0 );
 644+ $s = '';
 645+ while( $row = $ret->fetchObject() ) {
 646+ if( !$ip = htmlspecialchars( $row->cuc_ip ) ) {
 647+ continue;
 648+ }
 649+ if( !isset( $lastIP ) ) {
 650+ $lastIP = $row->cuc_ip;
 651+ $s .= "\n<h2>$ip</h2>\n<div class=\"special\">";
 652+ } elseif( $lastIP != $row->cuc_ip ) {
 653+ $s .= "</ul></div>\n<h2>$ip</h2>\n<div class=\"special\">";
 654+ $lastIP = $row->cuc_ip;
 655+ unset( $this->lastdate ); // start over
 656+ }
 657+ $s .= $this->CUChangesLine( $row, $reason );
 658+ }
 659+ $s .= '</ul></div>';
 660+ $dbr->freeResult( $ret );
 661+
 662+ $wgOut->addHTML( $s );
 663+ return;
 664+ }
 665+ // Sorting might take some time...make sure it is there
 666+ wfSuppressWarnings();
 667+ set_time_limit( 60 );
 668+ wfRestoreWarnings();
 669+ # OK, do the real query...
 670+ $use_index = $dbr->useIndexClause( 'cuc_user_ip_time' );
 671+ $sql = "SELECT * FROM $cu_changes $use_index
 672+ WHERE $user_cond AND $time_conds ORDER BY cuc_timestamp DESC LIMIT 5000";
 673+ $ret = $dbr->query( $sql, __METHOD__ );
 674+
 675+ if( !$dbr->numRows( $ret ) ) {
 676+ $s = $this->noMatchesMessage( $user ) . "\n";
 677+ } else {
 678+ # Try to optimize this query
 679+ $lb = new LinkBatch;
 680+ while( $row = $ret->fetchObject() ) {
 681+ $lb->add( $row->cuc_namespace, $row->cuc_title );
 682+ }
 683+ $lb->execute();
 684+ $ret->seek( 0 );
 685+ # List out the edits
 686+ $s = '<div id="checkuserresults">';
 687+ while( $row = $ret->fetchObject() ) {
 688+ $s .= $this->CUChangesLine( $row, $reason );
 689+ }
 690+ $s .= '</ul></div>';
 691+ $dbr->freeResult( $ret );
 692+ }
 693+
 694+ $wgOut->addHTML( $s );
 695+ }
 696+
 697+ /**
 698+ * @param string $ip
 699+ * @param bool $xfor
 700+ * @param string $reason
 701+ * @param int $period
 702+ * @param string $tag
 703+ * @param string $talkTag
 704+ * Lists all users in recent changes who used an IP, newest to oldest down
 705+ * Outputs usernames, latest and earliest found edit date, and count
 706+ * List unique IPs used for each user in time order, list corresponding user agent
 707+ */
 708+ protected function doIPUsersRequest( $ip, $xfor = false, $reason = '', $period = 0, $tag = '', $talkTag = '' ) {
 709+ global $wgUser, $wgOut, $wgLang;
 710+ $dbr = wfGetDB( DB_SLAVE );
 711+ # Invalid IPs are passed in as a blank string
 712+ $ip_conds = $this->getIpConds( $dbr, $ip, $xfor );
 713+ if( !$ip || $ip_conds === false ) {
 714+ $wgOut->addWikiMsg( 'badipaddress' );
 715+ return;
 716+ }
 717+
 718+ $logType = 'ipusers';
 719+ if( $xfor ) {
 720+ $logType .= '-xff';
 721+ }
 722+ # Log the check...
 723+ if( !$this->addLogEntry( $logType, 'ip', $ip, $reason ) ) {
 724+ $wgOut->addHTML( '<p>'.wfMsgHtml('checkuser-log-fail').'</p>' );
 725+ }
 726+
 727+ $ip_conds = $dbr->makeList( $ip_conds, LIST_AND );
 728+ $time_conds = $this->getTimeConds( $period );
 729+ $cu_changes = $dbr->tableName( 'cu_changes' );
 730+ $index = $xfor ? 'cuc_xff_hex_time' : 'cuc_ip_hex_time';
 731+ # Ordered in descent by timestamp. Can cause large filesorts on range scans.
 732+ # Check how many rows will need sorting ahead of time to see if this is too big.
 733+ if( strpos( $ip, '/' ) !== false ) {
 734+ # Quick index check only OK if no time constraint
 735+ if( $period ) {
 736+ $rangecount = $dbr->selectField( 'cu_changes', 'COUNT(*)',
 737+ array( $ip_conds, $time_conds ),
 738+ __METHOD__,
 739+ array( 'USE INDEX' => $index ) );
 740+ } else {
 741+ $rangecount = $dbr->estimateRowCount( 'cu_changes', '*',
 742+ array( $ip_conds ),
 743+ __METHOD__,
 744+ array( 'USE INDEX' => $index ) );
 745+ }
 746+ // Sorting might take some time...make sure it is there
 747+ wfSuppressWarnings();
 748+ set_time_limit( 120 );
 749+ wfRestoreWarnings();
 750+ }
 751+ // Are there too many edits?
 752+ if( isset( $rangecount ) && $rangecount > 10000 ) {
 753+ $use_index = $dbr->useIndexClause( $index );
 754+ $sql = "SELECT cuc_ip_hex, COUNT(*) AS count,
 755+ MIN(cuc_timestamp) AS first, MAX(cuc_timestamp) AS last
 756+ FROM $cu_changes $use_index WHERE $ip_conds AND $time_conds
 757+ GROUP BY cuc_ip_hex ORDER BY cuc_ip_hex LIMIT 5001";
 758+ $ret = $dbr->query( $sql, __METHOD__ );
 759+ # List out each IP that has edits
 760+ $s = '<h5>' . wfMsg( 'checkuser-too-many' ) . '</h5>';
 761+ $s .= '<ol>';
 762+ $counter = 0;
 763+ while( $row = $ret->fetchObject() ) {
 764+ if( $counter >= 5000 ) {
 765+ $wgOut->addHTML( wfMsgExt( 'checkuser-limited', array( 'parse' ) ) );
 766+ break;
 767+ }
 768+ # Convert the IP hexes into normal form
 769+ if( strpos( $row->cuc_ip_hex, 'v6-' ) !==false ) {
 770+ $ip = substr( $row->cuc_ip_hex, 3 );
 771+ $ip = IP::HextoOctet( $ip );
 772+ } else {
 773+ $ip = long2ip( wfBaseConvert( $row->cuc_ip_hex, 16, 10, 8 ) );
 774+ }
 775+ $s .= '<li><a href="' .
 776+ $this->getTitle()->escapeLocalURL( 'user=' . urlencode( $ip ) . '&reason=' . urlencode( $reason ) . '&checktype=subipusers' ) .
 777+ '">' . $ip . '</a>';
 778+ if( $row->first == $row->last ) {
 779+ $s .= ' (' . $wgLang->timeanddate( wfTimestamp( TS_MW, $row->first ), true ) . ') ';
 780+ } else {
 781+ $s .= ' (' . $wgLang->timeanddate( wfTimestamp( TS_MW, $row->first ), true ) .
 782+ ' -- ' . $wgLang->timeanddate( wfTimestamp( TS_MW, $row->last ), true ) . ') ';
 783+ }
 784+ $s .= ' [<strong>' . $row->count . "</strong>]</li>\n";
 785+ ++$counter;
 786+ }
 787+ $s .= '</ol>';
 788+ $dbr->freeResult( $ret );
 789+
 790+ $wgOut->addHTML( $s );
 791+ return;
 792+ } elseif( isset( $rangecount ) && !$rangecount ) {
 793+ $s = $this->noMatchesMessage( $ip ) . "\n";
 794+ $wgOut->addHTML( $s );
 795+ return;
 796+ }
 797+
 798+ global $wgMemc;
 799+ # OK, do the real query...
 800+ $use_index = $dbr->useIndexClause( $index );
 801+ $sql = "SELECT cuc_user_text, cuc_timestamp, cuc_user, cuc_ip, cuc_agent, cuc_xff
 802+ FROM $cu_changes $use_index WHERE $ip_conds AND $time_conds
 803+ ORDER BY cuc_timestamp DESC LIMIT 10000";
 804+ $ret = $dbr->query( $sql, __METHOD__ );
 805+
 806+ $users_first = $users_last = $users_edits = $users_ids = array();
 807+ if( !$dbr->numRows( $ret ) ) {
 808+ $s = $this->noMatchesMessage( $ip ) . "\n";
 809+ } else {
 810+ global $wgAuth;
 811+ while( ( $row = $dbr->fetchObject( $ret ) ) != false ) {
 812+ if( !array_key_exists( $row->cuc_user_text, $users_edits ) ) {
 813+ $users_last[$row->cuc_user_text] = $row->cuc_timestamp;
 814+ $users_edits[$row->cuc_user_text] = 0;
 815+ $users_ids[$row->cuc_user_text] = $row->cuc_user;
 816+ $users_infosets[$row->cuc_user_text] = array();
 817+ $users_agentsets[$row->cuc_user_text] = array();
 818+ }
 819+ $users_edits[$row->cuc_user_text] += 1;
 820+ $users_first[$row->cuc_user_text] = $row->cuc_timestamp;
 821+ # Treat blank or NULL xffs as empty strings
 822+ $xff = empty( $row->cuc_xff ) ? null : $row->cuc_xff;
 823+ $xff_ip_combo = array( $row->cuc_ip, $xff );
 824+ # Add this IP/XFF combo for this username if it's not already there
 825+ if( !in_array( $xff_ip_combo, $users_infosets[$row->cuc_user_text] ) ) {
 826+ $users_infosets[$row->cuc_user_text][] = $xff_ip_combo;
 827+ }
 828+ # Add this agent string if it's not already there; 10 max.
 829+ if( count( $users_agentsets[$row->cuc_user_text] ) < 10 ) {
 830+ if( !in_array( $row->cuc_agent, $users_agentsets[$row->cuc_user_text] ) ) {
 831+ $users_agentsets[$row->cuc_user_text][] = $row->cuc_agent;
 832+ }
 833+ }
 834+ }
 835+ $dbr->freeResult( $ret );
 836+
 837+ $action = $this->getTitle()->escapeLocalURL( 'action=block' );
 838+ $s = "<form name='checkuserblock' id='checkuserblock' action=\"$action\" method='post'>";
 839+ $s .= '<div id="checkuserresults"><ul>';
 840+ foreach( $users_edits as $name => $count ) {
 841+ $s .= '<li>';
 842+ $s .= Xml::check( 'users[]', false, array( 'value' => $name ) ) . '&nbsp;';
 843+ # Load user object
 844+ $user = User::newFromName( $name, false );
 845+ # Add user tool links
 846+ $s .= $this->sk->userLink( -1 , $name ) . $this->sk->userToolLinks( -1 , $name );
 847+ # Add CheckUser link
 848+ $s .= ' (<a href="' . $this->getTitle()->escapeLocalURL( 'user=' . urlencode( $name ) .
 849+ '&reason=' . urlencode( $reason ) ) . '">' . wfMsgHtml( 'checkuser-check' ) . '</a>)';
 850+ # Show edit time range
 851+ if( $users_first[$name] == $users_last[$name] ) {
 852+ $s .= ' (' . $wgLang->timeanddate( wfTimestamp( TS_MW, $users_first[$name] ), true ) . ') ';
 853+ } else {
 854+ $s .= ' (' . $wgLang->timeanddate( wfTimestamp( TS_MW, $users_first[$name] ), true ) .
 855+ ' -- ' . $wgLang->timeanddate( wfTimestamp( TS_MW, $users_last[$name] ), true ) . ') ';
 856+ }
 857+ # Total edit count
 858+ $s .= ' [<strong>' . $count . '</strong>]<br />';
 859+ # Check if this user or IP is blocked. If so, give a link to the block log...
 860+ $ip = IP::isIPAddress( $name ) ? $name : '';
 861+ $flags = $this->userBlockFlags( $ip, $users_ids[$name], $user );
 862+ # Show if account is local only
 863+ $authUser = $wgAuth->getUserInstance( $user );
 864+ if( $user->getId() && $authUser->getId() === 0 ) {
 865+ $flags[] = '<strong>(' . wfMsgHtml( 'checkuser-localonly' ) . ')</strong>';
 866+ }
 867+ # Check for extra user rights...
 868+ if( $users_ids[$name] ) {
 869+ if( $user->isLocked() ) {
 870+ $flags[] = '<b>(' . wfMsgHtml( 'checkuser-locked' ) . ')</b>';
 871+ }
 872+ $list = array();
 873+ foreach( $user->getGroups() as $group ) {
 874+ $list[] = self::buildGroupLink( $group );
 875+ }
 876+ $groups = $wgLang->commaList( $list );
 877+ if( $groups ) {
 878+ $flags[] = '<i>(' . $groups . ')</i>';
 879+ }
 880+ }
 881+ # Check how many accounts the user made recently?
 882+ if( $ip ) {
 883+ $key = wfMemcKey( 'acctcreate', 'ip', $ip );
 884+ $count = intval( $wgMemc->get( $key ) );
 885+ if( $count ) {
 886+ $flags[] = '<strong>[' . wfMsgExt( 'checkuser-accounts', 'parsemag', $wgLang->formatNum( $count ) ) . ']</strong>';
 887+ }
 888+ }
 889+ $s .= implode( ' ', $flags );
 890+ $s .= '<ol>';
 891+ # List out each IP/XFF combo for this username
 892+ for( $i = ( count( $users_infosets[$name] ) - 1 ); $i >= 0; $i-- ) {
 893+ $set = $users_infosets[$name][$i];
 894+ # IP link
 895+ $s .= '<li>';
 896+ $s .= '<a href="'.$this->getTitle()->escapeLocalURL( 'user=' . urlencode( $set[0] ) ) . '">' . htmlspecialchars( $set[0] ) . '</a>';
 897+ # XFF string, link to /xff search
 898+ if( $set[1] ) {
 899+ # Flag our trusted proxies
 900+ list( $client, $trusted ) = efGetClientIPfromXFF( $set[1], $set[0] );
 901+ $c = $trusted ? '#F0FFF0' : '#FFFFCC';
 902+ $s .= '&nbsp;&nbsp;&nbsp;<span style="background-color: ' . $c . '"><strong>XFF</strong>: ';
 903+ $s .= $this->sk->makeKnownLinkObj( $this->getTitle(),
 904+ htmlspecialchars( $set[1] ),
 905+ 'user=' . urlencode( $client ) . '/xff' ) . '</span>';
 906+ }
 907+ $s .= "</li>\n";
 908+ }
 909+ $s .= '</ol><br /><ol>';
 910+ # List out each agent for this username
 911+ for( $i = ( count( $users_agentsets[$name] ) - 1 ); $i >= 0; $i-- ) {
 912+ $agent = $users_agentsets[$name][$i];
 913+ $s .= '<li><i>' . htmlspecialchars( $agent ) . "</i></li>\n";
 914+ }
 915+ $s .= '</ol>';
 916+ $s .= '</li>';
 917+ }
 918+ $s .= "</ul></div>\n";
 919+ if( $wgUser->isAllowed( 'block' ) && !$wgUser->isBlocked() ) {
 920+ $s .= "<fieldset>\n";
 921+ $s .= '<legend>' . wfMsgHtml( 'checkuser-massblock' ) . "</legend>\n";
 922+ $s .= '<p>' . wfMsgExt( 'checkuser-massblock-text', array( 'parseinline' ) ) . "</p>\n";
 923+ $s .= '<table><tr>' .
 924+ '<td>' . Xml::check( 'usetag', false, array( 'id' => 'usetag' ) ) . '</td>' .
 925+ '<td>' . Xml::label( wfMsgHtml( 'checkuser-blocktag' ), 'usetag' ) . '</td>' .
 926+ '<td>' . Xml::input( 'tag', 46, $tag, array( 'id' => 'blocktag' ) ) . '</td>' .
 927+ '</tr><tr>' .
 928+ '<td>' . Xml::check( 'usettag', false, array('id' => 'usettag' ) ) . '</td>' .
 929+ '<td>' . Xml::label( wfMsgHtml( 'checkuser-blocktag-talk' ), 'usettag' ) . '</td>' .
 930+ '<td>' . Xml::input( 'talktag', 46, $talkTag, array( 'id' => 'talktag' ) ) . '</td>'.
 931+ '</tr></table>';
 932+ $s .= '<p>' . wfMsgHtml( 'checkuser-reason' ) . '&nbsp;';
 933+ $s .= Xml::input( 'blockreason', 46, '', array( 'maxlength' => '150', 'id' => 'blockreason' ) );
 934+ $s .= '&nbsp;' . Xml::submitButton( wfMsgHtml( 'checkuser-massblock-commit' ),
 935+ array( 'id' => 'checkuserblocksubmit', 'name' => 'checkuserblock' ) ) . "</p>\n";
 936+ $s .= "</fieldset>\n";
 937+ }
 938+ $s .= '</form>';
 939+ }
 940+
 941+ $wgOut->addHTML( $s );
 942+ }
 943+
 944+ protected function userBlockFlags( $ip, $userId, $user ) {
 945+ static $logs, $blocklist;
 946+ $logs = SpecialPage::getTitleFor( 'Log' );
 947+ $blocklist = SpecialPage::getTitleFor( 'Ipblocklist' );
 948+ $block = new Block();
 949+ $block->fromMaster( false ); // use slaves
 950+ $flags = array();
 951+ if( $block->load( $ip, $userId ) ) {
 952+ // Range blocked?
 953+ if( IP::isIPAddress( $block->mAddress ) && strpos( $block->mAddress, '/' ) ) {
 954+ $userpage = Title::makeTitle( NS_USER, $block->mAddress );
 955+ $blocklog = $this->sk->makeKnownLinkObj( $logs, wfMsgHtml( 'checkuser-blocked' ),
 956+ 'type=block&page=' . urlencode( $userpage->getPrefixedText() ) );
 957+ $flags[] = '<strong>(' . $blocklog . ' - ' . $block->mAddress . ')</strong>';
 958+ // Auto blocked?
 959+ } elseif( $block->mAuto ) {
 960+ $blocklog = $this->sk->makeKnownLinkObj( $blocklist,
 961+ wfMsgHtml( 'checkuser-blocked' ), 'ip=' . urlencode( "#{$block->mId}" ) );
 962+ $flags[] = '<strong>(' . $blocklog . ')</strong>';
 963+ } else {
 964+ $userpage = $user->getUserPage();
 965+ $blocklog = $this->sk->makeKnownLinkObj( $logs, wfMsgHtml( 'checkuser-blocked' ),
 966+ 'type=block&page=' . urlencode( $userpage->getPrefixedText() ) );
 967+ $flags[] = '<strong>(' . $blocklog . ')</strong>';
 968+ }
 969+ // IP that is blocked on all wikis?
 970+ } elseif( $ip == $user->getName() && $user->isBlockedGlobally( $ip ) ) {
 971+ $flags[] = '<strong>(' . wfMsgHtml( 'checkuser-gblocked' ) . ')</strong>';
 972+ } elseif( self::userWasBlocked( $user->getName() ) ) {
 973+ $userpage = $user->getUserPage();
 974+ $blocklog = $this->sk->makeKnownLinkObj( $logs, wfMsgHtml( 'checkuser-wasblocked' ),
 975+ 'type=block&page=' . urlencode( $userpage->getPrefixedText() ) );
 976+ $flags[] = '<strong>(' . $blocklog . ')</strong>';
 977+ }
 978+ return $flags;
 979+ }
 980+
 981+ /**
 982+ * @param Row $row
 983+ * @param string $reason
 984+ * @return a streamlined recent changes line with IP data
 985+ */
 986+ protected function CUChangesLine( $row, $reason ) {
 987+ global $wgLang;
 988+ static $cuTitle, $flagCache;
 989+ $cuTitle = SpecialPage::getTitleFor( 'CheckUser' );
 990+ # Add date headers as needed
 991+ $date = $wgLang->date( wfTimestamp( TS_MW, $row->cuc_timestamp ), true, true );
 992+ if( !isset( $this->lastdate ) ) {
 993+ $this->lastdate = $date;
 994+ $line = "\n<h4>$date</h4>\n<ul class=\"special\">";
 995+ } elseif( $date != $this->lastdate ) {
 996+ $line = "</ul>\n<h4>$date</h4>\n<ul class=\"special\">";
 997+ $this->lastdate = $date;
 998+ } else {
 999+ $line = '';
 1000+ }
 1001+ $line .= '<li>';
 1002+ # Create diff/hist/page links
 1003+ $line .= $this->getLinksFromRow( $row );
 1004+ # Show date
 1005+ $line .= ' . . ' . $wgLang->time( wfTimestamp( TS_MW, $row->cuc_timestamp ), true, true ) . ' . . ';
 1006+ # Userlinks
 1007+ $line .= $this->sk->userLink( $row->cuc_user, $row->cuc_user_text );
 1008+ $line .= $this->sk->userToolLinks( $row->cuc_user, $row->cuc_user_text );
 1009+ # Get block info
 1010+ if( isset( $flagCache[$row->cuc_user_text] ) ) {
 1011+ $flags = $flagCache[$row->cuc_user_text];
 1012+ } else {
 1013+ $user = User::newFromName( $row->cuc_user_text, false );
 1014+ $ip = IP::isIPAddress( $row->cuc_user_text ) ? $row->cuc_user_text : '';
 1015+ $flags = $this->userBlockFlags( $ip, $row->cuc_user, $user );
 1016+ $flagCache[$row->cuc_user_text] = $flags;
 1017+ }
 1018+ # Add any block information
 1019+ if( count( $flags ) ) {
 1020+ $line .= ' ' . implode( ' ', $flags );
 1021+ }
 1022+ # Action text, hackish ...
 1023+ if( $row->cuc_actiontext ) {
 1024+ $line .= ' ' . $this->sk->formatComment( $row->cuc_actiontext ) . ' ';
 1025+ }
 1026+ # Comment
 1027+ $line .= $this->sk->commentBlock( $row->cuc_comment );
 1028+ $line .= '<br />&nbsp; &nbsp; &nbsp; &nbsp; <small>';
 1029+ # IP
 1030+ $line .= ' <strong>IP</strong>: ' . $this->sk->makeKnownLinkObj( $cuTitle,
 1031+ htmlspecialchars( $row->cuc_ip ), 'user=' . urlencode( $row->cuc_ip ) . '&reason=' . urlencode( $reason ) );
 1032+ # XFF
 1033+ if( $row->cuc_xff != null ) {
 1034+ # Flag our trusted proxies
 1035+ list( $client, $trusted ) = efGetClientIPfromXFF( $row->cuc_xff, $row->cuc_ip );
 1036+ $c = $trusted ? '#F0FFF0' : '#FFFFCC';
 1037+ $line .= '&nbsp;&nbsp;&nbsp;<span class="mw-checkuser-xff" style="background-color: ' . $c . '">' .
 1038+ '<strong>XFF</strong>: ';
 1039+ $line .= $this->sk->makeKnownLinkObj( $cuTitle,
 1040+ htmlspecialchars( $row->cuc_xff ),
 1041+ 'user=' . urlencode( $client ) . '/xff&reason=' . urlencode( $reason ) ) . '</span>';
 1042+ }
 1043+ # User agent
 1044+ $line .= '&nbsp;&nbsp;&nbsp;<span class="mw-checkuser-agent" style="color:#888;">' .
 1045+ htmlspecialchars( $row->cuc_agent ) . '</span>';
 1046+
 1047+ $line .= "</small></li>\n";
 1048+
 1049+ return $line;
 1050+ }
 1051+
 1052+ /**
 1053+ * @param $row
 1054+ * @create diff/hist/page link
 1055+ */
 1056+ protected function getLinksFromRow( $row ) {
 1057+ // Log items (old format) and events to logs
 1058+ if( $row->cuc_type == RC_LOG && $row->cuc_namespace == NS_SPECIAL ) {
 1059+ list( $specialName, $logtype ) = SpecialPage::resolveAliasWithSubpage( $row->cuc_title );
 1060+ $logname = LogPage::logName( $logtype );
 1061+ $title = Title::makeTitle( $row->cuc_namespace, $row->cuc_title );
 1062+ $links = '(' . $this->sk->makeKnownLinkObj( $title, $logname ) . ')';
 1063+ // Log items
 1064+ } elseif( $row->cuc_type == RC_LOG ) {
 1065+ $title = Title::makeTitle( $row->cuc_namespace, $row->cuc_title );
 1066+ $links = '(' . $this->sk->makeKnownLinkObj( SpecialPage::getTitleFor( 'Log' ), $this->message['log'],
 1067+ wfArrayToCGI( array( 'page' => $title->getPrefixedText() ) ) ) . ')';
 1068+ } else {
 1069+ $title = Title::makeTitle( $row->cuc_namespace, $row->cuc_title );
 1070+ # New pages
 1071+ if( $row->cuc_type == RC_NEW ) {
 1072+ $links = '(' . $this->message['diff'] . ') ';
 1073+ } else {
 1074+ # Diff link
 1075+ $links = ' (' . $this->sk->makeKnownLinkObj( $title, $this->message['diff'],
 1076+ wfArrayToCGI( array(
 1077+ 'curid' => $row->cuc_page_id,
 1078+ 'diff' => $row->cuc_this_oldid,
 1079+ 'oldid' => $row->cuc_last_oldid ) ) ) . ') ';
 1080+ }
 1081+ # History link
 1082+ $links .= ' (' . $this->sk->makeKnownLinkObj( $title, $this->message['hist'],
 1083+ wfArrayToCGI( array(
 1084+ 'curid' => $row->cuc_page_id,
 1085+ 'action' => 'history' ) ) ) . ') . . ';
 1086+ # Some basic flags
 1087+ if( $row->cuc_type == RC_NEW ) {
 1088+ $links .= '<span class="newpage">' . $this->message['newpageletter'] . '</span>';
 1089+ }
 1090+ if( $row->cuc_minor ) {
 1091+ $links .= '<span class="minor">' . $this->message['minoreditletter'] . '</span>';
 1092+ }
 1093+ # Page link
 1094+ $links .= ' ' . $this->sk->makeLinkObj( $title );
 1095+ }
 1096+ return $links;
 1097+ }
 1098+
 1099+ protected static function userWasBlocked( $name ) {
 1100+ $userpage = Title::makeTitle( NS_USER, $name );
 1101+ return wfGetDB( DB_SLAVE )->selectField( 'logging', '1',
 1102+ array( 'log_type' => array( 'block', 'suppress' ),
 1103+ 'log_action' => 'block',
 1104+ 'log_namespace' => $userpage->getNamespace(),
 1105+ 'log_title' => $userpage->getDBkey() ),
 1106+ __METHOD__,
 1107+ array( 'USE INDEX' => 'page_time' ) );
 1108+ }
 1109+
 1110+ /**
 1111+ * Format a link to a group description page
 1112+ *
 1113+ * @param string $group
 1114+ * @return string
 1115+ */
 1116+ protected static function buildGroupLink( $group ) {
 1117+ static $cache = array();
 1118+ if( !isset( $cache[$group] ) ) {
 1119+ $cache[$group] = User::makeGroupLinkHtml( $group, User::getGroupMember( $group ) );
 1120+ }
 1121+ return $cache[$group];
 1122+ }
 1123+
 1124+ /**
 1125+ * @param Database $db
 1126+ * @param string $ip
 1127+ * @param string $xfor
 1128+ * @return mixed array/false conditions
 1129+ */
 1130+ protected function getIpConds( $db, $ip, $xfor = false ) {
 1131+ $type = ( $xfor ) ? 'xff' : 'ip';
 1132+ // IPv4 CIDR, 16-32 bits
 1133+ if( preg_match( '#^(\d+\.\d+\.\d+\.\d+)/(\d+)$#', $ip, $matches ) ) {
 1134+ if( $matches[2] < 16 || $matches[2] > 32 ) {
 1135+ return false; // invalid
 1136+ }
 1137+ list( $start, $end ) = IP::parseRange( $ip );
 1138+ return array( 'cuc_' . $type . '_hex BETWEEN ' . $db->addQuotes( $start ) . ' AND ' . $db->addQuotes( $end ) );
 1139+ } elseif( preg_match( '#^\w{1,4}:\w{1,4}:\w{1,4}:\w{1,4}:\w{1,4}:\w{1,4}:\w{1,4}:\w{1,4}/(\d+)$#', $ip, $matches ) ) {
 1140+ // IPv6 CIDR, 96-128 bits
 1141+ if( $matches[1] < 96 || $matches[1] > 128 ) {
 1142+ return false; // invalid
 1143+ }
 1144+ list( $start, $end ) = IP::parseRange6( $ip );
 1145+ return array( 'cuc_' . $type . '_hex BETWEEN ' . $db->addQuotes( $start ) . ' AND ' . $db->addQuotes( $end ) );
 1146+ } elseif( preg_match( '#^(\d+)\.(\d+)\.(\d+)\.(\d+)$#', $ip ) ) {
 1147+ // 32 bit IPv4
 1148+ $ip_hex = IP::toHex( $ip );
 1149+ return array( 'cuc_'.$type.'_hex' => $ip_hex );
 1150+ } elseif( preg_match( '#^\w{1,4}:\w{1,4}:\w{1,4}:\w{1,4}:\w{1,4}:\w{1,4}:\w{1,4}:\w{1,4}$#', $ip ) ) {
 1151+ // 128 bit IPv6
 1152+ $ip_hex = IP::toHex( $ip );
 1153+ return array( 'cuc_' . $type . '_hex' => $ip_hex );
 1154+ }
 1155+ // throw away this query, incomplete IP, these don't get through the entry point anyway
 1156+ return false; // invalid
 1157+ }
 1158+
 1159+ protected function getTimeConds( $period ) {
 1160+ if( !$period ) {
 1161+ return '1 = 1';
 1162+ }
 1163+ $dbr = wfGetDB( DB_SLAVE );
 1164+ $cutoff_unixtime = time() - ( $period * 24 * 3600 );
 1165+ $cutoff_unixtime = $cutoff_unixtime - ( $cutoff_unixtime % 86400 );
 1166+ $cutoff = $dbr->addQuotes( $dbr->timestamp( $cutoff_unixtime ) );
 1167+ return "cuc_timestamp > $cutoff";
 1168+ }
 1169+
 1170+ protected function showLog() {
 1171+ global $wgRequest, $wgOut;
 1172+ $type = $wgRequest->getVal( 'cuSearchType' );
 1173+ $target = $wgRequest->getVal( 'cuSearch' );
 1174+ $year = $wgRequest->getIntOrNull( 'year' );
 1175+ $month = $wgRequest->getIntOrNull( 'month' );
 1176+ $error = false;
 1177+ $dbr = wfGetDB( DB_SLAVE );
 1178+ $searchConds = false;
 1179+
 1180+ $wgOut->setPageTitle( wfMsg( 'checkuser-log' ) );
 1181+
 1182+ $wgOut->addHTML( $this->sk->makeKnownLinkObj( $this->getTitle(), wfMsgHtml( 'checkuser-log-return' ) ) );
 1183+
 1184+ if ( $type === null ) {
 1185+ $type = 'target';
 1186+ } elseif ( $type == 'initiator' ) {
 1187+ $user = User::newFromName( $target );
 1188+ if ( !$user || !$user->getID() ) {
 1189+ $error = 'checkuser-user-nonexistent';
 1190+ } else {
 1191+ $searchConds = array( 'cul_user' => $user->getID() );
 1192+ }
 1193+ } else /* target */ {
 1194+ $type = 'target';
 1195+ // Is it an IP?
 1196+ list( $start, $end ) = IP::parseRange( $target );
 1197+ if ( $start !== false ) {
 1198+ if ( $start == $end ) {
 1199+ $searchConds = array( 'cul_target_hex = ' . $dbr->addQuotes( $start ) . ' OR ' .
 1200+ '(cul_range_end >= ' . $dbr->addQuotes( $start ) . ' AND ' .
 1201+ 'cul_range_start <= ' . $dbr->addQuotes( $end ) . ')'
 1202+ );
 1203+ } else {
 1204+ $searchConds = array(
 1205+ '(cul_target_hex >= ' . $dbr->addQuotes( $start ) . ' AND ' .
 1206+ 'cul_target_hex <= ' . $dbr->addQuotes( $end ) . ') OR ' .
 1207+ '(cul_range_end >= ' . $dbr->addQuotes( $start ) . ' AND ' .
 1208+ 'cul_range_start <= ' . $dbr->addQuotes( $end ) . ')'
 1209+ );
 1210+ }
 1211+ } else {
 1212+ // Is it a user?
 1213+ $user = User::newFromName( $target );
 1214+ if ( $user && $user->getID() ) {
 1215+ $searchConds = array(
 1216+ 'cul_type' => array( 'userips', 'useredits' ),
 1217+ 'cul_target_id' => $user->getID(),
 1218+ );
 1219+ } elseif ( $target ) {
 1220+ $error = 'checkuser-user-nonexistent';
 1221+ }
 1222+ }
 1223+ }
 1224+
 1225+ $searchTypes = array( 'initiator', 'target' );
 1226+ $select = "<select name=\"cuSearchType\" style='margin-top:.2em;'>\n";
 1227+ foreach ( $searchTypes as $searchType ) {
 1228+ if ( $type == $searchType ) {
 1229+ $checked = 'selected="selected"';
 1230+ } else {
 1231+ $checked = '';
 1232+ }
 1233+ $caption = wfMsgHtml( 'checkuser-search-' . $searchType );
 1234+ $select .= "<option value=\"$searchType\" $checked>$caption</option>\n";
 1235+ }
 1236+ $select .= '</select>';
 1237+
 1238+ $encTarget = htmlspecialchars( $target );
 1239+ $msgSearch = wfMsgHtml( 'checkuser-search' );
 1240+ $input = "<input type=\"text\" name=\"cuSearch\" value=\"$encTarget\" size=\"40\"/>";
 1241+ $msgSearchForm = wfMsgHtml( 'checkuser-search-form', $select, $input );
 1242+ $formAction = $this->getLogSubpageTitle()->escapeLocalURL();
 1243+ $msgSearchSubmit = '&nbsp;&nbsp;' . wfMsgHtml( 'checkuser-search-submit' ) . '&nbsp;&nbsp;';
 1244+
 1245+ $s = "<form method='get' action=\"$formAction\">\n" .
 1246+ "<fieldset><legend>$msgSearch</legend>\n" .
 1247+ "<p>$msgSearchForm</p>\n" .
 1248+ "<p>" . $this->getDateMenu( $year, $month ) . "&nbsp;&nbsp;&nbsp;\n" .
 1249+ "<input type=\"submit\" name=\"cuSearchSubmit\" value=\"$msgSearchSubmit\"/></p>\n" .
 1250+ "</fieldset></form>\n";
 1251+ $wgOut->addHTML( $s );
 1252+
 1253+ if ( $error !== false ) {
 1254+ $wgOut->addWikiText( '<div class="errorbox">' . wfMsg( $error ) . '</div>' );
 1255+ return;
 1256+ }
 1257+
 1258+ $pager = new CheckUserLogPager( $this, $searchConds, $year, $month );
 1259+ $wgOut->addHTML(
 1260+ $pager->getNavigationBar() .
 1261+ $pager->getBody() .
 1262+ $pager->getNavigationBar()
 1263+ );
 1264+ }
 1265+
 1266+ /**
 1267+ * @return string Formatted HTML
 1268+ * @param int $year
 1269+ * @param int $month
 1270+ */
 1271+ protected function getDateMenu( $year, $month ) {
 1272+ # Offset overrides year/month selection
 1273+ if( $month && $month !== -1 ) {
 1274+ $encMonth = intval( $month );
 1275+ } else {
 1276+ $encMonth = '';
 1277+ }
 1278+ if ( $year ) {
 1279+ $encYear = intval( $year );
 1280+ } elseif( $encMonth ) {
 1281+ $thisMonth = intval( gmdate( 'n' ) );
 1282+ $thisYear = intval( gmdate( 'Y' ) );
 1283+ if( intval( $encMonth ) > $thisMonth ) {
 1284+ $thisYear--;
 1285+ }
 1286+ $encYear = $thisYear;
 1287+ } else {
 1288+ $encYear = '';
 1289+ }
 1290+ return Xml::label( wfMsg( 'year' ), 'year' ) . ' ' .
 1291+ Xml::input( 'year', 4, $encYear, array( 'id' => 'year', 'maxlength' => 4 ) ) .
 1292+ ' ' .
 1293+ Xml::label( wfMsg( 'month' ), 'month' ) . ' ' .
 1294+ Xml::monthSelector( $encMonth, -1 );
 1295+ }
 1296+
 1297+ protected function addLogEntry( $logType, $targetType, $target, $reason, $targetID = 0 ) {
 1298+ global $wgUser;
 1299+
 1300+ if ( $targetType == 'ip' ) {
 1301+ list( $rangeStart, $rangeEnd ) = IP::parseRange( $target );
 1302+ $targetHex = $rangeStart;
 1303+ if ( $rangeStart == $rangeEnd ) {
 1304+ $rangeStart = $rangeEnd = '';
 1305+ }
 1306+ } else {
 1307+ $targetHex = $rangeStart = $rangeEnd = '';
 1308+ }
 1309+
 1310+ $dbw = wfGetDB( DB_MASTER );
 1311+ $cul_id = $dbw->nextSequenceValue( 'cu_log_cul_id_seq' );
 1312+ $dbw->insert( 'cu_log',
 1313+ array(
 1314+ 'cul_id' => $cul_id,
 1315+ 'cul_timestamp' => $dbw->timestamp(),
 1316+ 'cul_user' => $wgUser->getID(),
 1317+ 'cul_user_text' => $wgUser->getName(),
 1318+ 'cul_reason' => $reason,
 1319+ 'cul_type' => $logType,
 1320+ 'cul_target_id' => $targetID,
 1321+ 'cul_target_text' => $target,
 1322+ 'cul_target_hex' => $targetHex,
 1323+ 'cul_range_start' => $rangeStart,
 1324+ 'cul_range_end' => $rangeEnd,
 1325+ ), __METHOD__ );
 1326+ return true;
 1327+ }
121328 }
131329
141330 class CheckUserLogPager extends ReverseChronologicalPager {
@@ -38,21 +1354,21 @@
391355
401356 $user = $skin->userLink( $row->cul_user, $row->user_name );
411357
42 - if ( $row->cul_type == 'userips' ) {
43 - $target = $skin->userLink( $row->cul_target_id, $row->cul_target_text ) .
 1358+ if ( $row->cul_type == 'userips' || $row->cul_type == 'useredits' ) {
 1359+ $target = $skin->userLink( $row->cul_target_id, $row->cul_target_text ) .
441360 $skin->userToolLinks( $row->cul_target_id, $row->cul_target_text );
451361 } else {
461362 $target = $row->cul_target_text;
471363 }
481364
49 - return '<li>' .
50 - $wgLang->timeanddate( wfTimestamp(TS_MW,$row->cul_timestamp), true ) .
 1365+ return '<li>' .
 1366+ $wgLang->timeanddate( wfTimestamp( TS_MW, $row->cul_timestamp ), true ) .
511367 wfMsg( 'comma-separator' ) .
52 - wfMsg(
 1368+ wfMsg(
531369 'checkuser-log-' . $row->cul_type,
541370 $user,
55 - $target
56 - ) .
 1371+ $target
 1372+ ) .
571373 $comment .
581374 '</li>';
591375 }
@@ -78,10 +1394,9 @@
791395 }
801396
811397 function getQueryInfo() {
82 - global $wgRequest;
831398 $this->searchConds[] = 'user_id = cul_user';
841399 return array(
85 - 'tables' => array('cu_log','user'),
 1400+ 'tables' => array( 'cu_log', 'user' ),
861401 'fields' => $this->selectFields(),
871402 'conds' => $this->searchConds
881403 );
@@ -94,9 +1409,11 @@
951410 function getTitle() {
961411 return $this->specialPage->getLogSubpageTitle();
971412 }
98 -
 1413+
991414 function selectFields() {
100 - return array('cul_id','cul_timestamp','cul_user','cul_reason','cul_type',
101 - 'cul_target_id','cul_target_text','user_name');
 1415+ return array(
 1416+ 'cul_id', 'cul_timestamp', 'cul_user', 'cul_reason', 'cul_type',
 1417+ 'cul_target_id', 'cul_target_text', 'user_name'
 1418+ );
1021419 }
1031420 }
Property changes on: branches/new-checkuser/CheckUser_body.php
___________________________________________________________________
Deleted: svn:eol-style
1041421 - native
Index: branches/new-checkuser/CheckUser.i18n.php
@@ -2,33 +2,38 @@
33 /**
44 * Internationalisation file for CheckUser extension.
55 *
6 - * @addtogroup Extensions
7 -*/
 6+ * @file
 7+ * @ingroup Extensions
 8+ */
89
910 $messages = array();
1011
 12+/** English
 13+ * @author Tim Starling
 14+ * @author Aaron Schulz
 15+ */
1116 $messages['en'] = array(
12 - 'checkuser-summary' => 'This tool scans recent changes to retrieve the IPs used by a user or show the edit/user data for an IP.
13 -Users and edits by a client IP can be retrieved via XFF headers by appending the IP with "/xff". IPv4 (CIDR 16-32) and IPv6 (CIDR 96-128) are supported.
 17+ 'checkuser-summary' => 'This tool scans recent changes to retrieve the IP addresses used by a user or show the edit/user data for an IP address.
 18+Users and edits by a client IP address can be retrieved via XFF headers by appending the IP address with "/xff". IPv4 (CIDR 16-32) and IPv6 (CIDR 96-128) are supported.
1419 No more than 5000 edits will be returned for performance reasons.
1520 Use this in accordance with policy.',
1621 'checkuser-desc' => 'Grants users with the appropriate permission the ability to check user\'s IP addresses and other information',
1722 'checkuser-logcase' => 'The log search is case sensitive.',
1823 'checkuser' => 'Check user',
19 - 'checkuser-contribs' => 'check user IPs',
 24+ 'checkuser-contribs' => 'check user IP addresses',
2025 'group-checkuser' => 'Check users',
2126 'group-checkuser-member' => 'Check user',
2227 'right-checkuser' => "Check user's IP addresses and other information",
23 - 'right-checkuser-log' => "View the checkuser log",
 28+ 'right-checkuser-log' => 'View the checkuser log',
2429 'grouppage-checkuser' => '{{ns:project}}:Check user',
2530 'checkuser-reason' => 'Reason:',
2631 'checkuser-showlog' => 'Show log',
2732 'checkuser-log' => 'CheckUser log',
2833 'checkuser-query' => 'Query recent changes',
29 - 'checkuser-target' => 'User or IP',
 34+ 'checkuser-target' => 'IP address or username:',
3035 'checkuser-users' => 'Get users',
31 - 'checkuser-edits' => 'Get edits from IP',
32 - 'checkuser-ips' => 'Get IPs',
 36+ 'checkuser-edits' => 'Get edits from IP address',
 37+ 'checkuser-ips' => 'Get IP addresses',
3338 'checkuser-account' => 'Get account edits',
3439 'checkuser-search' => 'Search',
3540 'checkuser-period' => 'Duration:',
@@ -36,7 +41,7 @@
3742 'checkuser-week-2' => 'last two weeks',
3843 'checkuser-month' => 'last 30 days',
3944 'checkuser-all' => 'all',
40 - 'checkuser-cidr-label' => 'Find common range and affected addresses for a list of IPs',
 45+ 'checkuser-cidr-label' => 'Find common range and affected IP addresses for a list of IP addresses',
4146 'checkuser-cidr-res' => 'Common CIDR:',
4247 'checkuser-empty' => 'The log contains no items.',
4348 'checkuser-nomatch' => 'No matches found.',
@@ -60,8 +65,9 @@
6166 'checkuser-block-failure' => '\'\'\'No users blocked.\'\'\'',
6267 'checkuser-block-limit' => 'Too many users selected.',
6368 'checkuser-block-noreason' => 'You must give a reason for the blocks.',
 69+ 'checkuser-noreason' => 'You must give a reason for this query.',
6470 'checkuser-accounts' => '$1 new {{PLURAL:$1|account|accounts}}',
65 - 'checkuser-too-many' => 'Too many results, please narrow down the CIDR.
 71+ 'checkuser-too-many' => 'Too many results (according to query estimate), please narrow down the CIDR.
6672 Here are the IPs used (5000 max, sorted by address):',
6773 'checkuser-user-nonexistent' => 'The specified user does not exist.',
6874 'checkuser-search-form' => 'Find log entries where the $1 is $2',
@@ -71,30 +77,31 @@
7278 'checkuser-ipeditcount' => '~$1 from all users',
7379 'checkuser-log-subpage' => 'Log',
7480 'checkuser-log-return' => 'Return to CheckUser main form',
75 -
 81+
7682 'checkuser-limited' => '\'\'\'These results have been truncated for performance reasons.\'\'\'',
7783
78 - 'checkuser-log-userips' => '$1 got IPs for $2',
 84+ 'checkuser-log-userips' => '$1 got IP addresses for $2',
7985 'checkuser-log-ipedits' => '$1 got edits for $2',
8086 'checkuser-log-ipusers' => '$1 got users for $2',
8187 'checkuser-log-ipedits-xff' => '$1 got edits for XFF $2',
8288 'checkuser-log-ipusers-xff' => '$1 got users for XFF $2',
8389 'checkuser-log-useredits' => '$1 got edits for $2',
84 -
 90+
8591 'checkuser-autocreate-action' => 'was automatically created',
8692 'checkuser-email-action' => 'sent an email to user "$1"',
8793 'checkuser-reset-action' => 'reset password for user "$1"',
88 -
 94+
8995 'checkuser-toollinks' => '<span class="plainlinks">[[http://openrbl.org/query?$1 RDNS] ·
9096 [http://www.robtex.com/rbls/$1.html RBLs] ·
9197 [http://www.dnsstuff.com/tools/tracert.ch?ip=$1 Traceroute] ·
9298 [http://www.ip2location.com/$1 Geolocate] ·
93 -[http://toolserver.org/~krimpet/torcheck.php?ip=$1 Tor check] ·
 99+[http://toolserver.org/~overlordq/scripts/checktor.fcgi?ip=$1 Tor check] ·
94100 [http://ws.arin.net/whois/?queryinput=$1 WHOIS]]</span>', # do not translate or duplicate this message to other languages
95101 );
96102
97103 /** Message documentation (Message documentation)
98104 * @author Darth Kule
 105+ * @author Fryed-peach
99106 * @author Jon Harald Søby
100107 * @author Kwj2772
101108 * @author Lejonel
@@ -104,17 +111,22 @@
105112 * @author Raymond
106113 * @author Siebrand
107114 * @author Slomox
 115+ * @author Tgr
108116 */
109117 $messages['qqq'] = array(
110118 'checkuser-desc' => 'Short description of the CheckUser extension, shown on [[Special:Version]]',
111119 'checkuser' => 'Check user extension. The name of the special page where checkusers can check the IP addresses of users. The message is used in the list of special pages, and at the top of [[Special:Checkuser]].
112120
113121 {{Identical|Check user}}',
 122+ 'group-checkuser' => '{{Identical|Check user}}',
114123 'group-checkuser-member' => '{{Identical|Check user}}',
115124 'right-checkuser' => '{{doc-right}}',
116125 'right-checkuser-log' => '{{doc-right}}',
 126+ 'grouppage-checkuser' => '{{Identical|Check user}}',
117127 'checkuser-reason' => '{{Identical|Reason}}',
 128+ 'checkuser-target' => '{{Identical|IP address or username}}',
118129 'checkuser-search' => '{{Identical|Search}}',
 130+ 'checkuser-period' => '{{Identical|Duration}}',
119131 'checkuser-all' => '{{Identical|All}}',
120132 'checkuser-nomatch-edits' => '* $1 = date
121133 * $2 = time',
@@ -144,6 +156,8 @@
145157 'checkuser-log-ipusers-xff' => 'This is an entry in the checkuser log when a checkuser checks which users have used an XFF IP address (XFF means X-Forwarded-For. Some providers use proxies to forward user requests. This effectively means anonymization of requests. To make the requesting user identifiable again, the original requesting IP is transmitted in a separate HTTP header, the XFF header.).
146158 *Parameter $1 is the user who did the check
147159 *Parameter $2 is the IP address',
 160+ 'checkuser-log-useredits' => ":'''$1:''' name of checkuser
 161+:'''$2:''' name of user whose edits were inspected",
148162 'checkuser-autocreate-action' => 'Text of the event displayed in the CheckUser results, corresponding to the automatic creation of a new user account (by CentralAuth).',
149163 );
150164
@@ -172,25 +186,66 @@
173187 $messages['af'] = array(
174188 'checkuser-logcase' => 'Die logboek soek-funksie is kassensitief.',
175189 'checkuser' => 'Kontroleer gebruiker',
 190+ 'checkuser-contribs' => 'kontroleer gebruiker se IP-adresse',
176191 'group-checkuser' => 'Kontroleer gebruikers',
177 - 'group-checkuser-member' => 'Kontroleer gebruiker',
 192+ 'group-checkuser-member' => 'kontrolegebruiker',
178193 'right-checkuser' => 'Besigtig gebruikers se IP-adresse en ander gegewens',
179 - 'checkuser-reason' => 'Rede',
 194+ 'grouppage-checkuser' => '{{ns:project}}:Kontrolegebruiker',
 195+ 'checkuser-reason' => 'Rede:',
180196 'checkuser-showlog' => 'Wys logboek',
181 - 'checkuser-target' => 'Gebruiker of IP',
 197+ 'checkuser-query' => 'Navraag op onlangse wysigings',
 198+ 'checkuser-target' => 'IP-adres of gebruikersnaam:',
182199 'checkuser-users' => 'Kry gebruikers',
183200 'checkuser-edits' => 'Kry wysigings vanaf IP',
184201 'checkuser-ips' => 'Kry IPs',
185202 'checkuser-search' => 'Soek',
 203+ 'checkuser-period' => 'Duur:',
 204+ 'checkuser-week-1' => 'laaste week',
 205+ 'checkuser-week-2' => 'laaste twee weke',
 206+ 'checkuser-month' => 'laaste 30 dae',
 207+ 'checkuser-all' => 'alle',
 208+ 'checkuser-cidr-res' => 'Gemeenskaplike CIDR:',
186209 'checkuser-empty' => 'Die logboek het geen inskrywings nie.',
187210 'checkuser-nomatch' => 'Geen resultate gevind.',
 211+ 'checkuser-nomatch-edits' => 'Niks gevind nie.
 212+Die Laaste wysig was op $1 op $2.',
188213 'checkuser-check' => 'Kontroleer',
189214 'checkuser-log-fail' => 'Kan nie logboek inskrywing byvoeg nie',
190215 'checkuser-nolog' => 'Logboek lêer nie gevind.',
191216 'checkuser-blocked' => 'Versper',
 217+ 'checkuser-gblocked' => 'Globaal geblokkeer',
 218+ 'checkuser-locked' => 'Gesluit',
 219+ 'checkuser-wasblocked' => 'Vantevore geblokkeer gewees',
 220+ 'checkuser-localonly' => 'Nie verenig nie',
 221+ 'checkuser-massblock' => 'Blok geselekteerde gebruikers',
 222+ 'checkuser-blocktag' => 'Vervang gebruikersbladsye met:',
 223+ 'checkuser-blocktag-talk' => 'Vervang besprekingsbladsye met:',
 224+ 'checkuser-massblock-commit' => 'Blok geselekteerde gebruikers',
 225+ 'checkuser-block-success' => "'''Die {{PLURAL:$2|gebruiker|gebruikers}} $1 {{PLURAL:$2|is|is}} nou geblokkeer.'''",
 226+ 'checkuser-block-failure' => "'''Geen gebruikers geblokkeer nie.'''",
 227+ 'checkuser-block-limit' => 'Te veel gebruikers gekies.',
 228+ 'checkuser-block-noreason' => "U moet 'n rede vir die blokkades verskaf.",
 229+ 'checkuser-noreason' => "U moet 'n rede vir hierdie navraag verskaf.",
 230+ 'checkuser-accounts' => '$1 nuwe {{PLURAL:$1|gebruiker|gebruikers}}',
 231+ 'checkuser-too-many' => 'Te veel resultate (volgens skatting). Maak die IP-reeks kleiner.
 232+Hieronder word die gebruikte IP-adresse weergegee (maksimum 5000, op IP-adres gesorteer):',
 233+ 'checkuser-user-nonexistent' => 'Die gespesifiseerde gebruiker bestaan nie.',
 234+ 'checkuser-search-form' => 'Vind logboekinskrywings waar $1 $2 is',
192235 'checkuser-search-submit' => 'Soek',
 236+ 'checkuser-search-initiator' => 'aanvraer',
193237 'checkuser-search-target' => 'teiken',
 238+ 'checkuser-ipeditcount' => '~$1 van alle gebruikers',
194239 'checkuser-log-subpage' => 'Logboek',
 240+ 'checkuser-limited' => "'''Hierdie resultate is vir prestasieredes afgekap.'''",
 241+ 'checkuser-log-userips' => '$1 het die IP-adresse deur $2 opgevra',
 242+ 'checkuser-log-ipedits' => '$1 het die wysigings deur $2 opgevra',
 243+ 'checkuser-log-ipusers' => '$1 het die gebruikers vir $2 opgevra',
 244+ 'checkuser-log-ipedits-xff' => '$1 het die wysigings deur XFF $2 opgevra',
 245+ 'checkuser-log-ipusers-xff' => '$1 het die gebruikers van XFF $2 opgevra',
 246+ 'checkuser-log-useredits' => '$1 het die wysigings deur $2 aangevra',
 247+ 'checkuser-autocreate-action' => 'is outomaties geskep',
 248+ 'checkuser-email-action' => 'het \'n e-pos aan gebruiker "$1" gestuur',
 249+ 'checkuser-reset-action' => 'herstel gebruiker "$1" se wagwoord',
195250 );
196251
197252 /** Amharic (አማርኛ)
@@ -277,12 +332,12 @@
278333 'checkuser-showlog' => 'عرض السجل',
279334 'checkuser-log' => 'سجل تدقيق المستخدم',
280335 'checkuser-query' => 'فحص أحدث التغييرات',
281 - 'checkuser-target' => 'مستخدم أو عنوان أيبي',
 336+ 'checkuser-target' => 'عنوان الأيبي أو اسم المستخدم:',
282337 'checkuser-users' => 'اعرض المستخدمين',
283338 'checkuser-edits' => 'اعرض التعديلات من الأيبي',
284339 'checkuser-ips' => 'اعرض الأيبيهات',
285340 'checkuser-account' => 'الحصول على تعديلات الحساب',
286 - 'checkuser-search' => 'بحث',
 341+ 'checkuser-search' => 'ابحث',
287342 'checkuser-period' => 'المدة:',
288343 'checkuser-week-1' => 'آخر أسبوع',
289344 'checkuser-week-2' => 'آخر أسبوعين',
@@ -312,12 +367,13 @@
313368 'checkuser-block-failure' => "'''لا مستخدمون تم منعهم.'''",
314369 'checkuser-block-limit' => 'تم اختيار عدد كبير من المستخدمين.',
315370 'checkuser-block-noreason' => 'يجب أن تعطي سببا لعمليات المنع.',
 371+ 'checkuser-noreason' => 'يجب أن تقدم سببًا لهذا الاستعلام.',
316372 'checkuser-accounts' => '$1 {{PLURAL:$1|حساب|حساب}} جديد',
317 - 'checkuser-too-many' => 'نتائج كثيرة جدا، من فضلك قلل الCIDR.
 373+ 'checkuser-too-many' => 'نتائج كثيرة جدا (بناء على استعلام تقريبي)، من فضلك قلل CIDR.
318374 هذه هي الأيبيهات المستخدمة (5000 كحد أقصى، مرتبة بالعنوان):',
319375 'checkuser-user-nonexistent' => 'المستخدم المحدد غير موجود.',
320376 'checkuser-search-form' => 'اعثر على مدخلات السجل حيث $1 هو $2',
321 - 'checkuser-search-submit' => 'بحث',
 377+ 'checkuser-search-submit' => 'ابحث',
322378 'checkuser-search-initiator' => 'بادىء',
323379 'checkuser-search-target' => 'هدف',
324380 'checkuser-ipeditcount' => '~$1 من كل المستخدمين',
@@ -335,13 +391,22 @@
336392 'checkuser-reset-action' => 'أعد ضبط كلمة السر للمستخدم "$1"',
337393 );
338394
 395+/** Aramaic (ܐܪܡܝܐ)
 396+ * @author Basharh
 397+ */
 398+$messages['arc'] = array(
 399+ 'checkuser-reason' => 'ܥܠܬܐ:',
 400+ 'checkuser-showlog' => 'ܚܘܝ ܣܓܠܐ',
 401+ 'checkuser-all' => 'ܟܠ',
 402+);
 403+
339404 /** Egyptian Spoken Arabic (مصرى)
340405 * @author Ghaly
341406 * @author Meno25
342407 * @author Ramsis II
343408 */
344409 $messages['arz'] = array(
345 - 'checkuser-summary' => 'الوسيلة دى بتدور فى احدث التغييرات علشان ترجع الايبيهات اللى استعملها يوزر او علشان تعرض بيانات التعديل/اليوزر لعنوان الاى بي.
 410+ 'checkuser-summary' => 'الوسيلة دى بتدور فى احدث التغييرات علشان ترجع الايبيهات اللى استعملها يوزر او علشان تعرض بيانات التعديل/اليوزر لعنوان الاى بى.
346411 اليوزرز و التعديلات اللى اتعملت من أى بى عميل ممكن تترجع عن طريق عناوين XFF لو زودت على الاى بى "/xff".
347412 IPv4 (CIDR 16-32) و IPv6 (CIDR 96-128) مدعومين.
348413 مش اكتر من 5000 تعديل ممكن تتعرض بسبب الاداء.
@@ -358,7 +423,7 @@
359424 'checkuser-showlog' => 'عرض السجل',
360425 'checkuser-log' => 'سجل تشييك اليوزر',
361426 'checkuser-query' => 'دور على احدث التغييرات',
362 - 'checkuser-target' => 'يوزر او اى بي',
 427+ 'checkuser-target' => 'اى بى او يوزر:',
363428 'checkuser-users' => 'هات اليوزرز',
364429 'checkuser-edits' => 'هات التعديلات من الاى بي',
365430 'checkuser-ips' => 'هات الايبيهات',
@@ -384,12 +449,12 @@
385450 'checkuser-wasblocked' => 'اتمنع قبل كدا',
386451 'checkuser-localonly' => 'مش متوحد',
387452 'checkuser-massblock' => 'امنع اليوزرز اللى اخترتهم.',
388 - 'checkuser-massblock-text' => 'الحسابات اللى انت اختارتها ح يتمنعو على طول،مش ح يقدرو يفتحو حسابات و ح يتمنعو اوتوماتيكي.
 453+ 'checkuser-massblock-text' => 'الحسابات اللى انت اختارتها ح يتمنعو على طول،مش ح يقدرو يفتحو حسابات و ح يتمنعو اوتوماتيكى.
389454 عناوين الاى بى ح تتمنع لمدة اسبوع واحد بالنسبة للى بيستعملو الاى بى و مش ح يقدرو يفتحو حسابات.',
390455 'checkuser-blocktag' => 'بدل صفحات اليوزرز بـ:',
391456 'checkuser-blocktag-talk' => 'بدل صفحة النقاش ب',
392457 'checkuser-massblock-commit' => 'امنع اليوزرز اللى اخترتهم',
393 - 'checkuser-block-success' => "'''الـ {{PLURAL:$2|يوزر|يوزرز}} $1 {{PLURAL:$2|بقى ممنوع|بقو ممنوعين}} دلوقتي.'''",
 458+ 'checkuser-block-success' => "'''الـ {{PLURAL:$2|يوزر|يوزرز}} $1 {{PLURAL:$2|بقى ممنوع|بقو ممنوعين}} دلوقتى.'''",
394459 'checkuser-block-failure' => "'''مافيش يوزرز ممنوعين'''",
395460 'checkuser-block-limit' => 'انت اخترت يوزرز كتار جدا.',
396461 'checkuser-block-noreason' => 'لازم تدى سبب لعمليات المنع.',
@@ -595,7 +660,7 @@
596661 'checkuser-showlog' => 'Паказаць журнал',
597662 'checkuser-log' => 'Журнал праверак удзельнікаў',
598663 'checkuser-query' => 'Запытаць апошнія зьмены',
599 - 'checkuser-target' => 'Рахунак удзельніка альбо IP-адрас',
 664+ 'checkuser-target' => 'IP-адрас альбо рахунак удзельніка:',
600665 'checkuser-users' => 'Атрымаць рахункі ўдзельнікаў',
601666 'checkuser-edits' => 'Атрымаць рэдагаваньні, зробленыя з IP-адрасу',
602667 'checkuser-ips' => 'Атрымаць IP-адрасы',
@@ -630,8 +695,9 @@
631696 'checkuser-block-failure' => "'''Няма заблякаваных рахункаў удзельнікаў.'''",
632697 'checkuser-block-limit' => 'Выбрана зашмат рахункаў удзельнікаў.',
633698 'checkuser-block-noreason' => 'Вам неабходна пазначыць прычыну блякаваньня.',
 699+ 'checkuser-noreason' => 'Вам неабходна падаць прычыну гэтага запыту.',
634700 'checkuser-accounts' => '$1 {{PLURAL:$1|новы рахунак|новыя рахункі|новых рахункаў}}',
635 - 'checkuser-too-many' => 'Зашмат вынікаў, калі ласка, абмяжуйце CIDR.
 701+ 'checkuser-too-many' => 'Зашмат вынікаў (згодна з адзнакай запыту), калі ласка, абмяжуйце CIDR.
636702 Тут пададзеныя ўжытыя ІР-адрасы (максымум 5000, адсартаваныя паводле адрасу):',
637703 'checkuser-user-nonexistent' => 'Пазначанага рахунку ўдзельніка не існуе.',
638704 'checkuser-search-form' => 'Пошук запісаў у журнале, дзе $1 зьяўляецца $2',
@@ -657,6 +723,7 @@
658724 * @author Borislav
659725 * @author DCLXVI
660726 * @author Spiritia
 727+ * @author Turin
661728 */
662729 $messages['bg'] = array(
663730 'checkuser-summary' => 'Този инструмент сканира последните промени и извлича IP адресите, използвани от потребител или показва информацията за редакциите/потребителя за посоченото IP.
@@ -665,6 +732,7 @@
666733 'checkuser-desc' => 'Предоставя на потребители с подходящите права възможност за проверка на потребителски IP адреси и друга информация',
667734 'checkuser-logcase' => 'Търсенето в дневника различава главни от малки букви.',
668735 'checkuser' => 'Проверяване на потребител',
 736+ 'checkuser-contribs' => 'проверка на IP-адреса на потребителя',
669737 'group-checkuser' => 'Проверяващи',
670738 'group-checkuser-member' => 'Проверяващ',
671739 'right-checkuser' => 'проверяване на потребителски IP адреси и друга информация',
@@ -674,7 +742,7 @@
675743 'checkuser-showlog' => 'Показване на дневника',
676744 'checkuser-log' => 'Дневник на проверяващите',
677745 'checkuser-query' => 'Заявка към последните промени',
678 - 'checkuser-target' => 'Потребител или IP',
 746+ 'checkuser-target' => 'IP-адрес или потребителско име:',
679747 'checkuser-users' => 'Извличане на потребители',
680748 'checkuser-edits' => 'Извличане на редакции от IP',
681749 'checkuser-ips' => 'Извличане на IP адреси',
@@ -693,6 +761,8 @@
694762 'checkuser-nolog' => 'Не беше открит дневник.',
695763 'checkuser-blocked' => 'Блокиран',
696764 'checkuser-gblocked' => 'Глобално блокиран',
 765+ 'checkuser-locked' => 'Заключено',
 766+ 'checkuser-wasblocked' => 'Блокиран преди време',
697767 'checkuser-massblock' => 'Блокиране на избраните потребители',
698768 'checkuser-blocktag' => 'Заместване на потребителските страници с:',
699769 'checkuser-blocktag-talk' => 'Заместване на беседите с:',
@@ -701,6 +771,7 @@
702772 'checkuser-block-failure' => "'''Няма блокирани потребители.'''",
703773 'checkuser-block-limit' => 'Избрани са твърде много потребители.',
704774 'checkuser-block-noreason' => 'Трябва да се посочи причина за блокиранията.',
 775+ 'checkuser-noreason' => 'Необходимо е да се посочи основание за тази заявка.',
705776 'checkuser-accounts' => '$1 {{PLURAL:$1|нова сметка|нови сметки}}',
706777 'checkuser-too-many' => 'Твърде много резултати. Показани са използваните IP адреси (най-много 5000, сортирани по адрес):',
707778 'checkuser-user-nonexistent' => 'Посоченият потребител не съществува.',
@@ -717,6 +788,7 @@
718789 'checkuser-log-ipedits-xff' => '$1 е получил редакции за XFF $2',
719790 'checkuser-log-ipusers-xff' => '$1 е получил потребители за XFF $2',
720791 'checkuser-email-action' => 'изпрати е-писмо на потребител „$1“',
 792+ 'checkuser-reset-action' => 'промяна на парола за потребител "$1"',
721793 );
722794
723795 /** Bengali (বাংলা)
@@ -734,7 +806,7 @@
735807 'group-checkuser' => 'ব্যবহারকারীসমূহ পরীক্ষণ',
736808 'group-checkuser-member' => 'ব্যবহারকারী পরীক্ষণ',
737809 'grouppage-checkuser' => '{{ns:project}}:ব্যবহারকারী পরীক্ষণ',
738 - 'checkuser-reason' => 'কারণ',
 810+ 'checkuser-reason' => 'কারণ:',
739811 'checkuser-showlog' => 'লগ দেখাও',
740812 'checkuser-log' => 'CheckUser লগ',
741813 'checkuser-query' => 'সাম্প্রতিক পরিবর্তনসমূহ জানুন',
@@ -743,6 +815,11 @@
744816 'checkuser-edits' => 'আইপি থেকে সম্পাদনাসমূহ পাওয়া যাবে',
745817 'checkuser-ips' => 'আইপি সমূহ পাওয়া যাবে',
746818 'checkuser-search' => 'অনুসন্ধান',
 819+ 'checkuser-period' => 'সময়:',
 820+ 'checkuser-week-1' => 'পূর্ববর্তী সপ্তাহ',
 821+ 'checkuser-week-2' => 'পূর্ববর্তী দুই সপ্তাহ',
 822+ 'checkuser-month' => 'পূর্ববর্তী ৩০ দিন',
 823+ 'checkuser-all' => 'সমস্ত',
747824 'checkuser-empty' => 'এই লগে কিছুই নেই।',
748825 'checkuser-nomatch' => 'এর সাথে মিলে এমন কিছু পাওয়া যায়নি।',
749826 'checkuser-check' => 'পরীক্ষা করুন',
@@ -766,45 +843,81 @@
767844 );
768845
769846 /** Breton (Brezhoneg)
 847+ * @author Fohanno
770848 * @author Fulup
 849+ * @author Y-M D
771850 */
772851 $messages['br'] = array(
773852 'checkuser-summary' => "Furchal a ra an ostilh-mañ ar c'hemmoù diwezhañ a-benn klask ar chomlec'h IP implijet gant un implijer bennak, diskouez a ra holl degasadennoù ur chomlec'h IP (ha pa vefe bet enrollet), pe roll ar c'hontoù implijet gant ur chomlec'h IP. Gallout a ra ar c'hontoù hag ar c'hemmoù bezañ kavet gant un IP XFF mard echu gant \"/xff\". Posupl eo implijout ar protokoloù IPv4 (CIDR 16-32) hag IPv6 (CIDR 96-128). Bevennet eo an niver a gemmoù a c'haller lakaat war wel da {{formatnum:5000}} evit abegoù nerzh ar servijer. Grit gant an ostilh-mañ en ur zoujañ d'ar garta implijout.",
774853 'checkuser-desc' => "Reiñ a ra an tu d'an dud aotreet evit se da wiriañ chomlec'hioù IP an implijerien ha da gaout titouroù all",
775854 'checkuser-logcase' => "Kizidik eo ar c'hlask er marilh ouzh an direnneg (pennlizherennoù/lizherennoù munud)",
776855 'checkuser' => 'Gwiriañ an implijer',
 856+ 'checkuser-contribs' => "gwiriañ chomlec'hioù IP an implijer",
777857 'group-checkuser' => 'Gwiriañ an implijerien',
778858 'group-checkuser-member' => 'Gwiriañ an implijer',
 859+ 'right-checkuser' => "Gwiriañ chomlec'h IP ha titouroù all un implijer",
 860+ 'right-checkuser-log' => 'Sellet ouzh roll ar wiriadennoù bet graet gant an implijerien',
779861 'grouppage-checkuser' => '{{ns:project}}:Gwiriañ an implijer',
780 - 'checkuser-reason' => 'Abeg',
 862+ 'checkuser-reason' => 'Abeg :',
781863 'checkuser-showlog' => 'Diskouez ar marilh',
782864 'checkuser-log' => 'Marilh kontrolliñ an implijerien',
783865 'checkuser-query' => "Klask dre ar c'hemmoù diwezhañ",
784 - 'checkuser-target' => 'Implijer pe IP',
 866+ 'checkuser-target' => 'Anv implijer pe IP :',
785867 'checkuser-users' => 'Kavout an implijerien',
786868 'checkuser-edits' => "Kavout degasadennoù ar chomlec'h IP",
787869 'checkuser-ips' => "Kavout ar chomlec'hioù IP",
 870+ 'checkuser-account' => 'Gwelet kemmoù ar gont',
788871 'checkuser-search' => 'Klask',
 872+ 'checkuser-period' => 'Pad :',
 873+ 'checkuser-week-1' => 'Er sizhun ziwezhañ',
 874+ 'checkuser-week-2' => 'en div sizhunvezh ziwezhañ',
 875+ 'checkuser-month' => 'en 30 devezh diwezhañ',
 876+ 'checkuser-all' => 'pep tra',
 877+ 'checkuser-cidr-label' => "Klask ul lijorenn boutin hag ar chomlerc'hioù lakaet evit ur roll chomlec'hioù IP",
 878+ 'checkuser-cidr-res' => 'Lijorenn CIDR boutin :',
789879 'checkuser-empty' => "N'eus pennad ebet er marilh",
790880 'checkuser-nomatch' => "N'eus bet kavet netra.",
 881+ 'checkuser-nomatch-edits' => "N'eobet kavet reveziadenn ebet. Ar c'hemm diwezhañ a oa d'an $1 da $2.",
791882 'checkuser-check' => 'Gwiriañ',
792883 'checkuser-log-fail' => "Dibosupl ouzhpennañ ar moned d'ar marilh",
793884 'checkuser-nolog' => 'Restr ebet er marilh',
794885 'checkuser-blocked' => 'Stanket',
795 - 'checkuser-too-many' => "Re a zisoc'hoù, strishaat ar CIDR mar plij.
796 -Setu an IPoù implijet (5000 d'ar muiañ, urzhiet dre ar chomlec'h)",
 886+ 'checkuser-gblocked' => 'Stankañ en un doare hollek',
 887+ 'checkuser-locked' => 'Prennet',
 888+ 'checkuser-wasblocked' => 'Bet stanket a-raok',
 889+ 'checkuser-localonly' => "N'eo ket unvanet",
 890+ 'checkuser-massblock' => 'Stankañ an implijerien dibabet',
 891+ 'checkuser-massblock-text' => "Ar gontoù dibabet a vo stanket da viken, gant ar stankadur emgefre gweredekaat ha krouidigezh ur gont diweredekaat.
 892+Ar chomlec'hioù IP a vo stanket e-pad ur sizhunvezh hepken evit an implijerien a ra gant an IP ha krouidigezh ur gont a vo diweredekaat.",
 893+ 'checkuser-blocktag' => "Erlec'hiañ ar bajennoù implijer gant :",
 894+ 'checkuser-blocktag-talk' => "Erlec'hiañ ar bajennoù kaozeal gant :",
 895+ 'checkuser-massblock-commit' => 'Stankañ an implijer dibabet',
 896+ 'checkuser-block-success' => "'''Stanket eo an {{PLURAL:$2|implijer|implijerien}} $1 bremañ'''",
 897+ 'checkuser-block-failure' => '"N\'eus implijer stanket ebet."',
 898+ 'checkuser-block-limit' => 'Re a implijerien diuzet.',
 899+ 'checkuser-block-noreason' => "Ret eo deoc'h abegiñ ar stankadennoù.",
 900+ 'checkuser-noreason' => "Ret eo deoc'h abegiñ evit ar reked-mañ.",
 901+ 'checkuser-accounts' => '$1 {{PLURAL:$1|kont|kontoù}} nevez',
 902+ 'checkuser-too-many' => "Re a zisoc'hoù (hervez istimadur ar reked), strishaat ar CIDR mar plij.
 903+Setu an IPoù implijet (5000 d'ar muiañ, urzhiet dre ar chomlec'h) :",
797904 'checkuser-user-nonexistent' => "N'eus ket eus an implijer merket",
798905 'checkuser-search-form' => "Kavout marilh ar monedoù m'eo $1 evit $2",
799906 'checkuser-search-submit' => 'Klask',
800907 'checkuser-search-initiator' => 'deraouer',
801908 'checkuser-search-target' => 'pal',
 909+ 'checkuser-ipeditcount' => '~$1 eus an holl implijerien',
802910 'checkuser-log-subpage' => 'Marilh',
803911 'checkuser-log-return' => "Distreiñ da furmskrid pennañ ar c'hontrolliñ implijerien",
 912+ 'checkuser-limited' => "'''An disoc'hoù-mañ a zo bet troc'het evit abegoù liammet gant an efedusted.'''",
804913 'checkuser-log-userips' => '$1 en deus kavet IPoù evit $2',
805914 'checkuser-log-ipedits' => '$1 en deus kavet kemmoù evit $2',
806915 'checkuser-log-ipusers' => '$1 en deus kavet implijerien evit $2',
807916 'checkuser-log-ipedits-xff' => '$1 en deus kavet kemmoù evit $2 dre XFF',
808917 'checkuser-log-ipusers-xff' => 'Kavet en deus $1 implijerien $2 dre XFF',
 918+ 'checkuser-log-useredits' => '$1 a zo bet kemmet gant $2',
 919+ 'checkuser-autocreate-action' => 'bet krouet ez otomatikel',
 920+ 'checkuser-email-action' => "en deus kaset ur postel d'an implijer « $1 »",
 921+ 'checkuser-reset-action' => 'adderaouekaat ar ger-tremen evit an implijer « $1 »',
809922 );
810923
811924 /** Bosnian (Bosanski)
@@ -828,7 +941,7 @@
829942 'checkuser-showlog' => 'Prikaži zapis',
830943 'checkuser-log' => 'Zapis CheckUsera',
831944 'checkuser-query' => 'Pretraži nedavne izmjene',
832 - 'checkuser-target' => 'Korisnik ili IP',
 945+ 'checkuser-target' => 'IP adresa ili korisničko ime:',
833946 'checkuser-users' => 'Nađi korisnike',
834947 'checkuser-edits' => 'Nađi izmjene sa IP adrese',
835948 'checkuser-ips' => 'Nađi IP adrese',
@@ -863,8 +976,9 @@
864977 'checkuser-block-failure' => "'''Nijedan korisnik nije blokiran.'''",
865978 'checkuser-block-limit' => 'Previše korisnika odabrano.',
866979 'checkuser-block-noreason' => 'Morate navesti razlog za blokiranje.',
 980+ 'checkuser-noreason' => 'Morate navesti razlog za ovaj upit.',
867981 'checkuser-accounts' => '$1 {{PLURAL:$1|novi korisnik|nova korisnika|novih korisnika}}',
868 - 'checkuser-too-many' => 'Pronađeno previše rezultata, molimo da suzite CIDR.
 982+ 'checkuser-too-many' => 'Pronađeno previše rezultata (po procjeni upita), molimo da suzite CIDR.
869983 Ovdje su prikazane korištene IP adrese (najviše 5000, poredano po adresi):',
870984 'checkuser-user-nonexistent' => 'Navedeni korisnik ne postoji.',
871985 'checkuser-search-form' => 'Nađi stavke zapisa gdje je $1 jednako $2',
@@ -892,6 +1006,8 @@
8931007 * @author Juanpabl
8941008 * @author Paucabot
8951009 * @author SMP
 1010+ * @author Solde
 1011+ * @author Ssola
8961012 * @author Toniher
8971013 */
8981014 $messages['ca'] = array(
@@ -901,6 +1017,7 @@
9021018 'checkuser-desc' => "Permet als usuaris amb els permisos adients l'habilitat de comprovar les adreces IP que fan servir els usuaris enregistrats.",
9031019 'checkuser-logcase' => 'Les majúscules es tracten de manera diferenciada en la cerca dins el registre.',
9041020 'checkuser' => "Comprova l'usuari",
 1021+ 'checkuser-contribs' => "comprova les IP de l'usuari",
9051022 'group-checkuser' => 'Checkusers',
9061023 'group-checkuser-member' => 'CheckUser',
9071024 'right-checkuser' => 'Comprovar les adreces IP i altra informació dels usuaris',
@@ -910,7 +1027,7 @@
9111028 'checkuser-showlog' => 'Mostra registre',
9121029 'checkuser-log' => 'Registre de Checkuser',
9131030 'checkuser-query' => 'Cerca als canvis recents',
914 - 'checkuser-target' => 'Usuari o IP',
 1031+ 'checkuser-target' => "Adreça IP o nom d'usuari:",
9151032 'checkuser-users' => 'Retorna els usuaris',
9161033 'checkuser-edits' => 'Retorna les edicions de la IP',
9171034 'checkuser-ips' => 'Retorna adreces IP',
@@ -921,10 +1038,12 @@
9221039 'checkuser-week-2' => 'Darreres dues setmanes',
9231040 'checkuser-month' => 'Darrers 30 dies',
9241041 'checkuser-all' => 'tot',
 1042+ 'checkuser-cidr-label' => "Troba un rang comú i les adreces afectades per una llista d'IP",
 1043+ 'checkuser-cidr-res' => 'CIDR comú:',
9251044 'checkuser-empty' => 'El registre no conté entrades.',
9261045 'checkuser-nomatch' => "No s'han trobat coincidències.",
9271046 'checkuser-nomatch-edits' => "No s'ha trobat.
928 -L'última edició va ser el $1 a $2.",
 1047+L'última modificació va ser el $1 a $2.",
9291048 'checkuser-check' => 'Comprova',
9301049 'checkuser-log-fail' => "No s'ha pogut afegir al registre",
9311050 'checkuser-nolog' => "No s'ha trobat el fitxer del registre.",
@@ -943,8 +1062,10 @@
9441063 'checkuser-block-failure' => "'''No s'han blocat usuaris.'''",
9451064 'checkuser-block-limit' => 'Massa usuaris seleccionats.',
9461065 'checkuser-block-noreason' => "Heu d'indicar un motiu pels bloquejos.",
 1066+ 'checkuser-noreason' => 'Heu de donar un motiu per a executar aquesta consulta.',
9471067 'checkuser-accounts' => '$1 {{PLURAL:$1|nou compte|nous comptes}}',
948 - 'checkuser-too-many' => 'Hi ha massa resultats, cal que useu un CIDR més petit. Aquí teniu les IP usades (màx. 5000 ordenades per adreça):',
 1068+ 'checkuser-too-many' => "Hi ha massa resultats (d'acord amb l'estimació de la consulta), cal que useu un CIDR més petit.
 1069+Aquí teniu les IP usades (màx. 5000 ordenades per adreça):",
9491070 'checkuser-user-nonexistent' => "L'usuari especificat no existeix.",
9501071 'checkuser-search-form' => 'Cerca entrades al registre on $1 és $2',
9511072 'checkuser-search-submit' => 'Cerca',
@@ -1013,7 +1134,7 @@
10141135 'checkuser-showlog' => 'Zobrazit záznamy',
10151136 'checkuser-log' => 'Kniha kontroly uživatelů',
10161137 'checkuser-query' => 'Dotaz na poslední změny',
1017 - 'checkuser-target' => 'Uživatel nebo IP',
 1138+ 'checkuser-target' => 'IP adresa nebo uživatelské jméno:',
10181139 'checkuser-users' => 'Najít uživatele',
10191140 'checkuser-edits' => 'Najít editace z IP',
10201141 'checkuser-ips' => 'Najít IP adresy',
@@ -1046,8 +1167,10 @@
10471168 'checkuser-block-failure' => "'''Žádný uživatel nebyl zablokován.'''",
10481169 'checkuser-block-limit' => 'Vybráno příliš mnoho uživatelů',
10491170 'checkuser-block-noreason' => 'Musíte zadat důvod blokování',
 1171+ 'checkuser-noreason' => 'K tomuto dotazu musíte uvést důvod.',
10501172 'checkuser-accounts' => '$1 {{PLURAL:$1|nový účet|nové účty|nových účtů}}',
1051 - 'checkuser-too-many' => 'Příliš mnoho výsledků, zkuste omezit CIDR. Níže jsou použité IP adresy (nejvýše 500, seřazené abecedně):',
 1173+ 'checkuser-too-many' => 'Příliš mnoho výsledků (podle odhadu dotazu), zkuste omezit CIDR.
 1174+Níže jsou použité IP adresy (nejvýše 5000, seřazené podle adresy):',
10521175 'checkuser-user-nonexistent' => 'Zadaný uživatel neexistuje.',
10531176 'checkuser-search-form' => 'Hledej záznamy, kde $1 je $2',
10541177 'checkuser-search-submit' => 'Hledat',
@@ -1083,6 +1206,7 @@
10841207 'checkuser-desc' => "Yn rhoi'r gallu i ddefnyddwyr awdurdodedig archwilio cyfeiriadau IP defnyddwyr a gwybodaeth arall amdanynt.",
10851208 'checkuser-logcase' => 'Yn gwahaniaethu rhwng llythrennau mawr a bach wrth chwilio.',
10861209 'checkuser' => 'Archwilio defnyddwyr',
 1210+ 'checkuser-contribs' => 'archwilio IP y defnyddiwr',
10871211 'group-checkuser' => 'Archwilwyr defnyddwyr',
10881212 'group-checkuser-member' => 'Archwiliwr defnyddwyr',
10891213 'right-checkuser' => 'Archwilio cyfeiriadau IP defnyddwyr a gwybodaeth arall amdanynt',
@@ -1091,7 +1215,11 @@
10921216 'checkuser-reason' => 'Rheswm:',
10931217 'checkuser-showlog' => 'Dangos y lòg',
10941218 'checkuser-log' => 'Lòg archwilio defnyddwyr',
1095 - 'checkuser-target' => 'Defnyddiwr neu IP',
 1219+ 'checkuser-target' => 'Defnyddiwr neu gyfeiriad IP:',
 1220+ 'checkuser-users' => 'Nôl defnyddwyr',
 1221+ 'checkuser-edits' => "Nôl golygiadau o'r IP",
 1222+ 'checkuser-ips' => 'Nôl IPau',
 1223+ 'checkuser-account' => "Nôl y golygiadau a wneuthpwyd trwy'r cyfrif hwn",
10961224 'checkuser-search' => 'Chwilio',
10971225 'checkuser-period' => 'Cyfnod:',
10981226 'checkuser-week-1' => 'yr wythnos ddiwethaf',
@@ -1101,17 +1229,27 @@
11021230 'checkuser-empty' => "Mae'r lòg yn wag.",
11031231 'checkuser-check' => 'Archwilio',
11041232 'checkuser-log-fail' => 'Yn methu ychwanegu cofnod lòg',
 1233+ 'checkuser-blocked' => 'Wedi ei flocio',
 1234+ 'checkuser-gblocked' => "Wedi ei flocio'n wici-gyfan",
 1235+ 'checkuser-locked' => 'Ar glo',
 1236+ 'checkuser-wasblocked' => "Wedi blocio o'r blaen",
 1237+ 'checkuser-block-noreason' => 'Rhaid cynnig rheswm dros y blociau.',
 1238+ 'checkuser-noreason' => 'Rhaid cynnig rheswm dros yr ymholiad hwn.',
11051239 'checkuser-accounts' => '$1 {{PLURAL:$1|cyfrif|cyfrif|gyfrif|chyfrif|chyfrif|cyfrif}} newydd',
11061240 'checkuser-search-form' => "Chwilio am gofnodion lòg gyda'r $1 $2",
11071241 'checkuser-search-submit' => 'Chwilio',
11081242 'checkuser-log-subpage' => 'Lòg',
 1243+ 'checkuser-log-return' => 'Dychwelyd at y brif ffurflen Archwilio Defnyddwyr',
 1244+ 'checkuser-autocreate-action' => "wedi ei greu'n awtomatig",
11091245 'checkuser-email-action' => 'wedi anfon e-bost at y defnyddiwr "$1"',
11101246 'checkuser-reset-action' => 'wedi ailosod y cyfrinair ar gyfer y defnyddiwr "$1"',
11111247 );
11121248
11131249 /** Danish (Dansk)
11141250 * @author Amjaabc
 1251+ * @author Byrial
11151252 * @author Fredelige
 1253+ * @author Masz
11161254 * @author Morten LJ
11171255 */
11181256 $messages['da'] = array(
@@ -1123,8 +1261,10 @@
11241262 'checkuser' => 'Checkbruger',
11251263 'group-checkuser' => 'Checkbrugere',
11261264 'group-checkuser-member' => 'Checkbruger',
 1265+ 'right-checkuser' => 'Tjekke en brugers IP-adresser og andre oplysninger',
 1266+ 'right-checkuser-log' => 'Se checkuser-loggen',
11271267 'grouppage-checkuser' => '{{ns:project}}:Checkbruger',
1128 - 'checkuser-reason' => 'Begrundelse',
 1268+ 'checkuser-reason' => 'Begrundelse:',
11291269 'checkuser-showlog' => 'Vis log',
11301270 'checkuser-log' => 'Checkbrugerlog',
11311271 'checkuser-query' => 'Søg i seneste ændringer',
@@ -1176,14 +1316,14 @@
11771317 'checkuser-contribs' => 'IP-Adressen von Benutzer prüfen',
11781318 'group-checkuser' => 'Checkuser',
11791319 'group-checkuser-member' => 'Checkuser-Berechtigter',
1180 - 'right-checkuser' => 'Prüfung von IP-Adressen sowie Verbindungen zwischen IPs und angemeldeten Benutzern',
1181 - 'right-checkuser-log' => 'Ansehen des Checkuser-Logbuches',
 1320+ 'right-checkuser' => 'IP-Adressen sowie Verbindungen zwischen IP-Adressen und angemeldeten Benutzern prüfen',
 1321+ 'right-checkuser-log' => 'Checkuser-Logbuch ansehen',
11821322 'grouppage-checkuser' => '{{ns:project}}:CheckUser',
11831323 'checkuser-reason' => 'Grund:',
11841324 'checkuser-showlog' => 'Logbuch anzeigen',
11851325 'checkuser-log' => 'Checkuser-Logbuch',
11861326 'checkuser-query' => 'Letzte Änderungen abfragen',
1187 - 'checkuser-target' => 'Benutzer oder IP-Adresse',
 1327+ 'checkuser-target' => 'IP-Adresse oder Benutzername:',
11881328 'checkuser-users' => 'Hole Benutzer',
11891329 'checkuser-edits' => 'Hole Bearbeitungen von IP-Adresse',
11901330 'checkuser-ips' => 'Hole IP-Adressen',
@@ -1198,7 +1338,7 @@
11991339 'checkuser-cidr-res' => 'Gemeinschaftliche CIDR:',
12001340 'checkuser-empty' => 'Das Logbuch enthält keine Einträge.',
12011341 'checkuser-nomatch' => 'Keine Übereinstimmungen gefunden.',
1202 - 'checkuser-nomatch-edits' => 'Keine Übereinstimmungen gefunden. Letzte Bearbeitung hat am $1 um $2 stattgefunden.',
 1342+ 'checkuser-nomatch-edits' => 'Keine Übereinstimmungen gefunden. Letzte Bearbeitung hat am $1 um $2 Uhr stattgefunden.',
12031343 'checkuser-check' => 'Ausführen',
12041344 'checkuser-log-fail' => 'Logbuch-Eintrag kann nicht hinzugefügt werden.',
12051345 'checkuser-nolog' => 'Keine Logbuchdatei vorhanden.',
@@ -1217,8 +1357,9 @@
12181358 'checkuser-block-failure' => "'''Es wurden keine Benutzer gesperrt.'''",
12191359 'checkuser-block-limit' => 'Es wurden zuviele Benutzer ausgewählt.',
12201360 'checkuser-block-noreason' => 'Du musst einen Grund für die Sperre angeben.',
 1361+ 'checkuser-noreason' => 'Für diese Abfrage muss eine Begründung angegeben werden.',
12211362 'checkuser-accounts' => '{{PLURAL:$1|1 neues Benutzerkonto|$1 neue Benutzerkonten}}',
1222 - 'checkuser-too-many' => 'Die Ergebnisliste ist zu lang, bitte grenze den IP-Bereich weiter ein. Hier sind die benutzten IP-Adressen (maximal 5000, sortiert nach Adresse):',
 1363+ 'checkuser-too-many' => 'Die Ergebnisliste ist zu lang (nach der Schätzung), bitte grenze den IP-Bereich weiter ein. Hier sind die benutzten IP-Adressen (maximal 5000, sortiert nach Adresse):',
12231364 'checkuser-user-nonexistent' => 'Das angegebene Benutzerkonto ist nicht vorhanden.',
12241365 'checkuser-search-form' => 'Suche Logbucheinträge, bei denen $1 $2 ist.',
12251366 'checkuser-search-submit' => 'Suche',
@@ -1240,12 +1381,97 @@
12411382 );
12421383
12431384 /** German (formal address) (Deutsch (Sie-Form))
 1385+ * @author Imre
12441386 * @author Umherirrender
12451387 */
12461388 $messages['de-formal'] = array(
 1389+ 'checkuser-summary' => 'Dieses Werkzeug durchsucht die letzten Änderungen, um die IP-Adressen eines Benutzers bzw. die Bearbeitungen/Benutzernamen für eine IP-Adresse zu ermitteln. Benutzer und Bearbeitungen einer IP-Adresse können auch nach Informationen aus den XFF-Headern abgefragt werden, indem der IP-Adresse ein „/xff“ angehängt wird. IPv4 (CIDR 16-32) und IPv6 (CIDR 96-128) werden unterstützt.
 1390+Aus Performance-Gründen werden maximal 5000 Bearbeitungen ausgegeben. Benutzen Sie CheckUser ausschließlich in Übereinstimmung mit den Datenschutzrichtlinien.',
12471391 'checkuser-block-noreason' => 'Sie müssen einen Grund für die Sperre angeben.',
 1392+ 'checkuser-too-many' => 'Die Ergebnisliste ist zu lang (nach der Schätzung), bitte grenzen Sie den IP-Bereich weiter ein. Hier sind die benutzten IP-Adressen (maximal 5000, sortiert nach Adresse):',
12481393 );
12491394
 1395+/** Zazaki (Zazaki)
 1396+ * @author Mirzali
 1397+ * @author Xoser
 1398+ */
 1399+$messages['diq'] = array(
 1400+ 'checkuser-summary' => 'Ena xacet vurnayişanê neweyî skan keno ke adresanê IPyan reyan biyaro ke bimucne datayê karberî ser yew adresê IPyî.
 1401+Karberan u vurnayîşan ke yew IPyê karberî kerd reyna yeno pê XFF u "/xff". IPv4 (CIDR 16-32) u IPv6 (CIDR 96-128) rê zi destek beno.
 1402+5000 zafyer vurnayîşan sero netice nidano, qe performans hedi beno.
 1403+Ena politika ma ser kar bike.',
 1404+ 'checkuser-desc' => 'Karberan rê destur bide ke adresanê IPyan u enformasyonê bînan kontrol bike',
 1405+ 'checkuser-logcase' => 'Ena bigêrayîşê logî case sensitive o.',
 1406+ 'checkuser' => 'Karber kontrol bike',
 1407+ 'checkuser-contribs' => 'Adresê IP yê karberî kontrol bike',
 1408+ 'group-checkuser' => 'Karberî kontrol bike',
 1409+ 'group-checkuser-member' => 'Karber kontrol bike',
 1410+ 'right-checkuser' => 'Adresê IP yê karberî u enformasyonê binî kontrol bike',
 1411+ 'right-checkuser-log' => 'Logê karber-kontrolî bivîne',
 1412+ 'grouppage-checkuser' => '{{ns:project}}:Karber kontrol bike',
 1413+ 'checkuser-reason' => 'Sebeb:',
 1414+ 'checkuser-showlog' => 'Logê mucnayîşî',
 1415+ 'checkuser-log' => 'Logê karber-kontrolî',
 1416+ 'checkuser-query' => 'Bigêrayîşî de vurnayîşanê penîyan',
 1417+ 'checkuser-target' => 'Adresa IPi ya zi namey karberi:',
 1418+ 'checkuser-users' => 'Karberî bivîne',
 1419+ 'checkuser-edits' => 'Bivîne vurnayîşê ke IP ra',
 1420+ 'checkuser-ips' => 'Adresê IPyî bivîne',
 1421+ 'checkuser-account' => 'Bivîne vurnayîşê hesabî',
 1422+ 'checkuser-search' => 'Bigêre',
 1423+ 'checkuser-period' => 'Sure:',
 1424+ 'checkuser-week-1' => 'hefteyê verînî',
 1425+ 'checkuser-week-2' => 'di hefteyê verînî',
 1426+ 'checkuser-month' => '30 rocê verînî',
 1427+ 'checkuser-all' => 'hemî',
 1428+ 'checkuser-cidr-label' => 'Qe yew listeyê IPyanî, yew menzilê ortakî u adresanê IPyanî bivîne',
 1429+ 'checkuser-cidr-res' => 'CIDRê muşterekî',
 1430+ 'checkuser-empty' => 'Ena log de çik çin o.',
 1431+ 'checkuser-nomatch' => 'Çik çin o.',
 1432+ 'checkuser-nomatch-edits' => 'Çik çin o.
 1433+Vurnayîşê tewr penî seet $1 u rocê $2 de biyo.',
 1434+ 'checkuser-check' => 'Kontrol bike',
 1435+ 'checkuser-log-fail' => 'Nieşkeno log debiker',
 1436+ 'checkuser-nolog' => 'Dosyayê logî çin o.',
 1437+ 'checkuser-blocked' => 'Blok biya',
 1438+ 'checkuser-gblocked' => 'Global de blok biya',
 1439+ 'checkuser-locked' => 'Kilit biya',
 1440+ 'checkuser-wasblocked' => 'Verni de blok biya',
 1441+ 'checkuser-localonly' => 'Yew niyo',
 1442+ 'checkuser-massblock' => 'Karberê ke ti weçîno înan blok bike',
 1443+ 'checkuser-massblock-text' => 'Hesabanê weçineye ebedi blok beno, pê otoblokî a biyo u hesab viraştişî qefilnayo.
 1444+Adresanê IPyan yew hefte blok beno, pê hesab viraştişî qefilnayo.',
 1445+ 'checkuser-blocktag' => 'Pelanê karberan pê înan bivurne:',
 1446+ 'checkuser-blocktag-talk' => 'Pelanê minaqeşeyî pê înan bivurne:',
 1447+ 'checkuser-massblock-commit' => 'Karberê ke ti weçîno înan blok bike',
 1448+ 'checkuser-block-success' => "'''{{PLURAL:$2|Karber|Karberan}} $1 eka blok bi{{PLURAL:$2|y|yê}}.'''",
 1449+ 'checkuser-block-failure' => "'''Çew blok nibiya.'''",
 1450+ 'checkuser-block-limit' => 'Ti zaf karberan weçino.',
 1451+ 'checkuser-block-noreason' => 'Qe blokan, ti gani yew sebeb bide.',
 1452+ 'checkuser-noreason' => 'Qe bigêrayîşî, ti gani yew sebeb bide.',
 1453+ 'checkuser-accounts' => '$1 {{PLURAL:$1|hesab|hesaban}} newî',
 1454+ 'checkuser-too-many' => 'Zaf neticiyan esto (ser texminê cigeyrayîşî), şima ra rica keno CIDR qickek bike.
 1455+Tiya de IPyan ke sero kar biyo (5000 max, pê adresan):',
 1456+ 'checkuser-user-nonexistent' => 'Karbero ke ti specife kerd, ay database ma de niesto.',
 1457+ 'checkuser-search-form' => 'Entryanê logan ke $1 biy $2, înan bivîne',
 1458+ 'checkuser-search-submit' => 'Bigêre',
 1459+ 'checkuser-search-initiator' => 'başlî kerdoğ',
 1460+ 'checkuser-search-target' => 'hedef',
 1461+ 'checkuser-ipeditcount' => '~$1 karberanê hemî ra',
 1462+ 'checkuser-log-subpage' => 'Log',
 1463+ 'checkuser-log-return' => 'Farmê serî CheckUser rê reyna şî',
 1464+ 'checkuser-limited' => "'''Ena neticeyan qe sebabanê performansî ra kilm kerd.'''",
 1465+ 'checkuser-log-userips' => 'Qe $2, $1adresanê IPyan girewt',
 1466+ 'checkuser-log-ipedits' => 'Qe $2, $1vurnayîşan girewt',
 1467+ 'checkuser-log-ipusers' => 'Qe $2, $1 karberan girewt',
 1468+ 'checkuser-log-ipedits-xff' => 'Qe $2, $1vurnayîşan ser XFF girewt',
 1469+ 'checkuser-log-ipusers-xff' => 'Qe $2, $1karberan ser XFF girewt',
 1470+ 'checkuser-log-useredits' => 'Qe $2, $1vurnayîşan girewt',
 1471+ 'checkuser-autocreate-action' => 'otomatikî ra virziyo',
 1472+ 'checkuser-email-action' => 'karberê $1î rê email şîravt',
 1473+ 'checkuser-reset-action' => "qe karberê ''$1''î parola reset bike",
 1474+);
 1475+
12501476 /** Lower Sorbian (Dolnoserbski)
12511477 * @author Michawiki
12521478 */
@@ -1266,7 +1492,7 @@
12671493 'checkuser-showlog' => 'Protokol pokazaś',
12681494 'checkuser-log' => 'Protokol kontrole wužywarjow',
12691495 'checkuser-query' => 'Aktualne změny wótpšašaś',
1270 - 'checkuser-target' => 'Wužywaŕ abo IP',
 1496+ 'checkuser-target' => 'IP-adresa abo wužywarske mě:',
12711497 'checkuser-users' => 'Wužywarjow wobstaraś',
12721498 'checkuser-edits' => 'Změny z IP wobstaraś',
12731499 'checkuser-ips' => 'IP-adrese wobstraś',
@@ -1301,8 +1527,9 @@
13021528 'checkuser-block-failure' => "'''Žedne wužywarje blokěrowane.'''",
13031529 'checkuser-block-limit' => 'Pśewjele wužywarjow wubrane.',
13041530 'checkuser-block-noreason' => 'Musyš pśicynu za blokěrowanja pódaś.',
 1531+ 'checkuser-noreason' => 'Musyš pśicynu za toś to wótpšašanje pódaś.',
13051532 'checkuser-accounts' => '$1 {{PLURAL:$1|nowe konto|nowej konśe|nowe konta|nowych kontow}}',
1306 - 'checkuser-too-many' => 'Pśewjele wuslědkow, pšosym wobgranicuj IP-wobcerk. How su wužywane IP-adrese (maks. 5000, pséwuběrane pó adresu):',
 1533+ 'checkuser-too-many' => 'Pśewjele wuslědkow (pó pówoblicenju napšašowanja), pšosym wobgranicuj CIDR. How su wužywane IP-adrese (maks. 5000, pséwuběrane pó adresu):',
13071534 'checkuser-user-nonexistent' => 'Pódany wužywaŕ njeeksistěrujo.',
13081535 'checkuser-search-form' => 'Protokolowe zapiski namakaś, źož $1 jo $2',
13091536 'checkuser-search-submit' => 'Pytaś',
@@ -1391,8 +1618,10 @@
13921619 'checkuser-block-failure' => "'''Κανένας χρήστης φραγμένος.'''",
13931620 'checkuser-block-limit' => 'Έχουν επιλεχθεί πάρα πολλοί χρήστες.',
13941621 'checkuser-block-noreason' => 'Πρέπει να αιτιολογήσετε τις φραγές.',
 1622+ 'checkuser-noreason' => 'Πρέπει να δώσετε μια αιτία για αυτή την ερώτηση.',
13951623 'checkuser-accounts' => '$1 {{PLURAL:$1|νέος λογαριασμός|νέοι λογαριασμοί}}',
1396 - 'checkuser-too-many' => 'Πάρα πολλά αποτελέσματα, παρακαλούμε στενέψτε το CIDR. Παρακάτω είναι οι διευθύνσεις IP που χρησιμοποιούνται (με ανώτατο όριο τις 5000, ταξινομημένες κατά διεύθυνση):',
 1624+ 'checkuser-too-many' => 'Πάρα πολλά αποτελέσματα (σύμφωνα με την εκτίμηση σειράς), παρακαλούμε στενέψτε το CIDR.
 1625+Παρακάτω είναι οι διευθύνσεις IP που χρησιμοποιούνται (με ανώτατο όριο τις 5000, ταξινομημένες κατά διεύθυνση):',
13971626 'checkuser-user-nonexistent' => 'Ο συγκεκριμένος χρήστης δεν υπάρχει.',
13981627 'checkuser-search-form' => 'Εύρεση εγγραφών του αρχείου καταγραφής στις οποίες ο $1 είναι $2',
13991628 'checkuser-search-submit' => 'Αναζήτηση',
@@ -1426,6 +1655,7 @@
14271656 'checkuser-desc' => 'Rajtigas al uzantoj kun la taŭga permeso la kapableco kontroli la IP-adreson de uzanto kaj alia informo',
14281657 'checkuser-logcase' => 'La protokola serĉo estas usklecodistinga.',
14291658 'checkuser' => 'Kontrola uzanto',
 1659+ 'checkuser-contribs' => 'kontroli IP-adresojn de uzantoj',
14301660 'group-checkuser' => 'Kontrolaj uzantoj',
14311661 'group-checkuser-member' => 'Kontrola uzanto',
14321662 'right-checkuser' => 'Kontroli la IP-adreson kaj alian informon de uzanto',
@@ -1435,7 +1665,7 @@
14361666 'checkuser-showlog' => 'Montri protokolon',
14371667 'checkuser-log' => 'Protokolo pri kontrolado de uzantoj',
14381668 'checkuser-query' => 'Informomendu lastatempajn ŝanĝojn',
1439 - 'checkuser-target' => 'Uzanto aŭ IP-adreso',
 1669+ 'checkuser-target' => 'IP-adreso aŭ salutnomo:',
14401670 'checkuser-users' => 'Akiri uzantojn',
14411671 'checkuser-edits' => 'Trovi redaktojn de IP-adreso',
14421672 'checkuser-ips' => 'Preni IP-adresojn',
@@ -1459,18 +1689,19 @@
14601690 'checkuser-locked' => 'Ŝlosita',
14611691 'checkuser-wasblocked' => 'Antaŭe forbarita',
14621692 'checkuser-localonly' => 'Nekunigita',
1463 - 'checkuser-massblock' => 'Forbari selektitajn uzantojn',
1464 - 'checkuser-massblock-text' => 'Selektitaj kontoj estos forbaritaj senlime, kun aŭtomata forbaro ŝaltita kaj kont-kreado malŝaltita.
1465 -IP-adresoj estos forbarita 1 semajnon por IP-uzantoj kun kont-kreado malpermesita.',
 1693+ 'checkuser-massblock' => 'Forbari elektitajn uzantojn',
 1694+ 'checkuser-massblock-text' => 'Elektitaj kontoj estos forbaritaj senlime, kun aŭtomata forbaro ŝaltita kaj kont-kreado malŝaltita.
 1695+IP-adresoj estos forbarita 1 semajnon por IP-uzantoj kun kont-kreado malŝaltita.',
14661696 'checkuser-blocktag' => 'Anstataŭigi uzanto-paĝojn kun:',
14671697 'checkuser-blocktag-talk' => 'Anstataŭigi diskuto-paĝojn kun:',
1468 - 'checkuser-massblock-commit' => 'Forbari selektitajn uzantojn',
 1698+ 'checkuser-massblock-commit' => 'Forbari elektitajn uzantojn',
14691699 'checkuser-block-success' => "'''La {{PLURAL:$2|uzanto|uzantoj}} $1 estas nun {{PLURAL:$2|forbarita|forbaritaj}}.'''",
14701700 'checkuser-block-failure' => "'''Neniuj uzantoj forbariĝis.'''",
1471 - 'checkuser-block-limit' => 'Tro da uzantoj selektitaj.',
 1701+ 'checkuser-block-limit' => 'Tro da uzantoj elektitaj.',
14721702 'checkuser-block-noreason' => 'Vi devas doni kialon por la forbaroj.',
 1703+ 'checkuser-noreason' => 'Vi devas doni kialon por ĉi tiu informomendo.',
14731704 'checkuser-accounts' => '$1 {{PLURAL:$1|nova konto|novaj kontoj}}',
1474 - 'checkuser-too-many' => 'Tro da rezultoj. Bonvolu malvastigi la CIDR.
 1705+ 'checkuser-too-many' => 'Tro da rezultoj, laŭ taskoj de serĉomendo. Bonvolu malvastigi la CIDR.
14751706 Jen la IP-adresoj uzitaj (maksimume 5000, ordigita laŭ adresoj):',
14761707 'checkuser-user-nonexistent' => 'La donata uzanto ne ekzistas.',
14771708 'checkuser-search-form' => 'Trovi protokolerojn en kiu la $1 estas $2',
@@ -1494,11 +1725,14 @@
14951726
14961727 /** Spanish (Español)
14971728 * @author Aleator
 1729+ * @author AlimanRuna
14981730 * @author Crazymadlover
14991731 * @author Dferg
15001732 * @author Dmcdevit
15011733 * @author Jatrobat
15021734 * @author Lin linao
 1735+ * @author Locos epraix
 1736+ * @author Manuelt15
15031737 * @author Muro de Aguas
15041738 * @author Piolinfax
15051739 * @author Remember the dot
@@ -1509,24 +1743,25 @@
15101744 $messages['es'] = array(
15111745 'checkuser-summary' => 'Esta herramienta explora los cambios recientes para obtener las IPs utilizadas por un usuario o para mostrar la información de ediciones/usuarios de una IP.
15121746 También se pueden obtener los usuarios y las ediciones de un cliente IP vía XFF añadiendo "/xff". IPv4 (CIDR 16-32) y IPv6 (CIDR 96-128) funcionan.
1513 -No se muestran más de 5000 ediciones por motivos de rendimiento. Usa esta herramienta en acuerdo con la ley orgánica de protección de datos.',
1514 - 'checkuser-desc' => 'Permite a los usuarios que tienen permiso especial comprobar las IPs de los usuarios además de otra información.',
1515 - 'checkuser-logcase' => 'El buscador de registros distingue entre mayúsculas y minúsculas.',
 1747+No se muestran más de 5000 ediciones por motivos de rendimiento.
 1748+Usa esta herramienta de acuerdo con las políticas correspondientes.',
 1749+ 'checkuser-desc' => 'Permite a los usuarios que tienen permiso especial comprobar las IP de los usuarios además de otra información.',
 1750+ 'checkuser-logcase' => 'La búsqueda en el registro distingue entre mayúsculas y minúsculas.',
15161751 'checkuser' => 'Verificador de usuarios',
15171752 'checkuser-contribs' => 'Verificar IPs de usuario',
15181753 'group-checkuser' => 'Verificadores de usuarios',
15191754 'group-checkuser-member' => 'Verificador de usuarios',
15201755 'right-checkuser' => 'Comprobar las IPs de los usuarios y obtener otra información relacionada',
15211756 'right-checkuser-log' => 'Ver el registro de verificación de usuarios',
1522 - 'grouppage-checkuser' => '{{ns:project}}:verificador de usuarios',
 1757+ 'grouppage-checkuser' => '{{ns:project}}:Verificador de usuarios',
15231758 'checkuser-reason' => 'Motivo:',
15241759 'checkuser-showlog' => 'Ver registro',
15251760 'checkuser-log' => 'Registro de CheckUser',
15261761 'checkuser-query' => 'Buscar en cambios recientes',
1527 - 'checkuser-target' => 'Usuario o IP',
 1762+ 'checkuser-target' => 'Usuario o dirección IP:',
15281763 'checkuser-users' => 'Obtener usuarios',
15291764 'checkuser-edits' => 'Obtener ediciones de IP',
1530 - 'checkuser-ips' => 'Obtener IPs',
 1765+ 'checkuser-ips' => 'Obtener IP',
15311766 'checkuser-account' => 'Ver contribuciones de la cuenta',
15321767 'checkuser-search' => 'Buscar',
15331768 'checkuser-period' => 'Duración:',
@@ -1534,7 +1769,7 @@
15351770 'checkuser-week-2' => 'últimas dos semanas',
15361771 'checkuser-month' => 'últimos 30 días',
15371772 'checkuser-all' => 'todos',
1538 - 'checkuser-cidr-label' => 'Encontrar rango común y afectados de una lista de direcciones de IPs',
 1773+ 'checkuser-cidr-label' => 'Encontrar rango común y afectados de una lista de direcciones de IP',
15391774 'checkuser-cidr-res' => 'CIDR común:',
15401775 'checkuser-empty' => 'No hay elementos en el registro.',
15411776 'checkuser-nomatch' => 'No hay elementos en el registro con esas condiciones.',
@@ -1547,10 +1782,10 @@
15481783 'checkuser-gblocked' => 'Bloqueado globalmente',
15491784 'checkuser-locked' => 'Cuenta bloqueada globalmente',
15501785 'checkuser-wasblocked' => 'Bloqueado anteriormente',
1551 - 'checkuser-localonly' => 'No unificado',
 1786+ 'checkuser-localonly' => 'No unificada',
15521787 'checkuser-massblock' => 'Bloquear usuarios seleccionados',
15531788 'checkuser-massblock-text' => 'Las cuentas seleccionadas serán bloqueadas de forma indefinida, con el autobloqueo habilitado y la creación de cuentas deshabilitada.
1554 -Las direcciones IP serán bloqueadas durante una semana con la creación de cuentas deshabilitada.',
 1789+Las direcciones IP serán bloqueadas durante una semana para usuarios anónimos sólamente con la creación de cuentas deshabilitada.',
15551790 'checkuser-blocktag' => 'Reemplazar páginas del usuario con:',
15561791 'checkuser-blocktag-talk' => 'Reemplazar las páginas de discusión con:',
15571792 'checkuser-massblock-commit' => 'Bloquear usuarios seleccionados',
@@ -1558,8 +1793,10 @@
15591794 'checkuser-block-failure' => "'''No hay usuarios bloqueados.'''",
15601795 'checkuser-block-limit' => 'Demasiados usarios seleccionados.',
15611796 'checkuser-block-noreason' => 'Debe dar una razón para los bloqueos.',
 1797+ 'checkuser-noreason' => 'Debes dar una razón para esta consulta.',
15621798 'checkuser-accounts' => '$1 {{PLURAL:$1|cuenta nueva|cuentas nuevas}}',
1563 - 'checkuser-too-many' => 'Hay demasiados resultados. Por favor limita el CIDR. Aquí se ven las IPs usadas (máximo 5000, ordenadas según dirección):',
 1799+ 'checkuser-too-many' => 'Hay demasiados resultados (estimado), por favor limita el CIDR.
 1800+Aquí se ven las IPs usadas (máximo 5000, ordenadas según dirección):',
15641801 'checkuser-user-nonexistent' => 'El usuario especificado no existe.',
15651802 'checkuser-search-form' => 'Encontrar entradas de registros en las que el $1 es $2',
15661803 'checkuser-search-submit' => 'Buscar',
@@ -1577,47 +1814,63 @@
15781815 'checkuser-log-useredits' => '$1 obtuvo las contribuciones de $2',
15791816 'checkuser-autocreate-action' => 'fue creada automáticamente',
15801817 'checkuser-email-action' => 'envió correo electrónico al usuario «$1»',
1581 - 'checkuser-reset-action' => 'anular contraseña para el usuario «$1»',
 1818+ 'checkuser-reset-action' => 'solicitó un recordatorio de contraseña para el usuario «$1»',
15821819 );
15831820
15841821 /** Estonian (Eesti)
15851822 * @author Avjoska
 1823+ * @author Pikne
15861824 * @author WikedKentaur
15871825 */
15881826 $messages['et'] = array(
 1827+ 'checkuser-desc' => 'Võimaldab vajalike õigustega kasutajal teise kasutaja IP-aadresse ja muud teavet kontrollida.',
 1828+ 'checkuser-logcase' => 'Logi otsing on tõusutundlik.',
 1829+ 'right-checkuser' => 'Kontrollida kasutajate IP-aadresse ja muud teavet',
 1830+ 'checkuser-reason' => 'Põhjus:',
 1831+ 'checkuser-showlog' => 'Näita logi',
 1832+ 'checkuser-target' => 'IP-aadress või kasutajanimi:',
15891833 'checkuser-search' => 'Otsi',
15901834 'checkuser-period' => 'Ajavahemik:',
15911835 'checkuser-week-1' => 'viimane nädal',
15921836 'checkuser-week-2' => 'viimased kaks nädalat',
15931837 'checkuser-month' => 'viimased 30 päeva',
15941838 'checkuser-all' => 'kõik',
 1839+ 'checkuser-nomatch' => 'Tulemusi ei leitud.',
15951840 'checkuser-nolog' => 'Logifaili ei leitud.',
15961841 'checkuser-blocked' => 'Blokeeritud',
15971842 'checkuser-gblocked' => 'Globaalselt blokeeritud',
15981843 'checkuser-locked' => 'Lukustatud',
15991844 'checkuser-wasblocked' => 'Eelnevalt blokeeritud',
 1845+ 'checkuser-localonly' => 'Ei ole globaalset kontot',
 1846+ 'checkuser-massblock' => 'Blokeeri valitud kasutajad',
16001847 'checkuser-blocktag' => 'Asenda kasutajalehed:',
16011848 'checkuser-blocktag-talk' => 'Asenda arutelulehed:',
16021849 'checkuser-massblock-commit' => 'Blokeeri valitud kasutajad',
 1850+ 'checkuser-block-success' => "'''{{PLURAL:$2|Kasutaja|Kasutajad}} $1 on nüüd blokeeritud.'''",
16031851 'checkuser-block-failure' => "'''Ühtegi kasutajat ei blokeeritud.'''",
16041852 'checkuser-block-limit' => 'Liiga palju kasutajaid valitud.',
16051853 'checkuser-block-noreason' => 'Blokeeringule peab andma põhjenduse.',
 1854+ 'checkuser-user-nonexistent' => 'Etteantud kasutajat pole olemas.',
16061855 'checkuser-search-submit' => 'Otsi',
16071856 'checkuser-search-initiator' => 'initsiaator',
16081857 'checkuser-search-target' => 'sihtmärk',
 1858+ 'checkuser-log-subpage' => 'Logi',
16091859 'checkuser-autocreate-action' => 'alustati automaatselt',
16101860 'checkuser-email-action' => 'e-kiri kasutajale "$1" saadetud',
16111861 );
16121862
16131863 /** Basque (Euskara)
 1864+ * @author An13sa
16141865 * @author Kobazulo
16151866 */
16161867 $messages['eu'] = array(
16171868 'checkuser' => 'Erabiltzailea egiaztatu',
16181869 'group-checkuser' => 'Erabiltzaileak egiaztatu',
16191870 'group-checkuser-member' => 'Erabiltzailea egiaztatu',
 1871+ 'grouppage-checkuser' => '{{ns:project}}:Lankidea egiaztatu',
16201872 'checkuser-reason' => 'Arrazoia:',
1621 - 'checkuser-target' => 'Lankidea edo IPa',
 1873+ 'checkuser-showlog' => 'Erregistroa erakutsi',
 1874+ 'checkuser-target' => 'IP helbide edo lankide izena:',
16221875 'checkuser-users' => 'Lankideak ikusi',
16231876 'checkuser-edits' => 'IP baten ekarpenak ikusi',
16241877 'checkuser-ips' => 'IPak ikusi',
@@ -1629,13 +1882,18 @@
16301883 'checkuser-month' => 'azken 30 egunak',
16311884 'checkuser-all' => 'guztiak',
16321885 'checkuser-nomatch' => 'Ez da bat datorren emaitzarik aurkitu.',
 1886+ 'checkuser-check' => 'Egiaztatu',
16331887 'checkuser-blocked' => 'Blokeatua',
16341888 'checkuser-gblocked' => 'Proiektu guztietarako blokeatua',
16351889 'checkuser-locked' => 'Babestua',
16361890 'checkuser-wasblocked' => 'Aurretik blokeatua',
 1891+ 'checkuser-localonly' => 'Batu gabe',
16371892 'checkuser-massblock' => 'Hautatutako lankideak blokeatu',
 1893+ 'checkuser-massblock-commit' => 'Aukeratutako erabiltzaileak blokeatu',
 1894+ 'checkuser-block-success' => "'''$1 {{PLURAL:$2|erabiltzailea|erabiltzaileak}} blokeaturik {{PLURAL:$2|dago|daude}} orain.'''",
16381895 'checkuser-block-limit' => 'Lankide gehiegi hautatu duzu.',
16391896 'checkuser-search-submit' => 'Bilatu',
 1897+ 'checkuser-log-subpage' => 'Erregistroa',
16401898 'checkuser-autocreate-action' => 'automatikoki sortua izan da',
16411899 'checkuser-email-action' => '"$1" lankideari posta elektroniko bat bidali',
16421900 'checkuser-reset-action' => '"$1" lankideari pasahitza berrezarri',
@@ -1653,32 +1911,37 @@
16541912 * @author Huji
16551913 */
16561914 $messages['fa'] = array(
1657 - 'checkuser-summary' => 'این ابزار تغییرات اخیر را برای به دست آوردن نشانی‌های اینترنتی (IP) استفاده شده توسط یک کاربر و یا تعیین ویرایش‌های انجام شده از طریق یک نشانی اینترنتی جستجو می‌کند.
1658 -کاربرها و ویرایش‌های مرتبط با یک نشانی اینترنتی را می‌توان با توجه به اطلاعات سرآیند XFF (با افزودن «‏‎/xff» به انتهای نشانی IP) پیدا کرد.
1659 -هر دو پروتکل IPv4 (معادل CIDR 16-32) و IPv6 (معادل CIDR 96-128) توسط این ابزار پشتیبانی می‌شوند.',
 1915+ 'checkuser-summary' => 'این ابزار تغییرات اخیر را برای به دست آوردن نشانی‌های آی‌پی استفاده شده توسط یک کاربر و یا تعیین ویرایش‌ها و اطلاعات کاربری مرتبط با یک نشانی آی‌پی جستجو می‌کند.
 1916+کاربرها و ویرایش‌های مرتبط با یک نشانی آی‌پی را می‌توان با توجه به اطلاعات سرآیند XFF (با افزودن «‏‎/xff» به انتهای نشانی آی‌پی) پیدا کرد.
 1917+هر دو پروتکل IPv4 (معادل CIDR 16-32) و IPv6 (معادل CIDR 96-128) توسط این ابزار پشتیبانی می‌شوند.
 1918+بنا به دلایل عملکردی، بیش از ۵۰۰۰ ویرایش بازگردانده نمی‌شود.
 1919+از این ابزار طبق سیاست‌ها استفاده کنید.',
16601920 'checkuser-desc' => 'به کاربرها اختیارات لازم را برای بررسی نشانی اینترنتی کاربرها و اطلاعات دیگر می‌دهد',
16611921 'checkuser-logcase' => 'جستجوی سیاهه به کوچک یا بزرگ بودن حروف حساس است.',
16621922 'checkuser' => 'بازرسی کاربر',
 1923+ 'checkuser-contribs' => 'بازرسی نشانی‌های آی‌پی کاربر',
16631924 'group-checkuser' => 'بازرسان کاربر',
16641925 'group-checkuser-member' => 'بازرس کاربر',
1665 - 'right-checkuser' => 'بررسی نشانی اینترنتی و دیگر اطلاعات کاربرها',
 1926+ 'right-checkuser' => 'بازرسی نشانی اینترنتی و دیگر اطلاعات کاربر',
16661927 'right-checkuser-log' => 'مشاهدهٔ سیاههٔ بازرسی کاربر',
16671928 'grouppage-checkuser' => '{{ns:project}}:بازرسی کاربر',
1668 - 'checkuser-reason' => 'دلیل',
 1929+ 'checkuser-reason' => 'دلیل:',
16691930 'checkuser-showlog' => 'نمایش سیاهه',
1670 - 'checkuser-log' => 'سیاهه بازرسی کاربر',
 1931+ 'checkuser-log' => 'سیاههٔ بازرسی کاربر',
16711932 'checkuser-query' => 'جستجوی تغییرات اخیر',
1672 - 'checkuser-target' => 'کاربر یا نشانی اینترنتی',
 1933+ 'checkuser-target' => 'نشانی آی‌پی یا نام کاربری:',
16731934 'checkuser-users' => 'فهرست کردن کاربرها',
16741935 'checkuser-edits' => 'نمایش ویرایش‌های مربوط به این نشانی اینترنتی',
1675 - 'checkuser-ips' => 'فهرست کردن نشانی‌های اینترنتی',
1676 - 'checkuser-account' => 'دریافت ویرایش‌های حساب',
 1936+ 'checkuser-ips' => 'فهرست کردن نشانی‌های آی‌پی',
 1937+ 'checkuser-account' => 'دریافت ویرایش‌های حساب کاربری',
16771938 'checkuser-search' => 'جستجو',
16781939 'checkuser-period' => 'بازه زمانی:',
16791940 'checkuser-week-1' => 'هفتهٔ گذشته',
16801941 'checkuser-week-2' => 'دو هفتهٔ گذشته',
16811942 'checkuser-month' => '۳۰ روز گذشته',
16821943 'checkuser-all' => 'همه',
 1944+ 'checkuser-cidr-label' => 'پیدا کردن بازه‌های متداول و تاثیرپذیرفته نشانی‌های آی‌پی برای یک فهرست از نشانی‌های آی‌پی',
 1945+ 'checkuser-cidr-res' => 'CIDR مشترک',
16831946 'checkuser-empty' => 'سیاهه خالی است.',
16841947 'checkuser-nomatch' => 'موردی که مطابقت داشته باشد پیدا نشد.',
16851948 'checkuser-nomatch-edits' => 'مورد مطابق پیدا نشد.
@@ -1700,8 +1963,10 @@
17011964 'checkuser-block-failure' => "'''هیچ کاربری بسته نشد.'''",
17021965 'checkuser-block-limit' => 'تعداد بیش از اندازه‌ای از کاربران انتخاب شده‌اند.',
17031966 'checkuser-block-noreason' => 'شما باید دلیلی برای قطع دسترسی‌ها ارائه کنید.',
1704 - 'checkuser-accounts' => '$1 {{PLURAL:$1|حساب|حساب}} جدید',
1705 - 'checkuser-too-many' => 'تعداد نتایج بسیار زیاد است. لطفاً CIDR را باریک‌تر کنید. در زیر نشانی‌های اینترنتی استفاده شده را می‌بینید (حداثر ۵۰۰۰ مورد، به ترتیب نشانی):',
 1967+ 'checkuser-noreason' => 'شما باید دلیلی برای این درخواست وارد کنید.',
 1968+ 'checkuser-accounts' => '$1 {{PLURAL:$1|حساب|حساب}} کاربری جدید',
 1969+ 'checkuser-too-many' => 'تعداد نتایج بسیار زیاد است (طبق تخمین‌ها)، لطفاً CIDR را باریک‌تر کنید.
 1970+در زیر نشانی‌های اینترنتی استفاده شده را می‌بینید (حداثر ۵۰۰۰ مورد، به ترتیب نشانی):',
17061971 'checkuser-user-nonexistent' => 'کاربر مورد نظر وجود ندارد.',
17071972 'checkuser-search-form' => 'پیدا کردن مواردی در سیاهه‌ها که $1 همان $2 است',
17081973 'checkuser-search-submit' => 'جستجو',
@@ -1718,7 +1983,7 @@
17191984 'checkuser-log-ipusers-xff' => '$1 کاربرهای مربوط به XFF $2 را گرفت',
17201985 'checkuser-log-useredits' => '$1 ویرایش‌های $2 را گرفت',
17211986 'checkuser-autocreate-action' => 'به طور خودکار ساخته شد',
1722 - 'checkuser-email-action' => 'نامه الکترونیکی به کاربر «$1» فرستاد',
 1987+ 'checkuser-email-action' => 'نامهٔ الکترونیکی به کاربر «$1» فرستاد',
17231988 'checkuser-reset-action' => 'گذرواژه کاربر «$1» را از نو تنظیم کرد',
17241989 );
17251990
@@ -1729,6 +1994,9 @@
17301995 * @author Jaakonam
17311996 * @author Jack Phoenix
17321997 * @author Nike
 1998+ * @author Str4nd
 1999+ * @author Varusmies
 2000+ * @author ZeiP
17332001 */
17342002 $messages['fi'] = array(
17352003 'checkuser-summary' => 'Tämän työkalun avulla voidaan tutkia tuoreet muutokset ja paljastaa käyttäjien IP-osoitteet tai noutaa IP-osoitteiden muokkaukset ja käyttäjätiedot.
@@ -1736,6 +2004,7 @@
17372005 'checkuser-desc' => 'Antaa oikeutetuille käyttäjille mahdollisuuden tarkistaa käyttäjän IP-osoitteet ja muita tietoja.',
17382006 'checkuser-logcase' => 'Haku lokista on kirjainkokoriippuvainen.',
17392007 'checkuser' => 'Osoitepaljastin',
 2008+ 'checkuser-contribs' => 'tarkista käyttäjän IP-osoitteet',
17402009 'group-checkuser' => 'osoitepaljastimen käyttäjät',
17412010 'group-checkuser-member' => 'osoitepaljastimen käyttäjä',
17422011 'right-checkuser' => 'Tarkastaa käyttäjän käyttämät IP-osoitteet sekä muut tiedot',
@@ -1745,7 +2014,7 @@
17462015 'checkuser-showlog' => 'Näytä loki',
17472016 'checkuser-log' => 'Osoitepaljastinloki',
17482017 'checkuser-query' => 'Hae tuoreet muutokset',
1749 - 'checkuser-target' => 'Käyttäjä tai IP-osoite',
 2018+ 'checkuser-target' => 'IP-osoite tai käyttäjätunnus',
17502019 'checkuser-users' => 'Hae käyttäjät',
17512020 'checkuser-edits' => 'Hae IP-osoitteen muokkaukset',
17522021 'checkuser-ips' => 'Hae IP-osoitteet',
@@ -1756,6 +2025,8 @@
17572026 'checkuser-week-2' => 'viimeiset kaksi viikkoa',
17582027 'checkuser-month' => 'viimeiset 30 päivää',
17592028 'checkuser-all' => 'kaikki',
 2029+ 'checkuser-cidr-label' => 'Etsi yleinen osoiteavaruus annetulle IP-luettelolle',
 2030+ 'checkuser-cidr-res' => 'Yleinen CIDR',
17602031 'checkuser-empty' => 'Ei lokitapahtumia.',
17612032 'checkuser-nomatch' => 'Hakuehtoihin sopivia tuloksia ei löytynyt.',
17622033 'checkuser-nomatch-edits' => 'Osumia ei löytynyt.
@@ -1778,8 +2049,10 @@
17792050 'checkuser-block-failure' => "'''Yhtään käyttäjää ei estetty.'''",
17802051 'checkuser-block-limit' => 'Liian monta käyttäjää valittu.',
17812052 'checkuser-block-noreason' => 'Estoille on annettava syy.',
 2053+ 'checkuser-noreason' => 'Sinun tulee antaa syy tälle kyselylle.',
17822054 'checkuser-accounts' => '$1 {{PLURAL:$1|uusi tunnus|uutta tunnusta}}',
1783 - 'checkuser-too-many' => 'Liian monta tulosta, rajoita IP-osoitetta:',
 2055+ 'checkuser-too-many' => 'Liian monta tulosta (kyselyarvion mukaan), pienennä CIDR-aluetta.
 2056+Käytetyt IP:t (enintään 5000, järjestetty osoitteen mukaan):',
17842057 'checkuser-user-nonexistent' => 'Määritettyä käyttäjää ei ole olemassa.',
17852058 'checkuser-search-form' => 'Etsi lokimerkintöjä, joissa $1 on $2',
17862059 'checkuser-search-submit' => 'Hae',
@@ -1815,6 +2088,7 @@
18162089 * @author ChrisPtDe
18172090 * @author Grondin
18182091 * @author IAlex
 2092+ * @author Peter17
18192093 * @author PieRRoMaN
18202094 * @author Sherbrooke
18212095 * @author Verdy p
@@ -1838,7 +2112,7 @@
18392113 'checkuser-showlog' => 'Afficher le journal',
18402114 'checkuser-log' => 'Journal des vérifications d’utilisateurs',
18412115 'checkuser-query' => 'Recherche des modifications récentes',
1842 - 'checkuser-target' => 'Nom d’utilisateur ou adresse IP',
 2116+ 'checkuser-target' => 'Nom d’utilisateur ou adresse IP :',
18432117 'checkuser-users' => 'Obtenir les utilisateurs',
18442118 'checkuser-edits' => 'Obtenir les modifications par une adresse IP',
18452119 'checkuser-ips' => 'Obtenir les adresses IP',
@@ -1872,9 +2146,10 @@
18732147 'checkuser-block-failure' => "'''Aucun utilisateur bloqué.'''",
18742148 'checkuser-block-limit' => 'Trop d’utilisateurs sélectionnés.',
18752149 'checkuser-block-noreason' => 'Vous devez donner un motif justifiant les blocages.',
 2150+ 'checkuser-noreason' => 'Vous devez donner une raison pour cette requête.',
18762151 'checkuser-accounts' => '$1 nouveau{{PLURAL:$1||x}} compte{{PLURAL:$1||s}}',
1877 - 'checkuser-too-many' => 'Trop de résultats, veuillez affiner l’étendue CIDR.
1878 -Voici un extrait des IP utilisées ({{formatnum:5000}} maximum, triées par adresse) :',
 2152+ 'checkuser-too-many' => "Trop de résultats (selon l'estimation de la requête), veuillez affiner l’étendue CIDR.
 2153+Voici un extrait des IP utilisées ({{formatnum:5000}} maximum, triées par adresse) :",
18792154 'checkuser-user-nonexistent' => 'L’utilisateur indiqué n’existe pas.',
18802155 'checkuser-search-form' => 'Chercher les entrées de journal où $1 est $2.',
18812156 'checkuser-search-submit' => 'Rechercher',
@@ -1931,37 +2206,68 @@
19322207 'checkuser-desc' => 'Balye la possibilitât a les gens qu’ont la pèrmission que vat avouéc de controlar les adrèces IP des utilisators et pués d’ôtres enformacions los regardent.',
19332208 'checkuser-logcase' => 'La rechèrche dens lo jornal est sensibla a la câssa.',
19342209 'checkuser' => 'Controlor d’utilisator',
 2210+ 'checkuser-contribs' => 'controlar les adrèces IP ux utilisators',
19352211 'group-checkuser' => 'Controlors d’utilisator',
19362212 'group-checkuser-member' => 'Controlor d’utilisator',
 2213+ 'right-checkuser' => 'Controlar les adrèces IP ux utilisators et ôtres enformacions',
 2214+ 'right-checkuser-log' => 'Vêre lo jornal des contrôlos d’utilisators',
19372215 'grouppage-checkuser' => '{{ns:project}}:Controlors d’utilisator',
1938 - 'checkuser-reason' => 'Rêson',
 2216+ 'checkuser-reason' => 'Rêson :',
19392217 'checkuser-showlog' => 'Afichiér lo jornal',
1940 - 'checkuser-log' => 'Jornal de controlor d’utilisator',
 2218+ 'checkuser-log' => 'Jornal des contrôlos d’utilisators',
19412219 'checkuser-query' => 'Rechèrche per los dèrriérs changements',
1942 - 'checkuser-target' => 'Nom d’utilisator ou adrèce IP',
1943 - 'checkuser-users' => 'Obtegnir los utilisators',
1944 - 'checkuser-edits' => 'Obtegnir les modificacions de l’adrèce IP',
1945 - 'checkuser-ips' => 'Obtegnir les adrèces IP',
 2220+ 'checkuser-target' => 'Adrèce IP ou ben nom d’utilisator :',
 2221+ 'checkuser-users' => 'Avêr los utilisators',
 2222+ 'checkuser-edits' => 'Avêr los changements per una adrèce IP',
 2223+ 'checkuser-ips' => 'Avêr les adrèces IP',
 2224+ 'checkuser-account' => 'Avêr los changements du compto',
19462225 'checkuser-search' => 'Rechèrche',
 2226+ 'checkuser-period' => 'Temps :',
 2227+ 'checkuser-week-1' => 'la semana passâ',
 2228+ 'checkuser-week-2' => 'les doves semanes passâs',
 2229+ 'checkuser-month' => 'los 30 jorns passâs',
 2230+ 'checkuser-all' => 'tot',
 2231+ 'checkuser-cidr-label' => 'Chèrchiér una plage comena et les adrèces afèctâs por una lista d’adrèces IP',
 2232+ 'checkuser-cidr-res' => 'Plage CIDR comena :',
19472233 'checkuser-empty' => 'Lo jornal contint gins d’articllo.',
19482234 'checkuser-nomatch' => 'Rechèrches que balyont ren.',
19492235 'checkuser-check' => 'Rechèrche',
19502236 'checkuser-log-fail' => 'Empossiblo d’apondre l’entrâ du jornal.',
19512237 'checkuser-nolog' => 'Niona entrâ dens lo jornal.',
19522238 'checkuser-blocked' => 'Blocâ',
1953 - 'checkuser-too-many' => 'Trop de rèsultats. Volyéd limitar la rechèrche sur les adrèces IP :',
 2239+ 'checkuser-gblocked' => 'Blocâ dens l’ensemblo',
 2240+ 'checkuser-locked' => 'Vèrrolyê',
 2241+ 'checkuser-wasblocked' => 'Blocâ dês devant',
 2242+ 'checkuser-localonly' => 'Pas unifiâ',
 2243+ 'checkuser-massblock' => 'Blocar los utilisators chouèsis',
 2244+ 'checkuser-blocktag' => 'Remplaciér les pâges utilisator per :',
 2245+ 'checkuser-blocktag-talk' => 'Remplaciér les pâges de discussion per :',
 2246+ 'checkuser-massblock-commit' => 'Blocar los utilisators chouèsis',
 2247+ 'checkuser-block-success' => "'''{{PLURAL:$2|L’utilisator $1 est ora blocâ|Cetos $2 utilisators sont ora blocâs : $1}}.'''",
 2248+ 'checkuser-block-failure' => "'''Gins d’utilisator blocâ.'''",
 2249+ 'checkuser-block-limit' => 'Trop d’utilisators chouèsis.',
 2250+ 'checkuser-block-noreason' => 'Vos dête balyér una rêson por los blocâjos.',
 2251+ 'checkuser-noreason' => 'Vos dête balyér una rêson por cela requéta.',
 2252+ 'checkuser-accounts' => '$1 compto{{PLURAL:$1||s}} novél{{PLURAL:$1||s}}',
 2253+ 'checkuser-too-many' => 'Trop de rèsultats (d’aprés l’èstimacion de la requéta), volyéd èpurar l’ètendua CIDR.
 2254+Vê-que un èxtrèt a les adrèces IP utilisâs ({{formatnum:5000}} u més, triyês per adrèce) :',
19542255 'checkuser-user-nonexistent' => 'L’utilisator endicâ ègziste pas.',
19552256 'checkuser-search-form' => 'Chèrchiér lo jornal de les entrâs yô que $1 est $2.',
19562257 'checkuser-search-submit' => 'Rechèrchiér',
19572258 'checkuser-search-initiator' => 'l’iniciator',
19582259 'checkuser-search-target' => 'la ciba',
 2260+ 'checkuser-ipeditcount' => '~$1 per tôs los utilisators',
19592261 'checkuser-log-subpage' => 'Jornal',
19602262 'checkuser-log-return' => 'Tornar u formulèro principâl du contrôlo d’utilisator',
19612263 'checkuser-log-userips' => '$1 at obtegnu des IP por $2',
1962 - 'checkuser-log-ipedits' => '$1 at obtegnu des modificacions por $2',
 2264+ 'checkuser-log-ipedits' => '$1 at avu des changements per l’adrèce IP $2',
19632265 'checkuser-log-ipusers' => '$1 at obtegnu des utilisators por $2',
1964 - 'checkuser-log-ipedits-xff' => '$1 at obtegnu des modificacions por XFF $2',
 2266+ 'checkuser-log-ipedits-xff' => '$1 at avu des changements per l’adrèce XFF $2',
19652267 'checkuser-log-ipusers-xff' => '$1 at obtegnu des utilisators por XFF $2',
 2268+ 'checkuser-log-useredits' => '$1 at avu des changements per $2',
 2269+ 'checkuser-autocreate-action' => 'at étâ fêt ôtomaticament',
 2270+ 'checkuser-email-action' => 'at mandâ un mèssâjo a l’utilisator « $1 »',
 2271+ 'checkuser-reset-action' => 'tôrne inicialisar lo mot de pâssa por l’utilisator « $1 »',
19662272 );
19672273
19682274 /** Western Frisian (Frysk)
@@ -1974,6 +2280,7 @@
19752281
19762282 /** Irish (Gaeilge)
19772283 * @author Alison
 2284+ * @author Tameamseo
19782285 */
19792286 $messages['ga'] = array(
19802287 'checkuser-summary' => 'Scanann an uirlis seo na athruithe is déanaí chun na seolaidh IP úsáideoira a fháil ná taispeáin na sonraí eagarthóireachta/úsáideoira don seoladh IP.
@@ -1992,6 +2299,7 @@
19932300 'checkuser-users' => 'Faigh úsáideoira',
19942301 'checkuser-edits' => 'Faigh athruithe don seoladh IP seo',
19952302 'checkuser-ips' => 'Faigh Seolaidh IP',
 2303+ 'checkuser-account' => 'Faigh athruithe don chuntas seo',
19962304 'checkuser-search' => 'Cuardaigh',
19972305 'checkuser-week-1' => 'an tseachtain seo caite',
19982306 'checkuser-week-2' => 'dhá sheachtain seo caite',
@@ -2005,6 +2313,7 @@
20062314 'checkuser-blocked' => 'Cosanta',
20072315 'checkuser-gblocked' => 'Cosanta domhandach',
20082316 'checkuser-locked' => 'Glasáilte',
 2317+ 'checkuser-massblock' => 'Cuir cosc ar na húsáideoirí roghnaithe',
20092318 'checkuser-massblock-commit' => 'Cur cosc ar na n-úsáideoirí roghnaithe',
20102319 'checkuser-block-success' => "'''Tá {{PLURAL:$2|an úsáideoir|na n-úsáideoirí}} $1 coiscthe anois.'''",
20112320 'checkuser-block-failure' => "'''Níl aon úsáideoirí coiscthe.'''",
@@ -2045,11 +2354,11 @@
20462355 'right-checkuser' => 'Comprobar os enderezos IP dos usuarios e outra información',
20472356 'right-checkuser-log' => 'Ver o rexistro de comprobadores de usuarios',
20482357 'grouppage-checkuser' => '{{ns:project}}:Verificador de usuarios',
2049 - 'checkuser-reason' => 'Razón:',
 2358+ 'checkuser-reason' => 'Motivo:',
20502359 'checkuser-showlog' => 'Amosar o rexistro',
20512360 'checkuser-log' => 'Rexistro de comprobacións de usuarios',
20522361 'checkuser-query' => 'Consulta de cambios recentes',
2053 - 'checkuser-target' => 'Usuario ou enderezo IP',
 2362+ 'checkuser-target' => 'Enderezo IP ou nome de usuario:',
20542363 'checkuser-users' => 'Obter os usuarios',
20552364 'checkuser-edits' => 'Obter as edicións do enderezo IP',
20562365 'checkuser-ips' => 'Obter os enderezos IP',
@@ -2084,8 +2393,10 @@
20852394 'checkuser-block-failure' => "'''Non hai ningún usuario bloqueado.'''",
20862395 'checkuser-block-limit' => 'Hai seleccionados demasiados usuarios.',
20872396 'checkuser-block-noreason' => 'Debe dar unha razón para os bloqueos.',
 2397+ 'checkuser-noreason' => 'Debe dar unha razón para esta pescuda.',
20882398 'checkuser-accounts' => '{{PLURAL:$1|Unha nova conta|$1 novas contas}}',
2089 - 'checkuser-too-many' => 'Hai demasiados resultados, restrinxa o enderezo IP:',
 2399+ 'checkuser-too-many' => 'Hai demasiados resultados (segundo a estimación da pesquisa), restrinxa o CIDR.
 2400+Aquí están os enderezos IP usados (máximo 5.000, ordenados por enderezo):',
20902401 'checkuser-user-nonexistent' => 'Non existe o usuario especificado.',
20912402 'checkuser-search-form' => 'Atopar as entradas do rexistro nas que $1 é $2',
20922403 'checkuser-search-submit' => 'Procurar',
@@ -2122,6 +2433,7 @@
21232434 'checkuser-search' => 'Ζητεῖν',
21242435 'checkuser-period' => 'Διάρκεια:',
21252436 'checkuser-all' => 'ἅπασαι',
 2437+ 'checkuser-check' => 'Ἐλέγχειν',
21262438 'checkuser-wasblocked' => 'Προηγουμένως πεφραγμένος',
21272439 'checkuser-search-submit' => 'Ζητεῖν',
21282440 'checkuser-search-initiator' => 'ἐγκαινιαστής',
@@ -2148,7 +2460,7 @@
21492461 'checkuser-showlog' => 'Logbuech aazeige',
21502462 'checkuser-log' => 'Checkuser-Logbuech',
21512463 'checkuser-query' => 'Letchte Änderige abfroge',
2152 - 'checkuser-target' => 'Benutzer oder IP-Adräss',
 2464+ 'checkuser-target' => 'IP-Adräss oder Benutzername:',
21532465 'checkuser-users' => 'Hol Benutzer',
21542466 'checkuser-edits' => 'Hol Bearbeitige vun ere IP-Adräss',
21552467 'checkuser-ips' => 'Hol IP-Adrässe',
@@ -2182,8 +2494,9 @@
21832495 'checkuser-block-failure' => "'''S sin kei Benutzer gsperrt wore.'''",
21842496 'checkuser-block-limit' => 'S sin zvyl Benutzer usgwählt wore.',
21852497 'checkuser-block-noreason' => 'Du muesch e Grund fir d Sperri aagee.',
 2498+ 'checkuser-noreason' => 'Du muesch e Grund fir die Abfrog aagee.',
21862499 'checkuser-accounts' => '{{PLURAL:$1|1 nej Benutzerkonto|$1 neiji Benutzerkonte}}',
2187 - 'checkuser-too-many' => 'D Ergebnislischt isch z lang, bitte grenz dr IP-Beryych wyter yy. Do sin di benutzten IP-Adrässe (maximal 5000, sortiert noch Adrässe):',
 2500+ 'checkuser-too-many' => 'D Ergebnislischt isch z lang (noch ere Abfrogs-Schätzig), bitte gränz dr IP-Beryych wyter yy. Do sin di benutzten IP-Adrässe (maximal 5000, sortiert noch Adrässe):',
21882501 'checkuser-user-nonexistent' => 'S Benutzerkonto, wu Du aagee hesch, isch nit vorhande.',
21892502 'checkuser-search-form' => 'Suech Logbuechyyträg, wu $1 byyn ene $2 isch.',
21902503 'checkuser-search-submit' => 'Suech',
@@ -2216,7 +2529,7 @@
22172530 * @author MacTire02
22182531 */
22192532 $messages['gv'] = array(
2220 - 'checkuser-reason' => 'Fa',
 2533+ 'checkuser-reason' => 'Fa:',
22212534 'checkuser-search' => 'Ronsaghey',
22222535 'checkuser-search-submit' => 'Ronsaghey',
22232536 );
@@ -2242,6 +2555,8 @@
22432556 /** Hebrew (עברית)
22442557 * @author Amire80
22452558 * @author Rotem Liss
 2559+ * @author Rotemliss
 2560+ * @author YaronSh
22462561 */
22472562 $messages['he'] = array(
22482563 'checkuser-summary' => 'כלי זה סורק את השינויים האחרונים במטרה למצוא את כתובות ה־IP שהשתמש בהן משתמש מסוים או כדי להציג את כל המידע על המשתמשים שהשתמשו בכתובת IP ועל העריכות שבוצעו ממנה.
@@ -2260,7 +2575,7 @@
22612576 'checkuser-showlog' => 'הצגת יומן',
22622577 'checkuser-log' => 'יומן בדיקות',
22632578 'checkuser-query' => 'בדיקת שינויים אחרונים',
2264 - 'checkuser-target' => 'שם משתמש או כתובת IP',
 2579+ 'checkuser-target' => 'שם משתמש או כתובת IP:',
22652580 'checkuser-users' => 'הצגת משתמשים',
22662581 'checkuser-edits' => 'הצגת עריכות מכתובת IP מסוימת',
22672582 'checkuser-ips' => 'הצגת כתובות IP',
@@ -2295,8 +2610,10 @@
22962611 'checkuser-block-failure' => "'''לא נחסמו משתמשים.'''",
22972612 'checkuser-block-limit' => 'נבחרו יותר מדי משתמשים.',
22982613 'checkuser-block-noreason' => 'עליכם לתת סיבה לחסימות.',
 2614+ 'checkuser-noreason' => 'עליכם לכתוב סיבה לבדיקה זו.',
22992615 'checkuser-accounts' => '{{PLURAL:$1|חשבון חדש אחד|$1 חשבונות חדשים}}',
2300 - 'checkuser-too-many' => 'נמצאו תוצאות רבות מדי, אנא צמצמו את טווח כתובות ה־IP. להלן כתובת ה־IP שנעשה בהן שימוש (מוצגות 5,000 לכל היותר, וממוינות):',
 2616+ 'checkuser-too-many' => 'נמצאו תוצאות רבות מדי (לפי הערכה של השאילתה), אנא צמצמו את טווח כתובות ה־IP.
 2617+להלן כתובות ה־IP שנעשה בהן שימוש (מוצגות 5,000 לכל היותר, וממוינות לפי כתובת):',
23012618 'checkuser-user-nonexistent' => 'המשתמש לא נמצא.',
23022619 'checkuser-search-form' => 'מציאת ערכים ביומן שבהם ה$1 הוא $2',
23032620 'checkuser-search-submit' => 'חיפוש',
@@ -2376,14 +2693,15 @@
23772694
23782695 /** Croatian (Hrvatski)
23792696 * @author Dalibor Bosits
 2697+ * @author Ex13
23802698 * @author SpeedyGonsales
2381 - * @author Suradnik13
23822699 */
23832700 $messages['hr'] = array(
23842701 'checkuser-summary' => 'Ovaj alat pretražuje nedavne promjene i pronalazi IP adrese suradnika ili prikazuje uređivanja/ime suradnika ako je zadana IP adresa. Suradnici i uređivanja mogu biti dobiveni po XFF zaglavljima dodavanjem "/xff" na kraj IP adrese. Podržane su IPv4 (CIDR 16-32) i IPv6 (CIDR 96-128) adrese. Rezultat ima maksimalno 5.000 zapisa iz tehničkih razloga. Rabite ovaj alat u skladu s pravilima.',
23852702 'checkuser-desc' => 'Daje suradniku pravo za provjeriti IP adrese suradnika i druge informacije',
23862703 'checkuser-logcase' => 'Pretraživanje evidencije razlikuje velika i mala slova',
23872704 'checkuser' => 'Provjeri suradnika',
 2705+ 'checkuser-contribs' => 'provjeri suradničke IP adrese',
23882706 'group-checkuser' => 'Provjeritelji',
23892707 'group-checkuser-member' => 'Provjeritelj',
23902708 'right-checkuser' => 'Provjeravanje IP adrese suradnika i drugih informacija',
@@ -2428,6 +2746,7 @@
24292747 'checkuser-block-failure' => "'''Nema blokiranih suradnika.'''",
24302748 'checkuser-block-limit' => 'Odabrano je previše suradnika.',
24312749 'checkuser-block-noreason' => 'Morate upisati razlog za blokiranje.',
 2750+ 'checkuser-noreason' => 'Morate navesti razlog za ovaj upit.',
24322751 'checkuser-accounts' => '$1 {{PLURAL:$1|novi račun|novih računa}}',
24332752 'checkuser-too-many' => 'Previše rezultata, molimo suzite opseg (CIDR). Slijede rabljene IP adrese (najviše njih 5000, poredano abecedno):',
24342753 'checkuser-user-nonexistent' => 'Traženi suradnik (suradničko ime) ne postoji.',
@@ -2469,7 +2788,7 @@
24702789 'checkuser-showlog' => 'Protokol pokazać',
24712790 'checkuser-log' => 'Protokol wužiwarskeje kontrole',
24722791 'checkuser-query' => 'Poslednje změny wotprašeć',
2473 - 'checkuser-target' => 'Wužiwar abo IP-adresa',
 2792+ 'checkuser-target' => 'IP-adresa abo wužiwarske mjeno:',
24742793 'checkuser-users' => 'Wužiwarjow pokazać',
24752794 'checkuser-edits' => 'Změny z IP-adresy přinjesć',
24762795 'checkuser-ips' => 'IP-adresy pokazać',
@@ -2504,8 +2823,10 @@
25052824 'checkuser-block-failure' => "'''Žane wužiwarjo zablokowani.'''",
25062825 'checkuser-block-limit' => 'Přewjele wužiwarjow wubrane.',
25072826 'checkuser-block-noreason' => 'Dyrbiš přičinu za zablokowanja podać.',
 2827+ 'checkuser-noreason' => 'Dyrbiš přičinu za tute wotprašowanje podać.',
25082828 'checkuser-accounts' => '$1 {{PLURAL:$1|nowe konto|nowej konće|nowe konta|nowych kontow}}',
2509 - 'checkuser-too-many' => 'Přewjele wuslědkow, prošu zamjezuj IP-adresu:',
 2829+ 'checkuser-too-many' => 'Přewjele wuslědkow (po taksowanju naprašowanja), prošu zamjezuj CIDR.
 2830+Tu su wužiwane IP (maks. 5000, po adresy sortěrowane):',
25102831 'checkuser-user-nonexistent' => 'Podaty wužiwar njeeksistuje.',
25112832 'checkuser-search-form' => 'Protokolowe zapiski namakać, hdźež $1 je $2',
25122833 'checkuser-search-submit' => 'Pytać',
@@ -2529,6 +2850,7 @@
25302851 /** Hungarian (Magyar)
25312852 * @author Dani
25322853 * @author Dorgan
 2854+ * @author Glanthor Reviol
25332855 * @author Grin
25342856 * @author KossuthRad
25352857 * @author Terik
@@ -2541,6 +2863,7 @@
25422864 'checkuser-desc' => 'Lehetővé teszi olyan felhasználói jogok kiosztását, mely segítségével megtekinthetőek a felhasználók IP-címei és más adatok',
25432865 'checkuser-logcase' => 'A kereső kis- és nagybetűérzékeny.',
25442866 'checkuser' => 'IP-ellenőr',
 2867+ 'checkuser-contribs' => 'az IP-ellenőr IP-címei',
25452868 'group-checkuser' => 'IP-ellenőrök',
25462869 'group-checkuser-member' => 'IP-ellenőr',
25472870 'right-checkuser' => 'a felhasználók IP-címének és más adatainak ellenőrzése',
@@ -2550,7 +2873,7 @@
25512874 'checkuser-showlog' => 'Napló megjelenítése',
25522875 'checkuser-log' => 'IP-ellenőr-napló',
25532876 'checkuser-query' => 'Kétséges aktuális változások',
2554 - 'checkuser-target' => 'Felhasználó vagy IP-cím',
 2877+ 'checkuser-target' => 'IP-cím vagy felhasználónév:',
25552878 'checkuser-users' => 'Felhasználók keresése',
25562879 'checkuser-edits' => 'Szerkesztések keresése IP-cím alapján',
25572880 'checkuser-ips' => 'IP-címek keresése',
@@ -2581,12 +2904,14 @@
25822905 'checkuser-blocktag' => 'Szerkesztői lapok cseréje erre:',
25832906 'checkuser-blocktag-talk' => 'Vitalapok cseréje erre:',
25842907 'checkuser-massblock-commit' => 'Kiválasztott szerkesztők blokkolása',
2585 - 'checkuser-block-success' => "'''A következő szerkesztők blokkolva lettek: $1.'''",
 2908+ 'checkuser-block-success' => "'''A következő {{PLURAL:$2|szerkesztő|szerkesztők}} blokkolva {{PLURAL:$2|lett|lettek}}: $1.'''",
25862909 'checkuser-block-failure' => "'''Nem lettek szerkesztők blokkolva.'''",
25872910 'checkuser-block-limit' => 'Túl sok szerkesztőt választottál ki.',
25882911 'checkuser-block-noreason' => 'Meg kell adnod a blokkolások okát.',
 2912+ 'checkuser-noreason' => 'Meg kell adnod a lekérdezés okát.',
25892913 'checkuser-accounts' => '{{PLURAL:$1|egy|$1}} új felhasználói fiók',
2590 - 'checkuser-too-many' => 'Túl sok eredmény, kérlek szűkítsd le a CIDR-t. Itt vannak a használt IP-címek (maximum 5000, cím alapján rendezve):',
 2914+ 'checkuser-too-many' => 'Túl sok találat (a lekérdezési becslés szerint), kérlek szűkítsd le a CIDR-t.
 2915+Itt vannak a használt IP-címek (maximum 5000, cím alapján rendezve):',
25912916 'checkuser-user-nonexistent' => 'A megadott szerkesztő nem létezik.',
25922917 'checkuser-search-form' => 'Naplóbejegyzések keresése, ahol $1 $2',
25932918 'checkuser-search-submit' => 'Keresés',
@@ -2601,6 +2926,7 @@
26022927 'checkuser-log-ipusers' => '$1 lekérte a(z) $2 IP-címhez tarzozó szerkesztőket',
26032928 'checkuser-log-ipedits-xff' => '$1 lekérte XFF $2 szerkesztéseit',
26042929 'checkuser-log-ipusers-xff' => '$1 lekérte XFF $2 szerkesztőit',
 2930+ 'checkuser-log-useredits' => '$1 lekérdezte $2 szerkesztéseit',
26052931 'checkuser-autocreate-action' => 'automatikusan létrehozva',
26062932 'checkuser-email-action' => 'e-mailt küldött „$1” szerkesztőnek',
26072933 'checkuser-reset-action' => 'lecserélte „$1” jelszavát',
@@ -2636,7 +2962,7 @@
26372963 'checkuser-showlog' => 'Monstrar registro',
26382964 'checkuser-log' => 'Registro de verification de usatores',
26392965 'checkuser-query' => 'Consultar le modificationes recente',
2640 - 'checkuser-target' => 'Usator o IP',
 2966+ 'checkuser-target' => 'Adresse IP o nomine de usator:',
26412967 'checkuser-users' => 'Cercar usatores',
26422968 'checkuser-edits' => 'Cercar modificationes desde IP',
26432969 'checkuser-ips' => 'Cercar IPs',
@@ -2671,9 +2997,10 @@
26722998 'checkuser-block-failure' => "'''Nulle usator blocate.'''",
26732999 'checkuser-block-limit' => 'Troppo de usatores seligite.',
26743000 'checkuser-block-noreason' => 'Tu debe indicar un motivo pro le blocadas.',
 3001+ 'checkuser-noreason' => 'Tu debe dar un motivo pro iste consulta.',
26753002 'checkuser-accounts' => '$1 nove {{PLURAL:$1|conto|contos}}',
2676 - 'checkuser-too-many' => 'Troppo de resultatos. Per favor restringe le CIDR.
2677 -Ecce le IPs usate (5000 max, ordinate per adresse):',
 3003+ 'checkuser-too-many' => 'Troppo de resultatos (secundo un estimation del consulta). Per favor restringe le CIDR.
 3004+Ecce le IPs usate (max. 5000, ordinate per adresse):',
26783005 'checkuser-user-nonexistent' => 'Le usator specificate non existe.',
26793006 'checkuser-search-form' => 'Cercar entratas in le registro ubi le $1 es $2',
26803007 'checkuser-search-submit' => 'Cercar',
@@ -2695,23 +3022,27 @@
26963023 );
26973024
26983025 /** Indonesian (Bahasa Indonesia)
 3026+ * @author Bennylin
26993027 * @author Borgx
 3028+ * @author Irwangatot
27003029 * @author IvanLanin
27013030 * @author Rex
27023031 */
27033032 $messages['id'] = array(
2704 - 'checkuser-summary' => 'Peralatan ini memindai perubahan terbaru untuk mendapatkan IP yang digunakan oleh seorang pengguna atau menunjukkan data suntingan/pengguna untuk suatu IP.
2705 - Pengguna dan suntingan dapat diperoleh dari suatu IP XFF dengan menambahkan "/xff" pada suatu IP. IPv4 (CIDR 16-32) dan IPv6 (CIDR 96-128) dapat digunakan.
2706 - Karena alasan kinerja, maksimum hanya 5000 suntingan yang dapat diambil. Harap gunakan peralatan ini sesuai dengan kebijakan yang ada.',
 3033+ 'checkuser-summary' => 'Peralatan ini memindai perubahan terbaru untuk mengetahui IP seorang pengguna atau menampilkan data suntingan/pengguna untuk suatu IP.
 3034+Pengguna dan suntingan suatu IP dapat diketahui melalui kepala XFF dengan menambahkan "/xff" pada IP tersebut. Alat ini mendukung baik IPv4 (CIDR 16-32) maupun IPv6 (CIDR 96-128).
 3035+Karena alasan kinerja, maksimum hanya 5000 suntingan yang dapat diambil.
 3036+Harap gunakan peralatan ini sesuai dengan kebijakan yang ada.',
27073037 'checkuser-desc' => 'Memberikan fasilitas bagi pengguna yang memiliki hak akses untuk memeriksa alamat IP dan informasi lain dari pengguna',
27083038 'checkuser-logcase' => 'Log ini bersifat sensitif terhadap kapitalisasi.',
27093039 'checkuser' => 'Pemeriksaan pengguna',
 3040+ 'checkuser-contribs' => 'memeriksa IP pengguna',
27103041 'group-checkuser' => 'Pemeriksa',
2711 - 'group-checkuser-member' => 'Pemeriksa',
2712 - 'right-checkuser' => 'Periksa alamat IP pengguna dan informasi lainnya',
2713 - 'right-checkuser-log' => 'Tampilkan log pemeriksa',
 3042+ 'group-checkuser-member' => 'Pemeriksaan pengguna',
 3043+ 'right-checkuser' => 'Memeriksa alamat IP pengguna dan informasi lainnya',
 3044+ 'right-checkuser-log' => 'Melihat log pemeriksa',
27143045 'grouppage-checkuser' => '{{ns:project}}:Pemeriksa',
2715 - 'checkuser-reason' => 'Alasan',
 3046+ 'checkuser-reason' => 'Alasan:',
27163047 'checkuser-showlog' => 'Tampilkan log',
27173048 'checkuser-log' => 'Log pemeriksaan pengguna',
27183049 'checkuser-query' => 'Kueri perubahan terbaru',
@@ -2726,8 +3057,10 @@
27273058 'checkuser-week-2' => 'dua minggu terakhir',
27283059 'checkuser-month' => '30 hari terakhir',
27293060 'checkuser-all' => 'semua',
 3061+ 'checkuser-cidr-label' => 'Mencari jangkauan umum dan alamat yang dipengaruhi dari sebuah daftar IP',
 3062+ 'checkuser-cidr-res' => 'CIDR umum:',
27303063 'checkuser-empty' => 'Log kosong.',
2731 - 'checkuser-nomatch' => 'Data yang sesuai tidak ditemukan.',
 3064+ 'checkuser-nomatch' => 'Tidak ditemukan data yang cocok.',
27323065 'checkuser-nomatch-edits' => 'Tidak ditemukan hasil sesuai kriteria yang diberikan. Suntingan terakhir dilakukan pada $2, $1.',
27333066 'checkuser-check' => 'Periksa',
27343067 'checkuser-log-fail' => 'Entri log tidak dapat ditambahkan',
@@ -2736,17 +3069,20 @@
27373070 'checkuser-gblocked' => 'Diblokir secara global',
27383071 'checkuser-locked' => 'Terkunci',
27393072 'checkuser-wasblocked' => 'Telah diblokir sebelumnya',
 3073+ 'checkuser-localonly' => 'Tidak digabungkan',
27403074 'checkuser-massblock' => 'Blokir pengguna yang dipilih',
27413075 'checkuser-massblock-text' => 'Akun-akun yang dipilih akan diblokir selamanya, alamat-alamat IP terakhir yang digunakan otomatis diblokir dan tidak diperbolehkan membuat akun.
27423076 Alamat-alamat IP akan diblokir selama 1 minggu untuk pengguna anonim dan tidak diperbolehkan membuat akun.',
27433077 'checkuser-blocktag' => 'Ganti halaman pengguna dengan:',
 3078+ 'checkuser-blocktag-talk' => 'Ganti halaman pembicaraan dengan:',
27443079 'checkuser-massblock-commit' => 'Blokir pengguna yang dipilih',
27453080 'checkuser-block-success' => "'''{{PLURAL:$2|Pengguna|Pengguna}} $1 berhasil diblokir.'''",
27463081 'checkuser-block-failure' => "'''Tidak ada pengguna yang diblokir.'''",
27473082 'checkuser-block-limit' => 'Jumlah pengguna yang dipilih terlalu banyak.',
27483083 'checkuser-block-noreason' => 'Anda harus mengisi alasan pemblokiran.',
 3084+ 'checkuser-noreason' => 'Anda harus memberikan alasan untuk kueri ini.',
27493085 'checkuser-accounts' => '$1 {{PLURAL:$1|akun|akun-akun}} baru',
2750 - 'checkuser-too-many' => 'Terlalu banyak hasil pencarian, mohon persempit CIDR. Berikut adalah alamat-alamat IP yang digunakan (5000 maks, diurut berdasarkan alamat):',
 3086+ 'checkuser-too-many' => 'Terlalu banyak hasil pencarian (menurut perkiraan permintaan), mohon persempit CIDR. Berikut adalah alamat-alamat IP yang digunakan (5000 maks, diurut berdasarkan alamat):',
27513087 'checkuser-user-nonexistent' => 'Pengguna tidak eksis',
27523088 'checkuser-search-form' => 'Cari catatan log dimana $1 adalah $2',
27533089 'checkuser-search-submit' => 'Cari',
@@ -2763,7 +3099,7 @@
27643100 'checkuser-log-ipusers-xff' => '$1 melihat nama pengguna dari XFF $2',
27653101 'checkuser-log-useredits' => '$1 memiliki suntingan-suntingan untuk $2',
27663102 'checkuser-autocreate-action' => 'dibuat secara otomatis',
2767 - 'checkuser-email-action' => 'mengirimkan surat-e ke "$1"',
 3103+ 'checkuser-email-action' => 'mengirimkan surel ke "$1"',
27683104 'checkuser-reset-action' => 'Set ulang kata sandi pengguna "$1"',
27693105 );
27703106
@@ -2772,7 +3108,12 @@
27733109 */
27743110 $messages['io'] = array(
27753111 'checkuser-reason' => 'Motivo:',
 3112+ 'checkuser-target' => 'Uzanto od IP',
 3113+ 'checkuser-week-1' => 'lasta semano',
 3114+ 'checkuser-week-2' => 'lasta du semani',
 3115+ 'checkuser-month' => 'lasta 30 dii',
27763116 'checkuser-all' => 'omna',
 3117+ 'checkuser-cidr-res' => 'Komuna CIDR:',
27773118 'checkuser-accounts' => '$1 nova {{PLURAL:$1|konto|konti}}',
27783119 'checkuser-search-submit' => 'Serchar',
27793120 'checkuser-ipeditcount' => '~$1 di omna uzanti',
@@ -2865,8 +3206,10 @@
28663207 'checkuser-block-failure' => "'''Nessun utente bloccato.'''",
28673208 'checkuser-block-limit' => 'Troppi utenti selezionati.',
28683209 'checkuser-block-noreason' => 'È obbligatorio fornire una motivazione per i blocchi.',
 3210+ 'checkuser-noreason' => 'È necessario fornire una motivazione per questa query.',
28693211 'checkuser-accounts' => '$1 {{PLURAL:$1|nuovo|nuovi}} account',
2870 - 'checkuser-too-many' => 'Il numero di risultati è eccessivo, usare un CIDR più ristretto. Di seguito sono indicati gli indirizzi IP utilizzati (fino a un massimo di 5000, ordinati per indirizzo):',
 3212+ 'checkuser-too-many' => 'Troppi risultati (per la query), usa un CIDR più ristretto.
 3213+Di seguito sono indicati gli indirizzi IP utilizzati (fino a un massimo di 5000, ordinati per indirizzo):',
28713214 'checkuser-user-nonexistent' => "L'utente indicato non esiste.",
28723215 'checkuser-search-form' => 'Trova le voci del log per le quali $1 è $2',
28733216 'checkuser-search-submit' => 'Ricerca',
@@ -2901,27 +3244,27 @@
29023245 */
29033246 $messages['ja'] = array(
29043247 'checkuser-summary' => 'このツールは最近の更新から行った調査を元に、ある利用者が使用したIPアドレスの検索、または、あるIPアドレスからなされた編集および利用者名の表示を行います。
2905 -IPアドレスと共に「/xff」オプションを指定すると、XFF(X-Forwarded-For)ヘッダを通じてクライアントIPアドレスを取得し、そこからなされた編集および利用者名の検索をすることが可能です。
2906 -IPv4(16から32ビットのCIDR表記)と IPv6(96から128ビットのCIDR表記)をサポートしています。
 3248+IPアドレスと共に「/xff」オプションを指定すると、XFF (X-Forwarded-For) ヘッダを通じてクライアントIPアドレスを取得し、そこからなされた編集および利用者名の検索をすることが可能です。
 3249+IPv4 (16から32ビットのCIDR表記) と IPv6 (96から128ビットのCIDR表記) をサポートしています。
29073250 パフォーマンス上の理由により、5000件の編集しか返答出来ません。
2908 -「チェックユーザーの方針」に従って利用してください。',
 3251+方針に従って使用してください。',
29093252 'checkuser-desc' => '特定の権限を付与された利用者に対して、利用者のIPアドレスなどの情報のチェックを可能にする',
29103253 'checkuser-logcase' => 'ログの検索では大文字と小文字を区別します。',
2911 - 'checkuser' => 'チェックユーザー',
2912 - 'checkuser-contribs' => '利用者またはIPアドレスを調査',
2913 - 'group-checkuser' => 'チェックユーザー',
2914 - 'group-checkuser-member' => 'チェックユーザー',
2915 - 'right-checkuser' => '利用者のIPアドレスやその他の情報を確認する',
2916 - 'right-checkuser-log' => 'チェックユーザー記録を見る',
2917 - 'grouppage-checkuser' => '{{ns:project}}:チェックユーザー',
 3254+ 'checkuser' => '利用者の調査',
 3255+ 'checkuser-contribs' => '利用者かIPの調査',
 3256+ 'group-checkuser' => '利用者調査者',
 3257+ 'group-checkuser-member' => '利用者調査者',
 3258+ 'right-checkuser' => '利用者のIPアドレスやその他の情報を調査する',
 3259+ 'right-checkuser-log' => '利用者調査記録を見る',
 3260+ 'grouppage-checkuser' => '{{ns:project}}:利用者調査者',
29183261 'checkuser-reason' => '理由:',
29193262 'checkuser-showlog' => 'ログを閲覧',
2920 - 'checkuser-log' => 'チェックユーザー記録',
 3263+ 'checkuser-log' => '利用者の調査記録',
29213264 'checkuser-query' => '最近の更新を照会',
2922 - 'checkuser-target' => '利用者名またはIPアドレス',
2923 - 'checkuser-users' => '利用者名を得る',
 3265+ 'checkuser-target' => 'IPアドレスまたは利用者名:',
 3266+ 'checkuser-users' => '利用者名を取得する',
29243267 'checkuser-edits' => 'IPアドレスからの編集を得る',
2925 - 'checkuser-ips' => 'IPアドレスを得る',
 3268+ 'checkuser-ips' => 'IPアドレスを取得する',
29263269 'checkuser-account' => 'アカウントの投稿記録を取得する',
29273270 'checkuser-search' => '検索',
29283271 'checkuser-period' => '期間:',
@@ -2929,7 +3272,7 @@
29303273 'checkuser-week-2' => '前2週',
29313274 'checkuser-month' => '前30日間',
29323275 'checkuser-all' => 'すべて',
2933 - 'checkuser-cidr-label' => 'IPアドレスのリストから共通レンジと影響するアドレスを見つけ出す',
 3276+ 'checkuser-cidr-label' => 'IPアドレス一覧から共通レンジと影響を受けるアドレスを見つけ出す',
29343277 'checkuser-cidr-res' => '共通CIDR:',
29353278 'checkuser-empty' => 'ログ内に項目がありません。',
29363279 'checkuser-nomatch' => '該当するものはありません。',
@@ -2941,27 +3284,28 @@
29423285 'checkuser-blocked' => 'ブロック済み',
29433286 'checkuser-gblocked' => 'グローバルブロックされています',
29443287 'checkuser-locked' => 'ロックされています',
2945 - 'checkuser-wasblocked' => 'ブロック経験あり',
 3288+ 'checkuser-wasblocked' => '過去にブロックの記録あり',
29463289 'checkuser-localonly' => '統一されません',
29473290 'checkuser-massblock' => '選択した利用者をブロックする',
29483291 'checkuser-massblock-text' => '選択した利用者は無期限ブロックされ、同時に自動ブロックが作動しアカウント作成も禁止されます。IPアドレスはIP利用者向けに1週間ブロックされ、アカウント作成が禁止されます。',
29493292 'checkuser-blocktag' => '利用者ページを以下で置き換える:',
29503293 'checkuser-blocktag-talk' => 'ノートページを置換:',
29513294 'checkuser-massblock-commit' => '選択した利用者をブロックする',
2952 - 'checkuser-block-success' => "'''$2人の利用者 $1 が現在ブロックされています。'''",
 3295+ 'checkuser-block-success' => "'''{{PLURAL:$2|利用者}} $1 は現在ブロック{{PLURAL:$2|されています}}。'''",
29533296 'checkuser-block-failure' => "'''ブロックされたユーザーはありません。'''",
2954 - 'checkuser-block-limit' => '利用者の選択数が多すぎます。',
 3297+ 'checkuser-block-limit' => '選択した利用者の数が多すぎます。',
29553298 'checkuser-block-noreason' => 'ブロック理由の記入が必要です。',
2956 - 'checkuser-accounts' => '$1つの新しいアカウント',
2957 - 'checkuser-too-many' => '検索結果が多すぎます、CIDRの指定を小さく絞り込んでください。利用されたIPは以下の通りです(5000件を上限に、アドレス順でソートされています):',
 3299+ 'checkuser-noreason' => 'この照会には理由を与えなければなりません。',
 3300+ 'checkuser-accounts' => '$1つの新しい{{PLURAL:$1|アカウント}}',
 3301+ 'checkuser-too-many' => '(照会を推定したところ)検索結果が多すぎます。CIDRの指定を小さく絞り込んでください。利用されたIPは以下の通りです(5000件を上限に、アドレス順で整列されています):',
29583302 'checkuser-user-nonexistent' => '指定されたユーザーは存在しません。',
29593303 'checkuser-search-form' => '$1 が $2 であるログ項目を探す',
29603304 'checkuser-search-submit' => '検索',
2961 - 'checkuser-search-initiator' => 'チェック実行者',
2962 - 'checkuser-search-target' => 'チェック対象',
 3305+ 'checkuser-search-initiator' => '調査実行者',
 3306+ 'checkuser-search-target' => '調査対象者',
29633307 'checkuser-ipeditcount' => '全利用者 -$1',
29643308 'checkuser-log-subpage' => 'ログ',
2965 - 'checkuser-log-return' => 'チェックユーザーのメインフォームへ戻る',
 3309+ 'checkuser-log-return' => '利用者調査のメインフォームへ戻る',
29663310 'checkuser-limited' => "'''パフォーマンスの都合から結果は省略されています。'''",
29673311 'checkuser-log-userips' => '$1 は $2 が使用したIPアドレスを取得した',
29683312 'checkuser-log-ipedits' => '$1 は $2 からなされた編集を取得した',
@@ -3070,8 +3414,8 @@
30713415 'checkuser-block-limit' => 'Cacahing panganggo sing dipilih kakèhan.',
30723416 'checkuser-block-noreason' => 'Panjenengan kudu mènèhi alesan pamblokiran',
30733417 'checkuser-accounts' => '$1 {{PLURAL:$1|akun|akun-akun}} anyar',
3074 - 'checkuser-too-many' => 'Kakèhan pituwas, tulung CIDR diciyutaké.
3075 -Ing ngisor iki kapacak alamat-alamat IP sing dienggo (maks. 5.000, diurutaké adhedhasar alamat):',
 3418+ 'checkuser-too-many' => 'Kakèhan pituwas (miturut estimasi piakonan), tulung CIDR diciyutaké.
 3419+Ing ngisor iki kapacak alamat-alamat IP sing dianggo (maks. 5.000, diurutaké miturut alamat):',
30763420 'checkuser-user-nonexistent' => 'Panganggo iki ora ana.',
30773421 'checkuser-search-form' => 'Temokna cathetan log ing ngendi $1 iku $2',
30783422 'checkuser-search-submit' => 'Golèk',
@@ -3093,14 +3437,34 @@
30943438 );
30953439
30963440 /** Georgian (ქართული)
 3441+ * @author BRUTE
30973442 * @author Malafaya
 3443+ * @author გიორგიმელა
30983444 */
30993445 $messages['ka'] = array(
 3446+ 'checkuser' => 'ჩეკიუზერი',
 3447+ 'group-checkuser' => 'ჩეკიუზერები',
31003448 'checkuser-reason' => 'მიზეზი:',
31013449 'checkuser-search' => 'ძიება',
 3450+ 'checkuser-period' => 'ხანგძლივობა:',
31023451 'checkuser-all' => 'ყველა',
 3452+ 'checkuser-blocked' => 'დაბლოკილია',
 3453+ 'checkuser-gblocked' => 'გლობალურად ბლოკირებული',
 3454+ 'checkuser-locked' => 'დახურვა',
 3455+ 'checkuser-block-limit' => 'არჩეულია ზედმეტად ბევრი მომხმარებელი.',
 3456+ 'checkuser-block-noreason' => 'თქვენ უნდა მიუთითოთ ბლოკირების მიზეზი.',
 3457+ 'checkuser-noreason' => 'თქვენ უნდა მიუთითოთ მიზეზი ამ შეკითხვისთვის.',
 3458+ 'checkuser-accounts' => '$1 ახალი {{PLURAL:$1|ანგარიში|ანგარიშები}}',
 3459+ 'checkuser-too-many' => 'ძალიან ბევრი რეზულტატი, გთხოვთ შეავიწროოთ CIDR-ი.
 3460+გამოყენებული IP (მაქსიმუმ 500 სორტირებულია მისამართის თანახმად)',
31033461 'checkuser-search-submit' => 'ძიება',
 3462+ 'checkuser-search-initiator' => 'ინიციატორი',
 3463+ 'checkuser-search-target' => 'მიზანი',
 3464+ 'checkuser-ipeditcount' => '~$1 ყველა მომხმარებლისგან',
31043465 'checkuser-log-subpage' => 'ჟურნალი',
 3466+ 'checkuser-log-return' => 'მომხმარებელთა შემოწმების გვერდზე დაბრუნება',
 3467+ 'checkuser-limited' => "'''რეზულტატები შეიკუმშა სერვერზე დამატებითი დატვირთვის არ შექმნის მიზნით.'''",
 3468+ 'checkuser-email-action' => 'გაუგზავნა წერილი მომხმარებელ «$1»-ს',
31053469 );
31063470
31073471 /** Kazakh (Arabic script) (‫قازاقشا (تٴوتە)‬) */
@@ -3228,11 +3592,13 @@
32293593 * @author Lovekhmer
32303594 * @author Thearith
32313595 * @author គីមស៊្រុន
 3596+ * @author វ័ណថារិទ្ធ
32323597 */
32333598 $messages['km'] = array(
32343599 'checkuser-desc' => 'ផ្ដល់ឱ្យអ្នកប្រើប្រាស់​នូវការអនុញ្ញាតសមគួរដើម្បី​ទទួលបាននូវ​សមត្ថភាព​ក្នុងការត្រួតពិនិត្យអាសយដ្ឋាន IP របស់អ្នកប្រើប្រាស់និង​ព័ត៌មានផ្សេងៗទៀត',
32353600 'checkuser-logcase' => 'ការស្វែងរកកំណត់ហេតុដោយបែងចែកអក្សរធំ អក្សរតូច។',
32363601 'checkuser' => 'ត្រួតពិនិត្យអ្នកប្រើប្រាស់',
 3602+ 'checkuser-contribs' => 'ត្រួតពិនិត្យ ​IP របស់​អ្នកប្រើប្រាស់',
32373603 'group-checkuser' => 'អ្នកត្រួតពិនិត្យអ្នកប្រើប្រាស់',
32383604 'group-checkuser-member' => 'អ្នកត្រួតពិនិត្យអ្នកប្រើប្រាស់',
32393605 'right-checkuser' => 'អាសយដ្ឋានIPនិងព័ត៌មានដ៏ទៃទៀតនៃការត្រួតពិនិត្យអ្នកប្រើប្រាស់',
@@ -3253,6 +3619,7 @@
32543620 'checkuser-month' => '៣០ថ្ងៃមុន',
32553621 'checkuser-all' => 'ទាំងអស់',
32563622 'checkuser-empty' => 'មិនមានអ្វីនៅក្នុងកំណត់ហេតុនេះទេ។',
 3623+ 'checkuser-nomatch' => 'មិន​មាន​ការគូ​ផ្គង​ដូច​គ្នា​ត្រូវ​បាន​រក​ឃើញ​ទេ។',
32573624 'checkuser-check' => 'ត្រួតពិនិត្យ',
32583625 'checkuser-nolog' => 'ឯកសារកំណត់ហេតុមិនត្រូវបានរកឃើញទេ។',
32593626 'checkuser-blocked' => 'បានហាមឃាត់',
@@ -3278,6 +3645,7 @@
32793646 'checkuser-log-return' => 'ត្រឡប់ទៅកាន់បែបបទដើមនៃការត្រួតពិនិត្យអ្នកប្រើប្រាស់',
32803647 'checkuser-log-userips' => '$1បានទទួល IPs ដែល$2បានប្រើប្រាស់',
32813648 'checkuser-log-ipedits' => '$1បានទទួលចំនួនកំណែប្រែពី$2',
 3649+ 'checkuser-log-ipedits-xff' => '$1 បានទទួលកំណែប្រែពី XFF $2',
32823650 'checkuser-log-useredits' => '$1 បានទទួលកំណែប្រែពី $2',
32833651 'checkuser-autocreate-action' => 'ត្រូវបានបង្កើតដោយស្វ័យប្រវត្តិ',
32843652 'checkuser-email-action' => 'បានផ្ញើអ៊ីមែលទៅកាន់អ្នកប្រើប្រាស់ "$1"',
@@ -3286,9 +3654,11 @@
32873655
32883656 /** Kannada (ಕನ್ನಡ)
32893657 * @author HPNadig
 3658+ * @author Nayvik
32903659 */
32913660 $messages['kn'] = array(
32923661 'checkuser' => 'ಸದಸ್ಯನನ್ನು ಚೆಕ್ ಮಾಡಿ',
 3662+ 'checkuser-reason' => 'ಕಾರಣ:',
32933663 );
32943664
32953665 /** Korean (한국어)
@@ -3301,7 +3671,7 @@
33023672 $messages['ko'] = array(
33033673 'checkuser-summary' => '이 도구는 특정 사용자가 이용한 IP 또는 특정 IP에 대한 편집/사용자 정보를 조사합니다.
33043674 클라이언트 IP를 통한 사용자와 편집은 IP 주소 뒤에 "/xff"를 더함으로서 XFF 제공자를 통해 조사할 수 있습니다. IPv4 (CIDR 16-32) 와 IPv6 (CIDR 96-128)을 지원합니다.
3305 -기술적 문제로 최대 5000개의 편집만 보여질 것입니다.
 3675+성능상의 이유로 최대 5000개의 편집만 보여질 것입니다.
33063676 이 도구는 정책에 맞게 사용하십시오.',
33073677 'checkuser-desc' => '사용자의 IP 주소를 포함한 정보를 볼 수 있는 권한을 특정한 사용자에게 준다.',
33083678 'checkuser-logcase' => '이 기록 검색은 대소문자를 구분합니다.',
@@ -3316,7 +3686,7 @@
33173687 'checkuser-showlog' => '기록 보기',
33183688 'checkuser-log' => '체크유저 기록',
33193689 'checkuser-query' => '쿼리 최근 바뀜',
3320 - 'checkuser-target' => '사용자 혹은 IP',
 3690+ 'checkuser-target' => 'IP 주소 또는 계정 이름:',
33213691 'checkuser-users' => '특정 IP를 사용한 사용자 확인',
33223692 'checkuser-edits' => '특정 IP에서의 편집을 확인',
33233693 'checkuser-ips' => 'IP 주소 확인',
@@ -3351,8 +3721,9 @@
33523722 'checkuser-block-failure' => "'''차단된 사용자가 없습니다.'''",
33533723 'checkuser-block-limit' => '너무 많은 사용자를 선택하였습니다.',
33543724 'checkuser-block-noreason' => '차단하는 이유를 반드시 입력해야 합니다.',
 3725+ 'checkuser-noreason' => '이 명령에 대한 이유를 반드시 제시해야 합니다.',
33553726 'checkuser-accounts' => '$1개의 새 계정',
3356 - 'checkuser-too-many' => '결과가 너무 많습니다. CIDR 범위를 좁혀 주세요.
 3727+ 'checkuser-too-many' => '쿼리 정보의 결과가 너무 많습니다. CIDR 범위를 좁혀 주세요.
33573728 다음은 사용되고 있는 IP의 목록입니다 (최대 5000개, 주소별로 정렬됨):',
33583729 'checkuser-user-nonexistent' => '해당 사용자가 존재하지 않습니다.',
33593730 'checkuser-search-form' => '$1이 $2인 기록 찾기',
@@ -3362,16 +3733,16 @@
33633734 'checkuser-ipeditcount' => '모든 사용자로부터 $1개의 편집',
33643735 'checkuser-log-subpage' => '기록',
33653736 'checkuser-log-return' => '체크유저 양식으로 돌아가기',
3366 - 'checkuser-limited' => "'''이 결과는 기술적인 이유로 일부분이 제외되었습니다.'''",
3367 - 'checkuser-log-userips' => '$1 은(는) $2 이(가) 사용한 IP 주소를 열람했습니다.',
3368 - 'checkuser-log-ipedits' => '$1 은(는) $2의 편집을 열람했습니다.',
3369 - 'checkuser-log-ipusers' => '$1이(가) $2 IP 주소를 사용한 사용자를 확인하였습니다.',
3370 - 'checkuser-log-ipedits-xff' => '$1이(가) XFF $2 IP 주소에서의 편집을 열람하였습니다.',
3371 - 'checkuser-log-ipusers-xff' => '$1이(가) XFF $2 IP 주소를 사용한 사용자의 목록을 열람하였습니다.',
3372 - 'checkuser-log-useredits' => '$1이(가) $2 사용자의 편집을 열람하였습니다.',
 3737+ 'checkuser-limited' => "'''성능상의 이유로 결과 중 일부만 보여줍니다.'''",
 3738+ 'checkuser-log-userips' => '$1 사용자는 $2 사용자가 사용한 IP 주소를 열람했습니다.',
 3739+ 'checkuser-log-ipedits' => '$1 사용자는 $2의 편집을 열람했습니다.',
 3740+ 'checkuser-log-ipusers' => '$1 사용자가 $2 IP 주소를 사용한 사용자를 확인하였습니다.',
 3741+ 'checkuser-log-ipedits-xff' => '$1 사용자가 XFF $2 IP 주소에서의 편집을 열람하였습니다.',
 3742+ 'checkuser-log-ipusers-xff' => '$1 사용자가 XFF $2 IP 주소를 사용한 사용자의 목록을 열람하였습니다.',
 3743+ 'checkuser-log-useredits' => '$1 사용자가 $2 사용자의 편집을 열람하였습니다.',
33733744 'checkuser-autocreate-action' => '계정이 자동으로 생성되었습니다.',
3374 - 'checkuser-email-action' => '사용자 "$1"에게 이메일을 보냄',
3375 - 'checkuser-reset-action' => '"$1"의 암호를 변경함',
 3745+ 'checkuser-email-action' => '"$1" 사용자에게 이메일을 보냄',
 3746+ 'checkuser-reset-action' => '"$1" 사용자의 암호를 변경함',
33763747 );
33773748
33783749 /** Krio (Krio)
@@ -3412,7 +3783,7 @@
34133784 'checkuser-showlog' => 'et Logboch aanzeije',
34143785 'checkuser-log' => 'Logboch fum Metmaacher-Pröfe',
34153786 'checkuser-query' => 'En de {{LCFIRST:{{int:recentchanges}}}} frore',
3416 - 'checkuser-target' => 'Metmaacher-Name udder IP-Address',
 3787+ 'checkuser-target' => '<code lang="en">IP</code>-Addräß udder Metmaacher-Name:',
34173788 'checkuser-users' => 'Metmaacher holle!',
34183789 'checkuser-edits' => 'Änderonge fun dä IP-Address holle!',
34193790 'checkuser-ips' => 'IP-Addresse holle!',
@@ -3448,8 +3819,9 @@
34493820 'checkuser-block-failure' => "'''Keine Metmaacher jesperrt.'''",
34503821 'checkuser-block-limit' => 'Zoo fill Metmaacher ußjesoht.',
34513822 'checkuser-block-noreason' => 'Do moß ävver ene Jrund för et Sperre aanjevve.',
 3823+ 'checkuser-noreason' => 'Do moß ene Jrond för hee di Froch aanjävve.',
34523824 'checkuser-accounts' => '{{PLURAL:$1|Eine|$1|Keine}} neue Metmaacher',
3453 - 'checkuser-too-many' => 'Zoo fill jefonge, beß esu joot un maach dä CIDR kleijner.
 3825+ 'checkuser-too-many' => 'Zoo fill jefonge, pä Övverschlaach. Beß esu joot un maach dä CIDR kleijner.
34543826 Hee sin de eetßte 5000 IP-Addresse, zoteeet:',
34553827 'checkuser-user-nonexistent' => 'Dä Metmaacher jidd_et ja nit.',
34563828 'checkuser-search-form' => 'Sök noh Enndräsch em Logboch, woh $1 $2 es.',
@@ -3471,7 +3843,7 @@
34723844 'checkuser-reset-action' => 'Däm Metmaacher „$1“ sing Paßwoot automattesch neu setze',
34733845 );
34743846
3475 -/** Kurdish (Latin) (Kurdî / كوردی (Latin))
 3847+/** Kurdish (Latin) (Kurdî (Latin))
34763848 * @author Bangin
34773849 */
34783850 $messages['ku-latn'] = array(
@@ -3489,9 +3861,14 @@
34903862 );
34913863
34923864 /** Luxembourgish (Lëtzebuergesch)
 3865+ * @author Les Meloures
34933866 * @author Robby
34943867 */
34953868 $messages['lb'] = array(
 3869+ 'checkuser-summary' => "Dës Fonctioun scannt déi rezent Ännerunge fir d'Ip-Adressen, déi vun engem Benotzer benotzt goufen, ze fannen, repektiv d'Ännerunge pro Benotzer fir eng IP.
 3870+Benotzer an Ännerunge vun enger IP-Adress kënnen och iwwer den XFF header gesicht ginn andeems hannert d'IP-Adress \"/xff\" hannendrugehaange gëtt. IPv4 (CIDR 16-32) an IPv6 (CIDR 96-128) ginn ënnerstëtzt.
 3871+Net méi wéi 5000 Ännerunge ginn aus Performance-Grënn zréckgeschéckt.
 3872+Benotzt dës Fonctioun am Aklang mat den Direktiven.",
34963873 'checkuser-desc' => "Gëtt Benotzer mat den néidege Rechter d'Méiglechkeet d'IP-Adressen esou wéi aner Informatiounen iwwert d'Benotzer z'iwwerpréifen",
34973874 'checkuser-logcase' => "D'Sich am Logbuch mecht en Ënnerscheed tëschent groussen a klenge Buchstawen.",
34983875 'checkuser' => 'Benotzer-Check',
@@ -3505,7 +3882,7 @@
35063883 'checkuser-showlog' => 'Logbuch weisen',
35073884 'checkuser-log' => 'Lëscht vun de Benotzerkontrollen',
35083885 'checkuser-query' => 'Rezent Ännerungen offroen',
3509 - 'checkuser-target' => 'Benotzer oder IP-Adress',
 3886+ 'checkuser-target' => 'IP-Adress oder Benotzernumm:',
35103887 'checkuser-users' => 'Benotzer kréien',
35113888 'checkuser-edits' => "Weis d'Ännerunge vun der IP-Adress",
35123889 'checkuser-ips' => 'IP-Adresse kréien/uweisen',
@@ -3539,9 +3916,10 @@
35403917 'checkuser-block-failure' => "'''Et si keng Benotzer gespaart.'''",
35413918 'checkuser-block-limit' => 'Zevill Benotzer ugewielt.',
35423919 'checkuser-block-noreason' => "Dir musst e Grond fir d'Spären uginn.",
 3920+ 'checkuser-noreason' => 'Dir musst e Grond fir dës Ufro uginn.',
35433921 'checkuser-accounts' => '$1 {{PLURAL:$1|neie Benotzerkont|nei Benotzerkonten}}',
3544 - 'checkuser-too-many' => 'Zevill Resultater, gitt w.e.g. méi e klenge Beräich vun Ip-adresen un.
3545 -Hei sinn déi benotzten IP-Adressen (max 5000, sortéiert no der Adress):',
 3922+ 'checkuser-too-many' => 'Zevill Resultater (am Vergäich zu der Schätzung vun der Ufro), gitt w.e.g. méi e klenge Beräich vum CIDR un.
 3923+Hei sinn déi benotzten IP-Adressen (max 5000, zortéiert no der Adress):',
35463924 'checkuser-user-nonexistent' => 'De gesichte Benotzer gëtt et net.',
35473925 'checkuser-search-form' => 'An de Lëschten fannen, wou den $1 den $2 ass',
35483926 'checkuser-search-submit' => 'Sichen',
@@ -3692,62 +4070,175 @@
36934071 );
36944072
36954073 /** Latvian (Latviešu)
 4074+ * @author Papuass
36964075 * @author Xil
36974076 * @author Yyy
36984077 */
36994078 $messages['lv'] = array(
37004079 'checkuser-desc' => 'Atļauj lietotājiem ar attiecīgām pilnvarām pārbaudīt lietotāja IP adresi un citu informāciju.',
37014080 'checkuser' => 'Pārbaudīt lietotāju',
3702 - 'group-checkuser' => 'Pārbaudīt lietotājus',
 4081+ 'group-checkuser' => 'Pārbaudes lietotāji',
37034082 'checkuser-reason' => 'Iemesls:',
37044083 'checkuser-target' => 'Lietotājs vai IP',
37054084 'checkuser-search' => 'Meklēt',
37064085 'checkuser-check' => 'Pārbaudīt',
37074086 );
37084087
 4088+/** Malagasy (Malagasy)
 4089+ * @author Jagwar
 4090+ */
 4091+$messages['mg'] = array(
 4092+ 'checkuser-nolog' => "Tsy nahitana rakitra tantaran'asa.",
 4093+);
 4094+
37094095 /** Eastern Mari (Олык Марий)
37104096 * @author Сай
37114097 */
37124098 $messages['mhr'] = array(
37134099 'checkuser-reason' => 'Амал:',
37144100 'checkuser-search' => 'Кычал',
 4101+ 'checkuser-all' => 'чыла',
37154102 'checkuser-search-submit' => 'Кычал',
37164103 );
37174104
37184105 /** Macedonian (Македонски)
 4106+ * @author Bjankuloski06
 4107+ * @author Brest
37194108 * @author Misos
37204109 */
37214110 $messages['mk'] = array(
 4111+ 'checkuser-summary' => 'Оваа алатка врши преглед на скорешни промени за да ги добие IP адресите користени од некој корисник или да ги прикаже податоците за уредувања/корисници за некоја IP адреса.
 4112+Корисниците и уредувањата од клиентска IP адреса можат да се добијат преку XFF наслови со додавање на „/xff“ на IP адресата. Поддржани се IPv4 (CIDR 16-32) и IPv6 (CIDR 96-128).
 4113+Ќе се прикажат највеќе 5000 уредувања од функционални причини.
 4114+Користете го ова во согласност со правилата.',
 4115+ 'checkuser-desc' => 'Доделува право за проверка на кориснички IP адреси и други информации',
 4116+ 'checkuser-logcase' => 'Пребарувањето на дневникот разликува големи и букви.',
37224117 'checkuser' => 'Провери корисник',
 4118+ 'checkuser-contribs' => 'провери IP адреси на корисникот',
 4119+ 'group-checkuser' => 'Проверувачи',
 4120+ 'group-checkuser-member' => 'Проверувач',
 4121+ 'right-checkuser' => 'Проверување на корисничка IP адреса и други информации',
 4122+ 'right-checkuser-log' => 'Гледање дневник на проверување на корисник',
 4123+ 'grouppage-checkuser' => '{{ns:project}}:Проверувачи',
 4124+ 'checkuser-reason' => 'Причина:',
 4125+ 'checkuser-showlog' => 'Прикажи дневник',
 4126+ 'checkuser-log' => 'Дневник на проверки',
 4127+ 'checkuser-query' => 'Побарај скорешни промени',
 4128+ 'checkuser-target' => 'IP-адреса или корисничко име:',
 4129+ 'checkuser-users' => 'Види корисници',
 4130+ 'checkuser-edits' => 'Види уредувања од оваа IP адреса',
 4131+ 'checkuser-ips' => 'Види IP адреси',
 4132+ 'checkuser-account' => 'Види уредувања на сметката',
 4133+ 'checkuser-search' => 'Пребарај',
 4134+ 'checkuser-period' => 'Траење:',
 4135+ 'checkuser-week-1' => 'последна седмица',
 4136+ 'checkuser-week-2' => 'последни две седмици',
 4137+ 'checkuser-month' => 'последни 30 дена',
 4138+ 'checkuser-all' => 'сите',
 4139+ 'checkuser-cidr-label' => 'Најди заедничка низа и погодени адреси за листа на IP адреси',
 4140+ 'checkuser-cidr-res' => 'Заеднички CIDR:',
 4141+ 'checkuser-empty' => 'Дневникот не содржи записи.',
 4142+ 'checkuser-nomatch' => 'Нема совпаѓања.',
 4143+ 'checkuser-nomatch-edits' => 'Нема совпаѓања.
 4144+Последното уредување се случило на $1 во $2.',
 4145+ 'checkuser-check' => 'Провери',
 4146+ 'checkuser-log-fail' => 'Не можам да додадам ставка во дневникот',
 4147+ 'checkuser-nolog' => 'Дневникот не е пронајден.',
 4148+ 'checkuser-blocked' => 'Блокиран',
 4149+ 'checkuser-gblocked' => 'Блокиран глобално',
 4150+ 'checkuser-locked' => 'Заклучено',
 4151+ 'checkuser-wasblocked' => 'Претходно блокиран',
 4152+ 'checkuser-localonly' => 'Необединета',
 4153+ 'checkuser-massblock' => 'Блокирај ги избраните корисници',
 4154+ 'checkuser-massblock-text' => 'Избраните сметки ќе бидат трајно блокирани, со овозможено автоблокирање и оневозможено создавање на сметки.
 4155+IP адресите ќе бидат блокирани 1 недела за само за корисници со IP адреса, и со оневозможено создавање на сметка.',
 4156+ 'checkuser-blocktag' => 'Замени ги корисничките страници со:',
 4157+ 'checkuser-blocktag-talk' => 'Замени ги страниците за разговор со:',
 4158+ 'checkuser-massblock-commit' => 'Блокирај ги избраните корисници',
 4159+ 'checkuser-block-success' => "'''{{PLURAL:$2|Корисникот|Корисниците}} $1 {{PLURAL:$2|е|се}} {{PLURAL:$2|блокиран|блокирани}}.'''",
 4160+ 'checkuser-block-failure' => "'''Никој не е блокиран.'''",
 4161+ 'checkuser-block-limit' => 'Избравте премногу корисници.',
 4162+ 'checkuser-block-noreason' => 'Мора да наведете причина за блокирањата.',
 4163+ 'checkuser-noreason' => 'Мора да наведете причина за ова барање.',
 4164+ 'checkuser-accounts' => '$1 {{PLURAL:$1|нова сметка|нови сметки}}',
 4165+ 'checkuser-too-many' => 'Премногу резултати (според процената на барањето), истенчете го CIDR.
 4166+Еве ги користените IP-адреси (највеќе 5000, сортирани по адреса):',
 4167+ 'checkuser-user-nonexistent' => 'Назначениот корисник не постои.',
 4168+ 'checkuser-search-form' => 'Пронајди ставки во дневникот каде $1 е $2',
 4169+ 'checkuser-search-submit' => 'Пребарај',
 4170+ 'checkuser-search-initiator' => 'иницијатор',
 4171+ 'checkuser-search-target' => 'цел',
 4172+ 'checkuser-ipeditcount' => '~$1 од сите корисници',
 4173+ 'checkuser-log-subpage' => 'Дневник',
 4174+ 'checkuser-log-return' => 'Врати се на главниот образец за проверување корисници',
 4175+ 'checkuser-limited' => "'''Резултатите се скратени од функционални причини.'''",
 4176+ 'checkuser-log-userips' => '$1 добил(а) IP адреси за $2',
 4177+ 'checkuser-log-ipedits' => '$1 добил(а) уредувања за $2',
 4178+ 'checkuser-log-ipusers' => '$1 добил(а) корисници за $2',
 4179+ 'checkuser-log-ipedits-xff' => '$1 добил(а) уредувања за XFF $2',
 4180+ 'checkuser-log-ipusers-xff' => '$1 добил(а) корисници за XFF $2',
 4181+ 'checkuser-log-useredits' => '$1 добил(а) уредувања за $2',
 4182+ 'checkuser-autocreate-action' => 'беше автоматски создадена',
 4183+ 'checkuser-email-action' => 'му испратил(а) е-пошта на корисникот „$1“',
 4184+ 'checkuser-reset-action' => 'промени лозинка за корисник „$1“',
37234185 );
37244186
37254187 /** Malayalam (മലയാളം)
 4188+ * @author Praveenp
37264189 * @author Shijualex
37274190 */
37284191 $messages['ml'] = array(
3729 - 'checkuser-desc' => 'ഉപയോക്താക്കള്‍ ഉപയോഗിച്ച ഐപി വിലാസവും മറ്റുവിവരങ്ങളും പരിശോധിക്കുവാനുള്ള അവകാശം കൊടുക്കാന്‍ പ്രാപ്തമാക്കുന്നു',
 4192+ 'checkuser-desc' => 'ഉപയോക്താക്കള്‍ ഉപയോഗിച്ച ഐ.പി. വിലാസവും മറ്റുവിവരങ്ങളും പരിശോധിക്കുവാനുള്ള അവകാശം കൊടുക്കാന്‍ പ്രാപ്തമാക്കുന്നു',
37304193 'checkuser-logcase' => 'പ്രവര്‍ത്തന രേഖകള്‍ക്കു വേണ്ടിയുള്ള തിരച്ചില്‍ കേസ് സെന്‍സിറ്റീവ് ആണ്‌.',
37314194 'checkuser' => 'ചെക്ക് യൂസര്‍',
 4195+ 'checkuser-contribs' => 'ഉപയോക്തൃ ഐ.പി. വിലാസങ്ങൾ പരിശോധിക്കുക',
37324196 'group-checkuser' => 'ചെക്ക് യൂസര്‍മാര്‍',
37334197 'group-checkuser-member' => 'ചെക്ക് യൂസര്‍',
3734 - 'right-checkuser' => 'ചെക്ക് യൂസറിന്റെ ഐപി വിലാസവും മറ്റു വിവരങ്ങളും',
 4198+ 'right-checkuser' => 'ചെക്ക് യൂസറിന്റെ ഐ.പി. വിലാസവും മറ്റു വിവരങ്ങളും',
 4199+ 'right-checkuser-log' => 'ചെക്ക്‌‌യൂസർ രേഖ കാണുക',
37354200 'grouppage-checkuser' => '{{ns:project}}:ചെക്ക് യൂസര്‍',
3736 - 'checkuser-reason' => 'കാരണം',
 4201+ 'checkuser-reason' => 'കാരണം:',
37374202 'checkuser-showlog' => 'പ്രവര്‍ത്തനരേഖ കാട്ടുക',
37384203 'checkuser-log' => 'ചെക്ക് യൂസര്‍ പ്രവര്‍ത്തനരേഖ',
37394204 'checkuser-query' => 'പുതിയ മാറ്റങ്ങള്‍',
3740 - 'checkuser-target' => 'ഉപയോക്താവ് അല്ലെങ്കില്‍ ഐപി',
 4205+ 'checkuser-target' => 'ഐ.പി. വിലാസം അഥവാ ഉപയോക്തൃനാമം:',
37414206 'checkuser-users' => 'ഉപയോക്താക്കളെ കാട്ടുക',
3742 - 'checkuser-edits' => 'ഐപിയില്‍ നിന്നുള്ള തിരുത്തലുകള്‍ കാട്ടുക',
3743 - 'checkuser-ips' => 'ഐപികളെ കാട്ടുക',
 4207+ 'checkuser-edits' => 'ഐ.പി.യില്‍ നിന്നുള്ള തിരുത്തലുകള്‍ കാട്ടുക',
 4208+ 'checkuser-ips' => 'ഐ.പി.കളെ കാട്ടുക',
 4209+ 'checkuser-account' => 'അംഗത്വത്തിന്റെ തിരുത്തലുകൾ എടുക്കുക',
37444210 'checkuser-search' => 'തിരയൂ',
 4211+ 'checkuser-period' => 'കാലയളവ്:',
 4212+ 'checkuser-week-1' => 'കഴിഞ്ഞ ആഴ്‌‌ച്ച',
 4213+ 'checkuser-week-2' => 'കഴിഞ്ഞ രണ്ട് ആഴ്ച്ച',
 4214+ 'checkuser-month' => 'കഴിഞ്ഞ 30 ദിവസം',
 4215+ 'checkuser-all' => 'എല്ലാം',
 4216+ 'checkuser-cidr-label' => 'ഐ.പി. വിലാസങ്ങളുടെ പട്ടികയിൽ നിന്നും ബാധകമായ ഐ.പി. വിലാസങ്ങളുടെ സാധാരണ പരിധി കണ്ടെത്തുക',
 4217+ 'checkuser-cidr-res' => 'സാധാരണ CIDR:',
37454218 'checkuser-empty' => 'പ്രവര്‍ത്തനരേഖയില്‍ ഇനങ്ങള്‍ ഒന്നുമില്ല',
37464219 'checkuser-nomatch' => 'ചേര്‍ച്ചയുള്ളതൊന്നും കണ്ടില്ല',
 4220+ 'checkuser-nomatch-edits' => 'ഒത്തുപോകുന്നവ കണ്ടെത്താനായില്ല.
 4221+അവസാന തിരുത്തൽ $2 $1-നു ആണ് നടന്നത്.',
37474222 'checkuser-check' => 'പരിശോധിക്കുക',
37484223 'checkuser-log-fail' => 'പ്രവര്‍ത്തനരേഖയില്‍ ഇനം ചേര്‍ക്കുന്നതിനു കഴിഞ്ഞില്ല',
37494224 'checkuser-nolog' => 'പ്രവര്‍ത്തനരേഖ പ്രമാണം കണ്ടില്ല.',
37504225 'checkuser-blocked' => 'തടയപ്പെട്ടിരിക്കുന്നു',
3751 - 'checkuser-too-many' => 'വളരെയധികം ഫലങ്ങള്‍. CIDR ചുരുക്കുക.
 4226+ 'checkuser-gblocked' => 'ആഗോളമായി തടയപ്പെട്ടിരിക്കുന്നു',
 4227+ 'checkuser-locked' => 'പൂട്ടിയിരിക്കുന്നു',
 4228+ 'checkuser-wasblocked' => 'മുമ്പേ തടയപ്പെട്ടിരിക്കുന്നു',
 4229+ 'checkuser-localonly' => 'സംയോജിതമാക്കപ്പെട്ടിട്ടില്ല',
 4230+ 'checkuser-massblock' => 'തിരഞ്ഞെടുത്ത ഉപയോക്താക്കളെ തടയുക',
 4231+ 'checkuser-massblock-text' => 'സ്വയം തടയൽ ബാധകമായും അംഗത്വ സൃഷ്ടി സാധ്യമല്ലാതെയും തിരഞ്ഞെടുത്ത അംഗത്വങ്ങൾ ക്ലിപ്തമല്ലാത്ത കാലത്തേയ്ക്ക് തടഞ്ഞിരിക്കുന്നു.
 4232+ഐ.പി. വിലാസങ്ങൾ അംഗത്വ സൃഷ്ടി സാധ്യമല്ലാത്ത വിധത്തിൽ ഐ.പി. ഉപയോക്താക്കളെ ഒരു ആഴ്ചത്തേയ്ക്ക് തടഞ്ഞിരിക്കുന്നു.',
 4233+ 'checkuser-blocktag' => 'ഉപയോക്തൃതാളുകൾ ഇതുകൊണ്ട് മാറ്റുക:',
 4234+ 'checkuser-blocktag-talk' => 'സംവാദം താളുകൾ ഇതുകൊണ്ട് മാറ്റുക:',
 4235+ 'checkuser-massblock-commit' => 'തിരഞ്ഞെടുത്ത ഉപയോക്താക്കളെ തടയുക',
 4236+ 'checkuser-block-success' => "'''$1 {{PLURAL:$2|ഉപയോക്താവ്|ഉപയോക്താക്കൾ}} ഇപ്പോൾ തടയപ്പെട്ടിരിക്കുന്നു'''",
 4237+ 'checkuser-block-failure' => "'''ഒരു ഉപയോക്താവും തടയപ്പെട്ടില്ല.'''",
 4238+ 'checkuser-block-limit' => 'നിരവധി ഉപയോക്താക്കളെ തിരഞ്ഞെടുത്തിരിക്കുന്നു.',
 4239+ 'checkuser-block-noreason' => 'തടയലിനു ഒരു കാരണം താങ്കൾ നൽകുക.',
 4240+ 'checkuser-noreason' => 'ഈ ചോദ്യത്തിനു താങ്കൾ നിർബന്ധമായും കാരണം നൽകേണ്ടതാണ്.',
 4241+ 'checkuser-accounts' => 'പുതിയ {{PLURAL:$1|അംഗത്വം|$1അംഗത്വങ്ങൾ}}',
 4242+ 'checkuser-too-many' => 'വളരെയധികം ഫലങ്ങള്‍ (ലഭിച്ച ക്വറി അനുസരിച്ച്). CIDR ചുരുക്കുക.
37524243 ഉപയോഗിച്ച IPകള്‍ താഴെ പ്രദര്‍ശിപ്പിച്ചിരിക്കുന്നു (പരമാവധി 5000, വിലാസം അനുസരിച്ച് ക്രമീകരിച്ചത്):',
37534244 'checkuser-user-nonexistent' => 'ഇങ്ങനൊരു ഉപയോക്താവ് വിക്കിയില്‍ നിലവിലില്ല.',
37544245 'checkuser-search-form' => '$1, $2 ആയ പ്രവര്‍ത്തനരേഖാ ഇനങ്ങള്‍ കണ്ടെത്തുന്നു',
@@ -3757,13 +4248,28 @@
37584249 'checkuser-ipeditcount' => '~$1എല്ലാ ഉപയോക്താക്കളില്‍ നിന്നും',
37594250 'checkuser-log-subpage' => 'പ്രവര്‍ത്തനരേഖ',
37604251 'checkuser-log-return' => 'ചെക്ക് യൂസറിന്റെ പ്രധാന ഫോമിലേക്ക് തിരിച്ചു പോവുക',
3761 - 'checkuser-log-userips' => '$1നു $2ല്‍ ഐപികള്‍ ഉണ്ട്',
 4252+ 'checkuser-limited' => "'''പ്രവർത്തന മികവു സംബന്ധിച്ച പ്രശ്നങ്ങളാൽ ഫലങ്ങൾ വെട്ടിച്ചുരുക്കിയിരിക്കുന്നു.'''",
 4253+ 'checkuser-log-userips' => '$1നു $2ല്‍ ഐ.പി.കള്‍ ഉണ്ട്',
37624254 'checkuser-log-ipedits' => '$1നു $2ല്‍ തിരുത്തലുകള്‍ ഉണ്ട്',
37634255 'checkuser-log-ipusers' => '$1നു $2ല്‍ ഉപയോക്താക്കള്‍ ഉണ്ട്',
37644256 'checkuser-log-ipedits-xff' => '$1നു XFF $2ല്‍ തിരുത്തലുകള്‍ ഉണ്ട്',
37654257 'checkuser-log-ipusers-xff' => '$1നു XFF $2ല്‍ ഉപയോക്താക്കള്‍ ഉണ്ട്',
 4258+ 'checkuser-log-useredits' => '$2 നടത്തിയ തിരുത്തലുകൾ $1 പിടിച്ചിരിക്കുന്നു',
 4259+ 'checkuser-autocreate-action' => 'സ്വയം സൃഷ്ടിച്ചതാണ്',
 4260+ 'checkuser-email-action' => '"$1" എന്ന ഉപയോക്താവിന് ഇമെയിൽ അയച്ചുകഴിഞ്ഞു',
 4261+ 'checkuser-reset-action' => '"$1" എന്ന ഉപയോക്താവിന്റെ രഹസ്യവാക്ക് പുനഃക്രമീകരിക്കുക',
37664262 );
37674263
 4264+/** Mongolian (Монгол)
 4265+ * @author Chinneeb
 4266+ */
 4267+$messages['mn'] = array(
 4268+ 'checkuser' => 'Хэрэглэгчийг шалгах',
 4269+ 'checkuser-search' => 'Хайх',
 4270+ 'checkuser-blocked' => 'Түгжигдсэн',
 4271+ 'checkuser-search-submit' => 'Хайх',
 4272+);
 4273+
37684274 /** Marathi (मराठी)
37694275 * @author Kaustubh
37704276 * @author Mahitgar
@@ -3886,6 +4392,13 @@
38874393 'checkuser-reset-action' => 'set semula kata laluan "$1"',
38884394 );
38894395
 4396+/** Maltese (Malti)
 4397+ * @author Chrisportelli
 4398+ */
 4399+$messages['mt'] = array(
 4400+ 'group-checkuser-member' => 'Kontrollatur',
 4401+);
 4402+
38904403 /** Erzya (Эрзянь)
38914404 * @author Amdf
38924405 * @author Botuzhaleny-sodamo
@@ -3893,12 +4406,16 @@
38944407 */
38954408 $messages['myv'] = array(
38964409 'checkuser-reason' => 'Тувталось:',
 4410+ 'checkuser-showlog' => 'Невтемс журналонзо',
38974411 'checkuser-target' => 'Совиця эли IP',
38984412 'checkuser-search' => 'Вешнэмс',
 4413+ 'checkuser-period' => 'Зярс моли:',
38994414 'checkuser-week-1' => 'меельсе тарго',
39004415 'checkuser-week-2' => 'меельсе кавто таргт',
39014416 'checkuser-month' => 'меельсе 30 чить',
39024417 'checkuser-all' => 'весе',
 4418+ 'checkuser-blocked' => 'Саймес саезь',
 4419+ 'checkuser-locked' => 'Сёлгозь',
39034420 'checkuser-search-submit' => 'Вешнэмс',
39044421 );
39054422
@@ -3998,12 +4515,36 @@
39994516 * @author Servien
40004517 */
40014518 $messages['nds-nl'] = array(
4002 - 'checkuser-summary' => 'Dit hulpmiddel scant de lieste mit de leste wiezigingen um de IP-adressen weerumme te haolen dee gebruuk bin deur een gebruker of een bewarking/gebrukersgegevens weergeven veur een IP-adres. Gebrukers en bewarkingen kunnen weerummehaold wonnen mit een XFF-IP deur "/xff" an \'t IP-adres toe te voegen. IPv4 (CIDR 16-32) en IPv6 (CIDR 96-128) wonnen ondersteund. Neet meer as 5.000 bewarkingen wonnen eteund vanwegen prestasierejens. Gebruuk dit in overeenstemming mit \'t beleid.',
 4519+ 'checkuser-summary' => 'Dit hulpmiddel scant de lieste mit de leste wiezigingen um de IP-adressen weerumme te haolen dee gebruuk bin deur een gebruker of een bewarking/gebrukersgegevens weergeven veur een IP-adres. Gebrukers en bewarkingen kunnen weerummehaold wönnen mit een XFF-IP deur "/xff" an \'t IP-adres toe te voegen. IPv4 (CIDR 16-32) en IPv6 (CIDR 96-128) wönnen ondersteund. Wie laoten neet meer as 5.000 bewarkingen zien vanwegen prestasieredens. Gebruuk dit in overeenstemming mit \'t beleid.',
 4520+ 'checkuser-desc' => 'Laot gebrukers mit de beneudigen rechen IP-adressen en aandere infermasie van gebrukers achterhaolen.',
 4521+ 'checkuser-logcase' => "De zeukfunctie van 't logboek is heuflettergeveulig",
 4522+ 'checkuser' => 'Gebruker naokieken',
 4523+ 'checkuser-reason' => 'Reden:',
 4524+ 'checkuser-showlog' => 'Logboek bekieken',
 4525+ 'checkuser-log' => 'Logboek IP-adrescontreleurs',
40034526 'checkuser-query' => 'Zeukopdrachte leste wiezigingen',
 4527+ 'checkuser-target' => 'Gebruker of IP-adres',
 4528+ 'checkuser-users' => 'Gebrukers naokieken',
 4529+ 'checkuser-edits' => 'Bewarkingen van IP-adressen naokieken',
 4530+ 'checkuser-ips' => 'IP-adressen naokieken',
 4531+ 'checkuser-search' => 'Zeuken',
 4532+ 'checkuser-empty' => "Der steet gien infermasie in 't logboek.",
 4533+ 'checkuser-nomatch' => 'Gien overeenkomsen evunnen.',
 4534+ 'checkuser-check' => 'Naokieken',
 4535+ 'checkuser-log-fail' => 'Kon gien logboekantekeningen maken',
 4536+ 'checkuser-nolog' => 'Gien logboek evunnen.',
 4537+ 'checkuser-blocked' => 'Eblokkeerd',
 4538+ 'checkuser-too-many' => 'Te veul risseltaoten (volgens de schatting). Maak de IP-reeks kleinder:
 4539+Hieronder staon de gebruken IP-aderssen (maximaal 5.000, op IP-adres econtreleerd):',
 4540+ 'checkuser-user-nonexistent' => 'De op-egeven gebruker besteet neet.',
 4541+ 'checkuser-search-form' => 'Logboekregels zeuken waor de $1 $2 is',
 4542+ 'checkuser-search-submit' => 'Zeuken',
 4543+ 'checkuser-search-initiator' => 'anvrager',
 4544+ 'checkuser-search-target' => 'onderwarp',
40044545 );
40054546
40064547 /** Dutch (Nederlands)
4007 - * @author Erwin85
 4548+ * @author Erwin
40084549 * @author SPQRobin
40094550 * @author Siebrand
40104551 * @author Troefkaart
@@ -4026,7 +4567,7 @@
40274568 'checkuser-showlog' => 'Logboek weergeven',
40284569 'checkuser-log' => 'Logboek controleren gebruikers',
40294570 'checkuser-query' => 'Bevraag recente wijzigingen',
4030 - 'checkuser-target' => 'Gebruiker of IP-adres',
 4571+ 'checkuser-target' => 'IP-adres of gebruikersnaam:',
40314572 'checkuser-users' => 'Gebruikers opvragen',
40324573 'checkuser-edits' => 'Bewerkingen van IP-adres opvragen',
40334574 'checkuser-ips' => 'IP-adressen opvragen',
@@ -4061,8 +4602,10 @@
40624603 'checkuser-block-failure' => "'''Geen gebruikers geblokkeerd.'''",
40634604 'checkuser-block-limit' => 'Te veel gebruikers geselecteerd.',
40644605 'checkuser-block-noreason' => 'U moet een reden opgeven voor de blokkades.',
 4606+ 'checkuser-noreason' => 'U moet een reden opgeven voor deze zoekopdracht.',
40654607 'checkuser-accounts' => '$1 nieuwe {{PLURAL:$1|gebruiker|gebruikers}}',
4066 - 'checkuser-too-many' => 'Te veel resultaten. Maak de IP-reeks kleiner:',
 4608+ 'checkuser-too-many' => 'Te veel resultaten (volgens de schatting). Maak de IP-reeks kleiner:
 4609+Hieronder worden de gebruikte IP-adressen weergegeven (maximaal 5000, op IP-adres gesorteerd):',
40674610 'checkuser-user-nonexistent' => 'De opgegeven gebruiker bestaat niet.',
40684611 'checkuser-search-form' => 'Logboekregels zoeken waar de $1 $2 is',
40694612 'checkuser-search-submit' => 'Zoeken',
@@ -4098,6 +4641,7 @@
40994642 'checkuser-desc' => 'Gjev brukarar med dei rette rettane moglegheita til å sjekka IP-adressene til og annan informasjon om brukarar.',
41004643 'checkuser-logcase' => 'Loggsøket tek omsyn til små og store bokstavar.',
41014644 'checkuser' => 'Brukarsjekk',
 4645+ 'checkuser-contribs' => 'finn brukaren sine IP-adresser',
41024646 'group-checkuser' => 'Brukarkontrollørar',
41034647 'group-checkuser-member' => 'Brukarkontrollør',
41044648 'right-checkuser' => 'Sjekka IP-adressene til brukarar i tillegg til annan informasjon.',
@@ -4107,7 +4651,7 @@
41084652 'checkuser-showlog' => 'Syn logg',
41094653 'checkuser-log' => 'Logg over brukarkontrollering',
41104654 'checkuser-query' => 'Søk i siste endringar',
4111 - 'checkuser-target' => 'Brukar eller IP',
 4655+ 'checkuser-target' => 'Brukar eller IP:',
41124656 'checkuser-users' => 'Hent brukarar',
41134657 'checkuser-edits' => 'Hent endringar frå IP',
41144658 'checkuser-ips' => 'Hent IP-ar',
@@ -4142,9 +4686,10 @@
41434687 'checkuser-block-failure' => "'''Ingen brukarar blokkerte.'''",
41444688 'checkuser-block-limit' => 'For mange brukarar er valte.',
41454689 'checkuser-block-noreason' => 'Du må oppgje ei blokkeringsårsak.',
 4690+ 'checkuser-noreason' => 'Du må gje opp ei grunngjeving for denne spørjinga.',
41464691 'checkuser-accounts' => '{{PLURAL:$1|Éin ny konto|$1 nye kontoar}}',
4147 - 'checkuser-too-many' => 'For mange resultat, ver venleg og reduser CIDR.
4148 -Her er IP-ene nytta (høgst 5000, sorterte etter adressa):',
 4692+ 'checkuser-too-many' => 'For mange resultat, (i høve til overslag for spørjinga) ver venleg og reduser CIDR.
 4693+Her er IP-ane nytta (høgst 5000, sorterte etter adressa):',
41494694 'checkuser-user-nonexistent' => 'Brukarnamnet du oppgav finst ikkje.',
41504695 'checkuser-search-form' => 'Finn loggelement der $1 er $2',
41514696 'checkuser-search-submit' => 'Søk',
@@ -4169,6 +4714,7 @@
41704715 * @author Finnrind
41714716 * @author Jon Harald Søby
41724717 * @author Laaknor
 4718+ * @author Nghtwlkr
41734719 */
41744720 $messages['no'] = array(
41754721 'checkuser-summary' => 'Dette verktøyet går gjennom siste endringer for å hente IP-ene som er brukt av en bruker, eller viser redigerings- eller brukerinformasjonen for en IP.
@@ -4179,6 +4725,7 @@
41804726 'checkuser-desc' => 'Gir brukere med de tilhørende rettighetene muligheten til å sjekke brukeres IP-adresser og annen informasjon',
41814727 'checkuser-logcase' => 'Loggsøket er sensitivt for store/små bokstaver.',
41824728 'checkuser' => 'Brukersjekk',
 4729+ 'checkuser-contribs' => 'kontrollér brukerens IP-adresser',
41834730 'group-checkuser' => 'IP-kontrollører',
41844731 'group-checkuser-member' => 'IP-kontrollør',
41854732 'right-checkuser' => 'Sjekke brukeres IP-adresser og annen informasjon',
@@ -4188,7 +4735,7 @@
41894736 'checkuser-showlog' => 'Vis logg',
41904737 'checkuser-log' => 'Brukersjekkingslogg',
41914738 'checkuser-query' => 'Søk i siste endringer',
4192 - 'checkuser-target' => 'Bruker eller IP',
 4739+ 'checkuser-target' => 'IP-adresse eller brukernavn:',
41934740 'checkuser-users' => 'Få brukere',
41944741 'checkuser-edits' => 'Få redigeringer fra IP',
41954742 'checkuser-ips' => 'Få IP-er',
@@ -4199,6 +4746,7 @@
42004747 'checkuser-week-2' => 'siste to uker',
42014748 'checkuser-month' => 'siste måned',
42024749 'checkuser-all' => 'alle',
 4750+ 'checkuser-cidr-label' => 'Finn felles adresseområde og påvirkede adresser for en liste over IP-adresser',
42034751 'checkuser-cidr-res' => 'Felles CIDR:',
42044752 'checkuser-empty' => 'Loggen inneholder ingen elementer.',
42054753 'checkuser-nomatch' => 'Ingen treff.',
@@ -4222,8 +4770,10 @@
42234771 'checkuser-block-failure' => "'''Ingen brukere blokkert.'''",
42244772 'checkuser-block-limit' => 'For mange brukere valgt.',
42254773 'checkuser-block-noreason' => 'Du må oppgi en blokkeringsgrunn.',
 4774+ 'checkuser-noreason' => 'Du må oppgi en grunn for denne spørringen.',
42264775 'checkuser-accounts' => '$1 {{PLURAL:$1|ny konto|nye kontoer}}',
4227 - 'checkuser-too-many' => 'For mange resultater, vennligst innskrenk CIDR. Her er de brukte IP-ene (maks 5000, sortert etter adresse):',
 4776+ 'checkuser-too-many' => 'For mange resultater (ifølge overslag for spørringen), vennligst innskrenk CIDR.
 4777+Her er de brukte IP-ene (maks 5000, sortert etter adresse):',
42284778 'checkuser-user-nonexistent' => 'Det gitte brukernavnet finnes ikke.',
42294779 'checkuser-search-form' => 'Finn loggelementer der $1 er $2',
42304780 'checkuser-search-submit' => 'Søk',
@@ -4268,7 +4818,6 @@
42694819
42704820 /** Occitan (Occitan)
42714821 * @author Cedric31
4272 - * @author IAlex
42734822 */
42744823 $messages['oc'] = array(
42754824 'checkuser-summary' => "Aqueste esplech passa en revista los cambiaments recents per recercar l'IPS emplegada per un utilizaire, mostrar totas las edicions fachas per una IP, o per enumerar los utilizaires qu'an emplegat las IPs. Los utilizaires e las modificacions pòdon èsser trobatss amb una IP XFF se s'acaba amb « /xff ». IPv4 (CIDR 16-32) e IPv6(CIDR 96-128) son suportats. Emplegatz aquò segon las cadenas de caractèrs.",
@@ -4285,7 +4834,7 @@
42864835 'checkuser-showlog' => 'Afichar lo jornal',
42874836 'checkuser-log' => "Notacion de Verificator d'utilizaire",
42884837 'checkuser-query' => 'Recèrca pels darrièrs cambiaments',
4289 - 'checkuser-target' => "Nom de l'utilizaire o IP",
 4838+ 'checkuser-target' => "Nom d'utilizaire o adreça IP :",
42904839 'checkuser-users' => 'Obténer los utilizaires',
42914840 'checkuser-edits' => "Obténer las modificacions de l'IP",
42924841 'checkuser-ips' => 'Obténer las adreças IP',
@@ -4320,8 +4869,10 @@
43214870 'checkuser-block-failure' => "'''Cap d'utilizaire pas blocat.'''",
43224871 'checkuser-block-limit' => "Tròp d'utilizaires seleccionats.",
43234872 'checkuser-block-noreason' => 'Vos cal especificar un motiu pels blocatges.',
 4873+ 'checkuser-noreason' => 'Vos cal balhar una rason per aquesta requèsta.',
43244874 'checkuser-accounts' => '$1 {{PLURAL:$1|compte novèl|comptes novèls}}',
4325 - 'checkuser-too-many' => 'Tròp de resultats. Limitatz la recèrca sus las adreças IP :',
 4875+ 'checkuser-too-many' => "Tròp de resultats (segon l'estimacion de la requèsta), afinatz l’espandida CIDR.
 4876+Vaquí un extrach de las IP utilizadas ({{formatnum:5000}} maximum, triadas per adreça) :",
43264877 'checkuser-user-nonexistent' => 'L’utilizaire indicat existís pas',
43274878 'checkuser-search-form' => 'Cercar lo jornal de las entradas ont $1 es $2.',
43284879 'checkuser-search-submit' => 'Recercar',
@@ -4373,11 +4924,27 @@
43744925 'checkuser-search' => 'Manintun',
43754926 );
43764927
 4928+/** Deitsch (Deitsch)
 4929+ * @author Xqt
 4930+ */
 4931+$messages['pdc'] = array(
 4932+ 'checkuser-reason' => 'Grund:',
 4933+ 'checkuser-target' => 'IP-Adress odder Yuusernaame:',
 4934+ 'checkuser-search' => 'Uffgucke',
 4935+ 'checkuser-week-1' => 'letscht Woch',
 4936+ 'checkuser-week-2' => 'letschte zwo Woche',
 4937+ 'checkuser-month' => 'letschte 30 Daag',
 4938+ 'checkuser-all' => 'all',
 4939+ 'checkuser-blocked' => 'aabunne',
 4940+ 'checkuser-search-submit' => 'Guck uff',
 4941+);
 4942+
43774943 /** Polish (Polski)
43784944 * @author Beau
43794945 * @author Derbeth
43804946 * @author Leinad
43814947 * @author Sp5uhe
 4948+ * @author Wpedzich
43824949 */
43834950 $messages['pl'] = array(
43844951 'checkuser-summary' => 'Narzędzie skanuje ostatnie zmiany, by odnaleźć adresy IP użyte przez użytkownika lub by pokazać edycje i użytkowników dla zadanego adresu IP.
@@ -4386,7 +4953,7 @@
43874954 Używaj tego narzędzia zgodnie z zasadami.',
43884955 'checkuser-desc' => 'Umożliwia uprawnionym użytkownikom sprawdzenie adresów IP użytkowników oraz innych informacji',
43894956 'checkuser-logcase' => 'Szukanie w rejestrze jest czułe na wielkość znaków.',
4390 - 'checkuser' => 'Sprawdzanie IP użytkownika',
 4957+ 'checkuser' => 'Sprawdź IP użytkownika',
43914958 'checkuser-contribs' => 'sprawdzić adresy IP użytkownika',
43924959 'group-checkuser' => 'CheckUser',
43934960 'group-checkuser-member' => 'checkuser',
@@ -4397,7 +4964,7 @@
43984965 'checkuser-showlog' => 'Pokaż rejestr',
43994966 'checkuser-log' => 'Rejestr CheckUser',
44004967 'checkuser-query' => 'Przeanalizuj ostatnie zmiany',
4401 - 'checkuser-target' => 'Użytkownik lub IP',
 4968+ 'checkuser-target' => 'Adres IP lub nazwa użytkownika',
44024969 'checkuser-users' => 'Znajdź użytkowników',
44034970 'checkuser-edits' => 'Znajdź edycje z IP',
44044971 'checkuser-ips' => 'Znajdź adresy IP',
@@ -4432,8 +4999,9 @@
44335000 'checkuser-block-failure' => "'''Brak zablokowanych użytkowników.'''",
44345001 'checkuser-block-limit' => 'Wybrano zbyt wielu użytkowników.',
44355002 'checkuser-block-noreason' => 'Należy podać powód blokad.',
 5003+ 'checkuser-noreason' => 'Musisz podać powód wykonania zapytania.',
44365004 'checkuser-accounts' => '$1 {{PLURAL:$1|nowe konto|nowe konta|nowych kont}}',
4437 - 'checkuser-too-many' => 'Zbyt wiele wyników, ogranicz CIDR.
 5005+ 'checkuser-too-many' => 'Zbyt wiele wyników (według szacunku zapytania); ogranicz CIDR.
44385006 Użytych adresów IP jest (nie więcej niż 5000, posortowane według adresu):',
44395007 'checkuser-user-nonexistent' => 'Taki użytkownik nie istnieje.',
44405008 'checkuser-search-form' => 'Szukaj wpisów w rejestrze, dla których $1 był $2',
@@ -4456,32 +5024,84 @@
44575025 );
44585026
44595027 /** Piedmontese (Piemontèis)
 5028+ * @author Borichèt
44605029 * @author Bèrto 'd Sèra
 5030+ * @author Dragonòt
44615031 */
44625032 $messages['pms'] = array(
44635033 'checkuser-summary' => "St'utiss-sì as passa j'ùltime modìfiche për tiré sù j'adrësse IP dovra da n'utent ò pura mostré lòn ch'as fa da n'adrëssa IP e che dat utent ch'a l'abia associà.
44645034 J'utent ch'a dòvro n'adrëssa IP e le modìfiche faite d'ambelelì as peulo tiresse sù ën dovrand le testà XFF, për felo tache-ie dapress l'adrëssa e \"/xff\". A travaja tant con la forma IPv4 (CIDR 16-32) che con cola IPv6 (CIDR 96-128).
44655035 Për na question ëd caria ëd travaj a tira nen sù pì che 5000 modìfiche. A va dovrà comforma a ij deuit për ël process ëd contròl.",
 5036+ 'checkuser-desc' => "A dà a j'utent con ij përmess aproprià la possibilità ëd controlé j'adrësse IP dj'utent e àutre anformassion",
44665037 'checkuser-logcase' => "L'arsërca ant ël registr a conta ëdcò maiùscole e minùscole.",
44675038 'checkuser' => "Contròl dj'utent",
 5039+ 'checkuser-contribs' => "contròla l'adrëssa IP ëd l'utent",
44685040 'group-checkuser' => 'Controlor',
44695041 'group-checkuser-member' => 'Controlor',
 5042+ 'right-checkuser' => "Contròla l'adrëssa IP ëd l'utent e àutre anformassion",
 5043+ 'right-checkuser-log' => 'Varda ël registr dël controlor',
44705044 'grouppage-checkuser' => "{{ns:project}}:Contròl dj'utent",
4471 - 'checkuser-reason' => 'Rason',
 5045+ 'checkuser-reason' => 'Rason:',
44725046 'checkuser-showlog' => 'Smon ël registr',
44735047 'checkuser-log' => "Registr dël contròl dj'utent",
44745048 'checkuser-query' => "Anterogassion dj'ùltime modìfiche",
4475 - 'checkuser-target' => 'Stranòm ò adrëssa IP',
 5049+ 'checkuser-target' => 'Adrëssa IP o nòm utent:',
44765050 'checkuser-users' => "Tira sù j'utent",
44775051 'checkuser-edits' => 'Tiré sù le modìfiche faite da na midema adrëssa IP',
44785052 'checkuser-ips' => "Tiré sù j'adrësse IP",
 5053+ 'checkuser-account' => 'Varda le modìfiche dël cont',
44795054 'checkuser-search' => 'Sërca',
 5055+ 'checkuser-period' => 'Durà:',
 5056+ 'checkuser-week-1' => 'ùltima sman-a',
 5057+ 'checkuser-week-2' => 'ùltime doe sman-e',
 5058+ 'checkuser-month' => 'ùltim 30 di',
 5059+ 'checkuser-all' => 'tut',
 5060+ 'checkuser-cidr-label' => "Treuva n'antërval comun e j'adrësse IP antëressà da na lista d'adrësse IP",
 5061+ 'checkuser-cidr-res' => 'CIDR comun:',
44805062 'checkuser-empty' => "Ës registr-sì a l'é veujd.",
44815063 'checkuser-nomatch' => 'A-i é pa gnun-a ròba parej.',
 5064+ 'checkuser-nomatch-edits' => "Gnun arzultà trovà.
 5065+L'ùltima modìfica a l'era ël $1 a $2.",
44825066 'checkuser-check' => 'Contròl',
44835067 'checkuser-log-fail' => 'I-i la fom nen a gionte-ie na riga ant sël registr',
44845068 'checkuser-nolog' => "Pa gnun registr ch'a sia trovasse.",
44855069 'checkuser-blocked' => 'Blocà',
 5070+ 'checkuser-gblocked' => 'Blocà globalment',
 5071+ 'checkuser-locked' => 'Sarà',
 5072+ 'checkuser-wasblocked' => 'Blocà già prima',
 5073+ 'checkuser-localonly' => 'Pa unificà',
 5074+ 'checkuser-massblock' => "Blòca j'utent selessionà",
 5075+ 'checkuser-massblock-text' => "Ij cont selessionà a saran blocà për sempe, con blocagi automàtich abilità e creassion ëd cont disabilità.
 5076+J'adrësse IP a saran blocà për 1 sman-a mach për j'adrësse IP e con creassion ëd cont disabilità.",
 5077+ 'checkuser-blocktag' => 'Rimpiassa le pàgine utent con:',
 5078+ 'checkuser-blocktag-talk' => 'Rimpiassa le pàgine ëd ciaciarada con:',
 5079+ 'checkuser-massblock-commit' => "Blòca j'utent selessionà",
 5080+ 'checkuser-block-success' => "'''{{PLURAL:$2|L'utent|J'utent}} $1 {{PLURAL:$2|a l'é|a son}} adess blocà.'''",
 5081+ 'checkuser-block-failure' => "'''Pa gnun utent blocà.'''",
 5082+ 'checkuser-block-limit' => 'Tròpi utent selessionà.',
 5083+ 'checkuser-block-noreason' => 'It deve dé na rason për ij blocagi.',
 5084+ 'checkuser-noreason' => 'It deve dé na rason për costa arcesta.',
 5085+ 'checkuser-accounts' => '$1 neuv {{PLURAL:$1|cont|cont}}',
 5086+ 'checkuser-too-many' => "Tròpi arzultà (scond la stima dl'arcesta), për piasì strenz ël CIDR.
 5087+Sì a-i son j'IP dovrà (5000 al pi, ordinà për adrëssa):",
 5088+ 'checkuser-user-nonexistent' => "L'utent specificà a esist pa.",
 5089+ 'checkuser-search-form' => "Treuva j'intrade dël registr andoa $1 a l'é $2",
 5090+ 'checkuser-search-submit' => 'Serca',
 5091+ 'checkuser-search-initiator' => 'inissiador',
 5092+ 'checkuser-search-target' => 'obietiv',
 5093+ 'checkuser-ipeditcount' => "~$1 da tùit j'utent",
 5094+ 'checkuser-log-subpage' => 'Registr',
 5095+ 'checkuser-log-return' => "Torna a la forma prinsipal dël Controlor dj'utent",
 5096+ 'checkuser-limited' => "'''Sti arzultà-sì a son ëstàit troncà për rason ëd prestassion.'''",
 5097+ 'checkuser-log-userips' => "$1 a l'ha pijà j'adrësse IP da $2",
 5098+ 'checkuser-log-ipedits' => "$1 a l'ha pijà le modìfiche për $2",
 5099+ 'checkuser-log-ipusers' => "$1 a l'ha pijà j'utent për $2",
 5100+ 'checkuser-log-ipedits-xff' => "$1 a l'ha pijà le modìfiche për XFF $2",
 5101+ 'checkuser-log-ipusers-xff' => "$1 a l'ha pijà j'utent për XFF $2",
 5102+ 'checkuser-log-useredits' => "$1 a l'ha otnù le modìfiche për $2",
 5103+ 'checkuser-autocreate-action' => "a l'é stàit creà automaticament",
 5104+ 'checkuser-email-action' => 'a l\'ha mandà un mëssagi ëd pòsta eletrònica a l\'utent "$1"',
 5105+ 'checkuser-reset-action' => 'torna amposté la ciav për l\'utent "$1"',
44865106 );
44875107
44885108 /** Pashto (پښتو)
@@ -4490,25 +5110,36 @@
44915111 $messages['ps'] = array(
44925112 'checkuser-reason' => 'سبب:',
44935113 'checkuser-showlog' => 'يادښت کتل',
4494 - 'checkuser-target' => 'کارونکی يا IP پته',
 5114+ 'checkuser-target' => 'کارن يا IP پته:',
44955115 'checkuser-search' => 'پلټل',
44965116 'checkuser-period' => 'موده:',
 5117+ 'checkuser-week-1' => 'تېره اوونۍ',
 5118+ 'checkuser-week-2' => 'تېرې دوه اوونۍ',
 5119+ 'checkuser-month' => 'تېرې ۳۰ ورځې',
44975120 'checkuser-all' => 'ټول',
 5121+ 'checkuser-block-limit' => 'له حد نه ډېر زيات کارنان ټاکل شوي.',
 5122+ 'checkuser-block-noreason' => 'د بنديز لګولو لپاره بايد تاسې يو سبب څرګند کړی.',
44985123 'checkuser-search-submit' => 'پلټل',
44995124 'checkuser-search-target' => 'موخه',
 5125+ 'checkuser-ipeditcount' => '~$1 د ټولو کارنانو نه',
45005126 'checkuser-log-subpage' => 'يادښت',
 5127+ 'checkuser-email-action' => 'د "$1" کارن ته يو برېښليک ولېږل شو',
 5128+ 'checkuser-reset-action' => 'د "$1" کارن د پټنوم بيا پرځای کول',
45015129 );
45025130
45035131 /** Portuguese (Português)
45045132 * @author 555
 5133+ * @author Hamilton Abreu
45055134 * @author Malafaya
45065135 * @author Sir Lestaty de Lioncourt
45075136 * @author Waldir
45085137 */
45095138 $messages['pt'] = array(
4510 - 'checkuser-summary' => 'Esta ferramenta varre as Mudanças recentes para obter os endereços de IP de um utilizador ou para exibir os dados de edições/utilizadores para um IP.
4511 - Utilizadores edições podem ser obtidos por um IP XFF colocando-se "/xff" no final do endereço. São suportados endereços IPv4 (CIDR 16-32) e IPv6 (CIDR 96-128).
4512 - Não serão retornadas mais de 5000 edições por motivos de desempenho. O uso desta ferramenta deverá estar de acordo com as políticas.',
 5139+ 'checkuser-summary' => 'Esta ferramenta varre as mudanças recentes para obter os endereços IP de um utilizador ou para apresentar os dados de edições/utilizadores para um determinado IP.
 5140+Os utilizadores e edições de um determinado IP, podem ser obtidos através de cabeçalhos XFF, acrescentando "/xff" no final do endereço.
 5141+São suportados endereços IPv4 (CIDR 16-32) e IPv6 (CIDR 96-128).
 5142+Por motivos de desempenho não serão fornecidas mais do que 5000 edições.
 5143+O uso desta ferramenta deverá respeitar as normas e recomendações.',
45135144 'checkuser-desc' => 'Concede a utilizadores com a permissão apropriada a possibilidade de verificar os endereços IP de um utilizador e outra informação',
45145145 'checkuser-logcase' => 'As buscas nos registos são sensíveis a letras maiúsculas ou minúsculas.',
45155146 'checkuser' => 'Verificar utilizador',
@@ -4516,13 +5147,13 @@
45175148 'group-checkuser' => 'CheckUser',
45185149 'group-checkuser-member' => 'CheckUser',
45195150 'right-checkuser' => 'Verificar o endereço IP de um utilizador e outras informações',
4520 - 'right-checkuser-log' => 'Ver os registros das verificações',
 5151+ 'right-checkuser-log' => 'Ver o registo das verificações de utilizador',
45215152 'grouppage-checkuser' => '{{ns:project}}:CheckUser',
4522 - 'checkuser-reason' => 'Motivo',
4523 - 'checkuser-showlog' => 'Exibir registos',
 5153+ 'checkuser-reason' => 'Motivo:',
 5154+ 'checkuser-showlog' => 'Mostrar registos',
45245155 'checkuser-log' => 'Registos de verificação de utilizadores',
45255156 'checkuser-query' => 'Examinar as Mudanças recentes',
4526 - 'checkuser-target' => 'Utilizador ou IP',
 5157+ 'checkuser-target' => 'Endereço IP ou nome do utilizador:',
45275158 'checkuser-users' => 'Obter utilizadores',
45285159 'checkuser-edits' => 'Obter edições de IPs',
45295160 'checkuser-ips' => 'Obter IPs',
@@ -4541,15 +5172,15 @@
45425173 A última edição foi em $1 às $2.',
45435174 'checkuser-check' => 'Verificar',
45445175 'checkuser-log-fail' => 'Não foi possível adicionar entradas ao registo',
4545 - 'checkuser-nolog' => 'Não foi encontrado um arquivo de registos.',
 5176+ 'checkuser-nolog' => 'Não foi encontrado nenhum ficheiro de registos.',
45465177 'checkuser-blocked' => 'Bloqueado',
45475178 'checkuser-gblocked' => 'Bloqueado globalmente',
45485179 'checkuser-locked' => 'Bloqueado',
45495180 'checkuser-wasblocked' => 'Previamente bloqueado',
45505181 'checkuser-localonly' => 'Não unificada',
45515182 'checkuser-massblock' => 'Bloquear utilizadores seleccionados',
4552 - 'checkuser-massblock-text' => 'As contas selecionadas serão bloqueadas indefinidamente, com bloqueio automático ativado e criação de conta desabilitada.
4553 -Endereços IP serão bloqueados por 1 semana com criação de conta desabilitada.',
 5183+ 'checkuser-massblock-text' => 'As contas seleccionadas serão bloqueadas indefinidamente, com o bloqueio automático activado e a criação de conta impossibilitada.
 5184+Endereços IP serão bloqueados por 1 semana com a criação de conta impossibilitada.',
45545185 'checkuser-blocktag' => 'Substituir páginas de utilizador com:',
45555186 'checkuser-blocktag-talk' => 'Substituir páginas de discussão por:',
45565187 'checkuser-massblock-commit' => 'Bloquear utilizadores seleccionados',
@@ -4557,8 +5188,10 @@
45585189 'checkuser-block-failure' => "'''Nenhum utilizador bloqueado.'''",
45595190 'checkuser-block-limit' => 'Demasiados utilizadores selecionados.',
45605191 'checkuser-block-noreason' => 'Tem de especificar um motivo para os bloqueios.',
 5192+ 'checkuser-noreason' => 'Deverá fornecer um motivo para esta pesquisa.',
45615193 'checkuser-accounts' => '$1 {{PLURAL:$1|nova conta|novas contas}}',
4562 - 'checkuser-too-many' => 'Demasiados resultados; por favor, restrinja o CIDR. Aqui estão os IPs usados (5000 no máx., ordenados por endereço):',
 5194+ 'checkuser-too-many' => 'Há demasiados resultados (segundo estimativa de pesquisa); por favor, restrinja o CIDR.
 5195+Aqui estão os IPs usados (5000 no máx., ordenados por endereço):',
45635196 'checkuser-user-nonexistent' => 'O utilizador especificado não existe.',
45645197 'checkuser-search-form' => 'Procurar entradas no registo onde $1 seja $2',
45655198 'checkuser-search-submit' => 'Procurar',
@@ -4574,33 +5207,36 @@
45755208 'checkuser-log-ipedits-xff' => '$1 obteve edições para o XFF $2',
45765209 'checkuser-log-ipusers-xff' => '$1 obteve utilizadores para o XFF $2',
45775210 'checkuser-log-useredits' => '$1 obteve edições de $2',
4578 - 'checkuser-autocreate-action' => 'foi automaticamente criada',
4579 - 'checkuser-email-action' => 'Enviar email para o utilizador "$1"',
4580 - 'checkuser-reset-action' => 'suprimir a senha do utilizador "$1"',
 5211+ 'checkuser-autocreate-action' => 'foi criada automaticamente',
 5212+ 'checkuser-email-action' => 'correio electrónico enviado para o utilizador "$1"',
 5213+ 'checkuser-reset-action' => 'foi reiniciada a palavra-chave do utilizador "$1"',
45815214 );
45825215
45835216 /** Brazilian Portuguese (Português do Brasil)
45845217 * @author Eduardo.mps
 5218+ * @author Heldergeovane
 5219+ * @author Jesielt
 5220+ * @author Luckas Blade
45855221 */
45865222 $messages['pt-br'] = array(
4587 - 'checkuser-summary' => 'Esta ferramenta varre as Mudanças recentes para obter os endereços de IP de um utilizador ou para exibir os dados de edições/utilizadores para um IP.
4588 -Utilizadores e edições podem ser obtidos por um IP XFF colocando-se "/xff" no final do endereço. São suportados endereços IPv4 (CIDR 16-32) e IPv6 (CIDR 96-128).
 5223+ 'checkuser-summary' => 'Esta ferramenta varre as Mudanças recentes para obter os endereços de IP de um usuário ou para exibir os dados de edições/usuários para um IP.
 5224+Usuários e edições podem ser obtidos por um IP XFF colocando-se "/xff" no final do endereço. São suportados endereços IPv4 (CIDR 16-32) e IPv6 (CIDR 96-128).
45895225 Não serão retornadas mais de 5000 edições por motivos de desempenho. O uso desta ferramenta deverá estar de acordo com as políticas.',
4590 - 'checkuser-desc' => 'Concede a utilizadores com a permissão apropriada a possibilidade de verificar os endereços IP de um utilizador e outras informações',
 5226+ 'checkuser-desc' => 'Concede a usuários com a permissão apropriada a possibilidade de verificar os endereços IP de um usuário e outras informações',
45915227 'checkuser-logcase' => 'As buscas nos registros são sensíveis a letras maiúsculas ou minúsculas.',
4592 - 'checkuser' => 'Verificar utilizador',
4593 - 'checkuser-contribs' => 'Verificar IPs do utilizador',
 5228+ 'checkuser' => 'Verificar usuário',
 5229+ 'checkuser-contribs' => 'Verificar IPs do usuário',
45945230 'group-checkuser' => 'CheckUser',
45955231 'group-checkuser-member' => 'CheckUser',
4596 - 'right-checkuser' => 'Verificar o endereço IP de um utilizador e outras informações',
 5232+ 'right-checkuser' => 'Verificar os endereços de IP de um usuários e outras informações',
45975233 'right-checkuser-log' => 'Ver os registros das verificações',
45985234 'grouppage-checkuser' => '{{ns:project}}:CheckUser',
45995235 'checkuser-reason' => 'Motivo',
46005236 'checkuser-showlog' => 'Exibir registros',
4601 - 'checkuser-log' => 'Registros de verificação de utilizadores',
 5237+ 'checkuser-log' => 'Registros de verificação de usuários',
46025238 'checkuser-query' => 'Examinar as Mudanças recentes',
4603 - 'checkuser-target' => 'Utilizador ou IP',
4604 - 'checkuser-users' => 'Obter utilizadores',
 5239+ 'checkuser-target' => 'Endereço IP ou nome do usuário:',
 5240+ 'checkuser-users' => 'Obter usuários',
46055241 'checkuser-edits' => 'Obter edições de IPs',
46065242 'checkuser-ips' => 'Obter IPs',
46075243 'checkuser-account' => 'Obter edições desta conta',
@@ -4624,36 +5260,37 @@
46255261 'checkuser-locked' => 'Bloqueado',
46265262 'checkuser-wasblocked' => 'Previamente bloqueado',
46275263 'checkuser-localonly' => 'Não unificada',
4628 - 'checkuser-massblock' => 'Bloquear utilizadores selecionados',
 5264+ 'checkuser-massblock' => 'Bloquear usuários selecionados',
46295265 'checkuser-massblock-text' => 'As contas selecionadas serão bloqueadas indefinidamente, com bloqueio automático ativado e criação de conta desabilitada.
46305266 Endereços IP serão bloqueados por 1 semana com criação de conta desabilitada.',
4631 - 'checkuser-blocktag' => 'Substituir páginas de utilizador com:',
 5267+ 'checkuser-blocktag' => 'Substituir páginas de usuário com:',
46325268 'checkuser-blocktag-talk' => 'Substituir páginas de discussão por:',
4633 - 'checkuser-massblock-commit' => 'Bloquear utilizadores selecionados',
4634 - 'checkuser-block-success' => "'''{{PLURAL:$2|O utilizador|Os utilizadores}} $1 {{PLURAL:$2|está|estão}} agora {{PLURAL:$2|bloqueado|bloqueados}}.'''",
4635 - 'checkuser-block-failure' => "'''Nenhum utilizador bloqueado.'''",
4636 - 'checkuser-block-limit' => 'Demasiados utilizadores selecionados.',
 5269+ 'checkuser-massblock-commit' => 'Bloquear usuários selecionados',
 5270+ 'checkuser-block-success' => "'''{{PLURAL:$2|O usuário|Os usuários}} $1 {{PLURAL:$2|está|estão}} agora {{PLURAL:$2|bloqueado|bloqueados}}.'''",
 5271+ 'checkuser-block-failure' => "'''Nenhum usuário bloqueado.'''",
 5272+ 'checkuser-block-limit' => 'Muitos usuários selecionados.',
46375273 'checkuser-block-noreason' => 'Você deve especificar um motivo para os bloqueios.',
 5274+ 'checkuser-noreason' => 'Você deve fornecer um motivo para esta pesquisa.',
46385275 'checkuser-accounts' => '$1 {{PLURAL:$1|nova conta|novas contas}}',
4639 - 'checkuser-too-many' => 'Demasiados resultados; por favor, restrinja o CIDR. Aqui estão os IPs usados (5000 no máx., ordenados por endereço):',
4640 - 'checkuser-user-nonexistent' => 'O utilizador especificado não existe.',
 5276+ 'checkuser-too-many' => 'Há muitos resultados; por favor, restrinja o CIDR. Aqui estão os IPs usados (5000 no máx., ordenados por endereço):',
 5277+ 'checkuser-user-nonexistent' => 'O usuário especificado não existe.',
46415278 'checkuser-search-form' => 'Procurar entradas no registo onde $1 seja $2',
46425279 'checkuser-search-submit' => 'Procurar',
46435280 'checkuser-search-initiator' => 'iniciador',
46445281 'checkuser-search-target' => 'alvo',
4645 - 'checkuser-ipeditcount' => '~$1 de todos os utilizadores',
 5282+ 'checkuser-ipeditcount' => '~$1 de todos os usuários',
46465283 'checkuser-log-subpage' => 'Registro',
46475284 'checkuser-log-return' => 'Retornar ao formulário principal de CheckUser',
46485285 'checkuser-limited' => "'''Estes resultados foram removidos por motivos de performance.'''",
46495286 'checkuser-log-userips' => '$1 obteve IPs de $2',
46505287 'checkuser-log-ipedits' => '$1 obteve edições de $2',
4651 - 'checkuser-log-ipusers' => '$1 obteve utilizadores de $2',
 5288+ 'checkuser-log-ipusers' => '$1 obteve usuários de $2',
46525289 'checkuser-log-ipedits-xff' => '$1 obteve edições para o XFF $2',
4653 - 'checkuser-log-ipusers-xff' => '$1 obteve utilizadores para o XFF $2',
 5290+ 'checkuser-log-ipusers-xff' => '$1 obteve usuários para o XFF $2',
46545291 'checkuser-log-useredits' => '$1 obteve edições de $2',
46555292 'checkuser-autocreate-action' => 'foi automaticamente criada',
4656 - 'checkuser-email-action' => 'Enviar email para o utilizador "$1"',
4657 - 'checkuser-reset-action' => 'suprimir a senha do utilizador "$1"',
 5293+ 'checkuser-email-action' => 'Enviar email para o usuário "$1"',
 5294+ 'checkuser-reset-action' => 'suprimir a senha do usuário "$1"',
46585295 );
46595296
46605297 /** Quechua (Runa Simi)
@@ -4709,9 +5346,13 @@
47105347 'checkuser-search-submit' => 'Tarzzut',
47115348 );
47125349
4713 -/** Rhaeto-Romance (Rumantsch) */
 5350+/** Rhaeto-Romance (Rumantsch)
 5351+ * @author Gion-andri
 5352+ */
47145353 $messages['rm'] = array(
4715 - 'checkuser-reason' => 'Motiv',
 5354+ 'checkuser-reason' => 'Motiv:',
 5355+ 'checkuser-showlog' => 'Mussar il log',
 5356+ 'checkuser-target' => "Utilisader u adressa d'IP",
47165357 'checkuser-search' => 'Tschertgar',
47175358 );
47185359
@@ -4729,6 +5370,7 @@
47305371 'checkuser-desc' => 'Autorizează utilizatorii cu drepturile specifice să poată verifica adresele IP şi alte informaţii',
47315372 'checkuser-logcase' => 'Căutarea în jurnal este sensibilă la majuscule - minuscule',
47325373 'checkuser' => 'Verifică utilizatorul',
 5374+ 'checkuser-contribs' => 'verifică IP-urile utilizatorilor',
47335375 'group-checkuser' => 'Checkuseri',
47345376 'group-checkuser-member' => 'Checkuser',
47355377 'right-checkuser' => 'Verifică adresele IP ale utilizatorilor şi alte informaţii',
@@ -4749,6 +5391,8 @@
47505392 'checkuser-week-2' => 'ultimele două săptămâni',
47515393 'checkuser-month' => 'ultimele 30 de zile',
47525394 'checkuser-all' => 'toate',
 5395+ 'checkuser-cidr-label' => 'Găseşte o serie comună şi adresele afectate pentru o listă de adrese IP',
 5396+ 'checkuser-cidr-res' => 'CIDR comun:',
47535397 'checkuser-empty' => 'Jurnalul nu conţine înregistrări.',
47545398 'checkuser-nomatch' => 'Nu au fost găsite potriviri.',
47555399 'checkuser-nomatch-edits' => 'Niciun rezultat.
@@ -4771,6 +5415,7 @@
47725416 'checkuser-block-failure' => "'''Niciun utilizator nu este blocat.'''",
47735417 'checkuser-block-limit' => 'Prea mulţi utilizatori selectaţi.',
47745418 'checkuser-block-noreason' => 'Trebuie să specificaţi un motiv pentru blocări.',
 5419+ 'checkuser-noreason' => 'Trebuie să specifici un motiv pentru această interogare.',
47755420 'checkuser-accounts' => '$1 {{PLURAL:$1|cont nou|conturi noi}}',
47765421 'checkuser-too-many' => 'Prea multe rezultate, te rog îngustează CIDR.
47775422 Iată IP-urile folosite (maxim 5000, sortate dup adresă):',
@@ -4806,9 +5451,14 @@
48075452 * @author Joetaras
48085453 */
48095454 $messages['roa-tara'] = array(
 5455+ 'checkuser' => 'Utende verificatore',
 5456+ 'group-checkuser' => 'Utinde verificature',
 5457+ 'group-checkuser-member' => 'Utende verificatore',
48105458 'grouppage-checkuser' => '{{ns:project}}:Utende ca verifiche',
48115459 'checkuser-reason' => 'Mutive:',
4812 - 'checkuser-target' => 'Utende o IP',
 5460+ 'checkuser-showlog' => "Fà vedè l'archivije",
 5461+ 'checkuser-query' => "Inderroghe l'urteme cangiaminde",
 5462+ 'checkuser-target' => 'Indirizze IP o utende:',
48135463 'checkuser-users' => "Pigghje l'utende",
48145464 'checkuser-edits' => "Pigghje le cangiaminde da l'IP",
48155465 'checkuser-ips' => "Pigghje l'IP",
@@ -4819,7 +5469,30 @@
48205470 'checkuser-week-2' => 'urteme doje sumane',
48215471 'checkuser-month' => 'urteme 30 giurne',
48225472 'checkuser-all' => 'tutte',
 5473+ 'checkuser-cidr-res' => 'CIDR Comune:',
 5474+ 'checkuser-empty' => "L'archivije non ge condène eleminde.",
 5475+ 'checkuser-nomatch' => "Non g'agghie acchiate ninde.",
 5476+ 'checkuser-nomatch-edits' => "Non g'agghie acchiate ninde.<br />
 5477+L'urteme cangiamende ha state fatte 'u $1 a le $2.",
 5478+ 'checkuser-check' => 'Verifiche',
 5479+ 'checkuser-nolog' => 'Nisciune archivije de file acchiate.',
 5480+ 'checkuser-blocked' => 'Bloccate',
 5481+ 'checkuser-gblocked' => 'Bloccate globbalmende',
 5482+ 'checkuser-locked' => 'Bloccate',
 5483+ 'checkuser-wasblocked' => 'Bloccate precedendemende',
 5484+ 'checkuser-localonly' => 'Non unificate',
 5485+ 'checkuser-massblock-commit' => "Bluecche l'utinde scacchiate",
 5486+ 'checkuser-block-success' => "'''L'{{PLURAL:$2|utende|utinde}} $1 {{PLURAL:$2|è|sonde}} bloccate.'''",
 5487+ 'checkuser-block-failure' => "'''Nisciune utende blccate.'''",
 5488+ 'checkuser-block-limit' => 'Troppe utinde scacchiate.',
 5489+ 'checkuser-block-noreason' => "Tu à dà 'nu mutive pe le blocche.",
 5490+ 'checkuser-noreason' => "Tu à dà 'nu mutive pe st'inderrogazione.",
 5491+ 'checkuser-user-nonexistent' => "L'utende specificate non g'esiste.",
48235492 'checkuser-search-submit' => 'Cirche',
 5493+ 'checkuser-search-initiator' => 'iniziatore',
 5494+ 'checkuser-search-target' => 'destinazione',
 5495+ 'checkuser-ipeditcount' => "~$1 da tutte l'utinde",
 5496+ 'checkuser-log-subpage' => 'Archivije',
48245497 'checkuser-log-userips' => '$1 ha pigghiete le IP pe $2',
48255498 'checkuser-log-ipedits' => '$1 ha pigghiete le cangiaminde pe $2',
48265499 'checkuser-log-ipusers' => '$1 ha pigghiete le utinde pe $2',
@@ -4827,20 +5500,26 @@
48285501 'checkuser-log-ipusers-xff' => '$1 ha pigghiete le utinde pe XFF $2',
48295502 'checkuser-log-useredits' => '$1 ha pigghiete le cangiaminde pe $2',
48305503 'checkuser-autocreate-action' => 'ha state ccrejete automaticamende',
 5504+ 'checkuser-email-action' => 'mannate \'na mail a l\'utende "$1"',
 5505+ 'checkuser-reset-action' => 'azzere \'a password pe l\'utende "$1"',
48315506 );
48325507
48335508 /** Russian (Русский)
 5509+ * @author DCamer
48345510 * @author EugeneZelenko
48355511 * @author Ferrer
 5512+ * @author Ilya Voyager
48365513 * @author Kaganer
 5514+ * @author Kv75
48375515 * @author Lockal
 5516+ * @author Prima klasy4na
48385517 * @author Putnik
48395518 * @author Silence
48405519 * @author Александр Сигачёв
48415520 */
48425521 $messages['ru'] = array(
48435522 'checkuser-summary' => "Данный инструмент может быть использован, чтобы получить IP-адреса, использовавшиеся участником, либо чтобы показать правки/участников, работавших с IP-адреса.
4844 -Правки и пользователи, которые правили с определённого IP-адреса, указанного в X-Forwarded-For, можно получить, добавив префикс <code>/xff</code> к IP-адресу. Поддерживаемые версии IP: 4 (CIDR 16—32) и 6 (CIDR 96—128).
 5523+Правки и пользователи, которые правили с определённого IP-адреса, указанного в X-Forwarded-For, можно получить, добавив постфикс <code>/xff</code> к IP-адресу. Поддерживаемые версии IP: 4 (CIDR 16—32) и 6 (CIDR 96—128).
48455524 Из соображений производительности будут показаны только первые 5000 правок.
48465525 Используйте эту страницу '''только в соответствии с правилами'''.",
48475526 'checkuser-desc' => 'Предоставляет возможность проверять IP-адреса и дополнительную информацию участников',
@@ -4856,7 +5535,7 @@
48575536 'checkuser-showlog' => 'Показать журнал',
48585537 'checkuser-log' => 'Журнал проверки участников',
48595538 'checkuser-query' => 'Запросить свежие правки',
4860 - 'checkuser-target' => 'Участник или IP-адрес',
 5539+ 'checkuser-target' => 'IP-адрес или имя участника:',
48615540 'checkuser-users' => 'Получить участников',
48625541 'checkuser-edits' => 'Запросить правки, сделанные с IP-адреса',
48635542 'checkuser-ips' => 'Запросить IP-адреса',
@@ -4871,14 +5550,14 @@
48725551 'checkuser-cidr-res' => 'Общая CIDR:',
48735552 'checkuser-empty' => 'Журнал пуст.',
48745553 'checkuser-nomatch' => 'Совпадений не найдено.',
4875 - 'checkuser-nomatch-edits' => 'Соответствий не найдено.
 5554+ 'checkuser-nomatch-edits' => 'Совпадений не найдено.
48765555 Последняя правка сделана $1 в $2.',
48775556 'checkuser-check' => 'Проверить',
48785557 'checkuser-log-fail' => 'Невозможно добавить запись в журнал',
48795558 'checkuser-nolog' => 'Файл журнала не найден.',
48805559 'checkuser-blocked' => 'Заблокирован',
48815560 'checkuser-gblocked' => 'Заблокирован глобально',
4882 - 'checkuser-locked' => 'Лишён доп. возможностей',
 5561+ 'checkuser-locked' => 'Закрыт',
48835562 'checkuser-wasblocked' => 'Подвергался блокировке',
48845563 'checkuser-localonly' => 'Не глобальная',
48855564 'checkuser-massblock' => 'Заблокировать выбранных участников',
@@ -4891,8 +5570,10 @@
48925571 'checkuser-block-failure' => "'''Нет заблокированных участников.'''",
48935572 'checkuser-block-limit' => 'Выбрано слишком много участников.',
48945573 'checkuser-block-noreason' => 'Вы должны указать причину блокировок.',
 5574+ 'checkuser-noreason' => 'Вы должны указать причину для этого запроса.',
48955575 'checkuser-accounts' => '$1 {{PLURAL:$1|новая учётная запись|новых учётных записи|новых учётных записей}}',
4896 - 'checkuser-too-many' => 'Слишком много результатов, пожалуйста, сузьте CIDR. Использованные IP (максимум 5000, отсортировано по адресу):',
 5576+ 'checkuser-too-many' => 'Слишком много результатов (согласно оценке запроса), пожалуйста, сузьте CIDR.
 5577+Использованные IP (максимум 5000, отсортировано по адресу):',
48975578 'checkuser-user-nonexistent' => 'Указанного участника не существует',
48985579 'checkuser-search-form' => 'Найти записи журнала, где $1 является $2',
48995580 'checkuser-search-submit' => 'Найти',
@@ -4968,6 +5649,7 @@
49695650 'checkuser-block-failure' => "'''Бобуллубут кыттааччы суох.'''",
49705651 'checkuser-block-limit' => 'Наһаа элбэх киһини талбыккын',
49715652 'checkuser-block-noreason' => 'Бобуу төрүөтүн этиэхтээххин.',
 5653+ 'checkuser-noreason' => 'Бу ыйытык төрүөтүн ааттыахтааххын.',
49725654 'checkuser-accounts' => '$1 саҥа {{PLURAL:$1|аат|ааттар}}',
49735655 'checkuser-too-many' => 'Наһаа элбэх булулунна, бука диэн CIDR кыччатан биэр. Туһаныллыбыт IP (саамай элбэҕэ 5000, бу аадырыһынан наардаммыт):',
49745656 'checkuser-user-nonexistent' => 'Маннык ааттаах кыттааччы суох',
@@ -5007,6 +5689,7 @@
50085690 );
50095691
50105692 /** Sicilian (Sicilianu)
 5693+ * @author Melos
50115694 * @author Santu
50125695 */
50135696 $messages['scn'] = array(
@@ -5014,6 +5697,7 @@
50155698 'checkuser-desc' => "Pirmetti a l'utenti cu li giusti autorizzazzioni du suttapuniri a virifica li nnirizzi IP e àutri nfurmazzioni di l'utenti stissi",
50165699 'checkuser-logcase' => "La circata nnê log è ''case sensitive'' (diffirènzia ntra maiùsculi e minùsculi)",
50175700 'checkuser' => 'Cuntrolli utenzi',
 5701+ 'checkuser-contribs' => "cuntrolla l'indirizzi IP dô utenti",
50185702 'group-checkuser' => 'Cuntrullori',
50195703 'group-checkuser-member' => 'Cuntrullori',
50205704 'right-checkuser' => "Talìa li nnirizzi IP usati di l'utenti a àutri nfurmazzioni",
@@ -5034,6 +5718,8 @@
50355719 'checkuser-week-2' => 'ùrtimi dui simani',
50365720 'checkuser-month' => 'ùrtimi 30 jorna',
50375721 'checkuser-all' => 'tutti li canciamenti',
 5722+ 'checkuser-cidr-label' => "Trova l'intervallu e l'indirizzi intirissati pi na lista di IP",
 5723+ 'checkuser-cidr-res' => 'CIDR comuni:',
50385724 'checkuser-empty' => 'Lu log non havi dati.',
50395725 'checkuser-nomatch' => 'Nuddu risurtatu attruvatu.',
50405726 'checkuser-nomatch-edits' => 'Nuddu risurtatu attruvatu.
@@ -5056,6 +5742,7 @@
50575743 'checkuser-block-failure' => "'''Nuddu utenti bluccatu.'''",
50585744 'checkuser-block-limit' => 'Troppi utenti silizziunati.',
50595745 'checkuser-block-noreason' => 'È òbbricu dari na mutivazzioni pi li blocchi.',
 5746+ 'checkuser-noreason' => 'Havi a ndicari nu mutivu pi sta query.',
50605747 'checkuser-accounts' => '$1 {{PLURAL:$1|novo|novi}} account',
50615748 'checkuser-too-many' => "Li nùmmira dî risulrtati è troppu assai, usari nu CIDR cchiù nicu. Si sècutu sù nnicati li nnirizzi IP utilizzati (nzinu a non chiossai di 5000, misi 'n òrdini pi nnirizzu):",
50625749 'checkuser-user-nonexistent' => "L'utenti nnicatu non esisti.",
@@ -5127,7 +5814,7 @@
51285815 'checkuser-showlog' => 'Zobraziť záznam',
51295816 'checkuser-log' => 'Záznam kontroly používateľov',
51305817 'checkuser-query' => 'Získať z posledných úprav',
5131 - 'checkuser-target' => 'Používateľ alebo IP',
 5818+ 'checkuser-target' => 'IP adresa alebo meno používateľa:',
51325819 'checkuser-users' => 'Získať používateľov',
51335820 'checkuser-edits' => 'Získať úpravy z IP',
51345821 'checkuser-ips' => 'Získať IP adresy',
@@ -5162,8 +5849,10 @@
51635850 'checkuser-block-failure' => "'''Žiaden používateľ nebol zablokovaný.'''",
51645851 'checkuser-block-limit' => 'Bolo zvolených príliš veľa používateľov.',
51655852 'checkuser-block-noreason' => 'Musíte zadať dôvod blokovaní.',
 5853+ 'checkuser-noreason' => 'Musíte uviesť dôvod tejto požiadavky.',
51665854 'checkuser-accounts' => '$1 {{PLURAL:$1|nový účet|nové účty|nových účtov}}',
5167 - 'checkuser-too-many' => 'Príliš veľa výsledkov, prosím zúžte CIDR. Tu sú použité IP (max. 5 000, zoradené podľa adresy):',
 5855+ 'checkuser-too-many' => 'Príliš veľa výsledkov (podľa odhadu požiadavky), prosím zúžte CIDR.
 5856+Tu sú použité IP (max. 5 000, zoradené podľa adresy):',
51685857 'checkuser-user-nonexistent' => 'Uvedený používateľ neexistuje.',
51695858 'checkuser-search-form' => 'Nájsť položky záznamu, kde $1 je $2',
51705859 'checkuser-search-submit' => 'Hľadať',
@@ -5191,16 +5880,22 @@
51925881 'checkuser' => 'Kontrollo përdoruesin',
51935882 );
51945883
5195 -/** Serbian Cyrillic ekavian (ћирилица)
 5884+/** Serbian Cyrillic ekavian (Српски (ћирилица))
51965885 * @author Millosh
51975886 * @author Sasa Stefanovic
 5887+ * @author Verlor
51985888 * @author Јованвб
51995889 * @author Михајло Анђелковић
 5890+ * @author Обрадовић Горан
52005891 */
52015892 $messages['sr-ec'] = array(
 5893+ 'checkuser-summary' => 'Ова алатка прегледа скорашње измене и враћа IP адресе које је корисник користио или показује податке о кориснику/изменама за дати IP. Корисници и измене клијентског IP се могу добавити преко XFF заглавља додавањем "/xff" иза IP. Подржани су формати IPv4 (CIDR 16-32) и IPv6 (CIDR 96-128).
 5894+Због перформанси неће бити враћено више од 5000 измена.
 5895+Алатку користите у складу са политиком.',
52025896 'checkuser-desc' => 'Даје сарадницима са одговарајућим правима могућност да провере ИП адресе сарадника и друге информације.',
52035897 'checkuser-logcase' => 'Претрага лога је осетљива на мала и велика слова.',
52045898 'checkuser' => 'Чекјузер',
 5899+ 'checkuser-contribs' => 'Провери корисникове IP адресе.',
52055900 'group-checkuser' => 'Чекјузери',
52065901 'group-checkuser-member' => 'Чекјузер',
52075902 'right-checkuser' => 'Проверава сарадничке ИП адресе и друге информације.',
@@ -5210,7 +5905,7 @@
52115906 'checkuser-showlog' => 'Прикажи лог.',
52125907 'checkuser-log' => 'Лог чекјузера.',
52135908 'checkuser-query' => 'Упит на скорашње измене.',
5214 - 'checkuser-target' => 'Корисник или ИП',
 5909+ 'checkuser-target' => 'Корисничко име или ИП адреса',
52155910 'checkuser-users' => 'Прикупљање сарадничких имена.',
52165911 'checkuser-edits' => 'Прикупљање измена од стране ИП адресе.',
52175912 'checkuser-ips' => 'Прикупља ИП адресе.',
@@ -5221,8 +5916,12 @@
52225917 'checkuser-week-2' => 'последње две недеље',
52235918 'checkuser-month' => 'последњих 30 дана',
52245919 'checkuser-all' => 'све',
 5920+ 'checkuser-cidr-label' => 'Пронађи уобичајени опсег и захваћене адресе за списак IP адреса.',
 5921+ 'checkuser-cidr-res' => 'Уобичајени CIDR',
52255922 'checkuser-empty' => 'Лог не садржи ништа.',
52265923 'checkuser-nomatch' => 'Нема погодака.',
 5924+ 'checkuser-nomatch-edits' => 'Нису нађена поклапања.
 5925+Последња измена је била на $1 у $2.',
52275926 'checkuser-check' => 'Провера',
52285927 'checkuser-log-fail' => 'Није било могуће додати податак у лог.',
52295928 'checkuser-nolog' => 'Ниједан фајл с логовима није пронађен.',
@@ -5232,6 +5931,8 @@
52335932 'checkuser-wasblocked' => 'Претходно блокиран',
52345933 'checkuser-localonly' => 'Није унифицирано',
52355934 'checkuser-massblock' => 'Блокирај изабраног корисника',
 5935+ 'checkuser-massblock-text' => 'Изабрани налози ће бити блокирани на неодређено, уз обележене опције аутоблокирања и забране прављења налога.
 5936+IP адресе ће бити блокиране на недељу дана за IP кориснике, уз забрану прављења налога.',
52365937 'checkuser-blocktag' => 'Замени корисничке странице са:',
52375938 'checkuser-blocktag-talk' => 'Замени стране за разговор са:',
52385939 'checkuser-massblock-commit' => 'Блокирај изабраног корисника',
@@ -5239,8 +5940,10 @@
52405941 'checkuser-block-failure' => "'''Нема блокираних корисника.'''",
52415942 'checkuser-block-limit' => 'Превише корисника је изабрано.',
52425943 'checkuser-block-noreason' => 'Морате дати разлог за блок.',
 5944+ 'checkuser-noreason' => 'Морате да наведете разлог за овај упит.',
52435945 'checkuser-accounts' => '$1 {{PLURAL:$1|нови налог|нових налога}}',
5244 - 'checkuser-too-many' => 'Превише резултата; смањи CIDR. Ево списка коришћених ИП адреса (максимално 5000, сортирано по адреси):',
 5946+ 'checkuser-too-many' => 'Нађено је превише резултата (према процени захтева). Молимо Вас да сузите CIDR.
 5947+Овде су коришћене IP адресе (највише 5.000, сортираних по адреси):',
52455948 'checkuser-user-nonexistent' => 'Тражени сарадник не постоји.',
52465949 'checkuser-search-form' => 'Претрага лога где је $1 једнако $2.',
52475950 'checkuser-search-submit' => 'Претрага',
@@ -5249,6 +5952,7 @@
52505953 'checkuser-ipeditcount' => '~$1 од свих сарадника',
52515954 'checkuser-log-subpage' => 'лог',
52525955 'checkuser-log-return' => 'Повратак на основну форму чекјузера.',
 5956+ 'checkuser-limited' => "'''Ови резултати су скраћени због перформанси.'''",
52535957 'checkuser-log-userips' => '$1 је добио ИП адресе за $2',
52545958 'checkuser-log-ipedits' => '$1 је добио измене за $2',
52555959 'checkuser-log-ipusers' => '$1 је добио сараднике за $2',
@@ -5260,12 +5964,84 @@
52615965 'checkuser-reset-action' => 'обнови лозинку за корисника "$1"',
52625966 );
52635967
5264 -/** latinica (latinica) */
 5968+/** Serbian Latin ekavian (Srpski (latinica))
 5969+ * @author Michaello
 5970+ * @author Михајло Анђелковић
 5971+ */
52655972 $messages['sr-el'] = array(
 5973+ 'checkuser-summary' => 'Ova alatka pregleda skorašnje izmene i vraća IP adrese koje je korisnik koristio ili pokazuje podatke o korisniku/izmenama za dati IP. Korisnici i izmene klijentskog IP se mogu dobaviti preko XFF zaglavlja dodavanjem "/xff" iza IP. Podržani su formati IPv4 (CIDR 16-32) i IPv6 (CIDR 96-128).
 5974+Zbog performansi neće biti vraćeno više od 5000 izmena.
 5975+Alatku koristite u skladu sa politikom.',
 5976+ 'checkuser-desc' => 'Daje saradnicima sa odgovarajućim pravima mogućnost da provere IP adrese saradnika i druge informacije.',
 5977+ 'checkuser-logcase' => 'Pretraga loga je osetljiva na mala i velika slova.',
52665978 'checkuser' => 'Čekjuzer',
 5979+ 'checkuser-contribs' => 'Proveri korisnikove IP adrese.',
52675980 'group-checkuser' => 'Čekjuzeri',
52685981 'group-checkuser-member' => 'Čekjuzer',
 5982+ 'right-checkuser' => 'Proverava saradničke IP adrese i druge informacije.',
 5983+ 'right-checkuser-log' => 'Pogledaj čekjuzer log',
52695984 'grouppage-checkuser' => '{{ns:project}}:Čekjuzer',
 5985+ 'checkuser-reason' => 'Rezlog:',
 5986+ 'checkuser-showlog' => 'Prikaži log.',
 5987+ 'checkuser-log' => 'Log čekjuzera.',
 5988+ 'checkuser-query' => 'Upit na skorašnje izmene.',
 5989+ 'checkuser-target' => 'Korisnik ili IP',
 5990+ 'checkuser-users' => 'Prikupljanje saradničkih imena.',
 5991+ 'checkuser-edits' => 'Prikupljanje izmena od strane IP adrese.',
 5992+ 'checkuser-ips' => 'Prikuplja IP adrese.',
 5993+ 'checkuser-account' => 'Preuzmi izmene naloga',
 5994+ 'checkuser-search' => 'Pretraga',
 5995+ 'checkuser-period' => 'Trajanje:',
 5996+ 'checkuser-week-1' => 'poslednja nedelja',
 5997+ 'checkuser-week-2' => 'poslednje dve nedelje',
 5998+ 'checkuser-month' => 'poslednjih 30 dana',
 5999+ 'checkuser-all' => 'sve',
 6000+ 'checkuser-cidr-label' => 'Pronađi uobičajeni opseg i zahvaćene adrese za spisak IP adresa.',
 6001+ 'checkuser-cidr-res' => 'Uobičajeni CIDR',
 6002+ 'checkuser-empty' => 'Log ne sadrži ništa.',
 6003+ 'checkuser-nomatch' => 'Nema pogodaka.',
 6004+ 'checkuser-nomatch-edits' => 'Nisu nađena poklapanja.
 6005+Poslednja izmena je bila na $1 u $2.',
 6006+ 'checkuser-check' => 'Provera',
 6007+ 'checkuser-log-fail' => 'Nije bilo moguće dodati podatak u log.',
 6008+ 'checkuser-nolog' => 'Nijedan fajl s logovima nije pronađen.',
 6009+ 'checkuser-blocked' => 'Blokiran',
 6010+ 'checkuser-gblocked' => 'Blokiran globalno',
 6011+ 'checkuser-locked' => 'Zaključano',
 6012+ 'checkuser-wasblocked' => 'Prethodno blokiran',
 6013+ 'checkuser-localonly' => 'Nije unificirano',
 6014+ 'checkuser-massblock' => 'Blokiraj izabranog korisnika',
 6015+ 'checkuser-massblock-text' => 'Izabrani nalozi će biti blokirani na neodređeno, uz obeležene opcije autoblokiranja i zabrane pravljenja naloga.
 6016+IP adrese će biti blokirane na nedelju dana za IP korisnike, uz zabranu pravljenja naloga.',
 6017+ 'checkuser-blocktag' => 'Zameni korisničke stranice sa:',
 6018+ 'checkuser-blocktag-talk' => 'Zameni strane za razgovor sa:',
 6019+ 'checkuser-massblock-commit' => 'Blokiraj izabranog korisnika',
 6020+ 'checkuser-block-success' => "'''{{PLURAL:$2|Korisnik|Korisnici}} $1 {{PLURAL:$2|je sada blokiran|su sada blokirani}}.'''",
 6021+ 'checkuser-block-failure' => "'''Nema blokiranih korisnika.'''",
 6022+ 'checkuser-block-limit' => 'Previše korisnika je izabrano.',
 6023+ 'checkuser-block-noreason' => 'Morate dati razlog za blok.',
 6024+ 'checkuser-noreason' => 'Morate da navedete razlog za ovaj upit.',
 6025+ 'checkuser-accounts' => '$1 {{PLURAL:$1|novi nalog|novih naloga}}',
 6026+ 'checkuser-too-many' => 'Nađeno je previše rezultata (prema proceni zahteva). Molimo Vas da suzite CIDR.
 6027+Ovde su korišćene IP adrese (najviše 5.000, sortiranih po adresi):',
 6028+ 'checkuser-user-nonexistent' => 'Traženi saradnik ne postoji.',
 6029+ 'checkuser-search-form' => 'Pretraga loga gde je $1 jednako $2.',
 6030+ 'checkuser-search-submit' => 'Pretraga',
 6031+ 'checkuser-search-initiator' => 'pokretač',
 6032+ 'checkuser-search-target' => 'cilj',
 6033+ 'checkuser-ipeditcount' => '~$1 od svih saradnika',
 6034+ 'checkuser-log-subpage' => 'log',
 6035+ 'checkuser-log-return' => 'Povratak na osnovnu formu čekjuzera.',
 6036+ 'checkuser-limited' => "'''Ovi rezultati su skraćeni zbog performansi.'''",
 6037+ 'checkuser-log-userips' => '$1 je dobio IP adrese za $2',
 6038+ 'checkuser-log-ipedits' => '$1 je dobio izmene za $2',
 6039+ 'checkuser-log-ipusers' => '$1 je dobio saradnike za $2',
 6040+ 'checkuser-log-ipedits-xff' => '$1 je dobio izmene za XFF $2',
 6041+ 'checkuser-log-ipusers-xff' => '$1 je dobio saradnike za XFF $2',
 6042+ 'checkuser-log-useredits' => '$1 preuzeo izmene od $2',
 6043+ 'checkuser-autocreate-action' => 'je automatski napravljen',
 6044+ 'checkuser-email-action' => 'poslat je mejl korisniku "$1"',
 6045+ 'checkuser-reset-action' => 'obnovi lozinku za korisnika "$1"',
52706046 );
52716047
52726048 /** Seeltersk (Seeltersk)
@@ -5280,6 +6056,7 @@
52816057 'checkuser-desc' => 'Ferlööwet Benutsere mäd do äntspreekende Gjuchte do IP-Adressen as uk wiedere Informatione fon Benutsere tou wröigjen.',
52826058 'checkuser-logcase' => 'Ju Säike in dät Logbouk unnerschat twiske Groot- un Littikschrieuwen.',
52836059 'checkuser' => 'Checkuser',
 6060+ 'checkuser-contribs' => 'IP-Adrässen Benutser wröigje',
52846061 'group-checkuser' => 'Checkusers',
52856062 'group-checkuser-member' => 'Checkuser-Begjuchtigde',
52866063 'right-checkuser' => 'Wröigenge fon IP-Adressen as uk Ferbiendengen twiske IPs un ounmäldede Benutsere',
@@ -5323,6 +6100,7 @@
53246101 'checkuser-block-failure' => "'''Der wuuden neen Benutsere speerd.'''",
53256102 'checkuser-block-limit' => 'Der wuuden toufuul Benutsere uutwääld.',
53266103 'checkuser-block-noreason' => 'Du moast n Gruund foar ju Speere anreeke.',
 6104+ 'checkuser-noreason' => 'Foar disse Oufroage mout ne Begruundenge ounroat wäide.',
53276105 'checkuser-accounts' => '{{PLURAL:$1|1 näi Benutserkonto|$1 näie Benutserkonten}}',
53286106 'checkuser-too-many' => 'Ju Lieste fon Resultoate is tou loang, gränsje dän IP-Beräk fääre ien. Hier sunt do benutsede IP-Adressen (maximoal 5000, sortierd ätter Adresse):',
53296107 'checkuser-user-nonexistent' => 'Die anroate Benutser bestoant nit.',
@@ -5356,7 +6134,7 @@
53576135 'group-checkuser' => 'Pamaké pamariksa',
53586136 'group-checkuser-member' => 'Pamaké pamariksa',
53596137 'grouppage-checkuser' => '{{ns:project}}:Pamaké pamariksa',
5360 - 'checkuser-reason' => 'Alesan',
 6138+ 'checkuser-reason' => 'Alesan:',
53616139 'checkuser-showlog' => 'Témbongkeun log',
53626140 'checkuser-log' => 'Log PamakéPamariksa',
53636141 'checkuser-target' => 'Landihan atawa IP',
@@ -5394,6 +6172,7 @@
53956173 * @author M.M.S.
53966174 * @author MagnusA
53976175 * @author Najami
 6176+ * @author Per
53986177 */
53996178 $messages['sv'] = array(
54006179 'checkuser-summary' => 'Det här verktyget söker igenom de senaste ändringarna för att hämta IP-adresser för en användare, eller redigeringar och användare för en IP-adress.
@@ -5412,7 +6191,7 @@
54136192 'checkuser-showlog' => 'Visa logg',
54146193 'checkuser-log' => 'Logg över användarkontroller',
54156194 'checkuser-query' => 'Sök de senaste ändringarna',
5416 - 'checkuser-target' => 'Användare eller IP',
 6195+ 'checkuser-target' => 'IP-adress eller användarnamn:',
54176196 'checkuser-users' => 'Hämta användare',
54186197 'checkuser-edits' => 'Hämta redigeringar från IP-adress',
54196198 'checkuser-ips' => 'Hämta IP-adresser',
@@ -5447,8 +6226,9 @@
54486227 'checkuser-block-failure' => "'''Ingen användare blockerades.'''",
54496228 'checkuser-block-limit' => 'För många användare valda.',
54506229 'checkuser-block-noreason' => 'Du måste ange en anledning för blockeringarna.',
 6230+ 'checkuser-noreason' => 'Du måste uppge en anledning för den här frågan.',
54516231 'checkuser-accounts' => '$1 {{PLURAL:$1|nytt konto|nya konton}}',
5452 - 'checkuser-too-many' => 'För många resultat, du bör söka i ett mindre CIDR-block. Här följer de IP-adresser som använts (högst 5000, sorterade efter adress):',
 6232+ 'checkuser-too-many' => 'För många resultat (enligt uppskattning), du bör söka i ett mindre CIDR-block. Här följer de IP-adresser som använts (högst 5000, sorterade efter adress):',
54536233 'checkuser-user-nonexistent' => 'Användarnamnet som angavs finns inte.',
54546234 'checkuser-search-form' => 'Sök efter poster där $1 är $2',
54556235 'checkuser-search-submit' => 'Sök',
@@ -5507,7 +6287,7 @@
55086288 'checkuser-showlog' => 'చిట్టాని చూపించు',
55096289 'checkuser-log' => 'వాడుకరిపరిశీలనల చిట్టా',
55106290 'checkuser-query' => 'ఇటీవలి మార్పుల్లో చూడండి',
5511 - 'checkuser-target' => 'వాడుకరి లేదా ఐపీ',
 6291+ 'checkuser-target' => 'ఐపీ చిరునామా లేదా వాడుకరిపేరు:',
55126292 'checkuser-users' => 'వాడుకరులను తీసుకురా',
55136293 'checkuser-edits' => 'ఈ ఐపీ అడ్రస్సు నుండి చేసిన మార్పులను చూపించు',
55146294 'checkuser-ips' => 'ఐపీలను తీసుకురా',
@@ -5523,9 +6303,17 @@
55246304 'checkuser-log-fail' => 'చిట్టాలో పద్దుని చేర్చలేకపోయాం',
55256305 'checkuser-nolog' => 'చిట్టా ఫైలేమీ కనపడలేదు.',
55266306 'checkuser-blocked' => 'నిరోధించాం',
 6307+ 'checkuser-gblocked' => 'సార్వత్రికంగా నిరోధించారు',
 6308+ 'checkuser-wasblocked' => 'గతంలో నిరోధించబడ్డారు',
 6309+ 'checkuser-massblock' => 'ఎంచుకున్న వాడుకరులను నిరోధించు',
 6310+ 'checkuser-massblock-commit' => 'ఎంచుకున్న వాడుకరులను నిరోధించు',
 6311+ 'checkuser-block-success' => "'''{{PLURAL:$2|వాడుకరి|వాడుకరులు}} $1 ఇప్పుడు {{PLURAL:$2|నిరోధించబడ్డారు|నిరోధించబడ్డారు}}.'''",
 6312+ 'checkuser-block-limit' => 'చాలా మంది వాడుకరులను ఎంచుకున్నారు.',
 6313+ 'checkuser-block-noreason' => 'ఈ నిరోధాలకి మీరు తప్పనిసరిగా కారణం ఇవ్వాలి.',
 6314+ 'checkuser-accounts' => '$1 కొత్త {{PLURAL:$1|ఖాతా|ఖాతాలు}}',
55276315 'checkuser-too-many' => 'మరీ ఎక్కువ ఫలితాలొచ్చాయి. CIDR ను మరింత కుదించండి. వాడిన ఐపీలివిగో (గరిష్ఠంగా 5000 -అడ్రసు వారీగా పేర్చి)',
55286316 'checkuser-user-nonexistent' => 'ఆ వాడుకరి ఉనికిలో లేరు.',
5529 - 'checkuser-search-form' => '$1 అనేది $2గా ఉన్న లాగ్ పద్దులను కనుగొనండి',
 6317+ 'checkuser-search-form' => '$1 అనేది $2గా ఉన్న చిట్టా పద్దులను కనుగొనండి',
55306318 'checkuser-search-submit' => 'వెతుకు',
55316319 'checkuser-search-initiator' => 'ఆరంభకుడు',
55326320 'checkuser-search-target' => 'లక్ష్యం',
@@ -5549,7 +6337,7 @@
55506338 'grouppage-checkuser' => '{{ns:project}}:CheckUser',
55516339 'checkuser-reason' => 'Motivu:',
55526340 'checkuser-log' => 'Lista checkuser',
5553 - 'checkuser-target' => "Uza-na'in ka IP",
 6341+ 'checkuser-target' => "Diresaun IP ka naran uza-na'in:",
55546342 'checkuser-users' => "Uza-na'in sira",
55556343 'checkuser-edits' => 'Edita husi IP',
55566344 'checkuser-ips' => 'IP sira',
@@ -5625,21 +6413,174 @@
56266414 'checkuser-email-action' => 'почтаи электронӣ ба корбар "$1" фиристода шуд',
56276415 );
56286416
 6417+/** Tajik (Latin) (Тоҷикӣ (Latin))
 6418+ * @author Liangent
 6419+ */
 6420+$messages['tg-latn'] = array(
 6421+ 'checkuser-summary' => 'In abzor taƣjiroti oxirro baroi ba dast ovardani nişonahoi internetī IP istifoda şuda tavassuti jak korbar jo ta\'jini viroişhoi ancom şuda tariqi jak nişonai internetī IP, çustuçū mekunad.
 6422+Korbaron va viroişhoi jak nişonai internetiji IP-ro metavon bo tavaççūh ba ittiloot sar ojand tariqi XFF bo afzudan nişonai internetī IP bo "/xff" pajdo kard. Har du protokol IPv4 (CIDR 16-32) va IPv6 (CIDR 96-128) tavassuti in abzor puştibonī meşavand.
 6423+Na beş az 5000 viroiş bo dalelhoi zudkorī bargardonida xohand şud. Bo muvofiqi sijosat va qoidaho inro istoda kuned.',
 6424+ 'checkuser-desc' => 'Ba korbaron ixtijoroti lozimiro baroi barrasiji nişonahoi internetī IP korbaron va ittilooti digar, içozat medihad',
 6425+ 'checkuser-logcase' => 'Çustuçūi guzoriş ba xurd jo buzrg budani harfho hasos ast.',
 6426+ 'checkuser' => 'Bozrasiji korbar',
 6427+ 'group-checkuser' => 'Bozrasiji korbaron',
 6428+ 'group-checkuser-member' => 'Bozrasiji korbar',
 6429+ 'right-checkuser' => 'Barrasi kardani nişonai IP va digar ittilooti korbar',
 6430+ 'grouppage-checkuser' => '{{ns:project}}:Bozrasiji korbar',
 6431+ 'checkuser-reason' => 'Sabab:',
 6432+ 'checkuser-showlog' => 'Namoişi guzoriş',
 6433+ 'checkuser-log' => 'BozrasiKorbar guzoriş',
 6434+ 'checkuser-query' => 'Çustuçūi taƣjiroti oxir',
 6435+ 'checkuser-users' => 'Fehrist kardani korbaron',
 6436+ 'checkuser-edits' => 'Namoişi viroişhoi marbut ba in nişonai IP',
 6437+ 'checkuser-ips' => 'Fehrist kardani nişonahoi IP',
 6438+ 'checkuser-search' => 'Çustuçū',
 6439+ 'checkuser-period' => 'Tūl:',
 6440+ 'checkuser-week-1' => 'hafta guzaşta',
 6441+ 'checkuser-week-2' => 'du haftai guzaşta',
 6442+ 'checkuser-month' => '30 rūzi guzaşta',
 6443+ 'checkuser-all' => 'hama',
 6444+ 'checkuser-empty' => 'Guzoriş xolī ast.',
 6445+ 'checkuser-nomatch' => 'Mavride ki mutobiqat doşta boşad pajdo naşud',
 6446+ 'checkuser-nomatch-edits' => 'Heç mutobiqate joft naşud.
 6447+Oxirin viroiş dar $1 soati $2 bud.',
 6448+ 'checkuser-check' => 'Barrasi',
 6449+ 'checkuser-log-fail' => 'Imkoni afzudani ittiloot ba guzoriş vuçud nadorad',
 6450+ 'checkuser-nolog' => 'Parvandai guzoriş pajdo naşud.',
 6451+ 'checkuser-blocked' => "Dastrasī qat' şud",
 6452+ 'checkuser-gblocked' => 'Bastaşuda sartosarī',
 6453+ 'checkuser-wasblocked' => 'Qablan basta şuda',
 6454+ 'checkuser-localonly' => 'Jakka naşuda',
 6455+ 'checkuser-massblock' => 'Korbaroni intixobşuda basta şavand',
 6456+ 'checkuser-blocktag' => 'Çojguzin kardani sahifahoi korbaron bo:',
 6457+ 'checkuser-blocktag-talk' => 'Çojguzin kardani sahifahoi bahs bo:',
 6458+ 'checkuser-block-limit' => "Te'dodi beş az şumorai korbaron intixob şudaand.",
 6459+ 'checkuser-user-nonexistent' => 'Korbari mavridi nazar vuçud nadorad.',
 6460+ 'checkuser-search-form' => 'Pajdo kardani mavorid dar guzorişho, ki $1 dar on $2 ast',
 6461+ 'checkuser-search-submit' => 'Çustuçū',
 6462+ 'checkuser-search-initiator' => 'oƣozgar',
 6463+ 'checkuser-search-target' => 'hadaf',
 6464+ 'checkuser-log-subpage' => 'Guzoriş',
 6465+ 'checkuser-log-return' => 'Bozgaşt ba formi asliji bozrasiji korbar',
 6466+ 'checkuser-log-userips' => '$1 nişonahoi internetiji IP-hoi $2ro girift',
 6467+ 'checkuser-log-ipedits' => '$1 viroişhoi $2ro girift',
 6468+ 'checkuser-log-ipusers' => '$1 korbaroni marbut ba $2ro girift',
 6469+ 'checkuser-log-ipedits-xff' => '$1 viroişhoi XFF $2ro girift',
 6470+ 'checkuser-log-ipusers-xff' => '$1 korbaroni marbut ba XFF $2ro girift',
 6471+ 'checkuser-autocreate-action' => 'ba tavri xudkor eçod şuda bud',
 6472+ 'checkuser-email-action' => 'poctai elektronī ba korbar "$1" firistoda şud',
 6473+);
 6474+
56296475 /** Thai (ไทย)
56306476 * @author Mopza
56316477 * @author Octahedron80
 6478+ * @author Woraponboonkerd
56326479 */
56336480 $messages['th'] = array(
 6481+ 'checkuser' => 'ตรวจสอบผู้ใช้',
 6482+ 'checkuser-contribs' => 'ตรวจสอบหมายเลขไอพีของผู้ใช้',
 6483+ 'group-checkuser' => 'ตรวจสอบผู้ใช้',
 6484+ 'group-checkuser-member' => 'ตรวจสอบผู้ใช้',
 6485+ 'right-checkuser' => 'ตรวจสอบหมายเลขไอพีของผู้ใช้และข้อมูลอื่นๆ',
 6486+ 'right-checkuser-log' => 'ดูประวัติการตรวจสอบผู้ใช้',
 6487+ 'grouppage-checkuser' => '{{ns:project}}:ตรวจสอบผู้ใช้',
56346488 'checkuser-reason' => 'เหตุผล:',
 6489+ 'checkuser-showlog' => 'แสดงประวัติ',
 6490+ 'checkuser-log' => 'ประวัติการตรวจสอบผู้ใช้',
 6491+ 'checkuser-query' => 'แบบสอบถามการเปลี่ยนแปลงล่าสุด',
 6492+ 'checkuser-target' => 'หมายเลขไอพีหรือชื่อผู้ใช้:',
 6493+ 'checkuser-users' => 'รับชื่อผู้ใช้',
 6494+ 'checkuser-edits' => 'รับรายการแก้ไขจากหมายเลขไอพี',
 6495+ 'checkuser-ips' => 'รับรายการหมายเลขไอพี',
 6496+ 'checkuser-account' => 'รับรายการแก้ไขบัญชีผู้ใช้',
56356497 'checkuser-search' => 'สืบค้น',
56366498 'checkuser-period' => 'ระยะเวลา:',
56376499 'checkuser-week-1' => 'สัปดาห์ที่แล้ว',
56386500 'checkuser-week-2' => '2 สัปดาห์ที่แล้ว',
56396501 'checkuser-month' => '30 วันที่แล้ว',
56406502 'checkuser-all' => 'ทั้งหมด',
 6503+ 'checkuser-nomatch' => 'ไม่พบสิ่งที่ค้นหา',
 6504+ 'checkuser-blocktag' => 'แทนที่หน้าผู้ใช้ด้วย:',
 6505+ 'checkuser-blocktag-talk' => 'แทนที่หน้าพูดคุยด้วย:',
 6506+ 'checkuser-massblock-commit' => 'ระงับผู้ใช้ที่เลือก',
 6507+ 'checkuser-block-success' => "'''{{PLURAL:$2|ผู้ใช้|ผู้ใช้}}ชื่อ $1 {{PLURAL:$2|ได้ถูก|ได้ถูก}}ระงับการใช้แล้ว'''",
 6508+ 'checkuser-block-failure' => "'''ไม่มีผู้ใช้ถูกระงับ'''",
 6509+ 'checkuser-block-limit' => 'เลือกผู้ใช้มากเกินไป',
 6510+ 'checkuser-block-noreason' => 'คุณต้องให้เหตุผลในการระงับด้วย',
 6511+ 'checkuser-too-many' => 'มีผลลัพธ์มากเกินไป (จากการคาดคะเนของแบบสอบถาม) กรุณาทำให้ CIDR เฉพาะเจาะจงมากขึ้น
 6512+นี่คือหมายเลขไอพีที่ถูกใช้ (สูงสุด 5000 เรียงตามหมายเลขไอพี)',
 6513+ 'checkuser-user-nonexistent' => 'ไม่พบผู้ใช้ที่กำหนด',
56416514 'checkuser-search-submit' => 'สืบค้น',
56426515 );
56436516
 6517+/** Turkmen (Türkmençe)
 6518+ * @author Hanberke
 6519+ */
 6520+$messages['tk'] = array(
 6521+ 'checkuser-desc' => 'Ulanyjylaryň IP adreslerini we beýleki maglumatlaryny barlamak hukugy üçin degişli rugsatlary ulanyjylara berýär',
 6522+ 'checkuser-logcase' => 'Gündelik gözlegi baş-setir harpa duýgurdyr.',
 6523+ 'checkuser' => 'Ulanyjy barla',
 6524+ 'checkuser-contribs' => 'ulanyjy IP adreslerini barla',
 6525+ 'group-checkuser' => 'Ulanyjy barlaýjylary',
 6526+ 'group-checkuser-member' => 'Ulanyjy barlaýjysy',
 6527+ 'right-checkuser' => 'Ulanyjylaryň IP adreslerini we baş maglumatlaryny barla',
 6528+ 'right-checkuser-log' => 'Ulanyjy barlaýjysy gündeligini görkez',
 6529+ 'grouppage-checkuser' => '{{ns:project}}:Ulanyjy barlaýjysy',
 6530+ 'checkuser-reason' => 'Sebäp:',
 6531+ 'checkuser-showlog' => 'Gündeligi görkez',
 6532+ 'checkuser-log' => 'Ulanyjy barlaýjysy gündeligi',
 6533+ 'checkuser-query' => 'Soňky üýtgeşmeleri sora',
 6534+ 'checkuser-target' => 'IP adresi ýa-da ulanyjy ady:',
 6535+ 'checkuser-users' => 'Ulanyjylary al',
 6536+ 'checkuser-edits' => 'IP-den özgerdişleri al',
 6537+ 'checkuser-ips' => 'IP adreslerini al',
 6538+ 'checkuser-account' => 'Hasap özgerdişlerini al',
 6539+ 'checkuser-search' => 'Gözle',
 6540+ 'checkuser-period' => 'Dowamlylyk:',
 6541+ 'checkuser-week-1' => 'soňky hepde',
 6542+ 'checkuser-week-2' => 'soňky iki hepde',
 6543+ 'checkuser-month' => 'soňky 30 gün',
 6544+ 'checkuser-all' => 'ählisi',
 6545+ 'checkuser-cidr-res' => 'Umumy CIDR:',
 6546+ 'checkuser-empty' => 'Gündelikde hiç zat ýok.',
 6547+ 'checkuser-nomatch' => 'Gabat gelýän zat tapylmady.',
 6548+ 'checkuser-nomatch-edits' => 'Gabat gelýän zat tapylmady.
 6549+Soňky özgerdiş $2, $1 senesinde.',
 6550+ 'checkuser-check' => 'Barla',
 6551+ 'checkuser-log-fail' => 'Gündelik girişini goşup bolmaýar',
 6552+ 'checkuser-nolog' => 'Hiç hili gündelik faýly tapylmady.',
 6553+ 'checkuser-blocked' => 'Blokirlendi',
 6554+ 'checkuser-gblocked' => 'Global blokirlendi',
 6555+ 'checkuser-locked' => 'Gulply',
 6556+ 'checkuser-wasblocked' => 'Ozaldan blokirlenen',
 6557+ 'checkuser-localonly' => 'Birleşdirilmedik',
 6558+ 'checkuser-massblock' => 'Saýlanylan ulanyjylary blokirle',
 6559+ 'checkuser-blocktag' => 'Ulanyjy sahypalaryny şuňa çalşyr:',
 6560+ 'checkuser-blocktag-talk' => 'Pikir alyşma sahypalaryny şuňa çalşyr:',
 6561+ 'checkuser-massblock-commit' => 'Saýlanylan ulanyjylary blokirle',
 6562+ 'checkuser-block-success' => "'''$1 {{PLURAL:$2|ulanyjy|ulanyjy}} indi blokirlendi.'''",
 6563+ 'checkuser-block-failure' => "'''Hiç bir ulanyjy blokirlenmedi.'''",
 6564+ 'checkuser-block-limit' => 'Aşa köp ulanyjy saýlanyldy.',
 6565+ 'checkuser-block-noreason' => 'Blokirlemeler üçin sebäp görkezmeli.',
 6566+ 'checkuser-noreason' => 'Bu talap üçin sebäp görkezmeli.',
 6567+ 'checkuser-accounts' => '$1 täze {{PLURAL:$1|hasap|hasap}}',
 6568+ 'checkuser-user-nonexistent' => 'Görkezilen ulanyjy ýok.',
 6569+ 'checkuser-search-form' => '$1-iň $2 bolan gündelik girişlerini tap',
 6570+ 'checkuser-search-submit' => 'Gözle',
 6571+ 'checkuser-search-initiator' => 'başladan',
 6572+ 'checkuser-ipeditcount' => 'ähli ulanyjylardan ~$1',
 6573+ 'checkuser-log-subpage' => 'Gündelik',
 6574+ 'checkuser-log-userips' => '$1, $2 üçin IP adresleri aldy',
 6575+ 'checkuser-log-ipedits' => '$1, $2 üçin özgerdişleri aldy',
 6576+ 'checkuser-log-ipusers' => '$1, $2 üçin ulanyjylary aldy',
 6577+ 'checkuser-log-ipedits-xff' => '$1, XFF $2 üçin özgerdişleri aldy',
 6578+ 'checkuser-log-ipusers-xff' => '$1, XFF $2 üçin ulanyjylary aldy',
 6579+ 'checkuser-log-useredits' => '$1, $2 üçin özgerdişleri aldy',
 6580+ 'checkuser-autocreate-action' => 'awtomatik döredildi',
 6581+ 'checkuser-email-action' => '"$1" ulanyjysyna e-poçta iberdi',
 6582+ 'checkuser-reset-action' => '"$1" ulanyjysy üçin paroly başky ýagdaýa getirdi',
 6583+);
 6584+
56446585 /** Tagalog (Tagalog)
56456586 * @author AnakngAraw
56466587 */
@@ -5733,6 +6674,7 @@
57346675 * @author Karduelis
57356676 * @author Mach
57366677 * @author Suelnur
 6678+ * @author Vito Genovese
57376679 */
57386680 $messages['tr'] = array(
57396681 'checkuser-summary' => "Bu araç bir kullanıcı tarafından kullanılan IP'leri almak için son değişiklikleri tarar ya da bir IP için değişiklik/kullanıcı verisini gösterir.
@@ -5752,7 +6694,7 @@
57536695 'checkuser-showlog' => 'Logu göster',
57546696 'checkuser-log' => 'Denetçi kaydı',
57556697 'checkuser-query' => 'Son değişiklikleri sorgula',
5756 - 'checkuser-target' => 'Kullanıcı veya IP',
 6698+ 'checkuser-target' => 'IP adresi veya kullanıcı adı:',
57576699 'checkuser-users' => 'Kullanıcıları bulup getir',
57586700 'checkuser-edits' => "IP'den değişiklikleri al",
57596701 'checkuser-ips' => 'IPleri bulup getir',
@@ -5787,8 +6729,9 @@
57886730 'checkuser-block-failure' => "'''Hiçbir kullanıcı engellenmedi.'''",
57896731 'checkuser-block-limit' => 'Çok fazla kullanıcı seçildi.',
57906732 'checkuser-block-noreason' => 'Engellemeler için bir neden belirtmelisiniz.',
 6733+ 'checkuser-noreason' => 'Bu sorgu için bir sebep göstermelisiniz.',
57916734 'checkuser-accounts' => '$1 yeni {{PLURAL:$1|hesap|hesap}}',
5792 - 'checkuser-too-many' => "Çok fazla sonuç var, lütfen CIDR'ı daraltın.
 6735+ 'checkuser-too-many' => "Çok fazla sonuç var (sorgu tahminine göre), lütfen CIDR'ı daraltın.
57936736 Kullanılan IP'ler (max 5000, adrese göre sıralı):",
57946737 'checkuser-user-nonexistent' => 'Belirtilen kullanıcı mevcut değil.',
57956738 'checkuser-search-form' => "$1'in $2 olduğu günlük girişlerini bul",
@@ -5813,6 +6756,8 @@
58146757 /** Ukrainian (Українська)
58156758 * @author AS
58166759 * @author Ahonc
 6760+ * @author NickK
 6761+ * @author Prima klasy4na
58176762 */
58186763 $messages['uk'] = array(
58196764 'checkuser-summary' => 'Цей засіб переглядає нові редагування для отримання IP-адрес, які використовував певний користувач, або щоб знайти редагування/користувача за IP-адресою.
@@ -5822,6 +6767,7 @@
58236768 'checkuser-desc' => 'Надання можливості перевіряти IP-адреси та іншу інформацію користувачів',
58246769 'checkuser-logcase' => 'Пошук у журналі чутливий до регістру.',
58256770 'checkuser' => 'Перевірити користувача',
 6771+ 'checkuser-contribs' => 'перевірити IP-адреси користувача',
58266772 'group-checkuser' => "Чек'юзери",
58276773 'group-checkuser-member' => "чек'юзер",
58286774 'right-checkuser' => 'Перевірка IP-адрес та іншої інформації користувача',
@@ -5830,10 +6776,10 @@
58316777 'checkuser-reason' => 'Причина:',
58326778 'checkuser-showlog' => 'Показати журнал',
58336779 'checkuser-log' => 'Журнал перевірки користувачів',
5834 - 'checkuser-query' => 'Запитати останні зміни',
5835 - 'checkuser-target' => 'Користувач або IP-адреса',
 6780+ 'checkuser-query' => 'Переглянути останні зміни',
 6781+ 'checkuser-target' => "IP-адреса або ім'я користувача:",
58366782 'checkuser-users' => 'Отримати користувачів',
5837 - 'checkuser-edits' => 'Запитати редагування, зроблені з IP-адреси',
 6783+ 'checkuser-edits' => 'Отримати редагування, зроблені з IP-адреси',
58386784 'checkuser-ips' => 'Запитати IP-адреси',
58396785 'checkuser-account' => 'Отримати редагування з облікового запису',
58406786 'checkuser-search' => 'Знайти',
@@ -5842,6 +6788,8 @@
58436789 'checkuser-week-2' => 'останні два тижні',
58446790 'checkuser-month' => 'останні 30 днів',
58456791 'checkuser-all' => 'усі',
 6792+ 'checkuser-cidr-label' => 'Знайти загальний діапазон і задіяні адреси для списку IP-адрес',
 6793+ 'checkuser-cidr-res' => 'Спільний CIDR:',
58466794 'checkuser-empty' => 'Журнал порожній.',
58476795 'checkuser-nomatch' => 'Не знайдено співпадінь.',
58486796 'checkuser-nomatch-edits' => 'Збіги не знайдені.
@@ -5864,9 +6812,10 @@
58656813 'checkuser-block-failure' => "'''Немає заблокованих користувачів.'''",
58666814 'checkuser-block-limit' => 'Вибрано забагато користувачів.',
58676815 'checkuser-block-noreason' => 'Ви повинні вказати причину блокувань.',
 6816+ 'checkuser-noreason' => 'Вам необхідно зазначити причину цього запиту.',
58686817 'checkuser-accounts' => '$1 {{PLURAL:$1|новий обліковий запис|нові облікові записи|нових облікових записів}}',
5869 - 'checkuser-too-many' => 'Забагато результатів. Будь ласка, звузьте CIDR.
5870 -Використані IP (максимум 5000, відсортовано за адресою):',
 6818+ 'checkuser-too-many' => 'Забагато результатів (згідно з оцінкою запиту), будь ласка, звузьте CIDR.
 6819+Використані IP (максимум 5000, відсортовані за адресою):',
58716820 'checkuser-user-nonexistent' => 'Зазначений користувач не існує.',
58726821 'checkuser-search-form' => 'Знайти записи журналу, де $1 є $2',
58736822 'checkuser-search-submit' => 'Знайти',
@@ -5905,7 +6854,7 @@
59066855 'checkuser-showlog' => 'Mostra el registro',
59076856 'checkuser-log' => 'Registro dei checkuser',
59086857 'checkuser-query' => 'Çerca ne le ultime modifiche',
5909 - 'checkuser-target' => 'Utente o IP',
 6858+ 'checkuser-target' => 'Utente o indirisso IP:',
59106859 'checkuser-users' => 'Çerca utenti',
59116860 'checkuser-edits' => 'Varda i contributi dei IP',
59126861 'checkuser-ips' => 'Çerca IP',
@@ -5940,8 +6889,9 @@
59416890 'checkuser-block-failure' => "'''Nissun utente blocà.'''",
59426891 'checkuser-block-limit' => 'Ti gà selessionà massa utenti.',
59436892 'checkuser-block-noreason' => 'Ti gà da dar na motivassion par i blochi.',
 6893+ 'checkuser-noreason' => 'Te ghè da indicar na motivassion par sta richiesta.',
59446894 'checkuser-accounts' => '$1 account {{PLURAL:$1|novo|novi}}',
5945 - 'checkuser-too-many' => 'Xe vegnù fora massa risultati, par piaser dòpara un CIDR piassè ristreto.
 6895+ 'checkuser-too-many' => 'Vien fora massa risultati (secondo la stima), par piaser dòpara un CIDR piassè ristreto.
59466896 Sti qua i xe i IP doparà (fin a un massimo de 5000, ordinà par indirizo):',
59476897 'checkuser-user-nonexistent' => "L'utente indicà no l'esiste mìa.",
59486898 'checkuser-search-form' => 'Cata fora le voçi del registro par le quali $1 el xe $2',
@@ -5978,6 +6928,11 @@
59796929 'checkuser-edits' => 'Sada toižetusid, kudambad oma tehtud IP-adresalpäi',
59806930 'checkuser-search' => 'Ectä',
59816931 'checkuser-all' => 'kaik',
 6932+ 'checkuser-blocked' => 'Blokiruidud',
 6933+ 'checkuser-locked' => 'Luklostadud',
 6934+ 'checkuser-search-submit' => 'Ectä',
 6935+ 'checkuser-search-initiator' => 'iniciator',
 6936+ 'checkuser-search-target' => 'met',
59826937 );
59836938
59846939 /** Vietnamese (Tiếng Việt)
@@ -5999,7 +6954,7 @@
60006955 'checkuser-showlog' => 'Xem nhật trình',
60016956 'checkuser-log' => 'Nhật trình CheckUser',
60026957 'checkuser-query' => 'Truy vấn các thay đổi gần đây',
6003 - 'checkuser-target' => 'Thành viên hay IP',
 6958+ 'checkuser-target' => 'Tên người dùng hay địa chỉ IP:',
60046959 'checkuser-users' => 'Lấy ra thành viên',
60056960 'checkuser-edits' => 'Lấy ra sửa đổi của IP',
60066961 'checkuser-ips' => 'Lấy ra IP',
@@ -6033,8 +6988,9 @@
60346989 'checkuser-block-failure' => "'''Không ai bị cấm.'''",
60356990 'checkuser-block-limit' => 'Đã chọn nhiều người dùng quá.',
60366991 'checkuser-block-noreason' => 'Phải đưa ra lý do cấm.',
6037 - 'checkuser-accounts' => '$1 tài khoản mới',
6038 - 'checkuser-too-many' => 'Có quá nhiều kết quả, xin hãy thu hẹp CIDR. Đây là các IP sử dụng (tối đa 5000, xếp theo địa chỉ):',
 6992+ 'checkuser-noreason' => 'Bạn phải đưa ra lý do truy vấn.',
 6993+ 'checkuser-accounts' => '{{PLURAL:$1|tài khoản|tài khoản}} mới',
 6994+ 'checkuser-too-many' => 'Có quá nhiều kết quả (theo ước lượng truy vấn). Xin hãy thu hẹp CIDR. Đây là các IP sử dụng (tối đa 5000, xếp theo địa chỉ):',
60396995 'checkuser-user-nonexistent' => 'Thành viên chỉ định không tồn tại.',
60406996 'checkuser-search-form' => 'Tìm thấy các mục nhật trình trong đó $1 là $2',
60416997 'checkuser-search-submit' => 'Tìm kiếm',
@@ -6138,9 +7094,15 @@
61397095 * @author פוילישער
61407096 */
61417097 $messages['yi'] = array(
 7098+ 'checkuser' => 'בודק זײַן באניצער',
 7099+ 'right-checkuser-log' => 'באקוקן דאס קאנטראל לאגבוך',
 7100+ 'checkuser-reason' => 'אורזאַך:',
 7101+ 'checkuser-showlog' => 'ווײַזן לאגבוך',
 7102+ 'checkuser-log' => 'קאנטראל לאגבוך',
61427103 'checkuser-target' => 'באניצער אדער IP אדרעס',
61437104 'checkuser-search' => 'זוכן',
61447105 'checkuser-week-1' => 'פֿאריגע וואך',
 7106+ 'checkuser-week-2' => 'פֿאריגע צוויי וואכן',
61457107 'checkuser-month' => 'פֿאריגע 30 טעג',
61467108 'checkuser-all' => 'אלע',
61477109 'checkuser-nomatch' => 'נישט געטראפֿן קיין פאָר.',
@@ -6152,8 +7114,12 @@
61537115 'checkuser-blocked' => 'בלאקירט',
61547116 'checkuser-gblocked' => 'בלאקירט גלאבאַליש',
61557117 'checkuser-locked' => 'פֿאַרשלאסן',
 7118+ 'checkuser-block-limit' => 'צופיל באניצער אויסגעקליבן',
61567119 'checkuser-search-submit' => 'זוכן',
61577120 'checkuser-search-target' => 'ציל',
 7121+ 'checkuser-log-subpage' => 'לאגבוך',
 7122+ 'checkuser-email-action' => 'געשיקט א בליצבריוו צו באניצער "$1"',
 7123+ 'checkuser-reset-action' => 'צוריקשטעלן פאסווארט פאר באניצער "$1"',
61587124 );
61597125
61607126 /** Yue (粵語) */
@@ -6201,60 +7167,88 @@
62027168 );
62037169
62047170 /** Simplified Chinese (‪中文(简体)‬)
 7171+ * @author Gaoxuewei
62057172 * @author Gzdavidwong
 7173+ * @author Jimmy xu wrk
 7174+ * @author Liangent
 7175+ * @author PhiLiP
62067176 * @author Wmr89502270
62077177 */
62087178 $messages['zh-hans'] = array(
6209 - 'checkuser-summary' => '本工具会从{{int:recentchanges}}中查询使用者使用过的IP位址,或是一个IP位址发送出来的任何编辑记录。本工具支持IPv4及IPv6的位址。由于技术上的限制,本工具只能查询最近5000笔的记录。请确定你的行为符合守则。',
6210 - 'checkuser-desc' => '让授权的用户检查用户的IP位址及其他资讯',
6211 - 'checkuser-logcase' => '搜寻时请注意大小写的区分',
6212 - 'checkuser' => '核对用户',
 7179+ 'checkuser-summary' => '本工具会从最近更改中获取用户使用过的IP地址,可使用XFF头信息来获取同一客户端IP地址下的用户和编辑,即在IP地址后方附加“/xff”。本工具支持IPv4(CIDR 16-32)和IPv6(CIDR 96-128)。由于效率原因,本工具只能查询最近5000笔编辑次数。请确保你的操作符合方针。',
 7180+ 'checkuser-desc' => '令已授权用户可以核查用户的IP地址及其他信息',
 7181+ 'checkuser-logcase' => '日志搜索是区分大小写的。',
 7182+ 'checkuser' => '帐户核查',
 7183+ 'checkuser-contribs' => '核查用户IP地址',
62137184 'group-checkuser' => '账户核查',
62147185 'group-checkuser-member' => '账户核查',
6215 - 'right-checkuser' => '查核用户的IP地址以及其它的资料',
 7186+ 'right-checkuser' => '核查用户的IP地址和其他信息',
 7187+ 'right-checkuser-log' => '查看帐户核查日志',
62167188 'grouppage-checkuser' => '{{ns:project}}:账户核查',
6217 - 'checkuser-reason' => '理由',
 7189+ 'checkuser-reason' => '原因:',
62187190 'checkuser-showlog' => '显示日志',
6219 - 'checkuser-log' => '用户查核日志',
 7191+ 'checkuser-log' => '帐户核查日志',
62207192 'checkuser-query' => '查询最近更改',
6221 - 'checkuser-target' => '用户名称或IP位扯',
6222 - 'checkuser-users' => '查询用户名称',
6223 - 'checkuser-edits' => '从IP位址查询编辑日志',
6224 - 'checkuser-ips' => '查询IP位址',
 7193+ 'checkuser-target' => '用户或IP地址:',
 7194+ 'checkuser-users' => '获取用户',
 7195+ 'checkuser-edits' => '根据IP地址获取编辑',
 7196+ 'checkuser-ips' => '获取IP地址',
 7197+ 'checkuser-account' => '获取帐户编辑',
62257198 'checkuser-search' => '搜索',
6226 - 'checkuser-week-1' => '上星期',
6227 - 'checkuser-week-2' => '前两个星期',
 7199+ 'checkuser-period' => '期限:',
 7200+ 'checkuser-week-1' => '上周',
 7201+ 'checkuser-week-2' => '前两周',
62287202 'checkuser-month' => '前30天',
62297203 'checkuser-all' => '所有',
6230 - 'checkuser-empty' => '日志里没有资料。',
6231 - 'checkuser-nomatch' => '没有符合的资讯',
6232 - 'checkuser-check' => '查询',
 7204+ 'checkuser-cidr-label' => '检查指定IP列表的共同区段',
 7205+ 'checkuser-cidr-res' => '通用CIDR:',
 7206+ 'checkuser-empty' => '日志里没有项目。',
 7207+ 'checkuser-nomatch' => '找不到匹配项目。',
 7208+ 'checkuser-nomatch-edits' => '找不到匹配项目。最近一次编辑于$1$2。',
 7209+ 'checkuser-check' => '查核',
62337210 'checkuser-log-fail' => '无法更新日志。',
6234 - 'checkuser-nolog' => '找不到记录档',
6235 - 'checkuser-blocked' => '已经查封',
 7211+ 'checkuser-nolog' => '找不到日志文件。',
 7212+ 'checkuser-blocked' => '已封禁',
 7213+ 'checkuser-gblocked' => '全域封禁',
62367214 'checkuser-locked' => '已锁定',
6237 - 'checkuser-too-many' => '太多结果,请收窄CIDR。
6238 -这是使用过?IP (最多5000个,按地址排列):',
6239 - 'checkuser-user-nonexistent' => '指定的使用者不存在。',
6240 - 'checkuser-search-form' => '搜寻当 $1 是 $2 时之日志',
 7215+ 'checkuser-wasblocked' => '曾封禁',
 7216+ 'checkuser-localonly' => '未统一',
 7217+ 'checkuser-massblock' => '封禁选中用户',
 7218+ 'checkuser-massblock-text' => '被选中的帐户将被施以无限期封禁,并启用自动封禁、禁止帐户创建。被选中的IP地址将被封禁一周,仅针对IP用户且禁止帐户创建。',
 7219+ 'checkuser-blocktag' => '替换用户页内容:',
 7220+ 'checkuser-blocktag-talk' => '替换讨论页内容:',
 7221+ 'checkuser-massblock-commit' => '封禁选中用户',
 7222+ 'checkuser-block-success' => "'''{{PLURAL:$2|用户|用户}} $1 {{PLURAL:$2|已被|已被}} 封禁。'''",
 7223+ 'checkuser-block-failure' => "'''未有用户被封禁。'''",
 7224+ 'checkuser-block-limit' => '选中用户数量过多。',
 7225+ 'checkuser-block-noreason' => '你必须解释此次封禁的原因。',
 7226+ 'checkuser-noreason' => '你必须解释此次查询的原因。',
 7227+ 'checkuser-accounts' => '$1个新帐户',
 7228+ 'checkuser-too-many' => '结果过多(根据查询估计),请缩小CIDR的范围。
 7229+下面列出了使用过的IP地址(最多5000个,按地址排列):',
 7230+ 'checkuser-user-nonexistent' => '指定的用户不存在。',
 7231+ 'checkuser-search-form' => '查找当 $1 是 $2 时的日志记录',
62417232 'checkuser-search-submit' => '搜索',
6242 - 'checkuser-search-initiator' => '创始者',
 7233+ 'checkuser-search-initiator' => '操作者',
62437234 'checkuser-search-target' => '目标',
62447235 'checkuser-ipeditcount' => '~在全部用户中$1',
62457236 'checkuser-log-subpage' => '日志',
62467237 'checkuser-log-return' => '回到查核主表单',
 7238+ 'checkuser-limited' => "'''结果已因效率原因而被删减。'''",
62477239 'checkuser-log-userips' => '$1取得$2的IP信息',
62487240 'checkuser-log-ipedits' => '$1取得$2的编辑记录',
62497241 'checkuser-log-ipusers' => '$1取得$2的用户信息',
6250 - 'checkuser-log-ipedits-xff' => '$1取得 XFF $2的编辑记录',
6251 - 'checkuser-log-ipusers-xff' => '$1取得 XFF $2的用户信息',
6252 - 'checkuser-autocreate-action' => '已经自动建立',
 7242+ 'checkuser-log-ipedits-xff' => '$1取得XFF $2的编辑记录',
 7243+ 'checkuser-log-ipusers-xff' => '$1取得XFF $2的用户信息',
 7244+ 'checkuser-log-useredits' => '$1取得$2的编辑记录',
 7245+ 'checkuser-autocreate-action' => '已自动创建',
62537246 'checkuser-email-action' => '向用户“$1”发送电邮',
6254 - 'checkuser-reset-action' => '为用户“$1”重新设置密码',
 7247+ 'checkuser-reset-action' => '为用户“$1”重置密码',
62557248 );
62567249
62577250 /** Traditional Chinese (‪中文(繁體)‬)
62587251 * @author Alexsh
 7252+ * @author Liangent
62597253 * @author Wrightbus
62607254 */
62617255 $messages['zh-hant'] = array(
@@ -6262,28 +7256,53 @@
62637257 'checkuser-desc' => '讓授權的使用者檢查使用者的IP位址及其他資訊',
62647258 'checkuser-logcase' => '搜尋時請注意大小寫的區分',
62657259 'checkuser' => '核對用戶',
 7260+ 'checkuser-contribs' => '核查用戶IP地址',
62667261 'group-checkuser' => '用戶查核',
62677262 'group-checkuser-member' => '用戶查核',
62687263 'right-checkuser' => '查核用戶的IP地址以及其它的資料',
 7264+ 'right-checkuser-log' => '查看帳戶核查日誌',
62697265 'grouppage-checkuser' => '{{ns:project}}:用戶查核',
62707266 'checkuser-reason' => '理由',
62717267 'checkuser-showlog' => '顯示記錄',
62727268 'checkuser-log' => '用戶查核記錄',
62737269 'checkuser-query' => '查詢最近更改',
6274 - 'checkuser-target' => '用戶名稱或IP位扯',
 7270+ 'checkuser-target' => '用戶或IP地址:',
62757271 'checkuser-users' => '查詢用戶名稱',
62767272 'checkuser-edits' => '從IP位址查詢編輯記錄',
62777273 'checkuser-ips' => '查詢IP位址',
 7274+ 'checkuser-account' => '獲取帳戶編輯',
62787275 'checkuser-search' => '搜尋',
 7276+ 'checkuser-period' => '期限:',
 7277+ 'checkuser-week-1' => '一星期內',
 7278+ 'checkuser-week-2' => '兩星期內',
 7279+ 'checkuser-month' => '30天內',
 7280+ 'checkuser-all' => '全部',
 7281+ 'checkuser-cidr-label' => '檢查指定IP列表的共同區段',
 7282+ 'checkuser-cidr-res' => '通用CIDR:',
62797283 'checkuser-empty' => '記錄裡沒有資料。',
62807284 'checkuser-nomatch' => '沒有符合的資訊',
 7285+ 'checkuser-nomatch-edits' => '找不到匹配項目。最近一次編輯於$1$2。',
62817286 'checkuser-check' => '查詢',
62827287 'checkuser-log-fail' => '無法更新記錄。',
62837288 'checkuser-nolog' => '找不到記錄檔',
62847289 'checkuser-blocked' => '已經查封',
 7290+ 'checkuser-gblocked' => '全域封禁',
62857291 'checkuser-locked' => '已鎖定',
6286 - 'checkuser-too-many' => '太多結果,請收窄CIDR。
6287 -這是使用過嘅IP (最多5000個,按地址排列):',
 7292+ 'checkuser-wasblocked' => '曾封禁',
 7293+ 'checkuser-localonly' => '未統一',
 7294+ 'checkuser-massblock' => '封禁選中用戶',
 7295+ 'checkuser-massblock-text' => '被選中的帳戶將被施以無限期封禁,並啟用自動封禁、禁止帳戶創建。被選中的IP地址將被封禁一周,僅針對IP用戶且禁止帳戶創建。',
 7296+ 'checkuser-blocktag' => '替換用戶頁內容:',
 7297+ 'checkuser-blocktag-talk' => '替換討論頁內容:',
 7298+ 'checkuser-massblock-commit' => '封禁選中用戶',
 7299+ 'checkuser-block-success' => "'''{{PLURAL:$2|用戶|用戶}} $1 {{PLURAL:$2|已被|已被}} 封禁。'''",
 7300+ 'checkuser-block-failure' => "'''未有使用者被封禁。'''",
 7301+ 'checkuser-block-limit' => '選中用戶數量過多。',
 7302+ 'checkuser-block-noreason' => '您必須提供進行封禁的理由。',
 7303+ 'checkuser-noreason' => '您必須提供進行查詢的理由。',
 7304+ 'checkuser-accounts' => '$1個新帳戶',
 7305+ 'checkuser-too-many' => '結果過多(根據查詢估計),請縮小CIDR的範圍。
 7306+下面列出了使用過的IP地址(最多5000個,按地址排列):',
62887307 'checkuser-user-nonexistent' => '指定的使用者不存在。',
62897308 'checkuser-search-form' => '搜尋當 $1 是 $2 時之日誌',
62907309 'checkuser-search-submit' => '{{int:Search}}',
@@ -6292,11 +7311,13 @@
62937312 'checkuser-ipeditcount' => '~在全部用戶中$1',
62947313 'checkuser-log-subpage' => '日誌',
62957314 'checkuser-log-return' => '回到主表單',
 7315+ 'checkuser-limited' => "'''結果已因效率原因而被刪減。'''",
62967316 'checkuser-log-userips' => '$1取得$2的IP訊息',
62977317 'checkuser-log-ipedits' => '$1取得$2的編輯記錄',
62987318 'checkuser-log-ipusers' => '$1取得$2的用戶訊息',
62997319 'checkuser-log-ipedits-xff' => '$1取得 XFF $2的編輯記錄',
63007320 'checkuser-log-ipusers-xff' => '$1取得 XFF $2的用戶訊息',
 7321+ 'checkuser-log-useredits' => '$1取得$2的編輯記錄',
63017322 'checkuser-autocreate-action' => '經已自動建立',
63027323 'checkuser-email-action' => '向使用者「$1」發送電郵',
63037324 'checkuser-reset-action' => '為使用者「$1」重設密碼',
Property changes on: branches/new-checkuser/CheckUser.i18n.php
___________________________________________________________________
Deleted: svn:eol-style
63047325 - native
Index: branches/new-checkuser/CheckUser.php
@@ -1,30 +1,50 @@
22 <?php
 3+/**
 4+ * CheckUser extension - grants users with the appropriate permission the
 5+ * ability to check user's IP addresses and other information.
 6+ *
 7+ * @file
 8+ * @ingroup Extensions
 9+ * @version 2.3
 10+ * @author Tim Starling
 11+ * @author Aaron Schulz
 12+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
 13+ * @link http://www.mediawiki.org/wiki/Extension:CheckUser Documentation
 14+ */
315
416 # Not a valid entry point, skip unless MEDIAWIKI is defined
5 -if (!defined('MEDIAWIKI')) {
 17+if ( !defined( 'MEDIAWIKI' ) ) {
618 echo "CheckUser extension";
7 - exit(1);
 19+ exit( 1 );
820 }
921
1022 # Internationalisation file
11 -$dir = dirname(__FILE__) . '/';
12 -$wgExtensionMessagesFiles['SpecialCheckUser'] = $dir . 'CheckUser.i18n.php';
13 -$wgExtensionAliasesFiles['SpecialCheckUser'] = $dir . 'CheckUser.alias.php';
 23+$dir = dirname( __FILE__ ) . '/';
 24+$wgExtensionMessagesFiles['CheckUser'] = $dir . 'CheckUser.i18n.php';
 25+$wgExtensionAliasesFiles['CheckUser'] = $dir . 'CheckUser.alias.php';
1426
 27+// Extension credits that will show up on Special:Version
1528 $wgExtensionCredits['specialpage'][] = array(
1629 'path' => __FILE__,
1730 'author' => array( 'Tim Starling', 'Aaron Schulz' ),
1831 'name' => 'CheckUser',
 32+ 'version' => '2.3',
1933 'url' => 'http://www.mediawiki.org/wiki/Extension:CheckUser',
20 - 'description' => 'Grants users with the appropriate permission the ability to check user\'s IP addresses and other information',
2134 'descriptionmsg'=> 'checkuser-desc',
2235 );
2336
 37+// New user rights
 38+// 'checkuser' right is required to query IPs/users through Special:CheckUser
 39+// 'checkuser-log' is required to view the private log of checkuser checks
2440 $wgAvailableRights[] = 'checkuser';
2541 $wgAvailableRights[] = 'checkuser-log';
2642 $wgGroupPermissions['checkuser']['checkuser'] = true;
2743 $wgGroupPermissions['checkuser']['checkuser-log'] = true;
2844
 45+// Legacy variable, no longer used. Used to point to a file in the server where
 46+// CheckUser would log all queries done through Special:CheckUser.
 47+// If this file exists, the installer will try to import data from this file to
 48+// the 'cu_log' table in the database.
2949 $wgCheckUserLog = '/home/wikipedia/logs/checkuser.log';
3050
3151 # How long to keep CU data?
@@ -33,8 +53,13 @@
3454 # Mass block limits
3555 $wgCheckUserMaxBlocks = 200;
3656
37 -$wgCheckUserStyleVersion = 4;
 57+// Set this to true if you want to force checkusers into giving a reason for
 58+// each check they do through Special:CheckUser.
 59+$wgCheckUserForceSummary = false;
3860
 61+// Increment this number every time you touch the .js file.
 62+$wgCheckUserStyleVersion = 5;
 63+
3964 # Recent changes data hook
4065 global $wgHooks;
4166 $wgHooks['RecentChange_save'][] = 'efUpdateCheckUserData';
@@ -46,14 +71,6 @@
4772 $wgHooks['LoadExtensionSchemaUpdates'][] = 'efCheckUserSchemaUpdates';
4873 $wgHooks['ContributionsToolLinks'][] = 'efLoadCheckUserLink';
4974
50 -# Setup classes
51 -$wgSpecialPages['CheckUser'] = 'SpecialCheckUser';
52 -$wgSpecialPageGroups['CheckUser'] = 'users';
53 -$wgAutoloadClasses['CheckUser'] = dirname(__FILE__) . '/CheckUser_body.php';
54 -$wgAutoloadClasses['SpecialCheckUser'] = dirname(__FILE__) . '/SpecialCheckUser.php';
55 -$wgAutoloadClasses['CheckUserApi'] = dirname(__FILE__) . '/CheckUser_api.php';
56 -$wgAPIModules['checkuser'] = 'CheckUserApi';
57 -
5875 /**
5976 * Hook function for RecentChange_save
6077 * Saves user data into the cu_changes table
@@ -66,7 +83,7 @@
6784 $ip = wfGetIP();
6885 // Get XFF header
6986 $xff = wfGetForwardedFor();
70 - list($xff_ip,$trusted) = efGetClientIPfromXFF( $xff );
 87+ list( $xff_ip, $trusted ) = efGetClientIPfromXFF( $xff );
7188 // Our squid XFFs can flood this up sometimes
7289 $isSquidOnly = efXFFChainIsSquid( $xff );
7390 // Get agent
@@ -75,13 +92,15 @@
7693 // $rc_comment should just be the log_comment
7794 // BC: check if log_type and log_action exists
7895 // If not, then $rc_comment is the actiontext and comment
79 - if( isset($rc_log_type) && $rc_type==RC_LOG ) {
 96+ if( isset( $rc_log_type ) && $rc_type == RC_LOG ) {
8097 $target = Title::makeTitle( $rc_namespace, $rc_title );
81 - $actionText = LogPage::actionText( $rc_log_type, $rc_log_action, $target, NULL, LogPage::extractParams($rc_params) );
 98+ $actionText = LogPage::actionText( $rc_log_type, $rc_log_action, $target,
 99+ null, LogPage::extractParams( $rc_params )
 100+ );
82101 } else {
83102 $actionText = '';
84103 }
85 -
 104+
86105 $dbw = wfGetDB( DB_MASTER );
87106 $cuc_id = $dbw->nextSequenceValue( 'cu_changes_cu_id_seq' );
88107 $rcRow = array(
@@ -97,29 +116,28 @@
98117 'cuc_last_oldid' => $rc_last_oldid,
99118 'cuc_type' => $rc_type,
100119 'cuc_timestamp' => $rc_timestamp,
101 - 'cuc_ip' => IP::sanitizeIP($ip),
 120+ 'cuc_ip' => IP::sanitizeIP( $ip ),
102121 'cuc_ip_hex' => $ip ? IP::toHex( $ip ) : null,
103122 'cuc_xff' => !$isSquidOnly ? $xff : '',
104 - 'cuc_xff_hex' => ($xff_ip && !$isSquidOnly) ? IP::toHex( $xff_ip ) : null,
 123+ 'cuc_xff_hex' => ( $xff_ip && !$isSquidOnly ) ? IP::toHex( $xff_ip ) : null,
105124 'cuc_agent' => $agent
106125 );
107126 # On PG, MW unsets cur_id due to schema incompatibilites. So it may not be set!
108 - if( isset($rc_cur_id) ) {
 127+ if( isset( $rc_cur_id ) ) {
109128 $rcRow['cuc_page_id'] = $rc_cur_id;
110129 }
111130 $dbw->insert( 'cu_changes', $rcRow, __METHOD__ );
112131
113132 # Every 100th edit, prune the checkuser changes table.
114 - wfSeedRandom();
115133 if( 0 == mt_rand( 0, 99 ) ) {
116134 # Periodically flush old entries from the recentchanges table.
117135 global $wgCUDMaxAge;
118136 $cutoff = $dbw->timestamp( time() - $wgCUDMaxAge );
119137 $recentchanges = $dbw->tableName( 'cu_changes' );
120138 $sql = "DELETE FROM $recentchanges WHERE cuc_timestamp < '{$cutoff}'";
121 - $dbw->query( $sql );
 139+ $dbw->query( $sql, __METHOD__ );
122140 }
123 -
 141+
124142 return true;
125143 }
126144
@@ -131,7 +149,7 @@
132150 wfLoadExtensionMessages( 'CheckUser' );
133151 // Get XFF header
134152 $xff = wfGetForwardedFor();
135 - list($xff_ip,$trusted) = efGetClientIPfromXFF( $xff );
 153+ list( $xff_ip, $trusted ) = efGetClientIPfromXFF( $xff );
136154 // Our squid XFFs can flood this up sometimes
137155 $isSquidOnly = efXFFChainIsSquid( $xff );
138156 // Get agent
@@ -145,20 +163,20 @@
146164 'cuc_minor' => 0,
147165 'cuc_user' => $user->getId(),
148166 'cuc_user_text' => $user->getName(),
149 - 'cuc_actiontext' => wfMsgForContent('checkuser-reset-action',$account->getName()),
 167+ 'cuc_actiontext' => wfMsgForContent( 'checkuser-reset-action', $account->getName() ),
150168 'cuc_comment' => '',
151169 'cuc_this_oldid' => 0,
152170 'cuc_last_oldid' => 0,
153171 'cuc_type' => RC_LOG,
154172 'cuc_timestamp' => $dbw->timestamp( wfTimestampNow() ),
155 - 'cuc_ip' => IP::sanitizeIP($ip),
 173+ 'cuc_ip' => IP::sanitizeIP( $ip ),
156174 'cuc_ip_hex' => $ip ? IP::toHex( $ip ) : null,
157175 'cuc_xff' => !$isSquidOnly ? $xff : '',
158 - 'cuc_xff_hex' => ($xff_ip && !$isSquidOnly) ? IP::toHex( $xff_ip ) : null,
 176+ 'cuc_xff_hex' => ( $xff_ip && !$isSquidOnly ) ? IP::toHex( $xff_ip ) : null,
159177 'cuc_agent' => $agent
160178 );
161179 $dbw->insert( 'cu_changes', $rcRow, __METHOD__ );
162 -
 180+
163181 return true;
164182 }
165183
@@ -179,7 +197,7 @@
180198 $ip = wfGetIP();
181199 // Get XFF header
182200 $xff = wfGetForwardedFor();
183 - list($xff_ip,$trusted) = efGetClientIPfromXFF( $xff );
 201+ list( $xff_ip, $trusted ) = efGetClientIPfromXFF( $xff );
184202 // Our squid XFFs can flood this up sometimes
185203 $isSquidOnly = efXFFChainIsSquid( $xff );
186204 // Get agent
@@ -193,20 +211,20 @@
194212 'cuc_minor' => 0,
195213 'cuc_user' => $userFrom->getId(),
196214 'cuc_user_text' => $userFrom->getName(),
197 - 'cuc_actiontext' => wfMsgForContent('checkuser-email-action',$hash),
 215+ 'cuc_actiontext' => wfMsgForContent( 'checkuser-email-action', $hash ),
198216 'cuc_comment' => '',
199217 'cuc_this_oldid' => 0,
200218 'cuc_last_oldid' => 0,
201219 'cuc_type' => RC_LOG,
202220 'cuc_timestamp' => $dbw->timestamp( wfTimestampNow() ),
203 - 'cuc_ip' => IP::sanitizeIP($ip),
 221+ 'cuc_ip' => IP::sanitizeIP( $ip ),
204222 'cuc_ip_hex' => $ip ? IP::toHex( $ip ) : null,
205223 'cuc_xff' => !$isSquidOnly ? $xff : '',
206 - 'cuc_xff_hex' => ($xff_ip && !$isSquidOnly) ? IP::toHex( $xff_ip ) : null,
 224+ 'cuc_xff_hex' => ( $xff_ip && !$isSquidOnly ) ? IP::toHex( $xff_ip ) : null,
207225 'cuc_agent' => $agent
208226 );
209227 $dbw->insert( 'cu_changes', $rcRow, __METHOD__ );
210 -
 228+
211229 return true;
212230 }
213231
@@ -215,41 +233,41 @@
216234 * Saves user data into the cu_changes table
217235 */
218236 function efUpdateAutoCreateData( $user ) {
219 - wfLoadExtensionMessages( 'CheckUser' );
220 - // Get IP
221 - $ip = wfGetIP();
222 - // Get XFF header
223 - $xff = wfGetForwardedFor();
224 - list($xff_ip,$trusted) = efGetClientIPfromXFF( $xff );
225 - // Our squid XFFs can flood this up sometimes
226 - $isSquidOnly = efXFFChainIsSquid( $xff );
227 - // Get agent
228 - $agent = wfGetAgent();
229 - $dbw = wfGetDB( DB_MASTER );
230 - $cuc_id = $dbw->nextSequenceValue( 'cu_changes_cu_id_seq' );
231 - $rcRow = array(
232 - 'cuc_id' => $cuc_id,
233 - 'cuc_page_id' => 0,
234 - 'cuc_namespace' => NS_USER,
235 - 'cuc_title' => '',
236 - 'cuc_minor' => 0,
237 - 'cuc_user' => $user->getId(),
238 - 'cuc_user_text' => $user->getName(),
239 - 'cuc_actiontext' => wfMsgForContent('checkuser-autocreate-action'),
240 - 'cuc_comment' => '',
241 - 'cuc_this_oldid' => 0,
242 - 'cuc_last_oldid' => 0,
243 - 'cuc_type' => RC_LOG,
244 - 'cuc_timestamp' => $dbw->timestamp( wfTimestampNow() ),
245 - 'cuc_ip' => IP::sanitizeIP($ip),
246 - 'cuc_ip_hex' => $ip ? IP::toHex( $ip ) : null,
247 - 'cuc_xff' => !$isSquidOnly ? $xff : '',
248 - 'cuc_xff_hex' => ($xff_ip && !$isSquidOnly) ? IP::toHex( $xff_ip ) : null,
249 - 'cuc_agent' => $agent
250 - );
251 - $dbw->insert( 'cu_changes', $rcRow, __METHOD__ );
252 -
253 - return true;
 237+ wfLoadExtensionMessages( 'CheckUser' );
 238+ // Get IP
 239+ $ip = wfGetIP();
 240+ // Get XFF header
 241+ $xff = wfGetForwardedFor();
 242+ list( $xff_ip, $trusted ) = efGetClientIPfromXFF( $xff );
 243+ // Our squid XFFs can flood this up sometimes
 244+ $isSquidOnly = efXFFChainIsSquid( $xff );
 245+ // Get agent
 246+ $agent = wfGetAgent();
 247+ $dbw = wfGetDB( DB_MASTER );
 248+ $cuc_id = $dbw->nextSequenceValue( 'cu_changes_cu_id_seq' );
 249+ $rcRow = array(
 250+ 'cuc_id' => $cuc_id,
 251+ 'cuc_page_id' => 0,
 252+ 'cuc_namespace' => NS_USER,
 253+ 'cuc_title' => '',
 254+ 'cuc_minor' => 0,
 255+ 'cuc_user' => $user->getId(),
 256+ 'cuc_user_text' => $user->getName(),
 257+ 'cuc_actiontext' => wfMsgForContent( 'checkuser-autocreate-action' ),
 258+ 'cuc_comment' => '',
 259+ 'cuc_this_oldid' => 0,
 260+ 'cuc_last_oldid' => 0,
 261+ 'cuc_type' => RC_LOG,
 262+ 'cuc_timestamp' => $dbw->timestamp( wfTimestampNow() ),
 263+ 'cuc_ip' => IP::sanitizeIP( $ip ),
 264+ 'cuc_ip_hex' => $ip ? IP::toHex( $ip ) : null,
 265+ 'cuc_xff' => !$isSquidOnly ? $xff : '',
 266+ 'cuc_xff_hex' => ( $xff_ip && !$isSquidOnly ) ? IP::toHex( $xff_ip ) : null,
 267+ 'cuc_agent' => $agent
 268+ );
 269+ $dbw->insert( 'cu_changes', $rcRow, __METHOD__ );
 270+
 271+ return true;
254272 }
255273
256274 /**
@@ -258,26 +276,28 @@
259277 * @param string $address, the ip that sent this header (optional)
260278 * @return array( string, bool )
261279 */
262 -function efGetClientIPfromXFF( $xff, $address=NULL ) {
263 - if( !$xff )
264 - return array(null, false);
 280+function efGetClientIPfromXFF( $xff, $address = null ) {
 281+ if( !$xff ) {
 282+ return array( null, false );
 283+ }
265284 // Avoid annoyingly long xff hacks
266285 $xff = trim( substr( $xff, 0, 255 ) );
267286 $client = null;
268287 $trusted = true;
269288 // Check each IP, assuming they are separated by commas
270 - $ips = explode(',',$xff);
 289+ $ips = explode( ',', $xff );
271290 foreach( $ips as $n => $ip ) {
272 - $ip = trim($ip);
 291+ $ip = trim( $ip );
273292 // If it is a valid IP, not a hash or such
274 - if( IP::isIPAddress($ip) ) {
 293+ if( IP::isIPAddress( $ip ) ) {
275294 # The first IP should be the client.
276295 # Start only from the first public IP.
277 - if( is_null($client) ) {
278 - if( IP::isPublic($ip) )
 296+ if( is_null( $client ) ) {
 297+ if( IP::isPublic( $ip ) ) {
279298 $client = $ip;
 299+ }
280300 # Check that all servers are trusted
281 - } else if( !wfIsTrustedProxy($ip) ) {
 301+ } elseif( !wfIsTrustedProxy( $ip ) ) {
282302 $trusted = false;
283303 break;
284304 }
@@ -285,44 +305,46 @@
286306 }
287307 // We still have to test if the IP that sent
288308 // this header is trusted to confirm results
289 - if ( $client != $address && (!$address || !wfIsTrustedProxy($address)) )
 309+ if ( $client != $address && ( !$address || !wfIsTrustedProxy( $address ) ) ) {
290310 $trusted = false;
291 -
 311+ }
 312+
292313 return array( $client, $trusted );
293314 }
294315
295316 function efXFFChainIsSquid( $xff ) {
296317 global $wgSquidServers, $wgSquidServersNoPurge;
297318
298 - if ( !$xff )
 319+ if ( !$xff ) {
299320 false;
 321+ }
300322 // Avoid annoyingly long xff hacks
301323 $xff = trim( substr( $xff, 0, 255 ) );
302324 $squidOnly = true;
303325 // Check each IP, assuming they are separated by commas
304 - $ips = explode(',',$xff);
 326+ $ips = explode( ',', $xff );
305327 foreach( $ips as $n => $ip ) {
306 - $ip = trim($ip);
 328+ $ip = trim( $ip );
307329 // If it is a valid IP, not a hash or such
308 - if ( IP::isIPAddress($ip) ) {
309 - if ( $n==0 ) {
 330+ if ( IP::isIPAddress( $ip ) ) {
 331+ if ( $n == 0 ) {
310332 // The first IP should be the client...
311 - } else if ( !in_array($ip,$wgSquidServers) && !in_array($ip,$wgSquidServersNoPurge) ) {
 333+ } elseif ( !in_array( $ip, $wgSquidServers ) && !in_array( $ip, $wgSquidServersNoPurge ) ) {
312334 $squidOnly = false;
313335 break;
314336 }
315337 }
316338 }
317 -
 339+
318340 return $squidOnly;
319341 }
320342
321343 function efCheckUserSchemaUpdates() {
322344 global $wgDBtype, $wgExtNewIndexes;
323 -
 345+
324346 # Run install.inc as necessary
325 - $base = dirname(__FILE__);
326 -
 347+ $base = dirname( __FILE__ );
 348+
327349 $db = wfGetDB( DB_MASTER );
328350 if( $db->tableExists( 'cu_changes' ) ) {
329351 echo "...cu_changes already exists.\n";
@@ -330,19 +352,23 @@
331353 require_once "$base/install.inc";
332354 create_cu_changes( $db );
333355 }
334 -
 356+
335357 if( $db->tableExists( 'cu_log' ) ) {
336358 echo "...cu_log already exists.\n";
337359 } else {
338360 require_once "$base/install.inc";
339361 create_cu_log( $db );
340362 }
341 -
342 - if ($wgDBtype == 'mysql') {
343 - $wgExtNewIndexes[] = array('cu_changes', 'cuc_ip_hex_time',
344 - "$base/archives/patch-cu_changes_indexes.sql" );
345 - $wgExtNewIndexes[] = array('cu_changes', 'cuc_user_ip_time',
346 - "$base/archives/patch-cu_changes_indexes2.sql" );
 363+
 364+ if ( $wgDBtype == 'mysql' ) {
 365+ $wgExtNewIndexes[] = array(
 366+ 'cu_changes', 'cuc_ip_hex_time',
 367+ "$base/archives/patch-cu_changes_indexes.sql"
 368+ );
 369+ $wgExtNewIndexes[] = array(
 370+ 'cu_changes', 'cuc_user_ip_time',
 371+ "$base/archives/patch-cu_changes_indexes2.sql"
 372+ );
347373 }
348374 return true;
349375 }
@@ -356,15 +382,28 @@
357383 return true;
358384 }
359385
 386+// Set up the new special page
 387+$wgSpecialPages['CheckUser'] = 'CheckUser';
 388+$wgSpecialPageGroups['CheckUser'] = 'users';
 389+$wgAutoloadClasses['CheckUser'] = dirname( __FILE__ ) . '/CheckUser_body.php';
360390
 391+/**
 392+ * Add a link to Special:CheckUser on Special:Contributions/<username> for
 393+ * privileged users.
 394+ * @param $id Integer: user ID
 395+ * @param $nt Title: user page title
 396+ * @param $links Array: tool links
 397+ * @return true
 398+ */
361399 function efLoadCheckUserLink( $id, $nt, &$links ) {
362 - global $wgUser;
363 - if( $wgUser->isAllowed( 'checkuser' ) ) {
364 - wfLoadExtensionMessages( 'CheckUser' );
 400+ global $wgUser;
 401+ if( $wgUser->isAllowed( 'checkuser' ) ) {
 402+ wfLoadExtensionMessages( 'CheckUser' );
365403 $links[] = $wgUser->getSkin()->makeKnownLinkObj(
366 - SpecialPage::getTitleFor( 'CheckUser' ),
367 - wfMsgHtml( 'checkuser-contribs' ),
368 - 'user=' . urlencode( $nt->getText() ) );
 404+ SpecialPage::getTitleFor( 'CheckUser' ),
 405+ wfMsgHtml( 'checkuser-contribs' ),
 406+ 'user=' . urlencode( $nt->getText() )
 407+ );
369408 }
370409 return true;
371410 }
Property changes on: branches/new-checkuser/CheckUser.php
___________________________________________________________________
Deleted: svn:eol-style
372411 - native
Property changes on: branches/new-checkuser/cu_changes.pg.sql
___________________________________________________________________
Deleted: svn:eol-style
373412 - native
Index: branches/new-checkuser/importLog.php
@@ -52,5 +52,3 @@
5353 echo " --test Test log parser without doing local lookups\n";
5454 echo "\n";
5555 }
56 -
57 -?>
\ No newline at end of file
Property changes on: branches/new-checkuser/importLog.php
___________________________________________________________________
Deleted: svn:eol-style
5856 - native
Property changes on: branches/new-checkuser/archives/patch-cu_changes_indexes.sql
___________________________________________________________________
Deleted: svn:eol-style
5957 - native
Property changes on: branches/new-checkuser/archives/patch-cu_changes_indexes2.sql
___________________________________________________________________
Deleted: svn:eol-style
6058 - native
Property changes on: branches/new-checkuser/cu_log.sql
___________________________________________________________________
Deleted: svn:eol-style
6159 - native
Index: branches/new-checkuser/checkuser.js
@@ -8,10 +8,14 @@
99 */
1010 function updateCIDRresult() {
1111 var form = document.getElementById( 'mw-checkuser-cidrform' );
12 - if( !form ) return; // no JS form
 12+ if( !form ) {
 13+ return; // no JS form
 14+ }
1315 form.style.display = 'inline'; // unhide form (JS active)
1416 var iplist = document.getElementById( 'mw-checkuser-iplist' );
15 - if( !iplist ) return; // no JS form
 17+ if( !iplist ) {
 18+ return; // no JS form
 19+ }
1620 var text = iplist.value;
1721 // Each line should have one IP or range
1822 if( text.indexOf("\n") != -1 ) {
@@ -21,53 +25,67 @@
2226 var ips = text.split("\t");
2327 } else if( text.indexOf(",") != -1 ) {
2428 var ips = text.split(",");
 29+ } else if( text.indexOf("-") != -1 ) {
 30+ var ips = text.split("-");
 31+ } else if( text.indexOf(" ") != -1 ) {
 32+ var ips = text.split(" ");
2533 } else {
2634 var ips = text.split(";");
2735 }
2836 var bin_prefix = 0;
2937 var prefix_cidr = 0;
30 - var prefix = new String( "" );
31 - // Go through each IP in the list, get it's binary form, and track
32 - // the largest binary prefix among them
33 - for( var i=0; i<ips.length; i++ ) {
 38+ var prefix = new String( '' );
 39+ // Go through each IP in the list, get its binary form, and
 40+ // track the largest binary prefix among them...
 41+ for( var i = 0; i < ips.length; i++ ) {
 42+ var invalid = false;
3443 // ...in the spirit of block.js, call this "addy"
3544 var addy = ips[i];
3645 // Match the first IP in each list (ignore other garbage)
37 - var ipV4 = addy.match(/(^|\b)(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(\/\d+)?\b/);
 46+ var ipV4 = addy.match(/(^|\b)(\d+\.\d+\.\d+\.\d+)(\/\d+)?\b/);
3847 var ipV6 = addy.match(/(^|\b)(:(:[0-9A-Fa-f]{1,4}){1,7}|[0-9A-Fa-f]{1,4}(:{1,2}[0-9A-Fa-f]{1,4}|::$){1,7})(\/\d+)?\b/);
3948 // Binary form
40 - var bin = new String( "" );
41 - // Rebuilt formatted bin_prefix for each IP
42 - if( ipV4 || ipV6 ) prefix = '';
 49+ var bin = new String( '' );
4350 // Convert the IP to binary form: IPv4
4451 if( ipV4 ) {
4552 var ip = ipV4[2];
4653 var cidr = ipV4[3]; // CIDR, if it exists
4754 // Get each quad integer
4855 var blocs = ip.split('.');
49 - for( var x=0; x<blocs.length; x++ ) {
 56+ // IANA 1.0.0.0/8, 2.0.0.0/8
 57+ if( blocs[0] < 3 ) {
 58+ continue;
 59+ }
 60+ for( var x = 0; x < blocs.length; x++ ) {
5061 bloc = parseInt( blocs[x], 10 );
51 - if( bloc > 255 ) continue; // bad IP!
52 - bin_block = bloc.toString(2); // concat bin with binary form of bloc
 62+ if( bloc > 255 ) {
 63+ invalid = true; // bad IP!
 64+ break; // bad IP!
 65+ }
 66+ bin_block = bloc.toString( 2 ); // concat bin with binary form of bloc
5367 while( bin_block.length < 8 ) {
54 - bin_block = "0" + bin_block; // pad out as needed
 68+ bin_block = '0' + bin_block; // pad out as needed
5569 }
5670 bin += bin_block;
5771 }
 72+ if( invalid ) {
 73+ continue; // move to next IP
 74+ }
 75+ prefix = ''; // Rebuild formatted bin_prefix for each IP
5876 // Apply any valid CIDRs
5977 if( cidr ) {
6078 cidr = cidr.match( /\d+$/ )[0]; // get rid of slash
61 - bin = bin.substring(0,cidr); // truncate bin
 79+ bin = bin.substring( 0, cidr ); // truncate bin
6280 }
6381 // Init bin_prefix
6482 if( bin_prefix === 0 ) {
6583 bin_prefix = new String( bin );
6684 // Get largest common bin_prefix
6785 } else {
68 - for( var x=0; x<bin_prefix.length; x++ ) {
 86+ for( var x = 0; x < bin_prefix.length; x++ ) {
6987 // Bin_prefix always smaller than bin unless a CIDR was used on bin
7088 if( bin[x] == undefined || bin_prefix[x] != bin[x] ) {
71 - bin_prefix = bin_prefix.substring(0,x); // shorten bin_prefix
 89+ bin_prefix = bin_prefix.substring( 0, x ); // shorten bin_prefix
7290 break;
7391 }
7492 }
@@ -76,36 +94,42 @@
7795 var prefix_cidr = bin_prefix.length;
7896 // CIDR too small?
7997 if( prefix_cidr < 16 ) {
80 - document.getElementById( 'mw-checkuser-cidr-res' ).value = "!";
81 - document.getElementById( 'mw-checkuser-ipnote' ).innerHTML = "&gt;"+Math.pow(2,32-prefix_cidr);
 98+ document.getElementById( 'mw-checkuser-cidr-res' ).value = '!';
 99+ document.getElementById( 'mw-checkuser-ipnote' ).innerHTML = '&gt;' + Math.pow( 2, 32 - prefix_cidr );
82100 return; // too big
83101 }
84102 // Build the IP in dotted-quad form
85 - for( var z=0; z<=3; z++ ) {
 103+ for( var z = 0; z <= 3; z++ ) {
86104 var bloc = 0;
87 - var start = z*8;
 105+ var start = z * 8;
88106 var end = start + 7;
89 - for( var x=start; x<=end; x++ ) {
90 - if( bin_prefix[x] == undefined ) break;
91 - bloc += parseInt(bin_prefix[x],10)*Math.pow(2,end-x);
 107+ for( var x = start; x <= end; x++ ) {
 108+ if( bin_prefix[x] == undefined ) {
 109+ break;
 110+ }
 111+ bloc += parseInt( bin_prefix[x], 10 ) * Math.pow( 2, end - x );
92112 }
93113 prefix += ( z == 3 ) ? bloc : bloc + '.';
94114 }
95115 // Get IPs affected
96 - ip_count = Math.pow(2,32-prefix_cidr);
 116+ ip_count = Math.pow( 2, 32 - prefix_cidr );
97117 // Is the CIDR meaningful?
98 - if( prefix_cidr == 32 ) prefix_cidr = false;
 118+ if( prefix_cidr == 32 ) {
 119+ prefix_cidr = false;
 120+ }
99121 // Convert the IP to binary form: IPv6
100122 } else if( ipV6 ) {
101123 var ip = ipV6[2];
102124 var cidr = ipV6[0].match( /\/\d+$/ );
103125 cidr = cidr ? cidr[0] : false;
104126 var abbrevs = ip.match( /::/g );
105 - if( abbrevs && abbrevs.length > 1 ) continue; // bad IP!
 127+ if( abbrevs && abbrevs.length > 1 ) {
 128+ continue; // bad IP!
 129+ }
106130 // Expand out "::"s
107131 if( abbrevs && abbrevs.length > 0 ) {
108132 var colons = ip.match( /:/g );
109 - var needed = 7 - (colons.length - 2); // 2 from "::"
 133+ var needed = 7 - ( colons.length - 2 ); // 2 from "::"
110134 var insert = '';
111135 while( needed > 1 ) {
112136 insert += ':0';
@@ -113,34 +137,43 @@
114138 }
115139 ip = ip.replace( '::', insert + ':' );
116140 // For IPs that start with "::", correct the final IP so that it starts with '0' and not ':'
117 - if( ip[0] == ':' ) ip = '0' + ip;
 141+ if( ip[0] == ':' ) {
 142+ ip = '0' + ip;
 143+ }
118144 }
119145 // Get each hex octant
120146 var blocs = ip.split(':');
121 - for( var x=0; x<=7; x++ ) {
122 - bloc = blocs[x] ? blocs[x] : "0";
123 - if( bloc > "ffff" ) continue; // bad IP!
 147+ for( var x = 0; x <= 7; x++ ) {
 148+ bloc = blocs[x] ? blocs[x] : '0';
 149+ if( bloc > 'ffff' ) {
 150+ invalid = true; // bad IP!
 151+ break; // bad IP!
 152+ }
124153 int_block = hex2int( bloc ); // convert hex -> int
125 - bin_block = int_block.toString(2); // concat bin with binary form of bloc
 154+ bin_block = int_block.toString( 2 ); // concat bin with binary form of bloc
126155 while( bin_block.length < 16 ) {
127 - bin_block = "0" + bin_block; // pad out as needed
 156+ bin_block = '0' + bin_block; // pad out as needed
128157 }
129158 bin += bin_block;
130159 }
 160+ if( invalid ) {
 161+ continue; // move to next IP
 162+ }
 163+ prefix = ''; // Rebuild formatted bin_prefix for each IP
131164 // Apply any valid CIDRs
132165 if( cidr ) {
133166 cidr = cidr.match( /\d+$/ )[0]; // get rid of slash
134 - bin = bin.substring(0,cidr); // truncate bin
 167+ bin = bin.substring( 0, cidr ); // truncate bin
135168 }
136169 // Init bin_prefix
137170 if( bin_prefix === 0 ) {
138171 bin_prefix = new String( bin );
139172 // Get largest common bin_prefix
140173 } else {
141 - for( var x=0; x<bin_prefix.length; x++ ) {
 174+ for( var x = 0; x < bin_prefix.length; x++ ) {
142175 // Bin_prefix always smaller than bin unless a CIDR was used on bin
143176 if( bin[x] == undefined || bin_prefix[x] != bin[x] ) {
144 - bin_prefix = bin_prefix.substring(0,x); // shorten bin_prefix
 177+ bin_prefix = bin_prefix.substring( 0, x ); // shorten bin_prefix
145178 break;
146179 }
147180 }
@@ -149,30 +182,34 @@
150183 var prefix_cidr = bin_prefix.length;
151184 // CIDR too small?
152185 if( prefix_cidr < 96 ) {
153 - document.getElementById( 'mw-checkuser-cidr-res' ).value = "!";
154 - document.getElementById( 'mw-checkuser-ipnote' ).innerHTML = "&gt;"+Math.pow(2,128-prefix_cidr);
 186+ document.getElementById( 'mw-checkuser-cidr-res' ).value = '!';
 187+ document.getElementById( 'mw-checkuser-ipnote' ).innerHTML = '&gt;' + Math.pow( 2, 128 - prefix_cidr );
155188 return; // too big
156189 }
157190 // Build the IP in dotted-quad form
158 - for( var z=0; z<=7; z++ ) {
 191+ for( var z = 0; z <= 7; z++ ) {
159192 var bloc = 0;
160193 var start = z*16;
161194 var end = start + 15;
162 - for( var x=start; x<=end; x++ ) {
163 - if( bin_prefix[x] == undefined ) break;
164 - bloc += parseInt(bin_prefix[x],10)*Math.pow(2,end-x);
 195+ for( var x = start; x <= end; x++ ) {
 196+ if( bin_prefix[x] == undefined ) {
 197+ break;
 198+ }
 199+ bloc += parseInt( bin_prefix[x], 10 ) * Math.pow( 2, end - x );
165200 }
166 - bloc = bloc.toString(16); // convert to hex
 201+ bloc = bloc.toString( 16 ); // convert to hex
167202 prefix += ( z == 7 ) ? bloc : bloc + ':';
168203 }
169204 // Get IPs affected
170 - ip_count = Math.pow(2,128-prefix_cidr);
 205+ ip_count = Math.pow( 2, 128 - prefix_cidr );
171206 // Is the CIDR meaningful?
172 - if( prefix_cidr == 128 ) prefix_cidr = false;
 207+ if( prefix_cidr == 128 ) {
 208+ prefix_cidr = false;
 209+ }
173210 }
174211 }
175212 // Update form
176 - if( prefix != "" ) {
 213+ if( prefix != '' ) {
177214 if( prefix_cidr != false ) {
178215 document.getElementById( 'mw-checkuser-cidr-res' ).value = prefix + '/' + prefix_cidr;
179216 } else {
@@ -183,7 +220,7 @@
184221 document.getElementById( 'mw-checkuser-cidr-res' ).value = '?';
185222 document.getElementById( 'mw-checkuser-ipnote' ).innerHTML = '';
186223 }
187 -
 224+
188225 }
189226 addOnloadHook( updateCIDRresult );
190227
@@ -192,10 +229,9 @@
193230 hex = new String( hex );
194231 hex = hex.toLowerCase();
195232 var intform = 0;
196 - for( var i=0; i<hex.length; i++ ) {
 233+ for( var i = 0; i < hex.length; i++ ) {
197234 var digit = 0;
198 - switch( hex[i] )
199 - {
 235+ switch( hex[i] ) {
200236 case 'a':
201237 digit = 10;
202238 break;
@@ -218,7 +254,7 @@
219255 digit = parseInt( hex[i], 10 );
220256 break;
221257 }
222 - intform += digit*Math.pow(16,hex.length-1-i);
 258+ intform += digit * Math.pow( 16, hex.length - 1 - i );
223259 }
224260 return intform;
225261 }
Property changes on: branches/new-checkuser/checkuser.js
___________________________________________________________________
Deleted: svn:eol-style
226262 - native
Index: branches/new-checkuser/CheckUser.alias.php
@@ -2,7 +2,8 @@
33 /**
44 * Aliases for Special:CheckUser
55 *
6 - * @addtogroup Extensions
 6+ * @file
 7+ * @ingroup Extensions
78 */
89
910 $aliases = array();
@@ -11,19 +12,15 @@
1213 * @author Jon Harald Søby
1314 */
1415 $aliases['en'] = array(
15 - 'CheckUser' => array( 'CheckUser' ),
 16+ 'CheckUser' => array( 'CheckUser' ),
1617 );
1718
18 -/** Arabic (العربية)
19 - * @author Meno25
20 - */
 19+/** Arabic (العربية) */
2120 $aliases['ar'] = array(
2221 'CheckUser' => array( 'تدقيق_مستخدم' ),
2322 );
2423
25 -/** Egyptian Spoken Arabic (مصرى)
26 - * @author Meno25
27 - */
 24+/** Egyptian Spoken Arabic (مصرى) */
2825 $aliases['arz'] = array(
2926 'CheckUser' => array( 'تدقيق_مستخدم' ),
3027 );
@@ -43,9 +40,7 @@
4441 'CheckUser' => array( 'ProvjeraKorisnika' ),
4542 );
4643
47 -/** German (Deutsch)
48 - * @author Raimond Spekking
49 - */
 44+/** German (Deutsch) */
5045 $aliases['de'] = array(
5146 'CheckUser' => array( 'Checkuser' ),
5247 );
@@ -77,7 +72,7 @@
7873
7974 /** French (Français) */
8075 $aliases['fr'] = array(
81 - 'CheckUser' => array( "Vérificateur d'utilisateur", "Vérificateur d'utilisateurs", 'VérificateurUtilisateur', 'VérificateurUtilisateurs', 'Vérificateur d’adresse', 'VérificateurAdresse', 'VerificateurAdresse' ),
 76+ 'CheckUser' => array( "Vérificateur d'utilisateur", "Vérificateur d'utilisateurs", 'VérificateurUtilisateur', 'VérificateurUtilisateurs', 'Vérificateur d’adresse' ),
8277 );
8378
8479 /** Franco-Provençal (Arpetan) */
@@ -95,9 +90,12 @@
9691 'CheckUser' => array( 'Benutzerpriefig' ),
9792 );
9893
99 -/** Hebrew (עברית)
100 - * @author Rotem Liss
101 - */
 94+/** Gujarati (ગુજરાતી) */
 95+$aliases['gu'] = array(
 96+ 'CheckUser' => array( 'સભ્યચકાસ' ),
 97+);
 98+
 99+/** Hebrew (עברית) */
102100 $aliases['he'] = array(
103101 'CheckUser' => array( 'בדיקת_משתמש' ),
104102 );
@@ -129,12 +127,12 @@
130128
131129 /** Indonesian (Bahasa Indonesia) */
132130 $aliases['id'] = array(
133 - 'CheckUser' => array( 'Pemeriksa' ),
 131+ 'CheckUser' => array( 'Periksa pengguna', 'PeriksaPengguna', 'Pemeriksa' ),
134132 );
135133
136134 /** Japanese (日本語) */
137135 $aliases['ja'] = array(
138 - 'CheckUser' => array( 'チェックユーザー', 'チェックユーザ' ),
 136+ 'CheckUser' => array( 'チェックユーザー', 'チェックユーザ', '利用者調査' ),
139137 );
140138
141139 /** Khmer (ភាសាខ្មែរ) */
@@ -162,6 +160,16 @@
163161 'CheckUser' => array( 'ПроверкаНаКорисник' ),
164162 );
165163
 164+/** Malayalam (മലയാളം) */
 165+$aliases['ml'] = array(
 166+ 'CheckUser' => array( 'ചെക്ക്‌‌യൂസർ' ),
 167+);
 168+
 169+/** Marathi (मराठी) */
 170+$aliases['mr'] = array(
 171+ 'CheckUser' => array( 'सदस्यतपासनिस' ),
 172+);
 173+
166174 /** Malay (Bahasa Melayu) */
167175 $aliases['ms'] = array(
168176 'CheckUser' => array( 'Perisik' ),
@@ -182,9 +190,7 @@
183191 'CheckUser' => array( 'GebruikerControleren' ),
184192 );
185193
186 -/** Norwegian (bokmål)‬ (‪Norsk (bokmål)‬)
187 - * @author Jon Harald Søby
188 - */
 194+/** Norwegian (bokmål)‬ (‪Norsk (bokmål)‬) */
189195 $aliases['no'] = array(
190196 'CheckUser' => array( 'IP-sjekk' ),
191197 );
@@ -204,6 +210,11 @@
205211 'CheckUser' => array( 'योजकपरिक्षक' ),
206212 );
207213
 214+/** Slovak (Slovenčina) */
 215+$aliases['sk'] = array(
 216+ 'CheckUser' => array( 'SkontrolovaťPoužívateľa' ),
 217+);
 218+
208219 /** Swahili (Kiswahili) */
209220 $aliases['sw'] = array(
210221 'CheckUser' => array( 'MtumiajiMwangalizi' ),
@@ -224,8 +235,23 @@
225236 'CheckUser' => array( 'Denetçi' ),
226237 );
227238
 239+/** Vèneto (Vèneto) */
 240+$aliases['vec'] = array(
 241+ 'CheckUser' => array( 'ControlaUtente' ),
 242+);
 243+
228244 /** Veps (Vepsan kel') */
229245 $aliases['vep'] = array(
230246 'CheckUser' => array( 'KodvdaKävutajad' ),
231247 );
232248
 249+/** Simplified Chinese (‪中文(简体)‬) */
 250+$aliases['zh-hans'] = array(
 251+ 'CheckUser' => array( '用户查核' ),
 252+);
 253+
 254+/** Traditional Chinese (‪中文(繁體)‬) */
 255+$aliases['zh-hant'] = array(
 256+ 'CheckUser' => array( '用戶查核' ),
 257+);
 258+
Property changes on: branches/new-checkuser/CheckUser.alias.php
___________________________________________________________________
Deleted: svn:eol-style
233259 - native
Index: branches/new-checkuser/cu_log_import.inc
@@ -90,5 +90,3 @@
9191 }
9292 echo "...cu_log table populated: $matched matched rows, $unmatched discarded rows\n";
9393 }
94 -
95 -?>
\ No newline at end of file
Property changes on: branches/new-checkuser/cu_log_import.inc
___________________________________________________________________
Deleted: svn:eol-style
9694 - native
Property changes on: branches/new-checkuser/cu_log.pg.sql
___________________________________________________________________
Deleted: svn:eol-style
9795 - native
Index: branches/new-checkuser/install.php
@@ -9,7 +9,7 @@
1010 : dirname( __FILE__ ) . '/../../maintenance/commandLine.inc' );
1111 require_once dirname( __FILE__ ) . '/install.inc';
1212
13 -$db =& wfGetDB( DB_MASTER );
 13+$db = wfGetDB( DB_MASTER );
1414 if ( $db->tableExists( 'cu_changes' ) && !isset( $options['force'] ) ) {
1515 echo "...cu_changes already exists.\n";
1616 } else {
Property changes on: branches/new-checkuser/install.php
___________________________________________________________________
Deleted: svn:eol-style
1717 - native
Property changes on: branches/new-checkuser/cu_changes.sql
___________________________________________________________________
Deleted: svn:eol-style
1818 - native
Property changes on: branches/new-checkuser/install.inc
___________________________________________________________________
Deleted: svn:eol-style
1919 - native

Status & tagging log