From: jenkins-bot Date: Tue, 9 May 2017 16:51:40 +0000 (+0000) Subject: Merge "Revised styling of sister-search sidebar." X-Git-Tag: 1.31.0-rc.0~3293 X-Git-Url: https://git.heureux-cyclage.org/?p=lhc%2Fweb%2Fwiklou.git;a=commitdiff_plain;h=005802b82b106605a928394c859248c2f47f93bb;hp=a0f492fffcc24bb42b41b314b18da3b673b70b03 Merge "Revised styling of sister-search sidebar." --- diff --git a/.mailmap b/.mailmap index f0562198e6..ae188781ca 100644 --- a/.mailmap +++ b/.mailmap @@ -196,6 +196,7 @@ Jackmcbarn Jackmcbarn jagori James Forrester +Jaime Crespo Jan Gerber Jan Luca Naumann Jan Luca Naumann @@ -409,9 +410,10 @@ Steven Walling Subramanya Sastry Sucheta Ghoshal Sumit Asthana +TerraCodes Thalia Chan -Thiemo Mättig (WMDE) -Thiemo Mättig (WMDE) +Thiemo Mättig +Thiemo Mättig This, that and the other tholam Thomas Bleher diff --git a/CREDITS b/CREDITS index 80d4e0e487..1530425123 100644 --- a/CREDITS +++ b/CREDITS @@ -48,6 +48,7 @@ The following list can be found parsed under Special:Version/Credits --> * ananay * Anders Wegge Jakobsen * Andre Engels +* Andre Klapper * Andrew Bogott * Andrew Dunbar * Andrew Garrett @@ -200,6 +201,7 @@ The following list can be found parsed under Special:Version/Credits --> * Erik Moeller * Erwin Dokter * Étienne Beaulé +* Eugene Gvozdetsky * Evan McIntire * Evan Prodromou * ExplosiveHippo @@ -257,6 +259,7 @@ The following list can be found parsed under Special:Version/Credits --> * Jacob Block * Jacob Clark * jagori +* Jaime Crespo * Jakub Vrana * James Earl Douglas * James Forrester @@ -366,6 +369,7 @@ The following list can be found parsed under Special:Version/Credits --> * Madman * madurangasiriwardena * Magnus Manske +* mainframe98 * Manuel Menal * Manuel Schneider * Marc Ordinas i Llopis @@ -421,6 +425,7 @@ The following list can be found parsed under Special:Version/Credits --> * Michał Roszka * Michał Zieliński * Mike Horvath +* Mikhail Popov * Minh Nguyễn * MinuteElectron * Misza13 @@ -455,7 +460,6 @@ The following list can be found parsed under Special:Version/Credits --> * Nicolas Dumazet * Nicolas Weeger * Niharika Kohli -* Nik * Nik Everett * Niklas Laxström * Nikola Kovacs @@ -610,10 +614,10 @@ The following list can be found parsed under Special:Version/Credits --> * Subramanya Sastry * Sumit Asthana * svip -* Swalling * Szymon Świerkosz * T.D. Corell * Tarquin +* TerraCodes * The Discoverer * The Evil IP address * theopolisme diff --git a/HISTORY b/HISTORY index be90221143..9259814a9a 100644 --- a/HISTORY +++ b/HISTORY @@ -27,9 +27,6 @@ Change notes from older releases. For current info see RELEASE-NOTES-1.30. $wgNamespacesWithSubpages[NS_TEMPLATE] to false to keep the old behavior. * $wgRunJobsAsync is now false by default (T142751). This change only affects wikis with $wgJobRunRate > 0. -* A temporary feature flag, $wgDisableUserGroupExpiry, is provided to disable - new features that rely on the schema changes to the user_groups table. This - feature flag will likely be removed before 1.29 is released. * (T158474) "Unknown user" has been added to $wgReservedUsernames. * (T156983) $wgRateLimitsExcludedIPs now accepts CIDR ranges as well as single IPs. * $wgDummyLanguageCodes is deprecated. Additional language code mappings may be diff --git a/RELEASE-NOTES-1.30 b/RELEASE-NOTES-1.30 index cdf8ba4421..590dc2c857 100644 --- a/RELEASE-NOTES-1.30 +++ b/RELEASE-NOTES-1.30 @@ -14,7 +14,11 @@ production. documentation of $wgShellLocale for details. === New features in 1.30 === -* … +* (T37247) Output from Parser::parse() will now be wrapped in a div with + class="mw-parser-output" by default. This may be changed or disabled using + ParserOptions::setWrapOutputClass(). +* Added 'ChangeTagsAllowedAdd' hook, enabling extensions to allow software- + specific tags to be added by users. === External library changes in 1.30 === @@ -31,7 +35,9 @@ production. * … === Action API changes in 1.30 === -* … +* (T37247) action=parse output will be wrapped in a div with + class="mw-parser-output" by default. This may be changed or disabled using + the new 'wrapoutputclass' parameter. === Action API internal changes in 1.30 === * … diff --git a/composer.json b/composer.json index ed42b603c0..76ae28c6fd 100644 --- a/composer.json +++ b/composer.json @@ -53,7 +53,7 @@ "jakub-onderka/php-parallel-lint": "0.9.2", "jetbrains/phpstorm-stubs": "dev-master#1b9906084d6635456fcf3f3a01f0d7d5b99a578a", "justinrainbow/json-schema": "~3.0", - "mediawiki/mediawiki-codesniffer": "0.7.2", + "mediawiki/mediawiki-codesniffer": "0.8.0", "monolog/monolog": "~1.22.1", "nikic/php-parser": "2.1.0", "nmred/kafka-php": "0.1.5", diff --git a/docs/hooks.txt b/docs/hooks.txt index 7c09a5551c..d95e39b986 100644 --- a/docs/hooks.txt +++ b/docs/hooks.txt @@ -1070,6 +1070,13 @@ $params: tag params $rc: RecentChange being tagged when the tagging accompanies the action or null $user: User who performed the tagging when the tagging is subsequent to the action or null +'ChangeTagsAllowedAdd': Called when checking if a user can add tags to a change. +&$allowedTags: List of all the tags the user is allowed to add. Any tags the + user wants to add ($addTags) that are not in this array will cause it to fail. + You may add or remove tags to this array as required. +$addTags: List of tags user intends to add. +$user: User who is adding the tags. + 'ChangeUserGroups': Called before user groups are changed. $performer: The User who will perform the change $user: The User whose groups will be changed diff --git a/includes/DefaultSettings.php b/includes/DefaultSettings.php index 7c18fcc594..f8d2d75f6c 100644 --- a/includes/DefaultSettings.php +++ b/includes/DefaultSettings.php @@ -5912,15 +5912,6 @@ $wgBotPasswordsCluster = false; */ $wgBotPasswordsDatabase = false; -/** - * Whether to disable user group expiry. This is a transitional feature flag - * in accordance with WMF schema change policy, and will be removed later - * (hopefully before MW 1.29 release). - * - * @since 1.29 - */ -$wgDisableUserGroupExpiry = false; - /** @} */ # end of user rights settings /************************************************************************//** diff --git a/includes/Preferences.php b/includes/Preferences.php index b428e87be4..40176197b5 100644 --- a/includes/Preferences.php +++ b/includes/Preferences.php @@ -915,6 +915,9 @@ class Preferences { 'label-message' => 'tog-hideminor', 'section' => 'rc/advancedrc', ]; + $defaultPreferences['rcfilters-saved-queries'] = [ + 'type' => 'api', + ]; if ( $config->get( 'RCWatchCategoryMembership' ) ) { $defaultPreferences['hidecategorization'] = [ diff --git a/includes/SiteStats.php b/includes/SiteStats.php index ac5e49e70e..d253805589 100644 --- a/includes/SiteStats.php +++ b/includes/SiteStats.php @@ -194,7 +194,6 @@ class SiteStats { wfMemcKey( 'SiteStats', 'groupcounts', $group ), $cache::TTL_HOUR, function ( $oldValue, &$ttl, array &$setOpts ) use ( $group ) { - global $wgDisableUserGroupExpiry; $dbr = wfGetDB( DB_REPLICA ); $setOpts += Database::getCacheSetOptions( $dbr ); @@ -204,9 +203,7 @@ class SiteStats { 'COUNT(*)', [ 'ug_group' => $group, - $wgDisableUserGroupExpiry ? - '1' : - 'ug_expiry IS NULL OR ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() ) + 'ug_expiry IS NULL OR ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() ) ], __METHOD__ ); diff --git a/includes/Title.php b/includes/Title.php index e460cdaaa5..a8cfad8748 100644 --- a/includes/Title.php +++ b/includes/Title.php @@ -3994,29 +3994,52 @@ class Title implements LinkTarget { } /** - * Get the revision ID of the previous revision - * + * Get next/previous revision ID relative to another revision ID * @param int $revId Revision ID. Get the revision that was before this one. * @param int $flags Title::GAID_FOR_UPDATE - * @return int|bool Old revision ID, or false if none exists - */ - public function getPreviousRevisionID( $revId, $flags = 0 ) { - /* This function and getNextRevisionID have bad performance when - used on a page with many revisions on mysql. An explicit extended - primary key may help in some cases, if the PRIMARY KEY is banned: - T159319 */ + * @param string $dir 'next' or 'prev' + * @return int|bool New revision ID, or false if none exists + */ + private function getRelativeRevisionID( $revId, $flags, $dir ) { + $revId = (int)$revId; + if ( $dir === 'next' ) { + $op = '>'; + $sort = 'ASC'; + } elseif ( $dir === 'prev' ) { + $op = '<'; + $sort = 'DESC'; + } else { + throw new InvalidArgumentException( '$dir must be "next" or "prev"' ); + } + if ( $flags & self::GAID_FOR_UPDATE ) { $db = wfGetDB( DB_MASTER ); } else { $db = wfGetDB( DB_REPLICA, 'contributions' ); } + + // Intentionally not caring if the specified revision belongs to this + // page. We only care about the timestamp. + $ts = $db->selectField( 'revision', 'rev_timestamp', [ 'rev_id' => $revId ], __METHOD__ ); + if ( $ts === false ) { + $ts = $db->selectField( 'archive', 'ar_timestamp', [ 'ar_rev_id' => $revId ], __METHOD__ ); + if ( $ts === false ) { + // Or should this throw an InvalidArgumentException or something? + return false; + } + } + $ts = $db->addQuotes( $ts ); + $revId = $db->selectField( 'revision', 'rev_id', [ 'rev_page' => $this->getArticleID( $flags ), - 'rev_id < ' . intval( $revId ) + "rev_timestamp $op $ts OR (rev_timestamp = $ts AND rev_id $op $revId)" ], __METHOD__, - [ 'ORDER BY' => 'rev_id DESC', 'IGNORE INDEX' => 'PRIMARY' ] + [ + 'ORDER BY' => "rev_timestamp $sort, rev_id $sort", + 'IGNORE INDEX' => 'rev_timestamp', // Probably needed for T159319 + ] ); if ( $revId === false ) { @@ -4026,6 +4049,17 @@ class Title implements LinkTarget { } } + /** + * Get the revision ID of the previous revision + * + * @param int $revId Revision ID. Get the revision that was before this one. + * @param int $flags Title::GAID_FOR_UPDATE + * @return int|bool Old revision ID, or false if none exists + */ + public function getPreviousRevisionID( $revId, $flags = 0 ) { + return $this->getRelativeRevisionID( $revId, $flags, 'prev' ); + } + /** * Get the revision ID of the next revision * @@ -4034,25 +4068,7 @@ class Title implements LinkTarget { * @return int|bool Next revision ID, or false if none exists */ public function getNextRevisionID( $revId, $flags = 0 ) { - if ( $flags & self::GAID_FOR_UPDATE ) { - $db = wfGetDB( DB_MASTER ); - } else { - $db = wfGetDB( DB_REPLICA, 'contributions' ); - } - $revId = $db->selectField( 'revision', 'rev_id', - [ - 'rev_page' => $this->getArticleID( $flags ), - 'rev_id > ' . intval( $revId ) - ], - __METHOD__, - [ 'ORDER BY' => 'rev_id', 'IGNORE INDEX' => 'PRIMARY' ] - ); - - if ( $revId === false ) { - return false; - } else { - return intval( $revId ); - } + return $this->getRelativeRevisionID( $revId, $flags, 'next' ); } /** @@ -4069,8 +4085,8 @@ class Title implements LinkTarget { [ 'rev_page' => $pageId ], __METHOD__, [ - 'ORDER BY' => 'rev_timestamp ASC', - 'IGNORE INDEX' => 'rev_timestamp' + 'ORDER BY' => 'rev_timestamp ASC, rev_id ASC', + 'IGNORE INDEX' => 'rev_timestamp', // See T159319 ] ); if ( $row ) { diff --git a/includes/api/ApiParse.php b/includes/api/ApiParse.php index d6489688e6..7d22d9c470 100644 --- a/includes/api/ApiParse.php +++ b/includes/api/ApiParse.php @@ -478,6 +478,9 @@ class ApiParse extends ApiBase { if ( $params['disabletidy'] ) { $popts->setTidy( false ); } + $popts->setWrapOutputClass( + $params['wrapoutputclass'] === '' ? false : $params['wrapoutputclass'] + ); $reset = null; $suppressCache = false; @@ -788,6 +791,7 @@ class ApiParse extends ApiBase { 'parsetree' => [ 'apihelp-parse-paramvalue-prop-parsetree', CONTENT_MODEL_WIKITEXT ], ], ], + 'wrapoutputclass' => 'mw-parser-output', 'pst' => false, 'onlypst' => false, 'effectivelanglinks' => false, diff --git a/includes/api/ApiQueryAllImages.php b/includes/api/ApiQueryAllImages.php index daeedbef6a..250bee667f 100644 --- a/includes/api/ApiQueryAllImages.php +++ b/includes/api/ApiQueryAllImages.php @@ -205,9 +205,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase { [ 'ug_group' => User::getGroupsWithPermission( 'bot' ), 'ug_user = img_user', - $this->getConfig()->get( 'DisableUserGroupExpiry' ) ? - '1' : - 'ug_expiry IS NULL OR ug_expiry >= ' . $db->addQuotes( $db->timestamp() ) + 'ug_expiry IS NULL OR ug_expiry >= ' . $db->addQuotes( $db->timestamp() ) ] ] ] ); $groupCond = ( $params['filterbots'] == 'nobots' ? 'NULL' : 'NOT NULL' ); diff --git a/includes/api/ApiQueryAllUsers.php b/includes/api/ApiQueryAllUsers.php index 0f0b2afaaa..fd95e1785a 100644 --- a/includes/api/ApiQueryAllUsers.php +++ b/includes/api/ApiQueryAllUsers.php @@ -122,9 +122,7 @@ class ApiQueryAllUsers extends ApiQueryBase { [ 'ug1.ug_user=user_id', 'ug1.ug_group' => $params['group'], - $this->getConfig()->get( 'DisableUserGroupExpiry' ) ? - '1' : - 'ug1.ug_expiry IS NULL OR ug1.ug_expiry >= ' . $db->addQuotes( $db->timestamp() ) + 'ug1.ug_expiry IS NULL OR ug1.ug_expiry >= ' . $db->addQuotes( $db->timestamp() ) ] ] ] ); @@ -147,9 +145,7 @@ class ApiQueryAllUsers extends ApiQueryBase { $this->addJoinConds( [ 'ug1' => [ 'LEFT OUTER JOIN', array_merge( [ 'ug1.ug_user=user_id', - $this->getConfig()->get( 'DisableUserGroupExpiry' ) ? - '1' : - 'ug1.ug_expiry IS NULL OR ug1.ug_expiry >= ' . $db->addQuotes( $db->timestamp() ) + 'ug1.ug_expiry IS NULL OR ug1.ug_expiry >= ' . $db->addQuotes( $db->timestamp() ) ], $exclude ) ] ] ); $this->addWhere( 'ug1.ug_user IS NULL' ); @@ -165,9 +161,7 @@ class ApiQueryAllUsers extends ApiQueryBase { $this->addFields( [ 'groups' => $db->buildGroupConcatField( '|', 'user_groups', 'ug_group', [ 'ug_user=user_id', - $this->getConfig()->get( 'DisableUserGroupExpiry' ) ? - '1' : - 'ug_expiry IS NULL OR ug_expiry >= ' . $db->addQuotes( $db->timestamp() ) + 'ug_expiry IS NULL OR ug_expiry >= ' . $db->addQuotes( $db->timestamp() ) ] ) ] ); } diff --git a/includes/api/ApiQueryContributors.php b/includes/api/ApiQueryContributors.php index 183409d24f..693d954d90 100644 --- a/includes/api/ApiQueryContributors.php +++ b/includes/api/ApiQueryContributors.php @@ -163,9 +163,7 @@ class ApiQueryContributors extends ApiQueryBase { [ 'ug_user=rev_user', 'ug_group' => $limitGroups, - $this->getConfig()->get( 'DisableUserGroupExpiry' ) ? - '1' : - 'ug_expiry IS NULL OR ug_expiry >= ' . $db->addQuotes( $db->timestamp() ) + 'ug_expiry IS NULL OR ug_expiry >= ' . $db->addQuotes( $db->timestamp() ) ] ] ] ); $this->addWhereIf( 'ug_user IS NULL', $excludeGroups ); diff --git a/includes/api/ApiQueryRevisions.php b/includes/api/ApiQueryRevisions.php index 7b8394f7fd..b0a8468428 100644 --- a/includes/api/ApiQueryRevisions.php +++ b/includes/api/ApiQueryRevisions.php @@ -218,10 +218,75 @@ class ApiQueryRevisions extends ApiQueryRevisionsBase { ); } - $this->addTimestampWhereRange( 'rev_timestamp', $params['dir'], - $params['start'], $params['end'] ); - $this->addWhereRange( 'rev_id', $params['dir'], - $params['startid'], $params['endid'] ); + // Convert startid/endid to timestamps (T163532) + if ( $params['startid'] !== null || $params['endid'] !== null ) { + $ids = [ + (int)$params['startid'] => true, + (int)$params['endid'] => true, + ]; + unset( $ids[0] ); // null + $ids = array_keys( $ids ); + + $db = $this->getDB(); + $sql = $db->unionQueries( [ + $db->selectSQLText( + 'revision', + [ 'id' => 'rev_id', 'ts' => 'rev_timestamp' ], + [ 'rev_id' => $ids ], + __METHOD__ + ), + $db->selectSQLText( + 'archive', + [ 'id' => 'ar_rev_id', 'ts' => 'ar_timestamp' ], + [ 'ar_rev_id' => $ids ], + __METHOD__ + ), + ], false ); + $res = $db->query( $sql, __METHOD__ ); + foreach ( $res as $row ) { + if ( (int)$row->id === (int)$params['startid'] ) { + $params['start'] = $row->ts; + } + if ( (int)$row->id === (int)$params['endid'] ) { + $params['end'] = $row->ts; + } + } + if ( $params['startid'] !== null && $params['start'] === null ) { + $p = $this->encodeParamName( 'startid' ); + $this->dieWithError( [ 'apierror-revisions-badid', $p ], "badid_$p" ); + } + if ( $params['endid'] !== null && $params['end'] === null ) { + $p = $this->encodeParamName( 'endid' ); + $this->dieWithError( [ 'apierror-revisions-badid', $p ], "badid_$p" ); + } + + if ( $params['start'] !== null ) { + $op = ( $params['dir'] === 'newer' ? '>' : '<' ); + $ts = $db->addQuotes( $db->timestampOrNull( $params['start'] ) ); + if ( $params['startid'] !== null ) { + $this->addWhere( "rev_timestamp $op $ts OR " + . "rev_timestamp = $ts AND rev_id $op= " . intval( $params['startid'] ) ); + } else { + $this->addWhere( "rev_timestamp $op= $ts" ); + } + } + if ( $params['end'] !== null ) { + $op = ( $params['dir'] === 'newer' ? '<' : '>' ); // Yes, opposite of the above + $ts = $db->addQuotes( $db->timestampOrNull( $params['end'] ) ); + if ( $params['endid'] !== null ) { + $this->addWhere( "rev_timestamp $op $ts OR " + . "rev_timestamp = $ts AND rev_id $op= " . intval( $params['endid'] ) ); + } else { + $this->addWhere( "rev_timestamp $op= $ts" ); + } + } + } else { + $this->addTimestampWhereRange( 'rev_timestamp', $params['dir'], + $params['start'], $params['end'] ); + } + + $sort = ( $params['dir'] === 'newer' ? '' : 'DESC' ); + $this->addOption( 'ORDER BY', [ "rev_timestamp $sort", "rev_id $sort" ] ); // There is only one ID, use it $ids = array_keys( $pageSet->getGoodTitles() ); diff --git a/includes/api/ApiQueryUsers.php b/includes/api/ApiQueryUsers.php index 4515f7f606..a5d06c824c 100644 --- a/includes/api/ApiQueryUsers.php +++ b/includes/api/ApiQueryUsers.php @@ -172,10 +172,8 @@ class ApiQueryUsers extends ApiQueryBase { $this->addJoinConds( [ 'user_groups' => [ 'INNER JOIN', 'ug_user=user_id' ] ] ); $this->addFields( [ 'user_name' ] ); $this->addFields( UserGroupMembership::selectFields() ); - if ( !$this->getConfig()->get( 'DisableUserGroupExpiry' ) ) { - $this->addWhere( 'ug_expiry IS NULL OR ug_expiry >= ' . - $db->addQuotes( $db->timestamp() ) ); - } + $this->addWhere( 'ug_expiry IS NULL OR ug_expiry >= ' . + $db->addQuotes( $db->timestamp() ) ); $userGroupsRes = $this->select( __METHOD__ ); foreach ( $userGroupsRes as $row ) { diff --git a/includes/api/ApiUserrights.php b/includes/api/ApiUserrights.php index d857e4afdd..2a364d9756 100644 --- a/includes/api/ApiUserrights.php +++ b/includes/api/ApiUserrights.php @@ -58,7 +58,7 @@ class ApiUserrights extends ApiBase { $params = $this->extractRequestParams(); // Figure out expiry times from the input - // @todo Remove this isset check when removing $wgDisableUserGroupExpiry + // $params['expiry'] may not be set in subclasses if ( isset( $params['expiry'] ) ) { $expiry = (array)$params['expiry']; } else { diff --git a/includes/api/i18n/de.json b/includes/api/i18n/de.json index 074d69ebe4..fee1fa337d 100644 --- a/includes/api/i18n/de.json +++ b/includes/api/i18n/de.json @@ -312,6 +312,7 @@ "apihelp-parse-paramvalue-prop-wikitext": "Gibt den originalen Wikitext zurück, der geparst wurde.", "apihelp-parse-paramvalue-prop-properties": "Gibt verschiedene Eigenschaften zurück, die im geparsten Wikitext definiert sind.", "apihelp-parse-paramvalue-prop-parsewarnings": "Gibt die Warnungen aus, die beim Parsen des Inhalts aufgetreten sind.", + "apihelp-parse-param-wrapoutputclass": "Zu verwendende CSS-Klasse, in der die Parserausgabe verpackt werden soll.", "apihelp-parse-param-section": "Parst nur den Inhalt dieser Abschnittsnummer.\n\nFalls new, parst $1text und $1sectiontitle, als ob ein neuer Abschnitt der Seite hinzugefügt wird.\n\nnew ist nur erlaubt mit der Angabe text.", "apihelp-parse-param-sectiontitle": "Überschrift des neuen Abschnittes, wenn section = new ist.\n\nAnders als beim Bearbeiten der Seite wird der Parameter nicht durch die summary ersetzt, wenn er weggelassen oder leer ist.", "apihelp-parse-param-disablepp": "Benutze $1disablelimitreport stattdessen.", @@ -1026,6 +1027,7 @@ "apierror-pagelang-disabled": "Das Ändern der Sprache von Seiten ist auf diesem Wiki nicht erlaubt.", "apierror-protect-invalidaction": "Ungültiger Schutztyp „$1“.", "apierror-readonly": "Das Wiki ist derzeit im schreibgeschützten Modus.", + "apierror-revisions-badid": "Für den Parameter $1 wurde keine Version gefunden.", "apierror-revwrongpage": "Die Version $1 ist keine Version von $2.", "apierror-sectionreplacefailed": "Der aktualisierte Abschnitt konnte nicht zusammengeführt werden.", "apierror-stashinvalidfile": "Ungültige gespeicherte Datei.", diff --git a/includes/api/i18n/en.json b/includes/api/i18n/en.json index 7a04cafafb..c3c7bd4571 100644 --- a/includes/api/i18n/en.json +++ b/includes/api/i18n/en.json @@ -349,6 +349,7 @@ "apihelp-parse-paramvalue-prop-limitreporthtml": "Gives the HTML version of the limit report. Gives no data, when $1disablelimitreport is set.", "apihelp-parse-paramvalue-prop-parsetree": "The XML parse tree of revision content (requires content model $1)", "apihelp-parse-paramvalue-prop-parsewarnings": "Gives the warnings that occurred while parsing content.", + "apihelp-parse-param-wrapoutputclass": "CSS class to use to wrap the parser output.", "apihelp-parse-param-pst": "Do a pre-save transform on the input before parsing it. Only valid when used with text.", "apihelp-parse-param-onlypst": "Do a pre-save transform (PST) on the input, but don't parse it. Returns the same wikitext, after a PST has been applied. Only valid when used with $1text.", "apihelp-parse-param-effectivelanglinks": "Includes language links supplied by extensions (for use with $1prop=langlinks).", @@ -1056,8 +1057,8 @@ "apihelp-query+revisions-description": "Get revision information.\n\nMay be used in several ways:\n# Get data about a set of pages (last revision), by setting titles or pageids.\n# Get revisions for one given page, by using titles or pageids with start, end, or limit.\n# Get data about a set of revisions by setting their IDs with revids.", "apihelp-query+revisions-paraminfo-singlepageonly": "May only be used with a single page (mode #2).", - "apihelp-query+revisions-param-startid": "From which revision ID to start enumeration.", - "apihelp-query+revisions-param-endid": "Stop revision enumeration on this revision ID.", + "apihelp-query+revisions-param-startid": "Start enumeration from this revision's timestamp. The revision must exist, but need not belong to this page.", + "apihelp-query+revisions-param-endid": "Stop enumeration at this revision's timestamp. The revision must exist, but need not belong to this page.", "apihelp-query+revisions-param-start": "From which revision timestamp to start enumeration.", "apihelp-query+revisions-param-end": "Enumerate up to this timestamp.", "apihelp-query+revisions-param-user": "Only include revisions made by user.", @@ -1720,6 +1721,7 @@ "apierror-revdel-mutuallyexclusive": "The same field cannot be used in both hide and show.", "apierror-revdel-needtarget": "A target title is required for this RevDel type.", "apierror-revdel-paramneeded": "At least one value is required for hide and/or show.", + "apierror-revisions-badid": "No revision was found for parameter $1.", "apierror-revisions-norevids": "The revids parameter may not be used with the list options ($1limit, $1startid, $1endid, $1dir=newer, $1user, $1excludeuser, $1start, and $1end).", "apierror-revisions-singlepage": "titles, pageids or a generator was used to supply multiple pages, but the $1limit, $1startid, $1endid, $1dir=newer, $1user, $1excludeuser, $1start, and $1end parameters may only be used on a single page.", "apierror-revwrongpage": "r$1 is not a revision of $2.", diff --git a/includes/api/i18n/fr.json b/includes/api/i18n/fr.json index 3a47b63143..35de6725ec 100644 --- a/includes/api/i18n/fr.json +++ b/includes/api/i18n/fr.json @@ -345,6 +345,7 @@ "apihelp-parse-paramvalue-prop-limitreporthtml": "Fournit la version HTML du rapport de limite. Ne fournit aucune donnée, si $1disablelimitreport est positionné.", "apihelp-parse-paramvalue-prop-parsetree": "L’arbre d’analyse XML du contenu de la révision (nécessite le modèle de contenu $1)", "apihelp-parse-paramvalue-prop-parsewarnings": "Fournit les messages d'avertissement qui sont apparus lors de l'analyse de contenu.", + "apihelp-parse-param-wrapoutputclass": "classe CSS à utiliser pour formater la sortie de l'analyseur.", "apihelp-parse-param-pst": "Faire une transformation avant enregistrement de l’entrée avant de l’analyser. Valide uniquement quand utilisé avec du texte.", "apihelp-parse-param-onlypst": "Faire une transformation avant enregistrement (PST) de l’entrée, mais ne pas l’analyser. Renvoie le même wikitexte, après que la PST a été appliquée. Valide uniquement quand utilisé avec $1text.", "apihelp-parse-param-effectivelanglinks": "Inclut les liens de langue fournis par les extensions (à utiliser avec $1prop=langlinks).", @@ -998,8 +999,8 @@ "apihelp-query+redirects-example-generator": "Obtenir des informations sur toutes les redirections vers [[Main Page]]", "apihelp-query+revisions-description": "Obtenir des informations sur la révision.\n\nPeut être utilisé de différentes manières :\n# Obtenir des données sur un ensemble de pages (dernière révision), en mettant les titres ou les ids de page.\n# Obtenir les révisions d’une page donnée, en utilisant les titres ou les ids de page avec rvstart, rvend ou rvlimit.\n# Obtenir des données sur un ensemble de révisions en donnant leurs IDs avec revids.", "apihelp-query+revisions-paraminfo-singlepageonly": "Utilisable uniquement avec une seule page (mode #2).", - "apihelp-query+revisions-param-startid": "À quel ID de révision démarrer l’énumération.", - "apihelp-query+revisions-param-endid": "Arrêter l’énumération des révisions à cet ID.", + "apihelp-query+revisions-param-startid": "Commencer l'énumération à partir de la date de cette revue. La revue doit exister, mais ne concerne pas forcément cette page.", + "apihelp-query+revisions-param-endid": "Arrêter l’énumération à la date de cette revue. La revue doit exister mais ne concerne pas forcément cette page.", "apihelp-query+revisions-param-start": "À quel horodatage de révision démarrer l’énumération.", "apihelp-query+revisions-param-end": "Énumérer jusqu’à cet horodatage.", "apihelp-query+revisions-param-user": "Inclure uniquement les révisions faites par l’utilisateur.", @@ -1620,6 +1621,7 @@ "apierror-revdel-mutuallyexclusive": "Le même champ ne peut pas être utilisé à la fois en hide et show.", "apierror-revdel-needtarget": "Un titre cible est nécessaire pour ce type RevDel.", "apierror-revdel-paramneeded": "Au moins une valeur est nécessaire pour hide ou show.", + "apierror-revisions-badid": "Pas de correction trouvée pour le paramètre $1.", "apierror-revisions-norevids": "Le paramètre revids ne peut pas être utilisé avec les options de liste ($1limit, $1startid, $1endid, $1dir=newer, $1user, $1excludeuser, $1start, et $1end).", "apierror-revisions-singlepage": "titles, pageids ou un générateur a été utilisé pour fournir plusieurs pages, mais les paramètres $1limit, $1startid, $1endid, $1dir=newer, $1user, $1excludeuser, $1start et $1end ne peuvent être utilisés que sur une seule page.", "apierror-revwrongpage": "r$1 n'est pas une révision de $2.", diff --git a/includes/api/i18n/he.json b/includes/api/i18n/he.json index a948c850c5..cc16214adb 100644 --- a/includes/api/i18n/he.json +++ b/includes/api/i18n/he.json @@ -332,6 +332,7 @@ "apihelp-parse-paramvalue-prop-limitreporthtml": "נותן את גרסת ה־HTML של דו\"ח ההגבלות. לא נותן שום נתונים כאשר מוגדר $1disablelimitreport.", "apihelp-parse-paramvalue-prop-parsetree": "עץ פענוח XML של תוכן הגרסה (דורש מודל תוכן $1)", "apihelp-parse-paramvalue-prop-parsewarnings": "נותן אזהרות שאירעו בזמן פענוח התוכן.", + "apihelp-parse-param-wrapoutputclass": "מחלקה של CSS שתשמש לעטיפת פלט המפענח.", "apihelp-parse-param-pst": "לעשות התמרה לפני שמירה על הקלט לפני פענוחו. תקין רק בשימוש עם טקסט.", "apihelp-parse-param-onlypst": "לעשות התמרה לפני שמירה (pre-save transform‏, PST) על הקלט, אבל לא לפענח אותו. מחזיר את אותו קוד הוויקי אחרי החלת PST. תקף רק בשימוש עם $1text.", "apihelp-parse-param-effectivelanglinks": "כולל קישור שפה שמספקות הרחבות (לשימוש עם $1prop=langlinks).", @@ -985,8 +986,8 @@ "apihelp-query+redirects-example-generator": "קבלת מידע על כל ההפניות ל־[[Main Page]].", "apihelp-query+revisions-description": "קבלת מידע על גרסה.\n\nיכול לשמש במספר דרכים:\n# קבלת נתונים על ערכת דפים (גרסה אחרונה), באמצעות כותרות או מזהי דף.\n# קבלת גרסאות עבור דף נתון אחד, באמצעות שימוש בכותרות או במזהי דף עם start‏, end או limit.\n# קבלת נתונים על ערכת גרסאות באמצעות הגדרת המזהים שלהם עם revid־ים.", "apihelp-query+revisions-paraminfo-singlepageonly": "יכול לשמש רק עם דף בודד (mode #2).", - "apihelp-query+revisions-param-startid": "מאיזה מזהה גרסה להתחיל למנות.", - "apihelp-query+revisions-param-endid": "באיזה מזהה גרסה להפסיק את מניית הגרסאות.", + "apihelp-query+revisions-param-startid": "להתחיל למנות מחותם הזמן של הגרסה הזאת. הגרסה צריכה להיות קיימת, אבל לא חייבת להיות שייכת לדף הזה.", + "apihelp-query+revisions-param-endid": "להפסיק למנות מחותם הזמן של הגרסה הזאת. הגרסה צריכה להיות קיימת, אבל לא חייבת להיות שייכת לדף הזה.", "apihelp-query+revisions-param-start": "מאיזה חותם־זמן של גרסה להתחיל למנות.", "apihelp-query+revisions-param-end": "למנות עד חותם־הזמן הזה.", "apihelp-query+revisions-param-user": "לכלול רק גרסאות מאת משתמש.", @@ -1607,6 +1608,7 @@ "apierror-revdel-mutuallyexclusive": "אותו השדה אינו יכול לשמש עם hide ועם show.", "apierror-revdel-needtarget": "כותרת יעד נחוצה בשביל סוג ה־RevDel הזה.", "apierror-revdel-paramneeded": "לפחות ערך אחד נחוץ בשביל hide או show.", + "apierror-revisions-badid": "לא נמצאה גרסה לפרמטר $1.", "apierror-revisions-norevids": "הפרמטר revids אינו יכול לשמש עם אפשרויות הרשימה ($1limit‏, $1startid‏, $1endid‏, $1dir=newer‏, $1user‏, $1excludeuser‏, $1start, ו־$1end).", "apierror-revisions-singlepage": "titles‏, pageids או מחולל שימשו לאספקת דפים מרובים, אבל הפרמטרים $1limit‏, $1startid‏, $1endid‏, $1dir=newer‏, $1user‏, $1excludeuser‏, $1start, ו־$1end יכולים לשמש רק בדף בודד.", "apierror-revwrongpage": "הגרסה $1 אינה גרסה של $2.", diff --git a/includes/api/i18n/hu.json b/includes/api/i18n/hu.json index 232386e3d2..160bfa7ee4 100644 --- a/includes/api/i18n/hu.json +++ b/includes/api/i18n/hu.json @@ -10,52 +10,246 @@ "Dj" ] }, + "apihelp-main-description": "
\n* [[mw:Special:MyLanguage/API:Main_page|Dokumentáció]]\n* [[mw:Special:MyLanguage/API:FAQ|GYIK]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Levelezőlista]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-bejelentések]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Hibabejelentések és kérések]\n
\nStátusz: Minden ezen a lapon látható funkciónak működnie kell, de az API jelenleg is aktív fejlesztés alatt áll, és bármikor változhat. Iratkozz fel a [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce levelezőlistára] a frissítések követéséhez.\n\nHibás kérések: Ha az API hibás kérést kap, egy HTTP-fejlécet küld vissza „MediaWiki-API-Error” kulccsal, és a fejléc értéke és a visszaküldött hibakód ugyanarra az értékre lesz állítva. További információért lásd: [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Hibák és figyelmeztetések]].\n\nTesztelés: Az API-kérések könnyebb teszteléséhez használható az [[Special:ApiSandbox|API-homokozó]].", "apihelp-main-param-action": "Milyen műveletet hajtson végre.", "apihelp-main-param-format": "A kimenet formátuma.", + "apihelp-main-param-smaxage": "Az s-maxage gyorsítótár-vezérlő HTTP-fejléc beállítása ennyi másodpercre. A hibák soha nincsenek gyorsítótárazva.", + "apihelp-main-param-maxage": "Az maxage gyorsítótár-vezérlő HTTP-fejléc beállítása ennyi másodpercre. A hibák soha nincsenek gyorsítótárazva.", + "apihelp-main-param-assert": "Annak ellenőrzése, hogy a felhasználó be van-e jelentkezve user érték esetén, vagy botjog ellenőrzése bot érték esetén.", + "apihelp-main-param-assertuser": "Annak ellenőrzése, hogy a jelenlegi felhasználó a megadott-e.", "apihelp-main-param-requestid": "Az itt megadott bármilyen érték szerepelni fog a válaszban. Több kérés megkülönböztetésére használható.", "apihelp-main-param-servedby": "Tartalmazza a válasz kérést kiszolgáló gép nevét.", "apihelp-main-param-curtimestamp": "Tartalmazza a válasz az aktuális időbélyeget.", + "apihelp-main-param-responselanginfo": "A válasz tartalmazza uselang és errorlang paraméterekben használt nyelveket.", + "apihelp-main-param-uselang": "Az üzenetfordításokhoz használandó nyelv. A [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] a siprop=languages paraméterrel visszaadja a lehetséges nyelvkódok listáját, vagy user az aktuális felhasználó, illetve content a wiki nyelvbeállításához.", + "apihelp-main-param-errorformat": "A figyelmeztetések és hibaüzenetek formátuma.\n; plaintext: Wikiszöveg eltávolított HTML-címkékkel és a HTML-entitások (pl. &amp;) kicserélésével.\n; wikitext: Feldolgozatlan wikiszöveg.\n; html: HTML.\n; raw: Az üzenet azonosítója és paraméterei.\n; none: Szöveges kimenet mellőzése, csak hibakódok.\n; bc: A MediaWiki 1.29 előtti formátum. A errorlang és erroruselocal paraméterek figyelmen kívül lesznek hagyva.", + "apihelp-main-param-errorlang": "A figyelmeztetésekhez és hibaüzenetekhez használandó nyelv. A [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] a siprop=languages paraméterrel visszaadja a lehetséges nyelvkódok listáját, vagy content a wiki nyelvbeállításához, illetve uselang a uselang paraméter értékéhez.", + "apihelp-main-param-errorsuselocal": "Ha meg van adva, a hibaüzenetek a helyileg testreszabott üzeneteket fogják használni a {{ns:MediaWiki}} névtérből.", "apihelp-block-description": "Szerkesztő blokkolása", - "apihelp-block-param-user": "Blokkolandó felhasználónév, IP-cím vagy IP-címtartomány.", + "apihelp-block-param-user": "Blokkolandó felhasználónév, IP-cím vagy IP-címtartomány. Nem használható együtt a $1userid paraméterrel.", + "apihelp-block-param-userid": "A blokkolandó felhasználó numerikus azonosítója. Nem használható a $1user paraméterrel együtt.", "apihelp-block-param-expiry": "Lejárat ideje. Lehet relatív (pl. 5 months, 2 weeks) vagy abszolút (pl. 2014-09-18T12:34:56Z). Ha infinite-re, indefinite-re vagy never-re állítod, a blokk soha nem fog lejárni.", "apihelp-block-param-reason": "Blokkolás oka.", + "apihelp-block-param-anononly": "Csak anonim felhasználók blokkolása (anonim szerkesztések megakadályozása erről az IP-címről).", "apihelp-block-param-nocreate": "Új regisztráció megakadályozása", + "apihelp-block-param-autoblock": "Az utoljára használt IP-cím blokkolása, valamint bármilyen további IP-cím, amiről a felhasználó megpróbál bejelentkezni.", + "apihelp-block-param-noemail": "A wiki e-mail-küldő rendszerének letiltása a felhasználó számára (blockemail jogosultság szükséges hozzá).", + "apihelp-block-param-hidename": "A felhasználónév elrejtése a blokknaplóból (hideuser jog szükséges hozzá).", + "apihelp-block-param-allowusertalk": "A felhasználó szerkeszthesse a saját vitalapját (a [[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]] beállítástól függ).", + "apihelp-block-param-reblock": "Jelenlegi blokk felülírása, ha a felhasználó már blokkolva van.", "apihelp-block-param-watchuser": "A szerkesztő vagy IP-cím szerkesztői- és vitalapjának figyelése.", + "apihelp-block-example-ip-simple": "A 192.0.2.5 IP-cím blokkolása három napra First strike indoklással.", + "apihelp-block-example-user-complex": "Vandal blokkolása határozatlan időre Vandalism indoklással, új fiók létrehozásának és e-mail küldésének megakadályozása.", + "apihelp-checktoken-description": "Egy [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] kéréssel szerzett token érvényességének vizsgálata.", + "apihelp-checktoken-param-type": "A tesztelendő token típusa.", + "apihelp-checktoken-param-token": "A tesztelendő token.", + "apihelp-checktoken-param-maxtokenage": "A token megengedett legnagyobb kora másodpercekben.", + "apihelp-checktoken-example-simple": "Egy csrf token érvényességének vizsgálata.", + "apihelp-clearhasmsg-description": "A hasmsg jelzés törlése az aktuális felhasználónak.", + "apihelp-clearhasmsg-example-1": "A hasmsg jelzés törlése az aktuális felhasználónak.", + "apihelp-clientlogin-example-login": "A bejelentkezési folyamat elkezdése Example felhasználónévvel és ExamplePassword jelszóval.", + "apihelp-clientlogin-example-login2": "A bejelentkezés folytatása UI válasz után a kétlépcsős azonosításra, az OATHToken paraméternek 987654 értéket megadva.", + "apihelp-compare-description": "Két lap közötti különbség kiszámítása.\n\nMindkét laphoz kötelező megadni egy lapváltozat-azonosítót, címet vagy lapazonosítót.", + "apihelp-compare-param-fromtitle": "Az első összehasonlítandó lap címe.", + "apihelp-compare-param-fromid": "Az első összehasonlítandó lap lapazonosítója.", + "apihelp-compare-param-fromrev": "Az első összehasonlítandó lapváltozat azonosítója.", + "apihelp-compare-param-totitle": "A második összehasonlítandó lap címe.", + "apihelp-compare-param-toid": "A második összehasonlítandó lap lapazonosítója.", + "apihelp-compare-param-torev": "A második összehasonlítandó lapváltozat azonosítója.", + "apihelp-compare-example-1": "Az 1-es és 2-es lapváltozat összehasonlítása.", + "apihelp-createaccount-description": "Új felhasználói fiók létrehozása.", + "apihelp-createaccount-example-create": "Example felhasználói fiók létrehozásának elkezdése ExamplePassword jelszóval.", "apihelp-createaccount-param-name": "Felhasználónév.", + "apihelp-createaccount-param-password": "Jelszó (figyelmen kívül hagyva, ha a $1mailpassword be van állítva).", + "apihelp-createaccount-param-domain": "Tartomány külső hitelesítéshez (opcionális).", + "apihelp-createaccount-param-token": "Felhasználólétrehozási token az első kérésből", "apihelp-createaccount-param-email": "A szerkesztő e-mail-címe (nem kötelező).", "apihelp-createaccount-param-realname": "A szerkesztő valódi neve (nem kötelező).", + "apihelp-createaccount-param-mailpassword": "Ha bármilyen értéket kap, egy véletlenszerű jelszót kap a felhasználó e-mailben.", + "apihelp-createaccount-param-reason": "Opcionális indoklás a fióklétrehozáshoz a naplókba.", + "apihelp-createaccount-param-language": "A felhasználó alapértelmezett nyelvkódja (opcionális, alapértelmezetten a tartalom nyelve).", + "apihelp-createaccount-example-pass": "testuser felhasználó létrehozása test123 jelszóval.", + "apihelp-createaccount-example-mail": "testmailuser felhasználó létrehozása, véletlenszerű jelszó elküldése e-mailben.", "apihelp-delete-description": "Lap törlése.", + "apihelp-delete-param-title": "A törlendő lap címe. Nem használható együtt a $1pageid paraméterrel.", + "apihelp-delete-param-pageid": "A törlendő lap lapazonosítója. Nem használható együtt a $1title paraméterrel.", + "apihelp-delete-param-reason": "A törlés indoka. Ha nincs beállítva, automatikusan generált indoklás helyettesíti.", + "apihelp-delete-param-watch": "A lap hozzáadása a felhasználó figyelőlistájához.", + "apihelp-delete-param-watchlist": "A lap hozzáadása a figyelőlistához vagy eltávolítása onnan feltétel nélkül, a beállítások használata vagy a figyelőlista érintetlenül hagyása.", "apihelp-delete-param-unwatch": "A lap törlése a szerkesztő figyelőlistájáról.", + "apihelp-delete-param-oldimage": "A törlendő régi kép neve az [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]] által adott formátumban.", "apihelp-delete-example-simple": "Main Page törlése.", + "apihelp-delete-example-reason": "Main Page törlése Preparing for move indoklással.", "apihelp-disabled-description": "Ez a modul le lett tiltva.", "apihelp-edit-description": "Lapok létrehozása és szerkesztése.", + "apihelp-edit-param-title": "A szerkesztendő lap címe. Nem használható együtt a $1pageid paraméterrel.", + "apihelp-edit-param-pageid": "A szerkesztendő lap lapazonosítója. Nem használható együtt a $1title paraméterrel.", + "apihelp-edit-param-section": "A szerkesztendő szakasz száma. 0 a bevezetőhöz, new új szakaszhoz.", "apihelp-edit-param-sectiontitle": "Az új szakasz címe.", + "apihelp-edit-param-text": "A lap tartalma.", + "apihelp-edit-param-summary": "Szerkesztési összefoglaló. A szakasz címe is, ha $1section=new és a $1sectiontitle paraméter nincs beállítva.", "apihelp-edit-param-minor": "Apró változtatás.", + "apihelp-edit-param-notminor": "Nem apró változtatás.", "apihelp-edit-param-bot": "Szerkesztés megjelölése botszerkesztésként.", + "apihelp-edit-param-basetimestamp": "Az alapváltozat időbélyege, a szerkesztési ütközések felismerésére szolgál. Az [[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]] kéréssel szerezhető meg.", + "apihelp-edit-param-starttimestamp": "A szerkesztési folyamat kezdetének időbélyege, a szerkesztési ütközések felismerésére szolgál. Egy megfelelő érték lekérhető a [[Special:ApiHelp/main|curtimestamp]] paraméterrel a folyamat kezdetén (pl. a szerkesztendő lap tartalmának letöltésekor).", + "apihelp-edit-param-recreate": "Bármilyen hiba felülírása arról, hogy a lapot a szerkesztés közben törölték.", "apihelp-edit-param-createonly": "Ne szerkeszd a lapot, ha már létezik.", + "apihelp-edit-param-watch": "A lap hozzáadása a felhasználó figyelőlistájához.", + "apihelp-edit-param-unwatch": "A lap törlése a szerkesztő figyelőlistájáról.", + "apihelp-edit-param-watchlist": "A lap hozzáadása a figyelőlistához vagy eltávolítása onnan feltétel nélkül, a beállítások használata vagy a figyelőlista érintetlenül hagyása.", + "apihelp-edit-param-prependtext": "Ezen szöveg hozzáadása a lap elejére. Felülírja a $1text paramétert.", + "apihelp-edit-param-appendtext": "Ezen szöveg hozzáadása a lap végére. Felülírja a $1text paramétert.\n\nHasználd a $1section=new paramétert új szakasz hozzáadásához ezen paraméter helyett.", + "apihelp-edit-param-undo": "Ezen változat visszavonása. Felülírja a $1text, $1prependtext és $1appendtext paramétereket.", + "apihelp-edit-param-undoafter": "Minden változtatás visszavonása az $1undo paraméterben szereplőtől eddig. Ha nincs megadva, csak egy változtatás visszavonása.", + "apihelp-edit-param-redirect": "Átirányítások automatikus feloldása.", + "apihelp-edit-param-contentmodel": "Az új tartalom tartalommodellje.", + "apihelp-edit-param-token": "A tokennek mindig az utolsó paraméternek, vagy legalább a $1text után kell lennie.", "apihelp-edit-example-edit": "Lap szerkesztése", + "apihelp-edit-example-prepend": "__NOTOC__ hozzáadása a lap elejére.", + "apihelp-edit-example-undo": "Az 13579–13585. változatok visszavonása automatikus szerkesztési összefoglalóval.", "apihelp-emailuser-description": "E-mail küldése", + "apihelp-emailuser-param-target": "Az e-mail címzettje.", + "apihelp-emailuser-param-subject": "A levél tárgya.", "apihelp-emailuser-param-text": "Szövegtörzs.", "apihelp-emailuser-param-ccme": "Másolat küldése magamnak.", + "apihelp-emailuser-example-email": "E-mail küldése WikiSysop felhasználónak Content szöveggel.", + "apihelp-expandtemplates-description": "Minden sablon kibontása a wikiszövegben.", "apihelp-expandtemplates-param-title": "Lap címe.", + "apihelp-expandtemplates-param-text": "Az átalakítandó wikiszöveg.", + "apihelp-expandtemplates-param-revid": "Változatazonosító a {{REVISIONID}} és hasonló változók kibontásához.", + "apihelp-expandtemplates-param-prop": "A lekérendő információk.\n\nHa nincs megadva érték, a válasz tartalmazni fogja a wikiszöveget, de a kimenet elavult formátumú lesz.", + "apihelp-expandtemplates-paramvalue-prop-wikitext": "A kibontott wikiszöveg.", + "apihelp-expandtemplates-paramvalue-prop-categories": "Bármilyen, a bemenetben szereplő kategória, ami nem jelenik meg a wikiszöveges kimenetben.", + "apihelp-expandtemplates-paramvalue-prop-properties": "A wikiszövegben kibontott varázsszavak által meghatározott laptulajdonságok.", + "apihelp-expandtemplates-paramvalue-prop-ttl": "Maximális idő, ami után az eredmény gyorsítótárazása érvénytelenítendő.", + "apihelp-expandtemplates-paramvalue-prop-jsconfigvars": "A lapra vonatkozó JavaScript-változók.", + "apihelp-expandtemplates-param-includecomments": "A HTML-megjegyzések szerepeljenek-e a kimenetben.", + "apihelp-expandtemplates-example-simple": "A {{Project:Sandbox}} wikiszöveg kibontása.", + "apihelp-feedcontributions-description": "Egy felhasználó közreműködéseinek lekérése hírcsatornaként.", + "apihelp-feedcontributions-param-feedformat": "A hírcsatorna formátuma.", + "apihelp-feedcontributions-param-user": "A lekérendő felhasználók.", + "apihelp-feedcontributions-param-namespace": "A közreműködések szűrése ezen névtérre.", + "apihelp-feedcontributions-param-year": "Közreműködések lekérése eddig az évig.", + "apihelp-feedcontributions-param-month": "Közreműködések lekérése ennek a hónapnak a végéig.", + "apihelp-feedcontributions-param-tagfilter": "A közreműködések szűrése az ezen címkével ellátottakra.", + "apihelp-feedcontributions-param-deletedonly": "Csak a törölt szerkesztések lekérése.", + "apihelp-feedcontributions-param-toponly": "Csak a jelenleg utolsónak számító változtatások lekérése.", + "apihelp-feedcontributions-param-newonly": "Csak az új oldalt létrehozó szerkesztések lekérése.", + "apihelp-feedcontributions-param-hideminor": "Apró szerkesztések kihagyása.", + "apihelp-feedcontributions-param-showsizediff": "A változatok közötti méretkülönbség lekérése.", + "apihelp-feedcontributions-example-simple": "Example felhasználó közreműködéseinek lekérése.", + "apihelp-feedrecentchanges-description": "A friss változtatások lekérése hírcsatornaként.", + "apihelp-feedrecentchanges-param-feedformat": "A hírcsatorna formátuma.", + "apihelp-feedrecentchanges-param-namespace": "Az eredmények szűrése erre a névtérre.", + "apihelp-feedrecentchanges-param-invert": "Minden névtér a kiválasztott kivételével.", + "apihelp-feedrecentchanges-param-associated": "A kapcsolódó (vita- vagy tartalmi) névtér befoglalása.", + "apihelp-feedrecentchanges-param-days": "Az eredmények szűrése az elmúlt ennyi napra.", + "apihelp-feedrecentchanges-param-limit": "Találatok maximális száma.", + "apihelp-feedrecentchanges-param-from": "Szerkesztések megjelenítése ekkortól.", "apihelp-feedrecentchanges-param-hideminor": "Apró változtatások elrejtése.", "apihelp-feedrecentchanges-param-hidebots": "Botszerkesztések elrejtése.", + "apihelp-feedrecentchanges-param-hideanons": "Anonim felhasználók szerkesztéseinek elrejtése.", + "apihelp-feedrecentchanges-param-hideliu": "Bejelentkezett felhasználók szerkesztéseinek elrejtése.", "apihelp-feedrecentchanges-param-hidepatrolled": "Ellenőrzött változtatások elrejtése.", + "apihelp-feedrecentchanges-param-hidemyself": "A jelenlegi felhasználó szerkesztéseinek elrejtése.", + "apihelp-feedrecentchanges-param-hidecategorization": "Kategóriaváltoztatások elrejtése.", + "apihelp-feedrecentchanges-param-tagfilter": "Szűrés címke szerint.", + "apihelp-feedrecentchanges-param-target": "Csak a megadott lapról hivatkozott lapok szerkesztéseinek megjelenítése.", + "apihelp-feedrecentchanges-param-showlinkedto": "Inkább a megadott lap''ra'' hivatkozó lapok szerkesztéseinek megjelenítése.", + "apihelp-feedrecentchanges-param-categories": "Csak a megadott kategóriák mindegyikében szereplő lapok szerkesztéseinek megjelenítése.", + "apihelp-feedrecentchanges-param-categories_any": "Inkább a megadott kategóriák bármelyikében szereplő lapok szerkesztéseinek megjelenítése.", + "apihelp-feedrecentchanges-example-simple": "Friss változtatások megjelenítése.", + "apihelp-feedrecentchanges-example-30days": "Az elmúlt 30 nap friss változtatásainak megjelenítése.", + "apihelp-feedwatchlist-description": "A figyelőlista lekérése hírcsatornaként.", + "apihelp-feedwatchlist-param-feedformat": "A hírcsatorna formátuma.", + "apihelp-feedwatchlist-param-hours": "Az utóbbi ennyi órában szerkesztett lapok listázása.", + "apihelp-feedwatchlist-param-linktosections": "Hivatkozás közvetlenül a módosított szakaszra, ha lehetséges.", + "apihelp-feedwatchlist-example-default": "A figyelőlista-hírcsatorna megjelenítése.", + "apihelp-feedwatchlist-example-all6hrs": "A figyelt lapok összes változtatásának megjelenítése az elmúlt 6 órában.", + "apihelp-filerevert-description": "Egy fájl visszaállítása egy régebbi verzióra.", + "apihelp-filerevert-param-filename": "Célfájlnév, {{ns:6}}: (File:) előtag nélkül", + "apihelp-filerevert-param-comment": "Feltöltési összefoglaló.", + "apihelp-filerevert-param-archivename": "A visszaállítandó változat archív neve.", + "apihelp-filerevert-example-revert": "Wiki.png visszaállítása a 2011-03-05T15:27:40Z-kori változatra.", + "apihelp-help-description": "Súgó megjelenítése a megadott modulokhoz.", + "apihelp-help-param-submodules": "Súgó megjelenítése a megadott modul almoduljaihoz is.", + "apihelp-help-param-recursivesubmodules": "Súgó megjelenítése az almodulokhoz rekurzívan.", + "apihelp-help-param-helpformat": "A súgó kimeneti formátuma.", + "apihelp-help-param-wrap": "Az eredmény visszaadása a szabványos API-válaszstruktúrában.", + "apihelp-help-param-toc": "A HTML-kimenet tartalmazzon egy tartalomjegyzéket.", + "apihelp-help-example-main": "Súgó megjelenítése a fő modulhoz.", + "apihelp-help-example-submodules": "Súgó az action=query modulhoz és összes almoduljához.", + "apihelp-help-example-recursive": "Minden súgó egy lapon.", + "apihelp-help-example-help": "Súgó magához a súgó modulhoz.", + "apihelp-help-example-query": "Súgó két lekérdező almodulhoz.", + "apihelp-imagerotate-description": "Egy vagy több kép elforgatása.", + "apihelp-imagerotate-param-rotation": "A kép forgatása ennyi fokkal az óramutató járásával megegyező irányban.", + "apihelp-imagerotate-example-simple": "Example.png elforgatása 90 fokkal.", + "apihelp-imagerotate-example-generator": "Az összes kép elforgatása a Category:Flip kategóriában 180 fokkal.", + "apihelp-import-description": "Egy lap importálása egy másik wikiből vagy XML-fájlból.\n\nA HTTP POST-kérést fájlfeltöltésként kell elküldeni (multipart/form-data használatával) a xml paraméter használatakor.", + "apihelp-import-param-xml": "Feltöltött XML-fájl.", + "apihelp-import-param-interwikisource": "Wikiközi importálásnál: forráswiki.", + "apihelp-import-param-interwikipage": "Wikiközi importálásnál: az importálandó lap.", + "apihelp-import-param-fullhistory": "Wikiközi importálásnál: teljes laptörténet importálása, nem csak az aktuális változat.", + "apihelp-import-param-templates": "Wikiközi importálásnál: importálás a lapon használt sablonokkal együtt.", + "apihelp-import-param-namespace": "Importálás ebbe a névtérbe. Nem használható együtt a $1rootpage paraméterrel.", + "apihelp-import-param-rootpage": "Importálás ennek a lapnak az allapjaként. Nem használható együtt a $1namespace paraméterrel.", + "apihelp-import-example-import": "[[meta:Help:ParserFunctions]] importálása a 100-as névtérbe teljes laptörténettel.", + "apihelp-linkaccount-description": "Egy harmadik fél szolgáltató fiókjának kapcsolása a jelenlegi felhasználóhoz.", + "apihelp-linkaccount-example-link": "Összekapcsolás elkezdése Example szolgáltató fiókjával.", + "apihelp-login-description": "Bejelentkezés és hitelesítő sütik lekérése.\n\nEz a művelet csak [[Special:BotPasswords|botjelszavakkal]] használandó; a fő fiókkal való használat elavult és figyelmeztetés nélkül sikertelen lehet. A fő fiókkal való biztonságos bejelentkezéshez használd az [[Special:ApiHelp/clientlogin|action=clientlogin]] paramétert.", + "apihelp-login-description-nobotpasswords": "Bejelentkezés és hitelesítő sütik lekérése.\n\nEz a művelet elavult és figyelmeztetés nélkül sikertelen lehet. A biztonságos bejelentkezéshez használd az [[Special:ApiHelp/clientlogin|action=clientlogin]] paramétert.", "apihelp-login-param-name": "Szerkesztőnév.", "apihelp-login-param-password": "Jelszó.", "apihelp-login-param-domain": "Tartomány (opcionális)", + "apihelp-login-param-token": "Az első kérésben megszerzett bejelentkezési token.", + "apihelp-login-example-gettoken": "Egy bejelentkezés token lekérése.", "apihelp-login-example-login": "Bejelentkezés.", + "apihelp-logout-description": "Kijelentkezés és munkamenetadatok törlése.", "apihelp-logout-example-logout": "Aktuális felhasználó kijelentkeztetése.", + "apihelp-managetags-description": "A változtatáscímkék kezelése.", + "apihelp-managetags-param-operation": "A végrehajtandó feladat:\n;create: Új változtatáscímke létrehozása kézi használatra.\n;delete: Egy változtatáscímke eltávolítása az adatbázisból, beleértve az eltávolítását minden lapváltozatról, frissváltoztatások-bejegyzésről és naplóbejegyzésről, ahol használatban van.\n;activate: Egy változtatáscímke aktiválása, lehetővé téve a felhasználóknak a kézi használatát.\n;deactivate: Egy változtatáscímke deaktiválása, a felhasználók megakadályozása a kézi használatban.", + "apihelp-managetags-param-tag": "A létrehozandó, törlendő, aktiválandó vagy deaktiválandó címke. Létrehozás esetén adott nevű címke nem létezhet. Törlés esetén a címkének léteznie kell. Aktiválás esetén a címkének léteznie kell, és nem használhatja más kiterjesztés. Deaktiválás esetén a címkének aktívnak és kézzel definiáltnak kell lennie.", + "apihelp-managetags-param-reason": "Opcionális indoklás a címke létrehozásához, törléséhez, aktiválásához vagy deaktiválásához.", + "apihelp-managetags-param-ignorewarnings": "Figyelmeztetések figyelmen kívül hagyása a művelet közben.", + "apihelp-managetags-example-create": "spam címke létrehozása For use in edit patrolling indoklással", + "apihelp-managetags-example-delete": "vandlaism címke törlése Misspelt indoklással", + "apihelp-managetags-example-activate": "spam címke aktiválása For use in edit patrolling indoklással", + "apihelp-managetags-example-deactivate": "spam címke deaktiválása No longer required indoklással", "apihelp-mergehistory-description": "Laptörténetek egyesítése", "apihelp-mergehistory-param-reason": "Laptörténet egyesítésének oka.", "apihelp-move-description": "Egy lap átnevezése.", + "apihelp-move-param-from": "Az átnevezendő lap címe. Nem használható együtt a $1fromid paraméterrel.", + "apihelp-move-param-fromid": "Az átnevezendő lap lapazonosítója. Nem használható együtt a $1from paraméterrel.", + "apihelp-move-param-to": "A lap új címe.", "apihelp-move-param-reason": "Az átnevezés oka.", "apihelp-move-param-movetalk": "Nevezd át a vitalapot is, ha létezik.", "apihelp-move-param-movesubpages": "Nevezd át az allapokat is, ha lehetséges.", "apihelp-move-param-noredirect": "Ne készíts átirányítást.", + "apihelp-move-param-watch": "A lap és az átirányítás hozzáadása a jelenlegi felhasználó figyelőlistájához.", + "apihelp-move-param-unwatch": "A lap és az átirányítás eltávolítása a jelenlegi felhasználó figyelőlistájáról.", + "apihelp-move-param-watchlist": "A lap hozzáadása a figyelőlistához vagy eltávolítása onnan feltétel nélkül, a beállítások használata vagy a figyelőlista érintetlenül hagyása.", "apihelp-move-param-ignorewarnings": "Figyelmeztetések figyelmen kívül hagyása.", + "apihelp-move-example-move": "Badtitle átnevezése Goodtitle címre átirányítás készítése nélkül.", + "apihelp-opensearch-description": "Keresés a wikin az OpenSearch protokoll segítségével.", + "apihelp-opensearch-param-search": "A keresőkifejezés.", "apihelp-opensearch-param-limit": "Találatok maximális száma.", + "apihelp-opensearch-param-namespace": "A keresendő névterek.", + "apihelp-opensearch-param-suggest": "Ne csináljon semmit, ha a [[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] hamis.", + "apihelp-opensearch-param-redirects": "Hogyan kezelje az átirányításokat:\n;return: Magának az átirányításnak a visszaadása.\n;resolve: A céllap visszaadása. Lehet, hogy kevesebb mint $1limit találatot ad vissza.\nTörténeti okokból az alapértelmezés „return” $1format=json esetén és „resolve” más formátumoknál.", + "apihelp-opensearch-param-format": "A kimenet formátuma.", + "apihelp-opensearch-example-te": "Te-vel kezdődő lapok keresése.", + "apihelp-options-description": "A jelenlegi felhasználó beállításainak módosítása.\n\nCsak a MediaWiki vagy kiterjesztései által kínált, valamint a userjs- előtagú (felhasználói parancsfájloknak szánt) beállítások állíthatók be.", + "apihelp-options-param-reset": "Beállítások visszaállítása a wiki alapértelmezéseire.", + "apihelp-options-param-resetkinds": "A visszaállítandó beállítások típusa(i) a $1reset paraméter használatakor.", + "apihelp-options-param-change": "Változtatások listája név=érték formátumban (pl. skin=vector). Ha nincs érték megadva (egyenlőségjel sem szerepel – pl. beállítás|másik|…), a beállítások visszaállnak az alapértelmezett értékre. Ha bármilyen érték tartalmaz függőleges vonal karaktert (|), használd az [[Special:ApiHelp/main#main/datatypes|alternatív elválasztókaraktert]] a megfelelő működéshez.", + "apihelp-options-param-optionname": "Az $1optionvalue értékre állítandó beállítás neve.", + "apihelp-options-param-optionvalue": "Az $1optionname beállítás értéke.", "apihelp-options-example-reset": "Minden beállítás visszaállítása", + "apihelp-options-example-change": "A skin és a hideminor beállítások módosítása.", + "apihelp-options-example-complex": "Minden beállítás visszaállítása, majd a skin és a nickname beállítása.", + "apihelp-parse-paramvalue-prop-parsewarnings": "A tartalom feldolgozása közben előforduló hibák visszaadása.", "apihelp-protect-example-protect": "Lap levédése.", "apihelp-query+allcategories-param-dir": "A rendezés iránya.", "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|Mód|Módok}}: $2", @@ -86,7 +280,7 @@ "api-help-param-type-boolean": "Típus: logikai ([[Special:ApiHelp/main#main/datatypes|részletek]])", "api-help-param-type-timestamp": "Típus: {{PLURAL:$1|1=időbélyeg|2=időbélyegek listája}} ([[Special:ApiHelp/main#main/datatypes|engedélyezett formátumok]])", "api-help-param-type-user": "Típus: {{PLURAL:$1|1=felhasználónév|2=felhasználónevek listája}}", - "api-help-param-list": "{{PLURAL:$1|1=A következő értékek egyike|2=Értékek (elválasztó: {{!}})}}: $2", + "api-help-param-list": "{{PLURAL:$1|1=A következő értékek egyike|2=Értékek (elválasztó: {{!}} vagy [[Special:ApiHelp/main#main/datatypes|más]])}}: $2", "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Üresnek kell lennie|Lehet üres vagy $2}}", "api-help-param-limit": "Nem engedélyezett több mint $1.", "api-help-param-limit2": "Nem engedélyezett több mint $1 (botoknak $2).", diff --git a/includes/api/i18n/it.json b/includes/api/i18n/it.json index 22b23f03cf..0cc154fcc5 100644 --- a/includes/api/i18n/it.json +++ b/includes/api/i18n/it.json @@ -506,7 +506,7 @@ "apihelp-query+redirects-param-namespace": "Includi solo le pagine in questi namespace.", "apihelp-query+redirects-param-limit": "Quanti reindirizzamenti restituire.", "apihelp-query+redirects-example-simple": "Ottieni un elenco di redirect a [[Main Page]].", - "apihelp-query+revisions-param-startid": "L'ID versione da cui iniziare l'elenco.", + "apihelp-query+revisions-param-startid": "Inizia l'elenco dal timestamp di questa versione. La versione deve esistere, ma non necessariamente deve appartenere a questa pagina.", "apihelp-query+revisions-param-start": "Il timestamp della versione da cui iniziare l'elenco.", "apihelp-query+revisions-param-tag": "Elenca solo le versioni etichettate con questa etichetta.", "apihelp-query+revisions+base-paramvalue-prop-ids": "L'ID della versione.", diff --git a/includes/api/i18n/qqq.json b/includes/api/i18n/qqq.json index 6e70653463..da0b22d892 100644 --- a/includes/api/i18n/qqq.json +++ b/includes/api/i18n/qqq.json @@ -331,6 +331,7 @@ "apihelp-parse-paramvalue-prop-limitreporthtml": "{{doc-apihelp-paramvalue|parse|prop|limitreporthtml}}", "apihelp-parse-paramvalue-prop-parsetree": "{{doc-apihelp-paramvalue|parse|prop|parsetree|params=* $1 - Value of the constant CONTENT_MODEL_WIKITEXT|paramstart=2}}", "apihelp-parse-paramvalue-prop-parsewarnings": "{{doc-apihelp-paramvalue|parse|prop|parsewarnings}}", + "apihelp-parse-param-wrapoutputclass": "{{doc-apihelp-param|parse|wrapoutputclass}}", "apihelp-parse-param-pst": "{{doc-apihelp-param|parse|pst}}", "apihelp-parse-param-onlypst": "{{doc-apihelp-param|parse|onlypst}}", "apihelp-parse-param-effectivelanglinks": "{{doc-apihelp-param|parse|effectivelanglinks}}", @@ -1612,6 +1613,7 @@ "apierror-revdel-mutuallyexclusive": "{{doc-apierror}}", "apierror-revdel-needtarget": "{{doc-apierror}}", "apierror-revdel-paramneeded": "{{doc-apierror}}", + "apierror-revisions-badid": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter in question, e.g. \"rvstartid\".", "apierror-revisions-norevids": "{{doc-apierror}}\n\nParameters:\n* $1 - Module parameter prefix, e.g. \"bl\".", "apierror-revisions-singlepage": "{{doc-apierror}}\n\nParameters:\n* $1 - Module parameter prefix, e.g. \"bl\".", "apierror-revwrongpage": "{{doc-apierror}}\n\nParameters:\n* $1 - Revision ID number.\n* $2 - Page title.", diff --git a/includes/api/i18n/zh-hans.json b/includes/api/i18n/zh-hans.json index 152f1df264..8c3c652362 100644 --- a/includes/api/i18n/zh-hans.json +++ b/includes/api/i18n/zh-hans.json @@ -340,6 +340,7 @@ "apihelp-parse-paramvalue-prop-limitreporthtml": "提供限制报告的HTML版本。当$1disablelimitreport被设置时不会提供数据。", "apihelp-parse-paramvalue-prop-parsetree": "修订内容的XML解析树(需要内容模型$1)", "apihelp-parse-paramvalue-prop-parsewarnings": "在解析内容时提供发生的警告", + "apihelp-parse-param-wrapoutputclass": "要用于包裹解析输出的CSS类。", "apihelp-parse-param-pst": "在解析输入前,对输入做一次保存前变换处理。仅当使用文本时有效。", "apihelp-parse-param-onlypst": "在输入内容中执行预保存转换(PST),但不解析它。在PST被应用后返回相同的wiki文本。只当与$1text一起使用时有效。", "apihelp-parse-param-effectivelanglinks": "包含由扩展提供的语言链接(用于与$1prop=langlinks一起使用)。", diff --git a/includes/cache/MessageCache.php b/includes/cache/MessageCache.php index 355aff40ed..8f88ee9e10 100644 --- a/includes/cache/MessageCache.php +++ b/includes/cache/MessageCache.php @@ -193,6 +193,7 @@ class MessageCache { $po = ParserOptions::newFromAnon(); $po->setEditSection( false ); $po->setAllowUnsafeRawHtml( false ); + $po->setWrapOutputClass( false ); return $po; } @@ -202,6 +203,11 @@ class MessageCache { // from malicious sources. As a precaution, disable // the parser tag when parsing messages. $this->mParserOptions->setAllowUnsafeRawHtml( false ); + // Wrapping messages in an extra
is probably not expected. If + // they're outside the content area they probably shouldn't be + // targeted by CSS that's targeting the parser output, and if + // they're inside they already are from the outer div. + $this->mParserOptions->setWrapOutputClass( false ); } return $this->mParserOptions; @@ -458,7 +464,11 @@ class MessageCache { protected function loadFromDB( $code, $mode = null ) { global $wgMaxMsgCacheEntrySize, $wgLanguageCode, $wgAdaptiveMessageCache; - $dbr = wfGetDB( ( $mode == self::FOR_UPDATE ) ? DB_MASTER : DB_REPLICA ); + // (T164666) The query here performs really poorly on WMF's + // contributions replicas. We don't have a way to say "any group except + // contributions", so for the moment let's specify 'api'. + // @todo: Get rid of this hack. + $dbr = wfGetDB( ( $mode == self::FOR_UPDATE ) ? DB_MASTER : DB_REPLICA, 'api' ); $cache = []; @@ -509,15 +519,18 @@ class MessageCache { # Conditions to load the remaining pages with their contents $smallConds = $conds; - $smallConds[] = 'page_latest=rev_id'; - $smallConds[] = 'rev_text_id=old_id'; $smallConds[] = 'page_len <= ' . intval( $wgMaxMsgCacheEntrySize ); $res = $dbr->select( [ 'page', 'revision', 'text' ], [ 'page_title', 'old_id', 'old_text', 'old_flags' ], $smallConds, - __METHOD__ . "($code)-small" + __METHOD__ . "($code)-small", + [], + [ + 'revision' => [ 'JOIN', 'page_latest=rev_id' ], + 'text' => [ 'JOIN', 'rev_text_id=old_id' ], + ] ); foreach ( $res as $row ) { diff --git a/includes/changetags/ChangeTags.php b/includes/changetags/ChangeTags.php index 46cae8f011..9bde05651c 100644 --- a/includes/changetags/ChangeTags.php +++ b/includes/changetags/ChangeTags.php @@ -404,8 +404,8 @@ class ChangeTags { } // to be applied, a tag has to be explicitly defined - // @todo Allow extensions to define tags that can be applied by users... $allowedTags = self::listExplicitlyDefinedTags(); + Hooks::run( 'ChangeTagsAllowedAdd', [ &$allowedTags, $tags, $user ] ); $disallowedTags = array_diff( $tags, $allowedTags ); if ( $disallowedTags ) { return self::restrictedTagError( 'tags-apply-not-allowed-one', @@ -660,7 +660,7 @@ class ChangeTags { $tables[] = 'change_tag'; $join_conds['change_tag'] = [ 'INNER JOIN', $join_cond ]; - $conds['ct_tag'] = explode( ',', $filter_tag ); + $conds['ct_tag'] = explode( '|', $filter_tag ); } } @@ -947,9 +947,12 @@ class ChangeTags { return Status::newFatal( 'tags-create-no-name' ); } - // tags cannot contain commas (used as a delimiter in tag_summary table) or - // slashes (would break tag description messages in MediaWiki namespace) - if ( strpos( $tag, ',' ) !== false || strpos( $tag, '/' ) !== false ) { + // tags cannot contain commas (used as a delimiter in tag_summary table), + // pipe (used as a delimiter between multiple tags in + // modifyDisplayQuery), or slashes (would break tag description messages in + // MediaWiki namespace) + if ( strpos( $tag, ',' ) !== false || strpos( $tag, '|' ) !== false + || strpos( $tag, '/' ) !== false ) { return Status::newFatal( 'tags-create-invalid-chars' ); } diff --git a/includes/installer/DatabaseUpdater.php b/includes/installer/DatabaseUpdater.php index a4cb6959f0..e5cbb7ce71 100644 --- a/includes/installer/DatabaseUpdater.php +++ b/includes/installer/DatabaseUpdater.php @@ -926,11 +926,41 @@ abstract class DatabaseUpdater { } elseif ( $this->updateRowExists( $updateKey ) ) { $this->output( "...$field in table $table already modified by patch $patch.\n" ); } else { - $this->insertUpdateRow( $updateKey ); + $apply = $this->applyPatch( $patch, $fullpath, "Modifying $field field of table $table" ); + if ( $apply ) { + $this->insertUpdateRow( $updateKey ); + } + return $apply; + } + return true; + } - return $this->applyPatch( $patch, $fullpath, "Modifying $field field of table $table" ); + /** + * Modify an existing table, similar to modifyField. Intended for changes that + * touch more than one column on a table. + * + * @param string $table Name of the table to modify + * @param string $patch Name of the patch file to apply + * @param string $fullpath Whether to treat $patch path as relative or not, defaults to false + * @return bool False if this was skipped because of schema changes being skipped + */ + public function modifyTable( $table, $patch, $fullpath = false ) { + if ( !$this->doTable( $table ) ) { + return true; } + $updateKey = "$table-$patch"; + if ( !$this->db->tableExists( $table, __METHOD__ ) ) { + $this->output( "...$table table does not exist, skipping modify table patch.\n" ); + } elseif ( $this->updateRowExists( $updateKey ) ) { + $this->output( "...table $table already modified by patch $patch.\n" ); + } else { + $apply = $this->applyPatch( $patch, $fullpath, "Modifying table $table" ); + if ( $apply ) { + $this->insertUpdateRow( $updateKey ); + } + return $apply; + } return true; } diff --git a/includes/installer/MssqlUpdater.php b/includes/installer/MssqlUpdater.php index dfe595e92d..1a9915da66 100644 --- a/includes/installer/MssqlUpdater.php +++ b/includes/installer/MssqlUpdater.php @@ -114,7 +114,9 @@ class MssqlUpdater extends DatabaseUpdater { /** * General schema update for a table that touches more than one field or requires - * destructive actions (such as dropping and recreating the table). + * destructive actions (such as dropping and recreating the table). NOTE: Usage of + * this function is highly discouraged, use it's successor DatabaseUpdater::modifyTable + * instead. * * @param string $table * @param string $updatekey @@ -127,9 +129,11 @@ class MssqlUpdater extends DatabaseUpdater { } elseif ( $this->updateRowExists( $updatekey ) ) { $this->output( "...$table already had schema updated by $patch.\n" ); } else { - $this->insertUpdateRow( $updatekey ); - - return $this->applyPatch( $patch, $fullpath, "Updating schema of table $table" ); + $apply = $this->applyPatch( $patch, $fullpath, "Updating schema of table $table" ); + if ( $apply ) { + $this->insertUpdateRow( $updatekey ); + } + return $apply; } return true; diff --git a/includes/installer/i18n/hi.json b/includes/installer/i18n/hi.json index 98af267443..c12123d39b 100644 --- a/includes/installer/i18n/hi.json +++ b/includes/installer/i18n/hi.json @@ -6,7 +6,8 @@ "Phoenix303", "संजीव कुमार", "Sahilrathod", - "Shyamal" + "Shyamal", + "Sfic" ] }, "config-desc": "साँचा लिए इंस्टॉलर", @@ -18,15 +19,15 @@ "config-localsettings-badkey": "आपकी दी गई कुंजी ग़लत है।", "config-your-language": "आपकी भाषा:", "config-your-language-help": "स्थापन के लिए भाषा चुनें", - "config-wiki-language": "विकी भाषा:", + "config-wiki-language": "विकि भाषा:", "config-wiki-language-help": "भाषा चुनें जिस में अधिकतर लेख लिखा जाएगा", "config-back": "← वापस", "config-continue": "आगे बढ़ें →", "config-page-language": "भाषा", - "config-page-welcome": "मीडियाविकी पर आपका स्वागत है!", - "config-page-dbconnect": "डेटाबेस से जुड़ें", + "config-page-welcome": "मीडियाविकि में आपका स्वागत है!", + "config-page-dbconnect": "डेटाबेस से जोड़ें", "config-page-upgrade": "मौजूदा स्थापना का नवीनीकरण", - "config-page-dbsettings": "डेटाबेस वरियतायें", + "config-page-dbsettings": "डेटाबेस सेटिंग (पसंद)", "config-page-name": "नाम", "config-page-options": "विकल्प", "config-page-install": "स्थापित करें", @@ -39,8 +40,28 @@ "config-page-existingwiki": "मौजूदा विकि", "config-restart": "हाँ, इसे पुनः आरंभ करें", "config-env-php": "PHP $1 स्थापित किया गया है।", + "config-env-hhvm": "एचएचवीएम $1 स्थापित किया गया है।", + "config-memory-raised": "पीएचपी की memory_limit सीमा $1 है, जो $2 तक बढ़ गई है।", + "config-xcache": "[http://xcache.lighttpd.net/ एक्सकैश] स्थापित है।", + "config-apc": "[http://www.php.net/apc एपीसी] स्थापित है।", + "config-apcu": "[http://www.php.net/apcu एपीसीयू] स्थापित है।", + "config-wincache": "[http://www.iis.net/download/WinCacheForPhp विनकैश] स्थापित है।", + "config-db-type": "डेटाबेस प्रकार:", + "config-db-host": "डेटाबेस होस्ट:", + "config-db-host-oracle": "डेटाबेस टीएनएस:", "config-db-wiki-settings": "इस विकि को पहचानें", - "config-db-install-account": "इंस्टालेशन के लिए उपयोगकर्ता खाता", + "config-db-name": "डेटाबेस का नाम:", + "config-db-install-account": "इसे स्थापित करने हेतु सदस्य खाता", + "config-db-username": "डेटाबेस सदस्यनाम:", + "config-db-password": "डेटाबेस पासवर्ड:", + "config-db-port": "डेटाबेस पोर्ट:", + "config-type-mssql": "माइक्रोसॉफ़्ट एसक्यूएल सर्वर", + "config-invalid-db-type": "अमान्य डेटाबेस प्रकार", + "config-regenerate": "LocalSettings.php फिर से निर्मित करें →", + "config-db-web-account": "वेब पहुँच हेतु डेटाबेस खाता", + "config-mysql-innodb": "इनोडीबी", + "config-mysql-binary": "बाइनरी", + "config-mysql-utf8": "UTF-8", "config-mssql-auth": "प्रमाणन प्रकार:", "config-mssql-sqlauth": "SQL सर्वर प्रमाणन", "config-site-name": "विकि का नाम:", @@ -53,6 +74,7 @@ "config-admin-name": "आपका उपयोगकर्ता नाम:", "config-admin-password": "कूटशब्द:", "config-admin-password-confirm": "फिर से कूटशब्द:", + "config-admin-name-blank": "प्रबन्धक का सदस्य नाम लिखें।", "config-admin-email": "ईमेल पता:", "config-optional-continue": "मुझसे और सवाल पूछें।", "config-optional-skip": "मैं पहले से ही ऊब चुका हूँ, बस विकि स्थापित करें।", @@ -61,10 +83,25 @@ "config-profile-fishbowl": "केवल प्रमाषित संपादक ही", "config-profile-private": "निजी विकि", "config-license-cc-by": "क्रिएटिव कॉमन्स ऍट्रीब्यूशन", + "config-license-pd": "सार्वजनिक डोमैन", "config-email-watchlist": "ध्यानसूची अधिसूचना को सक्षम करें", + "config-upload-enable": "फ़ाइल अपलोड सक्रिय करें", + "config-upload-help": "यदि आप अपने सर्वर में फ़ाइल अपलोड की सेवा दे रहे हैं तो आपको सुरक्षा से समझौता करना पड़ सकता है।\n\nअधिक जानकारी के लिए मार्गदर्शक में [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security सुरक्षा अनुभाग] देखें।\n\nयदि आप फ़ाइल अपलोड को सक्रिय करना चाहते हैं तो आपको मीडियाविकि के फोंल्डर के images फोंल्डर में जाने के बाद उसे सर्वर द्वारा लिखने लायक बनाना होगा।\nउसके बाद ही आप इस विकल्प को सक्रिय कर सकते हैं।", + "config-logo": "''लोगो'' का पता:", + "config-instantcommons": "''कॉमन्स'' सक्रिय करें", + "config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons कॉमन्स] एक प्रकार की विशेषता प्रदान करता है, जिससे आप विकि में [https://commons.wikimedia.org/ विकिमीडिया कॉमन्स] साइट के किसी भी तस्वीर, आवाज या अन्य फ़ाइल का उपयोग अपने मीडियाविकि में कर सकते हैं। इसके लिए मीडियाविकि को इंटरनेट से जुड़ा होना चाहिए।\n\nइस विशेषता की अधिक जानकारी के लिए और इसे किस प्रकार आप अपने विकि में सक्रिय कर सकते हैं आदि जानने के लिए [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos मार्गदर्शक] देखें।", "config-extensions": "एक्सटेंशन", + "config-skins": "त्वचा", + "config-install-step-done": "पूरा हुआ", + "config-install-step-failed": "विफल हुआ", + "config-install-user-alreadyexists": "सदस्य \"$1\" पहले से उपस्थित है।", + "config-install-user-create-failed": "सदस्य \"$1\" का निर्माण विफल हुआ: $2", + "config-install-keys": "गुप्त कुंजी बना रहा", + "config-install-sysop": "प्रबन्धक सदस्य खाता बना रहा", + "config-download-localsettings": "LocalSettings.php को डाउनलोड करें।", "config-help": "सहायता", + "config-help-tooltip": "विस्तार हेतु क्लिक करें", "config-nofile": "फ़ाइल \"$1\" नहीं पाई जा सकी। क्या इसे हटा दिया गया है?", - "mainpagetext": "'''मीडियाविकिका इन्स्टॉलेशन पूरा हो गया हैं ।'''", - "mainpagedocfooter": "विकि सॉफ्टवेयरके इस्तेमाल के लिये [https://meta.wikimedia.org/wiki/Help:Contents उपयोगकर्ता गाईड] देखें ।\n\n== शुरुवात करें ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings कॉन्फिगरेशन सेटींगकी सूची]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ मीडियाविकिके बारे में प्राय: पूछे जाने वाले सवाल]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce मीडियाविकि मेलिंग लिस्ट]" + "mainpagetext": "मीडियाविकि का अब स्थापित हो चुका है।", + "mainpagedocfooter": "इस विकि सॉफ्टवेयर का किस प्रकार आप इस्तेमाल कर सकते हैं, इसकी जानकारी के लिए [https://meta.wikimedia.org/wiki/Help:Contents उपयोग मार्गदर्शक] देखें।\n== शुरुआत करें ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings विकि में बदलाव की सूची]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ मीडियाविकि के बारे में प्राय: पूछे जाने वाले सवाल]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce मीडियाविकि की मेल सूची]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources मीडियाविकि का आपके भाषा में अनुवाद]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam अपने विकि को किस प्रकार से विज्ञापन डालने वाले और बर्बरता करने वालों से बचा सकते हैं]" } diff --git a/includes/installer/i18n/nl.json b/includes/installer/i18n/nl.json index a4995538af..ca02841a47 100644 --- a/includes/installer/i18n/nl.json +++ b/includes/installer/i18n/nl.json @@ -171,7 +171,7 @@ "config-unknown-collation": "'''Waarschuwing:''' de database gebruikt een collatie die niet wordt herkend.", "config-db-web-account": "Databaseaccount voor webtoegang", "config-db-web-help": "Selecteer de gebruikersnaam en het wachtwoord die de webserver gebruikt om verbinding te maken met de databaseserver na de installatie.", - "config-db-web-account-same": "Dezelfde account gebruiken als voor de installatie", + "config-db-web-account-same": "Hetzelfde account gebruiken als voor de installatie", "config-db-web-create": "Maak de gebruiker aan als deze nog niet bestaat", "config-db-web-no-create-privs": "De gebruiker die u hebt opgegeven voor de installatie heeft niet voldoende rechten om een gebruiker aan te maken.\nDe gebruiker die u hier opgeeft moet al bestaan.", "config-mysql-engine": "Opslagmethode:", diff --git a/includes/parser/Parser.php b/includes/parser/Parser.php index 5b1e86d252..ecee0e22d3 100644 --- a/includes/parser/Parser.php +++ b/includes/parser/Parser.php @@ -589,6 +589,14 @@ class Parser { $this->mTitle->getPrefixedDBkey() ); } } + + # Wrap non-interface parser output in a
so it can be targeted + # with CSS (T37247) + $class = $this->mOptions->getWrapOutputClass(); + if ( $class !== false && !$this->mOptions->getInterfaceMessage() ) { + $text = Html::rawElement( 'div', [ 'class' => $class ], $text ); + } + $this->mOutput->setText( $text ); $this->mRevisionId = $oldRevisionId; diff --git a/includes/parser/ParserOptions.php b/includes/parser/ParserOptions.php index 2cdd8c7075..d4d104231d 100644 --- a/includes/parser/ParserOptions.php +++ b/includes/parser/ParserOptions.php @@ -258,6 +258,12 @@ class ParserOptions { */ private $allowUnsafeRawHtml = true; + /** + * CSS class to use to wrap output from Parser::parse(). + * @var string|false + */ + private $wrapOutputClass = 'mw-parser-output'; + public function getInterwikiMagic() { return $this->mInterwikiMagic; } @@ -481,6 +487,15 @@ class ParserOptions { return $this->allowUnsafeRawHtml; } + /** + * Class to use to wrap output from Parser::parse() + * @since 1.30 + * @return string|bool + */ + public function getWrapOutputClass() { + return $this->wrapOutputClass; + } + public function setInterwikiMagic( $x ) { return wfSetVar( $this->mInterwikiMagic, $x ); } @@ -629,6 +644,19 @@ class ParserOptions { return wfSetVar( $this->allowUnsafeRawHtml, $x ); } + /** + * CSS class to use to wrap output from Parser::parse() + * @since 1.30 + * @param string|bool $className Set false to disable wrapping. + * @return string|bool Current value + */ + public function setWrapOutputClass( $className ) { + if ( $className === true ) { // DWIM, they probably want the default class name + $className = 'mw-parser-output'; + } + return wfSetVar( $this->wrapOutputClass, $className ); + } + /** * Set the redirect target. * diff --git a/includes/specialpage/ChangesListSpecialPage.php b/includes/specialpage/ChangesListSpecialPage.php index 7e70df2028..6e3971f2d8 100644 --- a/includes/specialpage/ChangesListSpecialPage.php +++ b/includes/specialpage/ChangesListSpecialPage.php @@ -973,13 +973,17 @@ abstract class ChangesListSpecialPage extends SpecialPage { * @return bool True if any option was reset */ private function fixContradictoryOptions( FormOptions $opts ) { - $contradictorySets = []; - $fixed = $this->fixBackwardsCompatibilityOptions( $opts ); foreach ( $this->filterGroups as $filterGroup ) { if ( $filterGroup instanceof ChangesListBooleanFilterGroup ) { $filters = $filterGroup->getFilters(); + + if ( count( $filters ) === 1 ) { + // legacy boolean filters should not be considered + continue; + } + $allInGroupEnabled = array_reduce( $filters, function ( $carry, $filter ) use ( $opts ) { @@ -990,7 +994,7 @@ abstract class ChangesListSpecialPage extends SpecialPage { if ( $allInGroupEnabled ) { foreach ( $filters as $filter ) { - $opts->reset( $filter->getName() ); + $opts[ $filter->getName() ] = false; } $fixed = true; @@ -1078,7 +1082,7 @@ abstract class ChangesListSpecialPage extends SpecialPage { // Namespace filtering if ( $opts[ 'namespace' ] !== '' ) { - $namespaces = explode( ',', $opts[ 'namespace' ] ); + $namespaces = explode( ';', $opts[ 'namespace' ] ); if ( $opts[ 'associated' ] ) { $associatedNamespaces = array_map( diff --git a/includes/specials/SpecialRecentchanges.php b/includes/specials/SpecialRecentchanges.php index c10dbddf39..5553218665 100644 --- a/includes/specials/SpecialRecentchanges.php +++ b/includes/specials/SpecialRecentchanges.php @@ -291,7 +291,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage { if ( preg_match( '/^days=(\d+)$/', $bit, $m ) ) { $opts['days'] = $m[1]; } - if ( preg_match( '/^namespace=(\d+)$/', $bit, $m ) ) { + if ( preg_match( '/^namespace=(.*)$/', $bit, $m ) ) { $opts['namespace'] = $m[1]; } if ( preg_match( '/^tagfilter=(.*)$/', $bit, $m ) ) { @@ -619,7 +619,11 @@ class SpecialRecentChanges extends ChangesListSpecialPage { if ( !$message->isDisabled() ) { $this->getOutput()->addWikiText( Html::rawElement( 'div', - [ 'lang' => $wgContLang->getHtmlCode(), 'dir' => $wgContLang->getDir() ], + [ + 'class' => 'mw-recentchanges-toplinks', + 'lang' => $wgContLang->getHtmlCode(), + 'dir' => $wgContLang->getDir() + ], "\n" . $message->plain() . "\n" ), /* $lineStart */ true, diff --git a/includes/specials/SpecialUserrights.php b/includes/specials/SpecialUserrights.php index 127b530e0f..002b47cf7e 100644 --- a/includes/specials/SpecialUserrights.php +++ b/includes/specials/SpecialUserrights.php @@ -215,7 +215,7 @@ class UserrightsPage extends SpecialPage { * @return bool */ public function canProcessExpiries() { - return !$this->getConfig()->get( 'DisableUserGroupExpiry' ); + return true; } /** diff --git a/includes/specials/pagers/ActiveUsersPager.php b/includes/specials/pagers/ActiveUsersPager.php index 0d6f493d59..e2f4d4b57d 100644 --- a/includes/specials/pagers/ActiveUsersPager.php +++ b/includes/specials/pagers/ActiveUsersPager.php @@ -101,9 +101,7 @@ class ActiveUsersPager extends UsersPager { $tables[] = 'user_groups'; $conds[] = 'ug_user = user_id'; $conds['ug_group'] = $this->groups; - if ( !$this->getConfig()->get( 'DisableUserGroupExpiry' ) ) { - $conds[] = 'ug_expiry IS NULL OR ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() ); - } + $conds[] = 'ug_expiry IS NULL OR ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() ); } if ( $this->excludegroups !== [] ) { foreach ( $this->excludegroups as $group ) { @@ -111,9 +109,7 @@ class ActiveUsersPager extends UsersPager { 'user_groups', '1', [ 'ug_user = user_id', 'ug_group' => $group, - $this->getConfig()->get( 'DisableUserGroupExpiry' ) ? - '1' : - 'ug_expiry IS NULL OR ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() ) + 'ug_expiry IS NULL OR ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() ) ] ) . ')'; } diff --git a/includes/specials/pagers/ContribsPager.php b/includes/specials/pagers/ContribsPager.php index 11336251ec..7d303de104 100644 --- a/includes/specials/pagers/ContribsPager.php +++ b/includes/specials/pagers/ContribsPager.php @@ -228,10 +228,8 @@ class ContribsPager extends ReverseChronologicalPager { 'LEFT JOIN', [ 'ug_user = rev_user', 'ug_group' => $groupsWithBotPermission, - $this->getConfig()->get( 'DisableUserGroupExpiry' ) ? - '1' : - 'ug_expiry IS NULL OR ug_expiry >= ' . - $this->mDb->addQuotes( $this->mDb->timestamp() ) + 'ug_expiry IS NULL OR ug_expiry >= ' . + $this->mDb->addQuotes( $this->mDb->timestamp() ) ] ]; } diff --git a/includes/specials/pagers/NewFilesPager.php b/includes/specials/pagers/NewFilesPager.php index b78193002a..e2d9d4201e 100644 --- a/includes/specials/pagers/NewFilesPager.php +++ b/includes/specials/pagers/NewFilesPager.php @@ -77,9 +77,7 @@ class NewFilesPager extends ReverseChronologicalPager { [ 'ug_group' => $groupsWithBotPermission, 'ug_user = img_user', - $this->getConfig()->get( 'DisableUserGroupExpiry' ) ? - '1' : - 'ug_expiry IS NULL OR ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() ) + 'ug_expiry IS NULL OR ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() ) ] ]; } diff --git a/includes/specials/pagers/UsersPager.php b/includes/specials/pagers/UsersPager.php index d599599031..9aef9ade4b 100644 --- a/includes/specials/pagers/UsersPager.php +++ b/includes/specials/pagers/UsersPager.php @@ -112,9 +112,7 @@ class UsersPager extends AlphabeticPager { if ( $this->requestedGroup != '' ) { $conds['ug_group'] = $this->requestedGroup; - if ( !$this->getConfig()->get( 'DisableUserGroupExpiry' ) ) { - $conds[] = 'ug_expiry IS NULL OR ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() ); - } + $conds[] = 'ug_expiry IS NULL OR ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() ); } if ( $this->requestedUser != '' ) { diff --git a/includes/user/UserGroupMembership.php b/includes/user/UserGroupMembership.php index 81a4083bb4..cf05df331e 100644 --- a/includes/user/UserGroupMembership.php +++ b/includes/user/UserGroupMembership.php @@ -49,11 +49,6 @@ class UserGroupMembership { * @param string|null $expiry Timestamp of expiry in TS_MW format, or null if no expiry */ public function __construct( $userId = 0, $group = null, $expiry = null ) { - global $wgDisableUserGroupExpiry; - if ( $wgDisableUserGroupExpiry ) { - $expiry = null; - } - $this->userId = (int)$userId; $this->group = $group; // TODO throw on invalid group? $this->expiry = $expiry ?: null; @@ -77,26 +72,15 @@ class UserGroupMembership { * @return string|null Timestamp of expiry in TS_MW format, or null if no expiry */ public function getExpiry() { - global $wgDisableUserGroupExpiry; - if ( $wgDisableUserGroupExpiry ) { - return null; - } - return $this->expiry; } protected function initFromRow( $row ) { - global $wgDisableUserGroupExpiry; - $this->userId = (int)$row->ug_user; $this->group = $row->ug_group; - if ( $wgDisableUserGroupExpiry ) { - $this->expiry = null; - } else { - $this->expiry = $row->ug_expiry === null ? - null : - wfTimestamp( TS_MW, $row->ug_expiry ); - } + $this->expiry = $row->ug_expiry === null ? + null : + wfTimestamp( TS_MW, $row->ug_expiry ); } /** @@ -117,19 +101,11 @@ class UserGroupMembership { * @return array */ public static function selectFields() { - global $wgDisableUserGroupExpiry; - if ( $wgDisableUserGroupExpiry ) { - return [ - 'ug_user', - 'ug_group', - ]; - } else { - return [ - 'ug_user', - 'ug_group', - 'ug_expiry', - ]; - } + return [ + 'ug_user', + 'ug_group', + 'ug_expiry', + ]; } /** @@ -140,7 +116,6 @@ class UserGroupMembership { * @return bool Whether or not anything was deleted */ public function delete( IDatabase $dbw = null ) { - global $wgDisableUserGroupExpiry; if ( wfReadOnly() ) { return false; } @@ -149,14 +124,10 @@ class UserGroupMembership { $dbw = wfGetDB( DB_MASTER ); } - if ( $wgDisableUserGroupExpiry ) { - $dbw->delete( 'user_groups', $this->getDatabaseArray( $dbw ), __METHOD__ ); - } else { - $dbw->delete( - 'user_groups', - [ 'ug_user' => $this->userId, 'ug_group' => $this->group ], - __METHOD__ ); - } + $dbw->delete( + 'user_groups', + [ 'ug_user' => $this->userId, 'ug_group' => $this->group ], + __METHOD__ ); if ( !$dbw->affectedRows() ) { return false; } @@ -182,7 +153,6 @@ class UserGroupMembership { * @return bool Whether or not anything was inserted */ public function insert( $allowUpdate = false, IDatabase $dbw = null ) { - global $wgDisableUserGroupExpiry; if ( $dbw === null ) { $dbw = wfGetDB( DB_MASTER ); } @@ -206,7 +176,7 @@ class UserGroupMembership { // Don't collide with expired user group memberships // Do this after trying to insert, in order to avoid locking - if ( !$wgDisableUserGroupExpiry && !$affected ) { + if ( !$affected ) { $conds = [ 'ug_user' => $row['ug_user'], 'ug_group' => $row['ug_group'], @@ -245,16 +215,11 @@ class UserGroupMembership { * @return array */ protected function getDatabaseArray( IDatabase $db ) { - global $wgDisableUserGroupExpiry; - - $a = [ + return [ 'ug_user' => $this->userId, 'ug_group' => $this->group, + 'ug_expiry' => $this->expiry ? $db->timestamp( $this->expiry ) : null, ]; - if ( !$wgDisableUserGroupExpiry ) { - $a['ug_expiry'] = $this->expiry ? $db->timestamp( $this->expiry ) : null; - } - return $a; } /** @@ -262,8 +227,7 @@ class UserGroupMembership { * @return bool */ public function isExpired() { - global $wgDisableUserGroupExpiry; - if ( $wgDisableUserGroupExpiry || !$this->expiry ) { + if ( !$this->expiry ) { return false; } else { return wfTimestampNow() > $this->expiry; @@ -276,8 +240,7 @@ class UserGroupMembership { * @param IDatabase|null $dbw */ public static function purgeExpired( IDatabase $dbw = null ) { - global $wgDisableUserGroupExpiry; - if ( $wgDisableUserGroupExpiry || wfReadOnly() ) { + if ( wfReadOnly() ) { return; } diff --git a/languages/i18n/ar.json b/languages/i18n/ar.json index 9204a44b6d..b82c5fcc0b 100644 --- a/languages/i18n/ar.json +++ b/languages/i18n/ar.json @@ -1420,6 +1420,9 @@ "rcfilters-hideminor-conflicts-typeofchange-global": "مرشح \"التعديلات الطفيفة\" يتعارض مع مرشح واحد أو أكثر من مرشحات نوع التغيير، وذلك لأن بعض أنواع التغيير لا يمكن التعليم عليها ك\"طفيفة.\" المرشحات المتعارضة معلم عليها في مساحة المرشحات النشطة بالأعلى.", "rcfilters-hideminor-conflicts-typeofchange": "بعض أنواع التغييرات لا يمكن التعليم عليها ك\"طفيفة،\" لذا فهذا المرشح يتعارض مع مرشحات نوع التغيير التالية: $1", "rcfilters-typeofchange-conflicts-hideminor": "مرشح نوع التغيير هذا يتعارض مع مرشح \"التعديلات الطفيفة\". بعض أنواع التغييرات لا يمكن التعليم عليها ك\"طفيفة.\"", + "rcfilters-filter-lastrevision-description": "أخر تعديل للصفحة.", + "rcfilters-filter-previousrevision-label": "نسخ سابقة", + "rcfilters-filter-previousrevision-description": "كل تعديلات الصفحة ما عدا التعديل الأخير.", "rcnotefrom": "بالأسفل {{PLURAL:$5|التغيير|التغييرات}} منذ $2 (إلى $1 معروضة).", "rclistfromreset": "إعادة ضبط خيار التاريخ", "rclistfrom": "أظهر التغييرات بدء من $3 $2", diff --git a/languages/i18n/atj.json b/languages/i18n/atj.json index 2c56c5f540..a8dd77cc82 100644 --- a/languages/i18n/atj.json +++ b/languages/i18n/atj.json @@ -80,6 +80,7 @@ "hidden-categories": "{{PLURAL:$1|Ka katcictek|Ka katcicteki}}", "category-subcat-count": "Nohwe tipanictawin {{PLURAL:$2|0=nama takon e ki koski tipanictakaniwok|1=tepirak e ki koski tipanictakaniwok nta takon|takon $2 koski tipanictawina, nte {{PLURAL:$1|0=nama takon|1=nohwe|neki $1}}nta nitc}}.", "category-article-count": "nohwe tipanictawin {{PLURAL:$2|0=nama takon paskickwemakan|1=Enkon nohwe tepirak paskickwemakan|takon $2 paskickwemakana,ohwe tca {{PLURAL:$1|0=nama takon|1=ohwi|nehi $1}} nihi nitc}}.", + "category-file-count": "Nohwe tipanictawin {{PLURAL:$2|0=nama takon mawtosinihikana|1= tec mawtosinihikan acotitin|acotitin $2 mawtosinihikana, {{PLURAL:$1|0=nama takon|1=nohwe|nihi $1}} nta ka cekoctek}}.", "listingcontinuesabbrev": "minawatc", "about": "Taci we otciparik", "newwindow": "(cepita kotak ocki osapwakan)", @@ -156,7 +157,7 @@ "hidetoc": "Kata", "confirmable-yes": "Ehe", "confirmable-no": "Nama", - "site-atom-feed": "Flux Atom de $1", + "site-atom-feed": "Flux Atom $1", "page-atom-feed": "\"$1\" Atom feed", "red-link-title": "$1 (nama takon kekwcic)", "nstab-main": "Masinahikan", @@ -218,6 +219,7 @@ "extlink_sample": "http://www.example.com ka icinikatek takapikenikan", "extlink_tip": "Masinahikana ka ici tapitik kotakik masinahikanik", "headline_sample": "Atisokesinahikan ke aicinikatek", + "headline_tip": "Icinikatamowinicic 2 ka iteritakok", "nowiki_sample": "Acta atisokesinahikan aka moci ka ki otci nihipitcikatek ota", "nowiki_tip": "aka pamerita e itasinihak wiki", "image_tip": "E pitakesinahikatek masinahikaniwoc", @@ -232,6 +234,7 @@ "showdiff": "Kanawapata ka meckotcipitcikateki", "anoneditwarning": "Ekwa : nama kipitikeapikecinin. Nokon e tatosinatek kit irapitcikan ka pamikicikwakein kaskina wec ici nokon kecpin e kweskisinihikein. Kecpin tca [$1wi pitikeapikecinine] ou [$2 ocita kata pitakesinasowin],nohwe ka kweskisinihikein ki ka masinason e icinikatitisowin ,acit awacimec ki ka ici titamihikowin", "loginreqlink": "posi", + "newarticletext": "Ki nanosinehen ntowapikepatcikan aka e takok nohwe paskickwemakan kiapatc.\nWi ocitaine nohwe paskickwemakan, nta ici masinaha pwetek kit atisokesinihikan minawatc\n (matci kika nta kanawapaten [$1 ka witciwemakak paskickwemakan] awacimec wi nanto kiskeritamone). \nKecpin ota ka pe icawone{{GENDER:||e}} e ki onipiriin, ohwe makona kiweckawin taci e ici pamikicikwepitcikein", "noarticletext": "Mekwatc nama takon atisokesinihikan nta paskickwemakanik.\nke ki totaman[[Special:Search/{{PAGENAME}}|nantowapaha ohwe icinikatamowin ]] kotakahikw paskickwemakanik,\n[{{fullurl:{{#Special:Log}}|paskickwemakan={{FULLPAGENAMEE}}}} nantowapata ka ici mikowapihikemikak]\nkekotc [{{fullurl:{{FULLPAGENAME}}|tota=orocowata}} ocita paskickwemakan].", "noarticletext-nopermission": "Mekwatc nama takon atisokesinihikan nta paskickwemakanik.\nke ki totaman[[Special:Search/{{PAGENAME}}|nantowapaha ohwe icinikatamowin ]] kotakahikw paskickwemakanik,\n[{{fullurl:{{#Special:Log}}|paskickwemakan={{FULLPAGENAMEE}}}} nantowapaha kotakihi wapatcikaniwoca ohwe ],nama aric ki mirikwin ohwe kata ocitain paskickwemakan.", "editing": "Meckotcita $1", @@ -262,6 +265,7 @@ "difference-title": "$1 E ci papitoc icinakok", "lineno": "E tatosinatek $1 :", "editundo": "nama ntwatc", + "diff-multi-sameuser": "({{PLURAL:$1|Nohwe ka ki koski kanawapatcikatek enkon nohwe peikon ka ki mockatcitatc nama aric nokon |$1 nohwe ka ki koski kanawapatcikateki enkon nohwe peikon ka mockatcitatc nama aric nokon }})", "searchresults": "Ka ki nta kiskeritakok", "searchresults-title": "Ka ki nta kiskeritakok \"$1\"", "prevn": "{{PLURAL:$1|nictamictew|nictamictewa $1}}", @@ -283,6 +287,7 @@ "search-section": "(ke arimotcikatek $1)", "search-suggest": "Ohwe kotcita e itasinatek:$1", "searchall": "kaskina", + "search-showingresults": "{{PLURAL:$4|E ici miskatek $1 nta neki$3|E ici miskatek $1 à $2nta neki$3}}", "search-nonefound": "Nama miskwapahikatew ka nantowapahikatek.", "powersearch-legend": "Awocamec nantona", "powersearch-toggleall": "Kaskina", @@ -344,6 +349,7 @@ "recentchangeslinked-title": "E nosinehikatek paskickwemikana ka acotcictek\"$1\"", "recentchangeslinked-summary": " Enkon ohwe ka ki meckotcisinihikateki paskickwemikana e ici natcipitcikatek nta paskickemakanik kekwan ka arimotcikatek mia kekotc ma neki ka mamowisinasotcik taci ka ki ici aritisotcik mia.\nPaskickwemikina [[Special:Watchlist|masinihikan ka nakatcitain]] nehimakatewasinikan", "recentchangeslinked-page": "Icinikatamowin Ickwemakinikan:", + "recentchangeslinked-to": "Kata nokok kaki kweskisinihikateki paskickwemikina ka acotcisinihikateki taci e ici ntowapekihikatek nohwe paskickwemakan patoc kweski e icinakok.", "upload": "Natcipata masinahikan", "filedesc": "Nosem", "fileuploadsummary": "Nosem:", @@ -389,6 +395,7 @@ "brokenredirects-delete": "wepina", "withoutinterwiki-submit": "Wapata", "nbytes": "$1 {{PLURAL:$1|irik}}", + "nmembers": "$1 {{PLURAL:$1|witciwetc|witciwetcik}}", "prefixindex-submit": "Wapata", "protectedpages-page": "Masinhikan", "newpages": "Ocki matcecikinakanik", @@ -423,6 +430,7 @@ "historyaction-submit": "Wapata", "dellogpage": " Nesitc ka wepinikatek kanaweritcikan", "rollbacklink": "e maninakatek", + "rollbacklinkcount": " nesitc wepina$1 {{PLURAL:$1|kweskisinikan|kweskisinihikana}}", "protectlogpage": "Nanakatisiwina wapatcikan", "restriction-edit": "Meckotcita", "undeleteviewlink": "tapwatcike", diff --git a/languages/i18n/be-tarask.json b/languages/i18n/be-tarask.json index a410b9752a..7d69d1d729 100644 --- a/languages/i18n/be-tarask.json +++ b/languages/i18n/be-tarask.json @@ -1354,6 +1354,9 @@ "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-filtergroup-changetype": "Тып зьмены", "rcfilters-filter-pageedits-label": "Рэдагаваньні старонкі", "rcfilters-filter-pageedits-description": "Рэдагаваньні вікізьместу, абмеркаваньняў, апісаньняў катэгорыяў…", diff --git a/languages/i18n/bs.json b/languages/i18n/bs.json index 5b242fb01b..4e2f7f0636 100644 --- a/languages/i18n/bs.json +++ b/languages/i18n/bs.json @@ -637,7 +637,7 @@ "showpreview": "Prikaži izgled", "showdiff": "Prikaži izmjene", "blankarticle": "Upozorenje: Napravili ste praznu stranicu.\nAko ponovno kliknete \"$1\", napravit ćete praznu stranicu bez sadržaja.", - "anoneditwarning": "Upozorenje: Niste prijavljeni. \nVaša IP adresa će biti javno vidljiva ako napravite neku izmjenu. Ako se [$1 prijavite] ili [$2 napravite račun], vaše izmjene će biti pripisane vašem korisničkom imenu, zajedno sa drugim pogodnostima.", + "anoneditwarning": "Upozorenje: Niste prijavljeni. Vaša IP-adresa bit će javno vidljiva ako napravite neku izmjenu. Ako se [$1 prijavite] ili [$2 napravite račun], Vaše izmjene bit će pripisane Vašem korisničkom imenu, pored drugih pogodnosti.", "anonpreviewwarning": "''Niste prijavljeni. Nakon spremanja izmjena vaša IP adresa će biti zapisana u historiji uređivanja ove stranice.''", "missingsummary": "Napomena: Niste unijeli sažetak izmjene.\nAko ponovo kliknete na \"$1\", Vaša izmjena će biti sačuvana bez sažetka.", "selfredirect": "Upozorenje: Preusmjerili ste stranicu na samu sebe.\nMožda ste naveli pogrešan cilj preusmjeravanja ili ste uređivali pogrešnu stranicu.\nAko ponovno kliknete \"$1\", ipak će nastati preusmjerenje.", @@ -2247,11 +2247,11 @@ "blockip": "Blokiraj {{GENDER:$1|korisnika|korisnicu}}", "blockip-legend": "Blokiranje korisnika", "blockiptext": "Koristite donji obrazac da biste uklonili prava pisanja određenoj IP-adresi ili korisničkom imenu.\nOvo bi se trebalo raditi samo da bi se spriječio vandalizam, i u skladu sa [[{{MediaWiki:Policy-url}}|smjernicama]].\nIspod upišite konkretan razlog (naprimjer, navedite koje su stranice vandalizirane).\nMožete blokirati IP-opsege koristeći sintaksu [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR-a]; najveći dozvoljeni opseg za IPv4 je /$1, a za IPv6 /$2.", - "ipaddressorusername": "IP adresa ili korisničko ime:", + "ipaddressorusername": "IP-adresa ili korisničko ime:", "ipbexpiry": "Ističe:", "ipbreason": "Razlog:", "ipbreason-dropdown": "*Najčešći razlozi blokiranja\n**Netačne informacije\n**Uklanjanje sadržaja stranica\n**Postavljanje spam vanjskih linkova\n**Ubacivanje gluposti/grafita\n**Osobni napadi (ili napadačko ponašanje)\n**Čarapare (zloupotreba više korisničkih računa)\n**Neprihvatljivo korisničko ime", - "ipb-hardblock": "Onemogući prijavljene korisnike da uređuju sa ove IP adrese", + "ipb-hardblock": "Spriječi prijavljene korisnike da uređuju s ove IP-adrese", "ipbcreateaccount": "Spriječi pravljenje računa", "ipbemailban": "Spriječi korisnika da šalje e-poštu", "ipbenableautoblock": "Automatski blokiraj posljednju IP-adresu koju je koristio ovaj korisnik i sve druge IP-adrese s kojih je pokušao uređivati", @@ -2260,7 +2260,7 @@ "ipboptions": "2 sata:2 hours,1 dan:1 day,3 dana:3 days,1 sedmica:1 week,2 sedmice:2 weeks,1 mjesec:1 month,3 mjeseca:3 months,6 mjeseci:6 months,1 godine:1 year,beskonačno:infinite", "ipbhidename": "Sakrij korisničko ime iz uređivanja i spiskova", "ipbwatchuser": "Prati korisničku stranicu i stranicu za razgovor ovog korisnika", - "ipb-disableusertalk": "Onemogući ovog korisnika da uređuje svoju stranicu za razgovor dok je blokiran", + "ipb-disableusertalk": "Spriječi ovog korisnika da uređuje svoju stranicu za razgovor dok je blokiran", "ipb-change-block": "Ponovno blokiraj korisnika sa novim postavkama", "ipb-confirm": "Potvrdite blokiranje", "badipaddress": "Pogrešna IP adresa", diff --git a/languages/i18n/cs.json b/languages/i18n/cs.json index 0f4ad80ad7..a8bb14ce67 100644 --- a/languages/i18n/cs.json +++ b/languages/i18n/cs.json @@ -1374,6 +1374,13 @@ "rcfilters-filter-minor-description": "Editace, které autor označil jako malé.", "rcfilters-filter-major-label": "Nemalé editace", "rcfilters-filter-major-description": "Editace neoznačené jako malé.", + "rcfilters-filtergroup-watchlist": "Sledované stránky", + "rcfilters-filter-watchlist-watched-label": "Na seznamu sledovaných stránek", + "rcfilters-filter-watchlist-watched-description": "Změny stránek z vašeho seznamu sledovaných.", + "rcfilters-filter-watchlist-watchednew-label": "Nové změny sledovaných stránek", + "rcfilters-filter-watchlist-watchednew-description": "Změny stránek z vašeho seznamu sledovaných, které jste od jejich změny nenavštívili.", + "rcfilters-filter-watchlist-notwatched-label": "Nesledované stránky", + "rcfilters-filter-watchlist-notwatched-description": "Vše kromě změn vašich sledovaných stránek.", "rcfilters-filtergroup-changetype": "Typ změny", "rcfilters-filter-pageedits-label": "Editace stránek", "rcfilters-filter-pageedits-description": "Editace obsahu wiki, diskusí, popisů kategorií...", @@ -1386,6 +1393,11 @@ "rcfilters-hideminor-conflicts-typeofchange-global": "Filtr „Malé editace“ je v konfliktu s jedním nebo více filtry podle typu změny, protože určité typy změn nelze označit jako malé. Dotyčné filtry jsou označeny nahoře, v prostoru „Aktivní filtry“.", "rcfilters-hideminor-conflicts-typeofchange": "Určité typy změn nelze označit jako malé, tento filtr je proto v konfliktu s následujícími filtry podle typu změny: $1", "rcfilters-typeofchange-conflicts-hideminor": "Tento filtr podle typu změny je v konfliktu s filtrem „Malé editace“. Určité typy změn nelze označit jako malé.", + "rcfilters-filtergroup-lastRevision": "Aktuální verze", + "rcfilters-filter-lastrevision-label": "Aktuální verze", + "rcfilters-filter-lastrevision-description": "Poslední změna stránky.", + "rcfilters-filter-previousrevision-label": "Dřívější verze", + "rcfilters-filter-previousrevision-description": "Všechny změny, které nejsou nejnovější úpravou stránky.", "rcnotefrom": "Níže {{PLURAL:$5|je změna|jsou změny}} od $3, $4 ({{PLURAL:$1|zobrazena|zobrazeny|zobrazeno}} nejvýše $1).", "rclistfromreset": "Obnovit výběr data", "rclistfrom": "Ukázat nové změny, počínaje od $2, $3", diff --git a/languages/i18n/en.json b/languages/i18n/en.json index e33ace22a6..05164df522 100644 --- a/languages/i18n/en.json +++ b/languages/i18n/en.json @@ -1365,6 +1365,16 @@ "recentchanges-legend-plusminus": "(±123)", "recentchanges-submit": "Show", "rcfilters-activefilters": "Active filters", + "rcfilters-quickfilters": "Quick links", + "rcfilters-savedqueries-defaultlabel": "Saved filters", + "rcfilters-savedqueries-rename": "Rename", + "rcfilters-savedqueries-setdefault": "Set as default", + "rcfilters-savedqueries-unsetdefault": "Unset as default", + "rcfilters-savedqueries-remove": "Remove", + "rcfilters-savedqueries-new-name-label": "Name", + "rcfilters-savedqueries-apply-label": "Create quick link", + "rcfilters-savedqueries-cancel-label": "Cancel", + "rcfilters-savedqueries-add-new-title": "Save filters as a quick link", "rcfilters-restore-default-filters": "Restore default filters", "rcfilters-clear-all-filters": "Clear all filters", "rcfilters-search-placeholder": "Filter recent changes (browse or start typing)", @@ -1397,7 +1407,7 @@ "rcfilters-filter-user-experience-level-newcomer-label": "Newcomers", "rcfilters-filter-user-experience-level-newcomer-description": "Fewer than 10 edits and 4 days of activity.", "rcfilters-filter-user-experience-level-learner-label": "Learners", - "rcfilters-filter-user-experience-level-learner-description": "More days of activity and edits than \"Newcomers\" but fewer than \"Experienced users\".", + "rcfilters-filter-user-experience-level-learner-description": "More experience than \"Newcomers\" but less than \"Experienced users\".", "rcfilters-filter-user-experience-level-experienced-label": "Experienced users", "rcfilters-filter-user-experience-level-experienced-description": "More than 30 days of activity and 500 edits.", "rcfilters-filtergroup-automated": "Automated contributions", diff --git a/languages/i18n/es.json b/languages/i18n/es.json index 3c444cf317..3b335020d7 100644 --- a/languages/i18n/es.json +++ b/languages/i18n/es.json @@ -774,10 +774,10 @@ "preview": "Previsualizar", "showpreview": "Mostrar previsualización", "showdiff": "Mostrar los cambios", - "blankarticle": "Aviso: estás a punto de crear una página vacía.\nSi pulsas en «$1» de nuevo, se creará la página sin ningún contenido.", + "blankarticle": "Aviso: estás a punto de crear una página vacía.\nSi haces clic en «$1» de nuevo, se creará la página sin ningún contenido.", "anoneditwarning": "Advertencia: no has iniciado sesión. Tu dirección IP se hará pública si haces cualquier edición en estas condiciones. Si [$1 inicias sesión] o [$2 creas una cuenta], tus ediciones se atribuirán a tu nombre de usuario, además de otros beneficios.", "anonpreviewwarning": "No has iniciado sesión. Al guardar los cambios se almacenará tu dirección IP en el historial de edición de esta página.", - "missingsummary": "Atención: No has escrito un resumen de edición.\nSi haces clic nuevamente en «$1» tu edición se grabará sin él.", + "missingsummary": "Atención: no has escrito un resumen de edición.\nSi haces clic de nuevo en «$1» tu edición se grabará sin él.", "selfredirect": "Advertencia: estás redirigiendo esta página a sí misma.\nPuede que hayas especificado erróneamente el destino de la redirección, o quizá estés editando la página equivocada. En cualquier caso, si haces clic de nuevo en \"$1\", se creará la redirección.", "missingcommenttext": "Escribe un comentario a continuación.", "missingcommentheader": "Atención: no has escrito un asunto para este comentario.\nSi haces clic nuevamente en \"$1\" tu edición se grabará sin él.", @@ -829,7 +829,7 @@ "editingsection": "Edición de «$1» (sección)", "editingcomment": "Edición de «$1» (sección nueva)", "editconflict": "Conflicto de edición: $1", - "explainconflict": "Alguien ha realizado cambios en esta página desde que empezaste a editarla.\nEl cuadro de texto superior contiene el texto de la página tal como está guardado en este momento.\nTus cambios sobre la versión que editaste se muestran en el cuadro de texto inferior.\nSi quieres guardar tus cambios, has de trasladarlos al cuadro superior.\nAl pulsar «$1», se guardará solo el texto del cuadro superior.", + "explainconflict": "Alguien ha realizado cambios en esta página desde que empezaste a editarla.\nEl cuadro de texto superior contiene el texto de la página tal como está guardado en este momento.\nTus cambios sobre la versión que editaste se muestran en el cuadro de texto inferior.\nSi quieres guardar tus cambios, has de trasladarlos al cuadro superior.\nAl pulsar «$1», se guardará solamente el texto del cuadro superior.", "yourtext": "Tu texto", "storedversion": "Versión guardada", "nonunicodebrowser": "Advertencia: tu navegador no es compatible con los caracteres Unicode.\nSe ha activado un sistema de edición alternativo que te permitirá editar artículos con seguridad: los caracteres no pertenecientes al estándar ASCII aparecerán como códigos hexadecimales en el cuadro de edición.", @@ -1495,6 +1495,13 @@ "rcfilters-filter-minor-description": "Ediciones etiquetadas por el autor como menores.", "rcfilters-filter-major-label": "Ediciones no menores", "rcfilters-filter-major-description": "Ediciones no etiquetadas como menores.", + "rcfilters-filtergroup-watchlist": "Páginas vigiladas", + "rcfilters-filter-watchlist-watched-label": "En mi lista de seguimiento", + "rcfilters-filter-watchlist-watched-description": "Cambios en las páginas de tu lista de seguimiento.", + "rcfilters-filter-watchlist-watchednew-label": "Cambios nuevos en tu lista de seguimiento", + "rcfilters-filter-watchlist-watchednew-description": "Cambios en las páginas de tu lista de seguimiento que no has visitado desde que se produjeron los cambios.", + "rcfilters-filter-watchlist-notwatched-label": "No en mi lista de seguimiento", + "rcfilters-filter-watchlist-notwatched-description": "Todos, excepto los cambios en las páginas de tu lista de seguimiento.", "rcfilters-filtergroup-changetype": "Tipo de cambio", "rcfilters-filter-pageedits-label": "Ediciones de páginas", "rcfilters-filter-pageedits-description": "Modificaciones del contenido wiki, discusiones, descripción de categorías...", @@ -1507,6 +1514,11 @@ "rcfilters-hideminor-conflicts-typeofchange-global": "El filtro \"Ediciones menores\" está en conflicto con uno o más Tipos de filtros de Cambio, ya que ciertos tipos de cambio no pueden ser designados como \"menores\". Los filtros en conflicto están marcados en el área Filtros activos, anterior.", "rcfilters-hideminor-conflicts-typeofchange": "Ciertos tipos de cambio no pueden ser designados como \"menores\", por lo que este filtro entra en conflicto con los siguientes Tipos de filtros de Cambio: $1", "rcfilters-typeofchange-conflicts-hideminor": "Este filtro «Tipo de cambio» entra en conflicto con el filtro «Ediciones menores». Hay ciertos tipos de cambios que no pueden denominarse «menores».", + "rcfilters-filtergroup-lastRevision": "Revisión actual", + "rcfilters-filter-lastrevision-label": "Revisión actual", + "rcfilters-filter-lastrevision-description": "El cambio más reciente a una página.", + "rcfilters-filter-previousrevision-label": "Revisiones anteriores", + "rcfilters-filter-previousrevision-description": "Todos los cambios que no son los más recientes cambian a una página.", "rcnotefrom": "Debajo {{PLURAL:$5|aparece el cambio|aparecen los cambios}} desde $3, $4 (se muestran hasta $1).", "rclistfromreset": "Restablecer selección de fecha", "rclistfrom": "Mostrar cambios nuevos desde las $2 del $3", @@ -2935,7 +2947,7 @@ "newimages-showbots": "Mostrar cargas de bots", "newimages-hidepatrolled": "Ocultar las subidas verificadas", "noimages": "No hay nada que ver.", - "gallery-slideshow-toggle": "Alternar las miniaturas", + "gallery-slideshow-toggle": "Activar o desactivar las miniaturas", "ilsubmit": "Buscar", "bydate": "por fecha", "sp-newimages-showfrom": "Mostrar archivos nuevos empezando desde $2, $1", diff --git a/languages/i18n/et.json b/languages/i18n/et.json index 7647732ebf..ea201f1e24 100644 --- a/languages/i18n/et.json +++ b/languages/i18n/et.json @@ -77,9 +77,9 @@ "tog-prefershttps": "Kasuta sisselogimisel alati turvalist ühendust", "underline-always": "Alati", "underline-never": "Mitte kunagi", - "underline-default": "Kujunduse või veebilehitseja vaikeväärtus", + "underline-default": "Kujunduse või brauseri vaikeväärtus", "editfont-style": "Redigeerimisala kirjatüüp:", - "editfont-default": "Veebilehitseja vaikesäte", + "editfont-default": "Brauseri vaikesäte", "editfont-monospace": "Püsisammuga font", "editfont-sansserif": "Seriifideta kiri", "editfont-serif": "Seriifidega kiri", @@ -407,7 +407,7 @@ "virus-badscanner": "Viga konfiguratsioonis: tundmatu viirusetõrje: ''$1''", "virus-scanfailed": "skaneerimine ebaõnnestus (veakood $1)", "virus-unknownscanner": "tundmatu viirusetõrje:", - "logouttext": "Oled nüüd välja loginud.\n\nPane tähele, et seni, kuni sa pole veebilehitseja puhvrit tühjendanud, võidakse mõni lehekülg endiselt kuvada nii nagu oleksid ikka sisse logitud.", + "logouttext": "Oled nüüd välja logitud.\n\nPane tähele, et seni, kuni sa pole brauseri puhvrit tühjendanud, võidakse mõni lehekülg endiselt kuvada nii nagu oleksid ikka sisse logitud.", "cannotlogoutnow-title": "Praegu ei saa välja logida", "cannotlogoutnow-text": "Väljalogimine pole võimalik, kui kasutad $1.", "welcomeuser": "Tere tulemast, $1!", @@ -516,7 +516,7 @@ "login-abort-generic": "Sisselogimine ebaõnnestus – Katkestatud", "login-migrated-generic": "Sinu konto on migreeritud ja sinu kasutajanime pole enam selles vikis.", "loginlanguagelabel": "Keel: $1", - "suspicious-userlogout": "Sinu väljalogimiskatse nurjus, sest see näis olevat katkise veebilehitseja või puhverserveri saadetud.", + "suspicious-userlogout": "Sinu väljalogimiskatse nurjus, sest see näis olevat katkise brauseri või puhverserveri saadetud.", "createacct-another-realname-tip": "Tegelik nimi on valikuline.\nKui otsustad selle sisestada, kasutatakse seda kasutaja töö temale omistamiseks.", "pt-login": "Logi sisse", "pt-login-button": "Logi sisse", @@ -644,7 +644,7 @@ "accmailtitle": "Parool saadetud", "accmailtext": "Kasutajale [[User talk:$1|$1]] genereeritud juhuslik parool saadeti aadressile $2.\n\nSeda saab pärast sisselogimist muuta ''[[Special:ChangePassword|parooli muutmise]]'' leheküljel.", "newarticle": "(Uus)", - "newarticletext": "Lehekülge, kuhu link sind suunas, pole veel.\nEt lehekülg luua, alusta allolevas kastis kirjutamist (lisateave [$1 juhendist]).\nKui sattusid siia kogemata, klõpsa veebilehitseja ''tagasi''-nupule.", + "newarticletext": "Lehekülge, kuhu link sind suunas, pole veel.\nEt lehekülg luua, alusta allolevas kastis kirjutamist (lisateave [$1 juhendist]).\nKui sattusid siia kogemata, klõpsa brauseri ''tagasi''-nupule.", "anontalkpagetext": "----''See on anonüümse kasutaja arutelulehekülg. See kasutaja pole kontot loonud või ei kasuta seda. Sellepärast tuleb meil kasutaja tuvastamiseks kasutada tema IP-aadressi. Sellist IP-aadressi võib kasutada mitu kasutajat. Kui oled osutatud IP-aadressi kasutaja ning leiad, et siinsed kommentaarid ei puutu kuidagi sinusse, [[Special:CreateAccount|loo palun kasutajakonto]] või [[Special:UserLogin|logi sisse]], et sind edaspidi teiste anonüümsete kasutajatega segi ei aetaks.''", "noarticletext": "Käesoleval leheküljel hetkel teksti ei ole.\nVõid [[Special:Search/{{PAGENAME}}|otsida pealkirjaks olevat fraasi]] teistelt lehtedelt,\n[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} uurida asjassepuutuvaid logisid] või [{{fullurl:{{FULLPAGENAME}}|action=edit}} puuduva lehekülje ise luua].", "noarticletext-nopermission": "Sellel leheküljel pole praegu teksti.\nSaad [[Special:Search/{{PAGENAME}}|otsida selle lehekülje pealkirja]] teistelt lehekülgedelt või [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} otsida seonduvatest logidest], aga sul pole õigust seda lehekülge alustada.", @@ -652,7 +652,7 @@ "userpage-userdoesnotexist": "Kasutajakontot \"$1\" pole olemas.\nPalun mõtle järele, kas soovid seda lehte luua või muuta.", "userpage-userdoesnotexist-view": "Kasutajakonto \"$1\" pole registreeritud.", "blocked-notice-logextract": "See kasutaja on praegu blokeeritud.\nAllpool on toodud viimane blokeerimislogi sissekanne:", - "clearyourcache": "Märkus: Võimalik, et pärast salvestamist tuleb muudatuste nägemiseks veebilehitseja puhver tühjendada.\n* Firefox / Safari: Hoia all Shift-klahvi ja klõpsa Laadi uuesti või vajuta kas Ctrl-F5 või Ctrl-R (Macis ⌘-R).\n* Google Chrome: Vajuta Ctrl-Shift-R (Macis ⌘-Shift-R).\n* Internet Explorer: Hoia all Ctrl-klahvi ja klõpsa Värskenda või vajuta Ctrl-F5.\n* Opera: Mine asukohta Menüü → Seaded (Macis Opera → Eelistused) ja seejärel Privaatsus ja turvalisus → Tühjenda sirvimisandmed → Puhverdatud pildid ja failid.", + "clearyourcache": "Märkus: Võimalik, et pärast salvestamist tuleb muudatuste nägemiseks brauseri puhver tühjendada.\n* Firefox / Safari: Hoia all Shift-klahvi ja klõpsa Laadi uuesti või vajuta kas Ctrl-F5 või Ctrl-R (Macis ⌘-R).\n* Google Chrome: Vajuta Ctrl-Shift-R (Macis ⌘-Shift-R).\n* Internet Explorer: Hoia all Ctrl-klahvi ja klõpsa Värskenda või vajuta Ctrl-F5.\n* Opera: Mine asukohta Menüü → Seaded (Macis Opera → Eelistused) ja seejärel Privaatsus ja turvalisus → Tühjenda sirvimisandmed → Puhverdatud pildid ja failid.", "usercssyoucanpreview": "'''Vihje:''' Enne salvestamist kasuta oma uue CSSi proovimiseks nuppu \"{{int:showpreview}}\".", "userjsyoucanpreview": "'''Vihje:''' Enne salvestamist kasuta oma uue JavaScripti proovimiseks nuppu \"{{int:showpreview}}\".", "usercsspreview": "'''Ära unusta, et seda versiooni sinu isiklikust stiililehest pole veel salvestatud!'''", @@ -743,6 +743,8 @@ "post-expand-template-argument-warning": "'''Hoiatus:''' See lehekülg sisaldab argumendina vähemalt üht malli, mille määratud maht on liiga suur.\nNeed argumendid on välja jäetud.", "post-expand-template-argument-category": "Leheküljed, kus malli argumendid on välja jäänud", "parser-template-loop-warning": "Mallid moodustavad tsükli: [[$1]]", + "template-loop-category": "Mallisilmusega leheküljed", + "template-loop-category-desc": "Leheküljel on mallisilmus ehk mall kutsub rekursiivselt iseend.", "parser-template-recursion-depth-warning": "Malli rekursiivse kasutamise limiit on ületatud ($1)", "language-converter-depth-warning": "Keeleteisendaja sügavuspiir ületatud ($1)", "node-count-exceeded-category": "Ületatud sõlmemääraga leheküljed", @@ -1000,7 +1002,7 @@ "timezoneuseserverdefault": "Kasuta serveri vaikesätet ($1)", "timezoneuseoffset": "Muu (määra ajavahe)", "servertime": "Serveri aeg:", - "guesstimezone": "Loe aeg veebilehitsejast", + "guesstimezone": "Loe aeg brauserist", "timezoneregion-africa": "Aafrika", "timezoneregion-america": "Ameerika", "timezoneregion-antarctica": "Antarktika", @@ -1286,7 +1288,83 @@ "recentchanges-legend-heading": "Seletus:", "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vaata ka [[Special:NewPages|uute lehekülgede loendit]])", "recentchanges-submit": "Näita", + "rcfilters-activefilters": "Aktiivsed filtrid", + "rcfilters-restore-default-filters": "Taasta vaikefiltrid", + "rcfilters-clear-all-filters": "Eemalda kõik filtrid", + "rcfilters-search-placeholder": "Filtri viimaseid muudatusi (sirvi või alusta tippimist)", + "rcfilters-invalid-filter": "Vigane filter", + "rcfilters-empty-filter": "Aktiivsed filtrid puuduvad. Näidatakse kogu kaastööd.", + "rcfilters-filterlist-title": "Filtrid", + "rcfilters-filterlist-whatsthis": "Mis see on?", + "rcfilters-filterlist-feedbacklink": "Anna uute filtrite beetaversiooni kohta tagasisidet", + "rcfilters-highlightbutton-title": "Tulemuste esiletõst", + "rcfilters-highlightmenu-title": "Vali värvus", + "rcfilters-highlightmenu-help": "Vali värvus, et see atribuut esile tõsta", + "rcfilters-filterlist-noresults": "Ei leitud ühtegi filtrit.", + "rcfilters-noresults-conflict": "Tulemusi ei leitud, sest otsikriteeriumid on konfliktsed.", + "rcfilters-state-message-subset": "See filter ei tee midagi, sest selle tulemused on kaasatud {{PLURAL:$2|järgmise laiema filtri|järgmiste laiemate filtrite}} tulemustes (tulemuste eristamiseks proovi esiletõstu): $1", + "rcfilters-state-message-fullcoverage": "Ühe rühma kõigi filtrite valimine on samaväärne mitte ühegi filtri valimisega, mistõttu ei tee see filter midagi. Rühmas on: $1", + "rcfilters-filtergroup-registration": "Registreerumine", + "rcfilters-filter-registered-label": "Registreerunud", + "rcfilters-filter-registered-description": "Sisse logitud kasutajad.", + "rcfilters-filter-unregistered-label": "Registreerumata", + "rcfilters-filter-unregistered-description": "Kasutajad, kes pole sisse logitud.", + "rcfilters-filter-unregistered-conflicts-user-experience-level": "See filter on konfliktis {{PLURAL:$2|järgmise kogemustaseme filtriga|järgmiste kogemustasemete filtritega}}, mis {{PLURAL:$2|leiab|leiavad}} ainult registreerunud kasutajaid: $1", + "rcfilters-filtergroup-authorship": "Kaastöö autorsus", + "rcfilters-filter-editsbyself-label": "Enda muudatused", + "rcfilters-filter-editsbyself-description": "Sinu enda muudatused.", + "rcfilters-filter-editsbyother-label": "Teiste muudatused", + "rcfilters-filter-editsbyother-description": "Kõik muudatused peale sinu enda omade.", + "rcfilters-filtergroup-userExpLevel": "Kogemustase (ainult registreerunud kasutajate puhul)", + "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Kogemustaseme filtrid leiavad ainult registreerunud kasutajaid, mistõttu on see filter konfliktis filtriga \"{{int:rcfilters-filter-unregistered-label}}\".", + "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Filter \"{{int:rcfilters-filter-unregistered-label}}\" on konfliktis vähemalt ühe kogemustaseme filtriga, mis leiab ainult registreerunud kasutajaid. Konfliktsed filtrid on ära märgitud ülal aktiivsete filtrite loendis.", + "rcfilters-filter-user-experience-level-newcomer-label": "Äsjaalustanud", + "rcfilters-filter-user-experience-level-newcomer-description": "Alla 10 muudatuse või tegutsenud alla 4 päeva.", + "rcfilters-filter-user-experience-level-learner-label": "Tutvujad", + "rcfilters-filter-user-experience-level-learner-description": "Tegutsenud kauem ja teinud rohkem muudatusi kui äsjaalustanud, aga vähem kui kogenud kasutajad.", + "rcfilters-filter-user-experience-level-experienced-label": "Kogenud kasutajad", + "rcfilters-filter-user-experience-level-experienced-description": "Üle 500 muudatuse ja tegutsenud üle 30 päeva.", + "rcfilters-filtergroup-automated": "Automaatne kaastöö", + "rcfilters-filter-bots-label": "Robot", + "rcfilters-filter-bots-description": "Automaattööriistade tehtud muudatused.", + "rcfilters-filter-humans-label": "Pole robot", + "rcfilters-filter-humans-description": "Vahetult inimese tehtud muudatused.", + "rcfilters-filtergroup-reviewstatus": "Ülevaatuse seis", + "rcfilters-filter-patrolled-label": "Kontrollitud", + "rcfilters-filter-patrolled-description": "Kontrollituks märgitud muudatused.", + "rcfilters-filter-unpatrolled-label": "Kontrollimata", + "rcfilters-filter-unpatrolled-description": "Muudatused, mida pole märgitud kontrollituks.", + "rcfilters-filtergroup-significance": "Olulisus", + "rcfilters-filter-minor-label": "Pisimuudatused", + "rcfilters-filter-minor-description": "Muudatused, mille autor märkis pisimuudatuseks.", + "rcfilters-filter-major-label": "Pole pisimuudatused", + "rcfilters-filter-major-description": "Muudatused, mida pole märgitud pisimuudatuseks.", + "rcfilters-filtergroup-watchlist": "Jälgimisloendi leheküljed", + "rcfilters-filter-watchlist-watched-label": "Jälgimisloendis", + "rcfilters-filter-watchlist-watched-description": "Sinu jälgimisloendi lehekülgedel tehtud muudatused.", + "rcfilters-filter-watchlist-watchednew-label": "Jälgimisloendis (uued muudatused)", + "rcfilters-filter-watchlist-watchednew-description": "Muudatused jälgimisloendi lehekülgedel, mida sa pole pärast muudatuse tegemist külastanud.", + "rcfilters-filter-watchlist-notwatched-label": "Pole jälgimisloendis", + "rcfilters-filter-watchlist-notwatched-description": "Kõik muu peale sinu jälgimisloendi lehekülgedel tehtud muudatuste.", + "rcfilters-filtergroup-changetype": "Muudatuse tüüp", + "rcfilters-filter-pageedits-label": "Lehekülgede muutmised", + "rcfilters-filter-pageedits-description": "Näiteks viki sisu, arutelude ja kategooriate kirjelduste muutmine.", + "rcfilters-filter-newpages-label": "Lehekülgede alustamised", + "rcfilters-filter-newpages-description": "Muudatused, millega alustati uut lehekülge.", + "rcfilters-filter-categorization-label": "Kategooriamuudatused", + "rcfilters-filter-categorization-description": "Kirjed lehekülgede kategooriasse lisamise ja kategooriatest eemaldamise kohta.", + "rcfilters-filter-logactions-label": "Logitoimingud", + "rcfilters-filter-logactions-description": "Näiteks administraatoritoimingud, kontode loomine, lehekülgede kustutamine ja failide üleslaadimine.", + "rcfilters-hideminor-conflicts-typeofchange-global": "Filter \"{{int:rcfilters-filter-minor-label}}\" on konfliktis vähemalt ühe muudatuste tüübifiltriga, sest teatud tüüpi muudatusi ei saa märkida pisimuudatusteks. Konfliktsed filtrid on ära märgitud ülal aktiivsete filtrite loendis.", + "rcfilters-hideminor-conflicts-typeofchange": "Teatud tüüpi muudatusi ei saa märkida pisimuudatusteks. Seetõttu on see filter konfliktis järgmiste tüübifiltritega: $1", + "rcfilters-typeofchange-conflicts-hideminor": "See muudatuste tüübifilter on konfliktis filtriga \"{{int:rcfilters-filter-minor-label}}\". Teatud tüüpi muudatusi ei saa märkida pisimuudatusteks.", + "rcfilters-filtergroup-lastRevision": "Viimane redaktsioon", + "rcfilters-filter-lastrevision-label": "Viimane redaktsioon", + "rcfilters-filter-lastrevision-description": "Muudatus, mis on leheküljel kõige viimane.", + "rcfilters-filter-previousrevision-label": "Varasemad redaktsioonid", + "rcfilters-filter-previousrevision-description": "Kõik muudatused, mis pole leheküljel kõige viimased.", "rcnotefrom": "Allpool on toodud {{PLURAL:$5|muudatus|muudatused}} alates: $3, kell $4 (näidatakse kuni $1 muudatust)", + "rclistfromreset": "Lähtesta kuupäeva valik", "rclistfrom": "Näita muudatusi alates: $3, kell $2", "rcshowhideminor": "Pisiparandused ($1)", "rcshowhideminor-show": "näita", @@ -1405,7 +1483,7 @@ "copyuploaddisabled": "Internetiaadressilt üleslaadimine on keelatud.", "uploaddisabledtext": "Faili üleslaadimine on keelatud.", "php-uploaddisabledtext": "Failide üleslaadmine on PHP seadetes keelatud.\nPalun vaata file_uploads sätet.", - "uploadscripted": "See fail sisaldab HTML- või skriptikoodi, mida veebilehitseja võib valesti kuvada.", + "uploadscripted": "See fail sisaldab HTML- või skriptikoodi, mida brauser võib valesti kuvada.", "upload-scripted-pi-callback": "Üles ei saa laadida faili, mis sisaldab XML-laadilehe töötluskäsku.", "uploaded-script-svg": "Üleslaaditud SVG-failist leiti skriptitav element \"$1\".", "uploaded-hostile-svg": "Üleslaaditud SVG-faili laadielemendist leiti ebaturvaline CSS.", @@ -1783,8 +1861,11 @@ "booksources-text": "Allpool on linke teistele lehekülgedele, kus müüakse uusi ja kasutatud raamatuid. Lehekülgedel võib olla ka lisainfot raamatute kohta:", "booksources-invalid-isbn": "Antud ISBN-number ei ole korrektne; kontrolli algallikast kopeerides vigu.", "magiclink-tracking-rfc": "RFC-võlulingiga leheküljed", + "magiclink-tracking-rfc-desc": "Sellel leheküljel on RFC-võlulinke. Ülemineku kohta loe saidilt [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org].", "magiclink-tracking-pmid": "PMID-võlulingiga leheküljed", + "magiclink-tracking-pmid-desc": "Sellel leheküljel on PMID-võlulinke. Ülemineku kohta loe saidilt [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org].", "magiclink-tracking-isbn": "ISBN-võlulingiga leheküljed", + "magiclink-tracking-isbn-desc": "Sellel leheküljel on ISBN-võlulinke. Ülemineku kohta loe saidilt [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org].", "specialloguserlabel": "Täitja:", "speciallogtitlelabel": "Objekt (pealkiri või {{ns:user}}:kasutajanimi):", "log": "Logid", @@ -1894,13 +1975,13 @@ "emailtarget": "Saaja kasutajanime sisestamine", "emailusername": "Kasutajanimi:", "emailusernamesubmit": "Sobib", - "email-legend": "Saada e-kiri {{GRAMMAR:genitive|{{SITENAME}}}} kasutajale", + "email-legend": "E-kirja saatmine teisele {{GRAMMAR:genitive|{{SITENAME}}}} kasutajale", "emailfrom": "Kellelt:", "emailto": "Kellele:", "emailsubject": "Teema:", "emailmessage": "Sõnum:", "emailsend": "Saada", - "emailccme": "Saada mulle koopia.", + "emailccme": "Saada mulle selle e-kirja koopia", "emailccsubject": "Koopia sinu sõnumist kasutajale $1: $2", "emailsent": "E-kiri saadetud", "emailsenttext": "Sinu teade on e-kirjaga saadetud.", @@ -3064,8 +3145,8 @@ "confirmemail_success": "Sinu e-posti aadress on kinnitatud\nVõid nüüd [[Special:UserLogin|sisse logida]].", "confirmemail_loggedin": "Sinu e-posti aadress on nüüd kinnitatud.", "confirmemail_subject": "{{GRAMMAR:genitive|{{SITENAME}}}} e-posti aadressi kinnitamine", - "confirmemail_body": "Keegi IP-aadressilt $1, ilmselt sa ise, registreeris selle e-posti aadressiga {{GRAMMAR:inessive|{{SITENAME}}}} konto \"$2\".\n\nKinnitamaks, et kasutajakonto tõepoolest kuulub sulle ning et aktiveerida e-posti teenused, ava veebilehitsejas järgmine link:\n\n$3\n\nKui sa *pole* kontot registreerinud, ava järgmine link kinnituse tühistamiseks:\n\n$5\n\nKinnituskoodi aegumistähtaeg: $4.", - "confirmemail_body_changed": "Keegi IP-aadressilt $1, ilmselt sa ise,\nmuutis {{GRAMMAR:inessive|{{SITENAME}}}} konto \"$2\" e-posti aadressiks selle aadressi.\n\nKinnitamaks, et see konto tõepoolest kuulub sulle ja e-posti teenuste taasaktiveerimiseks, ava oma veebilehitsejas järgmine link:\n\n$3\n\nKui see *pole* sinu konto, ava järgmine link\nkinnituse tühistamiseks:\n\n$5\n\nKinnituskood aegub kuupäeval $4.", + "confirmemail_body": "Keegi IP-aadressilt $1, ilmselt sa ise,\nregistreeris selle e-posti aadressiga {{GRAMMAR:inessive|{{SITENAME}}}} konto \"$2\".\n\nKinnitamaks, et kasutajakonto tõepoolest kuulub sulle ning et aktiveerida e-posti teenused, ava brauseris järgmine link:\n\n$3\n\nKui sa *pole* kontot registreerinud, ava järgmine link,\net e-posti aadressi kinnitus tühistada:\n\n$5\n\nKinnituskoodi aegumistähtaeg: $4.", + "confirmemail_body_changed": "Keegi IP-aadressilt $1, ilmselt sa ise,\nmuutis {{GRAMMAR:inessive|{{SITENAME}}}} konto \"$2\" e-posti aadressiks selle aadressi.\n\nKinnitamaks, et see konto tõepoolest kuulub sulle ja et e-posti teenused taasaktiveerida, ava brauseris järgmine link:\n\n$3\n\nKui see *pole* sinu konto, ava järgmine link,\net kinnitus tühistada:\n\n$5\n\nKinnituskood aegub kuupäeval $4.", "confirmemail_body_set": "Keegi IP-aadressilt $1, arvatavasti sina ise, on {{GRAMMAR:genitive|{{SITENAME}}}} konto \"$2\" e-posti aadressiks määranud selle aadressi.\n\nKinnitamaks, et see konto kuulub tõesti sulle ja et aktiveerida e-posti teenused, ava võrgulehitsejas järgmine link:\n\n$3\n\nKui konto *ei* kuulu sulle, kasuta e-posti aadressi kinnituse tühistamiseks järgmist linki:\n\n$5\n\nSelle kinnituskoodi aegumistähtaeg on $4.", "confirmemail_invalidated": "E-posti aadressi kinnitamine tühistati", "invalidateemail": "E-posti aadressi kinnituse tühistamine", @@ -3081,6 +3162,7 @@ "confirmrecreate": "Kasutaja [[User:$1|$1]] ([[User talk:$1|arutelu]]) kustutas lehekülje sellel ajal, kui sina seda redigeerisid. Põhjus:\n: ''$2''\nPalun kinnita, et soovid tõesti selle lehekülje taasluua.", "confirmrecreate-noreason": "Kasutaja [[User:$1|$1]] ([[User talk:$1|arutelu]]) kustutas selle lehekülje, pärast seda kui redigeerimist alustasid. Palun kinnita, et tahad tõesti selle lehekülje uuesti luua.", "recreate": "Loo uuesti", + "confirm-purge-title": "Lehekülje vahemälu tühjendamine", "confirm_purge_button": "Sobib", "confirm-purge-top": "Tühjenda selle lehekülje vahemälu?", "confirm-purge-bottom": "Toiming puhastab lehekülje vahemälu ja kuvab uusima versiooni.", @@ -3387,6 +3469,7 @@ "logentry-delete-delete": "$1 {{GENDER:$2|kustutas}} lehekülje $3", "logentry-delete-delete_redir": "$1 {{GENDER:$2|kustutas}} ülekirjutamise teel ümbersuunamise $3", "logentry-delete-restore": "$1 {{GENDER:$2|taastas}} lehekülje $3 ($4)", + "logentry-delete-restore-nocount": "$1 {{GENDER:$2|taastas}} lehekülje $3", "restore-count-revisions": "{{PLURAL:$1|üks redaktsioon|$1 redaktsiooni}}", "restore-count-files": "{{PLURAL:$1|üks fail|$1 faili}}", "logentry-delete-event": "$1 {{GENDER:$2|muutis}} leheküljel $3 {{PLURAL:$5|ühe|$5}} logisündmuse nähtavust: $4", @@ -3472,7 +3555,7 @@ "feedback-message": "Sõnum:", "feedback-subject": "Teema:", "feedback-submit": "Saada", - "feedback-terms": "Mõistan, et minu kasutajaagendi andmed sisaldavad teavet minu veebilehitseja ja operatsioonisüsteemi täpse versiooni kohta ning need andmed tehakse minu tagasiside juures avalikuks.", + "feedback-terms": "Mõistan, et minu kasutajaagendi andmed sisaldavad teavet minu brauseri ja operatsioonisüsteemi täpse versiooni kohta ning need andmed tehakse minu tagasiside juures avalikuks.", "feedback-termsofuse": "Olen nõus andma tagasisidet vastavalt kasutustingimustele.", "feedback-thanks": "Aitäh! Sinu tagasiside on postitatud leheküljele \"[$2 $1]\".", "feedback-thanks-title": "Aitäh!", @@ -3595,6 +3678,7 @@ "special-characters-group-thai": "Tai", "special-characters-group-lao": "Lao", "special-characters-group-khmer": "Khmeeri", + "special-characters-group-canadianaboriginal": "Silpmärgid (Kanada)", "special-characters-title-endash": "mõttekriips", "special-characters-title-emdash": "pikk mõttekriips", "special-characters-title-minus": "miinusmärk", diff --git a/languages/i18n/eu.json b/languages/i18n/eu.json index ff2223fe2c..942e935bf4 100644 --- a/languages/i18n/eu.json +++ b/languages/i18n/eu.json @@ -1331,6 +1331,7 @@ "uploaddisabledtext": "Fitxategiak igotzea ezgaituta dago.", "php-uploaddisabledtext": "Fitxategi igoerak PHP-n ezinduta daude. Ikusi fitxategi_igoerak mesedez.", "uploadscripted": "Fitxategi honek web zerbitzariak modu ezegokian interpretatu lezakeen HTML edo script kodea dauka.", + "uploadinvalidxml": "Ezin izan da analizatu XMLa igotako fitxategian.", "uploadvirus": "Fitxategiak birusa dauka! Xehetasunak: $1", "uploadjava": "Fitxategia ZIP bat da eta Java .class fitxategi bat du.\nJava fitxategiak igotzea ez dago baimendua, segurtasun muga batzuk hausteko aukera ematen duelako.", "upload-source": "Jatorrizko fitxategia", @@ -1633,10 +1634,12 @@ "apihelp": "API laguntza", "apihelp-no-such-module": "Ez da \"$1\" modulua aurkitu.", "apisandbox": "API proba orria", + "apisandbox-fullscreen": "Zabaldu panela", "apisandbox-unfullscreen": "Erakutsi orria", "apisandbox-submit": "Egin eskaera", "apisandbox-reset": "Garbitu", "apisandbox-retry": "Saiatu berriro", + "apisandbox-no-parameters": "API modulu honek ez du parametrorik.", "apisandbox-helpurls": "Laguntza estekak", "apisandbox-examples": "Adibideak", "apisandbox-dynamic-parameters": "Parametro gehigarriak", @@ -1648,11 +1651,15 @@ "apisandbox-loading-results": "APIaren emaitzak jasotzen...", "apisandbox-continue": "Jarraitu", "apisandbox-continue-clear": "Garbitu", + "apisandbox-multivalue-all-values": "$1 (balio guztiak)", "booksources": "Iturri liburuak", "booksources-search-legend": "Liburuen bilaketa", "booksources-search": "Bilatu", "booksources-text": "Jarraian liburu berri eta erabiliak saltzen dituzten guneetarako loturen zerrenda bat ikus dezakezu, bilatzen ari zaren liburu horientzako informazio gehigarria aurkitzeko lagungarria izan daitekeena:", "booksources-invalid-isbn": "Badirudi emandako ISBNa ez dela baliagarria; egiazta ezazu ea akatsik egin duzun jatorrizko iturritik kopiatzean.", + "magiclink-tracking-rfc": "RFC lotura magikoak dituzten orrialdeak", + "magiclink-tracking-pmid": "PMID lotura magikoak dituzten orrialdeak", + "magiclink-tracking-isbn": "ISBN lotura magikoak dituzten orrialdeak", "specialloguserlabel": "Egilea:", "speciallogtitlelabel": "Helburua (izenburua edo {{ns:user}}: lankidea):", "log": "Erregistroak", @@ -1665,6 +1672,7 @@ "checkbox-select": "Aukeratu:$1", "checkbox-all": "Denak", "checkbox-none": "Bat ere ez", + "checkbox-invert": "Alderantzikatu", "allpages": "Orri guztiak", "nextpage": "Hurrengo orrialdea ($1)", "prevpage": "Aurreko orrialdea ($1)", @@ -2182,6 +2190,7 @@ "export-download": "Gorde fitxategitzat", "export-templates": "Txantiloiak barneratu", "export-pagelinks": "Sartu lotutako orriak honako sakoneran:", + "export-manual": "Gehitu orrialdeak eskuz:", "allmessages": "Sistemako mezu guztiak", "allmessagesname": "Izena", "allmessagesdefault": "Testu lehenetsia", @@ -2360,7 +2369,9 @@ "pageinfo-length": "Orriaren neurria (byteak)", "pageinfo-article-id": "Orriaren identifikazio zenbakia", "pageinfo-language": "Orriaren edukiaren hizkuntza", + "pageinfo-language-change": "aldatu", "pageinfo-content-model": "Orrialde edukiaren eredua", + "pageinfo-content-model-change": "aldatu", "pageinfo-robot-policy": "Errobotak indexatzea egiten", "pageinfo-robot-index": "Baimendua", "pageinfo-robot-noindex": "Debekatua", @@ -3021,6 +3032,7 @@ "tags-active-yes": "Bai", "tags-active-no": "Ez", "tags-source-extension": "Softwareak definitua", + "tags-source-manual": "Erabiltzaileek eta botek eskuz ezarrita", "tags-source-none": "Ez da gehiago erabiltzen", "tags-edit": "aldatu", "tags-delete": "ezabatu", @@ -3060,6 +3072,8 @@ "tags-edit-remove-all-tags": "(kendu etiketa guztiak)", "tags-edit-chosen-placeholder": "Hautatu etiketa batzuk", "tags-edit-reason": "Arrazoia:", + "tags-edit-success": "Aldaketak ezarri dira.", + "tags-edit-failure": "Ezin izan dira aldaketak ezarri:\n$1", "comparepages": "Orrialdeak alderatu", "compare-page1": "1. orrialdea", "compare-page2": "2. orrialdea", @@ -3120,6 +3134,7 @@ "logentry-block-reblock": "$1 administratzaileak {{GENDER:$4|$3}} wikilariaren blokeoa {{GENDER:$2|aldatu du}}. Blokeoaldia: $5 $6", "logentry-suppress-block": "$1 {{GENDER:$2|administratzaileak}} {{GENDER:$4|$3}} blokeatu du. Iraupena: $5 $6", "logentry-suppress-reblock": "$1 administratzaileak {{GENDER:$4|$3}} wikilariaren blokeoa {{GENDER:$2|aldatu du}}. Blokeoaldia: $5 $6", + "logentry-import-upload": "$1(e)k $3 {{GENDER:$2|inportatu du}} fitxategi-igoera bidez", "logentry-move-move": "$1 {{GENDER:$2|wikilariak}} «$3» orria «$4» izenera aldatu du", "logentry-move-move-noredirect": "$1 {{GENDER:$2|wikilariak}} «$3» orria «$4» izenera aldatu du, birzuzenketarik utzi gabe", "logentry-move-move_redir": "$1 {{GENDER:$2|wikilariak}} «$3» orria «$4» izenera aldatu du, birzuzenketaren gainetik", @@ -3131,6 +3146,8 @@ "logentry-newusers-byemail": "$1(e)k $3 erabiltzaile kontua {{GENDER:$2|sortu du}} eta pasahitza emailez bidali da", "logentry-newusers-autocreate": "$1 erabiltzaile kontua automatikoki {{GENDER:$2|sortu da}}", "logentry-upload-upload": "$1(e)k $3 {{GENDER:$2|igo du}}", + "logentry-upload-overwrite": "$1(e)k $3(r)en bertsio berria {{GENDER:$2|igo du}}", + "logentry-upload-revert": "$1(e)k $3 {{GENDER:$2|igo du}}", "logentry-managetags-create": "$1 lankideak \"$4\" etiketa {{GENDER:$2|sortu du}}", "log-name-tag": "Etiketen erregistroa", "rightsnone": "(bat ere ez)", @@ -3271,6 +3288,8 @@ "log-action-filter-managetags-delete": "Etiketa ezabaketa", "log-action-filter-managetags-activate": "Etiketa aktibazioa", "log-action-filter-managetags-deactivate": "Etiketa desaktibazioa", + "log-action-filter-newusers-autocreate": "Sorrera automatikoa", + "log-action-filter-protect-protect": "Babesa", "log-action-filter-rights-rights": "Eskuzko aldaketa", "log-action-filter-rights-autopromote": "Aldaketa automatikoa", "log-action-filter-upload-upload": "Igoera berria", diff --git a/languages/i18n/fi.json b/languages/i18n/fi.json index 5db211e186..b855c2e96c 100644 --- a/languages/i18n/fi.json +++ b/languages/i18n/fi.json @@ -3561,7 +3561,7 @@ "logentry-import-upload": "$1 {{GENDER:$2|on tuonut}} kohteen $3 tiedostotallennuksella", "logentry-import-upload-details": "$1 {{GENDER:$2|on tuonut}} kohteen $3 tiedostotallennuksella ($4 {{PLURAL:$4|versio|versiota}})", "logentry-import-interwiki": "$1 {{GENDER:$2|on tuonut}} kohteen $3 muusta wikistä", - "logentry-import-interwiki-details": "$1 {{GENDER:$2|on tuonut}} kohteen $3 paikasta $5 ($4 {{PLURAL:$4|versio|versioita}})", + "logentry-import-interwiki-details": "$1 {{GENDER:$2|on tuonut}} kohteen $3 paikasta $5 ($4 {{PLURAL:$4|versio|versiota}})", "logentry-merge-merge": "$1 {{GENDER:$2|yhdisti}} sivun $3 sivuun $4 (versiot $5 saakka)", "logentry-move-move": "$1 {{GENDER:$2|siirsi}} sivun $3 uudelle nimelle $4", "logentry-move-move-noredirect": "$1 {{GENDER:$2|siirsi}} sivun $3 uudelle nimelle $4 luomatta ohjausta", diff --git a/languages/i18n/fr.json b/languages/i18n/fr.json index 95c714752a..6e8d3d4602 100644 --- a/languages/i18n/fr.json +++ b/languages/i18n/fr.json @@ -781,7 +781,7 @@ "anoneditwarning": "Attention : vous n’êtes pas connecté. Votre adresse IP sera visible de tout le monde si vous faites des modifications. Si vous [$1 vous connectez] ou [$2 créez un compte], vos modifications seront attribuées à votre nom d’utilisateur, avec d'autres avantages.", "anonpreviewwarning": "Vous n’êtes pas connecté{{GENDER:||e}}. Sauvegarder enregistrera votre adresse IP dans l’historique des modifications de la page.", "missingsummary": "Rappel : vous n’avez pas encore fourni le résumé de votre modification.\nSi vous cliquez de nouveau sur le bouton « $1 », vos modifications seront sauvegardées sans résumé.", - "selfredirect": "Attention : vous êtes en train de rediriger la page vers elle-même.\nVous pouvez avoir spécifié la mauvaise cible pour la redirection, ou vous modifiez peut-être la mauvaise page.\nSi vous cliquez de nouveau sur « $1 », la redirection sera tout de même créée.", + "selfredirect": "Attention : vous êtes en train de rediriger la page vers elle-même.\nIl se peut que vous ayez spécifié la mauvaise cible pour la redirection, ou que vous modifiez peut-être la mauvaise page.\nSi vous cliquez de nouveau sur « $1 », la redirection sera tout de même créée.", "missingcommenttext": "Veuillez entrer un commentaire ci-dessous.", "missingcommentheader": "Rappel : vous n’avez pas fourni de sujet pour ce commentaire.\nSi vous cliquez de nouveau sur « {{int:Savearticle}} », votre modification sera enregistrée sans sujet.", "summary-preview": "Aperçu du résumé de modification :", diff --git a/languages/i18n/gl.json b/languages/i18n/gl.json index c07cf17b0c..b9e588eeeb 100644 --- a/languages/i18n/gl.json +++ b/languages/i18n/gl.json @@ -1381,6 +1381,10 @@ "rcfilters-filtergroup-watchlist": "Páxinas vixiadas", "rcfilters-filter-watchlist-watched-label": "Na lista de vixilancia", "rcfilters-filter-watchlist-watched-description": "Cambios a páxinas na súa lista de vixilancia.", + "rcfilters-filter-watchlist-watchednew-label": "Cambios novos na súa lista de vixilancia", + "rcfilters-filter-watchlist-watchednew-description": "Cambios nas páxinas da súa lista de vixilancia que non visitou dende que se produciron os cambios.", + "rcfilters-filter-watchlist-notwatched-label": "Ausente da lista de vixilancia", + "rcfilters-filter-watchlist-notwatched-description": "Todos, excepto os cambios nas páxinas da súa lista de vixilancia.", "rcfilters-filtergroup-changetype": "Tipo de cambio", "rcfilters-filter-pageedits-label": "Edicións de páxinas", "rcfilters-filter-pageedits-description": "Edicións do contido da wiki, de conversas, de descricións de categorías...", @@ -1397,6 +1401,7 @@ "rcfilters-filter-lastrevision-label": "Versión actual", "rcfilters-filter-lastrevision-description": "A última modificación a unha páxina.", "rcfilters-filter-previousrevision-label": "Versións anteriores", + "rcfilters-filter-previousrevision-description": "Tódolos cambios realizados nunha páxina e que non son os máis recentes.", "rcnotefrom": "A continuación {{PLURAL:$5|móstrase o cambio feito|móstranse os cambios feitos}} desde o $3 ás $4 (móstranse $1 como máximo).", "rclistfromreset": "Reinicializar a selección da data", "rclistfrom": "Mostrar os cambios novos desde o $3 ás $2", diff --git a/languages/i18n/he.json b/languages/i18n/he.json index 9037de1e24..30d040e995 100644 --- a/languages/i18n/he.json +++ b/languages/i18n/he.json @@ -1358,7 +1358,7 @@ "rcfilters-filter-user-experience-level-newcomer-label": "חדשים", "rcfilters-filter-user-experience-level-newcomer-description": "פחות מ־10 עריכות ומ־4 ימים של פעילות.", "rcfilters-filter-user-experience-level-learner-label": "לומדים", - "rcfilters-filter-user-experience-level-learner-description": "יותר ימי פעילות ועריכות מ\"חדשים\", אבל פחות מ\"משתמשים מנוסים\".", + "rcfilters-filter-user-experience-level-learner-description": "יותר ניסיון מ\"חדשים\", אבל פחות מ\"משתמשים מנוסים\".", "rcfilters-filter-user-experience-level-experienced-label": "משתמשים מנוסים", "rcfilters-filter-user-experience-level-experienced-description": "יותר מ־30 ימים של פעילות ו־500 עריכות.", "rcfilters-filtergroup-automated": "תרומות אוטומטיות", @@ -1945,7 +1945,7 @@ "log": "יומנים", "logeventslist-submit": "הצגה", "all-logs-page": "כל היומנים הציבוריים", - "alllogstext": "זוהי תצוגה משולבת של כל סוגי היומנים הזמינים ב{{grammar:תחילית|{{SITENAME}}}}.\nניתן לצמצם את התצוגה על ידי בחירת סוג היומן, שם המשתמש (תלוי רישיות) או הדף המושפע (גם כן תלוי רישיות).", + "alllogstext": "זוהי תצוגה משולבת של כל סוגי היומנים הזמינים ב{{grammar:תחילית|{{SITENAME}}}}.\nניתן לצמצם את התצוגה על־ידי בחירת סוג היומן, שם המשתמש (תלוי רישיות) או הדף המושפע (גם כן תלוי רישיות).", "logempty": "אין פריטים תואמים ביומן.", "log-title-wildcard": "חיפוש כותרות המתחילות באותיות אלה", "showhideselectedlogentries": "שינוי מצב התצוגה של פעולות היומן שנבחרו", diff --git a/languages/i18n/hi.json b/languages/i18n/hi.json index 78927a8405..0146cf1bd4 100644 --- a/languages/i18n/hi.json +++ b/languages/i18n/hi.json @@ -605,7 +605,7 @@ "botpasswords-label-delete": "हटाएँ", "botpasswords-label-resetpassword": "पासवर्ड पुनः तय करें", "botpasswords-label-grants": "अनुदान आवेदन:", - "botpasswords-help-grants": "हर अनुदान जो सदस्य अधिकार में पहले से आता है, उसे अधिकार तक पहुँच देता है। देखें : [[Special:ListGrants|अनुदान सारणी]]", + "botpasswords-help-grants": "अनुदान आपको अधिकारों तक पहुँचने देता है, जो आपके खाते के पास पहले से है। अनुदान को सक्रिय करने से कोई अधिकार प्राप्त नहीं होगा, जो आपके खाते में न हो। अधिक जानकारी के लिए [[Special:ListGrants|अनुदान सारणी]] देखें।", "botpasswords-label-grants-column": "प्रदान किया", "botpasswords-bad-appid": "बॉट नाम \"$1\" मान्य नहीं है।", "botpasswords-insert-failed": "बॉट नाम \"$1\" को जोड़ने में विफल हुआ। क्या यह पहले से है?", @@ -616,7 +616,7 @@ "botpasswords-updated-body": "सदस्य \"$2\" के बॉट नाम \"$1\" का पासवर्ड सफलतापूर्वक अद्यतन हुआ।", "botpasswords-deleted-title": "बॉट पासवर्ड हट गया", "botpasswords-deleted-body": "सदस्य \"$2\" के बॉट नाम \"$1\" का पासवर्ड हट गया।", - "botpasswords-newpassword": "आपका नया पासवर्ड आपके प्रवेश $1 के साथ $2 है। भविष्य में उपयोग करने हेतु इसे याद रखें", + "botpasswords-newpassword": "$1 के साथ लॉगिन करने के लिए आपका नया पासवर्ड $2 है। भविष्य के लिए इसे याद रखें
(पुराने बॉट के लिए लॉगिन नाम और बॉट का सदस्य नाम समान चाहिए होता है, तो आप $3 का उपयोग अपने सदस्य नाम के रूप में और $4 का उपयोग अपने पासवर्ड के रूप में कर सकते हैं।)", "botpasswords-no-provider": "BotPasswordsSessionProvider उपलब्ध नहीं है।", "botpasswords-restriction-failed": "इस प्रवेश में बॉट पासवर्ड रुकावट डाल रहा है।", "botpasswords-invalid-name": "जो सदस्य नाम आप बता रहे हो, उसमें बॉट पासवर्ड अलग करने वाला (\"$1\") नहीं है।", @@ -701,10 +701,10 @@ "preview": "झलक", "showpreview": "झलक दिखाएँ", "showdiff": "बदलाव दिखाएँ", - "blankarticle": "चेतावनी: आप एक रिक्त पृष्ठ का निर्माण कर रहे हैं।\nयदि आप \"$1\" को पुनः दबाते हैं तो पृष्ठ को बिना किसी सामग्री के निर्मित किया जाएगा।", + "blankarticle": "चेतावनी: आप एक रिक्त पृष्ठ का निर्माण कर रहे हैं।\nयदि आप \"$1\" को फिर से दबाते हैं तो बिना सामग्री का पृष्ठ निर्मित हो जाएगा।", "anoneditwarning": "सावधान: आपने सत्रारंभ नहीं किया है। यदि आप सम्पादन करते हैं तो इस पृष्ठ के संपादन इतिहास में आपका आइ॰पी पता अंकित किया जाएगा। यदि आप [$1 लॉगिन] करते हैं अथवा [$2 खाता बनाते हैं] तो अन्य सुविधाओं के साथ-साथ आपके संपादनों का श्रेय आपके सदस्यनाम पर दिया जाएगा।", "anonpreviewwarning": "''आप लॉग्ड इन नहीं हैं। पृष्ठ सहेजने पर आपका आइ॰पी पता इस पृष्ठ के इतिहास में दर्ज किया जायेगा।''", - "missingsummary": "'''अनुस्मारक:''' आपने संपादन सारांश नहीं दिया है।\nअगर आप दुबारा \"$1\" पर क्लिक करते हैं तो आपका संपादन बिना सारांश के संजोया जायेगा।", + "missingsummary": "'''सूचना:''' आपने संपादन सारांश नहीं दिया है।\nअगर आप दुबारा \"$1\" पर क्लिक करते हैं तो आपका संपादन बिना सारांश के सहेजा जायेगा।", "selfredirect": "चेतावनी: आप खुद को इस पेज पुनः निर्देशित कर रहे हैं।\nआप अनुप्रेषित के लिए गलत लक्ष्य निर्दिष्ट हो सकता है, या आप गलत पृष्ठ का संपादन किया जा सकता है।\nआप फिर से \"$1\" क्लिक करते हैं, रीडायरेक्ट वैसे भी बनाया जाएगा।", "missingcommenttext": "कृपया नीचे टिप्पणी दें।", "missingcommentheader": "'''अनुस्मारक:''' आपने इस टिप्पणी का कोई शीर्षक नहीं दिया है।\nअगर आप \"$1\" पर दोबारा क्लिक करते हैं तो आपके बदलाव बिना शीर्षक के संजोये जायेंगे।", @@ -769,7 +769,7 @@ "readonlywarning": "सावधान: डाटाबेस को रख-रखाव के लिये बंद कर दिया गया है, इसलिये अभी आपके बदलाव संजोए नहीं जा सकते।\nअगर आप चाहें तो इस सामग्री को बाद के लिए कॉपी-पेस्ट कर के किसी टेक्स्ट फ़ाइल में रख सकते हैं।\n\nबंद करने वाले कार्यकारी प्रबंधक ने बंद करने का यह कारण दिया है: $1", "protectedpagewarning": "'''चेतावनी: इस पृष्ठ को सुरक्षित कर दिया गया है और इसे केवल प्रबंधक ही सम्पादित कर सकते हैं।'''\nनवीनतम लॉग प्रविष्टि संदर्भ के लिये नीचे दी है:", "semiprotectedpagewarning": "'''सूचना:''' यह पृष्ठ सुरक्षित कर दिया गया है और इसे केवल पंजीकृत सदस्य ही सम्पादित कर सकते हैं।\nनवीनतम लॉग प्रविष्टि संदर्भ के लिये नीचे दी है:", - "cascadeprotectedwarning": "'''सावधान:''' यह पृष्ठ निम्नलिखित सुरक्षा-सीढ़ी {{PLURAL:$1|पृष्ठ से|पन्नों से}} जुड़ा हुआ होने के कारण सुरक्षित है, और केवल प्रबंधक ही इसमें बदलाव कर सकते हैं:", + "cascadeprotectedwarning": "सावधान: यह पृष्ठ निम्नलिखित सुरक्षा-सीढ़ी वाले {{PLURAL:$1|पृष्ठ से|पन्नों से}} जुड़ा हुआ होने के कारण सुरक्षित है, और केवल [[Special:ListGroupRights|आवश्यक अधिकार वाले]] ही इसमें बदलाव कर सकते हैं:", "titleprotectedwarning": "'''चेतावनी: यह पृष्ठ सुरक्षित है और इसे बनाने के लिये [[Special:ListGroupRights|विशेष अधिकारों]] की आवश्यकता है।'''\nनवीनतम लॉग प्रविष्टि संदर्भ के लिये नीचे दी है:", "templatesused": "इस पृष्ठ पर प्रयुक्त {{PLURAL:$1|साँचा|साँचे}}:", "templatesusedpreview": "इस झलक में प्रयुक्त {{PLURAL:$1|साँचा|साँचे}}:", @@ -1173,7 +1173,7 @@ "userrights-expiry-options": "एक दिन:1 day,एक सप्ताह:1 week,एक महीना:1 month,तीन महीने:3 months,छः महीने:6 months,एक वर्ष:1 year", "userrights-invalid-expiry": "\"$1\" समूह के लिए समाप्ती तिथि अमान्य है।", "userrights-expiry-in-past": "\"$1\" समूह हेतु समाप्ती का समय पहले ही बीत चुका है।", - "userrights-cannot-shorten-expiry": "आप \"$1\" समूह की समाप्ति को आगे नहीं बढ़ा सकते हैं। केवल इस समूह को जोड़ने और निकालने की अनुमति वाले उपयोगकर्ता आगे समाप्ति समय ला सकते हैं।", + "userrights-cannot-shorten-expiry": "आप \"$1\" समूह की समाप्ति को आगे नहीं बढ़ा सकते हैं। केवल इस समूह में जोड़ने और निकालने की अनुमति वाले सदस्य ही समाप्ति समय को आगे बढ़ा सकते हैं।", "userrights-conflict": "सदस्य अधिकार बदलावों में अंतर्विरोध! कृपया अपने बदलाव जाँचें और पुनः सुनिश्चित करें।", "group": "समूह:", "group-user": "सदस्य", @@ -1393,16 +1393,19 @@ "rcfilters-filter-registered-description": "लॉग-इन संपादक।", "rcfilters-filter-unregistered-label": "अपंजीकृत", "rcfilters-filter-unregistered-description": "संपादक जो लॉग इन नहीं हैं।", - "rcfilters-filtergroup-authorship": "लेखकों को संपादित करें", + "rcfilters-filter-unregistered-conflicts-user-experience-level": "यह फ़िल्टर निम्न {{PLURAL:$2|फ़िल्टर}} के साथ संघर्ष करता है, जो केवल पंजीकृत सदस्यों को ही {{PLURAL:$2|ढूंढ}} रहा है: $1", + "rcfilters-filtergroup-authorship": "लेखक योगदान", "rcfilters-filter-editsbyself-label": "आपके द्वारा बदलाव", "rcfilters-filter-editsbyself-description": "आपके अपने योगदान।", "rcfilters-filter-editsbyother-label": "दूसरों के द्वारा बदलाव", "rcfilters-filter-editsbyother-description": "आपके बदलावों को छोड़ कर सभी के बदलाव।", "rcfilters-filtergroup-userExpLevel": "अनुभव स्तर (केवल पंजीकृत सदस्यों के लिए)", "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "अनुभव फ़िल्टर केवल पंजीकृत उपयोगकर्ता पाते हैं इसलिए यह फ़िल्टर \"अपंजीकृत\" फ़िल्टर के साथ संघर्ष करता है।", + "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "\"अपंजीकृत\" फ़िल्टर एक या अधिक अनुभव फिल्टर के साथ संघर्ष करता है, जो केवल पंजीकृत उपयोगकर्ता ढूंढते हैं परस्पर विरोधी फिल्टर ऊपर सक्रिय फिल्टर क्षेत्र में चिह्नित हैं।", "rcfilters-filter-user-experience-level-newcomer-label": "अपरिचित", "rcfilters-filter-user-experience-level-newcomer-description": "4 दिनों की गतिविधि और 10 सम्पादन से कम।", "rcfilters-filter-user-experience-level-learner-label": "शिक्षार्थियों", + "rcfilters-filter-user-experience-level-learner-description": "\"नवागंतुकों\" की तुलना में गतिविधि और संपादन के अधिक दिन, लेकिन \"अनुभवी उपयोगकर्ताओं\" से कम।", "rcfilters-filter-user-experience-level-experienced-label": "अनुभवी सदस्य", "rcfilters-filter-user-experience-level-experienced-description": "30 दिन से अधिक गतिविधि और 500 सम्पादन।", "rcfilters-filtergroup-automated": "स्वचालित योगदान", @@ -1420,6 +1423,13 @@ "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-notwatched-label": "ध्यानसूची में नहीं", + "rcfilters-filter-watchlist-notwatched-description": "आपके ध्यानसूची पृष्ठों में परिवर्तन के अलावा सब कुछ", "rcfilters-filtergroup-changetype": "बदलाव के प्रकार:", "rcfilters-filter-pageedits-label": "पृष्ठ संपादन", "rcfilters-filter-pageedits-description": "विकि सामग्री, चर्चा, श्रेणी विवरणों के संपादन ....", @@ -1429,7 +1439,16 @@ "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-filter-lastrevision-description": "पृष्ठ का सबसे हाल में हुआ बदलाव", + "rcfilters-filter-previousrevision-label": "पहले के अवतरण", + "rcfilters-filter-previousrevision-description": "सभी परिवर्तन जो एक पृष्ठ में सबसे हाल के परिवर्तन नहीं हैं।", "rcnotefrom": "नीचे $2 के बाद से ($1 तक) {{PLURAL:$5|हुआ बदलाव दर्शाया गया है|हुए बदलाव दर्शाए गये हैं}}।", + "rclistfromreset": "चुने दिनांक पहले जैसा करें", "rclistfrom": "$3 $2 से नये बदलाव दिखाएँ", "rcshowhideminor": "छोटे बदलाव $1", "rcshowhideminor-show": "दिखाएँ", @@ -1476,9 +1495,9 @@ "recentchangeslinked-page": "पृष्ठ नाम:", "recentchangeslinked-to": "इसके बदले में दिये हुए पृष्ठसे जुडे पन्नोंके बदलाव दर्शायें", "recentchanges-page-added-to-category": "[[:$1]] श्रेणी में जुड़ा", - "recentchanges-page-added-to-category-bundled": "[[:$1]] और [[Special:WhatLinksHere/$1|{{PLURAL:$2|एक पृष्ठ|$2 पृष्ठ}}]] श्रेणी में जुड़ा", + "recentchanges-page-added-to-category-bundled": "[[:$1]] श्रेणी में जोड़ा गया, [[Special:WhatLinksHere/$1|यह पेज अन्य पृष्ठों में शामिल है]]", "recentchanges-page-removed-from-category": "[[:$1]] श्रेणी से हटा", - "recentchanges-page-removed-from-category-bundled": "[[:$1]] और [[Special:WhatLinksHere/$1|{{PLURAL:$2|एक पृष्ठ|$2 पृष्ठ}}]] श्रेणी से हटा", + "recentchanges-page-removed-from-category-bundled": "[[:$1]] श्रेणी से हटाया गया, [[Special:WhatLinksHere/$1|यह पेज अन्य पृष्ठों में शामिल है]]", "autochange-username": "मीडियाविकि स्वतः परिवर्तन", "upload": "फ़ाइल अपलोड करें", "uploadbtn": "फ़ाइल अपलोड करें", @@ -1536,6 +1555,8 @@ "file-thumbnail-no": "इस फ़ाइल का नाम $1 से शुरू हो रहा है।\nयह आकार घटाई हुई ''(अंगूठाकार)'' हो सकती है।\nअगर यह चित्र अपने मूल आकार में है तो इसे अपलोड करें, नहीं तो फ़ाइल बदलें।", "fileexists-forbidden": "इस नाम की फ़ाइल पहले ही मौजूद है, और इसकी जगह और नहीं अपलोड की जा सकती।\nयदि आप इस फ़ाइल को फिर भी अपलोड करना चाहते हैं, तो कृपया वापस जा के इसके लिए कोई अन्य नाम चुनें।\n[[File:$1|thumb|center|$1]]", "fileexists-shared-forbidden": "इस नाम की फ़ाइल साझे फ़ाइल भंडार में पहले ही मौजूद है।\nयदि आप इस फ़ाइल को फिर भी अपलोड करना चाहते हैं, तो कृपया वापस जा के इसके लिए कोई अन्य नाम चुनें।\n[[File:$1|thumb|center|$1]]", + "fileexists-no-change": "अपलोड [[:$1]] के वर्तमान संस्करण का सटीक प्रतिलिपि है।", + "fileexists-duplicate-version": "अपलोड [[:$1]] के {{PLURAL:$2|पुराने संस्करणों}} का सटीक प्रतिलिपि है", "file-exists-duplicate": "यह फ़ाइल निम्नलिखित {{PLURAL:$1|फ़ाइल|फ़ाइलों}} की प्रति है:", "file-deleted-duplicate": "इसी फ़ाइल ([[:$1]]) से हूबहू मेल खाती एक फ़ाइल पहले हटाई जा चुकी है।\nइसे फिर से अपलोड करने से पहले आपको पुरानी फ़ाइल का हटाने के इतिहास देख लेना चाहिए।", "file-deleted-duplicate-notitle": "इससे पहले इस फ़ाइल के समान एक फ़ाइल को हटाया गया है, और शीर्षक छिपा दिया गया है।\nइसे फिर से अपलोड करने से पहले आप किसी ऐसे व्यक्ति से स्थिति की समीक्षा करने के लिए कहें जिसके पास छिपी फ़ाइल का डाटा देखने की क्षमता है।", @@ -1548,6 +1569,7 @@ "php-uploaddisabledtext": "पी॰एच॰पी में फ़ाइल अपलोड बंद हैं।\nकृपया file_uploads जमाव की जाँच करें।", "uploadscripted": "इस फ़ाइल में एच॰टी॰एम॰एल या स्क्रिप्ट कोड है, जो वेब ब्राउज़र द्वारा गलत पढ़ा जा सकता है।", "upload-scripted-pi-callback": "उस फाइल को अपलोड नहीं किया जा सकता जिसमें एक्सएमएल-स्टाइलशीट प्रसंस्करण निर्देश समाविष्ट हैं।", + "upload-scripted-dtd": "SVG फ़ाइलों को अपलोड नहीं किया जा सकता जिसमें एक गैर-मानक DTD की घोषणा हो।", "uploaded-script-svg": "अपलोड की गयी एसवीजी फ़ाइल में स्क्रीप्ट अवयव \"$1\" पाया गया।", "uploaded-hostile-svg": "अपलोड की गयी एसवीजी फाइल के शैली अवयव में असुरक्षित सीएसएस पायी गयी।", "uploaded-event-handler-on-svg": "सेटिंग ईवेंट हैंडलर (आयोजन प्रबन्धनकर्ता वरियता) $1=\"$2\" एसवीजी फ़ाइल में अनुमत नहीं है।", @@ -1586,6 +1608,8 @@ "upload-http-error": "एक एच॰टी॰टी॰पी त्रुटि आई: $1", "upload-copy-upload-invalid-domain": "कॉपी अपलोड इस डोमेन से उपलब्ध नहीं हैं।", "upload-foreign-cant-upload": "यह विकि अन्य फ़ाइल संग्रह में अपलोड हेतु तय नहीं किया गया है।", + "upload-foreign-cant-load-config": "फ़ाइल अपलोड के लिए कॉन्फ़िगरेशन को विदेशी फ़ाइल रिपॉजिटरी में लोड करने में विफल।", + "upload-dialog-disabled": "इस बॉक्स का उपयोग कर फ़ाइल अपलोड इस विकी पर अक्षम हैं।", "upload-dialog-title": "फ़ाइल डालें", "upload-dialog-button-cancel": "रद्द करें", "upload-dialog-button-back": "पीछे", @@ -1657,6 +1681,7 @@ "uploadstash-errclear": "फ़ाइलों को साफ़ करना असफल रहा।", "uploadstash-refresh": "फ़ाइलों की सूची रिफ़्रेश करें", "uploadstash-thumbnail": "छवि देखें", + "uploadstash-exception": "गुप्त कोष में अपलोड स्टोर नहीं किया जा सका ($1): \"$2\".", "invalid-chunk-offset": "अग्राह्य चंक ऑफ़सेट", "img-auth-accessdenied": "अनुमति नहीं है", "img-auth-nopathinfo": "PATH_INFO मौजूद नहीं है।\nआपके सर्वर में इस जानकारी को भेजने के लिए जमाव नहीं है।\nयह सी॰जी॰आई-आधारित हो सकता है और img_auth को स्वीकार नहीं करता है।\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization देखें।", @@ -1745,6 +1770,7 @@ "filerevert-submit": "पूर्ववत करें", "filerevert-success": "'''[[Media:$1|$1]]''' को [$4 $2 को $3 बजे के अवतरण] को पूर्ववत कर दिया गया है।", "filerevert-badversion": "दिये हुए समय से मेल खाने वाला इस फ़ाइल का पुराना अवतरण नहीं है।", + "filerevert-identical": "फ़ाइल का वर्तमान संस्करण पहले से ही चयनित एक जैसा है।", "filedelete": "$1 हटाएँ", "filedelete-legend": "फ़ाइल हटाएँ", "filedelete-intro": "आप फ़ाइल '''[[Media:$1|$1]]''' इतिहास समेत हटाने जा रहे हैं।", @@ -1834,6 +1860,7 @@ "uncategorizedcategories": "अश्रेणीकृत श्रेणियाँ", "uncategorizedimages": "अश्रेणीकृत फ़ाइलें", "uncategorizedtemplates": "अश्रेणीकृत साँचे", + "uncategorized-categories-exceptionlist": " # इसमें श्रेणियों की एक सूची है, जिसका विशेष:श्रेणीहीन_श्रेणियाँ उल्लेख नहीं किया जाना चाहिए। प्रति पंक्ति एक, \"*\" से शुरू. दूसरे वर्ण (व्हाइटस्पेस सहित) के साथ शुरू होने वाली पंक्तिओं को नजरअंदाज कर दिया जाता है। टिप्पणियों के लिए \"#\" का उपयोग करें।", "unusedcategories": "अप्रयुक्त श्रेणियाँ", "unusedimages": "अप्रयुक्त फ़ाइलें", "wantedcategories": "वांछित श्रेणियाँ", @@ -1932,6 +1959,8 @@ "apisandbox-sending-request": "एपीआई अनुरोध भेज रहा...", "apisandbox-loading-results": "एपीआई परिणाम ले रहा...", "apisandbox-results-error": "एपीआई के समय कोई त्रुटि हुई: $1", + "apisandbox-request-selectformat-label": "अनुरोध डेटा को इस रूप में दिखाएं:", + "apisandbox-request-format-url-label": "यूआरएल क्वेरी स्ट्रिंग", "apisandbox-request-url-label": "अनुरोध URL:", "apisandbox-request-json-label": "JSON अनुरोध:", "apisandbox-request-time": "अनुरोध समय: {{PLURAL:$1|$1 मि}}", @@ -1941,6 +1970,8 @@ "apisandbox-alert-field": "जगह में डाला गया जानकारी अमान्य है।", "apisandbox-continue": "जारी रखें", "apisandbox-continue-clear": "खाली करें", + "apisandbox-continue-help": "{{int:apisandbox-continue}} [https://www.mediawiki.org/wiki/API:Query#Continuing_queries continue] अंतिम अनुरोध होगा; {{int:apisandbox-continue-clear}} निरंतरता-संबंधित मानदंडों को साफ करेगा।", + "apisandbox-param-limit": "अधिकतम सीमा का उपयोग करने के लिए अधिकतम दर्ज करें।", "apisandbox-multivalue-all-namespaces": "$1 (सभी नामस्थान)", "apisandbox-multivalue-all-values": "$1 (सभी मूल्य)", "booksources": "पुस्तकों के स्रोत", @@ -1949,6 +1980,12 @@ "booksources-search": "खोजें", "booksources-text": "नीचे पुरानी और नई पुस्तकें बेचने वाली वेबसाइटों के एड्रेस हैं, जिसमें आपको आप द्वारा खोजी जाने वाली पुस्तक के बारे में अधिक जानकारी मिल सकती है:", "booksources-invalid-isbn": "यह आइ॰एस॰बी॰एन सही नहीं लग रहा है; मूल स्रोत से नकल करने में हुई त्रुटि के लिए जाँचें।", + "magiclink-tracking-rfc": "RFC जादू लिंक का उपयोग कर रहे पेज", + "magiclink-tracking-rfc-desc": "यह पृष्ठ आरएफसी जादू लिंक का उपयोग करता है। कैसे माइग्रेट करें [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] पर देखें।", + "magiclink-tracking-pmid": "पीएमआईडी जादू लिंक का उपयोग कर रहे पेज", + "magiclink-tracking-pmid-desc": "यह पृष्ठ पीएमआईडी जादू लिंक का उपयोग करता है। कैसे माइग्रेट करें [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] पर देखें।", + "magiclink-tracking-isbn": "आईएसबीएन के जादुई कड़ियों का उपयोग करने वाले पृष्ठ", + "magiclink-tracking-isbn-desc": "यह पृष्ठ आईएसबीएन जादू लिंक का उपयोग करता है। कैसे माइग्रेट करें [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] पर देखें।", "specialloguserlabel": "कर्ता:", "speciallogtitlelabel": "प्रयोजन (शीर्षक अथवा {{ns:सदस्यनाम}}:सदस्य नाम):", "log": "लॉग", @@ -2000,6 +2037,8 @@ "activeusers-intro": "यह सक्रिय सदस्यों की सूची है जिन्होंने पिछले $1 {{PLURAL:$1|दिन|दिनों}} में कुछ गतिविधि करी है।", "activeusers-count": "$1 {{PLURAL:$1|कार्य}} पिछले $3 {{PLURAL:$3|दिन|दिनों}} में", "activeusers-from": "इस अक्षर से शुरू होने वाले सदस्य दिखाएँ:", + "activeusers-groups": "इस समूह के सदस्यों को दिखाएँ:", + "activeusers-excludegroups": "इस समूह के सदस्यों को न दिखाएँ:", "activeusers-noresult": "कोई सदस्य नहीं मिले।", "activeusers-submit": "सक्रिय सदस्यों को दिखायें", "listgrouprights": "सदस्य समूह अधिकार", @@ -2029,6 +2068,8 @@ "trackingcategories-msg": "चिह्नित श्रेणी", "trackingcategories-name": "संदेश नाम", "trackingcategories-desc": "श्रेणी शामिल किए जाने के मानदंड", + "restricted-displaytitle-ignored": "नजरअंदाज कर दिया प्रदर्शन शीर्षक वाले पृष्ठ", + "restricted-displaytitle-ignored-desc": "पृष्ठ पर ध्यान नहीं दिया गया है।{{DISPLAYTITLE}} क्योंकि यह पृष्ठ के वास्तविक शीर्षक के बराबर नहीं है।", "noindex-category-desc": "यह पृष्ठ रोबॉटों द्वारा सूचीबद्ध नहीं है क्योंकि इसमें जादूई शब्द __NOINDEX__ है और ऐसे स्थान पर है जहाँ उस झंडी की अनुमति है।", "index-category-desc": "इस पृष्ठ का एक __INDEX__ उस पर है (ऐसे स्थान पर है जहाँ उस झंडी की अनुमति है), और इसलिए इसे रोबॉटों द्वारा सूचीबद्ध है जबकि साधारणतः ऐसा नहीं होता है।", "post-expand-template-inclusion-category-desc": "पृष्ठ का साइज़ $wgMaxArticleSize से बढ़कर है। सभी साँचों के फैलाने के बाद कुछ साँचों को फैलाया नहीं जा सकता है।", @@ -2064,7 +2105,7 @@ "emailccsubject": "आपके ई-मेल की प्रति जो $1 को भेजा गया: $2", "emailsent": "ई-मेल भेज दिया गया है।", "emailsenttext": "आपका ई-मेल संदेश भेज दिया गया है।", - "emailuserfooter": "इस ई-मेल को $1 {{GENDER:$1|द्वारा}} {{GENDER:$2|$2}} को भेजा गया था जिसके लिए \"{{int:emailuser}}\" कार्य को {{SITENAME}} पर प्रयोग में लाया गया था।", + "emailuserfooter": "इस ई-मेल को $1 {{GENDER:$1|द्वारा}} {{GENDER:$2|$2}} को भेजा गया था जिसके लिए \"{{int:emailuser}}\" कार्य को {{SITENAME}} पर प्रयोग में लाया गया था। अगर {{GENDER:$2|आप}} इस ईमेल का उत्तर देते हैं, {{GENDER:$2|आपका}} ईमेल सीधे {{GENDER:$1|मूल प्रेषक}} को भेज दिया जाएगा। {{GENDER:$1उनको}} {{GENDER:$2|अपना}} ईमेल पता बताएं।", "usermessage-summary": "प्रणाली सन्देश छोड़ रहा है।", "usermessage-editor": "सिस्टम दूत", "watchlist": "ध्यानसूची", @@ -2149,12 +2190,13 @@ "delete-toobig": "इस पृष्ठ का संपादन इतिहास $1 से अधिक {{PLURAL:$1|अवतरण}} होने की वजह से बहुत बड़ा है।\n{{SITENAME}} के अनपेक्षित रूप से बंद होने से रोकने के लिये ऐसे पृष्ठों को हटाने की अनुमति नहीं है।", "delete-warning-toobig": "इस पृष्ठ का संपादन इतिहास $1 से अधिक {{PLURAL:$1|अवतरण}} होने की वजह से बहुत बड़ा है।\nइसे हटाने से {{SITENAME}} के डाटाबेस की गतिविधियों में व्यवधान आ सकता है;\nकृपया सोच समझ कर आगे बढ़ें।", "deleteprotected": "आप इस पृष्ठ को हटा नहीं सकते क्योंकि इसे सुरक्षित किया गया है।", - "deleting-backlinks-warning": "'''चेतावनी:''' जो पृष्ठ आप हटाने जा रहे हैं उससे [[Special:WhatLinksHere/{{FULLPAGENAME}}|अन्य पृष्ठ]] जुड़ते हैं अथवा उसे ट्रांसक्लूड करते हैं।", + "deleting-backlinks-warning": "चेतावनी: जो पृष्ठ आप हटाने जा रहे हैं उससे [[Special:WhatLinksHere/{{FULLPAGENAME}}|अन्य पृष्ठ]] जुड़ते हैं अथवा उसे ट्रांसक्लूड करते हैं।", "rollback": "संपादन वापिस लें", "rollbacklink": "वापिस लें", "rollbacklinkcount": "$1 {{PLURAL:$1|सम्पादन}} वापिस लें", "rollbacklinkcount-morethan": "$1 से अधिक {{PLURAL:$1|सम्पादन}} वापिस लें", "rollbackfailed": "वापिस लेना असफल रहा", + "rollback-missingparam": "अनुरोध पर अपेक्षित पैरामीटर गायब हैं।", "rollback-missingrevision": "अवतरण डाटा दिखाने में असमर्थ।", "cantrollback": "पुराने अवतरण को पूर्ववत नहीं कर सकते हैं;\nइस पृष्ठ का अन्तिम योगदानकर्ता इस लेख का एकमात्र लेखक है।", "alreadyrolled": "[[User:$2|$2]] ([[User talk:$2|वार्ता]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) द्वारा किए गए [[:$1]] के पिछले संपादन को वापिस पुरानी स्थिति पर नहीं लाया जा सकता है;\nकिसी और ने इस बीच या तो इस पृष्ठ को फिर से संपादित कर दिया है या पहले ही पृष्ठ पुरानी स्थिति पर लाया जा चुका है।\n\nइस पृष्ठ का अन्तिम संपादन [[User:$3|$3]] ([[User talk:$3|वार्ता]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) ने किया है।", @@ -2162,6 +2204,7 @@ "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|Talk]]) के संपादनों को हटाकर [[User:$1|$1]] के अन्तिम अवतरण को पूर्ववत किया", "revertpage-nouser": "(सदस्य नाम हटाया गया है) के संपादनों को हटाकर {{GENDER:$1|[[User:$1|$1]]}} के अन्तिम अवतरण को पूर्ववत किया।", "rollback-success": "{{GENDER:$3|$1}} के संपादन हटाए;\n{{GENDER:$4|$2}} द्वारा संपादित अन्तिम अवतरण को पुनर्स्थापित किया।", + "rollback-success-notify": "$1 द्वारा वापिस लौटे संपादन; $2 द्वारा पिछली संशोधन में वापस बदल दिया। [$3 बदलाव दिखाएं]", "sessionfailure-title": "सत्र विफलता", "sessionfailure": "ऐसा प्रतीत होता है कि आपके लॉगिन सत्र के साथ कोई समस्या है।\nसत्र अपहरण से बचाने के लिए सावधानी के तौर पर आपका यह क्रियाकलाप रद्द कर दिया गया है।\nकृपया पीछे जाएँ और पृष्ठ को पुनः लोड करें, तब दुबारा कोशिश करें।", "changecontentmodel": "पेज कि सामगरिि मोदल को बदलिये", @@ -2253,6 +2296,7 @@ "undeletehistorynoadmin": "यह पृष्ठ हटा दिया गया है।\nहटाए जाने का कारन नीचे सारांश में दिया गया है, और साथ ही उन सदस्यों के बारे में विस्तार भी दिया गया है, जिन्होंने हटाए जाने से पहले इस पृष्ठ को संपादित किया था।\nइन हटाये गए अवतरणों का पाठ केवल प्रबंधकों को ही उपलब्ध है।", "undelete-revision": "$1 ($4 को $5 बजे $3 द्वारा बनाया गया) का मिटाया हुआ संस्करण:", "undeleterevision-missing": "अमान्य अथवा अनुपस्थित अवतरण।\nया तो आप ग़लत कड़ी प्रयोग कर रहे हैं, या यह अवतरण पुनर्स्थापित किया जा चुका है, अथवा इसे लेखागार से हटा दिया गया है।", + "undeleterevision-duplicate-revid": "{{PLURAL:$1|One revision|$1संशोधन}} को पुनर्स्थापित नहीं किया जा सका, क्योंकि {{PLURAL:$1|यह|अपने}} rev_id पहले से ही उपयोग में है।", "undelete-nodiff": "कोई पुराना अवतरण नहीं मिला।", "undeletebtn": "वापस ले आयें", "undeletelink": "देखें/पुनर्स्थापित करें", @@ -2302,7 +2346,7 @@ "sp-contributions-uploads": "अपलोड", "sp-contributions-logs": "लॉग", "sp-contributions-talk": "वार्ता", - "sp-contributions-userrights": "सदस्य अधिकार प्रबंधन", + "sp-contributions-userrights": "{{GENDER:$1|सदस्य}} अधिकार प्रबंधन", "sp-contributions-blocked-notice": "यह सदस्य फ़िलहाल अवरोधित हैं। सदंर्भ के लिए ताज़ातरीन अवरोध चिट्ठा प्रविष्टि नीचे है:", "sp-contributions-blocked-notice-anon": "यह आईपी पता अभी अवरोधित है। \nनवीनतम अवरोध अभिलेख प्रविष्टि सन्दर्भ के लिए नीचे दी गई है:", "sp-contributions-search": "योगदान के लिये खोज", @@ -2334,7 +2378,7 @@ "unblock": "उपयोक्ता पर अवरोधण हटाएँ", "blockip": "{{GENDER:$1|सदस्य|सदस्या}} अवरोधित करें", "blockip-legend": "सदस्य को ब्लॉक करें", - "blockiptext": "विशिष्ठ IP पते अथवा सदस्य नाम को लिखने के अधिकार से बाध्य करने के लिए निम्न पत्र का प्रयोग करें।\nयह सिर्फ बर्बरता को रोकने के लिए ही किया जाना चाहिए, और [[{{MediaWiki:Policy-url}}|नीति]] के अनुसार ही करना चाहिए।\nनीचे विशिष्ठ कारण भी लिखें (उदाहरण के लिए, सटीक पृष्ठों को दर्शाते हुए, जिनमें बर्बरता की गई हो)।", + "blockiptext": "विशिष्ठ IP पते अथवा सदस्य नाम को लिखने के अधिकार से बाध्य करने के लिए निम्न पत्र का प्रयोग करें।\nयह सिर्फ बर्बरता को रोकने के लिए ही किया जाना चाहिए, और [[{{MediaWiki:Policy-url}}|नीति]] के अनुसार ही करना चाहिए।\nनीचे विशिष्ठ कारण भी लिखें (उदाहरण के लिए, सटीक पृष्ठों को दर्शाते हुए, जिनमें बर्बरता की गई हो)।\nआप [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing सीआईडीआर] सिंटैक्स का उपयोग करके आईपी पता श्रेणियां ब्लॉक कर सकते हैं। आईपीवी4 के लिए सबसे बड़ी स्वीकार्य सीमा /$1 है और आईपीवी6 के लिए /$2 है।", "ipaddressorusername": "आईपी एड्रेस या सदस्यनाम:", "ipbexpiry": "समाप्ति:", "ipbreason": "कारण:", @@ -2371,10 +2415,12 @@ "unblocked-id": "अवरोध $1 निकाल दिया गया है", "unblocked-ip": "[[Special:Contributions/$1|$1]] पर से प्रतिरोध हटाया गया है।", "blocklist": "अवरोधित उपयोक्ता", + "autoblocklist": "स्वतःअवरोध", "autoblocklist-submit": "खोजें", "autoblocklist-legend": "स्वतः अवरोध सूची", "autoblocklist-localblocks": "स्थानीय {{PLURAL:$1|स्वतः अवरोध}}", "autoblocklist-empty": "स्वतः अवरोध सूची खाली है।", + "autoblocklist-otherblocks": "अन्य {{PLURAL:$1|स्वतःअवरोध}}", "ipblocklist": "अवरोधित आईपी पते व सदस्यनाम", "ipblocklist-legend": "अवरोधित सदस्य को खोजें", "blocklist-userblocks": "खाते के अवरोध छिपाएं", @@ -2462,7 +2508,7 @@ "move-page-legend": "पृष्ठ स्थानांतरण", "movepagetext": "निम्नलिखित प्रारूप को काम में लेने पर पृष्ठ का नाम परिवर्तित हो जायेगा, इसका सम्पूर्ण इतिहास नये नाम पर स्थानान्तरित हो जायेगा।\nपुराना शीर्षक नये शीर्षक पर एक अनुप्रेषण पृष्ठ बन जायेगा।\nआप मूल शीर्षक पर अनुप्रेषिणों को स्वतः अद्यतन कर सकते हैं।\nयदि आप ऐसा नहीं करते हैं तो [[Special:DoubleRedirects|द्वि-अनुप्रेषण]] और [[Special:BrokenRedirects|टूटे हुये अनुप्रेषणों]] की जाँच करें।\nकड़ियों के आवश्यक रूप से सही स्थान पर जोड़ने के लिए आप उत्तरदायी हैं।\n\nयदि नये शीर्षक पर पहले से कोई पृष्ठ उपलब्ध है तो पृष्ठ का स्थानान्तरण नहीं होगा जबकि बाद वाला इतिहास रहित अनुप्रेषण नहीं है।\nइसका अर्थ यह हुआ कि आप किसी पृष्ठ का पुनः नामकरण वहाँ कर सकते हैं जहाँ से इसको गलती से यहाँ स्थानान्तरित किया गया है और आप पहले से बने हुये पृष्ठ को पुनः नहीं लिख सकते।\n\nटिप्पणी:\nयह किसी लोकप्रिय पृष्ठ के लिए कठोर और अप्रत्यासित परिवर्तन हो सकता है;\nकृपया आगे बढ़ने से पहले इसके परिणामों को अच्छे से समझ लें।", "movepagetext-noredirectfixer": "नीचे दिया हुआ पर्चा पृष्ठ का नाम बदल देगा, उसका सारा इतिहास भी नए नाम से दिखना शुरू हो जाएगा।\nपुराना शीर्षक नये नाम को अनुप्रेषित करेगा ।\nमूल शीर्षक की ओर ले जाने वाले अग्रेषणों को आप स्वचालित रूप से बदल सकते हैं।\nयदि आप ऐसा नहीं करते हैं तो कृपया [[Special:DoubleRedirects|दोहरे]] पुनर्निर्देशण या [[Special:BrokenRedirects|टूटे पुनर्निर्देशन]] के लिए ज़रूर जाँच करें।\nकड़ियाँ सही जगह इंगित करती रहें, यह सुनिश्चित करना आपकी जिम्मेदारी है।\n\nअगर नये शीर्षक का लेख पहले से है तो स्थानांतरण नहीं होगा। पर अगर नये शीर्षक वाला लेख खाली है अथवा कहीं और अनुप्रेषित करता है और साथ ही उसके पुराने संस्करण नहीं हैं तो स्थानांतरण हो जायेगा ।\nइसका मतलब कि यदि आपसे गलती हो जाए तो आप वापस पुराने नाम पर इस पृष्ठ का स्थानांतरण कर सकेंगे, और साथ ही आप किसी मौजूदा पृष्ठ के बदले यह स्थानांतरण नहीं कर सकते हैं।\n\nचेतावनी!\nयदि पृष्ठ काफ़ी लोकप्रिय है तो उसके लिए यह एक बहुत बड़ा व अकस्मात् परिवर्तन हो सकता है;\nआगे बढ़ने से पहले इसका अंजाम अच्छी तरह समझ लें।\n\nसूचना!\nस्थानांतरण करनेसे कोई भी महत्वपूर्ण लेख में अनपेक्षित बदलाव हो सकते है ।\nआपसे अनुरोध है कि आप इसके परिणाम जान लें ।", - "movepagetalktext": "संबंधित वार्ता पृष्ठ इसके साथ स्थानांतरीत नहीं होगा '''अगर:'''\n* आप पृष्ठ दुसरे नामस्थान में स्थानांतरीत कर रहें है\n* इस नाम का वार्ता पृष्ठ पहलेसे बना हुवा है, या\n* नीचे दिया हुआ चेक बॉक्स आपने निकाल दिया है ।\n\nइन मामलोंमे आपको स्वयं यह पृष्ठ जोडने पड़ सकते है ।", + "movepagetalktext": "यदि आप इस बॉक्स को चेक करते हैं, संबंधित वार्ता पृष्ठ स्वचालित रूप से नए शीर्षक पर ले जाया जाएगा, जब तक कि एक रिक्त वार्ता पृष्ठ पहले से मौजूद न हो।\n\nइस मामले मे आपको स्वयं यह पृष्ठ जोडने पड़ सकते है ।", "moveuserpage-warning": "चेतावनी: आप एक सदस्य पृष्ठ स्थानांतरित करने जा रहे हैं। कृपया ध्यान दें कि केवल पृष्ठ का नाम बदला जाएगा और सदस्यनाम नहीं बदलेगा।", "movecategorypage-warning": "चेतावनी: आप एक श्रेणी पृष्ठ को स्थानांतरित करने जा रहे हैं। याद रखिए कि केवल वह पृष्ठ स्थानांतरित होगा और पुरानी श्रेणी में शामिल पृष्ठ नई श्रेणी के अंतरगत नहीं आएँगे।", "movenologintext": "लेख स्थानान्तरित करने के लिये आपका [[Special:UserLogin|लॉग इन]] किया होना आवश्यक हैं।", @@ -2494,6 +2540,7 @@ "movelogpagetext": "नीचे सभी स्थानान्तरणों की सूची दी गई है।", "movesubpage": "{{PLURAL:$1|उप पृष्ठ|उप पृष्ठ}}", "movesubpagetext": "नीचे $1 {{PLURAL:$1|पृष्ठ दिखाया गया है, जो इस पृष्ठ का उप पृष्ठ है|पृष्ठ दिखाया गया है, जो इस पृष्ठ के उप पृष्ठ हैं}}।", + "movesubpagetalktext": "{{PLURAL:$1|उप-पृष्ठ}} में संबंधित वार्ता पृष्ठ नीचे दिखाए गए हैं", "movenosubpage": "इस पृष्ठ के कोई उपपृष्ठ नहीं हैं।", "movereason": "कारण:", "revertmove": "पुराने अवतरण पर ले जाएं", @@ -2623,6 +2670,7 @@ "tooltip-pt-mycontris": "आपके योगदानों की सूची", "tooltip-pt-anoncontribs": "इस आईपी पते से संपादन की सूची", "tooltip-pt-login": "आपको सत्रारम्भ करने के लिए प्रोत्साहित किया जाता है; लेकिन यह अनिवार्य नहीं है", + "tooltip-pt-login-private": "इस विकि का उपयोग करने हेतु लॉगिन (प्रवेश) करें", "tooltip-pt-logout": "प्रस्थान", "tooltip-pt-createaccount": "हमारा सुझाव है की आप खाता बनाएँ और लॉगिन करें, परन्तु यह अनिवार्य नहीं है", "tooltip-ca-talk": "सामग्री पृष्ठ के बारे में वार्तालाप", @@ -2825,6 +2873,7 @@ "newimages-showbots": "बॉट के अपलोड दिखाइये", "newimages-hidepatrolled": "जाँचा हुआ अपलोड छुपाएँ", "noimages": "देखने के लिए कुछ नहीं है।", + "gallery-slideshow-toggle": "टॉगल थंबनेल", "ilsubmit": "खोजें", "bydate": "तिथि अनुसार", "sp-newimages-showfrom": "$2, $1 के बाद की फ़ाईलें दर्शायें", @@ -3429,6 +3478,7 @@ "tag-filter-submit": "छननी", "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|टैग}}]]: $2)", "tag-mw-contentmodelchange": "सामग्री मॉडल परिवर्तन", + "tag-mw-contentmodelchange-description": "पृष्ठ [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel सामग्री मॉडल को परिवर्तित करें] के संपादन।", "tags-title": "चिप्पियाँ", "tags-intro": "यह पृष्ठ अर्थ सहित वह चिप्पियाँ दर्शाता है जिनका कोई तंत्रांश किसी संपादन पर निशान लगाने के लिए इस्तेमाल कर सकता है।", "tags-tag": "चिप्पी का नाम", @@ -3551,6 +3601,15 @@ "htmlform-date-placeholder": "वववव-मम-दद", "htmlform-time-placeholder": "घघ:मम:सस", "htmlform-datetime-placeholder": "वववव-मम-दद हह:मम:सस", + "htmlform-date-invalid": "आपने जो मान डाला है, उसे दिनांक के रूप में नहीं पहचान पा रहा है। YYYY-MM-DD के प्रारूप में प्रयास करें।", + "htmlform-time-invalid": "आपने जो मान डाला है, उसे समय के रूप में नहीं पहचान पा रहा है। HH:MM:SS के प्रारूप में प्रयास करें।", + "htmlform-datetime-invalid": "आपने जो मान डाला है, उसे दिनांक और समय के रूप में नहीं पहचान पा रहा है। YYYY-MM-DD HH:MM:SS के प्रारूप में प्रयास करें।", + "htmlform-date-toolow": "आपके द्वारा निर्दिष्ट मान $1 की आरंभिक तिथि से पहले है", + "htmlform-date-toohigh": "आपके द्वारा निर्दिष्ट मान $1 की नवीनतम अनुमत तिथि के बाद है", + "htmlform-time-toolow": "आपके द्वारा निर्दिष्ट मान $1 के आरंभिक समय से पहले है।", + "htmlform-time-toohigh": "आपके द्वारा निर्दिष्ट मान $1 के नवीनतम अनुमत समय के बाद है।", + "htmlform-datetime-toolow": "आपके द्वारा उल्लिखित मूल्य $1 की आरंभिक तिथि और समय से पहले है।", + "htmlform-datetime-toohigh": "आपके द्वारा निर्दिष्ट मूल्य $1 की नवीनतम अनुमति तिथि और समय के बाद है।", "htmlform-title-badnamespace": "[[:$1]] अभी \"{{ns:$2}}\" नामस्थान में नहीं है।", "htmlform-title-not-creatable": "\"$1\" निर्माण करने लायक शीर्षक नहीं है।", "htmlform-title-not-exists": "$1 नहीं बना है।", @@ -3559,6 +3618,9 @@ "logentry-delete-delete": "$1 ने पृष्ठ $3 {{GENDER:$2|हटा}} दिया", "logentry-delete-delete_redir": "$1 ने $3 से पुनर्निर्देशन {{GENDER:$2|हटाकर}} अन्य जानकारी डाल दी।", "logentry-delete-restore": "$1 ने पृष्ठ $3 ($4) को {{GENDER:$2|पुनर्स्थापित}} कर दिया", + "logentry-delete-restore-nocount": "$1 $3 पृष्ठ {{GENDER:$2|को बहाल किया}}", + "restore-count-revisions": "{{PLURAL:$1|1 संशोधन|$1 संशोधन}}", + "restore-count-files": "{{PLURAL:$1|1 फ़ाइल|$1 फ़ाइल}}", "logentry-delete-event": "$1 ने $3 पृष्ठ की लॉग {{PLURAL:$5|प्रविष्टि|प्रविष्टियों}} की दृश्यता {{GENDER:$2|बदली}}: $4", "logentry-delete-revision": "$1 ने $3 पृष्ठ के {{PLURAL:$5|एक अवतरण|$5 अवतरणों}} की दृश्यता {{GENDER:$2|बदली}}: $4", "logentry-delete-event-legacy": "$1 ने $3 पृष्ठ पर लॉग क्रियाओं की दृश्यता {{GENDER:$2|बदली}}", @@ -3704,6 +3766,7 @@ "pagelang-nonexistent-page": "$1 पन्ना अभी बना नहीं है।", "pagelang-unchanged-language": "$1 की भाषा पहले ही $2 तय की गई है।", "pagelang-unchanged-language-default": "$1 पृष्ठ में विकि की मूल भाषा पहले से तय कर दी गई है।", + "pagelang-db-failed": "डेटाबेस पृष्ठ भाषा को बदलने में विफल रहा।", "right-pagelang": "पृष्ठ भाषा बदलें", "action-pagelang": "पृष्ठ भाषा बदलने", "log-name-pagelang": "भाषा बदलाव लॉग", @@ -3764,6 +3827,7 @@ "special-characters-group-thai": "थाई", "special-characters-group-lao": "लाओ", "special-characters-group-khmer": "खमेर", + "special-characters-group-canadianaboriginal": "कनाडाई एबोरिजिनल", "special-characters-title-endash": "एन डैश", "special-characters-title-emdash": "एम डैश", "special-characters-title-minus": "ऋण चिह्न", @@ -3781,25 +3845,36 @@ "sessionprovider-nocookies": "हो सकता है कि कुकी निष्क्रिय है। कृपया देखें कि और सक्रिय करें।", "randomrootpage": "अविशिष्ट मूल पृष्ठ", "log-action-filter-block": "अवरोध के प्रकार:", + "log-action-filter-contentmodel": "सामग्री मॉडल परिवर्तन का प्रकार:", "log-action-filter-delete": "हटाने के प्रकार:", "log-action-filter-import": "आयात के प्रकार:", + "log-action-filter-managetags": "टैग प्रबंधन कार्रवाई का प्रकार:", "log-action-filter-move": "स्थानांतरण के प्रकार:", "log-action-filter-newusers": "खाता निर्माण के प्रकार:", "log-action-filter-patrol": "परीक्षण के प्रकार:", "log-action-filter-protect": "सुरक्षा के प्रकार:", "log-action-filter-rights": "अधिकार बदलाव के प्रकार:", + "log-action-filter-suppress": "दमन के प्रकार:", "log-action-filter-upload": "अपलोड के प्रकार:", "log-action-filter-all": "सभी", "log-action-filter-block-block": "अवरोध", "log-action-filter-block-reblock": "अवरोध परिवर्तन", "log-action-filter-block-unblock": "अवरोध हटाना", + "log-action-filter-contentmodel-change": "सामग्री मॉडल में बदलाव", + "log-action-filter-contentmodel-new": "गैर-डिफ़ॉल्ट सामग्री मॉडल वाले पृष्ठ का निर्माण", "log-action-filter-delete-delete": "पृष्ठ हटाना", + "log-action-filter-delete-delete_redir": "पुननिर्देशित ओवरराइट", "log-action-filter-delete-restore": "पृष्ठ न हटाना", "log-action-filter-delete-event": "पृष्ठ हटाने का लॉग", "log-action-filter-delete-revision": "अवतरण हटाना", "log-action-filter-import-interwiki": "अंतरविकि आयात", "log-action-filter-import-upload": "एक्सएमएल अपलोड द्वारा आयात", "log-action-filter-managetags-create": "चिप्पि निर्मित", + "log-action-filter-managetags-delete": "टैग हटाना", + "log-action-filter-managetags-activate": "टैग सक्रियण", + "log-action-filter-managetags-deactivate": "टैग निष्क्रियकरण", + "log-action-filter-move-move": "पुननिर्देशों को ओवरराईट किये बिना स्थान्तरण करे", + "log-action-filter-move-move_redir": "पुननिर्देशों को ओवरराईट किये स्थान्तरण करे", "log-action-filter-newusers-create": "अज्ञात सदस्य द्वारा निर्मित", "log-action-filter-newusers-create2": "पंजीकृत सदस्य द्वारा निर्मित", "log-action-filter-newusers-autocreate": "स्वतः निर्मित", @@ -3819,24 +3894,47 @@ "log-action-filter-suppress-reblock": "पुन: ब्लॉक द्वारा युजर अवरोध", "log-action-filter-upload-upload": "नया अपलोड", "log-action-filter-upload-overwrite": "फिर से अपलोड", + "authmanager-authn-not-in-progress": "प्रमाणीकरण प्रगति में नहीं है या सत्र डेटा खो गया है। कृपया शुरुआत से फिर से शुरू करें", + "authmanager-authn-no-primary": "आपूर्ति किए गए क्रेडेंशियल्स को प्रमाणित नहीं किया जा सका।", + "authmanager-authn-no-local-user": "दिए गए क्रेडेंशियल इस विकी पर किसी भी उपयोगकर्ता से जुड़े नहीं हैं।", + "authmanager-authn-no-local-user-link": "दिए गए क्रेडेंशियल्स मान्य हैं लेकिन इस विकी पर किसी भी उपयोगकर्ता से जुड़े नहीं हैं। किसी अन्य तरीके से लॉगिन करें, या एक नया उपयोगकर्ता बनाएं, और आपके पास उस खाते में अपने पिछले क्रेडेंशियल को लिंक करने का विकल्प होगा।", + "authmanager-authn-autocreate-failed": "किसी स्थानीय खाते के स्वत:-निर्माण विफल हुआ:$1", + "authmanager-change-not-supported": "आपूर्ति की गई क्रेडेंशियल्स को बदला नहीं जा सकता, क्योंकि उनका उपयोग उनको नहीं होगा।", "authmanager-create-disabled": "खाता निर्माण निष्क्रिय है।", "authmanager-create-from-login": "अपना खाता बनाने के लिए नीचे दिये जगहों को भर दें।", + "authmanager-create-not-in-progress": "खाता निर्माण प्रगति में नहीं है या सत्र डेटा खो गया है। कृपया शुरुआत से फिर से शुरू करें", + "authmanager-create-no-primary": "खाता निर्माण के लिए आपूर्ति की गई क्रेडेंशियल्स का उपयोग नहीं किया जा सका।", + "authmanager-link-no-primary": "खाता लिंकिंग के लिए आपूर्ति की गई क्रेडेंशियल का उपयोग नहीं किया जा सका।", + "authmanager-link-not-in-progress": "खाता लिंक प्रगति में नहीं है या सत्र डेटा खो गया है। कृपया शुरुआत से फिर से शुरू करें", "authmanager-authplugin-setpass-failed-title": "पासवर्ड बदलाव विफल हुआ।", + "authmanager-authplugin-setpass-failed-message": "प्रमाणन प्लगइन ने पासवर्ड बदलाव से इनकार किया।", + "authmanager-authplugin-create-fail": "प्रमाणीकरण प्लग इन ने खाता निर्माण को अस्वीकार कर दिया।", + "authmanager-authplugin-setpass-denied": "प्रमाणन प्लगइन पासवर्ड बदलने की अनुमति नहीं देता है", "authmanager-authplugin-setpass-bad-domain": "अमान्य जालस्थल।", "authmanager-autocreate-noperm": "स्वचालित खाता निर्माण की अनुमति नहीं है।", "authmanager-autocreate-exception": "स्वचालित खाता निर्माण को पहले के कुछ त्रुटियों के कारण कुछ समय के लिए निष्क्रिय किया गया है।", "authmanager-userdoesnotexist": "सदस्य खाता \"$1\" पंजीकृत नहीं है।", + "authmanager-userlogin-remembermypassword-help": "क्या पासवर्ड को सत्र की लंबाई से अधिक समय तक याद रखना चाहिए।", + "authmanager-username-help": "प्रमाणीकरण के लिए सदस्य नाम", + "authmanager-password-help": "प्रमाणीकरण के लिए पासवर्ड", + "authmanager-domain-help": "बाह्य प्रमाणीकरण के लिए डोमेन", "authmanager-retype-help": "फिर पासवर्ड डालें।", "authmanager-email-label": "ईमेल", "authmanager-email-help": "ईमेल पता", "authmanager-realname-label": "वास्तविक नाम", "authmanager-realname-help": "सदस्य का वास्तविक नाम", + "authmanager-provider-password": "पासवर्ड-आधारित प्रमाणीकरण", + "authmanager-provider-password-domain": "पासवर्ड- और डोमेन-आधारित प्रमाणीकरण", "authmanager-provider-temporarypassword": "अस्थाई पासवर्ड", + "authprovider-confirmlink-message": "आपके हाल के लॉगिन प्रयासों के आधार पर, निम्न खाते आपके विकी खाते से जोड़ा जा सकता है। उन्हें जोड़ने से उन खातों के माध्यम से लॉगिंग सक्षम हो जाता है कृपया चुनें कि कौन सा लिंक होना चाहिए।", "authprovider-confirmlink-request-label": "खाते जो जोड़ने हैं।", "authprovider-confirmlink-success-line": "$1 : सफलतापूर्वक जुड़ा।", "authprovider-confirmlink-failed": "खाता जोड़ने का काम पूरी तरह से नहीं हो पाया : $1", + "authprovider-confirmlink-ok-help": "लिंकिंग विफलता संदेशों को प्रदर्शित करने के बाद जारी रखें।", "authprovider-resetpass-skip-label": "छोड़ें", "authprovider-resetpass-skip-help": "पासवर्ड को रीसेट करना छोड़ें।", + "authform-nosession-login": "प्रमाणीकरण सफल था, लेकिन आपका ब्राउज़र \"याद\" नहीं किया जा सकता है।\n\n$1", + "authform-nosession-signup": "खाता तो बन चुका है, लेकिन आपका ब्राउज़र \"याद\" नहीं रखा है कि आपने लॉगिन (प्रवेश) कर लिया है। \n\n$1", "authform-newtoken": "टोकन लापता है $1", "authform-notoken": "टोकन लापता है", "authform-wrongtoken": "गलत टोकन", @@ -3867,10 +3965,12 @@ "linkaccounts-submit": "खाता जोड़ें", "unlinkaccounts": "खाता अलग करें", "unlinkaccounts-success": "खाता अलग हो गया।", + "authenticationdatachange-ignored": "प्रमाणीकरण डेटा परिवर्तन का संचालन नहीं किया गया था। शायद कोई प्रदाता कॉन्फ़िगर नहीं हुआ था?", "userjsispublic": "ध्यान दें: जावास्क्रिप्ट के उपपृष्ठ में कोई भी निजी जानकारी नहीं होनी चाहिए, क्योंकि इसे कोई भी देख सकता है।", "usercssispublic": "ध्यान दें: सीसीएस के उपपृष्ठ में कोई भी निजी जानकारी नहीं होनी चाहिए, क्योंकि इसे कोई भी देख सकता है।", "restrictionsfield-badip": "अमान्य आईपी पते या सीमा: $1", "restrictionsfield-label": "अनुमत आईपी सीमा:", + "restrictionsfield-help": "एक आईपी पता या सीडीआरएल सीमा प्रति पंक्ति में लिखें। सभी को सक्रिय करने के लिए
0.0.0.0/0::/0
का उपयोग करें।", "revid": "अवतरण $1", "pageid": "पेज आईडी $1", "rawhtml-notallowed": "<html> टैग का उपयोग सामान्य पन्नों के बाहर नहीं किया जा सकता है।", diff --git a/languages/i18n/hr.json b/languages/i18n/hr.json index 59bb54398e..c6aed3e388 100644 --- a/languages/i18n/hr.json +++ b/languages/i18n/hr.json @@ -1805,7 +1805,7 @@ "listgrouprights-removegroup-self": "Ukloni {{PLURAL:$2|skupinu|skupine}} iz vlastitog računa: $1", "listgrouprights-addgroup-self-all": "Dodaj sve skupine vlastitom računu", "listgrouprights-removegroup-self-all": "Uklonite sve skupine iz vlastitog računa", - "listgrouprights-namespaceprotection-header": "Ograničenja prostora imena", + "listgrouprights-namespaceprotection-header": "Ograničenja imenskoga prostora", "listgrouprights-namespaceprotection-namespace": "Imenski prostor", "listgrants": "Dozvole", "listgrants-summary": "Slijedi popis dozvola s pridruženim pristupom suradničkim pravima. Suradnici mogu omogućiti aplikacijama uporabu svojih računa, ali s ograničenim ovlastima na temelju dozvola koje je suradnik dodijelio aplikaciji. Aplikacija koja djeluje u ime suradnika međutim ne može rabiti prava koje suradnik nema.\nMoguće su [[{{MediaWiki:Listgrouprights-helppage}}|dodatne informacije]] o pojedinim pravima.", diff --git a/languages/i18n/hu.json b/languages/i18n/hu.json index 89ec36feea..282214191f 100644 --- a/languages/i18n/hu.json +++ b/languages/i18n/hu.json @@ -671,7 +671,7 @@ "missingcommentheader": "Emlékeztető: Nem adtad meg a megjegyzés tárgyát.\nHa ismét a „$1” gombra kattintasz, akkor a szerkesztésed nélküle lesz elmentve.", "summary-preview": "A szerkesztési összefoglaló előnézete:", "subject-preview": "Tárgy előnézete:", - "previewerrortext": "Hiba történt a változások előnézete megjelenítése során.", + "previewerrortext": "Hiba történt a változások előnézetének megjelenítése során.", "blockedtitle": "A szerkesztő blokkolva van", "blockedtext": "A szerkesztőnevedet vagy az IP-címedet blokkoltuk.\n\nA blokkolást $1 végezte el.\nAz általa felhozott indok: $2.\n\n* A blokk kezdete: $8\n* A blokk lejárata: $6\n* Blokkolt szerkesztő: $7\n\nKapcsolatba léphetsz $1 szerkesztőnkkel vagy egy másik [[{{MediaWiki:Grouppage-sysop}}|adminisztrátorral]], és megbeszélheted vele a blokkolást.\nAz „E-mail küldése ennek a szerkesztőnek” funkciót csak akkor használhatod, ha érvényes e-mail címet adtál meg [[Special:Preferences|fiókbeállításaidban]], és nem blokkolták a használatát.\nJelenlegi IP-címed: $3, a blokkolás azonosítószáma: #$5.\nKérjük, hogy érdeklődés esetén minden fenti részletet adj meg.", "autoblockedtext": "Az IP-címed automatikusan blokkolva lett, mert korábban egy olyan szerkesztő használta, akit $1 blokkolt, az alábbi indoklással:\n\n:''$2''\n\n*A blokk kezdete: '''$8'''\n*A blokk lejárata: '''$6'''\n*Blokkolt szerkesztő: '''$7'''\n\nKapcsolatba léphetsz $1 szerkesztőnkkel, vagy egy másik [[{{MediaWiki:Grouppage-sysop}}|adminisztrátorral]], és megbeszélheted vele a blokkolást.\n\nAz 'E-mail küldése ennek a szerkesztőnek' funkciót csak akkor használhatod, ha érvényes e-mail címet adtál meg\n[[Special:Preferences|fiókbeállításaidban]], és nem blokkolták a használatát.\n\nJelenlegi IP-címed: $3, a blokkolás azonosítószáma: #$5.\nKérjük, hogy érdeklődés esetén mindkettőt add meg.", diff --git a/languages/i18n/ia.json b/languages/i18n/ia.json index b34f90a269..1009800428 100644 --- a/languages/i18n/ia.json +++ b/languages/i18n/ia.json @@ -230,7 +230,7 @@ "otherlanguages": "In altere linguas", "redirectedfrom": "(Redirigite ab $1)", "redirectpagesub": "Pagina de redirection", - "redirectto": "Rediriger verso:", + "redirectto": "Redirection verso:", "lastmodifiedat": "Iste pagina esseva modificate le plus recentemente le $1 a $2.", "viewcount": "Iste pagina ha essite visitate {{PLURAL:$1|un vice|$1 vices}}.", "protectedpage": "Pagina protegite", diff --git a/languages/i18n/ja.json b/languages/i18n/ja.json index 91c076a69b..92d14d2f25 100644 --- a/languages/i18n/ja.json +++ b/languages/i18n/ja.json @@ -399,6 +399,7 @@ "missingarticle-rev": "(版番号: $1)", "missingarticle-diff": "(差分: $1, $2)", "readonly_lag": "データベースはスレーブのデータベースサーバーがマスターに同期するまで自動的にロックされています", + "nonwrite-api-promise-error": "「Promise-Non-Write-API-Action」HHTPヘッダーが送信されましたが、リクエストはAPI書き込みモジュールに送信されました。", "internalerror": "内部エラー", "internalerror_info": "内部エラー: $1", "internalerror-fatal-exception": "種別「$1」の致命的例外", @@ -505,6 +506,7 @@ "createacct-email-ph": "メールアドレスを入力", "createacct-another-email-ph": "メールアドレスを入力", "createaccountmail": "無作為な仮パスワードを生成し、指定のメールアドレスに送信", + "createaccountmail-help": "パスワードを知ることなく他の人のためにアカウントを作成するために使用することが出来ます。", "createacct-realname": "本名 (省略可能)", "createacct-reason": "理由", "createacct-reason-ph": "アカウントを作成する理由", @@ -615,6 +617,7 @@ "botpasswords-deleted-body": "利用者「$2」のボット名「$1」のためのパスワードが削除されました。", "botpasswords-newpassword": "$1用の新しいパスワードは$2です。後で参照するために、この情報を控えておいてください。
(古いボットの制約などでログイン名と利用者名が同じでなければならない場合は、$3を利用者名とし、$4をパスワードとしてください。)", "botpasswords-no-provider": "BotPasswordsSessionProvider が有効ではありません。", + "botpasswords-restriction-failed": "ボットパスワード制限によりログインできません。", "botpasswords-invalid-name": "指定された利用者名には、ボット用パスワードの区切りである「$1」 が含まれていません。", "botpasswords-not-exist": "利用者「$1」はボット「$2」のパスワードを所持していません。", "resetpass_forbidden": "パスワードは変更できません", @@ -644,6 +647,8 @@ "passwordreset-emailelement": "利用者名: \n$1\n\n仮パスワード: \n$2", "passwordreset-emailsentemail": "このメールアドレスがあなたのアカウントに関連付けられている場合は、パスワードリセットのメールが送信されます。", "passwordreset-emailsentusername": "この利用者名に関連付けられたメールアドレスがある場合は、パスワードリセットのメールが送信されます。", + "passwordreset-nocaller": "送信者の情報を提供する必要があります", + "passwordreset-nosuchcaller": "送信者が存在しません: $1", "passwordreset-ignored": "パスワードのリセットが処理されませんでした。プロバイダーが設定されていない可能性があります。", "passwordreset-invalidemail": "無効なメールアドレスです", "passwordreset-nodata": "利用者名もメールアドレスも入力されていません", @@ -708,6 +713,7 @@ "blockedtitle": "利用者はブロックされています", "blockedtext": "この利用者名またはIPアドレスはブロックされています。\n\nブロックは$1によって実施されました。\nブロックの理由は $2 です。\n\n* ブロック開始日時: $8\n* ブロック解除予定: $6\n* ブロック対象: $7\n\nこのブロックについて、$1もしくは他の[[{{MediaWiki:Grouppage-sysop}}|管理者]]に問い合わせることができます。\nただし、[[Special:Preferences|個人設定]]で有効なメールアドレスが登録されていない場合、またはメール送信機能の使用がブロックされている場合、「この利用者にメールを送信」の機能は使えません。\n現在ご使用中のIPアドレスは$3、このブロックIDは#$5です。\nお問い合わせの際には、上記の情報を必ず書いてください。", "autoblockedtext": "このIPアドレスは、$1によりブロックされた利用者によって使用されたため、自動的にブロックされています。\n理由は次の通りです。\n\n:$2\n\n* ブロック開始日時: $8\n* ブロック解除予定: $6\n* ブロック対象: $7\n\n$1または他の[[{{MediaWiki:Grouppage-sysop}}|管理者]]にこのブロックについて問い合わせることができます。\n\nただし、[[Special:Preferences|個人設定]]に正しいメールアドレスが登録されていない場合、またはメール送信がブロックされている場合、「この利用者にメールを送信」機能を使用できないことに注意してください。\n\n現在ご使用中のIPアドレスは$3 、このブロックIDは#$5です。\nお問い合わせの際は、上記の情報を必ず書いてください。", + "systemblockedtext": "あなたの利用者名またはIPアドレスはMediaWikiによって自動的にブロックされています。\n理由は次の通りです。\n\n:$2\n\n* ブロック開始日時: $8\n* ブロック解除予定: $6\n* ブロック対象: $7\n\nあなたの現在のIPアドレスは $3 です。\nお問い合わせの際は、上記の詳細情報をすべて含めてください。", "blockednoreason": "理由が設定されていません", "whitelistedittext": "このページを編集するには$1してください。", "confirmedittext": "ページの編集を始める前にメールアドレスの確認をする必要があります。\n[[Special:Preferences|個人設定]]でメールアドレスを設定し、確認を行ってください。", @@ -1029,6 +1035,7 @@ "search-external": "外部検索", "searchdisabled": "{{SITENAME}}の検索機能は無効化されています。\nさしあたってはGoogleなどで検索できます。\nただし外部の検索エンジンの索引にある{{SITENAME}}のコンテンツは古い場合があります。", "search-error": "検索する際にエラーが発生しました: $1", + "search-warning": "検索中にエラーが発生しました: $1", "preferences": "個人設定", "mypreferences": "個人設定", "prefs-edits": "編集回数:", @@ -1263,8 +1270,14 @@ "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": "ウォッチリストとの相互作用", "grant-group-email": "メールの送信", + "grant-group-high-volume": "大量の活動を行う", "grant-group-customization": "カスタマイズと個人設定", + "grant-group-administration": "管理操作を行う", "grant-group-private-information": "あなたの個人情報にアクセスする", "grant-group-other": "その他の活動", "grant-blockusers": "利用者をブロックおよびブロック解除", @@ -1289,6 +1302,7 @@ "grant-basic": "基礎的な権限", "grant-viewdeleted": "削除されたファイルとページを閲覧", "grant-viewmywatchlist": "自身のウォッチリストを閲覧", + "grant-viewrestrictedlogs": "制限されたログを表示する", "newuserlogpage": "アカウント作成記録", "newuserlogpagetext": "以下はアカウント作成の記録です。", "rightslog": "利用者権限の変更記録", @@ -1315,6 +1329,7 @@ "action-deleterevision": "版の削除", "action-deletelogentry": "記録項目の削除", "action-deletedhistory": "ページの削除履歴の閲覧", + "action-deletedtext": "削除された版の本文を閲覧する", "action-browsearchive": "削除されたページの検索", "action-undelete": "ページの復元", "action-suppressrevision": "隠された版の確認と復元", @@ -1342,6 +1357,7 @@ "action-applychangetags": "自分の編集にタグを適用する", "action-changetags": "個々の版および記録項目への任意のタグの追加と除去", "action-deletechangetags": "データベースからタグの削除", + "action-purge": "このページをパージする", "nchanges": "$1 {{PLURAL:$1|回の変更}}", "enhancedrc-since-last-visit": "最終閲覧以降 $1 {{PLURAL:$1|件}}", "enhancedrc-history": "履歴", @@ -1381,6 +1397,7 @@ "rcfilters-filter-unregistered-label": "未登録", "rcfilters-filter-unregistered-description": "ログインしていない編集者。", "rcfilters-filter-unregistered-conflicts-user-experience-level": "この項目は、登録済み利用者を編集回数別で絞り込む以下の{{PLURAL:$2|項目}}と競合しています :$1", + "rcfilters-filtergroup-authorship": "自分の編集か他者の編集か", "rcfilters-filter-editsbyself-label": "自分の編集", "rcfilters-filter-editsbyself-description": "自分の投稿記録を絞り込む", "rcfilters-filter-editsbyother-label": "自分以外の編集", @@ -1388,17 +1405,18 @@ "rcfilters-filtergroup-userExpLevel": "編集回数別(登録利用者のみが対象)", "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "編集回数別絞り込みは登録利用者のみが対象です。「未登録」の絞り込み項目と競合しています。", "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "「未登録」の項目が登録済み利用者を絞り込む項目と競合しています。競合している項目は項目選択欄で強調表示されています。", - "rcfilters-filter-user-experience-level-newcomer-label": "新規参加者", + "rcfilters-filter-user-experience-level-newcomer-label": "新規利用者", "rcfilters-filter-user-experience-level-newcomer-description": "登録から4日以内、かつ10編集以下の利用者", - "rcfilters-filter-user-experience-level-learner-label": "一般参加者", + "rcfilters-filter-user-experience-level-learner-label": "一般利用者", "rcfilters-filter-user-experience-level-learner-description": "「新規参加者」よりも活動履歴が長く、「定着参加者」より活動履歴が短い利用者", - "rcfilters-filter-user-experience-level-experienced-label": "定着参加者", + "rcfilters-filter-user-experience-level-experienced-label": "定着利用者", "rcfilters-filter-user-experience-level-experienced-description": "30日以上、かつ500編集以上の活動履歴がある利用者", "rcfilters-filtergroup-automated": "自動編集", "rcfilters-filter-bots-label": "ボット", "rcfilters-filter-bots-description": "ツールによって自動化された編集", "rcfilters-filter-humans-label": "人間(ボットではない)", "rcfilters-filter-humans-description": "人間の手作業による編集", + "rcfilters-filtergroup-reviewstatus": "ステータスの確認", "rcfilters-filter-patrolled-label": "巡回済み", "rcfilters-filter-patrolled-description": "巡回済みとマークされた編集。", "rcfilters-filter-unpatrolled-label": "未巡回", @@ -1408,6 +1426,13 @@ "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-notwatched-label": "ウォッチリストに登録されていないページ", + "rcfilters-filter-watchlist-notwatched-description": "ウォッチリストに登録されているページ以外の全ての変更。", "rcfilters-filtergroup-changetype": "変更の種類", "rcfilters-filter-pageedits-label": "ページの編集", "rcfilters-filter-pageedits-description": "ウィキの本文、議論、カテゴリの説明などの編集", @@ -1420,6 +1445,11 @@ "rcfilters-hideminor-conflicts-typeofchange-global": "「細部の編集」として絞り込めない項目を「細部の編集」として絞り込もうとしています。競合している項目は項目選択欄で強調表示されています。", "rcfilters-hideminor-conflicts-typeofchange": "細部の編集として絞り込めない以下の項目を絞り込もうとしています: $1", "rcfilters-typeofchange-conflicts-hideminor": "「細部の編集」の絞り込みと競合しています。この項目を「細部の編集」として絞り込むことはできません。", + "rcfilters-filtergroup-lastRevision": "最新版", + "rcfilters-filter-lastrevision-label": "最新版", + "rcfilters-filter-lastrevision-description": "ページの最新の変更", + "rcfilters-filter-previousrevision-label": "新しい版", + "rcfilters-filter-previousrevision-description": "ページの最新の変更ではない全ての変更。", "rcnotefrom": "以下は$3 $4以降の{{PLURAL:$5|更新です}} (最大 $1 件)。", "rclistfromreset": "日時指定をリセット", "rclistfrom": "$3の$2以降の更新を表示する", diff --git a/languages/i18n/kn.json b/languages/i18n/kn.json index be09de75ca..b83572c1ef 100644 --- a/languages/i18n/kn.json +++ b/languages/i18n/kn.json @@ -45,10 +45,10 @@ "tog-showtoolbar": "ಸಂಪಾದನೆಯ ಉಪಕರಣಗಳ ಪಟ್ಟಿಯನ್ನು ತೋರು", "tog-editondblclick": "ಎರಡು ಬಾರಿ ಕ್ಲಿಕ್ ಮಾಡಿದಾಗ ಪುಟವು ಸಂಪಾದಿಸುವಂತಾಗಲಿ", "tog-editsectiononrightclick": "ಪುಟದ ವಿಭಾಗಗಳನ್ನು ಅವುಗಳ ಶೀರ್ಷಿಕೆಯನ್ನು ಎರಡು ಬಾರಿ ಕ್ಲಿಕ್ ಮಾಡಿ ಸಂಪಾದನೆ ಮಾಡುವಂತೆ ಇರಲಿ", - "tog-watchcreations": "ನಾನು ಪ್ರಾರಂಭಿಸುವ ಲೇಖನಗಳನ್ನು ನನ್ನ ವೀಕ್ಷಣಾಪಟ್ಟಿಗೆ ಸೇರಿಸು", - "tog-watchdefault": "ನಾನು ಸಂಪಾದಿಸುವ ಪುಟಗಳನ್ನು ವೀಕ್ಷಣಾಪಟ್ಟಿಗೆ ಸೇರಿಸು", - "tog-watchmoves": "ನಾನು ಸ್ಥಳಾಂತರಿಸುವ ಪುಟಗಳನ್ನು ನನ್ನ ವೀಕ್ಷಣಾಪಟ್ಟಿಗೆ ಸೇರಿಸು", - "tog-watchdeletion": "ನಾನು ಅಳಿಸುವ ಪುಟಗಳನ್ನು ನನ್ನ ವೀಕ್ಷಣಾ ಪಟ್ಟಿಗೆ ಸೇರಿಸು", + "tog-watchcreations": "ನಾನು ಪ್ರಾರಂಭಿಸುವ ಲೇಖನಗಳನ್ನು ಮತ್ತು ಕಡತಗಳನ್ನು ನನ್ನ ವೀಕ್ಷಣಾಪಟ್ಟಿಗೆ ಸೇರಿಸು", + "tog-watchdefault": "ನಾನು ಸಂಪಾದಿಸುವ ಪುಟಗಳನ್ನು ಮತ್ತು ಕಡತಗಳನ್ನು ವೀಕ್ಷಣಾಪಟ್ಟಿಗೆ ಸೇರಿಸು", + "tog-watchmoves": "ನಾನು ಸ್ಥಳಾಂತರಿಸುವ ಪುಟಗಳನ್ನು ಮತ್ತು ಕಡತಗಳನ್ನು ನನ್ನ ವೀಕ್ಷಣಾಪಟ್ಟಿಗೆ ಸೇರಿಸು", + "tog-watchdeletion": "ನಾನು ಅಳಿಸುವ ಪುಟಗಳನ್ನು ಮತ್ತು ಕಡತಗಳನ್ನು ನನ್ನ ವೀಕ್ಷಣಾ ಪಟ್ಟಿಗೆ ಸೇರಿಸು", "tog-watchuploads": "ನಾನು ಹೊಸದಾಗಿ ಅಪ್‍ಲೋಡ್ ಮಾಡಿದ ಫೈಲ್‍ಗಳನ್ನು ನನ್ನ ವೀಕ್ಷಣಾಪಟ್ಟಿಗೆ ಸೇರಿಸು", "tog-watchrollback": "ನಾನು ಹಿಮ್ಮರಳುವಿಕೆಯನ್ನು ನಡೆಸಿದ ಪುಟಗಳನ್ನು ನನ್ನ ಗಮನಸೂಚಿಗೆ ಸೇರಿಸು", "tog-minordefault": "ನನ್ನ ಎಲ್ಲಾ ಸಂಪಾದನೆಗಳನ್ನು ಚುಟುಕಾದವು ಎಂದು ಗುರುತು ಮಾಡು", @@ -60,7 +60,7 @@ "tog-enotifrevealaddr": "ಪ್ರಕಟಣೆ ಇ-ಅಂಚೆಗಳಲ್ಲಿ ನನ್ನ ಇ-ಅಂಚೆ ವಿಳಾಸ ತೋರು", "tog-shownumberswatching": "ಪುಟವನ್ನು ವೀಕ್ಷಿಸುತ್ತಿರುವ ಸದಸ್ಯರ ಸಂಖ್ಯೆಯನ್ನು ತೋರಿಸು", "tog-oldsig": "ನಿಮ್ಮ ಪ್ರಸ್ತುತ ಸಹಿ", - "tog-fancysig": "ಸರಳ ಸಹಿಗಳು (ಕೊಂಡಿ ಇಲ್ಲದಿರುವಂತೆ)", + "tog-fancysig": "ಸಹಿಗಳನ್ನು ವಿಕಿಟೆಕ್ಸ್ ಎಂದು ಪರಿಗಣಿಸಿ (ಸ್ವಯಂಚಾಲಿತ ಲಿಂಕ್ ಇಲ್ಲದೆ)", "tog-uselivepreview": "ನೇರ ಮುನ್ನೋಟವನ್ನು ಉಪಯೋಗಿಸಿ", "tog-forceeditsummary": "ಸಂಪಾದನೆ ಸಾರಾಂಶವನ್ನು ಖಾಲಿ ಬಿಟ್ಟಲ್ಲಿ ನೆನಪಿಸು", "tog-watchlisthideown": "ವೀಕ್ಷಣಾ ಪಟ್ಟಿಯಲ್ಲಿ ನನ್ನ ಸಂಪಾದನೆಗಳನ್ನು ತೋರಿಸಬೇಡ", @@ -69,20 +69,20 @@ "tog-watchlisthideliu": "ಲಾಗ್ ಇನ್ ಆಗಿರುವ ಸದಸ್ಯರ ಸಂಪಾದನೆಗಳನ್ನು ವೀಕ್ಷಣಾಪಟ್ಟಿಯಲ್ಲಿ ಅಡಗಿಸು", "tog-watchlistreloadautomatically": "ಯಾವುದೇ ಫಿಲ್ಟರು ಬದಲಾದಾಗ ವೀಕ್ಷಣಾಪಟ್ಟಿ ಮತ್ತೆ ಲೋಡ್ ಆಗಲಿ (ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಇರಬೇಕು)", "tog-watchlisthideanons": "ಅನಾಮಧೇಯ ಬಳಕೆದಾರರ ಸಂಪಾದನೆಗಳನ್ನು ವೀಕ್ಷಣಾಪಟ್ಟಿಯಲ್ಲಿ ಅಡಗಿಸು", - "tog-watchlisthidepatrolled": "ವೀಕ್ಷಣಾ ಪತ್ತಿಯಲ್ಲಿ ಹಸ್ತುಕದರ್ ಬದಲಾವಣೆಗಳನ್ನು ಅದಗಿಸು", + "tog-watchlisthidepatrolled": "ವೀಕ್ಷಣಾ ಪಟ್ಟಿಯಲ್ಲಿ ಗಸ್ತು ತಿರುಗಿದ ಬದಲಾವಣೆಗಳನ್ನು ಅದಗಿಸು", "tog-watchlisthidecategorization": "ಪುಟಗಳ ವರ್ಗೀಕರಣವನ್ನು ಅಡಗಿಸು", "tog-ccmeonemails": "ಇತರರಿಗೆ ನಾನು ಕಳುಹಿಸುವ ಇ-ಅಂಚೆಯ ಪ್ರತಿಯನ್ನು ನನಗೂ ಕಳುಹಿಸು", "tog-diffonly": "ವ್ಯತ್ಯಾಸಗಳ ಕೆಳಗಿರುವ ಪುಟದ ವಿವರಗಳನ್ನು ತೋರಿಸಬೇಡ", "tog-showhiddencats": "ಅಡಗಿಸಲ್ಪಟ್ಟ ವರ್ಗಗಳನ್ನು ತೋರಿಸು", - "tog-norollbackdiff": "ತೊಡೆದುಹಾಕಿದ ನಂತರ ವ್ತ್ಯತ್ಯಾಸವನ್ನು ತೋರಿಸಬೇಡ", + "tog-norollbackdiff": "ಹಿಮ್ಮರಳುವಿಕೆಯ ನಂತರ ವ್ತ್ಯತ್ಯಾಸವನ್ನು ತೋರಿಸಬೇಡ", "tog-useeditwarning": "ಸಂಪಾದನೆಯನ್ನು ಉಳಿಸದೆ ಹೊರಟಲ್ಲಿ ನನಗೆ ಎಚ್ಚರಿಸು", "tog-prefershttps": "ಯಾವತ್ತು ಸಹ ಲಾಗಿನ್ ನಂತರ ಸುರಕ್ಷಿತ ಸಂಪರ್ಕವನ್ನು ಬಳಸಿ", "underline-always": "ಯಾವಾಗಲೂ", "underline-never": "ಎಂದಿಗೂ ಇಲ್ಲ", "underline-default": "ಬ್ರೌಸರ್‍ನ ಯಥಾಸ್ಥಿತಿ", "editfont-style": "ಬದಲಾಣೆಯ ಜಾಗಾದ ಬರಿಯುವ ಶೈಲ", - "editfont-default": "ಬ್ರೌಸರದ ಯಥಾಸ್ಥಿತಿ", - "editfont-monospace": "ಒಂದುಸ್ಥಳದ ಮುದ್ರಲಿಪಿ", + "editfont-default": "ಬ್ರೌಸರ್‍ನ ಯಥಾಸ್ಥಿತಿ", + "editfont-monospace": "ಮೊನೊಸ್ಪೇಸ್ ಮುದ್ರಲಿಪಿ", "editfont-sansserif": "ಸಾನ್ಸ್-ಸೆರಿಫ಼್ ಮುದ್ರಲಿಪಿ", "editfont-serif": "ಸೆರಿಫ಼್ ಮುದ್ರಲಿಪಿ", "sunday": "ಭಾನುವಾರ", @@ -198,6 +198,7 @@ "searcharticle": "ಹೋಗು", "history": "ಪುಟದ ಇತಿಹಾಸ", "history_short": "ಇತಿಹಾಸ", + "history_small": "ಇತಿಹಾಸ", "updatedmarker": "ನನ್ನ ಕೊನೆಯ ವೀಕ್ಷಣೆಯ ನಂತರ ಬದಲಾಗಿರುವವು", "printableversion": "ಪ್ರಿಂಟ್ ಆವೃತ್ತಿ", "permalink": "ಸ್ಥಿರ ಕೊಂಡಿ", @@ -229,6 +230,8 @@ "talk": "ಚರ್ಚೆ", "views": "ನೋಟಗಳು", "toolbox": "ಉಪಕರಣಗಳು", + "tool-link-userrights": "{{GENDER:$1|ಬಳಕೆದಾರರ}} ಗುಂಪುಗಳನ್ನು ಬದಲಾಯಿಸಿ", + "tool-link-userrights-readonly": "{{GENDER:$1|ಬಳಕೆದಾರರ}} ಗುಂಪುಗಳನ್ನು ವೀಕ್ಷಿಸಿ", "userpage": "ಸದಸ್ಯರ ಪುಟವನ್ನು ವೀಕ್ಷಿಸು", "projectpage": "ಯೋಜನೆಯ ಪುಟವನ್ನು ನೋಡು", "imagepage": "ಕಡತದ ಪುಟ ವೀಕ್ಷಿಸಿ", @@ -241,7 +244,7 @@ "redirectedfrom": "($1 ಇಂದ ಪುನರ್ನಿರ್ದೇಶಿತ)", "redirectpagesub": "ಪುನರ್ನಿರ್ದೇಶನ ಪುಟ", "redirectto": "ಪುನರ್ನಿರ್ದೇಶನ ಇದಕ್ಕೆ:", - "lastmodifiedat": "ಈ ಪುಟವನ್ನು $ 2 ರಂದು ಕೊನೆಯಾಗಿ $ 2 ರಲ್ಲಿ ಸಂಪಾದಿಸಲಾಯಿತು.", + "lastmodifiedat": "ಈ ಪುಟವನ್ನು $1, $2 ರಂದು ಕೊನೆಯಾಗಿ ಸಂಪಾದಿಸಲಾಯಿತು.", "viewcount": "ಈ ಪುಟವನ್ನು {{PLURAL:$1|೧ ಬಾರಿ|$1 ಬಾರಿ}} ವೀಕ್ಷಿಸಲಾಗಿದೆ.", "protectedpage": "ಸಂರಕ್ಷಿತ ಪುಟ", "jumpto": "ಇಲ್ಲಿಗೆ ಹೋಗು:", @@ -362,7 +365,7 @@ "badtitletext": "ನೀವು ಕೋರಿದ ಪುಟದ ಶೀರ್ಷಿಕೆ ಸಿಂಧುವಲ್ಲದ್ದು ಅಥವ ಖಾಲಿ ಅಥವ ಸರಿಯಾದ ಕೊಂಡಿಯಲ್ಲದ ಅಂತರ-ಭಾಷೆ/ಅಂತರ-ವಿಕಿ ಸಂಪರ್ಕವಾಗಿದೆ.\nಅದರಲ್ಲಿ ಒಂದು ಅಥವ ಹೆಚ್ಚು ಶೀರ್ಷಿಕೆಯಲ್ಲಿ ಬಳಸಲು ನಿಷಿದ್ಧವಾಗಿರುವ ಅಕ್ಷರಗಳು ಇರಬಹುದು.", "title-invalid-empty": "ಮನವಿ ಮಾಡಲಾದ ಪುಟದ ಶೀರ್ಷಿಕೆಯು ಖಾಲಿಯಾಗಿದೆ ಅಥವ ಕೇವಲ ನಾಮಸ್ಥಳದ ಹೆಸರನ್ನು ಮಾತ್ರ ಹೊಂದಿದೆ.", "title-invalid-utf8": "ಮನವಿ ಮಾಡಲಾದ ಪುಟದ ಶೀರ್ಷಿಕೆಯು ಒಂದು ಅಮಾನ್ಯವಾದ UTF-8 ಅನುಕ್ರಮವನ್ನು ಹೊಂದಿದೆ.", - "title-invalid-interwiki": "ಶೀರ್ಷಿಕೆಯು ಅಂತರ-ವಿಕಿ ಕೊಂಡಿಯನ್ನು ಹೊಂದಿದೆ", + "title-invalid-interwiki": "ವಿನಂತಿಸಿದ ಪುಟದ ಶೀರ್ಷಿಕೆಯು ಅಂತರ-ವಿಕಿ ಕೊಂಡಿಯನ್ನು ಒಳಗೊಂಡಿದೆ, ಅದನ್ನು ಶೀರ್ಷಿಕೆಗಳಲ್ಲಿ ಬಳಸಲಾಗುವುದಿಲ್ಲ.", "title-invalid-talk-namespace": "ಮನವಿ ಮಾಡಲಾದ ಪುಟದ ಶೀರ್ಷಿಕೆಯು ಒಂದು ಅಸ್ತಿತ್ವದಲ್ಲಿರದೆ ಇರುವ ಮಾತಿನ ಪುಟವನ್ನು ಸೂಚಿಸುತ್ತದೆ.", "title-invalid-characters": "ಮನವಿ ಮಾಡಲಾದ ಪುಟದ ಶೀರ್ಷಿಕೆಯು ಅಮಾನ್ಯವಾದ ಅಕ್ಷರಗಳನ್ನು ಹೊಂದಿದೆ: \"$1\".", "title-invalid-relative": "ಶೀರ್ಷಿಕೆಯು ಒಂದು ಸಾಂದರ್ಭಿಕ ಮಾರ್ಗವಾಗಿರುತ್ತದೆ. ಸಾಂಧರ್ಭಿಕ ಪುಟದ ಶೀರ್ಷಿಕೆಗಳು (./, ../) ಅಮಾನ್ಯವಾಗಿರುತ್ತದೆ, ಏಕೆಂದರೆ ಬಳಕೆದಾರರ ಜಾಲವೀಕ್ಷಕದಿಂದ ಅವುಗಳನ್ನು ತಲುಪುವುದು ಸಾಮಾನ್ಯವಾಗಿ ಅಸಾಧ್ಯವಾಗಿರುತ್ತದೆ.", @@ -460,18 +463,20 @@ "noname": "ನೀವು ಸರಿಯಾದ ಬಳಕೆದಾರ ಹೆಸರನ್ನು ಸೂಚಿಸಿಲ್ಲ.", "loginsuccesstitle": "ಲಾಗಿನ್ ಯಶಸ್ವಿ", "loginsuccess": "ನೀವು ಈಗ \"$1\" ಆಗಿ ವಿಕಿಪೀಡಿಯಕ್ಕೆ ಲಾಗಿನ್ ಆಗಿದ್ದೀರಿ.", - "nosuchuser": "\"$1\" ಹೆಸರಿನ ಯಾವ ಸದಸ್ಯರೂ ಇಲ್ಲ.\nಸದಸ್ಯನಾಮದಲ್ಲಿ ಲಘು ಮತ್ತು ದೀರ್ಘ ಅಕ್ಷರಗಳಲ್ಲಿ ವ್ಯತ್ಯಾಸವಿದೆ.\nಕಾಗುಣಿತವನ್ನು ಪರೀಕ್ಷಿಸಿ, ಅಥವಾ [[Special:CreateAccount|ಹೊಸ ಸದಸ್ಯತ್ವ ಖಾತೆಯನ್ನು ಸೃಷ್ಟಿಸಿ]].", + "nosuchuser": "\"$1\" ಹೆಸರಿನ ಯಾವ ಸದಸ್ಯರೂ ಇಲ್ಲ.\nಸದಸ್ಯನಾಮದಲ್ಲಿ ಲಘು ಮತ್ತು ದೀರ್ಘ ಅಕ್ಷರಗಳಲ್ಲಿ ಸೂಕ್ಷ್ಮವಾದ ವ್ಯತ್ಯಾಸವಿದೆ.\nಕಾಗುಣಿತವನ್ನು ಪರೀಕ್ಷಿಸಿ, ಅಥವಾ [[Special:CreateAccount|ಹೊಸ ಸದಸ್ಯತ್ವ ಖಾತೆಯನ್ನು ಸೃಷ್ಟಿಸಿ]].", "nosuchusershort": "\"$1\" ಹೆಸರಿನ ಸದಸ್ಯರು ಯಾರೂ ಇಲ್ಲ.\nಹೆಸರಲ್ಲಿ ಕಾಗುಣಿತ ತಪ್ಪಿದೆಯೆ ಎಂದು ಪರೀಕ್ಷಿಸಿ.", "nouserspecified": "ನೀವು ಒಂದು ಸದಸ್ಯತ್ವದ ಹೆಸರನ್ನು ಸೂಚಿಸಬೇಕು.", "login-userblocked": "ಈ ಬಳಕೆದಾರರನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ. ಲಾಗಿನ್ ಆಗಲು ಸಾದ್ಯವಿಲ್ಲ.", "wrongpassword": "ತಪ್ಪು ಪ್ರವೇಶ ಪದ ನೀಡಿರುವಿರಿ. ಮತ್ತೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ.", "wrongpasswordempty": "ಖಾಲಿ ಪ್ರವೇಶ ಪದವನ್ನು ನೀಡಿರುವಿರಿ. ಮತ್ತೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ.", "passwordtooshort": "ಪ್ರವೇಶಪದ ಕನಿಷ್ಟ {{PLURAL:$1|೧ ಅಕ್ಷರವನ್ನು|$1 ಅಕ್ಷರಗಳನ್ನು}} ಹೊಂದಿರಬೇಕು.", + "passwordtoolong": "ಪ್ರವೇಶ ಸಂಕೇತ ಪದ ಕನಿಷ್ಟ {{PLURAL:$1|೧ ಅಕ್ಷರವನ್ನು|$1 ಅಕ್ಷರಗಳನ್ನು}} ಹೊಂದಿರಬೇಕು.", + "passwordtoopopular": "ಸಾಮಾನ್ಯವಾಗಿ ಆಯ್ಕೆ ಮಾಡಿದ ಪ್ರವೇಶ ಸಂಕೇತ ಪದಗಳನ್ನು ಬಳಸಲಾಗುವುದಿಲ್ಲ. ದಯವಿಟ್ಟು ಇನ್ನಷ್ಟು ಅನನ್ಯ ಪ್ರವೇಶ ಸಂಕೇತ ಪದಗಳನ್ನು ಅನ್ನು ಆಯ್ಕೆ ಮಾಡಿ.", "password-name-match": "ನಿಮ್ಮ ಬಳಕೆದಾರ ಹೆಸರಿನಿಂದ ಪ್ರವೇಶಪದ ವಿಭಿನ್ನವಾಗಿರಬೇಕು.", "password-login-forbidden": "ಈ ಬಳಕೆದಾರರ ಹೆಸರು ಮತ್ತು ಪ್ರವೇಶಪದವನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ.", "mailmypassword": "ಪ್ರವೇಶಪದವನ್ನು ಪುನಃಸ್ಥಾಪಿಸಿ.", "passwordremindertitle": "{{SITENAME}}ಗೆ ಹೊಸ ತಾತ್ಕಾಲಿಕ ಪ್ರವೇಶ ಪದ", - "passwordremindertext": "{{SITENAME}} ($4) ಸೈಟಿಗೆ ಹೊಸ ಪ್ರವೇಶಪದವನ್ನು $1 ಐ.ಪಿ. ವಿಳಾಸದಿಂದ ಕೋರಲಾಗಿದೆ.\nಸದಸ್ಯ \"$2\" ಅವರ ಹೊಸ ಪ್ರವೇಶಪದ ಈಗ \"$3\".\nನೀವು ಲಾಗ್ ಇನ್ ಆಗಿ ತಮ್ಮ ಪ್ರವೇಶಪದವನ್ನು ಬದಲಾಯಿಸಿ.\n\nನೀವು ಈ ಕೋರಿಕೆಯನ್ನು ಮಾಡಿಲ್ಲದಿದ್ದರೆ, ಅಥವ ನೀವು ನಿಮ್ಮ ಹಳೆಯ ಪ್ರವೇಶಪದವನ್ನು ನೆನಪಿಸಿಕೊಂಡರೆ ಈ ಮಾಹಿತಿಗೆ ಗಮನ ನೀಡದೆ ನಿಮ್ಮ ಹಳೆಯ ಪ್ರವೇಶಪದವನ್ನು ಉಪಯೋಗಿಸಲು ಮುಂದುವರೆಸಿರಿ.", + "passwordremindertext": "{{SITENAME}} ($4) ಸೈಟಿಗೆ ಹೊಸ ಪ್ರವೇಶಪದವನ್ನು $1 ಐ.ಪಿ. ವಿಳಾಸದಿಂದ ಕೋರಲಾಗಿದೆ.\nಸದಸ್ಯ \"$2\" ಅವರ ಹೊಸ ಪ್ರವೇಶಪದ ಈಗ \"$3\".\nನೀವು ಲಾಗ್ ಇನ್ ಆಗಿ ತಮ್ಮ ಪ್ರವೇಶಪದವನ್ನು ಬದಲಾಯಿಸಿ.\nನಿಮ್ಮ ತಾತ್ಕಾಲಿಕ ಪಾಸ್ವರ್ಡ್ {{PLURAL:$5|ಒಂದು ದಿನ|$5 ದಿನಗಳಲ್ಲಿ}}. ಕೊನೆಗೊಳ್ಳಲಿದೆ.\nನೀವು ಈ ಕೋರಿಕೆಯನ್ನು ಮಾಡಿಲ್ಲದಿದ್ದರೆ, ಅಥವ ನೀವು ನಿಮ್ಮ ಹಳೆಯ ಪ್ರವೇಶಪದವನ್ನು ನೆನಪಿಸಿಕೊಂಡರೆ ಈ ಮಾಹಿತಿಗೆ ಗಮನ ನೀಡದೆ ನಿಮ್ಮ ಹಳೆಯ ಪ್ರವೇಶಪದವನ್ನು ಉಪಯೋಗಿಸಲು ಮುಂದುವರೆಸಿರಿ.", "noemail": "ಸದಸ್ಯ \"$1\" ಅವರ ಹೆಸರಿನಲ್ಲಿ ಯಾವ ಇ-ಅಂಚೆ ವಿಳಾಸವೂ ದಾಖಲಾಗಿಲ್ಲ.", "noemailcreate": "ನೀವು ಬಳಕೆಯಲ್ಲಿರುವ ಮಿಂಚಂಚೆ ವಿಳಾಸ ನೀಡಬೇಕಾಗುವುದು.", "passwordsent": "\"$1\" ಅವರ ಹೆಸರಿನಲ್ಲಿ ನೋಂದಾಯಿತವಾದ ಇ-ಅಂಚೆ ವಿಳಾಸಕ್ಕೆ ಹೊಸ ಪ್ರವೇಶಪದವನ್ನು ಕಳುಹಿಸಲಾಗಿದೆ.\nಅದನ್ನು ಪಡೆದ ಮೇಲೆ ಮತ್ತೆ ಲಾಗಿನ್ ಆಗಿ.", @@ -479,24 +484,32 @@ "eauthentsent": "ನೀವು ನೊಂದಾಯಿಸಿದ ಇ-ಅಂಚೆ ವಿಳಾಸಕ್ಕೆ ಧೃಡೀಕರಣ ಅಂಚೆಯನ್ನು ಕಳುಹಿಸಲಾಗಿದೆ.\nಈ ವಿಳಾಸಕ್ಕೆ ಮುಂದೆ ಯಾವುದೇ ಇ-ಅಂಚೆ ಕಳುಹಿಸಲ್ಪಡುವ ಮುನ್ನ ನೀವು ಈ ಕಳುಹಿಸಿರುವ ಅಂಚೆಯಲ್ಲಿನ ನಿರ್ದೇಶನಗಳನ್ನು ಪಾಲಿಸಿ, ಈ ವಿಳಾಸವು ನಿಮ್ಮದೇ ಎಂದು ಧೃಡೀಕರಿಸಬೇಕು.", "throttled-mailpassword": "ಕಳೆದ $1 ಗಂಟೆಗಳ ಒಳಗೆ ಒಂದು ಪ್ರವೇಶ ಪದವನ್ನು ಕಳುಹಿಸಲಾಗಿದೆ.\nದುರುಪಯೋಗಗಳನ್ನು ತಡೆಗಟ್ಟಲು ಪ್ರವೇಶಪದಗಳನ್ನು ಪ್ರತಿ {{PLURAL:$1|ಗಂಟೆಗೆ|$1 ಗಂಟೆಗಳಲ್ಲಿ}} ಕೇವಲ ಒಂದು ಬಾರಿ ಕಳುಹಿಸಲಾಗುವುದು.", "mailerror": "ಅಂಚೆ ಕಳುಹಿಸುವಲ್ಲಿ ದೋಷ: $1", - "acct_creation_throttle_hit": "ಕ್ಷಮಿಸಿ, ನೀವಾಗಲೇ{{PLURAL:$1|೧ ಖಾತೆಯನ್ನು|$1 ಖಾತೆಗಳನ್ನು}} ತೆರೆದಿದ್ದೀರಿ.\nಇನ್ನು ಹೆಚ್ಚಿನ ಖಾತೆಗಳನ್ನು ತೆರೆಯಲಾಗುವುದಿಲ್ಲ.", + "acct_creation_throttle_hit": "ಕ್ಷಮಿಸಿ, ನೀವಾಗಲೇ{{PLURAL:$1|೧ ಖಾತೆಯನ್ನು|$1 ಖಾತೆಗಳನ್ನು}} ತೆರೆದಿದ್ದೀರಿ. ಕಳೆದ $2, ಅವಧಿಯಲ್ಲಿ ಅನುಮತಿಸಲಾದ ಗರಿಷ್ಠ.\nಇನ್ನು ಹೆಚ್ಚಿನ ಖಾತೆಗಳನ್ನು ತೆರೆಯಲಾಗುವುದಿಲ್ಲ.", "emailauthenticated": "ನಿಮ್ಮ ಇ-ಅಂಚೆ ವಿಳಾಸವು ದಿನಾಂಕ $2 ಸಮಯ $3 ಅಂದು ಧೃಡೀಕೃತವಾಗಿದೆ.", "emailnotauthenticated": "ನಿಮ್ಮ ಇ-ಅಂಚೆ ವಿಳಾಸ ಇನ್ನೂ ಧೃಡೀಕೃತವಾಗಿಲ್ಲ.\nಈ ಕೆಳಗಿನ ಆಯ್ಕೆಗಳಿಗೆ ಇ-ಅಂಚೆಯನ್ನು ನಿಮಗೆ ಕಳುಹಿಸಲು ಆಗುವುದಿಲ್ಲ.", "noemailprefs": "ಈ ಸೌಲಭ್ಯಗಳು ಕೆಲಸ ಮಾಡಬೇಕಾದರೆ ಒಂದು ಇ-ಅಂಚೆ ವಿಳಾಸವನ್ನು ನಮೂದಿಸಿ.", "emailconfirmlink": "ನಿಮ್ಮ ಇ-ಅಂಚೆ ವಿಳಾಸವನ್ನು ಧೃಡೀಕರಿಸಿ", "invalidemailaddress": "ಈ ಇ-ಅಂಚೆ ವಿಳಾಸವು ಸರಿಯಾದ ಪ್ರಕಾರದಲ್ಲಿ ಇಲ್ಲದಿರುವುದರಿಂದ ಇದನ್ನು ಸ್ವೀಕಾರ ಮಾಡಲಾಗುವುದಿಲ್ಲ.\nದಯವಿಟ್ಟು ಸರಿಯಾದ ಪ್ರಕಾರದ ವಿಳಾಸವನ್ನು ಸೇರಿಸಿ ಅಥವ ಆ ಚೌಕವನ್ನು ಖಾಲಿ ಬಿಡಿ.", + "cannotchangeemail": "ಈ ವಿಕಿ ಖಾತೆಯಲ್ಲಿ ಇಮೇಲ್ ವಿಳಾಸಗಳನ್ನು ಬದಲಾಯಿಸಲಾಗುವುದಿಲ್ಲ.", "emaildisabled": "ಈ ಜಾಲತಾಣವು ಮಿಂಚಂಚೆ ಕಳುಹಿಸಲು ಸಾದ್ಯವಿಲ್ಲ.", "accountcreated": "ಖಾತೆಯನ್ನು ಸೃಷ್ಟಿಸಲಾಯಿತು", - "accountcreatedtext": "$1 ಅವರ ಬಳಕೆದಾರ ಖಾತೆ ಸೃಷ್ಟಿಸಲ್ಪಟ್ಟಿದೆ.", + "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|ಚರ್ಚೆ]])\n, ಅವರ ಬಳಕೆದಾರ ಖಾತೆ ಸೃಷ್ಟಿಸಲ್ಪಟ್ಟಿದೆ.", "createaccount-title": "{{SITENAME}} ತಾಣಕ್ಕೆ ಬಳಕೆದಾರ ಖಾತೆ ಸೃಷ್ಟಿ ಮಾಡುವಿಕೆ", "createaccount-text": "ನಿಮ್ಮ ಇ-ಅಂಚೆ ವಿಳಾಸ ನೀಡಿ {{SITENAME}} ($4) ಅಲ್ಲಿ ಯಾರೊ \"$2\" ಹೆಸರಿನ ಖಾತೆಯೊಂದನ್ನು ತೆಗೆದಿದ್ದಾರೆ, ಮತ್ತು ಅದರ ಪ್ರವೇಶ ಪದ \"$3\".\nನೀವು ಲಾಗ್ ಇನ್ ಆಗಿ ನಿಮ್ಮ ಪ್ರವೇಶ ಪದವನ್ನು ಬದಲಾಯಿಸಬೇಕು.\n\nಆ ಖಾತೆ ತಪ್ಪಾಗಿ ತೆಗೆದಿದ್ದಲ್ಲಿ, ಈ ಸಂದೇಶವನ್ನು ನೀವು ಅಲಕ್ಷಿಸಬಹುದು.", + "login-throttled": "ನೀವು ಬಹಳ ಸಾರಿ ಲಾಗ್ ಇನ್ ಆಗಲು ಪ್ರಯತ್ನಿಸಿರುವಿರಿ. \nಮತ್ತೆ ಪ್ರಯತ್ನಿಸಲು $1 ಕಾಯಬೇಕು.", "login-abort-generic": "ನಿಮ್ಮ ಲಾಗಿನ್ ಪಲಪ್ರದವಾಗಿಲ್ಲ-ವಿಫಲವಾಗಿದೆ", + "login-migrated-generic": "ನಿಮ್ಮ ಖಾತೆಯನ್ನು ಸ್ಥಳಾಂತರಗೊಳಿಸಲಾಗಿದೆ, ಮತ್ತು ನಿಮ್ಮ ಬಳಕೆದಾರಹೆಸರು ಈ ವಿಕಿ ಯಲ್ಲಿ ಅಸ್ತಿತ್ವದಲ್ಲಿಲ್ಲ.", "loginlanguagelabel": "ಭಾಷೆ: $1", + "suspicious-userlogout": "ಲಾಗ್ ಔಟ್ ಮಾಡಲು ನಿಮ್ಮ ವಿನಂತಿಯನ್ನು ನಿರಾಕರಿಸಲಾಗಿದೆ ಏಕೆಂದರೆ ಅದು ಮುರಿದ ಬ್ರೌಸರ್ ಅಥವಾ ಕ್ಯಾಶಿಂಗ್ ಪ್ರಾಕ್ಸಿನಿಂದ ಕಳುಹಿಸಲ್ಪಟ್ಟಿದೆ ಎಂದು ತೋರುತ್ತಿದೆ.", "createacct-another-realname-tip": "ಹೆಸರು ನೀಡುವುದು ಐಚ್ಛಿಕ. ನೀವು ಅದನ್ನು ನೀಡಿದಲ್ಲಿ ನಿಮ್ಮ ಕಾಣಿಕೆಗಳಿಗೆ ನಿಮಗೆ ಮನ್ನಣೆ ನೀಡಲಾಗುವುದು.", "pt-login": "ಲಾಗ್ ಇನ್", "pt-login-button": "ಲಾಗ್ ಇನ್", + "pt-login-continue-button": "ಲಾಗಿನ್ ಮುಂದುವರಿಸಿ", "pt-createaccount": "ಹೊಸ ಖಾತೆ ತೆರೆಯಿರಿ", "pt-userlogout": "ಲಾಗ್ ಔಟ್", + "php-mail-error-unknown": "PHP's mail() ಕಾರ್ಯದಲ್ಲಿ ಅಜ್ಞಾತ ದೋಷ.", + "user-mail-no-addy": "ಇಮೇಲ್ ವಿಳಾಸವಿಲ್ಲದೆ ಇಮೇಲ್ ಕಳುಹಿಸಲು ಪ್ರಯತ್ನಿಸಿದರು.", + "user-mail-no-body": "ಖಾಲಿ ಅಥವಾ ಅವಿವೇಕದ ಚಿಕ್ಕ ದೇಹದೊಂದಿಗೆ ಇಮೇಲ್ ಕಳುಹಿಸಲು ಪ್ರಯತ್ನಿಸಿದರು.", "changepassword": "ಪ್ರವೇಶ ಪದ ಬದಲಾಯಿಸಿ", "resetpass_announce": "ಲಾಗ್ ಇನ್ ಪೂರ್ಣಗೊಳಿಸಲು ನೀವು ಹೊಸ ಪ್ರವೇಶಪದವನ್ನು ನಮೂದಿಸಬೇಕು.", "resetpass_header": "ಖಾತೆಯ ಪ್ರವೇಶಪದ ಬದಲಾಯಿಸಿ", @@ -517,8 +530,8 @@ "passwordreset-username": "ಬಳಕೆದಾರರ ಹೆಸರು:", "passwordreset-domain": "ಕ್ಷೇತ್ರ:", "passwordreset-email": "ಇ-ಮೇಲ್ ವಿಳಾಸ:", - "passwordreset-emailsentemail": "ಪ್ರವೇಶಪದವನ್ನು ಪುನಃಸ್ಥಾಪಿಸಿದ ಮಿಂಚಂಚೆಯನ್ನು ಕಳುಹಿಸಲಾಗಿದೆ.", - "changeemail": "ಮಿಂಚಂಚೆ ವಿಳಾಸವನ್ನು ಬದಲಾಯಿಸಿ", + "passwordreset-emailsentemail": "ಈ ಇಮೇಲ್ ವಿಳಾಸವು ನಿಮ್ಮ ಖಾತೆಯೊಂದಿಗೆ ಸಂಯೋಜಿತಗೊಂಡಿದ್ದರೆ, ಪ್ರವೇಶಪದ ಮರುಹೊಂದಿಸಲು ಇಮೇಲ್ ಅನ್ನು ಕಳುಹಿಸಲಾಗುತ್ತದೆ.", + "changeemail": "ಇಮೇಲ್ ವಿಳಾಸವನ್ನು ಬದಲಾಯಿಸಿ ಅಥವಾ ತೆಗೆದುಹಾಕಿ", "changeemail-no-info": "ನೀವು ಈ ಪುಟವನ್ನು ನೇರತಲುಪಲು ಲಾಗಿನ್ ಆಗಿರುವುದು ಆವಶ್ಯಕ.", "changeemail-oldemail": "ಪ್ರಸ್ತುತ ಮಿಂಚಂಚೆ ವಿಳಾಸ:", "changeemail-newemail": "ಹೊಸ ಇ-ಅಂಚೆ ವಿಳಾಸ:", @@ -576,12 +589,12 @@ "accmailtext": "[[User talk:$1|$1]] ಅವರ ಹೊಸ ಪ್ರವೇಶಪದ $2 ಗೆ ಕಳುಹಿಸಲಾಗಿದೆ.\n\nಈ ಖಾತೆಯ ಪ್ರವೇಶಪದವನ್ನು ಲಾಗಿನ್ ಆದ ನಂತರ ''[[Special:ChangePassword|ಪ್ರವೇಶಪದ ಬದಲಾವಣೆ]]'' ಪುಟದಲ್ಲಿ ಬದಲಾಯಿಸಬಹುದು.", "newarticle": "(ಹೊಸತು)", "newarticletext": "ಇನ್ನೂ ಅಸ್ಥಿತ್ವದಲ್ಲಿ ಇರದ ಪುಟದ ಲಿಂಕ್ ಅನ್ನು ನೀವು ಒತ್ತಿರುವಿರಿ.\nಈ ಪುಟವನ್ನು ಸೃಷ್ಟಿಸಲು ಕೆಳಗಿನ ಚೌಕದಲ್ಲಿ ಬರೆಯಲು ಆರಂಭಿಸಿರಿ.\n(ಹೆಚ್ಚು ಮಾಹಿತಿಗೆ [$1 ಸಹಾಯ ಪುಟ] ನೋಡಿ).\nಈ ಪುಟಕ್ಕೆ ನೀವು ತಪ್ಪಾಗಿ ಬಂದಿದ್ದಲ್ಲಿ ನಿಮ್ಮ ಬ್ರೌಸರ್‍ನ '''back''' ಬಟನ್ ಅನ್ನು ಒತ್ತಿ.", - "anontalkpagetext": "----''ಇದು ಖಾತೆಯೊಂದನ್ನು ಹೊಂದಿರದ ಅನಾಮಧೇಯ ಬಳಕೆದಾರರೊಬ್ಬರ ಚರ್ಚೆ ಪುಟ.\nಖಾತೆಯಿಲ್ಲದಿರುವುದರಿಂದ ಅವರನ್ನು ಗುರುತಿಸಲು ಅವರ IP ವಿಳಾಸವನ್ನು ಉಪಯೋಗಿಸುತ್ತಿದ್ದೇವೆ.\nಈ ರೀತಿಯ IP ವಿಳಾಸವು ಅನೇಕ ಬಳಕೆದಾರರಿಂದ ಉಪಯೋಗದಲ್ಲಿರಬಹುದು.\nನೀವು ಅನಾಮಧೇಯ ಬಳಕೆದಾರರಾಗಿದ್ದಲ್ಲಿ, ಹಾಗು ನಿಮಗೆ ಸಂಬಂಧವಿಲ್ಲದಂತ ಸಂದೇಶಗಳು ಬರುತ್ತಿವೆ ಎಂದು ಅನಿಸಿದರೆ, ಮುಂದೆ ಬೇರೆ ಅನಾಮಧೇಯ ಬಳಕೆದಾರರೊಂದಿಗೆ ತಪ್ಪಾಗಿ ಗುರುತಿಸಬಾರದೆಂದಿದ್ದರೆ ದಯವಿಟ್ಟು [[Special:CreateAccount|ಸದಸ್ಯರಾಗಿ]] ಅಥವ [[Special:UserLogin|ಲಾಗ್ ಇನ್ ಆಗಿ]].''", + "anontalkpagetext": "----\nಇದು ಖಾತೆಯೊಂದನ್ನು ಹೊಂದಿರದ ಅನಾಮಧೇಯ ಬಳಕೆದಾರರೊಬ್ಬರ ಚರ್ಚೆ ಪುಟ. ಖಾತೆಯಿಲ್ಲದಿರುವುದರಿಂದ ಅವರನ್ನು ಗುರುತಿಸಲು ಅವರ IP ವಿಳಾಸವನ್ನು ಉಪಯೋಗಿಸುತ್ತಿದ್ದೇವೆ.\nಈ ರೀತಿಯ IP ವಿಳಾಸವು ಅನೇಕ ಬಳಕೆದಾರರಿಂದ ಉಪಯೋಗದಲ್ಲಿರಬಹುದು.\nನೀವು ಅನಾಮಧೇಯ ಬಳಕೆದಾರರಾಗಿದ್ದಲ್ಲಿ, ಹಾಗು ನಿಮಗೆ ಸಂಬಂಧವಿಲ್ಲದಂತ ಸಂದೇಶಗಳು ಬರುತ್ತಿವೆ ಎಂದು ಅನಿಸಿದರೆ, ಮುಂದೆ ಬೇರೆ ಅನಾಮಧೇಯ ಬಳಕೆದಾರರೊಂದಿಗೆ ತಪ್ಪಾಗಿ ಗುರುತಿಸಬಾರದೆಂದಿದ್ದರೆ ದಯವಿಟ್ಟು [[Special:CreateAccount|ಸದಸ್ಯರಾಗಿ]] ಅಥವ [[Special:UserLogin|ಲಾಗ್ ಇನ್ ಆಗಿ]].''", "noarticletext": "ಈ ಪುಟದಲ್ಲಿ ಸದ್ಯಕ್ಕೆ ಏನೂ ಇಲ್ಲ.\nನೀವು ಇತರ ಪುಟಗಳಲ್ಲಿ [[Special:Search/{{PAGENAME}}|ಈ ಹೆಸರನ್ನು ಹುಡುಕಬಹುದು]],\n[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ಸಂಬಂಧಿತ ದಾಖಲೆಗಳನ್ನು ಹುಡುಕಬಹುದು],\nಅಥವ [{{fullurl:{{FULLPAGENAME}}|action=edit}} ಈ ಪುಟವನ್ನು ಸೃಷ್ಟಿಸಬಹುದು].", "noarticletext-nopermission": "ಈ ಪುಟದಲ್ಲಿ ಸದ್ಯಕ್ಕೆ ಯಾವ ಪಠ್ಯವೂ ಇಲ್ಲ.\nನೀವು ಇತರ ಪುಟಗಳಲ್ಲಿ [[Special:Search/{{PAGENAME}}|ಈ ಶೀರ್ಷಿಕೆಗಾಗಿ ಹುಡುಕಬಹುದು]], ಅಥವಾ [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ಸಂಬಂಧಿಸಿದ ದಾಖಲೆಗಳನ್ನು ಹುಡುಕಬಹುದು], ಆದರೆ ನಿಮಗೆ ಈ ಪುಟವನ್ನು ಸೃಷ್ಟಿಸಲು ಅನುಮತಿಯಿಲ್ಲ.", "userpage-userdoesnotexist": "ಬಳಕೆದಾರ ಖಾತೆ \"$1\" ದಾಖಲಾಗಿಲ್ಲ. ನೀವು ಇದೇ ಪುಟವನ್ನು ಸೃಷ್ಟಿ/ಸಂಪಾದನೆ ಮಾಡಬೇಕೆಂದಿರುವಿರಿ ಎಂದು ಖಾತ್ರಿ ಮಾಡಿಕೊಳ್ಳಿ.", "blocked-notice-logextract": "ಈ ಬಳಕೆದಾರರನ್ನು ಪ್ರಸ್ತುತವಾಗಿ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ. \nಇತ್ತೀಚಿನ ನಿರ್ಬಂಧನೆಯ ದಾಖಲೆಯನ್ನು ಉಲ್ಲೇಖಕ್ಕಾಗಿ ಕೆಳಗೆ ಕೊಟ್ಟಿದೆ:", - "usercssyoucanpreview": "'''ಗಮನಿಸಿ:''' ಉಳಿಸುವ ಮುನ್ನ 'ಮುನ್ನೋಟ' ಗುಂಡಿಯನ್ನು ಉಪಯೋಗಿಸಿ ನಿಮ್ಮ ಹೊಸ CSS ಅನ್ನು ಪ್ರಯೋಗ ಮಾಡಿ.", + "usercssyoucanpreview": "ಗಮನಿಸಿ: ಉಳಿಸುವ ಮುನ್ನ \"{{int:showpreview}}\" ಗುಂಡಿಯನ್ನು ಉಪಯೋಗಿಸಿ ನಿಮ್ಮ ಹೊಸ CSS ಅನ್ನು ಪ್ರಯೋಗ ಮಾಡಿ.", "userjsyoucanpreview": "'''ಗಮನಿಸಿ:''' ಉಳಿಸುವ ಮುನ್ನ 'ಮುನ್ನೋಟ' ಗುಂಡಿಯನ್ನು ಉಪಯೋಗಿಸಿ ನಿಮ್ಮ ಹೊಸ JS ಅನ್ನು ಪ್ರಯೋಗ ಮಾಡಿ.", "usercsspreview": "'''ನೆನಪಿಡಿ: ನೀವು ಇಲ್ಲಿ ಕೇವಲ ನಿಮ್ಮ ಬಳಕೆದಾರ CSSನ ಮುನ್ನೋಟ ನೋಡುತ್ತಿರುವಿರಿ.'''\n'''ಅದನ್ನು ಇನ್ನೂ ಉಳಿಸಲಾಗಿಲ್ಲ!'''", "userjspreview": "'''ಗಮನಿಸಿ: ನೀವು ನಿಮ್ಮ ಬಳಕೆದಾರ JavaScriptನ ಮುನ್ನೋಟ ನೋಡುತ್ತಿರುವಿರಿ ಅಥವ ಪ್ರಯೋಗ ಮಾಡುತ್ತಿರುವಿರಿ. ಅದನ್ನಿನ್ನೂ ಉಳಿಸಲಾಗಿಲ್ಲ!'''", diff --git a/languages/i18n/lb.json b/languages/i18n/lb.json index 3835ad587f..631f1f8e02 100644 --- a/languages/i18n/lb.json +++ b/languages/i18n/lb.json @@ -1306,6 +1306,7 @@ "rcfilters-filter-lastrevision-label": "Lescht Versioun", "rcfilters-filter-lastrevision-description": "Déi lescht Ännerung op enger Säit", "rcfilters-filter-previousrevision-label": "Méi fréi Versiounen", + "rcfilters-filter-previousrevision-description": "All Ännerungen, déi net déi rezenst Ännerung vun enger Säit sinn.", "rcnotefrom": "Hei drënner {{PLURAL:$5|gëtt d'Ännerung|ginn d'Ännerungen}} zanter $3, $4 (maximal $1 Ännerunge gi gewisen).", "rclistfrom": "Nei Ännerunge vum $3 $2 u weisen", "rcshowhideminor": "Kleng Ännerunge $1", diff --git a/languages/i18n/lv.json b/languages/i18n/lv.json index 28d987fd9c..0f4fb6200c 100644 --- a/languages/i18n/lv.json +++ b/languages/i18n/lv.json @@ -1108,6 +1108,7 @@ "rcfilters-filter-registered-description": "Pieslēgušies redaktori.", "rcfilters-filter-unregistered-label": "Nereģistrēti", "rcfilters-filter-unregistered-description": "Nepieslēgušies redaktori.", + "rcfilters-filtergroup-authorship": "Devuma autors", "rcfilters-filter-editsbyself-label": "Tavi labojumi", "rcfilters-filter-editsbyself-description": "Tevis veiktie labojumi.", "rcfilters-filter-editsbyother-label": "Citu labojumi", diff --git a/languages/i18n/mk.json b/languages/i18n/mk.json index 0b4642d072..987faf3578 100644 --- a/languages/i18n/mk.json +++ b/languages/i18n/mk.json @@ -666,7 +666,7 @@ "accmailtitle": "Лозинката е испратена.", "accmailtext": "На $2 е спратена е случајно создадена лозинка за [[User talk:$1|$1]] е испратена. Истата може да се смени на страницата ''[[Special:ChangePassword|Менување на лозинка]]'' откако ќе се најавите.", "newarticle": "(нова)", - "newarticletext": "Проследивте врска до страница која не постои.\nЗа да ја создадете страницата, напишете текст во полето подолу ([$1 помош]). Ако сте овде по грешка, само систнете на копчето '''назад''' во вашиот прелистувач.", + "newarticletext": "Дојдовте на врска до страница што не постои.\nЗа да ја создадете страницата, напишете текст во полето подолу ([$1 помош]). Ако сте овде по грешка, само систнете на копчето '''назад''' во вашиот прелистувач.", "anontalkpagetext": "----\nОва е страница за разговор со анонимен корисник кој сè уште не регистрирал корисничка сметка или не ја користи.\nЗатоа мораме да ја користиме неговата бројчена IP-адреса за да го препознаеме.\nЕдна ваква IP-адреса може да ја делат повеќе корисници.\nАко сте анонимен корисник и сметате дека кон вас се упатени нерелевантни коментари, тогаш [[Special:CreateAccount|создајте корисничка сметка]] или [[Special:UserLogin|најавете се]] за да избегнете поистоветување со други анонимни корисници во иднина.''", "noarticletext": "Таква страница сè уште не постои.\nМожете да проверите [[Special:Search/{{PAGENAME}}|дали насловот се споменува]] во други статии,\nда ги [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} пребарате дневниците],\nили да [{{fullurl:{{FULLPAGENAME}}|action=edit}} ја создадете].", "noarticletext-nopermission": "Таква страница сè уште не постои.\nМожете да проверите [[Special:Search/{{PAGENAME}}|дали насловот се споменува]] во други статии или пак да [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} пребарате поврзаните дневници], но немате дозвола да ја создадете страницата.", diff --git a/languages/i18n/ne.json b/languages/i18n/ne.json index 75b6c2b929..c28d728bc0 100644 --- a/languages/i18n/ne.json +++ b/languages/i18n/ne.json @@ -602,6 +602,7 @@ "watchthis": "यो पृष्ठ अवलोकन गर्नुहोस्", "savearticle": "सङ्ग्रह गर्ने", "savechanges": "परिवर्तन सङ्ग्रह गर्नुहोस्", + "publishchanges": "परिवर्तनहरू प्रकाशित गर्ने", "preview": "पूर्वावलोकन", "showpreview": "पूर्वालोकन देखाउनुहोस्", "showdiff": "परिवर्तन देखाउनुहोस्", @@ -2351,6 +2352,7 @@ "tooltip-ca-nstab-category": "श्रेणी पृष्ठ हेर्ने", "tooltip-minoredit": "यसलाई सामान्य सम्पादनको रुपमा चिनो लगाउने", "tooltip-save": "तपाईंका परिवर्तनहरू सङ्ग्रह गर्नुहोस्", + "tooltip-publish": "तपाईंका परिवर्तनहरू प्रकाशित गर्नुहोस्", "tooltip-preview": "तपाईंको परिवर्तनको पूर्वरूप , कृपया सङ्ग्रह गर्नु अघि यो प्रयोग गर्नुहोला !", "tooltip-diff": "तपाईंले पाठमा के के परिवर्तन गर्नुभयो भनेर देखाउने", "tooltip-compareselectedversions": "यस पृष्ठको छानिएका दुई पुनरावलोकन बीच फरक हेर्नुहोस्", diff --git a/languages/i18n/nl.json b/languages/i18n/nl.json index 35c3888b23..bc80c2ed9e 100644 --- a/languages/i18n/nl.json +++ b/languages/i18n/nl.json @@ -299,7 +299,7 @@ "otherlanguages": "In andere talen", "redirectedfrom": "(Doorverwezen vanaf $1)", "redirectpagesub": "Doorverwijspagina", - "redirectto": "Doorverwijzen naar:", + "redirectto": "Doorverwijzing naar:", "lastmodifiedat": "Deze pagina is voor het laatst bewerkt op $1 om $2.", "viewcount": "Deze pagina is {{PLURAL:$1|één keer|$1 keer}} bekeken.", "protectedpage": "Beveiligde pagina", diff --git a/languages/i18n/pl.json b/languages/i18n/pl.json index c04fca5ee4..fd95ccb2c5 100644 --- a/languages/i18n/pl.json +++ b/languages/i18n/pl.json @@ -1427,6 +1427,13 @@ "rcfilters-filter-minor-description": "Zmiany, które autor oznaczył jako drobne.", "rcfilters-filter-major-label": "Zmiany nie oznaczone jako drobne", "rcfilters-filter-major-description": "Zmiany nie oznaczone jako drobne.", + "rcfilters-filtergroup-watchlist": "Strony z listy obserwowanych", + "rcfilters-filter-watchlist-watched-label": "Z listy obserwowanych", + "rcfilters-filter-watchlist-watched-description": "Zmiany na stronach, które masz na liście obserwowanych.", + "rcfilters-filter-watchlist-watchednew-label": "Nowe zmiany na obserwowanych stronach", + "rcfilters-filter-watchlist-watchednew-description": "Zmiany na obserwowanych stronach, których jeszcze nie odwiedziłeś.", + "rcfilters-filter-watchlist-notwatched-label": "Tylko z poza obserwowanych", + "rcfilters-filter-watchlist-notwatched-description": "Wszystko oprócz zmian na obserwowanych przez ciebie stronach.", "rcfilters-filtergroup-changetype": "Rodzaj zmiany", "rcfilters-filter-pageedits-label": "Edycje strony", "rcfilters-filter-pageedits-description": "Edycje treści, stron dyskusji, opisów kategorii...", @@ -1439,6 +1446,11 @@ "rcfilters-hideminor-conflicts-typeofchange-global": "Filtr „Drobne zmiany” koliduje z jednym lub wieloma filtrami Rodzaju zmian, ponieważ niektóre rodzaje zmian nie mogą być uznawane za „drobne”. Kolidujące filtry zostały powyżej odpowiednio zaznaczone na pasku aktywnych filtrów.", "rcfilters-hideminor-conflicts-typeofchange": "Niektóre rodzaje zmian nie mogą być uznawane za „drobne”, dlatego ten filtr koliduje z następującymi filtrami Rodzaju zmian: $1", "rcfilters-typeofchange-conflicts-hideminor": "Ten filtr Rodzaju zmian koliduje z filtrem „Drobne zmiany”. Nie wszystkie zmiany mogą być uznawane za „drobne”.", + "rcfilters-filtergroup-lastRevision": "Ostatnia wersja", + "rcfilters-filter-lastrevision-label": "Ostatnie wersje", + "rcfilters-filter-lastrevision-description": "Tylko najnowsze zmiany dla każdej ze stron.", + "rcfilters-filter-previousrevision-label": "Wcześniejsze wersje", + "rcfilters-filter-previousrevision-description": "Wszystkie edycje, które nie są najnowszą zmianą strony.", "rcnotefrom": "Poniżej {{PLURAL:$5|pokazano zmianę|pokazano zmiany}} {{PLURAL:$5|wykonaną|wykonane}} po $3, $4 (nie więcej niż '''$1''' pozycji).", "rclistfromreset": "Zresetuj wybór daty", "rclistfrom": "Pokaż nowe zmiany od $3 $2", @@ -2407,7 +2419,9 @@ "blocklist": "Zablokowani użytkownicy", "autoblocklist": "Blokady automatyczne", "autoblocklist-submit": "Szukaj", + "autoblocklist-legend": "Lista blokad automatycznych", "autoblocklist-localblocks": "{{PLURAL:$1|Lokalna blokada automatyczna|Lokalne blokady automatyczne}}", + "autoblocklist-empty": "Lista blokad automatycznych jest pusta.", "autoblocklist-otherblocks": "{{PLURAL:$1|Inna blokada automatyczna|Inne blokady automatyczne}}", "ipblocklist": "Zablokowani użytkownicy", "ipblocklist-legend": "Znajdź zablokowanego użytkownika", @@ -2658,6 +2672,7 @@ "tooltip-pt-mycontris": "Lista {{GENDER:|moich}} edycji", "tooltip-pt-anoncontribs": "Lista edycji wykonanych z tego adresu IP", "tooltip-pt-login": "Zachęcamy do zalogowania się, choć nie jest to obowiązkowe.", + "tooltip-pt-login-private": "Należy się zalogować, aby korzystać z tej wiki", "tooltip-pt-logout": "Wyloguj", "tooltip-pt-createaccount": "Zachęcamy do stworzenia konta i zalogowania, ale nie jest to obowiązkowe.", "tooltip-ca-talk": "Dyskusja o zawartości tej strony", @@ -3263,6 +3278,7 @@ "confirmrecreate": "{{GENDER:$1|Użytkownik|Użytkowniczka}} [[User:$1|$1]] ([[User talk:$1|dyskusja]]) {{GENDER:$1|usunął|usunęła}} tę stronę po tym, jak rozpocząłeś/rozpoczęłaś jej edycję, podając jako powód usunięcia:\n: $2\nPotwierdź, że na pewno chcesz odtworzyć tę stronę.", "confirmrecreate-noreason": "{{GENDER:$1|Użytkownik|Użytkowniczka}} [[User:$1|$1]] ([[User talk:$1|dyskusja]]) {{GENDER:$1|usunął|usunęła}} tę stronę po tym, jak rozpocząłeś/rozpoczęłaś jej edycję. Potwierdź, że naprawdę chcesz odtworzyć tę stronę.", "recreate": "Utwórz powtórnie", + "confirm-purge-title": "Wyczyść pamięć podręczną tej strony", "confirm_purge_button": "Wyczyść", "confirm-purge-top": "Wyczyścić pamięć podręczną dla tej strony?", "confirm-purge-bottom": "Odświeżenie strony wyczyści pamięć podręczną i wymusi pokazanie jej aktualnej wersji.", diff --git a/languages/i18n/qqq.json b/languages/i18n/qqq.json index 20dd1fb605..27dacfad6a 100644 --- a/languages/i18n/qqq.json +++ b/languages/i18n/qqq.json @@ -408,7 +408,7 @@ "otherlanguages": "This message is shown under the toolbox. It is used if there are interwiki links added to the page, like [[en:Interwiki article]].\n{{Identical|Otherlanguages}}", "redirectedfrom": "The text displayed when a certain page is redirected to another page. Parameters:\n* $1 - the name of the page user came from", "redirectpagesub": "Displayed under the page title of a page which is a redirect to another page, see [{{fullurl:Project:Translators|redirect=no}} Project:Translators] for example.\n\n{{Identical|Redirect page}}", - "redirectto": "Alt text of the arrow icon shown on redirect pages ([[commons:File:Sample redirect page.jpg]]).\n\n{{Identical|Redirect to}}", + "redirectto": "Alt text of the arrow icon shown on redirect pages ([[commons:File:Sample redirect page.jpg]]).\n\n{{Identical|Redirect to}}\n\nOn Wikidata, this message is shown directly on redirect pages.\n\n\"Redirect\" is a noun, not a verb. That is, translate \"redirect\" as in \"This is a redirect to:\"", "talkpageheader": "{{notranslate}}", "lastmodifiedat": "This message is shown below each page, in the footer with the logos and links.\n\nParameters:\n* $1 - date\n* $2 - time\nSee also:\n* {{msg-mw|Lastmodifiedatby}}", "viewcount": "Used as page-view counter. Parameters:\n* $1 - number of pageviews", @@ -1162,7 +1162,7 @@ "shown-title": "Parameters:\n* $1 - number of search results", "viewprevnext": "This is part of the navigation message on the top and bottom of Special pages which are lists of things, e.g. the User's contributions page (in date order) or the list of all categories (in alphabetical order). ($1) and ($2) are either {{msg-mw|Pager-older-n}} and {{msg-mw|Pager-newer-n}} (for date order) or {{msg-mw|Prevn}} and {{msg-mw|Nextn}} (for alphabetical order).\n\nIt is also used by [[Special:WhatLinksHere|Whatlinkshere]] pages, where ($1) and ($2) are {{msg-mw|Whatlinkshere-prev}} and {{msg-mw|Whatlinkshere-next}}.\n($3) is made up in all cases of the various proposed numbers of results per page, e.g. \"(20 | 50 | 100 | 250 | 500)\".\nFor Special pages, the navigation bar is prefixed by \"({{msg-mw|Page first}} | {{msg-mw|Page last}})\" (alphabetical order) or \"({{msg-mw|Histfirst}} | {{msg-mw|Histlast}})\" (date order).\n\nViewprevnext is sometimes preceded by the {{msg-mw|Showingresults}} or {{msg-mw|Showingresultsnum}} message (for Special pages) or by the {{msg-mw|Linkshere}} message (for Whatlinkshere pages).\n\nRefers to {{msg-mw|Pipe-separator}}.", "searchmenu-exists": "An option shown in a menu beside search form offering a link to the existing page having the specified title (when using the default MediaWiki search engine).\n\nParameters:\n* $1 - page title\n* $2 - the number of search results found", - "searchmenu-new": "An option shown in a menu beside search form offering a red link to the not yet existing page having the specified title (when using the default MediaWiki search engine).\nParameters:\n* $1 - page title\n* $2 - the number of search results found\nParameterless gender ({{GENDER:|male|female|unspecified}}) can be used in translations.", + "searchmenu-new": "An option shown in a menu beside search form offering a red link to the not yet existing page having the specified title (when using the default MediaWiki search engine).\nParameters:\n* $1 - page title\n* $2 - the number of search results found\nParameterless gender ({{GENDER:|male|female|unspecified}}) can be used in translations.", "searchmenu-new-nocreate": "{{notranslate}}", "searchprofile-articles": "A quick link in the advanced search box on [[Special:Search]]. Clicking on this link starts a search in the content pages of the wiki.\n\nA 'content page' is a page that forms part of the purpose of the wiki. It includes the main page and pages in the main namespace and any other namespaces that are included when the wiki is customised. For example on Wikimedia Commons 'content pages' include pages in the file and category namespaces. On Wikinews 'content pages' include pages in the Portal namespace. For technical definition of 'content namespaces' see [[mw:Manual:Using_custom_namespaces#Content_namespaces|MediaWiki]].\n\nPossible alternatives to the word 'content' are 'subject matter' or 'wiki subject' or 'wiki purpose'.\n\n{{Identical|Content page}}", "searchprofile-images": "An option in the [[Special:Search]].\n\nSee also:\n* {{msg-mw|Searchprofile-images|message}}\n* {{msg-mw|Searchprofile-images-tooltip|tooltip}}\n{{Identical|Muitimedia}}", @@ -1553,6 +1553,16 @@ "recentchanges-legend-plusminus": "{{optional}}\nA plus/minus sign with a number for the legend.", "recentchanges-submit": "Label for submit button in [[Special:RecentChanges]]\n{{Identical|Show}}", "rcfilters-activefilters": "Title for the filters selection showing the active filters.", + "rcfilters-quickfilters": "Label for the button that opens the quick filters menu in [[Special:RecentChanges]]", + "rcfilters-savedqueries-defaultlabel": "Default name for saving a new set of quick filters [[Special:RecentChanges]]", + "rcfilters-savedqueries-rename": "Label for the menu option that edits a quick filter in [[Special:RecentChanges]]", + "rcfilters-savedqueries-setdefault": "Label for the menu option that sets a quick filter as default in [[Special:RecentChanges]]", + "rcfilters-savedqueries-unsetdefault": "Label for the menu option that unsets a quick filter as default in [[Special:RecentChanges]]", + "rcfilters-savedqueries-remove": "Label for the menu option that removes a quick filter as default in [[Special:RecentChanges]]", + "rcfilters-savedqueries-new-name-label": "Label for the input that holds the name of the new saved filters in [[Special:RecentChanges]]", + "rcfilters-savedqueries-add-new-title": "Title for the popup to add new quick link in [[Special:RecentChanges]]", + "rcfilters-savedqueries-apply-label": "Label for the button to apply saving a new quick link in [[Special:RecentChanges]]", + "rcfilters-savedqueries-cancel-label": "Label for the button to cancel the saving of a new quick link in [[Special:RecentChanges]]", "rcfilters-restore-default-filters": "Label for the button that resets filters to defaults", "rcfilters-clear-all-filters": "Title for the button that clears all filters", "rcfilters-search-placeholder": "Placeholder for the filter search input.", diff --git a/languages/i18n/sd.json b/languages/i18n/sd.json index 3a27119ad1..03c1b6da75 100644 --- a/languages/i18n/sd.json +++ b/languages/i18n/sd.json @@ -543,7 +543,7 @@ "continue-editing": "ترميم گاھ ڏانھن وڃو", "editing": "$1 سنواريندي", "creating": "$1 سرجيندي", - "editingsection": "زير ترميم $1 (سيڪشن)", + "editingsection": "ترميم ھيٺ $1 (سيڪشن)", "editingcomment": "ترميم هيٺ $1 (نئون سيڪشن)", "editconflict": "ترميمي تڪرار: $1", "yourtext": "توهان جو ٽيڪسٽ", @@ -1266,7 +1266,7 @@ "wlshowhidebots": "بوٽس", "wlshowhideliu": "کاتيدار يُوزرس", "wlshowhideanons": "گمنام يُوزرس", - "wlshowhidemine": "منهنجون ترميمون", + "wlshowhidemine": "منھنجون ترميمون", "watchlist-options": "نظر ۾ فھرست جا چارا", "watching": "نظر ۾ رکندي...", "unwatching": "نظر مان ڪڍندي...", diff --git a/languages/i18n/sr-ec.json b/languages/i18n/sr-ec.json index b572b685fb..8eaba926df 100644 --- a/languages/i18n/sr-ec.json +++ b/languages/i18n/sr-ec.json @@ -184,7 +184,7 @@ "qbedit": "Уреди", "qbpageoptions": "Ова страница", "qbmyoptions": "Моје странице", - "faq": "НПП", + "faq": "ЧПП", "faqpage": "Project:НПП", "actions": "Радње", "namespaces": "Именски простори", diff --git a/languages/i18n/sr-el.json b/languages/i18n/sr-el.json index f1cd7ecfb4..159e3eaee8 100644 --- a/languages/i18n/sr-el.json +++ b/languages/i18n/sr-el.json @@ -176,7 +176,7 @@ "qbedit": "Uredi", "qbpageoptions": "Ova stranica", "qbmyoptions": "Moje stranice", - "faq": "NPP", + "faq": "ČPP", "faqpage": "Project:NPP", "actions": "Radnje", "namespaces": "Imenski prostori", diff --git a/maintenance/cleanupInvalidDbKeys.php b/maintenance/cleanupInvalidDbKeys.php index 423686e20c..b487f896ca 100644 --- a/maintenance/cleanupInvalidDbKeys.php +++ b/maintenance/cleanupInvalidDbKeys.php @@ -63,9 +63,7 @@ Because any foreign key relationships involving these titles will already be broken, the titles are corrected to a valid version or the rows are deleted entirely, depending on the table. -Key progress output is printed to STDERR, while a full log of all entries that -are deleted is sent to STDOUT. You are strongly advised to capture STDOUT into -a file. +The script runs with the expectation that STDOUT is redirected to a file. TEXT ); $this->addOption( 'fix', 'Actually clean up invalid titles. If this parameter is ' . @@ -87,7 +85,10 @@ TEXT } } - $this->output( 'Done! Cleaned up invalid DB keys on ' . wfWikiID() . "!\n" ); + $this->outputStatus( 'Done!' ); + if ( $this->hasOption( 'fix' ) ) { + $this->outputStatus( ' Cleaned up invalid DB keys on ' . wfWikiID() . "!\n" ); + } } /** @@ -97,10 +98,10 @@ TEXT * @param string $str Text to write to both places * @param string|null $channel Ignored */ - protected function output( $str, $channel = null ) { + protected function outputStatus( $str, $channel = null ) { // Make it easier to find progress lines in the STDOUT log if ( trim( $str ) ) { - fwrite( STDOUT, '*** ' ); + fwrite( STDOUT, '*** ' . trim( $str ) . "\n" ); } fwrite( STDERR, $str ); } @@ -132,7 +133,7 @@ TEXT $tableParams['titleField'] : "{$prefix}_title"; - $this->output( "Looking for invalid $titleField entries in $table...\n" ); + $this->outputStatus( "Looking for invalid $titleField entries in $table...\n" ); // Do all the select queries on the replicas, as they are slow (they use // unanchored LIKEs). Naturally this could cause problems if rows are @@ -153,9 +154,9 @@ TEXT // The REGEXP operator is not cross-DBMS, so we have to use lots of LIKEs [ $dbr->makeList( [ $titleField . $dbr->buildLike( $percent, ' ', $percent ), - $titleField . $dbr->buildLike( $percent, '\r', $percent ), - $titleField . $dbr->buildLike( $percent, '\n', $percent ), - $titleField . $dbr->buildLike( $percent, '\t', $percent ), + $titleField . $dbr->buildLike( $percent, "\r", $percent ), + $titleField . $dbr->buildLike( $percent, "\n", $percent ), + $titleField . $dbr->buildLike( $percent, "\t", $percent ), $titleField . $dbr->buildLike( '_', $percent ), $titleField . $dbr->buildLike( $percent, '_' ), ], LIST_OR ) ], @@ -163,9 +164,9 @@ TEXT [ 'LIMIT' => $this->mBatchSize ] ); - $this->output( "Number of invalid rows: " . $res->numRows() . "\n" ); + $this->outputStatus( "Number of invalid rows: " . $res->numRows() . "\n" ); if ( !$res->numRows() ) { - $this->output( "\n" ); + $this->outputStatus( "\n" ); return; } @@ -191,9 +192,9 @@ TEXT } if ( $table !== 'page' && $table !== 'redirect' ) { - $this->output( "Run with --fix to clean up these rows\n" ); + $this->outputStatus( "Run with --fix to clean up these rows\n" ); } - $this->output( "\n" ); + $this->outputStatus( "\n" ); return; } @@ -205,7 +206,7 @@ TEXT // This shouldn't happen on production wikis, and we already have a script // to handle 'page' rows anyway, so just notify the user and let them decide // what to do next. - $this->output( <<outputStatus( <<output( + $this->outputStatus( "Updating these rows, setting $titleField to the closest valid DB key...\n" ); $affectedRowCount = 0; foreach ( $res as $row ) { @@ -235,7 +236,7 @@ TEXT $affectedRowCount += $dbw->affectedRows(); } wfWaitForSlaves(); - $this->output( "Updated $affectedRowCount rows on $table.\n" ); + $this->outputStatus( "Updated $affectedRowCount rows on $table.\n" ); break; @@ -245,17 +246,17 @@ TEXT // Since these broken titles can't exist, there's really nothing to watch, // nothing can be categorised in them, and they can't have been changed // recently, so we can just remove these rows. - $this->output( "Deleting invalid $table rows...\n" ); + $this->outputStatus( "Deleting invalid $table rows...\n" ); $dbw->delete( $table, [ $idField => $ids ], __METHOD__ ); wfWaitForSlaves(); - $this->output( 'Deleted ' . $dbw->affectedRows() . " rows from $table.\n" ); + $this->outputStatus( 'Deleted ' . $dbw->affectedRows() . " rows from $table.\n" ); break; case 'protected_titles': // Since these broken titles can't exist, there's really nothing to protect, // so we can just remove these rows. Made more complicated by this table // not having an ID field - $this->output( "Deleting invalid $table rows...\n" ); + $this->outputStatus( "Deleting invalid $table rows...\n" ); $affectedRowCount = 0; foreach ( $res as $row ) { $dbw->delete( $table, @@ -264,7 +265,7 @@ TEXT $affectedRowCount += $dbw->affectedRows(); } wfWaitForSlaves(); - $this->output( "Deleted $affectedRowCount rows from $table.\n" ); + $this->outputStatus( "Deleted $affectedRowCount rows from $table.\n" ); break; case 'pagelinks': @@ -273,7 +274,7 @@ TEXT // Update links tables for each page where these bogus links are supposedly // located. If the invalid rows don't go away after these jobs go through, // they're probably being added by a buggy hook. - $this->output( "Queueing link update jobs for the pages in $idField...\n" ); + $this->outputStatus( "Queueing link update jobs for the pages in $idField...\n" ); foreach ( $res as $row ) { $wp = WikiPage::newFromID( $row->id ); if ( $wp ) { @@ -286,11 +287,11 @@ TEXT } } wfWaitForSlaves(); - $this->output( "Link update jobs have been added to the job queue.\n" ); + $this->outputStatus( "Link update jobs have been added to the job queue.\n" ); break; } - $this->output( "\n" ); + $this->outputStatus( "\n" ); return; } diff --git a/phpcs.xml b/phpcs.xml index 4693b42eb5..b2c8d89331 100644 --- a/phpcs.xml +++ b/phpcs.xml @@ -1,6 +1,32 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -20,10 +46,10 @@ */includes/StubObject.php - + 0 - + 0 node_modules/ diff --git a/resources/Resources.php b/resources/Resources.php index e53f7bf9ea..e8c8f61a9c 100644 --- a/resources/Resources.php +++ b/resources/Resources.php @@ -1742,6 +1742,8 @@ return [ 'resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterItem.js', 'resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterGroup.js', 'resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js', + 'resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.SavedQueryItemModel.js', + 'resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.SavedQueriesModel.js', 'resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.ChangesListViewModel.js', 'resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js', ], @@ -1763,6 +1765,9 @@ return [ 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FloatingMenuSelectWidget.js', 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterWrapperWidget.js', 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ChangesListWrapperWidget.js', + 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SavedLinksListWidget.js', + 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SavedLinksListItemWidget.js', + 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SaveFiltersPopupButtonWidget.js', 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FormWrapperWidget.js', 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterItemHighlightButton.js', 'resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.HighlightColorPickerWidget.js', @@ -1785,6 +1790,9 @@ return [ 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.ChangesListWrapperWidget.less', 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.HighlightColorPickerWidget.less', 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterItemHighlightButton.less', + 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SavedLinksListWidget.less', + 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SavedLinksListItemWidget.less', + 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SaveFiltersPopupButtonWidget.less', ], 'skinStyles' => [ 'monobook' => [ @@ -1794,6 +1802,16 @@ return [ ], 'messages' => [ 'rcfilters-activefilters', + 'rcfilters-quickfilters', + 'rcfilters-savedqueries-defaultlabel', + 'rcfilters-savedqueries-rename', + 'rcfilters-savedqueries-setdefault', + 'rcfilters-savedqueries-unsetdefault', + 'rcfilters-savedqueries-remove', + 'rcfilters-savedqueries-new-name-label', + 'rcfilters-savedqueries-add-new-title', + 'rcfilters-savedqueries-apply-label', + 'rcfilters-savedqueries-cancel-label', 'rcfilters-restore-default-filters', 'rcfilters-clear-all-filters', 'rcfilters-search-placeholder', diff --git a/resources/src/mediawiki.language/specialcharacters.json b/resources/src/mediawiki.language/specialcharacters.json index 7ce06be1c6..f0a86ffc5c 100644 --- a/resources/src/mediawiki.language/specialcharacters.json +++ b/resources/src/mediawiki.language/specialcharacters.json @@ -50,6 +50,26 @@ } } }, + { + "label": "‹›", + "action": { + "type": "encapsulate", + "options": { + "pre": "‹", + "post": "›" + } + } + }, + { + "label": "⟨⟩", + "action": { + "type": "encapsulate", + "options": { + "pre": "⟨", + "post": "⟩" + } + } + }, "¤", "₳", "฿", "₵", "¢", "₡", "₢", "$", "₫", "₯", "€", "₠", "₣", "ƒ", "₴", "₭", "₤", "ℳ", "₥", "₦", "№", "₧", "₰", "£", "៛", "₨", "₪", "৳", "₮", "₩", "¥", "♠", "♣", "♥", "♦", "m²", "m³", { "label": "–", diff --git a/resources/src/mediawiki.less/mediawiki.mixins.less b/resources/src/mediawiki.less/mediawiki.mixins.less index a5494de64f..fb3b00ed8c 100644 --- a/resources/src/mediawiki.less/mediawiki.mixins.less +++ b/resources/src/mediawiki.less/mediawiki.mixins.less @@ -58,6 +58,12 @@ list-style-image: e( '/* @embed */' ) url( @fallback ) e( '\9' ); } +.transform( @value ) { + -webkit-transform: @value; // Safari 3.1-8.0, iOS 3.2-8.4, Android 2.1-4.4.4 + -moz-transform: @value; // Firefox 3.5-15 + transform: @value; // Chrome 36+, Firefox 16+, IE 10+, Safari 9+, Opera 23+, iOS 9.2+, Android 5+ +} + .transition( @value ) { -webkit-transition: @value; // Safari 3.1-6.0, iOS 3.2-6.1, Android 2.1-4.3 -moz-transition: @value; // Firefox 4-15 diff --git a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js b/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js index aa261d3a62..9054fe4a4f 100644 --- a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js +++ b/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js @@ -335,13 +335,15 @@ items.push( filterItem ); } - if ( data.type === 'string_options' && data.default ) { + if ( data.type === 'string_options' ) { // Store the default parameter group state // For this group, the parameter is group name and value is the names // of selected items model.defaultParams[ group ] = model.sanitizeStringOptionGroup( group, - data.default.split( model.groups[ group ].getSeparator() ) + data.default ? + data.default.split( model.groups[ group ].getSeparator() ) : + [] ).join( model.groups[ group ].getSeparator() ); } } ); @@ -459,15 +461,6 @@ return this.defaultParams; }; - /** - * Set all filter states to default values - */ - mw.rcfilters.dm.FiltersViewModel.prototype.setFiltersToDefaults = function () { - var defaultFilterStates = this.getFiltersFromParameters( this.getDefaultParams() ); - - this.toggleFiltersSelected( defaultFilterStates ); - }; - /** * Analyze the groups and their filters and output an object representing * the state of the parameters they represent. @@ -811,6 +804,17 @@ } ); }; + /** + * Get items that allow highlights even if they're not currently highlighted + * + * @return {mw.rcfilters.dm.FilterItem[]} Items supporting highlights + */ + mw.rcfilters.dm.FiltersViewModel.prototype.getItemsSupportingHighlights = function () { + return this.getItems().filter( function ( filterItem ) { + return filterItem.isHighlightSupported(); + } ); + }; + /** * Toggle the highlight feature on and off. * Propagate the change to filter items. diff --git a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.SavedQueriesModel.js b/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.SavedQueriesModel.js new file mode 100644 index 0000000000..04fb52b699 --- /dev/null +++ b/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.SavedQueriesModel.js @@ -0,0 +1,192 @@ +( function ( mw, $ ) { + /** + * View model for saved queries + * + * @mixins OO.EventEmitter + * @mixins OO.EmitterList + * + * @constructor + * @param {Object} [config] Configuration options + * @cfg {string} [default] Default query ID + */ + mw.rcfilters.dm.SavedQueriesModel = function MwRcfiltersDmSavedQueriesModel( config ) { + config = config || {}; + + // Mixin constructor + OO.EventEmitter.call( this ); + OO.EmitterList.call( this ); + + this.default = config.default; + + // Events + this.aggregate( { update: 'itemUpdate' } ); + }; + + /* Initialization */ + + OO.initClass( mw.rcfilters.dm.SavedQueriesModel ); + OO.mixinClass( mw.rcfilters.dm.SavedQueriesModel, OO.EventEmitter ); + OO.mixinClass( mw.rcfilters.dm.SavedQueriesModel, OO.EmitterList ); + + /* Events */ + + /** + * @event initialize + * + * Model is initialized + */ + + /** + * @event itemUpdate + * @param {mw.rcfilters.dm.SavedQueryItemModel} Changed item + * + * An item has changed + */ + + /* Methods */ + + /** + * Initialize the saved queries model by reading it from the user's settings. + * The structure of the saved queries is: + * { + * default: (string) Query ID + * queries:{ + * query_id_1: { + * data:{ + * filters: (Object) Minimal definition of the filters + * highlights: (Object) Definition of the highlights + * }, + * label: (optional) Name of this query + * } + * } + * } + * + * @param {Object} [savedQueries] An object with the saved queries with + * the above structure. + * @param {Object} [baseState] An object representing the base state + * so we can normalize the data + * @fires initialize + */ + mw.rcfilters.dm.SavedQueriesModel.prototype.initialize = function ( savedQueries, baseState ) { + var items = []; + + savedQueries = savedQueries || {}; + + this.baseState = baseState; + + this.clearItems(); + $.each( savedQueries.queries || {}, function ( id, obj ) { + var normalizedData = $.extend( true, {}, baseState, obj.data ); + items.push( + new mw.rcfilters.dm.SavedQueryItemModel( + id, + obj.label, + normalizedData, + { 'default': savedQueries.default === id } + ) + ); + } ); + + this.default = savedQueries.default; + + this.addItems( items ); + + this.emit( 'initialize' ); + }; + + /** + * Add a query item + * + * @param {string} label Label for the new query + * @param {Object} data Data for the new query + */ + mw.rcfilters.dm.SavedQueriesModel.prototype.addNewQuery = function ( label, data ) { + var randomID = ( new Date() ).getTime(), + normalizedData = $.extend( true, {}, this.baseState, data ); + + // Add item + this.addItems( [ + new mw.rcfilters.dm.SavedQueryItemModel( + randomID, + label, + normalizedData + ) + ] ); + }; + + /** + * Get an item that matches the requested query + * + * @param {Object} fullQueryComparison Object representing all filters and highlights to compare + * @return {mw.rcfilters.dm.SavedQueryItemModel} Matching item model + */ + mw.rcfilters.dm.SavedQueriesModel.prototype.findMatchingQuery = function ( fullQueryComparison ) { + return this.getItems().filter( function ( item ) { + return OO.compare( + item.getData(), + fullQueryComparison + ); + } )[ 0 ]; + }; + + /** + * Get query by its identifier + * + * @param {string} queryID Query identifier + * @return {mw.rcfilters.dm.SavedQueryItemModel|undefined} Item matching + * the search. Undefined if not found. + */ + mw.rcfilters.dm.SavedQueriesModel.prototype.getItemByID = function ( queryID ) { + return this.getItems().filter( function ( item ) { + return item.getID() === queryID; + } )[ 0 ]; + }; + + /** + * Get the object representing the state of the entire model and items + * + * @return {Object} Object representing the state of the model and items + */ + mw.rcfilters.dm.SavedQueriesModel.prototype.getState = function () { + var obj = { queries: {} }; + + // Translate the items to the saved object + this.getItems().forEach( function ( item ) { + var itemState = item.getState(); + + obj.queries[ item.getID() ] = itemState; + } ); + + if ( this.getDefault() ) { + obj.default = this.getDefault(); + } + + return obj; + }; + + /** + * Set a default query. Null to unset default. + * + * @param {string} itemID Query identifier + * @fires default + */ + mw.rcfilters.dm.SavedQueriesModel.prototype.setDefault = function ( itemID ) { + if ( this.default !== itemID ) { + this.default = itemID; + + // Set for individual itens + this.getItems().forEach( function ( item ) { + item.toggleDefault( item.getID() === itemID ); + } ); + } + }; + + /** + * Get the default query ID + * + * @return {string} Default query identifier + */ + mw.rcfilters.dm.SavedQueriesModel.prototype.getDefault = function () { + return this.default; + }; +}( mediaWiki, jQuery ) ); diff --git a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.SavedQueryItemModel.js b/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.SavedQueryItemModel.js new file mode 100644 index 0000000000..729aee3973 --- /dev/null +++ b/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.SavedQueryItemModel.js @@ -0,0 +1,115 @@ +( function ( mw ) { + /** + * View model for a single saved query + * + * @mixins OO.EventEmitter + * + * @constructor + * @param {string} id Unique identifier + * @param {string} label Saved query label + * @param {Object} data Saved query data + * @param {Object} [config] Configuration options + * @param {boolean} [default] This item is the default + */ + mw.rcfilters.dm.SavedQueryItemModel = function MwRcfiltersDmSavedQueriesModel( id, label, data, config ) { + config = config || {}; + + // Mixin constructor + OO.EventEmitter.call( this ); + + this.id = id; + this.label = label; + this.data = data; + this.default = !!config.default; + }; + + /* Initialization */ + + OO.initClass( mw.rcfilters.dm.SavedQueryItemModel ); + OO.mixinClass( mw.rcfilters.dm.SavedQueryItemModel, OO.EventEmitter ); + + /* Events */ + + /** + * @update + * + * Model has been updated + */ + + /* Methods */ + + /** + * Get an object representing the state of this item + * + * @returns {Object} Object representing the current data state + * of the object + */ + mw.rcfilters.dm.SavedQueryItemModel.prototype.getState = function () { + return { + data: this.getData(), + label: this.getLabel() + }; + }; + + /** + * Get the query's identifier + * + * @return {string} Query identifier + */ + mw.rcfilters.dm.SavedQueryItemModel.prototype.getID = function () { + return this.id; + }; + + /** + * Get query label + * + * @return {label} Query label + */ + mw.rcfilters.dm.SavedQueryItemModel.prototype.getLabel = function () { + return this.label; + }; + + /** + * Update the query label + * + * @param {string} newLabel New label + */ + mw.rcfilters.dm.SavedQueryItemModel.prototype.updateLabel = function ( newLabel ) { + if ( newLabel && this.label !== newLabel ) { + this.label = newLabel; + this.emit( 'update' ); + } + }; + + /** + * Get query data + * + * @return {Object} Object representing parameter and highlight data + */ + mw.rcfilters.dm.SavedQueryItemModel.prototype.getData = function () { + return this.data; + }; + + /** + * Check whether this item is the default + * + * @return {boolean} Query is set to be default + */ + mw.rcfilters.dm.SavedQueryItemModel.prototype.isDefault = function () { + return this.default; + }; + + /** + * Toggle the default state of this query item + * + * @param {boolean} isDefault Query is default + */ + mw.rcfilters.dm.SavedQueryItemModel.prototype.toggleDefault = function ( isDefault ) { + isDefault = isDefault === undefined ? !this.default : isDefault; + + if ( this.default !== isDefault ) { + this.default = isDefault; + this.emit( 'update' ); + } + }; +}( mediaWiki ) ); diff --git a/resources/src/mediawiki.rcfilters/images/clip.svg b/resources/src/mediawiki.rcfilters/images/clip.svg new file mode 100644 index 0000000000..86d1dbfbbd --- /dev/null +++ b/resources/src/mediawiki.rcfilters/images/clip.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/src/mediawiki.rcfilters/images/pushPin.svg b/resources/src/mediawiki.rcfilters/images/pushPin.svg new file mode 100644 index 0000000000..b852cd0668 --- /dev/null +++ b/resources/src/mediawiki.rcfilters/images/pushPin.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/src/mediawiki.rcfilters/images/unClip.svg b/resources/src/mediawiki.rcfilters/images/unClip.svg new file mode 100644 index 0000000000..68459db6fb --- /dev/null +++ b/resources/src/mediawiki.rcfilters/images/unClip.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js b/resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js index 669420caf9..35541d136f 100644 --- a/resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js +++ b/resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js @@ -1,14 +1,18 @@ ( function ( mw, $ ) { + /* eslint no-underscore-dangle: "off" */ /** * Controller for the filters in Recent Changes * * @param {mw.rcfilters.dm.FiltersViewModel} filtersModel Filters view model * @param {mw.rcfilters.dm.ChangesListViewModel} changesListModel Changes list view model + * @param {mw.rcfilters.dm.SavedQueriesModel} savedQueriesModel Saved queries model */ - mw.rcfilters.Controller = function MwRcfiltersController( filtersModel, changesListModel ) { + mw.rcfilters.Controller = function MwRcfiltersController( filtersModel, changesListModel, savedQueriesModel ) { this.filtersModel = filtersModel; this.changesListModel = changesListModel; + this.savedQueriesModel = savedQueriesModel; this.requestCounter = 0; + this.baseState = {}; }; /* Initialization */ @@ -20,9 +24,26 @@ * @param {Array} filterStructure Filter definition and structure for the model */ mw.rcfilters.Controller.prototype.initialize = function ( filterStructure ) { - var $changesList = $( '.mw-changeslist' ).first().contents(); + var parsedSavedQueries, + $changesList = $( '.mw-changeslist' ).first().contents(); // Initialize the model this.filtersModel.initializeFilters( filterStructure ); + + this._buildBaseFilterState(); + + try { + parsedSavedQueries = JSON.parse( mw.user.options.get( 'rcfilters-saved-queries' ) || '{}' ); + } catch ( err ) { + parsedSavedQueries = {}; + } + + // The queries are saved in a minimized state, so we need + // to send over the base state so the saved queries model + // can normalize them per each query item + this.savedQueriesModel.initialize( + parsedSavedQueries, + this._getBaseState() + ); this.updateStateBasedOnUrl(); // Update the changes list with the existing data @@ -31,54 +52,13 @@ $changesList.length ? $changesList : 'NO_RESULTS', $( 'fieldset.rcoptions' ).first() ); - - }; - - /** - * Update filter state (selection and highlighting) based - * on current URL and default values. - */ - mw.rcfilters.Controller.prototype.updateStateBasedOnUrl = function () { - var uri = new mw.Uri(); - - // Set filter states based on defaults and URL params - this.filtersModel.toggleFiltersSelected( - this.filtersModel.getFiltersFromParameters( - // Merge defaults with URL params for initialization - $.extend( - true, - {}, - this.filtersModel.getDefaultParams(), - // URI query overrides defaults - uri.query - ) - ) - ); - - // Initialize highlights - this.filtersModel.toggleHighlight( !!uri.query.highlight ); - this.filtersModel.getItems().forEach( function ( filterItem ) { - var color = uri.query[ filterItem.getName() + '_color' ]; - if ( color ) { - filterItem.setHighlightColor( color ); - } else { - filterItem.clearHighlightColor(); - } - } ); - - // Check all filter interactions - this.filtersModel.reassessFilterInteractions(); }; /** * Reset to default filters */ mw.rcfilters.Controller.prototype.resetToDefaults = function () { - this.filtersModel.setFiltersToDefaults(); - this.filtersModel.clearAllHighlightColors(); - // Check all filter interactions - this.filtersModel.reassessFilterInteractions(); - + this._updateModelState( this._getDefaultParams() ); this.updateChangesList(); }; @@ -98,7 +78,7 @@ this.updateChangesList(); if ( highlightedFilterNames ) { - this.trackHighlight( 'clearAll', highlightedFilterNames ); + this._trackHighlight( 'clearAll', highlightedFilterNames ); } }; @@ -128,6 +108,421 @@ } }; + /** + * Clear both highlight and selection of a filter + * + * @param {string} filterName Name of the filter item + */ + mw.rcfilters.Controller.prototype.clearFilter = function ( filterName ) { + var filterItem = this.filtersModel.getItemByName( filterName ), + isHighlighted = filterItem.isHighlighted(); + + if ( filterItem.isSelected() || isHighlighted ) { + this.filtersModel.clearHighlightColor( filterName ); + this.filtersModel.toggleFilterSelected( filterName, false ); + this.updateChangesList(); + this.filtersModel.reassessFilterInteractions( filterItem ); + } + + if ( isHighlighted ) { + this._trackHighlight( 'clear', filterName ); + } + }; + + /** + * Toggle the highlight feature on and off + */ + mw.rcfilters.Controller.prototype.toggleHighlight = function () { + this.filtersModel.toggleHighlight(); + this._updateURL(); + + if ( this.filtersModel.isHighlightEnabled() ) { + mw.hook( 'RcFilters.highlight.enable' ).fire(); + } + }; + + /** + * Set the highlight color for a filter item + * + * @param {string} filterName Name of the filter item + * @param {string} color Selected color + */ + mw.rcfilters.Controller.prototype.setHighlightColor = function ( filterName, color ) { + this.filtersModel.setHighlightColor( filterName, color ); + this._updateURL(); + this._trackHighlight( 'set', { name: filterName, color: color } ); + }; + + /** + * Clear highlight for a filter item + * + * @param {string} filterName Name of the filter item + */ + mw.rcfilters.Controller.prototype.clearHighlightColor = function ( filterName ) { + this.filtersModel.clearHighlightColor( filterName ); + this._updateURL(); + this._trackHighlight( 'clear', filterName ); + }; + + /** + * Save the current model state as a saved query + * + * @param {string} [label] Label of the saved query + */ + mw.rcfilters.Controller.prototype.saveCurrentQuery = function ( label ) { + var highlightedItems = {}, + highlightEnabled = this.filtersModel.isHighlightEnabled(); + + // Prepare highlights + this.filtersModel.getHighlightedItems().forEach( function ( item ) { + highlightedItems[ item.getName() ] = highlightEnabled ? + item.getHighlightColor() : null; + } ); + highlightedItems.highlights = this.filtersModel.isHighlightEnabled(); + + // Add item + this.savedQueriesModel.addNewQuery( + label || mw.msg( 'rcfilters-savedqueries-defaultlabel' ), + { + filters: this.filtersModel.getSelectedState(), + highlights: highlightedItems + } + ); + + // Save item + this._saveSavedQueries(); + }; + + /** + * Remove a saved query + * + * @param {string} queryID Query id + */ + mw.rcfilters.Controller.prototype.removeSavedQuery = function ( queryID ) { + var query = this.savedQueriesModel.getItemByID( queryID ); + + this.savedQueriesModel.removeItems( [ query ] ); + + // Check if this item was the default + if ( this.savedQueriesModel.getDefault() === queryID ) { + // Nulify the default + this.savedQueriesModel.setDefault( null ); + } + this._saveSavedQueries(); + }; + + /** + * Rename a saved query + * + * @param {string} queryID Query id + * @param {string} newLabel New label for the query + */ + mw.rcfilters.Controller.prototype.renameSavedQuery = function ( queryID, newLabel ) { + var queryItem = this.savedQueriesModel.getItemByID( queryID ); + + if ( queryItem ) { + queryItem.updateLabel( newLabel ); + } + this._saveSavedQueries(); + }; + + /** + * Set a saved query as default + * + * @param {string} queryID Query Id. If null is given, default + * query is reset. + */ + mw.rcfilters.Controller.prototype.setDefaultSavedQuery = function ( queryID ) { + this.savedQueriesModel.setDefault( queryID ); + this._saveSavedQueries(); + }; + + /** + * Load a saved query + * + * @param {string} queryID Query id + */ + mw.rcfilters.Controller.prototype.applySavedQuery = function ( queryID ) { + var data, highlights, + queryItem = this.savedQueriesModel.getItemByID( queryID ); + + if ( queryItem ) { + data = queryItem.getData(); + highlights = data.highlights; + + // Update model state from filters + this.filtersModel.toggleFiltersSelected( data.filters ); + + // Update highlight state + this.filtersModel.toggleHighlight( !!highlights.highlights ); + this.filtersModel.getItems().forEach( function ( filterItem ) { + var color = highlights[ filterItem.getName() ]; + if ( color ) { + filterItem.setHighlightColor( color ); + } else { + filterItem.clearHighlightColor(); + } + } ); + + // Check all filter interactions + this.filtersModel.reassessFilterInteractions(); + + this.updateChangesList(); + } + }; + + /** + * Check whether the current filter and highlight state exists + * in the saved queries model. + * + * @return {boolean} Query exists + */ + mw.rcfilters.Controller.prototype.findQueryMatchingCurrentState = function () { + var highlightedItems = {}; + + // Prepare highlights of the current query + this.filtersModel.getItemsSupportingHighlights().forEach( function ( item ) { + highlightedItems[ item.getName() ] = item.getHighlightColor(); + } ); + highlightedItems.highlights = this.filtersModel.isHighlightEnabled(); + + return this.savedQueriesModel.findMatchingQuery( + { + filters: this.filtersModel.getSelectedState(), + highlights: highlightedItems + } + ); + }; + + /** + * Get an object representing the base state of parameters + * and highlights. + * + * This is meant to make sure that the saved queries that are + * in memory are always the same structure as what we would get + * by calling the current model's "getSelectedState" and by checking + * highlight items. + * + * In cases where a user saved a query when the system had a certain + * set of filters, and then a filter was added to the system, we want + * to make sure that the stored queries can still be comparable to + * the current state, which means that we need the base state for + * two operations: + * + * - Saved queries are stored in "minimal" view (only changed filters + * are stored); When we initialize the system, we merge each minimal + * query with the base state (using 'getNormalizedFilters') so all + * saved queries have the exact same structure as what we would get + * by checking the getSelectedState of the filter. + * - When we save the queries, we minimize the object to only represent + * whatever has actually changed, rather than store the entire + * object. To check what actually is different so we can store it, + * we need to obtain a base state to compare against, this is + * what #_getMinimalFilterList does + */ + mw.rcfilters.Controller.prototype._buildBaseFilterState = function () { + var defaultParams = this.filtersModel.getDefaultParams(), + highlightedItems = {}; + + // Prepare highlights + this.filtersModel.getItemsSupportingHighlights().forEach( function ( item ) { + highlightedItems[ item.getName() ] = null; + } ); + highlightedItems.highlights = false; + + this.baseState = { + filters: this.filtersModel.getFiltersFromParameters( defaultParams ), + highlights: highlightedItems + }; + }; + + /** + * Get an object representing the base state of parameters + * and highlights. The structure is similar to what we use + * to store each query in the saved queries object: + * { + * filters: { + * filterName: (bool) + * }, + * highlights: { + * filterName: (string|null) + * } + * } + * + * @return {Object} Object representing the base state of + * parameters and highlights + */ + mw.rcfilters.Controller.prototype._getBaseState = function () { + return this.baseState; + }; + + /** + * Get an object that holds only the parameters and highlights that have + * values different than the base default value. + * + * This is the reverse of the normalization we do initially on loading and + * initializing the saved queries model. + * + * @param {Object} valuesObject Object representing the state of both + * filters and highlights in its normalized version, to be minimized. + * @return {Object} Minimal filters and highlights list + */ + mw.rcfilters.Controller.prototype._getMinimalFilterList = function ( valuesObject ) { + var result = { filters: {}, highlights: {} }, + baseState = this._getBaseState(); + + // XOR results + $.each( valuesObject.filters, function ( name, value ) { + if ( baseState.filters !== undefined && baseState.filters[ name ] !== value ) { + result.filters[ name ] = value; + } + } ); + + $.each( valuesObject.highlights, function ( name, value ) { + if ( baseState.highlights !== undefined && baseState.highlights[ name ] !== value ) { + result.highlights[ name ] = value; + } + } ); + + return result; + }; + + /** + * Save the current state of the saved queries model with all + * query item representation in the user settings. + */ + mw.rcfilters.Controller.prototype._saveSavedQueries = function () { + var stringified, + state = this.savedQueriesModel.getState(), + controller = this; + + // Minimize before save + $.each( state.queries, function ( queryID, info ) { + state.queries[ queryID ].data = controller._getMinimalFilterList( info.data ); + } ); + + // Stringify state + stringified = JSON.stringify( state ); + + if ( stringified.length > 65535 ) { + // Sanity check, since the preference can only hold that. + return; + } + + // Save the preference + new mw.Api().saveOption( 'rcfilters-saved-queries', stringified ); + // Update the preference for this session + mw.user.options.set( 'rcfilters-saved-queries', stringified ); + }; + + /** + * Synchronize the URL with the current state of the filters + * without adding an history entry. + */ + mw.rcfilters.Controller.prototype.replaceUrl = function () { + window.history.replaceState( + { tag: 'rcfilters' }, + document.title, + this._getUpdatedUri().toString() + ); + }; + + /** + * Update filter state (selection and highlighting) based + * on current URL and default values. + */ + mw.rcfilters.Controller.prototype.updateStateBasedOnUrl = function () { + var uri = new mw.Uri(), + defaultParams = this._getDefaultParams(); + + this._updateModelState( $.extend( {}, defaultParams, uri.query ) ); + this.updateChangesList(); + }; + + /** + * Update the list of changes and notify the model + * + * @param {Object} [params] Extra parameters to add to the API call + */ + mw.rcfilters.Controller.prototype.updateChangesList = function ( params ) { + this._updateURL( params ); + this.changesListModel.invalidate(); + this._fetchChangesList() + .then( + // Success + function ( pieces ) { + var $changesListContent = pieces.changes, + $fieldset = pieces.fieldset; + this.changesListModel.update( $changesListContent, $fieldset ); + }.bind( this ) + // Do nothing for failure + ); + }; + + /** + * Update the model state from given the given parameters. + * + * This is an internal method, and should only be used from inside + * the controller. + * + * @param {Object} parameters Object representing the parameters for + * filters and highlights + */ + mw.rcfilters.Controller.prototype._updateModelState = function ( parameters ) { + // Update filter states + this.filtersModel.toggleFiltersSelected( + this.filtersModel.getFiltersFromParameters( + parameters + ) + ); + + // Update highlight state + this.filtersModel.toggleHighlight( !!parameters.highlights ); + this.filtersModel.getItems().forEach( function ( filterItem ) { + var color = parameters[ filterItem.getName() + '_color' ]; + if ( color ) { + filterItem.setHighlightColor( color ); + } else { + filterItem.clearHighlightColor(); + } + } ); + + // Check all filter interactions + this.filtersModel.reassessFilterInteractions(); + }; + + /** + * Get an object representing the default parameter state, whether + * it is from the model defaults or from the saved queries. + * + * @return {Object} Default parameters + */ + mw.rcfilters.Controller.prototype._getDefaultParams = function () { + var data, queryHighlights, + savedParams = {}, + savedHighlights = {}, + defaultSavedQueryItem = this.savedQueriesModel.getItemByID( this.savedQueriesModel.getDefault() ); + + if ( defaultSavedQueryItem ) { + data = defaultSavedQueryItem.getData(); + + queryHighlights = data.highlights || {}; + savedParams = this.filtersModel.getParametersFromFilters( data.filters || {} ); + + // Translate highlights to parameters + savedHighlights.highlights = queryHighlights.highlights; + $.each( queryHighlights, function ( filterName, color ) { + if ( filterName !== 'highlights' ) { + savedHighlights[ filterName + '_color' ] = color; + } + } ); + + return $.extend( true, {}, savedParams, savedHighlights ); + } + + return this.filtersModel.getDefaultParams(); + }; + /** * Update the URL of the page to reflect current filters * @@ -136,10 +531,9 @@ * highlighting actions below, or call #updateChangesList which does * the uri corrections already. * - * @private * @param {Object} [params] Extra parameters to add to the API call */ - mw.rcfilters.Controller.prototype.updateURL = function ( params ) { + mw.rcfilters.Controller.prototype._updateURL = function ( params ) { var updatedUri, notEquivalent = function ( obj1, obj2 ) { var keys = Object.keys( obj1 ).concat( Object.keys( obj2 ) ); @@ -150,7 +544,7 @@ params = params || {}; - updatedUri = this.getUpdatedUri(); + updatedUri = this._getUpdatedUri(); updatedUri.extend( params ); if ( notEquivalent( updatedUri.query, new mw.Uri().query ) ) { @@ -163,7 +557,7 @@ * * @return {mw.Uri} Updated Uri */ - mw.rcfilters.Controller.prototype.getUpdatedUri = function () { + mw.rcfilters.Controller.prototype._getUpdatedUri = function () { var uri = new mw.Uri(), highlightParams = this.filtersModel.getHighlightParameters(); @@ -191,8 +585,8 @@ * @return {jQuery.Promise} Promise object that will resolve with the changes list * or with a string denoting no results. */ - mw.rcfilters.Controller.prototype.fetchChangesList = function () { - var uri = this.getUpdatedUri(), + mw.rcfilters.Controller.prototype._fetchChangesList = function () { + var uri = this._getUpdatedUri(), requestId = ++this.requestCounter, latestRequest = function () { return requestId === this.requestCounter; @@ -235,101 +629,13 @@ ); }; - /** - * Update the list of changes and notify the model - * - * @param {Object} [params] Extra parameters to add to the API call - */ - mw.rcfilters.Controller.prototype.updateChangesList = function ( params ) { - this.updateURL( params ); - this.changesListModel.invalidate(); - this.fetchChangesList() - .then( - // Success - function ( pieces ) { - var $changesListContent = pieces.changes, - $fieldset = pieces.fieldset; - this.changesListModel.update( $changesListContent, $fieldset ); - }.bind( this ) - // Do nothing for failure - ); - }; - - /** - * Toggle the highlight feature on and off - */ - mw.rcfilters.Controller.prototype.toggleHighlight = function () { - this.filtersModel.toggleHighlight(); - this.updateURL(); - - if ( this.filtersModel.isHighlightEnabled() ) { - mw.hook( 'RcFilters.highlight.enable' ).fire(); - } - }; - - /** - * Set the highlight color for a filter item - * - * @param {string} filterName Name of the filter item - * @param {string} color Selected color - */ - mw.rcfilters.Controller.prototype.setHighlightColor = function ( filterName, color ) { - this.filtersModel.setHighlightColor( filterName, color ); - this.updateURL(); - this.trackHighlight( 'set', { name: filterName, color: color } ); - }; - - /** - * Clear highlight for a filter item - * - * @param {string} filterName Name of the filter item - */ - mw.rcfilters.Controller.prototype.clearHighlightColor = function ( filterName ) { - this.filtersModel.clearHighlightColor( filterName ); - this.updateURL(); - this.trackHighlight( 'clear', filterName ); - }; - - /** - * Clear both highlight and selection of a filter - * - * @param {string} filterName Name of the filter item - */ - mw.rcfilters.Controller.prototype.clearFilter = function ( filterName ) { - var filterItem = this.filtersModel.getItemByName( filterName ), - isHighlighted = filterItem.isHighlighted(); - - if ( filterItem.isSelected() || isHighlighted ) { - this.filtersModel.clearHighlightColor( filterName ); - this.filtersModel.toggleFilterSelected( filterName, false ); - this.updateChangesList(); - this.filtersModel.reassessFilterInteractions( filterItem ); - } - - if ( isHighlighted ) { - this.trackHighlight( 'clear', filterName ); - } - }; - - /** - * Synchronize the URL with the current state of the filters - * without adding an history entry. - */ - mw.rcfilters.Controller.prototype.replaceUrl = function () { - window.history.replaceState( - { tag: 'rcfilters' }, - document.title, - this.getUpdatedUri().toString() - ); - }; - /** * Track usage of highlight feature * * @param {string} action * @param {array|object|string} filters */ - mw.rcfilters.Controller.prototype.trackHighlight = function ( action, filters ) { + mw.rcfilters.Controller.prototype._trackHighlight = function ( action, filters ) { filters = typeof filters === 'string' ? { name: filters } : filters; filters = !Array.isArray( filters ) ? [ filters ] : filters; mw.track( @@ -341,4 +647,5 @@ } ); }; + }( mediaWiki, jQuery ) ); diff --git a/resources/src/mediawiki.rcfilters/mw.rcfilters.init.js b/resources/src/mediawiki.rcfilters/mw.rcfilters.init.js index 4a586e484d..dd8fae05e9 100644 --- a/resources/src/mediawiki.rcfilters/mw.rcfilters.init.js +++ b/resources/src/mediawiki.rcfilters/mw.rcfilters.init.js @@ -11,11 +11,12 @@ init: function () { var filtersModel = new mw.rcfilters.dm.FiltersViewModel(), changesListModel = new mw.rcfilters.dm.ChangesListViewModel(), - controller = new mw.rcfilters.Controller( filtersModel, changesListModel ), + savedQueriesModel = new mw.rcfilters.dm.SavedQueriesModel(), + controller = new mw.rcfilters.Controller( filtersModel, changesListModel, savedQueriesModel ), $overlay = $( '
' ) .addClass( 'mw-rcfilters-ui-overlay' ), filtersWidget = new mw.rcfilters.ui.FilterWrapperWidget( - controller, filtersModel, { $overlay: $overlay } ); + controller, filtersModel, savedQueriesModel, { $overlay: $overlay } ); // TODO: The changesListWrapperWidget should be able to initialize // after the model is ready. diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterTagMultiselectWidget.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterTagMultiselectWidget.less index f1b68710a3..66e6d960e7 100644 --- a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterTagMultiselectWidget.less +++ b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterTagMultiselectWidget.less @@ -19,9 +19,16 @@ margin-top: 0.3em; } - &-wrapper-content-title { - font-weight: bold; - color: #54595d; + &-wrapper-content { + &-title { + font-weight: bold; + color: #54595d; + } + + &-savedQueryTitle { + color: #72777d; + margin-left: 1em; + } } &-emptyFilters { diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SaveFiltersPopupButtonWidget.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SaveFiltersPopupButtonWidget.less new file mode 100644 index 0000000000..e19c24680d --- /dev/null +++ b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SaveFiltersPopupButtonWidget.less @@ -0,0 +1,22 @@ +.mw-rcfilters-ui-saveFiltersPopupButtonWidget { + &-popup { + &-layout { + padding-bottom: 1.5em; + } + + > .oo-ui-popupWidget-popup > .oo-ui-popupWidget-head { + > .oo-ui-iconWidget { + margin: 0.75em 0.5em; + float: left; + } + + > .oo-ui-labelElement-label { + font-size: 1.2em; + padding: 0.3em; + margin-left: 0; + font-weight: bold; + } + } + } + +} diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SavedLinksListItemWidget.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SavedLinksListItemWidget.less new file mode 100644 index 0000000000..66ceb64363 --- /dev/null +++ b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SavedLinksListItemWidget.less @@ -0,0 +1,52 @@ +.mw-rcfilters-ui-savedLinksListItemWidget { + padding: 0.5em; + + &:hover { + // Mimicking optionWidget styles + background-color: #eaecf0; + color: #000; + } + + .mw-rcfilters-ui-cell { + vertical-align: middle; + } + + &:not( .oo-ui-iconElement ) .oo-ui-iconElement-icon { + // The iconElement-icon class still appears when we + // have an empty icon, and we need it to pretend to + // be there so the text has the same alignment as + // text next to a visible icon. #ThanksOOUI + width: 1.875em; + height: 1.875em; + } + + &-icon span { + display: inline-block; + } + + &-input { + display: inline-block; + margin-right: 0; + width: 15em; + } + + &-label { + max-width: 15em; + display: inline-block; + vertical-align: middle; + text-overflow: ellipsis; + overflow: hidden; + cursor: pointer; + margin-left: 0.5px; + } + + &-icon, + &-button { + width: 2em; + } + + &-content { + width: 100%; + } + +} diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SavedLinksListWidget.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SavedLinksListWidget.less new file mode 100644 index 0000000000..e1e55a77f5 --- /dev/null +++ b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SavedLinksListWidget.less @@ -0,0 +1,7 @@ +.mw-rcfilters-ui-savedLinksListWidget { + float: right; + + &-menu { + width: 100%; + } +} diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.less index 957e9e9009..c0f24c6cbe 100644 --- a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.less +++ b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.less @@ -14,3 +14,19 @@ } } +// Temporary icon classes, until these icons +// are merged into OOUI properly +.oo-ui-iconElement-icon.oo-ui-icon-clip { + /* @embed */ + background-image: url( ../images/clip.svg ); +} + +.oo-ui-iconElement-icon.oo-ui-icon-unClip { + /* @embed */ + background-image: url( ../images/unClip.svg ); +} + +.oo-ui-iconElement-icon.oo-ui-icon-pushPin { + /* @embed */ + background-image: url( ../images/pushPin.svg ); +} diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterTagMultiselectWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterTagMultiselectWidget.js index c52ca1fc22..cbf8747664 100644 --- a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterTagMultiselectWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterTagMultiselectWidget.js @@ -8,10 +8,11 @@ * @constructor * @param {mw.rcfilters.Controller} controller Controller * @param {mw.rcfilters.dm.FiltersViewModel} model View model + * @param {mw.rcfilters.dm.SavedQueriesModel} savedQueriesModel Saved queries model * @param {Object} config Configuration object * @cfg {jQuery} [$overlay] A jQuery object serving as overlay for popups */ - mw.rcfilters.ui.FilterTagMultiselectWidget = function MwRcfiltersUiFilterTagMultiselectWidget( controller, model, config ) { + mw.rcfilters.ui.FilterTagMultiselectWidget = function MwRcfiltersUiFilterTagMultiselectWidget( controller, model, savedQueriesModel, config ) { var title = new OO.ui.LabelWidget( { label: mw.msg( 'rcfilters-activefilters' ), classes: [ 'mw-rcfilters-ui-filterTagMultiselectWidget-wrapper-content-title' ] @@ -23,7 +24,9 @@ this.controller = controller; this.model = model; + this.queriesModel = savedQueriesModel; this.$overlay = config.$overlay || this.$element; + this.matchingQuery = null; // Parent mw.rcfilters.ui.FilterTagMultiselectWidget.parent.call( this, $.extend( true, { @@ -55,11 +58,21 @@ } }, config ) ); + this.savedQueryTitle = new OO.ui.LabelWidget( { + label: '', + classes: [ 'mw-rcfilters-ui-filterTagMultiselectWidget-wrapper-content-savedQueryTitle' ] + } ); + this.resetButton = new OO.ui.ButtonWidget( { framed: false, classes: [ 'mw-rcfilters-ui-filterTagMultiselectWidget-resetButton' ] } ); + this.saveQueryButton = new mw.rcfilters.ui.SaveFiltersPopupButtonWidget( + this.controller, + this.queriesModel + ); + this.emptyFilterMessage = new OO.ui.LabelWidget( { label: mw.msg( 'rcfilters-empty-filter' ), classes: [ 'mw-rcfilters-ui-filterTagMultiselectWidget-emptyFilters' ] @@ -71,15 +84,22 @@ // Stop propagation for mousedown, so that the widget doesn't // trigger the focus on the input and scrolls up when we click the reset button this.resetButton.$element.on( 'mousedown', function ( e ) { e.stopPropagation(); } ); + this.saveQueryButton.$element.on( 'mousedown', function ( e ) { e.stopPropagation(); } ); this.model.connect( this, { initialize: 'onModelInitialize', itemUpdate: 'onModelItemUpdate', highlightChange: 'onModelHighlightChange' } ); + this.saveQueryButton.connect( this, { + click: 'onSaveQueryButtonClick', + saveCurrent: 'setSavedQueryVisibility' + } ); + this.queriesModel.connect( this, { itemUpdate: 'onSavedQueriesItemUpdate' } ); // Build the content $contentWrapper.append( title.$element, + this.savedQueryTitle.$element, $( '
' ) .addClass( 'mw-rcfilters-ui-table' ) .append( @@ -93,6 +113,10 @@ this.$content .addClass( 'mw-rcfilters-ui-cell' ) .addClass( 'mw-rcfilters-ui-filterTagMultiselectWidget-cell-filters' ), + $( '
' ) + .addClass( 'mw-rcfilters-ui-cell' ) + .addClass( 'mw-rcfilters-ui-filterTagMultiselectWidget-cell-save' ) + .append( this.saveQueryButton.$element ), $( '
' ) .addClass( 'mw-rcfilters-ui-cell' ) .addClass( 'mw-rcfilters-ui-filterTagMultiselectWidget-cell-reset' ) @@ -104,6 +128,7 @@ // Initialize this.$handle.append( $contentWrapper ); this.emptyFilterMessage.toggle( this.isEmpty() ); + this.savedQueryTitle.toggle( false ); this.$element .addClass( 'mw-rcfilters-ui-filterTagMultiselectWidget' ); @@ -118,6 +143,26 @@ /* Methods */ + /** + * Respond to query button click + */ + mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onSaveQueryButtonClick = function () { + this.getMenu().toggle( false ); + }; + + /** + * Respond to save query item change. Mainly this is done to update the label in case + * a query item has been edited + * + * @param {mw.rcfilters.dm.SavedQueryItemModel} item Saved query item + */ + mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onSavedQueriesItemUpdate = function ( item ) { + if ( this.matchingQuery === item ) { + // This means we just edited the item that is currently matched + this.savedQueryTitle.setLabel( item.getLabel() ); + } + }; + /** * Respond to menu toggle * @@ -168,8 +213,25 @@ */ mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onModelInitialize = function () { this.populateFromModel(); + + this.setSavedQueryVisibility(); }; + /** + * Set the visibility of the saved query button + */ + mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.setSavedQueryVisibility = function () { + this.matchingQuery = this.controller.findQueryMatchingCurrentState(); + + this.savedQueryTitle.setLabel( + this.matchingQuery ? this.matchingQuery.getLabel() : '' + ); + this.savedQueryTitle.toggle( !!this.matchingQuery ); + this.saveQueryButton.toggle( + !this.isEmpty() && + !this.matchingQuery + ); + }; /** * Respond to model itemUpdate event * @@ -189,6 +251,8 @@ this.removeTagByData( item.getName() ); } + this.setSavedQueryVisibility(); + // Re-evaluate reset state this.reevaluateResetRestoreState(); }; diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterWrapperWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterWrapperWidget.js index b7ebf3423a..738a981d08 100644 --- a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterWrapperWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterWrapperWidget.js @@ -8,11 +8,12 @@ * @constructor * @param {mw.rcfilters.Controller} controller Controller * @param {mw.rcfilters.dm.FiltersViewModel} model View model + * @param {mw.rcfilters.dm.SavedQueriesModel} savedQueriesModel Saved queries model * @param {Object} [config] Configuration object * @cfg {Object} [filters] A definition of the filter groups in this list * @cfg {jQuery} [$overlay] A jQuery object serving as overlay for popups */ - mw.rcfilters.ui.FilterWrapperWidget = function MwRcfiltersUiFilterWrapperWidget( controller, model, config ) { + mw.rcfilters.ui.FilterWrapperWidget = function MwRcfiltersUiFilterWrapperWidget( controller, model, savedQueriesModel, config ) { config = config || {}; // Parent @@ -22,18 +23,29 @@ this.controller = controller; this.model = model; + this.queriesModel = savedQueriesModel; this.$overlay = config.$overlay || this.$element; this.filterTagWidget = new mw.rcfilters.ui.FilterTagMultiselectWidget( this.controller, this.model, + this.queriesModel, + { $overlay: this.$overlay } + ); + + this.savedLinksListWidget = new mw.rcfilters.ui.SavedLinksListWidget( + this.controller, + this.queriesModel, { $overlay: this.$overlay } ); // Initialize this.$element .addClass( 'mw-rcfilters-ui-filterWrapperWidget' ) - .append( this.filterTagWidget.$element ); + .append( + this.savedLinksListWidget.$element, + this.filterTagWidget.$element + ); }; /* Initialization */ diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SaveFiltersPopupButtonWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SaveFiltersPopupButtonWidget.js new file mode 100644 index 0000000000..9b7a2fba8b --- /dev/null +++ b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SaveFiltersPopupButtonWidget.js @@ -0,0 +1,159 @@ +( function ( mw ) { + /** + * Save filters widget. This widget is displayed in the tag area + * and allows the user to save the current state of the system + * as a new saved filter query they can later load or set as + * default. + * + * @extends OO.ui.PopupButtonWidget + * + * @constructor + * @param {mw.rcfilters.Controller} controller Controller + * @param {mw.rcfilters.dm.SavedQueriesModel} model View model + * @param {Object} [config] Configuration object + */ + mw.rcfilters.ui.SaveFiltersPopupButtonWidget = function MwRcfiltersUiSaveFiltersPopupButtonWidget( controller, model, config ) { + var layout, + $popupContent = $( '
' ); + + config = config || {}; + + this.controller = controller; + this.model = model; + + // Parent + mw.rcfilters.ui.SaveFiltersPopupButtonWidget.parent.call( this, $.extend( { + framed: false, + icon: 'clip', + $overlay: this.$overlay, + title: mw.msg( 'rcfilters-savedqueries-add-new-title' ), + popup: { + classes: [ 'mw-rcfilters-ui-saveFiltersPopupButtonWidget-popup' ], + padded: true, + head: true, + label: mw.msg( 'rcfilters-savedqueries-add-new-title' ), + $content: $popupContent + } + }, config ) ); + // // HACK: Add an icon to the popup head label + this.popup.$head.prepend( ( new OO.ui.IconWidget( { icon: 'clip' } ) ).$element ); + + this.input = new OO.ui.TextInputWidget( { + validate: 'non-empty' + } ); + layout = new OO.ui.FieldLayout( this.input, { + label: mw.msg( 'rcfilters-savedqueries-new-name-label' ), + align: 'top' + } ); + + this.applyButton = new OO.ui.ButtonWidget( { + label: mw.msg( 'rcfilters-savedqueries-apply-label' ), + classes: [ 'mw-rcfilters-ui-saveFiltersPopupButtonWidget-popup-buttons-apply' ], + flags: [ 'primary', 'progressive' ] + } ); + this.cancelButton = new OO.ui.ButtonWidget( { + label: mw.msg( 'rcfilters-savedqueries-cancel-label' ), + classes: [ 'mw-rcfilters-ui-saveFiltersPopupButtonWidget-popup-buttons-cancel' ] + } ); + + $popupContent + .append( + $( '
' ) + .addClass( 'mw-rcfilters-ui-saveFiltersPopupButtonWidget-popup-layout' ) + .append( layout.$element ), + $( '
' ) + .addClass( 'mw-rcfilters-ui-saveFiltersPopupButtonWidget-popup-buttons' ) + .append( + this.cancelButton.$element, + this.applyButton.$element + ) + ); + + // Events + this.popup.connect( this, { + ready: 'onPopupReady', + toggle: 'onPopupToggle' + } ); + this.input.connect( this, { enter: 'onInputEnter' } ); + this.input.$input.on( { + keyup: this.onInputKeyup.bind( this ) + } ); + this.cancelButton.connect( this, { click: 'onCancelButtonClick' } ); + this.applyButton.connect( this, { click: 'onApplyButtonClick' } ); + + // Initialize + this.$element + .addClass( 'mw-rcfilters-ui-saveFiltersPopupButtonWidget' ); + }; + + /* Initialization */ + OO.inheritClass( mw.rcfilters.ui.SaveFiltersPopupButtonWidget, OO.ui.PopupButtonWidget ); + + /** + * Respond to input enter event + */ + mw.rcfilters.ui.SaveFiltersPopupButtonWidget.prototype.onInputEnter = function () { + this.apply(); + }; + + /** + * Respond to input keyup event, this is the way to intercept 'escape' key + * + * @param {jQuery.Event} e Event data + * @returns {boolean} false + */ + mw.rcfilters.ui.SaveFiltersPopupButtonWidget.prototype.onInputKeyup = function ( e ) { + if ( e.which === OO.ui.Keys.ESCAPE ) { + this.popup.toggle( false ); + return false; + } + }; + + /** + * Respond to popup toggle event + * + * @param {boolean} isVisible Popup is visible + */ + mw.rcfilters.ui.SaveFiltersPopupButtonWidget.prototype.onPopupToggle = function ( isVisible ) { + this.setIcon( isVisible ? 'unClip' : 'clip' ); + }; + + /** + * Respond to popup ready event + */ + mw.rcfilters.ui.SaveFiltersPopupButtonWidget.prototype.onPopupReady = function () { + this.input.focus(); + }; + + /** + * Respond to cancel button click event + */ + mw.rcfilters.ui.SaveFiltersPopupButtonWidget.prototype.onCancelButtonClick = function () { + this.popup.toggle( false ); + }; + + /** + * Respond to apply button click event + */ + mw.rcfilters.ui.SaveFiltersPopupButtonWidget.prototype.onApplyButtonClick = function () { + this.apply(); + }; + + /** + * Apply and add the new quick link + */ + mw.rcfilters.ui.SaveFiltersPopupButtonWidget.prototype.apply = function () { + var widget = this, + label = this.input.getValue(); + + this.input.getValidity() + .done( function () { + widget.controller.saveCurrentQuery( label ); + widget.input.setValue( this.input, '' ); + widget.emit( 'saveCurrent' ); + } ) + .always( function () { + widget.popup.toggle( false ); + } ); + }; +}( mediaWiki ) ); diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SavedLinksListItemWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SavedLinksListItemWidget.js new file mode 100644 index 0000000000..51b348e89e --- /dev/null +++ b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SavedLinksListItemWidget.js @@ -0,0 +1,293 @@ +( function ( mw ) { + /** + * Quick links menu option widget + * + * @extends OO.ui.Widget + * @mixins OO.ui.mixin.LabelElement + * @mixins OO.ui.mixin.IconElement + * + * @constructor + * @param {mw.rcfilters.dm.SavedQueryItemModel} model View model + * @param {Object} [config] Configuration object + * @cfg {jQuery} [$overlay] A jQuery object serving as overlay for popups + */ + mw.rcfilters.ui.SavedLinksListItemWidget = function MwRcfiltersUiSavedLinksListWidget( model, config ) { + config = config || {}; + + this.model = model; + + // Parent + mw.rcfilters.ui.SavedLinksListItemWidget.parent.call( this, $.extend( { + data: this.model.getID() + }, config ) ); + + // Mixin constructors + OO.ui.mixin.LabelElement.call( this, $.extend( { + label: this.model.getLabel() + }, config ) ); + OO.ui.mixin.IconElement.call( this, $.extend( { + icon: '' + }, config ) ); + + this.edit = false; + this.$overlay = config.$overlay || this.$element; + + this.popupButton = new OO.ui.ButtonWidget( { + classes: [ 'mw-rcfilters-ui-savedLinksListItemWidget-button' ], + icon: 'ellipsis', + framed: false + } ); + this.menu = new OO.ui.FloatingMenuSelectWidget( { + classes: [ 'mw-rcfilters-ui-savedLinksListItemWidget-menu' ], + widget: this.popupButton, + width: 200, + horizontalPosition: 'end', + $container: this.popupButton.$element, + items: [ + new OO.ui.MenuOptionWidget( { + data: 'edit', + icon: 'edit', + label: mw.msg( 'rcfilters-savedqueries-rename' ) + } ), + new OO.ui.MenuOptionWidget( { + data: 'delete', + icon: 'close', + label: mw.msg( 'rcfilters-savedqueries-remove' ) + } ), + new OO.ui.MenuOptionWidget( { + data: 'default', + icon: 'pushPin', + label: mw.msg( 'rcfilters-savedqueries-setdefault' ) + } ) + ] + } ); + + this.editInput = new OO.ui.TextInputWidget( { + classes: [ 'mw-rcfilters-ui-savedLinksListItemWidget-input' ] + } ); + this.saveButton = new OO.ui.ButtonWidget( { + icon: 'check', + flags: [ 'primary', 'progressive' ] + } ); + this.toggleEdit( false ); + + // Events + this.model.connect( this, { update: 'onModelUpdate' } ); + this.popupButton.connect( this, { click: 'onPopupButtonClick' } ); + this.menu.connect( this, { + choose: 'onMenuChoose' + } ); + this.saveButton.connect( this, { click: 'onSaveButtonClick' } ); + this.editInput.connect( this, { enter: 'onEditInputEnter' } ); + this.editInput.$input.on( { + blur: this.onInputBlur.bind( this ), + keyup: this.onInputKeyup.bind( this ) + } ); + this.$element.on( { click: this.onClick.bind( this ) } ); + this.$label.on( { click: this.onClick.bind( this ) } ); + // Prevent propagation on mousedown for the save button + // so the menu doesn't close + this.saveButton.$element.on( { mousedown: function () { return false; } } ); + + // Initialize + this.toggleDefault( !!this.model.isDefault() ); + this.$overlay.append( this.menu.$element ); + this.$element + .addClass( 'mw-rcfilters-ui-savedLinksListItemWidget' ) + .addClass( 'mw-rcfilters-ui-savedLinksListItemWidget-query-' + this.model.getID() ) + .append( + $( '
' ) + .addClass( 'mw-rcfilters-ui-table' ) + .append( + $( '
' ) + .addClass( 'mw-rcfilters-ui-row' ) + .append( + $( '
' ) + .addClass( 'mw-rcfilters-ui-cell' ) + .addClass( 'mw-rcfilters-ui-savedLinksListItemWidget-icon' ) + .append( this.$icon ), + $( '
' ) + .addClass( 'mw-rcfilters-ui-cell' ) + .addClass( 'mw-rcfilters-ui-savedLinksListItemWidget-content' ) + .append( + this.$label + .addClass( 'mw-rcfilters-ui-savedLinksListItemWidget-label' ), + this.editInput.$element, + this.saveButton.$element + ), + this.popupButton.$element + .addClass( 'mw-rcfilters-ui-cell' ) + ) + ) + ); + }; + + /* Initialization */ + OO.inheritClass( mw.rcfilters.ui.SavedLinksListItemWidget, OO.ui.Widget ); + OO.mixinClass( mw.rcfilters.ui.SavedLinksListItemWidget, OO.ui.mixin.LabelElement ); + OO.mixinClass( mw.rcfilters.ui.SavedLinksListItemWidget, OO.ui.mixin.IconElement ); + + /* Events */ + + /** + * @event delete + * + * The delete option was selected for this item + */ + + /** + * @event default + * @param {boolean} default Item is default + * + * The 'make default' option was selected for this item + */ + + /** + * @event edit + * @param {string} newLabel New label for the query + * + * The label has been edited + */ + + /* Methods */ + + /** + * Respond to model update event + */ + mw.rcfilters.ui.SavedLinksListItemWidget.prototype.onModelUpdate = function () { + this.setLabel( this.model.getLabel() ); + this.toggleDefault( this.model.isDefault() ); + }; + + /** + * Respond to click on the element or label + * + * @fires click + */ + mw.rcfilters.ui.SavedLinksListItemWidget.prototype.onClick = function () { + if ( !this.editing ) { + this.emit( 'click' ); + } + }; + /** + * Respond to popup button click event + */ + mw.rcfilters.ui.SavedLinksListItemWidget.prototype.onPopupButtonClick = function () { + this.menu.toggle(); + }; + + /** + * Respond to menu choose event + * + * @param {OO.ui.MenuOptionWidget} item Chosen item + * @fires delete + * @fires default + */ + mw.rcfilters.ui.SavedLinksListItemWidget.prototype.onMenuChoose = function ( item ) { + var action = item.getData(); + + if ( action === 'edit' ) { + this.toggleEdit( true ); + } else if ( action === 'delete' ) { + this.emit( 'delete' ); + } else if ( action === 'default' ) { + this.emit( 'default', !this.default ); + } + // Reset selected + this.menu.selectItem( null ); + // Close the menu + this.menu.toggle( false ); + }; + + /** + * Respond to save button click + */ + mw.rcfilters.ui.SavedLinksListItemWidget.prototype.onSaveButtonClick = function () { + this.emit( 'edit', this.editInput.getValue() ); + this.toggleEdit( false ); + }; + + /** + * Respond to input enter event + */ + mw.rcfilters.ui.SavedLinksListItemWidget.prototype.onEditInputEnter = function () { + this.emit( 'edit', this.editInput.getValue() ); + this.toggleEdit( false ); + }; + + /** + * Respond to input keyup event, this is the way to intercept 'escape' key + * + * @param {jQuery.Event} e Event data + * @returns {boolean} false + */ + mw.rcfilters.ui.SavedLinksListItemWidget.prototype.onInputKeyup = function ( e ) { + if ( e.which === OO.ui.Keys.ESCAPE ) { + // Return the input to the original label + this.editInput.setValue( this.getLabel() ); + this.toggleEdit( false ); + return false; + } + }; + + /** + * Respond to blur event on the input + */ + mw.rcfilters.ui.SavedLinksListItemWidget.prototype.onInputBlur = function () { + this.emit( 'edit', this.editInput.getValue() ); + this.toggleEdit( false ); + }; + + /** + * Toggle edit mode on this widget + * + * @param {boolean} isEdit Widget is in edit mode + */ + mw.rcfilters.ui.SavedLinksListItemWidget.prototype.toggleEdit = function ( isEdit ) { + isEdit = isEdit === undefined ? !this.editing : isEdit; + + if ( this.editing !== isEdit ) { + this.$element.toggleClass( 'mw-rcfilters-ui-savedLinksListItemWidget-edit', isEdit ); + this.editInput.setValue( this.getLabel() ); + + this.editInput.toggle( isEdit ); + this.$label.toggleClass( 'oo-ui-element-hidden', isEdit ); + this.popupButton.toggle( !isEdit ); + this.saveButton.toggle( isEdit ); + + if ( isEdit ) { + this.editInput.$input.focus(); + } + this.editing = isEdit; + } + }; + + /** + * Toggle default this widget + * + * @param {boolean} isDefault This item is default + */ + mw.rcfilters.ui.SavedLinksListItemWidget.prototype.toggleDefault = function ( isDefault ) { + isDefault = isDefault === undefined ? !this.default : isDefault; + + if ( this.default !== isDefault ) { + this.default = isDefault; + this.setIcon( this.default ? 'pushPin' : '' ); + this.menu.getItemFromData( 'default' ).setLabel( + this.default ? + mw.msg( 'rcfilters-savedqueries-unsetdefault' ) : + mw.msg( 'rcfilters-savedqueries-setdefault' ) + ); + } + }; + + /** + * Get item ID + * + * @returns {string} Query identifier + */ + mw.rcfilters.ui.SavedLinksListItemWidget.prototype.getID = function () { + return this.model.getID(); + }; + +}( mediaWiki ) ); diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SavedLinksListWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SavedLinksListWidget.js new file mode 100644 index 0000000000..9ae1d34fb5 --- /dev/null +++ b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SavedLinksListWidget.js @@ -0,0 +1,137 @@ +( function ( mw ) { + /** + * Quick links widget + * + * @extends OO.ui.Widget + * + * @constructor + * @param {mw.rcfilters.Controller} controller Controller + * @param {mw.rcfilters.dm.SavedQueriesModel} model View model + * @param {Object} [config] Configuration object + * @cfg {jQuery} [$overlay] A jQuery object serving as overlay for popups + */ + mw.rcfilters.ui.SavedLinksListWidget = function MwRcfiltersUiSavedLinksListWidget( controller, model, config ) { + config = config || {}; + + // Parent + mw.rcfilters.ui.SavedLinksListWidget.parent.call( this, config ); + + this.controller = controller; + this.model = model; + this.$overlay = config.$overlay || this.$element; + + // The only reason we're using "ButtonGroupWidget" here is that + // straight-out "GroupWidget" is a mixin and cannot be initialized + // on its own, so we need something to be its widget. + this.menu = new OO.ui.ButtonGroupWidget( { + classes: [ 'mw-rcfilters-ui-savedLinksListWidget-menu' ] + } ); + this.button = new OO.ui.PopupButtonWidget( { + classes: [ 'mw-rcfilters-ui-savedLinksListWidget-button' ], + label: mw.msg( 'rcfilters-quickfilters' ), + icon: 'unClip', + $overlay: this.$overlay, + popup: { + width: 300, + anchor: false, + align: 'forwards', + $autoCloseIgnore: this.$overlay, + $content: this.menu.$element + } + } ); + + this.menu.aggregate( { + click: 'menuItemClick', + 'delete': 'menuItemDelete', + 'default': 'menuItemDefault', + edit: 'menuItemEdit' + } ); + + // Events + this.model.connect( this, { + add: 'onModelAddItem', + remove: 'onModelRemoveItem' + } ); + this.menu.connect( this, { + menuItemClick: 'onMenuItemClick', + menuItemDelete: 'onMenuItemRemove', + menuItemDefault: 'onMenuItemDefault', + menuItemEdit: 'onMenuItemEdit' + } ); + + this.button.toggle( !this.menu.isEmpty() ); + // Initialize + this.$element + .addClass( 'mw-rcfilters-ui-savedLinksListWidget' ) + .append( this.button.$element ); + }; + + /* Initialization */ + OO.inheritClass( mw.rcfilters.ui.SavedLinksListWidget, OO.ui.Widget ); + + /** + * Respond to menu item click event + * + * @param {mw.rcfilters.ui.SavedLinksListItemWidget} item Menu item + */ + mw.rcfilters.ui.SavedLinksListWidget.prototype.onMenuItemClick = function ( item ) { + this.controller.applySavedQuery( item.getID() ); + this.button.popup.toggle( false ); + }; + + /** + * Respond to menu item remove event + * + * @param {mw.rcfilters.ui.SavedLinksListItemWidget} item Menu item + */ + mw.rcfilters.ui.SavedLinksListWidget.prototype.onMenuItemRemove = function ( item ) { + this.controller.removeSavedQuery( item.getID() ); + this.menu.removeItems( [ item ] ); + }; + + /** + * Respond to menu item default event + * + * @param {mw.rcfilters.ui.SavedLinksListItemWidget} item Menu item + * @param {boolean} isDefault Item is default + */ + mw.rcfilters.ui.SavedLinksListWidget.prototype.onMenuItemDefault = function ( item, isDefault ) { + this.controller.setDefaultSavedQuery( isDefault ? item.getID() : null ); + }; + + /** + * Respond to menu item edit event + * + * @param {mw.rcfilters.ui.SavedLinksListItemWidget} item Menu item + * @param {string} newLabel New label + */ + mw.rcfilters.ui.SavedLinksListWidget.prototype.onMenuItemEdit = function ( item, newLabel ) { + this.controller.renameSavedQuery( item.getID(), newLabel ); + }; + + /** + * Respond to menu add item event + * + * @param {mw.rcfilters.ui.SavedLinksListItemWidget} item Menu item + */ + mw.rcfilters.ui.SavedLinksListWidget.prototype.onModelAddItem = function ( item ) { + if ( this.menu.getItemFromData( item.getID() ) ) { + return; + } + + this.menu.addItems( [ + new mw.rcfilters.ui.SavedLinksListItemWidget( item, { $overlay: this.$overlay } ) + ] ); + this.button.toggle( !this.menu.isEmpty() ); + }; + + /** + * Respond to menu remove item event + * + * @param {mw.rcfilters.ui.SavedLinksListItemWidget} item Menu item + */ + mw.rcfilters.ui.SavedLinksListWidget.prototype.onModelRemoveItem = function ( item ) { + this.menu.removeItems( [ this.model.getItemByID( item.getID() ) ] ); + this.button.toggle( !this.menu.isEmpty() ); + }; +}( mediaWiki ) ); diff --git a/tests/parser/ParserTestRunner.php b/tests/parser/ParserTestRunner.php index f100411f25..f44b0d5e26 100644 --- a/tests/parser/ParserTestRunner.php +++ b/tests/parser/ParserTestRunner.php @@ -747,6 +747,10 @@ class ParserTestRunner { $user = $context->getUser(); $options = ParserOptions::newFromContext( $context ); + if ( !isset( $opts['wrap'] ) ) { + $options->setWrapOutputClass( false ); + } + if ( isset( $opts['tidy'] ) ) { if ( !$this->tidySupport->isEnabled() ) { $this->recorder->skipped( $test, 'tidy extension is not installed' ); diff --git a/tests/parser/parserTests.txt b/tests/parser/parserTests.txt index e12c136d91..6477356c8a 100644 --- a/tests/parser/parserTests.txt +++ b/tests/parser/parserTests.txt @@ -32,6 +32,7 @@ # local format section links in edit comment text as local links # notoc disable table of contents # thumbsize=NNN set the default thumb size to NNNpx for this test +# wrap include the normal wrapper
(since 1.30) # # You can also set the following parser properties via test options: # wgEnableUploads, wgAllowExternalImages, wgMaxTocLevel, diff --git a/tests/phpunit/includes/ExtraParserTest.php b/tests/phpunit/includes/ExtraParserTest.php index 4e95a30e09..a4e3bb9493 100644 --- a/tests/phpunit/includes/ExtraParserTest.php +++ b/tests/phpunit/includes/ExtraParserTest.php @@ -26,6 +26,7 @@ class ExtraParserTest extends MediaWikiTestCase { // FIXME: This test should pass without setting global content language $this->options = ParserOptions::newFromUserAndLang( new User, $contLang ); $this->options->setTemplateCallback( [ __CLASS__, 'statelessFetchTemplate' ] ); + $this->options->setWrapOutputClass( false ); $this->parser = new Parser; MagicWord::clearCache(); @@ -40,6 +41,7 @@ class ExtraParserTest extends MediaWikiTestCase { $title = Title::newFromText( 'Unit test' ); $options = ParserOptions::newFromUser( new User() ); + $options->setWrapOutputClass( false ); $this->assertEquals( "

$longLine

", $this->parser->parse( $longLine, $title, $options )->getText() ); } diff --git a/tests/phpunit/includes/content/WikitextContentTest.php b/tests/phpunit/includes/content/WikitextContentTest.php index 4c69d871b9..b9ce997f23 100644 --- a/tests/phpunit/includes/content/WikitextContentTest.php +++ b/tests/phpunit/includes/content/WikitextContentTest.php @@ -29,7 +29,7 @@ more stuff "WikitextContentTest_testGetParserOutput", CONTENT_MODEL_WIKITEXT, "hello ''world''\n", - "

hello world\n

" + "

hello world\n

\n\n\n
" ], // TODO: more...? ]; diff --git a/tests/phpunit/includes/page/WikiPageTest.php b/tests/phpunit/includes/page/WikiPageTest.php index 6b911bf3a6..556a34813c 100644 --- a/tests/phpunit/includes/page/WikiPageTest.php +++ b/tests/phpunit/includes/page/WikiPageTest.php @@ -549,7 +549,11 @@ class WikiPageTest extends MediaWikiLangTestCase { public static function provideGetParserOutput() { return [ - [ CONTENT_MODEL_WIKITEXT, "hello ''world''\n", "

hello world

" ], + [ + CONTENT_MODEL_WIKITEXT, + "hello ''world''\n", + "

hello world

" + ], // @todo more...? ]; } @@ -566,7 +570,7 @@ class WikiPageTest extends MediaWikiLangTestCase { $text = $po->getText(); $text = trim( preg_replace( '//sm', '', $text ) ); # strip injected comments - $text = preg_replace( '!\s*(

)!sm', '\1', $text ); # don't let tidy confuse us + $text = preg_replace( '!\s*(

|
)!sm', '\1', $text ); # don't let tidy confuse us $this->assertEquals( $expectedHtml, $text ); diff --git a/tests/phpunit/includes/parser/TagHooksTest.php b/tests/phpunit/includes/parser/TagHooksTest.php index 12936ee21d..06fe272b29 100644 --- a/tests/phpunit/includes/parser/TagHooksTest.php +++ b/tests/phpunit/includes/parser/TagHooksTest.php @@ -43,18 +43,25 @@ class TagHookTest extends MediaWikiTestCase { return [ [ "foobar" ], [ "foo\nbar" ], [ "foo\rbar" ] ]; } + private function getParserOptions() { + global $wgContLang; + $popt = ParserOptions::newFromUserAndLang( new User, $wgContLang ); + $popt->setWrapOutputClass( false ); + return $popt; + } + /** * @dataProvider provideValidNames */ public function testTagHooks( $tag ) { - global $wgParserConf, $wgContLang; + global $wgParserConf; $parser = new Parser( $wgParserConf ); $parser->setHook( $tag, [ $this, 'tagCallback' ] ); $parserOutput = $parser->parse( "Foo<$tag>BarBaz", Title::newFromText( 'Test' ), - ParserOptions::newFromUserAndLang( new User, $wgContLang ) + $this->getParserOptions() ); $this->assertEquals( "

FooOneBaz\n

", $parserOutput->getText() ); @@ -66,14 +73,14 @@ class TagHookTest extends MediaWikiTestCase { * @expectedException MWException */ public function testBadTagHooks( $tag ) { - global $wgParserConf, $wgContLang; + global $wgParserConf; $parser = new Parser( $wgParserConf ); $parser->setHook( $tag, [ $this, 'tagCallback' ] ); $parser->parse( "Foo<$tag>BarBaz", Title::newFromText( 'Test' ), - ParserOptions::newFromUserAndLang( new User, $wgContLang ) + $this->getParserOptions() ); $this->fail( 'Exception not thrown.' ); } @@ -82,14 +89,14 @@ class TagHookTest extends MediaWikiTestCase { * @dataProvider provideValidNames */ public function testFunctionTagHooks( $tag ) { - global $wgParserConf, $wgContLang; + global $wgParserConf; $parser = new Parser( $wgParserConf ); $parser->setFunctionTagHook( $tag, [ $this, 'functionTagCallback' ], 0 ); $parserOutput = $parser->parse( "Foo<$tag>BarBaz", Title::newFromText( 'Test' ), - ParserOptions::newFromUserAndLang( new User, $wgContLang ) + $this->getParserOptions() ); $this->assertEquals( "

FooOneBaz\n

", $parserOutput->getText() ); @@ -101,7 +108,7 @@ class TagHookTest extends MediaWikiTestCase { * @expectedException MWException */ public function testBadFunctionTagHooks( $tag ) { - global $wgParserConf, $wgContLang; + global $wgParserConf; $parser = new Parser( $wgParserConf ); $parser->setFunctionTagHook( @@ -112,7 +119,7 @@ class TagHookTest extends MediaWikiTestCase { $parser->parse( "Foo<$tag>BarBaz", Title::newFromText( 'Test' ), - ParserOptions::newFromUserAndLang( new User, $wgContLang ) + $this->getParserOptions() ); $this->fail( 'Exception not thrown.' ); } diff --git a/tests/phpunit/includes/specialpage/ChangesListSpecialPageTest.php b/tests/phpunit/includes/specialpage/ChangesListSpecialPageTest.php index c8c65dc4a0..e2209eb3d1 100644 --- a/tests/phpunit/includes/specialpage/ChangesListSpecialPageTest.php +++ b/tests/phpunit/includes/specialpage/ChangesListSpecialPageTest.php @@ -136,7 +136,7 @@ class ChangesListSpecialPageTest extends AbstractChangesListSpecialPageTestCase "rc_namespace IN ('1','2','3')", ], [ - 'namespace' => '1,2,3', + 'namespace' => '1;2;3', ], "rc conditions with multiple namespaces" ); @@ -148,7 +148,7 @@ class ChangesListSpecialPageTest extends AbstractChangesListSpecialPageTestCase "rc_namespace IN ('0','1','4','5','6','7')", ], [ - 'namespace' => '1,4,7', + 'namespace' => '1;4;7', 'associated' => 1, ], "rc conditions with multiple namespaces and associated" @@ -161,7 +161,7 @@ class ChangesListSpecialPageTest extends AbstractChangesListSpecialPageTestCase "rc_namespace NOT IN ('2','3','8','9')", ], [ - 'namespace' => '2,3,9', + 'namespace' => '2;3;9', 'associated' => 1, 'invert' => 1 ], @@ -175,7 +175,7 @@ class ChangesListSpecialPageTest extends AbstractChangesListSpecialPageTestCase "rc_namespace NOT IN ('1','2','3')", ], [ - 'namespace' => '1,2,3', + 'namespace' => '1;2;3', 'invert' => 1, ], "rc conditions with multiple namespaces inverted" diff --git a/tests/phpunit/includes/specials/SpecialRecentchangesTest.php b/tests/phpunit/includes/specials/SpecialRecentchangesTest.php index 8f3f585de7..85becff665 100644 --- a/tests/phpunit/includes/specials/SpecialRecentchangesTest.php +++ b/tests/phpunit/includes/specials/SpecialRecentchangesTest.php @@ -27,9 +27,13 @@ class SpecialRecentchangesTest extends AbstractChangesListSpecialPageTestCase { [ 'days=3', [ 'days' => '3' ] ], - [ 'namespace=5', [ 'namespace' => 5 ] ], + [ 'namespace=5', [ 'namespace' => '5' ] ], + + [ 'namespace=5|3', [ 'namespace' => '5|3' ] ], [ 'tagfilter=foo', [ 'tagfilter' => 'foo' ] ], + + [ 'tagfilter=foo;bar', [ 'tagfilter' => 'foo;bar' ] ], ]; } diff --git a/tests/qunit/suites/resources/mediawiki.rcfilters/dm.FiltersViewModel.test.js b/tests/qunit/suites/resources/mediawiki.rcfilters/dm.FiltersViewModel.test.js index 8071d6e864..bc266fbc5f 100644 --- a/tests/qunit/suites/resources/mediawiki.rcfilters/dm.FiltersViewModel.test.js +++ b/tests/qunit/suites/resources/mediawiki.rcfilters/dm.FiltersViewModel.test.js @@ -835,93 +835,6 @@ ); } ); - QUnit.test( 'setFiltersToDefaults', function ( assert ) { - var definition = [ { - name: 'group1', - title: 'Group 1', - type: 'send_unselected_if_any', - filters: [ - { - name: 'hidefilter1', - label: 'Show filter 1', - description: 'Description of Filter 1 in Group 1', - default: true - }, - { - name: 'hidefilter2', - label: 'Show filter 2', - description: 'Description of Filter 2 in Group 1' - }, - { - name: 'hidefilter3', - label: 'Show filter 3', - description: 'Description of Filter 3 in Group 1', - default: true - } - ] - }, { - name: 'group2', - title: 'Group 2', - type: 'send_unselected_if_any', - filters: [ - { - name: 'hidefilter4', - label: 'Show filter 4', - description: 'Description of Filter 1 in Group 2' - }, - { - name: 'hidefilter5', - label: 'Show filter 5', - description: 'Description of Filter 2 in Group 2', - default: true - }, - { - name: 'hidefilter6', - label: 'Show filter 6', - description: 'Description of Filter 3 in Group 2' - } - ] - } ], - defaultFilterRepresentation = { - // Group 1 and 2, "send_unselected_if_any", the values of the filters are "flipped" from the values of the parameters - group1__hidefilter1: false, - group1__hidefilter2: true, - group1__hidefilter3: false, - group2__hidefilter4: true, - group2__hidefilter5: false, - group2__hidefilter6: true - }, - model = new mw.rcfilters.dm.FiltersViewModel(); - - model.initializeFilters( definition ); - - assert.deepEqual( - model.getSelectedState(), - { - group1__hidefilter1: false, - group1__hidefilter2: false, - group1__hidefilter3: false, - group2__hidefilter4: false, - group2__hidefilter5: false, - group2__hidefilter6: false - }, - 'Initial state: default filters are not selected (controller selects defaults explicitly).' - ); - - model.toggleFiltersSelected( { - group1__hidefilter1: false, - group1__hidefilter3: false - } ); - - model.setFiltersToDefaults(); - - assert.deepEqual( - model.getSelectedState(), - defaultFilterRepresentation, - 'Changing values of filters and then returning to defaults still results in default filters being selected.' - ); - } ); - QUnit.test( 'Filter interaction: subsets', function ( assert ) { var definition = [ { name: 'group1',