Merge "Adjustments to floating elements in print styles"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Mon, 31 Jul 2017 18:38:50 +0000 (18:38 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Mon, 31 Jul 2017 18:38:50 +0000 (18:38 +0000)
126 files changed:
.travis.yml
autoload.php
composer.json
docs/hooks.txt
includes/DefaultSettings.php
includes/GlobalFunctions.php
includes/Preferences.php
includes/api/i18n/ko.json
includes/diff/DifferenceEngine.php
includes/htmlform/fields/HTMLUsersMultiselectField.php
includes/installer/MssqlUpdater.php
includes/installer/MysqlUpdater.php
includes/installer/PostgresUpdater.php
includes/installer/SqliteUpdater.php
includes/installer/i18n/roa-tara.json
includes/libs/CSSMin.php
includes/libs/filebackend/FileBackendStore.php
includes/libs/mime/MimeAnalyzer.php
includes/logging/BlockLogFormatter.php
includes/mail/EmailNotification.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/specials/SpecialPagesWithProp.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialWatchlist.php
includes/specials/pagers/UsersPager.php
includes/widget/search/BasicSearchResultSetWidget.php
jsduck.json
languages/i18n/ar.json
languages/i18n/as.json
languages/i18n/ba.json
languages/i18n/be-tarask.json
languages/i18n/bg.json
languages/i18n/bn.json
languages/i18n/bs.json
languages/i18n/ckb.json
languages/i18n/cs.json
languages/i18n/de.json
languages/i18n/el.json
languages/i18n/en.json
languages/i18n/es.json
languages/i18n/eu.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/ha.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hif-latn.json
languages/i18n/hr.json
languages/i18n/hu.json
languages/i18n/ia.json
languages/i18n/id.json
languages/i18n/ko.json
languages/i18n/lb.json
languages/i18n/mk.json
languages/i18n/nb.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/pl.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/rif.json
languages/i18n/ro.json
languages/i18n/ru.json
languages/i18n/shi.json
languages/i18n/skr-arab.json
languages/i18n/sl.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/sv.json
languages/i18n/ur.json
languages/i18n/yi.json
languages/i18n/zh-hans.json
maintenance/benchmarks/benchmarkLruHash.php [new file with mode: 0644]
maintenance/jsduck/categories.json
maintenance/mssql/archives/patch-add-3d.sql [new file with mode: 0644]
maintenance/mssql/tables.sql
maintenance/postgres/archives/patch-add-3d.sql [new file with mode: 0644]
maintenance/postgres/tables.sql
maintenance/refreshLinks.php
maintenance/sqlite/archives/patch-add-3d.sql [new file with mode: 0644]
maintenance/updateCredits.php
resources/Resources.php
resources/src/mediawiki.legacy/commonPrint.css
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.ItemModel.js
resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.SavedQueriesModel.js
resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.SavedQueryItemModel.js
resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js
resources/src/mediawiki.rcfilters/mw.rcfilters.HighlightColors.js
resources/src/mediawiki.rcfilters/mw.rcfilters.UriProcessor.js
resources/src/mediawiki.rcfilters/mw.rcfilters.init.js
resources/src/mediawiki.rcfilters/mw.rcfilters.js
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterTagMultiselectWidget.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterWrapperWidget.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SaveFiltersPopupButtonWidget.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.less
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ChangesLimitButtonWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.DateButtonWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterItemHighlightButton.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterMenuHeaderWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterMenuSectionOptionWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterTagMultiselectWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterWrapperWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FormWrapperWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SaveFiltersPopupButtonWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SavedLinksListItemWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SavedLinksListWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ValuePickerWidget.js
resources/src/mediawiki.special/mediawiki.special.block.js
resources/src/mediawiki.special/mediawiki.special.changeslist.legend.js
resources/src/mediawiki.special/mediawiki.special.search.styles.css
resources/src/mediawiki/htmlform/selectorother.js
resources/src/mediawiki/page/gallery.css
resources/src/mediawiki/page/gallery.print.css
tests/common/TestsAutoLoader.php
tests/phpunit/ResourceLoaderTestCase.php
tests/phpunit/includes/DeprecatedGlobalTest.php
tests/phpunit/includes/libs/CSSMinTest.php
tests/phpunit/includes/libs/rdbms/database/DatabaseSQLTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderFileModuleTest.php
tests/phpunit/includes/specialpage/ChangesListSpecialPageTest.php
tests/phpunit/suite.xml
tests/qunit/suites/resources/mediawiki.rcfilters/dm.FiltersViewModel.test.js

index 5e2c7a0..cde7193 100644 (file)
@@ -7,11 +7,12 @@
 # complement that setup by testing MediaWiki on travis
 #
 language: php
-# Use the slower sudo-enabled VMs instead of fast containers:
-# - Package 'djvulibre-bin' is not yet whitelisted for trusty containers.
-#   https://github.com/travis-ci/apt-package-whitelist/issues/4036
-sudo: required
-# Use Trusty instead of Travis default (precise)
+
+
+# Use fast containers instead of the slower sudo-enabled VMs:
+sudo: false
+# Use Ubuntu 14 Trusty (not Ubuntu 12 Precise)
+# <https://docs.travis-ci.com/user/reference/trusty/>
 # - Required in order to use HHVM 3.6 or higher.
 # - Required for non-buggy xml library for XmlTypeCheck/UploadBaseTest (T75176).
 dist: trusty
@@ -25,10 +26,11 @@ matrix:
       php: 5.5
     - env: dbtype=postgres dbuser=travis
       php: 5.5
+    # https://docs.travis-ci.com/user/languages/php#HHVM-versions
     - env: dbtype=mysql dbuser=root
-      # https://docs.travis-ci.com/user/languages/php#HHVM-versions
-      # https://github.com/travis-ci/travis-ci/issues/7368
       php: hhvm-3.12
+    - env: dbtype=mysql dbuser=root
+      php: hhvm-3.18
     - env: dbtype=mysql dbuser=root
       php: 7
 
index 510eeee..2bf1d4c 100644 (file)
@@ -193,6 +193,7 @@ $wgAutoloadLocalClasses = [
        'BenchmarkDeleteTruncate' => __DIR__ . '/maintenance/benchmarks/bench_delete_truncate.php',
        'BenchmarkHooks' => __DIR__ . '/maintenance/benchmarks/benchmarkHooks.php',
        'BenchmarkJSMinPlus' => __DIR__ . '/maintenance/benchmarks/benchmarkJSMinPlus.php',
+       'BenchmarkLruHash' => __DIR__ . '/maintenance/benchmarks/benchmarkLruHash.php',
        'BenchmarkParse' => __DIR__ . '/maintenance/benchmarks/benchmarkParse.php',
        'BenchmarkPurge' => __DIR__ . '/maintenance/benchmarks/benchmarkPurge.php',
        'BenchmarkTidy' => __DIR__ . '/maintenance/benchmarks/benchmarkTidy.php',
index d04e9f5..aefc158 100644 (file)
@@ -37,7 +37,7 @@
                "wikimedia/html-formatter": "1.0.1",
                "wikimedia/ip-set": "1.1.0",
                "wikimedia/php-session-serializer": "1.0.4",
-               "wikimedia/relpath": "1.0.3",
+               "wikimedia/relpath": "2.0.0",
                "wikimedia/remex-html": "1.0.1",
                "wikimedia/running-stat": "1.1.0",
                "wikimedia/scoped-callback": "1.0.0",
index 3ff3365..8912b82 100644 (file)
@@ -2764,9 +2764,10 @@ configuration variables to JavaScript. Things that depend on the current page
 or request state must be added through MakeGlobalVariablesScript instead.
 &$vars: array( variable name => value )
 
-'ResourceLoaderGetLessVars': Called in ResourceLoader::getLessVars after
-variables from $wgResourceLoaderLESSVars are added. Can be used to add
-context-based variables.
+'ResourceLoaderGetLessVars': DEPRECATED! Called in ResourceLoader::getLessVars
+to add global LESS variables. Loaded after $wgResourceLoaderLESSVars is added.
+Global LESS variables are deprecated. Use ResourceLoaderModule::getLessVars()
+instead to expose variables only in modules that need them.
 &$lessVars: array of variables already added
 
 'ResourceLoaderJqueryMsgModuleMagicWords': Called in
index f35715e..aa4320d 100644 (file)
@@ -1304,7 +1304,7 @@ $wgMimeInfoFile = 'includes/mime.info';
  * Sets an external MIME detector program. The command must print only
  * the MIME type to standard output.
  * The name of the file to process will be appended to the command given here.
- * If not set or NULL, PHP's fileinfo extension will be used if available.
+ * If not set or NULL, PHP's mime_content_type function will be used.
  *
  * @par Example:
  * @code
@@ -3754,20 +3754,18 @@ $wgResourceLoaderValidateStaticJS = false;
  * at the beginning of all your .less files, with all the consequences.
  * In particular, string values must be escaped and quoted.
  *
- * Changes to LESS variables do not trigger cache invalidation.
- *
- * If the LESS variables need to be dynamic, you can use the
- * ResourceLoaderGetLessVars hook (since 1.25).
+ * Changes to this configuration do NOT trigger cache invalidation.
  *
  * @par Example:
  * @code
  *   $wgResourceLoaderLESSVars = [
- *     'baseFontSize'  => '1em',
- *     'smallFontSize' => '0.75em',
- *     'WikimediaBlue' => '#006699',
+ *     'exampleFontSize'  => '1em',
+ *     'exampleBlue' => '#eee',
  *   ];
  * @endcode
  * @since 1.22
+ * @deprecated since 1.30 Use ResourceLoaderModule::getLessVars() instead to
+ *  add variables to individual modules that need them.
  */
 $wgResourceLoaderLESSVars = [
        /**
@@ -6771,11 +6769,6 @@ $wgRCWatchCategoryMembership = false;
  */
 $wgUseRCPatrol = true;
 
-/**
- * Whether to allow users to save their RecentChanges filters
- */
-$wgStructuredChangeFiltersEnableSaving = true;
-
 /**
  * Whether to show the new experimental views (like namespaces, tags, and users) in
  * RecentChanges filters
index 92cb8d8..70784ba 100644 (file)
@@ -3617,6 +3617,7 @@ function wfCanIPUseHTTPS( $ip ) {
  * @since 1.25
  */
 function wfIsInfinity( $str ) {
+       // These are hardcoded elsewhere in MediaWiki (e.g. mediawiki.special.block.js).
        $infinityValues = [ 'infinite', 'indefinite', 'infinity', 'never' ];
        return in_array( $str, $infinityValues );
 }
index 7efbef1..de6d681 100644 (file)
@@ -918,6 +918,9 @@ class Preferences {
                $defaultPreferences['rcfilters-saved-queries'] = [
                        'type' => 'api',
                ];
+               $defaultPreferences['rcfilters-rclimit'] = [
+                       'type' => 'api',
+               ];
 
                if ( $config->get( 'RCWatchCategoryMembership' ) ) {
                        $defaultPreferences['hidecategorization'] = [
index 391c06c..37b159e 100644 (file)
        "apihelp-move-param-watchlist": "현재 사용자의 주시목록에서 문서를 무조건적으로 추가하거나 제거하거나, 환경 설정을 사용하거나 주시를 변경하지 않습니다.",
        "apihelp-move-param-ignorewarnings": "모든 경고 무시하기",
        "apihelp-move-example-move": "<kbd>기존 제목</kbd>에서 <kbd>대상 제목</kbd>으로 넘겨주기를 만들지 않고 이동하기.",
-       "apihelp-opensearch-summary": "OpenSearch 프로토콜을 이용하여 위키 검색하기",
+       "apihelp-opensearch-summary": "OpenSearch 프로토콜을 이용하여 위키를 검색합니다.",
        "apihelp-opensearch-param-search": "문자열 검색",
        "apihelp-opensearch-param-limit": "반환할 결과의 최대 수",
        "apihelp-opensearch-param-namespace": "검색할 이름공간.",
index d4bee29..7f9af60 100644 (file)
@@ -1174,17 +1174,17 @@ class DifferenceEngine extends ContextSource {
 
                if ( !$diff && !$otitle ) {
                        $header .= "
-                       <tr style='vertical-align: top;' lang='{$userLang}'>
-                       <td class='diff-ntitle'>{$ntitle}</td>
+                       <tr style=\"vertical-align: top;\" lang=\"{$userLang}\">
+                       <td class=\"diff-ntitle\">{$ntitle}</td>
                        </tr>";
                        $multiColspan = 1;
                } else {
                        if ( $diff ) { // Safari/Chrome show broken output if cols not used
                                $header .= "
-                               <col class='diff-marker' />
-                               <col class='diff-content' />
-                               <col class='diff-marker' />
-                               <col class='diff-content' />";
+                               <col class=\"diff-marker\" />
+                               <col class=\"diff-content\" />
+                               <col class=\"diff-marker\" />
+                               <col class=\"diff-content\" />";
                                $colspan = 2;
                                $multiColspan = 4;
                        } else {
@@ -1193,20 +1193,20 @@ class DifferenceEngine extends ContextSource {
                        }
                        if ( $otitle || $ntitle ) {
                                $header .= "
-                               <tr style='vertical-align: top;' lang='{$userLang}'>
-                               <td colspan='$colspan' class='diff-otitle'>{$otitle}</td>
-                               <td colspan='$colspan' class='diff-ntitle'>{$ntitle}</td>
+                               <tr style=\"vertical-align: top;\" lang=\"{$userLang}\">
+                               <td colspan=\"$colspan\" class=\"diff-otitle\">{$otitle}</td>
+                               <td colspan=\"$colspan\" class=\"diff-ntitle\">{$ntitle}</td>
                                </tr>";
                        }
                }
 
                if ( $multi != '' ) {
-                       $header .= "<tr><td colspan='{$multiColspan}' style='text-align: center;' " .
-                               "class='diff-multi' lang='{$userLang}'>{$multi}</td></tr>";
+                       $header .= "<tr><td colspan=\"{$multiColspan}\" style=\"text-align: center;\" " .
+                               "class=\"diff-multi\" lang=\"{$userLang}\">{$multi}</td></tr>";
                }
                if ( $notice != '' ) {
-                       $header .= "<tr><td colspan='{$multiColspan}' style='text-align: center;' " .
-                               "lang='{$userLang}'>{$notice}</td></tr>";
+                       $header .= "<tr><td colspan=\"{$multiColspan}\" style=\"text-align: center;\" " .
+                               "lang=\"{$userLang}\">{$notice}</td></tr>";
                }
 
                return $header . $diff . "</table>";
index c2d26a3..f094745 100644 (file)
@@ -63,9 +63,7 @@ class HTMLUsersMultiselectField extends HTMLUserTextField {
                if ( isset( $this->mParams['placeholder'] ) ) {
                        $params['placeholder'] = $this->mParams['placeholder'];
                } else {
-                       $params['placeholder'] = $this->msg( 'mw-widgets-usersmultiselect-placeholder' )
-                                                       ->inContentLanguage()
-                                                       ->plain();
+                       $params['placeholder'] = $this->msg( 'mw-widgets-usersmultiselect-placeholder' )->plain();
                }
 
                if ( !is_null( $value ) ) {
index 1a9915d..b4de44d 100644 (file)
@@ -101,6 +101,9 @@ class MssqlUpdater extends DatabaseUpdater {
                        [ 'addField', 'externallinks', 'el_index_60', 'patch-externallinks-el_index_60.sql' ],
                        [ 'dropIndex', 'oldimage', 'oi_name_archive_name',
                                'patch-alter-table-oldimage.sql' ],
+
+                       // 1.30
+                       [ 'modifyField', 'image', 'img_media_type', 'patch-add-3d.sql' ],
                ];
        }
 
index adfe2f6..b4ae1dd 100644 (file)
@@ -301,6 +301,8 @@ class MysqlUpdater extends DatabaseUpdater {
                        [ 'dropIndex', 'user_groups', 'ug_user_group', 'patch-user_groups-primary-key.sql' ],
                        [ 'addField', 'user_groups', 'ug_expiry', 'patch-user_groups-ug_expiry.sql' ],
                        [ 'addIndex', 'image', 'img_user_timestamp', 'patch-image-user-index-2.sql' ],
+
+                       // 1.30
                        [ 'modifyField', 'image', 'img_media_type', 'patch-add-3d.sql' ],
                ];
        }
index 0172f1a..d8db6a2 100644 (file)
@@ -452,6 +452,9 @@ class PostgresUpdater extends DatabaseUpdater {
                        [ 'addPgIndex', 'externallinks', 'el_from_index_60', '( el_from, el_index_60, el_id )' ],
                        [ 'addPgField', 'user_groups', 'ug_expiry', "TIMESTAMPTZ NULL" ],
                        [ 'addPgIndex', 'user_groups', 'user_groups_expiry', '( ug_expiry )' ],
+
+                       // 1.30
+                       [ 'modifyField', 'image', 'img_media_type', 'patch-add-3d.sql' ],
                ];
        }
 
index 9c90283..46e3e7e 100644 (file)
@@ -165,6 +165,9 @@ class SqliteUpdater extends DatabaseUpdater {
                        [ 'addField', 'externallinks', 'el_index_60', 'patch-externallinks-el_index_60.sql' ],
                        [ 'addField', 'user_groups', 'ug_expiry', 'patch-user_groups-ug_expiry.sql' ],
                        [ 'addIndex', 'image', 'img_user_timestamp', 'patch-image-user-index-2.sql' ],
+
+                       // 1.30
+                       [ 'modifyField', 'image', 'img_media_type', 'patch-add-3d.sql' ],
                ];
        }
 
index 09f2537..11c13d7 100644 (file)
@@ -53,6 +53,9 @@
        "config-invalid-db-type": "Tipe de database invalide.",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
+       "config-mysql-binary": "Binarie",
+       "config-mysql-utf8": "UTF-8",
+       "config-ns-generic": "Proggette",
        "config-admin-email": "Indirizze e-mail:",
        "config-install-step-done": "fatte",
        "config-install-step-failed": "fallite",
index 9e060cd..cd80066 100644 (file)
@@ -188,17 +188,7 @@ class CSSMin {
                        return self::$mimeTypes[$ext];
                }
 
-               $realpath = realpath( $file );
-               if (
-                       $realpath
-                       && function_exists( 'finfo_file' )
-                       && function_exists( 'finfo_open' )
-                       && defined( 'FILEINFO_MIME_TYPE' )
-               ) {
-                       return finfo_file( finfo_open( FILEINFO_MIME_TYPE ), $realpath );
-               }
-
-               return false;
+               return mime_content_type( realpath( $file ) );
        }
 
        /**
@@ -394,6 +384,9 @@ class CSSMin {
                return false;
        }
 
+       /**
+        * @codeCoverageIgnore
+        */
        private static function getUrlRegex() {
                static $urlRegex;
                if ( $urlRegex === null ) {
index 9bfdbe8..77473d1 100644 (file)
@@ -1840,14 +1840,8 @@ abstract class FileBackendStore extends FileBackend {
                        return call_user_func_array( $this->mimeCallback, func_get_args() );
                }
 
-               $mime = null;
-               if ( $fsPath !== null && function_exists( 'finfo_file' ) ) {
-                       $finfo = finfo_open( FILEINFO_MIME_TYPE );
-                       $mime = finfo_file( $finfo, $fsPath );
-                       finfo_close( $finfo );
-               }
-
-               return is_string( $mime ) ? $mime : 'unknown/unknown';
+               $mime = ( $fsPath !== null ) ? mime_content_type( $fsPath ) : false;
+               return $mime ?: 'unknown/unknown';
        }
 }
 
index 631bb17..4d860bb 100644 (file)
@@ -988,18 +988,8 @@ EOT;
                $m = null;
                if ( $callback ) {
                        $m = $callback( $file );
-               } elseif ( function_exists( "finfo_open" ) && function_exists( "finfo_file" ) ) {
-                       $mime_magic_resource = finfo_open( FILEINFO_MIME );
-
-                       if ( $mime_magic_resource ) {
-                               $m = finfo_file( $mime_magic_resource, $file );
-                               finfo_close( $mime_magic_resource );
-                       } else {
-                               $this->logger->info( __METHOD__ .
-                                       ": finfo_open failed on " . FILEINFO_MIME . "!\n" );
-                       }
                } else {
-                       $this->logger->info( __METHOD__ . ": no magic mime detector found!\n" );
+                       $m = mime_content_type( $file );
                }
 
                if ( $m ) {
index a0bfb59..1ed18cd 100644 (file)
@@ -60,7 +60,7 @@ class BlockLogFormatter extends LogFormatter {
                        // is shown on the correct side of the tooltip text.
                        $durationTooltip = '&lrm;' . htmlspecialchars( $params[4] );
                        $params[4] = Message::rawParam(
-                               "<span class='blockExpiry' title='$durationTooltip'>" .
+                               "<span class=\"blockExpiry\" title=\"$durationTooltip\">" .
                                $this->context->getLanguage()->translateBlockExpiry(
                                        $params[4],
                                        $this->context->getUser(),
index 932797a..2931d9d 100644 (file)
@@ -343,7 +343,7 @@ class EmailNotification {
                $keys['$PAGETITLE'] = $this->title->getPrefixedText();
                $keys['$PAGETITLE_URL'] = $this->title->getCanonicalURL();
                $keys['$PAGEMINOREDIT'] = $this->minorEdit ?
-                       wfMessage( 'minoredit' )->inContentLanguage()->text() : '';
+                       wfMessage( 'enotif_minoredit' )->inContentLanguage()->text() : '';
                $keys['$UNWATCHURL'] = $this->title->getCanonicalURL( 'action=unwatch' );
 
                if ( $this->editor->isAnon() ) {
index 79b8e79..4675191 100644 (file)
@@ -580,6 +580,12 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                        'fileHashes' => $this->getFileHashes( $context ),
                        'messageBlob' => $this->getMessageBlob( $context ),
                ];
+
+               $lessVars = $this->getLessVars( $context );
+               if ( $lessVars ) {
+                       $summary[] = [ 'lessVars' => $lessVars ];
+               }
+
                return $summary;
        }
 
index 5878e1f..34fcc78 100644 (file)
  * @since 1.21
  */
 class SpecialPagesWithProp extends QueryPage {
+
+       /**
+        * @var string|null
+        */
        private $propName = null;
+
+       /**
+        * @var string[]|null
+        */
        private $existingPropNames = null;
 
+       /**
+        * @var bool
+        */
+       private $reverse = false;
+
+       /**
+        * @var bool
+        */
+       private $sortByValue = false;
+
        function __construct( $name = 'PagesWithProp' ) {
                parent::__construct( $name );
        }
@@ -46,6 +64,8 @@ class SpecialPagesWithProp extends QueryPage {
 
                $request = $this->getRequest();
                $propname = $request->getVal( 'propname', $par );
+               $this->reverse = $request->getBool( 'reverse' );
+               $this->sortByValue = $request->getBool( 'sortbyvalue' );
 
                $propnames = $this->getExistingPropNames();
 
@@ -58,6 +78,20 @@ class SpecialPagesWithProp extends QueryPage {
                                'label-message' => 'pageswithprop-prop',
                                'required' => true,
                        ],
+                       'reverse' => [
+                               'type' => 'check',
+                               'name' => 'reverse',
+                               'default' => $this->reverse,
+                               'label-message' => 'pageswithprop-reverse',
+                               'required' => false,
+                       ],
+                       'sortbyvalue' => [
+                               'type' => 'check',
+                               'name' => 'sortbyvalue',
+                               'default' => $this->sortByValue,
+                               'label-message' => 'pageswithprop-sortbyvalue',
+                               'required' => false,
+                       ]
                ], $this->getContext() );
                $form->setMethod( 'get' );
                $form->setSubmitCallback( [ $this, 'onSubmit' ] );
@@ -122,7 +156,18 @@ class SpecialPagesWithProp extends QueryPage {
        }
 
        function getOrderFields() {
-               return [ 'page_id' ];
+               $sort = [ 'page_id' ];
+               if ( $this->sortByValue ) {
+                       array_unshift( $sort, 'pp_sortkey' );
+               }
+               return $sort;
+       }
+
+       /**
+        * @return bool
+        */
+       public function sortDescending() {
+               return !$this->reverse;
        }
 
        /**
index 1248007..d5ff868 100644 (file)
@@ -181,10 +181,6 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                                $this->getConfig()->get( 'StructuredChangeFiltersEnableExperimentalViews' );
 
                        $out->addJsConfigVars( 'wgStructuredChangeFilters', $jsData['groups'] );
-                       $out->addJsConfigVars(
-                               'wgStructuredChangeFiltersEnableSaving',
-                               $this->getConfig()->get( 'StructuredChangeFiltersEnableSaving' )
-                       );
                        $out->addJsConfigVars(
                                'wgStructuredChangeFiltersEnableExperimentalViews',
                                $experimentalStructuredChangeFilters
@@ -373,6 +369,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
 
        public function validateOptions( FormOptions $opts ) {
                $opts->validateIntBounds( 'limit', 0, 5000 );
+               $opts->validateBounds( 'days', 0, $this->getConfig()->get( 'RCMaxAge' ) / ( 3600 * 24 ) );
                parent::validateOptions( $opts );
        }
 
@@ -387,7 +384,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                        $query_options, $join_conds, $opts );
 
                // Calculate cutoff
-               $cutoff_unixtime = time() - ( $opts['days'] * 86400 );
+               $cutoff_unixtime = time() - $opts['days'] * 3600 * 24;
                $cutoff = $dbr->timestamp( $cutoff_unixtime );
 
                $fromValid = preg_match( '/^[0-9]{14}$/', $opts['from'] );
@@ -717,17 +714,35 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
 
                $message = $this->msg( 'recentchangestext' )->inContentLanguage();
                if ( !$message->isDisabled() ) {
-                       $this->getOutput()->addWikiText(
-                               Html::rawElement( 'div',
-                                       [
-                                               'class' => 'mw-recentchanges-toplinks',
-                                               'lang' => $wgContLang->getHtmlCode(),
-                                               'dir' => $wgContLang->getDir()
-                                       ],
-                                       "\n" . $message->plain() . "\n"
-                               ),
-                               /* $lineStart */ true,
-                               /* $interface */ false
+                       $content = $message->parse();
+
+                       $langAttributes = [
+                               'lang' => $wgContLang->getHtmlCode(),
+                               'dir' => $wgContLang->getDir(),
+                       ];
+
+                       $topLinksAttributes = [ 'class' => 'mw-recentchanges-toplinks' ];
+
+                       if ( $this->getUser()->getOption( 'rcenhancedfilters' ) ) {
+                               $contentTitle = Html::rawElement( 'div',
+                                       [ 'class' => 'mw-recentchanges-toplinks-title' ],
+                                       $this->msg( 'rcfilters-other-review-tools' )->parse()
+                               );
+                               $contentWrapper = Html::rawElement( 'div',
+                                       array_merge( [ 'class' => 'mw-collapsible-content' ], $langAttributes ),
+                                       $content
+                               );
+                               $content = $contentTitle . $contentWrapper;
+                       } else {
+                               // Language direction should be on the top div only
+                               // if the title is not there. If it is there, it's
+                               // interface direction, and the language/dir attributes
+                               // should be on the content itself
+                               $topLinksAttributes = array_merge( $topLinksAttributes, $langAttributes );
+                       }
+
+                       $this->getOutput()->addHTML(
+                               Html::rawElement( 'div', $topLinksAttributes, $content )
                        );
                }
        }
index 65131ec..549362f 100644 (file)
@@ -34,6 +34,8 @@ use Wikimedia\Rdbms\IDatabase;
 class SpecialWatchlist extends ChangesListSpecialPage {
        public function __construct( $page = 'Watchlist', $restriction = 'viewmywatchlist' ) {
                parent::__construct( $page, $restriction );
+
+               $this->maxDays = $this->getConfig()->get( 'RCMaxAge' ) / ( 3600 * 24 );
        }
 
        public function doesWrites() {
@@ -173,6 +175,11 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                return $opts;
        }
 
+       public function validateOptions( FormOptions $opts ) {
+               $opts->validateBounds( 'days', 0, $this->maxDays );
+               parent::validateOptions( $opts );
+       }
+
        /**
         * Get all custom filters
         *
@@ -255,7 +262,7 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                // Calculate cutoff
                if ( $opts['days'] > 0 ) {
                        $conds[] = 'rc_timestamp > ' .
-                               $dbr->addQuotes( $dbr->timestamp( time() - intval( $opts['days'] * 86400 ) ) );
+                               $dbr->addQuotes( $dbr->timestamp( time() - $opts['days'] * 3600 * 24 ) );
                }
        }
 
@@ -499,7 +506,7 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                if ( $opts['days'] > 0 ) {
                        $days = $opts['days'];
                } else {
-                       $days = $this->getConfig()->get( 'RCMaxAge' ) / ( 3600 * 24 );
+                       $days = $this->maxDays;
                }
                $timestamp = wfTimestampNow();
                $wlInfo = $this->msg( 'wlnote' )->numParams( $numRows, round( $days * 24 ) )->params(
@@ -599,7 +606,7 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                        $days[] = $userWatchlistOption;
                }
 
-               $maxDays = (string)( $this->getConfig()->get( 'RCMaxAge' ) / ( 3600 * 24 ) );
+               $maxDays = (string)$this->maxDays;
                // add the maximum possible value, if it isn't available already
                if ( !in_array( $maxDays, $days ) ) {
                        $days[] = $maxDays;
index 10baadf..cdb9130 100644 (file)
@@ -280,12 +280,12 @@ class UsersPager extends AlphabeticPager {
                                'class' => 'HTMLUserTextField',
                                'label' => $this->msg( 'listusersfrom' )->text(),
                                'name' => 'username',
-                               'value' => $this->requestedUser,
+                               'default' => $this->requestedUser,
                        ],
                        'dropdown' => [
-                               'label' => $this->msg( 'group' ),
+                               'label' => $this->msg( 'group' )->text(),
                                'name' => 'group',
-                               'value' => $this->requestedGroup,
+                               'default' => $this->requestedGroup,
                                'class' => 'HTMLSelectField',
                                'options' => $groupOptions,
                        ],
@@ -294,26 +294,26 @@ class UsersPager extends AlphabeticPager {
                                'label' => $this->msg( 'listusers-editsonly' )->text(),
                                'name' => 'editsOnly',
                                'id' => 'editsOnly',
-                               'value' => $this->editsOnly
+                               'default' => $this->editsOnly
                        ],
                        'creationSort' => [
                                'type' => 'check',
                                'label' => $this->msg( 'listusers-creationsort' )->text(),
                                'name' => 'creationSort',
                                'id' => 'creationSort',
-                               'value' => $this->creationSort
+                               'default' => $this->creationSort
                        ],
                        'desc' => [
                                'type' => 'check',
                                'label' => $this->msg( 'listusers-desc' )->text(),
                                'name' => 'desc',
                                'id' => 'desc',
-                               'value' => $this->mDefaultDirection
+                               'default' => $this->mDefaultDirection
                        ],
                        'limithiddenfield' => [
                                'class' => 'HTMLHiddenField',
                                'name' => 'limit',
-                               'value' => $this->mLimit
+                               'default' => $this->mLimit
                        ]
                ];
 
@@ -347,6 +347,7 @@ class UsersPager extends AlphabeticPager {
                $htmlForm = HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() );
                $htmlForm
                        ->setMethod( 'get' )
+                       ->setAction( Title::newFromText( $self )->getLocalURL() )
                        ->setId( 'mw-listusers-form' )
                        ->setFormIdentifier( 'mw-listusers-form' )
                        ->suppressDefaultSubmit()
index 07094af..bf59fe9 100644 (file)
@@ -79,9 +79,9 @@ class BasicSearchResultSetWidget {
                                        continue;
                                }
                                $out .=
-                                       "<p class='mw-search-interwiki-header mw-search-visualclear'>" .
+                                       "<h2 class='mw-search-interwiki-header mw-search-visualclear'>" .
                                                $this->specialPage->msg( "search-interwiki-results-{$interwiki}" )->parse() .
-                                       "</p>";
+                                       "</h2>";
                                $out .= $this->renderResultSet( $results, $offset );
                        }
                }
index f7771d1..cbd4676 100644 (file)
@@ -16,6 +16,7 @@
                "resources/src/mediawiki.action",
                "resources/src/mediawiki.language",
                "resources/src/mediawiki.messagePoster",
+               "resources/src/mediawiki.rcfilters",
                "resources/src/mediawiki.special",
                "resources/src/mediawiki.toolbar",
                "resources/src/mediawiki.widgets",
index 74ee9e6..69e204c 100644 (file)
        "rcfilters-legend-heading": "<strong>قائمة الاختصارات:</strong>",
        "rcfilters-activefilters": "المرشحات النشطة",
        "rcfilters-advancedfilters": "مرشحات متقدمة",
+       "rcfilters-limit-title": "عدد التعديلات",
+       "rcfilters-limit-shownum": "اعرض آخر $1 تعديل",
+       "rcfilters-days-title": "عدد الأيام الأخيرة",
+       "rcfilters-hours-title": "عدد الساعات الأخيرة",
+       "rcfilters-days-show-days": "{{PLURAL:$1|يوما واحدا|يومان|$1 أيام|$1 يوما}}",
+       "rcfilters-days-show-hours": "{{PLURAL:$1|ساعة واحدة|ساعتان|$1 ساعات|$1 ساعة}}",
        "rcfilters-quickfilters": "المرشحات المحفوظة",
        "rcfilters-quickfilters-placeholder-title": "لا وصلات تم حفظها بعد",
        "rcfilters-savedqueries-defaultlabel": "مرشحات محفوظة",
        "fileduplicatesearch-noresults": "لا ملف بالاسم \"$1\" تم العثور عليه.",
        "specialpages": "الصفحات الخاصة",
        "specialpages-note-top": "المفتاح",
-       "specialpages-note": "* صفحات خاصة عادية.\n* <span class=\"mw-specialpagerestricted\">صفحات خاصة للمخولين.</span>",
        "specialpages-group-maintenance": "تقارير الصيانة",
        "specialpages-group-other": "صفحات خاصة أخرى",
        "specialpages-group-login": "دخول / إنشاء حساب",
index a1c9b53..bb82b6e 100644 (file)
        "anontalk": "বাৰ্তা দিয়ক",
        "navigation": "দিকদৰ্শন",
        "and": "&#32;আৰু",
-       "qbfind": "বিচৰা হওক",
-       "qbbrowse": "ব্ৰাওজ",
-       "qbedit": "সম্পাদনা",
-       "qbpageoptions": "এই পৃষ্ঠা",
-       "qbmyoptions": "মোৰ পৃষ্ঠাসমূহ",
        "faq": "সততে উদিত প্ৰশ্নসমূহ (FAQ)",
-       "faqpage": "Project:সততে উদিত প্ৰশ্নসমূহ",
        "actions": "কাৰ্যসমূহ",
        "namespaces": "নামস্থান",
        "variants": "বিকল্পসমূহ",
        "edit-local": "স্থানীয় বিৱৰণ সম্পাদনা কৰক",
        "create": "সৃষ্টি কৰক",
        "create-local": "স্থানীয় বিৱৰণ যোগ কৰক",
-       "editthispage": "এই পৃষ্ঠা সম্পাদনা কৰক",
-       "create-this-page": "এই পৃষ্ঠা সৃষ্টি কৰক",
        "delete": "বিলোপ কৰক",
-       "deletethispage": "এই পৃষ্ঠাটো বিলোপ কৰক",
-       "undeletethispage": "এই পৃষ্ঠাটো পুনৰুদ্ধাৰ কৰক",
        "undelete_short": "{{PLURAL:$1|বিলোপিত পৃষ্ঠাৰ|$1 সংখ্যক বিলোপিত পৃষ্ঠাৰ}} পূৰ্ববৎকৰণ",
        "viewdeleted_short": "{{PLURAL:$1| এটা বিলুপ্ত সম্পাদনা|$1 টা বিলুপ্ত সম্পাদনা}} দেখুৱাওক",
        "protect": "সুৰক্ষিত কৰক",
        "protect_change": "সলাওক",
-       "protectthispage": "বৰ্তমান পৃষ্ঠাৰ সংৰক্ষণবিধিৰ পৰিবৰ্তন",
        "unprotect": "সুৰক্ষা সলনি কৰক",
-       "unprotectthispage": "এই পৃষ্ঠাৰ সুৰক্ষা সলনি কৰক",
        "newpage": "নতুন পৃষ্ঠা",
-       "talkpage": "এই পৃষ্ঠা সম্পৰ্কীয় আলোচনা",
        "talkpagelinktext": "কথা-বতৰা",
        "specialpage": "বিশেষ পৃষ্ঠা",
        "personaltools": "ব্যক্তিগত সৰঞ্জাম",
-       "articlepage": "সমল পৃষ্ঠা চাওক",
        "talk": "আলোচনা",
        "views": "দৰ্শন",
        "toolbox": "সঁজুলিসমূহ",
        "tool-link-userrights": "{{GENDER:$1|সদস্য}} গোটসমূহ সলাওক",
        "tool-link-userrights-readonly": "{{GENDER:$1|সদস্য}} গোটসমূহ চাওক",
        "tool-link-emailuser": "এই {{GENDER:$1|সদস্যজনক}} ইমেইল কৰক",
-       "userpage": "সদস্য পৃষ্ঠা চাওক",
-       "projectpage": "প্ৰকল্প পৃষ্ঠা চাওক",
        "imagepage": "নথি পৃষ্ঠা চাওক",
        "mediawikipage": "বাৰ্তা পৃষ্ঠা চাওক",
        "templatepage": "সাঁচ পৃষ্ঠা চাওক",
        "badaccess-groups": "আপুনি অনুৰোধ কৰা কাৰ্য কেৱল {{PLURAL:$2|এই গোটৰ|এই গোটসমূহৰ যিকোনো এটাৰ}} সদস্যৰ বাবে সীমিত: $1",
        "versionrequired": "মিডিয়াৱিকিৰ $1 সংকলন থাকিব লাগিব ।",
        "versionrequiredtext": "এই পৃষ্ঠাটো ব্যৱহাৰ কৰিবলৈ মিডিয়াৱিকিৰ $1 সংস্কৰণ থাকিব লাগিব । [[Special:Version|সংস্কৰণ পৃষ্ঠা]] চাওক।",
-       "ok": "শà§\81দà§\8dধ",
+       "ok": "বাৰà§\81",
        "retrievedfrom": "\"$1\"ৰ পৰা সংকলিত",
        "youhavenewmessages": "আপোনাৰ কাৰণে $1 আছে। ($2)",
        "youhavenewmessagesfromusers": "{{PLURAL:$3|আন এজন সদস্য|$3 জন সদস্য}}ৰ পৰা আপোনালৈ $1 আহিছে ($2)।",
        "confirmrecreate": "আপুনি সম্পাদনা আৰম্ভ কৰাৰ পিছত সদস্য [[User:$1|$1]] ([[User talk:$1|আলোচনা]])য়ে পৃষ্ঠাটো বিলোপ কৰিছে, তাৰ কাৰণ:\n: ''$2''\nআপুনি এই পৃষ্ঠাটো আকৌ সৃষ্টি কৰিব খোজাটো নিশ্চিত কৰক ।",
        "confirmrecreate-noreason": "আপুনি সম্পাদনা আৰম্ভ কৰাৰ পিছত সদস্য [[User:$1|$1]] ([[User talk:$1|আলোচনা]])য়ে পৃষ্ঠাটো বিলোপ কৰিছে। আপুনি এই পৃষ্ঠাটো আকৌ সৃষ্টি কৰিব খোজা কাৰ্য অনুগ্ৰহ কৰি নিশ্চিত কৰক।",
        "recreate": "পুনৰ সৃষ্টি কৰক",
-       "confirm_purge_button": "শà§\81দà§\8dধ",
+       "confirm_purge_button": "বাৰà§\81",
        "confirm-purge-top": "এই পৃষ্ঠাৰ কেচ্‌ খালী কৰা হওক ?",
        "confirm-purge-bottom": "এটা পৃষ্ঠাক শোধিত কৰিলে কেচ্‌ আতৰি যায় আৰু সকলোতকৈ শেহতীয়া সংশোধন প্ৰদৰ্শিত হ'বলৈ বাধ্য কৰে।",
-       "confirm-watch-button": "শà§\81দà§\8dধ",
+       "confirm-watch-button": "বাৰà§\81",
        "confirm-watch-top": "এই পৃষ্ঠাটো আপোনাৰ লক্ষ্য-তালিকাত যোগ কৰিব?",
-       "confirm-unwatch-button": "শà§\81দà§\8dধ",
+       "confirm-unwatch-button": "বাৰà§\81",
        "confirm-unwatch-top": "এই পৃষ্ঠাটো আপোনাৰ লক্ষ্য-তালিকাৰ পৰা আঁতৰাব?",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← পূৰ্বৱৰ্তী পৃষ্ঠা",
        "fileduplicatesearch-noresults": "কোনো \"$1\" নামৰ নথিৰ সন্ধান পোৱা নগ’ল ।",
        "specialpages": "বিশেষ পৃষ্ঠাসমূহ",
        "specialpages-note-top": "ব্যাখ্যা",
-       "specialpages-note": "* সাধাৰণ বিশেষ পৃষ্ঠাসমূহ।\n* <span class=\"mw-specialpagerestricted\">সীমাবদ্ধ বিশেষ পৃষ্ঠাসমূহ।</span>",
        "specialpages-group-maintenance": "তত্বাৱধানৰ কাৰ্যবিৱৰণীসমূহ",
        "specialpages-group-other": "অন্যান্য বিশেষ পৃষ্ঠাসমূহ",
        "specialpages-group-login": "প্ৰৱেশ/একাউণ্ট সৃষ্টি কৰক",
        "expandtemplates": "সাঁচবোৰ বহলাওক",
        "expand_templates_input": "পাঠ্য ভৰাওক",
        "expand_templates_output": "ফলাফল",
-       "expand_templates_ok": "ঠিà¦\95 à¦\86à¦\9bà§\87",
+       "expand_templates_ok": "বাৰà§\81",
        "expand_templates_remove_comments": "মন্তব্য গু়চাওক",
        "expand_templates_preview": "খচৰা",
        "pagelanguage": "পৃষ্ঠাৰ ভাষা নিৰ্বাচক",
index 246ddaa..9b11402 100644 (file)
        "thu": "Кс",
        "fri": "Йм",
        "sat": "Шб",
-       "january": "Ғинуар (Һыуығай)",
-       "february": "Февраль (Шаҡай)",
-       "march": "Март (Буранай)",
-       "april": "Апрель (Алағарай)",
-       "may_long": "Май (Һабанай)",
-       "june": "Июнь (Һөтай)",
-       "july": "Июль (Майай)",
-       "august": "Август (Урағай)",
-       "september": "Сентябрь (Һарысай)",
-       "october": "Октябрь (Ҡарасай)",
-       "november": "Ноябрь (Ҡырпағай)",
-       "december": "Декабрь (Аҡъюлай)",
-       "january-gen": "Ò\92инÑ\83аÑ\80 (ÒºÑ\8bÑ\83Ñ\8bÒ\93ай)",
-       "february-gen": "Февраль (Шаҡай)",
-       "march-gen": "Ð\9cаÑ\80Ñ\82 (Ð\91Ñ\83Ñ\80анай)",
-       "april-gen": "Ð\90пÑ\80елÑ\8c (Ð\90лаÒ\93аÑ\80ай)",
-       "may-gen": "Ð\9cай (Һабанай)",
-       "june-gen": "Ð\98Ñ\8eнÑ\8c (ÒºÓ©Ñ\82ай)",
-       "july-gen": "Ð\98Ñ\8eлÑ\8c (Ð\9cайай)",
-       "august-gen": "Ð\90вгÑ\83Ñ\81Ñ\82 (УÑ\80аÒ\93ай)",
-       "september-gen": "Сентябрь (Һарысай)",
-       "october-gen": "Ð\9eкÑ\82Ñ\8fбÑ\80Ñ\8c (ҠаÑ\80аÑ\81ай)",
-       "november-gen": "Ð\9dоÑ\8fбÑ\80Ñ\8c (Ò Ñ\8bÑ\80паÒ\93ай)",
-       "december-gen": "Ð\94екабÑ\80Ñ\8c (Ð\90Ò¡Ñ\8aÑ\8eлай)",
-       "jan": "Ò\92ин",
-       "feb": "Фев",
-       "mar": "Ð\9cар",
-       "apr": "Ð\90пр",
-       "may": "Ð\9cай",
-       "jun": "Ð\98юн",
-       "jul": "Ð\98юл",
-       "aug": "Ð\90вг",
-       "sep": "Сен",
-       "oct": "Ð\9eкт",
-       "nov": "Ð\9dоя",
-       "dec": "Ð\94ек",
+       "january": "Ғинуар",
+       "february": "Февраль",
+       "march": "Март",
+       "april": "Апрель",
+       "may_long": "Май",
+       "june": "Июнь",
+       "july": "Июль",
+       "august": "Август",
+       "september": "Сентябрь",
+       "october": "Октябрь",
+       "november": "Ноябрь",
+       "december": "Декабрь",
+       "january-gen": "Ò\93инÑ\83аÑ\80",
+       "february-gen": "февраль",
+       "march-gen": "маÑ\80Ñ\82",
+       "april-gen": "апÑ\80елÑ\8c",
+       "may-gen": "май",
+       "june-gen": "иÑ\8eнÑ\8c",
+       "july-gen": "иÑ\8eлÑ\8c",
+       "august-gen": "авгÑ\83Ñ\81Ñ\82",
+       "september-gen": "сентябрь",
+       "october-gen": "окÑ\82Ñ\8fбÑ\80Ñ\8c",
+       "november-gen": "ноÑ\8fбÑ\80Ñ\8c",
+       "december-gen": "декабÑ\80Ñ\8c",
+       "jan": "Ò\93ин",
+       "feb": "фев",
+       "mar": "мар",
+       "apr": "апр",
+       "may": "май",
+       "jun": "июн",
+       "jul": "июл",
+       "aug": "авг",
+       "sep": "сен",
+       "oct": "окт",
+       "nov": "ноя",
+       "dec": "дек",
        "january-date": "Ғинуар $1",
        "february-date": "Февраль $1",
        "march-date": "Март $1",
        "disclaimerpage": "Project:Яуаплылыҡтан баш тартыу",
        "edithelp": "Төҙәтеү белешмәһе",
        "helppage-top-gethelp": "Ярҙам",
-       "mainpage": "Ð\91аÑ\88 Ð\91ит",
+       "mainpage": "Ð\91аÑ\88 Ð±ит",
        "mainpage-description": "Баш бит",
        "policy-url": "Project:Ҡағиҙәләр",
        "portal": "Берләшмә",
index 7ecb3bf..b0d43be 100644 (file)
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (глядзіце таксама [[Special:NewPages|сьпіс новых старонак]])",
        "recentchanges-submit": "Паказаць",
        "rcfilters-legend-heading": "<strong>Сьпіс абрэвіятураў:</strong>",
+       "rcfilters-other-review-tools": "<strong>Іншыя інструмэнты праверкі:</strong>",
        "rcfilters-activefilters": "Актыўныя фільтры",
        "rcfilters-advancedfilters": "Пашыраныя фільтры",
        "rcfilters-limit-title": "Паказаць зьменаў",
        "rcfilters-savedqueries-new-name-label": "Назва",
        "rcfilters-savedqueries-new-name-placeholder": "Апішыце прызначэньне фільтру",
        "rcfilters-savedqueries-apply-label": "Стварыць фільтар",
+       "rcfilters-savedqueries-apply-and-setdefault-label": "Стварыць фільтар па змоўчаньні",
        "rcfilters-savedqueries-cancel-label": "Адмяніць",
        "rcfilters-savedqueries-add-new-title": "Захаваць цяперашнія налады фільтру",
        "rcfilters-restore-default-filters": "Аднавіць фільтры па змоўчаньні",
        "rcfilters-hideminor-conflicts-typeofchange": "Некаторыя тыпы зьменаў ня могуць быць вызначаныя як «дробныя», таму гэты фільтар канфліктуе з наступнымі фільтрамі «Тыпаў зьменаў»: $1",
        "rcfilters-typeofchange-conflicts-hideminor": "Гэты фільтар тыпаў зьменаў канфліктуе зь фільтрам «Дробныя праўкі». Некаторыя тыпы зьменаў ня могуць быць вызначаныя як «дробныя».",
        "rcfilters-filtergroup-lastRevision": "Цяперашнія вэрсіі",
-       "rcfilters-filter-lastrevision-label": "Ð\90пошняя вэрсія",
-       "rcfilters-filter-lastrevision-description": "Ð\90пошняя зьмена на старонцы.",
-       "rcfilters-filter-previousrevision-label": "РанейÑ\88Ñ\8bÑ\8f Ð²Ñ\8dÑ\80Ñ\81Ñ\96Ñ\96",
-       "rcfilters-filter-previousrevision-description": "Усе зьмены, якія не зьяўляюцца самымі апошнімі на старонцы.",
+       "rcfilters-filter-lastrevision-label": "ЦÑ\8fпеÑ\80ашняя вэрсія",
+       "rcfilters-filter-lastrevision-description": "ТолÑ\8cкÑ\96 Ñ\81амаÑ\8f Ð°пошняя зьмена на старонцы.",
+       "rcfilters-filter-previousrevision-label": "Ð\9dÑ\8f Ñ\81амаÑ\8f Ð°Ð¿Ð¾Ñ\88нÑ\8fÑ\8f Ð²Ñ\8dÑ\80Ñ\81Ñ\96Ñ\8f",
+       "rcfilters-filter-previousrevision-description": "Усе зьмены, якія не зьяўляюцца самай апошняй вэрсіяй.",
        "rcfilters-filter-excluded": "Выключаны",
        "rcfilters-tag-prefix-namespace-inverted": "<strong>:не</strong> $1",
        "rcfilters-view-tags": "Праўкі зь меткамі",
index a919e62..f7ccc4d 100644 (file)
        "autosumm-replace": "Заместване на съдържанието на страницата с „$1“",
        "autoredircomment": "Пренасочване към [[$1]]",
        "autosumm-new": "Нова страница: „$1“",
+       "autosumm-newblank": "Създаване на празна страница",
        "lag-warn-normal": "Промените от {{PLURAL:$1|последната $1 секунда|последните $1 секунди}} вероятно не са показани в списъка.",
        "lag-warn-high": "Поради голямото изоставане в сървърната синхронизация, промените от {{PLURAL:$1|последната $1 секунда|последните $1 секунди}} вероятно не са показани в списъка.",
        "watchlistedit-normal-title": "Редактиране на списъка за наблюдение",
index 6015fa9..4e8e792 100644 (file)
        "sitejspreview": "'''মনে রাখুন আপনি আপনার ব্যবহারকারী জাভাস্ক্রিপ্ট কেবলমাত্র প্রাকদর্শন করছেন।'''\n'''এটা এখনও সংরক্ষণ করা হয়নি!'''",
        "userinvalidcssjstitle": "'''সতর্কীকরণ:''' \"$1\" নামে কোন আবরণ নেই। মনে রাখবেন, পছন্দমাফিক .css এবং .js পাতাগুলি ছোট হাতের শিরোনাম ব্যবহার করে, যেমন {{ns:user}}:Foo/vector.css; কিন্তু এরকম শিরোনাম নয়: {{ns:user}}:Foo/Vector.css",
        "updated": "(হালনাগাদ)",
-       "note": "'''নোট:'''",
+       "note": "<strong>টীকা:</strong>",
        "previewnote": "'''খেয়াল করুন, এটি একটি প্রাকদর্শন মাত্র।'''\nআপনার পরিবর্তন এখনও সংরক্ষণ করা হয়নি!",
        "continue-editing": "সম্পাদনা করুন",
        "previewconflict": "এই প্রাকদর্শনটি সম্পাদনা ক্ষেত্রের উপরের অংশটির টেক্সট সংরক্ষণ করলে যেরকম দেখাবে, তা দেখাচ্ছে।",
        "longpageerror": "'''ত্রুটি:  আপনার জমা দেয়া টেক্সটের পরিমাণ {{PLURAL:$1|এক কিলোবাইট|$1 কিলোবাইট}}, যা সর্বোচ্চ সীমা {{PLURAL:$2|এক কিলোবাইটের|$2 কিলোবাইটের}} চেয়ে বেশি।'''\nএটি সংরক্ষণ করা সম্ভব নয়।",
        "readonlywarning": "<strong>সতর্কবার্তা: রক্ষণাবেক্ষণের জন্য ডাটাবেজ অবরুদ্ধ রাখা হয়েছে, তাই এই মুহূর্তে আপনি আপনার সম্পাদনা সংরক্ষণ করতে পারবেন না।</strong>\nআপনি চাইলে লেখাটি প্রতিলিপি করে কোন টেক্সট ফাইলে সেঁটে ভবিষ্যতের জন্য সংরক্ষণ করতে পারেন।\n\nযে সিস্টেম প্রশাসক ডাটাবেজটি  অবরুদ্ধ করেছেন তিনি এই ব্যাখ্যা দিয়েছেন: $1",
        "protectedpagewarning": "'''সতর্কীকরণ: এই পাতাটি বন্ধ করা হয়েছে; কেবলমাত্র প্রশাসক মর্যাদার ব্যবহারকারীরাই এটি সম্পাদনা করতে পারবেন।'''\nআপনার সুবিধার্থে পাতাটির সাম্প্রতিক সংরক্ষণ লগের বিবরণ নিচে দেওয়া হলো।",
-       "semiprotectedpagewarning": "'''নোট:''' এই পাতাটির ব্যবহার নিয়ন্ত্রণ করা হয়েছে তাই নিবন্ধনকৃত ব্যবহারকারী এটি সম্পাদনা করতে পারবেন।\nআপনার সুবিধার্থে পাতাটির সাম্প্রতিক সংরক্ষণ লগের বিবরণ নিচে দেওয়া হলো।",
+       "semiprotectedpagewarning": "<strong>টীকা:</strong> এই পাতাটির ব্যবহার নিয়ন্ত্রণ করা হয়েছে তাই নিবন্ধনকৃত ব্যবহারকারী এটি সম্পাদনা করতে পারবেন।\nআপনার সুবিধার্থে পাতাটির সাম্প্রতিক লগের বিবরণ নিচে দেওয়া হলো:",
        "cascadeprotectedwarning": "<strong>সতর্কীকরণ:</strong> এই পাতাটি সুরক্ষিত, ফলে এটি শুধুমাত্র [[Special:ListGroupRights|নির্দিষ্ট অধিকারপ্রাপ্ত]] ব্যবহারকারীগণ সম্পাদনা করতে পারেন, কারণ এটি নিচের প্রপাতাকার-সুরক্ষিত {{PLURAL:$1|পাতায়|পাতাসমূহে}} অন্তর্ভুক্ত আছে:",
        "titleprotectedwarning": "'''সতর্কীকরণ: এই পাতাটির ব্যবহার সীমিত করা হয়েছে, যাতে কেবলমাত্র [[Special:ListGroupRights|এই নির্দিষ্ট অনুমতিপ্রাপ্ত]] ব্যবহারকারী এটি তৈরি করতে পারেন।'''\nআপনার সুবিধার্থে পাতাটির সাম্প্রতিক সংরক্ষণ লগের বিবরণ নিচে দেওয়া হলো।",
        "templatesused": "এই পাতায় ব্যবহৃত {{PLURAL:$1|টেমপ্লেট|টেমপ্লেটসমূহ}}:",
        "enotif_lastdiff": "এই পরিবর্তনটি দেখার জন্য, $1 দেখুন",
        "enotif_anon_editor": "বেনামী ব্যবহারকারী $1",
        "enotif_body": "প্রিয় $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nসম্পাদকের সারাংশ: $PAGESUMMARY $PAGEMINOREDIT\n\nসম্পাদকের সাথে যোগাযোগের উপায়:\nইমেইল: $PAGEEDITOR_EMAIL\nউইকি: $PAGEEDITOR_WIKI\n\nপাতাটির পরবর্তী পরিবর্তনগুলো জন্য আর কোন বিজ্ঞপ্তি পাঠানো হবে না, যতক্ষণ না আপনি প্রবেশ করার সময় এই পাতায় ব্রাউজ করবেন। এছাড়া আপনি আপনার নজরতালিকায় রাখা সবগুলি পাতা জন্য বিজ্ঞপ্তি ফ্ল্যাগ শুরুর অবস্থায় ফিরিয়ে নিতে পারেন।\n\nআপনার বন্ধুত্বপূর্ণ {{SITENAME}} বিজ্ঞপ্তি ব্যবস্থা\n\n--\nইমেইল বিজ্ঞপ্তি সেটিং পরিবর্তনের জন্য দেখুন\n{{canonicalurl:{{#special:Preferences}}}}\n\nআপনার নজরতালিকা সেটিংস পরিবর্তন করতে চাইলে দেখুন, \n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nনজরতালিকা থেকে কোন পাতা অপসারণ করতে চাইলে এখানে যান:\n$UNWATCHURL\n\nপ্রতিক্রিয়া জানাতে ও আরও সহযোগিতার জন্য:\n$HELPPAGE",
+       "enotif_minoredit": "এটি একটি অনুল্লেখিত সম্পাদনা",
        "created": "তৈরী হয়েছিল",
        "changed": "পরিবর্তিত",
        "deletepage": "পাতা মুছুন",
        "noautoblockblock": "স্বয়ংক্রিয় বাধাদান নিষ্ক্রিয় করা হয়েছে",
        "createaccountblock": "অ্যাকাউন্ট সৃষ্টিতে বাধা দেওয়া হয়েছে",
        "emailblock": "ই-মেইল বাধা দেয়া হয়েছে",
-       "blocklist-nousertalk": "নিà¦\9cà§\87র à¦\86লাপà§\87র à¦ªà¦¾à¦¤à¦¾ à¦¸à¦®à§\8dপাদনা à¦\95রতà§\87 à¦ªà¦¾à¦°ে না",
+       "blocklist-nousertalk": "নিà¦\9cসà§\8dব à¦\86লাপ à¦ªà¦¾à¦¤à¦¾ à¦¸à¦®à§\8dপাদনা à¦\95রতà§\87 à¦ªà¦¾à¦°à¦¬ে না",
        "ipblocklist-empty": "বাধাতালিকা খালি।",
        "ipblocklist-no-results": "অনুরুদ্ধ আইপি ঠিকানা বা ব্যবহারকারী নামটির উপর কোন বাধা নেই।",
        "blocklink": "বাধা দাও",
index 7c89fbd..b6ec398 100644 (file)
        "title-invalid-too-long": "Zatraženi naziv stranice je predugačak. Ne smije biti duži od {{PLURAL:$1|bajta|bajtova}} u UTF-8 kodiranju.",
        "title-invalid-leading-colon": "Zahtjevani naslov stranice sadrži nevažeću dvotačku na početku.",
        "perfcached": "Sljedeći podaci su keširani i možda neće biti u potpunosti ažurirani. Keš sadrži najviše {{PLURAL:$1|jedan rezultat|$1 rezultata}}.",
-       "perfcachedts": "Sljedeći podaci nalaze se u memoriji i posljednji put ažurirani su $1. Keš sadrži najviše {{PLURAL:$4|jedan rezultat|$4 rezultata}}.",
+       "perfcachedts": "Sljedeći podaci su keširani i posljednji put ažurirani na datum $2 u $3. Keš sadrži najviše {{PLURAL:$4|jedan rezultat|$4 rezultata}}.",
        "querypage-no-updates": "Ažuriranje ove stranice je isključeno.\nPodaci koji se ovdje nalaze ne moraju biti aktuelni.",
        "viewsource": "Prikaži izvor",
        "viewsource-title": "Prikaz izvora stranice $1",
        "searchall": "sve",
        "showingresults": "Dolje {{PLURAL:$1|je prikazan <strong>1</strong> rezultat|su prikazana <strong>$1</strong> rezultata|je prikazano '''$1''' rezultata}} počev od #<strong>$2</strong>.",
        "showingresultsinrange": "Ispod {{PLURAL:$1|je prikazan <strong>1</strong> rezultat|su prikazana <strong>$1</strong> rezultata|je prikazano <strong>$1</strong> rezultata}}, u rasponu od <strong>$2</strong> do <strong>$3</strong>.",
-       "search-showingresults": "{{PLURAL:$4|Rezultat <strong>$1</strong> od <strong>$3</strong>|Rezultati <strong>$1 - $2</strong> od <strong>$3</strong>}}",
+       "search-showingresults": "{{PLURAL:$4|Rezultat <strong>$1</strong> od <strong>$3</strong>|Rezultati <strong>$1$2</strong> od <strong>$3</strong>}}",
        "search-nonefound": "Nisu pronađeni rezultati koji odgovaraju upitu.",
        "search-nonefound-thiswiki": "Nisu pronađeni rezultati koji odgovaraju upitu na ovom sajtu.",
        "powersearch-legend": "Napredna pretraga",
        "recentchanges": "Nedavne izmjene",
        "recentchanges-legend": "Postavke nedavnih izmjena",
        "recentchanges-summary": "Na ovoj stranici možete pratiti nedavne izmjene.",
-       "recentchanges-noresult": "Nema izmjena u zadanom vremenu za zadane kriterije.",
+       "recentchanges-noresult": "Nema izmjena u izabranom periodu koji odgovaraju kriterijima.",
        "recentchanges-feed-description": "Na ovoj stranici možete pratiti nedavne izmjene.",
        "recentchanges-label-newpage": "Nova stranica",
        "recentchanges-label-minor": "Manja izmjena",
        "recentchanges-legend-heading": "<strong>Legenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|spisak novih stranica]])",
        "recentchanges-submit": "Prikaži",
+       "rcfilters-legend-heading": "<strong>Spisak skraćenica:</strong>",
        "rcfilters-activefilters": "Aktivni filteri",
        "rcfilters-advancedfilters": "Napredni filteri",
+       "rcfilters-limit-title": "Izmjena za prikaz",
+       "rcfilters-limit-shownum": "Prikaži posljednjih $1 izmjena",
+       "rcfilters-days-title": "Nedavni dani",
+       "rcfilters-hours-title": "Nedavni sati",
+       "rcfilters-days-show-days": "$1 {{PLURAL:$1|dan|dana}}",
+       "rcfilters-days-show-hours": "$1 {{PLURAL:$1|sat|sata|sati}}",
        "rcfilters-quickfilters": "Sačuvani filteri",
        "rcfilters-quickfilters-placeholder-title": "Zasad nema sačuvanih linkova",
        "rcfilters-quickfilters-placeholder-description": "Da sačuvate postavke filtera da biste ih kasnije ponovo upotrijebili, kliknite na ikonu markera pod \"Aktivni filterima\" ispod.",
        "rcfilters-filter-previousrevision-description": "Sve izmjene koje nisu najnovije na stranici.",
        "rcfilters-filter-excluded": "Izuzeto",
        "rcfilters-tag-prefix-namespace-inverted": "<strong>:ne</strong> $1",
+       "rcfilters-exclude-button-off": "Izuzmi izabrano",
+       "rcfilters-exclude-button-on": "Izuzimam izabrano",
        "rcfilters-view-tags": "Označene izmjene",
+       "rcfilters-view-namespaces-tooltip": "Filtriraj rezultate po imenskom prostoru",
+       "rcfilters-view-tags-tooltip": "Filtriraj rezultate po oznakama",
+       "rcfilters-liveupdates-button": "Ažuriraj uživo",
        "rcnotefrom": "Ispod {{PLURAL:$5|je izmjena|su izmjene}} od <strong>$3, $4</strong> (do <strong>$1</strong> prikazano).",
        "rclistfromreset": "Resetiraj izbor datuma",
        "rclistfrom": "Prikaži nove izmjene počev od $3 u $2",
        "mw-widgets-titleinput-description-new-page": "stranica još ne postoji",
        "mw-widgets-titleinput-description-redirect": "preusmjerava na $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Dodaj kategoriju...",
-       "mw-widgets-usersmultiselect-placeholder": "Dodaj više...",
+       "mw-widgets-usersmultiselect-placeholder": "Dodaj još...",
        "date-range-from": "Od datuma:",
        "date-range-to": "Do datuma:",
        "sessionmanager-tie": "Ne možete istovremeno koristiti nekoliko vrsta provjera autentičnosti: $1.",
index 2c6e63f..e6c038a 100644 (file)
        "special-characters-group-gujarati": "گوجەراتی",
        "special-characters-group-thai": "تایلەندی",
        "special-characters-group-khmer": "خمێری",
+       "log-action-filter-block": "جۆری بلۆک:",
        "log-action-filter-all": "ھەموو",
        "log-action-filter-upload-upload": "بارکردنی نوێ",
        "authmanager-email-label": "ئیمەیڵ"
index bc4e002..c564c3b 100644 (file)
        "rcfilters-legend-heading": "<strong>Seznam zkratek:</strong>",
        "rcfilters-activefilters": "Aktivní filtry",
        "rcfilters-advancedfilters": "Pokročilé filtry",
+       "rcfilters-limit-title": "Zobrazit změny",
        "rcfilters-limit-shownum": "Zobrazit posledních $1 změn",
        "rcfilters-days-title": "Poslední dny",
        "rcfilters-hours-title": "Poslední hodiny",
        "rcfilters-filtergroup-lastRevision": "Aktuální verze",
        "rcfilters-filter-lastrevision-label": "Aktuální verze",
        "rcfilters-filter-lastrevision-description": "Jen 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.",
+       "rcfilters-filter-previousrevision-label": "Ne nejnovější revize",
+       "rcfilters-filter-previousrevision-description": "Všechny změny, které nejsou „nejnovější revizí“.",
+       "rcfilters-filter-excluded": "Vynechaný",
+       "rcfilters-tag-prefix-namespace-inverted": "<strong>:ne</strong> $1",
+       "rcfilters-exclude-button-off": "Vynechat vybrané",
+       "rcfilters-exclude-button-on": "Vybrané vynechány",
        "rcfilters-view-tags": "Označené editace",
+       "rcfilters-view-namespaces-tooltip": "Filtrovat výsledky podle jmenného prostoru",
+       "rcfilters-view-tags-tooltip": "Filtrovat výsledky pomocí značek editací",
+       "rcfilters-view-return-to-default-tooltip": "Vrátit se do hlavního filtrovacího menu",
        "rcfilters-liveupdates-button": "Živé aktualizace",
        "rcnotefrom": "Níže {{PLURAL:$5|je změna|jsou změny}} od <strong>$3, $4</strong> ({{PLURAL:$1|zobrazena|zobrazeny|zobrazeno}} nejvýše <strong>$1</strong>).",
        "rclistfromreset": "Obnovit výběr data",
        "pageswithprop-legend": "Stránky s vlastností",
        "pageswithprop-text": "Tato stránka obsahuje seznam stránek, které používají zadanou vlastnost stránky.",
        "pageswithprop-prop": "Název vlastnosti:",
+       "pageswithprop-reverse": "Seřadit v opačném pořadí",
+       "pageswithprop-sortbyvalue": "Seřadit podle hodnoty vlastnosti",
        "pageswithprop-submit": "Provést",
        "pageswithprop-prophidden-long": "dlouhá hodnota textové vlastnosti skryta ($1)",
        "pageswithprop-prophidden-binary": "hodnota binární vlastnosti skryta ($1)",
        "enotif_lastdiff": "Tuto změnu si můžete prohlédnout na $1",
        "enotif_anon_editor": "anonymní uživatel $1",
        "enotif_body": "Vážený uživateli $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nShrnutí editace: $PAGESUMMARY $PAGEMINOREDIT\n\nUživatele, který změnu provedl, můžete kontaktovat:\ne-mailem: $PAGEEDITOR_EMAIL\nna wiki: $PAGEEDITOR_WIKI\n\nDo doby, než stránku navštívíte jako přihlášený uživatel, vám další oznámení k této stránce nebudou zasílána. Případně si můžete vynulovat příznaky ve svém seznamu sledovaných stránek.\n\nS pozdravem váš zasílač hlášení {{grammar:2sg|{{SITENAME}}}}\n\n--\nZměnit nastavení e-mailových oznámení můžete na\n{{canonicalurl:{{#special:Preferences}}}}\n\nNastavení sledovaných stránek může změnit na\n{{canonicalurl:Special:Watchlist/edit}}\n\nStránku můžete ze svých sledovaných vyřadit na\n$UNWATCHURL\n\nRady a kontakt:\n$HELPPAGE",
+       "enotif_minoredit": "Toto je malá editace",
        "created": "vytvořil",
        "changed": "upravil",
        "deletepage": "Smazat stránku",
        "delete-warning-toobig": "Tato stránka má velkou historii editací, přes $1 {{PLURAL:$1|verzi|verze|verzí}}. Mazání takových stránek může narušit databázové operace {{grammar:2sg|{{SITENAME}}}}; postupujte opatrně.",
        "deleteprotected": "Tuto stránku nemůžete smazat, protože je zamčena.",
        "deleting-backlinks-warning": "<strong>Upozornění:</strong> Stránka, kterou se chystáte smazat, je [[Special:WhatLinksHere/{{FULLPAGENAME}}|na jiných stránkách]] odkazována nebo je do nich vložena.",
-       "deleting-subpages-warning": "<strong>Upozornění:</strong> Stránka, kterou se chystáte smazat, má [[Special:PrefixIndex/{{FULLPAGENAME}}|{{PLURAL:$1|podstránku|$1 podstránky|$1 podstránek|51=více než 50 podstránek}}]].",
+       "deleting-subpages-warning": "<strong>Upozornění:</strong> Stránka, kterou se chystáte smazat, má [[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|podstránku|$1 podstránky|$1 podstránek|51=více než 50 podstránek}}]].",
        "rollback": "Vrátit zpět editace",
        "rollbacklink": "vrácení zpět",
        "rollbacklinkcount": "vrácení $1 {{PLURAL:$1|editace|editací}} zpět",
index 0969376..ea0381d 100644 (file)
        "recentchanges-legend-plusminus": "''(±123)''",
        "recentchanges-submit": "Anzeigen",
        "rcfilters-legend-heading": "<strong>Liste von Abkürzungen:</strong>",
+       "rcfilters-other-review-tools": "<strong>Andere Überprüfungswerkzeuge:</strong>",
        "rcfilters-activefilters": "Aktive Filter",
        "rcfilters-advancedfilters": "Erweiterte Filter",
        "rcfilters-limit-title": "Anzuzeigende Änderungen",
        "rcfilters-savedqueries-new-name-label": "Name",
        "rcfilters-savedqueries-new-name-placeholder": "Beschreibe den Zweck des Filters",
        "rcfilters-savedqueries-apply-label": "Filter erstellen",
+       "rcfilters-savedqueries-apply-and-setdefault-label": "Standardfilter erstellen",
        "rcfilters-savedqueries-cancel-label": "Abbrechen",
        "rcfilters-savedqueries-add-new-title": "Aktuelle Filtereinstellungen speichern",
        "rcfilters-restore-default-filters": "Standardfilter wiederherstellen",
        "pageswithprop-legend": "Seiten mit einer Seiteneigenschaft",
        "pageswithprop-text": "Diese Spezialseite listet Seiten auf, die eine bestimmte Seiteneigenschaft verwenden.",
        "pageswithprop-prop": "Eigenschaftsname:",
+       "pageswithprop-reverse": "In umgekehrter Reihenfolge sortieren",
+       "pageswithprop-sortbyvalue": "Nach Eigenschaftswert sortieren",
        "pageswithprop-submit": "Los",
        "pageswithprop-prophidden-long": "Langtexteigenschaftswert versteckt ($1)",
        "pageswithprop-prophidden-binary": "Binäreigenschaftswert versteckt ($1)",
        "enotif_lastdiff": "Um diese Änderung anzusehen, siehe $1",
        "enotif_anon_editor": "Anonymer Benutzer $1",
        "enotif_body": "Hallo $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nZusammenfassung des Bearbeiters: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt zum Bearbeiter:\nE-Mail: $PAGEEDITOR_EMAIL\nWiki: $PAGEEDITOR_WIKI\n\nBei weiterer Aktivität auf der Seite werden dir so lange keine weiteren Benachrichtigungs-E-Mails gesendet, bis du die Seite wieder angemeldet besucht hast. Auf deiner Beobachtungsliste kannst du alle Benachrichtigungsmarkierungen zusammen zurücksetzen.\n\nDein freundliches {{SITENAME}}-Benachrichtigungssystem\n\n--\nUm die Einstellungen der E-Mail-Benachrichtigung anzupassen, besuche {{canonicalurl:{{#special:Preferences}}}}.\n\nUm die Einstellungen deiner Beobachtungsliste anzupassen, besuche {{canonicalurl:{{#special:EditWatchlist}}}}.\n\nUm die Seite von deiner Beobachtungsliste herunterzunehmen, besuche $UNWATCHURL.\n\nRückmeldungen und weitere Hilfe: $HELPPAGE",
+       "enotif_minoredit": "Dies ist eine kleine Bearbeitung",
        "created": "erstellt",
        "changed": "geändert",
        "deletepage": "Seite löschen",
index 3e4dd89..ad4e423 100644 (file)
        "print.css": "/* Το τοποθετημένο εδώ CSS θα επηρεάσει το αποτέλεσμα της εκτύπωσης */",
        "common.js": "/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φορτωθεί για όλους τους χρήστες σε κάθε φόρτωση σελίδας. */",
        "anonymous": "{{PLURAL:$1|Ανώνυμος χρήστης|Ανώνυμοι χρήστες}} του {{SITENAME}}",
-       "siteuser": "{{SITENAME}} χρήστης $1",
+       "siteuser": "χρήστη του {{SITENAME}} $1",
        "anonuser": "ανώνυμος χρήστης $1 του {{SITENAME}}",
        "lastmodifiedatby": "Η σελίδα αυτή τροποποιήθηκε τελευταία φορά στις $2, στις $1 από το χρήστη $3.",
        "othercontribs": "Βασισμένο στη δουλειά του/των $1",
        "others": "άλλοι",
-       "siteusers": "{{SITENAME}} {{PLURAL:$2|χρηστής|χρήστες}} του ιστοχώρου $1",
+       "siteusers": "{{PLURAL:$2|ο χρηστής|οι χρήστες}} του ιστοχώρου {{SITENAME}} $1",
        "anonusers": "{{PLURAL:$2|ανώνυμος χρήστης|ανώνυμοι χρήστες}} $1 του {{SITENAME}}",
        "creditspage": "Αναγνώριση συνεισφοράς στη σελίδα",
        "nocredits": "Δεν υπάρχουν πληροφορίες σχετικά με την αναγνώριση συνεισφοράς σε αυτή τη σελίδα.",
        "fileduplicatesearch-noresults": "Δεν βρέθηκε κανένα αρχείο με το όνομα «$1».",
        "specialpages": "Ειδικές σελίδες",
        "specialpages-note-top": "Υπόμνημα",
-       "specialpages-note": "* Κανονικές ειδικές σελίδες.\n* <span class=\"mw-specialpagerestricted\">Ειδικές σελίδες με περιορισμούς.</span>",
        "specialpages-group-maintenance": "Αναφορές συντήρησης",
        "specialpages-group-other": "Άλλες ειδικές σελίδες",
        "specialpages-group-login": "Σύνδεση / δημιουργία λογαριασμού",
index 85dd493..b2b4179 100644 (file)
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "Show",
        "rcfilters-legend-heading": "<strong>List of abbreviations:</strong>",
+       "rcfilters-other-review-tools": "<strong>Other review tools:</strong>",
        "rcfilters-activefilters": "Active filters",
        "rcfilters-advancedfilters": "Advanced filters",
        "rcfilters-limit-title": "Changes to show",
        "rcfilters-savedqueries-new-name-label": "Name",
        "rcfilters-savedqueries-new-name-placeholder": "Describe the purpose of the filter",
        "rcfilters-savedqueries-apply-label": "Create filter",
+       "rcfilters-savedqueries-apply-and-setdefault-label": "Create default filter",
        "rcfilters-savedqueries-cancel-label": "Cancel",
        "rcfilters-savedqueries-add-new-title": "Save current filter settings",
        "rcfilters-restore-default-filters": "Restore default filters",
        "pageswithprop-legend": "Pages with a page property",
        "pageswithprop-text": "This page lists pages that use a particular page property.",
        "pageswithprop-prop": "Property name:",
+       "pageswithprop-reverse": "Sort in reverse order",
+       "pageswithprop-sortbyvalue": "Sort by property value",
        "pageswithprop-submit": "Go",
        "pageswithprop-prophidden-long": "long text property value hidden ($1)",
        "pageswithprop-prophidden-binary": "binary property value hidden ($1)",
        "enotif_lastdiff": "To view this change, see $1",
        "enotif_anon_editor": "anonymous user $1",
        "enotif_body": "Dear $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nEditor's summary: $PAGESUMMARY $PAGEMINOREDIT\n\nContact the editor:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nThere will be no other notifications in case of further activity unless you visit this page while logged in. You could also reset the notification flags for all your watched pages on your watchlist.\n\nYour friendly {{SITENAME}} notification system\n\n--\nTo change your email notification settings, visit\n{{canonicalurl:{{#special:Preferences}}}}\n\nTo change your watchlist settings, visit\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nTo delete the page from your watchlist, visit\n$UNWATCHURL\n\nFeedback and further assistance:\n$HELPPAGE",
+       "enotif_minoredit": "This is a minor edit",
        "created": "created",
        "changed": "changed",
        "deletepage": "Delete page",
index 965bc54..b93f4c5 100644 (file)
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (véase también la [[Special:NewPages|lista de páginas nuevas]])",
        "recentchanges-submit": "Mostrar",
        "rcfilters-legend-heading": "<strong>Lista de abreviaturas:</strong>",
+       "rcfilters-other-review-tools": "<strong>Otras herramientas de revisión:</strong>",
        "rcfilters-activefilters": "Filtros activos",
        "rcfilters-advancedfilters": "Filtros avanzados",
        "rcfilters-limit-title": "Cambios para mostrar",
        "rcfilters-savedqueries-new-name-label": "Nombre",
        "rcfilters-savedqueries-new-name-placeholder": "Describe el propósito del filtro",
        "rcfilters-savedqueries-apply-label": "Crear filtro",
+       "rcfilters-savedqueries-apply-and-setdefault-label": "Crear filtro predeterminado",
        "rcfilters-savedqueries-cancel-label": "Cancelar",
        "rcfilters-savedqueries-add-new-title": "Guardar ajustes de filtro actuales",
        "rcfilters-restore-default-filters": "Restaurar filtros predeterminados",
        "enotif_lastdiff": "Consulta $1 para ver este cambio",
        "enotif_anon_editor": "usuario anónimo $1",
        "enotif_body": "Hola, $WATCHINGUSERNAME:\n\n$PAGEINTRO $NEWPAGE\n\nResumen del editor: $PAGESUMMARY $PAGEMINOREDIT\n\nContacta al editor:\ncorreo: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNo enviaremos más notificaciones si ocurre más actividad, a menos que visites esta página con la sesión iniciada. También puedes restablecer los estados de notificación para todas las páginas en tu lista de seguimiento.\n\nAtentamente, el sistema de notificaciones de {{SITENAME}}\n\n--\nPara cambiar tus ajustes de notificación por correo, visita\n{{canonicalurl:{{#special:Preferences}}}}\n\nPara cambiar los ajustes de tu lista de seguimiento, visita\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPara quitar la página de tu lista de seguimiento, visita\n$UNWATCHURL\n\nPara ayuda y comentarios:\n$HELPPAGE",
+       "enotif_minoredit": "Esta es una edición menor",
        "created": "creada",
        "changed": "modificada",
        "deletepage": "Borrar página",
index 12c7fbd..86c5767 100644 (file)
        "navigation-heading": "Nabigazio menua",
        "errorpagetitle": "Errorea",
        "returnto": "$1(e)ra itzuli.",
-       "tagline": "{{SITENAME}}(e)tik",
+       "tagline": "{{SITENAME}}tik",
        "help": "Laguntza",
        "search": "Bilatu",
        "searchbutton": "Bilatu",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ikus, gainera, [[Special:NewPages|orri berrien zerrenda]])",
        "recentchanges-submit": "Erakutsi",
        "rcfilters-legend-heading": "<indartsu>Laburpenen zerrenda:</indartsu>",
+       "rcfilters-other-review-tools": "<strong>Beste berrikusketa tresna:</strong>",
        "rcfilters-activefilters": "Iragazki aktiboak",
        "rcfilters-advancedfilters": "Iragazki aurreratuak",
        "rcfilters-limit-title": "Aldaketak erakutsi",
        "rcfilters-savedqueries-new-name-label": "Izena",
        "rcfilters-savedqueries-new-name-placeholder": "Deskribatu filtro honen helburua",
        "rcfilters-savedqueries-apply-label": "Sortu iragazkia",
+       "rcfilters-savedqueries-apply-and-setdefault-label": "Iragazkia sortu",
        "rcfilters-savedqueries-cancel-label": "Utzi",
        "rcfilters-savedqueries-add-new-title": "Gorde oraingo iragazki ezarpenak",
        "rcfilters-restore-default-filters": "Leheneratu iragazki lehenetsiak",
        "rcfilters-filter-editsbyself-description": "Zure ekarpenak",
        "rcfilters-filter-editsbyother-label": "Besteek egindako aldaketak",
        "rcfilters-filter-editsbyother-description": "Aldaketa guztiak norberarenak izan ezik.",
-       "rcfilters-filtergroup-userExpLevel": "Erregistro esperientzia eta esperientzia",
+       "rcfilters-filtergroup-userExpLevel": "Erabiltzailearen erregistroa eta esperientzia",
        "rcfilters-filter-user-experience-level-registered-label": "Erregistratuak",
        "rcfilters-filter-user-experience-level-registered-description": "Sesioa hasi duten editoreak.",
        "rcfilters-filter-user-experience-level-unregistered-label": "Ez erregistratuak",
        "pageswithprop": "Orrialde propietatea duten orrialdeak",
        "pageswithprop-legend": "Orrialde propietatea duten orrialdeak",
        "pageswithprop-prop": "Ezaugarriaren izena:",
+       "pageswithprop-reverse": "Antolatu aldrebeseko ordenean",
+       "pageswithprop-sortbyvalue": "Balio propioaren arabera antolatu",
        "pageswithprop-submit": "Joan",
        "pageswithprop-prophidden-long": "testu luzearen ezagaurria izkutatua ($1)",
        "doubleredirects": "Birbideratze bikoitzak",
        "enotif_lastdiff": "Aldaketa hau ikusteko, ikus $1.",
        "enotif_anon_editor": "$1 erabiltzaile anonimoa",
        "enotif_body": "Kaixo $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\n\nEgilearen laburpena: $PAGESUMMARY $PAGEMINOREDIT\n\nEgilearekin harremanetan jarri:\nposta: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nEz dira oharpen gehiago bidaliko orrialde hau berriz bisitatzen ez baduzu izena emanda zaudela.\nHorrez gain, orrialdeen oharpen konfigurazioa leheneratu dezakezu jarraipen zerrendatik.\n\n             Adeitasunez {{SITENAME}}(e)ko oharpen sistema\n\n--\nZure epostaren jakinarazpenen konfigurazioa aldatzeko, ikus\n{{canonicalurl:{{#special:Preferences}}}}\n\nZure jarraipen zerrendako konfigurazioa aldatzeko, ikus\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nOrrialdea zure jarraipen zerrendatik ezabatzeko, ikus\n$UNWATCHURL\n\nLaguntza:\n$HELPPAGE",
+       "enotif_minoredit": "Aldaketa hau txikia da",
        "created": "sortu",
        "changed": "aldatu",
        "deletepage": "Orrialdea ezabatu",
        "delete-edit-reasonlist": "Ezabaketa arrazoiak aldatu",
        "delete-toobig": "Orrialde honek aldaketa historia luzea du, {{PLURAL:$1|berrikuspen batetik|$1 berrikuspenetik}} gorakoa.\nOrrialde horien ezabaketa mugatua dago {{SITENAME}}n ezbeharrak saihesteko.",
        "delete-warning-toobig": "Orrialde honek aldaketa historia luzea du, {{PLURAL:$1|berrikuspen batetik|$1 berrikuspenetik}} gorakoa.\nEzabatzeak ezbeharrak eragin ditzake {{SITENAME}}ren datu-basean;\nkontu izan.",
+       "deleting-subpages-warning": "<strong>Oharra:</strong> Ezabatuko duzun orrialdeak [[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|a subpage|$1 subpages|51=over 50 subpages}}]] dauka.",
        "rollback": "Desegin aldaketak",
        "rollbacklink": "desegin",
        "rollbacklinkcount": "desegin {{PLURAL:$1|edizio bat|$1 edizio}}",
index 4a548dc..7b2b5dd 100644 (file)
        "post-expand-template-argument-warning": "'''Varoitus:''' Tällä sivulla on ainakin yksi mallineen muuttuja, jonka sisällytetty koko on liian suuri.\nNämä muuttujat on jätetty käsittelemättä.",
        "post-expand-template-argument-category": "Käsittelemättömiä mallinemuuttujia sisältävät sivut",
        "parser-template-loop-warning": "Mallinesilmukka havaittu: [[$1]]",
+       "template-loop-category": "Sivut joilla on mallinesilmukoita",
        "parser-template-recursion-depth-warning": "Mallineen rekursioraja ylittyi ($1)",
        "language-converter-depth-warning": "Kielimuuntimen syvyysraja ylittyi ($1)",
        "node-count-exceeded-category": "Sivut, joissa solmumäärä on ylitetty",
        "rcfilters-noresults-conflict": "Tuloksia ei löytynyt, koska hakuehdot ovat ristiriidassa",
        "rcfilters-state-message-subset": "Tällä suodattimella ei ole vaikutusta, koska sen tulokset sisältyvät {{PLURAL:$2|seuraavaan laajempaan suodattimeen|seuraaviin laajempiin suodattimiin}} (kokeile korostusta sen erottamiseksi): $1",
        "rcfilters-state-message-fullcoverage": "Ryhmän kaikkien suodattimien valitseminen on sama, kuin ei valitse mitään, joten tällä suodattimella ei ole vaikutusta. Ryhmään sisältyy: $1",
-       "rcfilters-filtergroup-registration": "Käyttäjän rekisteröinti",
-       "rcfilters-filter-registered-label": "Rekisteröitynyt",
-       "rcfilters-filter-registered-description": "Sisäänkirjautuneiden muokkaukset.",
-       "rcfilters-filter-unregistered-label": "Rekisteröimätön",
-       "rcfilters-filter-unregistered-description": "Muokkaajat, jotka eivät ole kirjautuneet sisään.",
-       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Tämä suodatin on ristiriidassa seuraavien kokemustaso {{PLURAL:$2|suodattimen|suodattimien}} kanssa,  {{PLURAL:$2|joka|jotka}} löytävät vain rekisteröityneitä käyttäjiä: $1",
        "rcfilters-filtergroup-authorship": "Muutoksen tekijä",
        "rcfilters-filter-editsbyself-label": "Muutoksesi",
        "rcfilters-filter-editsbyself-description": "Tekemäsi muutokset.",
        "rcfilters-filter-editsbyother-label": "Muiden muutokset",
        "rcfilters-filter-editsbyother-description": "Muiden käyttäjien tekemät muutokset.",
        "rcfilters-filtergroup-userExpLevel": "Kokemustaso (vain rekisteröityneet käyttäjät)",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Kokemustaso suodattimet löytävät vain rekisteröityneitä käyttäjiä, joten tämä suodatin on ristiriidassa \"Rekisteröimätön\" -suodattimen kanssa.",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "\"Rekisteröimätön\" -suodatin on ristiriidassa yhden tai useamman kokemustaso suodattimen kanssa, joka löytää vain rekisteröityneitä käyttäjiä.  Ristiriidassa oleva suodatin on merkittynä Aktiivisissa suodattimissa, yläpuolella.",
+       "rcfilters-filter-user-experience-level-registered-label": "Rekisteröitynyt",
+       "rcfilters-filter-user-experience-level-registered-description": "Sisäänkirjautuneiden muokkaukset.",
+       "rcfilters-filter-user-experience-level-unregistered-label": "Rekisteröimätön",
+       "rcfilters-filter-user-experience-level-unregistered-description": "Muokkaajat, jotka eivät ole kirjautuneet sisään.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Tulokkaat",
        "rcfilters-filter-user-experience-level-newcomer-description": "Vähemmän kuin 10 muokkausta ja 4 päivää aktiivisuutta.",
        "rcfilters-filter-user-experience-level-learner-label": "Oppijat",
        "fileduplicatesearch-noresults": "Tiedostoa nimeltä ”$1” ei löytynyt.",
        "specialpages": "Toimintosivut",
        "specialpages-note-top": "Merkkien selitys",
-       "specialpages-note": "* Normaalit toimintosivut.\n* <span class=\"mw-specialpagerestricted\">Rajoitetut toimintosivut.</span>",
        "specialpages-group-maintenance": "Sivujen huoltaminen",
        "specialpages-group-other": "Muut",
        "specialpages-group-login": "Sisäänkirjautuminen ja tunnusten luonti",
index 900871b..e9fa1e6 100644 (file)
                        "Benoit Rochon",
                        "Fitoschido",
                        "Archaeodontosaurus",
-                       "Trizek (WMF)"
+                       "Trizek (WMF)",
+                       "Framawiki"
                ]
        },
        "tog-underline": "Soulignement des liens :",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Lister",
        "rcfilters-legend-heading": "<strong>Liste des abréviations :</strong>",
+       "rcfilters-other-review-tools": "<strong>Autres outils de relecture :</strong>",
        "rcfilters-activefilters": "Filtres actifs",
        "rcfilters-advancedfilters": "Filtres avancés",
        "rcfilters-limit-title": "Modifications à afficher",
        "rcfilters-savedqueries-new-name-label": "Nom",
        "rcfilters-savedqueries-new-name-placeholder": "Décrire l'objet du filtre",
        "rcfilters-savedqueries-apply-label": "Créer un filtre",
+       "rcfilters-savedqueries-apply-and-setdefault-label": "Créer le filtre par défaut",
        "rcfilters-savedqueries-cancel-label": "Annuler",
        "rcfilters-savedqueries-add-new-title": "Sauvegarder la configuration du filtre courant",
        "rcfilters-restore-default-filters": "Rétablir les filtres par défaut",
        "pageswithprop-legend": "Pages avec une propriété de page",
        "pageswithprop-text": "Cette page liste les pages qui utilisent une propriété de page particulière.",
        "pageswithprop-prop": "Nom de la propriété :",
+       "pageswithprop-reverse": "Trier en ordre inverse",
+       "pageswithprop-sortbyvalue": "Trier par valeur de propriété",
        "pageswithprop-submit": "Lister",
        "pageswithprop-prophidden-long": "valeur de propriété de texte long masquée ($1)",
        "pageswithprop-prophidden-binary": "valeur de propriété binaire masquée ($1)",
        "enotif_lastdiff": "Pour visualiser ces changements, voyez $1",
        "enotif_anon_editor": "utilisateur non-enregistré $1",
        "enotif_body": "{{GENDER:$WATCHINGUSERNAME|Cher|Chère|Cher}} $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nRésumé du contributeur : $PAGESUMMARY $PAGEMINOREDIT\n\nContactez ce contributeur :\ncourriel : $PAGEEDITOR_EMAIL\nwiki : $PAGEEDITOR_WIKI\n\nIl n’y aura pas d’autres notifications en cas de changements ultérieurs, à moins que vous ne visitiez cette page une fois connecté. Vous pouvez aussi réinitialiser les drapeaux de notification pour toutes les pages de votre liste de suivi.\n\nVotre système de notification de {{SITENAME}}\n\n--\nPour modifier les paramètres de notification par courriel, visitez\n{{canonicalurl:{{#special:Preferences}}}}\n\nPour modifier les paramètres de votre liste de suivi, visitez\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPour supprimer la page de votre liste de suivi, visitez\n$UNWATCHURL\n\nRetour et assistance :\n$HELPPAGE",
+       "enotif_minoredit": "C’est une modification mineure",
        "created": "créée",
        "changed": "modifiée",
        "deletepage": "Supprimer la page",
index dec017d..5c13100 100644 (file)
        "nav-login-createaccount": "Shiga / ƙirƙiri akwanti",
        "logout": "Fita",
        "userlogout": "Fita",
+       "createaccount": "ƙirƙira asusu",
        "createacct-emailrequired": "adireshin i-mel",
        "createacct-emailoptional": "adireshin i-mel (zaɓi)",
        "createacct-email-ph": "shiga adireshinka i-mel",
        "createacct-another-email-ph": "shiga adireshin i-mel",
        "createacct-realname": "Suna na hakika (zaɓi)",
+       "createacct-submit": "Ƙirƙira asusunka",
        "mailmypassword": "Aiken kalmar sirri ta Imel",
        "emailconfirmlink": "Tabbata adireshinka i-mel",
        "pt-login": "Shiga",
        "pt-login-button": "Shiga",
+       "pt-createaccount": "ƙirƙira asusu",
        "pt-userlogout": "Fita",
        "changepassword": "Canji kalmar sirri",
        "oldpassword": "Tsohon kalmar sirri",
        "recentchanges-label-minor": "Karamin gyara ne",
        "rclistfrom": "Nuna sabbin sauye-sauye tun daga $3 $2",
        "rcshowhideminor": "$1 ƙananen sauye-sauye",
+       "rcshowhideminor-hide": "Ɓoye",
        "rcshowhidebots": "Rabuwat $1",
        "rcshowhidebots-show": "Nuna",
        "rcshowhideliu": "$1 Ma'aikata logaggi",
+       "rcshowhideliu-show": "Nuna",
+       "rcshowhideliu-hide": "Ɓoye",
        "rcshowhideanons": "$1 ma'aikata masu ɓoyayye suna",
+       "rcshowhideanons-hide": "Ɓooye",
        "rcshowhidemine": "$1 sauye-sauyena",
+       "rcshowhidemine-hide": "Ɓoye",
        "rclinks": "Nuna sauye-sauye $1 na ƙarshe a cikin kwanaki $2 na baya",
        "diff": "bamban",
        "hist": "Tarihi",
        "pager-older-n": "{{PLURAL:$1|tsoho 1|tsoffi $1}}",
        "booksources": "Littattafai maƙiblata",
        "booksources-search-legend": "Nemo tushen littattafai",
+       "booksources-search": "Nema",
        "log": "Rajistoci ayyuka",
        "allpages": "Duka shafuna",
        "prevpage": "Shafi na baya ($1)",
index a60f65b..20fc9ce 100644 (file)
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "הצגה",
        "rcfilters-legend-heading": "<strong>רשימת קיצורים:</strong>",
+       "rcfilters-other-review-tools": "<strong>כלי סקירה אחרים:</strong>",
        "rcfilters-activefilters": "מסננים פעילים",
        "rcfilters-advancedfilters": "מסננים מתקדמים",
        "rcfilters-limit-title": "אילו שינויים להראות",
        "rcfilters-savedqueries-new-name-label": "שם",
        "rcfilters-savedqueries-new-name-placeholder": "תיאור מטרת המסנן",
        "rcfilters-savedqueries-apply-label": "יצירת מסנן",
+       "rcfilters-savedqueries-apply-and-setdefault-label": "יצירת מסנן התחלתי",
        "rcfilters-savedqueries-cancel-label": "ביטול",
        "rcfilters-savedqueries-add-new-title": "שמירת הגדרות המסננים הנוכחיות",
        "rcfilters-restore-default-filters": "שחזור למסנני ברירת המחדל",
        "pageswithprop-legend": "דפים עם מאפיין דף",
        "pageswithprop-text": "בדף זה מופיעה רשימת דפים שמשתמשים במאפיין דף מסוים.",
        "pageswithprop-prop": "שם המאפיין:",
+       "pageswithprop-reverse": "מיון בסדר הפוך",
+       "pageswithprop-sortbyvalue": "מיון לפי הערך של המאפיין",
        "pageswithprop-submit": "הצגה",
        "pageswithprop-prophidden-long": "ערך ארוך של מאפיין טקסטואלי הוסתר ($1)",
        "pageswithprop-prophidden-binary": "ערך של מאפיין בינארי הוסתר ($1)",
        "enotif_lastdiff": "לצפייה בשינוי זה, ר' $1",
        "enotif_anon_editor": "משתמש אנונימי $1",
        "enotif_body": "לכבוד $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nתקציר העריכה: $PAGESUMMARY $PAGEMINOREDIT\n\nבאפשרותכם ליצור קשר עם העורך:\nבדואר אלקטרוני: $PAGEEDITOR_EMAIL\nבאתר: $PAGEEDITOR_WIKI\n\nלא תקבלו הודעות על פעולות נוספות עד שתבקרו בדף הזה כשאתם מחוברים לחשבון. באפשרותכם גם לאפס את דגלי ההודעות עבור כל הדפים שברשימת המעקב שלכם.\n\nבברכה, מערכת ההודעות של {{SITENAME}}.\n\n--\nכדי לשנות את ההגדרות של הודעות הדוא\"ל הנשלחות אליכם, בקרו בדף:\n{{canonicalurl:{{#special:Preferences}}}}\n\nכדי לשנות את ההגדרות של רשימת המעקב שלכם, בקרו בדף:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nכדי להסיר את הדף הזה מרשימת המעקב שלכם, בקרו בדף:\n$UNWATCHURL\n\nלמשוב ולעזרה נוספת:\n$HELPPAGE",
+       "enotif_minoredit": "זוהי עריכה משנית",
        "created": "נוצר",
        "changed": "שוּנה",
        "deletepage": "מחיקת הדף",
index 5f2ba29..b248e77 100644 (file)
        "enotif_subject_moved": "{{SITENAME}} पृष्ठ $1 को {{gender:$2|$2}} ने स्थानांतरित कर दिया है",
        "enotif_subject_restored": "{{SITENAME}} पृष्ठ $1 को {{gender:$2|$2}} ने पुनर्स्थापित कर दिया है",
        "enotif_subject_changed": "{{SITENAME}} पृष्ठ $1 को {{gender:$2|$2}} ने परिवर्तित किया है",
-       "enotif_body_intro_deleted": "{{SITENAME}} पृष्ठ $1 को {{gender:$2|$2}} ने $PAGEEDITDATE को हटा दिया है, देखें $3।",
+       "enotif_body_intro_deleted": "{{SITENAME}} पृष्ठ $1 को {{gender:$2|$2}} ने $PAGEEDITDATE को हटा दिया है, देखें <$3>।",
        "enotif_body_intro_created": "{{SITENAME}} पृष्ठ $1 को {{gender:$2|$2}} ने $PAGEEDITDATE को बनाया है, वर्तमान अवतरण के लिए $3 देखें।",
        "enotif_body_intro_moved": "{{SITENAME}} पृष्ठ $1 को {{gender:$2|$2}} ने $PAGEEDITDATE को स्थानांतरित किया है, वर्तमान अवतरण के लिए $3 देखें।",
        "enotif_body_intro_restored": "{{SITENAME}} पृष्ठ $1 को {{gender:$2|$2}} ने $PAGEEDITDATE को पुनर्स्थापित किया है, वर्तमान अवतरण के लिए $3 देखें।",
index 0466d5f..b25c266 100644 (file)
        "anontalk": "Baat",
        "navigation": "Navigation",
        "and": "&#32;aur",
-       "qbfind": "Khojo",
-       "qbbrowse": "Browse karo",
-       "qbedit": "Badlo",
-       "qbpageoptions": "Ii panna",
-       "qbmyoptions": "Hamar panna",
        "faq": "Sab time puchhe waala sawal",
-       "faqpage": "Project:Sab time puchhe waala sawal",
        "actions": "Karam",
        "namespaces": "Naam",
        "variants": "Antar",
        "edit-local": "Local description ke badlo",
        "create": "Banao",
        "create-local": "Local description ke jorro",
-       "editthispage": "Ii panna ke badlo",
-       "create-this-page": "Ii panna ke banao",
        "delete": "Mitao",
-       "deletethispage": "Ii panna ke mitao",
-       "undeletethispage": "Ii panna ke undelete karo",
        "undelete_short": "{{PLURAL:$1|ek badlao|$1 badlao}} ke pahile jaise karo",
        "viewdeleted_short": "Dekho {{PLURAL:$1|ek mitawal badlao|$1 mitawal badlao}}",
        "protect": "Bachao",
        "protect_change": "badlo",
-       "protectthispage": "Ii panna ke bacaho",
        "unprotect": "Nai bachao",
-       "unprotectthispage": "Ii panna ke surakchha ke badlo",
        "newpage": "Nawaa panna",
-       "talkpage": "Ii panna ke baare me salah karo",
        "talkpagelinktext": "Baat",
        "specialpage": "Khaas Panna",
        "personaltools": "Aapan aujaar",
-       "articlepage": "Content waala panna ke dekho",
        "talk": "Salah",
        "views": "Bichar",
        "toolbox": "Aujaar ke dabba",
        "tool-link-userrights": "Badlo {{GENDER:$1|sadasya}} groups",
        "tool-link-userrights-readonly": "Dekho {{GENDER:$1|sadasya}} groups",
        "tool-link-emailuser": "Email karo ii {{GENDER:$1|sadasya}}",
-       "userpage": "Sadasya ke panna dekho",
-       "projectpage": "Project waala panna dekho",
        "imagepage": "File panna ke dekho",
        "mediawikipage": "Sandes waala panna dekho",
        "templatepage": "Template waala panna dekho",
        "redirectedfrom": "($1 se bheja gais)",
        "redirectpagesub": "Panna ke redirect karo",
        "redirectto": "Hian redirect karo:",
-       "lastmodifiedat": "Ii panna ke $1, ke $2 pichhla time badla gais rahaa.",
+       "lastmodifiedat": "Ii panna ke $1, ke $2 baje, pichhla time badla gais rahaa.",
        "viewcount": "Ii panna ke {{PLURAL:$1|ek dafe|$1 dafe}} dekha gais hai.",
        "protectedpage": "Bachawal panna",
        "jumpto": "Hian jaao:",
        "missingcommenttext": "Meharbani kar ke niche aapan vichar deo.",
        "missingcommentheader": "<strong>Yaad karawa jaae hae:</strong> Aap ii vichar ke vishay nai likha hai.\nAgar aap \"$1\"  pe click karaa tab bina vishay ke iske bachae dewa jaai.",
        "summary-preview": "Sanchhep jhalak:",
-       "subject-preview": "Suchi ke jhalak:",
+       "subject-preview": "Subject ke jhalak:",
        "previewerrortext": "Aap ke badlao ke preview kare ke time kuchh garrbarro hae gais hai.",
        "blockedtitle": "Sadasya ke rok dewa gais hai",
        "blockedtext": "'''Aapke user name nai to IP address ke rok dewa gae hai.'''\n\nRoke waala hai $1.\nIske kaaran hai ''$2''.\n\n* Roke ke suruu: $8\n* Roke kab khatam hoi: $6\n* Kiske rokaa jae hai: $7\n\nAap $1 ke mile saktaa hai nai to duusra [[{{MediaWiki:Grouppage-sysop}}|administrator]] se rukawat ke baare me baat karo.\nAap ii sadasya ke 'email this user' feature ke kaam me lae ke baat nai kare saktaa hai jab tak ki ek kanuni email address aapke [[Special:Preferences|account preferences]] me nai hai aur aap ke iske kaam me laae ke roka nai gae hai.\nAap ke abhi ke IP address $3 hai, aur roka gae ID hai #$5.\nMeharbani kar ke chahe ek nai to duno ke aapan sawaal me rakho.",
        "readonlywarning": "<strong>Chetauni: Database ke maintenance khatir band kar dewa gais hai, tab abhi aap aapan badlao ke save nai kare paega.</strong>\nAap saait aapan badlao ke ek text file me cut-n-paste kar ke baad me use kare khatir save kar le sakta hai.\nAdministrator jon ki iske lock karis hai ii kaaran diis hai: $1",
        "protectedpagewarning": "'''CHETAUNI: Ii panna ke band kar dewa gais hai jisse ke khaali uu sadasya jiske sysop adhikaar hai iske badle sake hai.'''\nNiche sab se nawaa suchi aap ke dekhe ke khatir dewa gais hae:",
        "semiprotectedpagewarning": "'''Suchna:''' Ii panna ke band kar dewa gais hai jisse ki khali registered sadasya iske badle sake hai.\nNiche sab se nawaa suchi ke aap ke dekhe ke khatir dewa gais hae:",
-       "cascadeprotectedwarning": "<strong>Chetawani:</strong> Ii panna ke band kar dewa gais jiske kaaran khaali uu sadasya jiske lage sysop privileges hai iske badle sake hai, kahe ki iske niche likha gais cascade-protected {{PLURAL:$1|panna}} me rakkha gais hai:",
+       "cascadeprotectedwarning": "<strong>Chetawani:</strong> Ii panna ke band kar dewa gais jiske kaaran khaali uu sadasya jike lage [[Special:ListGroupRights|specific rights]] ke adhikaar hai iske badle sake hai , kaaheki iske niche likha gais cascade-protected {{PLURAL:$1|panna}} me rakkha gais hai:",
        "titleprotectedwarning": "'''CHETAUNI: Ii panna ke band dewa gais hai jisse ki [[Special:ListGroupRights|specific rights]] ke jarie iske badla jaae sake hai.'''\nAap ke jaankari ke khatir sab se nawaa suchi niche dewa gais hae:",
        "templatesused": "{{PLURAL:$1|Template|Templates}} ke ii panna me kaam me lawa gais hae:",
        "templatesusedpreview": "{{PLURAL:$1|Template|Templates}} ii jhalak me kaam me lawa gais hae:",
        "post-expand-template-argument-warning": "Warning: Ii panna me kamti se kamti ek template argument hai jiske expansion size bahut barraa hai.\nIi sab arguments ke omit kar dewa gais hai.",
        "post-expand-template-argument-category": "Panna jisme omitted template arguments hai",
        "parser-template-loop-warning": "Template loop ke pawa gais hai: [[$1]]",
+       "template-loop-category": "Panna jisme template loop hai",
+       "template-loop-category-desc": "Ii panna me kachchaa loop hai, iske matlab ki, uu panna jon ki apne ke recursively call kare hai.",
        "parser-template-recursion-depth-warning": "Template recursion depth limit se jaada hoe gais hae ($1)",
        "language-converter-depth-warning": "Bhasa anuwaad ke gahiraai ijajat se jaada hoe gais hae ($1)",
        "node-count-exceeded-category": "Panna jahaan pe node-count bahut jaada hoe gais hae",
        "page_first": "pahila",
        "page_last": "aakhri",
        "histlegend": "Farak pasand: Antar dekhe khatir radio box me chinh lagao aur enter ke nai to niche ke button dabao.<br />\nLegend: (abhi) = abhi ke version se farka,\n(pahile waala) = pahile waala version se farka, M = chhota sampadan.",
-       "history-fieldset-title": "Itihaas me khojo",
-       "history-show-deleted": "Khaali mitawa gais",
+       "history-fieldset-title": "Badfdlao ke khojo",
+       "history-show-deleted": "Khaali badlao ke mitaawa gais",
        "histfirst": "Sab se puraana",
        "histlast": "Sab se nawaa",
        "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
        "search-file-match": "(file content ke match kare hae)",
        "search-suggest": "Ka aap ke matlab rahaa: $1",
        "search-rewritten": "$1 ke result dekhawa jaae hai. Iske jagah $2 ke khojo.",
-       "search-interwiki-caption": "Saathe ke project",
+       "search-interwiki-caption": "Saathe ke project se",
        "search-interwiki-default": "$1 ke result:",
        "search-interwiki-more": "(aur)",
+       "search-interwiki-more-results": "aur result",
        "search-relatedarticle": "sambandh rakkhe hai",
        "searchrelated": "sambhand rakkhe hai",
        "searchall": "sab",
        "prefs-help-prefershttps": "Aap ke agla login pe ii preferences effect me aai.",
        "prefswarning-warning": "Aap aapan preferences ke badla hae, jiske abhi talak save nai karaa gae hae.\nAgar aap ii panna ke bina \"$1\" me click kare chhorra, tab aap ke preferences save nai hoi.",
        "prefs-tabs-navigation-hint": "Tip: Aap left aur right arrow key use kar ke tab list me navigate kare saktaa hae.",
-       "userrights": "Sadasya ke adhikaar ke chalao",
+       "userrights": "Sadasya ke adhikaar",
        "userrights-lookup-user": "Ek sadasya ke chuno",
        "userrights-user-editname": "Ek Username ke enter karo:",
        "editusergroup": "User groups ke load karo",
        "editinguser": "{{GENDER:$1|Sadasya}} <strong>[[User:$1|$1]]</strong>  ke adhikaar ke badlaa jaawe hae $2",
        "viewinguserrights": "{{GENDER:$1|Sadasya}} <strong>[[User:$1|$1]]</strong>  ke adhikaar ke dekhaa jaawe hae $2",
-       "userrights-editusergroup": "User groupske badlo",
-       "userrights-viewusergroup": "User groups ke dekho",
+       "userrights-editusergroup": "Groups {{GENDER:$1|user}} ke badlo",
+       "userrights-viewusergroup": "Groups  {{GENDER:$1|user}} ke dekho",
        "saveusergroups": "User groups, {{GENDER:$1|user}}, ke save karo",
        "userrights-groupsmember": "Iske member hai:",
        "userrights-groupsmember-auto": "Hian ke bhi member hae:",
-       "userrights-groups-help": "Aap jon group me ii sadasya hai ke badle sakta hai:\n* Ek checked box ke matlab hai ki sadasya ii group me hai.\n* Ek unchecked box ke matlab hai ki sadasya ii group me nai hai.\n* Ek * ke matlab hai ki aap group ke jorre ke baad hatae nai sakta hai, nai to hatae ke baad jorre nai sakta hai.",
+       "userrights-groups-help": "Aap jon group me ii sadasya hai ke badle saktaa hai:\n* Ek checked box ke matlab hai ki sadasya ii group me hai.\n* Ek unchecked box ke matlab hai ki sadasya ii group me nai hai.\n* Ek * ke matlab hai ki aap group ke jorre ke baad hatae nai sakta hai, nai to hatae ke baad jorre nai sakta hai.\n* Ek # ke matlab hai ki aap khaali ii group ke membership ke expiration time ke piichhe kare saktaa hai; aap iske aage nai kare saktaa hai",
        "userrights-reason": "Kaaran:",
        "userrights-no-interwiki": "Aap ke duusra wiki me user rights ke badle ke adhikaar nai hai.",
        "userrights-nodatabase": "Database $1 abhi hai nai, nai to local nai hai.",
        "userrights-expiry-options": "1 din:1 day,1 haptaa:1 week,1 mahina:1 month,3 mahina:3 months,6 mahina:6 months,1 saal:1 year",
        "userrights-invalid-expiry": "Group ke expiry time \"$1\" invalid hai.",
        "userrights-expiry-in-past": "Group ke expiry time \"$1\" biit gais hai.",
+       "userrights-cannot-shorten-expiry": "Aap group \"$1\" ke membership ke expiry ke aage nai kare saktaa hai.\nKhaali uu sadasya, jiske lage jorre aur hatae ke adhikaar hai, ii group ke expiry date ke aage kare sake hai.",
        "userrights-conflict": "User right me conflict hae! Meharbaani kar ke aapan badlao ke fir se review aur confirm karo.",
        "group": "Jhund:",
        "group-user": "Sadasya",
        "recentchanges-legend-heading": "<strong>Legend:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (aur dekho [[Special:NewPages|nawaa panna ke suchi]])",
        "recentchanges-submit": "Dekhao",
+       "rcfilters-legend-heading": "<strong>Abbreviations ke suchi:</strong>",
+       "rcfilters-other-review-tools": "<strong>Duusra review kare waala tool:</strong>",
        "rcfilters-activefilters": "Active filters",
+       "rcfilters-advancedfilters": "Advanced filters",
+       "rcfilters-limit-title": "Jon badlao ke dekhae ke hai",
+       "rcfilters-limit-shownum": "Pichhlaa $1 badlao ke dekhao",
+       "rcfilters-days-title": "Kuchh pahile ke din",
+       "rcfilters-hours-title": "Kuch pahile ke ghantaa",
+       "rcfilters-days-show-days": "$1 {{PLURAL:$1|din}}",
+       "rcfilters-days-show-hours": "$1 {{PLURAL:$1|ghantaa}}",
+       "rcfilters-quickfilters": "Bachaawa gais filters",
+       "rcfilters-quickfilters-placeholder-title": "Koi link ke abhi bachaawa nai gais hai",
+       "rcfilters-quickfilters-placeholder-description": "Filter ke settings ke bachae ke baad me fir se use kare ke khatir, niche ke Active Filter area me, bookmark icon pe click karo.",
+       "rcfilters-savedqueries-defaultlabel": "Bachaawa gais filters",
+       "rcfilters-savedqueries-rename": "Naam badlo",
+       "rcfilters-savedqueries-setdefault": "Set as default",
+       "rcfilters-savedqueries-unsetdefault": "Remove as default",
+       "rcfilters-savedqueries-remove": "Hatao",
+       "rcfilters-savedqueries-new-name-label": "Naam",
+       "rcfilters-savedqueries-new-name-placeholder": "Filter ke kaaran batao",
+       "rcfilters-savedqueries-apply-label": "Filter banao",
+       "rcfilters-savedqueries-apply-and-setdefault-label": "Default filter banao",
+       "rcfilters-savedqueries-cancel-label": "Cancel karo",
+       "rcfilters-savedqueries-add-new-title": "Abhi ke filter settings ke bachao",
        "rcfilters-restore-default-filters": "Restore default filters",
        "rcfilters-clear-all-filters": "Sab filter ke clear karo",
        "rcfilters-search-placeholder": "Filter recent changes (browse or start typing)",
        "rcfilters-invalid-filter": "Invalid filter",
        "rcfilters-empty-filter": "No active filters. All contributions are shown.",
        "rcfilters-filterlist-title": "Filters",
+       "rcfilters-filterlist-whatsthis": "Ii kaise kaam kare hai?",
+       "rcfilters-filterlist-feedbacklink": "Nawaa (beta) filter pe feedback do",
+       "rcfilters-highlightbutton-title": "Results ke highlight karo",
+       "rcfilters-highlightmenu-title": "Rang ke chuno",
+       "rcfilters-highlightmenu-help": "Ii property ke highlight kare ke khaatir, rang chuno",
        "rcfilters-filterlist-noresults": "Koi filter nai milaa",
-       "rcfilters-filtergroup-registration": "User registration",
-       "rcfilters-filter-registered-label": "Register kar dewa gais:",
-       "rcfilters-filter-registered-description": "Logged-in editors.",
-       "rcfilters-filter-unregistered-label": "Unregistered",
-       "rcfilters-filter-unregistered-description": " Editors who aren’t logged in.",
-       "rcfilters-filtergroup-authorship": "Edit authorship",
-       "rcfilters-filter-editsbyself-label": "Aapan badlao",
+       "rcfilters-noresults-conflict": "Koi natija nai milaa, kaheki search criteria me conflict hai",
+       "rcfilters-state-message-subset": "Ii filter se koi chij nai hoe hai kaaheki iske result ii broader  {{PLURAL:$2|filter|filters}} me hai. (iske distinguish kare ke khaatir iske highlight karo): $1",
+       "rcfilters-state-message-fullcoverage": "Ek group me sab filter ke select karna, ek filter ke select kare ke maafit hai. Group me hai: $1",
+       "rcfilters-filtergroup-authorship": "COntribution authorship",
+       "rcfilters-filter-editsbyself-label": "Aap ke badlao",
        "rcfilters-filter-editsbyself-description": "Aap ke karaa gais badlao.",
        "rcfilters-filter-editsbyother-label": "Duusra jan ke karaa gais badlao",
        "rcfilters-filter-editsbyother-description": "Badlao jiske duusraa jan karin hai (aap nai)",
-       "rcfilters-filtergroup-userExpLevel": "User experience level (registered sadasya ke khaatir)",
+       "rcfilters-filtergroup-userExpLevel": "Sadasya ke registration aur anbhao",
+       "rcfilters-filter-user-experience-level-registered-label": "Register kar dewa gais",
+       "rcfilters-filter-user-experience-level-registered-description": "Editors, jon abhi logged in hai.",
+       "rcfilters-filter-user-experience-level-unregistered-label": "Jon abhi registered nai hai",
+       "rcfilters-filter-user-experience-level-unregistered-description": " Editors jon abhi logged-in nai hai.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Newcomers",
-       "rcfilters-filter-user-experience-level-newcomer-description": "10 se kamtii badlao aur 4 din se kamtii activity.",
+       "rcfilters-filter-user-experience-level-newcomer-description": "10 se kamtii badlao aur 4 din se kamtii activity waala registered editors.",
        "rcfilters-filter-user-experience-level-learner-label": "Sikhe waala",
-       "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": "Uu registered sadasya jiske anbhao \"Newcomers\" aur \"Experienced users\" ke biich me hai.",
        "rcfilters-filter-user-experience-level-experienced-label": "Experienced users",
-       "rcfilters-filter-user-experience-level-experienced-description": "30 din se jaada activity aur 500 se jaada badlao",
+       "rcfilters-filter-user-experience-level-experienced-description": "Registered sadasya jiske activity 30 din se jaada aur 500 din se kamti hai",
        "rcfilters-filtergroup-automated": "Automated contributions",
        "rcfilters-filter-bots-label": "Bot",
        "rcfilters-filter-bots-description": "Edits made by automated tools.",
        "rcfilters-filter-humans-label": "Human (not bot)",
        "rcfilters-filter-humans-description": "Edit, jiske human editors karin hai.",
+       "rcfilters-filtergroup-reviewstatus": "Review status",
+       "rcfilters-filter-patrolled-label": "Paahra dewa gais hai",
+       "rcfilters-filter-patrolled-description": "Badlao jiske patrolled mark karaa gais hai.",
+       "rcfilters-filter-unpatrolled-label": "Patrol nai karaa gais hai",
+       "rcfilters-filter-unpatrolled-description": "Badlao jiske patrolled nai mark karaa gais hai.",
        "rcfilters-filtergroup-significance": "Significance",
        "rcfilters-filter-minor-label": "Chhotaa badlao",
        "rcfilters-filter-minor-description": "Edits the author labeled as minor.",
        "rcfilters-filter-major-label": "Non-minor edits",
        "rcfilters-filter-major-description": "Edits not labeled as minor.",
+       "rcfilters-filtergroup-watchlist": "Panna jiske watchlist me rakkhaa gais hai",
+       "rcfilters-filter-watchlist-watched-label": "Dhyan suchi me",
+       "rcfilters-filter-watchlist-watched-description": "Aap ke dhyan suchi me panna ke badlao.",
+       "rcfilters-filter-watchlist-watchednew-label": "Nawaa Watchlist badlao",
+       "rcfilters-filter-watchlist-watchednew-description": "Watchlist panna ke badlao jiske aap badlao ke baad nai dekha hai.",
+       "rcfilters-filter-watchlist-notwatched-label": "Watchlist me nai hai",
+       "rcfilters-filter-watchlist-notwatched-description": "Aap ke Watchlist me badlao ke siwaa aur sab kuchh.",
        "rcfilters-filtergroup-changetype": "Type of change",
        "rcfilters-filter-pageedits-label": "Panna ke badlao",
-       "rcfilters-filter-pageedits-description": "Edits to wiki content, discussions, category descriptions....",
+       "rcfilters-filter-pageedits-description": "Badlao wiki content, discussions, category descriptions....",
        "rcfilters-filter-newpages-label": "Page creations",
        "rcfilters-filter-newpages-description": "Edits that make new pages.",
        "rcfilters-filter-categorization-label": "Category changes",
        "rcfilters-filter-categorization-description": "Records of pages being added or removed from categories.",
        "rcfilters-filter-logactions-label": "Logged actions",
        "rcfilters-filter-logactions-description": "Administrative actions, account creations, page deletions, uploads....",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "The \"Minor edits\" filter conflicts with one or more Type of change filters, because certain types of change cannot be designated as \"minor\". The conflicting filters are marked in the Active filters area, above.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Certain types of change cannot be designated as \"minor\", so this filter conflicts with the following Type of Change filters: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "This Type of change filter conflicts with the \"Minor edits\" filter. Certain types of change cannot be designated as \"minor\".",
+       "rcfilters-filtergroup-lastRevision": "Abhi ke badlao",
+       "rcfilters-filter-lastrevision-label": "Abhi ke badlao",
+       "rcfilters-filter-lastrevision-description": "Panna ke khaali sab se recent badlao.",
+       "rcfilters-filter-previousrevision-label": "Sab se latest revision nai hai",
+       "rcfilters-filter-previousrevision-description": "Uu sab badlao jon ki \"latest revision\" me nai hai.",
+       "rcfilters-filter-excluded": "Exclude kar dewa gais hai",
+       "rcfilters-tag-prefix-namespace-inverted": "<strong>:nai</strong> $1",
+       "rcfilters-exclude-button-off": "Select karaa gais, ke exclude karo",
+       "rcfilters-exclude-button-on": "Aap ke translation",
+       "rcfilters-view-tags": "Tagged edits",
+       "rcfilters-view-namespaces-tooltip": "Results ke namespace se filter karo",
+       "rcfilters-view-tags-tooltip": "Results ke, edit tags ke kaam me laae ke, filter karo",
+       "rcfilters-view-return-to-default-tooltip": "Main filter menu pe lauto",
+       "rcfilters-liveupdates-button": "Live updates",
        "rcnotefrom": "Niche {{PLURAL:$5|badlao hae|badlao hae}} <strong>$3, $4</strong> (<strong>$1</strong> talak dekhawa gais) talak.",
+       "rclistfromreset": "Taarik ke selection ke reset karo",
        "rclistfrom": "$3 $2 se suruu kar ke nawaa badlao dekhao",
        "rcshowhideminor": "$1 chhota badlao",
        "rcshowhideminor-show": "Dekhao",
        "php-uploaddisabledtext": "File uploads ke PHP me disable kar dewa gais hai. Meharbani kar ke file_uploads setting ke check karo.",
        "uploadscripted": "Ii file me HTML nai to script code hai jiske web browser erroneously interpret kare sake hai.",
        "upload-scripted-pi-callback": "File jisme XML-stylesheet processing instruction hai ke upload nai karaa jaae sake hai.",
+       "upload-scripted-dtd": "SVG files, jisme non-standard DTD declaration hai, ke upload nai kare saktaa hai.",
        "uploaded-script-svg": "Found scriptable element \"$1\" in the uploaded SVG file.",
        "uploaded-hostile-svg": "Found unsafe CSS in the style element of uploaded SVG file.",
        "uploaded-event-handler-on-svg": "Setting event-handler attributes <code>$1=\"$2\"</code> is not allowed in SVG files.",
        "pageswithprop-legend": "Panna, aapan poperty ke saathe",
        "pageswithprop-text": "Ii panaa, uu panna ke list kare hae jon ki koi khaas panna ke property ke use kare hae.",
        "pageswithprop-prop": "Property ke naam:",
+       "pageswithprop-reverse": "Reverse order me sort karo",
+       "pageswithprop-sortbyvalue": "Property value se sort karo",
        "pageswithprop-submit": "Jaao",
        "pageswithprop-prophidden-long": "lamba text property value hidden ($1)",
        "pageswithprop-prophidden-binary": "binary property ke lukawal value ($1)",
        "enotif_lastdiff": "Ii badlao ke dekhe ke khatir $1 ke dekho.",
        "enotif_anon_editor": "bina naam ke sadasya $1",
        "enotif_body": "Priye $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nEditor's summary: $PAGESUMMARY $PAGEMINOREDIT\n\nContact the editor:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\n\n\nAur koi notifications nai rahii, kahe ki koi aur badlao hoe sake hai, jab talak aap ii panna ke visit nai karta hai.\nAap aapan dhyan suchi me sab dhyan me rakha gais panna pe notification flags ke reset kare sakta hai.\n\nAap ke  dayalu {{SITENAME}} notification system\n\n--\nAapan Email notofication setting ke badle ke khatir, jaao\n{{canonicalurl:{{#special:Preferences}}}}\n\nAapan dhyan ke settings ke badle ke khatir, jaao\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\n\nAapan dhyan suchi se panna ke mitae ke khatir, jaao\n$UNWATCHURL\n\n\nAapan bichar de ke khatir aur aage ke sahaeta:\n$HELPPAGE",
+       "enotif_minoredit": "Ii ek minor edit hai",
        "created": "banae dewa gais hai",
        "changed": "badal dewa gais hai",
        "deletepage": "Pana ke delete karo",
        "delete-warning-toobig": "Ii panna ke lambaa badlao ke itihaas hai, $1 {{PLURAL:$1|revision|revisions}} se jaada.\nIske mitae se {{SITENAME}} me database operations me baadha parri;\nsawadhani se aage barrho.",
        "deleteprotected": "Aap ii panna ke mitae nai saktaa hae kaaheki iske protect karaa gais hae.",
        "deleting-backlinks-warning": "<string>Chetauni:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|Duusra panna]] uu panna se link, nai to transclude kare hai jiske aap delete kare waala hae.",
+       "deleting-subpages-warning": "<strong>Chetauni:</strong> Jon panna ke aap mitae waala hai me [[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|a subpage|$1 subpages|51=over 50 subpages}}]] hai.",
        "rollback": "Pahile jaise kare waala badlao",
        "rollbacklink": "pahile jaise karo",
        "rollbacklinkcount": "$1 {{PLURAL:$1|edit|edits}} ke rollback karo",
        "editcomment": "Badlao ke summary rahaa: <em>$1</em>.",
        "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|Talk]]) ke badlao ke [[User:$1|$1]] ke aakhri badlao ke jaise kar dewa gais hai.",
        "revertpage-nouser": "Reverted edits by a hidden user to last revision by {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "$1 ke badlao ke pahile jaise kar dewa gais hai;\nbadal ke $2 ke aakhri version kar dewa gais hai.",
+       "rollback-success": "Reverted edits by {{GENDER:$3|$1}};\nchanged back to last revision by {{GENDER:$4|$2}}.",
        "rollback-success-notify": "$1 ke badlao ke pahile jaise kar dewa gais hai;\nbadlao ke $2 ke aakhri version kar dewa gais hai.[$3 Show changes]",
        "sessionfailure-title": "Session fail hoe gais hae",
        "sessionfailure": "Aap ke login session me kuch karrbarr hai.\niske cancel kar dewa gais hai jisse ki koi iisession ke hijack nai kar.\nMeharbani kar ke  \"back\" ke press kar ke jon pana se aap aae rahaa ke fir se load karo, tab fir kosis karo.",
        "undelete-search-title": "Mitawa gais panna ke khojo",
        "undelete-search-box": "Mitawa gais panna ke khojo",
        "undelete-search-prefix": "Uu panna ke dekhao jon ki isse suruu hoe hai:",
+       "undelete-search-full": "Uu panna dekhao jisme hai:",
        "undelete-search-submit": "Khojo",
        "undelete-no-results": "Mitawa gais panna ke archive me ii rakam ke koi panna ke nai pawa gais hai.",
        "undelete-filename-mismatch": "File revision jiske timestamp $1 hai ke pahile jaise nai karaa jaawe sake hai: filename mismatch",
        "sp-contributions-uploads": "upload karaa gais file",
        "sp-contributions-logs": "logs",
        "sp-contributions-talk": "baat",
-       "sp-contributions-userrights": "sadasya ke adhikaar ke manage karo",
+       "sp-contributions-userrights": "{{GENDER:$1|sadasya}} rights management",
        "sp-contributions-blocked-notice": "Ii sadasya ke hian pe ijajat nai hae.\nPahile waala block log entry ke reference ke khatir niche dekhawa jaawe hae:",
        "sp-contributions-blocked-notice-anon": "Ii IP address abhi rok dewa gais hae.\nSab se nawaa roke ke suchi ke, aap ke khatir, niche dewa gais hae.",
        "sp-contributions-search": "Yogdaan ke khojo",
        "unblocked-id": "Roko $1 ke khalaas kar dewa gais hai",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] ke unblock kar dewa gais hae.",
        "blocklist": "Roka gais sadasya",
+       "autoblocklist": "Autoblocks",
+       "autoblocklist-submit": "Khojo",
+       "autoblocklist-legend": "Autoblocks ke list karo",
+       "autoblocklist-localblocks": "Local {{PLURAL:$1|autoblock|autoblocks}}",
+       "autoblocklist-total-autoblocks": "Total number of autoblocks: $1",
+       "autoblocklist-empty": "Autoblock ke suchi khaali hai.",
+       "autoblocklist-otherblocks": "Other {{PLURAL:$1|autoblock|autoblocks}}",
        "ipblocklist": "Roka gais sadasya",
        "ipblocklist-legend": "Ek roka gais sadasya ke khojo",
        "blocklist-userblocks": "Roka gais account ke lukao",
        "tooltip-pt-mycontris": "{{GENDER:|Aap ke}} yogdaan ke suchi",
        "tooltip-pt-anoncontribs": "Ii IP address se badlao karaa gais chij ke suchi",
        "tooltip-pt-login": "Aap log in kartaa tab achchha rahataa; lekin jaruri nai hae.",
+       "tooltip-pt-login-private": "Ii wiki ke use kare ke khaatir aap ke log in hoe ke parrii",
        "tooltip-pt-logout": "Log out",
        "tooltip-pt-createaccount": "Aap ke ek account banae ke log in kare ke encourage karaa jaae hae; lekin iske jaruri nai hae",
        "tooltip-ca-talk": "Content waala panna ke baare me salah",
        "newimages-summary": "Ii khaas panna pahile waala upload karaa gais file ke dekhae hai.",
        "newimages-legend": "Chaalo",
        "newimages-label": "Filename (nai to iske ek hissa):",
+       "newimages-user": "IP Address, nai to username",
+       "newimages-newbies": "Khaali nawaa account ke yogdaan dekhao",
        "newimages-showbots": "Bots se upload dekhawa jaae hae",
        "newimages-hidepatrolled": "Patrolled uploads ke lukao",
+       "newimages-mediatype": "Media type:",
        "noimages": "Koi chij dekhe ke nai hai.",
        "gallery-slideshow-toggle": "Toggle thumbnails",
        "ilsubmit": "Khojo",
        "confirmrecreate": "Sadasya [[User:$1|$1]] ([[User talk:$1|talk]]) {{GENDER:$1|mitais}} ii panna after you started editing with reason:\n: <em>$2</em>\nMeharbaani kar ke ii confirm karo ki aap asliyat me ii panna ke fir se banae mangtaa hai.",
        "confirmrecreate-noreason": "User [[User:$1|$1]] ([[User talk:$1|talk]]){{GENDER:$1|deleted}} this page after you started editing. Please confirm that you really want to recreate this page.",
        "recreate": "Fir se banao",
+       "confirm-purge-title": "Purge this page",
        "confirm_purge_button": "Thik hae",
        "confirm-purge-top": "Ii panna ke cache ke mitao",
        "confirm-purge-bottom": "Ek panna ke purge kare se cache khaali hoe jaae hae aur sab se naaa balao ke dekhae hae.",
        "fileduplicatesearch-noresults": "Koi file jiske naam \"$1\" ke nai paawa gais hae.",
        "specialpages": "Khaas panna",
        "specialpages-note-top": "Legend",
-       "specialpages-note": "* Normal special panna.\n* <span class=\"mw-specialpagerestricted\">Restricted special panna.</span>",
+       "specialpages-note-restricted": "* Normal khaas panna.\n* <span class=\"mw-specialpagerestricted\">Restricted khaas panna.</span>",
        "specialpages-group-maintenance": "Maintenance reports",
        "specialpages-group-other": "Duusra khaas panna",
        "specialpages-group-login": "Login karo/Nawaa account banao",
        "tags-create-reason": "Kaaran:",
        "tags-create-submit": "Banao",
        "tags-create-no-name": "Aap ke ek tag ke naam ke batae ke parri.",
-       "tags-create-invalid-chars": "Tag ke naam me saait comma (<code>,</code>) nai to forward slashes (<code>/</code>) hoi.",
+       "tags-create-invalid-chars": "Tag ke naam me saait comma (<code>,</code>),  pipes (<code>|</code>) nai to forward slashes (<code>/</code>) hoi.",
        "tags-create-invalid-title-chars": "Tag ke naam me aisan characters nai hoe ke chaahi jiske panna ke title me nai kaam me lawa jaae sake hae.",
        "tags-create-already-exists": "Tag \"$1\" abhi hae.",
        "tags-create-warnings-above": "Niche ke {{PLURAL:$2|chetauni|chetauni}} you time mila jab tag \"$1\" ke banae ke kosis karaa jaawat rahaa:",
        "htmlform-user-not-valid": "<strong>$1</strong> valid username nai hai.",
        "logentry-delete-delete": "$1 {{GENDER:$2|deleted}} panna $3",
        "logentry-delete-delete_redir": "$1 {{GENDER:$2|deleted}} redirect $3 by overwriting",
-       "logentry-delete-restore": "$1 {{GENDER:$2|restored}} panna $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|restored}} panna $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|restored}} panna $3",
+       "restore-count-revisions": "{{PLURAL:$1|1 badlao|$1 badlao}}",
+       "restore-count-files": "{{PLURAL:$1|1 file|$1 files}}",
        "logentry-delete-event": "$1 {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a log event|$5 log events}} on $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a revision|$5 revisions}} panna $3: $4 pe",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|badal dewa gais hae}} visibility of log events on $3",
        "special-characters-group-thai": "Thai",
        "special-characters-group-lao": "Lao",
        "special-characters-group-khmer": "Khmer",
+       "special-characters-group-canadianaboriginal": "Canadian Aboriginal",
        "special-characters-title-endash": "en dash",
        "special-characters-title-emdash": "em dash",
        "special-characters-title-minus": "minus sign",
        "mw-widgets-titleinput-description-new-page": "ii panna abhi nai hai",
        "mw-widgets-titleinput-description-redirect": "$1 pe redirect karo",
        "mw-widgets-categoryselector-add-category-placeholder": "Category me jorro...",
+       "mw-widgets-usersmultiselect-placeholder": "Aur jorro ...",
+       "date-range-from": "Ii taarik se:",
+       "date-range-to": "Ii taarik talak:",
        "sessionmanager-tie": "Cannot combine multiple request authentication types: $1.",
        "sessionprovider-generic": "$1 sessions",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "cookie-based sessions",
        "restrictionsfield-label": "Allowed IP ranges:",
        "restrictionsfield-help": "One IP address or CIDR range per line. To enable everything, use:<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "badlao $1",
-       "pageid": "panna ID $1"
+       "pageid": "panna ID $1",
+       "rawhtml-notallowed": "&lt;html&gt; tags ke normal panna ke bahaar nai kaam me laawa jaae sake hai.",
+       "gotointerwiki": "Leaving {{SITENAME}}",
+       "gotointerwiki-invalid": "Specified title valid nai hai.",
+       "gotointerwiki-external": "Aap {{SITENAME}} ke chhorr ke [[$2]] pe jaae waala hai, jon ki duusra website hai.\n\n'''[$1 Continue to $1]'''",
+       "undelete-cantedit": "Aap ii panna ke undelete nai kare saktaa hai, kaaheki aap ke ii panna ke badle ke adhikaar nai hai.",
+       "undelete-cantcreate": "Aap ii panna ke undelete nai kare saktaa hai, kaaheki aap ke ii naam ke koi panna nai hai aur aap ke ii panna ke banae ke adhikaar nai hai.",
+       "pagedata-title": "Panna ke data",
+       "pagedata-text": "Ii panna aur panna ke data interface provide kare hai. Meharbaani kar ke, URL me panna ke title, subpage syntax ke kaam me laae ke, likho\n* Content negotiation applies based on you client's Accept header. This means that the page data will be provided in the format preferred by your client.",
+       "pagedata-not-acceptable": "No matching format found. Supported MIME types: $1",
+       "pagedata-bad-title": "Invalid title: $1."
 }
index 0362e77..32f9a92 100644 (file)
        "recentchanges-legend-newpage": "Nova stranica",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "Prikaži",
+       "rcfilters-legend-heading": "<strong>Popis kratica:</strong>",
+       "rcfilters-other-review-tools": "<strong>Ostali alati za pregledavanje:</strong>",
        "rcfilters-activefilters": "Aktivni filtri",
        "rcfilters-advancedfilters": "Napredni filtri",
        "rcfilters-quickfilters": "Spremljeni filtri",
        "emailmessage": "Poruka:",
        "emailsend": "Pošalji",
        "emailccme": "Pošalji mi e-mailom kopiju moje poruke.",
-       "emailccsubject": "Kopija Vaše poruke suradniku $1: $2",
+       "emailccsubject": "Kopija Vaše poruke za $1: $2",
        "emailsent": "E-poruka je poslana!",
        "emailsenttext": "Vaša poruka je poslana.",
        "emailuserfooter": "Ovu je e-poruku {{GENDER:$1|poslao suradnik|poslala suradnica}} $1 {{GENDER:$2|suradniku $2|suradnici $2}} uporabom mogućnosti \"{{int:emailuser}}\" s projekta {{SITENAME}}. Ukoliko {{GENDER:$2|odgovorite}} na tu e-poruku, {{GENDER:$2|Vaša}} će poruka biti izravno poslana {{GENDER:$1|izvornom pošiljatelju}}, otkrivajući pritom {{GENDER:$2|Vašu}} adresu e-pošte {{GENDER:$1|pošiljatelju|pošiljateljici}}.",
index 0c75f3a..5265274 100644 (file)
        "rcfilters-savedqueries-new-name-label": "Név",
        "rcfilters-savedqueries-new-name-placeholder": "Írd le a szűrő célját.",
        "rcfilters-savedqueries-apply-label": "Gyors hivatkozás létrehozása",
+       "rcfilters-savedqueries-apply-and-setdefault-label": "Alapértelmezett szűrő készítése",
        "rcfilters-savedqueries-cancel-label": "Mégse",
        "rcfilters-savedqueries-add-new-title": "Szűrők mentése gyors hivatkozásként",
        "rcfilters-restore-default-filters": "Alapértelmezett szűrők visszaállítása",
        "rcfilters-invalid-filter": "Érvénytelen szűrő",
        "rcfilters-empty-filter": "Nincs aktív szűrő. Minden közreműködés látható.",
        "rcfilters-filterlist-title": "Szűrők",
-       "rcfilters-filterlist-whatsthis": "Mi ez?",
+       "rcfilters-filterlist-whatsthis": "Hogy működnek?",
        "rcfilters-filterlist-feedbacklink": "Visszajelzés küldése az új (beta) szűrőkről",
        "rcfilters-highlightbutton-title": "Kiemelt találatok",
        "rcfilters-highlightmenu-title": "Válassz egy színt",
        "rcfilters-filter-user-experience-level-unregistered-label": "Nem regisztrált",
        "rcfilters-filter-user-experience-level-unregistered-description": "Nem bejelentkezett szerkesztők.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Újoncok",
-       "rcfilters-filter-user-experience-level-newcomer-description": "Kevesebb mint 10 szerkesztés és 4 nap aktivitás.",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Regisztrált szerkesztők kevesebb, mint 10 szerkesztéssel és 4 nap aktivitással.",
        "rcfilters-filter-user-experience-level-learner-label": "Tanulók",
-       "rcfilters-filter-user-experience-level-learner-description": "Több tapasztalat egy „újoncnál”, de kevesebb egy „tapasztalt szerkesztőnél”.",
+       "rcfilters-filter-user-experience-level-learner-description": "Regisztrált szerkesztők „újonc” és „tapasztalt szerkesztő” közé eső tapasztalattal.",
        "rcfilters-filter-user-experience-level-experienced-label": "Tapasztalt szerkesztők",
-       "rcfilters-filter-user-experience-level-experienced-description": "Több mint 30 nap aktivitás és 500 szerkesztés.",
+       "rcfilters-filter-user-experience-level-experienced-description": "Regisztrált szerkesztők több, mint 30 nap aktivitással és 500 szerkesztéssel.",
        "rcfilters-filtergroup-automated": "Automatikus szerkesztések",
        "rcfilters-filter-bots-label": "Bot",
        "rcfilters-filter-bots-description": "Automatizált eszközök szerkesztései.",
index af746fb..f7c0690 100644 (file)
        "rcfilters-legend-heading": "<strong>Lista de abbreviationes:</strong>",
        "rcfilters-activefilters": "Filtros active",
        "rcfilters-advancedfilters": "Filtros avantiate",
+       "rcfilters-limit-title": "Cambiamentos a monstrar",
+       "rcfilters-limit-shownum": "Monstrar le ultime $1 cambiamentos",
+       "rcfilters-days-title": "Dies recente",
+       "rcfilters-hours-title": "Horas recente",
+       "rcfilters-days-show-days": "$1 {{PLURAL:$1|die|dies}}",
+       "rcfilters-days-show-hours": "$1 {{PLURAL:$1|hora|horas}}",
        "rcfilters-quickfilters": "Filtros salveguardate",
        "rcfilters-quickfilters-placeholder-title": "Nulle ligamine salveguardate ancora",
        "rcfilters-quickfilters-placeholder-description": "Pro salveguardar tu filtros pro uso posterior, clicca sur le icone marcapaginas in le area Filtro Active hic infra.",
        "rcfilters-invalid-filter": "Filtro non valide",
        "rcfilters-empty-filter": "Nulle filtro active. Tote le contributiones es monstrate.",
        "rcfilters-filterlist-title": "Filtros",
-       "rcfilters-filterlist-whatsthis": "Que es isto?",
+       "rcfilters-filterlist-whatsthis": "Como functiona istes?",
        "rcfilters-filterlist-feedbacklink": "Da nos tu opinion sur le nove filtros (in beta)",
        "rcfilters-highlightbutton-title": "Colorar le resultatos",
        "rcfilters-highlightmenu-title": "Selige un color",
        "rcfilters-filter-editsbyself-description": "Tu proprie contributiones.",
        "rcfilters-filter-editsbyother-label": "Modificationes facite per alteres",
        "rcfilters-filter-editsbyother-description": "Tote le modificationes excepte le tues.",
-       "rcfilters-filtergroup-userExpLevel": "Nivello de experientia (solmente pro usatores registrate)",
+       "rcfilters-filtergroup-userExpLevel": "Registration e experientia del usator",
        "rcfilters-filter-user-experience-level-registered-label": "Registrate",
        "rcfilters-filter-user-experience-level-registered-description": "Redactores que ha aperite session.",
        "rcfilters-filter-user-experience-level-unregistered-label": "Non registrate",
        "rcfilters-filter-user-experience-level-unregistered-description": "Redactores que non ha aperite session.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Novicios",
-       "rcfilters-filter-user-experience-level-newcomer-description": "Minus de 10 modificationes e 4 dies de activitate.",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Redactores registrate con minus de 10 modificationes e 4 dies de activitate.",
        "rcfilters-filter-user-experience-level-learner-label": "Apprentisses",
-       "rcfilters-filter-user-experience-level-learner-description": "Plus experientia que \"Novicios\" ma minus que \"Usatores con experientia\".",
+       "rcfilters-filter-user-experience-level-learner-description": "Redactores registrate con experientia inter \"Novicios\" e \"Usatores con experientia\".",
        "rcfilters-filter-user-experience-level-experienced-label": "Usatores con experientia",
-       "rcfilters-filter-user-experience-level-experienced-description": "Plus de 30 dies de activitate e 500 modificationes.",
+       "rcfilters-filter-user-experience-level-experienced-description": "Redactores registrate con plus de 500 modificationes e 30 dies de activitate.",
        "rcfilters-filtergroup-automated": "Contributiones automatisate",
        "rcfilters-filter-bots-label": "Robot",
        "rcfilters-filter-bots-description": "Modificationes facite per instrumentos automatisate.",
        "rcfilters-hideminor-conflicts-typeofchange-global": "Le filtro \"Modificationes minor\" es in conflicto con un o plure filtros \"Typo de cambiamento\", perque certe typos de cambiamento non pote esser assignate como \"minor\". Le filtros in conflicto es marcate in le area \"Filtros active\" supra.",
        "rcfilters-hideminor-conflicts-typeofchange": "Certe typos de cambiamento non pote esser assignate como \"minor\", dunque iste filtro es in conflicto con le sequente filtros \"Typo de cambiamento\": $1",
        "rcfilters-typeofchange-conflicts-hideminor": "Iste filtro \"Typo de cambiamento\" es in conflicto con le filtro \"Modificationes minor\". Certe typos de cambiamento non pote esser assignate como \"minor\".",
-       "rcfilters-filtergroup-lastRevision": "Ultime version",
+       "rcfilters-filtergroup-lastRevision": "Ultime versiones",
        "rcfilters-filter-lastrevision-label": "Ultime version",
-       "rcfilters-filter-lastrevision-description": "Le modification le plus recente de un pagina.",
-       "rcfilters-filter-previousrevision-label": "Versiones precedente",
-       "rcfilters-filter-previousrevision-description": "Tote le modificationes que non es le modification le plus recente de un pagina.",
+       "rcfilters-filter-lastrevision-description": "Solmente le modification le plus recente de un pagina.",
+       "rcfilters-filter-previousrevision-label": "Non le ultime version",
+       "rcfilters-filter-previousrevision-description": "Tote le cambiamentos que non es le \"ultime version\".",
        "rcfilters-filter-excluded": "Excludite",
        "rcfilters-tag-prefix-namespace-inverted": "<strong>:non</strong> $1",
        "rcfilters-view-tags": "Modificationes con etiquettas",
        "fileduplicatesearch-noresults": "Nulle file con nomine \"$1\" trovate.",
        "specialpages": "Paginas special",
        "specialpages-note-top": "Legenda",
-       "specialpages-note": "* Paginas special normal.\n* <span class=\"mw-specialpagerestricted\">Paginas special restringite.</span>",
        "specialpages-group-maintenance": "Reportos de mantenentia",
        "specialpages-group-other": "Altere paginas special",
        "specialpages-group-login": "Aperir session / crear conto",
index cfd6bdf..cc4ca7e 100644 (file)
@@ -53,7 +53,8 @@
                        "Presidenvolksraad",
                        "Hidayatsrf",
                        "MF-Warburg",
-                       "Rachmat04"
+                       "Rachmat04",
+                       "Arifpedia"
                ]
        },
        "tog-underline": "Garis bawahi pranala:",
        "rcfilters-filterlist-noresults": "Tidak ada penyaring ditemukan",
        "rcfilters-noresults-conflict": "Hasil tidak ditemukan karena kriteria pencariannya bertentangan",
        "rcfilters-state-message-subset": "Filter ini tidak akan berpengaruh karena hasilnya disertakan oleh {{PLURAL:$2|filter}} berikut yang lebih luas (coba soroti untuk membedakannya): $1",
-       "rcfilters-filtergroup-registration": "Pendaftaran pengguna",
-       "rcfilters-filter-registered-label": "Terdaftar",
-       "rcfilters-filter-registered-description": "Penyunting masuk log",
-       "rcfilters-filter-unregistered-label": "Tidak terdaftar",
-       "rcfilters-filter-unregistered-description": "Penyunting yang tidak masuk log",
        "rcfilters-filtergroup-authorship": "Kontribusi pengarang",
        "rcfilters-filter-editsbyself-label": "Suntingan Anda",
        "rcfilters-filter-editsbyself-description": "Kontribusi saya",
        "rcfilters-filter-editsbyother-label": "Suntingan orang lain",
        "rcfilters-filter-editsbyother-description": "Semua perubahan kecuali perubahan milik sendiri.",
        "rcfilters-filtergroup-userExpLevel": "Level pengalaman (hanya untuk pengguna terdaftar)",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Penyaringan mahir hanya mencari pengguna terdaftar, sehingga penyaringan ini bertentangan dengan penyaringan \"pengguna tidak terdaftar\".",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Penyaringan \"pengguna tidak terdaftar\" bertentangan dengan satu atau lebih penyaringan Mahir, yang mana hanya mencari pengguna terdaftar. Penyaringan yang bertentangan ini ditandai di area Penyaringan Aktif, di atas.",
+       "rcfilters-filter-user-experience-level-registered-label": "Terdaftar",
+       "rcfilters-filter-user-experience-level-registered-description": "Penyunting masuk log",
+       "rcfilters-filter-user-experience-level-unregistered-label": "Tidak terdaftar",
+       "rcfilters-filter-user-experience-level-unregistered-description": "Penyunting yang tidak masuk log",
        "rcfilters-filter-user-experience-level-newcomer-label": "Pendatang baru",
        "rcfilters-filter-user-experience-level-newcomer-description": "Kurang dari 10 suntingan dan aktivitas selama 4 hari.",
        "rcfilters-filter-user-experience-level-learner-label": "Pelajar",
        "enotif_lastdiff": "Untuk melihat perubahan ini, lihat $1",
        "enotif_anon_editor": "pengguna anonim $1",
        "enotif_body": "Halo $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nRingkasan suntingan: $PAGESUMMARY $PAGEMINOREDIT\n\nHubungi penyunting:\nsurel: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nKami tidak akan mengirim pemberitahuan lain bila ada perubahan lebih lanjut sampai Anda mengunjungi halaman ini ketika masuk log. Anda juga dapat menyetel ulang tanda pemberitahuan untuk semua halaman pantauan pada daftar pantauan Anda.\n\nSistem pemberitahuan situs {{SITENAME}} Anda yang ramah\n\n--\nUntuk mengubah pengaturan pemberitahuan surel, kunjungi\n{{canonicalurl:{{#special:Preferences}}}}\n\nUntuk mengubah setelan daftar pantauan, kunjungi\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nUntuk menghapus halaman dari daftar pantauan, kunjungi\n$UNWATCHURL\n\nUmpan balik dan bantuan lebih lanjut:\n$HELPPAGE",
+       "enotif_minoredit": "Ini adalah suntingan kecil.",
        "created": "dibuat",
        "changed": "diubah",
        "deletepage": "Hapus halaman",
        "fileduplicatesearch-noresults": "Tidak ditemukan berkas dengan nama \"$1\".",
        "specialpages": "Halaman istimewa",
        "specialpages-note-top": "Keterangan",
-       "specialpages-note": "* Halaman istimewa normal.\n* <span class=\"mw-specialpagerestricted\">Halaman istimewa terbatas</span> (hanya untuk pengurus).",
        "specialpages-group-maintenance": "Laporan pemeliharaan",
        "specialpages-group-other": "Lain-lain",
        "specialpages-group-login": "Masuk log / mendaftar",
index 18b1110..9b33310 100644 (file)
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "보기",
        "rcfilters-legend-heading": "<strong>약어 목록:</strong>",
+       "rcfilters-other-review-tools": "<strong>다른 검토 도구:</strong>",
        "rcfilters-activefilters": "사용 중인 필터",
        "rcfilters-advancedfilters": "고급 필터",
+       "rcfilters-limit-title": "표시할 변경사항",
        "rcfilters-limit-shownum": "최근 $1개의 변경사항 표시",
+       "rcfilters-days-title": "최근 날",
+       "rcfilters-hours-title": "최근 시간",
        "rcfilters-days-show-days": "$1{{PLURAL:$1|일}}",
        "rcfilters-days-show-hours": "$1{{PLURAL:$1|시간}}",
        "rcfilters-quickfilters": "저장된 필터",
        "rcfilters-savedqueries-new-name-label": "이름",
        "rcfilters-savedqueries-new-name-placeholder": "필터의 목적을 설명하세요",
        "rcfilters-savedqueries-apply-label": "필터 만들기",
+       "rcfilters-savedqueries-apply-and-setdefault-label": "기본 필터 만들기",
        "rcfilters-savedqueries-cancel-label": "취소",
        "rcfilters-savedqueries-add-new-title": "현재의 필터 설정 저장",
        "rcfilters-restore-default-filters": "기본 필터 복구",
        "rcfilters-filter-previousrevision-description": "\"최신판\"이 아닌 모든 변경사항입니다.",
        "rcfilters-filter-excluded": "제외됨",
        "rcfilters-tag-prefix-namespace-inverted": "<strong>:아님</strong> $1",
+       "rcfilters-exclude-button-off": "선택 제외",
        "rcfilters-view-tags": "태그된 편집",
        "rcfilters-view-namespaces-tooltip": "이름공간으로 결과 필터",
        "rcfilters-view-tags-tooltip": "편집 태그를 사용하여 결과 필터",
        "pageswithprop-legend": "문서 속성이 있는 문서",
        "pageswithprop-text": "이 문서는 특정 문서 속성을 사용한 문서를 나타냅니다.",
        "pageswithprop-prop": "속성 이름:",
+       "pageswithprop-reverse": "역순으로 정렬",
+       "pageswithprop-sortbyvalue": "속성 값으로 정렬",
        "pageswithprop-submit": "찾기",
        "pageswithprop-prophidden-long": "숨겨진 긴 텍스트 속성 값 ($1)",
        "pageswithprop-prophidden-binary": "숨겨진 이진 속성 값 ($1)",
        "enotif_lastdiff": "이 바뀜을 보려면 $1을 보세요",
        "enotif_anon_editor": "익명 사용자 $1",
        "enotif_body": "$WATCHINGUSERNAME님,\n\n$PAGEINTRO $NEWPAGE\n\n편집 요약: $PAGESUMMARY $PAGEMINOREDIT\n\n다음을 통해 편집자와 대화를 할 수 있습니다:\n이메일: $PAGEEDITOR_EMAIL\n위키: $PAGEEDITOR_WIKI\n\n로그인한 상태에서 이 문서를 열기 전에는 다른 알림 이메일을 더 이상 보내지 않습니다. 모든 주시 문서의 알림 딱지를 초기화할 수도 있습니다.\n\n{{SITENAME}} 알림 시스템\n\n--\n이메일 알림 설정을 바꾸시려면 이곳을 방문해주세요:\n{{canonicalurl:{{#special:Preferences}}}}\n\n주시문서 설정을 바꾸려면 다음을 사용하세요:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\n주시문서에서 이 문서를 지우려면 이곳을 방문해주세요:\n$UNWATCHURL\n\n피드백 및 추가 도움 얻기:\n$HELPPAGE",
+       "enotif_minoredit": "사소한 편집입니다",
        "created": "만들었",
        "changed": "바꾸었",
        "deletepage": "문서 삭제",
        "fileduplicatesearch-noresults": "\"$1\"이라는 이름을 가진 파일이 없습니다.",
        "specialpages": "특수 문서 목록",
        "specialpages-note-top": "범례",
+       "specialpages-note-restricted": "* 일반 특수문서.\n* <span class=\"mw-specialpagerestricted\">제한된 특수문서.</span>",
        "specialpages-group-maintenance": "관리용 목록",
        "specialpages-group-other": "다른 특수 문서",
        "specialpages-group-login": "로그인 / 계정 만들기",
        "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 콘텐츠\n 모델을 변경하는] 편집",
+       "tag-mw-contentmodelchange-description": "페이지의 [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel 콘텐츠 모델을 변경하는] 편집",
        "tags-title": "태그",
        "tags-intro": "이 문서는 소프트웨어에서 편집에 대해 표시하는 태그와 그 의미를 설명하는 목록입니다.",
        "tags-tag": "태그 이름",
index 874f2b5..bfc7674 100644 (file)
        "enotif_lastdiff": "Fir dës Ännerung ze gesinn, kuckt $1",
        "enotif_anon_editor": "Anonyme Benotzer $1",
        "enotif_body": "Léiwe $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nResumé vum Mataarbechter: $PAGESUMMARY $PAGEMINOREDIT\n\nDen Editeur kontaktéieren:\nE-Mail: $PAGEEDITOR_EMAIL\nWiki: $PAGEEDITOR_WIKI\n\nEt gi soulaang keng weider Maile geschéckt, bis Dir d'Säit nees emol besicht hutt wärend deem Dir ageloggt sidd.\nOp Ärer Iwwerwaachungslëscht kënnt Dir all Noriichtemarkeren zesummen zrécksetzen.\n\n\nÄre frëndleche(n) {{SITENAME}} Noriichtessystem\n\n--\n\nFir d'Astellungen op Ären E-Mailnoriichten z'änneren, besicht w.e.g.\n{{canonicalurl:{{#special:Preferences}}}}\n\n\nFir d'Astellunge vun Ärer Iwwerwaachungslëscht z'änneren, besicht w.e.g.\n{{canonicalurl:Special:Watchlist/edit}}\n\nFeedback a weider Hëllef:\n$HELPPAGE",
+       "enotif_minoredit": "Dëst ass eng kleng Ännerung",
        "created": "gemaach",
        "changed": "geännert",
        "deletepage": "Säit läschen",
index 5a81bab..93bbc50 100644 (file)
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Прикажи",
        "rcfilters-legend-heading": "<strong>Список на кратенки:</strong>",
+       "rcfilters-other-review-tools": "<strong>Други алатки за проверка:</strong>",
        "rcfilters-activefilters": "Активни филтри",
        "rcfilters-advancedfilters": "Напредни филтри",
        "rcfilters-limit-title": "Промени за приказ",
        "rcfilters-savedqueries-new-name-label": "Назив",
        "rcfilters-savedqueries-new-name-placeholder": "Опишете ја намената на филтерот",
        "rcfilters-savedqueries-apply-label": "Создај филтер",
+       "rcfilters-savedqueries-apply-and-setdefault-label": "Создај стандарден филтер",
        "rcfilters-savedqueries-cancel-label": "Откажи",
        "rcfilters-savedqueries-add-new-title": "Зачувај тековни филтерски поставки",
        "rcfilters-restore-default-filters": "Поврати основни филтри",
        "pageswithprop-legend": "Страници со својство",
        "pageswithprop-text": "На страницава се наведени страници што користат дадено својство.",
        "pageswithprop-prop": "Име на својството:",
+       "pageswithprop-reverse": "Подреди обратно",
+       "pageswithprop-sortbyvalue": "Подреди по својствена вредност",
        "pageswithprop-submit": "Дај",
        "pageswithprop-prophidden-long": "долгата вредност на текстуалното својство е скриена ($1)",
        "pageswithprop-prophidden-binary": "бинарната вредност на својството за долгиот текст е скриена  ($1)",
        "enotif_lastdiff": "Оваа промена можете да ја видите на $1",
        "enotif_anon_editor": "анонимен корисник $1",
        "enotif_body": "Почитуван(а) $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\n$NEWPAGE\n\nОпис од уредникот: $PAGESUMMARY $PAGEMINOREDIT\n\nКонакт на уредникот:\nе-пошта: $PAGEEDITOR_EMAIL\nвики: $PAGEEDITOR_WIKI\n\nПовеќе нема да добивате известувања во случај на други понатамошни активности, освен ако не ја посетите оваа страница додека сте најавени.\nМожете и да ги поништите ознаките за известување за сите набљудувани страници на вашиот список на набљудувања.\n\nИзвестителниот систем на {{SITENAME}}\n\n--\nАко сакате да ги измените нагодувањата за известување по е-пошта, посетете ја страницата\n{{canonicalurl:{{#special:Preferences}}}}\n\nДоколку сакате да ги измените нагодувањата на списокот на набљудувања, посетете ја страницата\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nЗа да ја избришете страницата од списокот на набљудувања, посетете ја страницата\n$UNWATCHURL\n\nВаши мислења, прашања и повеќе помош:\n$HELPPAGE",
+       "enotif_minoredit": "Ова е ситна промена",
        "created": "создадена",
        "changed": "изменета",
        "deletepage": "Избриши страница",
index 2763df2..b927233 100644 (file)
        "recentchanges-legend-plusminus": "«(±123)»",
        "recentchanges-submit": "Vis",
        "rcfilters-legend-heading": "<strong>Liste over forkortelser:</strong>",
+       "rcfilters-other-review-tools": "<strong>Andre gjennomgangsverktøy:</strong>",
        "rcfilters-activefilters": "Aktive filtre",
        "rcfilters-advancedfilters": "Avanserte filtre",
        "rcfilters-limit-title": "Endringer som skal vises",
        "rcfilters-savedqueries-new-name-label": "Navn",
        "rcfilters-savedqueries-new-name-placeholder": "Beskriv formålet til filteret",
        "rcfilters-savedqueries-apply-label": "Opprett filter",
+       "rcfilters-savedqueries-apply-and-setdefault-label": "Opprett standardfilter",
        "rcfilters-savedqueries-cancel-label": "Avbryt",
        "rcfilters-savedqueries-add-new-title": "Lagre de gjeldende filterinnstillingene",
        "rcfilters-restore-default-filters": "Gjenopprett standardfiltre",
        "rcfilters-filter-editsbyself-description": "Dine egne bidrag.",
        "rcfilters-filter-editsbyother-label": "Endringer av andre",
        "rcfilters-filter-editsbyother-description": "Alle endringer utenom dine egne.",
-       "rcfilters-filtergroup-userExpLevel": "Erfaringsnivå (kun for registrerte brukere)",
+       "rcfilters-filtergroup-userExpLevel": "Brukerregistrering og -erfaring",
        "rcfilters-filter-user-experience-level-registered-label": "Registrerte",
        "rcfilters-filter-user-experience-level-registered-description": "Innloggede brukere.",
        "rcfilters-filter-user-experience-level-unregistered-label": "Uregistrerte",
        "rcfilters-hideminor-conflicts-typeofchange-global": "Filteret for «Mindre endringer» konflikterer med ett eller flere endringstypefiltre, fordi visse endringstyper ikke kan merkes som «mindre». De konflikterende fultrene merkes i området for aktive filtre ovenfor.",
        "rcfilters-hideminor-conflicts-typeofchange": "Visse endringstyper kan ikke merkes som «mindre», så dette filteret konflikterer med følgende endringstypefiltre: $1",
        "rcfilters-typeofchange-conflicts-hideminor": "Dette endringstypefilteret konflikterer med filteret for «Mindre endringer». Visse endringstyper kan ikke merkes som «mindre».",
-       "rcfilters-filtergroup-lastRevision": "Siste revisjon",
+       "rcfilters-filtergroup-lastRevision": "Siste revisjoner",
        "rcfilters-filter-lastrevision-label": "Siste revisjon",
-       "rcfilters-filter-lastrevision-description": "Den nyeste endringen av en side.",
-       "rcfilters-filter-previousrevision-label": "Tidligere revisjoner",
-       "rcfilters-filter-previousrevision-description": "Alle endringer som ikke er den nyeste endringen av en side.",
+       "rcfilters-filter-lastrevision-description": "Kun den nyeste endringen av en side.",
+       "rcfilters-filter-previousrevision-label": "Ikke den siste versjonen",
+       "rcfilters-filter-previousrevision-description": "Alle endringer som ikke er den nyeste versjonen.",
        "rcfilters-filter-excluded": "Ekskludert",
        "rcfilters-tag-prefix-namespace-inverted": "<strong>:not</strong> $1",
        "rcfilters-exclude-button-off": "Ekskluder de valgte",
        "pageswithprop-legend": "Sider med en sideverdi",
        "pageswithprop-text": "Denne siden lister opp sider som bruker en viss sideverdi.",
        "pageswithprop-prop": "Verdinavn:",
+       "pageswithprop-reverse": "Sorter i omvendt rekkefølge",
+       "pageswithprop-sortbyvalue": "Sorter etter egenskapsverdi",
        "pageswithprop-submit": "Gå",
        "pageswithprop-prophidden-long": "skjult verdi for egenskap langtekst ($1)",
        "pageswithprop-prophidden-binary": "skjult verdi for binæregenskap ($1)",
        "enotif_lastdiff": "Se $1 for å se denne endringen.",
        "enotif_anon_editor": "anonym bruker $1",
        "enotif_body": "Kjære $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nRedigeringssammendrag: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt brukeren:\ne-post: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nDet vil ikke komme flere varsler om endringer på denne siden med mindre du besøker den mens du er innlogget. Du kan også fjerne varslingsflagg for alle overvåkede sider i overvåkningslisten din.\n\n             Ditt vennlige varslingssystem for {{SITENAME}}\n\n--\nFor å endre innstillingene for e-postvarsler, se\n{{canonicalurl:{{#special:Preferences}}}}\n\nFor å endre innstillingene for overvåkningslisten, se\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nFor å slette en side fra overvåkningssiden, se\n$UNWATCHURL\n\nTilbakemelding og videre assistanse:\n$HELPPAGE",
+       "enotif_minoredit": "Dette er en mindre endring",
        "created": "opprettet",
        "changed": "endret",
        "deletepage": "Slett side",
        "delete-warning-toobig": "Denne siden har en stor redigeringshistorikk, med over {{PLURAL:$1|$1&nbsp;revisjon|$1&nbsp;revisjoner}}. Sletting av denne siden kan forstyrre databasen til {{SITENAME}}; vær varsom.",
        "deleteprotected": "Du kan ikke slette denne siden fordi den er beskyttet.",
        "deleting-backlinks-warning": "<strong>Advarsel:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|Andre sider]] lenker til eller inkluderer siden du er i ferd med å slette.",
+       "deleting-subpages-warning": "<strong>Advarsel:</strong> Siden du er i ferd med å slette har [[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|en underside|$1 undersider|51=over 50 undersider}}]].",
        "rollback": "Fjern redigeringer",
        "rollbacklink": "tilbakestill",
        "rollbacklinkcount": "tilbakestill {{PLURAL:$1|én endring|$1 endringer}}",
        "undeletepage": "Se og gjenopprett slettede sider",
        "undeletepagetitle": "'''Følgende innhold er slettede revisjoner av [[:$1]].'''",
        "viewdeletedpage": "Vis slettede sider",
-       "undeletepagetext": "Følgende {{PLURAL:$1|side|sider}} er slettet, men finnes fortsatt i arkivet og kan gjenopprettes. Arkivet blir periodevis slettet.",
+       "undeletepagetext": "Følgende {{PLURAL:$1|side|sider}} er slettet, men finnes fortsatt i arkivet og kan gjenopprettes. Arkivet kan periodevis bli slettet.",
        "undelete-fieldset-title": "Gjenopprett revisjoner",
        "undeleteextrahelp": "For å gjenopprette hele sidens historikk, la alle boksene være tomme og klikk '''''{{int:undeletebtn}}'''''.\nFor å gjenopprette kun deler, kryss av boksene for revisjonene du vil gjenopprette og klikk '''''{{int:undeletebtn}}'''''.",
        "undeleterevisions": "{{PLURAL:$1|Én revisjon|$1 revisjoner}} slettet",
        "fileduplicatesearch-noresults": "Ingen ved navn «$1» funnet.",
        "specialpages": "Spesialsider",
        "specialpages-note-top": "Tegnforklaring",
+       "specialpages-note-restricted": "* Vanlige spesialsider.\n* <span class=\"mw-specialpagerestricted\">Spesialsider med begrenset tilgang.</span>",
        "specialpages-group-maintenance": "Vedlikeholdsrapporter",
        "specialpages-group-other": "Andre spesialsider",
        "specialpages-group-login": "Innlogging / opprette bruker",
index 99041d4..75d3698 100644 (file)
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "Weergeven",
        "rcfilters-legend-heading": "<strong>Lijst met afkortingen:</strong>",
+       "rcfilters-other-review-tools": "<strong>Andere controle hulmiddelen:</strong>",
        "rcfilters-activefilters": "Actieve filters",
        "rcfilters-advancedfilters": "Geavanceerde filters",
        "rcfilters-limit-title": "Wijzigingen om te tonen",
        "rcfilters-savedqueries-new-name-label": "Naam",
        "rcfilters-savedqueries-new-name-placeholder": "Beschrijf het doel van het filter",
        "rcfilters-savedqueries-apply-label": "Filter aanmaken",
+       "rcfilters-savedqueries-apply-and-setdefault-label": "Standaard filter aanmaken",
        "rcfilters-savedqueries-cancel-label": "Annuleren",
        "rcfilters-savedqueries-add-new-title": "Huidige filter instellingen opslaan",
        "rcfilters-restore-default-filters": "Standaard filters terugzetten",
        "rcfilters-filter-categorization-description": "Categorisatie van pagina's tonen.",
        "rcfilters-filter-logactions-label": "Geregistreerde acties",
        "rcfilters-filter-logactions-description": "Administratieve handelingen, account creaties, pagina verwijderingen, uploads…",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "Het \"Kleine bewerkingen\" filter conflicteert met een of meerdere soorten wijzigingenfilters, omdat bepaalde soorten wijzigingen niet als \"klein\" kunnen worden aangewezen. De conflicterende filters zijn gemarkeerd in het Actieve filter vak hierboven.",
        "rcfilters-hideminor-conflicts-typeofchange": "Bepaalde soorten wijzigingen kunnen niet worden aangemerkt als \"klein\", dus dit filter is in conflict met de volgende soorten wijzigingenfilters: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Dit type wijzigingsfilter is in conflict met het \"Kleine bewerkingen\" filter. Bepaalde type wijzigingen kunnen niet als \"klein\" worden aangewezen.",
        "rcfilters-filtergroup-lastRevision": "Laatste versies",
        "rcfilters-filter-lastrevision-label": "Laatste versie",
        "rcfilters-filter-lastrevision-description": "Alleen de meest recente wijziging aan de pagina.",
        "pageswithprop-legend": "Pagina's met een pagina-eigenschap",
        "pageswithprop-text": "Op deze pagina worden pagina's weergegeven met een bepaalde pagina-eigenschap.",
        "pageswithprop-prop": "Naam van de eigenschap:",
+       "pageswithprop-reverse": "Sorteren met omgekeerde volgorde",
+       "pageswithprop-sortbyvalue": "Sorteren op eigenschapwaarde",
        "pageswithprop-submit": "OK",
        "pageswithprop-prophidden-long": "lange teksteigenschapswaarde verborgen ($1)",
        "pageswithprop-prophidden-binary": "binaire eigenschapswaarde verborgen ($1)",
        "enotif_lastdiff": "Om deze wijziging te bekijken, ga naar $1",
        "enotif_anon_editor": "anonieme gebruiker $1",
        "enotif_body": "Beste $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nSamenvatting van de wijziging: $PAGESUMMARY $PAGEMINOREDIT\n\nContactgegevens van de auteur:\nE-mailadres: $PAGEEDITOR_EMAIL\nWiki: $PAGEEDITOR_WIKI\n\nTenzij u deze pagina bezoekt, komen er geen verdere berichten. Als u bent aangemeld, kunt u op uw volglijst voor alle gevolgde pagina's de waarschuwingsinstellingen opschonen.\n\nGroet van uw {{SITENAME}}-waarschuwingssysteem.\n\n--\nU kunt uw e-mailinstellingen wijzigen op:\n{{canonicalurl:{{#special:Preferences}}}}\n\nU kunt uw volglijstinstellingen wijzigen op:\n{{canonicalurl:Special:Watchlist/edit}}\n\nU kunt de pagina van uw volglijst verwijderen via de volgende koppeling:\n$UNWATCHURL\n\nTerugkoppeling en verdere assistentie:\n$HELPPAGE",
+       "enotif_minoredit": "Dit is een kleine bewerking",
        "created": "aangemaakt",
        "changed": "gewijzigd",
        "deletepage": "Pagina verwijderen",
index c6c66f0..ee94b73 100644 (file)
        "page_first": "fyrste",
        "page_last": "siste",
        "histlegend": "Merk av for dei versjonane du vil samanlikne og trykk [Enter] eller klikk på knappen nedst på sida.<br />Forklaring: (no) = skilnad frå den noverande versjonen, (førre) = skilnad frå den førre versjonen, <b>s</b> = småplukk",
-       "history-fieldset-title": "Finn dato",
+       "history-fieldset-title": "Søk etter versjonar",
        "history-show-deleted": "Berre sletta",
        "histfirst": "eldste",
        "histlast": "nyaste",
        "recentchanges-submit": "Vis",
        "rcfilters-activefilters": "Aktive filter",
        "rcfilters-advancedfilters": "Avanserte filter",
+       "rcfilters-limit-title": "Tal endringar som skal visast",
+       "rcfilters-limit-shownum": "Vis dei siste $1 endringane",
+       "rcfilters-days-title": "Dei siste dagane",
+       "rcfilters-hours-title": "Dei siste timane",
+       "rcfilters-days-show-days": "{{PLURAL:$1|Éin dag|$1 dagar}}",
        "rcfilters-quickfilters": "Lagra filterinnstillingar",
        "rcfilters-quickfilters-placeholder-title": "Ingen lenkjer er lagra enno",
        "rcfilters-quickfilters-placeholder-description": "For å lagra filterinnstillingane dine og bruka dei på nytt seinare, klikk på bokmerkeikonet i området for aktive filter under.",
        "rcfilters-savedqueries-defaultlabel": "Lagra filter",
        "rcfilters-savedqueries-rename": "Gje nytt namn",
        "rcfilters-savedqueries-new-name-label": "Namn",
+       "rcfilters-savedqueries-new-name-placeholder": "Skildra føremålet med filteret",
        "rcfilters-savedqueries-apply-label": "Lagra innstillingar",
        "rcfilters-savedqueries-add-new-title": "Lagra gjeldande filterinnstillingar",
        "rcfilters-clear-all-filters": "Fjern alle filter",
        "rcfilters-filter-user-experience-level-unregistered-label": "Uregistrerte",
        "rcfilters-filter-user-experience-level-unregistered-description": "Brukarar som ikkje er innlogga.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Nykomarar",
-       "rcfilters-filter-user-experience-level-newcomer-description": "Færre enn 10 endringar og 4 dagar med aktivitet.",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Registrerte brukarar med færre enn 10 endringar og 4 dagar med aktivitet.",
        "rcfilters-filter-user-experience-level-learner-label": "Nybyrjarar",
        "rcfilters-filter-user-experience-level-learner-description": "Meir røynsle enn «Nykomarar», men mindre enn «Røynde brukarar».",
        "rcfilters-filter-user-experience-level-experienced-label": "Røynde brukarar",
-       "rcfilters-filter-user-experience-level-experienced-description": "Meir enn 30 dagar med aktivitet og 500 endringar.",
+       "rcfilters-filter-user-experience-level-experienced-description": "Registrerte brukarar med meir enn 500 endringar og 30 dagar med aktivitet.",
        "rcfilters-filter-bots-label": "Robot",
        "rcfilters-filter-bots-description": "Endringar gjorde med automatiske verktøy.",
        "rcfilters-filter-humans-label": "Menneske (ikkje robot)",
        "rcfilters-filter-minor-description": "Endringar merkte som småplukk av forfattaren.",
        "rcfilters-filter-major-label": "Ikkje småplukk",
        "rcfilters-filter-major-description": "Endringar ikkje merkte som småplukk.",
+       "rcfilters-filter-watchlist-watched-label": "På overvakingslista",
+       "rcfilters-filter-watchlist-watched-description": "Endringar på sider du overvakar",
+       "rcfilters-filter-watchlist-watchednew-description": "Endringar på sider du overvakar som du ikkje har vitja sidan endringane vart gjorde.",
+       "rcfilters-filter-watchlist-notwatched-label": "Ikkje på overvakingslista",
+       "rcfilters-filter-watchlist-notwatched-description": "Alt utanom endringar på sider du overvakar.",
        "rcfilters-filter-pageedits-label": "Sideendringar",
        "rcfilters-filter-pageedits-description": "Endringar av wikiinnhald, diskusjonar, kategoriskildringar ...",
        "rcfilters-filter-newpages-label": "Sideopprettingar",
        "rcfilters-filter-categorization-label": "Kategoriendringar",
        "rcfilters-filter-categorization-description": "Oppføringar av sider som vert lagde til eller fjerna frå katerogiar.",
        "rcfilters-filter-logactions-label": "Loggførte handlingar",
-       "rcfilters-filtergroup-lastRevision": "Siste versjonen",
+       "rcfilters-filtergroup-lastRevision": "Siste versjonane",
+       "rcfilters-filter-lastrevision-label": "Siste versjonen",
+       "rcfilters-filter-lastrevision-description": "Berre den aller siste endringa på ei side.",
+       "rcfilters-filter-previousrevision-label": "Ikkje den siste versjonen",
+       "rcfilters-filter-previousrevision-description": "Alle endringar som ikkje er den siste versjonen.",
+       "rcfilters-filter-excluded": "Utelate",
+       "rcfilters-exclude-button-off": "Utelat dei valde",
        "rcfilters-view-tags": "Endringar med merke",
+       "rcfilters-view-namespaces-tooltip": "Filtrer resultat etter namnerom",
+       "rcfilters-view-tags-tooltip": "Filtrer resultat etter endringsmerke",
        "rcnotefrom": "Nedanfor er endringane gjorde sidan <strong>$2</strong> viste (opp til <strong>$1</strong> stykke)",
        "rclistfrom": "Vis nye endringar sidan $3 $2",
        "rcshowhideminor": "$1 småplukk",
        "watchlistanontext": "Logg inn for å vise eller endre sider på overvakingslista di.",
        "watchnologin": "Ikkje innlogga",
        "addwatch": "↓Legg til i overvakingslista",
-       "addedwatchtext": "Sida «[[:$1]]» er lagd til i [[Special:Watchlist|overvakingslista]] di. Framtidige endringar av henne og den tilhøyrande diskusjonssida hennar vil bli oppførte der.",
+       "addedwatchtext": "«[[:$1]]» og diskusjonssida hennar er lagde til i [[Special:Watchlist|overvakingslista]] di.",
+       "addedwatchtext-talk": "«[[:$1]]» og den tilknytte sida hennar er lagde til i [[Special:Watchlist|overvakingslista di]].",
        "addedwatchtext-short": "Sida «$1» vart lagd til i overvakingslista di.",
        "removewatch": "Fjerna frå overvakingslista",
-       "removedwatchtext": "Sida «[[:$1]]» er fjerna frå [[Special:Watchlist|overvakingslista di]].",
+       "removedwatchtext": "«[[:$1]]» og diskusjonssida hennar er fjerna frå [[Special:Watchlist|overvakingslista]] di.",
+       "removedwatchtext-talk": "«[[:$1]]» og den tilknytte sida hennar er fjerna frå [[Special:Watchlist|overvakingslista di]].",
        "removedwatchtext-short": "Sida «$1» vart fjerna frå overvakingslista di.",
        "watch": "Overvak",
        "watchthispage": "Overvak sida",
        "exbeforeblank": "innhaldet før sida vart tømd var: «$1»",
        "delete-confirm": "Slett «$1»",
        "delete-legend": "Slett",
-       "historywarning": "'''Åtvaring:''' Sida du held på å slette har ein historikk med om lag $1 {{PLURAL:$1|versjon|versjonar}}:",
+       "historywarning": "<strong>Åtvaring:<strong> Sida du held på å slette har ein historikk med $1 {{PLURAL:$1|versjon|versjonar}}:",
        "historyaction-submit": "Vis",
        "confirmdeletetext": "Du held på å varig slette ei side eller eit bilete saman med heile den tilhøyrande historikken frå databasen. Stadfest at du verkeleg vil gjere dette, at du skjønar konsekvensane, og at du gjer dette i tråd med [[{{MediaWiki:Policy-url}}|retningslinene]].",
        "actioncomplete": "Ferdig",
index 61a40b3..97178e7 100644 (file)
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Pokaż",
        "rcfilters-legend-heading": "<strong>Wykaz skrótów:</strong>",
+       "rcfilters-other-review-tools": "<strong>Inne narzędzia do sprawdzania:</strong>",
        "rcfilters-activefilters": "Aktywne filtry",
        "rcfilters-advancedfilters": "Zaawansowane filtry",
        "rcfilters-limit-title": "Zmian do pokazania",
        "rcfilters-savedqueries-new-name-label": "Nazwa",
        "rcfilters-savedqueries-new-name-placeholder": "Opisz przeznaczenie filtra",
        "rcfilters-savedqueries-apply-label": "Utwórz Filtr",
+       "rcfilters-savedqueries-apply-and-setdefault-label": "Utwórz filtr domyślny",
        "rcfilters-savedqueries-cancel-label": "Anuluj",
        "rcfilters-savedqueries-add-new-title": "Zapisz bieżące ustawienia filtrów",
        "rcfilters-restore-default-filters": "Przywróć domyślne filtry",
        "statistics-users-active-desc": "Użytkownicy, którzy byli aktywni w ciągu {{PLURAL:$1|ostatniego dnia|ostatnich $1 dni}}",
        "pageswithprop": "Strony z właściwościami",
        "pageswithprop-legend": "Strony z właściwościami",
-       "pageswithprop-text": "Ta strona zawiera listę stron korzystających z właściwości.",
+       "pageswithprop-text": "Ta strona zawiera listę stron korzystających z określonej właściwości strony.",
        "pageswithprop-prop": "Nazwa właściwości:",
+       "pageswithprop-reverse": "Sortuj w odwrotnej kolejności",
+       "pageswithprop-sortbyvalue": "Sortuj według wartości właściwości",
        "pageswithprop-submit": "Pokaż",
        "pageswithprop-prophidden-long": "długa wartość własności ukryta ($1)",
        "pageswithprop-prophidden-binary": "binarna wartość własności ukryta ($1)",
        "enotif_lastdiff": "Aby obejrzeć tę zmianę, zobacz $1",
        "enotif_anon_editor": "użytkownik anonimowy $1",
        "enotif_body": "Szanowny $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nOpis zmiany: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt do autora:\nmail – $PAGEEDITOR_EMAIL\nwiki – $PAGEEDITOR_WIKI\n\nW przypadku kolejnych zmian nowe powiadomienia nie zostaną wysłane, dopóki nie odwiedzisz tej strony jako zalogowany. Możesz także zresetować wszystkie flagi powiadomień na swojej liście stron obserwowanych.\n\nWiadomość z systemu powiadomień {{GRAMMAR:D.lp|{{SITENAME}}}}\n\n--\nW celu zmiany ustawień swojej listy obserwowanych odwiedź\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nUsunięcie strony z listy obserwowanych możliwe jest na stronie\n$UNWATCHURL\n\nPomoc\n$HELPPAGE",
+       "enotif_minoredit": "To jest drobna zmiana",
        "created": "utworzona",
        "changed": "zmieniona",
        "deletepage": "Usuń stronę",
index 2eaaf0b..13176c1 100644 (file)
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Exibir",
        "rcfilters-legend-heading": "<strong>Lista de abreviaturas:</strong>",
+       "rcfilters-other-review-tools": "<strong>Outras ferramentas de revisão:</strong>",
        "rcfilters-activefilters": "Filtros ativos",
        "rcfilters-advancedfilters": "Filtros avançados",
        "rcfilters-limit-title": "Mudanças para mostrar",
        "rcfilters-savedqueries-new-name-label": "Nome",
        "rcfilters-savedqueries-new-name-placeholder": "Descreva a finalidade do filtro",
        "rcfilters-savedqueries-apply-label": "Criar filtro",
+       "rcfilters-savedqueries-apply-and-setdefault-label": "Criar filtro padrão",
        "rcfilters-savedqueries-cancel-label": "Cancelar",
        "rcfilters-savedqueries-add-new-title": "Gravar configurações atuais de filtros",
        "rcfilters-restore-default-filters": "Restaurar filtros padrão",
        "pageswithprop-legend": "Páginas com uma propriedade de página",
        "pageswithprop-text": "Esta página lista as páginas que usam uma determinada propriedade de página.",
        "pageswithprop-prop": "Nome da propriedade:",
+       "pageswithprop-reverse": "Classificar em ordem inversa",
+       "pageswithprop-sortbyvalue": "Classificar por valor da propriedade",
        "pageswithprop-submit": "Ir",
        "pageswithprop-prophidden-long": "Longa propriedade de texto oculta ($1)",
        "pageswithprop-prophidden-binary": "Valor de propriedade binária oculta ($1)",
        "enotif_lastdiff": "Acesse $1 para ver esta alteração.",
        "enotif_anon_editor": "usuário anônimo $1",
        "enotif_body": "{{GENDER:$WATCHINGUSERNAME|Caro|Cara|Caro(a)}},\n\n$PAGEINTRO $NEWPAGE\n\nResumo do editor: $PAGESUMMARY $PAGEMINOREDIT\n\nContate o editor:\ne-mail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nAté que visite esta página, você não receberá mais notificações das alterações futuras.\nVocê pode também reativar as notificações para todas páginas na sua lista de páginas vigiadas.\n\nO seu sistema de notificação amigável da {{SITENAME}}\n\n--\nPara alterar as suas preferências das notificações por correio electrônico, visite\n{{canonicalurl:{{#special:Preferences}}}}\n\nPara alterar as suas preferências das páginas vigiadas, visite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPara retirar a página da lista de páginas vigiadas, visite\n$UNWATCHURL\n\nPara comentários e pedidos de ajuda:\n$HELPPAGE",
+       "enotif_minoredit": "Esta é uma edição menor",
        "created": "criada",
        "changed": "alterada",
        "deletepage": "Eliminar página",
index 23f56c0..d8338de 100644 (file)
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "Mostrar",
        "rcfilters-legend-heading": "<strong>Lista de abreviações:</strong>",
+       "rcfilters-other-review-tools": "<strong>Outras ferramentas de revisão:</strong>",
        "rcfilters-activefilters": "Filtros ativos",
        "rcfilters-advancedfilters": "Filtros avançados",
        "rcfilters-limit-title": "Modificações a mostrar",
        "rcfilters-savedqueries-new-name-label": "Nome",
        "rcfilters-savedqueries-new-name-placeholder": "Descreve o propósito do filtro",
        "rcfilters-savedqueries-apply-label": "Criar filtro",
+       "rcfilters-savedqueries-apply-and-setdefault-label": "Criar filtro padrão",
        "rcfilters-savedqueries-cancel-label": "Cancelar",
        "rcfilters-savedqueries-add-new-title": "Gravar configurações atuais de filtros",
        "rcfilters-restore-default-filters": "Restaurar os filtros padrão",
        "pageswithprop-legend": "Páginas que usam uma propriedade",
        "pageswithprop-text": "Esta página lista páginas que usam uma propriedade em particular.",
        "pageswithprop-prop": "Nome da propriedade:",
+       "pageswithprop-reverse": "Ordenar por ordem inversa",
+       "pageswithprop-sortbyvalue": "Ordenar por valor de propriedade",
        "pageswithprop-submit": "Avançar",
        "pageswithprop-prophidden-long": "foi ocultado o valor da propriedade por ser um texto muito longo ($1)",
        "pageswithprop-prophidden-binary": "foi ocultado o valor da propriedade por ser binário ($1)",
        "enotif_lastdiff": "Para ver esta alteração, consulte $1",
        "enotif_anon_editor": "utilizador anónimo $1",
        "enotif_body": "{{GENDER:$WATCHINGUSERNAME|Caro|Cara|Caro(a)}} $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nResumo da edição: $PAGESUMMARY $PAGEMINOREDIT\n\nContacte o editor:\ncorreio eletrónico: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nAté se autenticar e visitar novamente esta página, não receberá mais notificações das alterações futuras. Também pode reativar as notificações para todas páginas na sua lista de páginas vigiadas.\n\nO seu sistema de notificação amigável da wiki {{SITENAME}}\n\n--\nPara alterar as suas preferências de notificação por correio eletrónico, visite\n{{canonicalurl:{{#special:Preferences}}}}\n\nPara alterar as suas preferências das páginas vigiadas, visite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPara retirar a página da lista de páginas vigiadas, visite\n$UNWATCHURL\n\nPara comentários e pedidos de ajuda:\n$HELPPAGE",
+       "enotif_minoredit": "Esta é uma edição menor",
        "created": "criada",
        "changed": "alterada",
        "deletepage": "Eliminar página",
index 699ac96..f2755d1 100644 (file)
        "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-legend-heading": "Used as a heading for legend box on [[Special:RecentChanges]] and [[Special:Watchlist]] when RCFilters are enabled.",
+       "rcfilters-other-review-tools": "Used as a heading for the community collection of other links on [[Special:RecentChanges]] when RCFilters are enabled.",
        "rcfilters-activefilters": "Title for the filters selection showing the active filters.",
        "rcfilters-advancedfilters": "Title for the buttons allowing the user to switch to the various advanced filters views.",
        "rcfilters-limit-title": "Title for the options to change the number of results shown.",
        "rcfilters-savedqueries-new-name-label": "Label for the input that holds the name of the new saved filters in [[Special:RecentChanges]]\n{{Identical|Name}}",
        "rcfilters-savedqueries-new-name-placeholder": "Placeholder for the input that holds the name of the new saved filters in [[Special:RecentChanges]]",
        "rcfilters-savedqueries-apply-label": "Label for the button to apply saving a new filter setting in [[Special:RecentChanges]]. This is for a small popup, please try to use a short string.",
+       "rcfilters-savedqueries-apply-and-setdefault-label": "Label for the button to apply saving a new filter setting and set it as default in [[Special:RecentChanges]]. This is for a small popup, please try to use a short string.",
        "rcfilters-savedqueries-cancel-label": "Label for the button to cancel the saving of a new quick link in [[Special:RecentChanges]]\n{{Identical|Cancel}}",
        "rcfilters-savedqueries-add-new-title": "Title for the popup to add new quick link in [[Special:RecentChanges]]. This is for a small popup, please try to use a short string.",
        "rcfilters-restore-default-filters": "Label for the button that resets filters to defaults",
        "pageswithprop-legend": "Legend for the input form on [[Special:PagesWithProp]].\n{{Identical|Page with page property}}",
        "pageswithprop-text": "Introductory text for the input form on [[Special:PagesWithProp]]",
        "pageswithprop-prop": "Label for the property name input field on [[Special:PagesWithProp]].\n{{Identical|Property name}}",
+       "pageswithprop-reverse": "Label for the reverse checkmark field on [[Special:PagesWithProp]].",
+       "pageswithprop-sortbyvalue": "Label for the sort by value checkmark field on [[Special:PagesWithProp]].",
        "pageswithprop-submit": "Label for the submit button on [[Special:PagesWithProp]].\n{{Identical|Go}}",
        "pageswithprop-prophidden-long": "Information shown on [[Special:PagesWithProp]] when property value is longer than 1 kilobyte.\n\nParameters:\n* $1 - size of property value in kilobytes\nSee also:\n* {{msg-mw|pageswithprop-prophidden-binary}}",
        "pageswithprop-prophidden-binary": "Information shown on [[Special:PagesWithProp]] when property value contains binary data.\n\nParameters:\n* $1 - size of property value in kilobytes\nSee also:\n* {{msg-mw|pageswithprop-prophidden-long}}",
        "enotif_lastdiff": "Email notification text to the latest page differences. Parameters:\n* $1 - a link which points to a diff, shown as a plain link\nSee also:\n* {{msg-mw|Enotif lastvisited}}",
        "enotif_anon_editor": "User name in an email notification when referring to an anonymous user. Parameters:\n* $1 - the anonymous user name (i.e. an IP address).",
        "enotif_body": "Text of a notification email sent when a watched page has been edited or deleted.\n[[File:Screenshot_MediaWiki_e-mail_notifier.PNG|150px|right]]\n\nRefers to {{msg-mw|Helppage}}.\n\nParameters:\n*$WATCHINGUSERNAME is the username of the user receiving the notification.\n*$PAGEINTRO is the first line of the message, saying what happened. It currently can be either of:\n**{{msg-mw|Enotif body intro deleted}}\n**{{msg-mw|Enotif body intro created}}\n**{{msg-mw|Enotif body intro moved}}\n**{{msg-mw|Enotif body intro restored}}\n**{{msg-mw|Enotif body intro changed}} (for all the other cases).\n*$NEWPAGE consists of either\n**if the page is new (in older releases), {{msg-mw|Enotif newpagetext}}\n**if the page has a previous revision,\n***{{msg-mw|Enotif lastdiff}}\n***a newline\n***{{msg-mw|Enotif lastvisited}}\n*$PAGEEDITOR_EMAIL and $PAGEEDITOR_WIKI are links respectively to the email user special page and user page for the user who performed the action.\n*$PAGEEDITOR is the username of the user who performed the action.\n*$HELPPAGE is the full URL to the help page, defined by {{msg-mw|helppage}}.\n\nThe subject of the email is one of the following messages:\n*{{msg-mw|Enotif subject deleted}}\n*{{msg-mw|Enotif subject created}}\n*{{msg-mw|Enotif subject moved}}\n*{{msg-mw|Enotif subject restored}}\n*{{msg-mw|Enotif subject changed}}",
+       "enotif_minoredit": "Possible value (it's empty string for non-minor edits) in the {{msg-mw|Enotif body|notext=1}} message.  This can use magic words like <nowiki>{{GRAMMAR}}</nowiki>.  However, it will not be parsed, so you can not use wikitext (e.g. links) that generates HTML.\n{{Identical|minoredit}}",
        "created": "{{Optional}}\nPossible value for $CHANGEDORCREATED in the following messages:\n* {{msg-mw|enotif_subject}}\n* {{msg-mw|enotif_body}}\n{{Identical|Created}}",
        "changed": "{{Optional}}\nPossible value for $CHANGEDORCREATED in the following messages:\n* {{msg-mw|Enotif subject}}\n* {{msg-mw|Enotif body}}",
        "deletepage": "Used as Submit button text.\n{{Identical|Delete page}}",
index 95ac6bd..4fb3318 100644 (file)
@@ -27,7 +27,7 @@
        "thu": "Akwas",
        "fri": "Asimwas",
        "sat": "Asiḍyas",
-       "january": "Yennayer",
+       "january": "ⵉⵏⵏⴰⵢⵔ",
        "february": "Yebrayer",
        "march": "Mares",
        "april": "Abril",
@@ -73,7 +73,7 @@
        "november-date": "$1 ⵏⵓⵡⴰⵏⴱⵉⵔ",
        "december-date": "$1 ⴷⵓⵊⴰⵏⴱⵉⵔ",
        "pagecategories": "{{PLURAL:$1|ⴰⵙⵎⵉⵍ|ⵉⵙⵎⵉⵍⵏ}}",
-       "category_header": "âµ\9câ´°âµ\99âµ\8fâµ\89ⵡâµ\89âµ\8f â´³ âµ\93âµ\99âµ\8eâµ\89âµ\8d \"$1\"",
+       "category_header": "âµ\9câ´°âµ\99âµ\8fâµ\89ⵡâµ\89âµ\8f â´³ âµ\9cⴰⴳⴳⴰⵢâµ\9c \"$1\"",
        "subcategories": "ⵉⴷⵓⵙⵎⵉⵍⵏ",
        "category-media-header": "Media di category \"$1\"",
        "category-empty": "''Taggayt a war dags bu ca n Tasna niɣ ca n umedia.''",
        "history_small": "ⴰⵎⵣⵔⵓⵢ",
        "printableversion": "Tanghelt n usiggez",
        "permalink": "Tamghunt iqqimen",
-       "edit": "Ẓṛeg",
+       "edit": "ⵙⵏⴼⵍ",
        "create": "Egg",
        "delete": "ⴽⴽⵙ",
        "protect": "Mstn",
        "newpage": "ⵜⴰⵙⵏⴰ ⵜⴰⵎⴰⵢⵏⵓⵜ",
        "talkpagelinktext": "ⴰⵎⵙⴰⵡⴰⵍ",
        "personaltools": "Imassen inu",
-       "talk": "siwel",
+       "talk": "ⴰⵎⵙⴰⵡⴰⵍ",
        "views": "Timmeẓṛa",
        "toolbox": "ⵉⵎⴰⵙⵙⵏ",
        "otherlanguages": "S tutlayin nneḍni",
        "privacy": "Tasertit n tusligi",
        "privacypage": "Project:Tasertit n tusligi",
        "retrievedfrom": "Itwarr-d zi \"$1\"",
-       "youhavenewmessages": "Ghar-k / Ghar-m $1 ($2).",
+       "youhavenewmessages": "{{PLURAL:$3|ⵖⴰⵔⴽ|ⵖⴰⵔⵎ}} $1 ($2).",
        "editsection": "ⵙⵏⴼⵍ",
        "editold": "ⵙⵏⴼⵍ",
        "viewsourceold": "ẓeṛ aɣbalu",
        "editlink": "ⵙⵏⴼⵍ",
        "viewsourcelink": "ẓṛ aghbalu",
-       "editsectionhint": "Ẓṛeg tigezmi: $1",
+       "editsectionhint": "ⵙⵏⴼⵍ ⵜⵉⴳⵣⵎⵉ: $1",
        "toc": "ⵜⵓⵎⴰⵢⵉⵏ",
        "showtoc": "sskn-d",
        "hidetoc": "snuffar",
        "logout": "ⴼⴼⵖ",
        "userlogout": "ⴼⴼⵖ",
        "createaccount": "Egg amiḍan",
+       "createacct-benefit-body1": "{{PLURAL:$1|ⴰⵙⵏⴼⵍ|ⵉⵙⵏⴼⵉⵍⵏ}}",
        "createacct-benefit-body2": "{{PLURAL:$1|ⵜⴰⵙⵏⴰ|ⵜⴰⵙⵏⵉⵡⵉⵏ}}",
        "loginsuccesstitle": "Adaf icna",
        "loginsuccess": "'''Qac tudeffed di {{SITENAME}} s \"$1\".'''",
        "hr_tip": "Acariḍ aglawan",
        "summary": "Tagḍwit:",
        "subject": "ⴰⵙⵏⵜⵍ:",
-       "minoredit": "Ta d taẓrigt d-tamẓeyant",
+       "minoredit": "ⵡⴰ ⴷ ⴰⵙⵏⴼⵍ ⵓⵎⵥⵉⵢ",
        "watchthis": "Ḥḍa tasna ya",
        "savearticle": "Xmml tasna",
        "preview": "Azar-ascan",
        "searchprofile-articles": "ⵜⴰⵙⵏⵉⵡⵉⵏ ⵏ ⵜⵓⵎⴰⵢⵜ",
        "searchprofile-everything": "ⵎⴰⵔⵔⴰ",
        "searchprofile-articles-tooltip": "ⵔⵣⵓ ⴳ $1",
-       "search-result-size": "$1 ({{PLURAL:$2|1 tawalt|$2 tiwalin}})",
+       "search-result-size": "$1 ({{PLURAL:$2|1 ⵜⴳⵓⵔⵉ|$2 ⵜⴳⵓⵔⵉⵡⵉⵏ}})",
        "search-redirect": "(awi $1)",
        "search-section": "(ⵜⵉⴳⵣⵎⵉ $1)",
        "search-category": "(ⴰⵙⵎⵉⵍ $1)",
        "userrights-groupsmember": "ⴰⴳⵎⴰⵎ ⴳ:",
        "userrights-reason": "ⵜⴰⵎⵏⵜⵉⵍⵜ:",
        "group": "ⵜⴰⵔⴰⴱⴱⵓⵜ:",
+       "group-bot": "ⵉⵔⵓⴱⵓⵜⵏ",
        "group-sysop": "Indbaln",
        "group-all": "(ⵎⴰⵔⵔⴰ)",
        "grouppage-sysop": "{{ns:project}}:inedbalen",
        "action-delete": "ⴽⴽⵙ ⵜⴰⵙⵏⴰ ⴰ",
        "nchanges": "$1 {{PLURAL:$1|ⵓⵙⵏⴼⵍ|ⵉⵙⵏⴼⵉⵍⵏ}}",
        "enhancedrc-history": "ⴰⵎⵣⵔⵓⵢ",
-       "recentchanges": "Tiẓṛigin tineggura",
+       "recentchanges": "ⵉⵙⵏⴼⵉⵍⵏ ⵉⵏⴳⴳⵓⵔⴰ",
        "recentchanges-feed-description": "Bbar tiẓṛigin timayutin n wiki deg usudem(feed) a .",
+       "recentchanges-label-minor": "ⵡⴰ ⴷ ⴰⵙⵏⴼⵍ ⵓⵎⵥⵉⵢ",
+       "recentchanges-label-bot": "ⴰⵙⵏⴼⵍ ⴰ ⵉⴳⴳⴰ ⵜ ⵉⵊⵊ ⵏ ⵓⵔⵓⴱⵓ",
        "rcfilters-savedqueries-new-name-label": "ⵉⵙⵎ",
        "rcfilters-filter-bots-label": "ⴰⵔⵓⴱⵓ",
        "rcnotefrom": "ɣar wadday d tiẓṛigin zi '''$2''' (ar '''$1''' ).",
        "rclistfrom": "Ẓar tiẓṛigin timaynutin ig ibeddan zi $3 $2",
-       "rcshowhideminor": "$1 tiẓṛigin d-timeẓyanin",
+       "rcshowhideminor": "$1 ⵉⵙⵏⴼⵉⵍⵏ ⵓⵎⵥⵉⵢⵏ",
        "rcshowhidebots": "$1 ⵉⵔⵓⴱⵓⵜⵏ",
        "rcshowhideliu": "$1 users ig yudeffen",
        "rcshowhideanons": "$1 users war twasnen",
-       "rcshowhidepatr": "Tiẓṛigin ig itwaẓrent di $1",
+       "rcshowhidepatr": "$1 ⵉⵙⵏⴼⵉⵍⵏ ⵉⵜⵜⵡⴰⵃⴹⴰⵏ",
        "rcshowhidemine": "$1 ⵉⵙⵏⴼⵉⵍⵏ ⵉⵏⵓ",
        "rclinks": "Ẓar $1 tiẓṛigin tinggura di $2 n ussan inggura",
-       "diff": "imṣebḍan",
+       "diff": "ⴰⵎⵣⴰⵔⴰⵢ",
        "hist": "ⴰⵎⵣⵔⵓⵢ",
        "hide": "Snuffar",
        "show": "semmel-d",
        "upload-form-label-infoform-name": "ⵉⵙⵎ",
        "upload-form-label-infoform-description": "ⴰⴳⵍⴰⵎ",
        "upload-form-label-infoform-date": "ⴰⵙⴰⴽⵓⴷ",
+       "license-header": "ⵜⵓⵔⴰⴳⵜ",
        "listfiles-delete": "ⴽⴽⵙ",
        "imgfile": "ⴰⴼⴰⵢⵍⵓ",
        "listfiles": "ⵜⴰⵍⴳⴰⵎⵜ ⵏ ⵉⴼⴰⵢⵍⵓⵜⵏ",
        "withoutinterwiki": "Tasna bla tiẓdayin n tutlayt",
        "withoutinterwiki-submit": "Smmrad",
        "fewestrevisions": "Tasniwin s cwayt n ifeggiden",
-       "nbytes": "$1 {{PLURAL:$1|atamḍan|itamḍanen}}",
+       "nbytes": "$1 {{PLURAL:$1|ⴱⴰⵢⵜ|ⵉⴷ ⴱⴰⵢⵜ}}",
        "nlinks": "$1 {{PLURAL:$1|Tazdayt|Tizdayin}}",
        "nmembers": "$1 {{PLURAL:$1|ⵓⴳⵎⴰⵎ|ⵉⴳⵎⴰⵎⵏ}}",
        "lonelypages": "ⵜⴰⵙⵏⵉⵡⵉⵏ ⵜⵉⴳⵓⵊⵉⵍⵉⵏ",
        "protect-expiring": "itsala deg $1 (UTC)",
        "protect-cascade": "Ḥḍa Tasniwin i yudfen di Tasna ya (cascading protection)",
        "protect-cantedit": "war tezemred ca ad tbedeld iswiren n uḥeṭṭu n Tasna ya, mayenzi war ɣark turagt bac ad tẓṛegd.",
-       "protect-expiry-options": "2 tasεεat:2 hours,1 ass:1 day,3 ussan:3 days,1 amalass:1 week,2 imallasen:2 weeks,1 ayur:1 month,3 iyuren:3 months,6 iyuren:6 months,1 asggas:1 year,infinite:infinite",
+       "protect-expiry-options": "1 ⵜⵙⵔⴰⴳⵜ:1 hour,1 ⵡⴰⵙⵙ:1 day,1 ⵉⵎⴰⵍⴰⵙⵙ:1 week,2 ⵉⵎⴰⵍⴰⵙⵙⵏ:2 weeks,1 ⵡⴰⵢⵢⵓⵔ:1 month,3 ⵡⴰⵢⵢⵓⵔⵏ:3 months,6 ⵡⴰⵢⵢⵓⵔⵏ:6 months,1 ⵓⵙⴳⴳⵯⴰⵙ:1 year,ⵍⴱⴷⴰ:infinite",
        "restriction-type": "ⵜⵓⵔⴰⴳⵜ:",
        "restriction-level": "Aswir uskref:",
-       "restriction-edit": "Arri",
+       "restriction-edit": "ⵙⵏⴼⵍ",
        "restriction-move": "ⵙⵎⵓⵜⵜⵉ",
        "restriction-upload": "ⵙⴽⵜⵔ",
        "undeletebtn": "Ar-ad",
        "sp-contributions-search": "Arzu x tiggawin",
        "sp-contributions-username": "Tansa IP d isem useqdac:",
        "sp-contributions-submit": "ⵔⵣⵓ",
-       "whatlinkshere": "Min iteqqnen ghar da",
+       "whatlinkshere": "ⵎⵉⵏ ⵉⵇⵇⵏⴻⵏ ⵖⵔ ⴷⴰ",
        "whatlinkshere-title": "Tasniwin id-izedyen ɣar \"$1\"",
        "whatlinkshere-page": "ⵜⴰⵙⵏⴰ:",
        "linkshere": "Tasna ya tzedi ɣa '''[[:$1]]''':",
        "import-comment": "ⴰⵅⴼⴰⵡⴰⵍ:",
        "importlogpage": "Siri-d aɣmis",
        "tooltip-pt-userpage": "Tasna inu",
-       "tooltip-pt-mytalk": "Tasna usiwl inu",
+       "tooltip-pt-mytalk": "ⵜⴰⵙⵏⴰ {{GENDER:|ⵏⵏⴽ|ⵏⵏⵎ}} ⵏ ⵓⵎⵙⴰⵡⴰⵍ",
        "tooltip-pt-preferences": "Min d-ac itteɛjiben",
        "tooltip-pt-watchlist": "Tabdart n Tasniwin umi txmamd bac ad-ten teẓṛegd",
        "tooltip-pt-mycontris": "ⵜⴰⵍⴳⴰⵎⵜ ⵏ ⵜⵓⵎⵓⵜⵉⵏ {{GENDER:|ⵏⵏⴽ|ⵏⵏⵎ}}",
        "tooltip-pt-logout": "ⴼⴼⵖ",
        "tooltip-ca-talk": "ⴰⵎⵙⴰⵡⴰⵍ ⵅⴼ ⵜⴰⵙⵏⴰ ⵏ ⵜⵓⵎⴰⵢⵜ",
        "tooltip-ca-edit": "ⵙⵏⴼⵍ ⵜⴰⵙⵏⴰ ⴰ",
-       "tooltip-ca-addsection": "Arni tinit deg usiwl a.",
+       "tooltip-ca-addsection": "ⵙⵙⵏⵜⵉ ⵜⵉⴳⵣⵎⵉ ⵜⴰⵎⴰⵢⵏⵓⵜ",
        "tooltip-ca-viewsource": "Tasna ya tẓarq. tzemred atẓred aɣbal ines.",
        "tooltip-ca-history": "Isughulen izrin n tasna ya.",
        "tooltip-ca-protect": "Ẓarq Tasna ya",
        "tooltip-diff": "Ẓar tiẓṛigin i teggid deg uḍṛiṣ a.",
        "tooltip-compareselectedversions": "Ẓar imsebeḍiyen jar tunɣilin n Tasna ya.",
        "tooltip-watch": "Arni Tasna ya ɣa Tabdart uḥṭṭu inec",
+       "pageinfo-language": "ⵜⵓⵜⵍⴰⵢⵜ ⵏ ⵜⵓⵎⴰⵢⵜ ⵏ ⵜⴰⵙⵏⴰ",
        "pageinfo-contentpage-yes": "ⵢⴰⵀ",
        "pageinfo-protect-cascading-yes": "ⵢⴰⵀ",
        "previousdiff": "← imṣebḍan n zzat",
        "tags-active-yes": "ⵢⴰⵀ",
        "tags-active-no": "ⵓⵀⵓ",
        "tags-delete": "ⴽⴽⵙ",
+       "tags-hitcount": "$1 {{PLURAL:$1|ⵓⵙⵏⴼⵍ|ⵉⵙⵏⴼⵉⵍⵏ}}",
        "tags-create-reason": "ⵜⴰⵎⵏⵜⵉⵍⵜ:",
        "tags-delete-reason": "ⵜⴰⵎⵏⵜⵉⵍⵜ:",
        "tags-activate-reason": "ⵜⴰⵎⵏⵜⵉⵍⵜ:",
index a24c6c2..185c8f3 100644 (file)
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Afișează",
        "rcfilters-activefilters": "Filtre active",
+       "rcfilters-limit-shownum": "Arată ultimele $1 modificări",
+       "rcfilters-days-show-days": "$1 {{PLURAL:$1|zi|zile|de zile}}",
+       "rcfilters-days-show-hours": "$1 {{PLURAL:$1|oră|ore|de ore}}",
        "rcfilters-quickfilters": "Legături rapide",
        "rcfilters-savedqueries-defaultlabel": "Filtre salvate",
        "rcfilters-savedqueries-rename": "Redenumește",
        "enotif_lastdiff": "Apasă $1 pentru a vedea această schimbare.",
        "enotif_anon_editor": "utilizator anonim $1",
        "enotif_body": "Domnule/Doamnă $WATCHINGUSERNAME,\n$PAGEINTRO $NEWPAGE\n\nDescrierea lăsată de utilizator: $PAGESUMMARY $PAGEMINOREDIT\n\nPuteți contacta utilizatorul:\ne-mail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNu veți mai primi notificări în cazul unei viitoare activități până când nu veți vizitați pagina ca utilizator autentificat. Puteți de asemenea reseta notificările pentru toate pagini pe care le urmăriți.\n\nAl dumneavoastră amic, sistemul de notificare de la {{SITENAME}}\n\n--\nPentru a modifica setările notificării prin e-mail, vizitați\n{{canonicalurl:{{#special:Preferences}}}}\n\nPentru a modifica setările listei de pagini urmărite, vizitați\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPentru a nu mai urmări pagina, vizitați\n$UNWATCHURL\n\nAsistență și suport:\n$HELPPAGE",
+       "enotif_minoredit": "Aceasta este o modificare minoră",
        "created": "creată",
        "changed": "modificată",
        "deletepage": "Șterge pagina",
        "logentry-delete-delete": "$1 {{GENDER:$2|a șters}} pagina $3",
        "logentry-delete-delete_redir": "$1 {{GENDER:$2|a șters}} pagina de redirecționare $3 prin suprascriere",
        "logentry-delete-restore": "$1 {{GENDER:$2|a restaurat}} pagina $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|a restaurat}} pagina $3",
        "restore-count-revisions": "{{PLURAL:$1|1 versiune|$1 versiuni|$1 de versiuni}}",
        "restore-count-files": "{{PLURAL:$1|1 fișier|$1 fișiere|$1 de fișiere}}",
        "logentry-delete-event": "$1 {{GENDER:$2|a schimbat}} vizibilitatea {{PLURAL:$5|unui eveniment din jurnal|a $5 evenimente din jurnal|a $5 de evenimente din jurnal}} pentru $3: $4",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|a schimbat}} apartenența la grup pentru $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|a fost promovat|a fost promovată}} în mod automat de la $4 la $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|a încărcat}} $3",
-       "logentry-upload-overwrite": "$1 {{GENDER:$2|a încărcat}} o nouă versiune pentru $3",
+       "logentry-upload-overwrite": "$1 {{GENDER:$2|a încărcat}} o versiune nouă pentru $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|a încărcat}} $3",
        "log-name-managetags": "Jurnal gestionare etichete",
        "log-description-managetags": "Această pagină listează activitățile de gestionare în ceea ce privește [[Special:Tags|etichetele]]. Jurnalul conține numai acțiunile efectuate manual de către un administrator; etichetele pot fi create sau șterse de software-ul wiki fără ca vreo intrare să fie înregistrată în acest jurnal.",
index f712a14..aafd4f9 100644 (file)
        "userrights": "Права участника",
        "userrights-lookup-user": "Выбор участника",
        "userrights-user-editname": "Введите имя учётной записи:",
-       "editusergroup": "Ð\97агÑ\80Ñ\83зиÑ\82Ñ\8c Ð³Ñ\80Ñ\83ппÑ\8b Ñ\83Ñ\87аÑ\81Ñ\82ников",
+       "editusergroup": "Ð\97агÑ\80Ñ\83зиÑ\82Ñ\8c Ð³Ñ\80Ñ\83ппÑ\8b Ñ\83Ñ\87аÑ\81Ñ\82ника",
        "editinguser": "Изменение прав {{GENDER:$1|участника|участницы}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Просмотр прав {{GENDER:$1|участника|участницы}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Изменение групп {{GENDER:$1|участника|участницы}}",
        "pageswithprop-legend": "Страницы с переопределёнными свойствами",
        "pageswithprop-text": "Здесь перечислены страницы, у которых были вручную переопределены отдельные свойства.",
        "pageswithprop-prop": "Название свойства:",
+       "pageswithprop-reverse": "Сортировать в обратном порядке",
+       "pageswithprop-sortbyvalue": "Сортировать по значению свойства",
        "pageswithprop-submit": "Найти",
        "pageswithprop-prophidden-long": "длинное значение текстового свойства скрыто ($1)",
        "pageswithprop-prophidden-binary": "значение двоичного свойства скрыто ($1)",
        "enotif_lastdiff": "См. $1 для ознакомления с изменением",
        "enotif_anon_editor": "анонимный участник $1",
        "enotif_body": "Здравствуйте, $WATCHINGUSERNAME!\n\n$PAGEINTRO $NEWPAGE\n\nКраткое описание изменения: $PAGESUMMARY $PAGEMINOREDIT\n\nОбратиться к изменившему:\nэл. почта: $PAGEEDITOR_EMAIL\nвики: $PAGEEDITOR_WIKI\n\nЕсли вы не зайдёте на эту страницу под своей учётной записью, в случае её дальнейших изменений уведомлений больше не будет. Вы можете также отключить опцию уведомления для всех страниц в вашем списке наблюдения.\n\nСистема оповещения {{grammar:genitive|{{SITENAME}}}}\n\n--\nИзменение настройки уведомлений\n{{canonicalurl:{{#special:Preferences}}}}\n\nИзменение настройки вашего списка наблюдения\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nУдалить страницы из вашего списка наблюдения\n$UNWATCHURL\n\nОбратная связь и помощь\n$HELPPAGE",
+       "enotif_minoredit": "Это малая правка",
        "created": "создана",
        "changed": "изменена",
        "deletepage": "Удалить страницу",
        "delete-warning-toobig": "У этой страницы очень длинная история изменений, более $1 {{PLURAL:$1|версии|версий}}.\nЕё удаление может привести к нарушению нормальной работы базы данных сайта «{{SITENAME}}»;\nдействуйте с осторожностью.",
        "deleteprotected": "Вы не можете удалить эту страницу, поскольку она защищена.",
        "deleting-backlinks-warning": "<strong>Предупреждение:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|Другие страницы]] ссылаются на страницу, которую вы собираетесь удалить, или содержат её.",
+       "deleting-subpages-warning": "<strong>Предупреждение:</strong> У страницы, которую вы собираетесь удалить, имеется [[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|$1 подстраница|$1 подстраницы|$1 подстраниц|51=более 50 подстраниц}}]].",
        "rollback": "Откатить изменения",
        "rollbacklink": "откатить",
        "rollbacklinkcount": "откатить $1 {{PLURAL:$1|правку|правки|правок}}",
index 824851e..429ada4 100644 (file)
        "stub-threshold-sample-link": "ⴰⵎⴷⵢⴰ",
        "stub-threshold-disabled": "moattal",
        "recentchangesdays": "adad liyam lmroda gh ahdat tghyirat",
+       "recentchangesdays-max": "ⵎⴰⴽⵙⵉⵎⵓⵎ $1 {{PLURAL:$1|ⵡⴰⵙⵙ|ⵡⵓⵙⵙⴰⵏ}}",
        "localtime": "↓Tizi n ugmaḍ ad:",
        "servertime": "Asaru n Tizi",
        "guesstimezone": "skchm twqit gh lmotasaffih",
        "recentchanges-label-unpatrolled": "Ambddl ad ura jju ittmẓra",
        "recentchanges-label-plusminus": "ⵜⵏⴼⵍ ⵜⵉⴷⴷⵉ ⵏ ⵜⴰⵙⵏⴰ ⵙ ⵡⵓⵟⵟⵓⵏ ⴰⴷ ⵏ ⵉⴷ ⴱⴰⵢⵜ",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ⵥⵔ ⵓⵍⴰ [[Special:NewPages|ⵜⴰⵍⴳⴰⵎⵜ ⵏ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵜⵉⵎⴰⵢⵏⵓⵜⵉⵏ]])",
+       "rcfilters-legend-heading": "<strong>ⵜⵉⵣⴳⵣⵉⵍⵉⵏ:</strong>",
+       "rcfilters-days-title": "ⵓⵙⵙⴰⵏ ⴳⴳⵯⵔⴰⵏⵉⵏ",
+       "rcfilters-hours-title": "ⵜⵉⵙⵔⴰⴳⵉⵏ ⴳⴳⵯⵔⴰⵏⵉⵏ",
+       "rcfilters-days-show-days": "$1 {{PLURAL:$1|ⵡⴰⵙⵙ|ⵡⵓⵙⵙⴰⵏ}}",
        "rcfilters-savedqueries-new-name-label": "ⵉⵙⵎ",
        "rcfilters-filterlist-whatsthis": "ⵎⴰⵜⵜⴰ ⵓⵢⴰ?",
        "rcfilters-filter-bots-label": "ⴱⵓⵜ",
        "rcshowhideliu-hide": "ⵙⵙⵏⵜⵍ",
        "rcshowhideanons": "$1 midn ur ttuyssan nin",
        "rcshowhideanons-hide": "ⵙⵙⵏⵜⵍ",
-       "rcshowhidepatr": "$1 Imbddln n tsagga",
+       "rcshowhidepatr": "$1 ⵉⵙⵏⴼⵉⵍⵏ ⵜⵜⵡⴰⵃⴹⴰⵏⵉⵏ",
        "rcshowhidepatr-hide": "ⵙⵙⵏⵜⵍ",
        "rcshowhidemine": "$1 ⵉⵙⵏⴼⵍⵏ ⵉⵏⵓ",
        "rcshowhidemine-hide": "ⵙⵙⵏⵜⵍ",
        "svg-long-desc": "Asdaw SVG, Tabadut n $1 × $2 ifrdan, Tiddi : $3",
        "show-big-image": "ⴰⴼⴰⵢⵍⵓ ⴰⵏⵚⵍⵉ",
        "ilsubmit": "ⵙⵉⴳⴳⵍ",
+       "days": "{{PLURAL:$1|$1 ⵡⴰⵙⵙ|$1 ⵡⵓⵙⵙⴰⵏ}}",
        "ago": "$1 ⴰⵢⴰ",
        "hours-ago": "$1 {{PLURAL:$1|ⵜⵙⵔⴰⴳⵜ|ⵜⵙⵔⴰⴳⵉⵏ}} ⴰⵢⴰ",
        "minutes-ago": "$1 {{PLURAL:$1|ⵜⵓⵙⴷⵉⴷⵜ|ⵜⵓⵙⴷⵉⴷⵉⵏ}} ⴰⵢⴰ",
index ce26e62..e45d04f 100644 (file)
        "badtitle": "بھیڑا عنوان",
        "viewsource": "ماخذ ݙیکھو",
        "viewsource-title": "$1 دا مسودہ ݙیکھو",
+       "viewsourcetext": "تساں ایں ورقے کوں صرف ݙیکھ تے ماخز نقل کر سڳدے ہو لیکن تبدیلی نہوے کر سڳدے",
        "yourname": "صارف دا ناں",
        "userlogin-yourname": "صارف ناں",
        "userlogin-yourname-ph": "آپݨا ورتݨ ناں صارف درج کرو",
        "tooltip-save": "تبدیلیاں محفوظ کرو",
        "tooltip-preview": "محفوظ کرݨ کنے پہلے تبدیلیاں ݙیکھو، مہربانی ہوسی۔",
        "tooltip-diff": "ایں لکھت وچ کیتیاں ڳیاں تبدیلیاں ݙیکھاؤ",
+       "tooltip-compareselectedversions": "چݨے ہوئے ورقیاں وچ فرق ݙیکھو",
        "tooltip-watch": "ایں ورقے کوں آپݨی دید آلے ورقیاں وچ رکھو",
        "tooltip-rollback": "رول بیک\" ہک کلک وچ ورقے کوں پچھلی حالت وچ گھن ویسی\"",
        "tooltip-undo": "واپس تے کلک کرݨ نال  پچھلی ترمیم تے پُڄ ویسو، نمائشی انداز وچ ترمیم دا خانہ کھلسی۔ تساں مختصر سسب وی بیان کر سڳدے ہو۔",
index b60523e..658e8f0 100644 (file)
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (glej tudi [[Special:NewPages|seznam novih strani]])",
        "recentchanges-submit": "Prikaži",
        "rcfilters-legend-heading": "<strong>Seznam okrajšav:</strong>",
+       "rcfilters-other-review-tools": "<strong>Druga orodja za pregled:</strong>",
        "rcfilters-activefilters": "Dejavni filtri",
        "rcfilters-advancedfilters": "Napredni filtri",
        "rcfilters-limit-title": "Spremembe za prikaz",
        "rcfilters-savedqueries-new-name-label": "Ime",
        "rcfilters-savedqueries-new-name-placeholder": "Opišite namen filtra",
        "rcfilters-savedqueries-apply-label": "Ustvari filter",
+       "rcfilters-savedqueries-apply-and-setdefault-label": "Ustvari privzeti filter",
        "rcfilters-savedqueries-cancel-label": "Prekliči",
        "rcfilters-savedqueries-add-new-title": "Shrani nastavitve trenutnega filtra",
        "rcfilters-restore-default-filters": "Obnovi privzete filtre",
        "pageswithprop-legend": "Strani z lastnostmi strani",
        "pageswithprop-text": "Stran navaja vse strani, ki uporabljajo določene lastnosti strani.",
        "pageswithprop-prop": "Ime lastnosti:",
+       "pageswithprop-reverse": "Razvrsti v obratnem vrstnem redu",
+       "pageswithprop-sortbyvalue": "Razvrsti po vrednosti lastnosti",
        "pageswithprop-submit": "Pojdi",
        "pageswithprop-prophidden-long": "dolga besedilna vrednost lastnosti je skrita ($1)",
        "pageswithprop-prophidden-binary": "dvojiška vrednost lastnosti je skrita ($1)",
        "enotif_lastdiff": "Glej $1 za to spremembo.",
        "enotif_anon_editor": "brezimni uporabnik $1",
        "enotif_body": "$WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nUrejevalčev povzetek: $PAGESUMMARY $PAGEMINOREDIT\n\nNavežite stik z urejevalcem:\ne-pošta: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nMedtem ko ste prijavljeni, nadaljnjih obvestil ne boste prejemali. Na spisku nadzorov lahko tudi ponastavite zastavice obveščanj za vse spremljane strani.\n\nVaš opozorilni sistem {{GRAMMAR:rodilnik|{{SITENAME}}}}\n\n--\nZa spremembo nastavitev e-poštnih obvestil obiščite\n{{canonicalurl:{{#special:Preferences}}}}\n\nZa spremembo nastavitev spiska nadzorov obiščite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nZa odstranitev strani z vašega spiska nadzorov obiščite\n$UNWATCHURL\n\nPovratna sporočila in pomoč:\n$HELPPAGE",
+       "enotif_minoredit": "To je manjše urejanje",
        "created": "ustvaril",
        "changed": "spremenil",
        "deletepage": "Briši stran",
index 1ee5c3b..2e8d06e 100644 (file)
        "recentchanges-submit": "Прикажи",
        "rcfilters-legend-heading": "<strong>Списак скраћеница:</strong>",
        "rcfilters-activefilters": "Активни филтери",
+       "rcfilters-limit-title": "Приказати измјена",
+       "rcfilters-limit-shownum": "Прикажи посљедњих $1 измјена",
+       "rcfilters-days-show-days": "$1 {{PLURAL:$1|дан|дана}}",
+       "rcfilters-days-show-hours": "$1 {{PLURAL:$1|сат|сата}}",
        "rcfilters-quickfilters": "Сачувани филтери",
        "rcfilters-savedqueries-defaultlabel": "Сачувани филтери",
        "rcfilters-savedqueries-rename": "Преименуј",
        "rcfilters-savedqueries-add-new-title": "Сачувај тренутне поставке филтера",
        "rcfilters-restore-default-filters": "Враћање подразумеваних филтера",
        "rcfilters-clear-all-filters": "Уклони све филтере",
+       "rcfilters-search-placeholder": "Филтер скорашњих измјена (претражите или почните куцати)",
        "rcfilters-empty-filter": "Нема активних филтера. Сви доприноси су приказани.",
        "rcfilters-noresults-conflict": "Није пронађен ниједан резултат јер су критеријуми претраге сукобљени",
        "rcfilters-state-message-subset": "Овај филтер нема ефекта јер су његови резултати укључени са онима {{PLURAL:$2|следећег, ширег филтера|следећих, ширих филтера}} (покушајте са означавањем да бисте их распознали): $1",
        "rcfilters-filter-user-experience-level-experienced-description": "Преко 30 дана активности и 500 измјена.",
        "rcfilters-filter-bots-label": "Бот",
        "rcfilters-filter-humans-label": "Човјек (није бот)",
+       "rcfilters-filter-patrolled-label": "Патролирано",
+       "rcfilters-filter-unpatrolled-label": "Непатролирано",
        "rcfilters-filter-minor-label": "Мање измјене",
        "rcfilters-filtergroup-watchlist": "Странице на списку надгледања",
        "rcfilters-filter-watchlist-watched-label": "На списку надгледања",
        "rcfilters-filter-lastrevision-description": "Најскорашњија измена странице.",
        "rcfilters-filter-previousrevision-label": "Раније измене",
        "rcfilters-filter-previousrevision-description": "Све измене које нису најскорашњије измене странице.",
+       "rcfilters-view-namespaces-tooltip": "Филтер резултата према именском простору",
        "rcnotefrom": "Испод {{PLURAL:$5|је измена|су измене}} од <strong>$3, $4</strong> (до <strong>$1</strong> приказано).",
        "rclistfromreset": "Ресетуј одабир датума",
        "rclistfrom": "Прикажи нове измене почев од $2 $3",
index 7bf39b3..c08da7b 100644 (file)
        "recentchanges-submit": "Prikaži",
        "rcfilters-legend-heading": "<strong>Spisak skraćenica:</strong>",
        "rcfilters-activefilters": "Aktivni filteri",
+       "rcfilters-limit-title": "Prikazati izmjena",
+       "rcfilters-limit-shownum": "Prikaži posljednjih $1 izmjena",
+       "rcfilters-days-show-days": "$1 {{PLURAL:$1|dana|dana}}",
+       "rcfilters-days-show-hours": "$1 {{PLURAL:$1|sat|sata}}",
+       "rcfilters-search-placeholder": "Filter skorašnjih izmjena (pretražite ili počnite kucati)",
        "rcfilters-filtergroup-authorship": "Autorstvo doprinosa",
        "rcfilters-filter-user-experience-level-registered-label": "Registrovani",
        "rcfilters-filter-user-experience-level-registered-description": "Prijavljeni urednici.",
        "rcfilters-filter-user-experience-level-experienced-label": "Iskusni korisnici",
        "rcfilters-filter-user-experience-level-experienced-description": "Preko 30 dana aktivnosti i 500 izmjena.",
        "rcfilters-filter-humans-label": "Čovjek (nije bot)",
+       "rcfilters-filter-patrolled-label": "Patrolirano",
+       "rcfilters-filter-unpatrolled-label": "Nepatrolirano",
        "rcfilters-filter-minor-label": "Manje izmjene",
        "rcfilters-filter-pageedits-label": "Izmjene stranica",
        "rcfilters-filter-pageedits-description": "Izmjene viki sadržaja, rasprava, opisa kategorija...",
        "rcfilters-filter-newpages-label": "Stvaranje stranica",
        "rcfilters-filter-newpages-description": "Izmjene kojima se stvaraju nove stranice.",
        "rcfilters-filter-logactions-label": "Radnje zabilježene u dnevnicima",
+       "rcfilters-view-namespaces-tooltip": "Filter rezultata prema imenskom prostoru",
        "rcnotefrom": "Ispod {{PLURAL:$5|je izmena|su izmene}} od <strong>$3, $4</strong> (do <strong>$1</strong> prikazano).",
        "rclistfrom": "Prikaži nove izmene počev od $2 $3",
        "rcshowhideminor": "$1 manje izmene",
index 961ba5a..5a6c348 100644 (file)
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Visa",
        "rcfilters-legend-heading": "<strong>Lista över förkortningar:</strong>",
+       "rcfilters-other-review-tools": "<strong>Andra granskningsverktyg:</strong>",
        "rcfilters-activefilters": "Aktiva filter",
        "rcfilters-advancedfilters": "Avancerade filter",
        "rcfilters-limit-title": "Ändringar att visa",
        "rcfilters-savedqueries-new-name-label": "Namn",
        "rcfilters-savedqueries-new-name-placeholder": "Beskriv syftet med filtret",
        "rcfilters-savedqueries-apply-label": "Skapa filter",
+       "rcfilters-savedqueries-apply-and-setdefault-label": "Skapa standardfilter",
        "rcfilters-savedqueries-cancel-label": "Avbryt",
        "rcfilters-savedqueries-add-new-title": "Spara filterinställningar",
        "rcfilters-restore-default-filters": "Återställ standardfilter",
        "pageswithprop-legend": "Sidor med en sidegenskap",
        "pageswithprop-text": "Denna sida listar sidor som använder en speciell sidegenskap.",
        "pageswithprop-prop": "Egenskapsnamn:",
+       "pageswithprop-reverse": "Sortera i omvänd ordningsföljd",
+       "pageswithprop-sortbyvalue": "Sortera efter egenskapsvärde",
        "pageswithprop-submit": "Gå",
        "pageswithprop-prophidden-long": "dold långt textegenskapsvärde ($1)",
        "pageswithprop-prophidden-binary": "dold binärt egenskapsvärde ($1)",
        "enotif_lastdiff": "För att se denna ändring, se $1",
        "enotif_anon_editor": "anonym användare $1",
        "enotif_body": "Hej $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nAngiven sammanfattning av redigeringen: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakta användaren:\ne-post: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nSåvida du inte besöker sidan, kommer du inte att få flera meddelanden om aktivitet på sidan när du är inloggad. Du kan också ta bort flaggan för meddelanden om ändringar på alla sidor i din bevakningslista.\n\nHälsningar från {{SITENAME}}s meddelandesystem\n\n--\nFör att ändra inställningarna för dina uppdateringar via e-post, besök\n{{canonicalurl:{{#special:Preferences}}}}\n\nFör att ändra inställningarna i din bevakningslista, besök\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nFör att radera sidan från din bevakningslista, besök\n$UNWATCHURL\n\nFeedback och ytterligare hjälp:\n$HELPPAGE",
+       "enotif_minoredit": "Detta är en mindre redigering",
        "created": "skapad",
        "changed": "ändrad",
        "deletepage": "Radera sida",
        "fileduplicatesearch-noresults": "Ingen fil med namnet \"$1\" hittades.",
        "specialpages": "Specialsidor",
        "specialpages-note-top": "Teckenförklaring",
+       "specialpages-note-restricted": "* Normala specialsidor.\n* <span class=\"mw-specialpagerestricted\">Specialsidor med begränsad åtkomst.</span>",
        "specialpages-group-maintenance": "Underhållsrapporter",
        "specialpages-group-other": "Övriga specialsidor",
        "specialpages-group-login": "Logga in / skapa konto",
index 19214be..d844fb8 100644 (file)
@@ -31,7 +31,8 @@
                        "Jdforrester",
                        "قیصرانی",
                        "Junaid Ahmad",
-                       "Abuaneeqa"
+                       "Abuaneeqa",
+                       "Saraiki"
                ]
        },
        "tog-underline": "ربط کی خط کشیدگی:",
        "selfredirect": "<strong>انتباہ:</strong> آپ پیش نظر صفحہ کو خود اسی کی جانب رجوع مکرر کر رہے ہیں۔\nشاید آپ نے رجوع مکرر کا غلط ہدف درج کیا ہے یا غلط صفحہ میں ترمیم کر رہے ہیں۔\nتاہم اگر آپ «$1» پر دوبارہ کلک کریں تو بہرصورت اس رجوع مکرر کو بنا دیا جائے گا۔",
        "missingcommenttext": "براہِ کرم! تبصرہ نیچے درج کیجئے.",
        "missingcommentheader": "<strong>یاددہانی:</strong>  آپ نے اِس تبصرہ کیلئے عنوان یا شہ سرخی مہیّا نہیں کی ہے۔\nاگر آپ نے \"$1\" کا بٹن دوبارہ دبایا تو آپ کا تبصرہ بغیر کسی عنوان کے محفوظ ہوجائے گا۔",
-       "summary-preview": "نمائش خلاصہ:",
+       "summary-preview": "خلاصہِ ترمیم کی نمائش:",
        "subject-preview": "عنوان/شہ سرخی کی نمائش:",
        "previewerrortext": "آپ کی تبدیلیوں کی نمائش دکھانے کے دوران میں کوئی نقص واقع ہو گیا ہے۔",
        "blockedtitle": "صارف مسدود ہے",
        "fileduplicatesearch-noresults": "«$1» کے نام سے کوئی فائل نہیں مل سکی۔",
        "specialpages": "خصوصی صفحات",
        "specialpages-note-top": "وضاحت",
-       "specialpages-note": "* عام خصوصی صفحات۔\n* <span class=\"mw-specialpagerestricted\">ممنوع خصوصی صفحات</span>",
        "specialpages-group-maintenance": "نگہداشت کی رپورٹیں",
        "specialpages-group-other": "دیگر خصوصی صفحات",
        "specialpages-group-login": "کھاتہ کھولیں یا اندراج کریں",
index da6046e..d52ab4a 100644 (file)
@@ -55,6 +55,7 @@
        "tog-watchlisthidebots": "באהאלט באט עדיטס פון אויפפאסן ליסטע",
        "tog-watchlisthideminor": "באהאלט קליינע ענדערונגען פון דער אויפפאסן ליסטע",
        "tog-watchlisthideliu": "באהאלטן רעדאקטירונגען פון איינלאגירטע באניצערס פון דער אויפֿפאסונג ליסטע",
+       "tog-watchlistreloadautomatically": "ווידערלאדן די אויפֿפאסונג־ליסטע אויטאמאטיש ווען א פֿילטער ווערט געענדערט (פֿאדערט JavaScript)",
        "tog-watchlisthideanons": "באהאלטן רעדאקטירונגען פון אנאנימע באניצערס פון דער אויפֿפאסונג ליסטע",
        "tog-watchlisthidepatrolled": "באַהאַלטן פאַטראלירטע רעדאַקטירונגען פֿון דער אויפֿפאַסונג ליסטע",
        "tog-watchlisthidecategorization": "באהאלטן קאעגאריזירן בלעטער",
        "grant-editmywatchlist": "רעדאקטירן אײַער אויפֿפאסונג ליסטע",
        "grant-editpage": "רעדאקטירן עקזיסטירנדע בלעטער",
        "grant-editprotected": "רעדאקטירן געשיצטע בלעטער",
+       "grant-highvolume": "א סך באארבעטונגען",
        "grant-patrol": "פאטראלירן ענדערונגען צו בלעטער",
        "grant-sendemail": "שיקן ע-פאסט צו אנדערע באניצער",
        "grant-uploadeditmovefile": "ארויפֿלאדן, טוישן און באוועגן טעקעס",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (זעט אויך [[Special:NewPages|די רשימה פון נייע בלעטער]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "ווייזן",
+       "rcfilters-legend-heading": "<strong>ליסטער פון ראשי תיבות:</strong>",
        "rcfilters-activefilters": "אַקטיווע פילטערס",
+       "rcfilters-advancedfilters": "פֿארגעשריטענע פֿילטערס",
+       "rcfilters-limit-title": "ענדערונגען צו ווייזן",
+       "rcfilters-limit-shownum": "ווייזן די לעצטע $1 ענדערונגען",
+       "rcfilters-days-title": "לעצטיקע טעג",
+       "rcfilters-hours-title": "לעצטיקע שעה׳ן",
        "rcfilters-days-show-days": "$1 {{PLURAL:$1|טאג|טעג}}",
        "rcfilters-days-show-hours": "$1 {{PLURAL:$1|שעה|שעה'ן}}",
        "rcfilters-quickfilters": "אויפֿגעהיטענע פֿילטערס",
        "rcfilters-savedqueries-setdefault": "האלטן ווי גרונט",
        "rcfilters-savedqueries-remove": "אראפנעמען",
        "rcfilters-savedqueries-new-name-label": "נאָמען",
+       "rcfilters-savedqueries-apply-label": "שאפן פילטער",
        "rcfilters-savedqueries-cancel-label": "אַנולירן",
        "rcfilters-search-placeholder": "פֿילטערן לעצטיקע ענדערונגען (דורכקוקן אדער אָנהייבן אַריינקלאַפן)",
        "rcfilters-invalid-filter": "אומגילטיגער פֿילטער",
        "rcfilters-filtergroup-reviewstatus": "רעצענזירונג־סטאטוס",
        "rcfilters-filter-patrolled-label": "פאטראלירט",
        "rcfilters-filter-unpatrolled-label": "אומפאטראלירט",
+       "rcfilters-filtergroup-significance": "באדייטונג",
        "rcfilters-filter-minor-label": "מינערדיקע רעדאַקטירונגען",
+       "rcfilters-filter-watchlist-watched-label": "אויף דער אויפֿפאַסונג ליסטע",
+       "rcfilters-filter-watchlist-notwatched-label": "נישט אויף דער אויפֿפאַסונג ליסטע",
        "rcfilters-filter-pageedits-label": "בלאט רעדאקטירונגען",
        "rcfilters-filter-newpages-label": "בלאַט־שאַפֿונגען",
+       "rcfilters-filter-categorization-label": "קאטעגאריע־ענדערונגען",
        "rcfilters-filtergroup-lastRevision": "לעצטע ווערסיעס",
        "rcfilters-filter-lastrevision-label": "לעצטע ווערסיע",
        "rcfilters-filter-previousrevision-label": "נישט די לעצטע ווערסיעס",
        "rcfilters-filter-excluded": "אויסגעשלאסן",
        "rcfilters-tag-prefix-namespace-inverted": "<strong>:נישט</strong> $1",
+       "rcfilters-liveupdates-button": "לעבעדיקע דערהיינטיקונגען",
        "rcnotefrom": "פֿאלגנד {{PLURAL:$5|איז די ענדערונג| זענען די ענדערונגען}} זײַט <strong>$3, $4</strong> (ביז <strong>$1</strong>).",
        "rclistfrom": "װײַזן נײַע ענדערונגען פֿון $3 $2",
        "rcshowhideminor": "$1 מינערדיגע ענדערונגען",
index c46ad3a..28a838f 100644 (file)
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "显示",
        "rcfilters-legend-heading": "<strong>缩写列表:</strong>",
+       "rcfilters-other-review-tools": "<strong>其他复核工具:</strong>",
        "rcfilters-activefilters": "激活的过滤器",
        "rcfilters-advancedfilters": "高级过滤器",
        "rcfilters-limit-title": "要显示的更改",
        "rcfilters-savedqueries-new-name-label": "名称",
        "rcfilters-savedqueries-new-name-placeholder": "描述过滤器目的",
        "rcfilters-savedqueries-apply-label": "创建过滤器",
+       "rcfilters-savedqueries-apply-and-setdefault-label": "创建默认过滤器",
        "rcfilters-savedqueries-cancel-label": "取消",
        "rcfilters-savedqueries-add-new-title": "保存当前过滤器设置",
        "rcfilters-restore-default-filters": "恢复默认过滤器",
        "pageswithprop-legend": "有页面属性的页面",
        "pageswithprop-text": "本页面列出使用特定页面属性的页面。",
        "pageswithprop-prop": "属性名称:",
+       "pageswithprop-reverse": "倒序排序",
+       "pageswithprop-sortbyvalue": "按属性值排序",
        "pageswithprop-submit": "提交",
        "pageswithprop-prophidden-long": "长文本属性值已隐藏($1)",
        "pageswithprop-prophidden-binary": "已隐藏二进制属性值($1)",
        "enotif_lastdiff": "要浏览此次更改,请参见$1",
        "enotif_anon_editor": "匿名用户$1",
        "enotif_body": "亲爱的$WATCHINGUSERNAME:\n\n您好!\n$PAGEINTRO$NEWPAGE\n\n编辑摘要:$PAGESUMMARY $PAGEMINOREDIT\n\n可通过以下方式联系编辑者:\n电子邮件:$PAGEEDITOR_EMAIL\n用户页面:$PAGEEDITOR_WIKI\n\n在您登录并访问该页面之前,我们不会发送新增更改的通知。您也可以重设您的监视列表中所有监视页面的通知标志。\n\n{{SITENAME}}通知系统\n\n--\n更改邮件通知设置:\n{{canonicalurl:{{#special:Preferences}}}}\n更改监视列表设置:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n从监视列表中删除该页面:\n$UNWATCHURL\n反馈与其他帮助:\n$HELPPAGE",
+       "enotif_minoredit": "这是一个小编辑",
        "created": "创建",
        "changed": "更改",
        "deletepage": "删除页面",
diff --git a/maintenance/benchmarks/benchmarkLruHash.php b/maintenance/benchmarks/benchmarkLruHash.php
new file mode 100644 (file)
index 0000000..1541f82
--- /dev/null
@@ -0,0 +1,97 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Benchmark
+ */
+
+require_once __DIR__ . '/Benchmarker.php';
+
+/**
+ * Maintenance script that benchmarks HashBagOStuff and MapCacheLRU.
+ *
+ * @ingroup Benchmark
+ */
+class BenchmarkLruHash extends Benchmarker {
+       protected $defaultCount = 1000;
+
+       public function __construct() {
+               parent::__construct();
+               $this->addDescription( 'Benchmarks HashBagOStuff and MapCacheLRU.' );
+               $this->addOption( 'construct', 'Run construct only', false, false );
+               $this->addOption( 'fill', 'Run fill only', false, false );
+       }
+
+       public function execute() {
+               $exampleKeys = [];
+               $max = 100;
+               $count = 500;
+               while ( $count-- ) {
+                       $exampleKeys[] = wfRandomString();
+               }
+               // 1000 keys (1...500, 500...1)
+               $keys = array_merge( $exampleKeys, array_reverse( $exampleKeys ) );
+
+               $fill = $this->hasOption( 'fill' ) || !$this->hasOption( 'construct' );
+               $construct = $this->hasOption( 'construct' ) || !$this->hasOption( 'fill' );
+               $benches = [];
+
+               if ( $construct ) {
+                       $benches['HashBagOStuff-construct'] = [
+                               'function' => function () use ( $max ) {
+                                       $obj = new HashBagOStuff( [ 'maxKeys' => $max ] );
+                               },
+                       ];
+                       $benches['MapCacheLRU-construct'] = [
+                               'function' => function () use ( $max ) {
+                                       $obj = new MapCacheLRU( $max );
+                               },
+                       ];
+               }
+
+               if ( $fill ) {
+                       // For the fill bechmark, ensure object creation is not measured.
+                       $hObj = null;
+                       $benches['HashBagOStuff-fill'] = [
+                               'setup' => function () use ( &$hObj, $max ) {
+                                       $hObj = new HashBagOStuff( [ 'maxKeys' => $max ] );
+                               },
+                               'function' => function () use ( &$hObj, &$keys ) {
+                                       foreach ( $keys as $i => $key ) {
+                                               $hObj->set( $key, $i );
+                                       }
+                               }
+                       ];
+                       $mObj = null;
+                       $benches['MapCacheLRU-fill'] = [
+                               'setup' => function () use ( &$mObj, $max ) {
+                                       $mObj = new MapCacheLRU( $max );
+                               },
+                               'function' => function () use ( &$mObj, &$keys ) {
+                                       foreach ( $keys as $i => $key ) {
+                                               $mObj->set( $key, $i );
+                                       }
+                               }
+                       ];
+               }
+
+               $this->bench( $benches );
+       }
+}
+
+$maintClass = BenchmarkLruHash::class;
+require_once RUN_MAINTENANCE_IF_MAIN;
index 2c8c8b0..899d80d 100644 (file)
@@ -66,7 +66,8 @@
                                        "mw.Upload*",
                                        "mw.ForeignUpload",
                                        "mw.ForeignStructuredUpload*",
-                                       "mw.GallerySlideshow"
+                                       "mw.GallerySlideshow",
+                                       "mw.rcfilters*"
                                ]
                        },
                        {
diff --git a/maintenance/mssql/archives/patch-add-3d.sql b/maintenance/mssql/archives/patch-add-3d.sql
new file mode 100644 (file)
index 0000000..51d2775
--- /dev/null
@@ -0,0 +1,27 @@
+ALTER TABLE /*$wgDBprefix*/image
+       DROP CONSTRAINT img_media_type_ckc;
+
+ALTER TABLE /*$wgDBprefix*/image
+       ADD CONSTRAINT img_media_type_ckc
+       CHECK (img_media_type IN("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D"));
+
+ALTER TABLE /*$wgDBprefix*/oldimage
+       DROP CONSTRAINT oi_media_type_ckc;
+
+ALTER TABLE /*$wgDBprefix*/oldimage
+       ADD CONSTRAINT oi_media_type_ckc
+       CHECK (oi_media_type IN("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D"));
+
+ALTER TABLE /*$wgDBprefix*/filearchive
+       DROP CONSTRAINT fa_media_type_ckc;
+
+ALTER TABLE /*$wgDBprefix*/filearchive
+       ADD CONSTRAINT fa_media_type_ckc
+       CHECK (fa_media_type IN("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D"));
+
+ALTER TABLE /*$wgDBprefix*/uploadstash
+       DROP CONSTRAINT us_media_type_ckc;
+
+ALTER TABLE /*$wgDBprefix*/uploadstash
+       ADD CONSTRAINT us_media_type_ckc
+       CHECK (us_media_type IN("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D"));
index 3babb39..2a67294 100644 (file)
@@ -610,7 +610,7 @@ CREATE TABLE /*_*/image (
   img_sha1 nvarchar(32) NOT NULL default '',
 
   CONSTRAINT img_major_mime_ckc check (img_major_mime IN('unknown', 'application', 'audio', 'image', 'text', 'video', 'message', 'model', 'multipart', 'chemical')),
-  CONSTRAINT img_media_type_ckc check (img_media_type in('UNKNOWN', 'BITMAP', 'DRAWING', 'AUDIO', 'VIDEO', 'MULTIMEDIA', 'OFFICE', 'TEXT', 'EXECUTABLE', 'ARCHIVE'))
+  CONSTRAINT img_media_type_ckc check (img_media_type in('UNKNOWN', 'BITMAP', 'DRAWING', 'AUDIO', 'VIDEO', 'MULTIMEDIA', 'OFFICE', 'TEXT', 'EXECUTABLE', 'ARCHIVE','3D'))
 );
 
 CREATE INDEX /*i*/img_usertext_timestamp ON /*_*/image (img_user_text,img_timestamp);
@@ -656,7 +656,7 @@ CREATE TABLE /*_*/oldimage (
   oi_sha1 nvarchar(32) NOT NULL default '',
 
   CONSTRAINT oi_major_mime_ckc check (oi_major_mime IN('unknown', 'application', 'audio', 'image', 'text', 'video', 'message', 'model', 'multipart', 'chemical')),
-  CONSTRAINT oi_media_type_ckc check (oi_media_type IN('UNKNOWN', 'BITMAP', 'DRAWING', 'AUDIO', 'VIDEO', 'MULTIMEDIA', 'OFFICE', 'TEXT', 'EXECUTABLE', 'ARCHIVE'))
+  CONSTRAINT oi_media_type_ckc check (oi_media_type IN('UNKNOWN', 'BITMAP', 'DRAWING', 'AUDIO', 'VIDEO', 'MULTIMEDIA', 'OFFICE', 'TEXT', 'EXECUTABLE', 'ARCHIVE','3D'))
 );
 
 CREATE INDEX /*i*/oi_usertext_timestamp ON /*_*/oldimage (oi_user_text,oi_timestamp);
@@ -715,7 +715,7 @@ CREATE TABLE /*_*/filearchive (
   fa_sha1 nvarchar(32) NOT NULL default '',
 
   CONSTRAINT fa_major_mime_ckc check (fa_major_mime in('unknown', 'application', 'audio', 'image', 'text', 'video', 'message', 'model', 'multipart', 'chemical')),
-  CONSTRAINT fa_media_type_ckc check (fa_media_type in('UNKNOWN', 'BITMAP', 'DRAWING', 'AUDIO', 'VIDEO', 'MULTIMEDIA', 'OFFICE', 'TEXT', 'EXECUTABLE', 'ARCHIVE'))
+  CONSTRAINT fa_media_type_ckc check (fa_media_type in('UNKNOWN', 'BITMAP', 'DRAWING', 'AUDIO', 'VIDEO', 'MULTIMEDIA', 'OFFICE', 'TEXT', 'EXECUTABLE', 'ARCHIVE','3D'))
 );
 
 -- pick out by image name
@@ -776,7 +776,7 @@ CREATE TABLE /*_*/uploadstash (
   us_image_height int,
   us_image_bits smallint,
 
-  CONSTRAINT us_media_type_ckc check (us_media_type in('UNKNOWN', 'BITMAP', 'DRAWING', 'AUDIO', 'VIDEO', 'MULTIMEDIA', 'OFFICE', 'TEXT', 'EXECUTABLE', 'ARCHIVE'))
+  CONSTRAINT us_media_type_ckc check (us_media_type in('UNKNOWN', 'BITMAP', 'DRAWING', 'AUDIO', 'VIDEO', 'MULTIMEDIA', 'OFFICE', 'TEXT', 'EXECUTABLE', 'ARCHIVE', '3D'))
 );
 
 -- sometimes there's a delete for all of a user's stuff.
diff --git a/maintenance/postgres/archives/patch-add-3d.sql b/maintenance/postgres/archives/patch-add-3d.sql
new file mode 100644 (file)
index 0000000..f892755
--- /dev/null
@@ -0,0 +1 @@
+ALTER TYPE media_type ADD VALUE '3D';
index e19c447..03fd03a 100644 (file)
@@ -393,7 +393,7 @@ CREATE INDEX fa_nouser    ON filearchive (fa_deleted_user);
 CREATE INDEX fa_sha1      ON filearchive (fa_sha1);
 
 CREATE SEQUENCE uploadstash_us_id_seq;
-CREATE TYPE media_type AS ENUM ('UNKNOWN','BITMAP','DRAWING','AUDIO','VIDEO','MULTIMEDIA','OFFICE','TEXT','EXECUTABLE','ARCHIVE');
+CREATE TYPE media_type AS ENUM ('UNKNOWN','BITMAP','DRAWING','AUDIO','VIDEO','MULTIMEDIA','OFFICE','TEXT','EXECUTABLE','ARCHIVE','3D');
 
 CREATE TABLE uploadstash (
   us_id           INTEGER PRIMARY KEY NOT NULL DEFAULT nextval('uploadstash_us_id_seq'),
index 3e1654a..578a226 100644 (file)
@@ -72,7 +72,7 @@ class RefreshLinks extends Maintenance {
                        if ( !$title ) {
                                $this->error( "'$category' is an invalid category name!\n", true );
                        }
-                       $this->refreshCategory( $category );
+                       $this->refreshCategory( $title );
                } elseif ( ( $category = $this->getOption( 'tracking-category', false ) ) !== false ) {
                        $this->refreshTrackingCategory( $category );
                } elseif ( !$this->hasOption( 'dfn-only' ) ) {
diff --git a/maintenance/sqlite/archives/patch-add-3d.sql b/maintenance/sqlite/archives/patch-add-3d.sql
new file mode 100644 (file)
index 0000000..10d74fb
--- /dev/null
@@ -0,0 +1,249 @@
+-- image
+
+CREATE TABLE /*_*/image_tmp (
+  -- Filename.
+  -- This is also the title of the associated description page,
+  -- which will be in namespace 6 (NS_FILE).
+  img_name varchar(255) binary NOT NULL default '' PRIMARY KEY,
+
+  -- File size in bytes.
+  img_size int unsigned NOT NULL default 0,
+
+  -- For images, size in pixels.
+  img_width int NOT NULL default 0,
+  img_height int NOT NULL default 0,
+
+  -- Extracted Exif metadata stored as a serialized PHP array.
+  img_metadata mediumblob NOT NULL,
+
+  -- For images, bits per pixel if known.
+  img_bits int NOT NULL default 0,
+
+  -- Media type as defined by the MEDIATYPE_xxx constants
+  img_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D") default NULL,
+
+  -- major part of a MIME media type as defined by IANA
+  -- see https://www.iana.org/assignments/media-types/
+  -- for "chemical" cf. http://dx.doi.org/10.1021/ci9803233 by the ACS
+  img_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart", "chemical") NOT NULL default "unknown",
+
+  -- minor part of a MIME media type as defined by IANA
+  -- the minor parts are not required to adher to any standard
+  -- but should be consistent throughout the database
+  -- see https://www.iana.org/assignments/media-types/
+  img_minor_mime varbinary(100) NOT NULL default "unknown",
+
+  -- Description field as entered by the uploader.
+  -- This is displayed in image upload history and logs.
+  img_description varbinary(767) NOT NULL,
+
+  -- user_id and user_name of uploader.
+  img_user int unsigned NOT NULL default 0,
+  img_user_text varchar(255) binary NOT NULL,
+
+  -- Time of the upload.
+  img_timestamp varbinary(14) NOT NULL default '',
+
+  -- SHA-1 content hash in base-36
+  img_sha1 varbinary(32) NOT NULL default ''
+) /*$wgDBTableOptions*/;
+
+INSERT INTO /*_*/image_tmp
+       SELECT img_name, img_size, img_width, img_height, img_metadata, img_bits,
+       img_media_type, img_major_mime, img_minor_mime, img_description,
+       img_user, img_user_text, img_timestamp, img_sha1
+               FROM /*_*/image;
+
+DROP TABLE /*_*/image;
+
+ALTER TABLE /*_*/image_tmp RENAME TO /*_*/image;
+
+-- Used by Special:Newimages and ApiQueryAllImages
+CREATE INDEX /*i*/img_user_timestamp ON /*_*/image (img_user,img_timestamp);
+CREATE INDEX /*i*/img_usertext_timestamp ON /*_*/image (img_user_text,img_timestamp);
+-- Used by Special:ListFiles for sort-by-size
+CREATE INDEX /*i*/img_size ON /*_*/image (img_size);
+-- Used by Special:Newimages and Special:ListFiles
+CREATE INDEX /*i*/img_timestamp ON /*_*/image (img_timestamp);
+-- Used in API and duplicate search
+CREATE INDEX /*i*/img_sha1 ON /*_*/image (img_sha1(10));
+-- Used to get media of one type
+CREATE INDEX /*i*/img_media_mime ON /*_*/image (img_media_type,img_major_mime,img_minor_mime);
+
+-- oldimage
+
+CREATE TABLE /*_*/oldimage_tmp (
+  -- Base filename: key to image.img_name
+  oi_name varchar(255) binary NOT NULL default '',
+
+  -- Filename of the archived file.
+  -- This is generally a timestamp and '!' prepended to the base name.
+  oi_archive_name varchar(255) binary NOT NULL default '',
+
+  -- Other fields as in image...
+  oi_size int unsigned NOT NULL default 0,
+  oi_width int NOT NULL default 0,
+  oi_height int NOT NULL default 0,
+  oi_bits int NOT NULL default 0,
+  oi_description varbinary(767) NOT NULL,
+  oi_user int unsigned NOT NULL default 0,
+  oi_user_text varchar(255) binary NOT NULL,
+  oi_timestamp binary(14) NOT NULL default '',
+
+  oi_metadata mediumblob NOT NULL,
+  oi_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D") default NULL,
+  oi_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart", "chemical") NOT NULL default "unknown",
+  oi_minor_mime varbinary(100) NOT NULL default "unknown",
+  oi_deleted tinyint unsigned NOT NULL default 0,
+  oi_sha1 varbinary(32) NOT NULL default ''
+) /*$wgDBTableOptions*/;
+
+INSERT INTO /*_*/oldimage_tmp
+       SELECT oi_name, oi_archive_name, oi_size, oi_width, oi_height, oi_bits,
+       oi_description, oi_user, oi_user_text, oi_timestamp, oi_metadata,
+       oi_media_type, oi_major_mime, oi_minor_mime, oi_deleted, oi_sha1
+               FROM /*_*/oldimage;
+
+DROP TABLE /*_*/oldimage;
+
+ALTER TABLE oldimage_tmp RENAME TO /*_*/oldimage;
+
+CREATE INDEX /*i*/oi_usertext_timestamp ON /*_*/oldimage (oi_user_text,oi_timestamp);
+CREATE INDEX /*i*/oi_name_timestamp ON /*_*/oldimage (oi_name,oi_timestamp);
+-- oi_archive_name truncated to 14 to avoid key length overflow
+CREATE INDEX /*i*/oi_name_archive_name ON /*_*/oldimage (oi_name,oi_archive_name(14));
+CREATE INDEX /*i*/oi_sha1 ON /*_*/oldimage (oi_sha1(10));
+
+-- filearchive
+
+CREATE TABLE /*_*/filearchive_tmp (
+  -- Unique row id
+  fa_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
+
+  -- Original base filename; key to image.img_name, page.page_title, etc
+  fa_name varchar(255) binary NOT NULL default '',
+
+  -- Filename of archived file, if an old revision
+  fa_archive_name varchar(255) binary default '',
+
+  -- Which storage bin (directory tree or object store) the file data
+  -- is stored in. Should be 'deleted' for files that have been deleted;
+  -- any other bin is not yet in use.
+  fa_storage_group varbinary(16),
+
+  -- SHA-1 of the file contents plus extension, used as a key for storage.
+  -- eg 8f8a562add37052a1848ff7771a2c515db94baa9.jpg
+  --
+  -- If NULL, the file was missing at deletion time or has been purged
+  -- from the archival storage.
+  fa_storage_key varbinary(64) default '',
+
+  -- Deletion information, if this file is deleted.
+  fa_deleted_user int,
+  fa_deleted_timestamp binary(14) default '',
+  fa_deleted_reason varbinary(767) default '',
+
+  -- Duped fields from image
+  fa_size int unsigned default 0,
+  fa_width int default 0,
+  fa_height int default 0,
+  fa_metadata mediumblob,
+  fa_bits int default 0,
+  fa_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D") default NULL,
+  fa_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart", "chemical") default "unknown",
+  fa_minor_mime varbinary(100) default "unknown",
+  fa_description varbinary(767),
+  fa_user int unsigned default 0,
+  fa_user_text varchar(255) binary,
+  fa_timestamp binary(14) default '',
+
+  -- Visibility of deleted revisions, bitfield
+  fa_deleted tinyint unsigned NOT NULL default 0,
+
+  -- sha1 hash of file content
+  fa_sha1 varbinary(32) NOT NULL default ''
+) /*$wgDBTableOptions*/;
+
+INSERT INTO /*_*/filearchive_tmp
+       SELECT fa_id, fa_name, fa_archive_name, fa_storage_group, fa_storage_key, fa_deleted_user, fa_deleted_timestamp,
+       fa_deleted_reason, fa_size, fa_width, fa_height, fa_metadata, fa_bits, fa_media_type, fa_major_mime,
+       fa_minor_mime, fa_description, fa_user, fa_user_text, fa_timestamp, fa_deleted, fa_sha1
+               FROM /*_*/filearchive;
+
+DROP TABLE /*_*/filearchive;
+
+ALTER TABLE /*_*/filearchive_tmp RENAME TO /*_*/filearchive;
+
+-- pick out by image name
+CREATE INDEX /*i*/fa_name ON /*_*/filearchive (fa_name, fa_timestamp);
+-- pick out dupe files
+CREATE INDEX /*i*/fa_storage_group ON /*_*/filearchive (fa_storage_group, fa_storage_key);
+-- sort by deletion time
+CREATE INDEX /*i*/fa_deleted_timestamp ON /*_*/filearchive (fa_deleted_timestamp);
+-- sort by uploader
+CREATE INDEX /*i*/fa_user_timestamp ON /*_*/filearchive (fa_user_text,fa_timestamp);
+-- find file by sha1, 10 bytes will be enough for hashes to be indexed
+CREATE INDEX /*i*/fa_sha1 ON /*_*/filearchive (fa_sha1(10));
+
+-- uploadstash
+
+CREATE TABLE /*_*/uploadstash_tmp (
+  us_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
+
+  -- the user who uploaded the file.
+  us_user int unsigned NOT NULL,
+
+  -- file key. this is how applications actually search for the file.
+  -- this might go away, or become the primary key.
+  us_key varchar(255) NOT NULL,
+
+  -- the original path
+  us_orig_path varchar(255) NOT NULL,
+
+  -- the temporary path at which the file is actually stored
+  us_path varchar(255) NOT NULL,
+
+  -- which type of upload the file came from (sometimes)
+  us_source_type varchar(50),
+
+  -- the date/time on which the file was added
+  us_timestamp varbinary(14) NOT NULL,
+
+  us_status varchar(50) NOT NULL,
+
+  -- chunk counter starts at 0, current offset is stored in us_size
+  us_chunk_inx int unsigned NULL,
+
+  -- Serialized file properties from FSFile::getProps()
+  us_props blob,
+
+  -- file size in bytes
+  us_size int unsigned NOT NULL,
+  -- this hash comes from FSFile::getSha1Base36(), and is 31 characters
+  us_sha1 varchar(31) NOT NULL,
+  us_mime varchar(255),
+  -- Media type as defined by the MEDIATYPE_xxx constants, should duplicate definition in the image table
+  us_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D") default NULL,
+  -- image-specific properties
+  us_image_width int unsigned,
+  us_image_height int unsigned,
+  us_image_bits smallint unsigned
+
+) /*$wgDBTableOptions*/;
+
+INSERT INTO /*_*/uploadstash_tmp
+       SELECT us_id, us_user, us_key, us_orig_path, us_path, us_source_type,
+       us_timestamp, us_status, us_chunk_inx, us_props, us_size, us_sha1, us_mime,
+       us_media_type, us_image_width, us_image_height, us_image_bits
+               FROM /*_*/uploadstash;
+
+DROP TABLE uploadstash;
+
+ALTER TABLE /*_*/uploadstash_tmp RENAME TO /*_*/uploadstash;
+
+-- sometimes there's a delete for all of a user's stuff.
+CREATE INDEX /*i*/us_user ON /*_*/uploadstash (us_user);
+-- pick out files by key, enforce key uniqueness
+CREATE UNIQUE INDEX /*i*/us_key ON /*_*/uploadstash (us_key);
+-- the abandoned upload cleanup script needs this
+CREATE INDEX /*i*/us_timestamp ON /*_*/uploadstash (us_timestamp);
index 287a40c..b7e8c1c 100644 (file)
@@ -69,7 +69,8 @@ foreach ( $lines as $line ) {
 }
 
 $contributors = array_keys( $contributors );
-$collator = Collator::create( 'uca-default-u-kn' );
+$collator = Collator::create( 'root' );
+$collator->setAttribute( Collator::NUMERIC_COLLATION, Collator::ON );
 $collator->sort( $contributors );
 array_walk( $contributors, function ( &$v, $k ) {
        $v = "* {$v}";
index f725efe..e3d8a1b 100644 (file)
@@ -1853,6 +1853,7 @@ return [
                        'rcfilters-savedqueries-new-name-placeholder',
                        'rcfilters-savedqueries-add-new-title',
                        'rcfilters-savedqueries-apply-label',
+                       'rcfilters-savedqueries-apply-and-setdefault-label',
                        'rcfilters-savedqueries-cancel-label',
                        'rcfilters-restore-default-filters',
                        'rcfilters-clear-all-filters',
@@ -1880,6 +1881,7 @@ return [
                        'rcfilters-view-tags-tooltip',
                        'rcfilters-view-return-to-default-tooltip',
                        'rcfilters-liveupdates-button',
+                       'rcfilters-other-review-tools',
                        'blanknamespace',
                        'namespaces',
                        'invert',
@@ -1888,6 +1890,7 @@ return [
                ],
                'dependencies' => [
                        'oojs-ui',
+                       'jquery.makeCollapsible',
                        'mediawiki.language',
                        'mediawiki.user',
                        'mediawiki.rcfilters.filters.dm',
@@ -2239,6 +2242,7 @@ return [
        ],
        // Used in the web installer. Test it after modifying this definition!
        'mediawiki.legacy.shared' => [
+               'targets' => [ 'desktop', 'mobile' ],
                'styles' => [
                        'resources/src/mediawiki.legacy/shared.css' => [ 'media' => 'screen' ]
                ],
index ff36c1a..cd1ca31 100644 (file)
@@ -287,19 +287,21 @@ img.thumbborder {
 
 /**
  * Table rendering
- * As on shared.css but with white background.
  */
+/* Compare `table.wikitable` in shared.css */
 table.wikitable,
-table.mw_metadata {
+.mw_metadata {
        background: #fff;
        margin: 1em 0;
        border: 1pt solid #aaa;
        border-collapse: collapse;
+       font-size: 10pt;
 }
 
 table.wikitable > caption,
 .mw_metadata caption {
-       font-weight: bold;
+       padding: 5px;
+       font-size: 10pt;
 }
 
 table.wikitable > tr > th,
@@ -308,15 +310,17 @@ table.wikitable > * > tr > th,
 table.wikitable > * > tr > td,
 .mw_metadata th,
 .mw_metadata td {
+       /* Important is required to override any inline styles provided by editors */
+       background: #fff !important; /* stylelint-disable-line declaration-no-important */
+       /* We need to also set color in case editors applied a light text color */
+       color: #000 !important; /* stylelint-disable-line declaration-no-important */
        border: 1pt solid #aaa;
-       padding: 0.2em;
+       padding: 0.4em 0.6em;
 }
 
 table.wikitable > tr > th,
 table.wikitable > * > tr > th,
 .mw_metadata th {
-       background: #fff;
-       font-weight: bold;
        text-align: center;
 }
 
index b6eda0f..5cca5d8 100644 (file)
@@ -11,6 +11,8 @@
         * @cfg {string} [type='send_unselected_if_any'] Group type
         * @cfg {string} [view='default'] Name of the display group this group
         *  is a part of.
+        * @cfg {boolean} [isSticky] This group is using a 'sticky' default; meaning
+        *  that every time a value is changed, it becomes the new default
         * @cfg {string} [title] Group title
         * @cfg {boolean} [hidden] This group is hidden from the regular menu views
         * @cfg {boolean} [allowArbitrary] Allows for an arbitrary value to be added to the
@@ -38,6 +40,7 @@
                this.name = name;
                this.type = config.type || 'send_unselected_if_any';
                this.view = config.view || 'default';
+               this.sticky = !!config.isSticky;
                this.title = config.title || name;
                this.hidden = !!config.hidden;
                this.allowArbitrary = !!config.allowArbitrary;
@@ -90,7 +93,6 @@
                        var subsetNames = [],
                                filterItem = new mw.rcfilters.dm.FilterItem( filter.name, model, {
                                        group: model.getName(),
-                                       useDefaultAsBaseValue: !!filter.useDefaultAsBaseValue,
                                        label: filter.label || filter.name,
                                        description: filter.description || '',
                                        labelPrefixKey: model.labelPrefixKey,
                        // For this group, the parameter is the group name,
                        // and a single item can be selected: default or first item
                        this.defaultParams[ this.getName() ] = defaultParam;
-
-                       // Single option means there must be a single option
-                       // selected, so we have to either select the default
-                       // or select the first option
-                       this.selectItemByParamName( defaultParam );
                }
 
                // Store default filter state based on default params
                this.defaultFilters = this.getFilterRepresentation( this.getDefaultParams() );
 
                // Check for filters that should be initially selected by their default value
-               this.getItems().forEach( function ( item ) {
-                       if (
-                               item.isUsingDefaultAsBaseValue() &&
-                               (
-                                       // This setting can only be applied to these groups
-                                       // the other groups are way too complex for that
-                                       model.getType() === 'single_option' ||
-                                       model.getType() === 'boolean'
-                               )
-                       ) {
-                               // Apply selection
-                               item.toggleSelected( !!model.defaultFilters[ item.getName() ] );
-                       }
-               } );
+               if ( this.isSticky() ) {
+                       $.each( this.defaultFilters, function ( filterName, filterValue ) {
+                               model.getItemByName( filterName ).toggleSelected( filterValue );
+                       } );
+               }
+
+               // Verify that single_option group has at least one item selected
+               if (
+                       this.getType() === 'single_option' &&
+                       this.getSelectedItems().length === 0
+               ) {
+                       defaultParam = groupDefault !== undefined ?
+                               groupDefault : this.getItems()[ 0 ].getParamName();
+
+                       // Single option means there must be a single option
+                       // selected, so we have to either select the default
+                       // or select the first option
+                       this.selectItemByParamName( defaultParam );
+               }
        };
 
        /**
                        // Single option means there must be a single option
                        // selected, so we have to either select the default
                        // or select the first option
-                       this.currSelected = this.getItemByParamName( this.defaultParams[ this.getName() ] );
+                       this.currSelected = this.getItemByParamName( this.defaultParams[ this.getName() ] ) ||
+                               this.getItems()[ 0 ];
                        this.currSelected.toggleSelected( true );
                        changed = true;
                }
                        this.active !== active ||
                        this.currSelected !== item
                ) {
+                       if ( this.isSticky() ) {
+                               // If this group is sticky, then change the default according to the
+                               // current selection.
+                               this.defaultParams = this.getParamRepresentation( this.getSelectedState() );
+                       }
+
                        this.active = active;
                        this.currSelected = item;
 
                                // This means we have not been given a filter representation
                                // so we are building one based on current state
                                filterRepresentation[ item.getName() ] = item.isSelected();
-                       } else if ( !filterRepresentation[ item.getName() ] ) {
+                       } else if ( filterRepresentation[ item.getName() ] === undefined ) {
                                // We are given a filter representation, but we have to make
                                // sure that we fill in the missing filters if there are any
-                               // we will assume they are all falsey, unless they have
-                               // isUsingDefaultAsBaseValue, in which case they get their
-                               // default state
-                               if (
-                                       item.isUsingDefaultAsBaseValue() &&
-                                       (
-                                               // This setting can only be applied to these groups
-                                               // the other groups are way too complex for that
-                                               model.getType() === 'single_option' ||
-                                               model.getType() === 'boolean'
-                                       )
-                               ) {
+                               // we will assume they are all falsey
+                               if ( model.isSticky() ) {
                                        filterRepresentation[ item.getName() ] = !!defaultFilters[ item.getName() ];
                                } else {
                                        filterRepresentation[ item.getName() ] = false;
         * @return {Object} Filter representation
         */
        mw.rcfilters.dm.FilterGroup.prototype.getFilterRepresentation = function ( paramRepresentation ) {
-               var areAnySelected, paramValues, defaultValue, item, currentValue,
+               var areAnySelected, paramValues, item, currentValue,
                        oneWasSelected = false,
                        defaultParams = this.getDefaultParams(),
-                       defaultFilters = this.getDefaultFilters(),
                        expandedParams = $.extend( true, {}, paramRepresentation ),
                        model = this,
                        paramToFilterMap = {},
                        result = {};
 
+               if ( this.isSticky() ) {
+                       // If the group is sticky, check if all parameters are represented
+                       // and for those that aren't represented, add them with their default
+                       // values
+                       paramRepresentation = $.extend( true, {}, this.getDefaultParams(), paramRepresentation );
+               }
+
                paramRepresentation = paramRepresentation || {};
                if (
                        this.getType() === 'send_unselected_if_any' ||
                        } );
 
                        $.each( expandedParams, function ( paramName, paramValue ) {
-                               var value = paramValue,
-                                       filterItem = paramToFilterMap[ paramName ];
+                               var filterItem = paramToFilterMap[ paramName ];
 
                                if ( model.getType() === 'send_unselected_if_any' ) {
                                        // Flip the definition between the parameter
                                                false;
                                } else if ( model.getType() === 'boolean' ) {
                                        // Straight-forward definition of state
-                                       if (
-                                               filterItem.isUsingDefaultAsBaseValue() &&
-                                               paramRepresentation[ filterItem.getParamName() ] === undefined
-                                       ) {
-                                               value = defaultParams[ filterItem.getParamName() ];
-                                       }
-                                       result[ filterItem.getName() ] = !!Number( value );
+                                       result[ filterItem.getName() ] = !!Number( paramRepresentation[ filterItem.getParamName() ] );
                                }
                        } );
                } else if ( this.getType() === 'string_options' ) {
                } else if ( this.getType() === 'single_option' ) {
                        // There is parameter that fits a single filter and if not, get the default
                        this.getItems().forEach( function ( filterItem ) {
-                               var selected = false;
+                               var selected = filterItem.getParamName() === paramRepresentation[ model.getName() ];
 
-                               if (
-                                       filterItem.isUsingDefaultAsBaseValue() &&
-                                       paramRepresentation[ model.getName() ] === undefined
-                               ) {
-                                       selected = !!Number( paramRepresentation[ model.getName() ] );
-                               } else {
-                                       selected = filterItem.getParamName() === paramRepresentation[ model.getName() ];
-                               }
                                result[ filterItem.getName() ] = selected;
                                oneWasSelected = oneWasSelected || selected;
                        } );
                // Go over result and make sure all filters are represented.
                // If any filters are missing, they will get a falsey value
                this.getItems().forEach( function ( filterItem ) {
-                       if (
-                               (
-                                       // This setting can only be applied to these groups
-                                       // the other groups are way too complex for that
-                                       model.getType() === 'single_option' ||
-                                       model.getType() === 'boolean'
-                               ) &&
-                               result[ filterItem.getName() ] === undefined &&
-                               filterItem.isUsingDefaultAsBaseValue()
-                       ) {
-                               result[ filterItem.getName() ] = !!defaultFilters[ filterItem.getName() ];
+                       if ( result[ filterItem.getName() ] === undefined ) {
+                               result[ filterItem.getName() ] = false;
                        }
-                       oneWasSelected = oneWasSelected || !!result[ filterItem.getName() ];
                } );
 
                // Make sure that at least one option is selected in
                        this.getType() === 'single_option' &&
                        !oneWasSelected
                ) {
-                       defaultValue = this.getDefaultParams();
-                       item = this.getItemByParamName( defaultValue[ this.getName() ] );
+                       if ( defaultParams[ this.getName() ] ) {
+                               item = this.getItemByParamName( defaultParams[ this.getName() ] );
+                       } else {
+                               item = this.getItems()[ 0 ];
+                       }
                        result[ item.getName() ] = true;
                }
 
                return result;
        };
 
+       /**
+        * Get current selected state of all filter items in this group
+        *
+        * @return {Object} Selected state
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.getSelectedState = function () {
+               var state = {};
+
+               this.getItems().forEach( function ( filterItem ) {
+                       state[ filterItem.getName() ] = filterItem.isSelected();
+               } );
+
+               return state;
+       };
+
        /**
         * Get item by its filter name
         *
         */
        mw.rcfilters.dm.FilterGroup.prototype.selectItemByParamName = function ( paramName ) {
                this.getItems().forEach( function ( item ) {
-                       item.toggleSelected( item.getParamName() === paramName );
+                       item.toggleSelected( item.getParamName() === String( paramName ) );
                } );
        };
 
         */
        mw.rcfilters.dm.FilterGroup.prototype.getItemByParamName = function ( paramName ) {
                return this.getItems().filter( function ( item ) {
-                       return item.getParamName() === paramName;
+                       return item.getParamName() === String( paramName );
                } )[ 0 ];
        };
 
        mw.rcfilters.dm.FilterGroup.prototype.isFullCoverage = function () {
                return this.fullCoverage;
        };
+
+       /**
+        * Check whether the group is defined as sticky default
+        *
+        * @return {boolean} Group is sticky default
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.isSticky = function () {
+               return this.sticky;
+       };
 }( mediaWiki ) );
index 3281735..a6a22ef 100644 (file)
                return result;
        };
 
+       /**
+        * Get a parameter representation of all sticky parameters
+        *
+        * @return {Object} Sticky parameter values
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.getStickyParams = function () {
+               var result = {};
+
+               $.each( this.groups, function ( name, model ) {
+                       if ( model.isSticky() ) {
+                               $.extend( true, result, model.getDefaultParams() );
+                       }
+               } );
+
+               return result;
+       };
+
+       /**
+        * Get a filter representation of all sticky parameters
+        *
+        * @return {Object} Sticky filters values
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.getStickyFiltersState = function () {
+               var result = {};
+
+               $.each( this.groups, function ( name, model ) {
+                       if ( model.isSticky() ) {
+                               $.extend( true, result, model.getSelectedState() );
+                       }
+               } );
+
+               return result;
+       };
+
        /**
         * Analyze the groups and their filters and output an object representing
         * the state of the parameters they represent.
        /**
         * Get the highlight parameters based on current filter configuration
         *
-        * @return {Object} Object where keys are "<filter name>_color" and values
+        * @return {Object} Object where keys are `<filter name>_color` and values
         *                  are the selected highlight colors.
         */
        mw.rcfilters.dm.FiltersViewModel.prototype.getHighlightParameters = function () {
         *
         * @param {Object} representation Object containing representation of
         *  some or all highlight values
-        * @return {Object} Object where keys are "<filter name>_color" and values
+        * @return {Object} Object where keys are `<filter name>_color` and values
         *                  are the selected highlight colors. The returned object
         *                  contains all available filters either with a color value
         *                  or with null.
                        items = this.getFiltersByView( view );
 
                // Normalize so we can search strings regardless of case and view
-               query = query.toLowerCase();
+               query = query.trim().toLowerCase();
                if ( view !== 'default' ) {
                        query = query.substr( 1 );
                }
index 54a4dbe..aa82e21 100644 (file)
@@ -32,7 +32,6 @@
                this.namePrefix = config.namePrefix || 'item_';
                this.name = this.namePrefix + param;
 
-               this.useDefaultAsBaseValue = !!config.useDefaultAsBaseValue;
                this.label = config.label || this.name;
                this.labelPrefixKey = config.labelPrefixKey;
                this.description = config.description || '';
                return this.identifiers;
        };
 
-       /**
-        * Check whether the item uses its default state as a base value
-        *
-        * @return {boolean} Use default as base value
-        */
-       mw.rcfilters.dm.ItemModel.prototype.isUsingDefaultAsBaseValue = function () {
-               return this.useDefaultAsBaseValue;
-       };
-
        /**
         * Toggle the highlight feature on and off for this filter.
         * It only works if highlight is supported for this filter.
index 8536570..a7f3d23 100644 (file)
@@ -2,6 +2,7 @@
        /**
         * View model for saved queries
         *
+        * @class
         * @mixins OO.EventEmitter
         * @mixins OO.EmitterList
         *
         *  the above structure.
         * @param {Object} [baseState] An object representing the base state
         *  so we can normalize the data
+        * @param {string[]} [ignoreFilters] Filters to ignore and remove from
+        *  the data
         * @fires initialize
         */
-       mw.rcfilters.dm.SavedQueriesModel.prototype.initialize = function ( savedQueries, baseState ) {
+       mw.rcfilters.dm.SavedQueriesModel.prototype.initialize = function ( savedQueries, baseState, ignoreFilters ) {
                var items = [],
                        defaultItem = null;
 
                savedQueries = savedQueries || {};
+               ignoreFilters = ignoreFilters || {};
 
                this.baseState = baseState;
 
                        // for existing users, who are only betalabs users at the moment.
                        normalizedData.highlights.highlight = !!Number( normalizedData.highlights.highlight );
 
+                       // Backwards-compat fix: Remove sticky parameters from the 'ignoreFilters' list
+                       ignoreFilters.forEach( function ( name ) {
+                               delete normalizedData.filters[ name ];
+                       } );
+
                        item = new mw.rcfilters.dm.SavedQueryItemModel(
                                id,
                                obj.label,
         *
         * @param {string} label Label for the new query
         * @param {Object} data Data for the new query
+        * @return {string} ID of the newly added query
         */
        mw.rcfilters.dm.SavedQueriesModel.prototype.addNewQuery = function ( label, data ) {
                var randomID = ( new Date() ).getTime(),
                                normalizedData
                        )
                ] );
+
+               return randomID;
        };
 
        /**
index 729aee3..c066a1f 100644 (file)
@@ -2,6 +2,7 @@
        /**
         * View model for a single saved query
         *
+        * @class
         * @mixins OO.EventEmitter
         *
         * @constructor
@@ -31,7 +32,7 @@
        /* Events */
 
        /**
-        * @update
+        * @event update
         *
         * Model has been updated
         */
@@ -63,7 +64,7 @@
        /**
         * Get query label
         *
-        * @return {label} Query label
+        * @return {string} Query label
         */
        mw.rcfilters.dm.SavedQueryItemModel.prototype.getLabel = function () {
                return this.label;
index 3b8ebbd..10ef6b2 100644 (file)
@@ -2,7 +2,9 @@
        /* eslint no-underscore-dangle: "off" */
        /**
         * Controller for the filters in Recent Changes
+        * @class
         *
+        * @constructor
         * @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
         * @param {Object} [tagList] Tag definition
         */
        mw.rcfilters.Controller.prototype.initialize = function ( filterStructure, namespaceStructure, tagList ) {
-               var parsedSavedQueries,
+               var parsedSavedQueries, limitDefault,
+                       controller = this,
                        views = {},
                        items = [],
                        uri = new mw.Uri(),
-                       $changesList = $( '.mw-changeslist' ).first().contents(),
-                       experimentalViews = mw.config.get( 'wgStructuredChangeFiltersEnableExperimentalViews' ),
-                       createFilterDataFromNumber = function ( num, convertedNumForLabel ) {
-                               return {
-                                       name: String( num ),
-                                       label: mw.language.convertNumber( convertedNumForLabel )
-                               };
-                       };
+                       $changesList = $( '.mw-changeslist' ).first().contents();
 
                // Prepare views
-               if ( namespaceStructure && experimentalViews ) {
+               if ( namespaceStructure ) {
                        items = [];
                        $.each( namespaceStructure, function ( namespaceID, label ) {
                                // Build and clean up the individual namespace items definition
@@ -75,7 +71,7 @@
                                } ]
                        };
                }
-               if ( tagList && experimentalViews ) {
+               if ( tagList ) {
                        views.tags = {
                                title: mw.msg( 'rcfilters-view-tags' ),
                                trigger: '#',
                        };
                }
 
+               // Convert the default from the old preference
+               // since the limit preference actually affects more
+               // than just the RecentChanges page
+               limitDefault = Number( mw.user.options.get( 'rcfilters-rclimit', mw.user.options.get( 'rclimit', '50' ) ) );
+
                // Add parameter range operations
                views.range = {
                        groups: [
                                        allowArbitrary: true,
                                        validate: $.isNumeric,
                                        sortFunc: function ( a, b ) { return Number( a.name ) - Number( b.name ); },
-                                       'default': '50',
+                                       'default': String( limitDefault ),
+                                       isSticky: true,
                                        filters: [ 50, 100, 250, 500 ].map( function ( num ) {
-                                               return createFilterDataFromNumber( num, num );
+                                               return controller._createFilterDataFromNumber( num, num );
                                        } )
                                },
                                {
                                        allowArbitrary: true,
                                        validate: $.isNumeric,
                                        sortFunc: function ( a, b ) { return Number( a.name ) - Number( b.name ); },
-                                       'default': '7',
+                                       numToLabelFunc: function ( i ) {
+                                               return Number( i ) < 1 ?
+                                                       ( Number( i ) * 24 ).toFixed( 2 ) :
+                                                       Number( i );
+                                       },
+                                       'default': mw.user.options.get( 'rcdays', '30' ),
+                                       isSticky: true,
                                        filters: [
                                                // Hours (1, 2, 6, 12)
                                                0.04166, 0.0833, 0.25, 0.5,
                                                // Days
                                                1, 3, 7, 14, 30
                                        ].map( function ( num ) {
-                                               return createFilterDataFromNumber(
+                                               return controller._createFilterDataFromNumber(
                                                        num,
                                                        // Convert fractions of days to number of hours for the labels
                                                        num < 1 ? Math.round( num * 24 ) : num
                        ]
                };
 
-               // Before we do anything, we need to see if we require another item in the
+               // Before we do anything, we need to see if we require additional items in the
                // groups that have 'AllowArbitrary'. For the moment, those are only single_option
                // groups; if we ever expand it, this might need further generalization:
                $.each( views, function ( viewName, viewData ) {
                        viewData.groups.forEach( function ( groupData ) {
-                               // This is only true for single_option and string_options
-                               // We assume these are the only groups that will allow for
-                               // arbitrary, since it doesn't make any sense for the other
-                               // groups.
-                               var uriValue = uri.query[ groupData.name ];
-
-                               if (
-                                       // If the group allows for arbitrary data
-                                       groupData.allowArbitrary &&
-                                       // and it is single_option (or string_options, but we
-                                       // don't have cases of those yet, nor do we plan to)
-                                       groupData.type === 'single_option' &&
-                                       // and if there is a valid value in the URI already
-                                       uri.query[ groupData.name ] !== undefined &&
-                                       // and, if there is a validate method and it passes on
-                                       // the data
-                                       ( !groupData.validate || groupData.validate( uri.query[ groupData.name ] ) ) &&
-                                       // but if that value isn't already in the definition
-                                       groupData.filters
-                                               .map( function ( filterData ) {
-                                                       return filterData.name;
-                                               } )
-                                               .indexOf( uri.query[ groupData.name ] ) === -1
-                               ) {
-                                       // Add the filter information
-                                       if ( groupData.name === 'days' ) {
-                                               // Specific fix for hours/days which go by the same param
-                                               groupData.filters.push( createFilterDataFromNumber(
-                                                       uriValue,
-                                                       // In this case we don't want to round because it can be arbitrary
-                                                       // weird numbers but we want to round to 2 decimal digits
-                                                       Number( uriValue ) < 1 ?
-                                                               ( Number( uriValue ) * 24 ).toFixed( 2 ) :
-                                                               Number( uriValue )
-                                               ) );
-                                       } else {
-                                               groupData.filters.push( createFilterDataFromNumber( uriValue, uriValue ) );
+                               var extraValues = [];
+                               if ( groupData.allowArbitrary ) {
+                                       // If the value in the URI isn't in the group, add it
+                                       if ( uri.query[ groupData.name ] !== undefined ) {
+                                               extraValues.push( uri.query[ groupData.name ] );
                                        }
-
-                                       // If there's a sort function set up, re-sort the values
-                                       if ( groupData.sortFunc ) {
-                                               groupData.filters.sort( groupData.sortFunc );
+                                       // If the default value isn't in the group, add it
+                                       if ( groupData.default !== undefined ) {
+                                               extraValues.push( String( groupData.default ) );
                                        }
+                                       controller.addNumberValuesToGroup( groupData, extraValues );
                                }
                        } );
                } );
                // can normalize them per each query item
                this.savedQueriesModel.initialize(
                        parsedSavedQueries,
-                       this._getBaseFilterState()
+                       this._getBaseFilterState(),
+                       // This is for backwards compatibility - delete all sticky filter states
+                       Object.keys( this.filtersModel.getStickyFiltersState() )
                );
 
                // Check whether we need to load defaults.
                this.switchView( 'default' );
        };
 
+       /**
+        * Create filter data from a number, for the filters that are numerical value
+        *
+        * @param {Number} num Number
+        * @param {Number} numForDisplay Number for the label
+        * @return {Object} Filter data
+        */
+       mw.rcfilters.Controller.prototype._createFilterDataFromNumber = function ( num, numForDisplay ) {
+               return {
+                       name: String( num ),
+                       label: mw.language.convertNumber( numForDisplay )
+               };
+       };
+
+       /**
+        * Add an arbitrary values to groups that allow arbitrary values
+        *
+        * @param {Object} groupData Group data
+        * @param {string|string[]} arbitraryValues An array of arbitrary values to add to the group
+        */
+       mw.rcfilters.Controller.prototype.addNumberValuesToGroup = function ( groupData, arbitraryValues ) {
+               var controller = this;
+
+               arbitraryValues = Array.isArray( arbitraryValues ) ? arbitraryValues : [ arbitraryValues ];
+
+               // This is only true for single_option group
+               // We assume these are the only groups that will allow for
+               // arbitrary, since it doesn't make any sense for the other
+               // groups.
+               arbitraryValues.forEach( function ( val ) {
+                       if (
+                               // If the group allows for arbitrary data
+                               groupData.allowArbitrary &&
+                               // and it is single_option (or string_options, but we
+                               // don't have cases of those yet, nor do we plan to)
+                               groupData.type === 'single_option' &&
+                               // and, if there is a validate method and it passes on
+                               // the data
+                               ( !groupData.validate || groupData.validate( val ) ) &&
+                               // but if that value isn't already in the definition
+                               groupData.filters
+                                       .map( function ( filterData ) {
+                                               return filterData.name;
+                                       } )
+                                       .indexOf( val ) === -1
+                       ) {
+                               // Add the filter information
+                               groupData.filters.push( controller._createFilterDataFromNumber(
+                                       val,
+                                       groupData.numToLabelFunc ?
+                                               groupData.numToLabelFunc( val ) :
+                                               val
+                               ) );
+
+                               // If there's a sort function set up, re-sort the values
+                               if ( groupData.sortFunc ) {
+                                       groupData.filters.sort( groupData.sortFunc );
+                               }
+                       }
+               } );
+       };
+
        /**
         * Switch the view of the filters model
         *
         */
        mw.rcfilters.Controller.prototype.resetToDefaults = function () {
                this.uriProcessor.updateModelBasedOnQuery( this._getDefaultParams() );
+
                this.updateChangesList();
        };
 
         * Save the current model state as a saved query
         *
         * @param {string} [label] Label of the saved query
+        * @param {boolean} [setAsDefault=false] This query should be set as the default
         */
-       mw.rcfilters.Controller.prototype.saveCurrentQuery = function ( label ) {
-               var highlightedItems = {},
-                       highlightEnabled = this.filtersModel.isHighlightEnabled();
+       mw.rcfilters.Controller.prototype.saveCurrentQuery = function ( label, setAsDefault ) {
+               var queryID,
+                       highlightedItems = {},
+                       highlightEnabled = this.filtersModel.isHighlightEnabled(),
+                       selectedState = this.filtersModel.getSelectedState();
 
                // Prepare highlights
                this.filtersModel.getHighlightedItems().forEach( function ( item ) {
                // These are filter states; highlight is stored as boolean
                highlightedItems.highlight = this.filtersModel.isHighlightEnabled();
 
+               // Delete all sticky filters
+               this._deleteStickyValuesFromFilterState( selectedState );
+
                // Add item
-               this.savedQueriesModel.addNewQuery(
+               queryID = this.savedQueriesModel.addNewQuery(
                        label || mw.msg( 'rcfilters-savedqueries-defaultlabel' ),
                        {
-                               filters: this.filtersModel.getSelectedState(),
+                               filters: selectedState,
                                highlights: highlightedItems,
                                invert: this.filtersModel.areNamespacesInverted()
                        }
                );
 
+               if ( setAsDefault ) {
+                       this.savedQueriesModel.setDefault( queryID );
+               }
+
                // Save item
                this._saveSavedQueries();
        };
                        highlights.highlight = highlights.highlights || highlights.highlight;
 
                        // Update model state from filters
-                       this.filtersModel.toggleFiltersSelected( data.filters );
+                       this.filtersModel.toggleFiltersSelected(
+                               // Merge filters with sticky values
+                               $.extend( true, {}, data.filters, this.filtersModel.getStickyFiltersState() )
+                       );
 
                        // Update namespace inverted property
                        this.filtersModel.toggleInvertedNamespaces( !!Number( data.invert ) );
         * @return {boolean} Query exists
         */
        mw.rcfilters.Controller.prototype.findQueryMatchingCurrentState = function () {
-               var highlightedItems = {};
+               var highlightedItems = {},
+                       selectedState = this.filtersModel.getSelectedState();
 
                // Prepare highlights of the current query
                this.filtersModel.getItemsSupportingHighlights().forEach( function ( item ) {
                } );
                highlightedItems.highlight = this.filtersModel.isHighlightEnabled();
 
+               // Remove sticky filters
+               this._deleteStickyValuesFromFilterState( selectedState );
+
                return this.savedQueriesModel.findMatchingQuery(
                        {
-                               filters: this.filtersModel.getSelectedState(),
+                               filters: selectedState,
                                highlights: highlightedItems,
                                invert: this.filtersModel.areNamespacesInverted()
                        }
                );
        };
 
+       /**
+        * Delete sticky filters from given object
+        *
+        * @param {Object} filterState Filter state
+        */
+       mw.rcfilters.Controller.prototype._deleteStickyValuesFromFilterState = function ( filterState ) {
+               // Remove sticky filters
+               $.each( this.filtersModel.getStickyFiltersState(), function ( filterName ) {
+                       delete filterState[ filterName ];
+               } );
+       };
+
        /**
         * Get an object representing the base state of parameters
         * and highlights.
                mw.user.options.set( 'rcfilters-saved-queries', stringified );
        };
 
+       /**
+        * Update sticky preferences with current model state
+        */
+       mw.rcfilters.Controller.prototype.updateStickyPreferences = function () {
+               // Update default sticky values with selected, whether they came from
+               // the initial defaults or from the URL value that is being normalized
+               this.updateDaysDefault( this.filtersModel.getGroup( 'days' ).getSelectedItems()[ 0 ].getParamName() );
+               this.updateLimitDefault( this.filtersModel.getGroup( 'limit' ).getSelectedItems()[ 0 ].getParamName() );
+       };
+
+       /**
+        * Update the limit default value
+        *
+        * @param {number} newValue New value
+        */
+       mw.rcfilters.Controller.prototype.updateLimitDefault = function ( newValue ) {
+               if ( !$.isNumeric( newValue ) ) {
+                       return;
+               }
+
+               newValue = Number( newValue );
+
+               if ( mw.user.options.get( 'rcfilters-rclimit' ) !== newValue ) {
+                       // Save the preference
+                       new mw.Api().saveOption( 'rcfilters-rclimit', newValue );
+                       // Update the preference for this session
+                       mw.user.options.set( 'rcfilters-rclimit', newValue );
+               }
+       };
+
+       /**
+        * Update the days default value
+        *
+        * @param {number} newValue New value
+        */
+       mw.rcfilters.Controller.prototype.updateDaysDefault = function ( newValue ) {
+               if ( !$.isNumeric( newValue ) ) {
+                       return;
+               }
+
+               newValue = Number( newValue );
+
+               if ( mw.user.options.get( 'rcdays' ) !== newValue ) {
+                       // Save the preference
+                       new mw.Api().saveOption( 'rcdays', newValue );
+                       // Update the preference for this session
+                       mw.user.options.set( 'rcdays', newValue );
+               }
+       };
+
        /**
         * Synchronize the URL with the current state of the filters
         * without adding an history entry.
 
                this.uriProcessor.updateModelBasedOnQuery( new mw.Uri().query );
 
+               // Update the sticky preferences, in case we received a value
+               // from the URL
+               this.updateStickyPreferences();
+
                // Only update and fetch new results if it is requested
                if ( fetchChangesList ) {
                        this.updateChangesList();
                        savedHighlights = {},
                        defaultSavedQueryItem = this.savedQueriesModel.getItemByID( this.savedQueriesModel.getDefault() );
 
-               if ( mw.config.get( 'wgStructuredChangeFiltersEnableSaving' ) &&
-                       defaultSavedQueryItem ) {
-
-                       data = defaultSavedQueryItem.getData();
-
-                       queryHighlights = data.highlights || {};
-                       savedParams = this.filtersModel.getParametersFromFilters( data.filters || {} );
-
-                       // Translate highlights to parameters
-                       savedHighlights.highlight = String( Number( queryHighlights.highlight ) );
-                       $.each( queryHighlights, function ( filterName, color ) {
-                               if ( filterName !== 'highlights' ) {
-                                       savedHighlights[ filterName + '_color' ] = color;
-                               }
-                       } );
-
-                       return $.extend( true, {}, savedParams, savedHighlights, { invert: data.invert } );
-               }
-
-               return $.extend(
-                       { highlight: '0' },
-                       this.filtersModel.getDefaultParams()
-               );
-       };
-
-       /**
-        * 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 ( mw.config.get( 'wgStructuredChangeFiltersEnableSaving' ) &&
-                       defaultSavedQueryItem ) {
-
+               if ( defaultSavedQueryItem ) {
                        data = defaultSavedQueryItem.getData();
 
                        queryHighlights = data.highlights || {};
-                       savedParams = this.filtersModel.getParametersFromFilters( data.filters || {} );
+                       savedParams = this.filtersModel.getParametersFromFilters(
+                               // Merge filters with sticky values
+                               $.extend( true, {}, data.filters, this.filtersModel.getStickyFiltersState() )
+                       );
 
                        // Translate highlights to parameters
                        savedHighlights.highlight = String( Number( queryHighlights.highlight ) );
         */
        mw.rcfilters.Controller.prototype._fetchChangesList = function () {
                var uri = this._getUpdatedUri(),
+                       stickyParams = this.filtersModel.getStickyParams(),
                        requestId = ++this.requestCounter,
                        latestRequest = function () {
                                return requestId === this.requestCounter;
                        }.bind( this );
 
+               // Sticky parameters override the URL params
+               // this is to make sure that whether we represent
+               // the sticky params in the URL or not (they may
+               // be normalized out) the sticky parameters are
+               // always being sent to the server with their
+               // current/default values
+               uri.extend( stickyParams );
+
                return $.ajax( uri.toString(), { contentType: 'html' } )
                        .then(
                                // Success
         * Track usage of highlight feature
         *
         * @param {string} action
-        * @param {array|object|string} filters
+        * @param {Array|Object|string} filters
         */
        mw.rcfilters.Controller.prototype._trackHighlight = function ( action, filters ) {
                filters = typeof filters === 'string' ? { name: filters } : filters;
index ebeaad6..0bef902 100644 (file)
@@ -3,7 +3,8 @@
         * Supported highlight colors.
         * Warning: These are also hardcoded in "styles/mw.rcfilters.variables.less"
         *
-        * @type {string[]}
+        * @member mw.rcfilters
+        * @property {string[]}
         */
        mw.rcfilters.HighlightColors = [ 'c1', 'c2', 'c3', 'c4', 'c5' ];
 }( mediaWiki ) );
index b4ea8af..ba61ba9 100644 (file)
         * @return {Object} Empty parameter state
         */
        mw.rcfilters.UriProcessor.prototype._getEmptyParameterState = function () {
-               return this.emptyParameterState;
+               // Override empty parameter state with the sticky parameter values
+               return $.extend( true, {}, this.emptyParameterState, this.filtersModel.getStickyParams() );
        };
 
        /**
index e758f26..12a83cd 100644 (file)
@@ -2,14 +2,17 @@
  * JavaScript for Special:RecentChanges
  */
 ( function ( mw, $ ) {
-       /**
-        * @class mw.rcfilters
-        * @singleton
-        */
        var rcfilters = {
-               /** */
+               /**
+                * @member mw.rcfilters
+                * @private
+                */
                init: function () {
-                       var filtersModel = new mw.rcfilters.dm.FiltersViewModel(),
+                       var toplinksTitle,
+                               topLinksCookieName = 'rcfilters-toplinks-collapsed-state',
+                               topLinksCookie = mw.cookie.get( topLinksCookieName ),
+                               topLinksCookieValue = topLinksCookie || 'collapsed',
+                               filtersModel = new mw.rcfilters.dm.FiltersViewModel(),
                                changesListModel = new mw.rcfilters.dm.ChangesListViewModel(),
                                savedQueriesModel = new mw.rcfilters.dm.SavedQueriesModel(),
                                controller = new mw.rcfilters.Controller( filtersModel, changesListModel, savedQueriesModel ),
                        );
 
                        controller.replaceUrl();
+
+                       toplinksTitle = new OO.ui.ButtonWidget( {
+                               framed: false,
+                               indicator: topLinksCookieValue === 'collapsed' ? 'down' : 'up',
+                               flags: [ 'progressive' ],
+                               label: $( '<span>' ).append( mw.message( 'rcfilters-other-review-tools' ).parse() ).contents()
+                       } );
+                       $( '.mw-recentchanges-toplinks-title' ).replaceWith( toplinksTitle.$element );
+                       // Move the top links to a designated area so it's near the
+                       // 'saved filters' button and make it collapsible
+                       $( '.mw-recentchanges-toplinks' )
+                               .addClass( 'mw-rcfilters-ui-ready' )
+                               .makeCollapsible( {
+                                       collapsed: topLinksCookieValue === 'collapsed',
+                                       $customTogglers: toplinksTitle.$element
+                               } )
+                               .on( 'beforeExpand.mw-collapsible', function () {
+                                       mw.cookie.set( topLinksCookieName, 'expanded' );
+                                       toplinksTitle.setIndicator( 'up' );
+                               } )
+                               .on( 'beforeCollapse.mw-collapsible', function () {
+                                       mw.cookie.set( topLinksCookieName, 'collapsed' );
+                                       toplinksTitle.setIndicator( 'down' );
+                               } )
+                               .appendTo( '.mw-rcfilters-ui-filterWrapperWidget-top-placeholder' );
                }
        };
 
index 8cea27e..c62d6f2 100644 (file)
@@ -1,4 +1,8 @@
 ( function ( mw ) {
+       /**
+        * @class
+        * @singleton
+        */
        mw.rcfilters = {
                dm: {},
                ui: {},
index 9f3b809..0d12b81 100644 (file)
@@ -9,8 +9,28 @@
                }
        }
 
+       .mw-recentchanges-toplinks {
+               padding: 0 0.5em;
+
+               &-title,
+               .mw-collapsible-text {
+                       // Same as the legend
+                       font-size: 0.85em;
+               }
+
+               &:not( .mw-collapsed ) {
+                       // Same as the legend
+                       border: 1px solid #ddd;
+               }
+
+               &:not( .mw-rcfilters-ui-ready ) {
+                       display: none;
+               }
+       }
+
        .rcfilters-head {
                min-height: 310px;
+               margin-top: 1em;
 
                &:not( .mw-rcfilters-ui-ready ) {
                        opacity: 0.5;
index 7ee601f..a5cf744 100644 (file)
@@ -16,7 +16,7 @@
                background-color: #f8f9fa;
                border-radius: 2px 2px 0 0;
                padding: 0.6em;
-               margin-top: 1.6em;
+               margin-top: 1em;
        }
 
        .oo-ui-tagMultiselectWidget.oo-ui-widget-enabled &-animate.oo-ui-tagMultiselectWidget-handle {
index df4592c..87d09e0 100644 (file)
@@ -8,6 +8,17 @@
                margin-top: 1em;
        }
 
+       &-top {
+               &-placeholder {
+                       width: 100%;
+               }
+
+               &-savedLinks {
+                       padding-left: 1em;
+                       vertical-align: bottom;
+               }
+       }
+
        &-bottom {
                margin-top: 1em;
 
index 272909d..ec4954c 100644 (file)
@@ -1,6 +1,7 @@
 .mw-rcfilters-ui-saveFiltersPopupButtonWidget {
        &-popup {
-               &-layout {
+               &-layout,
+               &-options {
                        padding-bottom: 1.5em;
                }
 
index c0f24c6..0bee2f1 100644 (file)
                vertical-align: top;
        }
 }
-
-// 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 );
-}
index 61ee4a5..1e5bfc3 100644 (file)
@@ -2,6 +2,7 @@
        /**
         * Widget defining the button controlling the popup for the number of results
         *
+        * @class
         * @extends OO.ui.Widget
         *
         * @constructor
@@ -66,7 +67,7 @@
                                        width: 300,
                                        padded: true,
                                        anchor: false,
-                                       align: 'backwards',
+                                       align: 'forwards',
                                        $autoCloseIgnore: this.$overlay,
                                        $content: changesLimitPopupWidget.$element
                                }
         * @param {string} filterName Chosen filter name
         */
        mw.rcfilters.ui.ChangesLimitButtonWidget.prototype.onPopupLimit = function ( filterName ) {
+               var item = this.limitGroupModel.getItemByName( filterName );
+
                this.controller.toggleFilterSelect( filterName, true );
+               this.controller.updateLimitDefault( item.getParamName() );
+               this.button.popup.toggle( false );
        };
 
        /**
index 1569f38..82607f1 100644 (file)
@@ -2,6 +2,7 @@
        /**
         * Widget defining the button controlling the popup for the date range for the results
         *
+        * @class
         * @extends OO.ui.Widget
         *
         * @constructor
@@ -62,7 +63,7 @@
                                        width: 300,
                                        padded: true,
                                        anchor: false,
-                                       align: 'backwards',
+                                       align: 'forwards',
                                        $autoCloseIgnore: this.$overlay,
                                        $content: datePopupWidget.$element
                                }
         * @param {string} filterName Chosen filter name
         */
        mw.rcfilters.ui.DateButtonWidget.prototype.onPopupDays = function ( filterName ) {
+               var item = this.daysGroupModel.getItemByName( filterName );
+
                this.controller.toggleFilterSelect( filterName, true );
+               this.controller.updateDaysDefault( item.getParamName() );
+               this.button.popup.toggle( false );
        };
 
        /**
index 835cec8..7426123 100644 (file)
@@ -52,7 +52,6 @@
 
        /**
         * @static
-        * @inheritdoc
         */
        mw.rcfilters.ui.FilterItemHighlightButton.static.cancelButtonMouseDownEvents = true;
 
index da71d70..eeb5ddc 100644 (file)
@@ -2,6 +2,7 @@
        /**
         * Menu header for the RCFilters filters menu
         *
+        * @class
         * @extends OO.ui.Widget
         *
         * @constructor
index 88479c3..e053914 100644 (file)
@@ -2,6 +2,7 @@
        /**
         * A widget representing a menu section for filter groups
         *
+        * @class
         * @extends OO.ui.MenuSectionOptionWidget
         *
         * @constructor
index 6a6790f..934c7c4 100644 (file)
@@ -2,6 +2,7 @@
        /**
         * List displaying all filter groups
         *
+        * @class
         * @extends OO.ui.MenuTagMultiselectWidget
         * @mixins OO.ui.mixin.PendingElement
         *
@@ -14,7 +15,6 @@
         */
        mw.rcfilters.ui.FilterTagMultiselectWidget = function MwRcfiltersUiFilterTagMultiselectWidget( controller, model, savedQueriesModel, config ) {
                var rcFiltersRow,
-                       areSavedQueriesEnabled = mw.config.get( 'wgStructuredChangeFiltersEnableSaving' ),
                        title = new OO.ui.LabelWidget( {
                                label: mw.msg( 'rcfilters-activefilters' ),
                                classes: [ 'mw-rcfilters-ui-filterTagMultiselectWidget-wrapper-content-title' ]
@@ -29,7 +29,6 @@
                this.queriesModel = savedQueriesModel;
                this.$overlay = config.$overlay || this.$element;
                this.matchingQuery = null;
-               this.areSavedQueriesEnabled = areSavedQueriesEnabled;
 
                // Parent
                mw.rcfilters.ui.FilterTagMultiselectWidget.parent.call( this, $.extend( true, {
@@ -47,7 +46,6 @@
                                footers: [
                                        {
                                                name: 'viewSelect',
-                                               disabled: !mw.config.get( 'wgStructuredChangeFiltersEnableExperimentalViews' ),
                                                sticky: false,
                                                // View select menu, appears on default view only
                                                $element: $( '<div>' )
                        classes: [ 'mw-rcfilters-ui-filterTagMultiselectWidget-resetButton' ]
                } );
 
-               if ( areSavedQueriesEnabled ) {
-                       this.saveQueryButton = new mw.rcfilters.ui.SaveFiltersPopupButtonWidget(
-                               this.controller,
-                               this.queriesModel
-                       );
+               this.saveQueryButton = new mw.rcfilters.ui.SaveFiltersPopupButtonWidget(
+                       this.controller,
+                       this.queriesModel
+               );
 
-                       this.saveQueryButton.$element.on( 'mousedown', function ( e ) { e.stopPropagation(); } );
+               this.saveQueryButton.$element.on( 'mousedown', function ( e ) { e.stopPropagation(); } );
 
-                       this.saveQueryButton.connect( this, {
-                               click: 'onSaveQueryButtonClick',
-                               saveCurrent: 'setSavedQueryVisibility'
-                       } );
-               }
+               this.saveQueryButton.connect( this, {
+                       click: 'onSaveQueryButtonClick',
+                       saveCurrent: 'setSavedQueryVisibility'
+               } );
 
                this.emptyFilterMessage = new OO.ui.LabelWidget( {
                        label: mw.msg( 'rcfilters-empty-filter' ),
                                        .addClass( 'mw-rcfilters-ui-filterTagMultiselectWidget-cell-filters' )
                        );
 
-               if ( areSavedQueriesEnabled ) {
-                       rcFiltersRow.append(
-                               $( '<div>' )
-                                       .addClass( 'mw-rcfilters-ui-cell' )
-                                       .addClass( 'mw-rcfilters-ui-filterTagMultiselectWidget-cell-save' )
-                                       .append( this.saveQueryButton.$element )
-                       );
-               }
+               rcFiltersRow.append(
+                       $( '<div>' )
+                               .addClass( 'mw-rcfilters-ui-cell' )
+                               .addClass( 'mw-rcfilters-ui-filterTagMultiselectWidget-cell-save' )
+                               .append( this.saveQueryButton.$element )
+               );
 
-               if ( mw.config.get( 'wgStructuredChangeFiltersEnableExperimentalViews' ) ) {
-                       // Add a selector at the right of the input
-                       this.viewsSelectWidget = new OO.ui.ButtonSelectWidget( {
-                               classes: [ 'mw-rcfilters-ui-filterTagMultiselectWidget-views-select-widget' ],
-                               items: [
-                                       new OO.ui.ButtonOptionWidget( {
-                                               framed: false,
-                                               data: 'namespaces',
-                                               icon: 'article',
-                                               title: mw.msg( 'rcfilters-view-namespaces-tooltip' )
-                                       } ),
-                                       new OO.ui.ButtonOptionWidget( {
-                                               framed: false,
-                                               data: 'tags',
-                                               icon: 'tag',
-                                               title: mw.msg( 'rcfilters-view-tags-tooltip' )
-                                       } )
-                               ]
-                       } );
-
-                       // Rearrange the UI so the select widget is at the right of the input
-                       this.$element.append(
-                               $( '<div>' )
-                                       .addClass( 'mw-rcfilters-ui-table' )
-                                       .append(
-                                               $( '<div>' )
-                                                       .addClass( 'mw-rcfilters-ui-row' )
-                                                       .append(
-                                                               $( '<div>' )
-                                                                       .addClass( 'mw-rcfilters-ui-cell' )
-                                                                       .addClass( 'mw-rcfilters-ui-filterTagMultiselectWidget-views-input' )
-                                                                       .append( this.input.$element ),
-                                                               $( '<div>' )
-                                                                       .addClass( 'mw-rcfilters-ui-cell' )
-                                                                       .addClass( 'mw-rcfilters-ui-filterTagMultiselectWidget-views-select' )
-                                                                       .append( this.viewsSelectWidget.$element )
-                                                       )
-                                       )
-                       );
+               // Add a selector at the right of the input
+               this.viewsSelectWidget = new OO.ui.ButtonSelectWidget( {
+                       classes: [ 'mw-rcfilters-ui-filterTagMultiselectWidget-views-select-widget' ],
+                       items: [
+                               new OO.ui.ButtonOptionWidget( {
+                                       framed: false,
+                                       data: 'namespaces',
+                                       icon: 'article',
+                                       title: mw.msg( 'rcfilters-view-namespaces-tooltip' )
+                               } ),
+                               new OO.ui.ButtonOptionWidget( {
+                                       framed: false,
+                                       data: 'tags',
+                                       icon: 'tag',
+                                       title: mw.msg( 'rcfilters-view-tags-tooltip' )
+                               } )
+                       ]
+               } );
 
-                       // Event
-                       this.viewsSelectWidget.connect( this, { choose: 'onViewsSelectWidgetChoose' } );
-               }
+               // Rearrange the UI so the select widget is at the right of the input
+               this.$element.append(
+                       $( '<div>' )
+                               .addClass( 'mw-rcfilters-ui-table' )
+                               .append(
+                                       $( '<div>' )
+                                               .addClass( 'mw-rcfilters-ui-row' )
+                                               .append(
+                                                       $( '<div>' )
+                                                               .addClass( 'mw-rcfilters-ui-cell' )
+                                                               .addClass( 'mw-rcfilters-ui-filterTagMultiselectWidget-views-input' )
+                                                               .append( this.input.$element ),
+                                                       $( '<div>' )
+                                                               .addClass( 'mw-rcfilters-ui-cell' )
+                                                               .addClass( 'mw-rcfilters-ui-filterTagMultiselectWidget-views-select' )
+                                                               .append( this.viewsSelectWidget.$element )
+                                               )
+                               )
+               );
+
+               // Event
+               this.viewsSelectWidget.connect( this, { choose: 'onViewsSelectWidgetChoose' } );
 
                rcFiltersRow.append(
                        $( '<div>' )
         * @param {string} value Value of the input
         */
        mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onInputChange = function ( value ) {
-               var view = this.model.getViewByTrigger( value.substr( 0, 1 ) );
+               var view;
+
+               value = value.trim();
+
+               view = this.model.getViewByTrigger( value.substr( 0, 1 ) );
 
                this.controller.switchView( view );
        };
 
                        // Clear input if the only thing in the input is the prefix
                        if (
-                               this.input.getValue() === this.model.getViewTrigger( this.model.getCurrentView() )
+                               this.input.getValue().trim() === this.model.getViewTrigger( this.model.getCurrentView() )
                        ) {
                                // Clear the input
                                this.input.setValue( '' );
        };
 
        /**
-        * @inheridoc
+        * @inheritdoc
         */
        mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onChangeTags = function () {
                // Parent method
         */
        mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.updateElementsForView = function () {
                var view = this.model.getCurrentView(),
-                       inputValue = this.input.getValue(),
+                       inputValue = this.input.getValue().trim(),
                        inputView = this.model.getViewByTrigger( inputValue.substr( 0, 1 ) );
 
                if ( inputView !== 'default' ) {
         * Set the visibility of the saved query button
         */
        mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.setSavedQueryVisibility = function () {
-               if ( this.areSavedQueriesEnabled ) {
-                       this.matchingQuery = this.controller.findQueryMatchingCurrentState();
+               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
-                       );
+               this.savedQueryTitle.setLabel(
+                       this.matchingQuery ? this.matchingQuery.getLabel() : ''
+               );
+               this.savedQueryTitle.toggle( !!this.matchingQuery );
+               this.saveQueryButton.toggle(
+                       !this.isEmpty() &&
+                       !this.matchingQuery
+               );
 
-                       if ( this.matchingQuery ) {
-                               this.emphasize();
-                       }
+               if ( this.matchingQuery ) {
+                       this.emphasize();
                }
        };
 
        mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.onTagSelect = function ( tagItem ) {
                var widget = this,
                        menuOption = this.menu.getItemFromModel( tagItem.getModel() ),
-                       oldInputValue = this.input.getValue();
+                       oldInputValue = this.input.getValue().trim();
 
                this.menu.setUserSelecting( true );
 
index 9b4ce7f..92d223c 100644 (file)
@@ -14,7 +14,7 @@
         * @cfg {jQuery} [$overlay] A jQuery object serving as overlay for popups
         */
        mw.rcfilters.ui.FilterWrapperWidget = function MwRcfiltersUiFilterWrapperWidget( controller, model, savedQueriesModel, config ) {
-               var $bottom;
+               var $top, $topRow, $bottom;
                config = config || {};
 
                // Parent
                );
 
                // Initialize
-               this.$element
-                       .addClass( 'mw-rcfilters-ui-filterWrapperWidget' );
-
-               if ( mw.config.get( 'wgStructuredChangeFiltersEnableSaving' ) ) {
-                       this.savedLinksListWidget = new mw.rcfilters.ui.SavedLinksListWidget(
-                               this.controller,
-                               this.queriesModel,
-                               { $overlay: this.$overlay }
+               $topRow = $( '<div>' )
+                       .addClass( 'mw-rcfilters-ui-row' )
+                       .append(
+                               $( '<div>' )
+                                       .addClass( 'mw-rcfilters-ui-cell' )
+                                       .addClass( 'mw-rcfilters-ui-filterWrapperWidget-top-placeholder' )
                        );
-
-                       this.$element.append(
-                               this.savedLinksListWidget.$element
-                       );
-               }
+               $top = $( '<div>' )
+                       .addClass( 'mw-rcfilters-ui-filterWrapperWidget-top' )
+                       .addClass( 'mw-rcfilters-ui-table' )
+                       .append( $topRow );
 
                $bottom = $( '<div>' )
                        .addClass( 'mw-rcfilters-ui-filterWrapperWidget-bottom' )
                                this.dateWidget.$element
                        );
 
+               this.savedLinksListWidget = new mw.rcfilters.ui.SavedLinksListWidget(
+                       this.controller,
+                       this.queriesModel,
+                       { $overlay: this.$overlay }
+               );
+
+               $topRow.append(
+                       $( '<div>' )
+                               .addClass( 'mw-rcfilters-ui-cell' )
+                               .addClass( 'mw-rcfilters-ui-filterWrapperWidget-top-savedLinks' )
+                               .append( this.savedLinksListWidget.$element )
+               );
+
                if (
                        mw.config.get( 'wgStructuredChangeFiltersEnableLiveUpdate' ) ||
                        // Allow users to enable live update with ?liveupdate=1
                        $bottom.append( this.liveUpdateButton.$element );
                }
 
-               this.$element.append(
-                       this.filterTagWidget.$element,
-                       $bottom
-               );
+               this.$element
+                       .addClass( 'mw-rcfilters-ui-filterWrapperWidget' )
+                       .append(
+                               $top,
+                               this.filterTagWidget.$element,
+                               $bottom
+                       );
        };
 
        /* Initialization */
index ee8e0bc..50e3637 100644 (file)
                } );
 
                // Hide namespaces and tags
-               if ( mw.config.get( 'wgStructuredChangeFiltersEnableExperimentalViews' ) ) {
-                       $namespaceSelect.closest( 'tr' ).detach();
-                       this.$element.find( '.mw-tagfilter-label' ).closest( 'tr' ).detach();
-               }
+               $namespaceSelect.closest( 'tr' ).detach();
+               this.$element.find( '.mw-tagfilter-label' ).closest( 'tr' ).detach();
 
                // Hide limit and days
                this.$element.find( '.rclinks' ).detach();
index dfb188d..70a2227 100644 (file)
@@ -14,6 +14,7 @@
         */
        mw.rcfilters.ui.SaveFiltersPopupButtonWidget = function MwRcfiltersUiSaveFiltersPopupButtonWidget( controller, model, config ) {
                var layout,
+                       checkBoxLayout,
                        $popupContent = $( '<div>' );
 
                config = config || {};
                        align: 'top'
                } );
 
+               this.setAsDefaultCheckbox = new OO.ui.CheckboxInputWidget();
+               checkBoxLayout = new OO.ui.FieldLayout( this.setAsDefaultCheckbox, {
+                       label: mw.msg( 'rcfilters-savedqueries-setdefault' ),
+                       align: 'inline'
+               } );
+
                this.applyButton = new OO.ui.ButtonWidget( {
                        label: mw.msg( 'rcfilters-savedqueries-apply-label' ),
                        classes: [ 'mw-rcfilters-ui-saveFiltersPopupButtonWidget-popup-buttons-apply' ],
@@ -61,6 +68,9 @@
                                $( '<div>' )
                                        .addClass( 'mw-rcfilters-ui-saveFiltersPopupButtonWidget-popup-layout' )
                                        .append( layout.$element ),
+                               $( '<div>' )
+                                       .addClass( 'mw-rcfilters-ui-saveFiltersPopupButtonWidget-popup-options' )
+                                       .append( checkBoxLayout.$element ),
                                $( '<div>' )
                                        .addClass( 'mw-rcfilters-ui-saveFiltersPopupButtonWidget-popup-buttons' )
                                        .append(
@@ -80,6 +90,7 @@
                this.input.$input.on( {
                        keyup: this.onInputKeyup.bind( this )
                } );
+               this.setAsDefaultCheckbox.connect( this, { change: 'onSetAsDefaultChange' } );
                this.cancelButton.connect( this, { click: 'onCancelButtonClick' } );
                this.applyButton.connect( this, { click: 'onApplyButtonClick' } );
 
                this.input.focus();
        };
 
+       /**
+        * Respond to "set as default" checkbox change
+        * @param {boolean} checked State of the checkbox
+        */
+       mw.rcfilters.ui.SaveFiltersPopupButtonWidget.prototype.onSetAsDefaultChange = function ( checked ) {
+               var messageKey = checked ?
+                       'rcfilters-savedqueries-apply-and-setdefault-label' :
+                       'rcfilters-savedqueries-apply-label';
+
+               this.applyButton
+                       .setIcon( checked ? 'pushPin' : null )
+                       .setLabel( mw.msg( messageKey ) );
+       };
+
        /**
         * Respond to cancel button click event
         */
                // This condition is more for sanity-check, since the
                // apply button should be disabled if the label is empty
                if ( label ) {
-                       this.controller.saveCurrentQuery( label );
+                       this.controller.saveCurrentQuery( label, this.setAsDefaultCheckbox.isSelected() );
                        this.input.setValue( '' );
+                       this.setAsDefaultCheckbox.setSelected( false );
                        this.popup.toggle( false );
 
                        this.emit( 'saveCurrent' );
index b6b20ee..cac1059 100644 (file)
@@ -2,6 +2,7 @@
        /**
         * Quick links menu option widget
         *
+        * @class
         * @extends OO.ui.Widget
         * @mixins OO.ui.mixin.LabelElement
         * @mixins OO.ui.mixin.IconElement
index 27a21d6..7eda90a 100644 (file)
@@ -2,6 +2,7 @@
        /**
         * Quick links widget
         *
+        * @class
         * @extends OO.ui.Widget
         *
         * @constructor
index 7045ab6..ac0e50d 100644 (file)
@@ -3,6 +3,7 @@
         * Widget defining the behavior used to choose from a set of values
         * in a single_value group
         *
+        * @class
         * @extends OO.ui.Widget
         * @mixins OO.ui.mixin.LabelElement
         *
index aca335e..8d88410 100644 (file)
@@ -7,19 +7,30 @@
                        $anonOnlyRow = $( '#mw-input-wpHardBlock' ).closest( 'tr' ),
                        $enableAutoblockRow = $( '#mw-input-wpAutoBlock' ).closest( 'tr' ),
                        $hideUser = $( '#mw-input-wpHideUser' ).closest( 'tr' ),
-                       $watchUser = $( '#mw-input-wpWatch' ).closest( 'tr' );
+                       $watchUser = $( '#mw-input-wpWatch' ).closest( 'tr' ),
+                       $expiry = $( '#mw-input-wpExpiry' ),
+                       $otherExpiry = $( '#mw-input-wpExpiry-other' );
 
                function updateBlockOptions( instant ) {
                        var blocktarget = $.trim( $blockTarget.val() ),
                                isEmpty = blocktarget === '',
                                isIp = mw.util.isIPAddress( blocktarget, true ),
-                               isIpRange = isIp && blocktarget.match( /\/\d+$/ );
+                               isIpRange = isIp && blocktarget.match( /\/\d+$/ ),
+                               isNonEmptyIp = isIp && !isEmpty,
+                               expiryValue = $expiry.val(),
+                               // infinityValues  are the values the SpecialBlock class accepts as infinity (sf. wfIsInfinity)
+                               infinityValues = [ 'infinite', 'indefinite', 'infinity', 'never' ],
+                               isIndefinite = $.inArray( expiryValue, infinityValues ) !== -1 ||
+                                       ( expiryValue === 'other' && $.inArray( $otherExpiry.val(), infinityValues ) !== -1 );
 
-                       if ( isIp && !isEmpty ) {
+                       if ( isNonEmptyIp ) {
                                $enableAutoblockRow.goOut( instant );
-                               $hideUser.goOut( instant );
                        } else {
                                $enableAutoblockRow.goIn( instant );
+                       }
+                       if ( isNonEmptyIp || !isIndefinite ) {
+                               $hideUser.goOut( instant );
+                       } else {
                                $hideUser.goIn( instant );
                        }
                        if ( !isIp && !isEmpty ) {
@@ -37,6 +48,8 @@
                if ( $blockTarget.length ) {
                        // Bind functions so they're checked whenever stuff changes
                        $blockTarget.keyup( updateBlockOptions );
+                       $expiry.change( updateBlockOptions );
+                       $otherExpiry.keyup( updateBlockOptions );
 
                        // Call them now to set initial state (ie. Special:Block/Foobar?wpBlockExpiry=2+hours)
                        updateBlockOptions( /* instant= */ true );
index ea63e39..a991d36 100644 (file)
@@ -7,11 +7,10 @@
        var
                cookieName = 'changeslist-state',
                // Expanded by default
-               isCollapsed = mw.cookie.get( cookieName ) === 'collapsed',
                doCollapsibleLegend = function ( $container ) {
                        $container.find( '.mw-changeslist-legend' )
                                .makeCollapsible( {
-                                       collapsed: isCollapsed
+                                       collapsed: mw.cookie.get( cookieName ) === 'collapsed'
                                } )
                                .on( 'beforeExpand.mw-collapsible', function () {
                                        mw.cookie.set( cookieName, 'expanded' );
index 72ede97..3b98936 100644 (file)
 .mw-body .mw-search-nonefound {
        margin: 0;
 }
-.mw-search-interwiki-header,
+
 .searchdidyoumean em,
 .searchmatch {
        font-weight: bold;
 }
-.mw-search-nonefound + .mw-search-interwiki-header {
-       margin-top: 0;
-}
 
 .mw-search-results {
        margin: 0;
index 66879e9..b6899d9 100644 (file)
@@ -53,6 +53,7 @@
 
                $root
                        .on( 'change', '.mw-htmlform-select-or-other', handleSelectOrOther )
+                       .find( '.mw-htmlform-select-or-other' )
                        .each( function () {
                                handleSelectOrOther.call( this, true );
                        } );
index 31def27..6a331b6 100644 (file)
@@ -28,8 +28,6 @@ li.gallerycaption {
 
 li.gallerybox div.thumb {
        text-align: center;
-       border: 1px solid #c8ccd1;
-       background-color: #f8f9fa;
        margin: 2px;
 }
 
@@ -180,3 +178,11 @@ ul.mw-gallery-slideshow li.gallerycarousel {
 .mw-gallery-slideshow-img-container a {
        display: block;
 }
+
+@media screen {
+       /* Background and border colors are defined separately for print mode */
+       li.gallerybox div.thumb {
+               border: 1px solid #c8ccd1;
+               background-color: #f8f9fa;
+       }
+}
index 80fc964..2ae670b 100644 (file)
@@ -23,14 +23,13 @@ li.gallerycaption {
 }
 
 li.gallerybox div.thumb {
-       text-align: center;
+       background-color: #fff;
        border: 1px solid #ccc;
-       margin: 2px;
 }
 
 div.gallerytext {
        overflow: hidden;
-       font-size: 94%;
+       font-size: 10pt;
        padding: 2px 4px;
        word-wrap: break-word;
 }
index 3de3ba7..9b9ea6d 100644 (file)
@@ -56,6 +56,7 @@ $wgAutoloadClasses += [
        'MediaWikiLangTestCase' => "$testDir/phpunit/MediaWikiLangTestCase.php",
        'ResourceLoaderTestCase' => "$testDir/phpunit/ResourceLoaderTestCase.php",
        'ResourceLoaderTestModule' => "$testDir/phpunit/ResourceLoaderTestCase.php",
+       'ResourceLoaderFileTestModule' => "$testDir/phpunit/ResourceLoaderTestCase.php",
        'ResourceLoaderFileModuleTestModule' => "$testDir/phpunit/ResourceLoaderTestCase.php",
        'EmptyResourceLoader' => "$testDir/phpunit/ResourceLoaderTestCase.php",
        'TestUser' => "$testDir/phpunit/includes/TestUser.php",
index d8f89fb..f75cc22 100644 (file)
@@ -153,6 +153,22 @@ class ResourceLoaderTestModule extends ResourceLoaderModule {
        }
 }
 
+class ResourceLoaderFileTestModule extends ResourceLoaderFileModule {
+       protected $lessVars = [];
+
+       public function __construct( $options = [], $test = [] ) {
+               parent::__construct( $options );
+
+               foreach ( $test as $key => $value ) {
+                       $this->$key = $value;
+               }
+       }
+
+       public function getLessVars( ResourceLoaderContext $context ) {
+               return $this->lessVars;
+       }
+}
+
 class ResourceLoaderFileModuleTestModule extends ResourceLoaderFileModule {
 }
 
index 802f9b1..237e3fb 100644 (file)
  * @covers DeprecatedGlobal
  */
 class DeprecatedGlobalTest extends MediaWikiTestCase {
+
+       public function setUp() {
+               parent::setUp();
+               $this->oldErrorLevel = error_reporting( -1 );
+       }
+
+       public function tearDown() {
+               error_reporting( $this->oldErrorLevel );
+               parent::tearDown();
+       }
+
        public function testObjectDeStub() {
                global $wgDummy;
 
index 1a15c26..7d9a420 100644 (file)
@@ -24,6 +24,7 @@ class CSSMinTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider mimeTypeProvider
+        * @covers CSSMin::getMimeType
         */
        public function testGetMimeType( $fileContents, $fileExtension, $expected ) {
                $fileName = wfTempDir() . DIRECTORY_SEPARATOR . uniqid( 'MW_PHPUnit_CSSMinTest_' ) . '.'
@@ -167,7 +168,7 @@ class CSSMinTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideIsRemoteUrl
-        * @cover CSSMin::isRemoteUrl
+        * @covers CSSMin::isRemoteUrl
         */
        public function testIsRemoteUrl( $expect, $url ) {
                $this->assertEquals( CSSMinTestable::isRemoteUrl( $url ), $expect );
@@ -184,18 +185,19 @@ class CSSMinTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideIsLocalUrls
-        * @cover CSSMin::isLocalUrl
+        * @covers CSSMin::isLocalUrl
         */
        public function testIsLocalUrl( $expect, $url ) {
                $this->assertEquals( CSSMinTestable::isLocalUrl( $url ), $expect );
        }
 
        /**
-        * This tests funky parameters to CSSMin::remap. testRemapRemapping tests
-        * the basic functionality.
+        * This test tests funky parameters to CSSMin::remap.
         *
+        * @see testRemapRemapping for testing of the basic functionality
         * @dataProvider provideRemapCases
         * @covers CSSMin::remap
+        * @covers CSSMin::remapOne
         */
        public function testRemap( $message, $params, $expectedOutput ) {
                $remapped = call_user_func_array( 'CSSMin::remap', $params );
@@ -246,10 +248,11 @@ class CSSMinTest extends MediaWikiTestCase {
        }
 
        /**
-        * This tests basic functionality of CSSMin::remap. testRemapRemapping tests funky parameters.
+        * This tests the basic functionality of CSSMin::remap.
         *
+        * @see testRemap for testing of funky parameters
         * @dataProvider provideRemapRemappingCases
-        * @covers CSSMin::remap
+        * @covers CSSMin
         */
        public function testRemapRemapping( $message, $input, $expectedOutput ) {
                $localPath = __DIR__ . '/../../data/cssmin';
index f519772..7b84117 100644 (file)
@@ -31,6 +31,8 @@ class DatabaseSQLTest extends PHPUnit_Framework_TestCase {
         * @covers Wikimedia\Rdbms\Database::select
         * @covers Wikimedia\Rdbms\Database::selectSQLText
         * @covers Wikimedia\Rdbms\Database::tableNamesWithIndexClauseOrJOIN
+        * @covers Wikimedia\Rdbms\Database::useIndexClause
+        * @covers Wikimedia\Rdbms\Database::ignoreIndexClause
         * @covers Wikimedia\Rdbms\Database::makeSelectOptions
         * @covers Wikimedia\Rdbms\Database::makeOrderBy
         * @covers Wikimedia\Rdbms\Database::makeGroupByWithHaving
@@ -151,6 +153,24 @@ class DatabaseSQLTest extends PHPUnit_Framework_TestCase {
                                        "FROM table " .
                                        "WHERE alias IN ('1','2','3','4')"
                        ],
+                       [
+                               [
+                                       'tables' => 'table',
+                                       'fields' => [ 'field' ],
+                                       'options' => [ 'USE INDEX' => [ 'table' => 'X' ] ],
+                               ],
+                               // No-op by default
+                               "SELECT field FROM table"
+                       ],
+                       [
+                               [
+                                       'tables' => 'table',
+                                       'fields' => [ 'field' ],
+                                       'options' => [ 'IGNORE INDEX' => [ 'table' => 'X' ] ],
+                               ],
+                               // No-op by default
+                               "SELECT field FROM table"
+                       ],
                        [
                                [
                                        'tables' => 'table',
index ded56e9..e82bab7 100644 (file)
@@ -331,4 +331,23 @@ class ResourceLoaderFileModuleTest extends ResourceLoaderTestCase {
                        'Leading BOM removed when concatenating files'
                );
        }
+
+       /**
+        * @covers ResourceLoaderFileModule::getDefinitionSummary
+        */
+       public function testGetVersionHash() {
+               $context = $this->getResourceLoaderContext();
+
+               // Less variables
+               $module = new ResourceLoaderFileTestModule();
+               $version = $module->getVersionHash( $context );
+               $module = new ResourceLoaderFileTestModule( [], [
+                       'lessVars' => [ 'key' => 'value' ],
+               ] );
+               $this->assertNotEquals(
+                       $version,
+                       $module->getVersionHash( $context ),
+                       'Using less variables is significant'
+               );
+       }
 }
index 4070bc0..f494785 100644 (file)
@@ -474,7 +474,7 @@ class ChangesListSpecialPageTest extends AbstractChangesListSpecialPageTestCase
                $conds = $this->buildQuery( [ 'userExpLevel' => 'unregistered;experienced' ] );
 
                $this->assertRegExp(
-                       '/\(rc_user = 0\) OR \(\(user_editcount >= 500\) AND \(user_registration <= \'\d+\'\)\)/',
+                       '/\(rc_user = 0\) OR \(\(user_editcount >= 500\) AND \(user_registration <= \'[^\']+\'\)\)/',
                        reset( $conds ),
                        "rc conditions: userExpLevel=unregistered;experienced"
                );
index 251a4a2..e8256ef 100644 (file)
@@ -68,6 +68,9 @@
                        <directory suffix=".php">../../includes</directory>
                        <directory suffix=".php">../../languages</directory>
                        <directory suffix=".php">../../maintenance</directory>
+                       <exclude>
+                               <directory suffix=".php">../../languages/messages</directory>
+                       </exclude>
                </whitelist>
        </filter>
 </phpunit>
index da7bafd..58e4d29 100644 (file)
                }, {
                        name: 'group6',
                        type: 'boolean',
+                       isSticky: true,
                        filters: [
-                               { name: 'group6option1', label: 'group6option1-label', description: 'group5option1-desc' },
-                               { name: 'group6option2', label: 'group6option2-label', description: 'group5option2-desc', default: true, useDefaultAsBaseValue: true },
-                               { name: 'group6option3', label: 'group6option3-label', description: 'group5option3-desc', default: true }
+                               { name: 'group6option1', label: 'group6option1-label', description: 'group6option1-desc' },
+                               { name: 'group6option2', label: 'group6option2-label', description: 'group6option2-desc', default: true },
+                               { name: 'group6option3', label: 'group6option3-label', description: 'group6option3-desc', default: true }
+                       ]
+               }, {
+                       name: 'group7',
+                       type: 'single_option',
+                       isSticky: true,
+                       default: 'group7option2',
+                       filters: [
+                               { name: 'group7option1', label: 'group7option1-label', description: 'group7option1-desc' },
+                               { name: 'group7option2', label: 'group7option2-label', description: 'group7option2-desc' },
+                               { name: 'group7option3', label: 'group7option3-label', description: 'group7option3-desc' }
                        ]
                } ],
                viewsDefinition = {
                        group6option1: '0',
                        group6option2: '1',
                        group6option3: '1',
+                       group7: 'group7option2',
                        namespace: ''
                },
                baseParamRepresentation = {
                        group5: 'option1',
                        group6option1: '0',
                        group6option2: '1',
-                       group6option3: '0',
+                       group6option3: '1',
+                       group7: 'group7option2',
                        namespace: ''
                },
                baseFilterRepresentation = {
                        group5__option3: false,
                        group6__group6option1: false,
                        group6__group6option2: true,
-                       group6__group6option3: false,
+                       group6__group6option3: true,
+                       group7__group7option1: false,
+                       group7__group7option2: true,
+                       group7__group7option3: false,
                        namespace__0: false,
                        namespace__1: false,
                        namespace__2: false,
                        group5__option3: { selected: false, conflicted: false, included: false },
                        group6__group6option1: { selected: false, conflicted: false, included: false },
                        group6__group6option2: { selected: true, conflicted: false, included: false },
-                       group6__group6option3: { selected: false, conflicted: false, included: false },
+                       group6__group6option3: { selected: true, conflicted: false, included: false },
+                       group7__group7option1: { selected: false, conflicted: false, included: false },
+                       group7__group7option2: { selected: true, conflicted: false, included: false },
+                       group7__group7option3: { selected: false, conflicted: false, included: false },
                        namespace__0: { selected: false, conflicted: false, included: false },
                        namespace__1: { selected: false, conflicted: false, included: false },
                        namespace__2: { selected: false, conflicted: false, included: false },
                        defaultParameters,
                        'Default parameters are stored properly per filter and group'
                );
+
+               // Change sticky filter
+               model.toggleFiltersSelected( {
+                       group7__group7option1: true
+               } );
+
+               // Make sure defaults have changed
+               assert.deepEqual(
+                       model.getDefaultParams(),
+                       $.extend( true, {}, defaultParameters, {
+                               group7: 'group7option1'
+                       } ),
+                       'Default parameters are stored properly per filter and group'
+               );
        } );
 
        QUnit.test( 'Finding matching filters', function ( assert ) {