* The DeferredStringifier class is deprecated, use Message::listParam() instead.
* The type string for the parameter $lang of DateFormatter::getInstance is
deprecated.
+* The global functions wfProfileIn and wfProfileOut, deprecated in 1.25, have been removed.
== Compatibility ==
MediaWiki 1.31 requires PHP 5.5.9 or later. Although HHVM 3.18.5 or later is supported,
'Wikimedia\\Rdbms\\TransactionProfiler' => __DIR__ . '/includes/libs/rdbms/TransactionProfiler.php',
'WikitextContent' => __DIR__ . '/includes/content/WikitextContent.php',
'WikitextContentHandler' => __DIR__ . '/includes/content/WikitextContentHandler.php',
+ 'WikitextLogFormatter' => __DIR__ . '/includes/logging/WikitextLogFormatter.php',
'WinCacheBagOStuff' => __DIR__ . '/includes/libs/objectcache/WinCacheBagOStuff.php',
'WithoutInterwikiPage' => __DIR__ . '/includes/specials/SpecialWithoutinterwiki.php',
'WordLevelDiff' => __DIR__ . '/includes/diff/WordLevelDiff.php',
$dbw = wfGetDB( DB_MASTER );
}
- # Periodic purge via commit hooks
- if ( mt_rand( 0, 9 ) == 0 ) {
- self::purgeExpired();
- }
+ self::purgeExpired();
$row = $this->getDatabaseArray( $dbw );
wfGetDB( DB_MASTER ),
__METHOD__,
function ( IDatabase $dbw, $fname ) {
- $dbw->delete(
- 'ipblocks',
+ $ids = $dbw->selectFieldValues( 'ipblocks',
+ 'ipb_id',
[ 'ipb_expiry < ' . $dbw->addQuotes( $dbw->timestamp() ) ],
$fname
);
+ if ( $ids ) {
+ $dbw->delete( 'ipblocks', [ 'ipb_id' => $ids ], $fname );
+ }
}
) );
}
private function showForm() {
global $wgOut, $wgUser, $wgRequest;
+ $conf = RequestContext::getMain()->getConfig();
+ $oldCommentSchema = $conf->get( 'CommentTableSchemaMigrationStage' ) === MIGRATION_OLD;
+
if ( $wgUser->isAllowed( 'suppressrevision' ) ) {
$suppress = "<tr id=\"wpDeleteSuppressRow\">
<td></td>
$suppress = '';
}
+ $wgOut->addModules( 'mediawiki.action.delete.file' );
+
$checkWatch = $wgUser->getBoolOption( 'watchdeletion' ) || $wgUser->isWatched( $this->title );
$form = Xml::openElement( 'form', [ 'method' => 'post', 'action' => $this->getAction(),
'id' => 'mw-img-deleteconfirm' ] ) .
Xml::label( wfMessage( 'filedelete-otherreason' )->text(), 'wpReason' ) .
"</td>
<td class='mw-input'>" .
- Xml::input( 'wpReason', 60, $wgRequest->getText( 'wpReason' ),
- [ 'type' => 'text', 'maxlength' => '255', 'tabindex' => '2', 'id' => 'wpReason' ] ) .
+ Xml::input( 'wpReason', 60, $wgRequest->getText( 'wpReason' ), [
+ 'type' => 'text',
+ // HTML maxlength uses "UTF-16 code units", which means that characters outside BMP
+ // (e.g. emojis) count for two each. This limit is overridden in JS to instead count
+ // Unicode codepoints (or 255 UTF-8 bytes for old schema).
+ 'maxlength' => $oldCommentSchema ? 255 : CommentStore::COMMENT_CHARACTER_LIMIT,
+ 'tabindex' => '2',
+ 'id' => 'wpReason'
+ ] ) .
"</td>
</tr>
{$suppress}";
return getrusage( 0 /* RUSAGE_SELF */ );
}
}
-
-/**
- * Begin profiling of a function
- * @param string $functionname Name of the function we will profile
- * @deprecated since 1.25
- */
-function wfProfileIn( $functionname ) {
-}
-
-/**
- * Stop profiling of a function
- * @param string $functionname Name of the function we have profiled
- * @deprecated since 1.25
- */
-function wfProfileOut( $functionname = 'missing' ) {
-}
"apihelp-parse-param-disablepp": "Em vez deste, usar <var>$1disablelimitreport</var>.",
"apihelp-parse-param-disableeditsection": "Omitir as hiperligações para edição da secção no resultado da análise sintática.",
"apihelp-parse-param-disabletidy": "Não fazer a limpeza do HTML (isto é, o ''tidy'') no resultado da análise sintática.",
- "apihelp-parse-param-disablestylededuplication": "Não desduplicar os estilos especificados em linha na saída do analisador sintático.",
+ "apihelp-parse-param-disablestylededuplication": "Não desduplicar as folhas de estilo internas (etiquetas <nowiki><style></nowiki>) na saída do analisador sintático.",
"apihelp-parse-param-generatexml": "Gerar a árvore de análise XML (requer o modelo de conteúdo <code>$1</code>; substituído por <kbd>$2prop=parsetree</kbd>).",
"apihelp-parse-param-preview": "Executar a análise em modo de antevisão.",
"apihelp-parse-param-sectionpreview": "Executar a análise em modo de antevisão (também ativa o modo de antevisão).",
$state['userid'] = $user->getId();
// Update user count
- \DeferredUpdates::addUpdate( new \SiteStatsUpdate( 0, 0, 0, 0, 1 ) );
+ \DeferredUpdates::addUpdate( \SiteStatsUpdate::factory( [ 'users' => 1 ] ) );
// Watch user's userpage and talk page
$user->addWatch( $user->getUserPage(), User::IGNORE_USER_RIGHTS );
$user->saveSettings();
// Update user count
- \DeferredUpdates::addUpdate( new \SiteStatsUpdate( 0, 0, 0, 0, 1 ) );
+ \DeferredUpdates::addUpdate( \SiteStatsUpdate::factory( [ 'users' => 1 ] ) );
// Watch user's userpage and talk page
\DeferredUpdates::addCallableUpdate( function () use ( $user ) {
$user->addWatch( $user->getUserPage(), User::IGNORE_USER_RIGHTS );
$textAttribs['class'][] = $this->mClass;
}
+ if ( isset( $this->mParams['maxlength-unit'] ) ) {
+ $textAttribs['data-mw-maxlength-unit'] = $this->mParams['maxlength-unit'];
+ }
+
$allowedParams = [
'required',
'autofocus',
'disabled',
'tabindex',
'maxlength', // gets dynamic with javascript, see mediawiki.htmlform.js
+ 'maxlength-unit', // 'bytes' or 'codepoints', see mediawiki.htmlform.js
];
$textAttribs += $this->getAttributes( $allowedParams );
# TextInput
$textAttribs = [
'name' => $this->mName . '-other',
- 'size' => $this->getSize(),
- 'class' => [ 'mw-htmlform-select-and-other-field' ],
- 'data-id-select' => $this->mID . '-select',
'value' => $value[2],
];
'textinput' => $textAttribs,
'dropdowninput' => $dropdownInputAttribs,
'or' => false,
+ 'classes' => [ 'mw-htmlform-select-and-other-field' ],
+ 'data' => [
+ 'maxlengthUnit' => isset( $this->mParams['maxlength-unit'] )
+ ? $this->mParams['maxlength-unit'] : 'bytes'
+ ],
] );
}
--- /dev/null
+<?php
+/**
+ * Formatter to allow log entries to contain formatted wikitext.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ */
+
+/**
+ * Log formatter specifically for log entries containing wikitext.
+ * @since 1.31
+ */
+class WikitextLogFormatter extends LogFormatter {
+ /**
+ * @return string
+ */
+ public function getActionMessage() {
+ return parent::getActionMessage()->parse();
+ }
+}
$outputPage->setPageTitle( wfMessage( 'delete-confirm', $title->getPrefixedText() ) );
$outputPage->addBacklinkSubtitle( $title );
$outputPage->setRobotPolicy( 'noindex,nofollow' );
+ $outputPage->addModules( 'mediawiki.action.delete' );
$backlinkCache = $title->getBacklinkCache();
if ( $backlinkCache->hasLinks( 'pagelinks' ) || $backlinkCache->hasLinks( 'templatelinks' ) ) {
]
);
+ // HTML maxlength uses "UTF-16 code units", which means that characters outside BMP
+ // (e.g. emojis) count for two each. This limit is overridden in JS to instead count
+ // Unicode codepoints (or 255 UTF-8 bytes for old schema).
+ $conf = $this->getContext()->getConfig();
+ $oldCommentSchema = $conf->get( 'CommentTableSchemaMigrationStage' ) === MIGRATION_OLD;
$fields[] = new OOUI\FieldLayout(
new OOUI\TextInputWidget( [
'name' => 'wpReason',
'inputId' => 'wpReason',
'tabIndex' => 2,
- 'maxLength' => 255,
+ 'maxLength' => $oldCommentSchema ? 255 : CommentStore::COMMENT_CHARACTER_LIMIT,
'infusable' => true,
'value' => $reason,
'autofocus' => true,
$cmd[] = '--noroot';
}
- $seccomp = [];
-
- if ( $this->hasRestriction( Shell::SECCOMP ) ) {
- $seccomp[] = '@default';
- }
+ $useSeccomp = $this->hasRestriction( Shell::SECCOMP );
+ $extraSeccomp = [];
if ( $this->hasRestriction( Shell::NO_EXECVE ) ) {
- $seccomp[] = 'execve';
+ $extraSeccomp[] = 'execve';
// Normally firejail will run commands in a bash shell,
// but that won't work if we ban the execve syscall, so
// run the command without a shell.
$cmd[] = '--shell=none';
}
- if ( $seccomp ) {
- $cmd[] = '--seccomp=' . implode( ',', $seccomp );
+ if ( $useSeccomp ) {
+ $seccomp = '--seccomp';
+ if ( $extraSeccomp ) {
+ // The "@default" seccomp group will always be enabled
+ $seccomp .= '=' . implode( ',', $extraSeccomp );
+ }
+ $cmd[] = $seccomp;
}
if ( $this->hasRestriction( Shell::PRIVATE_DEV ) ) {
$suggestedDurations = self::getSuggestedDurations();
+ $conf = $this->getConfig();
+ $oldCommentSchema = $conf->get( 'CommentTableSchemaMigrationStage' ) === MIGRATION_OLD;
+
$a = [
'Target' => [
'type' => 'user',
],
'Reason' => [
'type' => 'selectandother',
- 'maxlength' => 255,
+ // HTML maxlength uses "UTF-16 code units", which means that characters outside BMP
+ // (e.g. emojis) count for two each. This limit is overridden in JS to instead count
+ // Unicode codepoints (or 255 UTF-8 bytes for old schema).
+ 'maxlength' => $oldCommentSchema ? 255 : CommentStore::COMMENT_CHARACTER_LIMIT,
+ 'maxlength-unit' => 'codepoints',
'label-message' => 'ipbreason',
'options-message' => 'ipbreason-dropdown',
],
// Show form if the user can submit
if ( $this->isAllowed ) {
+ $conf = $this->getConfig();
+ $oldCommentSchema = $conf->get( 'CommentTableSchemaMigrationStage' ) === MIGRATION_OLD;
+
$form = Xml::openElement( 'form', [ 'method' => 'post',
'action' => $this->getPageTitle()->getLocalURL( [ 'action' => 'submit' ] ),
'id' => 'mw-revdel-form-revisions' ] ) .
Xml::label( $this->msg( 'tags-edit-reason' )->text(), 'wpReason' ) .
'</td>' .
'<td class="mw-input">' .
- Xml::input(
- 'wpReason',
- 60,
- $this->reason,
- [ 'id' => 'wpReason', 'maxlength' => 100 ]
- ) .
+ Xml::input( 'wpReason', 60, $this->reason, [
+ 'id' => 'wpReason',
+ // HTML maxlength uses "UTF-16 code units", which means that characters outside BMP
+ // (e.g. emojis) count for two each. This limit is overridden in JS to instead count
+ // Unicode codepoints (or 255 UTF-8 bytes for old schema).
+ // "- 155" is to leave room for the auto-generated part of the log entry.
+ 'maxlength' => $oldCommentSchema ? 100 : CommentStore::COMMENT_CHARACTER_LIMIT - 155,
+ ] ) .
'</td>' .
"</tr><tr>\n" .
'<td></td>' .
$out->addHTML( "</div>\n" );
}
- // Byte limit (not string length limit) for wpReason and wpNewTitleMain
- // is enforced in the mediawiki.special.movePage module
+ // Length limit for wpReason and wpNewTitleMain is enforced in the
+ // mediawiki.special.movePage module
$immovableNamespaces = [];
foreach ( array_keys( $this->getLanguage()->getNamespaces() ) as $nsId ) {
]
);
+ // HTML maxlength uses "UTF-16 code units", which means that characters outside BMP
+ // (e.g. emojis) count for two each. This limit is overridden in JS to instead count
+ // Unicode codepoints (or 255 UTF-8 bytes for old schema).
+ $conf = $this->getConfig();
+ $oldCommentSchema = $conf->get( 'CommentTableSchemaMigrationStage' ) === MIGRATION_OLD;
$fields[] = new OOUI\FieldLayout(
new OOUI\TextInputWidget( [
'name' => 'wpReason',
'id' => 'wpReason',
- 'maxLength' => 200,
+ 'maxLength' => $oldCommentSchema ? 200 : CommentStore::COMMENT_CHARACTER_LIMIT,
'infusable' => true,
'value' => $this->reason,
] ),
// Show form if the user can submit
if ( $this->mIsAllowed ) {
+ $out->addModules( [ 'mediawiki.special.revisionDelete' ] );
$out->addModuleStyles( 'mediawiki.special' );
+ $conf = $this->getConfig();
+ $oldCommentSchema = $conf->get( 'CommentTableSchemaMigrationStage' ) === MIGRATION_OLD;
+
$form = Xml::openElement( 'form', [ 'method' => 'post',
'action' => $this->getPageTitle()->getLocalURL( [ 'action' => 'submit' ] ),
'id' => 'mw-revdel-form-revisions' ] ) .
Xml::label( $this->msg( 'revdelete-otherreason' )->text(), 'wpReason' ) .
'</td>' .
'<td class="mw-input">' .
- Xml::input(
- 'wpReason',
- 60,
- $this->otherReason,
- [ 'id' => 'wpReason', 'maxlength' => 100 ]
- ) .
+ Xml::input( 'wpReason', 60, $this->otherReason, [
+ 'id' => 'wpReason',
+ // HTML maxlength uses "UTF-16 code units", which means that characters outside BMP
+ // (e.g. emojis) count for two each. This limit is overridden in JS to instead count
+ // Unicode codepoints (or 255 UTF-8 bytes for old schema).
+ // "- 155" is to leave room for the 'wpRevDeleteReasonList' value.
+ 'maxlength' => $oldCommentSchema ? 100 : CommentStore::COMMENT_CHARACTER_LIMIT - 155,
+ ] ) .
'</td>' .
"</tr><tr>\n" .
'<td></td>' .
'content' => new OOUI\HtmlSnippet( $this->msg( 'undeleteextrahelp' )->parseAsBlock() )
] );
+ $conf = $this->getConfig();
+ $oldCommentSchema = $conf->get( 'CommentTableSchemaMigrationStage' ) === MIGRATION_OLD;
+
$fields[] = new OOUI\FieldLayout(
new OOUI\TextInputWidget( [
'name' => 'wpComment',
'infusable' => true,
'value' => $this->mComment,
'autofocus' => true,
+ // HTML maxlength uses "UTF-16 code units", which means that characters outside BMP
+ // (e.g. emojis) count for two each. This limit is overridden in JS to instead count
+ // Unicode codepoints (or 255 UTF-8 bytes for old schema).
+ 'maxLength' => $oldCommentSchema ? 255 : CommentStore::COMMENT_CHARACTER_LIMIT,
] ),
[
'label' => $this->msg( 'undeletecomment' )->text(),
->rawParams( $userToolLinks )->parse()
);
if ( $canChangeAny ) {
+ $conf = $this->getConfig();
+ $oldCommentSchema = $conf->get( 'CommentTableSchemaMigrationStage' ) === MIGRATION_OLD;
$this->getOutput()->addHTML(
$this->msg( 'userrights-groups-help', $user->getName() )->parse() .
$grouplist .
Xml::label( $this->msg( 'userrights-reason' )->text(), 'wpReason' ) .
"</td>
<td class='mw-input'>" .
- Xml::input( 'user-reason', 60, $this->getRequest()->getVal( 'user-reason', false ),
- [ 'id' => 'wpReason', 'maxlength' => 255 ] ) .
+ Xml::input( 'user-reason', 60, $this->getRequest()->getVal( 'user-reason', false ), [
+ 'id' => 'wpReason',
+ // HTML maxlength uses "UTF-16 code units", which means that characters outside BMP
+ // (e.g. emojis) count for two each. This limit is overridden in JS to instead count
+ // Unicode codepoints (or 255 UTF-8 bytes for old schema).
+ 'maxlength' => $oldCommentSchema ? 255 : CommentStore::COMMENT_CHARACTER_LIMIT,
+ ] ) .
"</td>
</tr>
<tr>
$dbw = wfGetDB( DB_MASTER );
$dbw->doAtomicSection( __METHOD__, function ( $dbw, $fname ) use ( $newTouched ) {
+ global $wgActorTableSchemaMigrationStage;
+
$dbw->update( 'user',
[ /* SET */
'user_name' => $this->mName,
);
}
- $dbw->update(
- 'actor',
- [ 'actor_name' => $this->mName ],
- [ 'actor_user' => $this->mId ],
- $fname
- );
+ if ( $wgActorTableSchemaMigrationStage > MIGRATION_OLD ) {
+ $dbw->update(
+ 'actor',
+ [ 'actor_name' => $this->mName ],
+ [ 'actor_user' => $this->mId ],
+ $fname
+ );
+ }
} );
$this->mTouched = $newTouched;
"right-hideuser": "Блякаваньне рахунку ўдзельніка і яго хаваньне",
"right-ipblock-exempt": "Абход блякаваньняў IP-адрасоў, аўтаблякаваньняў і блякаваньняў дыяпазонаў",
"right-unblockself": "Разблякаваньне самога сябе",
- "right-protect": "зьмена ўзроўню абароны старонак і рэдагаваньне каскадна абароненых старонак",
+ "right-protect": "Ð\97ьмена ўзроўню абароны старонак і рэдагаваньне каскадна абароненых старонак",
"right-editprotected": "рэдагаваньне старонак, абароненых у рэжыме «{{int:protect-level-sysop}}»",
"right-editsemiprotected": "рэдагаваньне старонак, абароненых у рэжыме «{{int:protect-level-autoconfirmed}}»",
"right-editcontentmodel": "рэдагаваньне мадэлі зьместу старонкі",
"version-poweredby-others": "други",
"version-poweredby-translators": "преводачи в translatewiki.net",
"version-credits-summary": "Бихме искали да изкажем признателност на следните хора за техните приноси към [[Special:Version|МедияУики]].",
- "version-license-info": "МедияУики е свободен софтуер, можете да го разпространявате и/или променяте съгласно условията на GNU General Public License, както е публикуван от Free Software Foundation, версия 2 на лиценза или (по ваше усмотрение) която и да е следваща версия.\n\nМедияУики се разпространява с надеждата, че ще бъде полезен, но БЕЗ НИКАКВИ ГАРАНЦИИ, без дори косвена гаранция за ПРОДАВАЕМОСТ или ПРИГОДНОСТ ЗА КОНКРЕТНА УПОТРЕБА. Вижте GNU General Public License за повече подробности.\n\nТрябва да сте получили [{{SERVER}}{{SCRIPTPATH}}/COPYING копие на GNU General Public License] заедно с тази програма. Ако не сте, пишете на Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA или го [//www.gnu.org/licenses/old-licenses/gpl-2.0.html прочетете в мрежата].",
+ "version-license-info": "МедияУики е свободен софтуер, можете да го разпространявате и/или променяте съгласно условията на GNU General Public License, както е публикуван от Free Software Foundation, версия 2 на лиценза или (по ваше усмотрение) която и да е следваща версия.\n\nМедияУики се разпространява с надеждата, че ще бъде полезен, но <em>БЕЗ НИКАКВИ ГАРАНЦИИ</em>, без дори косвена гаранция за <strong>ПРОДАВАЕМОСТ</strong> или <strong>ПРИГОДНОСТ ЗА КОНКРЕТНА УПОТРЕБА</strong>. Вижте GNU General Public License за повече подробности.\n\nТрябва да сте получили [{{SERVER}}{{SCRIPTPATH}}/COPYING копие на GNU General Public License] заедно с тази програма. Ако не сте, пишете на Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA или го [//www.gnu.org/licenses/old-licenses/gpl-2.0.html прочетете в мрежата].",
"version-software": "Инсталиран софтуер",
"version-software-product": "Продукт",
"version-software-version": "Версия",
"limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|байт|байта}}",
"limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|байт|байта}}",
"expandtemplates": "Разгръщане на шаблони",
- "expand_templates_intro": "Тази специална страница взима текст и рекурсивно разгръща всички шаблони в нея.\nТя разгръща и всички поддържани парсерни функции като\n<code><nowiki>{{</nowiki>#language:…}}</code> и променливи като\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nНа практика тя разгръща почти всичко в двойни скоби.",
+ "expand_templates_intro": "Тази Ñ\81пеÑ\86иална Ñ\81Ñ\82Ñ\80аниÑ\86а взима Ñ\83икиÑ\82екÑ\81Ñ\82 и Ñ\80екÑ\83Ñ\80Ñ\81ивно Ñ\80азгÑ\80Ñ\8aÑ\89а вÑ\81иÑ\87ки Ñ\88аблони в неÑ\8f.\nТÑ\8f Ñ\80азгÑ\80Ñ\8aÑ\89а и вÑ\81иÑ\87ки поддÑ\8aÑ\80жани паÑ\80Ñ\81еÑ\80ни Ñ\84Ñ\83нкÑ\86ии каÑ\82о\n<code><nowiki>{{</nowiki>#language:â\80¦}}</code> и пÑ\80оменливи каÑ\82о\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nÐ\9dа пÑ\80акÑ\82ика Ñ\82Ñ\8f Ñ\80азгÑ\80Ñ\8aÑ\89а поÑ\87Ñ\82и вÑ\81иÑ\87ко в двойни Ñ\81коби.",
"expand_templates_title": "Заглавие на страницата (напр. за {{FULLPAGENAME}}):",
"expand_templates_input": "Входящ уикитекст:",
"expand_templates_output": "Резултат",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (videz anke la [[Special:NewPages|listo di nova pagini]])",
"rcfilters-other-review-tools": "Altra instrumenti por revizo",
"rcfilters-activefilters": "Agiva filtrili",
+ "rcfilters-advancedfilters": "Rafinita filtrili",
+ "rcfilters-search-placeholder": "Filtrar la modifikuri (uzez la menuo o serchez segun la nomo dil filtrilo)",
+ "rcfilters-filter-editsbyself-label": "Vua modifikuri",
+ "rcfilters-filter-user-experience-level-unregistered-label": "Sen registro",
+ "rcfilters-filter-user-experience-level-unregistered-description": "Redakteri qui ne facis 'log in'.",
+ "rcfilters-filter-user-experience-level-newcomer-label": "Nova uzeri",
+ "rcfilters-filter-user-experience-level-learner-label": "Lernanti",
+ "rcfilters-filter-user-experience-level-learner-description": "Redakteri enrejistrita kun konoco inter \"Nova uzeri\" ed \"experta uzeri.\"",
+ "rcfilters-filter-user-experience-level-experienced-label": "Experta uzeri",
"rcfilters-filter-user-experience-level-experienced-description": "Plu kam 30 dii di agemeso e 500 redakti.",
"rcfilters-filter-humans-label": "Homala (ne 'bot')",
+ "rcfilters-filtergroup-significance": "Senco",
"rcfilters-filter-pageedits-label": "Redakti di pagini",
+ "rcfilters-filter-newpages-label": "Kreado di pagini",
+ "rcfilters-filter-categorization-label": "Modifiki di la kategorio",
"rcfilters-filter-logactions-label": "Agadi enrejistrata",
"rcnotefrom": "Infre {{PLURAL:$5|esas la chanjo|esas la chanji}} de <strong>$3, $4</strong> (montrata til <strong>$1</strong>).",
"rclistfrom": "Montrar nova chanji startante de $3 $2",
"randompage": "Hazarda pagino",
"randomredirect": "Hazarda ridirektilo",
"statistics": "Statistiko",
- "statistics-header-users": "Statistiki di uzero",
+ "statistics-header-pages": "Statistiki di la pagini",
+ "statistics-header-edits": "Statistiki pri redakto",
+ "statistics-header-users": "Statistiki pri l'uzeri",
"statistics-header-hooks": "Altra statistiki",
+ "statistics-articles": "Temala pagini",
"statistics-pages": "Pagini",
+ "statistics-pages-desc": "Omna pagini dil Wiki, inkluzite pagini por facar diskuti, ridirektadi, edc.",
+ "statistics-edits": "Quanto di redakti pos ke {{SITENAME}} kreesis",
+ "statistics-edits-average": "Mezavalora quanto di redakti per pagino",
+ "statistics-users-active": "Aktiva uzeri",
"doubleredirects": "Duopla ridirektili",
"double-redirect-fixer": "Reparar ridirekti",
"brokenredirects": "Ridirektili nekorekta",
"linksearch-ns": "Nomaro:",
"linksearch-ok": "Serchez",
"listusers-submit": "Montrez",
+ "activeusers": "Listo pri aktiva uzeri",
"activeusers-noresult": "Nula uzero trovesis.",
"listgrouprights-group": "Grupo",
"listgrouprights-members": "(listo di membri)",
"sp-contributions-uploads": "sendita arkivi",
"sp-contributions-logs": "registrari",
"sp-contributions-talk": "diskutez",
+ "sp-contributions-userrights": "yuri dil {{GENDER:$1|uzero}} pri administrado",
"sp-contributions-search": "Serchar kontributadi",
"sp-contributions-username": "IP-adreso od uzantonomo:",
"sp-contributions-toponly": "Montrar nur la maxim recenta revizi",
"newimages-legend": "Filtrilo",
"ilsubmit": "Serchar",
"bydate": "per dato",
+ "months": "{{PLURAL:$1|$1 monato|$1 monati}}",
+ "years": "{{PLURAL:$1|$1 yaro|$1 yari}}",
"metadata": "Metadonaji",
"metadata-help": "Ca arkivo kontenas plusa informo, probable furnisita per la kamero elektronikala o per la \"scanner\" uzata por krear o kopiar l'imajo.\nSe l'arkivo modifikesos de lua originala stando, kelka detali povos ne reprezentar exakte l'arkivo modifikata.",
"metadata-fields": "Image metadata fields listed in this message will be included on image page display when the metadata table is collapsed.\nOthers will be hidden by default.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
"tag-filter": "[[Special:Tags|etiketo]] filtrilo:",
"tag-filter-submit": "Filtrez",
"tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Etikedo|Etikedi}}]]: $2)",
+ "tags-description-header": "Kompleta deskripto dil senco",
"tags-active-yes": "Yes",
"tags-active-no": "No",
"tags-edit": "redaktar",
"searchsuggest-search": "Serchez en {{SITENAME}}",
"searchsuggest-containing": "quan kontenas...",
"duration-days": "($1 {{PLURAL:$1|dio|dii}})",
+ "duration-years": "$1 {{PLURAL:$1|yaro|yari}}",
"expand_templates_output": "Rezulto",
"expand_templates_ok": "O.K.",
"expand_templates_preview": "Previdar",
"size-kilobytes": "$1キロバイト",
"size-megabytes": "$1メガバイト",
"size-gigabytes": "$1ギガバイト",
- "size-terabytes": "$1 TB",
- "size-petabytes": "$1 PB",
- "size-exabytes": "$1 EB",
- "size-zetabytes": "$1 ZB",
- "size-yottabytes": "$1 YB",
+ "size-terabytes": "$1テラバイト",
+ "size-petabytes": "$1ペタバイト",
+ "size-exabytes": "$1エクサバイト",
+ "size-zetabytes": "$1ゼタバイト",
+ "size-yottabytes": "$1ヨタバイト",
"size-pixel": "$1{{PLURAL:$1|ピクセル}}",
"size-kilopixel": "$1キロピクセル",
"size-megapixel": "$1メガピクセル",
"viewsourcelink": "кюрчю кодуна къарамакъ",
"editsectionhint": "Бёлмени тюзлемек: $1",
"toc": "Ичделик",
- "site-atom-feed": "$1 Atom-агъышы",
+ "site-atom-feed": "$1 Atom агъышы",
"page-atom-feed": "\"$1\" Atom агъышы",
"red-link-title": "$1 (олай сагьифасы ёкъдур)",
"nstab-main": "Макъала",
"filereadonlyerror": "Kon t bestaand \"$1\" niet anpassen umdat de bestaandsmap \"$2\" op dit moment op allinnig-lezen steet.\n\nDe op-egeven reden is: \"$3\".",
"invalidtitle-knownnamespace": "Ongeldige titel mit naamruumte \"$2\" en tekste \"$3\"",
"invalidtitle-unknownnamespace": "Ongeldige titel mit onbekend naamruumtenummer $1 en tekste \"$2\"",
- "exception-nologin": "Niet an-emeld",
+ "exception-nologin": "Nyt an-emeld",
"exception-nologin-text": "Um disse zied te bekieken of disse haandeling uut te kunnen voeren mu'j [[Special:Userlogin|an-emeld]] ween bie disse wiki.",
"virus-badscanner": "Slichte konfigurasie: onbekend antivirusprogramma: ''$1''",
"virus-scanfailed": "inlezen is mislokt (kode $1)",
"logouttext": "'''Je bin noen aofemeld.'''\n\nt Kan ween dat der wat ziejen bin die weeregeven wörden as of je an-emeld bin totda'j t tussengeheugen van joew webkieker leegmaken.",
"welcomeuser": "Welkom, $1!",
"welcomecreation-msg": "Joew gebruker is an-emaakt.\nVergeet niet joew [[Special:Preferences|veurkeuren veur {{SITENAME}}]] an te passen.",
- "yourname": "Gebrukersnaam",
- "userlogin-yourname": "Gebrukersnaam",
+ "yourname": "Gebrukersname",
+ "userlogin-yourname": "Gebrukersname",
"userlogin-yourname-ph": "Geef joew gebrukersnaam op",
"createacct-another-username-ph": "Vul de gebrukersnaam in",
"yourpassword": "Wachtwoord",
"yourpasswordagain": "Opniej invoeren",
"createacct-yourpasswordagain": "Wachtwoord bevestigen",
"createacct-yourpasswordagain-ph": "Geef t wachtwoord opniej op",
- "userlogin-remembermypassword": "Vanzelf anmelden",
+ "userlogin-remembermypassword": "Vanselv anmelden",
"userlogin-signwithsecure": "Beveiligde verbiending gebruken",
"yourdomainname": "Joew domein",
"password-change-forbidden": "Je kunnen joew wachtwoord niet wiezigen op disse wiki.",
"externaldberror": "Der gung iets fout bie de externe authentisering, of je maggen je gebrukersprofiel niet bewarken.",
"login": "Anmelden",
"nav-login-createaccount": "Anmelden",
- "logout": "Aofmelden",
+ "logout": "Ofmelden",
"userlogout": "Aofmelden",
- "notloggedin": "Niet an-emeld",
- "userlogin-noaccount": "He'j nog gien gebrukersnaam?",
+ "notloggedin": "Nyt an-emeld",
+ "userlogin-noaccount": "Heb jy noch gyn gebrukersname?",
"userlogin-joinproject": "Wörd lid van {{SITENAME}}",
- "createaccount": "Inschrieven",
- "userlogin-resetpassword-link": "Joew wachtwoord vergeten?",
- "userlogin-helplink2": "Hulpe bie t anmelden",
- "userlogin-loggedin": "Je bin al an-emeld as {{GENDER:$1|$1}}.\nGebruuk t onderstaonde formulier um an te melden as n aandere gebruker.",
- "userlogin-createanother": "n Aandere gebrukerskonto anmaken",
+ "createaccount": "Inskryven",
+ "userlogin-resetpassword-link": "Juuw wachtwoord vergeaten?",
+ "userlogin-helplink2": "Hülpe by et anmelden",
+ "userlogin-loggedin": "Je binnen al an-emeld as {{GENDER:$1|$1}}.\nGebruuk et formulyr hyrunder üm an te melden as een andere gebruker.",
+ "userlogin-createanother": "Een andere gebrukerskonto anmaken",
"createacct-emailrequired": "Netpostadres",
"createacct-emailoptional": "Netpostadres (niet verplicht)",
"createacct-email-ph": "Geef joew netpostadres op",
"createaccount-text": "Der hef der ene n gebruker an-emaakt op {{SITENAME}} ($4), mit de naam $2 en t wachtwoord \"$3\". \nMeld je eigen noen an en wiezig t wachtwoord.\n\nNegeer dit bericht as disse gebruker zonder joew toestemming an-emaakt is.",
"login-throttled": "Je hebben lestens te vake eprobeerd um an te melden mit n verkeerd wachtwoord.\nJe mutten effen $1 wachten veurda'j t opniej proberen.",
"login-abort-generic": "Je bin niet an-emeld - Aofebreuken",
- "loginlanguagelabel": "Taal: $1",
+ "loginlanguagelabel": "Taal / språke: $1",
"suspicious-userlogout": "Joew verzeuk um of te melden is aofewezen umdat t dernaor uutziet dat t verstuurd is deur n kepotte webkieker of tussenopslagbuffer",
"createacct-another-realname-tip": "Joew echte naam opgeven is niet verplicht.\nA'j t invullen, dan zu'w t gebruken um erkenning te geven veur joew warkzaamhejen.",
"pt-login": "Anmelden",
"pt-login-button": "Anmelden",
- "pt-createaccount": "Inschrieven",
- "pt-userlogout": "Aofmelden",
+ "pt-createaccount": "Inskryven",
+ "pt-userlogout": "Ofmelden",
"php-mail-error-unknown": "Der was n onbekende fout mit de mail()-funksie van PHP",
"user-mail-no-addy": "Eprobeerd n berichjen te versturen zonder n netpostadres",
"user-mail-no-body": "Der is eprobeerd n netbreef zonder tekste of mit n biester korte tekste te versturen.",
"uploadbtn": "Bestaand opsturen",
"reuploaddesc": "Weerumme naor de opstuurzied",
"upload-tryagain": "Bestaandsbeschrieving biewarken",
- "uploadnologin": "Niet an-emeld",
+ "uploadnologin": "Nyt an-emeld",
"uploadnologintext": "Je mutten $1 ween um bestaanden op te kunnen sturen.",
"upload_directory_missing": "De inlaojmap veur bestaanden ($1) is vort en kon niet an-emaakt wörden deur de webserver.",
"upload_directory_read_only": "Op t moment ku'j gien bestaanden opsturen vanwegen techniese problemen ($1).",
"categoriesfrom": "Laot kategorieën zien vanaof:",
"deletedcontributions": "Vortedaone gebrukersbiedragen",
"deletedcontributions-title": "Vortedaone gebrukersbiedragen",
- "sp-deletedcontributions-contribs": "biedragen",
+ "sp-deletedcontributions-contribs": "bydragen",
"linksearch": "Uutgaonde verwiezingen zeuken",
"linksearch-pat": "Zeukpetroon:",
"linksearch-ns": "Naamruumte:",
"listgrouprights-addgroup-self-all": "Kan alle groepen bie de eigen gebruker doon",
"listgrouprights-removegroup-self-all": "Kan alle groepen vortdoon van eigen gebruker",
"trackingcategories": "Volgkategorieën",
- "mailnologin": "Niet an-emeld.",
+ "mailnologin": "Nyt an-emeld.",
"mailnologintext": "Je mutten [[Special:UserLogin|an-emeld]] ween en n geldig e-mailadres in \"[[Special:Preferences|mien veurkeuren]]\" invoeren um disse funksie te kunnen gebruken.",
"emailuser": "n Bericht sturen",
"emailuser-title-target": "Disse {{GENDER:$1|gebruker}} n bericht sturen",
"watchlistfor2": "Veur $1 ($2)",
"nowatchlist": "Gien artikels in volglieste.",
"watchlistanontext": "$1 is verplicht um joew volglieste te bekieken of te wiezigen.",
- "watchnologin": "Niet an-emeld",
+ "watchnologin": "Nyt an-emeld",
"addwatch": "Op mien volglieste zetten",
"addedwatchtext": "De zied \"[[:$1]]\" steet noen op joew [[Special:Watchlist|volglieste]].\nToekomstige wiezigingen op disse zied en de overlegzied zullen hier vermeld wörden.",
"removewatch": "Van mien volglieste aofhaolen",
"blanknamespace": "(Heufdnaamruumte)",
"contributions": "{{GENDER:$1|Biedragen van disse gebruker}}",
"contributions-title": "Biedragen van $1",
- "mycontris": "Mien biedragen",
- "anoncontribs": "Biedragen",
+ "mycontris": "Myn bydragen",
+ "anoncontribs": "Bydragen",
"contribsub2": "Veur {{GENDER:$3|$1}} ($2)",
"nocontribs": "Gien wiezigingen evunnen die an de estelde criteria voldoon.",
"uctop": "(leste wieziging)",
"blocklink": "blokkeren",
"unblocklink": "deblokkeer",
"change-blocklink": "blokkering wiezigen",
- "contribslink": "biedragen",
+ "contribslink": "bydragen",
"emaillink": "netpostbericht sturen",
"autoblocker": "Vanzelf eblokkeerd umdat t IP-adres overenekömp mit t IP-adres van [[User:$1|$1]], die eblokkeerd is mit as reden: \"$2\"",
"blocklogpage": "Blokkeerlogboek",
"revdelete-no-file": "Fila som vart synt til finst ikkje.",
"revdelete-show-file-confirm": "Er du viss på at du ynskjer å sjå ein sletta versjon av fila \"<nowiki>$1</nowiki>\" frå $2 ved $3?",
"revdelete-show-file-submit": "Ja",
+ "revdelete-selected-text": "{{PLURAL:$1|Vald versjon|Valde versjonar}} av [[:$2]]:",
"logdelete-selected": "{{PLURAL:$1|Vald loggoppføring|Valde loggoppføringar}}:",
"revdelete-confirm": "Stadfest at du ynskjer å gjera dette, at du skjønar konsekvensane, og at du gjer det i samsvar med [[{{MediaWiki:Policy-url}}|retningslinene]].",
"revdelete-suppress-text": "Løyning av sideversjonar bør '''berre''' nyttast i desse tilfella:\n* Mogeleg ærekrenkjande informasjon\n* Upassanda personleg informasjon\n*: ''heimeadresser og -telefonnummer, personnummer, osb.''",
- "revdelete-legend": "Vel avgrensing for synlegdom",
+ "revdelete-legend": "Set avgrensing av synlegdom",
"revdelete-hide-text": "Versjonstekst",
"revdelete-hide-image": "Skjul filinnhald",
"revdelete-hide-name": "Gøym handling og sidenamn",
"uploadstash-bad-path-invalid": "Ścieżka jest nieprawidłowa.",
"uploadstash-bad-path-unknown-type": "Nieznany typ „$1”.",
"uploadstash-bad-path-unrecognized-thumb-name": "Nierozpoznana nazwa miniaturki.",
- "uploadstash-bad-path-no-handler": "Nie znaleziono obsługi dla typu mime 1 $ pliku $2.",
+ "uploadstash-bad-path-no-handler": "Nie znaleziono obsługi dla typu mime $1 pliku $2.",
"uploadstash-bad-path-bad-format": "Klucz \"$1\" nie jest w odpowiednim formacie.",
"uploadstash-file-not-found": "Klucz \"$1\" nie został znaleziony w schowku.",
"uploadstash-file-not-found-no-thumb": "Nie można uzyskać miniaturki.",
"passwordreset-emailsentusername": "Ако сте навели имејл адресу приликом регистрације, биће послат имејл за ресетовање лозинке.",
"passwordreset-nocaller": "Позивалац се мора навести",
"passwordreset-nosuchcaller": "Позивалац не постоји: $1",
+ "passwordreset-ignored": "Ресетовање лозинке није успело. Можда послужилац није конфигурисан?",
"passwordreset-invalidemail": "Неисправна имејл адреса",
"passwordreset-nodata": "Корисничко име и адреса е-поште нису наведени",
"changeemail": "Промени или уклони имејл адресу",
"yourtext": "Ваш текст",
"storedversion": "Ускладиштена измена",
"editingold": "<strong>Упозорење: уређујете застарелу измену ове странице.</strong>\nАко је сачувате, све новије измене ће бити изгубљене.",
+ "unicode-support-fail": "Ваш прегледач не подржава Unicode. Он је неопоходан за уређивање страница, па зато не могу сачувати измену.",
"yourdiff": "Разлике",
"copyrightwarning": "Имајте на уму да се сви доприноси на овом викију сматрају као објављени под лиценцом $2 (више на $1).\nАко не желите да се ваши текстови мењају и размењују без ограничења, онда их не шаљите овде.<br />\nИсто тако обећавате да сте Ви аутор текста, или да сте га умножили с извора који је у јавном власништву.\n<strong>Не шаљите радове заштићене ауторским правима без дозволе!</strong>",
"copyrightwarning2": "Имајте на уму да се сви доприноси на овом викију могу мењати, враћати или брисати од других корисника.\nАко не желите да се ваши текстови слободно мењају и расподељују, не шаљите их овде.<br />\nИсто тако обећавате да сте ви аутор текста, или да сте га умножили с извора који је у јавном власништву (више на $1).\n<strong>Не шаљите радове заштићене ауторским правима без дозволе!</strong>",
"permissionserrors": "Грешка у дозволи",
"permissionserrorstext": "Немате овлашћење за ову радњу из {{PLURAL:$1|1=следећег|следећих}} разлога:",
"permissionserrorstext-withaction": "Немате дозволу за $2 из {{PLURAL:$1|следећег|следећих}} разлога:",
+ "contentmodelediterror": "Не можете уредити ову измену јер је њен модел садржаја <code>$1</code>, што се разликује од тренутног модела садржаја странице <code>$2</code>.",
"recreate-moveddeleted-warn": "<strong>Упозорење: поново правите страницу која је претходно обрисана.</strong>\n\nРазмотрите да ли је прикладно да наставите с уређивањем ове странице.\nОвде је наведена историја брисања и премештања с образложењем:",
"moveddeleted-notice": "Ова страница је обрисана.\nИсторија њеног брисања, заштите и премештања налази се испод:",
"moveddeleted-notice-recent": "Жао нам је, ова страница је недавно обрисана (у последњих 24 сата).\nИсторија њеног брисања, заштите и премештања налази се испод:",
"mergehistory-fail-bad-timestamp": "Временска ознака није исправна.",
"mergehistory-fail-invalid-source": "Изворна страница није исправна.",
"mergehistory-fail-invalid-dest": "Одредишна страница није исправна.",
+ "mergehistory-fail-no-change": "Спајање историје није спојило ниједну измену. Проверите параметре странице и времена.",
"mergehistory-fail-permission": "Немате овлашћење за спајање историје.",
"mergehistory-fail-self-merge": "Изворна и одредишна страница не могу бити исте.",
+ "mergehistory-fail-timestamps-overlap": "Изворне измене се преклапају или долазе након одредишних измена.",
"mergehistory-fail-toobig": "Није могуће спојити историје јер више од $1 {{PLURAL:$1|измене ће бити премештене|измена ће бити премештено}}.",
"mergehistory-no-source": "Изворна страница $1 не постоји.",
"mergehistory-no-destination": "Одредишна страница $1 не постоји.",
"diff-multi-sameuser": "({{PLURAL:$1|Једна међуизмена истог корисника није приказана|$1 међуизмене истог корисника нису приказане|$1 међуизмена истог корисника није приказано}})",
"diff-multi-otherusers": "({{PLURAL:$1|Једна међуизмена|$1 међуизмене|$1 међуизмена}} од стране {{PLURAL:$2|још једног корисника није приказана|$2 корисника није приказано}})",
"diff-multi-manyusers": "({{PLURAL:$1|Није приказана међуизмена|Нису приказане $1 међуизмене|Није приказано $1 међуизмена}} од више од $2 корисника)",
+ "diff-paragraph-moved-tonew": "Одломак је премештен. Кликните да пређете на његово ново место.",
+ "diff-paragraph-moved-toold": "Одломак је премештен. Кликните да пређете на његово старо место.",
"difference-missing-revision": "Не могу да пронађем {{PLURAL:$2|једну измену|$2 измене|$2 измена}} од ове разлике ($1).\n\nОво се обично дешава када пратите застарелу везу до странице која је обрисана.\nВише информација можете пронаћи у [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневнику брисања].",
"searchresults": "Резултати претраге",
"searchresults-title": "Резултати претраге за „$1“",
"userrights-expiry-current": "Истиче $1",
"userrights-expiry-none": "Не истиче",
"userrights-expiry": "Истиче:",
- "userrights-expiry-existing": "Ð\9fоÑ\81Ñ\82оÑ\98еÑ\9bе вÑ\80иÑ\98еме иÑ\81Ñ\82ека: $3, $2",
- "userrights-expiry-othertime": "Ð\94Ñ\80Ñ\83го вÑ\80иÑ\98еме:",
+ "userrights-expiry-existing": "Постојеће време истека: $3, $2",
+ "userrights-expiry-othertime": "Друго време:",
"userrights-expiry-options": "1 дан:1 day,1 недеља:1 week,1 месец:1 month,3 месеца:3 months,6 месеци:6 months,1 година:1 year",
+ "userrights-invalid-expiry": "Време истицања групе „$1“ није исправно.",
+ "userrights-expiry-in-past": "Време истицања групе „$1“ је прошло.",
"userrights-cannot-shorten-expiry": "Не можете убрзати истек чланства у групи „$1”. Само корисници са дозволом да додају или уклоне ову групу могу да убрзају рок истека.",
"userrights-conflict": "Сукоб промена корисничких права! Молимо проверите ваше измене.",
"group": "Група:",
"right-createaccount": "отварање нових корисничких налога",
"right-autocreateaccount": "Пријавите се аутоматски са екстерним корисничким налогом",
"right-minoredit": "означавање измена мањим",
- "right-move": "Ð\9fремештање страница",
+ "right-move": "премештање страница",
"right-move-subpages": "премештање страница с њиховим подстраницама",
"right-move-rootuserpages": "премештање основних корисничких страница",
- "right-move-categorypages": "Ð\9fремештање категорија",
- "right-movefile": "Ð\9fремештање датотека",
+ "right-move-categorypages": "премештање категорија",
+ "right-movefile": "премештање датотека",
"right-suppressredirect": "премештање страница без остављања преусмерења",
- "right-upload": "Ð\9eтпремање датотека",
+ "right-upload": "отпремање датотека",
"right-reupload": "замењивање постојећих датотека",
"right-reupload-own": "замењивање сопствених датотека",
"right-reupload-shared": "мењање датотека на дељеном складишту мултимедије",
"right-upload_by_url": "Отпремање датотека са веб-адресе",
"right-purge": "чишћење кеш меморије странице без потврде",
- "right-autoconfirmed": "без ограничавања ставки за ИП адресе",
+ "right-autoconfirmed": "без ограничавања ставки за IP адресе",
"right-bot": "сматрање измена као аутоматски процес",
- "right-nominornewtalk": "непоседовање малих измена на страницама за разговор отвара прозор за нове поруке",
- "right-apihighlimits": "коришћење виших граница за упите из АПИ-ја",
- "right-writeapi": "писање АПИ-ја",
+ "right-nominornewtalk": "непоседовање мањих измена на страницама за разговор отвара прозор за нове поруке",
+ "right-apihighlimits": "коришћење виших граница за упите из API-ја",
+ "right-writeapi": "писање API-ја",
"right-delete": "брисање страница",
"right-bigdelete": "брисање страница с великом историјом",
"right-deletelogentry": "брисање и враћање одређених ставки у дневнику",
"right-viewsuppressed": "прегледање измена скривених од свих корисника",
"right-suppressionlog": "прегледање приватних дневника",
"right-block": "блокирање даљих измена других корисника",
- "right-blockemail": "Ð\91локиÑ\80аÑ\98 коÑ\80иÑ\81никÑ\83 Ñ\81лаÑ\9aе имеÑ\98ла",
+ "right-blockemail": "блокиÑ\80аÑ\9aе коÑ\80иÑ\81ника да Ñ\88аÑ\99Ñ\83 имеÑ\98л",
"right-hideuser": "блокирање корисничког имена и његово сакривање од јавности",
"right-ipblock-exempt": "заобилажење блокирања ИП адресе, аутоматска блокирања и блокирања опсега",
"right-unblockself": "деблокирање самог себе",
"right-edituserjs": "уређивање туђих JavaScript датотека",
"right-editmyusercss": "уређивање сопствених CSS датотека",
"right-editmyuserjs": "уређивање сопствених JavaScript датотека",
- "right-viewmywatchlist": "види Ñ\81опÑ\81Ñ\82вени Ñ\81пиÑ\81ак надгледања",
+ "right-viewmywatchlist": "пÑ\80еглед Ñ\81опÑ\81Ñ\82веног Ñ\81пиÑ\81ка надгледања",
"right-editmywatchlist": "уређивање сопственог списка надгледања; неке предузете радње ће свеједно додати странице на списак и без овог права",
- "right-viewmyprivateinfo": "видиÑ\82е Ñ\81воÑ\98е лиÑ\87не подаÑ\82ке (нпр. имејл адресу, право име)",
- "right-editmyprivateinfo": "Ñ\83Ñ\80еÑ\92иваÑ\9aе Ñ\81опÑ\81Ñ\82вениÑ\85 лиÑ\87ниÑ\85 подаÑ\82ака (нпÑ\80. имеÑ\98л адÑ\80еÑ\81а, пÑ\80аво име)",
+ "right-viewmyprivateinfo": "пÑ\80еглед Ñ\81воÑ\98иÑ\85 лиÑ\87ниÑ\85 подаÑ\82ака (нпр. имејл адресу, право име)",
+ "right-editmyprivateinfo": "Ñ\83Ñ\80еÑ\92иваÑ\9aе Ñ\81опÑ\81Ñ\82вениÑ\85 лиÑ\87ниÑ\85 подаÑ\82ака (нпÑ\80. имеÑ\98л адÑ\80еÑ\81е, пÑ\80авог имена)",
"right-editmyoptions": "уређивање сопствених подешавања",
"right-rollback": "брзо враћање измена последњег корисника који је мењао одређену страницу",
"right-markbotedits": "означавање враћених измена као измене бота",
"right-userrights-interwiki": "уређивање корисничких права на другим викијима",
"right-siteadmin": "закључавање и откључавање базе података",
"right-override-export-depth": "извоз страница укључујући и повазене странице до дубине од пет веза",
- "right-sendemail": "Пошаљи имејл другим корисницима",
+ "right-sendemail": "слање имејла другим корисницима",
"right-managechangetags": "прављење и (де)активирање [[Special:Tags|ознака]]",
"right-applychangetags": "примењивање [[Special:Tags|ознака]] на нечије измене",
"right-changetags": "додавање и уклањање разних [[Special:Tags|ознака]] на појединачним изменама и уносима у дневницима",
"right-deletechangetags": "брисање [[Special:Tags|ознака]] из базе података",
+ "grant-generic": "Скуп права „$1“",
"grant-group-page-interaction": "Уређивање страница",
"grant-group-file-interaction": "Уређивање датотека",
"grant-group-watchlist-interaction": "Уређивање вашег списка надгледања",
"action-createpage": "прављење страница",
"action-createtalk": "прављење страница за разговор",
"action-createaccount": "отварање овог корисничког налога",
+ "action-autocreateaccount": "аутоматско прављење овог спољашњег корисничког налога",
"action-history": "гледање историје ове странице",
"action-minoredit": "означавање ове измене као мање",
"action-move": "премештање ове странице",
"action-reupload": "замењивање постојеће датотеке",
"action-reupload-shared": "постављање ове датотеке на заједничко складиште",
"action-upload_by_url": "отпремање ове датотеке преко веб-адресе",
- "action-writeapi": "писање АПИ-ја",
+ "action-writeapi": "писање API-ја",
"action-delete": "брисање ове странице",
"action-deleterevision": "брисање измена",
"action-deletelogentry": "бирсање уноса у дневницима",
"recentchanges-submit": "Прикажи",
"rcfilters-tag-remove": "Обриши $1",
"rcfilters-legend-heading": "<strong>Списак скраћеница:</strong>",
- "rcfilters-other-review-tools": "Ð\9eÑ\81Ñ\82али алаÑ\82и за преглед",
+ "rcfilters-other-review-tools": "Ð\9eÑ\81Ñ\82але алаÑ\82ке за преглед",
"rcfilters-group-results-by-page": "Групиши резултате по страницама",
"rcfilters-activefilters": "Активни филтери",
"rcfilters-advancedfilters": "Напредни филтери",
"rcfilters-state-message-subset": "Овај филтер нема ефекта јер су његови резултати укључени са онима {{PLURAL:$2|следећег, ширег филтера|следећих, ширих филтера}} (покушајте са означавањем да бисте их распознали): $1",
"rcfilters-state-message-fullcoverage": "Одабир свих филтера у групи је исто као и одабир ниједног, тако да овај филтер нема ефекта. Група укључује: $1",
"rcfilters-filtergroup-authorship": "Ауторство доприноса",
- "rcfilters-filter-editsbyself-label": "Ваше измјене",
+ "rcfilters-filter-editsbyself-label": "Ваше измене",
"rcfilters-filter-editsbyself-description": "Ваши доприноси.",
- "rcfilters-filter-editsbyother-label": "Измјене других",
- "rcfilters-filter-editsbyother-description": "Све измјене осим Ваших.",
+ "rcfilters-filter-editsbyother-label": "Измене других",
+ "rcfilters-filter-editsbyother-description": "Све измене осим Ваших.",
"rcfilters-filtergroup-userExpLevel": "Корисничка регистрација и искуство",
"rcfilters-filter-user-experience-level-registered-label": "Регистровани",
"rcfilters-filter-user-experience-level-registered-description": "Пријављени уредници.",
"rcfilters-filter-user-experience-level-experienced-description": "Регистровани уредници са више од 500 измена и 30 дана активности.",
"rcfilters-filtergroup-automated": "Аутоматизовани доприноси",
"rcfilters-filter-bots-label": "Бот",
- "rcfilters-filter-bots-description": "Измјене направљене аутоматизованим алатима.",
+ "rcfilters-filter-bots-description": "Измене направљене аутоматизованим алатима.",
"rcfilters-filter-humans-label": "Човек (није бот)",
- "rcfilters-filter-humans-description": "Измјене које су направили људи-уредници.",
+ "rcfilters-filter-humans-description": "Измене које су направили људи-уредници.",
"rcfilters-filtergroup-reviewstatus": "Патролираност",
"rcfilters-filter-patrolled-label": "Патролирано",
- "rcfilters-filter-patrolled-description": "Измјене означене као патролиране.",
+ "rcfilters-filter-patrolled-description": "Измене означене као патролиране.",
"rcfilters-filter-unpatrolled-label": "Непатролирано",
- "rcfilters-filter-unpatrolled-description": "Измјене које нису означене као патролиране.",
+ "rcfilters-filter-unpatrolled-description": "Измене које нису означене као патролиране.",
"rcfilters-filtergroup-significance": "Значај",
"rcfilters-filter-minor-label": "Мање измене",
- "rcfilters-filter-minor-description": "Измјене које је аутор означио као мање.",
- "rcfilters-filter-major-label": "Не-мање измјене",
- "rcfilters-filter-major-description": "Измјене које нису означене као мање.",
+ "rcfilters-filter-minor-description": "Измене које је аутор означио као мање.",
+ "rcfilters-filter-major-label": "Не-мање измене",
+ "rcfilters-filter-major-description": "Измене које нису означене као мање.",
"rcfilters-filtergroup-watchlist": "Странице на списку надгледања",
"rcfilters-filter-watchlist-watched-label": "На списку надгледања",
- "rcfilters-filter-watchlist-watched-description": "Измјене страница на Вашем списку надгледања.",
- "rcfilters-filter-watchlist-watchednew-label": "Нове измјене на списку надгледања",
- "rcfilters-filter-watchlist-watchednew-description": "Измјене страница на списку надгледања које нисте посјетили од када су направљене измјене.",
+ "rcfilters-filter-watchlist-watched-description": "Измене страница на Вашем списку надгледања.",
+ "rcfilters-filter-watchlist-watchednew-label": "Нове измене на списку надгледања",
+ "rcfilters-filter-watchlist-watchednew-description": "Измене страница на списку надгледања које нисте посетили од када су направљене измене.",
"rcfilters-filter-watchlist-notwatched-label": "Није на списку надгледања",
- "rcfilters-filter-watchlist-notwatched-description": "Све осим измјена страница на Вашем списку надгледања.",
+ "rcfilters-filter-watchlist-notwatched-description": "Све осим измена страница на Вашем списку надгледања.",
"rcfilters-filtergroup-watchlistactivity": "Стање на списку надгледања",
"rcfilters-filter-watchlistactivity-unseen-label": "Непогледане измене",
"rcfilters-filter-watchlistactivity-unseen-description": "Измене страница које нисте посетили од када су направљене измене.",
"rcfilters-filter-watchlistactivity-seen-label": "Погледане измене",
"rcfilters-filter-watchlistactivity-seen-description": "Измене страница које сте посетили од када су направљене измене.",
- "rcfilters-filtergroup-changetype": "Тип измÑ\98ене",
+ "rcfilters-filtergroup-changetype": "Ð\92Ñ\80Ñ\81Ñ\82а измене",
"rcfilters-filter-pageedits-label": "Измене страница",
- "rcfilters-filter-pageedits-description": "Измјене вики садржаја, расправа, описа категорија…",
+ "rcfilters-filter-pageedits-description": "Измене вики садржаја, расправа, описа категорија…",
"rcfilters-filter-newpages-label": "Стварање страница",
"rcfilters-filter-newpages-description": "Измене којима се стварају нове странице.",
- "rcfilters-filter-categorization-label": "Измјене категорија",
+ "rcfilters-filter-categorization-label": "Измене категорија",
"rcfilters-filter-categorization-description": "Записи о страницама додатим или уклоњеним из категорија.",
"rcfilters-filter-logactions-label": "Радње забележене у дневницима",
"rcfilters-filter-logactions-description": "Административне радње, стварање налога, брисање страница, отпремања…",
"rcfilters-hideminor-conflicts-typeofchange-global": "Филтер за „мање” измене је у сукобу са једним или више филтера типа измена, зато што одређени типови измена не могу да се означе као „мање”. Сукобљени филтери су означени у подручју Активни филтери, изнад.",
"rcfilters-hideminor-conflicts-typeofchange": "Одређени типови измена не могу да се означе као „мање”, тако да је овај филтер у сукобу са следећим филтерима типа измена: $1",
"rcfilters-typeofchange-conflicts-hideminor": "Овај филтер типа измене је у сукобу са филтером за „мање” измене. Одређени типови измена не могу да се означе као „мање”.",
- "rcfilters-filtergroup-lastRevision": "Посљедње измјене",
- "rcfilters-filter-lastrevision-label": "Посљедња измјена",
+ "rcfilters-filtergroup-lastRevision": "Последње измене",
+ "rcfilters-filter-lastrevision-label": "Последња измена",
"rcfilters-filter-lastrevision-description": "Само најновија измена на страници.",
- "rcfilters-filter-previousrevision-label": "Није посљедња измјена",
- "rcfilters-filter-previousrevision-description": "Све измјене које нису „посљедње измјене”.",
+ "rcfilters-filter-previousrevision-label": "Није последња измена",
+ "rcfilters-filter-previousrevision-description": "Све измене које нису „последње измене”.",
"rcfilters-filter-excluded": "Изостављено",
"rcfilters-tag-prefix-namespace-inverted": "<strong>:није</strong> $1",
"rcfilters-exclude-button-off": "Изостави означено",
"rcfilters-exclude-button-on": "Изостави одабрано",
- "rcfilters-view-tags": "Означене измјене",
+ "rcfilters-view-tags": "Означене измене",
"rcfilters-view-namespaces-tooltip": "Филтрирај резултате према именском простору",
- "rcfilters-view-tags-tooltip": "Филтрирај резултате према ознаци измјене",
+ "rcfilters-view-tags-tooltip": "Филтрирај резултате према ознаци измене",
"rcfilters-view-return-to-default-tooltip": "Повратак на главни мени",
- "rcfilters-view-tags-help-icon-tooltip": "Сазнајте више о означеним измјенама",
+ "rcfilters-view-tags-help-icon-tooltip": "Сазнајте више о означеним изменама",
"rcfilters-liveupdates-button": "Ажурирања уживо",
"rcfilters-liveupdates-button-title-on": "Искључи ажурирања уживо",
"rcfilters-liveupdates-button-title-off": "Прикажи нове измене уживо",
"rcfilters-filter-showlinkedfrom-label": "Прикажи измене на страницама са којих долазе везе",
"rcfilters-filter-showlinkedfrom-option-label": "<strong>Странице са којих долазе везе до</strong> изабране странице",
"rcfilters-filter-showlinkedto-label": "Прикажи измене на страницама ка којима воде везе",
- "rcfilters-filter-showlinkedto-option-label": "<strong>Странице ка којима воде везе са</strong> одабране странице",
+ "rcfilters-filter-showlinkedto-option-label": "<strong>Странице ка којима воде везе са</strong> изабране странице",
+ "rcfilters-target-page-placeholder": "Унесите име странице (или категорије)",
"rcnotefrom": "Испод {{PLURAL:$5|је измена|су измене}} од <strong>$3, $4</strong> (до <strong>$1</strong> приказано).",
"rclistfromreset": "Ресетуј одабир датума",
"rclistfrom": "Прикажи нове измене почев од $2, $3",
"uploadstash-errclear": "Чишћење датотека није успело.",
"uploadstash-refresh": "Освежи списак датотека",
"uploadstash-thumbnail": "погледај минијатуру",
+ "uploadstash-exception": "Не могу сачувати датотеку у складиште ($1): „$2“.",
"uploadstash-bad-path": "Путања не постоји.",
"uploadstash-bad-path-invalid": "Путања није исправна.",
"uploadstash-bad-path-unknown-type": "Непознат тип „$1“.",
"uploadstash-file-not-found-no-remote-thumb": "Добављање минијатуре није успело: $1\nАдреса = $2",
"uploadstash-file-not-found-missing-content-type": "Недостаје заглавље за врсту садржаја.",
"uploadstash-file-not-found-not-exists": "Не могу наћи путању или ово није обична датотека.",
+ "uploadstash-file-too-large": "Не могу послужити датотеку већу од $1 {{PLURAL:$1|бајта|бајтова}}",
+ "uploadstash-not-logged-in": "Нико није пријављен. Датотеке морају припадати корисницима.",
"uploadstash-wrong-owner": "Ова датотека ($1) не припада тренутном кориснику.",
"uploadstash-no-such-key": "Нема таквог кључа ($1). Не могу уклонити.",
"uploadstash-no-extension": "Нема траженог додатка.",
"apisandbox-request-url-label": "Адреса захтева:",
"apisandbox-request-time": "Време за извршавање захтјева: {{PLURAL:$1|$1 милисекунда|$1 милисекунде|$1 милисекунди}}",
"apisandbox-results-fixtoken": "Исправи жетон и пошаљи поново",
+ "apisandbox-results-fixtoken-fail": "Нисам успео добити жетон „$1“.",
"apisandbox-alert-page": "Поља на страници су неисправна.",
"apisandbox-alert-field": "Вредност овог поља је неисправна.",
"apisandbox-continue": "Настави",
"revertpage": "Враћене измене [[Special:Contribs/$2|$2]] ([[User talk:$2|разговор]]) на последњу измену корисника [[User:$1|$1]]",
"revertpage-nouser": "Измене скривеног корисника су враћене на последњу измену {{GENDER:$1|корисника|кориснице}} [[User:$1|$1]]",
"rollback-success": "Измене {{GENDER:$1|корисника|кориснице}} {{GENDER:$3|$1}} су враћене на последњу измену {{GENDER:$2|корисника|кориснице}} {{GENDER:$4|$2}}.",
+ "rollback-success-notify": "Враћене измене корисника $1;\nвраћено на последњу измену корисника $2. [$3 Прикажи измене]",
"sessionfailure-title": "Сесија је окончана",
"sessionfailure": "Изгледа да постоји проблем с вашом сесијом;\nова радња је отказана да би се избегла злоупотреба.\nМолимо, поново пошаљите образац.",
"changecontentmodel": "Промени модел садржаја странице",
"changecontentmodel-cannot-convert": "Модел садржаја странице [[:$1]] се не може претворити у врсту $2.",
"changecontentmodel-nodirectediting": "Модел садржаја $1 не подржава изравно уређивање",
"changecontentmodel-emptymodels-title": "Нема доступних модела садржаја",
+ "changecontentmodel-emptymodels-text": "Модел садржаја странице [[:$1]] се не може претворити ни у једну другу врсту.",
"log-name-contentmodel": "Дневник промене модела садржаја",
"log-description-contentmodel": "Ова страница приказује измене у моделима садржаја страница и странице које су направљене са моделом садржаја који се разликује од подразумеваног.",
+ "logentry-contentmodel-new": "$1 је {{GENDER:$2|направио|направила}} страницу $3 с нестандардним моделом садржаја „$5“",
"logentry-contentmodel-change": "$1 је {{GENDER:$2|променио|променила}} модел садржаја странице $3 из „$4“ у „$5“",
"logentry-contentmodel-change-revertlink": "врати",
"logentry-contentmodel-change-revert": "врати",
"undeletehistorynoadmin": "Ова страница је обрисана.\nРазлог за брисање се налази испод, заједно с детаљима о кориснику који је изменио ову страницу пре брисања.\nТекст обрисаних измена је доступан само администраторима.",
"undelete-revision": "Обрисана измена странице $1 (дана $4; $5) од стране {{GENDER:$3|корисника|кориснице|корисника}} $3:",
"undeleterevision-missing": "Неисправна или непостојећа измена.\nМожда сте унели погрешну везу, или је измена враћена или уклоњена из архиве.",
+ "undeleterevision-duplicate-revid": "Не могу вратити {{PLURAL:$1|измену|$1 измене|$1 измена}} јер се {{PLURAL:$1|њен|њихов}} <code>rev_id</code> већ користи.",
"undelete-nodiff": "Претходне измене нису пронађене.",
"undeletebtn": "Врати",
"undeletelink": "погледај/врати",
"namespace": "Именски простор:",
"invert": "Обрни избор",
"tooltip-invert": "Означите ову кућицу да бисте сакрили измене на страницама у одабраном именском простору (и повезаним именским просторима, ако је означено)",
+ "tooltip-whatlinkshere-invert": "Означите ову кутију за сакривање веза са страница у изабраном именском простору.",
"namespace_association": "Повезани именски простор",
"tooltip-namespace_association": "Означите ову кућицу да бисте укључили и разговор или именски простор теме која је повезана с одабраним именским простором",
"blanknamespace": "(главни)",
"sp-contributions-newbies-sub": "За нове кориснике",
"sp-contributions-newbies-title": "Доприноси нових корисника",
"sp-contributions-blocklog": "дневник блокирања",
+ "sp-contributions-suppresslog": "обрисани {{GENDER:$1|кориснички}} доприноси",
"sp-contributions-deleted": "обрисани {{GENDER:$1|доприноси}}",
"sp-contributions-uploads": "отпремања",
"sp-contributions-logs": "дневници",
"autosumm-blank": "Уклоњен целокупан садржај странице",
"autosumm-replace": "Замењен садржај странице са „$1“",
"autoredircomment": "Преусмерење на [[$1]]",
- "autosumm-removed-redirect": "Уклоњено преусмјерење ка [[$1]]",
+ "autosumm-removed-redirect": "Уклоњено преусмерење ка [[$1]]",
"autosumm-changed-redirect-target": "Промењена одредишна страница у преусмерењу из [[$1]] у [[$2]]",
"autosumm-new": "Нова страница: $1",
"autosumm-newblank": "Направљена празна страница",
"specialpages-group-highuse": "Најчешће коришћене странице",
"specialpages-group-pages": "Спискови страница",
"specialpages-group-pagetools": "Алатке",
- "specialpages-group-wiki": "Ð\9fодаÑ\86и и алаÑ\82и",
+ "specialpages-group-wiki": "Ð\9fодаÑ\86и и алаÑ\82ке",
"specialpages-group-redirects": "Преусмеравање посебних страница",
"specialpages-group-spam": "Алатке против непожељних порука",
- "specialpages-group-developer": "Ð\9fÑ\80огÑ\80амеÑ\80Ñ\81ки алаÑ\82и",
+ "specialpages-group-developer": "Ð\9fÑ\80огÑ\80амеÑ\80Ñ\81ке алаÑ\82ке",
"blankpage": "Празна страница",
"intentionallyblankpage": "Ова страница је намерно остављена празном.",
"external_image_whitelist": " #Оставите овај ред онаквим какав јесте<pre>\n#Испод додајте одломке регуларних израза (само део који се налази између //)\n#Они ће бити упоређени с адресама спољашњих слика\n#Оне које се поклапају биће приказане као слике, а преостале као везе до слика\n#Редови који почињу с тарабом се сматрају коментарима\n#Сви уноси су осетљиви на мала и велика слова\n\n#Додајте све одломке регуларних израза изнад овог реда. Овај ред не дирајте</pre>",
"tag-list-wrapper": "([[Special:Tags|$1 {{PLURAL:$1|ознака|ознаке|ознака}}]]: $2)",
"tag-mw-contentmodelchange": "промена модела садржаја",
"tag-mw-contentmodelchange-description": "Измене које мењају модел садржаја странице",
- "tag-mw-new-redirect": "Ново преусмјерење",
+ "tag-mw-new-redirect": "Ново преусмерење",
"tag-mw-new-redirect-description": "Измене којима је направљено ново преусмерење или је страница измењена да буде преусмерење",
- "tag-mw-removed-redirect": "Уклоњено преусмјерење",
+ "tag-mw-removed-redirect": "Уклоњено преусмерење",
"tag-mw-removed-redirect-description": "Измене које мењају постојеће преусмерење у страницу без преусмерења",
"tag-mw-changed-redirect-target": "Промењено одредиште преусмерења",
"tag-mw-changed-redirect-target-description": "Измене које мењају одредиште преусмерења",
"tags-edit-chosen-no-results": "Одговарајуће ознаке нису пронађене",
"tags-edit-reason": "Разлог:",
"tags-edit-success": "Измене су примењене.",
+ "tags-edit-nooldid-title": "Неисправна одредишна измена",
+ "tags-edit-none-selected": "Изаберите бар једну ознаку коју треба додати или уклонити.",
"comparepages": "Упоређивање страница",
"compare-page1": "Страница 1",
"compare-page2": "Страница 2",
"compare-revision-not-exists": "Наведена измена не постоји.",
"diff-form": "Разлике",
"diff-form-oldid": "ID старе измене (необавезно)",
+ "diff-form-revid": "ID измене или разлике",
"diff-form-submit": "Прикажи разлике",
"permanentlink": "Стална веза",
"permanentlink-revid": "ID измене",
"htmlform-time-placeholder": "ЧЧ:ММ:СС",
"htmlform-datetime-placeholder": "ГГГГ-ММ-ДД ЧЧ:ММ:СС",
"htmlform-title-badnamespace": "[[:$1]] није у именском простору „{{ns:$2}}“.",
+ "htmlform-title-not-creatable": "Страница „$1“ се не може направити",
"htmlform-title-not-exists": "$1 не постоји.",
"htmlform-user-not-exists": "<strong>$1</strong> не постоји.",
"htmlform-user-not-valid": "<strong>$1</strong> није исправно корисничко име.",
"authpage-cannot-link": "Не могу започети спајање налога.",
"cannotauth-not-allowed-title": "Приступ је одбијен",
"cannotauth-not-allowed": "Није Вам дозвољено да користите ову страницу",
- "changecredentials": "Промјена акредитива",
+ "changecredentials": "Промена акредитива",
"changecredentials-submit": "Промени",
"removecredentials": "Уклањање акредитива",
"credentialsform-provider": "Врста акредитива:",
"rcfilters-invalid-filter": "Ogiltigt filter",
"rcfilters-empty-filter": "Inga aktiva filter. Alla bidrag visas.",
"rcfilters-filterlist-title": "Filter",
- "rcfilters-filterlist-whatsthis": "Hur fungerar desse?",
+ "rcfilters-filterlist-whatsthis": "Hur fungerar dessa?",
"rcfilters-filterlist-feedbacklink": "Berätta vad du tycker om dessa (nya) filtreringsverktyg",
"rcfilters-highlightbutton-title": "Markera resultat",
"rcfilters-highlightmenu-title": "Välj en färg",
"svg-long-desc": "ⴰⴼⴰⵢⵍⵓ SVG, ⵙ $1 × $2 ⵉⴷ ⴱⵉⴽⵙⵍ, ⵜⵉⴷⴷⵉ ⵏ ⵓⴼⴰⵢⵍⵓ: $3",
"show-big-image": "ⴰⴼⴰⵢⵍⵓ ⴰⵙⴰⵍⴰⵏ",
"show-big-image-preview": "ⵜⴰⵙⵎⴽⵜⴰ ⵏ ⵓⵣⵔⵉⵣⵡⴰⵔ ⴰⴷ: $1.",
+ "show-big-image-other": "{{PLURAL:$2|ⵜⴰⴼⵙⴰⵢⵜ|ⵜⵉⴼⵙⴰⵢⵉⵏ}}: ⵢⴰⴹⵏ $1.",
"show-big-image-size": "$1 × $2 ⵉⴷ ⴱⵉⴽⵙⵍ",
"metadata": "ⵎⵉⵜⴰⴷⴰⵜⴰ",
"metadata-fields": "ⵉⴳⵔⴰⵏ ⵏ ⵎⵉⵜⴰⵉⵙⴼⴽⴰ ⵏ ⵜⵉⵡⵍⴰⴼⵉⵏ ⵏⵏⴰ ⵉⴼⵙⵔⵏ ⴳ ⵜⴱⵔⴰⵜ ⴰⴷ ⵔⴰⴷ ⵉⵍⵉⵏ ⴳ ⵜⴰⵙⵏⴰ ⵏ ⵓⵙⵏⵓⵎⵎⵍ ⵏ ⵜⴰⵡⵍⴰⴼⵜ ⴰⴽⵓⴷ ⵏⵏⴰ ⵉⵎⵓⵏ ⵓⵙⴽⵜⵓⵔ. ⵉⴳⵔⴰⵏ ⵢⴰⴹⵏ ⵔⴰⴷ ⴼⴼⵔⵏ ⵙ ⵓⵎⵕⴰⴹ.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
"revdelete-uname-unhid": "取消隱藏使用者名稱",
"revdelete-restricted": "已套用對管理員的限制",
"revdelete-unrestricted": "已移除對管理員的限制",
- "logentry-block-block": "$1 {{GENDER:$2|已封鎖}} {{GENDER:$4|$3}} 期限為 $5 $6",
+ "logentry-block-block": "$1{{GENDER:$2|已封鎖}}{{GENDER:$4|$3}}期限為$5$6",
"logentry-block-unblock": "$1 {{GENDER:$2|已解除封鎖}} {{GENDER:$4|$3}}",
- "logentry-block-reblock": "$1 {{GENDER:$2|已變更}} {{GENDER:$4|$3}} 的封鎖設定期限為 $5 $6",
+ "logentry-block-reblock": "$1{{GENDER:$2|已變更}}{{GENDER:$4|$3}}的封鎖設定期限為$5$6",
"logentry-suppress-block": "$1 {{GENDER:$2|已封鎖}} {{GENDER:$4|$3}} 期限為 $5 $6",
"logentry-suppress-reblock": "$1 {{GENDER:$2|已變更}} {{GENDER:$4|$3}} 的封鎖設定期限為 $5 $6",
"logentry-import-upload": "$1 已由檔案上傳{{GENDER:$2|匯入}} $3",
$this->output( "Deleting self externals from $wgServer\n" );
$db = $this->getDB( DB_MASTER );
while ( 1 ) {
- wfWaitForSlaves();
$this->commitTransaction( $db, __METHOD__ );
$q = $db->limitResult( "DELETE /* deleteSelfExternals */ FROM externallinks WHERE el_to"
. $db->buildLike( $wgServer . '/', $db->anyString() ), $this->getBatchSize() );
list( $n, $display ) = $this->makeNextCond( $dbw, [ $primaryKey ], $lastRow );
$next = [ $n ];
$this->output( "... $display\n" );
- wfWaitForSlaves();
}
$this->output(
// Calculate the "next" condition
$next = [ $primaryKey . ' > ' . $dbw->addQuotes( $row->$primaryKey ) ];
$this->output( "... {$row->$primaryKey}\n" );
- wfWaitForSlaves();
}
$this->output(
$count += $affected;
$blockStart += $batchSize;
$blockEnd += $batchSize;
- wfWaitForSlaves();
}
$this->output( "Done! $count users in group '$oldGroup' are now in '$newGroup' instead.\n" );
}
if ( $interval ) {
sleep( $interval );
}
- wfWaitForSlaves();
}
}
}
$this->commitTransaction( $db, __METHOD__ );
$blockStart += $batchSize;
$blockEnd += $batchSize;
- wfWaitForSlaves();
}
$this->output( "Done populating log_user_text field.\n" );
$blockStart += $batchSize;
$blockEnd += $batchSize;
- wfWaitForSlaves();
}
return $count;
$blockStart += $batchSize;
$blockEnd += $batchSize;
- wfWaitForSlaves();
}
return $count;
$updateSize = 0;
$this->commitTransaction( $db, __METHOD__ );
$this->output( "Commited row with ar_timestamp={$row->ar_timestamp}\n" );
- wfWaitForSlaves();
$this->beginTransaction( $db, __METHOD__ );
}
}
$this->output( "/" );
$this->commitTransaction( $dbw, __METHOD__ );
$i += $thisChunkSize;
- wfWaitForSlaves();
}
$this->output( "\n" );
}
__METHOD__
);
$this->commitTransaction( $dbw, __METHOD__ );
- $this->waitForSlaves();
}
print "$primaryId: resolved to $url\n";
print "Good stubs: $numGood\n";
}
- function waitForSlaves() {
- static $iteration = 0;
- ++$iteration;
- if ( ++$iteration > 50 == 0 ) {
- wfWaitForSlaves();
- $iteration = 0;
- }
- }
-
function findTextIdInPage( $pageId, $textId ) {
$ids = $this->getRevTextMap( $pageId );
if ( !isset( $ids[$textId] ) ) {
} else {
$this->output( "$count done.\n" );
}
-
- if ( !$dryRun && ++$batchCount % self::SYNC_INTERVAL == 0 ) {
- $this->output( "Waiting for replica DBs ... " );
- wfWaitForSlaves();
- $this->output( "done\n" );
- }
} while ( $res->numRows() == self::BATCH_SIZE );
if ( !$dryRun ) {
/* MediaWiki Action */
+ 'mediawiki.action.delete' => [
+ 'scripts' => 'resources/src/mediawiki.action/mediawiki.action.delete.js',
+ 'dependencies' => [
+ 'oojs-ui-core',
+ 'jquery.lengthLimit',
+ ],
+ 'messages' => [
+ // @todo Load this message in content language
+ 'colon-separator',
+ ],
+ ],
+ 'mediawiki.action.delete.file' => [
+ 'scripts' => 'resources/src/mediawiki.action/mediawiki.action.delete.file.js',
+ 'dependencies' => [
+ 'jquery.lengthLimit',
+ ],
+ 'messages' => [
+ // @todo Load this message in content language
+ 'colon-separator',
+ ],
+ ],
'mediawiki.action.edit' => [
'scripts' => [
'resources/src/mediawiki.action/mediawiki.action.edit.js',
'scripts' => 'resources/src/mediawiki.special/mediawiki.special.edittags.js',
'dependencies' => [
'jquery.chosen',
+ 'jquery.lengthLimit',
],
'messages' => [
'tags-edit-chosen-placeholder',
'scripts' => 'resources/src/mediawiki.special/mediawiki.special.recentchanges.js',
'targets' => [ 'desktop', 'mobile' ],
],
+ 'mediawiki.special.revisionDelete' => [
+ 'scripts' => 'resources/src/mediawiki.special/mediawiki.special.revisionDelete.js',
+ 'messages' => [
+ // @todo Load this message in content language
+ 'colon-separator',
+ ],
+ 'dependencies' => [
+ 'jquery.lengthLimit',
+ ],
+ 'targets' => [ 'desktop', 'mobile' ],
+ ],
'mediawiki.special.search' => [
'scripts' => 'resources/src/mediawiki.special/mediawiki.special.search.js',
'styles' => 'resources/src/mediawiki.special/mediawiki.special.search.css',
],
'mediawiki.special.undelete' => [
'scripts' => 'resources/src/mediawiki.special/mediawiki.special.undelete.js',
+ 'dependencies' => [
+ 'mediawiki.widgets.visibleLengthLimit',
+ 'mediawiki.widgets',
+ ],
],
'mediawiki.special.unwatchedPages' => [
'scripts' => 'resources/src/mediawiki.special/mediawiki.special.unwatchedPages.js',
'scripts' => 'resources/src/mediawiki.special/mediawiki.special.userrights.js',
'dependencies' => [
'mediawiki.notification.convertmessagebox',
+ 'jquery.lengthLimit',
],
],
'mediawiki.special.watchlist' => [
--- /dev/null
+/*!
+ * JavaScript for Special:RevisionDelete
+ */
+( function ( mw, $ ) {
+ $( function () {
+ var colonSeparator = mw.message( 'colon-separator' ).text(),
+ summaryCodePointLimit = mw.config.get( 'wgCommentCodePointLimit' ),
+ summaryByteLimit = mw.config.get( 'wgCommentByteLimit' ),
+ $wpDeleteReasonList = $( '#wpDeleteReasonList' ),
+ $wpReason = $( '#wpReason' ),
+ filterFn = function ( input ) {
+ // Should be built the same as in SpecialRevisionDelete::submit()
+ var comment = $wpDeleteReasonList.val();
+ if ( comment === 'other' ) {
+ comment = input;
+ } else if ( input !== '' ) {
+ // Entry from drop down menu + additional comment
+ comment += colonSeparator + input;
+ }
+ return comment;
+ };
+
+ // Limit to bytes or UTF-8 codepoints, depending on MediaWiki's configuration
+ if ( summaryCodePointLimit ) {
+ $wpReason.codePointLimit( summaryCodePointLimit, filterFn );
+ } else if ( summaryByteLimit ) {
+ $wpReason.bytePointLimit( summaryByteLimit, filterFn );
+ }
+ } );
+
+}( mediaWiki, jQuery ) );
--- /dev/null
+/*!
+ * Scripts for action=delete at domready
+ */
+( function ( mw, $ ) {
+ $( function () {
+ var colonSeparator = mw.message( 'colon-separator' ).text(),
+ summaryCodePointLimit = mw.config.get( 'wgCommentCodePointLimit' ),
+ summaryByteLimit = mw.config.get( 'wgCommentByteLimit' ),
+ reasonList = OO.ui.infuse( $( '#wpDeleteReasonList' ).closest( '.oo-ui-widget' ) ),
+ reason = OO.ui.infuse( $( '#wpReason' ).closest( '.oo-ui-widget' ) ),
+ filterFn = function ( input ) {
+ // Should be built the same as in Article::delete()
+ var comment = reasonList.getValue();
+ if ( comment === 'other' ) {
+ comment = input;
+ } else if ( input !== '' ) {
+ // Entry from drop down menu + additional comment
+ comment += colonSeparator + input;
+ }
+ return comment;
+ };
+
+ // Limit to bytes or UTF-8 codepoints, depending on MediaWiki's configuration
+ if ( summaryCodePointLimit ) {
+ reason.$input.codePointLimit( summaryCodePointLimit, filterFn );
+ } else if ( summaryByteLimit ) {
+ reason.$input.bytePointLimit( summaryByteLimit, filterFn );
+ }
+ } );
+}( mediaWiki, jQuery ) );
this.footers = [];
// Parent
- mw.rcfilters.ui.MenuSelectWidget.parent.call( this, $.extend( {
+ mw.rcfilters.ui.MenuSelectWidget.parent.call( this, $.extend( config, {
$autoCloseIgnore: this.$overlay,
width: 650,
// Our filtering is done through the model
filterFromInput: false
- }, config ) );
+ } ) );
this.setGroupElement(
$( '<div>' )
.addClass( 'mw-rcfilters-ui-menuSelectWidget-group' )
dropdownWidget: {
getApiValue: function () {
- var item = this.getMenu().getSelectedItem();
+ var item = this.getMenu().findSelectedItem();
return item === null ? undefined : item.getData();
},
setApiValue: function ( v ) {
var i,
menu = formatDropdown.getMenu(),
items = menu.getItems(),
- selectedField = menu.getSelectedItem() ? menu.getSelectedItem().getData() : null;
+ selectedField = menu.findSelectedItem() ? menu.findSelectedItem().getData() : null;
for ( i = 0; i < items.length; i++ ) {
items[ i ].getData().toggle( items[ i ].getData() === selectedField );
}
menu = formatDropdown.getMenu();
- selectedLabel = menu.getSelectedItem() ? menu.getSelectedItem().getLabel() : '';
+ selectedLabel = menu.findSelectedItem() ? menu.findSelectedItem().getLabel() : '';
if ( typeof selectedLabel !== 'string' ) {
selectedLabel = selectedLabel.text();
}
*/
( function ( mw, $ ) {
$( function () {
- var $tagList = $( '#mw-edittags-tag-list' );
+ var summaryCodePointLimit = mw.config.get( 'wgCommentCodePointLimit' ),
+ summaryByteLimit = mw.config.get( 'wgCommentByteLimit' ),
+ $wpReason = $( '#wpReason' ),
+ $tagList = $( '#mw-edittags-tag-list' );
+
if ( $tagList.length ) {
$tagList.chosen( {
/* eslint-disable camelcase */
$( '#mw-edittags-remove-all' ).prop( 'checked', false );
}
} );
+
+ // Limit to bytes or UTF-8 codepoints, depending on MediaWiki's configuration
+ // use maxLength because it's leaving room for log entry text.
+ if ( summaryCodePointLimit ) {
+ $wpReason.codePointLimit();
+ } else if ( summaryByteLimit ) {
+ $wpReason.bytePointLimit();
+ }
} );
+
}( mediaWiki, jQuery ) );
*/
( function ( mw, $ ) {
$( function () {
+ var summaryCodePointLimit = mw.config.get( 'wgCommentCodePointLimit' ),
+ summaryByteLimit = mw.config.get( 'wgCommentByteLimit' ),
+ wpReason = OO.ui.infuse( $( '#wpReason' ) );
+
// Infuse for pretty dropdown
OO.ui.infuse( $( '#wpNewTitle' ) );
- // Limit to bytes, not characters
- mw.widgets.visibleByteLimit( OO.ui.infuse( $( '#wpReason' ) ) );
+ // Limit to bytes or UTF-8 codepoints, depending on MediaWiki's configuration
+ if ( summaryCodePointLimit ) {
+ mw.widgets.visibleCodePointLimit( wpReason, summaryCodePointLimit );
+ } else if ( summaryByteLimit ) {
+ mw.widgets.visibleByteLimit( wpReason, summaryByteLimit );
+ }
// Infuse for nicer "help" popup
if ( $( '#wpMovetalk-field' ).length ) {
OO.ui.infuse( $( '#wpMovetalk-field' ) );
--- /dev/null
+/*!
+ * JavaScript for Special:RevisionDelete
+ */
+( function ( mw, $ ) {
+ var colonSeparator = mw.message( 'colon-separator' ).text(),
+ summaryCodePointLimit = mw.config.get( 'wgCommentCodePointLimit' ),
+ summaryByteLimit = mw.config.get( 'wgCommentByteLimit' ),
+ $wpRevDeleteReasonList = $( '#wpRevDeleteReasonList' ),
+ $wpReason = $( '#wpReason' ),
+ filterFn = function ( input ) {
+ // Should be built the same as in SpecialRevisionDelete::submit()
+ var comment = $wpRevDeleteReasonList.val();
+ if ( comment === 'other' ) {
+ comment = input;
+ } else if ( input !== '' ) {
+ // Entry from drop down menu + additional comment
+ comment += colonSeparator + input;
+ }
+ return comment;
+ };
+
+ // Limit to bytes or UTF-8 codepoints, depending on MediaWiki's configuration
+ if ( summaryCodePointLimit ) {
+ $wpReason.codePointLimit( summaryCodePointLimit, filterFn );
+ } else if ( summaryByteLimit ) {
+ $wpReason.bytePointLimit( summaryByteLimit, filterFn );
+ }
+
+}( mediaWiki, jQuery ) );
/*!
* JavaScript for Special:Undelete
*/
-jQuery( function ( $ ) {
- $( '#mw-undelete-invert' ).click( function () {
- $( '.mw-undelete-revlist input[type="checkbox"]' ).prop( 'checked', function ( i, val ) {
- return !val;
+( function ( mw, $ ) {
+ $( function () {
+ var summaryCodePointLimit = mw.config.get( 'wgCommentCodePointLimit' ),
+ summaryByteLimit = mw.config.get( 'wgCommentByteLimit' ),
+ wpComment = OO.ui.infuse( $( '#wpComment' ).closest( '.oo-ui-widget' ) );
+
+ $( '#mw-undelete-invert' ).click( function () {
+ $( '.mw-undelete-revlist input[type="checkbox"]' ).prop( 'checked', function ( i, val ) {
+ return !val;
+ } );
} );
+
+ // Limit to bytes or UTF-8 codepoints, depending on MediaWiki's configuration
+ if ( summaryCodePointLimit ) {
+ mw.widgets.visibleCodePointLimit( wpComment, summaryCodePointLimit );
+ } else if ( summaryByteLimit ) {
+ mw.widgets.visibleByteLimit( wpComment, summaryByteLimit );
+ }
} );
-} );
+}( mediaWiki, jQuery ) );
/*!
* JavaScript for Special:UserRights
*/
-( function ( $ ) {
- var convertmessagebox = require( 'mediawiki.notification.convertmessagebox' );
+( function ( mw, $ ) {
+ var convertmessagebox = require( 'mediawiki.notification.convertmessagebox' ),
+ summaryCodePointLimit = mw.config.get( 'wgCommentCodePointLimit' ),
+ summaryByteLimit = mw.config.get( 'wgCommentByteLimit' ),
+ $wpReason = $( '#wpReason' );
+
// Replace successbox with notifications
convertmessagebox();
$( '.mw-userrights-nested select' ).on( 'change', function ( e ) {
$( e.target.parentNode ).find( 'input' ).toggle( $( e.target ).val() === 'other' );
} );
-}( jQuery ) );
+
+ // Limit to bytes or UTF-8 codepoints, depending on MediaWiki's configuration
+ if ( summaryCodePointLimit ) {
+ $wpReason.codePointLimit( summaryCodePointLimit );
+ } else if ( summaryByteLimit ) {
+ $wpReason.bytePointLimit( summaryByteLimit );
+ }
+
+}( mediaWiki, jQuery ) );
$root
.find( '.mw-htmlform-select-and-other-field' )
.each( function () {
- var $this = $( this ),
+ var $reasonList, currentValReasonList, maxlengthUnit, lengthLimiter, widget,
+ $this = $( this ),
+ $widget = $this.closest( '.oo-ui-widget[data-ooui]' );
+
+ if ( $widget ) {
+ mw.loader.using( 'mediawiki.widgets.SelectWithInputWidget', function () {
+ widget = OO.ui.Widget.static.infuse( $widget );
+ maxlengthUnit = widget.getData().maxlengthUnit;
+ lengthLimiter = maxlengthUnit === 'codepoints' ? 'codePointLimit' : 'byteLimit';
+ widget.textinput.$input[ lengthLimiter ]( function ( input ) {
+ // Should be built the same as in HTMLSelectAndOtherField::loadDataFromRequest
+ var comment = widget.dropdowninput.getValue();
+ if ( comment === 'other' ) {
+ comment = input;
+ } else if ( input !== '' ) {
+ // Entry from drop down menu + additional comment
+ comment += colonSeparator + input;
+ }
+ return comment;
+ } );
+ } );
+ } else {
// find the reason list
- $reasonList = $root.find( '#' + $this.data( 'id-select' ) ),
+ $reasonList = $root.find( '#' + $this.data( 'id-select' ) );
// cache the current selection to avoid expensive lookup
currentValReasonList = $reasonList.val();
- $reasonList.change( function () {
- currentValReasonList = $reasonList.val();
- } );
+ $reasonList.change( function () {
+ currentValReasonList = $reasonList.val();
+ } );
- $this.byteLimit( function ( input ) {
- // Should be built the same as in HTMLSelectAndOtherField::loadDataFromRequest
- var comment = currentValReasonList;
- if ( comment === 'other' ) {
- comment = input;
- } else if ( input !== '' ) {
- // Entry from drop down menu + additional comment
- comment += colonSeparator + input;
- }
- return comment;
- } );
+ // Select the function for the length limit
+ maxlengthUnit = $this.data( 'mw-maxlength-unit' );
+ lengthLimiter = maxlengthUnit === 'codepoints' ? 'codePointLimit' : 'byteLimit';
+ $this[ lengthLimiter ]( function ( input ) {
+ // Should be built the same as in HTMLSelectAndOtherField::loadDataFromRequest
+ var comment = currentValReasonList;
+ if ( comment === 'other' ) {
+ comment = input;
+ } else if ( input !== '' ) {
+ // Entry from drop down menu + additional comment
+ comment += colonSeparator + input;
+ }
+ return comment;
+ } );
+ }
} );
} );
$limit = "/bin/bash '$IP/includes/shell/limit.sh'";
$profile = "--profile=$IP/includes/shell/firejail.profile";
$blacklist = '--blacklist=' . realpath( MW_CONFIG_FILE );
- $default = "$blacklist --noroot --seccomp=@default --private-dev";
+ $default = "$blacklist --noroot --seccomp --private-dev";
return [
[
'No restrictions',
[
'seccomp',
'ls', Shell::SECCOMP,
- "$limit 'firejail --quiet $profile --seccomp=@default -- '\''ls'\''' $env"
+ "$limit 'firejail --quiet $profile --seccomp -- '\''ls'\''' $env"
],
[
'seccomp & no execve',
'ls', Shell::SECCOMP | Shell::NO_EXECVE,
- "$limit 'firejail --quiet $profile --shell=none --seccomp=@default,execve -- '\''ls'\''' $env"
+ "$limit 'firejail --quiet $profile --shell=none --seccomp=execve -- '\''ls'\''' $env"
],
];
}
'ResourceLoaderTestCase',
'PHPUnit_Framework_TestCase',
'\\?PHPUnit\\Framework\\TestCase',
+ 'TestCase', // \PHPUnit\Framework\TestCase with appropriate use statement
'DumpTestCase',
] );
$testClassRegex = "^class .* extends ($testClassRegex)";