Merge "ResourceLoaderOOUIImageModule: Actually load non-default themes' images"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 23 Mar 2017 18:39:52 +0000 (18:39 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 23 Mar 2017 18:39:52 +0000 (18:39 +0000)
233 files changed:
CREDITS
Gruntfile.js
RELEASE-NOTES-1.29
composer.json
docs/hooks.txt
includes/Block.php
includes/DefaultSettings.php
includes/EditPage.php
includes/Revision.php
includes/Xml.php
includes/api/ApiMain.php
includes/api/ApiQueryAllPages.php
includes/api/i18n/de.json
includes/api/i18n/fr.json
includes/api/i18n/gl.json
includes/api/i18n/pl.json
includes/context/ContextSource.php
includes/deferred/SiteStatsUpdate.php
includes/diff/DifferenceEngine.php
includes/filerepo/file/File.php
includes/htmlform/HTMLFormField.php
includes/import/WikiRevision.php
includes/installer/i18n/bg.json
includes/installer/i18n/br.json
includes/installer/i18n/mk.json
includes/installer/i18n/pt-br.json
includes/jobqueue/JobQueue.php
includes/libs/filebackend/FileBackendStore.php
includes/libs/filebackend/SwiftFileBackend.php
includes/libs/rdbms/database/Database.php
includes/page/Article.php
includes/page/ImageHistoryPseudoPager.php
includes/profiler/output/ProfilerOutputStats.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderImageModule.php
includes/resourceloader/ResourceLoaderJqueryMsgModule.php
includes/resourceloader/ResourceLoaderModule.php
includes/resourceloader/ResourceLoaderWikiModule.php
includes/specialpage/ChangesListSpecialPage.php
includes/specials/SpecialAllPages.php
includes/specials/SpecialChangeCredentials.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialWatchlist.php
includes/tidy/RemexCompatMunger.php
includes/upload/UploadFromUrl.php
includes/user/User.php
jsduck.json
languages/LanguageConverter.php
languages/classes/LanguageAz.php
languages/classes/LanguageKk.php
languages/i18n/af.json
languages/i18n/ar.json
languages/i18n/ast.json
languages/i18n/ba.json
languages/i18n/be-tarask.json
languages/i18n/be.json
languages/i18n/bg.json
languages/i18n/bn.json
languages/i18n/bqi.json
languages/i18n/br.json
languages/i18n/ca.json
languages/i18n/ceb.json
languages/i18n/ckb.json
languages/i18n/cs.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/frr.json
languages/i18n/fy.json
languages/i18n/gl.json
languages/i18n/gsw.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hr.json
languages/i18n/hu.json
languages/i18n/inh.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/km.json
languages/i18n/ko.json
languages/i18n/lb.json
languages/i18n/lt.json
languages/i18n/map-bms.json
languages/i18n/mg.json
languages/i18n/mk.json
languages/i18n/my.json
languages/i18n/nan.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/pl.json
languages/i18n/qqq.json
languages/i18n/ro.json
languages/i18n/ru.json
languages/i18n/sd.json
languages/i18n/shn.json
languages/i18n/sk.json
languages/i18n/sl.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/su.json
languages/i18n/sv.json
languages/i18n/tcy.json
languages/i18n/uk.json
languages/i18n/wa.json
languages/i18n/yi.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
maintenance/createCommonPasswordCdb.php
maintenance/jsduck/categories.json
package.json
resources/Resources.php
resources/lib/oojs-ui/oojs-ui-apex.js
resources/lib/oojs-ui/oojs-ui-core-apex.css
resources/lib/oojs-ui/oojs-ui-core-mediawiki.css
resources/lib/oojs-ui/oojs-ui-core.js
resources/lib/oojs-ui/oojs-ui-mediawiki.js
resources/lib/oojs-ui/oojs-ui-toolbars-apex.css
resources/lib/oojs-ui/oojs-ui-toolbars-mediawiki.css
resources/lib/oojs-ui/oojs-ui-toolbars.js
resources/lib/oojs-ui/oojs-ui-widgets-apex.css
resources/lib/oojs-ui/oojs-ui-widgets-mediawiki.css
resources/lib/oojs-ui/oojs-ui-widgets.js
resources/lib/oojs-ui/oojs-ui-windows-apex.css
resources/lib/oojs-ui/oojs-ui-windows-mediawiki.css
resources/lib/oojs-ui/oojs-ui-windows.js
resources/lib/oojs-ui/themes/apex/icons-interactions.json
resources/lib/oojs-ui/themes/apex/icons-moderation.json
resources/lib/oojs-ui/themes/apex/images/icons/beta-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/beta-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/beta.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/beta.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/icons-interactions.json
resources/lib/oojs-ui/themes/mediawiki/icons-moderation.json
resources/lib/oojs-ui/themes/mediawiki/icons-wikimedia.json
resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-invert.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/beta.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/beta.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-invert.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/alert-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/alert-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/required-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/required-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/indicators.json
resources/src/jquery/images/jquery.arrowSteps.divider-ltr.png [deleted file]
resources/src/jquery/images/jquery.arrowSteps.divider-rtl.png [deleted file]
resources/src/jquery/images/jquery.arrowSteps.head-ltr.png [deleted file]
resources/src/jquery/images/jquery.arrowSteps.head-rtl.png [deleted file]
resources/src/jquery/images/jquery.arrowSteps.tail-ltr.png [deleted file]
resources/src/jquery/images/jquery.arrowSteps.tail-rtl.png [deleted file]
resources/src/jquery/jquery.arrowSteps.css [deleted file]
resources/src/jquery/jquery.arrowSteps.js [deleted file]
resources/src/jquery/jquery.color.js
resources/src/jquery/jquery.makeCollapsible.js
resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterGroup.js
resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterItem.js
resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js
resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.CapsuleItemWidget.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.CapsuleItemWidget.monobook.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.ChangesListWrapperWidget.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterGroupWidget.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterWrapperWidget.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.Overlay.monobook.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.CapsuleItemWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ChangesListWrapperWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterCapsuleMultiselectWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterGroupWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterWrapperWidget.js
resources/src/mediawiki.special/mediawiki.special.changecredentials.js [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.userlogin.signup.js
resources/src/mediawiki.widgets/mw.widgets.TitleOptionWidget.js
resources/src/mediawiki/htmlform/htmlform.Checker.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.jqueryMsg.js
resources/src/mediawiki/mediawiki.user.blockcookie.js [deleted file]
tests/phpunit/includes/XmlTest.php
tests/phpunit/includes/changes/RecentChangeTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderFileModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderImageModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderWikiModuleTest.php
tests/phpunit/includes/specials/SpecialSearchTest.php
tests/phpunit/includes/specials/SpecialWatchlistTest.php
tests/qunit/suites/resources/mediawiki.rcfilters/dm.FilterItem.test.js
tests/qunit/suites/resources/mediawiki.rcfilters/dm.FiltersViewModel.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
tests/selenium/.eslintrc.json [new file with mode: 0644]
tests/selenium/README.md [new file with mode: 0644]
tests/selenium/pageobjects/createaccount.page.js [new file with mode: 0644]
tests/selenium/pageobjects/edit.page.js [new file with mode: 0644]
tests/selenium/pageobjects/history.page.js [new file with mode: 0644]
tests/selenium/pageobjects/page.js [new file with mode: 0644]
tests/selenium/pageobjects/preferences.page.js [new file with mode: 0644]
tests/selenium/pageobjects/userlogin.page.js [new file with mode: 0644]
tests/selenium/pageobjects/userlogout.page.js [new file with mode: 0644]
tests/selenium/specs/page.js [new file with mode: 0644]
tests/selenium/specs/user.js [new file with mode: 0644]
tests/selenium/wdio.conf.jenkins.js [new file with mode: 0644]
tests/selenium/wdio.conf.js [new file with mode: 0644]
thumb.php

diff --git a/CREDITS b/CREDITS
index 6a51e08..80d4e0e 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -434,6 +434,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * MrBlueSky
 * MrPete
 * Mukunda Modell
+* MusikAnimal
 * Mwalker
 * mwjames
 * mybugs.mail
index 0e1c8cb..1ecc2c0 100644 (file)
@@ -4,6 +4,7 @@ module.exports = function ( grunt ) {
 
        var wgServer = process.env.MW_SERVER,
                wgScriptPath = process.env.MW_SCRIPT_PATH,
+               WebdriverIOconfigFile,
                karmaProxy = {};
 
        grunt.loadNpmTasks( 'grunt-banana-checker' );
@@ -13,12 +14,19 @@ module.exports = function ( grunt ) {
        grunt.loadNpmTasks( 'grunt-jsonlint' );
        grunt.loadNpmTasks( 'grunt-karma' );
        grunt.loadNpmTasks( 'grunt-stylelint' );
+       grunt.loadNpmTasks( 'grunt-webdriver' );
 
        karmaProxy[ wgScriptPath ] = {
                target: wgServer + wgScriptPath,
                changeOrigin: true
        };
 
+       if ( process.env.JENKINS_HOME ) {
+               WebdriverIOconfigFile = './tests/selenium/wdio.conf.jenkins.js';
+       } else {
+               WebdriverIOconfigFile = './tests/selenium/wdio.conf.js';
+       }
+
        grunt.initConfig( {
                eslint: {
                        all: [
@@ -105,7 +113,15 @@ module.exports = function ( grunt ) {
                                        return require( 'path' ).join( dest, src.replace( 'resources/', '' ) );
                                }
                        }
+               },
+
+               // Configure WebdriverIO task
+               webdriver: {
+                       test: {
+                               configFile: WebdriverIOconfigFile
+                       }
                }
+
        } );
 
        grunt.registerTask( 'assert-mw-env', function () {
index 8eb1f89..bd75eb7 100644 (file)
@@ -69,6 +69,7 @@ production.
 * Updated psr/log from v1.0.0 to v1.0.2.
 * Update Moment.js from v2.8.4 to v2.15.0.
 * Updated oyejorge/less.php from v1.7.0.10 to v1.7.0.13.
+* Added wikimedia/remex-html v1.0.1.
 
 ==== New external libraries ====
 
@@ -80,6 +81,7 @@ production.
 * (T27187) Search suggestions based on jquery.suggestions will now correctly only
   highlight prefix matches in the results.
 * (T157035) "new mw.Uri()" was ignoring options when using default URI.
+* Special:Allpages can no longer be filtered by redirect in miser mode.
 
 === Action API changes in 1.29 ===
 * Submitting sensitive authentication request parameters to action=login,
@@ -114,6 +116,9 @@ production.
 * action=purge now requires a POST.
 * There is a new `languagevariants` siprop for action=query&meta=siteinfo,
   which returns a list of languages with active LanguageConverter instances.
+* action=query&query=allpages will no longer filter redirects using a database
+  query in miser mode. This may result in less results being returned than were
+  requested.
 
 === Action API internal changes in 1.29 ===
 * New methods were added to ApiBase to handle errors and warnings using i18n
@@ -256,9 +261,13 @@ changes to languages because of Phabricator reports.
   signature).  Subclasses are likely to call at least doMainQuery
   (possibly both), but other classes might too, because they were
   public.
-
   Also, some related hooks were deprecated, but this is not yet a
   breaking change.
+* Removed 'jquery.arrowSteps' module. (deprecated since 1.28)
+* The 'jquery.autoEllipsis' ResourceLoader module is now deprecated.
+* WikiRevision::$fileIsTemp was deprecated.
+* WikiRevision::$importer was deprecated.
+* WikiRevision::$user was deprecated.
 
 == Compatibility ==
 
index af8635a..cd8f310 100644 (file)
@@ -25,7 +25,7 @@
                "ext-xml": "*",
                "liuggio/statsd-php-client": "1.0.18",
                "mediawiki/at-ease": "1.1.0",
-               "oojs/oojs-ui": "0.19.5",
+               "oojs/oojs-ui": "0.20.0",
                "oyejorge/less.php": "1.7.0.13",
                "php": ">=5.5.9",
                "psr/log": "1.0.2",
@@ -38,7 +38,7 @@
                "wikimedia/ip-set": "1.1.0",
                "wikimedia/php-session-serializer": "1.0.4",
                "wikimedia/relpath": "1.0.3",
-               "wikimedia/remex-html": "1.0.0",
+               "wikimedia/remex-html": "1.0.1",
                "wikimedia/running-stat": "1.1.0",
                "wikimedia/scoped-callback": "1.0.0",
                "wikimedia/utfnormal": "1.1.0",
index f307f45..cf4e3ab 100644 (file)
@@ -2702,6 +2702,13 @@ variables from $wgResourceLoaderLESSVars are added. Can be used to add
 context-based variables.
 &$lessVars: array of variables already added
 
+'ResourceLoaderJqueryMsgModuleMagicWords': Called in
+ResourceLoaderJqueryMsgModule to allow adding magic words for jQueryMsg.
+The value should be a string, and they can depend only on the
+ResourceLoaderContext.
+$context: ResourceLoaderContext
+&$magicWords: Associative array mapping all-caps magic word to a string value
+
 'ResourceLoaderRegisterModules': Right before modules information is required,
 such as when responding to a resource
 loader request or generating HTML output.
index 1f4041b..cf6642a 100644 (file)
@@ -1450,13 +1450,9 @@ class Block {
         * Set the 'BlockID' cookie to this block's ID and expiry time. The cookie's expiry will be
         * the same as the block's, to a maximum of 24 hours.
         *
-        * An empty value can also be set, in order to retain the cookie but remove the block ID
-        * (e.g. as used in User::getBlockedStatus).
-        *
         * @param WebResponse $response The response on which to set the cookie.
-        * @param boolean $setEmpty Whether to set the cookie's value to the empty string.
         */
-       public function setCookie( WebResponse $response, $setEmpty = false ) {
+       public function setCookie( WebResponse $response ) {
                // Calculate the default expiry time.
                $maxExpiryTime = wfTimestamp( TS_MW, wfTimestamp() + ( 24 * 60 * 60 ) );
 
@@ -1467,12 +1463,21 @@ class Block {
                }
 
                // Set the cookie. Reformat the MediaWiki datetime as a Unix timestamp for the cookie.
-               $cookieValue = $setEmpty ? '' : $this->getCookieValue();
                $expiryValue = DateTime::createFromFormat( 'YmdHis', $expiryTime )->format( 'U' );
                $cookieOptions = [ 'httpOnly' => false ];
+               $cookieValue = $this->getCookieValue();
                $response->setCookie( 'BlockID', $cookieValue, $expiryValue, $cookieOptions );
        }
 
+       /**
+        * Unset the 'BlockID' cookie.
+        *
+        * @param WebResponse $response The response on which to unset the cookie.
+        */
+       public static function clearCookie( WebResponse $response ) {
+               $response->clearCookie( 'BlockID', [ 'httpOnly' => false ] );
+       }
+
        /**
         * Get the BlockID cookie's value for this block. This is usually the block ID concatenated
         * with an HMAC in order to avoid spoofing (T152951), but if wgSecretKey is not set will just
index 192ad08..d158c1e 100644 (file)
@@ -4173,7 +4173,7 @@ $wgMaxPPExpandDepth = 40;
  *
  * WARNING: Do not add 'file:' to this or internal file links will be broken.
  * Instead, if you want to support file links, add 'file://'. The same applies
- * to any other protocols with the same name as a namespace. See bug #44011 for
+ * to any other protocols with the same name as a namespace. See task T46011 for
  * more information.
  *
  * @see wfParseUrl
index c22125a..7a58326 100644 (file)
@@ -2318,12 +2318,9 @@ class EditPage {
        }
 
        public function setHeaders() {
-               global $wgOut, $wgUser, $wgAjaxEditStash, $wgCookieSetOnAutoblock;
+               global $wgOut, $wgUser, $wgAjaxEditStash;
 
                $wgOut->addModules( 'mediawiki.action.edit' );
-               if ( $wgCookieSetOnAutoblock === true ) {
-                       $wgOut->addModules( 'mediawiki.user.blockcookie' );
-               }
                $wgOut->addModuleStyles( 'mediawiki.action.edit.styles' );
 
                if ( $wgUser->getOption( 'showtoolbar' ) ) {
index dca2e1b..486abd8 100644 (file)
@@ -1279,12 +1279,15 @@ class Revision implements IDBAccessObject {
                        if ( isset( $row->old_id ) && $wiki === false ) {
                                // Make use of the wiki-local revision text cache
                                $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
-                               $text = $cache->getWithSetCallback(
+                               // The cached value should be decompressed, so handle that and return here
+                               return $cache->getWithSetCallback(
                                        $cache->makeKey( 'revisiontext', 'textid', $row->old_id ),
                                        self::getCacheTTL( $cache ),
-                                       function () use ( $url, $wiki ) {
+                                       function () use ( $url, $wiki, $flags ) {
                                                // No negative caching per Revision::loadText()
-                                               return ExternalStore::fetchFromURL( $url, [ 'wiki' => $wiki ] );
+                                               $text = ExternalStore::fetchFromURL( $url, [ 'wiki' => $wiki ] );
+
+                                               return self::decompressRevisionText( $text, $flags );
                                        },
                                        [ 'pcGroup' => self::TEXT_CACHE_GROUP, 'pcTTL' => $cache::TTL_PROC_LONG ]
                                );
@@ -1293,12 +1296,7 @@ class Revision implements IDBAccessObject {
                        }
                }
 
-               // If the text was fetched without an error, convert it
-               if ( $text !== false ) {
-                       $text = self::decompressRevisionText( $text, $flags );
-               }
-
-               return $text;
+               return self::decompressRevisionText( $text, $flags );
        }
 
        /**
@@ -1344,6 +1342,13 @@ class Revision implements IDBAccessObject {
         * @return string|bool Decompressed text, or false on failure
         */
        public static function decompressRevisionText( $text, $flags ) {
+               global $wgLegacyEncoding, $wgContLang;
+
+               if ( $text === false ) {
+                       // Text failed to be fetched; nothing to do
+                       return false;
+               }
+
                if ( in_array( 'gzip', $flags ) ) {
                        # Deal with optional compression of archived pages.
                        # This can be done periodically via maintenance/compressOld.php, and
@@ -1366,7 +1371,6 @@ class Revision implements IDBAccessObject {
                        $text = $obj->getText();
                }
 
-               global $wgLegacyEncoding;
                if ( $text !== false && $wgLegacyEncoding
                        && !in_array( 'utf-8', $flags ) && !in_array( 'utf8', $flags )
                ) {
@@ -1374,7 +1378,6 @@ class Revision implements IDBAccessObject {
                        # Upconvert on demand.
                        # ("utf8" checked for compatibility with some broken
                        #  conversion scripts 2008-12-30)
-                       global $wgContLang;
                        $text = $wgContLang->iconv( $wgLegacyEncoding, 'UTF-8', $text );
                }
 
index d24a27c..4e87967 100644 (file)
@@ -563,36 +563,6 @@ class Xml {
                        . Xml::closeElement( 'select' );
        }
 
-       /**
-        * Converts textual drop-down list to array
-        *
-        * @param string $list Correctly formatted text (newline delimited) to be
-        *   used to generate the options.
-        * @return array
-        */
-       public static function getArrayFromWikiTextList( $list = '' ) {
-               $options = [];
-
-               foreach ( explode( "\n", $list ) as $option ) {
-                       $value = trim( $option );
-                       if ( $value == '' ) {
-                               continue;
-                       } elseif ( substr( $value, 0, 1 ) == '*' && substr( $value, 1, 1 ) != '*' ) {
-                               // A new group is starting ...
-                               $value = trim( substr( $value, 1 ) );
-                               $options[] = $value;
-                       } elseif ( substr( $value, 0, 2 ) == '**' ) {
-                               // groupmember
-                               $value = trim( substr( $value, 2 ) );
-                               $options[] = $value;
-                       } else {
-                               // groupless reason list
-                               $options[] = $value;
-                       }
-               }
-               return $options;
-       }
-
        /**
         * Shortcut for creating fieldsets.
         *
index 604fdf9..a1fac0c 100644 (file)
@@ -26,6 +26,7 @@
  */
 
 use MediaWiki\Logger\LoggerFactory;
+use MediaWiki\MediaWikiServices;
 use Wikimedia\Timestamp\TimestampException;
 
 /**
@@ -544,7 +545,7 @@ class ApiMain extends ApiBase {
                        $runTime = microtime( true ) - $t;
                        $this->logRequest( $runTime );
                        if ( $this->mModule->isWriteMode() && $this->getRequest()->wasPosted() ) {
-                               $this->getStats()->timing(
+                               MediaWikiServices::getInstance()->getStatsdDataFactory()->timing(
                                        'api.' . $this->mModule->getModuleName() . '.executeTiming', 1000 * $runTime
                                );
                        }
index 7460bd5..6b959ae 100644 (file)
@@ -76,10 +76,13 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
                        $this->addWhere( "page_title $op= $cont_from" );
                }
 
-               if ( $params['filterredir'] == 'redirects' ) {
-                       $this->addWhereFld( 'page_is_redirect', 1 );
-               } elseif ( $params['filterredir'] == 'nonredirects' ) {
-                       $this->addWhereFld( 'page_is_redirect', 0 );
+               $miserMode = $this->getConfig()->get( 'MiserMode' );
+               if ( !$miserMode ) {
+                       if ( $params['filterredir'] == 'redirects' ) {
+                               $this->addWhereFld( 'page_is_redirect', 1 );
+                       } elseif ( $params['filterredir'] == 'nonredirects' ) {
+                               $this->addWhereFld( 'page_is_redirect', 0 );
+                       }
                }
 
                $this->addWhereFld( 'page_namespace', $params['namespace'] );
@@ -108,6 +111,18 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
                        $selectFields = $resultPageSet->getPageTableFields();
                }
 
+               $miserModeFilterRedirValue = null;
+               $miserModeFilterRedir = $miserMode && $params['filterredir'] !== 'all';
+               if ( $miserModeFilterRedir ) {
+                       $selectFields[] = 'page_is_redirect';
+
+                       if ( $params['filterredir'] == 'redirects' ) {
+                               $miserModeFilterRedirValue = 1;
+                       } elseif ( $params['filterredir'] == 'nonredirects' ) {
+                               $miserModeFilterRedirValue = 0;
+                       }
+               }
+
                $this->addFields( $selectFields );
                $forceNameTitleIndex = true;
                if ( isset( $params['minsize'] ) ) {
@@ -219,6 +234,11 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
                                break;
                        }
 
+                       if ( $miserModeFilterRedir && (int)$row->page_is_redirect !== $miserModeFilterRedirValue ) {
+                               // Filter implemented in PHP due to being in Miser Mode
+                               continue;
+                       }
+
                        if ( is_null( $resultPageSet ) ) {
                                $title = Title::makeTitle( $row->page_namespace, $row->page_title );
                                $vals = [
@@ -242,7 +262,7 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
        }
 
        public function getAllowedParams() {
-               return [
+               $ret = [
                        'from' => null,
                        'continue' => [
                                ApiBase::PARAM_HELP_MSG => 'api-help-param-continue',
@@ -314,6 +334,12 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
                                ApiBase::PARAM_DFLT => 'all'
                        ],
                ];
+
+               if ( $this->getConfig()->get( 'MiserMode' ) ) {
+                       $ret['filterredir'][ApiBase::PARAM_HELP_MSG_APPEND] = [ 'api-help-param-limited-in-miser-mode' ];
+               }
+
+               return $ret;
        }
 
        protected function getExamplesMessages() {
index f8e6acd..d2e956c 100644 (file)
@@ -17,7 +17,8 @@
                        "FriedhelmW",
                        "Predatorix",
                        "Luke081515",
-                       "Eddie"
+                       "Eddie",
+                       "Zenith"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Dokumentation]]\n* [[mw:API:FAQ|Häufig gestellte Fragen]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailingliste]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-Ankündigungen]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Fehlerberichte und Anfragen]\n</div>\n<strong>Status:</strong> Alle auf dieser Seite gezeigten Funktionen sollten funktionieren, allerdings ist die API in aktiver Entwicklung und kann sich zu jeder Zeit ändern. Abonniere die [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ MediaWiki-API-Ankündigungs-Mailingliste], um über Aktualisierungen informiert zu werden.\n\n<strong>Fehlerhafte Anfragen:</strong> Wenn fehlerhafte Anfragen an die API gesendet werden, wird ein HTTP-Header mit dem Schlüssel „MediaWiki-API-Error“ gesendet. Der Wert des Headers und der Fehlercode werden auf den gleichen Wert gesetzt. Für weitere Informationen siehe [[mw:API:Errors_and_warnings|API: Fehler und Warnungen]].\n\n<strong>Testen:</strong> Zum einfachen Testen von API-Anfragen, siehe [[Special:ApiSandbox]].",
        "apihelp-import-param-rootpage": "Als Unterseite dieser Seite importieren. Kann nicht zusammen mit <var>$1namespace</var> verwendet werden.",
        "apihelp-import-param-tags": "Auf den Eintrag im Import-Logbuch und die Nullversion bei den importierten Seiten anzuwendende Änderungsmarkierungen.",
        "apihelp-import-example-import": "Importiere [[meta:Help:ParserFunctions]] mit der kompletten Versionsgeschichte in den Namensraum 100.",
+       "apihelp-linkaccount-description": "Verbindet ein Benutzerkonto von einem Drittanbieter mit dem aktuellen Benutzer.",
        "apihelp-login-description": "Anmelden und Authentifizierungs-Cookies beziehen.\n\nDiese Aktion sollte nur in Kombination mit [[Special:BotPasswords]] verwendet werden. Die Verwendung für die Anmeldung beim Hauptkonto ist veraltet und kann ohne Warnung fehlschlagen. Um sich sicher beim Hauptkonto anzumelden, verwende <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
        "apihelp-login-param-name": "Benutzername.",
        "apihelp-login-param-password": "Passwort.",
        "apihelp-parse-paramvalue-prop-sections": "Gibt die Abschnitte im geparsten Wikitext zurück.",
        "apihelp-parse-paramvalue-prop-revid": "Ergänzt die Versionskennung der geparsten Seite.",
        "apihelp-parse-paramvalue-prop-displaytitle": "Ergänzt den Titel des geparsten Wikitextes.",
+       "apihelp-parse-paramvalue-prop-headhtml": "Gibt geparsten <code>&lt;head&gt;</code> der Seite zurück.",
        "apihelp-parse-paramvalue-prop-jsconfigvars": "Gibt die JavaScript-Konfigurationsvariablen speziell für die Seite aus. Zur Anwendung verwende <code>mw.config.set()</code>.",
        "apihelp-parse-paramvalue-prop-encodedjsconfigvars": "Gibt die JavaScript-Konfigurationsvariablen speziell für die Seite als JSON-Zeichenfolge aus.",
        "apihelp-parse-paramvalue-prop-indicators": "Gibt das HTML der Seitenstatusindikatoren zurück, die auf der Seite verwendet werden.",
        "apihelp-query+langlinks-paramvalue-prop-url": "Ergänzt die vollständige URL.",
        "apihelp-query+langlinks-paramvalue-prop-autonym": "Ergänzt den Namen der Muttersprache.",
        "apihelp-query+langlinks-param-dir": "Die Auflistungsrichtung.",
+       "apihelp-query+links-description": "Gibt alle Links von den angegebenen Seiten zurück.",
+       "apihelp-query+links-param-namespace": "Zeigt nur Links in diesen Namensräumen.",
        "apihelp-query+links-param-limit": "Wie viele Links zurückgegeben werden sollen.",
        "apihelp-query+links-param-dir": "Die Auflistungsrichtung.",
        "apihelp-query+links-example-simple": "Links von der <kbd>Hauptseite</kbd> abrufen",
        "apihelp-query+linkshere-param-prop": "Zurückzugebende Eigenschaften:",
        "apihelp-query+linkshere-paramvalue-prop-pageid": "Die Seitenkennung jeder Seite.",
        "apihelp-query+linkshere-paramvalue-prop-title": "Titel jeder Seite.",
+       "apihelp-query+linkshere-param-limit": "Wie viel zurückgegeben werden soll.",
+       "apihelp-query+linkshere-example-simple": "Holt eine Liste von Seiten, die auf [[Main Page]] verlinken.",
        "apihelp-query+logevents-description": "Ereignisse von den Logbüchern abrufen.",
        "apihelp-query+logevents-param-prop": "Zurückzugebende Eigenschaften:",
        "apihelp-query+logevents-paramvalue-prop-ids": "Ergänzt die Kennung des Logbuchereignisses.",
        "apihelp-query+logevents-example-simple": "Listet die letzten Logbuch-Ereignisse auf.",
        "apihelp-query+pageswithprop-paramvalue-prop-ids": "Fügt die Seitenkennung hinzu.",
        "apihelp-query+pageswithprop-param-limit": "Die maximale Anzahl zurückzugebender Seiten.",
+       "apihelp-query+pageswithprop-param-dir": "In welche Richtung sortiert werden soll.",
        "apihelp-query+prefixsearch-param-search": "Such-Zeichenfolge.",
+       "apihelp-query+prefixsearch-param-namespace": "Welche Namensräume durchsucht werden sollen.",
+       "apihelp-query+prefixsearch-param-limit": "Maximale Anzahl zurückzugebender Ergebnisse.",
        "apihelp-query+prefixsearch-param-offset": "Anzahl der zu überspringenden Ergebnisse.",
        "apihelp-query+prefixsearch-param-profile": "Zu verwendendes Suchprofil.",
+       "apihelp-query+protectedtitles-param-limit": "Wie viele Seiten insgesamt zurückgegeben werden sollen.",
        "apihelp-query+protectedtitles-param-prop": "Zurückzugebende Eigenschaften:",
        "apihelp-query+querypage-param-limit": "Anzahl der zurückzugebenden Ergebnisse.",
        "apihelp-query+recentchanges-description": "Listet die letzten Änderungen auf.",
        "apihelp-query+recentchanges-param-user": "Listet nur Änderungen von diesem Benutzer auf.",
        "apihelp-query+recentchanges-param-excludeuser": "Listet keine Änderungen von diesem Benutzer auf.",
        "apihelp-query+recentchanges-param-tag": "Listet nur Änderungen auf, die mit dieser Markierung markiert sind.",
+       "apihelp-query+recentchanges-param-prop": "Bezieht zusätzliche Informationen mit ein:",
        "apihelp-query+recentchanges-paramvalue-prop-comment": "Fügt den Kommentar für die Bearbeitung hinzu.",
        "apihelp-query+recentchanges-paramvalue-prop-flags": "Ergänzt Markierungen für die Bearbeitung.",
        "apihelp-query+recentchanges-paramvalue-prop-timestamp": "Ergänzt den Zeitstempel für die Bearbeitung.",
        "api-help-right-apihighlimits": "Höhere Beschränkungen in API-Anfragen verwenden (langsame Anfragen: $1; schnelle Anfragen: $2). Die Beschränkungen für langsame Anfragen werden auch auf Mehrwertparameter angewandt.",
        "api-help-open-in-apisandbox": "<small>[in Spielwiese öffnen]</small>",
        "api-help-authmanagerhelper-messageformat": "Zu verwendendes Format zur Rückgabe von Nachrichten.",
+       "apierror-badgenerator-unknown": "<kbd>generator=$1</kbd> unbekannt.",
+       "apierror-badip": "Der IP-Parameter ist nicht gültig.",
+       "apierror-badmd5": "Die angegebene MD5-Prüfsumme war falsch.",
+       "apierror-badmodule-badsubmodule": "Das Modul <kbd>$1</kbd> hat kein Untermodul namens „$2“.",
+       "apierror-badmodule-nosubmodules": "Das Modul <kbd>$1</kbd> hat keine Untermodule.",
+       "apierror-badparameter": "Ungültiger Wert für den Parameter <var>$1</var>.",
+       "apierror-badquery": "Ungültige Abfrage.",
        "apierror-cannot-async-upload-file": "Die Parameter <var>async</var> und <var>file</var> können nicht kombiniert werden. Falls du eine asynchrone Verarbeitung deiner hochgeladenen Datei wünschst, lade sie zuerst mithilfe des Parameters <var>stash</var> auf den Speicher hoch. Veröffentliche anschließend die gespeicherte Datei asynchron mithilfe <var>filekey</var> und <var>async</var>.",
+       "apierror-invalidsection": "Der Parameter <var>section</var> muss eine gültige Abschnittskennung oder <kbd>new</kbd> sein.",
        "apierror-invaliduserid": "Die Benutzerkennung <var>$1</var> ist nicht gültig.",
        "apierror-nosuchuserid": "Es gibt keinen Benutzer mit der Kennung $1.",
        "apierror-pagelang-disabled": "Das Ändern der Sprache von Seiten ist auf diesem Wiki nicht erlaubt.",
index d698b30..24cb11f 100644 (file)
        "apihelp-query+recentchanges-description": "Énumérer les modifications récentes.",
        "apihelp-query+recentchanges-param-start": "L’horodatage auquel démarrer l’énumération.",
        "apihelp-query+recentchanges-param-end": "L’horodatage auquel arrêter l’énumération.",
-       "apihelp-query+recentchanges-param-namespace": "Filtrer les modifications uniquement sur ces espaces de nom.",
-       "apihelp-query+recentchanges-param-user": "Lister uniquement les modifications par cet utilisateur.",
-       "apihelp-query+recentchanges-param-excludeuser": "Ne pas lister les modifications par cet utilisateur.",
+       "apihelp-query+recentchanges-param-namespace": "Filtrer les modifications uniquement sur ces espaces de noms.",
+       "apihelp-query+recentchanges-param-user": "Lister uniquement les modifications faites par cet utilisateur.",
+       "apihelp-query+recentchanges-param-excludeuser": "Ne pas lister les modifications faites par cet utilisateur.",
        "apihelp-query+recentchanges-param-tag": "Lister uniquement les modifications marquées avec cette balise.",
        "apihelp-query+recentchanges-param-prop": "Inclure des informations supplémentaires :",
-       "apihelp-query+recentchanges-paramvalue-prop-user": "Ajoute l’utilisateur responsable de la modification et marque si c’est une adresse IP.",
+       "apihelp-query+recentchanges-paramvalue-prop-user": "Ajoute l’utilisateur responsable de la modification et marque s'il s'agit d'une adresse IP.",
        "apihelp-query+recentchanges-paramvalue-prop-userid": "Ajoute l’ID de l’utilisateur responsable de la modification.",
        "apihelp-query+recentchanges-paramvalue-prop-comment": "Ajoute le commentaire de la modification.",
        "apihelp-query+recentchanges-paramvalue-prop-parsedcomment": "Ajoute le commentaire analysé pour la modification.",
        "apihelp-query+revisions-param-excludeuser": "Exclure les révisions faites par l’utilisateur.",
        "apihelp-query+revisions-param-tag": "Lister uniquement les révisions marquées avec cette balise.",
        "apihelp-query+revisions-param-token": "Quels jetons obtenir pour chaque révision.",
-       "apihelp-query+revisions-example-content": "Obtenir des données avec le contenu pour la dernière révision des titres <kbd>API</kbd> et <kbd>Page principale</kbd>.",
+       "apihelp-query+revisions-example-content": "Obtenir des données avec le contenu pour la dernière révision des titres <kbd>API</kbd> et <kbd>Main Page</kbd>.",
        "apihelp-query+revisions-example-last5": "Obtenir les 5 dernières révisions de la <kbd>Main Page</kbd>.",
        "apihelp-query+revisions-example-first5": "Obtenir les 5 premières révisions de la <kbd>Page principale</kbd>.",
        "apihelp-query+revisions-example-first5-after": "Obtenir les 5 premières révisions de la <kbd>Page principale</kbd> faites après le 01/05/2006.",
        "apihelp-query+search-param-backend": "Quel serveur de recherche utiliser, si ce n’est pas celui par défaut.",
        "apihelp-query+search-param-enablerewrites": "Activer la réécriture interne de la requête. Les serveurs de recherche peuvent changer la requête en une autre dont ils estiment qu'elle donne de meilleurs résultats, par exemple en corrigeant l'orthographe.",
        "apihelp-query+search-example-simple": "Rechercher <kbd>meaning</kbd>.",
-       "apihelp-query+search-example-text": "Rechercher des textes pour <kbd>signification</kbd>.",
+       "apihelp-query+search-example-text": "Rechercher des textes pour <kbd>meaning</kbd>.",
        "apihelp-query+search-example-generator": "Obtenir les informations sur les pages renvoyées par une recherche de <kbd>meaning</kbd>.",
        "apihelp-query+siteinfo-description": "Renvoyer les informations générales sur le site.",
        "apihelp-query+siteinfo-param-prop": "Quelles informations obtenir :",
        "apihelp-query+siteinfo-paramvalue-prop-general": "Information globale du système.",
-       "apihelp-query+siteinfo-paramvalue-prop-namespaces": "Liste des espaces de nom déclarés et leur nom canonique.",
-       "apihelp-query+siteinfo-paramvalue-prop-namespacealiases": "Liste des alias des espaces de nom déclarés.",
+       "apihelp-query+siteinfo-paramvalue-prop-namespaces": "Liste des espaces de noms déclarés avec leur nom canonique.",
+       "apihelp-query+siteinfo-paramvalue-prop-namespacealiases": "Liste des alias des espaces de noms déclarés.",
        "apihelp-query+siteinfo-paramvalue-prop-specialpagealiases": "Liste des alias des pages spéciales.",
        "apihelp-query+siteinfo-paramvalue-prop-magicwords": "Liste des mots magiques et leurs alias.",
        "apihelp-query+siteinfo-paramvalue-prop-statistics": "Renvoie les statistiques du site.",
index 183f3cb..392dc45 100644 (file)
        "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "Devolve a información dos dereitos (licenza) da wiki se está dispoñible.",
        "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Devolve información dos tipos de restricións (protección) dispoñibles.",
        "apihelp-query+siteinfo-paramvalue-prop-languages": "Devolve unha lista dos idiomas que soporta Mediawiki (opcionalmente pode localizarse usando <var>$1inlanguagecode</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Devolve unha lista de códigos de lingua para os que [[mw:LanguageConverter|LanguageConverter]] está activo, e as variantes soportadas para cada un.",
        "apihelp-query+siteinfo-paramvalue-prop-skins": "Devolve unha lista de todas as aparencias dispoñibles (opcionalmente pode localizarse usando <var>$1inlanguagecode</var>, noutro caso no idioma do contido).",
        "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "Devolve unha lista de etiquetas de extensión de analizador.",
        "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "Devolve unha lista de ganchos de función de analizador.",
        "apihelp-userrights-param-user": "Nome de usuario.",
        "apihelp-userrights-param-userid": "ID de usuario.",
        "apihelp-userrights-param-add": "Engadir o usuario a estes grupos, ou se xa é membro, actualizar a caducidade da súa afiliación.",
+       "apihelp-userrights-param-expiry": "Marcas de tempo de caducidade. Poden ser relativas (por exemplo, <kbd>5 meses</kbd> ou <kbd>2 semanas</kbd>) ou absolutas (por exemplo, <kbd>2014-09-18T12:34:56Z</kbd>). Se só se fixa unha marca de tempo, utilizarase para tódolos grupos que se pasen ó parámetro <var>$1add</var>. Use <kbd>infinite</kbd>, <kbd>indefinite</kbd>, <kbd>infinity</kbd>, ou <kbd>never</kbd> para que a pertenza ó grupo non teña data de caducidade.",
        "apihelp-userrights-param-remove": "Eliminar o usuario destes grupos.",
        "apihelp-userrights-param-reason": "Motivo para o cambio.",
        "apihelp-userrights-param-tags": "Cambia as etiquetas a aplicar á entrada do rexistro de dereitos de usuario.",
        "apierror-readapidenied": "Necesita permiso de lectura para utilizar ese módulo.",
        "apierror-readonly": "A wiki está actualmente en modo de só lectura.",
        "apierror-reauthenticate": "Non se autentificou recentemente nesta sesión. Por favor, volva a autentificarse.",
+       "apierror-revdel-mutuallyexclusive": "Non se pode usar o mesmo campo en <var>hide</var> e <var>show</var>.",
+       "apierror-revdel-needtarget": "É necesario un título obxectivo para este tipo RevDel.",
+       "apierror-revdel-paramneeded": "Requírese polo menos un valor para <var>hide</var> e/ou <var>show</var>.",
+       "apierror-revisions-norevids": "O parámetro <var>revids</var> non se pode utilizar xunto coas opción de lista (<var>$1limit</var>, <var>$1startid</var>, <var>$1endid</var>, <kbd>$1dir=newer</kbd>, <var>$1user</var>, <var>$1excludeuser</var>, <var>$1start</var> e <var>$1end</var>).",
+       "apierror-revisions-singlepage": "Utilizouse <var>titles</var>, <var>pageids</var> ou un xerador para proporcionar múltiples páxinas, pero os parámetros <var>$1limit</var>, <var>$1startid</var>, <var>$1endid</var>, <kbd>$1dir=newer</kbd>, <var>$1user</var>, <var>$1excludeuser</var>, <var>$1start</var> e <var>$1end</var> só poden utilizarse nunha soa páxina.",
        "apierror-revwrongpage": "r$1 non é unha revisión de $2.",
        "apierror-searchdisabled": "A busca <var>$1</var> está desactivada.",
        "apierror-sectionreplacefailed": "Non se puido combinar a sección actualizada.",
        "apierror-sizediffdisabled": "A diferenza de tamaño está deshabilitada no modo Miser.",
        "apierror-spamdetected": "A súa edición foi rexeitada por conter un fragmento de publicidade: <code>$1</code>.",
        "apierror-specialpage-cantexecute": "Non ten permiso para ver os resultados desta páxina especial.",
+       "apierror-stashedfilenotfound": "Non se puido atopar o ficheiro na reserva: $1.",
+       "apierror-stashfailed-complete": "A suba por partes completouse, revise o estado para obter máis detalles.",
+       "apierror-stashfailed-nosession": "Non hai sesión de suba por partes con esa clave.",
+       "apierror-stashfilestorage": "Non se puido almacenar a suba na reservaː $1",
        "apierror-stashinvalidfile": "Ficheiro de reserva incorrecto.",
        "apierror-stashpathinvalid": "Clave de ficheiro con formato incorrecto ou non válidaː $1.",
        "apierror-stashwrongowner": "Erro de propietarioː $1",
        "apierror-stashzerolength": "Ficheiro de lonxitude cero, non pode ser almacenado na reservaː $1.",
        "apierror-systemblocked": "Foi bloqueado automaticamente polo software MediaWiki.",
+       "apierror-templateexpansion-notwikitext": "A expansión de modelos só é compatible co contido en wikitexto. $1 usa o modelo de contido $2.",
+       "apierror-unknownaction": "A acción especificada, <kbd>$1</kbd>, non está recoñecida.",
        "apierror-unknownerror-editpage": "Erro descoñecido EditPageː $1.",
        "apierror-unknownerror-nocode": "Erro descoñecido.",
        "apierror-unknownerror": "Erro descoñecido: \"$1\".",
        "apierror-unknownformat": "Formato descoñecido \"$1\".",
        "apierror-unrecognizedparams": "{{PLURAL:$2|Parámetro non recoñecido|Parámetros non recoñecidos}}: $1.",
        "apierror-unrecognizedvalue": "Valor non recoñecido para o parámetro <var>$1</var>: $2.",
+       "apierror-unsupportedrepo": "O repositorio local de ficheiros non permite consultar tódalas imaxes.",
+       "apierror-upload-filekeyneeded": "Debe proporcionar un <var>filekey</var> cando <var>offset</var> é distinto de cero.",
+       "apierror-upload-filekeynotallowed": "Non pode proporcionar <var>filekey</var> cando <var>offset</var> é 0.",
+       "apierror-upload-inprogress": "A suba dende a reserva está en progreso.",
+       "apierror-upload-missingresult": "Non hai resultado nos datos de estado.",
        "apierror-urlparamnormal": "Non se puideron normalizar os parámetros de imaxe de $1.",
        "apierror-writeapidenied": "Non ten permiso para editar este wiki a través da API.",
        "apiwarn-alldeletedrevisions-performance": "Para ter un mellor rendemento á hora de xerar títulos, estableza <kbd>$1dir=newer</kbd>.",
        "apiwarn-badurlparam": "Non se puido analizar <var>$1urlparam</var> para $2. Só se usará a anchura e a altura.",
+       "apiwarn-badutf8": "O valor pasado para <var>$1</var> contén datos non válidos ou non normalizados. Os datos de texto deberían estar en formato Unicode válido, normalizado en NFC e sen caracteres de control C0 distintos de HT (\\t), LF (\\n) e CR (\\r).",
+       "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> quedou obsoleto. No seu lugar, utilice <kbd>prop=deletedrevisions</kbd> ou <kbd>list=alldeletedrevisions</kbd>.",
        "apiwarn-deprecation-httpsexpected": "Utilizouse HTTP cando esperábase HTTPS.",
        "apiwarn-deprecation-parameter": "O parámetro <var>$1</var> está obsoleto.",
+       "apiwarn-deprecation-purge-get": "O uso de <kbd>action=purge</kbd> mediante GET está obsoleto. Use POST no seu lugar.",
+       "apiwarn-deprecation-withreplacement": "<kbd>$1</kbd> está obsoleto. No seu lugar, utilice <kbd>$2</kbd>.",
        "apiwarn-invalidcategory": "\"$1\" non é unha categoría.",
        "apiwarn-invalidtitle": "\"$1\" non é un título válido.",
        "apiwarn-notfile": "\"$1\" non é un ficheiro.",
        "apiwarn-truncatedresult": "Truncouse este resultado porque doutra maneira sobrepasaría o límite de $1 bytes.",
        "apiwarn-validationfailed-badpref": "non é unha preferencia válida.",
        "apiwarn-validationfailed-cannotset": "non pode ser establecido por este módulo.",
+       "apiwarn-validationfailed-keytoolong": "clave demasiado longa (non pode ter máis de $1 bytes).",
        "apiwarn-validationfailed": "Erro de validación de <kbd>$1</kbd>: $2",
        "apiwarn-wgDebugAPI": "<strong>Aviso de seguridade</strong>: <var>$wgDebugAPI</var> está habilitado.",
        "api-feed-error-title": "Erro ($1)",
index 91e3e50..25e8330 100644 (file)
        "api-help-permissions-granted-to": "{{PLURAL:$1|Przydzielone dla}}: $2",
        "api-help-right-apihighlimits": "Użyj wyższych limitów w zapytaniach API (dla zapytań powolnych: $1; dla zapytań szbkich: $2). Limity zapytań powolnych są także stosowane dla parametrów z podanymi wieloma wartościami.",
        "api-help-open-in-apisandbox": "<small>[otwórz w brudnopisie]</small>",
+       "apierror-articleexists": "Artykuł, który próbowałeś utworzyć, już został utworzony.",
        "apierror-baddiff": "Różnicy wersji nie można odtworzyć. Jedna lub obie wersje nie istnieją, lub nie masz uprawnień do ich wyświetlenia.",
        "apierror-badgenerator-unknown": "Nieznany <kbd>generator=$1</kbd>.",
        "apierror-badip": "Parametr IP nie jest prawidłowy.",
index ea5278f..135c9b2 100644 (file)
@@ -19,6 +19,7 @@
  * @file
  */
 use Liuggio\StatsdClient\Factory\StatsdDataFactory;
+use MediaWiki\MediaWikiServices;
 
 /**
  * The simplest way of implementing IContextSource is to hold a RequestContext as a
@@ -172,7 +173,7 @@ abstract class ContextSource implements IContextSource {
         * @return StatsdDataFactory
         */
        public function getStats() {
-               return $this->getContext()->getStats();
+               return MediaWikiServices::getInstance()->getStatsdDataFactory();
        }
 
        /**
index ab4a609..7426624 100644 (file)
@@ -17,6 +17,7 @@
  *
  * @file
  */
+use MediaWiki\MediaWikiServices;
 use Wikimedia\Assert\Assert;
 
 /**
@@ -169,7 +170,7 @@ class SiteStatsUpdate implements DeferrableUpdate, MergeableUpdate {
        }
 
        protected function doUpdateContextStats() {
-               $stats = RequestContext::getMain()->getStats();
+               $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
                foreach ( [ 'edits', 'articles', 'pages', 'users', 'images' ] as $type ) {
                        $delta = $this->$type;
                        if ( $delta !== 0 ) {
index 148e50c..b0ab244 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  * @ingroup DifferenceEngine
  */
+use MediaWiki\MediaWikiServices;
 
 /** @deprecated use class constant instead */
 define( 'MW_DIFF_VERSION', '1.11a' );
@@ -852,7 +853,7 @@ class DifferenceEngine extends ContextSource {
                        $result = $this->textDiff( $otext, $ntext );
 
                        $time = intval( ( microtime( true ) - $time ) * 1000 );
-                       $this->getStats()->timing( 'diff_time', $time );
+                       MediaWikiServices::getInstance()->getStatsdDataFactory()->timing( 'diff_time', $time );
                        // Log requests slower than 99th percentile
                        if ( $time > 100 && $this->mOldPage && $this->mNewPage ) {
                                wfDebugLog( 'diff',
index f7e85a8..e367812 100644 (file)
@@ -5,6 +5,7 @@
  *
  * Represents files in a repository.
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * Base code for files.
@@ -436,7 +437,7 @@ abstract class File implements IDBAccessObject {
                        $this->fsFile = $this->repo->getLocalReference( $this->getPath() );
 
                        $statTiming = microtime( true ) - $starttime;
-                       RequestContext::getMain()->getStats()->timing(
+                       MediaWikiServices::getInstance()->getStatsdDataFactory()->timing(
                                'media.thumbnail.generate.fetchoriginal', 1000 * $statTiming );
 
                        if ( !$this->fsFile ) {
@@ -1117,7 +1118,7 @@ abstract class File implements IDBAccessObject {
        public function generateAndSaveThumb( $tmpFile, $transformParams, $flags ) {
                global $wgIgnoreImageErrors;
 
-               $stats = RequestContext::getMain()->getStats();
+               $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
 
                $handler = $this->getHandler();
 
@@ -1227,7 +1228,7 @@ abstract class File implements IDBAccessObject {
                // this object exists
                $tmpFile->bind( $this );
 
-               RequestContext::getMain()->getStats()->timing(
+               MediaWikiServices::getInstance()->getStatsdDataFactory()->timing(
                        'media.thumbnail.generate.bucket', 1000 * $buckettime );
 
                return true;
index 3a3146b..83a8023 100644 (file)
@@ -1145,6 +1145,9 @@ abstract class HTMLFormField {
         * @since 1.18
         */
        protected static function formatErrors( $errors ) {
+               // Note: If you change the logic in this method, change
+               // htmlform.Checker.js to match.
+
                if ( is_array( $errors ) && count( $errors ) === 1 ) {
                        $errors = array_shift( $errors );
                }
index edc3548..df71524 100644 (file)
  * @ingroup SpecialPage
  */
 class WikiRevision {
-       /** @todo Unused? */
+
+       /**
+        * @since 1.17
+        * @deprecated in 1.29. Unused.
+        * @note Introduced in 9b3128eb2b654761f21fd4ca1d5a1a4b796dc912, unused there, unused now.
+        */
        public $importer = null;
 
        /** @var Title */
@@ -45,7 +50,9 @@ class WikiRevision {
 
        /**
         * @var int
-        * @todo Can't find any uses. Public, because that's suspicious. Get clarity. */
+        * @deprecated in 1.29. Unused.
+        * @note Introduced in 436a028086fb3f01c4605c5ad2964d56f9306aca, unused there, unused now.
+        */
        public $user = 0;
 
        /** @var string */
@@ -94,11 +101,6 @@ class WikiRevision {
        public $sha1base36 = false;
 
        /**
-        * @var bool
-        * @todo Unused?
-        */
-       public $isTemp = false;
-
        /** @var string */
        public $archiveName = '';
 
@@ -107,7 +109,18 @@ class WikiRevision {
        /** @var mixed */
        protected $src;
 
-       /** @todo Unused? */
+       /**
+        * @since 1.18
+        * @var bool
+        */
+       public $isTemp = false;
+
+       /**
+        * @since 1.18
+        * @deprecated 1.29 use Wikirevision::isTempSrc()
+        * First written to in 43d5d3b682cc1733ad01a837d11af4a402d57e6a
+        * Actually introduced in 52cd34acf590e5be946b7885ffdc13a157c1c6cf
+        */
        public $fileIsTemp;
 
        /** @var bool */
@@ -220,6 +233,7 @@ class WikiRevision {
        public function setFileSrc( $src, $isTemp ) {
                $this->fileSrc = $src;
                $this->fileIsTemp = $isTemp;
+               $this->isTemp = $isTemp;
        }
 
        /**
index b950420..7a03c87 100644 (file)
@@ -90,6 +90,7 @@
        "config-db-name": "Име на базата от данни:",
        "config-db-name-help": "Избира се име, което да идентифицира уикито.\nТо не трябва да съдържа интервали.\n\nАко се използва споделен хостинг, доставчикът на услугата би трябвало да е предоставил или име на базата от данни, която да бъде използвана, или да позволява създаването на бази от данни чрез контролния панел.",
        "config-db-name-oracle": "Схема на базата от данни:",
+       "config-db-account-oracle-warn": "Има три поддържани сценария за инсталиране на Oracle като бекенд база данни:\n\nАко искате да създадете профил в базата данни като част от процеса на инсталиране, моля, посочете профил със SYSDBA като профил в базата данни за инсталиране и посочете желаните данни за влизане (име и парола) за профил с уеб достъп; в противен случай можете да създадете профил с уеб достъп ръчно и предоставите само него (ако той има необходимите права за създаване на схематични обекти), или да предоставите два различни профила - един с привилегии за създаване на обекти, и друг - с ограничения за уеб достъп.\n\nСкрипт за създаването на профил с необходимите привилегии може да се намери в папката \"maintenance/oracle/\" на тази инсталация. Имайте в предвид, че използването на ограничен профил ще деактивира всички възможности за обслужване на профила по подразбиране.",
        "config-db-install-account": "Потребителска сметка за инсталацията",
        "config-db-username": "Потребителско име за базата от данни:",
        "config-db-password": "Парола за базата от данни:",
        "config-db-web-account": "Сметка за уеб достъп до базата от данни",
        "config-db-web-help": "Избиране на потребителско име и парола, които уеб сървърът ще използва да се свързва с базата от данни при обичайната работа на уикито.",
        "config-db-web-account-same": "Използване на същата сметка като при инсталацията.",
-       "config-db-web-create": "Създаване на сметката ако все още не съществува",
+       "config-db-web-create": "Създаване на сметката, ако все още не съществува",
        "config-db-web-no-create-privs": "Посочената сметка за инсталацията не разполага с достатъчно права за създаване на нова сметка.\nНеобходимо е посочената сметка вече да съществува.",
        "config-mysql-engine": "Хранилище на данни:",
        "config-mysql-innodb": "InnoDB",
index 7a26214..9191d18 100644 (file)
@@ -15,7 +15,7 @@
        "config-localsettings-upgrade": "Kavet ez eus bet ur restr <code>LocalSettings.php</code>.\nEvit hizivaat ar staliadur-se, merkit an talvoud <code>$wgUpgradeKey</code> er voest dindan.\nE gavout a rit e <code>LocalSettings.php</code>.",
        "config-localsettings-cli-upgrade": "Dinoet ez eus bet ur restr <code>LocalSettings.php</code>.\nEvit lakaat ar staliadur-mañ a-live, implijit <code>update.php</code> e plas",
        "config-localsettings-key": "Alc'hwez hizivaat :",
-       "config-localsettings-badkey": "Direizh eo an alc'hwez merket ganeoc'h",
+       "config-localsettings-badkey": "Direizh eo an alc'hwez hizivaat lakaet ganeoc'h.",
        "config-upgrade-key-missing": "Kavet ez eus bet ur staliadur kent eus MediaWiki.\nEvit hizivaat ar staliadur-se, ouzhpennit al linenn da-heul e traoñ ho restr <code>LocalSettings.php</code>:\n\n$1",
        "config-localsettings-incomplete": "Diglok e seblant bezañ ar restr <code>LocalSettings.php</code> zo anezhi dija.\nAn argemmenn $1 n'eo ket termenet.\nKemmit <code>LocalSettings.php</code> evit ma vo termenet an argemmenn-se, ha klikit war « {{int:Config-continue}} ».",
        "config-localsettings-connection-error": "C'hoarvezet ez eus ur fazi en ur gevreañ ouzh an diaz roadennoù oc'h implijout an arventennoù diferet e <code>LocalSettings.php</code>. Reizhit an arventennoù-se hag esaeit en-dro.\n\n$1",
        "config-env-php": "Staliet eo PHP $1.",
        "config-env-hhvm": "HHVM $1 zo staliet.",
        "config-unicode-using-intl": "Oc'h implijout [http://pecl.php.net/intl an astenn PECL intl] evit ar reolata Unicode.",
-       "config-unicode-pure-php-warning": "'''Diwallit''' : N'haller ket kaout an [http://pecl.php.net/intl intl PECL astenn] evit merañ reoladur Unicode, a zistro d'ar stumm gorrek emplementet e-PHP.\nMa lakait da dreiñ ul lec'hienn darempredet-stank e vo mat deoc'h lenn un tammig bihan diwar-benn se war [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalization]. (e saozneg)",
+       "config-unicode-pure-php-warning": "<strong>Diwallit</strong> : N'haller ket ober gant an [http://pecl.php.net/intl intl astenn PECL] evit merañ reoladur Unicode; distreiñ d'ar stumm gorrek emplementet e PHP-rik.\nMa rit war-dro ul lec'hienn darempredet-stank e vo mat deoc'h lenn un tammig bihan diwar-benn se war [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations reolennadur Unicode].",
        "config-unicode-update-warning": "'''Diwallit''': ober a ra stumm staliet endalc'her skoueriekaat Unicode gant ur stumm kozh eus [http://site.icu-project.org/ levraoueg meziantoù ar raktres ICU].\nDleout a rafec'h [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations hizivaat] ma seblant deoc'h bezañ pouezus ober gant Unicode.",
-       "config-no-db": "N'eus ket bet gallet kavout ur sturier diazoù roadennoù a zere ! Ret eo deoc'h staliañ ur sturier diazoù roadennoù evit PHP.\nSkoret eo an diazoù roadennoù da-heul : $1.\n\nMa rit gant un herberc'hiañ kenrannet, goulennit digant ho herberc'hier staliañ ur sturier diaz roadennoù azas.\nMa kempunit PHP c'hwi hoc'h-unan, adkeflugnit-eñ en ur weredekaat un arval diaz roadennoù, da skouer en ur ober gant <code>./configure --mysql</code>.\nM'hoc'h eus staliet PHP adalek ur pakad Debian pe Ubuntu, eo ret deoc'h staliañ ar vodulenn php5-mysql ivez.",
+       "config-no-db": "N'eus ket bet gallet kavout ur sturier diazoù roadennoù a zere ! Ret eo deoc'h staliañ ur sturier diazoù roadennoù evit PHP.\nSkoret eo {{PLURAL:$2|ar seurt|ar seurtoù}} diazoù roadennoù da-heul : $1.\n\nMard eo bet kempunet PHP ganeoc'h-c'hwi hoc'h-unan, adkeflugnit-eñ en ur weredekaat un arval diaz roadennoù, da skouer en ur ober gant <code>/configure --with-mysqli</code>.\nM'hoc'h eus staliet PHP adalek ur pakad Debian pe Ubuntu, eo ret deoc'h staliañ, da skouer, ar pakad <code>php5-mysql</code> ivez.",
+       "config-outdated-sqlite": "<strong>Taolit pled :</strong> ober a rit gant SQLite $1, hag a zo izeloc'h eget ar stumm $2 ret bihanañ. Ne vo ket posupl ober gant SQLite.",
        "config-no-fts3": "'''Diwallit ''': Kempunet eo SQLite hep ar [//sqlite.org/fts3.html vodulenn FTS3]; ne vo ket posupl ober gant an arc'hwelioù klask er staliadur-mañ",
+       "config-pcre-old": "<strong>Fazo groñs :</strong> rekis eo ober gant PCRE $1 pe nevesoc'h.\nLiammet eo ho PHP binarel gant PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Gouzout hiroc'h].",
        "config-pcre-no-utf8": "'''Fazi groñs ''': evit doare eo bet kempunet modulenn PCRE PHP hep ar skor PCRE_UTF8.\nEzhomm en deus MediaWiki eus UTF-8 evit mont plaen en-dro.",
        "config-memory-raised": "<code>memory_limit</code> ar PHP zo $1, kemmet e $2.",
        "config-memory-bad": "'''Diwallit :''' Da $1 emañ arventenn <code>memory_limit</code> PHP.\nRe izel eo moarvat.\nMarteze e c'hwito ar staliadenn !",
        "config-apc": "Staliet eo [http://www.php.net/apc APC]",
        "config-apcu": "Staliet eo [http://www.php.net/apcu APCu]",
        "config-wincache": "Staliet eo [http://www.iis.net/download/WinCacheForPhp WinCache]",
+       "config-no-cache-apcu": "<strong>Taolit pled :</strong> N'eus ket bet gallet kavout [http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] pe [http://www.iis.net/download/WinCacheForPhp WinCache].\nN'eo ket gweredekaet ar c'hrubuilhañ traezoù.",
+       "config-mod-security": "<strong>Taolit pled :</strong> Gweredekaet eo [http://modsecurity.org/ mod_security]/mod_security2 gant ho servijer web. Ma n'eo ket kfluniet mat e c'hall tegas trubuilhoù da MediaWiki ha meziantoù all a aotre implijerien da ouzhpennañ danvez evel ma karont.\nE kement ha m'eo posupl e tlefe bezañ diweredekaet. A-hend-all, sellit ouzh [http://modsecurity.org/documentation/ mod_security an teuliadur] pe kit e darempred gant skoazell ho herberc'hier m'en em gavit gant fazioù dargouezhek.",
        "config-diff3-bad": "N'eo ket bet kavet GNU diff3.",
+       "config-git": "Kavet eo bet ar meziant kontrolliñ adstummoù Git : <code>$1</code>.",
+       "config-git-bad": "N'eo ket bet kavet ar meziant kontrolliñ stummoù Git.",
        "config-imagemagick": "ImageMagick kavet : <code>$1</code>.\nGweredekaet e vo ar bihanaat skeudennoù ma vez gweredekaet ganeoc'h ar pellgargañ restroù.",
        "config-gd": "Kavet eo bet al levraoueg c'hrafek GD enframmet.\nGweredekaet e vo ar bihanaat skeudennoù ma vez gweredekaet an enporzhiañ restroù.",
        "config-no-scaling": "N'eus ket bet gallet kavout al levraoueg GD pe ImageMagick.\nDiweredekaet e vo ar bihanaat skeudennoù.",
        "config-no-uri": "'''Fazi :''' N'eus ket tu da anavezout URI ar skript red.\nStaliadur nullet.",
+       "config-no-cli-uri": "<strong>Diwallit :</strong> N'eus bet spisaet <code>--scriptpath</code> ebet, graet e vo, dre ziouer, gant : <code>$1</code>.",
        "config-using-server": "Oc'h implijout an anv servijer \"<nowiki>$1</nowiki>\".",
        "config-using-uri": "Oc'h implijout ar servijour URL \"<nowiki>$1$2</nowiki>\".",
        "config-uploads-not-safe": "'''Diwallit :'''Bresk eo ho kavlec'h pellgargañ dre ziouer <code>$1</code> rak gallout a ra erounit ne vern pe skript.\nha pa vefe gwiriet gant MediaWiki an holl restroù pellgarget eo erbedet-groñs da [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security serriñ ar breskter surentez-mañ] a-rao gweredekaat ar pellgargañ.",
+       "config-no-cli-uploads-check": "<strong>Diwallit :</strong> N'eo ket bet gwiriet ho kavlec'h enporzhiañ dre ziouer (<code>$1</code>) e-keñver breskted erounezadur skriptoù tidek e-pad staliadur CLI.",
        "config-brokenlibxml": "Ur meskad stummoù PHP ha libxml2 dreinek a vez implijet gant ho reizhiad. Gallout a ra breinañ ar roadennoù e MediaWiki hag en arloadoù web all.\nHizivait da libxml2 2.7.3 pe nevesoc'h ([https://bugs.php.net/bug.php?id=45996 draen renablet gant PHP]).\nStaliadur c'hwitet.",
+       "config-suhosin-max-value-length": "Staliet eo Suhosin ha bevennin a ra <code>hirder</code> an arventenn GET da $1 okted.\nParzh ResourceLoader Mediawiki a zoujo d'ar vevenn-se met se a zisteray ar varregezh. \nMa c'hallit e tlefec'h spisaat <code>suhosin.get.max_value_length</code> da 1024 pe uheloc'h e <code>php.ini</code>, ha merkañ <code>$wgResourceLoaderMaxQueryLength</code> gant an hevelep talvoud e <code>LocalSettings.php</code>.",
        "config-db-type": "Doare an diaz roadennoù :",
        "config-db-host": "Anv implijer an diaz roadennoù :",
        "config-db-host-help": "M'emañ ho servijer roadennoù war ur servijer disheñvel, merkit amañ anv an ostiz pe ar chomlec'h IP.\n\nMa rit gant un herberc'hiañ kenrannet, e tlefe ho herberc'hier bezañ pourchaset deoc'h an anv ostiz reizh en teulioù titouriñ.\n\nM'emaoc'h o staliañ ur servijer Windows ha ma rit gant MySQL, marteze ne'z aio ket en-dro \"localhost\" evel anv servijer. Ma ne dro ket, klaskit ober gant \"127.0.0.1\" da chomlec'h IP lechel.",
        "config-db-host-oracle": "TNS an diaz roadennoù :",
+       "config-db-host-oracle-help": "Merkit un [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm anv kevreañ lec'hel] reizh; dleout a ra ur restr tnsnames.ora bezañ hewel e-pad ar staliadur.<br /> Ma rit gant al levraouegoù arval 10g pe nevesoc'h e c'hallit ivez ober gant an hentenn envel [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].",
        "config-db-wiki-settings": "Anavezout ar wiki-mañ",
        "config-db-name": "Anv an diaz roadennoù :",
        "config-db-name-help": "Dibabit un anv evit ho wiki.\nNa lakait ket a esaouennoù ennañ.\n\nMa ri gant un herberc'hiañ kenrannet e vo pourchaset deoc'h un anv diaz roadennoù dibar da vezañ graet gantañ gant ho herberc'hier pe e lezo ac'hanoc'h da grouiñ diazoù roadennoù dre ur banell gontrolliñ.",
        "config-admin-error-password": "Fazi diabarzh o lakaat ur ger-tremen evit ar merour « <nowiki>$1</nowiki> » : <pre>$2</pre>",
        "config-admin-error-bademail": "Ebarzhet hoc'h eus ur chomlec'h postel direizh.",
        "config-subscribe": "Koumanantit d'ar [https://lists.wikimedia.org/mailman/listinfo/mediawiki-roll kemennoù evit ar stummoù nevez].",
+       "config-pingback": "Rannañ roadennoù diwar-benn ar staliadur-mañ gant diorroerien Mediawiki.",
        "config-almost-done": "Kazi echu eo !\nGellout a rit tremen ar c'hefluniadur nevez ha staliañ ar wiki war-eeun.",
        "config-optional-continue": "Sevel muioc'h a goulennoù ouzhin.",
        "config-optional-skip": "Aet on skuizh, staliañ ar wiki hepken.",
        "config-license-cc-by": "Creative Commons Deroadenn",
        "config-license-cc-by-nc-sa": "Creative Commons Deroadenn Angenwerzhel Kenrannañ heñvel",
        "config-license-cc-0": "Creative Commons Zero (Domani foran)",
+       "config-license-gfdl": "Aotre implijout teuliadur frank GNU 1.3 pe nevesoc'h",
        "config-license-pd": "Domani foran",
        "config-license-cc-choose": "Dibabit un aotre-implijout Creative Commons personelaet",
        "config-email-settings": "Arventennoù ar postel",
        "config-cc-not-chosen": "Dibabit an aotre-implijout Creative Commons a fell deoc'h ober gantañ ha klikit war \"proceed\".",
        "config-advanced-settings": "Kefluniadur araokaet",
        "config-cache-options": "Arventennoù evit krubuilhañ traezoù :",
-       "config-cache-accel": "Krubuilhañ traezoù PHP (APC, XCache pe WinCache)",
+       "config-cache-accel": "Krubuilhañ traezoù PHP (APC, APCu, XCache pe WinCache)",
        "config-cache-memcached": "Implijout Memcached (en deus ezhomm bezañ staliet ha kefluniet)",
        "config-memcached-servers": "Servijerioù Memcached :",
        "config-memcached-help": "Roll ar chomlec'hioù IP da implijout evit Memcached.\nRet eo spisaat unan dre linenn ha spisaat ar porzh da vezañ implijet. Da skouer :\n127.0.0.1:11211\n192.168.1.25:1234",
        "config-memcache-needservers": "Diuzet hoc'h eus Memcached evel seurt krubuilh met n'hoc'h eus spisaet servijer ebet.",
        "config-memcache-badip": "Ur chomlec'h IP direizh hoc'h eus lakaet evit Memcached : $1.",
+       "config-memcache-noport": "N'eus ket bet spisaet porzh ebet ganeoc'h evit servijer Memcached : $1.\nMa n'anavezit ket ar porzh, setu an hini dre ziouer : 11211.",
        "config-memcache-badport": "Niverennoù porzh Memcached a zlefe bezañ etre $1 ha $2.",
        "config-extensions": "Astennoù",
        "config-extensions-help": "N'eo ket bet detektet an astennoù rollet a-us en ho kavlec'h <code>./astennoù</code>.\n\nMarteze e vo ezhomm kefluniañ pelloc'h met gallout a rit o gweredekaat bremañ.",
        "config-skins": "Gwiskadurioù",
+       "config-skins-help": "Kavet eo bet ar gwiskadurioù renablet a-us en ho kavlec'h <code>./skins</code>. Ret eo deoc'h gweredekaat unan da nebeutañ, ha dibab an hini dre ziouer.",
        "config-skins-use-as-default": "Implijout ar gwiskadur-mañ dre ziouer",
+       "config-skins-missing": "N'eus bet kavet gwiskadur ebet : ober a raio MediaWiki gant unan dre ziouer betek ma vo staliet reoù a zegouezh.",
        "config-skins-must-enable-some": "Ret eo deoc'h dibab da nebautañ ur gwiskadur da weredekaat.",
        "config-skins-must-enable-default": "Ar gwiskadur dre ziouer dibabet a rank bezañ gweredekaet.",
        "config-install-alreadydone": "'''Diwallit''': Staliet hoc'h eus MediaWiki dija war a seblant hag emaoc'h o klask e staliañ c'hoazh.\nKit d'ar bajenn war-lerc'h, mar plij.",
index 89f8e55..b8dab21 100644 (file)
@@ -86,7 +86,7 @@
        "config-db-host-oracle-help": "Внесете важечко [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm месно име за поврзување]. На оваа воспоставка мора да ѝ биде видлива податотеката tnsnames.ora.<br />Ако користите клиентски библиотеки 10g или понови, тогаш можете да го користите и методот на иметнување на [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].",
        "config-db-wiki-settings": "Идентификувај го викиво",
        "config-db-name": "Име на базата:",
-       "config-db-name-help": "Одберете име што ќе го претставува вашето вики.\nИмето не смее да содржи празни места.\n\nАко користите заедничко (споделено) вдомување, тогаш вашиот вдомител ќе ви даде конкретно име на база за користење, или пак ќе ви даде да создавате бази преку контролната табла.",
+       "config-db-name-help": "Одберете име што ќе го претставува вашето вики.\nИмето не смее да содржи празни места.\n\nАко користите заедничко (споделено) вдомување, тогаш вашиот вдомител ќе ви даде конкретно име на база за користење, или пак ќе ви даде да создавате бази преку управувачницата.",
        "config-db-name-oracle": "Шема на базата:",
        "config-db-account-oracle-warn": "Постојат три поддржани сценарија за воспоставка на Oracle како базен услужник:\n\nАко сакате да создадете сметка на базата како дел од постапката за воспоставка, наведете сметка со SYSDBA-улога како сметка за базата што ќе се воспостави и наведете ги саканите податоци за сметката за мрежен пристап. Во друг случај, можете да создадете сметка за мрежен пристап рачно и да ја наведете само таа сметка (ако има дозволи за создавање на шематски објекти) или пак да наведете две различни сметки, една со привилегии за создавање, а друга (ограничена) за мрежен пристап.\n\nСкриптата за создавање сметка со задолжителни привилегии ќе ја најдете во папката „maintenance/oracle/“ од оваа воспоставка. Имајте на ум дека ако користите ограничена сметка ќе ги оневозможите сите функции за одржување со основната сметка.",
        "config-db-install-account": "Корисничка смета за воспоставка",
index 13944ee..35fa8e8 100644 (file)
@@ -69,7 +69,7 @@
        "config-env-hhvm": "HHVM $1 está instalado.",
        "config-unicode-using-intl": "Usando a [http://pecl.php.net/intl extensão intl PECL] para a normalização Unicode.",
        "config-unicode-pure-php-warning": "<strong>Aviso</strong>: A [http://pecl.php.net/intl extensão intl PECL] não está disponível para efetuar a normalização Unicode, abortando e passando para a lenta implementação de PHP puro.\nSe o seu site tem um alto volume de tráfego, informe-se sobre a [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalização Unicode].",
-       "config-unicode-update-warning": "<strong>Aviso:</strong> A versão instalada do wrapper de normalização Unicode usa uma versão mais antiga da biblioteca do [//www.site.icu-project.org/projeto ICU].\nVocê deve [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations atualizar] se você tem quaisquer preocupações com o uso do Unicode.",
+       "config-unicode-update-warning": "<strong>Aviso:</strong> A versão instalada do wrapper de normalização Unicode usa uma versão mais antiga da biblioteca do [http://www.site.icu-project.org/projeto ICU].\nVocê deve [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations atualizar] se você tem quaisquer preocupações com o uso do Unicode.",
        "config-no-db": "Não foi possível encontrar um driver apropriado para a banco de dados! Você precisa instalar um driver de banco de dados para PHP. {{PLURAL:$2|É aceite o seguinte tipo|São aceites os seguintes tipos}} de banco de dados: $1.\n\nSe compilou o PHP você mesmo, reconfigure-o com um cliente de banco de dados ativado, por exemplo, usando <code>./configure --with-mysqli</code>.\nSe instalou o PHP a partir de um pacote Debian ou Ubuntu, então também precisa instalar, por exemplo, o pacote <code>php5-mysql</code>.",
        "config-outdated-sqlite": "<strong>Aviso:</strong> você tem o SQLite versão $1, que é menor do que a versão mínima necessária $2. O SQLite não estará disponível.",
        "config-no-fts3": "<strong>Aviso</strong> O SQLite foi compilado sem o [//sqlite.org/fts3.html módulo FTS3], as funcionalidades de pesquisa não estarão disponíveis nesta instalação.",
        "config-no-cli-uri": "<strong>Aviso:</strong> Nenhum <code>--scriptpath</code> foi especificado, usando o padrão: <code>$1</code>.",
        "config-using-server": "Utilizando o nome do servidor \"<nowiki>$1</nowiki>\".",
        "config-using-uri": "Usando URL do servidor \"<nowiki>$1$2</nowiki>\".",
+       "config-uploads-not-safe": "<strong>Aviso:</strong> O seu diretório atual de envios <code>$1</code> está vulnerável a execuções de script arbitrárias.\nEmbora o MediaWiki verifique todos os arquivos enviados por ameaças de segurança, é altamente recomendável [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security evitar essa vulnerabilidade de segurança] antes de permitir envios.",
        "config-no-cli-uploads-check": "<strong>Atenção:</strong> O seu diretório padrão para envios (<code>$1</code>) não está marcado para vulnerabilidade\npara execução de script arbitrário durante a instalação do CLI.",
        "config-brokenlibxml": "O sistema tem uma combinação de PHP e libxml2 que é conflitante e pode causar corrupção de dados ocultos no MediaWiki e outros aplicativos da web.\nAtualize para o libxml2 2.7.3 ou mais recente ([https://bugs.php.net/bug.php?id=45996 bugs com o PHP]).\nInstalação abortada.",
+       "config-suhosin-max-value-length": "O Suhosin está instalado e limita o parâmetro GET <code>length</code> para $1 bytes. O componente ResourceLoader trabalhará em torno deste limite, mas rebaixará a performance.\nSe possível, defina <code>suhosin.get.max_value_length</code> em <code>php.ini</code> para 1024 ou mais, e defina <code>$wgResourceLoaderMaxQueryLength</code> em <code>LocalSettings.php</code> para o mesmo valor.",
        "config-db-type": "Tipo de base de dados:",
        "config-db-host": "Servidor da base de dados:",
        "config-db-host-help": "Se a base de dados do seu servidor está em um servidor diferente, digite o nome do hospedeiro ou o endereço IP aqui.\n\nSe você está utilizando um hospedeiro web compartilhado, o seu provedor de hospedagem deverá fornecer o nome do hospedeiro correto na sua documentação.\n\nSe você está instalando em um servidor Windows e usando o MySQL, usar \"localhost\" pode não funcionar para o nome de servidor. Se não funcionar, tente \"127.0.01\" para o endereço de IP local.\n\nSe você está usando PostgreSQl, deixe este campo em branco para se conectar através de um socket Unix.",
index 020a684..9701dd9 100644 (file)
@@ -21,6 +21,7 @@
  * @defgroup JobQueue JobQueue
  * @author Aaron Schulz
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * Class to handle enqueueing and running of background jobs
@@ -709,7 +710,7 @@ abstract class JobQueue {
        public static function incrStats( $key, $type, $delta = 1 ) {
                static $stats;
                if ( !$stats ) {
-                       $stats = RequestContext::getMain()->getStats();
+                       $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
                }
                $stats->updateCount( "jobqueue.{$key}.all", $delta );
                $stats->updateCount( "jobqueue.{$key}.{$type}", $delta );
index 7cb26c6..039bd42 100644 (file)
@@ -1200,21 +1200,20 @@ abstract class FileBackendStore extends FileBackend {
         * to the order in which the handles where given.
         *
         * @param FileBackendStoreOpHandle[] $fileOpHandles
-        *
-        * @throws FileBackendError
         * @return StatusValue[] Map of StatusValue objects
+        * @throws FileBackendError
         */
        final public function executeOpHandlesInternal( array $fileOpHandles ) {
                $ps = $this->scopedProfileSection( __METHOD__ . "-{$this->name}" );
 
                foreach ( $fileOpHandles as $fileOpHandle ) {
                        if ( !( $fileOpHandle instanceof FileBackendStoreOpHandle ) ) {
-                               throw new InvalidArgumentException( "Got a non-FileBackendStoreOpHandle object." );
+                               throw new InvalidArgumentException( "Expected FileBackendStoreOpHandle object." );
                        } elseif ( $fileOpHandle->backend->getName() !== $this->getName() ) {
-                               throw new InvalidArgumentException(
-                                       "Got a FileBackendStoreOpHandle for the wrong backend." );
+                               throw new InvalidArgumentException( "Expected handle for this file backend." );
                        }
                }
+
                $res = $this->doExecuteOpHandlesInternal( $fileOpHandles );
                foreach ( $fileOpHandles as $fileOpHandle ) {
                        $fileOpHandle->closeResources();
index 631f6fd..ae0ad6f 100644 (file)
@@ -287,7 +287,7 @@ class SwiftFileBackend extends FileBackendStore {
                if ( !empty( $params['async'] ) ) { // deferred
                        $status->value = $opHandle;
                } else { // actually write the object in Swift
-                       $status->merge( current( $this->doExecuteOpHandlesInternal( [ $opHandle ] ) ) );
+                       $status->merge( current( $this->executeOpHandlesInternal( [ $opHandle ] ) ) );
                }
 
                return $status;
@@ -353,7 +353,7 @@ class SwiftFileBackend extends FileBackendStore {
                if ( !empty( $params['async'] ) ) { // deferred
                        $status->value = $opHandle;
                } else { // actually write the object in Swift
-                       $status->merge( current( $this->doExecuteOpHandlesInternal( [ $opHandle ] ) ) );
+                       $status->merge( current( $this->executeOpHandlesInternal( [ $opHandle ] ) ) );
                }
 
                return $status;
@@ -401,7 +401,7 @@ class SwiftFileBackend extends FileBackendStore {
                if ( !empty( $params['async'] ) ) { // deferred
                        $status->value = $opHandle;
                } else { // actually write the object in Swift
-                       $status->merge( current( $this->doExecuteOpHandlesInternal( [ $opHandle ] ) ) );
+                       $status->merge( current( $this->executeOpHandlesInternal( [ $opHandle ] ) ) );
                }
 
                return $status;
@@ -460,7 +460,7 @@ class SwiftFileBackend extends FileBackendStore {
                if ( !empty( $params['async'] ) ) { // deferred
                        $status->value = $opHandle;
                } else { // actually move the object in Swift
-                       $status->merge( current( $this->doExecuteOpHandlesInternal( [ $opHandle ] ) ) );
+                       $status->merge( current( $this->executeOpHandlesInternal( [ $opHandle ] ) ) );
                }
 
                return $status;
@@ -500,7 +500,7 @@ class SwiftFileBackend extends FileBackendStore {
                if ( !empty( $params['async'] ) ) { // deferred
                        $status->value = $opHandle;
                } else { // actually delete the object in Swift
-                       $status->merge( current( $this->doExecuteOpHandlesInternal( [ $opHandle ] ) ) );
+                       $status->merge( current( $this->executeOpHandlesInternal( [ $opHandle ] ) ) );
                }
 
                return $status;
@@ -556,7 +556,7 @@ class SwiftFileBackend extends FileBackendStore {
                if ( !empty( $params['async'] ) ) { // deferred
                        $status->value = $opHandle;
                } else { // actually change the object in Swift
-                       $status->merge( current( $this->doExecuteOpHandlesInternal( [ $opHandle ] ) ) );
+                       $status->merge( current( $this->executeOpHandlesInternal( [ $opHandle ] ) ) );
                }
 
                return $status;
index 90e60a3..92adaf9 100644 (file)
@@ -1542,7 +1542,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                        $sql .= " WHERE " . $this->makeList( $conds, self::LIST_AND );
                }
 
-               return $this->query( $sql, $fname );
+               return (bool)$this->query( $sql, $fname );
        }
 
        public function makeList( $a, $mode = self::LIST_COMMA ) {
index e7a906d..cb97126 100644 (file)
@@ -19,6 +19,7 @@
  *
  * @file
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * Class for viewing MediaWiki article and history.
@@ -494,7 +495,7 @@ class Article implements Page {
                $useParserCache = $this->mPage->shouldCheckParserCache( $parserOptions, $oldid );
                wfDebug( 'Article::view using parser cache: ' . ( $useParserCache ? 'yes' : 'no' ) . "\n" );
                if ( $user->getStubThreshold() ) {
-                       $this->getContext()->getStats()->increment( 'pcache_miss_stub' );
+                       MediaWikiServices::getInstance()->getStatsdDataFactory()->increment( 'pcache_miss_stub' );
                }
 
                $this->showRedirectedFromHeader();
index 58f1666..4785ef1 100644 (file)
@@ -31,10 +31,28 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager {
         */
        protected $mTitle;
 
+       /**
+        * @since 1.14
+        * @var ImagePage
+        */
+       public $mImagePage;
+
+       /**
+        * @since 1.14
+        * @var File[]
+        */
+       public $mHist;
+
+       /**
+        * @since 1.14
+        * @var int[]
+        */
+       public $mRange;
+
        /**
         * @param ImagePage $imagePage
         */
-       function __construct( $imagePage ) {
+       public function __construct( $imagePage ) {
                parent::__construct( $imagePage->getContext() );
                $this->mImagePage = $imagePage;
                $this->mTitle = clone $imagePage->getTitle();
@@ -53,18 +71,18 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager {
        /**
         * @return Title
         */
-       function getTitle() {
+       public function getTitle() {
                return $this->mTitle;
        }
 
-       function getQueryInfo() {
+       public function getQueryInfo() {
                return false;
        }
 
        /**
         * @return string
         */
-       function getIndexField() {
+       public function getIndexField() {
                return '';
        }
 
@@ -72,14 +90,14 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager {
         * @param object $row
         * @return string
         */
-       function formatRow( $row ) {
+       public function formatRow( $row ) {
                return '';
        }
 
        /**
         * @return string
         */
-       function getBody() {
+       public function getBody() {
                $s = '';
                $this->doQuery();
                if ( count( $this->mHist ) ) {
@@ -113,7 +131,7 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager {
                return $s;
        }
 
-       function doQuery() {
+       public function doQuery() {
                if ( $this->mQueryDone ) {
                        return;
                }
index 52aa54a..bb86551 100644 (file)
@@ -21,6 +21,7 @@
  * @file
  * @ingroup Profiler
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * ProfilerOutput class that flushes profiling data to the profiling
@@ -38,7 +39,7 @@ class ProfilerOutputStats extends ProfilerOutput {
         */
        public function log( array $stats ) {
                $prefix = isset( $this->params['prefix'] ) ? $this->params['prefix'] : '';
-               $contextStats = $this->collector->getContext()->getStats();
+               $contextStats = MediaWikiServices::getInstance()->getStatsdDataFactory();
 
                foreach ( $stats as $stat ) {
                        $key = "{$prefix}.{$stat['name']}";
index 717fb45..e72eaf2 100644 (file)
@@ -185,7 +185,7 @@ class ResourceLoader implements LoggerAwareInterface {
                        return self::applyFilter( $filter, $data );
                }
 
-               $stats = RequestContext::getMain()->getStats();
+               $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
                $cache = ObjectCache::getLocalServerInstance( CACHE_ANYTHING );
 
                $key = $cache->makeGlobalKey(
index 4c9e6be..d26c961 100644 (file)
@@ -317,11 +317,7 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
                $selectors = $this->getSelectors();
 
                foreach ( $this->getImages( $context ) as $name => $image ) {
-                       $declarations = $this->getCssDeclarations(
-                               $image->getDataUri( $context, null, 'original' ),
-                               $image->getUrl( $context, $script, null, 'rasterized' )
-                       );
-                       $declarations = implode( "\n\t", $declarations );
+                       $declarations = $this->getStyleDeclarations( $context, $image, $script );
                        $selector = strtr(
                                $selectors['selectorWithoutVariant'],
                                [
@@ -333,11 +329,7 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
                        $rules[] = "$selector {\n\t$declarations\n}";
 
                        foreach ( $image->getVariants() as $variant ) {
-                               $declarations = $this->getCssDeclarations(
-                                       $image->getDataUri( $context, $variant, 'original' ),
-                                       $image->getUrl( $context, $script, $variant, 'rasterized' )
-                               );
-                               $declarations = implode( "\n\t", $declarations );
+                               $declarations = $this->getStyleDeclarations( $context, $image, $script, $variant );
                                $selector = strtr(
                                        $selectors['selectorWithVariant'],
                                        [
@@ -354,6 +346,28 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
                return [ 'all' => $style ];
        }
 
+       /**
+        * @param ResourceLoaderContext $context
+        * @param ResourceLoaderImage $image Image to get the style for
+        * @param string $script URL to load.php
+        * @param string|null $variant Variant to get the style for
+        * @return string
+        */
+       private function getStyleDeclarations(
+               ResourceLoaderContext $context,
+               ResourceLoaderImage $image,
+               $script,
+               $variant = null
+       ) {
+               $imageDataUri = $image->getDataUri( $context, $variant, 'original' );
+               $primaryUrl = $imageDataUri ?: $image->getUrl( $context, $script, $variant, 'original' );
+               $declarations = $this->getCssDeclarations(
+                       $primaryUrl,
+                       $image->getUrl( $context, $script, $variant, 'rasterized' )
+               );
+               return implode( "\n\t", $declarations );
+       }
+
        /**
         * SVG support using a transparent gradient to guarantee cross-browser
         * compatibility (browsers able to understand gradient syntax support also SVG).
index a3b059b..1704481 100644 (file)
@@ -43,9 +43,26 @@ class ResourceLoaderJqueryMsgModule extends ResourceLoaderFileModule {
                        )
                );
 
-               $dataScript = Xml::encodeJsCall( 'mw.jqueryMsg.setParserDefaults', [ $parserDefaults ] );
+               $mainDataScript = Xml::encodeJsCall( 'mw.jqueryMsg.setParserDefaults', [ $parserDefaults ] );
 
-               return $fileScript . $dataScript;
+               // Associative array mapping magic words (e.g. SITENAME)
+               // to their values.
+               $magicWords = [
+                       'SITENAME' => $this->getConfig()->get( 'Sitename' ),
+               ];
+
+               Hooks::run( 'ResourceLoaderJqueryMsgModuleMagicWords', [ $context, &$magicWords ] );
+
+               $magicWordExtendData = [
+                       'magic' => $magicWords,
+               ];
+
+               $magicWordDataScript = Xml::encodeJsCall( 'mw.jqueryMsg.setParserDefaults', [
+                       $magicWordExtendData,
+                       /* deep= */ true
+               ] );
+
+               return $fileScript . $mainDataScript . $magicWordDataScript;
        }
 
        /**
index a2b4b1d..5404e0f 100644 (file)
@@ -147,8 +147,8 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
                if ( $deprecationInfo ) {
                        $name = $this->getName();
                        $warning = 'This page is using the deprecated ResourceLoader module "' . $name . '".';
-                       if ( !is_bool( $deprecationInfo ) && isset( $deprecationInfo['message'] ) ) {
-                               $warning .= "\n" . $deprecationInfo['message'];
+                       if ( is_string( $deprecationInfo ) ) {
+                               $warning .= "\n" . $deprecationInfo;
                        }
                        return Xml::encodeJsCall(
                                'mw.log.warn',
@@ -624,7 +624,7 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
         */
        final protected function buildContent( ResourceLoaderContext $context ) {
                $rl = $context->getResourceLoader();
-               $stats = RequestContext::getMain()->getStats();
+               $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
                $statStart = microtime( true );
 
                // Only include properties that are relevant to this context (e.g. only=scripts)
index b0d060b..f6f14b3 100644 (file)
@@ -149,6 +149,15 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
                        return null;
                }
 
+               // If the page is a redirect, follow the redirect.
+               if ( $title->isRedirect() ) {
+                       $content = $this->getContentObj( $title );
+                       $title = $content ? $content->getUltimateRedirectTarget() : null;
+                       if ( !$title ) {
+                               return null;
+                       }
+               }
+
                $handler = ContentHandler::getForTitle( $title );
                if ( $handler->isSupportedFormat( CONTENT_FORMAT_CSS ) ) {
                        $format = CONTENT_FORMAT_CSS;
@@ -158,6 +167,19 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
                        return null;
                }
 
+               $content = $this->getContentObj( $title );
+               if ( !$content ) {
+                       return null;
+               }
+
+               return $content->serialize( $format );
+       }
+
+       /**
+        * @param Title $title
+        * @return Content|null
+        */
+       protected function getContentObj( Title $title ) {
                $revision = Revision::newKnownCurrent( wfGetDB( DB_REPLICA ), $title->getArticleID(),
                        $title->getLatestRevID() );
                if ( !$revision ) {
@@ -165,13 +187,11 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
                }
                $revision->setTitle( $title );
                $content = $revision->getContent( Revision::RAW );
-
                if ( !$content ) {
                        wfDebugLog( 'resourceloader', __METHOD__ . ': failed to load content of JS/CSS page!' );
                        return null;
                }
-
-               return $content->serialize( $format );
+               return $content;
        }
 
        /**
index 8f702ba..8e9629d 100644 (file)
@@ -531,6 +531,33 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                        'rcfilters-filtergroup-user-experience-level-conflicts-unregistered',
                        'rcfilters-filter-unregistered-conflicts-user-experience-level'
                );
+
+               $changeTypeGroup = $this->getFilterGroup( 'changeType' );
+               $categoryFilter = $changeTypeGroup->getFilter( 'hidecategorization' );
+               $logactionsFilter = $changeTypeGroup->getFilter( 'hidelog' );
+               $pagecreationFilter = $changeTypeGroup->getFilter( 'hidenewpages' );
+
+               $significanceTypeGroup = $this->getFilterGroup( 'significance' );
+               $hideMinorFilter = $significanceTypeGroup->getFilter( 'hideminor' );
+
+               $hideMinorFilter->conflictsWith(
+                       $categoryFilter,
+                       'rcfilters-hideminor-conflicts-typeofchange-global',
+                       'rcfilters-hideminor-conflicts-typeofchange',
+                       'rcfilters-typeofchange-conflicts-hideminor'
+               );
+               $hideMinorFilter->conflictsWith(
+                       $logactionsFilter,
+                       'rcfilters-hideminor-conflicts-typeofchange-global',
+                       'rcfilters-hideminor-conflicts-typeofchange',
+                       'rcfilters-typeofchange-conflicts-hideminor'
+               );
+               $hideMinorFilter->conflictsWith(
+                       $pagecreationFilter,
+                       'rcfilters-hideminor-conflicts-typeofchange-global',
+                       'rcfilters-hideminor-conflicts-typeofchange',
+                       'rcfilters-typeofchange-conflicts-hideminor'
+               );
        }
 
        /**
index 4b8446a..17f6cca 100644 (file)
@@ -69,7 +69,11 @@ class SpecialAllPages extends IncludableSpecialPage {
                $from = $request->getVal( 'from', null );
                $to = $request->getVal( 'to', null );
                $namespace = $request->getInt( 'namespace' );
-               $hideredirects = $request->getBool( 'hideredirects', false );
+
+               $miserMode = (bool)$this->getConfig()->get( 'MiserMode' );
+
+               // Redirects filter is disabled in MiserMode
+               $hideredirects = $request->getBool( 'hideredirects', false ) && !$miserMode;
 
                $namespaces = $this->getLanguage()->getNamespaces();
 
@@ -100,6 +104,7 @@ class SpecialAllPages extends IncludableSpecialPage {
        protected function outputHTMLForm( $namespace = NS_MAIN,
                $from = '', $to = '', $hideRedirects = false
        ) {
+               $miserMode = (bool)$this->getConfig()->get( 'MiserMode' );
                $fields = [
                        'from' => [
                                'type' => 'text',
@@ -133,6 +138,11 @@ class SpecialAllPages extends IncludableSpecialPage {
                                'value' => $hideRedirects,
                        ],
                ];
+
+               if ( $miserMode ) {
+                       unset( $fields['hideredirects'] );
+               }
+
                $form = HTMLForm::factory( 'table', $fields, $this->getContext() );
                $form->setMethod( 'get' )
                        ->setWrapperLegendMsg( 'allpages' )
index b81ca3d..47f8d2f 100644 (file)
@@ -126,7 +126,27 @@ class SpecialChangeCredentials extends AuthManagerSpecialPage {
                if ( !static::$loadUserData ) {
                        return [];
                } else {
-                       return parent::getAuthFormDescriptor( $requests, $action );
+                       $descriptor = parent::getAuthFormDescriptor( $requests, $action );
+
+                       $any = false;
+                       foreach ( $descriptor as &$field ) {
+                               if ( $field['type'] === 'password' && $field['name'] !== 'retype' ) {
+                                       $any = true;
+                                       if ( isset( $field['cssclass'] ) ) {
+                                               $field['cssclass'] .= ' mw-changecredentials-validate-password';
+                                       } else {
+                                               $field['cssclass'] = 'mw-changecredentials-validate-password';
+                                       }
+                               }
+                       }
+
+                       if ( $any ) {
+                               $this->getOutput()->addModules( [
+                                       'mediawiki.special.changecredentials.js'
+                               ] );
+                       }
+
+                       return $descriptor;
                }
        }
 
index 29e8900..205f7cf 100644 (file)
@@ -23,6 +23,7 @@
 
 use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\FakeResultWrapper;
 
 /**
  * A special page that lists last changes made to the wiki
@@ -694,7 +695,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                                $newrows[$k] = $rowsarr[$k];
                        }
                }
-               $rows = $newrows;
+               $rows = new FakeResultWrapper( array_values( $newrows ) );
        }
 
        /**
index 5d7fa5d..4a17533 100644 (file)
@@ -165,10 +165,6 @@ class SpecialWatchlist extends ChangesListSpecialPage {
 
                $opts->add( 'days', $user->getOption( 'watchlistdays' ), FormOptions::FLOAT );
                $opts->add( 'extended', $user->getBoolOption( 'extendwatchlist' ) );
-               if ( $this->getRequest()->getVal( 'action' ) == 'submit' ) {
-                       // The user has submitted the form, so we dont need the default values
-                       return $opts;
-               }
 
                return $opts;
        }
@@ -214,6 +210,26 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                        }
                }
 
+               if ( $this->getRequest()->getVal( 'action' ) == 'submit' ) {
+                       $allBooleansFalse = [];
+
+                       // If the user submitted the form, start with a baseline of "all
+                       // booleans are false", then change the ones they checked.  This
+                       // means we ignore the defaults.
+
+                       // This is how we handle the fact that HTML forms don't submit
+                       // unchecked boxes.
+                       foreach ( $this->filterGroups as $filterGroup ) {
+                               if ( $filterGroup instanceof ChangesListBooleanFilterGroup ) {
+                                       foreach ( $filterGroup->getFilters() as $filter ) {
+                                               $allBooleansFalse[$filter->getName()] = false;
+                                       }
+                               }
+                       }
+
+                       $params = $params + $allBooleansFalse;
+               }
+
                // Not the prettiest way to achieve this… FormOptions internally depends on data sanitization
                // methods defined on WebRequest and removing this dependency would cause some code duplication.
                $request = new DerivativeRequest( $this->getRequest(), $params );
index d5f5c28..dbcf568 100644 (file)
@@ -229,7 +229,6 @@ class RemexCompatMunger implements TreeHandler {
         * @param integer $sourceStart
         * @param integer $sourceLength
         */
-
        public function insertElement( $preposition, $refElement, Element $element, $void,
                $sourceStart, $sourceLength
        ) {
@@ -248,9 +247,10 @@ class RemexCompatMunger implements TreeHandler {
                        $newParent = $this->serializer->getParentNode( $parent );
                        $parent = $newParent;
                        $parentData = $parent->snData;
+                       $pElement = $parentData->childPElement;
                        $parentData->childPElement = null;
                        $newRef = $refElement->userData;
-                       // FIXME cannot call endTag() since we don't have an Element
+                       $this->endTag( $pElement, $sourceStart, 0 );
                } elseif ( $under && $parentData->isSplittable
                        && (bool)$parentData->ancestorPNode !== $inline
                ) {
@@ -425,7 +425,13 @@ class RemexCompatMunger implements TreeHandler {
        }
 
        public function endTag( Element $element, $sourceStart, $sourceLength ) {
+               $data = $element->userData->snData;
+               if ( $data->childPElement ) {
+                       $this->endTag( $data->childPElement, $sourceStart, 0 );
+               }
                $this->serializer->endTag( $element, $sourceStart, $sourceLength );
+               $element->userData->snData = null;
+               $element->userData = null;
        }
 
        public function doctype( $name, $public, $system, $quirks, $sourceStart, $sourceLength ) {
index 865f630..2b13dd8 100644 (file)
@@ -225,7 +225,7 @@ class UploadFromUrl extends UploadBase {
                        // Well... that's not good!
                        wfDebugLog(
                                'fileupload',
-                               'Short write ' . $this->nbytes . '/' . strlen( $buffer ) .
+                               'Short write ' . $nbytes . '/' . strlen( $buffer ) .
                                        ' bytes, aborting with ' . $this->mFileSize . ' uploaded so far'
                        );
                        fclose( $this->mTmpHandle );
index 0acdb55..a963388 100644 (file)
@@ -1745,11 +1745,12 @@ class User implements IDBAccessObject {
                                        $this->blockTrigger = 'cookie-block';
                                        return $tmpBlock;
                                } else {
-                                       // If the block is not valid, clear the block cookie (but don't delete it,
-                                       // because it needs to be cleared from LocalStorage as well and an empty string
-                                       // value is checked for in the mediawiki.user.blockcookie module).
-                                       $tmpBlock->setCookie( $this->getRequest()->response(), true );
+                                       // If the block is not valid, remove the cookie.
+                                       Block::clearCookie( $this->getRequest()->response() );
                                }
+                       } else {
+                               // If the block doesn't exist, remove the cookie.
+                               Block::clearCookie( $this->getRequest()->response() );
                        }
                }
                return false;
@@ -3215,7 +3216,7 @@ class User implements IDBAccessObject {
 
        /**
         * Get the permissions this user has.
-        * @return array Array of String permission names
+        * @return string[] permission names
         */
        public function getRights() {
                if ( is_null( $this->mRights ) ) {
index 228c5c4..f7771d1 100644 (file)
@@ -20,7 +20,6 @@
                "resources/src/mediawiki.toolbar",
                "resources/src/mediawiki.widgets",
                "resources/src/jquery/jquery.accessKeyLabel.js",
-               "resources/src/jquery/jquery.arrowSteps.js",
                "resources/src/jquery/jquery.autoEllipsis.js",
                "resources/src/jquery/jquery.badge.js",
                "resources/src/jquery/jquery.byteLength.js",
index 7721015..6286a2b 100644 (file)
@@ -865,12 +865,9 @@ class LanguageConverter {
                $this->mTables = false;
                $cache = ObjectCache::getInstance( $wgLanguageConverterCacheType );
                if ( $fromCache ) {
-                       wfProfileIn( __METHOD__ . '-cache' );
                        $this->mTables = $cache->get( $this->mCacheKey );
-                       wfProfileOut( __METHOD__ . '-cache' );
                }
                if ( !$this->mTables || !array_key_exists( self::CACHE_VERSION_KEY, $this->mTables ) ) {
-                       wfProfileIn( __METHOD__ . '-recache' );
                        // not in cache, or we need a fresh reload.
                        // We will first load the default tables
                        // then update them using things in MediaWiki:Conversiontable/*
@@ -884,7 +881,6 @@ class LanguageConverter {
                        $this->mTables[self::CACHE_VERSION_KEY] = true;
 
                        $cache->set( $this->mCacheKey, $this->mTables, 43200 );
-                       wfProfileOut( __METHOD__ . '-recache' );
                }
        }
 
index b413ef9..bd42a12 100644 (file)
@@ -33,7 +33,7 @@ class LanguageAz extends Language {
         * @return mixed|string
         */
        public function ucfirst( $string ) {
-               if ( $string[0] == 'i' ) {
+               if ( substr( $string, 0, 1 ) === 'i' ) {
                        return 'İ' . substr( $string, 1 );
                }
                return parent::ucfirst( $string );
index 3605e8d..0460a6c 100644 (file)
@@ -391,7 +391,7 @@ class LanguageKk extends LanguageKk_cyrl {
         * @return string
         */
        public function ucfirst( $string ) {
-               if ( $string[0] == 'i' ) {
+               if ( substr( $string, 0, 1 ) === 'i' ) {
                        $variant = $this->getPreferredVariant();
                        if ( $variant == 'kk-latn' || $variant == 'kk-tr' ) {
                                return 'İ' . substr( $string, 1 );
index 3a9db73..b8039a7 100644 (file)
        "searchprofile-advanced-tooltip": "Soek in spesifieke naamruimtes",
        "search-result-size": "$1 ({{PLURAL:$2|1 woord|$2 woorde}})",
        "search-result-category-size": "{{PLURAL:$1|1 kategorielid|$1 kategorielede}} ({{PLURAL:$2|1 subkategorie|$2 subkategorieë}}, {{PLURAL:$3|1 lêer|$3 lêers}})",
-       "search-redirect": "(aanstuur $1)",
+       "search-redirect": "(aangestuur vanaf $1)",
        "search-section": "(afdeling $1)",
        "search-category": "(kategorie $1)",
        "search-file-match": "(stem ooreen met die inhoud van die leêr)",
        "feedback-submit": "Dien in",
        "feedback-thanks": "Dankie! U terugvoer is op die bladsy \"[$2 $1]\" geplaas.",
        "feedback-thanks-title": "Baie dankie!",
-       "searchsuggest-search": "Soek",
+       "searchsuggest-search": "Deursoek {{SITENAME}}",
        "searchsuggest-containing": "bevat...",
        "api-error-badtoken": "Interne fout: slegte teken.",
        "api-error-emptypage": "Die skep van leë nuwe bladsye word nie toegelaat nie.",
index d851261..09a9bcb 100644 (file)
        "saveusergroups": "احفظ مجموعات {{GENDER:$1|المستخدم|المستخدمة}}",
        "userrights-groupsmember": "عضو في:",
        "userrights-groupsmember-auto": "عضو ضمني في:",
-       "userrights-groups-help": "يمكنك تغيير المجموعات التي ينتمي هذا المستخدم إليها:\n* يعني الصندوق المعلم أن المستخدم في هذه المجموعة.\n* يعني الصندوق غير المعلم أن المستخدم ليس في هذه المجموعة.\n* تعني علامة * عدم إمكانية إزالة المجموعة متى ما أضفتها، أو العكس.\n* تعن علامة # أنه يمكنك فقط تحديد تاريخ الانتهاء لهذه المجموعة؛ لكن لا يمكنك تقديمه بعد تحديده.",
+       "userrights-groups-help": "يمكنك تغيير المجموعات التي ينتمي هذا المستخدم إليها:\n* يعني الصندوق المعلم أن المستخدم ضمن هذه المجموعة.\n* يعني الصندوق غير المعلم أن المستخدم ليس في هذه المجموعة.\n* تعني علامة * عدم إمكانية إزالة المجموعة متى ما أضفتها أو العكس.\n* تعني علامة # أنه يمكنك فقط تحديد تاريخ الانتهاء لهذه المجموعة؛ لكن لا يمكنك تقديمه بعد تحديده.",
        "userrights-reason": "السبب:",
        "userrights-no-interwiki": "أنت لا تمتلك الصلاحية لتعديل صلاحيات المستخدمين على الويكيات الأخرى.",
        "userrights-nodatabase": "قاعدة البيانات $1 غير موجودة أو ليست محلية.",
        "rcfilters-invalid-filter": "مرشح غير صحيح",
        "rcfilters-empty-filter": "لا مرشحات فعالة. كل المساهمات معروضة.",
        "rcfilters-filterlist-title": "مرشحات",
+       "rcfilters-filterlist-whatsthis": "ما هذا؟",
        "rcfilters-filterlist-feedbacklink": "تقديم مراجعات لمرشحات (بيتا) الجديدة",
        "rcfilters-highlightbutton-title": "التعليم على النتائج",
        "rcfilters-highlightmenu-title": "اختر لونًا",
        "rcfilters-highlightmenu-help": "اختر لونا للتعليم على هذه الخاصية",
        "rcfilters-filterlist-noresults": "لم يتم العثور على مرشحات",
+       "rcfilters-noresults-conflict": "لا نتائج تم العثور عليها لأن محددات البحث تعارض بعضها البعض",
+       "rcfilters-state-message-subset": "هذا المرشح ليس له تأثير لأن نتائجه متضمنة في {{PLURAL:$2|المرشح التالي|المرشحات التالية}} الأكثر عمومية (جرب التعليم لتمييزه): $1",
+       "rcfilters-state-message-fullcoverage": "اختيار كل المرشحات في مجموعة له نفس التأثير كاختيار لا شيء، لذا فهذا المرشح ليس له تأثير. المجموعة تتضمن: $1",
        "rcfilters-filtergroup-registration": "تسجيل المستخدم",
        "rcfilters-filter-registered-label": "مسجل",
        "rcfilters-filter-registered-description": "المحررون مسجلو الدخول.",
        "rcfilters-filter-unregistered-label": "غير مسجل",
        "rcfilters-filter-unregistered-description": "المحررون غير مسجلي الدخول.",
-       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Ù\85رشح \"غÙ\8aر Ø§Ù\84Ù\85جÙ\84Ù\8aÙ\86\" ØºÙ\8aر Ù\86شط Ù\84Ø£Ù\86 ØªØ£Ø«Ù\8aرÙ\87 Ù\85Ù\84غÙ\89 Ø¨Ù\88اسطة  {{PLURAL:$2|Ù\85رشح|Ù\85رشحات}} Ø§Ù\84خبرة، و {{PLURAL:$2|الذي يعطي|التي تعطي}} فقط المستخدمين المسجلين: $1",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Ù\87ذا Ø§Ù\84Ù\85رشح Ù\8aتعارض Ù\85ع {{PLURAL:$2|Ù\85رشح Ø§Ù\84خبرة Ø§Ù\84تاÙ\84Ù\8a\85رشحات Ø§Ù\84خبرة Ø§Ù\84تاÙ\84Ù\8aØ©}}، و {{PLURAL:$2|الذي يعطي|التي تعطي}} فقط المستخدمين المسجلين: $1",
        "rcfilters-filtergroup-authorship": "ملكية التعديلات",
        "rcfilters-filter-editsbyself-label": "تعديلاتك الشخصية",
        "rcfilters-filter-editsbyself-description": "التعديلات بواسطتك.",
        "rcfilters-filter-editsbyother-label": "التعديلات بواسطة الآخرين",
        "rcfilters-filter-editsbyother-description": "التعديلات المنشأة بواسطة المستخدمين الآخرين (ليس أنت).",
        "rcfilters-filtergroup-userExpLevel": "مستوى الخبرة (للمستخدمين المسجلين فقط)",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Ù\87ذا Ø§Ù\84Ù\85رشح ØºÙ\8aر Ù\81عاÙ\84 Ù\84Ø£Ù\86Ù\87 Ù\8aعطÙ\8a Ù\81Ù\82Ø· Ø§Ù\84Ù\85ستخدÙ\85Ù\8aÙ\86 Ø§Ù\84Ù\85سجÙ\84Ù\8aÙ\86Ø\8c Ù\84ذا Ù\81Ù\85رشح \"غÙ\8aر Ø§Ù\84Ù\85سجÙ\84Ù\8aÙ\86\" Ù\8aÙ\84غÙ\8a ØªØ£Ø«Ù\8aرÙ\87.",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Ù\85رشح \"غÙ\8aر Ø§Ù\84Ù\85سجÙ\84Ù\8aÙ\86\" Ù\81Ù\8a Ø­Ø§Ù\84Ø© ØªØ¹Ø§Ø±Ø¶ Ù\85ع Ù\88احد Ø£Ù\88 Ø£Ù\83ثر Ù\85Ù\86 Ù\85رشحات Ø§Ù\84خبرة. Ù\85رشحات Ø§Ù\84خبرة ØªØ¹Ø·Ù\8a Ø§Ù\84Ù\85ستخدÙ\85Ù\8aÙ\86 Ø§Ù\84Ù\85سجÙ\84Ù\8aÙ\86 Ù\81Ù\82Ø·. Ø§Ù\84Ù\85رشحات Ø§Ù\84Ù\85تعارضة Ù\85عÙ\84Ù\85 Ø¹Ù\84Ù\8aÙ\87ا Ù\83غÙ\8aر Ù\86شطة بالأعلى.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Ù\85رشحات Ø§Ù\84خبرة ØªØ¹Ø·Ù\8a Ù\81Ù\82Ø· Ø§Ù\84Ù\85ستخدÙ\85Ù\8aÙ\86 Ø§Ù\84Ù\85سجÙ\84Ù\8aÙ\86Ø\8c Ù\84ذا Ù\81Ù\87ذا Ø§Ù\84Ù\85رشح Ù\8aتعارض Ù\85ع Ù\85رشح \"غÙ\8aر Ø§Ù\84Ù\85سجÙ\84Ù\8aÙ\86\".",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Ù\85رشح \"غÙ\8aر Ø§Ù\84Ù\85سجÙ\84Ù\8aÙ\86\" Ù\8aتعارض Ù\85ع Ù\88احد Ø£Ù\88 Ø£Ù\83ثر Ù\85Ù\86 Ù\85رشحات Ø§Ù\84خبرةØ\8c Ù\88اÙ\84تÙ\8a ØªØ¹Ø·Ù\8a Ø§Ù\84Ù\85ستخدÙ\85Ù\8aÙ\86 Ø§Ù\84Ù\85سجÙ\84Ù\8aÙ\86 Ù\81Ù\82Ø·. Ø§Ù\84Ù\85رشحات Ø§Ù\84Ù\85تعارضة Ù\85عÙ\84Ù\85 Ø¹Ù\84Ù\8aÙ\87ا Ù\81Ù\8a Ù\85ساحة Ø§Ù\84Ù\85رشحات Ø§Ù\84Ù\86شطةØ\8c بالأعلى.",
        "rcfilters-filter-user-experience-level-newcomer-label": "القادمون الجدد",
        "rcfilters-filter-user-experience-level-newcomer-description": "أقل من 10 تعديلات و4 أيام من النشاط.",
        "rcfilters-filter-user-experience-level-learner-label": "المتعلمون",
index 49ac8bd..b46c154 100644 (file)
        "page_first": "primera",
        "page_last": "cabera",
        "histlegend": "Seleición de diferencies: marca los botones de les versiones que quies comparar y calca <i>enter</i> o al botón d'abaxo.<br />\nLleenda: '''({{int:cur}})''' = diferencies cola versión actual, '''({{int:last}})''' = diferencies cola versión anterior, '''{{int:minoreditletter}}''' = edición menor.",
-       "history-fieldset-title": "Navegar pel historial",
-       "history-show-deleted": "Sólo desaniciaes",
+       "history-fieldset-title": "Buscar revisiones",
+       "history-show-deleted": "Sólo desaniciaes por revisión",
        "histfirst": "lo más antiguo",
        "histlast": "lo más nuevo",
        "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
        "prefs-help-prefershttps": "Esta preferencia aplicaráse nel siguiente aniciu de sesión.",
        "prefswarning-warning": "Ficisti cambios nes tos preferencies qu'inda nun se guardaron.\nSi abandones esta páxina ensin calcar \"$1\" les preferencies nun s'anovarán.",
        "prefs-tabs-navigation-hint": "Gabitu: pue usar les tecles de flecha izquierda y drecha pa navegar peles llingüetes de la llista.",
-       "userrights": "Xestión de permisos d'usuariu",
+       "userrights": "Permisos d'usuariu",
        "userrights-lookup-user": "Seleiciona un usuariu",
        "userrights-user-editname": "Escribe un nome d'usuariu:",
        "editusergroup": "Cargar los grupos d'usuariu",
        "rcfilters-invalid-filter": "Filtru inválidu",
        "rcfilters-empty-filter": "Nun hai filtros activos. Amuésense toles contribuciones.",
        "rcfilters-filterlist-title": "Filtros",
+       "rcfilters-filterlist-whatsthis": "¿Qué ye esto?",
        "rcfilters-filterlist-feedbacklink": "Comentar sobro los nuevos filtros (beta)",
        "rcfilters-highlightbutton-title": "Resaltar resultaos",
        "rcfilters-highlightmenu-title": "Seleiciona un color",
+       "rcfilters-highlightmenu-help": "Seleiciona un color pa resaltar esta propiedá",
        "rcfilters-filterlist-noresults": "Nun s'alcontraron filtros",
+       "rcfilters-noresults-conflict": "Nun s'alcontraron resultaos porque los criterios de gueta tán en conflictu",
+       "rcfilters-state-message-subset": "Esti filtru nun fai efeutu porque los resultaos inclúyense ente los {{PLURAL:$2|del siguiente filtru más ampliu|de los siguientes filtros más amplios}} (tenta resaltalu pa estremalu): $1",
+       "rcfilters-state-message-fullcoverage": "Seleicionar tolos filtros d'un grupu ye igual que nun seleicionar nengunu, de manera qu'esti filtru nun tien efeutu. El grupu incluye: $1",
        "rcfilters-filtergroup-registration": "Rexistru del usuariu",
        "rcfilters-filter-registered-label": "Rexistraos",
        "rcfilters-filter-registered-description": "Editores coneutaos.",
        "rcfilters-filter-unregistered-label": "Non rexistraos",
        "rcfilters-filter-unregistered-description": "Editores ensin coneutar.",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Esti filtru fai conflictu {{PLURAL:$2|col siguiente filtru|colos siguientes filtros}} Experience, qu'{{PLURAL:$2|alcuentra|alcuentren}} sólo usuarios rexistraos: $1",
        "rcfilters-filtergroup-authorship": "Editar autoría",
        "rcfilters-filter-editsbyself-label": "Les tos propies ediciones",
        "rcfilters-filter-editsbyself-description": "Ediciones de to",
        "rcfilters-filter-editsbyother-label": "Ediciones d'otros",
        "rcfilters-filter-editsbyother-description": "Ediciones creaes por otros usuarios (non por ti).",
        "rcfilters-filtergroup-userExpLevel": "Nivel d'esperiencia (solo pa usuarios rexistraos)",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Los filtros Experience alcuentren sólo usuarios rexistraos, de manera qu'esti filtru entra en conflictu col filtru «Sin rexistrar».",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "El filtru «Ensin rexistrar» tien un conflictu con un filtru Experience o más, qu'alcuentren sólo usuarios rexistraos. Los filtros que tienen un conflictu márquense nel área de Filtros activos, más arriba.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Recién llegaos",
        "rcfilters-filter-user-experience-level-newcomer-description": "Menos de 10 ediciones y 4 díes d'actividá.",
        "rcfilters-filter-user-experience-level-learner-label": "Aprendices",
        "rcfilters-filter-bots-description": "Ediciones feches con ferramientes automátiques.",
        "rcfilters-filter-humans-label": "Ser humanu (non bot)",
        "rcfilters-filter-humans-description": "Ediciones feches por editores humanos.",
+       "rcfilters-filtergroup-reviewstatus": "Estáu de revisión",
+       "rcfilters-filter-patrolled-label": "Patrullaes",
+       "rcfilters-filter-patrolled-description": "Ediciones marcaes como patrullaes.",
+       "rcfilters-filter-unpatrolled-label": "Sin patrullar",
+       "rcfilters-filter-unpatrolled-description": "Ediciones sin marcar como patrullaes.",
        "rcfilters-filtergroup-significance": "Significación",
        "rcfilters-filter-minor-label": "Ediciones menores",
        "rcfilters-filter-minor-description": "Ediciones que l'autor etiquetó como menores.",
        "rcfilters-filter-categorization-description": "Rexistros de les páxines que s'añaden o borren de categoríes.",
        "rcfilters-filter-logactions-label": "Aiciones rexistraes",
        "rcfilters-filter-logactions-description": "Aiciones alministratives, creación de cuentes, desanicios de páxines, xubíes de ficheros...",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "El filtru «Ediciones menores» fai conflictu con un filtru «Tipu de cambiu» o más, porque dellos tipos de cambiu nun pueden designase como «menores». Los filtros que faen conflictu tan marcaos nel área de Filtros Activos, más arriba.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Dellos tipos de cambiu nun pueden designase como «menores», de manera qu'esti filtru fai conflictu colos siguientes filtros «Tipu de cambiu»: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Esti filtru de «Tipu de cambiu» fai conflictu col filtru «Ediciones menores». Dellos tipos de cambiu nun pueden designase como «menores».",
        "rcnotefrom": "Abaxo {{PLURAL:$5|tá'l cambiu|tan los cambios}} dende'l <strong>$3</strong>, a les <strong>$4</strong> (s'amuesen un máximu de <strong>$1</strong>).",
        "rclistfrom": "Amosar los nuevos cambios dende'l $3 a les $2",
        "rcshowhideminor": "$1 ediciones menores",
index 5470783..69b1f79 100644 (file)
        "login": "Танылыу",
        "login-security": "Үҙ шәхесегеҙҙе раҫлағыҙ",
        "nav-login-createaccount": "Танылыу йәки теркәлеү",
-       "userlogin": "Танылыу йәки теркәлеү",
-       "userloginnocreate": "Танылыу",
        "logout": "Тамамлау",
        "userlogout": "Тамамлау",
        "notloggedin": "Танылмағанһығыҙ",
        "userlogin-noaccount": "Иҫәп яҙмағыҙ юҡмы?",
        "userlogin-joinproject": "Проектҡа ҡушылырға",
-       "nologin": "Һеҙ теркәлмәгәнһегеҙме әле? '''$1'''.",
-       "nologinlink": "Иҫәп яҙыуын булдырырға",
        "createaccount": "Яңы ҡатнашыусыны теркәү",
-       "gotaccount": "Әгәр Һеҙ теркәлеү үткән булһағыҙ? '''$1'''.",
-       "gotaccountlink": "Танылыу",
-       "userlogin-resetlink": "Танылыу мәғлүмәттәрен оноттоғоҙмо?",
        "userlogin-resetpassword-link": "Серһүҙҙе оноттоғоҙмо?",
        "userlogin-helplink2": "Танылыу буйынса ярҙам",
        "userlogin-loggedin": " Һеҙ {{GENDER:$1|$1}} булараҡ индегеҙ инде. Башҡа файҙаланыусы булып инер өсөн аҫтағы ҡалыпты ҡулланығыҙ.",
        "createaccountmail": "Осраҡлы рәүештә хасил ителгән ваҡытлыса серһүҙҙе файҙаланырға һәм уны миңә ошо электрон почтаһы адресына ебәрергә",
        "createaccountmail-help": "Серһүҙен һорамайынса, башҡа кешегә иҫәп яҙмаһын төҙөү өсөн ҡулланыла ала.",
        "createacct-realname": "Ысын исемегеҙ (мотлаҡ түгел)",
-       "createaccountreason": "Сәбәп:",
        "createacct-reason": "Сәбәп",
        "createacct-reason-ph": "Икенсе иҫәп яҙмаһы һеҙгә ни өсөн кәрәк?",
        "createacct-reason-help": "Иҫәп яҙмаһын төҙөү журналында күренгән хәбәр",
        "notargettext": "Һеҙ был ғәмәл өсөн кәрәкле битте йәки ҡатнашыусыны күрһәтмәгәнһегеҙ.",
        "nopagetitle": "Бындай бит юҡ",
        "nopagetext": "Һеҙ күрһәткән бит юҡ.",
-       "pager-newer-n": "$1{{PLURAL:$1|1=1 яңыраҡ|$1 яңыраҡ}}",
+       "pager-newer-n": "{{PLURAL:$1|1=1 яңыраҡ|$1 яңыраҡ}}",
        "pager-older-n": "{{PLURAL:$1|1=1 иҫкерәк|$1 иҫкерәк}}",
        "suppress": "Йәшереү",
        "querypage-disabled": "Был махсус бит һөҙөмтәлелекте арттырыу өсөн ябылған.",
        "listusers-blocked": "(бикләнгән)",
        "activeusers": "Әүҙем ҡатнашыусылар исемлеге",
        "activeusers-intro": "Был — һуңғы $1 {{PLURAL:$1|көн}} эсендә ниҙер башҡарған ҡатнашыусылар исемлеге.",
-       "activeusers-count": "Ò»Ñ\83Ò£Ò\93Ñ\8b $3 {{PLURAL:$3|1=көн}} Ñ\8dÑ\81ендÓ\99ге Ò»Ñ\83Ò£Ò\93Ñ\8b ÐºÓ©Ð½Ð´Ó\99 $1 {{PLURAL:$1|үҙгәртеү}}",
+       "activeusers-count": "ÒºÑ\83Ò£Ò\93Ñ\8b {{PLURAL:$3|$3 ÐºÓ©Ð½Ð´Ó\99}} $1 {{PLURAL:$1|үҙгәртеү}}",
        "activeusers-from": "Ошондай хәрефтәрҙән башланған ҡатнашыусыларҙы күрһәтергә:",
        "activeusers-noresult": "Ҡатнашыусылар табылманы",
        "activeusers-submit": "Әүҙем ҡулланыусыларҙы күрһәтергә",
        "confirmemail": "Электрон почта адресын раҫлау",
        "confirmemail_noemail": "Һеҙҙең [[Special:Preferences|көйләүҙәрегеҙҙә]] дөрөҫ электрон почта адресы юҡ.",
        "confirmemail_text": "{{SITENAME}} проекты электрон почта мөмкинлектәрен ҡулланыр алдынан электрон почта адресының раҫланыуын талап итә.\nЭлектрон адресты раҫлау хаты һеҙҙең почтағыҙға ебәрелһен өсөн, түбәндәге төймәгә баҫығыҙ.\nХатта махсус биткә һылтанма буласаҡ, был һылтанманы браузерығыҙҙа асҡандан һуң, һеҙҙең электрон почта адресығыҙ раҫланған, тип һаналасаҡ.",
-       "confirmemail_pending": "ЭлекÑ\82Ñ\80он Ð¿Ð¾Ñ\87Ñ\82а Ð°Ð´Ñ\80еÑ\81Ñ\8bн Ñ\80аҫлаÑ\83 Ñ\85аÑ\82Ñ\8b Ò»ÐµÒ\99гÓ\99 ÐµÐ±Ó\99Ñ\80елгÓ\99н Ð¸Ð½Ðµ Ð¸Ð½Ð´Ðµ.\nÓ\98гÓ\99Ñ\80 Ò»ÐµÒ\99 Ð¸Ò«Ó\99п Ñ\8fÒ\99маһÑ\8bн Ñ\8fÒ£Ñ\8bÑ\80аҡ Ð±Ñ\83лдÑ\8bÑ\80һаÒ\93Ñ\8bÒ\99, Ò»ÐµÒ\99гÓ\99 Ð±Ñ\8bл Ñ\85аÑ\82Ñ\82Ñ\8b Ñ\8fÒ£Ñ\8bнан Ò»Ð¾Ñ\80аÑ\80 Ð°Ð»Ð´Ñ\8bнан, Ñ\85аÑ\82 ÐºÐ¸Ð»Ð³Ó\99нÑ\81е, Ð±ÐµÑ\80 Ð½Ð¸Ñ\81Ó\99 Ð¼Ð¸Ð½Ñ\83Ñ\82 ÐºÓ©Ñ\82Ó©Ñ\80гÓ\99 ÐºÓ\99Ñ\80Ó\99к.",
+       "confirmemail_pending": "ЭлекÑ\82Ñ\80он Ð¿Ð¾Ñ\87Ñ\82а Ð°Ð´Ñ\80еÑ\81Ñ\8bн Ñ\80аҫлаÑ\83 Ñ\85аÑ\82Ñ\8b Ò»ÐµÒ\99гÓ\99 ÐµÐ±Ó\99Ñ\80елгÓ\99йне.\nÓ\98гÓ\99Ñ\80 Ò»ÐµÒ\99 Ð¸Ò«Ó\99п Ñ\8fÒ\99маһÑ\8bн Ñ\8fÒ£Ñ\8bÑ\80аҡ Ð±Ñ\83лдÑ\8bÑ\80һаÒ\93Ñ\8bÒ\99, Ñ\80аҫлаÑ\83 Ñ\85аÑ\82Ñ\8bн Ò¡Ð°Ð±Ð°Ñ\82Ñ\82ан Ò»Ð¾Ñ\80аÑ\80 Ð°Ð»Ð´Ñ\8bнан, Ñ\8dлеккеһе ÐºÐ¸Ð»Ð³Ó\99нен Ð±ÐµÑ\80 Ð°Ò\99 ÐºÓ©Ñ\82өгөÒ\99.",
        "confirmemail_send": "Электрон почта адресын раҫлау хатын ебәрергә",
        "confirmemail_sent": "Электрон почта адресын раҫлау хаты ебәрелде.",
        "confirmemail_oncreate": "Электрон почта адресын раҫлау хаты һеҙ күрһәткән адрес буйынса ебәрелде.\nХатта күрһәтелгән һылтанма системала танылыу талап итмәй, ләкин элетрон почта мөмкинлектәрен вики проектта ҡулланыр өсөн, һеҙгә танылырға кәрәк.",
        "logentry-tag-update-revision": "$1 {{GENDER:$2||яңыртты}}  $4 өлгөһөнөң тамғаларын $3 битендә ({{PLURAL:$7|өҫтәне}} $6; {{PLURAL:$9|юйылған}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2||а}}журналда билдәләнгән яҙмаларҙы яңыртты $5 биттәр $3 (өҫтәлгән{{PLURAL:$7|а|ы}} $6; юйылған{{PLURAL:$9|а|ы}} $8)",
        "rightsnone": "(юҡ)",
-       "revdelete-summary": "үҙгәртеүҙәр тасуирламаһы",
        "feedback-adding": "Биткә кире белдереү өҫтәлә",
        "feedback-back": "Артҡа",
        "feedback-bugcheck": "Шәп! Тик [$1 билдәле хаталар] исемлегендә оҡшаш белдереүҙең булмауына иғтибар итегеҙ.",
index a1625b8..416fd26 100644 (file)
        "page_first": "першая",
        "page_last": "апошняя",
        "histlegend": "Параўнаньне: пазначце кропкамі дзьве вэрсіі для параўнаньня і націсьніце «ўвод» альбо кнопку ўнізе.<br />\nТлумачэньне: <strong>({{int:cur}})</strong> = адрозьненьні ад цяперашняй вэрсіі, <strong>({{int:last}})</strong> = адрозьненьні ад папярэдняй вэрсіі, <strong>{{int:minoreditletter}}</strong> = дробная праўка.",
-       "history-fieldset-title": "Пошук у гісторыі",
+       "history-fieldset-title": "Пошук вэрсіяў",
        "history-show-deleted": "Толькі выдаленыя",
        "histfirst": "найстарэйшыя",
        "histlast": "найноўшыя",
        "revdelete-success": "Бачнасьць вэрсіі абноўленая.",
        "revdelete-failure": "Немагчыма абнавіць бачнасьць вэрсіі:\n$1",
        "logdelete-success": "Бачнасьць падзеі ўсталяваная.",
-       "logdelete-failure": "'''Немагчыма ўстанавіць бачнасьць у журнале:'''\n$1",
-       "revdel-restore": "Ð\97ьмяніць бачнасьць",
+       "logdelete-failure": "Немагчыма ўсталяваць бачнасьць журнала:\n$1",
+       "revdel-restore": "зьмяніць бачнасьць",
        "pagehist": "Гісторыя старонкі",
        "deletedhist": "Выдаленая гісторыя",
        "revdelete-hide-current": "Памылка хаваньня запісу ад $2 $1: гэта цяперашняя вэрсія.\nЗапіс ня можа быць схаваны.",
        "rcfilters-invalid-filter": "Няслушны фільтар",
        "rcfilters-empty-filter": "Няма актыўных фільтраў. Паказаны ўвесь унёсак.",
        "rcfilters-filterlist-title": "Фільтры",
+       "rcfilters-filterlist-whatsthis": "Што гэта?",
        "rcfilters-filterlist-feedbacklink": "Пакінуць водгук пра новыя (бэта) фільтры",
        "rcfilters-highlightbutton-title": "Вылучыць вынікі",
        "rcfilters-highlightmenu-title": "Абярыце колер",
        "rcfilters-highlightmenu-help": "Абярыце колер для вылучэньня гэтай уласьцівасьці",
        "rcfilters-filterlist-noresults": "Фільтры ня знойдзеныя",
+       "rcfilters-noresults-conflict": "Няма вынікаў, бо крытэры пошуку супярэчаць адзін аднаму",
+       "rcfilters-state-message-subset": "Гэты фільтар ня мае эфэкту, бо яго вынікі ўключаныя ў вынікі больш {{PLURAL:$2|шырокага фільтру|шырокіх фільтраў}} (паспрабуйце вылучэньне, каб вызначыць яго): $1",
+       "rcfilters-state-message-fullcoverage": "Выбар усіх фільтраў у групе — тое ж самае, што і выбар ніводнага, адпаведна, гэты фільтар ня мае эфэкту. Група ўключае: $1",
        "rcfilters-filtergroup-registration": "Рэгістрацыя ўдзельнікаў",
        "rcfilters-filter-registered-label": "Зарэгістраваныя",
        "rcfilters-filter-registered-description": "Рэдактары, якія ўвайшлі ў сыстэму.",
        "rcfilters-filter-unregistered-label": "Незарэгістраваныя",
        "rcfilters-filter-unregistered-description": "Рэдактары, якія не ўвайшлі ў сыстэму",
-       "rcfilters-filter-unregistered-conflicts-user-experience-level": "ФÑ\96лÑ\8cÑ\82аÑ\80 Â«Ð\9dезаÑ\80Ñ\8dгÑ\96Ñ\81Ñ\82Ñ\80аванÑ\8b» Ð½ÐµÐ°ÐºÑ\82Ñ\8bÑ\9eнÑ\8b, Ð±Ð¾ Ñ\8fго Ñ\8dÑ\84Ñ\8dкÑ\82 Ð°Ð´Ð¼ÐµÐ½ÐµÐ½Ñ\8b {{PLURAL:$2|1=наступным фільтрам|наступнымі фільтрамі}} дасьведчаных удзельнікаў, {{PLURAL:$2|1=які знаходзіць|якія знаходзяць}} толькі зарэгістраваных удзельнікаў: $1",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Ð\93Ñ\8dÑ\82Ñ\8b Ñ\84Ñ\96лÑ\8cÑ\82аÑ\80 ÐºÐ°Ð½Ñ\84лÑ\96кÑ\82Ñ\83е Ð· {{PLURAL:$2|1=наступным фільтрам|наступнымі фільтрамі}} дасьведчаных удзельнікаў, {{PLURAL:$2|1=які знаходзіць|якія знаходзяць}} толькі зарэгістраваных удзельнікаў: $1",
        "rcfilters-filtergroup-authorship": "Рэдагаваць аўтарства",
        "rcfilters-filter-editsbyself-label": "Вашыя праўкі",
        "rcfilters-filter-editsbyself-description": "Праўкі, зробленыя вамі",
        "rcfilters-filter-editsbyother-label": "Праўкі іншых удзельнікаў",
        "rcfilters-filter-editsbyother-description": "Праўкі, зробленыя іншымі ўдзельнікамі (ня вамі).",
        "rcfilters-filtergroup-userExpLevel": "Узровень досьведу (толькі для зарэгістраваных удзельнікаў)",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Ð\93Ñ\8dÑ\82Ñ\8b Ñ\84Ñ\96лÑ\8cÑ\82аÑ\80 Ð½Ðµ Ð°ÐºÑ\82Ñ\8bÑ\9eнÑ\8b, Ð±Ð¾ Ñ\91н Ð·Ð½Ð°Ñ\85одзÑ\96Ñ\86Ñ\8c Ñ\82олÑ\8cкÑ\96 Ð·Ð°Ñ\80Ñ\8dгÑ\96Ñ\81Ñ\82Ñ\80аванÑ\8bÑ\85 Ñ\83дзелÑ\8cнÑ\96каÑ\9e, Ñ\82акÑ\96м Ñ\87Ñ\8bнам Ñ\84Ñ\96лÑ\8cÑ\82аÑ\80 Â«Ð\9dезаÑ\80Ñ\8dгÑ\96Ñ\81Ñ\82Ñ\80аванÑ\8bÑ\8f» ÐºÐ°Ñ\81Ñ\83е Ñ\8fго Ñ\8dÑ\84Ñ\8dкÑ\82.",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Фільтар «Незарэгістраваныя» канфліктуе з адным ці некалькімі фільтрамі ўзроўню досьведу. Фільтры ўзроўню досьведу шукаюць толькі зарэгістраваных удзельнікаў. Канфліктныя фільтры пазначаныя вышэй як неактыўныя.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Ð\93Ñ\8dÑ\82Ñ\8b Ñ\84Ñ\96лÑ\8cÑ\82аÑ\80 Ð´Ð¾Ñ\81Ñ\8cведÑ\83 Ð·Ð½Ð°Ñ\85одзÑ\96Ñ\86Ñ\8c Ñ\82олÑ\8cкÑ\96 Ð·Ð°Ñ\80Ñ\8dгÑ\96Ñ\81Ñ\82Ñ\80аванÑ\8bÑ\85 Ñ\83дзелÑ\8cнÑ\96каÑ\9e, Ñ\82акÑ\96м Ñ\87Ñ\8bнам Ñ\84Ñ\96лÑ\8cÑ\82аÑ\80 ÐºÐ°Ð½Ñ\84лÑ\96кÑ\82Ñ\83е Ð·Ñ\8c Ñ\84Ñ\96лÑ\8cÑ\82Ñ\80ам Â«Ð\9dезаÑ\80Ñ\8dгÑ\96Ñ\81Ñ\82Ñ\80аванÑ\8bÑ\8f».",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Фільтар «Незарэгістраваныя» канфліктуе з адным ці некалькімі фільтрамі ўзроўню досьведу, якія шукаюць толькі зарэгістраваных удзельнікаў. Канфліктныя фільтры пазначаныя ў разьдзеле актыўных фільтраў вышэй.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Навічкі",
        "rcfilters-filter-user-experience-level-newcomer-description": "Менш за 10 правак і 4 дні актыўнасьці.",
        "rcfilters-filter-user-experience-level-learner-label": "Вучні",
        "authmanager-authplugin-create-fail": "Дадатак аўтэнтыфікацыі адмовіў у стварэньні рахунку.",
        "authmanager-authplugin-setpass-denied": "Дадатак аўтэнтыфікацыі не дазваляе зьмяняць паролі.",
        "authmanager-authplugin-setpass-bad-domain": "Няслушны дамэн.",
+       "authmanager-autocreate-noperm": "Аўтаматычнае стварэньне рахункаў не дазволенае.",
+       "authmanager-autocreate-exception": "Аўтаматычнае стварэньне рахункаў часова адключанае праз папярэднія памылкі.",
+       "authmanager-userdoesnotexist": "Рахунак «$1» не зарэгістраваны.",
+       "authmanager-userlogin-remembermypassword-help": "Ці трэба запамінаць пароль больш за працягласьць сэсіі.",
        "authmanager-realname-label": "Сапраўднае імя",
        "authmanager-provider-temporarypassword": "Часовы пароль",
        "changecredentials": "Зьмена ўліковых зьвестак",
index de9737f..acc2b37 100644 (file)
        "search-interwiki-caption": "Сумежныя праекты",
        "search-interwiki-default": "Вынікі з $1:",
        "search-interwiki-more": "(яшчэ)",
+       "search-interwiki-more-results": "больш вынікаў",
        "search-relatedarticle": "Дачыняюцца*",
        "searchrelated": "маюць дачыненне",
        "searchall": "усе",
index 21dd334..43c6b85 100644 (file)
        "november-date": "$1 ноември",
        "december-date": "$1 декември",
        "period-am": "Преди обед",
-       "period-pm": "След обед",
+       "period-pm": "Следобед",
        "pagecategories": "{{PLURAL:$1|Категория|Категории}}",
        "category_header": "Страници в категория „$1“",
        "subcategories": "Подкатегории",
        "cannotcreateaccount-title": "Невъзможно е да бъде създадена потребителска сметка",
        "yourdomainname": "Домейн:",
        "password-change-forbidden": "Не можете да променяте пароли в това уики.",
-       "externaldberror": "Ð\98ли Ðµ Ñ\81Ñ\82анала грешка в базата от данни при външното удостоверяване, или не ви е позволено да обновявате външната си сметка.",
+       "externaldberror": "Ð\92Ñ\8aзникна грешка в базата от данни при външното удостоверяване, или не ви е позволено да обновявате външната си сметка.",
        "login": "Влизане",
        "login-security": "Потвърдете идентичността си",
        "nav-login-createaccount": "Регистриране или влизане",
        "accountcreated": "Потребителската сметка беше създадена",
        "accountcreatedtext": "Потребителската сметка [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|беседа]]) беше създадена.",
        "createaccount-title": "Създаване на сметка за {{SITENAME}}",
-       "createaccount-text": "Някой е създал сметка за $2 в {{SITENAME}} ($4) и е посочил този адрес за електронна поща. Паролата за „$2“ е „$3“. Необходимо е да влезете в системата и да смените паролата си.\n\nМожете да пренебрегнете това съобщение, ако сметката е създадена по грешка.",
+       "createaccount-text": "Ð\9dÑ\8fкой Ðµ Ñ\81Ñ\8aздал Ñ\81меÑ\82ка Ð·Ð° $2 Ð² {{SITENAME}} ($4) Ð¸ Ðµ Ð¿Ð¾Ñ\81оÑ\87ил Ñ\82ози Ð°Ð´Ñ\80еÑ\81 Ð·Ð° ÐµÐ»ÐµÐºÑ\82Ñ\80онна Ð¿Ð¾Ñ\89а. Ð\9fаÑ\80олаÑ\82а Ð·Ð° â\80\9e$2â\80\9c Ðµ â\80\9e$3â\80\9c. Ð\9dеобÑ\85одимо Ðµ Ð´Ð° Ð²Ð»ÐµÐ·ÐµÑ\82е Ð² Ñ\81иÑ\81Ñ\82емаÑ\82а Ð¸ Ð´Ð° Ñ\81мениÑ\82е Ð¿Ð°Ñ\80олаÑ\82а Ñ\81и.\n\nÐ\9cожеÑ\82е Ð´Ð° Ð¿Ñ\80енебÑ\80егнеÑ\82е Ñ\82ова Ñ\81Ñ\8aобÑ\89ение, Ð°ÐºÐ¾ Ñ\81меÑ\82каÑ\82а Ðµ Ñ\81Ñ\8aздадена Ð¿Ð¾ Ð¿Ð¾Ð³Ñ\80еÑ\88ка.",
        "login-throttled": "Направили сте твърде много опити да въведете паролата за тази сметка.\nНеобходимо е да изчакате $1 преди да опитате отново.",
        "login-abort-generic": "Влизането беше неуспешно - Прекратено",
        "login-migrated-generic": "Вашата сметка е бил преместена и потребителското Ви име вече не съществува в това уики.",
        "loginlanguagelabel": "Език: $1",
        "suspicious-userlogout": "Заявката ви за излизане от системата беше отхвърлена, тъй като изглежда е била изпратена погрешка от браузъра или кеширащото прокси.",
-       "createacct-another-realname-tip": "Ð\98Ñ\81Ñ\82инÑ\81коÑ\82о Ð¸Ð¼Ðµ Ðµ Ð½ÐµÐ·Ð°Ð´Ñ\8aлжиÑ\82елно.\nÐ\92 Ñ\81лÑ\83Ñ\87ай, Ñ\87е Ð±Ñ\8aде Ð¸Ð·Ð±Ñ\80або Ð´Ð° Ñ\81е Ð¿Ð¾Ð¿Ñ\8aлни, ще бъде използвано за да му се приписват приносите в уикито.",
+       "createacct-another-realname-tip": "Ð\98Ñ\81Ñ\82инÑ\81коÑ\82о Ð¸Ð¼Ðµ Ðµ Ð½ÐµÐ·Ð°Ð´Ñ\8aлжиÑ\82елно.\nÐ\92 Ñ\81лÑ\83Ñ\87ай, Ñ\87е Ð±Ñ\8aде Ð¸Ð·Ð±Ñ\80ано Ð´Ð° Ñ\81е Ð¿Ð¾Ð¿Ñ\8aлни, Ñ\82о ще бъде използвано за да му се приписват приносите в уикито.",
        "pt-login": "Влизане",
        "pt-login-button": "Влизане",
        "pt-createaccount": "Създаване на сметка",
        "botpasswords-deleted-body": "Паролата на бот „$1“ на потребител „$2“ е премахната.",
        "resetpass_forbidden": "Не е разрешена смяна на паролата",
        "resetpass_forbidden-reason": "Паролите не могат да се променят: $1",
-       "resetpass-no-info": "Ð\97а Ð´Ð° Ð´Ð¾Ñ\81Ñ\82Ñ\8aпваÑ\82е тази страница директно, необходимо е да влезете в системата.",
+       "resetpass-no-info": "Ð\97а Ð´Ð° Ð¸Ð¼Ð°Ñ\82е Ð´Ð¾Ñ\81Ñ\82Ñ\8aп Ð´Ð¾ тази страница директно, необходимо е да влезете в системата.",
        "resetpass-submit-loggedin": "Промяна на паролата",
        "resetpass-submit-cancel": "Отказ",
        "resetpass-wrong-oldpass": "Невалидна временна или текуща парола.\nВъзможно е вече да сте сменили паролата си или да сте поискали нова временна парола.",
        "passwordreset-invalidemail": "Неправилен email адрес",
        "changeemail": "Промяна или премахване на адреса за е-поща",
        "changeemail-header": "Попълнете формуляра, за да промените адреса на електронната си поща. Ако искате да премахнете адреса на електронната си поща, при попълване на формуляра оставете полето за новия адрес празно.",
-       "changeemail-no-info": "Ð\97а Ð´Ð° Ð´Ð¾Ñ\81Ñ\82Ñ\8aпваÑ\82е Ñ\82ази Ñ\81Ñ\82Ñ\80аниÑ\86а Ð´Ð¸Ñ\80екÑ\82но, Ð½ÐµÐ¾Ð±Ñ\85одимо Ðµ да влезете в системата.",
+       "changeemail-no-info": "Ð\97а Ð´Ð° Ð¸Ð¼Ð°Ñ\82е Ð´Ð¾Ñ\81Ñ\82Ñ\8aп Ð´Ð¾ Ñ\82ази Ñ\81Ñ\82Ñ\80аниÑ\86а Ð´Ð¸Ñ\80екÑ\82но, Ðµ Ð½ÐµÐ¾Ð±Ñ\85одимо да влезете в системата.",
        "changeemail-oldemail": "Текущ адрес за е-поща:",
        "changeemail-newemail": "Нов адрес за е-поща:",
        "changeemail-none": "(няма)",
        "newarticletext": "Последвахте препратка към страница, която все още не съществува.\nЗа да я създадете, просто започнете да пишете в долната текстова кутия\n(вижте [$1 помощната страница] за повече информация).",
        "anontalkpagetext": "----\n<em>Това е дискусионната страница на анонимен потребител, който все още няма регистрирана сметка или не я използва</em>\nЗатова се налага да използваме IP-адрес, за да го идентифицираме.\nТакъв адрес може да се споделя от няколко потребители.\nАко сте анонимен потребител и мислите, че тези неуместни коментари са отправени към вас, [[Special:CreateAccount|регистрирайте се]] или [[Special:UserLogin|влезте в системата]], за да избегнете евентуално бъдещо объркване с други анонимни потребители.",
        "noarticletext": "Понастоящем няма текст на тази страница. Можете да [[Special:Search/{{PAGENAME}}|потърсите за заглавието на страницата]] в други страници, да <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} потърсите в съответните дневници] или [{{fullurl:{{FULLPAGENAME}}|action=edit}} да я създадете]</span>.",
-       "noarticletext-nopermission": "ТекÑ\83Ñ\89о в тази страница няма текст.\nМожете да [[Special:Search/{{PAGENAME}}|потърсите заглавието на тази страница ]] в други страници или да <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} потърсите в съответните дневници]</span>, но нямате права да създадете тази страница.",
+       "noarticletext-nopermission": "Ð\9fонаÑ\81Ñ\82оÑ\8fÑ\89ем в тази страница няма текст.\nМожете да [[Special:Search/{{PAGENAME}}|потърсите заглавието на тази страница ]] в други страници или да <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} потърсите в съответните дневници]</span>, но нямате права да създадете тази страница.",
        "missing-revision": "Версия #$1 на страницата „{{FULLPAGENAME}}“ не съществува.\n\nТова обикновено се дължи на препратка от историята на страницата, която е била изтрита.\nПодробности могат да бъдат открити в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневника на изтриванията].",
        "userpage-userdoesnotexist": "Няма регистрирана потребителска сметка за „<nowiki>$1</nowiki>“. Изисква се потвърждение, че желаете да създадете/редактирате тази страница?",
        "userpage-userdoesnotexist-view": "Не е регистрирана потребителска сметка на име „$1“.",
        "continue-editing": "Продължаване към полето за редактиране",
        "previewconflict": "Този предварителен преглед отразява текста в горната текстова кутия така, както би се показал, ако съхраните.",
        "session_fail_preview": "За съжаление редакцията ви не успя да бъде обработена поради загуба на данните за текущата сесия.\n\nМоже би сте излезли от системата. <strong>Моля, уверете се, че сте влезли в профила си и опитайте отново.</strong>\nАко все още не работи, опитайте да [[Special:UserLogout|излезете]] и да влезете отново, също така проверете дали браузърът ви позволява бисквитки от този сайт.",
-       "session_fail_preview_html": "Ð\97а Ñ\81Ñ\8aжаление Ñ\80едакÑ\86иÑ\8fÑ\82а Ð²Ð¸ Ð½Ðµ Ð±ÐµÑ\88е Ð·Ð°Ð¿Ð¸Ñ\81ана Ð¿Ð¾Ñ\80ади Ð¸Ð·Ñ\82иÑ\87анеÑ\82о Ð½Ð° Ñ\81еÑ\81иÑ\8fÑ\82а Ð²Ð¸.\n\n<em>Тъй като {{SITENAME}} приема обикновен HTML, предварителният преглед е скрит като предпазна мярка срещу атаки чрез JavaScript.</em>\n\n<strong>Ако това е обикновен опит за редактиране, моля опитайте отново.</strong>\nАко все още не сработва, пробвайте да [[Special:UserLogout|излезете]] и влезете отново, и се уверете, че браузъра ви приема бисквитки от този сайт.",
+       "session_fail_preview_html": "Ð\97а Ñ\81Ñ\8aжаление Ñ\80едакÑ\86иÑ\8fÑ\82а Ð²Ð¸ Ð½Ðµ Ð±ÐµÑ\88е Ð·Ð°Ð¿Ð¸Ñ\81ана Ð¿Ð¾Ñ\80ади Ð·Ð°Ð³Ñ\83ба Ð½Ð° Ð´Ð°Ð½Ð½Ð¸Ñ\82е Ð·Ð° Ñ\82екÑ\83Ñ\89аÑ\82а Ñ\81еÑ\81иÑ\8f.\n\n<em>Тъй като {{SITENAME}} приема обикновен HTML, предварителният преглед е скрит като предпазна мярка срещу атаки чрез JavaScript.</em>\n\n<strong>Ако това е обикновен опит за редактиране, моля опитайте отново.</strong>\nАко все още не сработва, пробвайте да [[Special:UserLogout|излезете]] и влезете отново, и се уверете, че браузъра ви приема бисквитки от този сайт.",
        "token_suffix_mismatch": "'''Редакцията ви беше отхвърлена, защото браузърът ви е развалил пунктуационните знаци в редакционната отметка. Евентуалното съхранение би унищожило съдържанието на страницата. Понякога това се случва при използването на грешно работещи анонимни междинни сървъри.'''",
        "edit_form_incomplete": "'''Някои части от формуляра за редактиране не достигнаха до сървъра; проверете дали редакциите ви са непокътнати и опитайте отново.'''",
        "editing": "Редактиране на „$1“",
        "yourtext": "Вашият текст",
        "storedversion": "Съхранена версия",
        "nonunicodebrowser": "'''ВНИМАНИЕ: Браузърът ви не поддържа Уникод. За да можете спокойно да редактирате страници, всички знаци, невключени в ASCII-таблицата, ще бъдат заменени с шестнадесетични кодове.'''",
-       "editingold": "'''ВНИМАНИЕ: Редактирате остаряла версия на страницата.\nАко съхраните, всякакви промени, направени след тази версия, ще бъдат изгубени.'''",
+       "editingold": "'''Ð\92Ð\9dÐ\98Ð\9cÐ\90Ð\9dÐ\98Ð\95: Ð ÐµÐ´Ð°ÐºÑ\82иÑ\80аÑ\82е Ð¾Ñ\81Ñ\82аÑ\80Ñ\8fла Ð²ÐµÑ\80Ñ\81иÑ\8f Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86аÑ\82а.\nÐ\90ко Ñ\8f Ñ\81Ñ\8aÑ\85Ñ\80аниÑ\82е, Ð²Ñ\81Ñ\8fкакви Ð¿Ñ\80омени, Ð½Ð°Ð¿Ñ\80авени Ñ\81лед Ñ\82ази Ð²ÐµÑ\80Ñ\81иÑ\8f, Ñ\89е Ð±Ñ\8aдаÑ\82 Ð¸Ð·Ð³Ñ\83бени.'''",
        "yourdiff": "Разлики",
        "copyrightwarning": "Обърнете внимание, че всички приноси към {{SITENAME}} се публикуват при условията на $2 (за подробности вижте $1).\nАко не сте съгласни вашата писмена работа да бъде променяна и разпространявана без ограничения, не я публикувайте.<br />\n\nСъщо потвърждавате, че '''вие''' сте написали материала или сте използвали '''свободни ресурси''' — <em>обществено достояние</em> или друг свободен източник.\nАко сте ползвали чужди материали, за които имате разрешение, непременно посочете източника.\n\n<div style=\"font-variant:small-caps\">'''Не публикувайте произведения с авторски права без разрешение!'''</div>",
        "copyrightwarning2": "Обърнете внимание, че всички приноси към {{SITENAME}} могат да бъдат редактирани, променяни или премахвани от останалите сътрудници.\nАко не сте съгласни вашата писмена работа да бъде променяна без ограничения, не я публикувайте.<br />\nСъщо потвърждавате, че '''вие''' сте написали материала или сте използвали '''свободни ресурси''' — <em>обществено достояние</em> или друг свободен източник (за подробности вижте $1).\nАко сте ползвали чужди материали, за които имате разрешение, непременно посочете източника.\n\n<div style=\"font-variant:small-caps\">'''Не публикувайте произведения с авторски права без разрешение!'''</div>",
        "language-converter-depth-warning": "Надвишени са възможностите за автоматичен превод ($1)",
        "node-count-exceeded-category": "Страници, където е превишен възел-граф",
        "node-count-exceeded-category-desc": "Страницата превишава максималния възел-граф.",
-       "node-count-exceeded-warning": "Страница превиши броя на възлите",
+       "node-count-exceeded-warning": "Страницата превиши броя на възлите",
        "expansion-depth-exceeded-category": "Страници, в които е превишена дълбочината на разгръщане",
        "expansion-depth-exceeded-category-desc": "Страницата превишава максимално допустимата дълбочина на разгръщане.",
        "expansion-depth-exceeded-warning": "Страницата е превишила разрешената дълбочина на разгръщане",
        "userrights-viewusergroup": "Преглед на {{GENDER:$1|потребителските}} групи",
        "saveusergroups": "Съхраняване на {{GENDER:$1|потребителските}} групи",
        "userrights-groupsmember": "Член на:",
-       "userrights-groupsmember-auto": "Ð\9fодÑ\80азбиÑ\80аÑ\89 Ñ\81е Ñ\87лен на:",
+       "userrights-groupsmember-auto": "Член Ð¿Ð¾ Ð¿Ð¾Ð´Ñ\80азбиÑ\80ане на:",
        "userrights-groups-help": "Може да променяте групите, в които е потребителят:\n* Поставена отметка означава, че потребителят е член на групата.\n* Поле без отметка означава, че потребителят не е член на групата.\n* Знакът * показва, че не можете да премахнете групата, след като е вече добавена (или обратно).",
        "userrights-reason": "Причина:",
        "userrights-no-interwiki": "Нямате права да редактирате потребителските групи на други уикита.",
        "right-undelete": "Възстановяване на страници",
        "right-suppressrevision": "Преглед и възстановяване на версии, скрити от администраторите",
        "right-viewsuppressed": "Преглеждане на версии, скрити от който и да е потребител",
-       "right-suppressionlog": "Ð\9fÑ\80еглеждане Ð½Ð° Ñ\82айните дневници",
+       "right-suppressionlog": "Ð\9fÑ\80еглеждане Ð½Ð° Ñ\81кÑ\80иÑ\82ите дневници",
        "right-block": "Спиране на достъпа до редактиране",
        "right-blockemail": "Блокиране на потребители да изпращат писма по е-поща",
        "right-hideuser": "Блокиране и скриване на потребителско име",
        "grant-createaccount": "Създаване на сметки",
        "grant-createeditmovepage": "Създаване, редактиране и преместване на страници",
        "grant-delete": "Изтриване на страници, редакции и записи в дневника",
-       "grant-editinterface": "РедакÑ\82иÑ\80ане Ð½Ð° Ð¿Ñ\80оÑ\81Ñ\82Ñ\80анÑ\81Ñ\82воÑ\82о Ð½Ð°Ñ\80иÑ\87а Ð\9cедиÑ\8fУики Ð¸ CSS/JavaScript Ñ\83Ñ\87аÑ\81Ñ\82ник",
+       "grant-editinterface": "РедакÑ\82иÑ\80ане Ð½Ð° Ð\9cедиÑ\8fУики Ð¿Ñ\80оÑ\81Ñ\82Ñ\80анÑ\81Ñ\82воÑ\82о Ð¸ Ð¿Ð¾Ñ\82Ñ\80ебиÑ\82елÑ\81киÑ\8f CSS/JavaScript",
        "grant-editmycssjs": "Редактиране на личния CSS/JavaScript",
        "grant-editmyoptions": "Редактиране на вашите потребителски настройки",
        "grant-editmywatchlist": "Редактиране на списъка ви за наблюдение",
        "grant-highvolume": "Голям обем за редактиране",
        "grant-oversight": "Скриване на участниците и версия страници",
        "grant-patrol": "Патрулират промени страници",
-       "grant-privateinfo": "Ð\94оÑ\81Ñ\82Ñ\8aп Ð´Ð¾ Ð»Ð¸Ñ\87ни Ð¸Ð½Ñ\84оÑ\80маÑ\86ии",
-       "grant-protect": "Ð\97аÑ\89иÑ\82а Ð½Ð° Ð½ÐµÐ·Ð°Ñ\88Ñ\82иÑ\82ени страници",
-       "grant-rollback": "Ð\9eÑ\82каÑ\82Ñ\8bваÑ\82Ñ\8c Ð¿Ñ\80омени страници",
+       "grant-privateinfo": "Ð\94оÑ\81Ñ\82Ñ\8aп Ð´Ð¾ Ð»Ð¸Ñ\87на Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\8f",
+       "grant-protect": "Ð\97аÑ\89иÑ\82а Ð¸ Ð¿Ñ\80емаÑ\85ване Ð½Ð° Ð·Ð°Ñ\89иÑ\82а Ð½Ð° страници",
+       "grant-rollback": "Ð\92Ñ\80Ñ\8aÑ\89ане Ð½Ð° Ð¿Ñ\80омени Ð¿Ð¾ страници",
        "grant-sendemail": "Изпращане на имейл до други потребители",
        "grant-uploadeditmovefile": "Качване, заменяне и прехвърляне на файлове",
        "grant-uploadfile": "Качване на нови файлове",
        "filetype-mime-mismatch": "Файловото разширение \".$1\" не отговаря на MIME типа на файла ($2).",
        "filetype-badmime": "Не е разрешено качването на файлове с MIME-тип „$1“.",
        "filetype-bad-ie-mime": "Този файл не може да бъде качен, защото Internet Explorer го разпознава като „$1“, който е отхвърлен и потенциално опасен файлов формат.",
-       "filetype-unwanted-type": "'''â\80\9e.$1â\80\9c''' Ðµ Ð½ÐµÐ¶ÐµÐ»Ð°Ð½ Ñ\84айлов Ñ\84оÑ\80маÑ\82. {{PLURAL:$3|Ð\9fÑ\80еопръчителният файлов формат е|Препоръчителните файлови формати са}} $2.",
+       "filetype-unwanted-type": "'''â\80\9e.$1â\80\9c''' Ðµ Ð½ÐµÐ¶ÐµÐ»Ð°Ð½ Ñ\84айлов Ñ\84оÑ\80маÑ\82. {{PLURAL:$3|Ð\9fÑ\80епоръчителният файлов формат е|Препоръчителните файлови формати са}} $2.",
        "filetype-banned-type": "'''„.$1“''' не {{PLURAL:$4|е позволен файлов формат|са позволени файлови формати}}. {{PLURAL:$3|Позволеният файлов формат е|Позволените файлови формати са}} $2.",
        "filetype-missing": "Файлът няма разширение (напр. „.jpg“).",
        "empty-file": "Подаденият от вас файл беше празен.",
        "img-auth-nopathinfo": "Липсва PATH_INFO.\nВашият сървър не е конфигуриран да предава тази информация.\nТой може да е базиран на CGI и да не може да поддържа img_auth.\nВижте https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Търсеният път не е в настроената директория за качвания.",
        "img-auth-badtitle": "Грешка при изграждането на валидно заглавие от „$1“.",
-       "img-auth-nologinnWL": "Не сте влезли в системата и „$1“ не е в белия списък.",
+       "img-auth-nologinnWL": "Не сте влезли в системата и „$1“ не е в разрешения списък.",
        "img-auth-nofile": "Файлът „$1“ не съществува.",
        "img-auth-isdir": "Опитвате се да осъществите достъп до директорията „$1“.\nРазрешен е само достъп до файловете.",
        "img-auth-streaming": "Излъчване \"$1\"",
        "statistics-pages-desc": "Всички страници в уикито, включително дискусионни, пренасочващи страници и т.н.",
        "statistics-files": "Качени файлове",
        "statistics-edits": "Брой редакции по страници от началото на {{SITENAME}}",
-       "statistics-edits-average": "СÑ\80едно редакции на страница",
+       "statistics-edits-average": "СÑ\80еден Ð±Ñ\80ой редакции на страница",
        "statistics-users": "Регистрирани [[Special:ListUsers|потребители]]",
        "statistics-users-active": "Активни потребители",
        "statistics-users-active-desc": "Потребители, направили редакция през {{PLURAL:$1|последния ден|последните $1 дни}}",
        "log-title-wildcard": "Търсене на заглавия, започващи със",
        "showhideselectedlogentries": "Промяна на видимостта на избраните записи",
        "checkbox-select": "Избери: $1",
-       "checkbox-all": "всички",
+       "checkbox-all": "Ð\92сички",
        "checkbox-none": "никои",
        "checkbox-invert": "обърни избора",
        "allpages": "Всички страници",
        "watchlistanontext": "За преглеждане и редактиране на списъка за наблюдение се изисква влизане в системата.",
        "watchnologin": "Не сте влезли",
        "addwatch": "Добавяне към списъка за наблюдение",
-       "addedwatchtext": "СÑ\82Ñ\80аниÑ\86аÑ\82а â\80\9e'''[[:$1]]'''â\80\9c Ð¸ Ð±ÐµÑ\81едаÑ\82а Ñ\9d Ð±Ñ\8fÑ\85а Ð´Ð¾Ð±Ð°Ð²ÐµÐ½Ð¸ ÐºÑ\8aм [[Special:Watchlist|Ñ\81пиÑ\81Ñ\8aка Ð²и за наблюдение]].",
+       "addedwatchtext": "СÑ\82Ñ\80аниÑ\86аÑ\82а â\80\9e'''[[:$1]]'''â\80\9c Ð¸ Ð±ÐµÑ\81едаÑ\82а Ñ\9d Ð±Ñ\8fÑ\85а Ð´Ð¾Ð±Ð°Ð²ÐµÐ½Ð¸ ÐºÑ\8aм [[Special:Watchlist|Ñ\81пиÑ\81Ñ\8aка Ð\92и за наблюдение]].",
        "addedwatchtext-short": "Страницата „$1“ беше добавена към списъка Ви за наблюдение.",
        "removewatch": "Премахване от списъка за наблюдение",
-       "removedwatchtext": "СÑ\82Ñ\80аниÑ\86аÑ\82а â\80\9e[[:$1]]â\80\9c Ð¸ Ð±ÐµÑ\81едаÑ\82а Ñ\9d Ð±Ñ\8fÑ\85а Ð¿Ñ\80емаÑ\85наÑ\82и Ð¾Ñ\82 [[Special:Watchlist|Ñ\81пиÑ\81Ñ\8aка Ð²и за наблюдение]].",
+       "removedwatchtext": "СÑ\82Ñ\80аниÑ\86аÑ\82а â\80\9e[[:$1]]â\80\9c Ð¸ Ð±ÐµÑ\81едаÑ\82а Ñ\9d Ð±Ñ\8fÑ\85а Ð¿Ñ\80емаÑ\85наÑ\82и Ð¾Ñ\82 [[Special:Watchlist|Ñ\81пиÑ\81Ñ\8aка Ð\92и за наблюдение]].",
        "removedwatchtext-short": "Страницата „$1“ беше премахната от списъка Ви за наблюдение.",
        "watch": "Наблюдение",
        "watchthispage": "Наблюдаване на страницата",
        "unwatchthispage": "Спиране на наблюдение",
        "notanarticle": "Не е страница",
        "notvisiblerev": "Версията беше изтрита",
-       "watchlist-details": "{{PLURAL:$1|Ð\95дна Ð½Ð°Ð±Ð»Ñ\8eдавана Ñ\81Ñ\82Ñ\80аниÑ\86а|$1 Ð½Ð°Ð±Ð»Ñ\8eдавани Ñ\81Ñ\82Ñ\80аниÑ\86и}} Ð¾Ñ\82 Ñ\81пиÑ\81Ñ\8aка Ð²и за наблюдение (без беседи).",
+       "watchlist-details": "{{PLURAL:$1|Ð\95дна Ð½Ð°Ð±Ð»Ñ\8eдавана Ñ\81Ñ\82Ñ\80аниÑ\86а|$1 Ð½Ð°Ð±Ð»Ñ\8eдавани Ñ\81Ñ\82Ñ\80аниÑ\86и}} Ð¾Ñ\82 Ñ\81пиÑ\81Ñ\8aка Ð\92и за наблюдение (без беседи).",
        "wlheader-enotif": "Известяването по е-поща е включено.",
        "wlheader-showupdated": "Страниците, които са били променени след последния път, когато сте ги посетили, са показани в '''получер'''.",
        "wlnote": "{{PLURAL:$1|Показана е последната промяна|Показани са последните '''$1''' промени}} през {{PLURAL:$2|последния час|последните '''$2''' часа}}, започвайки от от $3, $4.",
        "watchlist-options": "Опции на списъка за наблюдение",
        "watching": "Наблюдение…",
        "unwatching": "Спиране на наблюдение…",
-       "watcherrortext": "Ð\92Ñ\8aзникна Ð³Ñ\80еÑ\88ка Ð¿Ñ\80и Ð¿Ñ\80омÑ\8fна Ð½Ð° Ð½Ð°Ñ\81Ñ\82Ñ\80ойкиÑ\82е Ð·Ð° Ñ\81пиÑ\81Ñ\8aка Ð²и за наблюдение за „$1“.",
+       "watcherrortext": "Ð\92Ñ\8aзникна Ð³Ñ\80еÑ\88ка Ð¿Ñ\80и Ð¿Ñ\80омÑ\8fна Ð½Ð° Ð½Ð°Ñ\81Ñ\82Ñ\80ойкиÑ\82е Ð·Ð° Ñ\81пиÑ\81Ñ\8aка Ð\92и за наблюдение за „$1“.",
        "enotif_reset": "Отбелязване на всички страници като посетени",
        "enotif_impersonal_salutation": "Потребител на {{SITENAME}}",
        "enotif_subject_deleted": "Страницата „$1“ в {{SITENAME}} беше {{GENDER:$2|изтрита}} от $2",
        "delete-legend": "Изтриване",
        "historywarning": "<strong>Внимание:</strong> Страницата, която възнамерявате да изтриете, има история с приблизително $1 {{PLURAL:$1|редакция|редакции}}:",
        "historyaction-submit": "Показване",
-       "confirmdeletetext": "Ð\9dа Ð¿Ñ\8aÑ\82 Ñ\81Ñ\82е Ð´Ð° Ð¸Ð·Ñ\82Ñ\80иеÑ\82е Ñ\81Ñ\82Ñ\80аниÑ\86а Ð·Ð°ÐµÐ´Ð½Ð¾ Ñ\81 Ñ\86Ñ\8fлаÑ\82а Ñ\9d Ñ\80едакÑ\86ионна Ð¸Ñ\81Ñ\82оÑ\80иÑ\8f.\nÐ\9fоÑ\82вÑ\8aÑ\80деÑ\82е, Ñ\87е Ð¸Ñ\81каÑ\82е Ñ\82ова, Ñ\80азбиÑ\80аÑ\82е Ð¿Ð¾Ñ\81ледÑ\81Ñ\82виÑ\8fÑ\82а Ð¸ Ð¿Ñ\80авиÑ\82е Ñ\82ова Ð² Ñ\81Ñ\8aоÑ\82веÑ\82Ñ\81Ñ\82вие Ñ\81 [[{{MediaWiki:Policy-url}}|линиÑ\8fÑ\82а Ð½Ð° Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ]].",
+       "confirmdeletetext": "Ð\9dа Ð¿Ñ\8aÑ\82 Ñ\81Ñ\82е Ð´Ð° Ð¸Ð·Ñ\82Ñ\80иеÑ\82е Ñ\81Ñ\82Ñ\80аниÑ\86а Ð·Ð°ÐµÐ´Ð½Ð¾ Ñ\81 Ñ\86Ñ\8fлаÑ\82а Ñ\9d Ñ\80едакÑ\86ионна Ð¸Ñ\81Ñ\82оÑ\80иÑ\8f.\nÐ\9fоÑ\82вÑ\8aÑ\80деÑ\82е, Ñ\87е Ð¸Ñ\81каÑ\82е Ñ\82ова, Ñ\80азбиÑ\80аÑ\82е Ð¿Ð¾Ñ\81ледÑ\81Ñ\82виÑ\8fÑ\82а Ð¸ Ð¿Ñ\80авиÑ\82е Ñ\82ова Ð² Ñ\81Ñ\8aоÑ\82веÑ\82Ñ\81Ñ\82вие Ñ\81 [[{{MediaWiki:Policy-url}}|полиÑ\82икаÑ\82а]].",
        "actioncomplete": "Действието беше изпълнено",
        "actionfailed": "Действието не сполучи",
        "deletedtext": "Страницата „$1“ беше изтрита. Вижте $2 за запис на последните изтривания.",
        "protect-expiring-local": "срок на изтичане $1",
        "protect-expiry-indefinite": "безсрочно",
        "protect-cascade": "Каскадна защита — защита на всички страници, включени в настоящата страница.",
-       "protect-cantedit": "Не можете да промените нивото на защита на тази страницата, защото нямате права да я редактирате.",
+       "protect-cantedit": "Не можете да промените нивото на защита на тази страница, защото нямате права да я редактирате.",
        "protect-othertime": "Друг срок:",
        "protect-othertime-op": "друг срок",
        "protect-existing-expiry": "Оставащо време: $2, $3",
        "undelete-search-prefix": "Показване на страници, започващи със:",
        "undelete-search-submit": "Търсене",
        "undelete-no-results": "Не са намерени страници, отговарящи на търсения критерий.",
-       "undelete-filename-mismatch": "Ð\9dе Ðµ Ð²Ñ\8aзможно Ð²Ñ\8aзÑ\81Ñ\82ановÑ\8fванеÑ\82о Ð½Ð° Ñ\84айловаÑ\82а Ð²ÐµÑ\80Ñ\81иÑ\8f Ñ\81 Ð²Ñ\80емеви Ð¾Ñ\82пеÑ\87аÑ\82Ñ\8aк $1: несъответствие в името на файла",
-       "undelete-bad-store-key": "Ð\9dе Ðµ Ð²Ñ\8aзможно Ð²Ñ\8aзÑ\81Ñ\82ановÑ\8fванеÑ\82о Ð½Ð° Ñ\84айловаÑ\82а Ð²ÐµÑ\80Ñ\81иÑ\8f Ñ\81 Ð²Ñ\80емеви Ð¾Ñ\82пеÑ\87аÑ\82Ñ\8aк $1: файлът е липсвал преди изтриването.",
+       "undelete-filename-mismatch": "Ð\9dе Ðµ Ð²Ñ\8aзможно Ð²Ñ\8aзÑ\81Ñ\82ановÑ\8fванеÑ\82о Ð½Ð° Ñ\84айловаÑ\82а Ð²ÐµÑ\80Ñ\81иÑ\8f Ñ\81 Ð²Ñ\80емева Ð¾Ñ\82меÑ\82ка $1: несъответствие в името на файла",
+       "undelete-bad-store-key": "Ð\9dе Ðµ Ð²Ñ\8aзможно Ð²Ñ\8aзÑ\81Ñ\82ановÑ\8fванеÑ\82о Ð½Ð° Ñ\84айловаÑ\82а Ð²ÐµÑ\80Ñ\81иÑ\8f Ñ\81 Ð²Ñ\80емева Ð¾Ñ\82меÑ\82ка $1: файлът е липсвал преди изтриването.",
        "undelete-cleanup-error": "Грешка при изтриване на неизползвания архивен файл „$1“.",
        "undelete-missing-filearchive": "Не е възможно възстановяването на файла с ID $1, защото не присъства в базата от данни. Вероятно вече е възстановен.",
        "undelete-error": "Грешка при възстановяване на страницата",
        "ipb-confirmhideuser": "На път сте да блокирате потребител, който е \"скрит потребител\". Това действие ще заличи потребителското име от всички списъци и дневници. Наистина ли желаете да направите това?",
        "ipb-edit-dropdown": "Причини за блокиране",
        "ipb-unblock-addr": "Отблокиране на $1",
-       "ipb-unblock": "Отблокиране на потребителско име IP-адрес",
+       "ipb-unblock": "Отблокиране на потребителско име или IP-адрес",
        "ipb-blocklist": "Преглед на текущите блокирания",
        "ipb-blocklist-contribs": "Приноси на {{GENDER:$1|$1}}",
        "ipb-blocklist-duration-left": "{{PLURAL:$1|остава още $1|остават още $1}}",
        "ipblocklist": "Блокирани потребители",
        "ipblocklist-legend": "Търсене на блокиран потребител",
        "blocklist-userblocks": "Скриване на блокирани потребителски сметки",
-       "blocklist-tempblocks": "Скриване на срочни блокирания",
+       "blocklist-tempblocks": "Скриване на временни блокирания",
        "blocklist-addressblocks": "Скриване на отделни блокирани IP адреси",
        "blocklist-rangeblocks": "Скриване на блокиранията по IP диапазон",
        "blocklist-timestamp": "Дата и час",
        "exif-originalimageheight": "Височина на изображението преди намаляването",
        "exif-originalimagewidth": "Ширина на изображението преди намаляването",
        "exif-compression-1": "Некомпресиран",
-       "exif-copyrighted-true": "Заштитено со авторски права",
-       "exif-copyrighted-false": "Статута на авторските права не е указан",
+       "exif-copyrighted-true": "Заштитено с авторски права",
+       "exif-copyrighted-false": "Статутът на авторските права не е указан",
        "exif-unknowndate": "Неизвестна дата",
        "exif-orientation-1": "Нормално",
        "exif-orientation-2": "Отражение по хоризонталата",
index 30c5ca1..c905724 100644 (file)
        "accmailtitle": "পাসওয়ার্ড পাঠানো হয়েছে",
        "accmailtext": "[[User talk:$1|$1]] এর জন্য দৈব ভাবে উৎপন্ন শব্দ চাবি $2 এ পাঠানো হয়েছে।\nলগ-ইন করার পর ''[[Special:ChangePassword|পাসওয়ার্ড পরিবর্তন]]'' পাতা থেকে এটি পরিবর্তন করা যাব।",
        "newarticle": "(নতুন)",
-       "newarticletext": "à¦\86পনি à¦\8fমন à¦\8fà¦\95à¦\9fি à¦²à¦¿à¦\82à¦\95 à¦\85নà§\81সরণ à¦\95রà¦\9bà§\87ন, à¦¯à¦¾ à¦¨à§\87à¦\87।\nপাতাà¦\9fি à¦¤à§\88রি à¦\95রতà§\87, à¦¨à¦¿à¦\9aà§\87র à¦¬à¦¾à¦\95à§\8dসà§\87 à¦¤à¦¾ à¦\9fাà¦\87প à¦\95রা à¦¶à§\81রà§\81 à¦\95রà§\81ন (à¦\86রà¦\93 à¦¤à¦¥à§\8dয à¦\9cানতà§\87 [$1 à¦¸à¦¹à¦¾à¦¯à¦¼à¦¿à¦\95া à¦ªà¦¾à¦¤à¦¾] à¦¦à§\87à¦\96à§\81ন)।\nà¦\86পনি à¦¯à¦¦à¦¿ à¦­à§\81ল à¦\95রà§\87 à¦\8fà¦\96ানà§\87 à¦\8fসà§\87 à¦¥à¦¾à¦\95à§\87ন, à¦¤à¦¾à¦¹à¦²à§\87 à¦\86পনার à¦¬à§\8dরাà¦\89à¦\9cারà§\87র '''back''' à¦¬à§\8bতাম ক্লিক করুন।",
+       "newarticletext": "à¦\86পনি à¦\8fমন à¦\8fà¦\95à¦\9fি à¦ªà¦¾à¦¤à¦¾à¦° à¦¸à¦\82যà§\8bà¦\97 à¦\85নà§\81সরণ à¦\95রà¦\9bà§\87ন, à¦¯à¦¾à¦° à¦\85সà§\8dতিসà§\8dত à¦¨à§\87à¦\87।\nপাতাà¦\9fি à¦¤à§\88রি à¦\95রতà§\87, à¦¨à¦¿à¦\9aà§\87র à¦¬à¦¾à¦\95à§\8dসà§\87 à¦¤à¦¾ à¦\9fাà¦\87প à¦\95রা à¦¶à§\81রà§\81 à¦\95রà§\81ন (à¦\86রà¦\93 à¦¤à¦¥à§\8dয à¦\9cানতà§\87 [$1 à¦¸à¦¹à¦¾à¦¯à¦¼à¦¿à¦\95া à¦ªà¦¾à¦¤à¦¾] à¦¦à§\87à¦\96à§\81ন)।\nà¦\86পনি à¦¯à¦¦à¦¿ à¦­à§\81ল à¦\95রà§\87 à¦\8fà¦\96ানà§\87 à¦\8fসà§\87 à¦¥à¦¾à¦\95à§\87ন, à¦¤à¦¾à¦¹à¦²à§\87 à¦\86পনার à¦¬à§\8dরাà¦\89à¦\9cারà§\87র <strong>পিà¦\9bন</strong> à¦¬à§\8bতামà§\87 ক্লিক করুন।",
        "anontalkpagetext": "----\n<em>এটি একটি বেনামী ব্যবহারকারীর আলাপের পাতা, যিনি এখনও কোন অ্যাকাউন্ট তৈরি করেননি, কিংবা তিনি অ্যাকাউন্টটি ব্যবহার করছেন না।</em>\nআমরা তাই সাংখ্যিক আইপি ঠিকানা ব্যবহার করে তাঁকে শনাক্ত করছি।\nএকাধিক ব্যবহারকারী এরকম একটি আইপি ঠিকানা ব্যবহার করতে পারেন।\nআপনি যদি একজন বেনামী ব্যবহারকারী হয়ে থাকেন এবং যদি অনুভব করেন যে আপনার প্রতি অপ্রাসঙ্গিক মন্তব্য করা হয়েছে, তাহলে অন্যান্য বেনামী ব্যবহারকারীর সাথে ভবিষ্যতে বিভ্রান্তি এড়াতে অনুগ্রহ করে [[Special:CreateAccount|একটি অ্যাকাউন্ট তৈরি করুন]] অথবা  [[Special:UserLogin|অ্যাকাউন্টে প্রবেশ করুন]]।",
        "noarticletext": "বর্তমানে এই পাতায় কোন লেখা নেই।\nআপনি চাইলে অন্যান্য পাতায় [[Special:Search/{{PAGENAME}}| এই শিরোনামটি অনুসন্ধান করতে পারেন]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} এ সম্পর্কিত লগ অনুসন্ধান করতে পারেন], \nকিংবা [{{fullurl:{{FULLPAGENAME}}|action=edit}} এই পাতাটি তৈরি করতে পারেন]</span>।",
        "noarticletext-nopermission": "বর্তমানে এই পাতায় কোন লেখা নেই।\nআপনি চাইলে অন্য পাতায় [[Special:Search/{{PAGENAME}}| শিরোনামটি অনুসন্ধান করতে পারেন]], অথবা <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} সম্পর্কিত লগ অনুসন্ধান করতে পারেন]</span>, কিন্তু আপনার এই পাতাটি তৈরী করার অনুমতি নেই।",
        "editingsection": "সম্পাদনা করছেন $1 (অনুচ্ছেদ)",
        "editingcomment": "সম্পাদনা করছেন $1 (নতুন অনুচ্ছেদ)",
        "editconflict": "সম্পাদনা দ্বন্দ্ব: $1",
-       "explainconflict": "à¦\86পনি à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦¸à¦®à§\8dপাদনা à¦¶à§\81রà§\81 à¦\95রার à¦ªà¦° à¦\85নà§\8dয à¦\95à§\87à¦\89 à¦ªà¦¾à¦¤à¦¾à¦\9fিতà§\87 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\8fনà§\87à¦\9bà§\87।\nà¦\9fà§\87à¦\95à§\8dসà¦\9f à¦\8fলাà¦\95ার à¦\89পরà§\87র à¦\85à¦\82শà§\87 à¦¬à¦°à§\8dতমানà§\87 à¦\9fà§\87à¦\95à§\8dসà¦\9f à¦¯à§\87ভাবà§\87 à¦\86à¦\9bà§\87, à¦¤à¦¾ à¦¦à§\87à¦\96ানà§\8b à¦¹à¦¯à¦¼à§\87à¦\9bà§\87।\nà¦\86পনার à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà¦\97à§\81লি à¦\9fà§\87à¦\95à§\8dসà¦\9f à¦\8fলাà¦\95ার à¦¨à¦¿à¦\9aà§\87র à¦\85à¦\82শà§\87 à¦¦à§\87à¦\96ানà§\8b à¦¹à¦¯à¦¼à§\87à¦\9bà§\87।\nà¦\86পনাà¦\95à§\87 à¦\86পনার à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà¦\97à§\81লি à¦¬à¦°à§\8dতমানà§\87 à¦¬à¦¿à¦¦à§\8dযমান à¦\9fà§\87à¦\95à§\8dসà¦\9fà§\87র à¦¸à¦¾à¦¥à§\87 à¦®à¦¿à¦²à¦¿à¦¯à¦¼à§\87 à¦¦à¦¿à¦¤à§\87 à¦¹à¦¬à§\87।\nà¦\86পনি \"সà¦\82রà¦\95à§\8dষণ\" à¦\9aাপলà§\87 '''শà§\81ধà§\81মাতà§\8dর''' à¦\9fà§\87à¦\95à§\8dসà¦\9f এলাকার উপরের অংশটি সংরক্ষিত হবে।",
+       "explainconflict": "à¦\86পনি à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦¸à¦®à§\8dপাদনা à¦¶à§\81রà§\81 à¦\95রার à¦ªà¦° à¦\85নà§\8dয à¦\95à§\87à¦\89 à¦ªà¦¾à¦¤à¦¾à¦\9fিতà§\87 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\8fনà§\87à¦\9bà§\87।\nপাঠà§\8dয à¦\8fলাà¦\95ার à¦\89পরà§\87র à¦\85à¦\82শà§\87 à¦¬à¦°à§\8dতমানà§\87 à¦ªà¦¾à¦  à¦¯à§\87ভাবà§\87 à¦\86à¦\9bà§\87 à¦¤à¦¾ à¦¦à§\87à¦\96ানà§\8b à¦¹à¦¯à¦¼à§\87à¦\9bà§\87।\nà¦\86পনার à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà¦\97à§\81লি à¦ªà¦¾à¦ à§\8dয à¦\8fলাà¦\95ার à¦¨à¦¿à¦\9aà§\87র à¦\85à¦\82শà§\87 à¦¦à§\87à¦\96ানà§\8b à¦¹à¦¯à¦¼à§\87à¦\9bà§\87।\nà¦\86পনাà¦\95à§\87 à¦\86পনার à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà¦\97à§\81লি à¦¬à¦°à§\8dতমানà§\87 à¦¬à¦¿à¦¦à§\8dযমান à¦ªà¦¾à¦ à§\8dযà§\87র à¦¸à¦¾à¦¥à§\87 à¦®à¦¿à¦²à¦¿à¦¯à¦¼à§\87 à¦¦à¦¿à¦¤à§\87 à¦¹à¦¬à§\87।\nà¦\86পনি \"{{int:savearticle}}\" à¦\9aাপলà§\87 <strong>শà§\81ধà§\81মাতà§\8dর</strong> à¦ªà¦¾à¦ à§\8dয এলাকার উপরের অংশটি সংরক্ষিত হবে।",
        "yourtext": "আপনার লেখা বিষয়বস্তু",
        "storedversion": "সংরক্ষিত সংস্করণ",
        "nonunicodebrowser": "'''সতর্কীকরণ: আপনার ব্রাউজার ইউনিকোড-বন্ধুভাবাপন্ন নয়। আপনি যাতে বিপদ ছাড়াই পাতা সম্পাদনা করতে পারেন, সে জন্য সমাধান আছে: অ-আস্কি ক্যারেক্টারগুলি হেক্সাডেসিমাল কোড হিসেবে দেখানো হবে।'''",
        "page_first": "প্রথম",
        "page_last": "শেষ",
        "histlegend": "পার্থক্য নির্বাচন: যে সংস্করণগুলো তুলনা করতে চান, সেগুলো চিহ্নিত করে এন্টার বা নিচের বোতামটি টিপুন।<br />\nনির্দেশিকা: (বর্তমান) = বর্তমান সংস্করণের সাথে পার্থক্য, (পূর্ববর্তী) =  পূর্বের সংস্করণের সাথে পার্থক্য, অ = অনুল্লেখ্য সম্পাদনা।",
-       "history-fieldset-title": "বà§\8dরাà¦\89à¦\9c à¦\87তিহাস",
-       "history-show-deleted": "শà§\81ধà§\81মাতà§\8dর à¦\85পসারণ",
+       "history-fieldset-title": "সà¦\82সà§\8dà¦\95রণà§\87র à¦\9cনà§\8dয à¦\85নà§\81সনà§\8dধান à¦\95রà§\81ন",
+       "history-show-deleted": "শà§\81ধà§\81মাতà§\8dর à¦\85পসারিত à¦¸à¦\82শà§\8bধন",
        "histfirst": "সবচেয়ে পুরনো",
        "histlast": "সবচেয়ে নতুন",
        "historysize": "({{PLURAL:$1|১ বাইট|$1 বাইট}})",
        "prefs-help-prefershttps": "পরবর্তী প্রবেশের পর থেকে এই পরিবর্তনগুলো কার্যকর হবে।",
        "prefswarning-warning": "আপানি পছন্দসমূহ পাতায় পাতায় পরিবর্তন করেছেন যেগুলো সংরক্ষণ করা হয়নি। আপনি যদি এই পাতাটি ছেড়ে যাওয়ার আগে \"$1\" ক্লিক না করেন তবে পছন্দসমূহ হালনাগাদ হবে না।",
        "prefs-tabs-navigation-hint": "সাহায্য: আপনি ডান এবং বাম অ্যারো বাটন ব্যবহার করে বিভিন্ন ট্যাবগুলোতে যেতে পারবেন।",
-       "userrights": "ব্যবহারকারী অধিকার ব্যবস্থাপনা",
+       "userrights": "ব্যবহারকারী অধিকার",
        "userrights-lookup-user": "একজন ব্যবহারকারী নির্বাচন করুন",
        "userrights-user-editname": "ব্যবহারকারীর নাম লিখুন:",
        "editusergroup": "ব্যবহারকারী দল লোড করুন",
        "rcfilters-invalid-filter": "অকার্যকর ফিল্টার",
        "rcfilters-empty-filter": "কোনো সক্রিয় ফিল্টার নেই। সমস্ত অবদান দেখানো হয়েছে।",
        "rcfilters-filterlist-title": "ছাঁকনি",
+       "rcfilters-filterlist-whatsthis": "এটি কী?",
        "rcfilters-filterlist-feedbacklink": "নতুন (বিটা) ছাঁকনির উপর মতামত প্রদান করুন",
        "rcfilters-highlightbutton-title": "ফলাফল আলোকপাত করুন",
        "rcfilters-highlightmenu-title": "একটি রং নির্বাচন করুন",
        "listusersfrom": "সেই সব ব্যবহারকারী দেখাও যাদের নাম এই অক্ষর দিয়ে শুরু:",
        "listusers-submit": "দেখাও",
        "listusers-noresult": "কোন ব্যবহারকারী খুঁজে পাওয়া যায়নি।",
-       "listusers-blocked": "(বà§\8dলà¦\95à¦\95à§\83ত)",
+       "listusers-blocked": "(বাধাপà§\8dরাপà§\8dত)",
        "activeusers": "সক্রিয় ব্যবহারকারী তালিকা",
        "activeusers-intro": "এটি ব্যবহারকারী তালিকা যাদের $1 {{PLURAL:$1|দিনে|দিনে}} যেকোন কর্মকান্ড রয়েছে।",
        "activeusers-count": "গত {{PLURAL:$3|কালে|$3 দিনে}} সর্বমোট {{PLURAL:$1|কর্মের}} সংখ্যা $1টি",
        "ipb_hide_invalid": "এই অ্যাকাউন্ট বাধা দেয়া সম্ভব নয়; এটি {{PLURAL:$1|একের অধিক|$1টি}} সম্পাদনা করেছে।",
        "ipb_already_blocked": "\"$1\" ইতিমধ্যে ব্লক",
        "ipb-needreblock": "$1 ইতিমধ্যেই বাধাপ্রাপ্ত আছেন। আপনি কি সেটিংস পরিবর্তন করতে চান?",
-       "ipb-otherblocks-header": "অন্যান্য {{PLURAL:$1|বাধাঁ|বাধাঁসমূহ}}",
+       "ipb-otherblocks-header": "অন্যান্য {{PLURAL:$1|বাধা|বাধাসমূহ}}",
        "unblock-hideuser": "আপনি এই ব্যবহারকারীকে বাধা মুক্ত করতে পারবেন না, কারণ এই ব্যবহারকারীদের ব্যবহারকারী নাম লুকানো রয়েছে।",
        "ipb_cant_unblock": "ত্রুটি: $1 ব্লক আইডি খুঁজে পাওয়া যায়নি। হয়ত ইতিমধ্যেই এটির উপর থেকে বাধা তুলে নেওয়া হয়েছে।",
        "ipb_blocked_as_range": "ত্রুটি: $1 আইপি ঠিকানাটিকে সরাসরি বাধা দেওয়া হয়নি এবং বাধা তুলে নেওয়া যাবে না। তবে ঠিকানাটি $2 সীমার অন্তর্ভুক্ত এবং সেটি থেকে বাধা তুলে নেওয়া সম্ভব।",
        "tags-create-reason": "কারণ:",
        "tags-create-submit": "তৈরি করুন",
        "tags-create-no-name": "আপনাকে একটি ট্যাগের নাম অবশ্যই উল্লেখ করতে হবে।",
+       "tags-create-invalid-chars": "ট্যাগের নামে কমা (<code>,</code>) বা ফরোয়ার্ড স্ল্যাশ (<code>/</code>) থাকতে পারবে না।",
+       "tags-create-invalid-title-chars": "ট্যাগের নাম এমন অক্ষর থাকতে পারবে না যা পাতার শিরোনামে ব্যবহার করা যায় না।",
        "tags-create-already-exists": "\"$1\" ট্যাগ ইতিমধ্যেই বিদ্যমান।",
        "tags-create-warnings-below": "আপনি কি ট্যাগটি তৈরি করা চালিয়ে যেতে চান?",
        "tags-delete-title": "ট্যাগ অপসারণ",
+       "tags-delete-explanation-initial": "আপনি ডাটাবেজ থেকে \"$1\" ট্যাগটি অপসারণ করতে চলেছেন।",
        "tags-delete-reason": "কারণ:",
        "tags-delete-submit": "অপরিবর্তনীয় এই ট্যাগ অপসারন করো",
        "tags-delete-not-found": "\"$1\" ট্যাগ বিদ্যমান নয়।",
        "pagelang-reason": "কারণ",
        "pagelang-submit": "জমা দাও",
        "pagelang-nonexistent-page": "$1 শিরোনামে কোন পাতা নেই।",
+       "pagelang-unchanged-language": "$1 পাতাটি ইতিমধ্যে $2 ভাষায় নির্ধারণ করা আছে।",
+       "pagelang-unchanged-language-default": "$1 পাতাটি ইতিমধ্যেই উইকির পূর্বনির্ধারিত বিষয়বস্তুর ভাষায় নির্ধারণ করা আছে।",
        "pagelang-db-failed": "ডাটাবেস পৃষ্ঠার ভাষা পরিবর্তন করতে ব্যর্থ হয়েছে।",
        "right-pagelang": "পাতার ভাষা পরিবর্তন করুন",
        "action-pagelang": "পাতার ভাষা পরিবর্তন করুন",
index 6ef5b5f..1ecfc7e 100644 (file)
@@ -31,8 +31,9 @@
        "tog-enotifminoredits": "امیل به مو سی صفحات ناقص اصلاح شده",
        "tog-enotifrevealaddr": "نشودادن امیل مو درامیلهای آگاهی-خبری",
        "tog-shownumberswatching": "نشودادن شماره کاربران درحال کار یاتماشا",
-       "tog-fancysig": "امضاهای ناتمام - بدون لینکهای اتوماتیک",
-       "tog-uselivepreview": "استفاده زه پیش نمایش زنده(جاوااسکریپ) (تجربی )",
+       "tog-oldsig": "امضا ایسنی",
+       "tog-fancysig": "امضایل ناتموم",
+       "tog-uselivepreview": "پیش سئیل زندە ڤن ڤا کار",
        "tog-forceeditsummary": "یادآوری سریع به مو هنگام اصلاح عقیم وخلاصه",
        "tog-watchlisthideown": "قایم کردن اصلاحات مو  زه لیست پیگیریها",
        "tog-watchlisthidebots": "قایم کردن اصلاحات بوت زه لیست پیگیریها",
        "createacct-reason": "دلیل",
        "createacct-submit": "هساڤ خوتۈنإ راسد کونين",
        "createacct-another-submit": "راسد کردن هساڤ کارياري",
+       "createacct-benefit-heading": "{{SITENAME}}  ڤئ دسد خلکي چي ايسا رأڤأندیاری ڤابيڌإ.",
        "createacct-benefit-body1": "{{PLURAL:$1|ڤيرایشد|ڤيرایشدا}}",
        "createacct-benefit-body2": "{{PLURAL:$1|بألگأ|بألگإ آ}}",
        "createacct-benefit-body3": "تازأ{{PLURAL:$1|هوميار|هوميارا}}",
        "preview": "پیش نمایش",
        "showpreview": "پیش‌نمایش",
        "showdiff": "نشودادن تغییرات",
-       "anoneditwarning": "'''توجه:''' ایسا داخل سیستم نوابیدین.\nآی پی آدرستو درگزارش اصلاح صفحه ضبط ابوه.",
+       "anoneditwarning": "<strong>زئنار:</strong> شوما هأنی نیوٙمایتە ڤامین. تیرنئشوٙن آی پی شوما سی هأر گاتی کئ آلئشتکاری بأکیت سی کول خألک دیاری می کە. أر <strong>[$1 روئیت ڤامین]</strong> یا <strong>[$2 یئ گئل حئساڤ کاریاری راس بأکیت]</strong>، ڤیرایئشتیا شوما ڤئ نوم کاریاری خوتوٙ دیاری می کە و سی شوما بیتأرە.",
        "summary-preview": "پیش نمایش - خلاصه:",
        "blockedtext": " \"'''دسترسی نام کاربری یا نشانی اینترنتی ایسا بسته وابیده.'''\nای کار توسط $1 انجام شده‌است.\nدلیلی که گده اینه: $2''\n* آغاز قطع دسترسی: $8\n* زمان اتمام ای قطع دسترسی: $6\n* کاربری که قطع دسترسی‌اش در نظر بیده: $7\nایساترین با $1 یا یکی از [[{{MediaWiki:Grouppage-sysop}}|مدیران]] تماس بگیرین و در ای باره صحبت کنین.\nتوجه کنین که ایسا نترین زه امکان «ارسال پست الکترونیکی به ای کاربر» استفاده کنین مگر این که نشانی پست الکترونیکی معتبری در [[Special:Preferences|اولویتهای کاربری]]خود ثبت کرده بوین.\nنشانی IP ایسا $3 و شماره قطع دسترسی ایسا $5 است. لطفاً ای شماره‌ها را در همه کاوشهاتون ذکر کنین.\nایسا ترین با $1 یا یکی دیه زه [[{{MediaWiki:Grouppage-sysop}}|مدیران]] تماس بگیرین، تا در باره ای قطع دسترسی صحبت کنین.\nدقت کنین که سی ارسال پست الکترونیکی در ویکی، وا پست الکترونیکی خود را زه طریق صفحه[[Special:Preferences|تنظیمات]] فعال کرده بوین، و نیز، وا امکان استفاده زه ای ویژگی سی ایساقطع نبوه.\nنشانی اینترنتی الان ایسا $3 است و شماره قطع دسترسی $5 است.\nلطفاً ای شماره را در هر درخواستی که در ای مورد مطرح اکنین ذکر کنین",
        "loginreqtitle": "ڤامإن إڤوڌن لازومإ",
        "newarticle": "(تازه)",
        "newarticletext": "ايسا ز دين یأ هومپیڤأندي هڌين کإ نيڌس. سي رأڤأندياري بألگإ شورۈ کونين مإن اي جأڤإ دإڤۈني بنڤيسين(سي دونسدن بیشدر سإیل [$1]کونین).\nأر ايسا سي إشتڤاکاري ايچونين، دوگمإ رأهڌن ڤاپوشد نأ بپۈرنين.",
        "noarticletext": " ايسإ اي بألگإ نإڤشدإیي نارإ، ايسا تإرين [[Special:Search/{{PAGENAME}}داسۈن اي بألگإ نإ مإن بألگإآ ديأري پی جۈري کونين]] یا [{{fullurl:{{FULLPAGENAME}}|action=edit}} اي بألگإ نأ ڤيرایشد کونين].",
+       "noarticletext-nopermission": " ايسإ اي بألگإ نإڤشدإیي نارإ، ايسا تإرين [[Special:Search/{{PAGENAME}}داسۈن اي بألگإ نإ مإن بألگإآ ديأري پی جۈري کونين]] یا [{{fullurl:{{FULLPAGENAME}}|action=edit}} اي بألگإ نأ ڤيرایشد کونين].",
        "previewnote": "'''ای فقط یه پیش نمایشه;\nتغییراتی که ایسا دادین هنی ضبط نوابیده!'''",
        "editing": "درحال اصلاح $1",
        "creating": "راسد کردن $1",
        "templatesusedpreview": "قالبها  یا الگوهای استفاده وابیده در ای پیش نمایش:",
        "template-protected": "(تحت حمایت)",
        "template-semiprotected": "(نیمه حمایت وابیده)",
+       "hiddencategories": "اي بلگأ یکي ز أندوما {{PLURAL:$1|1 hidden category|$1 hidden categories}} إ:",
        "nocreatetext": "{{SITENAME}}قابلیت درست کردن صفحات تازه را محدود کرده‌. ترین برگردین و صفحه‌ موجود را اصلاح کنین یا اینکه  [[Special:UserLogin|به سیستم داخل بوین یا حساب کاربری درست کنین]].",
        "permissionserrorstext-withaction": "ايسا سی نياگري $2 سإلا\nنارين {{PLURAL:$1|دلیل|دليلا}}:",
        "recreate-moveddeleted-warn": "'''هشدار: ایسا در حال درست کردن دوباره صفحه‌ای هدین که قبلاً حذف وابیده '''در نظر داشته بوین که ادامه اصلاح ای صفحه کار درستی هده یا نه. نمایه حذف مربوط به ای صفحه سی راحتی کار در ادامه اویده",
        "lineno": "سطر $1:",
        "compareselectedversions": "مقایسه نسخه‌های انتخاب‌ وابیده",
        "editundo": "لغو اصلاح آخر",
+       "diff-multi-sameuser": "({{PLURAL:$1|یه دۈنإ نسقه مینجایی|$1 نسقه یل مینجایی}} ب دسد{{PLURAL:$2|کاریاری ديأ|$2 کاريارا}} نشۈن داڌإ نڤابيڌإ)",
        "searchresults": "نتيجأ آ پی جۈري سي",
        "searchresults-title": "نتيجإ آ پی جوري سي \"$1\"",
        "prevn": "قبلی {{PLURAL:$1|$1}}",
        "nextn-title": "نيایي $1 {{PLURAL:$1|نتيجه|نتيجإآ}}",
        "shown-title": "نإشۈن دائن $1 {{PLURAL:$1|نتيجأ|نتيجإ آ}} سي هر بألگأ",
        "viewprevnext": "مشاهده ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchmenu-new": "<strong>اي بلگإ نأ مإن \"[[:$1]]\" اي ڤيکي راسد کو!</strong> {{PLURAL:$2|0=|See also the page found with your search.|See also the search results found.}}",
        "searchprofile-articles": "بلگه آ مینونه دار",
        "searchprofile-images": "ڤارسگرا خلکمند",
        "searchprofile-everything": "همه چی",
        "search-suggest": "منزۈرت یو بي:$1",
        "search-interwiki-more": "(بيشدر)",
        "searchall": "همه",
+       "search-showingresults": "{{PLURAL:$4|نتیجه یل<strong>$1</strong> د <strong>$3</strong>|نتیجه یل<strong>$1 - $2</strong د <strong>$3</strong>}}",
        "search-nonefound": "هیژ نتیجه یی وا پی جست تو یکی نئ.",
        "powersearch-toggleall": "همأ",
        "powersearch-togglenone": "هيش کوم",
        "enhancedrc-history": "ڤیرگار",
        "recentchanges": "تغییرات اخیر",
        "recentchanges-legend": "گزينإ آ آلشدا ايسإني",
+       "recentchanges-summary": "دو بیشتر آلشدا تازباو نه د ویکی نه د ای بلگه پیگری کو.",
        "recentchanges-feed-description": "ردیابی آخرین تغییرات  ویکی در ای خورد",
        "recentchanges-label-newpage": "ای ويرايشت يه بلگه تازه راس كرده",
        "recentchanges-label-minor": "یو یه ويرايشت کوچيره",
        "recentchangeslinked-title": "تغییرهای مرتبط با $1",
        "recentchangeslinked-summary": " ای صفحه خاص تغییرات اخیر در صفحه‌های لینک داده شده به این صفحه را نشو اده.\nصفحه‌هایی که در لیست پی‌گیریهای ایسا بون به شکل '''سیاه''' نشو داده ابون.",
        "recentchangeslinked-page": "نوم بألگە:",
+       "recentchangeslinked-to": "آلشتیایی که د بلگه یا هوم پیوند بینه وه جا بلگه دئیه بیه نشو بیه",
        "upload": "آپلود فایل",
        "uploadbtn": "آپلود فایل",
        "uploadlogpage": "نمایه آپلود",
        "tooltip-recreate": "دوباره درست کردن صفحه ای که زه رو کینه وغرض پاک وابیده",
        "tooltip-upload": "شروع آپلود",
        "tooltip-rollback": "\"اعاده\" برگرداندن به وضع اولیه سی ای صفحه که بخاطر مشارکت  آخر اصلاح وابیده بایک کلیک",
+       "tooltip-undo": "انجوم نگرتن ای ویرایشت ورگن و همه فرمیا ویرایشت تانه که حالت پیش سیل واکو.یه اجازه میئه سی اضاف کردن یه دلیل د چکسته.",
        "tooltip-summary": "یأ چکسدأ کۈچير ڤارڌ کونين",
        "simpleantispam-label": "Anti-spam check.\nپور<strong>نکنين</strong> ايچو نأ!",
        "pageinfo-toolboxlink": "دونسمندیا بلگه",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|چک چنه]])",
        "version": "ترجمه یا تفسیر",
        "specialpages": "صفحات ویژه",
-       "tag-filter": "[[Special:سرديسا|سرديس]] فيلتر :",
+       "tag-filter": "[[Special:سرديسا|سرديس]] فيلتر:",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|سرديس|سرديسا}}]]: $2)",
        "logentry-delete-delete": "$1 بألگأ {{GENDER:$2|پاکسا ڤابيأ}} $3",
        "logentry-move-move": "$1 {{GENDER:$2|جا ب جا کردإ}} بألگأ $3 نأ سي $4",
index 684020e..2c0df33 100644 (file)
        "page_first": "kentañ",
        "page_last": "diwezhañ",
        "histlegend": "Sellet ouzh an diforc'hioù : lakait un ask adal d'ar stummoù a fell deoc'h keñveriañ ha pouezit war kadarnaat pe war ar bouton en traoñ.<br />\nAlc'hwez : (red) = diforc'hioù gant ar stumm a-vremañ,\n(diwez) = diforc'hioù gant ar stumm kent, D = kemm dister",
-       "history-fieldset-title": "Furchal en istor",
+       "history-fieldset-title": "Klask adweladennoù",
        "history-show-deleted": "Stumm diverket hepken",
        "histfirst": "koshañ",
        "histlast": "nevezañ",
        "revdelete-no-file": "N'eus ket eus ar restr spisaet ganeoc'h.",
        "revdelete-show-file-confirm": "Ha sur oc'h e fell deoc'h gwelet stumm diverket ar restr \"<nowiki>$1</nowiki>\" deiziataet eus an $2 da $3?",
        "revdelete-show-file-submit": "Ya",
-       "revdelete-selected-text": "{{PLURAL:$1|Stummoù diuzet|Stumm diuzet}} of [[:$2]]:",
+       "revdelete-selected-text": "{{PLURAL:$1|Stumm diuzet}} eus [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|Stumm eus ar restr diuzet}} evit [[:$2]] :",
        "logdelete-selected": "{{PLURAL:$1|Darvoud eus ar marilh diuzet}} :",
        "revdelete-text-text": "Dont a raio c'hoazh war wel ar stummoù diverket en istor ar bajenn met ne c'hallo ket an dud gwelet darn eus an danvez ken.",
        "rcfilters-invalid-filter": "Sil direizh",
        "rcfilters-empty-filter": "Sil oberiant ebet. War wel emañ an holl gemmoù.",
        "rcfilters-filterlist-title": "Siloù",
+       "rcfilters-filterlist-whatsthis": "Petra eo se ?",
        "rcfilters-filterlist-feedbacklink": "Reiñ ho soñj diwar-benn ar siloù (beta) nevez",
        "rcfilters-highlightbutton-title": "Lakaat an disoc'hoù war wel",
        "rcfilters-highlightmenu-title": "Dibabit ul liv",
        "rcfilters-highlightmenu-help": "Diuzañ ul liv evit lakaat ar perzh-mañ war wel",
        "rcfilters-filterlist-noresults": "N'eus bet kavet sil ebet",
+       "rcfilters-noresults-conflict": "N'eus bet kavet disoc'h ebet rak dezverkoù klask kontrol zo",
+       "rcfilters-state-message-subset": "Ar sil-mañ ne ra netra rak kavet e vez e zisoc'hoù e-mesk ar {{PLURAL:$2|sil|siloù}} klask da heul (klaskit e lakaat war wel evit diforc'han anezhañ) : $1",
+       "rcfilters-state-message-fullcoverage": "Diuzañ an holl siloù en ur strollad zo evel diuzañ netra, setu ne raio ket netra ar sil-mañ. Er strollad emañ : $1",
        "rcfilters-filtergroup-registration": "Enskrivadur an implijer",
        "rcfilters-filter-registered-label": "Marilhet",
        "rcfilters-filter-registered-description": "Aozerien gevreet.",
        "rcfilters-filter-unregistered-label": "Divarilh",
        "rcfilters-filter-unregistered-description": "Aozerien n'int ket kevreet.",
-       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Dizoberiant eo ar sil \"dienroll\" peogwir eo nullet e wered gant ar {{PLURAL:$2|sil|siloù}} Arroutet, na {{PLURAL:$2|gav|gavont}} nemet an implijerien enrollet : $1",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Tabut zo etre ar sil-mañ hag ar {{PLURAL:$2|sil|siloù}} Arroutet, na {{PLURAL:$2|gav|gavont}} nemet an implijerien enrollet : $1",
        "rcfilters-filtergroup-authorship": "Kemmañ anv an aozer",
        "rcfilters-filter-editsbyself-label": "Kemmet ganeoc'h",
        "rcfilters-filter-editsbyself-description": "Kemmet ganeoc'h",
        "rcfilters-filter-editsbyother-label": "Kemmet gant tud all",
        "rcfilters-filter-editsbyother-description": "Kemmoù graet gant implijerien all (ket ganeoc'h).",
        "rcfilters-filtergroup-userExpLevel": "Live skiant-prenañ (evit an implijer enrollet hepken)",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Dizoberiant eo ar sil-mañ peogwir ne gav nemet implijerien enrollet, dre se emañ nullet e wered gant ar sil \"Dienroll\".",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Emañ ar sil \"Dienroll\" oc'h en em sikanañ gant ur sil Arroutet pe meur a hini. Ar siloù Arroutet a gav implijerien enrollet hepken. Ar siloù o tabutal zo merket evel dizoberiant a-us.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Ar siloù Arroutet ne gavont nemet implijerien enrollet, se zo kaoz zo tabut etre ar sil-mañ hag ar sil \"Dienroll\".",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Emañ ar sil \"Dienroll\" o tabutal gant gant ur sil Arroutet pe gant meur a hini. Ar siloù Arroutet a gav implijerien enrollet hepken. Ar siloù o tabutal zo merket en takad Siloù oberiant a-us.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Tud nevez-deuet",
        "rcfilters-filter-user-experience-level-newcomer-description": "Nebeutoc'h eget 10 kemm ha 4 devezh obererezh.",
        "rcfilters-filter-user-experience-level-learner-label": "Deskarded",
        "rcfilters-filter-categorization-description": "Roll ar pajennoù ouzhpennet da rummadoù zo pe dilamet diouto.",
        "rcfilters-filter-logactions-label": "Obererezhioù enrollet",
        "rcfilters-filter-logactions-description": "Obererezhioù melestradurel, krouiñ kontoù, diverkañ pajennoù, enporzhiañ...",
+       "rcfilters-hideminor-conflicts-typeofchange": "Seurtoù kemmoù zo n'hallont ket bezañ merket evel \"dister,\", rak se ez eus tabut etre ar sil-mañ ha siloù ar Seurtoù kemmoù da heul : $1",
        "rcnotefrom": "Setu aze {{PLURAL:$5|ar c'hemm|ar c'hemmoù}} c'hoarvezet abaoe an <strong>$3, $4</strong> (<strong>$1</strong> d'ar muiañ).",
        "rclistfrom": "Diskouez ar c'hemmoù diwezhañ abaoe an/ar $3 $2",
        "rcshowhideminor": "$1 ar c'hemmoù dister",
        "tags-apply-no-permission": "N'oc'h ket aotreet da lakaat tikedennoù kemmañ da dalvezout a-gevret gant ho kemmoù.",
        "tags-apply-blocked": "N'hallit ket lakaat da dalvezout ar c'hemmañ tikedennoù hag ho kemmoù e-keit hag {{GENDER:$1|emaoc'h}} stanket.",
        "tags-apply-not-allowed-one": "N'haller ket lakaat an dikedenn \"$1\" da dalvezout gant an dorn.",
+       "tags-apply-not-allowed-multi": "N'eo ket aotreet lakaat an {{PLURAL:$2|dikedenn}} da heul da dalvezout gant an dorn : $1",
+       "tags-update-no-permission": "N'oc'h ket aotreet da ouzhpennañ pe da lemel kuit tikedennoù kemmañ diwar stummoù hiniennel pe monedoù marilh.",
+       "tags-update-blocked": "N'hallit ket ouzhpennañ pe dilemel tikedennoù kemmañ e-keit hag {{GENDER:$1|emaoc'h}} stanket.",
+       "tags-update-add-not-allowed-one": "N'haller ket ouzhpennañ an dikedenn \"$1\" gant an dorn.",
+       "tags-update-add-not-allowed-multi": "N'eo ket aotreet ouzhpennañ an {{PLURAL:$2|dikedenn}} da heul gant an dorn : $1",
+       "tags-update-remove-not-allowed-one": "N'haller dilemel an dikedenn \"$1\".",
+       "tags-update-remove-not-allowed-multi": "N'haller ket dilemel an {{PLURAL:$2|dikedenn}} gant an dorn : $1",
        "tags-edit-title": "Kemmañ an tikedennoù",
        "tags-edit-manage-link": "Merañ an tikedennoù",
+       "tags-edit-revision-selected": "{{PLURAL:$1|stumm diuzet}} eus [[:$2]]:",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|Darvoud eus ar marilh diuzet}} :",
+       "tags-edit-revision-legend": "Ouzhpennañ pe lemel tikedennoù a-ziwar {{PLURAL:$1|ar stumm-mañ|an $1 stumm zo}}",
+       "tags-edit-logentry-legend": "Ouzhpennañ pe dilemel tikedennoù a-ziwar {{PLURAL:$1|ar moned marilh-mañ|ar $1 moned marilh zo}}",
        "tags-edit-existing-tags": "Tikedennoù zo anezho :",
        "tags-edit-existing-tags-none": "<em>Hini ebet</em>",
        "tags-edit-new-tags": "Tikedennoù nevez :",
        "tags-edit-remove": "Dilemel an tikedennoù-mañ :",
        "tags-edit-remove-all-tags": "(dilemel an holl dikedennoù)",
        "tags-edit-chosen-placeholder": "Diuzañ un nebeud tikedennoù",
+       "tags-edit-chosen-no-results": "N'eus bet kavet tikedenn ebet o klotañ",
        "tags-edit-reason": "Abeg :",
+       "tags-edit-revision-submit": "Lakaat ar c'hemmoù da dalvezout evit {{PLURAL:$1|ar stumm-mañ|$1 stumm}}",
+       "tags-edit-logentry-submit": "Lakaat ar c'hemmoù da dalvezout evit {{PLURAL:$1|ar moned marilh-mañ|$1 moned marilh}}",
        "tags-edit-success": "Lakaet eo bet ar c'hemmoù da dalvezout",
+       "tags-edit-failure": "N'eus ket bet gallet lakaat ar c'hemmoù da dalvezout :\n$1",
+       "tags-edit-nooldid-title": "Stumm pal direizh",
+       "tags-edit-nooldid-text": "Pe n'eus ket bet spisaet ganeoc'h stumm pal resis ebet da lakaat an arc'hwel-mañ da oberiañ warnañ, pe n'eus ket eus ar stumm spisaet.",
+       "tags-edit-none-selected": "Diuzit da nebeutañ un dikedenn da vezañ ouzhpennet pe dilamet.",
        "comparepages": "Keñveriañ pajennoù",
        "compare-page1": "Pajenn 1",
        "compare-page2": "Pajenn 2",
        "compare-revision-not-exists": "N'eus ket eus an adweladenn spisaet ganeoc'h.",
        "dberr-problems": "Ho tigarez ! Kudennoù teknikel zo gant al lec'hienn-mañ.",
        "dberr-again": "Gortozit un nebeud munutennoù a-raok adkargañ.",
-       "dberr-info": "(Dibosupl kevreañ ouzh servijer an diaz roadennoù: $1)",
-       "dberr-info-hidden": "(Ne c'haller ket mont da servijer an diaz roadennoù)",
+       "dberr-info": "(Dibosupl kevreañ ouzh an diaz roadennoù : $1)",
+       "dberr-info-hidden": "(Ne c'haller ket mont d'an diaz roadennoù)",
        "dberr-usegoogle": "E-keit-se esaeit klask dre c'hGoogle.",
        "dberr-outofdate": "Notit mat e c'hall o menegerioù dezho bezañ dispredet e-keñver ar boued zo ganeomp.",
        "dberr-cachederror": "Un eilstumm memoret eus ar bajenn goulennet eo hemañ, gallout a ra bezañ dispredet.",
        "htmlform-date-placeholder": "BBBB-MM-DD",
        "htmlform-time-placeholder": "HH:MM:SS",
        "htmlform-datetime-placeholder": "BBBB-MM-DD HH:MM:SS",
+       "htmlform-date-invalid": "An talvoud lakaet ganeoc'h n'eo ket un deiziad anavezet. Klaskit gant ar furmad BBBB-MM-DD.",
+       "htmlform-time-invalid": "An talvoud lakaet ganeoc'h n'eo ket un eur anavezet. Klaskit gant ar furmad HH:MM:SS.",
+       "htmlform-datetime-invalid": "An talvoud lakaet ganeoc'h n'eo ket un deiziad nag un eur anavezet. Klaskit gant ar furmad BBBB-MM-DD HH:MM:SS.",
+       "htmlform-date-toolow": "An talvoud lakaet ganeoc'h zo a-raok an deiziad aotreet abretañ hag a zo $1.",
+       "htmlform-date-toohigh": "An talvoud lakaet ganeoc'h zo war-lerc'h an deiziad aotreet diwezhañ hag a zo $1.",
+       "htmlform-time-toolow": "An talvoud lakaet ganeoc'h zo a-raok an eur aotreet abretañ hag a zo $1.",
+       "htmlform-time-toohigh": "An talvoud lakaet ganeoc'h zo war-lerc'h an eur aotreet diwezhañ hag a zo $1.",
+       "htmlform-datetime-toolow": "An talvoud lakaet ganeoc'h zo a-raok an deiziad hag eur aotreet abretañ hag a zo $1.",
+       "htmlform-datetime-toohigh": "An talvoud lakaet ganeoc'h zo war-lerc'h an deiziad hag eur aotreet diwezhañ hag a zo $1.",
+       "htmlform-title-badnamespace": "N'emañ ket [[:$1]] en esaouenn anv \"{{ns:$2}}\".",
+       "htmlform-title-not-creatable": "N'haller ket reiñ an titl \"$1\" d'ur bajenn bennak",
        "htmlform-title-not-exists": "N'eus ket eus $1.",
        "htmlform-user-not-exists": "N'eus ket eus <strong>$1</strong>.",
        "htmlform-user-not-valid": "Un anv implijer direizh eo <strong>$1</strong>.",
        "logentry-delete-delete": "Diverket eo bet ar bajenn $3 gant $1",
+       "logentry-delete-delete_redir": "{{GENDER:$2|Friket}} eo bet an adkas $3 gant $1",
        "logentry-delete-restore": "Assavet eo bet ar bajenn $3 gant $1",
        "logentry-delete-event": "Kemmet eo bet gwelusted {{PLURAL:$5|un darvoud eus ar marilh|$5 darvoud eus ar marilh}} d'an $3 gant $1 : $4",
        "logentry-delete-revision": "{{GENDER:$2|Kemmet}} eo bet gwelusted {{PLURAL:$5|reizhadenn|$5 reizhadenn}} war ar bajenn $3 gant $1 : $4",
        "revdelete-uname-unhid": "anv implijer war wel",
        "revdelete-restricted": "Lakaat ar strishadurioù da dalvezout evit ar verourien",
        "revdelete-unrestricted": "dilemel ar strishadurioù evit ar verourien",
+       "logentry-block-block": "$1 {{GENDER:$2|Stanket}} eo bet {{GENDER:$4|$3}} gant $1 e-pad $5 $6",
+       "logentry-block-unblock": "{{GENDER:$2|Distanket}} eo bet {{GENDER:$4|$3}} gant $1",
+       "logentry-block-reblock": "{{GENDER:$2|Kemmet}} eo bet gant $1 doareoù stankañ {{GENDER:$4|$3}} gant ur pad kevatal da $5 $6",
+       "logentry-suppress-block": "{{GENDER:$2|Stanket}} eo bet {{GENDER:$4|$3}} gant $1 e-pad $5 $6",
+       "logentry-suppress-reblock": "{{GENDER:$2|Kemmet}} eo bet gant $1 doareoù stankañ {{GENDER:$4|$3}} e-pad $5 $6",
+       "logentry-import-upload": "{{GENDER:$2|Enporzhiet}} eo bet $3 dre bellgargañ gant $1",
+       "logentry-import-upload-details": "{{GENDER:$2|Enporzhiet}} eo bet $3 gant $1 dre bellgargañ restroù ($4 {{PLURAL:$4|adweladenn}})",
+       "logentry-import-interwiki": "{{GENDER:$2|Enporzhiet}} eo bet $3 gant $1 adalek ur wiki all",
+       "logentry-import-interwiki-details": "{{GENDER:$2|Enporzhiet}} eo bet $3 adalek $5 gant $1 ($4 {{PLURAL:$4|adweladenn}})",
+       "logentry-merge-merge": "$1 {{GENDER:$2|en deus lakaet|he deus lakaet}} $3 da gendeuziñ e $4 (adweladennoù betek $5)",
        "logentry-move-move": "$1 en deus kaset ar bajenn $3 da $4",
        "logentry-move-move-noredirect": "kaset ar bajenn $3 da $4 gant $1 hep adkas",
        "logentry-move-move_redir": "kaset ar bajenn $3 da $4 gant $1 dreist un adkas",
        "logentry-newusers-create2": "Gant $1 eo bet krouet ar gont implijer $3",
        "logentry-newusers-byemail": "Krouet eo bet ar gont implijer $3 gant $1 ha kaset eo bet ar ger-tremen dre bostel",
        "logentry-newusers-autocreate": "{{GENDER:$2|Krouet}} eo bet kont $1 ent emgefre",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|en deus|he deus}} cheñchet an arventennoù gwarez eus $4 da $3",
+       "logentry-protect-unprotect": "{{GENDER:$2|Lamet eo bet}} gwarez $3 gant $1",
        "logentry-protect-protect": "$1 {{GENDER:$2|en|he}} deus gwarezet $3 $4",
+       "logentry-protect-protect-cascade": "{{GENDER:$2|Gwarezet eo bet}} $3 $4 [dre skalierad] gant $1",
+       "logentry-protect-modify": "{{GENDER:$2|KEmmet eo bet}} live gwareziñ $3 $4 gant $1",
+       "logentry-protect-modify-cascade": "{{GENDER:$2|Kemmet eo bet}} live gwareziñ $3 $4 [dre skalierad] gant $1",
+       "logentry-rights-rights": "{{GENDER:$2|Kemmet eo bet}} gant $1 emezeladur {{GENDER:$6|$3}} er strollad eus $4 da $5",
+       "logentry-rights-rights-legacy": "$1 {{GENDER:$2|Kemmet eo bet}} gant $1 emezeladur $3 er strollad",
        "logentry-rights-autopromote": "$1 zo bet {{GENDER:$2|anvet}} ent emgefre a $4 da $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|en deus|he deus}} ezporzhiet $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|en deus|he deus}} ezporzhiet ur stumm nevez eus $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|en deus|he deus}} ezporzhiet $3",
+       "log-name-managetags": "Marilh merañ an tikedennoù",
+       "log-description-managetags": "Rollañ a ra ar bajenn-mañ an trevelloù liammet ouzh an [[Special:Tags|tikedennoù]]. N'eus er marilh nemet an oberoù bet kaset da benn dre zorn gant ur merour ; gallout a rafe ar meziant wiki bezañ bet krouet tikedennoù hep na vefent bet enrollet er marilh-mañ.",
+       "logentry-managetags-create": "{{GENDER:$2|Krouet eo bet}} an dikedenn \"$4\" gant $1",
+       "logentry-managetags-delete": "{{GENDER:$2|Diverket eo bet}} an dikedenn \"$4\" gant $1 (lamet diouzh $5 {{PLURAL:$5|adweladenn pe ur marilh moned}})",
+       "logentry-managetags-activate": "{{GENDER:$2|Gweredekaet eo bet}} an dikedenn \"$4\" gant $1 a dalvez evit an implijerien hag ar robotoù",
+       "logentry-managetags-deactivate": "{{GENDER:$2|Diweredekaet eo bet}} an dikedenn \"$4\" gant $1 a dalvez evit an implijerien hag ar robotoù",
+       "log-name-tag": "Marilh tikedennoù",
+       "log-description-tag": "Diskouez a ra ar bajenn-mañ pegoulz ez eus bet ouzhpennet pe dilamet [[Special:Tags|tikedennoù]] gant implijerien diouzh adweladennoù hiniennel pe monedoù marilh. N'eo ket rollet gant ar marilh an oberoù tikedenniñ pa'z int bet graet en ur gemmañ, diverkañ pe en ur ober un dra bennak all damheñvel",
+       "logentry-tag-update-add-revision": "$1 {{GENDER:$2|en deus ouzhpennet|he deus ouzhpennet}} {{PLURAL:$7|an dikedenn|an tikedennoù}} $6 da adweladennn $4 ar bajenn $3",
+       "logentry-tag-update-add-logentry": "$1 {{GENDER:$2|end eus ouzhpennet|he deus ouzhpennet}}  {{PLURAL:$7|an dikedenn|an tikedennoù}} $6 da voned ar marilh $5 eus ar bajenn $3",
+       "logentry-tag-update-remove-revision": "$1 {{GENDER:$2|en deus lamet kuit|he deus lamet kuit}} {{PLURAL:$9|an dikedenn|an tikedennoù}} $8 diouzh adweladenn $4 ar bajenn $3",
+       "logentry-tag-update-remove-logentry": "$1 {{GENDER:$2|en deus lamet kuit|he deus lamet kuit}}  {{PLURAL:$9|an dikedenn|an tikedennoù}} $8 diouzh moned marilh $5 ar bajenn $3",
+       "logentry-tag-update-revision": "$1 {{GENDER:$2|en deus hizivaet|he deus hizivaet}} tikedennoù en adweladenn $4 ar bajenn $3 ({{PLURAL:$7|ouzhpennet}} $6; {{PLURAL:$9|dilamet}} $8)",
+       "logentry-tag-update-logentry": "$1 {{GENDER:$2|en deus hizivaet|he deus hizivaet}} tikedennoù e moned ar marilh $5 eus ar bajenn $3 ({{PLURAL:$7|ouzhpennet}} $6; {{PLURAL:$9|dilamet}} $8)",
        "rightsnone": "(netra)",
        "rightslogentry-temporary-group": "$1 (da c'hortoz, betek $2)",
        "feedback-adding": "Oc'h ouzhpennañ ho soñj war ar bajenn...",
        "feedback-bugornote": "Ma'z oc'h prest da zeskrivañ ur gudenn deknikel dre ar munud e c'hallit [$1 kemenn un draen].\nA-hend-all e c'hallit ober gant ar furmskrid eeunaet dindan. Ouzhpennet e vo hoc'h evezhiadenn d'ar bajenn \"[$3 $2]\", a-gevret gant hoc'h anv implijer hag anv ar merdeer a rit gantañ.",
        "feedback-cancel": "Nullañ",
        "feedback-close": "Graet",
+       "feedback-external-bug-report-button": "Kas un trevell teknikel",
+       "feedback-dialog-title": "Kas evezhiadennoù",
+       "feedback-dialog-intro": "Gallout a rit ober gant ar furmskrid eeun dindan evit kas hoc'h evezhiadennoù. Ouzhpennet e vo ho soñj d'ar bajenn \"$1\", a-gevret gant hoc'h anv implijer.",
        "feedback-error1": "Fazi : disoc'h dianav a-berzh an API",
        "feedback-error2": "Fazi : N'eus ket bet gallet degemer ar c'hemmoù",
        "feedback-error3": "Fazi : respont ebet a-berzh an API",
+       "feedback-error4": "Fazi : dibosupl eo embann gant an titl zo bet lakaet d'an evezhiadenn",
        "feedback-message": "Kemennadenn :",
        "feedback-subject": "Danvez :",
        "feedback-submit": "Kas",
+       "feedback-terms": "Kompren a ran ervat emañ e-barzh titouroù ma gwazour implijer titouroù diwar-benn ma merdeer ha stumm ma reizhiad korvoiñ hag a vo rannet gant an holl asambles gant ma evezhiadennoù.",
+       "feedback-termsofuse": "A-du emaon da gas evezhiadennoù diouzh an termenoù implij.",
        "feedback-thanks": "Ho trugarekaat ! Postet eo bet hoc'h evezhiadenn d'ar bajenn \"[$2 $1]\".",
        "feedback-thanks-title": "Trugarez !",
+       "feedback-useragent": "Gwazour timplijer :",
        "searchsuggest-search": "Klask e {{SITENAME}}",
        "searchsuggest-containing": "ennañ...",
        "api-error-badtoken": "Fazi diabarzh : \"jedouer\" fall.",
        "limitreport-walltime-value": "$1 {{PLURAL:$1|eiladenn}}",
        "limitreport-ppvisitednodes": "Niver a skoulmoù rakprosesor gweladennet",
        "limitreport-ppgeneratednodes": "Niver a skoulmoù rakprosesor ganet",
+       "limitreport-postexpandincludesize": "Ment ensoc'hañ goude an emled",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|okted}}",
        "limitreport-templateargumentsize": "Ment arguzenn ar patrom",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|okted}}",
        "expand_templates_generate_xml": "Gwelet ar gwezennadur XML",
        "expand_templates_generate_rawhtml": "Diskouez an HTML kriz",
        "expand_templates_preview": "Rakwelet",
+       "expand_templates_preview_fail_html": "<em>Dre m'eo gweredekaet HTML kriz {{SITENAME}} ha dre ma'z eus bet kollet roadennoù e-pad an dalc'h eo kuzhet ar rakwel abalamour d'en em wareziñ diouzh tagadennoù JavaScript.</em>\n\n<strong>Klaskit en-dro m'eo dinoaz ho koulenn rakwel.</strong>\nMa ne'z a ket en-dro c'hoazh, klaskit [[Special:UserLogout|digevreañ]] hag adkevreañ goude-se, goude bezañ gwiriet mat eo digor ho merdeer d'an toupinoù evit al lec'hienn-mañ.",
+       "expand_templates_preview_fail_html_anon": "<em>Dre m'eo gweredekaet HTML kriz {{SITENAME}} ha dre ma n'oc'h ket kevreet eo kuzhet ar rakwel abalamour d'en em wareziñ diouzh tagadennoù JavaScript.</em>\n\n<strong>M'eo dinoaz ho koulenn rakwel, [[Special:UserLogin|kevreit]] ha klaskit en-dro.</strong>",
+       "expand_templates_input_missing": "Ret eo deoc'h lakaat da nebeutañ un tamm testenn moned.",
        "pagelanguage": "Kemmañ yezh ar bajenn",
        "pagelang-name": "Pajenn",
        "pagelang-language": "Yezh",
        "pagelang-submit": "Kas",
        "pagelang-nonexistent-page": "N'eus ket eus ar bajenn $1.",
        "pagelang-unchanged-language": "Kefluniet eo c'hoazh ar bajenn $1 e $2.",
+       "pagelang-unchanged-language-default": "Arventennet eo ar bajenn $1 evit bezañ e yezh dre ziouer danvez ar wiki dija.",
+       "pagelang-db-failed": "N'en deus ket gallet an diaz roadennoù cheñch yezh ar bajenn",
        "right-pagelang": "Cheñch yezh ar bajenn",
        "action-pagelang": "cheñch yezh ar bajenn",
        "log-name-pagelang": "Marilh ar cheñchamantoù yezh",
        "log-description-pagelang": "Hemañ zo ur marilh eus ar c'hemmoù e pajenn ar yezhoù.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|en deus|he deus}} cheñchet yezh ar bajenn $3 eus $4 da $5.",
+       "default-skin-not-found": "Hopala ! N'haller ket tizhout gwiskadur dre ziouer ho wiki termenet gant <code dir=\"ltr\">$wgDefaultSkin</code> evel <code>$1</code>.\n\nEvit doare emañ ar {{PLURAL:$4|gwiskadur|gwiskadurioù}} da heul en ho staliadur. Sellit ouzh [https://www.mediawiki.org/wiki/Manual:Skin_configuration dornlevr kefluniañ ar gwiskadurioù] evit gouzout penaos gweredekaat {{PLURAL:$4|anezhañ|anezho}} ha dibab an hini dre ziouer.\n\n$2\n\n; M'emaoc'h o paouez staliañ MediaWiki :\n: eo bet staliet ganeoc'h adalek git moarvat, pe war-eeun adalek ar c'hod tarzh gant un doare bennak all. Normal eo. Klaskit staliañ ar gwiskadurioù adalek [https://www.mediawiki.org/wiki/Category:All_skins kavlec'h gwiskadurioù mediawiki.org], dre :\n:* Pellgargañ [https://www.mediawiki.org/wiki/Download restr tar ar stalier], zo ennañ meus a wiskadur hag astennoù. Gallout a rit eilañ pegañ ar c'havlec'h <code>skins/</code> alese.\n:* Pellgargañ restroù tar ar gwiskadurioù hiniennel adalek [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Pellgargañ gwiskadurioù gant Git].\n: Ma rit evel-se ne zlefe ket trubuilhañ ho sanailh git ma'z oc'h un diorroer eus MediaWiki.\n\n; M'emaoc'h o paouez hizivaat MediaWiki :\n: Ne vez ket mui gweredekaet ent emgefre ar gwiskadurioù stalier gant MediaWiki 1.24 ha pelloc'h (gwelet [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery dornlevr dizoleiñ ar gwiskadurioù ent emgefre]). Pegañ {{PLURAL:$5|al linenn da heul|al linennoù da heul}} a c'hallit e <code>LocalSettings.php</code> evit gweredekaat {{PLURAL:$5|ar gwiskadur zo staliet c'hoazh|an holl wiskadurioù staliet evit poent}} :\n\n<pre dir=\"ltr\">$3</pre>\n\n; M'emaoc'h o paouez cheñch <code>LocalSettings.php</code> :\n: gwiriit div wech anv ar gwiskadurioù kuit na vije vioù-koukoug.",
+       "default-skin-not-found-no-skins": "Hopala ! N'hallet ket tizhout gwiskadur dre ziouer ho wiki termenet gant <code>$wgDefaultSkin</code> comme <code>$1</code>.\n\nN'eus bet staliet gwiskadur ebet.\n\n; M'emaoc'h o paouez staliañ pe hizivaat MediaWiki :\n: Eo bet graet ganeoc'h adalek git moarvat, pe war-eeun adalek ar c'hod tarzh gant un doare bennak all. Normal eo. Abaoe MediaWiki 1.24 ha pelloc'h n'eus mui gwiskadur ebet er sanailh pennañ. Klaski staliañ gwiskadurioù adalek [https://www.mediawiki.org/wiki/Category:All_skins kavlec'h gwiskadurioù mediawiki.org], dre :\n:* Pellgargañ [https://www.mediawiki.org/wiki/Download restr tar ar stalier] zo ennañ meus a seurt gwiskadur hag astennoù. Gallout a rit eilan-pegañ ar c'havlec'h <code>skins/</code> alese.\n:* Pellgargañ restroù tar ar gwiskadurioù hiniennel adalek [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Ober gant Git evit pellgargañ gwiskadurioù].\n: Ma rit evel-se ne zlefe ket trubuilhañ ho sanailh git ma'z oc'h un diorroer eus MediaWiki. Gwelet [https://www.mediawiki.org/wiki/Manual:Skin_configuration dornlevr kefluniañ ar gwiskadurioù] evit gouzout an doare da weredekaat ar gwiskadurioù ha da zibab an hini dre ziouer.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (gweredekaet)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>diweredekaet</strong>)",
        "mediastatistics": "Stadegoù ar media",
+       "mediastatistics-summary": "Stadegoù diwar-benn ar seurt restroù enporzhiet. Ne gemer e kont nemet stumm nevesañ ar restroù. A-gostez e vez laosket ar stummoù kozh pe diverket.",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 okted|$1 a oktedoù}} ($2; $3%)",
+       "mediastatistics-bytespertype": "Ment hollek ar restr evit ar rann-mañ : {{PLURAL:$1|$1 okted}} ($2; $3%).",
+       "mediastatistics-allbytes": "Ment hollek evit an holl restrom : {{PLURAL:$1|$1 okted}} ($2).",
        "mediastatistics-table-mimetype": "Seurt MIME",
        "mediastatistics-table-extensions": "Astennoù hag a c'haller lakaat",
        "mediastatistics-table-count": "Niver a restroù",
        "mediastatistics-header-drawing": "Tresadennoù (skeudennoù vektorel)",
        "mediastatistics-header-audio": "Kleved",
        "mediastatistics-header-video": "Videoioù",
+       "mediastatistics-header-multimedia": "Media fonnus",
        "mediastatistics-header-office": "Burev",
        "mediastatistics-header-text": "Testenn",
+       "mediastatistics-header-executable": "Parzhioù erounezadus",
        "mediastatistics-header-archive": "Furmadoù gwasket",
        "mediastatistics-header-total": "An holl restroù",
        "json-warn-trailing-comma": "$1 {{PLURAL:$1|virgulenn|a virgulennoù}} dibenn zo bet lamet eus JSON",
        "json-error-unknown": "Ur gudenn a oa gant ar JSON. Fazi : $1",
        "json-error-depth": "Aet eur en tu all da zonder brasañ an torn",
        "json-error-state-mismatch": "JSON direizh pe stummet fall",
+       "json-error-ctrl-char": "Fazi arouezenn gontrolliñ. Enkodet eo bet fall marteze.",
        "json-error-syntax": "Fazi ereadur",
        "json-error-utf8": "Arouezennoù UTF-8 stummet fall, enkodet en un doare direizh marteze",
+       "json-error-recursion": "Bez' ez eus unan pe meur a zaveenn rekursivel en talvoud da enkodiñ",
+       "json-error-inf-or-nan": "Bez' ez eus unan pe meur a dalvoud NAN pe INF en talvoud da enkodiñ",
+       "json-error-unsupported-type": "Lakaet ez eus bet ur seurt talvoud n'hall ket bezañ enkodet.",
        "headline-anchor-title": "Liamm war-zu ar rannbennad-mañ",
        "special-characters-group-latin": "Latin",
        "special-characters-group-latinextended": "Latin astennet",
        "special-characters-group-thai": "Thai",
        "special-characters-group-lao": "Laoseg",
        "special-characters-group-khmer": "Khmer",
+       "special-characters-title-endash": "tired berr",
+       "special-characters-title-emdash": "tired hir",
+       "special-characters-title-minus": "arouezenn nemet",
+       "mw-widgets-dateinput-no-date": "N'eus bet diuzet deiziad ebet",
+       "mw-widgets-mediasearch-input-placeholder": "Klask mediaoù",
        "mw-widgets-mediasearch-noresults": "N'eus bet kavet disoc'h ebet.",
        "mw-widgets-titleinput-description-new-page": "N'eus ket eus ar bajenn-se c'hoazh",
        "mw-widgets-titleinput-description-redirect": "adkas war-zu $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Ouzhpennañ ur rummad...",
        "mw-widgets-usersmultiselect-placeholder": "Ouzhpennañ muioc'h...",
+       "sessionmanager-tie": "N'hallet ket kevrediñ meur a seurt reked dilesañ : $1.",
        "sessionprovider-generic": "$1 estez",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "Eztez diazezet war toupinoù",
        "sessionprovider-nocookies": "Marteze eo diweredekaet an toupinoù. Bezit sur eo gweredekaet an toupinoù ha klaskit en-dro.",
        "log-action-filter-suppress-reblock": "Diverkañ implijerien dre stankadennoù lies",
        "log-action-filter-upload-upload": "Enporzhiadenn nevez",
        "log-action-filter-upload-overwrite": "Adenporzhiañ",
+       "authmanager-authn-not-in-progress": "Ne'z a ket war-raok an dilesadur pe kollet ez eus bet roadennoù dalc'h marteze. Adkrogit adalek ar penn-kentañ.",
        "authmanager-authn-no-primary": "N'eus ket bet gallet gwiriañ an titouroù kred lakaet.",
+       "authmanager-authn-no-local-user": "An titouroù anaout pourchaset n'int ket liammet gant implijer ebet er wiki-mañ.",
        "authmanager-authn-no-local-user-link": "Reizh eo an titouroù kred lakaet met n'int ket liammet ouzh implijer ebet eus ar wiki-mañ. Ma kevreit en ur mod all pe ma krouit ur gont implijer nevez e c'hallot liammañ ho titouroù kred kent ouzh ar gont-mañ.",
+       "authmanager-authn-autocreate-failed": "C'hwitet eo bet krouidigezh ur gont lec'hel ent emgefre : $1",
        "authmanager-change-not-supported": "N'haller ket cheñch an titouroù kred rak netra na rafe ganto.",
        "authmanager-create-disabled": "Diweredekaet eo ar c'hrouiñ kontoù.",
        "authmanager-create-from-login": "Evit krouiñ ho kont, leuniit ar maeziennoù.",
+       "authmanager-create-not-in-progress": "Ne'z a ket war-raok krouidigezh ar gont pe kollet ez eus bet roadennoù dalc'h marteze. Adkrogit adalek ar penn-kentañ.",
        "authmanager-create-no-primary": "N'eus ket bet gallet implijout an titouroù kred lakaet evit krouiñ ur gont.",
+       "authmanager-link-no-primary": "Ne c'hallomp ket liammañ ur gont gant an titouroù anaout pourchaset.",
+       "authmanager-link-not-in-progress": "Ne'z a ket war-raok al liammañ kontoù pe kollet ez eus bet roadennoù dalc'h marteze. Adkrogit adalek ar penn-kentañ.",
        "authmanager-authplugin-setpass-failed-title": "C'hwitet eo bet ar cheñchamant ger-tremen",
+       "authmanager-authplugin-setpass-failed-message": "Nac'het eo bet cheñch ar ger-tremen gant an adveziant dilesa.",
+       "authmanager-authplugin-create-fail": "Nac'het eo bet krouiñ ar gont gant an adveziant dilesa.",
+       "authmanager-authplugin-setpass-denied": "N'eo ket aotreet cheñch gerioù-tremen gant an adveziant dilesa.",
        "authmanager-authplugin-setpass-bad-domain": "Domani direizh.",
+       "authmanager-autocreate-noperm": "N'haller ket krouiñ kontoù ent emgefre.",
+       "authmanager-autocreate-exception": "Diweredekaet eo bet ar c'hrouiñ kontoù evit ar mare abalamour da fazioù kent.",
        "authmanager-userdoesnotexist": "N'eo ket enrollet ar gont implijer \"$1\".",
+       "authmanager-userlogin-remembermypassword-help": "Daoust ha rankout a reer derc'hel soñj eus ar ger-tremen pelloc'h eget pad an dalc'h.",
        "authmanager-username-help": "Anv implijer evit ar gwiriekaat.",
        "authmanager-password-help": "Ger-tremen evit ar gwiriekaat.",
        "authmanager-domain-help": "Domani evit ar gwiriekaat diavaez.",
        "authmanager-realname-label": "Anv gwir",
        "authmanager-realname-help": "Anv gwir an implijer",
        "authmanager-provider-password": "Gwiriekadur diazezet war ur ger-termen",
+       "authmanager-provider-password-domain": "Dilesadur diazezet war ur ger-tremen hag an domani",
        "authmanager-provider-temporarypassword": "Ger-tremen da c'hortoz",
+       "authprovider-confirmlink-message": "Diwar an taolioù-esae diwezhañ graet ganeoc'h evit kevreañ e c'haller liammañ ar c'hontoù da heul ouzh ho kont wiki. Ur wech liammet e c'hallit kevreañ dre ar c'hontoù-se. Diuzit ar re zo da vezañ liammet.",
        "authprovider-confirmlink-request-label": "Kontoù a zlefe bezañ liammet",
        "authprovider-confirmlink-success-line": "$1: bet liammet ervat.",
+       "authprovider-confirmlink-failed": "N'omp ket deuet a-benn da liamm ar gont : $1",
+       "authprovider-confirmlink-ok-help": "Kenderc'hel goude bezañ diskwelet kemennadennoù c'hwitadenn al liammañ.",
        "authprovider-resetpass-skip-label": "Lammat",
        "authprovider-resetpass-skip-help": "Lammat adderaouekaat ar ger-tremen.",
+       "authform-nosession-login": "Mat eo bet an dilesadur met ho merdeer n'eo ket evit \"kaout soñj\" eo bet kevreet.\n\n$1",
+       "authform-nosession-signup": "Krouet eo bet ar gont ervat met ho merdeer n'eo ket evit \"kaout soñj\" eo bet kevreet.\n\n$1",
        "authform-newtoken": "Jedouer a vank. $1",
        "authform-notoken": "Jedouer a vank",
        "authform-wrongtoken": "Jedouer fall",
        "specialpage-securitylevel-not-allowed-title": "Berzet",
+       "specialpage-securitylevel-not-allowed": "Ho tigarez, n'oc'h ket aotreet d'ober gant ar bajenn-mañ rak n'eus ket bet gallet gwiriañ piv oc'h.",
        "authpage-cannot-login": "N'haller ket kregiñ da gevreañ",
+       "authpage-cannot-login-continue": "Dibosupl kenderc'hel gant ar gevreadenn. Echu eo an dalc'h evit doare.",
        "authpage-cannot-create": "N'haller ket kregiñ da grouiñ ar gont.",
+       "authpage-cannot-create-continue": "Dibosupl eo kenderc'hel da grouiñ ar gont. Echu eo an dalc'h evit doare.",
        "authpage-cannot-link": "Dibosupl kregiñ da liammañ ar gont.",
        "authpage-cannot-link-continue": "Dibosupl kenderc'hel da liammañ ar gont. Aet eo an eztez d'he zermen moarvat.",
        "cannotauth-not-allowed-title": "Aotre nac'het",
        "unlinkaccounts": "Diliammañ ar c'hontoù",
        "unlinkaccounts-success": "Diliammet eo bet ar gont.",
        "authenticationdatachange-ignored": "N'eus ket bet gallet cheñch ho roadennoù anaout. Marteze a-wac'h peogwir ne oa ket bet kefluniet pourvezer ebet.",
+       "userjsispublic": "Notit mat : ne zlefe ket bezañ roadennoù personel en ispajennoù JavaScript rak an implijerien all a c'hall gwelet anezho.",
+       "usercssispublic": "Notit mat : ne zlefe ket bezañ roadennoù personel en ispajennoù CSS rak an implijerien all a c'hall gwelet anezho.",
        "restrictionsfield-badip": "Chomlec'h IP pe lijorenn direizh : $1",
        "restrictionsfield-label": "Lijorennoù IP aotreet :",
        "restrictionsfield-help": "Ur chomlec'h IP pe un esaouenn CIDR dre linenn. Evit gweredekaat pep tra, ober gant <pre>0.0.0.0/0\n::/0</pre>",
index e8161bc..fb4b3c3 100644 (file)
        "selfredirect": "<strong>Avís:</strong> Esteu redirigint la pàgina a si mateixa.\nPodeu haver especificat un objectiu erroni per a la redirecció, o potser esteu modificant una pàgina incorrecta.\nSi feu clic a «{{int:savearticle}}» una vegada més, la redirecció es crearà de totes maneres.",
        "missingcommenttext": "Introduïu un comentari a continuació.",
        "missingcommentheader": "<strong>Recordatori:</strong> no heu proporcionat un assumpte/encapçalament per al comentari.\nSi feu clic de nou al botó «{{int:savearticle}}», la vostra contribució es desarà sense cap.",
-       "summary-preview": "Previsualització del resum:",
+       "summary-preview": "Previsualització del resum de modificació:",
        "subject-preview": "Previsualització de l’assumpte:",
        "previewerrortext": "S'ha produït un error quan es provava de previsualitzar els canvis.",
        "blockedtitle": "L'usuari està blocat",
        "page_first": "primera",
        "page_last": "última",
        "histlegend": "Simbologia: (act) = diferència amb la versió actual,\n(prev) = diferència amb la versió anterior, m = modificació menor",
-       "history-fieldset-title": "Cerca a l'historial",
-       "history-show-deleted": "Només esborrats",
+       "history-fieldset-title": "Cerca revisions",
+       "history-show-deleted": "Només revisions esborrades",
        "histfirst": "més antigues",
        "histlast": "més noves",
        "historysize": "({{PLURAL:$1|1 octet|$1 octets}})",
        "prefs-help-prefershttps": "Aquesta preferència tindrà efecte quan inicieu una nova sessió.",
        "prefswarning-warning": "Heu fet canvis a les preferències que encara no s'han desat.\nSi abandoneu la pàgina sense fer clic a «$1», les preferències no s'actualitzaran.",
        "prefs-tabs-navigation-hint": "Consell: Podeu utilitzar les tecles de cursor de dreta i esquerra per a navegar entre les pestanyes.",
-       "userrights": "Gestió dels permisos d’usuari",
+       "userrights": "Permisos d'usuari",
        "userrights-lookup-user": "Seleccioneu un usuari",
        "userrights-user-editname": "Introduïu un nom d'usuari:",
        "editusergroup": "Carrega els grups d'usuari",
        "userrights-groupsmember": "Membre de:",
        "userrights-groupsmember-auto": "Membre implícit de:",
        "userrights-groupsmember-type": "$1",
-       "userrights-groups-help": "Podeu modificar els grups als quals pertany {{GENDER:$1|aquest usuari|aquesta usuària}}.\n* Una casella marcada significa que {{GENDER:$1|l’usuari|la usuària}} pertany a aquest grup.\n* Una casella no marcada significa que {{GENDER:$1|l’usuari|la usuària}} no pertany a aquest grup.\n* Un asterisc (*) indica que no {{GENDER:$1|el|la}} podreu treure del grup una vegada l'hàgiu afegit o viceversa.",
+       "userrights-groups-help": "Podeu modificar els grups als quals pertany {{GENDER:$1|aquest usuari|aquesta usuària}}.\n* Una casella marcada significa que {{GENDER:$1|l’usuari|la usuària}} pertany a aquest grup.\n* Una casella no marcada significa que {{GENDER:$1|l’usuari|la usuària}} no pertany a aquest grup.\n* Un asterisc (*) indica que no {{GENDER:$1|el|la}} podreu treure del grup una vegada l'hàgiu afegit o viceversa.\n* Un coixinet (#) indica que només podeu retardar la data d'expiració d'aquest grup i que no la podeu avançar.",
        "userrights-reason": "Motiu:",
        "userrights-no-interwiki": "No teniu permisos per a editar els permisos d'usuari d'altres wikis.",
        "userrights-nodatabase": "La base de dades $1 no existeix o no és local.",
        "userrights-expiry-existing": "Temps de venciment actual: $3, $2",
        "userrights-expiry-othertime": "Altre temps:",
        "userrights-expiry-options": "1 dia:1 day,1 setmana:1 week,1 mes:1 month,3 mesos:3 months,6 mesos:6 months,1 any:1 year",
+       "userrights-invalid-expiry": "La data d'expiració per al grup «$1» no és vàlida.",
        "userrights-conflict": "Conflicte de canvis dels permisos d'usuari. Reviseu i confirmeu els canvis.",
        "group": "Grup:",
        "group-user": "Usuaris",
        "rcfilters-invalid-filter": "Filtre no vàlid",
        "rcfilters-empty-filter": "No hi ha cap filtre actiu. Es mostren totes les contribucions.",
        "rcfilters-filterlist-title": "Filtres",
+       "rcfilters-filterlist-whatsthis": "Què és això?",
        "rcfilters-highlightbutton-title": "Ressalta els resultats",
        "rcfilters-highlightmenu-title": "Selecciona un color",
+       "rcfilters-highlightmenu-help": "Seleccioneu un color per ressaltar la propietat",
        "rcfilters-filterlist-noresults": "No s'ha trobat cap filtre",
+       "rcfilters-noresults-conflict": "No s'ha trobat cap resultat perquè els criteris de cerca són en conflicte",
+       "rcfilters-state-message-fullcoverage": "Seleccionant tots els filtres en un grup és el mateix que no seleccionar-ne cap, de manera que aquest filtre no té cap efecte. El grup inclou: $1",
        "rcfilters-filtergroup-registration": "Registre d'usuari",
        "rcfilters-filter-registered-label": "Registrats",
        "rcfilters-filter-registered-description": "Editors que han iniciat sessió",
        "rcfilters-filter-bots-description": "Modificacions fetes per eines automatitzades.",
        "rcfilters-filter-humans-label": "Humà (no bot)",
        "rcfilters-filter-humans-description": "Modificacions fetes per editors humans.",
+       "rcfilters-filtergroup-reviewstatus": "Estat de revisió",
+       "rcfilters-filter-patrolled-label": "Patrullat",
+       "rcfilters-filter-patrolled-description": "Modificacions marcades com a patrullades.",
+       "rcfilters-filter-unpatrolled-label": "No patrullat",
+       "rcfilters-filter-unpatrolled-description": "Modificacions no marcades com a patrullades.",
        "rcfilters-filtergroup-significance": "Significació",
        "rcfilters-filter-minor-label": "Modificacions menors",
        "rcfilters-filter-minor-description": "Modificacions que l'autor va etiquetar com a menors.",
        "upload-too-many-redirects": "L'URL conté massa redireccions",
        "upload-http-error": "Ha ocorregut un error HTTP: $1",
        "upload-copy-upload-invalid-domain": "Les càrregues de còpia no són disponibles des d'aquest domini.",
+       "upload-foreign-cant-upload": "Aquest wiki no està configurat per pujar fitxers al repositori extern sol·licitat.",
        "upload-dialog-disabled": "La càrrega de fitxers utilitzant aquest quadre de diàleg està desactivada en aquest wiki.",
        "upload-dialog-title": "Carrega un fitxer",
        "upload-dialog-button-cancel": "Cancel·la",
        "unusedimages": "Fitxers no utilitzats",
        "wantedcategories": "Categories demanades",
        "wantedpages": "Pàgines demanades",
+       "wantedpages-summary": "Llista de pàgines no existents amb el major nombre d'enllaços cap a elles, excloent-ne les pàgines que només hi enllacen amb redireccions. Per a una llista de pàgines no existents que tenen redireccions que hi enllacen, vegeu la [[{{#special:BrokenRedirects}}|llista de redireccions trencades]].",
        "wantedpages-badtitle": "Títol invàlid al conjunt de resultats: $1",
        "wantedfiles": "Fitxers demanats",
        "wantedfiletext-cat": "Els fitxers següents s'utilitzen per no existeixen. Els fitxers de repositoris aliens poden ser llistats encara que existeixin. Aquells que siguin fals positius es <del>ratllaran</del>. A més, les pàgines que tinguin fitxers incrustats que no existeixin es llistaran a [[:$1]].",
        "editcomment": "El resum d'edició és: <em>$1</em>.",
        "revertpage": "Revertides les edicions de [[Special:Contributions/$2|$2]] ([[User talk:$2|discussió]]) a l'última versió de [[User:$1|$1]]",
        "revertpage-nouser": "Edicions revertides per un usuari ocult a l'última revisió de {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "Edicions revertides de $1; s'ha canviat a la darrera versió de $2.",
+       "rollback-success": "Revertides les edicions de {{GENDER:$3|$1}}; recuperant la darrera versió de {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Modificacions revertides per $1;\ns'ha revertit a la darrera versió de $2. [$3 Mostra els canvis]",
        "sessionfailure-title": "Error de sessió",
        "sessionfailure": "S'ha produït un error amb la vostra sessió. S'ha anul·lat aquesta acció en prevenció de pirateig de sessió. Premeu «Torna», recarregueu la pàgina des d'on veniu i torneu-ho a intentar.",
        "undeletedrevisions": "{{PLURAL:$1|Una revisió restaurada|$1 revisions restaurades}}",
        "undeletedrevisions-files": "{{PLURAL:$1|Una revisió|$1 revisions}} i {{PLURAL:$2|un fitxer|$2 fitxers}} restaurats",
        "undeletedfiles": "$1 {{PLURAL:$1|fitxer restaurat|fitxers restaurats}}",
-       "cannotundelete": "Hi ha hagut un error en el procés de restauració:\n$1",
+       "cannotundelete": "Hi ha hagut un error en algunes o totes les restauracions:\n$1",
        "undeletedpage": "'''S'ha restaurat «$1»'''\n\nConsulteu el [[Special:Log/delete|registre d'esborraments]] per a veure els esborraments i els restauraments més recents.",
        "undelete-header": "Vegeu [[Special:Log/delete|el registre d'eliminació]] per a veure les pàgines eliminades recentment.",
        "undelete-search-title": "Cerca de pàgines esborrades",
        "proxyblockreason": "S'ha blocat la vostra adreça IP perquè és un proxy obert. Contactau el vostre proveïdor d'Internet o servei tècnic i informau-los d'aquest seriós problema de seguretat.",
        "sorbsreason": "La vostra adreça IP està llistada com a servidor intermediari (''proxy'') obert dins la llista negra de DNS que fa servir el projecte {{SITENAME}}.",
        "sorbs_create_account_reason": "La vostra adreça IP està llistada com a servidor intermediari (''proxy'') obert a la llista negra de DNS que utilitza el projecte {{SITENAME}}. No podeu crear-vos-hi un compte",
+       "softblockrangesreason": "Les aportacions anònimes no són admeses des de la vostra adreça IP ($1). Inicieu una sessió.",
        "xffblockreason": "Una adreça IP present en la capçalera X-Forwarded-For, sigui vostra o la d'un servidor proxy que esteu utilitzant, ha estat blocada. El motiu inicial del bloqueig és: $1",
        "cant-see-hidden-user": "L'usuari que esteu intentant blocar ja ha estat blocat i ocultat. Com que no teniu el permís hideuser no podeu veure ni modificar el seu blocatge.",
        "ipbblocked": "No podeu blocar o desblocar altres usuaris, perquè vós {{GENDER:|mateix|mateixa|mateix}} esteu {{GENDER:|blocat|blocada|blocat}}.",
        "pageinfo-article-id": "ID de la pàgina",
        "pageinfo-language": "Llengua del contingut de la pàgina",
        "pageinfo-language-change": "canvia",
-       "pageinfo-content-model": "Plantilla de contingut de pàgina",
+       "pageinfo-content-model": "Model de contingut de la pàgina",
        "pageinfo-content-model-change": "canvia",
        "pageinfo-robot-policy": "Indexació per robots",
        "pageinfo-robot-index": "Permès",
        "invalidateemail": "Cancel·lació d'adreça electrònica",
        "notificationemail_subject_changed": "L'adreça registrada de {{SITENAME}} ha canviat",
        "notificationemail_subject_removed": "L'adreça registrada de {{SITENAME}} ha estat suprimida",
+       "notificationemail_body_changed": "Algú des de l'adreça IP $1, probablement vós, ha canviat l'adreça de correu electrònic del compte a {{SITENAME}} de «$2» a «$3».\n\nSi no heu estat vós mateix, contacteu immediatament amb un administrador del lloc.",
+       "notificationemail_body_removed": "Algú des de l'adreça IP $1, probablement vós, ha eliminat l'adreça de correu electrònic «$2» del compte a {{SITENAME}}.\n\nSi no heu estat vós mateix, contacteu immediatament amb un administrador del lloc.",
        "scarytranscludedisabled": "[S'ha inhabilitat la transclusió interwiki]",
        "scarytranscludefailed": "[Ha fallat la recuperació de la plantilla per a $1]",
        "scarytranscludefailed-httpstatus": "[Ha fallat la recuperació de la plantilla per a $1: HTTP $2]",
        "scarytranscludetoolong": "[L'URL és massa llarg]",
        "deletedwhileediting": "'''Avís''': S'ha eliminat aquesta pàgina després que haguéssiu començat a modificar-la!",
-       "confirmrecreate": "L'usuari [[User:$1|$1]] ([[User talk:$1|discussió]]) va eliminar aquesta pàgina que havíeu creat donant-ne el següent motiu:\n: ''$2''\nConfirmeu que realment voleu tornar-la a crear.",
-       "confirmrecreate-noreason": "L'{{GENDER:$1|usuari|usuària}} [[User:$1|$1]] ([[User talk:$1|discussió]]) va esborrar aquesta pàgina després que la comencéssiu a modificar. Si us plau, confirmeu que realment voleu tornar-la a crear.",
+       "confirmrecreate": "{{GENDER:$1|L'usuari|La usuària}} [[User:$1|$1]] ([[User talk:$1|discussió]]) va eliminar aquesta pàgina que havíeu creat donant-ne el següent motiu:\n: <em>$2</em>\nConfirmeu que realment voleu tornar-la a crear.",
+       "confirmrecreate-noreason": "{{GENDER:$1|L'usuari|La usuària}} [[User:$1|$1]] ([[User talk:$1|discussió]]) va esborrar aquesta pàgina després que la comencéssiu a modificar. Confirmeu que realment voleu tornar-la a crear.",
        "recreate": "Torna a crear",
        "confirm_purge_button": "D'acord",
        "confirm-purge-top": "Voleu buidar la memòria cau d'aquesta pàgina?",
        "timezone-local": "Local",
        "duplicate-defaultsort": "Atenció: La clau d'ordenació per defecte \"$2\" invalida l'anterior clau \"$1\".",
        "duplicate-displaytitle": "<strong>Avís:</strong> El títol a mostrar «$2» sobreescriu l'anterior títol a mostrar «$1».",
+       "restricted-displaytitle": "<strong>Avís:</strong> El títol a mostrar «$1» ha estat ignorat ja que no és equivalent al títol real de la pàgina.",
        "invalid-indicator-name": "<strong>Error:</strong> No pot estar buit l'atribut <code>name</code> dels indicadors d'estat de la pàgina.",
        "version": "Versió",
        "version-extensions": "Extensions instal·lades",
        "version-libraries-license": "Llicència",
        "version-libraries-description": "Descripció",
        "version-libraries-authors": "Autors",
-       "redirect": "Redirigeix per fitxer, usuari, pàgina o ID de la revisió",
-       "redirect-summary": "Aquesta pàgina especial redirigeix a un fitxer (donat el nom del fitxer), una pàgina (donats un ID de la revisió o un ID de pàgina), o a una pàgina d'usuari (donat un ID numèric d'usuari). Ús: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], or [[{{#Special:Redirect}}/user/101]].",
+       "redirect": "Redirigeix per identificador de fitxer, usuari, pàgina, revisió o registre",
+       "redirect-summary": "Aquesta pàgina especial redirigeix a un fitxer (donat el nom del fitxer), a una pàgina (donats un ID de la revisió o un ID de pàgina), a una pàgina d'usuari (donat un ID numèric d'usuari) o a una entrada de registre (donat l'ID de registre). Ús: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]] o [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "Vés-hi",
        "redirect-lookup": "Consulta:",
        "redirect-value": "Valor:",
        "tags-delete-not-allowed": "Les etiquetes definides per una extensió no es poden esborrar tret que l'extensió ho permeti específicament.",
        "tags-delete-not-found": "L'etiqueta «$1» no existeix.",
        "tags-delete-too-many-uses": "L'etiqueta «$1» s'aplica a més {{PLURAL:$2|d'$2 revisió|de $2 revisions}} i, per tant, no pot eliminar-se.",
-       "tags-delete-warnings-after-delete": "L'etiqueta \"$1\" ha estat esborrada satisfactòriament, però {{PLURAL:$2|s'ha registrat l'advertència següent|s'han registrat les advertències següents}}:",
+       "tags-delete-warnings-after-delete": "L'etiqueta «$1» ha estat esborrada, però {{PLURAL:$2|s'ha registrat l'advertència següent|s'han registrat les advertències següents}}:",
        "tags-delete-no-permission": "No teniu permisos per a eliminar les etiquetes de canvis.",
        "tags-activate-title": "Activa l'etiqueta",
        "tags-activate-question": "Esteu a punt d'activar l'etiqueta «$1».",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|ha protegit}} $3 $4 [en cascada]",
        "logentry-protect-modify": "$1 {{GENDER:$2|ha canviat}} el nivell de protecció de $3 $4",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|ha canviat}} el nivell de protecció de $3 $4 [en cascada]",
-       "logentry-rights-rights": "$1 {{GENDER:$2|ha canviat}} la pertinença de grup per $3 de $4 a $5",
+       "logentry-rights-rights": "$1 {{GENDER:$2|ha canviat}} la pertinença de grup per {{GENDER:$6|$3}} de $4 a $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|ha canviat}} la pertinença de grup per $3",
        "logentry-rights-autopromote": "$1 ha estat {{GENDER:$2|promogut}} automàticament de $4 a $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|ha carregat}} $3",
        "api-error-emptypage": "No es permet la creació de pàgines noves en blanc.",
        "api-error-publishfailed": "Error intern: el servidor no ha pogut publicar el fitxer temporal.",
        "api-error-stashfailed": "Error intern: el servidor no ha pogut emmagatzemar fitxers temporals.",
-       "api-error-unknown-warning": "Avís desconegut: $1",
+       "api-error-unknown-warning": "Avís desconegut: «$1».",
        "api-error-unknownerror": "Error desconegut: «$1».",
        "duration-seconds": "$1 {{PLURAL:$1|segon|segons}}",
        "duration-minutes": "$1 {{PLURAL:$1|minut|minuts}}",
        "log-name-pagelang": "Registre de canvi de llengua",
        "log-description-pagelang": "Aquest és un registre dels canvis en les llengües de les pàgines.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|ha canviat}} la llengua de $3 de $4 a $5",
-       "default-skin-not-found": "Òndia! L'aparença per defecte per al wiki, definit en <code dir=\"ltr\">$wgDefaultSkin</code> com <code>$1</code>, no està disponible.\n\nLa vostra instal·lació sembla que inclou les següents aparences. Consulteu [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Configuració d'aparences] per a la informació de com habilitar-les i triar-ne el valor per defecte.\n\n$2\n\n; Si heu acabat d'instal·lar MediaWiki:\n: Probablement l'instal·làveu des de git, o directament des del codi font utilitzant algun altre mètode. Això és l'esperat. Intenteu instal·lar algunes aparences des del [https://www.mediawiki.org/wiki/Category:All_skins directori d'aparences de mediawiki.org], per:\n: * Descarregar l'[https://www.mediawiki.org/wiki/Download instal·lador tarball], que ve amb diverses aparences i ampliacions. Podeu copiar i enganxar el directori <code>skins/</code> des d'aquí.\n: * Clonar un dels repositoris <code>mediawiki/skins/*</code> a través de git en el directori <code dir=\"ltr\">skins/</code> de la vostra instal·lació de MediaWiki.\n: Fent això no s'hauria d'interferir amb el vostre dipòsit git si sou un desenvolupador de MediaWiki.\n\n; Si només heu actualitzat MediaWiki:\n: Per MediaWiki 1.24 i posteriors ja no permet aparences instal·lades automàticament (consulteu [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Aparences autodiscovery]). Podeu enganxar les línies següents en <code>LocalSettings.php</code> per permetre totes les aparences instal·lades actualment:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Si només heu modificat <code>LocalSettings.php</code>:\n: Reviseu els noms de l'aparença per errors tipogràfics.",
-       "default-skin-not-found-no-skins": "Òndia! L'aparença per defecte pel vostre wiki, definida a <code>$wgDefaultSkin</code> com <code>$1</code>, no està disponible.\n\nNo teniu cap aparença instal·lada.\n\n\n; Si heu acabat d'instal·lar o actualitzar MediaWiki:\n: Probablement l'heu instal·lat des de git, o directament des del codi font utilitzant algun altre mètode. Això és l'esperat. Per MediaWiki 1.24 i posteriors ja no s'inclouen aparences en el repositori principal. Proveu d'instal·lar algunes aparences des del [https://www.mediawiki.org/wiki/Category:All_skins directori d'aparences de mediawiki.org] per:\n: * Descarregar l'[https://www.mediawiki.org/wiki/Download instal·lador ''tarball''], que ve amb diverses aparences i extensions. Podeu copiar i enganxar el directori <code>skins/</code> des d'aquí.\n: * Clonar un dels repositoris <code>mediawiki/skins/*</code> a través de git en el directori <code dir=\"ltr\">skins/</code> de la vostra instal·lació de MediaWiki.\n: Fent això no s'hauria d'interferir amb el vostre repositori de git si sou un desenvolupador de MediaWiki. Consulteu [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration] per a més informació sobre com permetre aparences i triar-ne per defecte.",
+       "default-skin-not-found": "Vaja! L'aparença per defecte per al wiki, definit en <code dir=\"ltr\">$wgDefaultSkin</code> com <code>$1</code>, no està disponible.\n\nLa vostra instal·lació sembla que inclou {{PLURAL:$4|la següent aparença|les següents aparences}}. Consulteu [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Configuració d'aparences] per a la informació de com habilitar-{{PLURAL:$4|la|les i triar-ne una per defecte}}.\n\n$2\n\n; Si heu acabat d'instal·lar MediaWiki:\n: Probablement l'instal·làveu des de git, o directament des del codi font utilitzant algun altre mètode. Això és l'esperat. Intenteu instal·lar algunes aparences des del [https://www.mediawiki.org/wiki/Category:All_skins directori d'aparences de mediawiki.org], per:\n: * Descarregar l'[https://www.mediawiki.org/wiki/Download instal·lador tarball], que ve amb diverses aparences i ampliacions. Podeu copiar i enganxar el directori <code>skins/</code> des d'aquí.\n: * Descarregar tarballs de skin individuals de [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Usar Git per a descarregar skins].\n: Fent això no s'hauria d'interferir amb el vostre dipòsit git si sou un desenvolupador de MediaWiki.\n\n; Si només heu actualitzat MediaWiki:\n: Per MediaWiki 1.24 i posteriors ja no permet aparences instal·lades automàticament (consulteu [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Aparences autodiscovery]). Podeu enganxar {{PLURAL:$5|la línia següent|les línies següents}} en <code>LocalSettings.php</code> per permetre {{PLURAL:$5|l'aparença instal·lada|totes les aparences instal·lades}} actualment:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Si només heu modificat <code>LocalSettings.php</code>:\n: Assegureu-vos que no hi hagi errors tipogràfics en els noms de l'aparença.",
+       "default-skin-not-found-no-skins": "Vaja! L'aparença per defecte pel vostre wiki, definida a <code>$wgDefaultSkin</code> com <code>$1</code>, no està disponible.\n\nNo teniu cap aparença instal·lada.\n\n\n; Si heu acabat d'instal·lar o actualitzar MediaWiki:\n: Probablement l'heu instal·lat des de git, o directament des del codi font utilitzant algun altre mètode. Això és l'esperat. Per MediaWiki 1.24 i posteriors ja no s'inclouen aparences en el repositori principal. Proveu d'instal·lar algunes aparences des del [https://www.mediawiki.org/wiki/Category:All_skins directori d'aparences de mediawiki.org] per:\n: * Descarregar l'[https://www.mediawiki.org/wiki/Download instal·lador ''tarball''], que ve amb diverses aparences i extensions. Podeu copiar i enganxar el directori <code>skins/</code> des d'aquí.\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Usar Git per a descarregar aparences].\n: Fent això no s'hauria d'interferir amb el vostre repositori de git si sou un desenvolupador de MediaWiki. Consulteu [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration] per a més informació sobre com permetre aparences i triar-ne per defecte.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (habilitat)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>inhabilitat</strong>)",
        "mediastatistics": "Estadístiques dels multimèdia",
        "log-action-filter-managetags-delete": "Supressió de l'etiqueta",
        "log-action-filter-managetags-activate": "Activació de l'etiqueta",
        "log-action-filter-managetags-deactivate": "Desactivació d'etiquetes",
+       "log-action-filter-newusers-create": "Creació per usuari anònim",
        "log-action-filter-newusers-create2": "Creació per usuari registrat",
        "log-action-filter-newusers-autocreate": "Creació automàtica",
        "log-action-filter-patrol-patrol": "Patrullatge manual",
index 4806964..d99a3ad 100644 (file)
        "view-foreign": "Tan-awa sa $1",
        "edit": "Usba",
        "create": "Himoa",
+       "create-local": "Pagpuno og lokal nga deskripsyon",
        "editthispage": "Usba kining panid",
        "create-this-page": "Himoa kining panid",
        "delete": "Papasa",
        "newarticle": "(Bag-o)",
        "newarticletext": "Mitulpok ka sa sumpay ngadto sa usa ka wala pa masulat nga panid.\nAron mahimo ang maong panid, pagtayp sa kahon sa ubos (tan-awa ang [$1 panid sa tabang] alang sa dugang impormasyon).\nKon miabot ka dinhi pinaagi sa usa ka sayop, palihog tuploka ang back nga tuplokanan sa imong brawser.",
        "noarticletext": "Sa kasamtangan walay sulod nga teksto kining panid.\nPuyde nimong [[Special:Search/{{PAGENAME}}|pangitaon kining titulo sa panid]] sa ubang mga panid, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pangitaa ang mga may kalabotan nga log],\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} mugnaa kining panid]</span>.",
+       "noarticletext-nopermission": "Sa kasamtangan walay sulod nga teksto kining panid.\nPuyde nimong [[Special:Search/{{PAGENAME}}|pangitaon kining titulo sa panid]] sa ubang mga panid, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pangitaa ang mga may kalabotan nga log]</span>, apan wala kay katungod nga mohimo ning maong panid.",
        "userpage-userdoesnotexist": "Ang akawnt sa tiggamit nga \"<nowiki>$1</nowiki>\" wala marehistro. Palihug tan-awa kon buot nimong himoon/usbon ang kining panid.",
        "previewnote": "'''Hinumdomi nga kini usa lang ka paunang tan-aw; wala pa matipigi ang imong giusab!'''",
        "editing": "Nagausab sa $1",
        "nextn-title": "Sunod nga $1 {{PLURAL:$1|resulta|mga resulta}}",
        "shown-title": "Pagpakita og $1 {{PLURAL:$1|ka resulta|ka mga resulta}} matag panid",
        "viewprevnext": "Tan-awa sa ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchmenu-new": "<strong>Mugnaa ang panid nga \"[[:$1]]\" dinhi ning maong wiki!</strong> {{PLURAL:$2|0=|Tan-awa usab ang panid nga nakit-an sa imong pagpangita.|Tan-awa usab ang mga resulta sa pagpangita.}}",
        "searchprofile-articles": "Mga panid sa sulod",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Tanan",
        "enhancedrc-history": "kaagi",
        "recentchanges": "Mga bag-ong giusab",
        "recentchanges-legend": "Mga opsyon sa bag-ong pag-usab",
+       "recentchanges-summary": "Bantayi ang kinabag-ohang mga pag-usab sa wiki dinhi niining panid.",
        "recentchanges-feed-description": "Bantayi ang kinabag-ohang mga pag-usab sa wiki niining feed.",
        "recentchanges-label-newpage": "Kining pag-usab nagmugna og bag-ong panid",
        "recentchanges-label-minor": "Ginagmay nga pag-usab",
        "rcshowhideliu": "$1 ka mga gumagamit ang natala",
        "rcshowhideliu-hide": "Tagoa",
        "rcshowhideanons": "$1 mga wala mailhing gumagamit",
+       "rcshowhideanons-show": "Ipakita",
        "rcshowhideanons-hide": "Tagoa",
        "rcshowhidemine": "$1 akong mga pag-usab",
        "rcshowhidemine-hide": "Tagoa",
        "recentchangeslinked-to": "Ipakita na lang ang mga pag-usab sa mga panid nga nakasumpay sa nahatag nga panid",
        "upload": "Pagsumiter og payl",
        "uploadlogpage": "Log sa upload",
+       "filedesc": "Mubong sugid:",
        "license": "Paglilisensya:",
        "license-header": "Pagtugot",
        "file-anchor-link": "Payl",
        "exif-xresolution": "Resolusyon (pahigda)",
        "exif-yresolution": "Resolusyon (pabarog)",
        "exif-datetime": "Petsa ug oras sa pagkausab sa payl",
+       "exif-make": "Tighimo sa kamera",
+       "exif-model": "Model sa kamera",
+       "exif-software": "Programa nga gigamit",
+       "exif-exifversion": "Bersyon sa Exif",
        "exif-colorspace": "<i>Color space</i>",
+       "exif-datetimeoriginal": "Petsa ug oras sa pag-<i>generate</i> sa <i>data</i>",
+       "exif-datetimedigitized": "Petsa ug oras sa pag-<i>digitize</i>",
+       "exif-orientation-1": "Normal",
        "namespacesall": "tanan",
        "monthsall": "tanan",
        "watchlisttools-view": "Tan-awa ang may kalabotan nga mga pag-usab",
        "specialpages": "Espesyal nga mga panid",
        "tag-filter": "[[Special:Tags|Tag]] nga pilter:",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|Mga tag}}]]: $2)",
+       "logentry-delete-delete": "Si $1 {{GENDER:$2|mipapas}} sa panid nga $3",
        "revdelete-restricted": "mga na-aplay nga restriksyon sa mga tagdumala",
        "revdelete-unrestricted": "gitangtang ang mga restriksyon alang sa mga tagdumala",
        "logentry-newusers-create": "Ang akawnt nga $1 {{GENDER:$2|namugna}}",
index 3933338..d1865db 100644 (file)
        "no-null-revision": "نەتوانرا پێداچوونەوەی خاڵیی بۆ پەڕەی \"$1\" درووست بکرێت",
        "badtitle": "سەرناوی خراپ",
        "badtitletext": "سەرناوی پەڕەی داواکراو بەتاڵە، واڵایە یان سەرناوێکی نێوان-زمانی یان نێوانی-ویکییە کە بە شێوەیەکی ھەڵە بەستەری بۆ دراوە.\nڕەنگە یەک یان چەند کاراکتەری تێدا بێت کە ناکرێت لە سەرناوەکاندا بەکار بھێنرێت.",
+       "title-invalid-empty": "ئەو پەڕەیەی داواکراوە بەتاڵە یان تەنھا لە بۆشایی-ناو پێکھاتووە.",
+       "title-invalid-talk-namespace": "ئەو ناوی پەڕەیەی داواکراوە ئاماژە بۆ پەڕەیەکی وتووێژ دەکات کە نابێت ھەبێت.",
+       "title-invalid-characters": "سەرناوی ئەو پەڕەیەی داواکراوە کارەکتەرێکی ھەڵەی تێدا بەکارھاتووە: «$1».",
        "perfcached": "داتای خوارەوە پاشەکەوتکراوەیە و لەوانەیە بەڕۆژنەکرابێتەوە. لانی زۆر {{PLURAL:$1|یەک ئەنجام|$1 ئەنجام}} لە cacheدا لەبەردەستدایە.",
        "perfcachedts": "داتای خوارەوە cacheکراوە و دوایین جار لە $1 نوێ کراوەتەوە. لە cacheدا لانی زۆر {{PLURAL:$4|یەک ئەنجام|$4 ئەنجام}} لەبەردەستە.",
        "querypage-no-updates": "تازەکردنەوەکان بۆ ئەم پەڕە لە حاڵی ئێستادا ناچالاک کراوەتەوە.\nداتای ئێرە دەسبەجێ تازە ناکرێتەوە.",
        "eauthentsent": "ئیمێلێکی پشتڕاستکردنەوە بۆ ناونیشانی ئیمێلی دیاریکراو نێررا.\nپێش ئەوەی ئیمەیلی تر بۆ ئەم ھەژمارە بنێررێت، دەبێت پەیڕەوی ڕێکارەکانی ناو ئیمێلەکە بکەیت بۆ پشتڕاستکردنەوەی ئەوەی کە ئەم هەژمارە بە ڕاستی ھی تۆیە.",
        "throttled-mailpassword": "ئیمەیلێکی ڕیکخستنەوەی تێپەڕوشە لە ماوەی {{PLURAL:$1|ساعەت}}ی ڕابردوودا نێردراوە.\nبۆ ڕێگری لە بەکارھێنانی خراپ، ھەر {{PLURAL:$1|ساعەت}} تاکە یەک ئیمەیلی ڕیکخستنەوەی تێپەڕوشە دەنێردرێت.",
        "mailerror": "هەڵە ڕوویدا لە ناردنی ئیمەیل: $1",
-       "acct_creation_throttle_hit": "بینەرانی ویکی بەکەڵک وەرگرتن لەم ئای‌پی ئەدرەسەی تۆ لە ڕۆژانی ڕابردوودا، دەستیان کردە بە درووست‌کردنی {{PLURAL:$1|هەژمارە}}، کە زۆرینە ڕیگەپێدان لە یەک ماوە‌دایە.\nوەک ئەنجامی ئەو ڕووداوە، ئەو بینەرانی لەم ئای‌پی ئەدرەسە کەڵک وەر دەگرن لەم کاتەدا ناتوانن هەژماری دیکە درووست‌بکەن.",
+       "acct_creation_throttle_hit": "بینەرانی ویکی بەکەڵک وەرگرتن لەم ناونیشانی ئای-پییەی تۆ لە ڕۆژانی ڕابردوودا، دەستیان کردە بە درووست‌کردنی {{PLURAL:$1|هەژمارە}}، کە زۆرینە ڕیگەپێدان لە یەک ماوە‌دایە.\nوەک ئەنجامی ئەو ڕووداوە، ئەو بینەرانی لەم ئای‌پی ئەدرەسە کەڵک وەر دەگرن لەم کاتەدا ناتوانن هەژماری دیکە درووست‌بکەن.",
        "emailauthenticated": "ناونیشانی ئیمەیلەکەت پشتڕاست کرایەوە لە $3ی $2دا.",
        "emailnotauthenticated": "ناونیشانی ئیمەیلەکەت ھێشتا پشتڕاست نەکراوتەوە.\nھیچ ئیمەیلێک بۆ ئەم تایبەتمەندییانەی ژێرەوە نانێردرێت.",
        "noemailprefs": "بۆ کەوتنە کاری ئەو تایبەتمەندیانە، لە هەڵبژاردەکانت ئەدرەسەکی ئی‌مێڵ دابین بکە.",
        "pt-createaccount": "ھەژمار دروست بکە",
        "pt-userlogout": "بچۆ دەرەوە",
        "user-mail-no-addy": "ھەوڵی ناردنی ئیمەڵ درا بەبێ ھەبوونی ناونیشانێکی ئیمەیڵ.",
+       "user-mail-no-body": "ھەوڵی ناردنی پۆستی ئەلیکترۆنی درا بە ناوەڕۆکێکی بەتاڵ یان زۆر کورت.",
        "changepassword": "تێپەڕوشە بگۆڕە",
        "resetpass_announce": "بۆ کۆتایی چوونە ژوورەوە، دەبێت تێپەڕوشەیەکی نوێ دابنێیت.",
        "resetpass_text": "<!-- تێپه‌ڕه‌وشه‌ی هه‌ژماره‌كه‌ سفر بكه‌ره‌وه‌ -->",
        "changepassword-throttled": "تۆ ھەوڵی زۆری چوونەژوورەوەت داوە. \nتکایە $1 چاوەڕوان بە پێش دووبارە ھەوڵدانەوە.",
        "botpasswords": "تێپەڕ وشەی بۆت",
        "botpasswords-disabled": "تێپەڕ وشەی بۆتەکان کوژێنرانەوە.",
+       "botpasswords-no-central-id": "بۆ بەکارھێنانی تێپەڕوشەی بۆت، دەبێت بە ھەژمارێکی جێگیر بچیتە ژوورەوە.",
+       "botpasswords-createnew": "تێپەڕوشەیەکی بۆتی نوێ دروست بکە",
+       "botpasswords-editexisting": "تێپەڕوشەیەک کە ھەیە دەستکاری بکە",
        "botpasswords-label-appid": "ناوی بۆت",
        "botpasswords-label-create": "دروستکردن",
        "botpasswords-label-update": "نوێکردنەوە",
        "botpasswords-label-delete": "سڕینەوە",
        "botpasswords-label-resetpassword": "ڕێکخستنەوەی تێپەڕوشە",
        "botpasswords-bad-appid": "ناوی بۆت «$1» دروست نییە.",
+       "botpasswords-insert-failed": "نەتواندرا ناوی بۆت «$1» زیاد بکرێت. ئایا پێشووتر زیاد کراوە؟",
+       "botpasswords-update-failed": "نەتواندرا ناوی بۆت «$1» نوێ بکرێتەوە. ئایا سڕدراوەتەوە؟",
        "botpasswords-created-title": "تێپەڕ وشەی بۆت دروست کرا",
+       "botpasswords-created-body": "تێپەڕوشەی بۆت بۆ بۆتی «$1» بەکارھێنەر «$2» دروست کرا.",
        "botpasswords-updated-title": "تێپەڕ وشەی بۆتەکە نوێ کرایەوە",
+       "botpasswords-updated-body": "تێپەڕ وشەی بۆت بۆ «$1»ی بەکارھێنەر «$2» نوێ کرایەوە.",
        "botpasswords-deleted-title": "تێپەڕ وشەی بۆت سڕدرایەوە",
        "resetpass_forbidden": "تێپەڕوشەکە ناگۆڕدرێت",
        "resetpass-no-info": "بۆ گەیشتنی راستەوخۆ بەم پەڕە ئەشێ بچیتە ژوورەوە.",
        "undo-summary": "گەڕاندنەوەی پێداچوونەوەی $1 لە لایەن [[Special:Contributions/$2|$2]] ([[User talk:$2|لێدوان]])",
        "undo-summary-username-hidden": "پوچەڵکردنەوەی دەستکاری $1 لەلایەن بەکارھێنەرێکی شاردراوەوە.",
        "cantcreateaccount-text": "درووست‌کردنی هەژمارە بۆ ناونیشانی ئای‌پی ('''$1''') لە لایەن [[User:$3|$3]] داخراوە.<br /><br />\n$3 هۆکاری \"$2\" خستوەتەڕوو",
+       "cantcreateaccount-range-text": "دروستکردنی ھەژمار لە مەودای ناونیشانی ئای-پی <strong>$1</strong>، کە ئای-پییەکەی تۆش لەخۆ دەگرێت (<strong>$4</strong>)، بەربەست کراوە لەلایەن [[User:$3|$3]]. \n\nھۆکاری بەربەستنکردنەکەی کە دراوە لەلایەن $3 ئەمەیە: <em>$2</em>",
        "viewpagelogs": "لۆگەکانی ئەم پەڕەیە ببینە",
        "nohistory": "هیچ مێژوویەکی دەستکاری نییە بۆ ئەم پەڕەیە.",
        "currentrev": "دوایین پێداچوونەوە",
        "search-interwiki-caption": "پرۆژە خوشکەکان",
        "search-interwiki-default": "ئاکام لە $1:",
        "search-interwiki-more": "(زیاتر)",
+       "search-interwiki-more-results": "ئەنجامی زیاتر",
        "search-relatedarticle": "پەیوەست",
        "searchrelated": "پەیوەست",
        "searchall": "ھەموو",
        "prefs-editing": "دەستکاریکردن",
        "searchresultshead": "گەڕان",
        "stub-threshold": "سنوور بۆ شێوازی <a href=\"#\" class=\"stub\">بەستەری کۆڵکە</a> (بایت):",
+       "stub-threshold-sample-link": "نموونە",
        "stub-threshold-disabled": "ناچالاک",
        "recentchangesdays": "ژمارە ڕۆژە نیشاندراوەکان لە دوایین گۆڕانکارییەکان:",
        "recentchangesdays-max": "(ئەوپەڕی $1 {{PLURAL:$1|ڕۆژە|ڕۆژە}})",
        "gender-unknown": "پێم خۆشە باسی نەکەم",
        "gender-male": "پیاو",
        "gender-female": "ژن",
-       "prefs-help-gender": "دڵخÙ\88از: Ø¨Û\86 Ø¨Ø§Ù\86Ú¯ Ú©Ø±Ø¯Ù\86Û\8c Ø¯Ø±Ù\88ست Ø¨Û\95 Ø¯Û\95ستÛ\8c Ù\86Û\95رÙ\85اÙ\85Û\8eر.\nئÛ\95Ù\85 Ø²Ø§Ù\86Û\8cارÛ\8cÛ\8cÛ\95 Ú¯Ø´ØªÛ\8c Ø¦Û\95بÛ\8e.",
+       "prefs-help-gender": "ئÛ\95Ù\85 Ú¾Û\95ڵبÚ\98اردÛ\95Û\8cÛ\95 Ø¯ÚµØ®Ù\88ازاÙ\86Û\95Û\8cÛ\95.\nبÛ\86 Ø¨Ø§Ù\86گکردÙ\86 Ù\88 Ø¦Ø§Ù\85اÚ\98Û\95Ù¾Û\8eکردÙ\86 Ø¨Û\95 Ø´Û\8eÙ\88Û\95Û\8cÛ\95Ú©Û\8c Ø¯Ø±Ù\88ست Ù\84Û\95Ù\84اÛ\8cÛ\95Ù\86 Ù\86Û\95رÙ\85اÙ\85Û\8eرÛ\95Ù\88Û\95 Ø¨Û\95کاردÛ\8eت.\nئÛ\95Ù\85 Ø²Ø§Ù\86Û\8cارÛ\8cÛ\8cÛ\95 Ú¯Ø´ØªÛ\8c Ø¯Û\95بÛ\8eت.",
        "email": "ئیمەیل",
        "prefs-help-realname": "ناوی ڕاستەقینە دڵخوازە.\nئەگەر بنووسرێت، لەوانەیە بۆ ئاماژەدان بەرھەمەکەت بە کار بھێنرێت.",
        "prefs-help-email": "دانانی ناونیشانی ئیمەیل دڵخوازانەیە، بەڵام ئەگەر تێپەڕوشەکەت لەیادکرد، بۆ نوێ‌کردنەوەی تێپەڕوشە پێویست دەبێت.",
        "prefs-tokenwatchlist": "نیشانە",
        "prefs-diffs": "جیاوازییەکان",
        "prefs-help-prefershttps": "بەکارخستنی ئەم تایبەتمەندییە کاریگەری لەسەر چوونەژوورەوەی داھاتووت دروست دەکات",
-       "userrights": "بەڕێوەبردنی مافەکانی بەکارھێنەر",
-       "userrights-lookup-user": "بەڕێوەبردنی گرووپەکانی بەکارھێنەر",
+       "prefswarning-warning": "تۆ گۆڕانکاریت ئەنجامداوە لە ھەڵبژاردەکانتدا کە ھێشتا پاشەکەوتت نەکردوون. ئەگەر ئەم پەڕەیە بەجێبێڵیت بەبێ کرتەکردن لەسەر «$1» ھەڵبژاردەکانت پاشەکەوت نابن و نوێ نابنەوە.",
+       "prefs-tabs-navigation-hint": "زانیاری: دەتوانیت تیری چەپ و ڕاست بەکاربھێنیت بۆ گەڕان بە ناو تابەکان لە پێڕستی تابەکاندا.",
+       "userrights": "مافەکانی بەکارھێنەر",
+       "userrights-lookup-user": "بەکارھێنەرێک ھەڵبژێرە",
        "userrights-user-editname": "ناوی بەکارهێنەرێک بنووسە:",
-       "editusergroup": "گرÙ\88Ù\88Ù¾Û\95کاÙ\86Û\8c Ø¨Û\95کارھÛ\8eÙ\86Û\95ر Ø¯Û\95ستکارÛ\8c Ø¨Ú©ە",
+       "editusergroup": "گرÙ\88Ù\88Ù¾Û\95کاÙ\86Û\8c Ø¨Û\95کارھÛ\8eÙ\86Û\95ر Ø¨Ø¨Û\8cÙ\86ە",
        "editinguser": "گۆڕینی مافە بەکارھێنەرییەکانی {{GENDER:$1|بەکارھێنەر}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "گرووپە بەکارھێنەرییەکان دەستکاری بکە",
+       "viewinguserrights": "تۆ مافەکانی بەکارھێنەر {{GENDER:$1|بەکارھێنەر}} <strong>[[User:$1|$1]]</strong> $2 دەبینیت",
+       "userrights-editusergroup": "گرووپەکانی {{{{GENDER:$1|بەکارھێنەر}} دەستکاری بکە",
        "userrights-viewusergroup": "بینینی گرووپەکانی {{GENDER:$1|بەکارھێنەر}}",
        "saveusergroups": "گرووپەکانی بەکارھێنەر پاشەکەوت بکە",
        "userrights-groupsmember": "ئەندامە لە:",
        "userrights-groupsmember-auto": "ئەندامی ناڕاشکاوە لە:",
-       "userrights-groups-help": "دەتوانی ئەو گرووپانەی ئەم بەکار‌هێنەرە تێیدایە ئاڵوگۆڕ بکەی:\n* چوارچێوەی نیشان‌کراو یانی بەکارھێنەر لەو گرووپەدا هەیە.\n* چوارچێوەی نیشان‌نەکراو یانی بەکارھێنەر لەو گرووپەدا نییە.\n* ئەستێرەیەک (*) نیشان دەدا ناتوانی ئەو گرووپەی جارێکی تر زیادت کردووە لای‌بەری، و بە پێچەوانە.",
+       "userrights-groups-help": "دەتوانی ئەو گرووپانەی ئەم بەکار‌هێنەرە تێیدایە ئاڵوگۆڕ بکەی:\n* چوارچێوەی نیشانکراو واتە بەکارھێنەر لەو گرووپەدا هەیە.\n* چوارچێوەی نیشاننەکراو واتە بەکارھێنەر لەو گرووپەدا نییە.\n* ئەستێرەیەک (*) نیشان دەدات ناتوانی ئەو گرووپەی جارێکی تر زیادت کردووە لایبەریت، و بە پێچەوانە.",
        "userrights-reason": "هۆکار:",
        "userrights-no-interwiki": "دەسەڵاتی گۆڕینی مافەکانی بەکارهێنەر لە ویکی‌یەکانی دیکەت نیە.",
        "userrights-nodatabase": "بنکەدراوی $1 بوونی نیە یا لەم شوێنە نیە.",
        "userrights-changeable-col": "ئەو گرووپانەی دەتوانی بیگۆڕی",
        "userrights-unchangeable-col": "ئەو گرووپانەی ناتوانی بیگۆڕی",
+       "userrights-expiry-current": "بەسەردەچێ لە $1",
+       "userrights-expiry-none": "بەسەرناچێت",
+       "userrights-expiry": "بەسەردەچێت:",
+       "userrights-expiry-othertime": "کاتی تر:",
+       "userrights-invalid-expiry": "کاتی بەسەرچوون بۆ گرووپی «$1» ھەڵەیە.",
+       "userrights-expiry-in-past": "کاتی بەسەرچوون بۆ گرووپی «$1» لە ڕابردوودایە.",
        "group": "گرووپ:",
        "group-user": "بەکارھێنەران",
        "group-autoconfirmed": "بەکارھێنەرە خۆبەخۆ پەسندکراوەکان",
        "right-override-export-depth": "هەناردنی لاپەڕەکان کە لاپەڕەکانی بەستەر پێ‌دراو تا قووڵایی 5 لەخۆ بگرێت",
        "right-sendemail": "ناردنی ئیمەیل بۆ بەکارھێنەرانی تر",
        "right-managechangetags": "دروستکردن و سڕینەوەی [[Special:Tags|تاگەکان]] لە بنکەدراوە",
+       "right-deletechangetags": "سڕینەوەی [[Special:Tags|tags]] لە بنکەی زانیاری",
+       "grant-group-file-interaction": "مامەڵەکردن لەگەڵ میدیا",
        "grant-group-email": "ناردنی ئیمەیل",
+       "grant-createaccount": "دروستکردنی ھەژمار",
+       "grant-createeditmovepage": "دروستکردن، دەستکاریکردن و گواستنەوەی پەڕەکان",
        "grant-sendemail": "ناردنی ئیمەیل بۆ بەکارھێنەرانی تر",
+       "grant-uploadfile": "بەڕگەی نوێ بار بکە",
+       "grant-basic": "مافی سەرەکی",
+       "grant-viewdeleted": "بینینی پەڕگە و پەڕە سڕدراوەکان",
+       "grant-viewmywatchlist": "دیتنی پێرستی چاودێریت",
        "newuserlogpage": "لۆگی دروستکردنی بەکارھێنەر",
        "newuserlogpagetext": "ئەمە لۆگێکی دروستکردنی بەکارھێنەرە.",
        "rightslog": "لۆگی مافەکانی بەکارھێنەر",
        "rightslogtext": "ئەمە لۆگی دەستکاری مافەکانی بەکار‌هێنەرە.",
        "action-read": "خوێندنەوەی ئەم پەڕەیە",
        "action-edit": "دەستکاریی ئەم پەڕەیە",
-       "action-createpage": "درÙ\88ستکردÙ\86Û\8c Ù¾Û\95Ú\95Û\95کاÙ\86",
-       "action-createtalk": "درÙ\88ستکردÙ\86Û\8c Ù¾Û\95Ú\95Û\95کاÙ\86Û\8c Ù\88تÙ\88Ù\88Û\8eÚ\98",
+       "action-createpage": "ئÛ\95Ù\85 Ù¾Û\95Ú\95Û\95Û\8cÛ\95 Ø¯Ø±Ù\88ست Ø¨Ú©Û\95",
+       "action-createtalk": "ئÛ\95Ù\85 Ù¾Û\95Ú\95Û\95Û\8c Ù\88تÙ\88Ù\88Û\8eÚ\98Û\95 Ø¯Ø±Ù\88ست Ø¨Ú©Û\95",
        "action-createaccount": "دروست کردنی ئەم ھەژماری بەکارھێنەرییە",
        "action-history": "بینینی مێژووی ئەم پەڕەیە",
        "action-minoredit": "نیشان‌کردنی ئەم دەستکاریە وەک بچووک",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ھەروەھا بڕوانە [[Special:NewPages|پێرستی پەڕە نوێکان]])",
        "recentchanges-legend-plusminus": "(''±۱٢٣'')",
        "recentchanges-submit": "نیشانی بدە",
+       "rcfilters-filterlist-whatsthis": "ئەمە چییە؟",
+       "rcfilters-highlightmenu-title": "ڕەنگێکی نوێ ھەڵبژێرە",
+       "rcfilters-filter-editsbyself-label": "مافەکانی خۆت",
+       "rcfilters-filter-editsbyself-description": "دەستکارییەکانی خۆت.",
+       "rcfilters-filter-editsbyother-label": "دەستکارییەکانی کەسانی تر",
+       "rcfilters-filter-user-experience-level-newcomer-label": "تازەکاران",
+       "rcfilters-filter-user-experience-level-newcomer-description": "کەمتر لە ١٠ دەستکاری و ٤ ڕۆژ لە چالاک بوون",
+       "rcfilters-filter-user-experience-level-experienced-label": "بەکارھێنەرانی پێشکەوتوو",
+       "rcfilters-filter-user-experience-level-experienced-description": "زیاتر لە ٣٠ ڕۆژ لە چالاکی و ٥٠٠ دەستکاری",
+       "rcfilters-filter-humans-label": "مرۆڤ (بۆت نییە)",
+       "rcfilters-filter-humans-description": "دەستکارییەکانی لەلایەن مرۆڤەکانەوە ئەنجام دراون",
+       "rcfilters-filter-patrolled-label": "پاسدراو",
+       "rcfilters-filter-patrolled-description": "ئەو دەستکارییانەی وەک پاسدراو دیاریکراون",
+       "rcfilters-filter-minor-label": "دەستکارییە بچووکەکان",
+       "rcfilters-filter-minor-description": "ئەو دەستکارییانەی کە دەستکاریکەر وەک بچووک ناوی بردووە",
+       "rcfilters-filter-major-label": "دەستکارییە نا-بچووکەکان",
        "rcnotefrom": "ژێرەوە {{PLURAL:$5|گۆڕانکارییەکەیە|گۆڕانکارییەکانە}} لە strong>$3، $4</strong>ەوە (ھەتا <strong>$1</strong> نیشان دراوە).",
        "rclistfrom": "گۆڕانکارییە نوێکان نیشان بدە بە دەستپێکردن لە $3 $2",
        "rcshowhideminor": "دەستکارییە بچووکەکان $1",
        "upload-too-many-redirects": "URL ڕەوانەکەری زۆری لەخۆ گرتووە",
        "upload-http-error": "هەڵەیەکی HTTP ڕووئ داوە: $1",
        "upload-dialog-button-cancel": "ھەڵوەشاندنەوە",
+       "upload-dialog-button-back": "گەڕانەوە",
+       "upload-dialog-button-done": "کرا",
+       "upload-dialog-button-save": "پاشەکەوتکردن",
        "upload-dialog-button-upload": "بارکردن",
+       "upload-form-label-infoform-title": "وردەکارییەکان",
+       "upload-form-label-infoform-name": "ناو",
+       "upload-form-label-infoform-description": "شیکردنەوە",
+       "upload-form-label-usage-title": "بەکارھێنان",
+       "upload-form-label-usage-filename": "ناوی پەڕگە",
        "upload-form-label-own-work": "ئەمە کاری خۆمە",
+       "upload-form-label-infoform-categories": "پۆلەكان",
+       "upload-form-label-infoform-date": "ڕێکەوت",
+       "upload-form-label-own-work-message-generic-local": "من دڵنیا دەکەمەوە کە ئەم پەڕگەیە باردەکەم بە گوێڕایەڵیکردنی مەرجەکانی بەکارھێنان و سیاسەتەکانی بەڵگەنامەکانی {{SITENAME}}.",
        "backend-fail-stream": "نەکرا پەڕگەی $1 بنێردرێت.",
        "backend-fail-notexists": "پەڕگەی $1 بوونی نییە.",
        "backend-fail-delete": "نەکرا پەڕگەی $1 بسڕدرێتەوە.",
index 996161a..4ada314 100644 (file)
        "page_first": "první",
        "page_last": "poslední",
        "histlegend": "(teď) = rozdíly oproti nynější verzi, (předchozí) = rozdíly oproti předchozí verzi, <b>m</b> = malá editace",
-       "history-fieldset-title": "Procházení historie",
+       "history-fieldset-title": "Hledat revize",
        "history-show-deleted": "Pouze smazané",
        "histfirst": "nejstarší",
        "histlast": "nejnovější",
index e1d254c..2cb90bb 100644 (file)
        "page_first": "Anfang",
        "page_last": "Ende",
        "histlegend": "Zur Anzeige der Änderungen einfach die zu vergleichenden Versionen auswählen und die Schaltfläche „{{int:compareselectedversions}}“ klicken.<br />\n* ({{int:cur}}) = Unterschied zur aktuellen Version, ({{int:last}}) = Unterschied zur vorherigen Version\n* Uhrzeit/Datum = Version zu dieser Zeit, Benutzername/IP-Adresse des Bearbeiters, {{int:minoreditletter}} = Kleine Änderung",
-       "history-fieldset-title": "In der Versionsgeschichte suchen",
+       "history-fieldset-title": "Nach Versionen suchen",
        "history-show-deleted": "Nur gelöschte Versionen zeigen",
        "histfirst": "älteste",
        "histlast": "neueste",
        "rcfilters-invalid-filter": "Ungültiger Filter",
        "rcfilters-empty-filter": "Keine aktiven Filter. Es werden alle Beiträge angezeigt.",
        "rcfilters-filterlist-title": "Filter",
+       "rcfilters-filterlist-whatsthis": "Was ist das?",
        "rcfilters-filterlist-feedbacklink": "Rückmeldung zu den neuen (Beta-)Filtern hinterlassen",
        "rcfilters-highlightbutton-title": "Ergebnisse hervorheben",
        "rcfilters-highlightmenu-title": "Eine Farbe auswählen",
        "rcfilters-highlightmenu-help": "Eine Farbe auswählen, um diese Eigenschaft hervorzuheben.",
        "rcfilters-filterlist-noresults": "Keine Filter gefunden",
+       "rcfilters-noresults-conflict": "Keine Ergebnisse gefunden, da sich die Suchkriterien in Konflikt befinden.",
+       "rcfilters-state-message-subset": "Dieser Filter hat keinen Effekt, da seine Ergebnisse mit denen {{PLURAL:$2|des folgenden breiteren Filters|der folgenden breiteren Filter}} einbezogen sind (versuche die Hervorhebung, um sie zu unterscheiden): $1",
+       "rcfilters-state-message-fullcoverage": "Das Auswählen aller Filter in einer Gruppe ist das Gleiche wie das Auswählen keines Filters. Deshalb hat dieser Filter keinen Effekt. Die Gruppe enthält: $1",
        "rcfilters-filtergroup-registration": "Benutzerregistrierung",
        "rcfilters-filter-registered-label": "Angemeldet",
        "rcfilters-filter-registered-description": "Angemeldete Autoren.",
        "rcfilters-filter-unregistered-label": "Unangemeldet",
        "rcfilters-filter-unregistered-description": "Autoren, die nicht angemeldet sind.",
-       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Der Filter „Unangemeldet“ ist inaktiv, da sein Effekt durch {{PLURAL:$2|den|die}} folgenden Erfahrungsfilter aufgehoben wird, {{PLURAL:$2|der nur angemeldete Benutzer finden kann|die nur angemeldete Benutzer finden können}}: $1",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Dieser Filter befindet sich in Konflikt mit {{PLURAL:$2|dem folgenden Erfahrungsfilter, der nur angemeldete Benutzer finden kann|den folgenden Erfahrungsfiltern, die nur angemeldete Benutzer finden können}}: $1",
        "rcfilters-filtergroup-authorship": "Bearbeitungs-Autorenschaft",
        "rcfilters-filter-editsbyself-label": "Deine eigenen Bearbeitungen",
        "rcfilters-filter-editsbyself-description": "Bearbeitungen von dir.",
        "rcfilters-filter-editsbyother-label": "Bearbeitungen von anderen",
        "rcfilters-filter-editsbyother-description": "Bearbeitungen von anderen Benutzern (nicht von dir).",
        "rcfilters-filtergroup-userExpLevel": "Erfahrungsniveau (nur für angemeldete Benutzer)",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Dieser Filter ist inaktiv, da er nur angemeldete Benutzer findet, so dass der Filter „Unangemeldet“ seinen Effekt aufhebt.",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Der Filter „Unangemeldet“ befindet sich in Konflikt mit einem oder mehreren Erfahrungsfiltern. Erfahrungsfilter finden nur angemeldete Benutzer. Die kollidierenden Filter sind oben als inaktiv markiert.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Erfahrungsfilter finden nur angemeldete Benutzer. Deshalb befindet sich dieser Filter in Konflikt mit dem Filter „Unangemeldet“.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Der Filter „Unangemeldet“ befindet sich in Konflikt mit einem oder mehreren Erfahrungsfiltern, die nur angemeldete Benutzer finden können. Die kollidierenden Filter sind oben im Bereich der aktiven Filter markiert.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Neulinge",
        "rcfilters-filter-user-experience-level-newcomer-description": "Weniger als 10 Bearbeitungen und eine Aktivität von weniger als 4 Tagen.",
        "rcfilters-filter-user-experience-level-learner-label": "Anfänger",
        "rcfilters-filter-categorization-description": "Einträge von Seiten, die zu Kategorien hinzugefügt oder aus ihnen entfernt wurden.",
        "rcfilters-filter-logactions-label": "Protokollierte Aktionen",
        "rcfilters-filter-logactions-description": "Administrative Aktionen, Benutzerkontenerstellungen, Seitenlöschungen, hochgeladene Dateien …",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "Der Filter „Kleine Bearbeitungen“ kollidiert mit einem oder mehreren Änderungstypfiltern, da bestimmte Änderungstypen nicht als „klein“ festgelegt werden können. Die kollidierenden Filter sind oben im Bereich der aktiven Filter markiert.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Bestimmte Änderungstypen können nicht als „klein“ festgelegt werden, so dass dieser Filter mit den folgenden Änderungstypfiltern kollidiert: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Dieser Änderungstypfilter kollidiert mit dem Filter „Kleine Bearbeitungen“. Bestimmte Änderungstypen können nicht als „klein“ festgelegt werden.",
        "rcnotefrom": "Angezeigt {{PLURAL:$5|wird die Änderung|werden die Änderungen}} seit <strong>$3, $4</strong> (max. <strong>$1</strong> Einträge).",
        "rclistfrom": "Nur Änderungen seit $3, $2 Uhr zeigen.",
        "rcshowhideminor": "Kleine Änderungen $1",
index 860822c..2f9f99b 100644 (file)
        "rev-deleted-text-permission": "Çımraviyarnayışê ena pele '''esteriyo'''.\nBeno ke [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] de teferruat esto.",
        "rev-suppressed-text-permission": "Çımraviyarnayışê ena pele '''degusneyayo'''.\nŞıma be idarekerina xo ra şenê ey bıvênê; beno ke [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} degusnayış] de teferruat esto.",
        "rev-deleted-text-unhide": "Çım ra viyarnayışê enê riperri <strong>esteriya</strong>.\nTeferruati [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} qeydê esterıtışi] yenê diyene.\nŞıma hewna şenê [$1 nê vırnayışi bıvênê], eke wazenê dewam kerê.",
-       "rev-suppressed-text-unhide": "Çımra viyarnayışê ena pele '''Degusneyayo'''.\nBeno ke [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} degustış] de teferruat esto.\nŞıma be idarekerina xo ra şenê hewna [$1 nê çımraviyarnayışi bıvênê], eke wazenê dewam kerê.",
+       "rev-suppressed-text-unhide": "Çım ra viyarnayışê enê riperri <strong>dewesnaeyê</strong>.\nEtıya [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} dewesnayış] de teferruat esto.\nŞıma pê idarekerina xo hewna şenê [$1 nê çım ra viyarnayışi bıvênê], eke wazenê dewam kerê.",
        "rev-deleted-text-view": "Çım ra viyarnayışê enê riperri '''vındarnao'''.\nŞıma şenê bıvênê; teferruat nao naca [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} besternayış].",
        "rev-suppressed-text-view": "Çımraviyarnayışê ena pele '''degusneyayo'''.\nŞıma be idarekerina xo ra şenê ey bıvênê; beno ke [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} degusnayış] de teferruat esto.",
        "rev-deleted-no-diff": "Şıma nêşenê nê ferqi bıvênê, çıke çımraviyarnayışan ra  yew '''esteriyo'''.\nBeno ke [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] de teferruat esto.",
        "rev-suppressed-no-diff": "Revizyon '''esteriyayo\"' aye ra ti nieşkeno ena diff bivine.",
-       "rev-deleted-unhide-diff": "Çımra viyarnayışanê na ferqi ra  yew '''besterneyayo'''.\nBeno ke [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} besternayış] dı teferruat esto.\nŞıma be idarekerina xo ra şenê hewna [$1 nê ferqi bıvênê], eke wazenê dewam kerê.",
+       "rev-deleted-unhide-diff": "Çım ra viyarnayışanê nê ferqi ra  yew '''esterdeo'''.\nEtıya [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} esterey] de teferruat esto.\nŞıma pê idarekerina xo hewna şenê [$1 nê ferqi bıvênê], eke wazenê dewam kerê.",
        "rev-suppressed-unhide-diff": "Nê Timarkerdışi ra yewi '''çap biyo'''.\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rocaneyê vındertışi] de teferru'ati esti.\nEke şıma serkari u devam bıkeri [$1 no vurnayiş şıma eşkeni bıvini].",
        "rev-deleted-diff-view": "Jew timarkerdışê ena versiyon '''wedariyayo''.\nÎdarekarî şenê ena versiyon bivîne; belki tiya de [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} wedarnayişî] de teferruat esto.",
        "rev-suppressed-diff-view": "Jew timarkerdışê ena versiyon '''Ploxneyış'' biyo.\nÎdarekarî eşkeno ena dif bivîne; belki tiya de [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ploxnayış] de teferruat esto.",
index 2ef4f3a..6b1c73d 100644 (file)
        "page_first": "first",
        "page_last": "last",
        "histlegend": "Diff selection: Mark the radio boxes of the revisions to compare and hit enter or the button at the bottom.<br />\nLegend: <strong>({{int:cur}})</strong> = difference with latest revision, <strong>({{int:last}})</strong> = difference with preceding revision, <strong>{{int:minoreditletter}}</strong> = minor edit.",
-       "history-fieldset-title": "Browse history",
+       "history-fieldset-title": "Search for revisions",
        "history-show-deleted": "Revision deleted only",
        "history_copyright": "-",
        "histfirst": "oldest",
        "recentchanges-legend": "Recent changes options",
        "recentchanges-summary": "Track the most recent changes to the wiki on this page.",
        "recentchangestext": "-",
-       "recentchanges-noresult": "No changes during the given period matching these criteria.",
+       "recentchanges-noresult": "No changes during the given period match these criteria.",
        "recentchanges-feed-description": "Track the most recent changes to the wiki in this feed.",
        "recentchanges-label-newpage": "This edit created a new page",
        "recentchanges-label-minor": "This is a minor edit",
        "rcfilters-invalid-filter": "Invalid filter",
        "rcfilters-empty-filter": "No active filters. All contributions are shown.",
        "rcfilters-filterlist-title": "Filters",
+       "rcfilters-filterlist-whatsthis": "What's this?",
        "rcfilters-filterlist-feedbacklink": "Provide feedback on the new (beta) filters",
        "rcfilters-highlightbutton-title": "Highlight results",
        "rcfilters-highlightmenu-title": "Select a color",
        "rcfilters-highlightmenu-help": "Select a color to highlight this property",
        "rcfilters-filterlist-noresults": "No filters found",
+       "rcfilters-noresults-conflict": "No results found because the search criteria are in conflict",
+       "rcfilters-state-message-subset": "This filter has no effect because its results are included with those of the following, broader {{PLURAL:$2|filter|filters}} (try highlighting to distinguish it): $1",
+       "rcfilters-state-message-fullcoverage": "Selecting all filters in a group is the same as selecting none, so this filter has no effect. Group includes: $1",
        "rcfilters-filtergroup-registration": "User registration",
        "rcfilters-filter-registered-label": "Registered",
        "rcfilters-filter-registered-description": "Logged-in editors.",
        "rcfilters-filter-unregistered-label": "Unregistered",
        "rcfilters-filter-unregistered-description": "Editors who aren’t logged in.",
-       "rcfilters-filter-unregistered-conflicts-user-experience-level": "The \"Unregistered\" filter is inactive because its effect is being canceled by the following Experience {{PLURAL:$2|filter|filters}}, which {{PLURAL:$2|finds|find}} only registered users: $1",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "This filter conflicts with the following Experience {{PLURAL:$2|filter|filters}}, which {{PLURAL:$2|finds|find}} only registered users: $1",
        "rcfilters-filtergroup-authorship": "Edit authorship",
        "rcfilters-filter-editsbyself-label": "Your own edits",
        "rcfilters-filter-editsbyself-description": "Edits by you.",
        "rcfilters-filter-editsbyother-label": "Edits by others",
        "rcfilters-filter-editsbyother-description": "Edits created by other users (not you).",
        "rcfilters-filtergroup-userExpLevel": "Experience level (for registered users only)",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "This filter is inactive because it finds only registered users, so the \"Unregistered\" filter is canceling its effect.",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "The \"Unregistered\" filter is in conflict with one or more Experience filters. Experience filters find registered users only. The conflicting filters are marked as inactive above.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Experience filters find only registered users, so this filter conflicts with the “Unregistered” filter.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "The \"Unregistered\" filter conflicts with one or more Experience filters, which find registered users only. The conflicting filters are marked in the Active Filters area, above.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Newcomers",
        "rcfilters-filter-user-experience-level-newcomer-description": "Fewer than 10 edits and 4 days of activity.",
        "rcfilters-filter-user-experience-level-learner-label": "Learners",
        "rcfilters-filter-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.\"",
        "rcnotefrom": "Below {{PLURAL:$5|is the change|are the changes}} since <strong>$3, $4</strong> (up to <strong>$1</strong> shown).",
        "rclistfrom": "Show new changes starting from $2, $3",
        "rcshowhideminor": "$1 minor edits",
index d5c5258..af4e348 100644 (file)
        "login": "Ensaluti",
        "login-security": "Kontrolu vian identecon",
        "nav-login-createaccount": "Ensaluti / Krei novan konton",
-       "userlogin": "Ensaluti / Krei novan konton",
-       "userloginnocreate": "Ensaluti",
        "logout": "Elsaluti",
        "userlogout": "Elsaluti",
        "notloggedin": "Ne ensalutinta",
        "userlogin-noaccount": "Ĉu vi ne havas konton?",
        "userlogin-joinproject": "Aliĝu al {{SITENAME}}",
-       "nologin": "Ĉu vi ne havas konton? $1.",
-       "nologinlink": "Krei konton",
        "createaccount": "Krei konton",
-       "gotaccount": "Ĉu vi jam havas konton? $1.",
-       "gotaccountlink": "Ensaluti",
-       "userlogin-resetlink": "Ĉu vi forgesis ensalutajn detalojn?",
        "userlogin-resetpassword-link": "Ĉu vi forgesis vian pasvorton?",
        "userlogin-helplink2": "Helpo pri ensaluto",
        "userlogin-loggedin": "Vi jam estas ensalutita kiel {{GENDER:$1|$1}}.\nUzu la formularon suben por ensaluti kiel alia uzanto.",
        "createaccountmail": "Uzi provizoran hazardsignan pasvorton kaj sendi ĝin al la retpoŝta adreso ĉi-suba",
        "createaccountmail-help": "Uzebla por krei konton de alia persono sen lerni la pasvorton.",
        "createacct-realname": "Vera nomo (nedeviga)",
-       "createaccountreason": "Kialo:",
        "createacct-reason": "Kialo",
        "createacct-reason-ph": "Kial vi kreas plian konton",
        "createacct-reason-help": "Mesaĝo vidigita en la protokolo pri kreado de konto",
        "savearticle": "Konservi paĝon",
        "savechanges": "Konservi ŝanĝojn",
        "publishpage": "Eldoni paĝon",
-       "publishchanges": "Eldoni ŝanĝojn",
+       "publishchanges": "Pulikigi ŝanĝojn",
        "preview": "Antaŭrigardo",
        "showpreview": "Antaŭrigardo",
        "showdiff": "Montri ŝanĝojn",
        "rcfilters-filter-editsbyother-label": "Redaktoj de aliuloj",
        "rcfilters-filter-editsbyother-description": "Redaktoj kreitaj far aliaj uzantoj (krom vi).",
        "rcfilters-filtergroup-userExpLevel": "Spertonivelo (nur por registritaj uzantoj)",
-       "rcfilters-filter-userExpLevel-newcomer-label": "Novuloj",
-       "rcfilters-filter-userExpLevel-newcomer-description": "Malpli ol 10 redaktoj kaj 4 tagoj de aktiveco.",
-       "rcfilters-filter-userExpLevel-learner-label": "Lernantoj",
-       "rcfilters-filter-userExpLevel-learner-description": "Pliaj tagoj da aktiveco kaj redaktoj ol \"Novuloj\" sed malpli ol \"Spertaj uzantoj\".",
-       "rcfilters-filter-userExpLevel-experienced-label": "Spertaj uzantoj",
-       "rcfilters-filter-userExpLevel-experienced-description": "Pli ol 30 tagoj da aktiveco kaj 500 redaktoj.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Novuloj",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Malpli ol 10 redaktoj kaj 4 tagoj de aktiveco.",
+       "rcfilters-filter-user-experience-level-learner-label": "Lernantoj",
+       "rcfilters-filter-user-experience-level-learner-description": "Pliaj tagoj da aktiveco kaj redaktoj ol \"Novuloj\" sed malpli ol \"Spertaj uzantoj\".",
+       "rcfilters-filter-user-experience-level-experienced-label": "Spertaj uzantoj",
+       "rcfilters-filter-user-experience-level-experienced-description": "Pli ol 30 tagoj da aktiveco kaj 500 redaktoj.",
        "rcfilters-filtergroup-automated": "Aŭtomatigitaj kontribuoj",
        "rcfilters-filter-bots-label": "Roboto",
        "rcfilters-filter-bots-description": "Redaktoj farita de aŭtomatigitaj iloj.",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|ĝisdatigis}} etikedojn de la revizio $4 de la paĝo $3 ({{PLURAL:$7|aldonita|aldonitaj}} $6; {{PLURAL:$9|forigita|forigitaj}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|ĝisdatigis}} etikedojn de la protokolero $5 de la paĝo $3 ({{PLURAL:$7|aldonita|aldonitaj}} $6; {{PLURAL:$9|forigita|forigitaj}} $8)",
        "rightsnone": "(nenia)",
-       "revdelete-summary": "redaktoresumon",
        "feedback-adding": "Aldonanta respondon al la paĝo...",
        "feedback-back": "Reen",
        "feedback-bugcheck": "Bonega! Nur konfirmu ke ĝi ne jam ekzistas inter la [$1 konataj cimoj].",
index 5b5e0e4..f060c4d 100644 (file)
        "page_first": "primeras",
        "page_last": "últimas",
        "histlegend": "Selección de diferencias: marca las casillas correspondientes a las versiones a comparar y pulsa Intro o el botón de abajo.<br />\nLeyenda: <strong>({{int:cur}})</strong> = diferencias con la versión actual,\n<strong>({{int:last}})</strong> = diferencias con la versión anterior, <strong>{{int:minoreditletter}}</strong> = edición menor.",
-       "history-fieldset-title": "Buscar en el historial",
-       "history-show-deleted": "Solo eliminadas",
+       "history-fieldset-title": "Buscar revisiones",
+       "history-show-deleted": "Solo revisiones eliminadas",
        "histfirst": "primeras",
        "histlast": "últimas",
        "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
        "prefs-help-prefershttps": "Los cambios surtirán efecto en tu próximo inicio de sesión.",
        "prefswarning-warning": "Has hecho cambios en tus preferencias que todavía no se han guardado. Si sales de esta página sin pulsar en «$1» no se actualizarán las preferencias.",
        "prefs-tabs-navigation-hint": "Sugerencia: Puede utilizar las teclas de flecha izquierda y derecha para navegar entre las pestañas de la lista de pestañas.",
-       "userrights": "Gestión de permisos de usuario",
+       "userrights": "Permisos de usuario",
        "userrights-lookup-user": "Selecciona una cuenta de usuario",
        "userrights-user-editname": "Escribe un nombre de usuario:",
        "editusergroup": "Cargar grupos de usuarios",
        "rcfilters-invalid-filter": "Filtro no válido",
        "rcfilters-empty-filter": "No hay filtros activos. Se muestran todas las contribuciones.",
        "rcfilters-filterlist-title": "Filtros",
+       "rcfilters-filterlist-whatsthis": "¿Qué es esto?",
        "rcfilters-highlightbutton-title": "Resaltar los resultados",
        "rcfilters-highlightmenu-title": "Selecciona un color",
        "rcfilters-highlightmenu-help": "Selecciona un color para resaltar esta propiedad",
        "rcfilters-filterlist-noresults": "No se encontraron filtros",
+       "rcfilters-noresults-conflict": "No se encontraron resultados porque los criterios de búsqueda están en conflicto.",
        "rcfilters-filtergroup-registration": "Registro de usuario",
        "rcfilters-filter-registered-label": "Registrados",
        "rcfilters-filter-registered-description": "Editores conectados.",
        "rcfilters-filter-humans-label": "Ser humano (no bot)",
        "rcfilters-filter-humans-description": "Ediciones realizadas por editores humanos.",
        "rcfilters-filtergroup-reviewstatus": "Estado de revisión",
+       "rcfilters-filter-patrolled-label": "Patrulladas",
+       "rcfilters-filter-patrolled-description": "Ediciones marcadas como patrulladas.",
+       "rcfilters-filter-unpatrolled-label": "No patrulladas",
+       "rcfilters-filter-unpatrolled-description": "Ediciones no marcadas como patrulladas.",
        "rcfilters-filtergroup-significance": "Significación",
        "rcfilters-filter-minor-label": "Ediciones menores",
        "rcfilters-filter-minor-description": "Ediciones etiquetadas por el autor como menores.",
        "htmlform-user-not-valid": "<strong>$1</strong> no es un nombre de usuario válido.",
        "logentry-delete-delete": "$1 {{GENDER:$2|borró}} la página $3",
        "logentry-delete-delete_redir": "$1 {{GENDER:$2|borró}} la redirección $3 con un traslado",
-       "logentry-delete-restore": "$1 restauró la página «$3»",
+       "logentry-delete-restore": "$1 restauró la página $3",
        "logentry-delete-event": "$1 {{GENDER:$2|modificó}} la visibilidad de {{PLURAL:$5|un evento|$5 eventos}} del registro en $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|modificó}} la visibilidad de {{PLURAL:$5|una revisión |$5 revisiones}} en la página  $3: $4",
        "logentry-delete-event-legacy": "$1 ha {{GENDER:$2|cambiado}} la visibilidad de eventos del registro en $3",
        "logentry-suppress-event-legacy": "$1 {{GENDER:$2|modificó}} secretamente la visibilidad de los eventos del registro en $3",
        "logentry-suppress-revision-legacy": "$1 {{GENDER:$2|modificó}} secretamente la visibilidad de las revisiones en la página $3",
        "revdelete-content-hid": "contenido ocultado",
-       "revdelete-summary-hid": "resumen de edición oculto",
+       "revdelete-summary-hid": "resumen de edición ocultado",
        "revdelete-uname-hid": "nombre de usuario ocultado",
        "revdelete-content-unhid": "contenido mostrado",
        "revdelete-summary-unhid": "resumen de edición mostrado",
        "logentry-block-block": "$1 {{GENDER:$2|bloqueó}} a {{GENDER:$4|$3}} durante un plazo de $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|desbloqueó}} {{GENDER:$4|$3}}",
        "logentry-block-reblock": "$1 {{GENDER:$2|cambió}} la configuración del bloqueo de {{GENDER:$4|$3}} durante un plazo de $5 $6",
-       "logentry-suppress-block": "$1 {{GENDER:$2|bloqueó}} {{GENDER:$4|$3}} durante un plazo de $5 $6",
+       "logentry-suppress-block": "$1 {{GENDER:$2|bloqueó a}} {{GENDER:$4|$3}} durante un plazo de $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|cambió}} la configuración del bloqueo de {{GENDER:$4|$3}} durante un plazo de $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|importó}} $3 subiendo un archivo",
        "logentry-import-upload-details": "$1 {{GENDER:$2|importó}} $3 subiendo un archivo ($4 {{PLURAL:$4|revisión|revisiones}})",
index 28a2d34..95ca071 100644 (file)
        "page_first": "esimene",
        "page_last": "viimane",
        "histlegend": "Märgi versioonid, mida tahad võrrelda ja vajuta võrdlemisnupule.\nLegend: (viim) = erinevused võrreldes viimase redaktsiooniga,\n(eel) = erinevused võrreldes eelmise redaktsiooniga, P = pisimuudatus",
-       "history-fieldset-title": "Ajaloo sirvimine",
+       "history-fieldset-title": "Redaktsioonide otsimine",
        "history-show-deleted": "Üksnes kustutatud redaktsioonid",
        "histfirst": "vanimad",
        "histlast": "uusimad",
index 1f3a4e6..b97f4d0 100644 (file)
        "prefs-help-prefershttps": "Tämä asetus tulee voimaan seuraavan sisäänkirjautumisesi yhteydessä.",
        "prefswarning-warning": "Olet tehnyt asetuksiisi muutoksia, joita ei ole vielä tallennettu.\nJos poistut sivulta klikkaamatta \"$1\", asetuksiasi ei päivitetä.",
        "prefs-tabs-navigation-hint": "Vihje: Voit käyttää vasenta ja oikeata nuolinäppäintä liikkumiseen välilehtien välillä.",
-       "userrights": "Käyttöoikeuksien hallinta",
+       "userrights": "Käyttäjän oikeudet",
        "userrights-lookup-user": "Valitse käyttäjä",
        "userrights-user-editname": "Käyttäjätunnus:",
        "editusergroup": "Lataa käyttäjäryhmät",
        "rcfilters-invalid-filter": "Suodatin on epäkelpo",
        "rcfilters-empty-filter": "Ei aktiivisia suodattimia. Kaikki muutokset näytetään.",
        "rcfilters-filterlist-title": "Suodattimet",
+       "rcfilters-filterlist-whatsthis": "Mikä tämä on?",
+       "rcfilters-highlightbutton-title": "Korosta tulokset",
        "rcfilters-highlightmenu-title": "Valitse väri",
        "rcfilters-filterlist-noresults": "Ei löytynyt suodattimia",
        "rcfilters-filtergroup-registration": "Käyttäjän rekisteröinti",
        "rcfilters-filter-bots-label": "Botti",
        "rcfilters-filter-bots-description": "Muokkaukset jotka tehty automaattisilla työkaluilla.",
        "rcfilters-filter-humans-label": "Ihminen (ei botti)",
+       "rcfilters-filter-humans-description": "Muokkaukset, jotka tehnyt ihmismuokkaajat.",
+       "rcfilters-filtergroup-reviewstatus": "Tarkistuksen tila",
        "rcfilters-filtergroup-significance": "Merkitys",
        "rcfilters-filter-minor-label": "Pienet muutokset",
        "rcfilters-filter-major-label": "Ei-pienet muutokset",
index 72264e4..f9d22b5 100644 (file)
        "page_first": "première",
        "page_last": "dernière",
        "histlegend": "Sélection du diff : cochez les boutons radio des versions à comparer et appuyez sur entrée ou sur le bouton en bas.<br />\nLégende : <strong>({{int:cur}})</strong> = différence avec la dernière version, <strong>({{int:last}})</strong> = différence avec la version précédente, <strong>{{int:minoreditletter}}</strong> = modification mineure.",
-       "history-fieldset-title": "Naviguer dans l’historique",
+       "history-fieldset-title": "Rechercher des révisions",
        "history-show-deleted": "Révision supprimée uniquement",
        "histfirst": "les plus anciennes",
        "histlast": "les plus récentes",
        "rcfilters-invalid-filter": "Filtre non valide",
        "rcfilters-empty-filter": "Aucun filtre actif. Toutes les contributions sont affichées.",
        "rcfilters-filterlist-title": "Filtres",
+       "rcfilters-filterlist-whatsthis": "Qu’est-ce que c'est ?",
        "rcfilters-filterlist-feedbacklink": "Fournir un commentaire sur les nouveaux filtres (en bêta)",
        "rcfilters-highlightbutton-title": "Mettre en valeur les résultats",
        "rcfilters-highlightmenu-title": "Choisir une couleur",
        "rcfilters-highlightmenu-help": "Sélectionner une couleur pour mettre en évidence cette propriété",
        "rcfilters-filterlist-noresults": "Aucun filtre trouvé",
+       "rcfilters-noresults-conflict": "Aucun résultat trouvé car les critères de recherche sont en conflit",
+       "rcfilters-state-message-subset": "Ce filtre n'a aucun effet, parce que ses résultats sont inclus dans ceux de la recherche suivante, {{PLURAL:$2|filtre plus étendu|filtres plus étendus}} (essayez la mise en forme pour le différencier): $1",
+       "rcfilters-state-message-fullcoverage": "Sélectionner tous les filtres dans un groupe est la même chose que d'en sélectionner aucun, aussi ce filtre n'a aucun effet. Le groupe comprend: $1",
        "rcfilters-filtergroup-registration": "Inscription de l’utilisateur",
        "rcfilters-filter-registered-label": "Connectés",
        "rcfilters-filter-registered-description": "Éditeurs connectés.",
        "rcfilters-filter-unregistered-label": "Non connectés",
        "rcfilters-filter-unregistered-description": "Éditeurs qui ne sont pas connectés.",
-       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Le filtre « Non inscrit » est inactif parce que son effet est annulé par {{PLURAL:$2|le filtre d’expérience suivant|les filtres d’expérience suivants}}, qui ne {{PLURAL:$2|trouve|trouvent}} que des utilisateurs inscrits : $1",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Ce filtre est en conflit avec le{{PLURAL:$2| filtre|s filtres}}      Experience suivant, qui ne {{PLURAL:$2|trouve|trouvent}} que des utilisateurs inscrits : $1",
        "rcfilters-filtergroup-authorship": "Modifier la paternité",
        "rcfilters-filter-editsbyself-label": "Vos propres modifications",
        "rcfilters-filter-editsbyself-description": "Vos modifications.",
        "rcfilters-filter-editsbyother-label": "Modifications par d’autres.",
        "rcfilters-filter-editsbyother-description": "Modifications créées par d’autres utilisateurs (pas vous).",
        "rcfilters-filtergroup-userExpLevel": "Niveau d’expérience (uniquement pour les utilisateurs enregistrés)",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Ce filtre est désactivé car il ne recherche que les utilisateurs enregistrés, et le filtre \"Unregistered\" annule son effet.",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Le filtre « Non inscrit » est en conflit avec au moins un filtre d’expérience. Les filtres d’expérience trouvent uniquement des utilisateurs inscrits. Les filtres en conflit sont marqués comme inactifs ci-dessus.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Les filtres Experience ne trouvent que des utilisateurs enregistrés, et ce filtre est en conflit avec le filtre \"non enregistré\".",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Le filtre \"non enregistrés\" est en conflit avec un ou plusieurs  filtres Expérience, qui ne trouvent que les utilisateurs inscrits seulement. Les filtres en conflit sont marqués dans le champ des filtres actifs, ci-dessus.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Nouveaux arrivants",
        "rcfilters-filter-user-experience-level-newcomer-description": "Moins de 10 modifications et 4 jours d’activité.",
        "rcfilters-filter-user-experience-level-learner-label": "Apprentis",
        "rcfilters-filter-categorization-description": "Enregistrements de pages ajoutées ou supprimées des catégories.",
        "rcfilters-filter-logactions-label": "Actions tracées",
        "rcfilters-filter-logactions-description": "Actions d’administration, créations de compte, suppression de pages, téléchargements…",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "Le filtre « Modifications mineures » est en conflit avec au moins un filtre de Type de modification, parce que certains types de modification ne peuvent être marqués comme « mineurs ». Les filtres en conflit sont marqués dans la zone Filtres actifs ci-dessus.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Certains types de modification ne peuvent pas être i indiqués comme « mineurs », donc ce filtre est en conflit avec les filtres de Type de modification suivants : $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Ce filtre de Type de modification est en conflit avec le filtre « Modifications mineures ». Certains type sde modification ne peuvent pas être indiqués comme « mineurs ».",
        "rcnotefrom": "Ci-dessous {{PLURAL:$5|la modification effectuée|les modifications effectuées}} depuis le <strong>$3, $4</strong> (affichées jusqu’à <strong>$1</strong>).",
        "rclistfrom": "Afficher les nouvelles modifications depuis le $3 à $2",
        "rcshowhideminor": "$1 les modifications mineures",
index 6a81448..280b124 100644 (file)
        "passwordreset-emailtext-ip": "Hoker mä det IP-Adres $1, woorskiinelk dü salew, wul hal brükerinformatsjuunen för {{SITENAME}} tusjüürd fu ($4). {{PLURAL:$3|Detdiar brükerkonto as|Jodiar brükerkontos san}} mä detdiar E-Mail-adres ferbünjen:\n\n$2\n\n{{PLURAL:$3|Detheer tidjwiis paaswurd lääpt|Joheer tidjwiis paaswurden luup}} efter {{PLURAL:$5|ään dai|$5 daar}} uf. \nDü skulst di uunmelde an en nei paaswurd iinracht. Wan hoker ööders detheer uunfraag steld hää an dü din ual paaswurd käänst, do säärst dü niks widjer onernem. Melde di ianfach widjerhen mä din ual paaswurd uun.",
        "passwordreset-emailtext-user": "Di brüker $1 üüb {{SITENAME}} hää am brükerinformatsjuunen för {{SITENAME}} uunfraaget ($4). {{PLURAL:$3|Detdiar brükerkonto as|Jodiar brükerkontos san}} mä detdiar E-Mail-Adres ferbünjen:\n\n$2\n\n{{PLURAL:$3|Detheer tidjwiis paaswurd lääpt|Joheer tidjwiis paaswurden luup}} efter {{PLURAL:$5|ään dai|$5 daar}} uf. Dü skulst di uunmelde an en nei paaswurd iinracht. Wan hoker ööders detheer uunfraag steld hää of dü din ual paaswurd käänst, säärst dü niks widjer onernem. Melde di ianfach mä din ual paaswurd uun.",
        "passwordreset-emailelement": "Brükernööm: \n$1\n\nTidjwiis paaswurd: \n$2",
-       "passwordreset-emailsentemail": "Diar as en E-Mail tu di onerwais.",
-       "changeemail": "Feranre det E-Mail-adres",
-       "changeemail-header": "Feranre det E-Mail-adres",
+       "passwordreset-emailsentemail": "Diar as en E-Mail tu di onerwais, wan dü en adres uunden heest.",
+       "changeemail": "Feranre of strik det E-Mail-adres",
+       "changeemail-header": "Fal det formulaar ütj, wan dü din E-Mail-adres feranre wel. Wan dü nian adres uundu wel, läät det fial man leesag.",
        "changeemail-no-info": "Dü möist önjmälded weese am ju sid diräkt tu tu gripen.",
        "changeemail-oldemail": "Aktuel e-mail adres",
        "changeemail-newemail": "Nei e-mail adres",
        "sig_tip": "Din onerskraft mä tidjstempel",
        "hr_tip": "Horisontaal streg (ei auerdriiw diarmä)",
        "summary": "Tuupfaadet:",
-       "subject": "Auerskraft:",
+       "subject": "Teemo:",
        "minoredit": "Det as man en letj feranrang",
        "watchthis": "Detdiar sidj uun't uug behual",
        "savearticle": "Sidj seekre",
        "missingsummary": "'''Paase üüb:''' Dü heest det ei tuupfaadet.\nWan dü det sidj seekerst, woort det saner en kurtfaadet beskriiwang auernimen.",
        "selfredirect": "<strong>Paase üüb:</strong> Dü feerst detheer sidj tu detsalew sidj widjer.\nDü heest was det ferkiard mual uunden, of dü bewerkest det ferkiard sidj.\nWan dü noch ans üüb „{{int:savearticle}}“ trakst, woort det widjerfeerang likes iinracht.",
        "missingcommenttext": "Faade det oner tuup.",
-       "missingcommentheader": "'''Paase üüb:''' Dü heest nian auerskraft uunden.\nWan dü det sidj seekerst, woort det saner auerskraft auernimen.",
+       "missingcommentheader": "<strong>Paase üüb:</strong> Dü heest nian teemo uunden. Wan dü noch ans üüb „{{int:savearticle}}“ trakst, woort din feranrang saner auerskraft seekert.",
        "summary-preview": "Föörskau faan det tuupfaadang:",
        "subject-preview": "Föörskau faan det auerskraft:",
        "previewerrortext": "Diar as wat skiaf gingen, üs en föörskau faan din feranrangen wiset wurd skul.",
        "accmailtext": "En tufelag iinracht paaswurd för [[User talk:$1|$1]] as tu $2 ferschüürd wurden. Det koon üüb det spezial-sidj ''[[Special:ChangePassword|Paaswurd anre]]'' feranert wurd, wan dü uunmeldet beest.",
        "newarticle": "(Nei)",
        "newarticletext": "Dü beest en ferwisang tu en sidj fulagt, diar't noch ei jaft.\nAm det sidj iinturachten, skriiw dan tekst uun det fial för't bewerkin iin.\nÜüb det [$1 halepsidj] fanjst dü halep.\nWan dü ütj fersen heer beest, trak ianfach üüb di <strong>turag</strong>-knoop faan dan browser.",
-       "anontalkpagetext": "----''Üüb detheer sidj könst dü en ünbekäänden brüker en nooracht du. Det lääpt auer sin IP adres. IP adresen kön faan flook brükern brükt wurd. Wan dü mä detheer nooracht niks began könst, do as det ferlicht för hoker ööders mend weesen. Dü säärst niks widjer onernem. Wan dü en aanj [[Special:CreateAccount|brükerkonto iinrachst]] of di [[Special:UserLogin|uunmeldest]], komt sowat ei weder föör.",
+       "anontalkpagetext": "----\n<em>Üüb detdiar sidj könst dü hoker, wat ei uunmeldet as, bööd du.</em>\nDiarför woort sin IP-adres brükt. IP-adresen kön oober faan ünlik brükern nadagt wurd.\nWan dü mä jo komentaaren niks began könst, do as was en öödern brüker mend. Ferjid det ianfach.\nDü könst di uk en [[Special:CreateAccount|brükerkonto iinracht]] of di [[Special:UserLogin|uunmelde]], am dat dü ei mä ööder brükern ferwakselt woorst.",
        "noarticletext": "Üüb detdiar sidj stäänt noch niks.\nDü könst didiar tiitel üüb ööder sidjen [[Special:Search/{{PAGENAME}}|schük]],\n<span class=\"plainlinks\">uun [{{fullurl:{{#special:Log}}|page={{FULLPAGENAMEE}}}} logbuken schük] of detdiar sidj [{{fullurl:{{FULLPAGENAME}}|action=edit}} maage]</span>.",
        "noarticletext-nopermission": "Üüb detdiar sidj stäänt noch niks, oober dü mutst diar uk niks iinskriiw.\nDü könst diar üüb ööder sidjen efter [[Special:Search/{{PAGENAME}}|schük]] of a <span class=\"plainlinks\">[{{fullurl:{{#special:Log}}|page={{FULLPAGENAME}}}} logbuken uunluke].</span>",
        "missing-revision": "Det werjuun #$1 faan det sidj \"{{FULLPAGENAME}}\" jaft at ei.\n\nDet komt diar miast faan, dat en ual ferwisang stregen wurden as.\nDü könst det uun't [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} logbuk faan stregen sidjen] efterlees.",
        "previewnote": "'''Heer könst dü sä, hü det sidj wurd skal.'''\nDet sidj as oober noch ei seekert!",
        "continue-editing": "Gung tu't fial för't bewerkin",
        "previewconflict": "Detdiar föörskau wiset di boowenst dial faan dan tekst. So schocht hi ütj, wan dü ham nü seekerst.",
-       "session_fail_preview": "'''Din werk küd ei ufseekert wurd, diar as wat skiaf gingen.'''\nFerschük det man noch ans an trak do üüb ''Sidj seekre''.\nWan't do imer noch ei loket, [[Special:UserLogout|melde di uf]] an weder uun.",
+       "session_fail_preview": "Entskilage! Din werk küd ei ufseekert wurd. Diar as wat skiaf gingen.\n\nFerlicht beest dü ufmeldet wurden. <strong>Stel seeker, dat dü noch uunmeldet beest an ferschük det man noch ans</strong>.\nWan det ei wal, do mutst dü di man [[Special:UserLogout|ufmelde]] an do weder nei uunmelde. Dan browser skal cookies uunnem kön.",
        "session_fail_preview_html": "'''Din werk küd ei seekert wurd. Diar as wat skiaf gingen.'''\n\n''Uun {{SITENAME}} as HTML aktiwiaret, an diaram as JavaScript deaktiwiaret wurden.''\n\nFerschük det man noch ans an trak do üüb ''Sidj seekre''.\nWan't do imer noch ei loket, [[Special:UserLogout|melde di uf]] an weder uun.",
        "token_suffix_mismatch": "'''Din werk küd ei ufseekert wurd, auer diar frääm tiaken uun san.'''\n\nDet komt flooksis föör, wan Dan anonym Proxy-siinst ei rocht werket.",
        "edit_form_incomplete": "'''Enkelt dialen faan det formulaar san ei rocht uunkimen.'''\nWees so gud an kontroliare ales noch ans.",
        "copyrightwarning2": "Seenk diaram, dat det sidj {{SITENAME}} faan öödern bewerket, feranert of uk stregen wurd koon. Wan dü det ei wel, do skriiw heer niks iin! \n\nWan dü heer wat iinskrafst, do beest dü diarmä iinferstenen an seekerst tu, dat dü det '''salew skrewen''' heest of faan en steed auernimen heest, huar '''nian rochten''' üüb lei. (Luke bi $1, wan dü muar wed wel.)\n\n'''Auerdreeg nään frääm teksten an bilen saner ferloof!'''",
        "editpage-cannot-use-custom-model": "Det muude faan detheer sidj koon ei feranert wurd.",
        "longpageerror": "'''Error: Dan tekst as {{PLURAL:$1|ian kilobyte|$1 kilobytes}} lung, hi mut oober ei linger wees üs {{PLURAL:$2|ian kilobyte|$2 kilobytes}}.'''Hi koon ei ufspiikerd wurd.",
-       "readonlywarning": "'''Paase üüb: Dü könst uun uugenblak ei üüb det dootenbeenk tugrip. Din dooten kön ei seekert wurd.''' Wees so gud an seekre dan tekst iarst ans üüb dan reegner, an ferschük leederhen, ham tu auerdreegen.\n\nGrünj för det sperin: $1",
+       "readonlywarning": "<strong>Paase üüb: Dü könst uun uugenblak ei üüb det dootenbeenk tugrip. Din dooten kön ei seekert wurd.</strong> Wees so gud an seekre dan tekst iarst ans üüb dan reegner, an ferschük leederhen, ham tu auerdreegen.\n\nGrünj för det sper: $1",
        "protectedpagewarning": "'''Paase üüb: Detdiar sidj as speret wurden. Bluas administratooren kön det bewerke.'''\nUun't logbuk stäänt muar diartu:",
        "semiprotectedpagewarning": "'''Paase üüb: Detdiar sidj as dialwiis tu't bewerkin speret wurden. Bluas gudkäänd brükern kön det bewerke.'''\nUun't logbuk stäänt muar diartu:",
        "cascadeprotectedwarning": "<strong>Paase üüb:</strong> Detdiar sidj koon bluas faan administratooren bewerket wurd. Hat as uun {{PLURAL:$1|detdiar ööder sidj|jodiar ööder sidjen}} iinbünjen, diar troch en kaskaadensper seekert {{PLURAL:$1|as|san}}:",
        "page_first": "Began",
        "page_last": "Aanj",
        "histlegend": "Am a feranrangen uuntuwisin, schük tau werjuunen ütj an trak üüb „{{int:compareselectedversions}}“.<br />\n* '''({{int:cur}})''' = ferskeel tu't aktuel werjuun, '''({{int:last}})''' = ferskeel tu't leetst werjuun, '''{{int:minoreditletter}}''' = letj feranrang.",
-       "history-fieldset-title": "Schük uun a ferluup",
-       "history-show-deleted": "Bluas stregen werjuunen",
+       "history-fieldset-title": "Schük efter werjuunen",
+       "history-show-deleted": "Bluas stregen werjuunen wise",
        "histfirst": "Äälst",
        "histlast": "Neist",
        "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
        "revdelete-unsuppress": "Weder iinsteld werjuunen luasmaage",
        "revdelete-log": "Grünj:",
        "revdelete-submit": "Widjer för {{PLURAL:$1|ütjsoocht werjuun|ütjsoocht werjuunen}}",
-       "revdelete-success": "'''Det werjuunsuunsicht as aktualisiaret wurden.'''",
+       "revdelete-success": "Det werjuunsuunsicht as aktualisiaret wurden.",
        "revdelete-failure": "'''Jü färsjoonsönjsicht köö ai aktualisiird wårde:'''\n$1",
-       "logdelete-success": "'''Logbukuunsicht as aktualisiaret wurden.'''",
+       "logdelete-success": "Logbukuunsicht as aktualisiaret wurden.",
        "logdelete-failure": "'''Det logbukuunsicht küd ei feranert wurd:'''\n$1",
        "revdel-restore": "Feranre, wat tu sen wees skal",
        "pagehist": "Ferluup faan werjuunen",
        "mergehistory-go": "Wise werjuunen, diar tuupfeerd wurd kön.",
        "mergehistory-submit": "Werjuunen tuupfeer",
        "mergehistory-empty": "Nian werjuunen kön tuupfeerd wurd.",
-       "mergehistory-done": "$3 {{PLURAL:$3|werjuun|werjuunen}} faan $1 tuupfeerd tu [[:$2]].",
+       "mergehistory-done": "{{PLURAL:$3|Ian werjuun as|$3 werjuunen san}} faan „$1“ tu „[[:$2]]“ tuupfeerd wurden.",
        "mergehistory-fail": "Werjuunen kön ei tuupfeerd wurd. Luke noch ans efter at sidj an a tidjen.",
        "mergehistory-fail-toobig": "A werjuunen küd ei tuupfeerd wurd, auer muar üs {{PLURAL:$1|ian werjuun|$1 werjuunen}} fersköwen {{PLURAL:$1|wurd skul|wurd skul}}.",
        "mergehistory-no-source": "Det iarst sidj \"$1\" as ai diar.",
        "prefs-watchlist-token": "Token för uun't uug behualen:",
        "prefs-misc": "Dit an dat",
        "prefs-resetpass": "Paaswurd feranre",
-       "prefs-changeemail": "Feranre det E-Mail-adres",
+       "prefs-changeemail": "Feranre of strik det E-Mail-adres",
        "prefs-setemail": "E-Mail-adres fäästlei:",
        "prefs-email": "E-Mail iinstelangen",
        "prefs-rendering": "Skak",
        "restoreprefs": "Normool iinstelangen weder haale (uun arke kirew)",
        "prefs-editing": "Bewerke",
        "searchresultshead": "Schük",
-       "stub-threshold": "Formatiarang faan links <a href=\"#\" class=\"stub\">för letj sidjen</a> (uun Byte):",
+       "stub-threshold": "Formatiarang faan ferwisangen faan letj sidjen ($1):",
        "stub-threshold-disabled": "Ufsteld",
        "recentchangesdays": "Soföl daar skel a „leetst feranrangen“ uunwise:",
        "recentchangesdays-max": "Ei muar üs {{PLURAL:$1|ään dai|$1 daar}}",
        "prefs-help-prefershttps": "Detdiar iinstelang täält, wan dü di naist tooch uunmeldest.",
        "prefswarning-warning": "A feranrangen bi din iinstelangen san noch ei seekert wurden.\nWan dü detheer sidj ferläätst, saner üüb \"$1\" tu traken, wurd din iinstelangen ei aktualisiaret.",
        "prefs-tabs-navigation-hint": "Halep: Dü könst a lachter of rochter wiiser-knoop brük, am tesken a ridjerkoorden boowen uun't menüü hen an weder tu springen.",
-       "userrights": "Brükerrochten bewerke",
-       "userrights-lookup-user": "Brükersköölen bewerke",
+       "userrights": "Brükerrochten",
+       "userrights-lookup-user": "En brüker besteme",
        "userrights-user-editname": "Brükernööm:",
-       "editusergroup": "Brükersköölen bewerke",
+       "editusergroup": "Brükersköölen loose",
        "editinguser": "Feranre brükerrochten {{GENDER:$1|faan di brüker}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Lasmootskap tu brükersköölen bewerke",
-       "saveusergroups": "Brükersköölen seekre",
+       "userrights-editusergroup": "Lasmootskat tu brükersköölen faan {{GENDER:$1|di brüker|det brüker}} bewerke",
+       "saveusergroups": "{{GENDER:$1|Lasmootskap tu brükersköölen}} feranre",
        "userrights-groupsmember": "Lasmoot faan:",
        "userrights-groupsmember-auto": "Faan salew lasmoot faan:",
-       "userrights-groups-help": "Dü könst feranre, tu hün brükerskööl di brüker hiirt:\n* En uunkrüsagt kasche ment, di brüker hiirt diartu.\n* En ei uunkrüsagt kasche ment, di brüker hiart ei diartu.\n* En * ment, dat dü det brükerrocht ei weder wechnem könst (of amkiard).",
+       "userrights-groups-help": "Dü könst feranre, tu hün brükerskööl di brüker hiirt:\n* En uunkrüsagt kasche ment, di brüker hiirt diartu.\n* En ei uunkrüsagt kasche ment, di brüker hiart ei diartu.\n* En * ment, dat dü det brükerrocht ei weder wechnem könst (of amkiard).\n* En # ment, dat dü di tidjponkt bluas efter bääften fersküüw könst, ei efter föören.",
        "userrights-reason": "Grünj:",
        "userrights-no-interwiki": "Dü heest ei det rocht, am brükerrochten uun ööder wikis tu feranrin.",
        "userrights-nodatabase": "Det dootenbeenk $1 jaft at ei, tumanst ei lokaal.",
        "group-bot": "Bots",
        "group-sysop": "Administratooren",
        "group-bureaucrat": "Bürokraaten",
-       "group-suppress": "Oversighter",
+       "group-suppress": "Fersteeger",
        "group-all": "(Aal a)",
        "group-user-member": "{{GENDER:$1|Brüker}}",
        "group-autoconfirmed-member": "{{GENDER:$1|Registriaret brüker}}",
        "group-bot-member": "{{GENDER:$1|Bot}}",
        "group-sysop-member": "{{GENDER:$1|Administraator}}",
        "group-bureaucrat-member": "{{GENDER:$1|Bürokraat}}",
-       "group-suppress-member": "{{GENDER:$1|Oversighter}}",
+       "group-suppress-member": "{{GENDER:$1|Fersteeger}}",
        "grouppage-user": "{{ns:project}}:Brükern",
        "grouppage-autoconfirmed": "{{ns:project}}:Registriaret brükern",
        "grouppage-bot": "{{ns:project}}:Bots",
        "grouppage-sysop": "{{ns:project}}:Administratooren",
        "grouppage-bureaucrat": "{{ns:project}}:Bürokraaten",
-       "grouppage-suppress": "{{ns:project}}:Oversighter",
+       "grouppage-suppress": "{{ns:project}}:Fersteeg",
        "right-read": "Sidjen lees",
        "right-edit": "Sidjen bewerke",
        "right-createpage": "Sidjen maage (saner diskuschuunsidjen)",
        "right-siteadmin": "Dootenbeenk spere an eebenmaage",
        "right-override-export-depth": "Sidjen an onersidjen bit tu en jipde faan 5 eksportiare",
        "right-sendemail": "E-mails tu ööder brükern schüür",
-       "right-managechangetags": "[[Special:Tags|Markiarangen]] iinracht an uun't dootenbeenk strik",
+       "right-managechangetags": "[[Special:Tags|Markiarangen]] iinracht an (de)aktiwiare",
        "right-applychangetags": "[[Special:Tags|Markiarangen]] tuup mä ööder feranrangen brük",
        "right-changetags": "Feranre [[Special:Tags|markiarangen]] faan enkelt werjuunen of logbukiindracher",
        "newuserlogpage": "Neiuunmeldangs-logbuk",
        "rightslogtext": "Det as det logbuk auer feranrangen faan brükerrochten.",
        "action-read": "jüdeer sid leese",
        "action-edit": "detdiar sidj tu bewerkin",
-       "action-createpage": "nei sidjen tu maagin",
-       "action-createtalk": "diskuschuunsidjen maage",
+       "action-createpage": "an maage detdiar sidj",
+       "action-createtalk": "an maage detdiar diskuschuunsidj",
        "action-createaccount": "jüdeer brükerkonto mååge",
        "action-history": "di ferluup faan detdiar sidj uuntulukin.",
        "action-minoredit": "detdiar feranrang üs letj kääntiakne",
        "action-upload_by_url": "detdiar datei faan en URL-adres huuchtusjüüren",
        "action-writeapi": "iin uun det API tu skriiwen",
        "action-delete": "detdiar sidj strik",
-       "action-deleterevision": "werjuunen tu striken",
-       "action-deletedhistory": "det list mä stregen werjuunen uuntulukin",
+       "action-deleterevision": "an strik werjuunen",
+       "action-deletedhistory": "an luke det list mä stregen werjuunen uun",
        "action-browsearchive": "schük stregen sidjen",
-       "action-undelete": "detdiar sidj weder iinstel",
-       "action-suppressrevision": "det ferbürgen werjuun uuntulukin an weder turagtuhaalin",
+       "action-undelete": "an stel sidjen weder iin",
+       "action-suppressrevision": "an luke ferbürgen werjuunen uun of stel jo weder iin",
        "action-suppressionlog": "iin uun det priwoot logbuk tu lukin",
        "action-block": "di brüker tu sperin",
        "action-protect": "det seekerhaid faan sidjen tu feranrin",
        "action-viewmyprivateinfo": "din priwoot dooten uuntulukin",
        "action-editmyprivateinfo": "din priwoot dooten tu bewerkin",
        "action-editcontentmodel": "det model faan det sidj tu bewerkin",
-       "action-managechangetags": "markiarangen iinracht an uun't dootenbeenk strik",
+       "action-managechangetags": "an racht markiarangen iin an (de)aktiwiare jo",
        "action-applychangetags": "markiarangen tuup mä ööder feranrangen tu brüken",
        "action-changetags": "markiarangen faan enkelt werjuunen of logbukiindracher tu feranrin",
        "nchanges": "$1 {{PLURAL:$1|feranrang|feranrangen}}",
        "recentchangeslinked-page": "Sidjennööm:",
        "recentchangeslinked-to": "Wise feranrangen üüb sidjen, diar heerhen ferwise.",
        "recentchanges-page-added-to-category": "[[:$1]] tu kategorii saat",
-       "recentchanges-page-added-to-category-bundled": "[[:$1]] an [[Special:WhatLinksHere/$1|{{PLURAL:$2|ian sidj muar|$2 muar sidjen}}]] tu kategorii saat",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] tu kategorii saat, [[Special:WhatLinksHere/$1|detdiar sidj as uun ööder sidjen iinbünjen.]]",
        "recentchanges-page-removed-from-category": "[[:$1]] faan't kategorii wechnimen",
-       "recentchanges-page-removed-from-category-bundled": "[[:$1]] an {{PLURAL:$2|ian sidj muar|$2 muar sidjen}} faan det kategorii wechnimen",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] faan det kategorii wechnimen, [[Special:WhatLinksHere/$1|detdiar sidj as uun ööder sidjen iinbünjen]]",
        "upload": "Datei huuchschüür",
        "uploadbtn": "Datei huuchschüür",
        "reuploaddesc": "Ufbreeg an turag tu't sidj för't huuchschüüren",
        "backend-fail-read": "Det datei $1 küd ei leesen wurd.",
        "backend-fail-create": "Det datei $1 küd ei seekert wurd.",
        "backend-fail-maxsize": "Det datei $1 küd ei seekert wurd, auer det grater üs {{PLURAL:$2|1 byte|$2 bytes}} as.",
-       "backend-fail-readonly": "Det süsteem „$1“ koon uun uugenblak bluas lees. Di grünj as: „$2“",
+       "backend-fail-readonly": "Det dootebeenk „$1“ koon uun uugenblak bluas lees. Di grünj as: <em>$2</em>",
        "backend-fail-synced": "Det datei „$1“ woort jüst faan't süsteem bewerket.",
        "backend-fail-connect": "Küd ei mä't süsteem „$1“ ferbinj.",
        "backend-fail-internal": "Uun't süsteem „$1“ as wat skiaf gingen.",
        "nopagetext": "Det sidj, wat fersköwen wurd skal, as ei diar.",
        "pager-newer-n": "{{PLURAL:$1|1 neier|$1 neier}}",
        "pager-older-n": "{{PLURAL:$1|1 ääler|$1 ääler}}",
-       "suppress": "Oversight",
+       "suppress": "Fersteeg",
        "querypage-disabled": "Detdiar spezial-sidj as ei aktiif, am det süsteem ei tu auerläästin.",
        "apihelp": "Halep för API",
        "apihelp-no-such-module": "Moduul \"$1\" ei fünjen.",
        "booksources-text": "Detdiar list ferwiset üüb wääbsteeden, diar nei an brükt buken ferkuupe. Diar feist dü uk muar tu weden. {{SITENAME}} hää mo jodiar kuuplidj oober niks tu dun.",
        "booksources-invalid-isbn": "Detdiar ISBN as woorskiinelk ferkiard. Luke noch ans efter, of det rocht auerdraanj wurden as.",
        "specialloguserlabel": "Brüker:",
-       "speciallogtitlelabel": "Mual (sidjennööm of brüker):",
+       "speciallogtitlelabel": "Mual (Tiitel of {{ns:user}}:brükernööm för di brüker):",
        "log": "Logbuken",
        "all-logs-page": "Aal a öfentelk logbuken",
        "alllogstext": "Diar wurd aal a logbuken faan {{SITENAME}} uunwiset.\nDet woort efter logbukslach, brüker of sidjennööm uunwiset. Grat- an letjskriiwang skel beaachtet wurd.",
        "emailccsubject": "Kopii faan din mädialang tu $1: $2",
        "emailsent": "E-mail as wechschüürd wurden",
        "emailsenttext": "Din e-mail as wechschüürd wurden.",
-       "emailuserfooter": "Detdiar e-mail as faan „$1“ tu „$2“ auer det funktjuun „{{int:emailuser}}“ bi {{SITENAME}} schüürd wurden.",
+       "emailuserfooter": "Detdiar E-Mail as faan „$1“ tu „{{GENDER:$2|$2}}“ mä det funktjuun „{{int:emailuser}}“ bi {{SITENAME}} {{GENDER:$1|schüürd}} wurden. Wan {{GENDER:$2|dü}} üüb detdiar E-Mail swaarest, woort det direkt tu {{GENDER:$1|di|det}} ufschüürer schüürd. Diarbi feit {{GENDER:$1|hi|hat}} {{GENDER:$2|din}} E-Mail-adres tu weden.",
        "usermessage-summary": "Süsteemnooracht seekert.",
        "usermessage-editor": "Süsteemnoorachten siinst",
        "watchlist": "Uun't uug behual",
        "deletepage": "Sidj strik",
        "confirm": "Gudkään",
        "excontent": "diar sted: „$1“",
-       "excontentauthor": "diar sted: „$1“ (iansagst bewerker: [[Special:Contributions/$2|$2]])",
+       "excontentauthor": "Diar sted: „$1“, an di iansagst bewerker wiar: [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskuschuun]])",
        "exbeforeblank": "diar sted föör't leesag maagin: „$1“",
        "delete-confirm": "Strik \"$1\"",
        "delete-legend": "Strike",
        "delete-toobig": "Detdiar sidj hää muar üs $1 {{PLURAL:$1|werjuun|werjuunen}} . Sok sidjen kön ei so gau stregen wurd, ööders san a servers plaat.",
        "delete-warning-toobig": "Detdiar sidj hää muar üs $1 {{PLURAL:$1|werjuun|werjuunen}} . Det striken koon komer maage bi't dootenbeenk.",
        "deleteprotected": "Dü könst detdiar sidj ei strik, auer det seekert wurden as.",
-       "deleting-backlinks-warning": "'''Paase üüb:''' Diar ferwise noch [[Special:WhatLinksHere/{{FULLPAGENAME}}|ööder sidjen]] üüb det sidj, diar dü strik wel. Of det sidj as noch huarööders iinbünjen.",
+       "deleting-backlinks-warning": "<strong>Paase üüb:</strong> Diar ferwise noch [[Special:WhatLinksHere/{{FULLPAGENAME}}|ööder sidjen]] üüb det sidj, diar dü strik wel. Of det sidj as noch huarööders iinbünjen.",
        "rollback": "Feranrangen turagsaat",
        "rollbacklink": "turagsaat",
        "rollbacklinkcount": "$1 {{PLURAL:$1|feranrang|feranrangen}} turagsaat",
        "editcomment": "Tuupfaadet feranrang: <em>$1</em>.",
        "revertpage": "Feranrangen faan [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskuschuun]]) san üüb di leetst stant faan [[User:$1|$1]] turagsaat wurden.",
        "revertpage-nouser": "Feranrangen faan en ferbürgenen brüker turagsaat an det leetst werjuun faan {{GENDER:$1|[[User:$1|$1]]}} weder iinsteld.",
-       "rollback-success": "Feranrangen faan $1 turagsaat an det leetst werjuun faan $2 weder iinsteld.",
+       "rollback-success": "Feranrangen faan {{GENDER:$3|$1}} san turagsaat an det leetst werjuun faan {{GENDER:$4|$2}} as weder iinsteld wurden.",
        "sessionfailure-title": "session feeler",
        "sessionfailure": "Diar as wat skiaf gingen bi't auerdreegen faan din brükerdooten.\nAm dat diar ei noch muar skiaf gongt, as det aktjuun ufbreegen wurden.\nGung turag, an began faan föören.",
        "changecontentmodel": "Det muude faan det sidj feranre",
        "changecontentmodel-cannot-convert": "Det muude faan [[:$1]] koon ei tu typ $2 feranert wurd.",
        "changecontentmodel-nodirectediting": "Uun det $1 muude könst dü ei direkt bewerke",
        "log-name-contentmodel": "Muude-feranrang-logbuk",
-       "log-description-contentmodel": "Föörkemen am det sidjenmuude",
+       "log-description-contentmodel": "Detdiar sidj wiset feranrangen bi det muude faan sidjen, an uk sok sidjen, diar efter en ööder muude maaget san.",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|hää}} det muude faan sidj $3 faan „$4“ efter „$5“ feranert.",
        "logentry-contentmodel-change-revertlink": "turagsaat",
        "logentry-contentmodel-change-revert": "turagsaat",
        "sp-contributions-newbies-sub": "Faan nei brükern",
        "sp-contributions-newbies-title": "Brükerbidracher faan nei brükern",
        "sp-contributions-blocklog": "Sper-logbuk",
-       "sp-contributions-suppresslog": "Ei uunwiset brüker-bidracher",
-       "sp-contributions-deleted": "Stregen bidracher",
+       "sp-contributions-suppresslog": "Fersteecht {{GENDER:$1|brükerbidracher}}",
+       "sp-contributions-deleted": "Stregen {{GENDER:$1|brüker}} bidtacher",
        "sp-contributions-uploads": "Huuchschüürd bilen",
        "sp-contributions-logs": "Logbuken",
        "sp-contributions-talk": "Diskuschuun",
        "whatlinkshere-hideredirs": "$1 widjerfeerangen",
        "whatlinkshere-hidetrans": "$1 iinbünjen föörlaagen",
        "whatlinkshere-hidelinks": "$1 ferwisangen",
-       "whatlinkshere-hideimages": "Ferwisangen tu datein $1",
+       "whatlinkshere-hideimages": "$1 ferwisangen tu datein",
        "whatlinkshere-filters": "Filtere",
        "autoblockid": "Automaatisk sper #$1",
        "block": "Brüker spere",
        "cant-move-to-user-page": "Dü mutst nian sidjen üüb en brükersidj fersküüw (bluas üüb onersidjen).",
        "cant-move-category-page": "Dü mutst nian kategoriisidjen fersküüw.",
        "cant-move-to-category-page": "Dü mutst nian sidj tu en kategoriisidj fersküüw.",
-       "newtitle": "Müülj:",
+       "newtitle": "Nei tiitel:",
        "move-watch": "Jodiar sidjen uun't uug behual",
        "movepagebtn": "Sidj fersküüw",
        "pagemovedsub": "Fersküüwen hää loket",
        "movenosubpage": "Det sidj hää nian onersidjen.",
        "movereason": "Grünj:",
        "revertmove": "turag fersküüw",
-       "delete_and_move_text": "== Striken nuadag  ==\n\nDet sidj „[[:$1]]“ as al diar. Wel dü det strik, am det sidj tu fersküüwen?",
+       "delete_and_move_text": "Det sidj „[[:$1]]“ as al diar. Wel dü det strik, am det sidj tu fersküüwen?",
        "delete_and_move_confirm": "Ja, sidj strik",
        "delete_and_move_reason": "Stregen, am steeds för det fersküüwen faan „[[$1]]“ tu maagin.",
        "selfmove": "A nöömer san likedenang. Dü könst nian sidj üüb ham salew fersküüw.",
        "move-leave-redirect": "Widjerfeerang iinracht",
        "protectedpagemovewarning": "'''Paase üüb: Detdiar sidj as speret wurden. Bluas administratooren kön det fersküüw.'''\nUun't logbuk stäänt muar diartu:",
        "semiprotectedpagemovewarning": "'''Paase üüb:''' Detdiar sidj as dialwiis tu't bewerkin speret wurden. Bluas gudkäänd brükern kön det fersküüw.\nUun't logbuk stäänt muar diartu:",
-       "move-over-sharedrepo": "== Datei as al diar ==\n[[:$1]] stäänt uun en gemiansoom brükt archiif. Det fersküüwen üüb didiar nööm auerskraft det gemiansoom brükt datei.",
+       "move-over-sharedrepo": "[[:$1]] stäänt uun en gemiansoom brükt archiif. Det fersküüwen üüb didiar nööm auerskraft det gemiansoom brükt datei.",
        "file-exists-sharedrepo": "Didiar dateinööm woort al uun en gemiansoom archiif brükt. Wees so gud, an nem en öödern nööm.",
        "export": "Sidjen eksportiare",
        "exporttext": "Mä detdiar spezial-sidj könst dü di tekst mä aal sin werjuunen tu en XML-datei eksportiare. Det nei datei koon do faan en ööder MediaWiki-Wiki [[Special:Import|importiaret]] wurd.\n\nSkriiw a sidjennöömer iin uun det tekstfial (man bluas ään noom uun arke rä).\n\nDi eksport as uk mä [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] mögelk, tun bispal för det [[{{MediaWiki:Mainpage}}]].",
        "tooltip-feed-rss": "RSS-feed för detdiar sidj",
        "tooltip-feed-atom": "Atom-feed för detdiar sidj",
        "tooltip-t-contributions": "List mä bidracher faan {{GENDER:$1|didiar brüker|detdiar brüker}} uunluke",
-       "tooltip-t-emailuser": "En e-mail tu didiar brüker schüür",
+       "tooltip-t-emailuser": "En E-Mail tu {{GENDER:$1|didiar|detdiar}} brüker schüür",
        "tooltip-t-info": "Muar auer detdiar sidj",
        "tooltip-t-upload": "Datein huuchschüür",
        "tooltip-t-specialpages": "Auersicht auer aal a spezial-sidjen",
        "lastmodifiedatby": "Det sidj as tuleetst di $1 am a klook $2 faan $3 feranert wurden.",
        "othercontribs": "Üüb grünjlaag faan det werk faan $1.",
        "others": "öödern",
-       "siteusers": "{{SITENAME}} {{PLURAL:$2|brüker|brükern}} $1",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1|brüker}}|brükern}} $1",
        "anonusers": "{{PLURAL:$2|anonüümen|anonüüm}} {{SITENAME}}-{{PLURAL:$2|brüker|brükern}} $1",
        "creditspage": "Sidjeninformatsjuunen",
        "nocredits": "Diar san nian sidjeninformatsjuunen",
index e10b921..837fbbe 100644 (file)
        "toc": "Ynhâld",
        "showtoc": "sjen litte",
        "hidetoc": "net sjen litte",
+       "collapsible-collapse": "Ynklappe",
+       "collapsible-expand": "Utklappe",
        "confirmable-yes": "Ja",
        "confirmable-no": "Nee",
        "thisisdeleted": "\"$1\" lêze of werombringe?",
        "externaldberror": "Der is in fout by it oanmelden by de database of jo hawwe gjin tastimming om jo ekstern account by te wurkjen.",
        "login": "Oanmelde",
        "nav-login-createaccount": "Oanmelde",
-       "userlogin": "Oanmelde",
-       "userloginnocreate": "Ynlogge",
        "logout": "Ofmelde",
        "userlogout": "Ofmelde",
        "notloggedin": "Net oanmelde",
        "userlogin-noaccount": "Hasto gjin akkount?",
        "userlogin-joinproject": "Meidwaan {{SITENAME}}",
-       "nologin": "Noch net oanmelden as meidogger? $1.",
-       "nologinlink": "Meitsje in brûker oan",
        "createaccount": "Registrearje",
-       "gotaccount": "Hawwe jo jo al as meidogger oanmelde? '''$1'''.",
-       "gotaccountlink": "Oanmelde",
-       "userlogin-resetlink": "Ynlochdata fergetten?",
        "userlogin-resetpassword-link": "Wachtwurd fergetten?",
        "createacct-emailrequired": "E-mailadres",
        "createacct-emailoptional": "E-mailadres (net ferplichte)",
        "createacct-another-email-ph": "E-mailadres ynfiere",
        "createaccountmail": "troch e-mail",
        "createacct-realname": "Echte namme (net ferplichte)",
-       "createaccountreason": "Reden:",
        "createacct-reason": "Reden",
        "createacct-reason-ph": "Wêrom makkesto in oare akkount?",
        "createacct-submit": "Meitsje in akkount",
        "saveprefs": "Bewarje",
        "restoreprefs": "Tebek nei de standertynstellings",
        "prefs-editing": "Siden bewurkje",
-       "rows": "Rigen",
-       "columns": "Kolommen",
        "searchresultshead": "Sykje",
        "stub-threshold": "Drompel foar markearring <a href=\"#\" class=\"stub\">stobbe</a> (bytes):",
        "stub-threshold-disabled": "Utskeakele",
        "userrights-reason": "Reden:",
        "userrights-no-interwiki": "Jo hawwe gjin foech om rjochten fan meidoggers op oare wikis te wizigjen.",
        "userrights-nodatabase": "Databank $1 bestiet net of is net lokaal.",
-       "userrights-nologin": "Jo moatte jo [[Special:UserLogin|oanmelde]] as rjochtenútfurder om rjochten fan meidoggers wizigje te kinnen.",
-       "userrights-notallowed": "Jo hawwe gjin rjochten om rjochten fan meidoggers te wizigjen.",
        "userrights-changeable-col": "Groepen dy't jo beheare kinne",
        "userrights-unchangeable-col": "Groepen dy't jo net beheare kinne",
        "userrights-irreversible-marker": "$1*",
        "recentchanges-label-minor": "Dit is in tekstwiziging",
        "recentchanges-label-bot": "Dizze wiziging is troch in robot makke",
        "recentchanges-label-unpatrolled": "Dizze wiziging is noch net neisjûn",
+       "recentchanges-label-plusminus": "De sidegrutte is mei dit oantal bytes wizige",
        "recentchanges-legend-heading": "<strong>Leginda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (sjoch ek de [[Special:NewPages|list mei nije siden]])",
        "rcnotefrom": "Dit binne de feroarings sûnt <b>$2</b> (maksimaal <b>$1</b>).",
        "revdelete-restricted": "hat beheinings oplein oan behearders",
        "revdelete-unrestricted": "hat beheinings foar behearders goedmakke",
        "rightsnone": "(gjin)",
-       "revdelete-summary": "gearfetting bewurkje",
        "feedback-back": "Foarige",
        "feedback-cancel": "Annulearje",
        "feedback-close": "Dien",
        "feedback-submit": "Ferstjoere",
        "feedback-useragent": "Useragent:",
        "searchsuggest-search": "Sykje",
-       "api-error-unknown-code": "Unbekende flater: \"$1\".",
        "api-error-unknownerror": "Unbekende flater: \"$1\".",
        "duration-seconds": "$1 {{PLURAL:$1|sekonde|sekonden}}",
        "duration-minutes": "$1 {{PLURAL:$1|minút|minuten}}",
index 4b95c8d..2382292 100644 (file)
        "page_first": "primeira",
        "page_last": "derradeira",
        "histlegend": "Selección de diferenzas: Marque as versións que queira comparar e prema no botón ao final.<br />\nLenda: '''({{int:cur}})''' = diferenza coa versión actual, '''({{int:last}})''' = diferenza coa versión precedente, '''{{int:minoreditletter}}''' = edición pequena.",
-       "history-fieldset-title": "Explorar o historial",
-       "history-show-deleted": "Borrados soamente",
+       "history-fieldset-title": "Buscar revisións",
+       "history-show-deleted": "Só con borrados de revisións",
        "histfirst": "as máis antigas",
        "histlast": "as máis novas",
        "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
        "prefs-help-prefershttps": "Esta preferencia ha aplicarse no seu vindeiro acceso ao sistema.",
        "prefswarning-warning": "Fixo cambios nas súas preferencias que aínda non se gardaron.\nSe deixa esta páxina sen premer en \"$1\", non se actualizarán as súas preferencias.",
        "prefs-tabs-navigation-hint": "Consello: Pode empregar as frechas esquerda e dereita para navegar polas lapelas da lista.",
-       "userrights": "Xestión dos dereitos de usuario",
+       "userrights": "Dereitos de usuario",
        "userrights-lookup-user": "Seleccionar un usuario",
        "userrights-user-editname": "Escriba un nome de usuario:",
        "editusergroup": "Cargar os grupos de usuario",
        "rcfilters-invalid-filter": "Filtro no válido",
        "rcfilters-empty-filter": "Non hai filtros activos. Móstranse tódalas contribucións.",
        "rcfilters-filterlist-title": "Filtros",
+       "rcfilters-filterlist-whatsthis": "Que é isto?",
        "rcfilters-filterlist-feedbacklink": "Deixar comentarios sobre os novos filtros (en fase beta)",
        "rcfilters-highlightbutton-title": "Resaltar resultados",
        "rcfilters-highlightmenu-title": "Seleccione unha cor",
        "rcfilters-highlightmenu-help": "Seleccione unha cor para resaltar esta propiedade",
        "rcfilters-filterlist-noresults": "Non se atoparon filtros",
+       "rcfilters-noresults-conflict": "Non se atoparon resultados porque os criterios de busca están en conflito.",
+       "rcfilters-state-message-fullcoverage": "Seleccionar tódolos filtros dun grupo é o mesmo que non seleccionar ningún, polo que este filtro non ten efecto. O grupo inclúeː $1",
        "rcfilters-filtergroup-registration": "Rexistro de usuario",
        "rcfilters-filter-registered-label": "Rexistrado",
        "rcfilters-filter-registered-description": "Editores autenticados.",
        "rcfilters-filter-unregistered-label": "Non rexistrado",
        "rcfilters-filter-unregistered-description": "Editores que non están autenticados.",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Este filtro está en conflito {{PLURAL:$2|co seguinte filtro|cos seguintes filtros}} Experience, que {{PLURAL:$2|atopa|atopan}} só usuarios rexistradosː $1",
        "rcfilters-filtergroup-authorship": "Editar autoría",
        "rcfilters-filter-editsbyself-label": "As súas propias edicións",
        "rcfilters-filter-editsbyself-description": "Edicións súas.",
        "rcfilters-filter-editsbyother-label": "Edicións doutros.",
        "rcfilters-filter-editsbyother-description": "Edicións creadas por outros usuarios (non por vostede).",
        "rcfilters-filtergroup-userExpLevel": "Nivel de experiencia (só para usuarios rexistrados)",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Os filtros Experience só atopan usuarios rexistrados, polo que este filtro está en conflito co filtro \"non rexistrado\".",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "O filtro \"non rexistrados\" está en conflito cun ou máis filtros Experience, que só atopan usuarios rexistrados. Os filtros en conflito están marcados na área dos filtros activos, arriba.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Chegados recentemente",
        "rcfilters-filter-user-experience-level-newcomer-description": "Menos de 10 edicións e 4 días de actividade.",
        "rcfilters-filter-user-experience-level-learner-label": "Aprendices",
        "rcfilters-filter-bots-description": "Edicións realizadas por ferramentas automatizadas.",
        "rcfilters-filter-humans-label": "Humano (non bot)",
        "rcfilters-filter-humans-description": "Edicións realizadas por editores humanos.",
+       "rcfilters-filtergroup-reviewstatus": "Revisar o estado",
+       "rcfilters-filter-patrolled-label": "Patrulladas",
+       "rcfilters-filter-patrolled-description": "Edicións marcadas como patrulladas.",
+       "rcfilters-filter-unpatrolled-label": "Sen patrullar",
+       "rcfilters-filter-unpatrolled-description": "Edicións non marcadas como patrulladas.",
        "rcfilters-filtergroup-significance": "Importancia",
        "rcfilters-filter-minor-label": "Edicións menores",
        "rcfilters-filter-minor-description": "Edicións que o autor etiquetou como menores.",
index b4db8f3..653130a 100644 (file)
@@ -58,6 +58,7 @@
        "tog-watchlisthidebots": "Bot-Änderige in d Beobachtigslischt usblende",
        "tog-watchlisthideminor": "Chlyni Änderige nit in de Beobachtigslischte aazeige",
        "tog-watchlisthideliu": "Bearbeitige vu aagmäldete Benutzer usblände",
+       "tog-watchlistreloadautomatically": "Wänn e Filter gänderet woren isch, d Beobachtigslischt automatisch nei lade (brucht JavaScript)",
        "tog-watchlisthideanons": "Bearbeitige vu anonyme Benutzer (IP-Adresse) usblände",
        "tog-watchlisthidepatrolled": "vum Fäldhieter aagluegti Änderige in dr Beobachtigslischt usblände",
        "tog-watchlisthidecategorization": "Kategorisierig vo de Syte nid zeige",
        "tagline": "Us {{SITENAME}}",
        "help": "Hilf",
        "search": "Suech",
+       "search-ignored-headings": " #<!-- die Zylede nit ändere --> <pre>\n# Iberschrifte, wu vu dr Suechi ignoriert wäre.\n# Die Änderige wäre wirksam, sobald d Syte mit dr Iberschrift indexiert woren isch.\n# Du chasch d Sytenindexierig zwinge, indäm e Nulledit machsch.\n# Syntax:\n#   * Alles, was bis zum Zyledenänd noch ere Rute („#“) chunnt, isch e Kommentar.\n#   * E jedi nit-lääri Zylede isch dr Titel, wu exakt mueß ignoriert wäre.\nFueßnote\nWeblink\nLueg au\n #</pre> <!-- die Zylede nit ändere -->",
        "searchbutton": "Suech",
        "go": "Site",
        "searcharticle": "Sueche",
        "history": "Versione",
        "history_short": "Versione/Autore",
+       "history_small": "Versionsgschicht",
        "updatedmarker": "(gändret syt mym letschte Bsuech)",
        "printableversion": "Druck-Aasicht",
        "permalink": "Bschtändigi URL",
        "databaseerror-query": "Abfrog: $1",
        "databaseerror-function": "Funktion: $1",
        "databaseerror-error": "Fähler: $1",
+       "transaction-duration-limit-exceeded": "Go ne großi Verzegerig in dr Datereplikation z vermyyde, isch die Transaktion abbroche wore. D Schrybduur ($1) het d Gränze vu $2 Sekunden iberschritte. Wänn du vyl Objäkt uf s Mol ändere duesch, versuech statt däm, d Änderige uf mehreri Operationen ufzdeile.",
        "laggedslavemode": "Warnig: di letschte Änderige wäre u. U. nonig aazeigt!",
        "readonly": "Datebank isch gsperrt",
        "enterlockreason": "Bitte gib e Grund y, worum d Datebank soll gsperrt wäre un e Yschätzig wie lang si soll gsperrt blybe",
-       "readonlytext": "D {{SITENAME}}-Datebank isch e Zyd lang gsperrt fir Nejytreg un Änderige. Bitte versuech s speter no mol.\n\nGrund vu dr Sperrig: $1",
+       "readonlytext": "D Datebank isch e Zyt lang gsperrt fir Nejyytreg un Änderige. Bitte versuech s speter no mol.\n\nGrund vu dr Sperrig: $1",
        "missing-article": "Dr Täkscht fir „$1“ $2 isch nit in dr Datebank gfunde wore.\n\nDie Syte isch villicht glescht oder verschobe wore.\n\nWänn s des nit isch, hesch villicht e Fähler in dr Software gfunde. Bitte mäld des eme [[Special:ListUsers/sysop|Ammann]] un gib d URL derzue aa.",
        "missingarticle-rev": "(Versionsnummere: $1)",
        "missingarticle-diff": "(Unterschid zwische Versione: $1, $2)",
        "readonly_lag": "D Datebank isch automatisch gperrt wore, wil di verteilte Datebankserver (Sklave) mien mit em Hauptdatebankserver (Meischter) abgliche wäre.",
+       "nonwrite-api-promise-error": "Dr HTTP-Header „Promise-Non-Write-API-Action“ isch gsändet wore, aber d Aafrog isch an e API-Schrybmodul gange.",
        "internalerror": "Interner Fähler",
        "internalerror_info": "Interne Fähler: $1",
        "internalerror-fatal-exception": "Fatale Uusnahmefähler vum Typ „$1“",
        "cannotloginnow-title": "Aamälde goot grad nit",
        "cannotloginnow-text": "Aamälde goot nit, derwyylscht du $1 bruuchsch",
        "cannotcreateaccount-title": "Benutzerkonto cha nid aagleit wäre.",
+       "cannotcreateaccount-text": "S diräkt Aalege vu Benutzerkonten isch uf däm Wiki nit aktiviert.",
        "yourdomainname": "Dyyni Domäne",
        "password-change-forbidden": "Du chasch uf däm Wiki kei Passwerter ändere.",
        "externaldberror": "Entwäder s lit e Fähler bi dr externe Authentifizierung vor, oder Du derfsch Dyy extern Benutzerkonto nid aktualisiere.",
        "userlogin-resetpassword-link": "Passwort vergässe?",
        "userlogin-helplink2": "Hilf bim Aamälde",
        "userlogin-loggedin": "Du bisch scho as {{GENDER:$1|$1}} aagmäldet.\nBruuch s Formular unte go Di unter eme andere Benutzername aamälde.",
+       "userlogin-reauth": "Du muesch di nomol aamälde go z verifiziere, ass du {{GENDER:$1|$1}} bisch.",
        "userlogin-createanother": "En ander Benutzerkonto aalege",
        "createacct-emailrequired": "E-Mail-Adräss",
        "createacct-emailoptional": "E-Mail-Adräss (optional)",
        "createacct-email-ph": "Gib Dyy E-Mail-Adräss yy",
        "createacct-another-email-ph": "Gib Dyy E-Mail-Adräss yy",
        "createaccountmail": "E temporär Zuefallspasswort bruuchen un an di aagee E-Mail-Adräss schicke",
+       "createaccountmail-help": "Cha brucht wäre zum e Benutzerkonto fir e anderi Person aazlege, ohni ass mer s Passwort mueß wisse.",
        "createacct-realname": "Richtige Name (optional)",
        "createacct-reason": "Grund",
        "createacct-reason-ph": "Wurum Du ne ander Benutzerkonto aaleisch",
+       "createacct-reason-help": "Im Neiaamäldigs-Logbuech aazeigti Nochricht",
        "createacct-submit": "Dyy Benutzerkonto aalege",
        "createacct-another-submit": "Benutzerkonto aalege",
+       "createacct-continue-submit": "Wytermache mit em Aalege vun eme Benutzerkonto",
+       "createacct-another-continue-submit": "Wytermache mit em Aalege vun eme Benutzerkonto",
        "createacct-benefit-heading": "{{SITENAME}} wird vu Mänsche wie Dir gschaffe.",
        "createacct-benefit-body1": "{{PLURAL:$1|Bearbeitig|Bearbeitige}}",
        "createacct-benefit-body2": "{{PLURAL:$1|Syte|Syte}}",
        "nocookiesnew": "Dr Benutzerzuegang isch aaglait wore, aber Du bisch nid yygloggt. {{SITENAME}} brucht fir die Funktion Cookies, bitte tue die aktiviere un logg Di derno mit Dyynem neje Benutzername un em Passwort, wu drzue ghert, yy.",
        "nocookieslogin": "{{SITENAME}} brucht Cookies fir e Aamäldig. Du hesch d Cookies deaktiviert. Aktivier si bitte un versuech s no mol.",
        "nocookiesfornew": "S Benutzerkonto isch nit aagleit wore, wel d Datehärchumft nit het chenne uusgmacht wäre.\nS mueß sichergstellt syy, ass Cookies aktiviert sin. Derno ddie Syte nomol lade un s wider versueche.",
+       "createacct-loginerror": "S Benutzerkonto isch erfolgrych aagleit wore, aber du hesch nit chenne automatisch aagmäldet wäre. Bitte mach wyter mit dr [[Special:UserLogin|manuälle Aamäldig]].",
        "noname": "Du muesch e Benutzername aagee.",
-       "loginsuccesstitle": "Aamäldig erfolgrych",
+       "loginsuccesstitle": "Aagmäldet",
        "loginsuccess": "'''Du bisch jetz als \"$1\" bi {{SITENAME}} aagmäldet.'''",
-       "nosuchuser": "Dr Benutzername \"$1\" git s nit.\n\nIberprief d Schrybwys, oder mäld Di as [[Special:CreateAccount|neje Benutzer aa]].",
+       "nosuchuser": "Dr Benutzername „$1“ git s nit.\n\nIberprief d Schrybwys, au d Groß- un Chlaischrybig, oder mäld Di as [[Special:CreateAccount|neje Benutzer aa]].",
        "nosuchusershort": "S git kei Benutzername „$1“. Bitte iberprief d Schrybwys.",
        "nouserspecified": "Bitte gib e Benutzername yy.",
        "login-userblocked": "Dää Benutzer isch gsperrt. Aamäldig nit erlaubt.",
        "minoredit": "Numen es birebitzeli gänderet",
        "watchthis": "Dä Artikel beobachte",
        "savearticle": "Syte spychere",
+       "publishpage": "Syte spychere",
        "preview": "Vorschou",
        "showpreview": "Vorschau aaluege",
        "showdiff": "Änderige zeige",
index 59593c6..8f7dd00 100644 (file)
@@ -37,7 +37,8 @@
                        "IKhitron",
                        "Matma Rex",
                        "Or",
-                       "שמזן"
+                       "שמזן",
+                       "Uziel302"
                ]
        },
        "tog-underline": "סימון קישורים בקו תחתי:",
        "page_first": "ראשון",
        "page_last": "אחרון",
        "histlegend": "בחירת גרסאות להשוואה: {{GENDER:|בחר|בחרי|בחרו}} את הגרסאות ש{{GENDER:|ברצונך|ברצונך|ברצונכם}} להשוות ולאחר מכן {{GENDER:|הקש|הקישי|הקישו}} על Enter או {{GENDER:|לחץ|לחצי|לחצו}} על הכפתור שלמטה.<br />\nמקרא: <strong>({{int:cur}})</strong> = השוואה עם הגרסה הנוכחית, <strong>({{int:last}})</strong> = השוואה עם הגרסה הקודמת, <strong>{{int:minoreditletter}}</strong> = עריכה משנית.",
-       "history-fieldset-title": "×\97×\99פ×\95ש ×\91×\94×\99ס×\98×\95ר×\99×\99ת ×\94×\93×£",
+       "history-fieldset-title": "×\97×\99פ×\95ש ×\92רס×\90×\95ת",
        "history-show-deleted": "גרסאות מוסתרות בלבד",
        "histfirst": "הישנות ביותר",
        "histlast": "החדשות ביותר",
        "rcfilters-invalid-filter": "מסנן בלתי־תקין",
        "rcfilters-empty-filter": "אין מסננים פעילים. כל התרומות מוצגות.",
        "rcfilters-filterlist-title": "מסננים",
+       "rcfilters-filterlist-whatsthis": "מה זה?",
        "rcfilters-filterlist-feedbacklink": "שליחת משוב על המסננים החדשים (בטא)",
        "rcfilters-highlightbutton-title": "הבלטת התוצאות",
        "rcfilters-highlightmenu-title": "בחירת צבע",
        "rcfilters-highlightmenu-help": "בחירת צבע להדגשת מאפיין זה",
        "rcfilters-filterlist-noresults": "לא נמצאו מסננים",
+       "rcfilters-noresults-conflict": "לא נמצאו תוצאות משום שקריטריוני החיפוש מתנגשים",
+       "rcfilters-state-message-subset": "המסנן הזה אינו משפיע כי התוצאות שלו כלולות {{PLURAL:$2|במסנן הרחב יותר הבא|במסננים הרחבים יותר הבאים}} (נסו להדגיש כדי להבדיל ביניהם): $1",
+       "rcfilters-state-message-fullcoverage": "בחירת כל המסננים בקבוצה זהה לביטול כל הבחירות, אז למסנן הזה אין השפעה. הקבוצה כוללת: $1",
        "rcfilters-filtergroup-registration": "רישום העורכים",
        "rcfilters-filter-registered-label": "רשומים",
        "rcfilters-filter-registered-description": "עורכים שנכנסו לחשבון.",
        "rcfilters-filter-unregistered-label": "לא רשומים",
        "rcfilters-filter-unregistered-description": "עורכים שלא נכנסו לחשבון.",
-       "rcfilters-filter-unregistered-conflicts-user-experience-level": "המסנן \"לא רשומים\" אינו פעיל כי השפעתו מתבטלת באמצעות {{PLURAL:$2|מסנן רמת הניסיון הבא, שמוצא|מסנני רמת הניסיון הבאים, שמוצאים}} רק משתמשים רשומים: $1",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "המסנן הזה פעיל מתנגש עם {{PLURAL:$2|מסנן רמת הניסיון הבא, שמוצא|מסנני רמת הניסיון הבאים, שמוצאים}} רק משתמשים רשומים: $1",
        "rcfilters-filtergroup-authorship": "מבצעי העריכה",
        "rcfilters-filter-editsbyself-label": "עריכות שלך",
        "rcfilters-filter-editsbyself-description": "עריכות שביצעת בעצמך.",
        "rcfilters-filter-editsbyother-label": "עריכות של אחרים",
        "rcfilters-filter-editsbyother-description": "עריכות שבוצעו על־ידי משתמשים אחרים (מלבדך).",
        "rcfilters-filtergroup-userExpLevel": "רמת ניסיון (למשתמשים רשומים בלבד)",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "×\94×\9eסנ×\9f ×\94×\96×\94 ×\90×\99× ×\95 ×¤×¢×\99×\9c ×\9b×\99 ×\94×\95×\90 ×\9e×\95צ×\90 ×¨×§ ×\9eשת×\9eש×\99×\9d ×¨×©×\95×\9e×\99×\9d, ×\95×\9c×\9b×\9f ×\94×\9eסנ×\9f \"×\9c×\90 ×¨×©×\95×\9e×\99×\9d\" ×\9e×\91×\98×\9c ×\90ת ×\94שפעת×\95.",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "המסנן \"לא רשומים\" מתנגש עם אחד או יותר ממסנני רמת הניסיון. מסנני רמת ניסיון מוצאים משתמשים רשומים בלבד. המסננים המתנגשים מסומנים לעיל כבלתי־פעילים.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "×\9eסננ×\99 ×\94× ×\99ס×\99×\95×\9f ×\9e×\95צ×\90×\99×\9d ×¨×§ ×\9eשת×\9eש×\99×\9d ×¨×©×\95×\9e×\99×\9d, ×\9b×\9a ×©×\9eסנ×\9f ×\96×\94 ×\9eתנ×\92ש ×¢×\9d ×\94×\9eסנ×\9f \"×\9c×\90 ×¨×©×\95×\9e×\99×\9d\".",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "המסנן \"לא רשומים\" מתנגש עם אחד או יותר ממסנני רמת הניסיון, שמוצאים משתמשים רשומים בלבד. המסננים המתנגשים מסומנים באזור המסננים הפעילים לעיל.",
        "rcfilters-filter-user-experience-level-newcomer-label": "חדשים",
        "rcfilters-filter-user-experience-level-newcomer-description": "פחות מ־10 עריכות ומ־4 ימים של פעילות.",
        "rcfilters-filter-user-experience-level-learner-label": "לומדים",
        "rcfilters-filter-categorization-description": "רישומים על דפים שנוספו לקטגוריות או הוסרו מהן.",
        "rcfilters-filter-logactions-label": "פעולות יומן",
        "rcfilters-filter-logactions-description": "פעולות מנהליות, יצירת חשבונות, מחיקת דפים, העלאות...",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "מסנן \"עריכות משניות\" מתנגש עם מסנן סוג השינויים אחד או יותר, כי סוגים מסוימים של שינויים אינם יכולים להיות מסווגים בתור \"משניים\". המסננים המתנגשים מסומנים באזור המסננים הפעילים לעיל.",
+       "rcfilters-hideminor-conflicts-typeofchange": "סוגים מסוימים של שינויים אינם יכולים להיות מסווגים כ\"משניים\", כך שמסנן זה מתנגש עם מסנן סוג השינויים הבא: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "מסנן סוג השינויים הזה מתנגש עם מסנן \"עריכות משניות\". סוגים מסוימים של שינויים אינם יכולים מסווגים כ\"משניים\".",
        "rcnotefrom": "להלן {{PLURAL:$5|השינוי שבוצע|השינויים שבוצעו}} מאז <strong>$3, $4</strong> (מוצגים עד <strong>$1</strong>).",
        "rclistfrom": "הצגת שינויים חדשים החל מ־$2, $3",
        "rcshowhideminor": "$1 עריכות משניות",
index 6bbe11e..dd537f5 100644 (file)
        "rcfilters-filter-bots-label": "बॉट",
        "rcfilters-filter-humans-label": "मानव (बॉट नहीं)",
        "rcfilters-filter-humans-description": "मानव संपादक द्वारा किए गए संपादन।",
+       "rcfilters-filter-patrolled-label": "गश्त",
        "rcfilters-filtergroup-significance": "महत्व",
        "rcfilters-filter-minor-label": "छोटा संपादन",
        "rcfilters-filter-major-label": "गैर-मामूली संपादन",
index 9773e67..bbe19f7 100644 (file)
        "talk": "Razgovor",
        "views": "Pogledi",
        "toolbox": "Pomagala",
-       "tool-link-userrights": "Promijeni {{GENDER:$1|suradnikove|suradničine}} grupe",
+       "tool-link-userrights": "Promijeni {{GENDER:$1|suradnikovu|suradničinu}} pripadnost skupinama",
        "tool-link-userrights-readonly": "Vidi {{GENDER:$1|suradnikovu|suradničinu|suradničku}} pripadnost skupinama",
        "tool-link-emailuser": "Pošalji {{GENDER:$1|suradniku|suradnici}} e-poruku",
        "userpage": "Vidi suradnikovu stranicu",
        "currentrev": "Trenutačna inačica",
        "currentrev-asof": "Trenutačna izmjena od $1",
        "revisionasof": "Inačica od $1",
-       "revision-info": "Inačica od $1 koju je unio/unijela $2",
+       "revision-info": "Inačica $3 od $4 u $5 koju je {{GENDER:$6|unio|unijela}} {{GENDER:$6|$2}}$7",
        "previousrevision": "←Starija inačica",
        "nextrevision": "Novija inačica→",
        "currentrevisionlink": "vidi trenutačnu inačicu",
        "yournick": "Vaš nadimak (za potpisivanje)",
        "prefs-help-signature": "Komentari na stranicama za razgovor trebali bi biti potpisani s \"<nowiki>~~~~</nowiki>\" što će biti pretvoreno u Vaš potpis i datum.",
        "badsig": "Kôd Vašeg potpisa nije valjan; provjerite HTML tagove.",
-       "badsiglength": "Vaš potpis je predugačak.\nNe smije biti duži od $1 {{PLURAL:$1|znaka|znaka|znakova}}.",
+       "badsiglength": "Vaš je potpis predugačak.\nNe smije biti duži od $1 {{PLURAL:$1|znaka|znakova}}.",
        "yourgender": "Na koji način želite da Vam se ostali suradnici obraćaju?",
        "gender-unknown": "Kad Vas se spominje, programska će oprema pokušati upotrijebiti srednji rod kad god je to moguće.",
        "gender-male": "Uređivač sam wikistranica.",
        "editusergroup": "Učitaj suradničke skupine",
        "editinguser": "Promjena suradničkih prava {{GENDER:$1|suradnika|suradnice}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Pregled suradničkih prava {{GENDER:$1|suradnika|suradnice}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Uredi {{GENDER:$1|suradničke}} skupine",
+       "userrights-editusergroup": "Uređivanje {{GENDER:$1|suradnikove|suradničine}} pripadnosti skupinama",
        "userrights-viewusergroup": "Vidi {{GENDER:$1|suradničke}} skupine",
        "saveusergroups": "Spremi {{GENDER:$1|suradničke}} grupe",
        "userrights-groupsmember": "{{GENDER:$2|Pripadnik|Pripadnica}} skupina:",
        "excontent": "sadržaj je bio: '$1'",
        "excontentauthor": "sadržaj je bio: »$1«; {{GENDER:$2|jedini pridonositelj bio je|jedina pridonositeljica bila je}} [[Special:Contributions/$2|$2]] ([[User talk:$2|razgovor]])",
        "exbeforeblank": "sadržaj prije brisanja je bio: '$1'",
-       "delete-confirm": "Obriši \"$1\"",
+       "delete-confirm": "Pobriši »$1«",
        "delete-legend": "Izbriši",
        "historywarning": "<strong>Upozorenje:</strong> stranica koju želite izbrisati ima starije izmjene s $1 {{PLURAL:$1|inačicom|inačice|inačica}}:",
        "historyaction-submit": "Prikaži",
        "feedback-bugnew": "Provjereno. Prijavi novi \"bug\"",
        "feedback-bugornote": "Ako ste spremni detaljno opisati tehnički problem molimo [$1 prijavite \"bug\"].\nInače, možete ispuniti jednostavan obrazac u nastavku. Vaš komentar biti će dodan na stranicu \"[$3 $2]\", zajedno s vašim suradničkim imenom i imenom internetskog preglednika koji rabite.",
        "feedback-cancel": "Odustani",
-       "feedback-close": "Gotovo",
+       "feedback-close": "Riješeno",
        "feedback-external-bug-report-button": "Arhiviraj tehnički zadatak",
        "feedback-dialog-title": "Slanje povratnih informacija",
        "feedback-dialog-intro": "Da biste poslali povratnu informaciju, rabite jednostavan obrazac. Vaš će komentar biti dodan na stranici \"$1\" s Vašim suradničkim imenom.",
        "feedback-terms": "Jasno mi je da moje ''user agent'' informacije sadrže točne informacije o mom pregledniku i operativnom sustavu te da će biti javno dostupne zajedno s mojom povratnom informacijom.",
        "feedback-termsofuse": "Slažem se da povratne informacije objavljujem u skladu s Uvjetima uporabe.",
        "feedback-thanks": "Hvala! Vaš odgovor je snimljen na stranicu \"[$2 $1]\".",
-       "feedback-thanks-title": "Hvala!",
+       "feedback-thanks-title": "Hvala Vam lijepa!",
        "searchsuggest-search": "Pretraži projekt {{SITENAME}}",
        "searchsuggest-containing": "sadrži....",
        "api-error-badtoken": "Interna pogrješka: Token nije ispravan.",
index 2af3f91..f5c2706 100644 (file)
@@ -45,7 +45,8 @@
                        "Bencoke",
                        "Máté",
                        "Wolf Rex",
-                       "BanKris"
+                       "BanKris",
+                       "Notramo"
                ]
        },
        "tog-underline": "Hivatkozások aláhúzá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-highlightmenu-title": "Válassz egy színt",
        "rcfilters-filterlist-noresults": "Nem található szűrő",
        "rcfilters-filter-registered-label": "Regisztrált",
index 7c5bc69..4f3d944 100644 (file)
        "yourdomainname": "Хьа нана-цIа:",
        "login": "Чувала/яла",
        "nav-login-createaccount": "Шоаш довзийтар / Дагара йоазув кхоллар",
-       "userlogin": "Шоаш довзийтар е дагара йоазув кхоллар",
-       "userloginnocreate": "Шоаш довзийта",
        "logout": "Аравала/яла",
        "userlogout": "Аравала/яла",
        "notloggedin": "Оаш шоаш довзийтадац системан",
        "userlogin-noaccount": "Доакъашхочун учета яздар дице хьа?",
        "userlogin-joinproject": "ДIахоттале {{SITENAME}}аца",
-       "nologin": "Дагара йоазув йице хьога? $1.",
-       "nologinlink": "Дагара йоазув хьакхолла",
        "createaccount": "Дагара йоазув хьакхолла",
-       "gotaccount": "Укхаза тхьовре дӀаяьзденна дий шо? $1.",
-       "gotaccountlink": "Чувала/яла",
-       "userlogin-resetlink": "Чувалара/ялара дараш дицданнадий шоана?",
        "userlogin-resetpassword-link": "ТIеракхосс хьа пароль?",
        "userlogin-helplink2": "Система чуваларах новкъостал",
        "userlogin-createanother": "Кхыдола дагара йоазув хьакхолла",
        "createacct-emailoptional": "Электронни почта адрес (ца яздича мегаш да)",
        "createacct-email-ph": "Iочуязде хьа электронни почта адрес",
        "createaccountmail": "Пайда эца ца ховш нийсденна къайладIоагIа, иштта хьадайта из белгалдаь электронни почта адреса тӀа.",
-       "createaccountreason": "Бахьан:",
        "createacct-reason": "Бахьан",
        "createacct-submit": "Хьакхолла учета яздар",
        "createacct-another-submit": "Дагара йоазув хьакхолла",
        "nextn-title": "{{PLURAL:$1|ТIадоагIа $1 яздар|ТIадоагIа $1 яздараш}}",
        "shown-title": "Гойта $1 {{PLURAL:$1|яздаьр|яздаьраш}} укх оáгIон тIа",
        "viewprevnext": "ДIахьажа ($1 {{int:pipe-separator}} $2) ($3)",
-       "searchmenu-exists": "'''Укх вики чу я иштта йола оагӀув «[[:$1]]»'''",
+       "searchmenu-exists": "<strong>Укх вики чу йолаш я оагӀув «[[:$1]]».</strong>",
        "searchmenu-new": "<strong>Хьакхолла оагIув «[[:$1]]» укх вики-проекте!</strong>\n{{PLURAL:$2|0=|Иштта хьажа Iайха лийха оагIонга.|Иштта хьажа хьай лахара хьахиннарашка.}}",
        "searchprofile-articles": "Кертера оагIонаш",
        "searchprofile-images": "Мультимедиа",
        "logentry-newusers-create": "{{GENDER:$2|Доакъашхочо хьакхеллад}} дагара йоазув $1",
        "logentry-upload-upload": "$1 {{GENDER:$2|чуяьккхай}} $3",
        "rightsnone": "(яц)",
-       "revdelete-summary": "хувцамий сурт оттадар",
        "searchsuggest-search": "Хьалаха {{grammar:prepositional|{{SITENAME}}}} чу",
        "expand_templates_preview": "Хьалххе бIаргтохар",
        "pagelang-name": "ОагIув",
index 6bac1e8..1fcdedb 100644 (file)
        "page_first": "prima",
        "page_last": "ultima",
        "histlegend": "Confronto tra versioni: selezionare le caselle corrispondenti alle versioni desiderate e premere Invio o il pulsante in basso.\n\nLegenda: '''({{int:cur}})''' = differenze con la versione attuale, '''({{int:last}})''' = differenze con la versione precedente, '''{{int:minoreditletter}}''' = modifica minore",
-       "history-fieldset-title": "Naviga nella cronologia",
+       "history-fieldset-title": "Ricerca per versioni",
        "history-show-deleted": "Solo versioni cancellate",
        "histfirst": "prima",
        "histlast": "ultima",
        "rcfilters-invalid-filter": "Filtro non valido",
        "rcfilters-empty-filter": "Nessun filtro attivo. Sono mostrati tutti i contributi.",
        "rcfilters-filterlist-title": "Filtri",
+       "rcfilters-filterlist-whatsthis": "Cos'è questo?",
        "rcfilters-highlightmenu-title": "Seleziona un colore",
        "rcfilters-highlightmenu-help": "Seleziona un colore per evidenziare questa proprietà",
        "rcfilters-filterlist-noresults": "Nessun filtro trovato",
+       "rcfilters-noresults-conflict": "Nessun risultato trovato, perché i criteri di ricerca sono in conflitto",
        "rcfilters-filtergroup-registration": "Registrazione utente",
        "rcfilters-filter-registered-label": "Registrato",
        "rcfilters-filtergroup-authorship": "Modifica paternità",
index 2c4c3ba..255bfe5 100644 (file)
        "login": "ログイン",
        "login-security": "あなたが同一人であることを確認します",
        "nav-login-createaccount": "ログインまたはアカウント作成",
-       "userlogin": "ログインまたはアカウント作成",
-       "userloginnocreate": "ログイン",
        "logout": "ログアウト",
        "userlogout": "ログアウト",
        "notloggedin": "ログインしていません",
        "userlogin-noaccount": "登録がまだの場合",
        "userlogin-joinproject": "{{SITENAME}}のアカウントを作成",
-       "nologin": "登録がまだの場合、$1。",
-       "nologinlink": "アカウントを作成してください",
        "createaccount": "アカウント作成",
-       "gotaccount": "アカウントを既に持っている場合、$1。",
-       "gotaccountlink": "ログインしてください",
-       "userlogin-resetlink": "ログイン情報をお忘れですか?",
        "userlogin-resetpassword-link": "パスワードをお忘れですか?",
        "userlogin-helplink2": "ログインについてのヘルプ",
        "userlogin-loggedin": "{{GENDER:$1|$1}} として既にログインしています。\n別の利用者としてログインするには下のフォームを使用してください。",
        "createacct-another-email-ph": "メールアドレスを入力",
        "createaccountmail": "無作為な仮パスワードを生成し、指定のメールアドレスに送信",
        "createacct-realname": "本名 (省略可能)",
-       "createaccountreason": "理由:",
        "createacct-reason": "理由",
        "createacct-reason-ph": "アカウントを作成する理由",
        "createacct-reason-help": "アカウント作成記録に表示されるメッセージ",
        "prefs-help-prefershttps": "この設定は、次回ログインの際に反映されます。",
        "prefswarning-warning": "個人設定にまだ保存されていない変更があります。\n「$1」をクリックせずに離れた場合、個人設定は更新されません。",
        "prefs-tabs-navigation-hint": "ヒント: ← キーと → キーで、タブ一覧内のタブ間を移動できます。",
-       "userrights": "利用者権限を管理",
+       "userrights": "利用者権限",
        "userrights-lookup-user": "利用者を選択",
        "userrights-user-editname": "利用者名を入力:",
        "editusergroup": "利用者グループの表示",
        "editinguser": "利用者<strong> [[User:$1|$1]]</strong> $2 の権限を変更",
        "viewinguserrights": "{{GENDER:$1|利用者}} <strong>[[User:$1|$1]]</strong> $2 の利用者権限",
        "userrights-editusergroup": "利用者グループを編集",
-       "userrights-viewusergroup": "利用者グループ",
+       "userrights-viewusergroup": "{{GENDER:$1|利用者}}グループ",
        "saveusergroups": "{{GENDER:$1|利用者}}グループを保存",
        "userrights-groupsmember": "所属グループ:",
        "userrights-groupsmember-auto": "自動的に付与される権限:",
        "logentry-tag-update-revision": "$1 がページ「$3」の版 $4 のタグを{{GENDER:$2|更新しました}} ($6 を{{PLURAL:$7|追加}}、$8 を{{PLURAL:$9|削除}})",
        "logentry-tag-update-logentry": "$1 がページ「$3」の記録項目 $5 のタグを{{GENDER:$2|更新しました}} ($6 を{{PLURAL:$7|追加}}、$8 を{{PLURAL:$9|削除}})",
        "rightsnone": "(なし)",
-       "revdelete-summary": "編集内容の要約",
        "feedback-adding": "ページへのフィードバックの追加...",
        "feedback-back": "戻る",
        "feedback-bugcheck": "Great! [$1 既出のバグ]に既に含まれていないかご確認ください。",
index 9724c72..c005cf1 100644 (file)
        "anonymous": "{{PLURAL:$1|user|អ្នកប្រើប្រាស់}}អនាមិកនៃ {{SITENAME}}",
        "siteuser": "អ្នកប្រើប្រាស់{{SITENAME}} $1",
        "anonuser": "អ្នកប្រើប្រាស់{{SITENAME}}អនាមិក $1",
-       "lastmodifiedatby": "ទំព័រនេះត្រូវបានប្តូរចុងក្រោយដោយ$3នៅវេលា$2,$1។",
+       "lastmodifiedatby": "ទំព័រនេះត្រូវបានប្តូរចុងក្រោយដោយ $3 នៅវេលា $2,$1។",
        "othercontribs": "ផ្អែកលើការងាររបស់$1។",
        "others": "ផ្សេងៗទៀត",
        "siteusers": "{{PLURAL:$2|អ្នកប្រើប្រាស់|អ្នកប្រើប្រាស់}} {{SITENAME}} $1",
index 7404eea..9b1c36b 100644 (file)
        "page_last": "마지막",
        "histlegend": "차이 선택: 비교하려는 판의 라디오 상자를 선택한 다음 엔터나 아래의 버튼을 누르세요.<br />\n설명: <strong>({{int:cur}})</strong> = 최신 판과 비교, <strong>({{int:last}})</strong> = 이전 판과 비교, <strong>{{int:minoreditletter}}</strong>= 사소한 편집",
        "history-fieldset-title": "역사 찾아보기",
-       "history-show-deleted": "삭제된 것만",
+       "history-show-deleted": "특정판이 삭제된 것만",
        "histfirst": "오래됨",
        "histlast": "최신",
        "historysize": "({{PLURAL:$1|1 바이트|$1 바이트}})",
        "prefs-help-prefershttps": "이 사용자 환경 설정은 다음 로그인부터 적용됩니다.",
        "prefswarning-warning": "사용자 환경 설정에서 바뀐 것이 아직 저장되어 있지 않습니다.\n사용자 환경 설정에서 \"$1\"을 클릭하지 않고 이 페이지를 떠나면 바뀌지 않습니다.",
        "prefs-tabs-navigation-hint": "팁: 탭 목록에서 탭 사이를 둘러보려면 왼쪽과 오른쪽 화살표 키를 사용할 수 있습니다.",
-       "userrights": "사용자 권한 관리",
+       "userrights": "사용자 권한",
        "userrights-lookup-user": "사용자 선택",
        "userrights-user-editname": "사용자 이름 입력:",
        "editusergroup": "사용자 그룹 불러오기",
        "rcfilters-invalid-filter": "유효하지 않은 필터",
        "rcfilters-empty-filter": "활성화된 필터가 없습니다. 모든 기여가 표시됩니다.",
        "rcfilters-filterlist-title": "필터",
+       "rcfilters-filterlist-whatsthis": "이게 뭐죠?",
        "rcfilters-filterlist-feedbacklink": "새로운 (베타) 필터에 대한 의견을 주세요",
        "rcfilters-highlightbutton-title": "결과 강조",
        "rcfilters-highlightmenu-title": "색 선택",
        "rcfilters-highlightmenu-help": "이 속성을 강조할 색을 선택하십시오",
        "rcfilters-filterlist-noresults": "필터를 찾을 수 없습니다",
+       "rcfilters-noresults-conflict": "검색 조건이 충돌하기 때문에 결과를 찾을 수 없습니다",
        "rcfilters-filtergroup-registration": "사용자 등록",
        "rcfilters-filter-registered-label": "등록됨",
        "rcfilters-filter-registered-description": "로그인된 편집자.",
        "rcfilters-filter-bots-description": "자동 도구를 이용한 편집.",
        "rcfilters-filter-humans-label": "사람 (봇이 아님)",
        "rcfilters-filter-humans-description": "사람이 한 편집.",
+       "rcfilters-filter-patrolled-label": "점검됨",
+       "rcfilters-filter-unpatrolled-label": "점검 안 됨",
        "rcfilters-filtergroup-significance": "의미",
        "rcfilters-filter-minor-label": "사소한 편집",
        "rcfilters-filter-major-label": "사소하지 않은 편집",
        "uploaded-event-handler-on-svg": "이벤트 핸들러 속성 <code>$1=\"$2\"</code> 설정은 SVG 파일에서 사용할 수 없습니다.",
        "uploaded-href-attribute-svg": "SVG 파일의 href 속성은 http:// 또는 https:// 대상의 링크만 허용되지만 <code>&lt;$1 $2=\"$3\"&gt;</code>를 발견했습니다.",
        "uploaded-href-unsafe-target-svg": "안전하지 않은 데이터를 가리키는 href를 발견했습니다: 업로드된 SVG 파일의 URI 대상 <code>&lt;$1 $2=\"$3\"&gt;</code>",
-       "uploaded-animate-svg": "업로드된 SVG 파일에서 \"from\" 성 <code>&lt;$1 $2=\"$3\"&gt;</code>을 이용 중 \"animate\" 태그가 href를 변경할 수 있음을 발견했습니다.",
+       "uploaded-animate-svg": "업로드된 SVG 파일에서 \"from\" 성 <code>&lt;$1 $2=\"$3\"&gt;</code>을 이용 중 \"animate\" 태그가 href를 변경할 수 있음을 발견했습니다.",
        "uploaded-setting-event-handler-svg": "이벤트 핸들러 속성을 차단으로 설정한 상태에서 <code>&lt;$1 $2=\"$3\"&gt;</code>가 업로드된 SVG 파일에서 발견되었습니다.",
-       "uploaded-setting-href-svg": "부모 요소에 \"href\" 성을 추가할 목적으로 \"set\" 태그를 사용하는 것은 금지됩니다.",
-       "uploaded-wrong-setting-svg": "원격/데이터/스크립트 대상을 임의의 성에 추가할 목적으로 \"set\" 태그를 사용하는 것은 금지됩니다. 업로드된 SVG 파일에 <code>&lt;set to=\"$1\"&gt;</code>를 발견했습니다.",
-       "uploaded-setting-handler-svg": "원격/데이터/스크립트와 함께 \"handler\" 성을 설정한 SVG는 이용이 금지됩니다. 업로드된 SVG 파일에서 <code>$1=\"$2\"</code>를 발견하였습니다.",
-       "uploaded-remote-url-svg": "원격 URL로 style 성이 설정된 SVG파일은 금지됩니다. 업로드된 SVG 파일에서 <code>$1=\"$2\"</code>를 발견하였습니다.",
+       "uploaded-setting-href-svg": "부모 요소에 \"href\" 성을 추가할 목적으로 \"set\" 태그를 사용하는 것은 금지됩니다.",
+       "uploaded-wrong-setting-svg": "원격/데이터/스크립트 대상을 임의의 성에 추가할 목적으로 \"set\" 태그를 사용하는 것은 금지됩니다. 업로드된 SVG 파일에 <code>&lt;set to=\"$1\"&gt;</code>를 발견했습니다.",
+       "uploaded-setting-handler-svg": "원격/데이터/스크립트와 함께 \"handler\" 성을 설정한 SVG는 이용이 금지됩니다. 업로드된 SVG 파일에서 <code>$1=\"$2\"</code>를 발견하였습니다.",
+       "uploaded-remote-url-svg": "원격 URL로 style 성이 설정된 SVG파일은 금지됩니다. 업로드된 SVG 파일에서 <code>$1=\"$2\"</code>를 발견하였습니다.",
        "uploaded-image-filter-svg": "URL에 이미지 필터를 발견했습니다: 업로드된 SVG 파일의 <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploadscriptednamespace": "이 SVG 파일은 사용할 수 없는 이름공간 '<nowiki>$1</nowiki>'을 포함하고 있습니다.",
        "uploadinvalidxml": "업로드된 파일의 XML의 구문을 분석할 수 없습니다.",
index 511e962..ed61f0c 100644 (file)
        "page_last": "lescht",
        "histlegend": "Fir d'Ännerungen unzeweisen: Klickt déi zwou Versiounen un, déi solle verglach ginn.<br />\n*(aktuell) = Ënnerscheed mat der aktueller Versioun,\n*(lescht) = Ënnerscheed mat der aler Versioun,\n*k = Kleng Ännerung.",
        "history-fieldset-title": "An de Versioune sichen",
-       "history-show-deleted": "nëmmen déi geläscht",
+       "history-show-deleted": "Nëmme geläscht Versiounen",
        "histfirst": "eelst",
        "histlast": "neist",
        "historysize": "({{PLURAL:$1|1 Byte|$1 Byten}})",
        "rcfilters-search-placeholder": "Rezent Ännerunge filteren (duerchsichen oder ufänke mat tippen)",
        "rcfilters-invalid-filter": "Net valabele Filter",
        "rcfilters-filterlist-title": "Filteren",
+       "rcfilters-filterlist-whatsthis": "Wat ass dat?",
        "rcfilters-highlightbutton-title": "Resultater ervirhiewen",
        "rcfilters-highlightmenu-title": "Eng Faarf eraussichen",
        "rcfilters-filterlist-noresults": "Keng Filtere fonnt",
+       "rcfilters-noresults-conflict": "Näischt fonnt well d'Sichcritère sech widderspriechen",
        "rcfilters-filter-unregistered-description": "Auteuren déi net ageloggt sinn.",
        "rcfilters-filter-editsbyself-label": "Är eegen Ännerungen",
        "rcfilters-filter-editsbyself-description": "Ännerunge vun Iech.",
index 195699d..ea6c1cb 100644 (file)
@@ -35,7 +35,8 @@
                        "Macofe",
                        "Zygimantus",
                        "Matma Rex",
-                       "Nemo bis"
+                       "Nemo bis",
+                       "Nersip"
                ]
        },
        "tog-underline": "Nuorodos pabraukimas:",
        "login": "Prisijungti",
        "login-security": "Patvirtinkite savo tapatybę",
        "nav-login-createaccount": "Prisijungti / sukurti paskyrą",
-       "userlogin": "Prisijungti / sukurti paskyrą",
-       "userloginnocreate": "Prisijungti",
        "logout": "Atsijungti",
        "userlogout": "Atsijungti",
        "notloggedin": "Neprisijungęs",
        "userlogin-noaccount": "Neturite paskyros?",
        "userlogin-joinproject": "Prisijungti prie {{SITENAME}}",
-       "nologin": "Neturite prisijungimo vardo? '''$1'''.",
-       "nologinlink": "Sukurkite paskyrą",
        "createaccount": "Sukurti paskyrą",
-       "gotaccount": "Jau turite paskyrą? '''$1'''.",
-       "gotaccountlink": "Prisijunkite",
-       "userlogin-resetlink": "Pamiršote savo prisijungimo duomenis?",
        "userlogin-resetpassword-link": "Pamiršote savo slaptažodį?",
        "userlogin-helplink2": "Padėti prisijungti",
        "userlogin-loggedin": "Jūs jau prisijungęs kaip {{GENDER:$1|$1}}.\nNaudokite žemiau pateiktą pavidalą, kad prisijungtumėte kaip kitas naudotojas.",
        "createaccountmail": "Naudokite laikiną atsitiktinį slaptažodį ir nusiųskite jį į elektroninį paštą, nurodytą žemiau.",
        "createaccountmail-help": "Gali būti naudojamas paskyros sukūrimui kitam asmeniui, neatskleidžiant slaptažodžio.",
        "createacct-realname": "Vardas (neprivaloma)",
-       "createaccountreason": "Priežastis:",
        "createacct-reason": "Priežastis",
        "createacct-reason-ph": "Kodėl kuriate kitą paskyrą",
        "createacct-reason-help": "Pranešimas rodomas paskyros sukūrimo žurnale",
        "rcfilters-clear-all-filters": "Valyti visus filtrus",
        "rcfilters-invalid-filter": "Negalimas filtras",
        "rcfilters-filterlist-title": "Filtrai",
-       "rcfilters-highlightmenu-title": "Pasirinkti spalvą",
+       "rcfilters-highlightmenu-title": "Pasirinkite spalvą",
        "rcfilters-filterlist-noresults": "Nerastas toks filtras",
        "rcfilters-filtergroup-registration": "Vartotojo registracija",
        "rcfilters-filter-registered-label": "Registruoti",
        "rcfilters-filter-unregistered-label": "Neregistruoti",
+       "rcfilters-filter-unregistered-description": "Redaktoriai, kurie nėra prisijungę.",
        "rcfilters-filter-editsbyself-label": "Jūsų keitimai",
        "rcfilters-filter-editsbyself-description": "Jūsų keitimai.",
        "rcfilters-filter-editsbyother-label": "Kitų keitimai",
        "rcfilters-filter-editsbyother-description": "Kaitimai sukurti kitų vartotojų (ne jūsų).",
        "rcfilters-filtergroup-userExpLevel": "Patirties lygis (tik registruotiems vartotojams)",
-       "rcfilters-filter-userExpLevel-newcomer-label": "Naujokai",
-       "rcfilters-filter-userExpLevel-learner-label": "Mokiniai",
-       "rcfilters-filter-userExpLevel-experienced-label": "Patyrę vartotojai",
-       "rcfilters-filter-userExpLevel-experienced-description": "Daugiau nei 30 dienų veiklos ir 500 keitimų.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Naujokai",
+       "rcfilters-filter-user-experience-level-learner-label": "Mokiniai",
+       "rcfilters-filter-user-experience-level-experienced-label": "Patyrę vartotojai",
+       "rcfilters-filter-user-experience-level-experienced-description": "Daugiau nei 30 dienų veiklos ir 500 keitimų.",
        "rcfilters-filter-bots-label": "Robotas",
        "rcfilters-filter-bots-description": "Keitimai, atlikti automatinių įrankių.",
        "rcfilters-filter-humans-label": "Žmogaus (ne roboto)",
        "rcfilters-filter-humans-description": "Keitimai atlikti žmonių.",
+       "rcfilters-filtergroup-reviewstatus": "Peržiūrėti statusą",
        "rcfilters-filtergroup-significance": "Reikšmė",
        "rcfilters-filter-minor-label": "Smulkūs pakeitimai",
        "rcfilters-filter-minor-description": "Keitimai, kuriuos autorius pažymėjo kaip mažus.",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|atnaujino}} žymes $3 puslapio versijoje $4, ({{PLURAL:$7|pridėjo}} $6; {{PLURAL:$9|pašalino}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|atnaujino}} žymes $3 puslapio žurnalo įraše $5 ({{PLURAL:$7|pridėtas}} $6; {{PLURAL:$9|pašalintas}} $8)",
        "rightsnone": "(jokių)",
-       "revdelete-summary": "keitimo paaiškinimas",
        "rightslogentry-temporary-group": "$1 (laikinai, iki $2)",
        "feedback-adding": "Pridedamas atsiliepimas į puslapį ...",
        "feedback-back": "Atgal",
index fe20055..b339dcc 100644 (file)
        "readonlytext": "Basis data agi dikonci sekang inputan anyar lan modifikasi liyane, ndeyane agi ana perawatan basis data, seuwise kuwe toli bakal mbalik normal maning.\n\nAdministrator sing ngunci kiye aweh katerangan kaya kiye: $1",
        "missing-article": "Basis data ora teyeng nemokna teks paca sing kudune ana, yaiku \"$1\" $2.\n\nKiye biasanye jalaran pranala daluwarsa maring revisi sedurunge sekang kaca sing wis dibusak.\n\nAngger dudu kuwe sebabe, Rika ndeyan nemokna \"bug\" nang software. \nMonggo dilaporna maring [[Special:ListUsers/sysop|administrator]], karo nyebutna URL sing dituju.\n\nA",
        "missingarticle-rev": "(révisi#: $1)",
-       "missingarticle-diff": "(Béda: $1, $2)",
+       "missingarticle-diff": "(Beda: $1, $2)",
        "readonly_lag": "Basis data uwis dikunci otomatis sawetara basis data sekunder lagi nglakokna sinkronisasi karo basis data utama",
        "internalerror": "Kasalahan internal",
        "internalerror_info": "Kasalahan internal: $1",
        "externaldberror": "Ana kesalahan otentikasi basis data utawa Rika ora olih nglakokna pemutakhiran maring akun eksternale Rika.",
        "login": "Melebu",
        "nav-login-createaccount": "Mlebu / gawe kaca anggota (akun)",
-       "userlogin": "Melebu / gawe kaca anggota (account)",
-       "userloginnocreate": "Mlebu log",
        "logout": "Metu Log",
        "userlogout": "Metu Log",
        "notloggedin": "Durung mlebu log",
        "userlogin-noaccount": "Durung duwe akun?",
        "userlogin-joinproject": "Melu {{SITENAME}}",
-       "nologin": "Durung duwe akun? $1.",
-       "nologinlink": "Gawe akun anyar",
        "createaccount": "Gawe akun anyar",
-       "gotaccount": "Wis duwe akun? $1.",
-       "gotaccountlink": "Mlebu log",
-       "userlogin-resetlink": "Apa Rika kelalen info detil nggo mlebune?",
        "userlogin-resetpassword-link": "Rika kelalen tembung sandhine?",
        "userlogin-helplink2": "Pitulung mlebu log",
        "userlogin-loggedin": "Rika uwis mlebu log nganggo jeneng {{GENDER:$1|$1}}.\nGunakna formulir nang ngisor kiye kanggo mlebu log dadi pangganggo sejen.",
        "createacct-another-email-ph": "Lebokna alamat imel",
        "createaccountmail": "Gunakna tembung sandhi acak sementara lan kirimna maring alamat imel",
        "createacct-realname": "Jeneng asli (ora kudu)",
-       "createaccountreason": "Alesan:",
        "createacct-reason": "Alesan",
        "createacct-reason-ph": "Kenangapa Rika nggawe akun sejen",
        "createacct-submit": "Gawe akune Rika",
        "passwordreset-emaildisabled": "Fitur imel wis dinonaktifna nang wiki kiye.",
        "passwordreset-username": "Jeneng panganggo:",
        "passwordreset-domain": "Domain:",
-       "passwordreset-capture": "Deleng imel hasile?",
-       "passwordreset-capture-help": "Angger Rika nyonteng kotak kiye, imel (sing isi tembung sandhi sauntara) bakal ditidokna maring Rika barengan karo dikirimna maring panganggo.",
        "passwordreset-email": "Alamat imel:",
        "passwordreset-emailtitle": "Detil akun nang {{SITENAME}}",
        "passwordreset-emailelement": "Jeneng panganggo: \n$1\n\nTembung sandhi sauntara: \n$2",
        "template-protected": "(direksa)",
        "template-semiprotected": "(semi-pangreksan)",
        "hiddencategories": "Kaca kiye kuwe anggota sekang {{PLURAL:$1|1 kategori sing diumpetna|$1 kategori-kategori sing diumpetna}}:",
-       "nocreatetext": "{{SITENAME}} wis mbatesi panggawean kaca anyar.\nRika teyeng mbalik lan nyunting kaca sing wis ana, utawa [[Special:UserLogin|mlebu utawa gawe akun]]",
+       "nocreatetext": "{{SITENAME}} wis mbatesi panggawean kaca anyar.\nRika teyeng mbalik lan nyunting kaca sing wis ana, utawa [[Special:UserLogin|mlebu]] utawa [[Special:CreateAccount|gawe akun]]",
        "nocreate-loggedin": "Rika ora duwe hak akses nggo gawe kaca anyar.",
        "sectioneditnotsupported-title": "Panyuntingan bagiya ora didukung",
        "permissionserrorstext-withaction": "Rika ora duwé hak aksès kanggo $2, jalaran {{PLURAL:$1|alesan|alesan}} nang ngisor kiye:",
        "saveprefs": "Simpen",
        "restoreprefs": "Balekna kabeh setelan gawane (nang kabeh bagiyan)",
        "prefs-editing": "Panyuntingan",
-       "rows": "Baris:",
        "searchresultshead": "Goleti",
        "stub-threshold": "Ambang wates kanggo format <a href=\"#\" class=\"stub\">pranala rintisan</a> (bita):",
        "stub-threshold-disabled": "Dinonaktifna",
        "userrights-reason": "Alesan:",
        "userrights-no-interwiki": "Rika ora duwe hak kanggo ngowahi hak panganggo nang wiki liyane.",
        "userrights-nodatabase": "Basis data $1 ora ana utawa ora lokal.",
-       "userrights-nologin": "Rika kudu [[Special:UserLogin|mlebu log]] nganggo akun pangurus ben teyeng ngowahi hak panganggo.",
-       "userrights-notallowed": "Akune Rika ora duwe hak kanggo nambah utawa ngilangna hak panganggo.",
        "userrights-changeable-col": "Grup sing teyeng Rika owahi",
        "userrights-unchangeable-col": "Grup sing ora teyeng Rika owahi",
        "group": "Grup:",
        "statistics-pages": "Kaca",
        "statistics-pages-desc": "Kabeh kaca nang wiki kiye, klebu kaca dhiskusi, pangalihan, lan liya-liyané.",
        "statistics-files": "Berkas sing diunggahna",
-       "statistics-edits": "Jumlah suntingan wiwit {{SITENAME}} dimolai",
+       "statistics-edits": "Jumlah suntingan sapet {{SITENAME}} dimolai",
        "statistics-edits-average": "Rata-rata suntingan saben kaca",
        "statistics-users": "Jumlah [[Special:ListUsers|panganggo sing kedaftar]]",
        "statistics-users-active": "Jumlah panganggo aktif",
        "cantrollback": "Ora teyeng mbatalna suntingan;\nkontributor pungkasane kuwe siji-sijine sing nulis artikel kiye.",
        "alreadyrolled": "Ora teyeng mbalekna suntingan pungkasan [[:$1]] sekang [[User:$2|$2]] ([[User talk:$2|talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nwis ana wong sejen sing nyunting utawa mbalekna artikel kuwe.\n\nSuntingan pungkasan kaca kiye digawe nang [[User:$3|$3]] ([[User talk:$3|talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Ringkesan suntingan yakuwe: <em>$1</em>.",
-       "revertpage": "Suntingane [[Special:Contributions/$2|$2]] ([[User talk:$2|dhiskusi]]) dibalekna maring vèrsi pungkasan sekang [[User:$1|$1]]",
+       "revertpage": "Suntingane [[Special:Contributions/$2|$2]] ([[User talk:$2|dhiskusi]]) dibalekna maring versi pungkasan sekang [[User:$1|$1]]",
        "revertpage-nouser": "Mbalekna suntingan sekang (jeneng panganggo dibusek) ming revisi pungkasan sekang [[User:$1|$1]]",
        "rollback-success": "Mbalekna suntingane $1;\ndibalekna ming revisi pungkasan sekang $2.",
        "rollback-success-notify": "Mbalekna besutan sekang $1; owah mbalik nggo revisi mburi sekang $2. [$3 Deleng owahane]",
        "exif-lightsource-17": "Cahya standar A",
        "exif-lightsource-18": "Cahya standar B",
        "exif-lightsource-19": "Cahya standar C",
-       "namespacesall": "kabèh",
+       "namespacesall": "kabeh",
        "monthsall": "kabèh",
        "watchlisttools-view": "Tidokna owahan sing ana gandhèngané",
        "watchlisttools-edit": "Tidokna lan sunting daftar pangawasan",
index dfe50d3..f933f87 100644 (file)
        "title-invalid-interwiki": "Ahitana rohy interwiki tsy azo ampiasaina amin'ny lohateny ny pejy angatahana.",
        "title-invalid-talk-namespace": "Mampatsiahy pejin-dresaka tsy misy ilay pejy angatahana.",
        "title-invalid-characters": "Ahitana soratra tsy azo ekena ny lohatenim-pejy angatahana: \"$1\".",
+       "title-invalid-relative": "Manana lalana tsy mahaleotena ilay lohateny. Tsy manan-kery ny lohatenim-pejy misy mamana tsy mahaleotena (./, ../) satria tsy ho takatra izy ireo rehefa amin'ny mpitetin'ny mpampiasa sasany.",
+       "title-invalid-magic-tilde": "Ahitana filaharana majika tsy azo raisina ny lohatenim-pejy angatahana (<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "Lava loatra ny lohatenim-pejy angatahana. Tsy mahazo ho lava noho $1 $1{{PLURAL:$1|}} ôktety ilay izy amin'ny fikaodiana UTF-8.",
+       "title-invalid-leading-colon": "Ahitana teboka roa tsy azo raisina ny lohatenim-pejy angatahana.",
        "perfcached": "Ao amin'ny voatakona ireo data manaraka ireo ary mety tsy voavao. $1{{PLURAL:}} ihany no isan'ireo zavatra voatahiry ao amin'ny voatakona",
        "perfcachedts": "Ao amin'ny voatakona (cache) ny data aseho, ary tamin'ny $1 izy no navaozina farany. $4{{PLURAL:}} no isan'ny valim-pikarohana ao amin'ilay voatakona.",
        "querypage-no-updates": "Amin'izao fotoana izao dia tsy havaozina ny votoatin'ity pejy ity. Noho izany dia tsy mitaratra ny tena zava-misy ny votoatiny ato.",
        "grant-group-high-volume": "Manao zavatra haingana",
        "grant-group-customization": "Fikirakirana ary safidy",
        "grant-group-administration": "Hanao asam-pandrindrana",
+       "grant-group-private-information": "Hijery ny angona tsy sarababembahoaka momba anao",
        "grant-group-other": "Manao hetsika maro samihafa",
        "grant-blockusers": "Manakana sy manala sakan'ny mpikambana",
        "grant-createaccount": "Hamorona kaonty",
        "rcfilters-invalid-filter": "Sivana tsy azo raisina",
        "rcfilters-empty-filter": "Tsy misy sivana miasa. Aseho avokoa ireo fandraisan'anjara.",
        "rcfilters-filterlist-title": "Sivana",
+       "rcfilters-filterlist-whatsthis": "Inona ity?",
        "rcfilters-filterlist-feedbacklink": "Mamoaka hevitra mikasika ny sivana vaovao (beta)",
        "rcfilters-highlightbutton-title": "Hampibaribary ny valiny",
        "rcfilters-highlightmenu-title": "Hisafidy loko",
        "rcfilters-highlightmenu-help": "Misafidy loko hampanabaribariana ilay tondro",
        "rcfilters-filterlist-noresults": "Tsy nahitana sivana",
+       "rcfilters-noresults-conflict": "Tsy nahitana valiny satria tsy mifanaraka ny mason-tsivana",
        "rcfilters-filtergroup-registration": "Fisoratan'ny mpikambana",
        "rcfilters-filter-registered-label": "Nisoratra anarana",
        "rcfilters-filter-registered-description": "Mpanova tafiditra.",
        "rcfilters-filter-bots-description": "Fiovana nataon'ny rôbô aotômatika.",
        "rcfilters-filter-humans-label": "Olona (tsy rôbô)",
        "rcfilters-filter-humans-description": "Fiovana nataon'ny olombelona mpikambana.",
+       "rcfilters-filter-patrolled-label": "Voatsidika",
+       "rcfilters-filter-patrolled-description": "Fiovana nomarihana ho voatsidika.",
+       "rcfilters-filter-unpatrolled-label": "Tsy mbola voatsidika",
+       "rcfilters-filter-unpatrolled-description": "Fiovana tsy voamarika ho voatsidika.",
        "rcfilters-filtergroup-significance": "Dikany",
        "rcfilters-filter-minor-label": "Fiovana madinika",
        "rcfilters-filter-minor-description": "Fiovana nataon'ny tompony ho madinika.",
        "uploaddisabledtext": "Tsy afaka andefasana rakitra aloha eto amin'ity wiki ity.",
        "php-uploaddisabledtext": "Ny fampidiran-drakitra dia tsy ampiasaina amin'ny PHP.\nMarino ny option configuration file_uploads.",
        "uploadscripted": "\nMisy kialo HTML na fango script mety tsy ho hain'ny navigateur sasany haseho ity rakitra ity.",
+       "uploaded-script-svg": "Zavatra azo atao ho azy \"$1\" ao amin'ny rakitra SVG nampiakarina.",
+       "uploaded-hostile-svg": "Nahitana CSS tsy azo antoka ao amin'ny zava-pisehoan'ny rakitra SVG nampiakarina.",
        "uploadscriptednamespace": "ahitana valan'anarana \"<nowiki>$1</nowiki>\" ny rakitra SVG.",
        "uploadinvalidxml": "Tsy afaka vakiana ny XML tao anatin'ilay rakitra nafaranao.",
        "uploadvirus": "Misy viriosy io rakitra io! Toy izao ny antsipirihany: $1",
        "uploadstash-badtoken": "Tsy navokatra ny fampandefasana ilay tao, mety efa lany daty angamba ny fampahalalam-pamantarana anao.\nAvereno fanindroany.",
        "uploadstash-errclear": "Tsy navokatra ny famafana rakitra.",
        "uploadstash-refresh": "Vaozina ny lisi-drakitra",
+       "uploadstash-thumbnail": "haneho sarikely",
        "img-auth-accessdenied": "Tsy afa-mankao",
        "img-auth-nopathinfo": "Tsy misy PATH_INFO.\nTsy voaparametatra ny lohamilinao hampita io fampahalalàna io.\nMety mampiasa CGI angamba ilay lohamilina ka tsy mahazaka an'i img_auth\nVangio ny https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Ny lalana nangatahana dia tsy ny petra-drakitra nokaonfigiorena.",
        "apisandbox-submit": "Hanao hataka",
        "apisandbox-reset": "Diovina",
        "apisandbox-retry": "Andramana indray",
+       "apisandbox-no-parameters": "Tsy manana parametatra ity module API ity.",
        "apisandbox-helpurls": "Rohim-panoroana",
        "apisandbox-examples": "Ohatra",
        "apisandbox-dynamic-parameters": "Parametatra miampy",
        "apisandbox-sending-request": "Mandefa hataka API...",
        "apisandbox-loading-results": "Mandray valiny API...",
        "apisandbox-results-error": "Nisy hadisoana tamin'ny fakàna ny valin-kataka API: $1.",
+       "apisandbox-request-format-url-label": "Tohin-tsora-kataka URL",
        "apisandbox-request-url-label": "Hataka URL:",
+       "apisandbox-request-json-label": "Hangataka JSON:",
        "apisandbox-request-time": "Fotoana nangatahana{{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "Ahitsio ny token ary alefaso indray",
        "apisandbox-results-fixtoken-fail": "Tsy afaka naka ny token \"$1\".",
        "apisandbox-alert-page": "Tsy ekena ny votoatin'ny saha ato amin'ity pejy ity.",
+       "apisandbox-alert-field": "Tsy azo raisina ny sandan'ity saha ity.",
+       "apisandbox-continue": "Tohizana",
+       "apisandbox-continue-clear": "Diovina",
+       "apisandbox-multivalue-all-namespaces": "$1 (anaran-tsehatra rehetra)",
+       "apisandbox-multivalue-all-values": "$1 (sanda rehetra)",
        "booksources": "boky tsiahy",
        "booksources-search-legend": "hikaroka anatin'ny boky todika",
        "booksources-search": "Fikarohana",
        "booksources-text": "Ity misy lisitra maneho ny rohy makany amin'ny sehatra mivarotra boky vaovao sy efa vaky ary mety ahitanao fampahalalàna momba ny boky sy soratra notadiavinao :",
        "booksources-invalid-isbn": "Ny ISBN nomena dia mety diso ; marino raha diso ianao teo am-pandikanana ny loharano fotony.",
+       "magiclink-tracking-rfc": "Pejy mampiasa rohy majika RFC",
        "specialloguserlabel": "Mpikambana nanao :",
        "speciallogtitlelabel": "Tanjona (lohateny na mpikambana) :",
        "log": "Tatitr’asa",
        "changecontentmodel-reason-label": "Antony :",
        "changecontentmodel-submit": "Ovaina",
        "changecontentmodel-success-title": "Niova ny môdelim-botoatiny",
+       "changecontentmodel-emptymodels-title": "Tsy nahitana môdelim-botoatiny azo ampiasaina",
+       "changecontentmodel-emptymodels-text": "Tsy afaka avadika ho karazana na inona na inona [[:$1]].",
+       "log-name-contentmodel": "Laogim-panovana môdelim-botoatiny",
        "logentry-contentmodel-change-revertlink": "mamerina",
        "logentry-contentmodel-change-revert": "mamerina",
        "protectlogpage": "Laogim-piarovana",
        "sp-contributions-username": "Adiresy IP na anaram-pikambana :",
        "sp-contributions-toponly": "Fiovana izay farany ihany no aseho",
        "sp-contributions-newonly": "Fiovana izay namorom-pejy ihany no aseho",
+       "sp-contributions-hideminor": "Hanafina fiovana kely",
        "sp-contributions-submit": "Hikaroka",
        "whatlinkshere": "Pejy mirohy eto",
        "whatlinkshere-title": "Pejy mirohy any amin'i « $1 »",
        "ipb-unblock": "Hanala ny sakan'ny mpikambana na adiresy IP",
        "ipb-blocklist": "Hijery ny sakana efa misy",
        "ipb-blocklist-contribs": "Fandraisan'anjaran'i $1",
+       "ipb-blocklist-duration-left": "$1 sisa",
        "unblockip": "Esory ny sakana amin'io mpikambana io",
        "unblockiptext": "\nAmpiasao ity fisy eto ambany ity hanalana ny sakana\nmihatra amin'ny adiresy IP na solonanarana iray.",
        "ipusubmit": "Esory ny sakana",
        "tooltip-ca-nstab-category": "Hijery ny pejin'ilay sokajy",
        "tooltip-minoredit": "Mariho ho fanovana madinika ihany",
        "tooltip-save": "Tehirizo ny fanovana",
+       "tooltip-publish": "Hamoaka ny fiovana",
        "tooltip-preview": "Topazy maso ny fanovana nataonao, iangaviana ianao mba hijery tsipalotra mialoha ny fitahirizana ny fanovana!",
        "tooltip-diff": "Asehoy izay novainao tamin'ny lahatsoratra.",
        "tooltip-compareselectedversions": "Jereo ny fahasamihafana amin'ireo votoatin'ny pejy anankiroa ireo.",
        "patrol-log-page": "Laogin'ny fanovana voamarina",
        "patrol-log-header": "Ity dia laogy mikasikan'ny fanovana voamarina.",
        "log-show-hide-patrol": "$1 ny laogy mikasikan'ny versiona voamarina",
+       "log-show-hide-tag": "$1 laogim-balizy",
        "confirm-markpatrolled-button": "OK",
        "deletedrevision": "Fanovana an'i $1 taloha voafafa.",
        "filedeleteerror-short": "Tsi-fetezana teo am-pamafàna ilay rakitra : $1",
        "exif-flash-redeye-1": "Fanoherana ny fisiana maso mena",
        "exif-focalplaneresolutionunit-2": "Posy",
        "exif-sensingmethod-1": "Tsy voafaritra",
+       "exif-scenecapturetype-0": "Ara-penitra",
+       "exif-scenecapturetype-1": "Mandry",
+       "exif-scenecapturetype-2": "Mitsangana",
+       "exif-scenecapturetype-3": "Alina",
        "exif-gaincontrol-0": "Tsy misy",
        "exif-gaincontrol-1": "Fahazoana miabo kely",
        "exif-gaincontrol-2": "Fitomboana miabo be",
        "exif-saturation-2": "Ambony",
        "exif-sharpness-0": "Tsotra",
        "exif-sharpness-1": "Malefaka",
+       "exif-sharpness-2": "Mahery",
        "exif-subjectdistancerange-0": "Tsy fantatra",
        "exif-subjectdistancerange-1": "Makrô",
        "exif-subjectdistancerange-2": "Fijerena akaiky",
        "exif-gpslatitude-s": "Atsimo",
        "exif-gpslongitude-e": "Atsinanana",
        "exif-gpslongitude-w": "Andrefana",
+       "exif-gpsaltitude-above-sealevel": "$1 {{PLURAL:$1|}}metatra eo ambonin'ny lentan'ny ranomasina",
+       "exif-gpsaltitude-below-sealevel": "$1 metatra{{PLURAL:$1|}} eo ambanin'ny lentan-dranomasina",
        "exif-gpsstatus-a": "Am-pandrefesana",
        "exif-gpsmeasuremode-2": "Fandrefesana 2D",
        "exif-gpsmeasuremode-3": "Fandrefesana 3D",
        "exif-objectcycle-b": "Sady maraina no hariva",
        "exif-gpsdirection-t": "Tena avaratra",
        "exif-gpsdirection-m": "Avaratra arak'andriamby",
+       "exif-ycbcrpositioning-1": "Miafovoany",
+       "exif-ycbcrpositioning-2": "Co-sited",
        "exif-dc-contributor": "Mpandray anjara",
        "exif-dc-date": "Daty",
        "exif-dc-publisher": "Mpamoaka",
+       "exif-dc-relation": "Media misy ifandraisana",
        "exif-dc-rights": "Zo",
        "exif-dc-source": "Haino aman-jery niaviana",
        "exif-dc-type": "Karazana baino aman-jery",
        "confirm-watch-top": "Hanaraka ity pejy ity?",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Hanala ity pejy ity amin'ny lisitry ny pejy arahinao?",
+       "confirm-rollback-button": "OK",
+       "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← pejy nialoha",
        "imgmultipagenext": "pejy manaraka →",
        "imgmultigo": "Andao !",
        "imgmultigoto": "Handeha any amin'ny pejy $1",
        "img-lang-default": "(fiteny tsipalotra)",
+       "img-lang-info": "Haneho ity sary ity ho $1. $2",
        "img-lang-go": "Alefa",
        "ascending_abbrev": "mihak.",
        "descending_abbrev": "mihid.",
        "autosumm-replace": "Votoatiny novaina ho « $1 »",
        "autoredircomment": "Pejy fihodinana mankany [[$1]]",
        "autosumm-new": "Pejy voaforona amin'ny « $1 »",
+       "autosumm-newblank": "Namorona pejy fotsy",
        "lag-warn-normal": "Ny fanovana vaovao nohon'ny $1 segondra {{PLURAL:}} dia tsy hiseho eo amin'ity lisitra ity.",
        "lag-warn-high": "Noho ny hataraiky ny lohamilin'ny banky angona, tsy hiseho eto ny fanovana natao tao anatin'ny fotoana latsaky ny $1 segondra{{PLURAL:}}.",
        "watchlistedit-normal-title": "Hanova ny lisitra ny pejy arahako maso",
        "watchlistedit-raw-titles": "Lohateny :",
        "watchlistedit-raw-submit": "Havaozina ny lisitra",
        "watchlistedit-raw-done": "Voavao ny lisitrao.",
+       "watchlistedit-clear-title": "Handio ny lisitra arahanao",
+       "watchlistedit-clear-legend": "Handio ny lisitra arahanao",
+       "watchlistedit-clear-explain": "Ho esorina amin'ny lisitry ny pejy arahanao ny lohateny rehetra",
+       "watchlistedit-clear-titles": "Lohateny:",
        "watchlisttools-view": "pejy arahako maso",
        "watchlisttools-edit": "Jereo sy ovao ny lisitra ny pejy fanaraha-maso",
        "watchlisttools-raw": "Ovay ilay pejy arahako maso amizao",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|resaka]])",
+       "timezone-local": "An-toerana",
        "duplicate-defaultsort": "'''Tandremo''' : manitsaka ny sort key taloha \"$1\" ilay sort key ankehitriny \"$2\".",
        "version": "Versiona",
        "version-extensions": "Fanitarana nampidirina",
        "version-other": "Samihafa",
        "version-hook-subscribedby": "Nalefan'i",
        "version-version": "($1)",
+       "version-no-ext-name": "[tsy misy anarana]",
        "version-license": "Lisansa Mediawiki",
        "version-ext-license": "Fahazoan-dalana",
        "version-ext-colheader-name": "Fanitarana",
        "tags-deactivate-submit": "Aza alefa",
        "tags-edit-title": "Hanova balizy",
        "tags-edit-manage-link": "Hikirakira balizy",
+       "tags-edit-existing-tags": "Balizy misy:",
+       "tags-edit-existing-tags-none": "<em>Tsy misy</em>",
        "tags-edit-new-tags": "Balizy vaovao:",
        "tags-edit-add": "Ampiana ireo balizy ireo:",
        "tags-edit-remove": "Hanala ireo balizy ireo:",
        "htmlform-cloner-create": "Hanampy be kokoa",
        "htmlform-cloner-delete": "Esorina",
        "htmlform-cloner-required": "Sanda iray farafahakeliny no ilaina",
+       "htmlform-date-placeholder": "TTTT-VV-AA",
+       "htmlform-time-placeholder": "HH:MM:SS",
+       "htmlform-datetime-placeholder": "TTTT-VV-AA HH:MM:SS",
+       "htmlform-date-invalid": "Tsy daty fantatra ny sanda nampidirinao. Andramo ampiasina ny fipetraka TTTT-VV-AA.",
        "htmlform-title-badnamespace": "Tsy ao amin'i anaran-tsehatra \"{{ns:$2}}\" i [[:$1]].",
        "htmlform-title-not-creatable": "Lohatenim-pejy tsy azo foronina \"$1\"",
        "htmlform-title-not-exists": "Tsy misy $1.",
        "logentry-upload-upload": "Nampiditra an'i $3 i $1{{GENDER:$2}}",
        "rightsnone": "(tsy misy)",
        "feedback-adding": "Manampy ny fahenoan-kevitra amin'ilay pejy...",
+       "feedback-back": "Hiverina",
        "feedback-bugnew": "Efa nomariniko. Hitory baogy iray",
        "feedback-cancel": "Foanana",
        "feedback-close": "Vita",
+       "feedback-dialog-title": "Handefa resaka",
        "feedback-error1": "Hadisoana: Valiny avy amin'ny API tsy fantatra",
        "feedback-error2": "Hadisoana: Tsy voaòva",
        "feedback-error3": "Hadisoana: Tsy nisy valiny avy amin'ny API",
        "feedback-subject": "Lohahevitra:",
        "feedback-submit": "Alefa",
        "feedback-thanks": "Misaotra! lanefa tany amin'ilay pejy ''[$2 $1]'' ilay fanehoan-kevitrao.",
+       "feedback-thanks-title": "Misaotra indrindra!",
        "feedback-useragent": "User agent:",
        "searchsuggest-search": "Hikaroha eto amin'i {{SITENAME}}",
        "searchsuggest-containing": "misy...",
        "api-error-stashfailed": "Hadisoana anaty: Tsy nahomby ny fitahirizana ilay rakitra vonjimaika ilay lohamilina.",
        "api-error-unknown-warning": "Fampitandremana tsy fantatra : ''$1''.",
        "api-error-unknownerror": "Hadisoana tsy fantatra : ''$1''.",
+       "duration-seconds": "$1 segondra{{PLURAL:$1|}}",
+       "duration-minutes": "$1 minitra{{PLURAL:$1|}}",
+       "duration-hours": "$1 ora{{PLURAL:$1|}}",
+       "duration-days": "$1 andro{{PLURAL:$1|}}",
+       "duration-weeks": "$1{{PLURAL:$1|}} herinandro",
+       "duration-years": "$1 taona{{PLURAL:$1|}}",
+       "duration-decades": "folotaona{{PLURAL:$1|}} $1",
+       "duration-centuries": "taonjato $1{{PLURAL:$1|}}",
+       "limitreport-walltime": "Tena fotoam-pampiasana",
+       "limitreport-walltime-value": "$1 segondra{{PLURAL:$1|}}",
+       "expand_templates_output": "Valiny",
+       "expand_templates_xml_output": "Famoahana XML",
+       "expand_templates_html_output": "Famoahana HTML",
+       "expand_templates_ok": "OK",
+       "expand_templates_remove_comments": "Hanala resaka",
+       "expand_templates_preview": "Topi-maso",
+       "pagelang-name": "Pejy",
+       "pagelang-language": "Fiteny",
+       "pagelang-use-default": "Hampiasan ny fiteny raha tsy misy",
+       "pagelang-select-lang": "Hisafidy teny",
+       "pagelang-reason": "Antony",
+       "pagelang-submit": "Alefa",
+       "right-pagelang": "Hanova ny fitenin'ny pejy",
+       "action-pagelang": "hanova ny fitenin'ny pejy",
+       "mediastatistics": "Statistikan'ny haino aman-jery",
+       "mediastatistics-table-mimetype": "Karazana MIME",
+       "mediastatistics-table-extensions": "Itatra azo atao",
+       "mediastatistics-table-count": "Isan'ny rakitra",
+       "mediastatistics-header-unknown": "Tsy fantatra",
+       "mediastatistics-header-bitmap": "Sary bitmap",
+       "mediastatistics-header-drawing": "Sary (sary vektôrialy)",
+       "mediastatistics-header-audio": "Feo",
+       "mediastatistics-header-video": "Horonantsary",
+       "mediastatistics-header-multimedia": "Haino aman-jery be harena",
+       "mediastatistics-header-office": "Birao",
+       "mediastatistics-header-text": "Soratra",
+       "mediastatistics-header-executable": "Azo alefa",
+       "mediastatistics-header-total": "Rakitra rehetra",
        "special-characters-group-latin": "latina",
        "special-characters-group-latinextended": "latina nitarina",
        "special-characters-group-ipa": "AAI",
index 42841f0..79cd582 100644 (file)
        "page_last": "последен",
        "histlegend": "Разлика помеѓу преработките: Означете ги преработките што сакате да ги споредите и притиснете на Enter или копчето на дното од страницата.<br />\nЛегенда: '''({{int:cur}})''' = разлика со последна преработка, '''({{int:last}})''' = разлика со претходна преработка, '''{{int:minoreditletter}}''' = ситна промена.",
        "history-fieldset-title": "Преглед на историјата",
-       "history-show-deleted": "Само избришани",
+       "history-show-deleted": "Само избришани преработки",
        "histfirst": "најстари",
        "histlast": "најнови",
        "historysize": "({{PLURAL:$1|1 бајт|$1 бајти}})",
        "prefs-help-prefershttps": "Поставката ќе се примени следниот пат кога ќе се најавите.",
        "prefswarning-warning": "Направивте промени во нагодувањата, но не ги зачувавте.\nИзмената нема да се изврши ако ја напуштите страницава без да стиснете на „$1“.",
        "prefs-tabs-navigation-hint": "Совет: Можете да ги користите стрелките на тастатурата за да преоѓате од едно на друго јазиче во списокот на јазичиња.",
-       "userrights": "РаководеÑ\9aе Ñ\81о Ðºориснички права",
+       "userrights": "Ð\9aориснички права",
        "userrights-lookup-user": "Изберете корисник",
        "userrights-user-editname": "Внесете корисничко име:",
        "editusergroup": "Вчитај кориснички групи",
        "rcfilters-invalid-filter": "Неважечки филтер",
        "rcfilters-empty-filter": "Нема активни филтри. Прикажани се сите придонеси.",
        "rcfilters-filterlist-title": "Филтри",
+       "rcfilters-filterlist-whatsthis": "Што е ова?",
        "rcfilters-filterlist-feedbacklink": "Дајте мислење за новите (бета) филтри",
        "rcfilters-highlightbutton-title": "Истакнување на исход",
        "rcfilters-highlightmenu-title": "Изберете боја",
        "rcfilters-highlightmenu-help": "Изберете боја за да го истакнете ова својство",
        "rcfilters-filterlist-noresults": "Не пронајдов ниеден филтер",
+       "rcfilters-noresults-conflict": "Не пронајдов ништо бидејќи критериумите на барање се спротиставени.",
+       "rcfilters-state-message-subset": "Филтерот не делува бидејќи неговиот исход веќе се содржи во {{PLURAL:$2|следниов поопфатен филтер|следниве поопфатни филтри}} (истакнете го за да го издвоите): $1",
+       "rcfilters-state-message-fullcoverage": "Избирањето на сите филтри во групата е исто како да не сте избрале ниеден, така што овој филтер не делува. Во групата се опфатени: $1",
        "rcfilters-filtergroup-registration": "Регистрација на корисници",
        "rcfilters-filter-registered-label": "Регистрирани",
        "rcfilters-filter-registered-description": "Најавени уредници.",
        "rcfilters-filter-unregistered-label": "Нерегистрирани",
        "rcfilters-filter-unregistered-description": "Уредници кои не се најавени.",
-       "rcfilters-filter-unregistered-conflicts-user-experience-level": "ФилÑ\82еÑ\80оÑ\82 â\80\9eÐ\9dеÑ\80егиÑ\81Ñ\82Ñ\80иÑ\80аниâ\80\9c Ðµ Ð½ÐµÐ°ÐºÑ\82ивен Ð±Ð¸Ð´ÐµÑ\98Ñ\9cи Ð½ÐµÐ³Ð¾Ð²Ð°Ñ\82а Ñ\80абоÑ\82а Ñ\81е Ð¿Ð¾Ð½Ð¸Ñ\88Ñ\82Ñ\83ва Ð¾Ð´ {{PLURAL:$2|следниов филтер|следниве филтри}} за искуство, {{PLURAL:$2|кој наоѓа|кои наоѓаат}} само регистрирани корисници: $1",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Ð\9eвоÑ\98 Ñ\84илÑ\82еÑ\80 Ðµ Ð¿Ñ\80оÑ\82иÑ\81Ñ\82авен Ñ\81о {{PLURAL:$2|следниов филтер|следниве филтри}} за искуство, {{PLURAL:$2|кој наоѓа|кои наоѓаат}} само регистрирани корисници: $1",
        "rcfilters-filtergroup-authorship": "Уреди авторство",
        "rcfilters-filter-editsbyself-label": "Ваши сопствени уредувања",
        "rcfilters-filter-editsbyself-description": "Ваши уредувања.",
        "rcfilters-filter-editsbyother-label": "Туѓи уредувања",
        "rcfilters-filter-editsbyother-description": "Уредувања направени од други корисници (не од вас).",
        "rcfilters-filtergroup-userExpLevel": "Корисничка искусност (само за регистрирани)",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Филтерот е неактивен бидејќи наоѓа само регистрирани корисници, па филтерот „Нерегистрирани“ му ја поништува работата.",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Филтерот „Нерегистрирани“ е во спротиставеност со еден или повеќе од филтрите за искуство. Тие филтри наоѓаат само регистрирани корисници. Спротиставените филтри погоре се означени како неактивни.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Филтрите за искуство пронаоѓаат само регистрирани корисници, така што овој филтер е простиставен со филтерот „Нерегистрирани“.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Филтерот „Нерегистрирани“ е спротиставен на еден или повеќе од филтрите за искуство. Тие филтри наоѓаат само регистрирани корисници. Спротиставените филтри погоре се означени во одделот Активни филтри.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Новодојденци",
        "rcfilters-filter-user-experience-level-newcomer-description": "Помалку од 10 уредувања и 4 дена активност.",
        "rcfilters-filter-user-experience-level-learner-label": "Ученици",
index 1555a31..80b9b12 100644 (file)
        "password-change-forbidden": "ဤဝီကီတွင် စကားဝှက်များကို ပြောင်းလဲ၍ မရပါ။",
        "login": "Log in ဝင်ရန်",
        "nav-login-createaccount": "Log in ဝင်ရန်/ အကောင့် ဖန်တီးရန်",
-       "userlogin": "Log in ဝင်ရန်/ အကောင့် ဖန်တီးရန်",
-       "userloginnocreate": "Log in ဝင်ရန်",
        "logout": "ထွက်ရန်",
        "userlogout": "ထွက်ရန်",
        "notloggedin": "log in ဝင်မထားပါ",
        "userlogin-noaccount": "အကောင့် မရှိဘူးလား?",
        "userlogin-joinproject": "{{SITENAME}} ကို ချိတ်ဆက်ရန်",
-       "nologin": "အကောင့်မရှိဘဲ ဖြစ်နေပါသလား။ $1။",
-       "nologinlink": "အကောင့်တစ်ခု ဖန်တီးရန်",
        "createaccount": "အကောင့် ဖန်တီးရန်",
-       "gotaccount": "အကောင့်ရှိပြီးသားလား။ $1။",
-       "gotaccountlink": "Log in ဝင်ရန်",
-       "userlogin-resetlink": "Login ဝင်သည့် အသေးစိတ်တို့ကို မေ့သွားပါသလား?",
        "userlogin-resetpassword-link": "စကားဝှက် မေ့နေသလား?",
        "userlogin-helplink2": "log in အကူအညီ",
        "userlogin-loggedin": "သင်သည် {{GENDER:$1|$1}} အနေဖြင့် လော့အင်ဝင်ထားပြီး ဖြစ်သည်။ အခြားအသုံးပြုသူ အနေဖြင့် ဝင်ရောက်ရန် အောက်ပါပုံစံကို အသုံးပြုပါ။",
        "createacct-another-email-ph": "အီးမေး လိပ်စာ ရိုက်ထည့်ပါ",
        "createaccountmail": "ယာယီ ကျပန်းစကားဝှက်ကို သီးသန့် အီးမေးလ်လိပ်စာသို့ ပေးပို့အသုံးပြုရန်",
        "createacct-realname": "နာမည်ရင်း (ဖြည့်လိုက)",
-       "createaccountreason": "အ​ကြောင်း​ပြ​ချက် -",
        "createacct-reason": "အကြောင်းပြချက်",
        "createacct-reason-ph": "သင်ဘာကြောင့် အခြားအကောင့် ဖန်တီးချင်တာလဲ",
        "createacct-submit": "သင့်အကောင့်ကို ဖန်တီးရန်",
        "logentry-move-move": "$3 စာမျက်နှာကို $4 သို့ $1က {{GENDER:$2|ရွှေ့ခဲ့သည်}}",
        "logentry-move-move-noredirect": "$3 မှ $4 သို့ စာမျက်နှာကို ပြန်ညွှန်းချန်မထားဘဲ $1 {{GENDER:$2|က ရွှေ့ခဲ့သည်}}",
        "logentry-move-move_redir": "$3 စာမျက်နှာကို $4 သို့ ပြန်ညွှန်းပေါ်ထပ်၍ $1 က {{GENDER:$2|ရွှေ့ခဲ့သည်}}",
-       "logentry-move-move_redir-noredirect": "$3 မှ $4 သို့ ပြန်ညွှန်ပေါ်ထပ်အုပ်ကာ ပြန်ညွှန်းချန်မထားဘဲ $1 က {{GENDER:$2|ရွှေ့ခဲ့သည်}}",
+       "logentry-move-move_redir-noredirect": "$3 á\80\99á\80¾ $4 á\80\9eá\80­á\80¯á\80· á\80\95á\80¼á\80\94á\80ºá\80\8aá\80½á\80¾á\80\94á\80ºá\80¸á\80\95á\80±á\80«á\80ºá\80\91á\80\95á\80ºá\80¡á\80¯á\80\95á\80ºá\80\80á\80¬ á\80\95á\80¼á\80\94á\80ºá\80\8aá\80½á\80¾á\80\94á\80ºá\80¸á\80\81á\80»á\80\94á\80ºá\80\99á\80\91á\80¬á\80¸á\80\98á\80² $1 á\80\80 {{GENDER:$2|á\80\9bá\80½á\80¾á\80±á\80·á\80\81á\80²á\80·á\80\9eá\80\8aá\80º}}",
        "logentry-newusers-create": "အသုံးပြုသူအကောင့် $1 ကို {{GENDER:$2|ဖန်တီးခဲ့သည်}}",
        "logentry-newusers-autocreate": "အသုံးပြုသူအကောင့် $1 ကို အလိုအလျောက် {{GENDER:$2|ဖန်တီးခဲ့သည်}}",
        "logentry-upload-upload": "$1 သည် $3 ကို {{GENDER:$2|upload တင်ခဲ့သည်}}",
        "logentry-upload-overwrite": "$3 ၏ ဗားရှင်းအသစ်ကို $1 {{GENDER:$2|upload တင်ခဲ့သည်}}",
        "rightsnone": "(ဘာမှမရှိ)",
-       "revdelete-summary": "အကျဉ်းချုပ်ကို တည်းဖြတ်ရန်",
        "searchsuggest-search": "{{SITENAME}} တွင် ရှာဖွေရန်",
        "api-error-unknown-warning": "အမည်မသိ သတိပေးချက် - $1",
        "pagelanguage": "စာမျက်နှာ ဘာသာစကား ပြောင်းလဲရန်",
index 4da94e4..4c5e97d 100644 (file)
@@ -8,7 +8,8 @@
                        "唐吉訶德的侍從",
                        "Luuva",
                        "Macofe",
-                       "進也"
+                       "進也",
+                       "Liuxinyu970226"
                ]
        },
        "tog-underline": "Liân-kiat oē té-sûn:",
        "title-invalid-empty": "Só͘ iau-kiû ê ia̍h-bīn tê-bo̍k sī khang--ê he̍k-chiá kaⁿ-taⁿ hâm liáu miâ-khong-kan.",
        "title-invalid-utf8": "Só͘ iau-kiû ê ia̍h-bīn tê-bo̍k hâm liáu bô chiàⁿ-khak ê 1 lia̍t UTF-8 ê jī.",
        "title-invalid-interwiki": "Só͘ iau-kiû ê ia̍h-bīn tê-bo̍k pau-hâm liáu 1-ê bē-tàng ēng ùi tê-bo̍k ê interwiki liân-kiat.",
+       "title-invalid-talk-namespace": "Chhéng-kiû ê ia̍h-bīn tê-bo̍k chí-tēng liáu chi̍t phiⁿ bô hoat-tō͘ chûn-chāi ê thó-lūn-ia̍h.",
+       "title-invalid-characters": "Chhéng-kiû ê ia̍h-bīn tê-bo̍k hâm hâm bû-hāu ê bûn-jī: \"$1\".",
+       "title-invalid-relative": "Tê-bo̍k ū siong-tùi lō͘-kèng. Siong-tùi-sek ê ia̍h-bīn tê-bo̍k (./, ../) sī bû-hāu--ê, in-ūi iōng-chiá ê liû-lám-khì tiāⁿ thàng in bē kàu.",
+       "title-invalid-magic-tilde": "Chhéng-kiû ê ia̍h-bīn tê-bo̍k hâm bû-hāu ê mô͘-hoat tilde bûn-jī-lia̍t (<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "Chhéng-kiû ia̍h-bīn ê tê-bo̍k siuⁿ tn̂g. I ê UTF-8 pian-bé it-tēng bē-tàng tn̂g kòe $1 byte.",
+       "title-invalid-leading-colon": "Chhéng-kiû ia̍h-bīn tê-bo̍k thâu hâm bû-hāu ê tōa-kù-tiám (:)",
        "perfcached": "Ē-kha ê chu-liāu tùi lâi--ê, só·-í bô it-tēng sī siōng sin ê. Tī khoài-chhûn-khu siōng chē ē-tàng khǹg{{PLURAL:$1| pit|$1 pit}} chu-liāu.",
        "perfcachedts": "Ē-kha ê chu-liāu tùi lâi--ê, tī $1 keng-sin--koè. Tī khoài-chûn-khu siōng chē ē-tàng khǹg {{PLURAL:$4|pit|$4 pit}} chu-liāu.",
        "querypage-no-updates": "Chit-má bē-sái kái chit ia̍h.\nChia ê chu-liāu bē-tàng sui tiông-sin chéng-lí.",
        "confirmemail_body_changed": "Ū lâng (IP $1, tāi-khài sī lí pún-lâng) tī {{SITENAME}} ēng chit-ê e-mail chū-chí chù-chheh 1 ê kháu-chō \"$2\".\n\nChhiáⁿ khui ē-kha chit-ê liân-kiat, thang khak-jīn chit-ê kháu-chō si̍t-chāi sī lí ê:\n\n$3\n\nNā-chún *m̄-sī* lí, chhiáⁿ khui ē-kha chit-ê liân-kiat,  chhú-siau khak-jīn ê e-mail.\n\n$5\n\nChit tiuⁿ phoe ê khak-jīn-bé ē chū-tōng tī $4 kòe-kî.",
        "confirmemail_body_set": "Ū lâng (IP $1, tāi-khài sī lí pún-lâng) tī {{SITENAME}} ēng chit-ê e-mail chū-chí chù-chheh 1 ê kháu-chō \"$2\".\n\nChhiáⁿ khui ē-kha chit-ê liân-kiat, thang khak-jīn chit-ê kháu-chō si̍t-chāi sī lí ê:\n\n$3\n\nNā-chún *m̄-sī* lí, chhiáⁿ khui ē-kha chit-ê liân-kiat,  chhú-siau khak-jīn ê e-mail.\n\n$5\n\nChit tiuⁿ phoe ê khak-jīn-bé ē chū-tōng tī $4 kòe-kî.",
        "confirm-purge-top": "Kā chit ia̍h ê cache piàⁿ tiāu?",
+       "colon-separator": ":&#32;",
        "table_pager_next": "Aū-chi̍t-ia̍h",
        "table_pager_prev": "Téng-chi̍t-ia̍h",
        "table_pager_first": "Thâu-chi̍t-ia̍h",
index c6cbc54..9d296f0 100644 (file)
@@ -84,7 +84,8 @@
                        "Xxmarijnw",
                        "Mainframe98",
                        "QZanden",
-                       "Huhbakker"
+                       "Huhbakker",
+                       "Jos1950"
                ]
        },
        "tog-underline": "Verwijzingen onderstrepen:",
        "login-migrated-generic": "Uw gebruikersnaam is hernoemd, en uw gebruikersnaam bestaat niet langer op deze wiki.",
        "loginlanguagelabel": "Taal: $1",
        "suspicious-userlogout": "Uw verzoek om af te melden is genegeerd, omdat het lijkt alsof het verzoek is verzonden door een browser of cacheproxy die stuk is.",
-       "createacct-another-realname-tip": "Echte naam is optioneel.\nAls u deze opgeeft, wordt deze naam gebruikt worden om u erkenning te geven voor uw werk.",
+       "createacct-another-realname-tip": "Een echte naam is optioneel.\nAls u deze opgeeft, wordt deze naam gebruikt ter erkenning voor uw werk.",
        "pt-login": "Aanmelden",
        "pt-login-button": "Aanmelden",
        "pt-login-continue-button": "Doorgaan met aanmelden",
        "rcfilters-invalid-filter": "Ongeldig filter",
        "rcfilters-empty-filter": "Geen actieve filters. Alle bijdragen worden weergeven.",
        "rcfilters-filterlist-title": "Filters",
+       "rcfilters-filterlist-whatsthis": "Wat is dit?",
        "rcfilters-filterlist-feedbacklink": "Geef feedback op de nieuwe (beta) filters",
        "rcfilters-highlightbutton-title": "Resultaten markeren",
        "rcfilters-highlightmenu-title": "Kies een kleur",
index 34c9782..38debcb 100644 (file)
        "cantcreateaccount-text": "Kontooppretting frå denne IP-adressa ('''$1''') er blokkert av [[User:$3|$3]].\n\nGrunnen som vart gjeven av $3 er ''$2''",
        "viewpagelogs": "Vis loggane for sida",
        "nohistory": "Det finst ikkje nokon historikk for denne sida.",
-       "currentrev": "Versjonen no",
-       "currentrev-asof": "Versjonen no frå $1",
+       "currentrev": "Siste versjonen",
+       "currentrev-asof": "Siste versjonen frå $1",
        "revisionasof": "Versjonen frå $1",
        "revision-info": "Versjonen frå $1 av {{GENDER:$6|$2}}$7",
        "previousrevision": "← Eldre versjon",
        "nextrevision": "Nyare versjon →",
-       "currentrevisionlink": "Versjonen no",
+       "currentrevisionlink": "Siste versjonen",
        "cur": "no",
        "next": "neste",
        "last": "førre",
index 9554d79..a8906cc 100644 (file)
        "page_last": "koniec",
        "histlegend": "Wybór porównania – zaznacz kropeczkami dwie wersje do porównania i wciśnij enter lub przycisk ''Porównaj wybrane wersje''.<br />\nLegenda: (bież.) – pokaż zmiany od tej wersji do bieżącej,\n(poprz.) – pokaż zmiany od wersji poprzedzającej, m – mała (drobna) zmiana",
        "history-fieldset-title": "Przeglądaj historię",
-       "history-show-deleted": "Tylko usunięte",
+       "history-show-deleted": "Tylko usunięte edycje",
        "histfirst": "od najstarszych",
        "histlast": "od najświeższych",
        "historysize": "({{PLURAL:$1|1 bajt|$1 bajty|$1 bajtów}})",
        "rcfilters-invalid-filter": "Nieprawidłowy filtr",
        "rcfilters-empty-filter": "Brak aktywnych filtrów. Wyświetlane są wszystkie zmiany.",
        "rcfilters-filterlist-title": "Filtry",
+       "rcfilters-filterlist-whatsthis": "Co to jest?",
        "rcfilters-filterlist-feedbacklink": "Podziel się swoją opinią na temat tych nowych (beta) filtrów",
        "rcfilters-highlightbutton-title": "Podświetl wyniki",
        "rcfilters-highlightmenu-title": "Wybierz kolor",
        "rcfilters-filter-editsbyother-label": "Edycje inne niż Twoje",
        "rcfilters-filter-editsbyother-description": "Edycje wykonane przez innych (nie Twoje).",
        "rcfilters-filtergroup-userExpLevel": "Poziom doświadczenia (tylko dla zarejestrowanych użytkowników)",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Filtr \"Niezarejestrowani\" koliduje z jednym lub więcej filtrów z filtrów poziomu doświadczenia, które służą do wyszukiwania wkładu tylko zarejestrowanych użytkowników. Kolidujące filtry zostały oznaczone jako nieaktywne.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Początkujący",
        "rcfilters-filter-user-experience-level-newcomer-description": "Mniej niż 10 edycji i 4 dni aktywności.",
        "rcfilters-filter-user-experience-level-learner-label": "Uczący się",
        "rcfilters-filter-bots-description": "Zmiany wykonane z użyciem zautomatyzowanych narzędzi.",
        "rcfilters-filter-humans-label": "Człowiek (nie bot)",
        "rcfilters-filter-humans-description": "Zmiany wprowadzone przez ludzi.",
+       "rcfilters-filtergroup-reviewstatus": "Status przejrzenia",
+       "rcfilters-filter-patrolled-label": "Sprawdzone",
+       "rcfilters-filter-patrolled-description": "Edycje oznaczone jako sprawdzone.",
+       "rcfilters-filter-unpatrolled-label": "Niesprawdzone",
+       "rcfilters-filter-unpatrolled-description": "Edycje nie oznaczone jako sprawdzone.",
        "rcfilters-filtergroup-significance": "Znaczenie",
        "rcfilters-filter-minor-label": "Drobne zmiany",
        "rcfilters-filter-minor-description": "Zmiany, które autor oznaczył jako drobne.",
index c3a871f..1e05084 100644 (file)
        "rcfilters-invalid-filter": "A label for an invalid filter.",
        "rcfilters-empty-filter": "Placeholder for the filter list when no filters were chosen.",
        "rcfilters-filterlist-title": "Title for the filters list.\n{{Identical|Filter}}",
+       "rcfilters-filterlist-whatsthis": "Caption for the link that opens a popup with explanations about this filter group.",
        "rcfilters-filterlist-feedbacklink": "Caption for the link to the feedback page about the filters beta feature.",
        "rcfilters-highlightbutton-title": "Title for the highlight button used to toggle the highlight feature on and off.",
        "rcfilters-highlightmenu-title": "Title for the highlight menu used to select the highlight color for an individual filter.",
        "rcfilters-highlightmenu-help": "Tooltip for the highlight menu for individual filters.",
        "rcfilters-filterlist-noresults": "Message showing no results found for searching a filter.",
+       "rcfilters-noresults-conflict": "A message displayed in the results area when no results found because there are filters in conflict with one another.",
+       "rcfilters-state-message-subset": "Tooltip shown when hovering over a filter tag when one or more broader filters that contain the hovered filter are also selected. This indicates that the hovered filter has no effect because all the results it matches are also matched by the broader filter(s).  Parameters:\n* $1 - Comma-separated string of selected broader filters that this filter is a subset of\n* $2 - Count of filters in $1, for PLURAL",
+       "rcfilters-state-message-fullcoverage": "Tooltip shown when hovering over a filter tag when all the filters in its group are selected. This indicates that the hovered filter has no effect because the selected filters in the group cover all changes. Parameters:\n* $1 - Comma-separated string of selected filters in the group\n* $2 - Count of filters in $1, for PLURAL",
        "rcfilters-filtergroup-registration": "Title for the filter group for editor registration type.",
        "rcfilters-filter-registered-label": "Label for the filter for showing edits made by logged-in users.\n{{Identical|Registered}}",
        "rcfilters-filter-registered-description": "Description for the filter for showing edits made by logged-in users.",
        "rcfilters-filter-categorization-description": "Description for the filter for showing edits adding or removing pages to categories.",
        "rcfilters-filter-logactions-label": "Label for the filter for showing logged actions.",
        "rcfilters-filter-logactions-description": "Description for the filter for showing logged actions.",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "The \"Minor edits\" filter is conflicting 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.\n\n\"Type of Change\" is {{msg-mw|Rcfilters-filtergroup-changetype}}.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Tooltip shown when hovering over the Minor edits tag, when a Type of Change filter is also selected.\n\n\"Minor edits\" is {{msg-mw|rcfilters-filter-minor-label}}.\n\n\"Type of change\" is {{msg-mw|rcfilters-filtergroup-changetype}}.\n\nThis indicates that no results will be shown.  Parameters:\n* $1 - Comma-separated string of selected Type of Change filters, e.g. \"Category, Logged Actions\"\n* $2 - Count of selected User Experience Level filters, for PLURAL",
+       "rcfilters-typeofchange-conflicts-hideminor": "Tooltip shown when hovering over a Type of change filter tag, when the Minor edits filter is also selected.\n\n\"Minor edits\" is {{msg-mw|rcfilters-filter-minor-label}}.\n\n\"Type of change\" is {{msg-mw|rcfilters-filtergroup-changetype}}.\n\nThis indicates that no results will be shown.",
        "rcnotefrom": "This message is displayed at [[Special:RecentChanges]] when viewing recentchanges from some specific time.\n\nThe corresponding message is {{msg-mw|Rclistfrom}}.\n\nParameters:\n* $1 - the maximum number of changes that are displayed\n* $2 - (Optional) a date and time\n* $3 - a date\n* $4 - a time\n* $5 - Number of changes are displayed, for use with PLURAL",
        "rclistfrom": "Used on [[Special:RecentChanges]]. Parameters:\n* $1 - (Currently not use) date and time. The date and the time adds to the rclistfrom description.\n* $2 - time. The time adds to the rclistfrom link description (with split of date and time).\n* $3 - date. The date adds to the rclistfrom link description (with split of date and time).\n\nThe corresponding message is {{msg-mw|Rcnotefrom}}.",
        "rcshowhideminor": "Option text in [[Special:RecentChanges]]. Parameters:\n* $1 - the \"show/hide\" command, with the text taken from either {{msg-mw|rcshowhideminor-show}} or {{msg-mw|rcshowhideminor-hide}}\n{{Identical|Minor edit}}",
index 4279d24..3f8d740 100644 (file)
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Afișează",
        "rcnotefrom": "Dedesubt {{PLURAL:$5|se află o modificare|sunt modificările}} începând cu <b>$3, $4</b> (maximum <b>$1</b> afișate).",
-       "rclistfrom": "Se afișează modificările începând cu $3, $2",
+       "rclistfrom": "Afișează modificările începând cu $3, ora $2",
        "rcshowhideminor": "$1 modificările minore",
        "rcshowhideminor-show": "Arată",
        "rcshowhideminor-hide": "Ascunde",
index 36efee9..7d46955 100644 (file)
                        "Gamliel Fishkin",
                        "Ping08",
                        "Yuryleb",
-                       "Redredsonia"
+                       "Redredsonia",
+                       "Nitch"
                ]
        },
        "tog-underline": "Подчёркивание ссылок:",
        "rcfilters-invalid-filter": "Недопустимый фильтр",
        "rcfilters-empty-filter": "Нет активных фильтров. Показываются все правки.",
        "rcfilters-filterlist-title": "Фильтры",
+       "rcfilters-filterlist-whatsthis": "Что это?",
        "rcfilters-filterlist-feedbacklink": "Оставить отзыв о новых (бета) фильтрах",
        "rcfilters-highlightbutton-title": "Выделить результаты",
        "rcfilters-highlightmenu-title": "Выберите цвет",
index 9549557..5107682 100644 (file)
@@ -6,7 +6,8 @@
                        "Fayazburiro",
                        "Sindhu",
                        "Mehtab ahmed",
-                       "Macofe"
+                       "Macofe",
+                       "Indus Asia"
                ]
        },
        "tog-underline": "ڳنڍڻي هيٺان لڪير:",
        "login": "داخل ٿيو",
        "login-security": "پنھنجي سڃاڻپ جي خاطري ڪريو",
        "nav-login-createaccount": "داخل ٿيو / کاتو کوليو",
-       "userlogin": "داخل ٿيو / کاتو کوليو",
-       "userloginnocreate": "داخل ٿيو",
        "logout": "خارج ٿيو",
        "userlogout": "خارج ٿيو",
        "notloggedin": "داخل ٿيل نہ آهيو",
        "userlogin-noaccount": "کاتو نہ ٿا رکو؟",
        "userlogin-joinproject": "{{SITENAME}} ۾ شامل ٿيو",
-       "nologin": " کاتو نہ ٿا رکو؟ '''$1'''.",
-       "nologinlink": "نئون کاتو کوليو",
        "createaccount": "کاتو کوليو",
-       "gotaccount": "ڇا اڳي ئي کاتو رکو ٿا؟ '''$1'''.",
-       "gotaccountlink": "داخل ٿيو",
-       "userlogin-resetlink": "پنهنجي داخل ٿيڻ جا تفصيل وساري ويٺا؟",
        "userlogin-resetpassword-link": "ڳجھولفظ وساري ويٺا آهيو؟",
        "userlogin-helplink2": "داخل ٿيڻ ۾ مدد",
        "userlogin-reauth": "اھو پڪ ڪرڻ لاءِ ته توھان {{GENDER:$1|$1}} آھيو توھان کي ٻيھر داخل ٿيڻو پوندو.",
        "createacct-another-email-ph": "برق ٽپال پتو ڄاڻايو",
        "createaccountmail": "ڪو بہ عارضي ڳجھولفظ استعمال ڪريو ۽ ڄاڻايل برقٽپال پتي تي اماڻيو",
        "createacct-realname": "اصل نالو (مرضيءَ موجب)",
-       "createaccountreason": "سبب:",
        "createacct-reason": "سبب",
        "createacct-reason-ph": "توهان ٻيو کاتو ڇو کولي رهيا آهيو",
        "createacct-submit": "پنھنجو کاتو کوليو",
        "recentchanges-legend-heading": "<strong>ڪنجي:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (پڻ ڏسو [[Special:NewPages|نون صفحن جي فھرست]])",
        "recentchanges-submit": "ڏيکاريو",
+       "rcfilters-filterlist-whatsthis": "هي ڇا آهي؟",
+       "rcfilters-highlightbutton-title": "نتيجن کي نمايان (هاءِ لائيٽ) ڪيو",
+       "rcfilters-highlightmenu-title": "رنگ چونڊيو",
        "rcnotefrom": "هيٺ {{PLURAL:$5|تبديلي آهي|تبديليون آهن}} کان <strong>$3, $4</strong> (تائين <strong>$1</strong> ) ڏيکاريل آهن.",
        "rclistfrom": "$2، $3 کان شروع ٿيندڙ نيون تبديليون ڏيکاريو",
        "rcshowhideminor": "$1 معمولي ترميمون",
        "logentry-newusers-create": "يوزر کاتو $1 {{GENDER:$2|سرجيو ويو}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|چاڙهيو}} $3",
        "rightsnone": "(ڪو بہ نہ)",
-       "revdelete-summary": "ترميمي خلاصو",
        "feedback-back": "پوئتي",
        "feedback-cancel": "رد",
        "feedback-close": "ٿي ويو",
index fd6462a..f1e0537 100644 (file)
        "hidden-category-category": "လိူင်ႈ ဢၼ်လပ်ႉသိူင်ႇဝႆႉ",
        "category-subcat-count": "{{PLURAL:$2|ၼႂ်းလိူင်ႈဢၼ်ၼႆႉ မီးၵိင်ႇၽႄလိူင်ႈၼႆႉ ၸိူင်ႉၼႆၵွၺ်း|ၼႂ်းလိူင်ႈၼႆႉ မီး This category has the following {{PLURAL:$1|ၵိင်ႇၽႄလိူင်ႈ|$1 ၵိင်ႇၽႄလိူင်ႈတင်းလၢႆး}}, ၼႂ်းၵႃႊ $2 တင်းသဵင်ႈတင်းမူတ်း}}",
        "category-subcat-count-limited": "ၼႂ်းလိူင်ႈၼႆႉ မီးဝႆႉလိူင်ႈၼင်ႇၼႆ {{PLURAL:$1| ၵိင်ႇၽႄလိူင်ႈ |$1 ၵိင်ႇၽႄလိူင်ႈတင်းလၢႆ}}",
-       "category-article-count": "{{PLURAL:$2| á\80\9cá\80­á\80°á\80\84á\80ºá\82\88á\80¢á\81¼á\80ºá\81¼á\82\86á\82\89 á\80\95á\82\83á\80¸á\80\9dá\82\86á\82\89á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\81¼á\80\84á\80ºá\82\87á\80\95á\82\83á\82\88á\80\90á\82\82á\80ºá\82\88á\81¼á\82\86á\82\89á\81µá\80½á\81ºá\80ºá\80¸ |á\80\90á\81¢á\80\84á\80ºá\80¸á\80\95á\82\83á\82\88á\80\90á\82\82á\80ºá\82\88á\81¼á\82\86á\82\89{{PLURAL:$1| á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88 }} á\80\99á\80®á\80¸á\81¼á\82\82á\80ºá\80¸á\80\9cá\80­á\80°á\80\84á\80ºá\82\88á\81¼á\82\86á\82\89 á\81µá\82\83á\82\8aá\81¼á\82\82á\80ºá\80¸ $2 á\80\90á\80\84á\80ºá\80¸á\80\9eá\80µá\80\84á\80ºá\82\88á\80\90á\80\84á\80ºá\80¸á\80\99á\80°á\80\90á\80ºá\80¸}}",
+       "category-article-count": "{{PLURAL:$2| á\80\9cá\80­á\80°á\80\84á\80ºá\82\88á\80¢á\81¼á\80ºá\81¼á\82\86á\82\89 á\80\95á\82\83á\80¸á\80\9dá\82\86á\82\89á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\81¼á\80\84á\80ºá\82\87á\80\95á\82\83á\82\88á\80\90á\82\82á\80ºá\82\88á\81¼á\82\86á\82\89á\81µá\80½á\81ºá\80ºá\80¸ |á\81¼á\82\82á\80ºá\80¸á\80\9cá\80­á\80°á\80\84á\80ºá\82\88á\80¢á\81¼á\80ºá\81¼á\82\86á\82\89 {{PLURAL:$1| á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88 }} á\80\90á\80\84á\80ºá\80¸á\80\9eá\80µá\80\84á\80ºá\82\88á\80\90á\80\84á\80ºá\80¸á\80\99á\80°á\80\90á\80ºá\80¸ á\80\99á\80®á\80¸á\80\9dá\82\86á\82\89 $2 á\82\81á\80°á\80\9dá\80º}}á\81\8b",
        "category-article-count-limited": "တၢင်းပႃႈတႂ်ႈၼႆႉ  {{PLURAL:$1| ၼႃႈလိၵ်ႈ }} မီးၼႂ်းလိူင်ႈ တေႃႈလဵဝ်ၼႆႉ",
        "category-file-count": "{{PLURAL:$2| လိူင်ႈဢၼ်ၼႆႉ ပႃးဝႆႉၼႃႈလိၵ်ႈၼင်ႇပႃႈတႂ်ႈၼႆႉၵွၺ်း |တၢင်းပႃႈတႂ်ႈၼႆႉ{{PLURAL:$1| ၾႆႇၼႆႉပဵၼ်|$1 ၾၢႆႇၸိူဝ်းၼႆႉပဵၼ် }} မီးၼႂ်းလိူင်ႈၼႆႉ ၵႃႊၼႂ်း $2 တင်းသဵင်ႈတင်းမူတ်း}}",
        "category-file-count-limited": "ဢၼ်ပဵၼ် {{PLURAL:$1|ၾၢႆႇၼႆႉ|$1 ၾၢႆႇၸိူဝ်းၼႆႉ}} မီးဝႆႉတီႈၼႂ်း တွၼ်ႈၵၼ်ၼႆ့။",
        "login": "လွၵ်ႉဢိၼ်ႇ",
        "login-security": "ၼႄႉၼွၼ်း မၢႆၽၢင်ၸဝ်ႈၵဝ်ႇ",
        "nav-login-createaccount": "လွၵ်ႉဢိၼ်ႇ / သၢင်ႈဢၶွင်ႉ",
-       "userlogin": "လွၵ်ႉဢိၼ်ႇ / သၢင်ႈဢၶွင်ႉ",
-       "userloginnocreate": "လွၵ်ႉဢိၼ်ႇ",
        "logout": "လွၵ်ႉဢွၵ်ႉ",
        "userlogout": "လွၵ်ႉဢွၵ်ႉ",
        "notloggedin": "ဢမ်ႇလႆႈၶဝ်ႈဝႆ့",
        "userlogin-noaccount": "ပႆႇပႃႈမီးဢၶွင်ႉႁႃႉ?",
        "userlogin-joinproject": "ႁူမ်ႈ {{SITENAME}}",
-       "nologin": "ပႆႇပႃႈမီးဢၶွင်ႉႁႃႉ? $1",
-       "nologinlink": "ၵေႃႇသၢင်ႈဢၶွင်ႉ",
        "createaccount": "ႁဵတ်းဢၶွင်ႉ",
-       "gotaccount": "မီးဢၶွင်ႉဝႆႉယဝ်ႉႁႃႉ? $1",
-       "gotaccountlink": "လွၵ်ႉဢိၼ်ႇ",
-       "userlogin-resetlink": "လိုမ်းပႅတ်ႈၵႂႃႇ ႁူဝ်ယွႆႈ လွၵ်ႉဢိၼ်ႉၸဝ်ႈၵဝ်ႇယဝ်ႉႁႃႉ?",
        "userlogin-resetpassword-link": "လိုမ်းၵႂႃႇ ၶေႃႈလပ်ႉၸဝ်ႈၵဝ်ႇႁႃႉ?",
        "userlogin-helplink2": "ၸွႆႈထႅမ်တင်း ၶဝ်ႈလွၵ်ႉဢိၼ်ႇ",
        "userlogin-loggedin": "​ၸဝ်ႈၵဝ်ႇပေႃး ၶဝ်ႈၸႂ်ႉဝႆႉ ၼင်ႇ{{GENDER:$1|$1}} ယဝ်ႈ။\nၸႂ်ႉပၼ် လၢႆးၼင်ႇပႃႈတႂ်ႈၼႆႉသေ လွၵ်ႉဢိၼ်ႇၼင်ႇ ၽူႈၸႂ်ႉတိုဝ်းတၢင်ႇၵေႃႉ",
        "createaccountmail": "ၸႂ်ႉပၼ် ၶေႃႈလပ်ႉၸူဝ်ႈၵႅပ်ႉ သူင်ႇၼၼ်ႉၵႂႃႇၸူး ႁဵင်းလိၵ်ႈဢီးမေးလ် ဢၼ်မၵ်းမၼ်ႈဝႆႉ ပၼ်ၼၼ်ႉ။",
        "createaccountmail-help": "ပေႃးဢမ်ႇမီး လွင်ႈလဵပ်ႈႁဵၼ်း ၶေႃႈလပ်ႉၼႆ တေဢမ်ႇၸၢင်ႈဢဝ်ၸႂ်ႉ တႃႇတေၵေႃႇတင်ႈ ဢၶွင်ႉတွၼ်ႈတႃႇ ၵူၼ်းတၢင်ႇၵေႃႉ။",
        "createacct-realname": "ၸိုဝ်ႈတႄႉတႄႉ (ဢဝ်ၸႂ်ဝႃႈ)",
-       "createaccountreason": "လွင်ႈတၢင်း :",
        "createacct-reason": "လွင်ႈတၢင်း :",
        "createacct-reason-ph": "ယွၼ်ႉပိူဝ်ႈသင်လႄႈ ၸဝ်ႈၵဝ်ႇ ၵေႃႇသၢင်ႈဢၶွင်ႉတၢင်ႇဢၼ်",
        "createacct-reason-help": "ၶေႃႈၶၢဝ်ႇၼႄဝႆႉ ၵႃႈတီႈၼႂ်း သဵၼ်ႈ​မၢႆၵေႃႇသၢင်ႈ ဢၶွင်ႉ",
        "rcfilters-filter-editsbyother-label": "ဢၼ်တၢင်ႇၵေႃႉ ၵေႃႉထတ်း",
        "rcfilters-filter-editsbyother-description": "ၵၢၼ်မႄးထတ်း ဢၼ်ၽူႈၸႂ်ႉတိုဝ်း တၢင်ႇၸိူဝ်း ၵေႃသၢင်ႈဝႆႉ (ဢၼ်ဢမ်ႇၸႂ်ႈ ၸဝ်ႈၵဝ်ႇ)",
        "rcfilters-filtergroup-userExpLevel": "ၸၼ်ႉထၢၼ်ႈ တူဝ်ထူပ်း (တွၼ်ႈတႃႈ ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းတၢင်ႇဝႆႉ မႆၽၢင်ၵူၺ်း)",
-       "rcfilters-filter-userExpLevel-newcomer-label": "ၵူၼ်းၼႃႈမႂ်ႇ",
-       "rcfilters-filter-userExpLevel-newcomer-description": "ဢေႇလိူဝ် ၵၢၼ်မႄးထတ်း ႑႐ ဢၼ် လႄႈ လွင်ႈတူင်ႉၼိုင် တႃႇသီႇဝၼ်း",
-       "rcfilters-filter-userExpLevel-learner-label": "ၽူႈလဵပ်ႈႁဵၼ်း",
-       "rcfilters-filter-userExpLevel-learner-description": "ၵၢၼ်တူင်ႉၼိုင်လႄႈ ၵၢၼ်မႄးထတ်း ဝၼ်းမၼ်း ၼမ်လိူဝ်သေ \"ၵူၼ်းၼႃႈမႂ်ႇ\"သေတႃႉ ဝၼ်းမၼ်းတိုၵ်ႉဢေႇလိူဝ်သေ \"ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းမီးတူဝ်ထူပ်း\"။",
-       "rcfilters-filter-userExpLevel-experienced-label": "ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းမီးတူဝ်ထူပ်း",
-       "rcfilters-filter-userExpLevel-experienced-description": "လွင်ႈတူင်ႉၼိုင် ၼမ်လိူဝ် ႓႐ ဝၼ်း လႄႈ လွင်ႈမႄးထတ်း ႕႐႐ ။",
+       "rcfilters-filter-user-experience-level-newcomer-label": "ၵူၼ်းၼႃႈမႂ်ႇ",
+       "rcfilters-filter-user-experience-level-newcomer-description": "ဢေႇလိူဝ် ၵၢၼ်မႄးထတ်း ႑႐ ဢၼ် လႄႈ လွင်ႈတူင်ႉၼိုင် တႃႇသီႇဝၼ်း",
+       "rcfilters-filter-user-experience-level-learner-label": "ၽူႈလဵပ်ႈႁဵၼ်း",
+       "rcfilters-filter-user-experience-level-learner-description": "ၵၢၼ်တူင်ႉၼိုင်လႄႈ ၵၢၼ်မႄးထတ်း ဝၼ်းမၼ်း ၼမ်လိူဝ်သေ \"ၵူၼ်းၼႃႈမႂ်ႇ\"သေတႃႉ ဝၼ်းမၼ်းတိုၵ်ႉဢေႇလိူဝ်သေ \"ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းမီးတူဝ်ထူပ်း\"။",
+       "rcfilters-filter-user-experience-level-experienced-label": "ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းမီးတူဝ်ထူပ်း",
+       "rcfilters-filter-user-experience-level-experienced-description": "လွင်ႈတူင်ႉၼိုင် ၼမ်လိူဝ် ႓႐ ဝၼ်း လႄႈ လွင်ႈမႄးထတ်း ႕႐႐ ။",
        "rcfilters-filtergroup-automated": "ၶဝ်ႈႁူမ်ႈႁင်းၵႂႃႇႁင်းမၼ်း",
        "rcfilters-filter-bots-label": "ပွတ်ႉ",
        "rcfilters-filter-bots-description": "ၶိူင်ႈႁဵတ်းႁင်းၶေႃ ၵေႃႉႁဵတ်းသၢင်ႈဝႆႉ လွင်ႈမႄးထတ်း",
index 45d4c54..2da5182 100644 (file)
        "accmailtitle": "Heslo bolo odoslané.",
        "accmailtext": "Náhodne vytvorené heslo pre používateľa [[User talk:$1|$1]] bolo poslané na $2. Je možné ho zmeniť na stránke ''[[Special:ChangePassword|zmena hesla]]'' po prihlásení.",
        "newarticle": "(Nový)",
-       "newarticletext": "Sledovali ste odkaz na stránku, ktorá zatiaľ neexistuje.\nStránku vytvoríte tak, že začnete písať do poľa nižšie (viac informácií nájdete na stránkach [$1 nápovedy]).\nAk ste sa sem dostali nechtiac, kliknite na tlačidlo <strong>späť</strong> vo svojom prehliadači.",
+       "newarticletext": "Nasledovali ste odkaz, vedúci na stránku, ktorá zatiaľ neexistuje.\nStránku vytvoríte tak, že začnete písať do políčka nižšie (viac informácií nájdete na stránkach [$1 nápovedy]).\nAk ste sa sem dostali nechtiac, kliknite na tlačidlo <strong>späť</strong> vo svojom prehliadači.",
        "anontalkpagetext": "----\n<em>Toto je diskusná stránka anonymného používateľa, ktorý nemá vytvorené svoje konto alebo ho nepoužíva.</em>\nPreto musíme na jeho identifikáciu použiť numerickú IP adresu. Je možné, že takúto IP adresu používajú viacerí používatelia.\nAk ste anonymný používateľ a máte pocit, že vám boli adresované irelevantné diskusné príspevky, [[Special:CreateAccount|vytvorte si konto]] alebo sa [[Special:UserLogin|prihláste]], aby sa zamedzilo budúcim zámenám s inými anonymnými používateľmi.",
        "noarticletext": "Na tejto stránke sa momentálne nenachádza žiadny text.\nMôžete [[Special:Search/{{PAGENAME}}|vyhľadávať názov tejto stránky]] v obsahu iných stránok,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} vyhľadávať v súvisiacich záznamoch] alebo [{{fullurl:{{FULLPAGENAME}}|action=edit}} vytvoriť túto stránku]</span>.",
        "noarticletext-nopermission": "Táto stránka momentálne neobsahuje žiadny text.\nMôžete [[Special:Search/{{PAGENAME}}|hľadať názov tejto stránky]] v texte iných stránok\nalebo <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} hľadať v súvisiacich záznamoch]</span>, ale nemáte oprávnenie túto stránku vytvoriť.",
        "trackingcategories-msg": "Sledovacia kategória",
        "trackingcategories-name": "Názov správy",
        "trackingcategories-desc": "Kritériá pre zaradenie do kategórie",
+       "restricted-displaytitle-ignored": "Stránky s ignorovanými zobrazovanými názvami",
        "noindex-category-desc": "Stránka nie je indexovaná robotmi, pretože obsahuje magické slovo <code><nowiki>__NOINDEX__</nowiki></code> a je v mennom priestore, v ktorom je tento príznak povolený.",
        "index-category-desc": "Stránka obsahuje magické slovo <code><nowiki>__INDEX__</nowiki></code> (a je v mennom prostore, v ktorom je tento príznak povolený), takže je indexovaná robotmi, hoci by normálne nebola.",
        "post-expand-template-inclusion-category-desc": "Stránka je po rozbalení všetkých šablón väčšia než <code>$wgMaxArticleSize</code>, takže niektoré šablóny nemohli byť rozbalené.",
index 89560de..c36a330 100644 (file)
        "page_first": "prva",
        "page_last": "zadnja",
        "histlegend": "Izbira primerjave: označite okroglo polje ob redakciji za primerjavo in stisnite enter ali gumb na dnu strani.<br />\nLegenda: '''({{int:cur}})''' = primerjava s trenutno redakcijo, '''({{int:last}})''' = primerjava s prejšnjo redakcijo, '''{{int:minoreditletter}}''' = manjše urejanje.",
-       "history-fieldset-title": "Zgodovina poizvedovanj",
+       "history-fieldset-title": "Iskanje redakcij",
        "history-show-deleted": "Samo izbrisana redakcija",
        "histfirst": "najstarejše",
        "histlast": "najnovejše",
        "rcfilters-invalid-filter": "Neveljaven filter",
        "rcfilters-empty-filter": "Ni dejavnih filtrov. Prikazani so vsi prispevki.",
        "rcfilters-filterlist-title": "Filtri",
+       "rcfilters-filterlist-whatsthis": "Kaj je to?",
        "rcfilters-filterlist-feedbacklink": "Podajte povratne informacije o novih (preizkusnih) filtrih",
        "rcfilters-highlightbutton-title": "Označi rezultate",
        "rcfilters-highlightmenu-title": "Izberite barvo",
        "rcfilters-highlightmenu-help": "Izberite barvo za označitev te lastnosti",
        "rcfilters-filterlist-noresults": "Nismo našli nobenega filtra",
+       "rcfilters-noresults-conflict": "Našli nismo nobenih rezultatov, ker si merila za iskanje nasprotujejo",
+       "rcfilters-state-message-subset": "Ta filter nima učinka, saj njegove rezultate {{PLURAL:$2|vključuje naslednji, širši filter|vključujeta naslednja, širša filtra|vključujejo naslednji, širši filtri}} (označite jih, da razlikujete med njimi): $1",
+       "rcfilters-state-message-fullcoverage": "Izbira vseh filtrov v skupini je enako kot izbira nobenega, zato ta filter nima učinka. Skupina vključuje: $1",
        "rcfilters-filtergroup-registration": "Registracija uporabnika",
        "rcfilters-filter-registered-label": "Registriran",
        "rcfilters-filter-registered-description": "Prijavljeni uredniki.",
        "rcfilters-filter-unregistered-label": "Neregistriran",
        "rcfilters-filter-unregistered-description": "Uredniki, ki niso prijavljeni.",
-       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Filter »Neregistrirani« ni dejaven, saj njegov učinek {{PLURAL:$2|izniči naslednji filter|izničita naslednja filtra|izničijo naslednji filtri}} Izkušnje, ki {{PLURAL:$2|najde|najdeta|najdejo}} samo registrirane uporabnike: $1",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Filter je v sporu z {{PLURAL:$2|naslednjim filtrom|naslednjima filtroma|naslednjimi filtri}} Izkušnje, ki {{PLURAL:$2|najde|najdeta|najdejo}} samo registrirane uporabnike: $1",
        "rcfilters-filtergroup-authorship": "Uredi avtorstvo",
        "rcfilters-filter-editsbyself-label": "Vaša lastna urejanja",
        "rcfilters-filter-editsbyself-description": "Vaša urejanja.",
        "rcfilters-filter-editsbyother-label": "Urejanja drugih",
        "rcfilters-filter-editsbyother-description": "Urejanja, ki so jih naredili drugi uporabniki (ne vi).",
        "rcfilters-filtergroup-userExpLevel": "Stopnja izkušenosti (samo za registrirane uporabnike)",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Filter ni dejaven, saj najde samo registrirane uporabnike in zato filter »Neregistrirani« izniči njegov učinek.",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Filter »Neregistrirani« je v sporu z enim ali več filtrov Izkušnje. Filtri Izkušnje najdejo samo registrirane uporabnike. Filtri v sporu so zgoraj označeni kot nedejavni.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Napredni filtri najdejo samo registrirane uporabnike, zato je ta filter v sporu s filtrom »Neregistrirani«.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Filter »Neregistrirani« je v sporu z enim ali več filtri Izkušnje, ki najdejo samo registrirane uporabnike. Filtri v sporu so označeni zgoraj, v območju Dejavni filtri.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Novinci",
        "rcfilters-filter-user-experience-level-newcomer-description": "Manj kot 10 urejanj in 4 dni dejavnosti.",
        "rcfilters-filter-user-experience-level-learner-label": "Učenci",
        "rcfilters-filter-categorization-description": "Zapisi o straneh, ki so bila dodana ali odstranjena iz kategorij.",
        "rcfilters-filter-logactions-label": "Zabeležena dejanja",
        "rcfilters-filter-logactions-description": "Administrativna dejanja, ustvarjanja računov, izbrisi strani, nalaganja ...",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "Filter »Manjša urejanja« je v sporu z enim ali več filtri Vrsta spremembe, ker nekaterih vrst urejanj ni možno označiti kot »manjša«. Filtri v sporu so označeni v območju Dejavni filtri zgoraj.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Nekaterih vrst sprememb ni možno označiti kot »manjše«, zato je ta filter v sporu z naslednjimi filtri Vrsta spremembe: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Ta filter Vrsta spremembe je v sporu s filtrom »Manjše urejanje«. Nekaterih vrst sprememb ni možno označiti kot »manjše«.",
        "rcnotefrom": "{{PLURAL:$5|Navedena je sprememba|Navedeni sta spremembi|Navedene so spremembe}} od <strong>$3 $4</strong> dalje (prikazujem jih do <strong>$1</strong>).",
        "rclistfrom": "Prikaži spremembe od $3 $2 naprej",
        "rcshowhideminor": "$1 manjša urejanja",
index 465d6fa..7799835 100644 (file)
        "zip-bad": "Датотека је оштећена или је нечитљива ZIP датотека.\nБезбедносна провера не може да се изврши како треба.",
        "zip-unsupported": "Датотека је формата ZIP који користи могућности које не подржава Медијавики.\nБезбедносна провера не може да се изврши како треба.",
        "uploadstash": "Тајно складиште",
-       "uploadstash-summary": "Ð\9eва Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¿Ñ\80Ñ\83жа Ð¿Ñ\80иÑ\81Ñ\82Ñ\83п Ð´Ð°Ñ\82оÑ\82екама ÐºÐ¾Ñ\98е Ñ\81Ñ\83 Ð¿Ð¾Ñ\81лаÑ\82е (или Ñ\81е Ñ\88аÑ\99Ñ\83), Ð°Ð»Ð¸ Ñ\98оÑ\88 Ð½Ð¸Ñ\81Ñ\83 Ð¾Ð±Ñ\98авÑ\99ене. Ð\9eве Ð´Ð°Ñ\82оÑ\82еке Ñ\81Ñ\83 Ð²Ð¸Ð´Ñ\99иве Ñ\81амо ÐºÐ¾Ñ\80иÑ\81никÑ\83 ÐºÐ¾Ñ\98и Ð³Ð° Ñ\98е Ð¿Ð¾Ñ\81лао.",
+       "uploadstash-summary": "Ð\9eва Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¿Ñ\80Ñ\83жа Ð¿Ñ\80иÑ\81Ñ\82Ñ\83п Ð´Ð°Ñ\82оÑ\82екама ÐºÐ¾Ñ\98е Ñ\81Ñ\83 Ð¾Ñ\82пÑ\80емÑ\99ене Ð¸Ð»Ð¸ Ñ\81е Ð¾Ñ\82пÑ\80емаÑ\98Ñ\83, Ð°Ð»Ð¸ Ñ\98оÑ\88 Ð½Ð¸Ñ\81Ñ\83 Ð¾Ð±Ñ\98авÑ\99ене. Ð\9eве Ð´Ð°Ñ\82оÑ\82еке Ð½Ð¸Ñ\81Ñ\83 Ð²Ð¸Ð´Ñ\99иве Ð½Ð¸ÐºÐ¾Ð¼Ðµ, Ð¾Ñ\81им ÐºÐ¾Ñ\80иÑ\81никÑ\83 ÐºÐ¾Ñ\98и Ð¸Ñ\85 Ñ\98е Ð¾Ñ\82пÑ\80емио.",
        "uploadstash-clear": "Очисти сакривене датотеке",
        "uploadstash-nofiles": "Немате сакривене датотеке.",
        "uploadstash-badtoken": "Извршавање дате радње није успело, разлог томе може бити истек времена за уређивање. Покушајте поново.",
        "logentry-rights-rights": "$1 је {{GENDER:$2|променио|променила}} чланство групе за {{GENDER:$6|$3}} из $4 у $5",
        "logentry-rights-rights-legacy": "$1 је {{GENDER:$2|променио|променила}} чланство групе за $3",
        "logentry-rights-autopromote": "$1 је аутоматски {{GENDER:$2|унапређен|унапређена}} из $4 у $5",
-       "logentry-upload-upload": "$1 Ñ\98е {{GENDER:$2|поÑ\81лао|поÑ\81лала}} $3",
-       "logentry-upload-overwrite": "$1 Ñ\98е {{GENDER:$2|поÑ\81лао|поÑ\81лала}} нову верзију $3",
-       "logentry-upload-revert": "$1 Ñ\98е {{GENDER:$2|поÑ\81лао|поÑ\81лала}} $3",
+       "logentry-upload-upload": "$1 Ñ\98е {{GENDER:$2|оÑ\82пÑ\80емио|оÑ\82пÑ\80емила}} $3",
+       "logentry-upload-overwrite": "$1 Ñ\98е {{GENDER:$2|оÑ\82пÑ\80емио|оÑ\82пÑ\80емила}} нову верзију $3",
+       "logentry-upload-revert": "$1 Ñ\98е {{GENDER:$2|оÑ\82пÑ\80емио|оÑ\82пÑ\80емила}} $3",
        "log-name-managetags": "Дневник уређивања ознака",
        "log-description-managetags": "Овај дневник садржи списак измена у вези [[Special:Tags|ознака]]. Дневник садржи само радње извршене од стране администратора, уноси за ознаке направљене или обрисане од стране вики софтвера се не налазе у овом дневнику.",
        "logentry-managetags-create": "$1 је {{GENDER:$2|направио|направила}} ознаку „$4“",
index 6ff1b87..b47fde5 100644 (file)
        "title-invalid-interwiki": "Zatraženi naslov stranice sadrži \"interwiki\" vezu koja ne može biti upotrebljenja za naslove.",
        "title-invalid-talk-namespace": "Zatraženi naslov strane se odnosi na stranicu za razgovor koja ne može da postoji.",
        "title-invalid-characters": "Traženi naslov ima nevažeće karaktere: „$1“.",
+       "title-invalid-relative": "Naslov ima relativan put. Relativni naslovi (./, ../) su nevažeći, zato što će često biti nedostupni kroz korisnički pretraživač.",
+       "title-invalid-magic-tilde": "Naslov stranice koju ste tražili je nevažeći jer sadrži magični niz tildi (<nowiki>~~~</nowiki>)",
+       "title-invalid-too-long": "Naslov stranice koju ste tražili je predugačak. Ne sme da bude duži od $1 {{PLURAL:$1|bajt|bajtovi}} u UTF-8 znacima.",
+       "title-invalid-leading-colon": "Naslov stranice koju ste tražili sadrži dvotačku na početku.",
        "perfcached": "Sledeći podaci su keširani i mogu biti zastareli. Keš sadrži najviše {{PLURAL:$1|jedan rezultat|$1 rezultata|$1 rezultata}}.",
        "perfcachedts": "Sledeći podaci su keširani i poslednji put su ažurirani $2 u $3. U kešu {{PLURAL:$4|1=je dostupan najviše jedan rezultat|su dostupna najviše $4 rezultata|je dostupno najviše $4 rezultata}}.",
        "querypage-no-updates": "Ažuriranje ove stranice je trenutno onemogućeno.\nPodaci koji se ovde nalaze mogu biti zastareli.",
        "viewsource": "Izvorni kod",
        "viewsource-title": "Izvorni tekst stranice $1",
        "actionthrottled": "Radnja je usporena",
-       "actionthrottledtext": "U cilju borbe protiv nepoželjnih poruka, ograničene su vam izmene u određenom vremenu, a upravo ste prešli to ograničenje. Pokušajte ponovo za nekoliko minuta.",
+       "actionthrottledtext": "Kao meru protiv zloupotrebe, ograničeno vam je izvođenje ove radnje previše puta u kratkom vremenskom periodu, a vi ste premašili ovo ograničenje.\nMolimo pokušajte ponovo za nekoliko minuta.",
        "protectedpagetext": "Ova stranica je zaključana za izmene i druge radnje.",
        "viewsourcetext": "Možete čitati i kopirati sadržaj ove stranice.",
        "viewyourtext": "Možete da pogledate i kopirate izvorni tekst <strong>vaših izmena</strong> na ovoj stranici.",
        "zip-bad": "Datoteka je oštećena ili je nečitljiva ZIP datoteka.\nBezbednosna provera ne može da se izvrši kako treba.",
        "zip-unsupported": "Datoteka je formata ZIP koji koristi mogućnosti koje ne podržava Medijaviki.\nBezbednosna provera ne može da se izvrši kako treba.",
        "uploadstash": "Tajno skladište",
-       "uploadstash-summary": "Ova stranica pruža pristup datotekama koje su poslate (ili se šalju), ali još nisu objavljene. Ove datoteke su vidljive samo korisniku koji ga je poslao.",
+       "uploadstash-summary": "Ova stranica pruža pristup datotekama koje su otpremljene ili se otpremaju, ali još nisu objavljene. Ove datoteke nisu vidljive nikome, osim korisniku koji ih je otpremio.",
        "uploadstash-clear": "Očisti sakrivene datoteke",
        "uploadstash-nofiles": "Nemate sakrivene datoteke.",
        "uploadstash-badtoken": "Izvršavanje date radnje nije uspelo. Razlog tome može biti istek vremena za uređivanje. Pokušajte ponovo.",
        "logentry-rights-rights": "$1 je {{GENDER:$2|promenio|promenila}} članstvo grupe za {{GENDER:$6|$3}} iz $4 u $5",
        "logentry-rights-rights-legacy": "$1 je {{GENDER:$2|promenio|promenila}} čalnstvo grupe za $3",
        "logentry-rights-autopromote": "$1 je automatski {{GENDER:$1|unapređen|unapređena}} iz $4 u $5",
-       "logentry-upload-upload": "$1 je {{GENDER:$2|poslao|poslala}} $3",
-       "logentry-upload-overwrite": "$1 je {{GENDER:$2|poslao|poslala}} novu verziju $3",
-       "logentry-upload-revert": "$1 je {{GENDER:$2|poslao|poslala}} $3",
+       "logentry-upload-upload": "$1 je {{GENDER:$2|otpremio|otpremila}} $3",
+       "logentry-upload-overwrite": "$1 je {{GENDER:$2|otpremio|otpremila}} novu verziju $3",
+       "logentry-upload-revert": "$1 je {{GENDER:$2|otpremio|otpremila}} $3",
        "log-name-managetags": "Dnevnik uređivanja oznaka",
        "log-description-managetags": "Ovaj dnevnik sadrži spisak izmena u vezi [[Special:Tags|oznaka]]. Dnevnik sadrži samo radnje izvršene od strane administratora, unosi za oznake napravljene ili obrisane od strane viki softvera se ne nalaze u ovom dnevniku.",
        "logentry-managetags-create": "$1 je {{GENDER:$2|napravio|napravila}} oznaku „$4“",
index f191865..17c7402 100644 (file)
@@ -38,7 +38,7 @@
        "tog-enotifrevealaddr": "Témbongkeun alamat surélék kuring dina surat émbaran",
        "tog-shownumberswatching": "Témbongkeun jumlah nu ngawaskeun",
        "tog-oldsig": "Paraf nu geus aya:",
-       "tog-fancysig": "Témbongkeun paraf salaku wikitext (tanpa tumbu otomatis)",
+       "tog-fancysig": "Témbongkeun tanda tangan salaku wikitext (tanpa tutumbu otomatis)",
        "tog-uselivepreview": "Paké pratayang langsung",
        "tog-forceeditsummary": "Mun kotak ringkesan éditan masih kosong, béjaan!",
        "tog-watchlisthideown": "Sumputkeun éditan kuring dina daptar awaskeuneun",
        "nstab-category": "Kategori",
        "mainpage-nstab": "Tepas",
        "nosuchaction": "Teu aya peta kitu",
-       "nosuchactiontext": "Peta nu diketik na URL teu dipikawanoh ku wiki.\nKadé bisi salah ketik atawa nuturkeun tumbu nu salah.\nHal ieu bisa ogé kulantaran ayana kutu (bug) dina sopwér nu dipaké ku {{SITENAME}}.",
+       "nosuchactiontext": "Peta nu diketik dina URL henteu sah.\nKadé bisi salah ketik atawa nuturkeun tutumbu anu salah.\nHal ieu bisa ogé kulantaran ayana kutu (bug) dina sopwér anu dipaké ku {{SITENAME}}.",
        "nosuchspecialpage": "Teu aya kaca husus nu kitu",
        "nospecialpagetext": "<strong>Anjeun ménta kaca husus nu teu dipikawanoh.</strong>\nKaca husus anu bener bisa ditempo béréndélanana dina [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Kasalahan",
        "userlogin-signwithsecure": "Paké sambungan aman",
        "yourdomainname": "Domain anjeun",
        "password-change-forbidden": "Anjeun teu bisa ngarobah kecap sandi dina ieu wiki.",
-       "externaldberror": "Aya kasalahan dina pangkalan data oténtikasi luar, atawa anjeun mémang teu diwenangkeun pikeun ngaropéa rekening luar anjeun.",
+       "externaldberror": "Aya kasalahan dina pangkalan data oténtikasi luar, atawa anjeun mémang teu diwenangkeun pikeun ngaropéa akun luar anjeun.",
        "login": "Asup log",
        "nav-login-createaccount": "Nyieun akun/asup log",
-       "userlogin": "Asup log / jieun akun",
-       "userloginnocreate": "Asup log",
        "logout": "Kaluar log",
        "userlogout": "Kaluar log",
        "notloggedin": "Can asup log",
        "userlogin-noaccount": "Teu boga akun?",
        "userlogin-joinproject": "Ngiluan {{SITENAME}}",
-       "nologin": "Teu boga akun? '''$1'''.",
-       "nologinlink": "Jieun akun",
        "createaccount": "Jieun akun",
-       "gotaccount": "Geus boga akun? '''$1'''.",
-       "gotaccountlink": "Asup log",
-       "userlogin-resetlink": "Poho akun sorangan?",
        "userlogin-resetpassword-link": "Poho kecap sandi?",
        "userlogin-helplink2": "Pitulung asup log",
        "userlogin-loggedin": "Anjeun geus asup log salaku {{GENDER:$1|$1}}.\nPaké pormulir di handap pikeun asup log salaku pamaké séjén.",
        "createacct-another-email-ph": "Asupkeun alamat surélék",
        "createaccountmail": "Paké kecap sandi acak sarta kirim ka alamat surélék",
        "createacct-realname": "Ngaran asli (teu wajib)",
-       "createaccountreason": "Alesan:",
        "createacct-reason": "Alesan",
        "createacct-reason-ph": "Naha bet nyieun akun séjén",
        "createacct-submit": "Jieun akun anjeun",
        "userexists": "Sandiasma nu diasupkeun geus aya nu maké.\nMangga pilih sandiasma nu séjén.",
        "loginerror": "Kasalahan asup log",
        "createacct-error": "Nyieun akun éror",
-       "createaccounterror": "Teu bisa nyieun rekening: $1",
-       "nocookiesnew": "Rekening pamaké geus dijieun, tapi anjeun can asup log. {{SITENAME}} maké ''cookies'' pikeun ngasupkeun log pamaké. Anjeun boga ''cookies'' nu ditumpurkeun. Mangga fungsikeun, teras asup log migunakeun ngaran pamaké sarta sandi nu anyar.",
+       "createaccounterror": "Teu bisa nyieun akun: $1",
+       "nocookiesnew": "Akun pamaké geus dijieun, tapi anjeun can asup log. {{SITENAME}} maké ''cookies'' pikeun ngalog pamaké. Anjeun boga ''cookies'' nu ditumpurkeun. Mangga fungsikeun, teras asup log migunakeun sandiasma sarta kecap sandi anu anyar.",
        "nocookieslogin": "{{SITENAME}} migunakeun ''cookies'' pikeun ngasupkeun pamaké kana log. Anjeun boga ''cookies'' nu ditumpurkeun. Mangga pungsikeun sarta cobian deui.",
        "nocookiesfornew": "Akun pamaké teu bisa dijieun, kusabab sumberna teu bisa dipastikeun.\nPariksa kukisna bisi tumpur, terus cobaan muat ulang ieu kaca.",
        "noname": "Anjeun teu nuliskeun ngaran pamaké nu sah.",
        "wrongpasswordempty": "Sandina can kaeusian. Cobaan deui!",
        "passwordtooshort": "Sandina kudu diwangun ku sahanteuna {{PLURAL:$1|1 karakter|$1 karakter}}.",
        "passwordtoolong": "Kecap sandi teu bisa leuwih ti {{PLURAL:$1|1 karakter|$1 karakter}}.",
-       "password-name-match": "Sandi anjeun kudu béda ti landihan.",
+       "password-name-match": "Kecap sandi anjeun kudu béda ti sandiasma.",
        "password-login-forbidden": "Sandiasma jeung sandina teu bisa dipaké.",
        "mailmypassword": "Setél ulang kecap sandi",
        "passwordremindertitle": "Pangéling sandi ti {{SITENAME}}",
        "eauthentsent": "Surélék konfirmasi geus dikirim ka alamat bieu.\nMéméh aya surat séjén asup ka akunna, anjeun kudu nuturkeun pituduh dina surélékna pikeun mastikeun yén akun éta téh bener boga anjeun.",
        "throttled-mailpassword": "Surélék pikeun ngarobah kecap sandi geus dikirim {{PLURAL:$1|jam|$1 jam}} kaliwat.\nNgarah hanteu disalahgunakeun, ngan hiji surélék anu bakal dikirim saban {{PLURAL:$1|jam|$1 jam}}.",
        "mailerror": "Kasalahan ngirim surat: $1",
-       "acct_creation_throttle_hit": "Punten,pamaké alamat IP anjeun geus nyieun {{PLURAL:$1|1 rekening|$1 rekening}} dina sapoé ieu. mangrupa jumlah nu di idinan dina sapoé.\nanjeun teu bisa nyieun deui samentara waktu.",
+       "acct_creation_throttle_hit": "Anu ngaranjang ka ieu wiki maké alamat IP anjeun geus nyieun {{PLURAL:$1|1 akun|$1 akun}} salila $2, mangrupa jumlah anu diidinan dina sapoé.\nKu kituna, anu ngaranjang maké ieu alamat IP samentawis mah moal bisa nyieun akun deui heula.",
        "emailauthenticated": "Alamat surélék anjeun geus dikonfirmasi $2 tabuh $3.",
        "emailnotauthenticated": "Alamat surélék anjeun can dikonfirmasi.\nMoal aya surélék nu bakal dikirim pikeun fitur-fitur di handap ieu.",
        "noemailprefs": "Teu aya alamat surélék, fitur di handap moal bisa jalan.",
        "invalidemailaddress": "Alamat surélék teu bisa ditarima sabab formatna salah.\nMangga lebetkeun alamat nu formatna bener atawa kosongkeun baé.",
        "cannotchangeemail": "Alamat surat-é akun hanteu bisa dirobah di ieu wiki.",
        "emaildisabled": "Ieu loka teu bisa ngirim surélék.",
-       "accountcreated": "Rekening geus dijieun.",
+       "accountcreated": "Akun geus dijieun",
        "accountcreatedtext": "Akun pamaké [[{{ns:Pamaké}}:$1|$1]] ([[{{ns:Obrolan pamaké}}:$1|obrolan]]) geus dijieun.",
-       "createaccount-title": "Nyieun rekening keur {{SITENAME}}",
-       "createaccount-text": "Aya nu nyieun rekening pikeun alamat surélék anjeun di {{SITENAME}} ($4) maké landihan \"$2\" sarta sandi \"$3\". Anjeun kudu asup log sarta ngaganti sandina ayeuna kénéh.\n\nMun ieu rekening balukar ayana éror, teu kudu diwaro.",
+       "createaccount-title": "Nyieun akun keur {{SITENAME}}",
+       "createaccount-text": "Aya nu nyieun akun pikeun alamat surélék anjeun di {{SITENAME}} ($4) maké sandiasma \"$2\" kalawan kecap sandi \"$3\". Anjeun kudu asup log sarta ngaganti kecap sandina.\n\nMun ieu akun dijieun alatan éror, ulah diwaro.",
        "login-throttled": "Anjeun geus loba teuing nyobaan asup log.\nTungguan $1, laju cobaan deui.",
        "login-abort-generic": "Login gagal - Dibolaykeun",
        "login-migrated-generic": "Akun anjeun geus pindah, ku kituna sandiasma anjeun geus leungit ti ieu wiki.",
        "changepassword": "Robah sandi",
        "resetpass_announce": "Pikeun nganggeuskeun asup log, anjeun kudu nyieun kecap sandi anyar.",
        "resetpass_text": "<!-- Tambahkeun téks di dieu -->",
-       "resetpass_header": "Ganti sandi rekening",
+       "resetpass_header": "Ganti sandi akun",
        "oldpassword": "Sandi heubeul",
        "newpassword": "Sandi anyar:",
        "retypenew": "Ketik ulang sandi",
        "changepassword-throttled": "Anjeun geus loba teuing nyobaan asup log.\nTungguan $1 méméh nyobaan deui.",
        "resetpass_forbidden": "Sandi henteu bisa dirobah",
        "resetpass-no-info": "Anjeun kudu asup log pkeun bisa muka ieu kaca sacara langsung.",
-       "resetpass-submit-loggedin": "Ganti kecap sandi rekening",
+       "resetpass-submit-loggedin": "Ganti kecap sandi akun",
        "resetpass-submit-cancel": "Bolay",
        "resetpass-wrong-oldpass": "Salah sandi.\nBisa jadi anjeun geus ngaganti sandina atawa ménta sandi saheulaanan anu anyar.",
        "resetpass-recycled": "Mangga ganti kecap sandi anjeun ku nu anyar.",
        "passwordreset-emaildisabled": "Fitur surélék ditumpurkeun di ieu wiki.",
        "passwordreset-username": "Sandiasma:",
        "passwordreset-domain": "Domain:",
-       "passwordreset-capture": "Témbongkeun surat-é hasilna?",
-       "passwordreset-capture-help": "Upama anjeun nyéntang ieu kotak, surélék (anu ngirimkeun kecap sandi saheulaanan) bakal ditémbongkeun ka anjeun sarta dikirimkeun ka pamakéna.",
        "passwordreset-email": "Alamat surélék:",
        "passwordreset-emailtitle": "Wincikan akun di {{SITENAME}}",
        "passwordreset-emailtext-ip": "Aya (sigana anjeun, ti alamat IP $1) ménta nyetél ulang kecap sandi pikeun {{SITENAME}} ($4). {{PLURAL:$3|Akun}} di handap tumali jeung alamat ieu surélék:\n\n$2\n\n{{PLURAL:$3|Ieu sandi saheulaanan}} bakal kadaluwarsa dina témpo {{PLURAL:$5|sapoé|$5 poé}}.\nAnjeun kudu asup sarta milih sandi anyar ayeuna. Lamun teu rumasa nyieun ieu paménta, atawa lamun geus inget sandi aslina sarta moal dirobah, ieu surat teu kudu diwaro.",
        "noarticletext": "Kiwari can aya téks dina ieu kaca.\nAnjeun bisa [[Special:Search/{{PAGENAME}}|nyusud judul ieu kaca]] dina kaca séjén,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} nyusud log nu tumali],\natawa [{{fullurl:{{FULLPAGENAME}}|action=edit}} nyieun ieu kaca]</span>.",
        "noarticletext-nopermission": "Kiwari can aya téks dina ieu kaca.\nAnjeun bisa [[Special:Search/{{PAGENAME}}|nyusud judul ieu kaca]] dina kaca séjén,atawa <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} nyusud log nu tumali]</span>, tapi teu wenang pikeun nyieun ieu kaca.",
        "missing-revision": "Révisi #$1 kaca \"{{FULLPAGENAME}}\" teu aya.\n\nKajadian ieu biasana kusabab nuturkeun tutumbu jujutan kaca anu geus dihapus.\nWincikanana bisa ditempo di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log hapusan].",
-       "userpage-userdoesnotexist": "Rekening pamaké \"<nowiki>$1</nowiki>\" tacan kadaptar. Mangga tilikan lamun anjeun hoyong ngadamel/ngédit kaca ieu.",
-       "userpage-userdoesnotexist-view": "Rekening pamaké \"$1\" teu aya dina daptar.",
+       "userpage-userdoesnotexist": "Akun pamaké \"<nowiki>$1</nowiki>\" tacan kadaptar. Mangga riksa lamun anjeun hoyong ngadamel/ngédit ieu kaca.",
+       "userpage-userdoesnotexist-view": "Akun pamaké \"$1\" teu aya dina daptar.",
        "blocked-notice-logextract": "Ieu pamaké keur dipeungpeuk.\nPikeun rujukan, éntri log panungtung dipidangkeun di handap:",
        "clearyourcache": "<strong>Catet:</strong> Sanggeus nyimpen, anjeun kudu narabas singgahan panyungsi anjeun pikeun nempo parobahanana.\n* <strong>Firefox/Safari:</strong> Tahan <em>Shift</em> bari ngaklik <em>Reload</em>, atawa pencét boh <em>Ctrl-F5</em> atawa <em>Ctrl-R</em> (<em>⌘-R</em> dina Mac)\n* <strong>Google Chrome:</strong> Pencét <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> dina Mac)\n* <strong>Internet Explorer:</strong> Tahan <em>Ctrl</em> bari ngaklik <em>Refresh</em>, atawa pencét <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Kosongkeun singgahan dina <em>Tools → Preferences</em>",
        "usercssyoucanpreview": "Tip:''' Paké tombol \"{{int:showpreview}}\" pikeun nyobaan CSS anyar anjeun méméh nyimpen.",
        "undo-norev": "Éditan ieu henteu bisa bolaykeun alatan kaca henteu kapanggih atawa geus dihapus.",
        "undo-summary": "←Ngabolaykeun révisi $1 ku [[Special:Contributions/$2|$2]] ([[User talk:$2|Obrolan]])",
        "undo-summary-username-hidden": "Bolaykeun révisi $1 ku pamaké nyumput",
-       "cantcreateaccount-text": "Nyieun rekening ti ieu alamat IP ('''$1''') dipeungpeuk ku [[User:$3|$3]].\n\nAlesanana $3 cenah ''$2''.",
+       "cantcreateaccount-text": "Nyieun akun ti ieu alamat IP ('''$1''') dipeungpeuk ku [[User:$3|$3]].\n\nAlesana $3 cenah ''$2''.",
        "cantcreateaccount-range-text": "Nyieun akun ti alamat IP dina rentang <strong>$1</strong>, kaasup alamat IP anjeun (<strong>$4</strong>), dipeungpeuk ku [[User:$3|$3]].\n\nAlesan $3 nyaéta <em>$2</em>",
        "viewpagelogs": "Tempo log kaca ieu",
        "nohistory": "Teu aya jujutan édit pikeun kaca ieu.",
        "saveprefs": "Simpen préferénsi",
        "restoreprefs": "Larapkeun setélan buhun (sakabéh bab)",
        "prefs-editing": "Ukuran kotak téks",
-       "rows": "Baris",
-       "columns": "Kolom",
        "searchresultshead": "Aturan hasil néang",
        "stub-threshold": "Wates ambang pikeun format <a href=\"#\" class=\"stub\">tumbu taratas</a> (bit):",
        "stub-threshold-disabled": "Tumpur",
        "yourrealname": "Ngaran anjeun*",
        "yourlanguage": "Basa antarbeungeut",
        "yourvariant": "Varian basa eusi:",
-       "yournick": "Landihan anjeun (pikeun tawis leungeun)",
+       "yournick": "Tanda tangan:",
        "prefs-help-signature": "Pamanggih dina kaca sawala/obrolan kudu ditandaan \"<nowiki>~~~~</nowiki>\" nu bakal robah jadi tanda tangan anjeun jeung titimangsana.",
        "badsig": "Parafna teu valid; pariksa tag HTML-na geura.",
        "badsiglength": "Tawis leungeun panjang teuing. Kuduna kurang ti $1 {{PLURAL:$1|karaktér|karaktér}}.",
        "prefs-diffs": "Béda",
        "userrights": "Manajemén hak pamaké",
        "userrights-lookup-user": "Atur gorombolan pamaké",
-       "userrights-user-editname": "Asupkeun landihan:",
+       "userrights-user-editname": "Asupkeun sandiasma:",
        "editusergroup": "Édit Golongan Pamaké",
        "editinguser": "Ngarobah hak kontributor '''[[User:$1|$1]]''' $2",
        "userrights-editusergroup": "Édit gorombolan pamaké",
        "userrights-reason": "Alesan:",
        "userrights-no-interwiki": "Anjeung teu diwenangkeun ngarobah hak pamaké dina wiki séjén.",
        "userrights-nodatabase": "Pangkalan data $1 euweuh atawa henteu lokal.",
-       "userrights-nologin": "Pikeun ngatur hak pamaké, anjeun kudu [[Special:UserLogin|asup log]] migunakeun rekening kuncén.",
-       "userrights-notallowed": "Akun anjeun teu boga kawenangan pikeun ngatur hak pamaké.",
        "userrights-changeable-col": "Jumplukan anu bisa Anjeun robah",
        "userrights-unchangeable-col": "Jumplukan anu teu bisa Anjeun robah",
        "group": "Gorombolan:",
        "right-edit": "Ngédit kaca",
        "right-createpage": "Nyieun kaca anyar (nu lain kaca obrolan)",
        "right-createtalk": "Nyieun kaca obrolan",
-       "right-createaccount": "Nyieun rekening anyar",
+       "right-createaccount": "Nyieun akun anyar",
        "right-minoredit": "Nandaan éditan minor",
        "right-move": "Mindahkeun kaca",
        "right-move-subpages": "Pindahkeun kaca katut sakabéh subkacana",
        "action-edit": "édit kaca ieu",
        "action-createpage": "mitembeyan kaca anyar",
        "action-createtalk": "mitembeyan kaca obrolan",
-       "action-createaccount": "nyieun rekening pamaké ieu",
+       "action-createaccount": "nyieun akun pamaké ieu",
        "action-history": "tempo jujutan ieu kaca",
        "action-minoredit": "nandaan ieu éditan salaku minor",
        "action-move": "mindahkeun ieu kaca",
        "unwatchedpages": "Kaca nu teu diawaskeun",
        "listredirects": "Daptar alihan",
        "unusedtemplates": "Citakan nu teu kapaké",
-       "unusedtemplatestext": "Ieu kaca ngabéréndélkeun sakabéh kaca dina spasi ngaran {{ns:template}} nu teu diwengku ku kaca séjén.\nSaméméh ngahapus, pariksa heula bisi aya tumbu ka ieu citakan.",
-       "unusedtemplateswlh": "tumbu lianna",
+       "unusedtemplatestext": "Ieu kaca ngabéréndélkeun sakabéh kaca dina rohang ngaran {{ns:template}} anu teu diwengku ku kaca séjén.\nSaméméh ngahapus, pariksa heula bisi aya tumbu ka ieu citakan.",
+       "unusedtemplateswlh": "tutumbu lianna",
        "randompage": "Kaca acak",
        "randompage-nopages": "Euweuh kaca dina ieu spasi ngaran \"$1\".",
        "randomincategory-category": "Kategori:",
        "brokenredirectstext": "Alihan di handap numbu ka kaca nu teu aya:",
        "brokenredirects-edit": "édit",
        "brokenredirects-delete": "hapus",
-       "withoutinterwiki": "Kaca-kaca tanpa tumbu basa",
+       "withoutinterwiki": "Kaca-kaca tanpa tutumbu basa",
        "withoutinterwiki-summary": "Kaca-kaca di handap ieu teu numbu ka vérsi basa séjén:",
        "withoutinterwiki-legend": "Prefiks",
        "withoutinterwiki-submit": "Témbongkeun",
        "nbytes": "$1 {{PLURAL:$1|bait|bait}}",
        "ncategories": "$1 {{PLURAL:$1|kategori|kategori}}",
        "ninterwikis": "$1 {{PLURAL:$1|interwiki|interwiki}}",
-       "nlinks": "$1 {{PLURAL:$1|tumbu|tumbu}}",
+       "nlinks": "$1 {{PLURAL:$1|tutumbu|tutumbu}}",
        "nmembers": "$1 {{PLURAL:$1|kontributor|kontributor}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|anggota|anggota}}",
        "nrevisions": "$1 {{PLURAL:$1|révisi|révisi}}",
        "usereditcount": "$1 {{PLURAL:$1|édit|édit}}",
        "usercreated": "{{GENDER:$3|Dijieun}} ping $1 tabuh $2",
        "newpages": "Kaca anyar",
-       "newpages-username": "Landihan:",
+       "newpages-username": "Sandiasma:",
        "ancientpages": "Kaca pangheubeulna",
        "move": "Pindahkeun",
        "movethispage": "Pindahkeun kaca ieu",
        "booksources": "Sumber pustaka",
        "booksources-search-legend": "Sungsi sumber buku",
        "booksources-search": "Paluruh",
-       "booksources-text": "Di handap ieu ngabéréndélkeun tumbu ka loka-loka nu ngical buku, boh nu anyar atawa loakan, nu sugan uninga kana buku anu nuju dipilari:",
+       "booksources-text": "Di handap ieu ngabéréndélkeun tutumbu ka loka-loka nu ngical buku, boh nu anyar atawa loakan, nu sugan uninga kana buku anu nuju dipilari:",
        "booksources-invalid-isbn": "ISBN-na sigana henteu bener; pariksa deui bisi aya salah salin ti sumber aslina.",
        "specialloguserlabel": "Pamaké:",
        "speciallogtitlelabel": "Sasaran (judul atawa pamaké):",
        "protect_expiry_old": "Waktu kadaluwarsa geus kaliwat.",
        "protect-text": "Di dieu anjeun bisa nempo sarta ngarobah hambalan pangonci pikeun kaca '''$1'''.",
        "protect-locked-blocked": "Anjeun teu bisa ngarobah hambalan koncian sabab keur dipeungpeuk. Setélan ayeuna pikeun kaca '''$1''' nyaéta:",
-       "protect-locked-access": "Rekening anjeun teu wenang ngarobah hambalan pangonci kaca. Kaca '''$1''' disetél:",
+       "protect-locked-access": "Akun anjeun teu wenang ngarobah hambalan pangonci kaca.\nSetélan kiwari pikeun kaca <strong>$1</strong>:",
        "protect-cascadeon": "Ieu kaca dikonci sabab kaasup {{PLURAL:$1|kaca nu|kaca-kaca nu}} ngajalankeun pangonci ngaruntuy. Anjeun bisa ngarobah hambalan koncian ieu kaca, tapi ieu moal mangaruhan pangonci ngaruntuyna.",
        "protect-default": "Bisa ku sakabeh pamaké",
        "protect-fallback": "Kudu aya kawenangan \"$1\"",
        "month": "Ti bulan (jeung saméméhna):",
        "year": "Ti taun (jeung saméméhna):",
        "sp-contributions-newbies": "Témbongkeun kontribusi ti akun anyar wungkul",
-       "sp-contributions-newbies-sub": "Pikeun rekening anyar",
+       "sp-contributions-newbies-sub": "Pikeun akun anyar",
        "sp-contributions-blocklog": "log peungpeuk",
        "sp-contributions-deleted": "kontribusi nu dihapus",
        "sp-contributions-uploads": "unggahan",
        "ipbexpiry": "Kadaluarsa",
        "ipbreason": "Alesan:",
        "ipb-hardblock": "Nyegah pamaké anu asup log pikeun ngédit ti ieu alamat IP",
-       "ipbcreateaccount": "Tong bisa nyieun rekening",
+       "ipbcreateaccount": "Ulah bisa nyieun akun",
        "ipbemailban": "Henteu kaci pamaké ngirimkeun surélék",
        "ipbenableautoblock": "Peungpeuk sacara otomatis alamat IP anu panungtungan dipaké ku pamaké sarta sakabéh alamat IP anu kungsi dipaké.",
        "ipbsubmit": "Peungpeuk pamaké ieu",
        "expiringblock": "kadaluwarsa $1 jam $2",
        "anononlyblock": "ngan nu teu daptar",
        "noautoblockblock": "Otopeungpeuk ditumpurkeun",
-       "createaccountblock": "nyieun rekening dipeungpeuk",
+       "createaccountblock": "nyieun akun dipeungpeuk",
        "emailblock": "surélek di peungpeuk",
        "blocklist-nousertalk": "teu bisa ngarobah kaca obrolan sorangan",
        "ipblocklist-empty": "Daptar peungpeuk kosong.",
-       "ipblocklist-no-results": "Alamat IP atawa landihan pamaké nu dipundut teu dipeungpeuk.",
+       "ipblocklist-no-results": "Alamat IP atawa sandiasma nu dipundut teu dipeungpeuk.",
        "blocklink": "blokir",
        "unblocklink": "buka blokir",
        "change-blocklink": "Robah status blokir",
        "importfailed": "Ngimpor gagal: $1",
        "importunknownsource": "Tipeu sumber impor teu dipikawanoh",
        "importcantopen": "Teu bisa muka koropak impor",
-       "importbadinterwiki": "Tumbu interwiki ruksak",
+       "importbadinterwiki": "Tutumbu antarwiki awon",
        "importsuccess": "Ngimpor geus hasil!",
        "importnosources": "Teu aya sumber impor transwiki nu geus dijieun tur ngamuat jujutan sacara langsung geus dinon-aktifkeun.",
        "importnofile": "Euweuh koropak impor nu dimuat.",
        "creditspage": "Pangajén kaca",
        "nocredits": "Teu aya émbaran pangajén pikeun kaca ieu.",
        "spamprotectiontitle": "Saringan spam",
-       "spamprotectiontext": "Kaca nu rék disimpen dipeungpeuk ku saringan spam.\nSigana mah ieu téh alatan tumbu ka loka luar.",
+       "spamprotectiontext": "Kaca anu rék disimpen dipeungpeuk ku saringan spam.\nSigana mah ieu téh alatan tutumbu ka loka luar anu dibléklis.",
        "simpleantispam-label": "Pamariksaan anti-spam.\nAnu ieu <strong>ulah</strong> dieusian!",
        "pageinfo-title": "Émbaran pikeun \"$1\"",
        "pageinfo-header-basic": "Émbaran dasar",
        "monthsall": "kabéh",
        "confirmemail": "Konfirmasi alamat surélék",
        "confirmemail_noemail": "Alamat surélék anu didaptarkeun dina [[Special:Preferences|préferénsi pamaké]] anjeun teu sah.",
-       "confirmemail_text": "Wiki ieu merlukeun anjeun sangkan méré konfirmasi alamat surélék saméméh migunakeun fitur surélék. Aktifkeun tombol di handap pikeun ngirimkeun surat konfirmasi ka alamat anjeun. Suratna ngandung tumbu nu ngandung sandina; muatkeun tumbuna kana panyungsi anjeun pikeun ngonfirmasi yén alamat surélék anjeun sah.",
-       "confirmemail_pending": "Sandi konfirmasi geus dikirimkeun ka alamat surélék anjeun; mun kakara nyieun rekening, mangga antos sababaraha menit saméméh mundut sandi anyar.",
+       "confirmemail_text": "Ieu {{SITENAME}} butuh sangkan anjeun mastikeun alamat surélék saméméh migunakeun fitur surélék.\nAktipkeun tombol di handap pikeun ngirimkeun surat konfirmasi ka alamat anjeun. Suratna ngandung tumbu nu ngandung sandina; muatkeun tumbuna kana panyungsi anjeun pikeun ngonfirmasi yén alamat surélék anjeun sah.",
+       "confirmemail_pending": "Kecap sandi konfirmasi geus dikirimkeun ka alamat surélék anjeun; mun anyar nyieun akun, mangga antos sababaraha menit saméméh mundut kecap sandi anyar.",
        "confirmemail_send": "Kirimkeun surat konfirmasi sandi",
        "confirmemail_sent": "Surélék konfirmasi geus dikirim.",
        "confirmemail_oncreate": "Sandi konfirmasi geus dikirim ka alamat surélék anjeun. Éta sandi dipaké pikeun ngajalankeun fitur-fitur nu maké surélék di ieu wiki.",
        "confirmemail_success": "Alamat surélék anjeun geus dikonfirmasi, ayeuna anjeun geus bisa migunakeun wikina.",
        "confirmemail_loggedin": "Alamat surélék anjeun geus dikonfirmasi.",
        "confirmemail_subject": "Konfirmasi alamat surélék {{SITENAME}}",
-       "confirmemail_body": "Aya, sigana mah anjeun ti alamat IP $1, geus ngadaptarkeun rekening \"$2\" maké alamat surélék ieu na {{SITENAME}}.\n\nPikeun mastikeun yén rekening ieu mémang kagungan sarta ngakifkeun fitur surélék di {{SITENAME}}, buka tumbu di handap ieu kana panyungsi/''browser'' anjeun:\n\n$3\n\nLamun anjeun teu ngadaptarkeun rekening, turutkeun tumbu ieu pikeun ngabolaykeun konfirmasi alamat surélék:\n\n$5\n\nSandi konfirmasi ieu bakal kadaluwarsa dina $4.",
+       "confirmemail_body": "Aya, sigana mah anjeun, ti alamat IP $1,\ngeus ngadaptarkeun akun \"$2\" maké alamat surélék ieu di {{SITENAME}}.\n\nPikeun mastikeun yén ieu akun mémang kagungan, sarta ngaktipkeun fitur surélék di {{SITENAME}}, buka tutumbu di handap ieu dina panyungsi (''browser'') anjeun:\n\n$3\n\nLamun anjeun teu ngadaptarkeun ieu akun, turutkeun ieu tutumbu pikeun ngabolaykeun konfirmasi alamat surélék:\n\n$5\n\nSandi konfirmasi ieu bakal kadaluwarsa dina $4.",
        "confirmemail_invalidated": "Konfirmasi alamat surélék dibolaykeun",
        "invalidateemail": "Bolaykeun konfirmasi surélék",
        "scarytranscludedisabled": "[Transklusi interwiki ditumpurkeun]",
        "logentry-newusers-create": "Akun pamaké $1 jeus {{GENDER:$2|dijieun}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|ngamuat}} $3",
        "rightsnone": "(euweuh)",
-       "revdelete-summary": "ringkesan ngédit",
        "feedback-cancel": "Bolay",
        "feedback-message": "Surat:",
        "feedback-subject": "Ngeunaan:",
        "searchsuggest-search": "Sungsi",
        "searchsuggest-containing": "ngandung...",
-       "api-error-file-too-large": "Berkas nu dikirim gedé teuing.",
-       "api-error-filename-tooshort": "Ngaran berkas pondok teuing.",
-       "api-error-filetype-banned": "Jenis berkas ieu dipahing.",
-       "api-error-filetype-banned-type": "$1 kaasup tipeu koropak nu teu dicaram. {{PLURAL:$3|Nu diwidian nyaéta|Nu diwidian nyaéta}} $2.",
-       "api-error-filetype-missing": "Ngaran berkas euweuh éxténsian.",
-       "api-error-illegal-filename": "Ngaran berkas kitu dipahing.",
-       "api-error-mustbeloggedin": "Anjeun kudu asup log pikeun ngunggahkeun berkas.",
        "duration-seconds": "$1 {{PLURAL:$1|detik|detik}}",
        "duration-minutes": "$1 {{PLURAL:$1|menit|menit}}",
        "duration-hours": "$1 {{PLURAL:$1|jam|jam}}",
index 1f128e8..73d9aae 100644 (file)
        "page_last": "sista",
        "histlegend": "Val av diff: markera i klickrutorna för att jämföra versioner och tryck enter eller knappen längst ner.<br />\nFörklaring: '''({{int:cur}})''' = skillnad mot senaste version; '''({{int:last}})''' = skillnad mot föregående version; '''{{int:minoreditletter}}''' = mindre ändring.",
        "history-fieldset-title": "Bläddra i historiken",
-       "history-show-deleted": "Endast borttagna",
+       "history-show-deleted": "Endast raderade sidversioner",
        "histfirst": "äldsta",
        "histlast": "nyaste",
        "historysize": "({{PLURAL:$1|1 byte|$1 byte}})",
        "prefs-help-prefershttps": "Ändringar av denna inställning börjar gälla nästa gång du loggar in",
        "prefswarning-warning": "Du har gjort ändringar i dina inställningarna som inte har sparats ännu.\nOm du lämnar denna sida utan att klicka på \"$1\" kommer dina inställningar inte att uppdateras.",
        "prefs-tabs-navigation-hint": "Tips: Du kan använda vänster och höger piltangenterna för att navigera mellan flikarna i listan flikar.",
-       "userrights": "Hantering av användarrättigheter",
+       "userrights": "Användarrättigheter",
        "userrights-lookup-user": "Välj en användare",
        "userrights-user-editname": "Skriv in ett användarnamn:",
        "editusergroup": "Läs in användargrupper",
        "rcfilters-filterlist-feedbacklink": "Ge återkoppling på nya (beta)filter",
        "rcfilters-highlightbutton-title": "Markera resultat",
        "rcfilters-highlightmenu-title": "Välj en färg",
+       "rcfilters-highlightmenu-help": "Välj en färg att markera denna egenskap",
        "rcfilters-filterlist-noresults": "Inga filter hittades",
        "rcfilters-filtergroup-registration": "Användarregistrering",
        "rcfilters-filter-registered-label": "Registrerade",
        "rcfilters-filter-registered-description": "Inloggade redigerare.",
        "rcfilters-filter-unregistered-label": "Oregistrerade",
        "rcfilters-filter-unregistered-description": "Redigerare som inte är inloggade.",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Filtret \"Oregistrerade\" är inaktivt eftersom dess effekt slås ut av följande {{PLURAL:$2|upplevelsefilter}}, som endast {{PLURAL:$2|hittade}} registrerade användare: $1",
        "rcfilters-filtergroup-authorship": "Redigera författarskap",
        "rcfilters-filter-editsbyself-label": "Dina egna redigeringar",
        "rcfilters-filter-editsbyself-description": "Redigeringar av dig.",
        "rcfilters-filter-editsbyother-label": "Redigeringar av andra",
        "rcfilters-filter-editsbyother-description": "Redigeringar som har skapats av andra användare (inte dig).",
        "rcfilters-filtergroup-userExpLevel": "Erfarenhetsnivå (endast för registrerade användare)",
-       "rcfilters-filter-userExpLevel-newcomer-label": "Nykomlingar",
-       "rcfilters-filter-userExpLevel-newcomer-description": "Färre än 10 redigeringar och 4 dagars aktivitet.",
-       "rcfilters-filter-userExpLevel-learner-label": "Nybörjare",
-       "rcfilters-filter-userExpLevel-learner-description": "Fler dagars aktivitet och redigeringar än \"Nybörjare\" men färre än \"Erfarna användare\".",
-       "rcfilters-filter-userExpLevel-experienced-label": "Erfarna användare",
-       "rcfilters-filter-userExpLevel-experienced-description": "Fler än 30 dagars aktivitet och 500 redigeringar.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Detta filter är inaktivt eftersom den endast hittar registrerade användare, så filtret \"Oregistrerade\" slår ut dess effekt.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Filtret \"Oregistrerade\" är i konflikt med en eller flera upplevelsefilter. Upplevelsefilter hittar endast registrerade användare. Filtren som är i konflikt är markerade som inaktiv ovan.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Nykomlingar",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Färre än 10 redigeringar och 4 dagars aktivitet.",
+       "rcfilters-filter-user-experience-level-learner-label": "Nybörjare",
+       "rcfilters-filter-user-experience-level-learner-description": "Fler dagars aktivitet och redigeringar än \"Nybörjare\" men färre än \"Erfarna användare\".",
+       "rcfilters-filter-user-experience-level-experienced-label": "Erfarna användare",
+       "rcfilters-filter-user-experience-level-experienced-description": "Fler än 30 dagars aktivitet och 500 redigeringar.",
        "rcfilters-filtergroup-automated": "Automatiserade bidrag",
        "rcfilters-filter-bots-label": "Bot",
        "rcfilters-filter-bots-description": "Redigeringar gjorda av automatiserade verktyg.",
        "rcfilters-filter-humans-label": "Människa (inte bot)",
        "rcfilters-filter-humans-description": "Redigeringar gjorda av mänskliga redigerare.",
+       "rcfilters-filtergroup-reviewstatus": "Granskningsstatus",
+       "rcfilters-filter-patrolled-label": "Patrullerade",
+       "rcfilters-filter-patrolled-description": "Redigeringar markerade som patrullerade.",
+       "rcfilters-filter-unpatrolled-label": "Inte patrullerade",
+       "rcfilters-filter-unpatrolled-description": "Redigeringar som inte är markerade som patrullerade.",
        "rcfilters-filtergroup-significance": "Betydelse",
        "rcfilters-filter-minor-label": "Mindre redigeringar",
        "rcfilters-filter-minor-description": "Redigeringar som är märkta som mindre.",
index a4911dc..9db85c5 100644 (file)
        "password-change-forbidden": "ಈರ್ ಈ ವಿಕಿಡ್ ಪ್ರರವೇಸ ಪದೊನು ಬದಲ್ಪೆರೆ ಸಾದ್ಯೊ ಇದ್ದಿ.",
        "login": "ಲಾಗಿನ್ ಆಲೆ",
        "nav-login-createaccount": "ಲಾಗ್-ಇನ್ / ಅಕೌಂಟ್ ಸೃಷ್ಟಿ ಮಲ್ಪುಲೆ",
-       "userlogin": "ಲಾಗ್-ಇನ್ / ಅಕೌಂಟ್ ಸೃಷ್ಟಿ ಮಲ್ಪುಲೆ",
-       "userloginnocreate": "ಲಾಗಿನ್ ಆಲೆ",
        "logout": "ಲಾಗ್ ಔಟ್",
        "userlogout": "ಲಾಗ್ ಔಟ್",
        "notloggedin": "ಲಾಗಿನ್ ಆತ್‘ಜ್ಜರ್",
        "userlogin-noaccount": "ಕಾತೆ ಇದ್ದಿಯಾ?",
        "userlogin-joinproject": "{{SITENAME}}ಗ್ ಸೇರ್ಲೆ",
-       "nologin": "ಈರೆನ ಖಾತೆ ಇಜ್ಜೇ?'''$1'''",
-       "nologinlink": "ಪೊಸ ಖಾತೆ ಸುರು ಮಲ್ಪುಲೆ",
        "createaccount": "ಪೊಸ ಅಕ್ಕೌಂಟ್ ಸುರು ಮಲ್ಪುಲೆ",
-       "gotaccount": "ಈರೆನ ಖಾತೆ ಉಂಡೇ?'''$1'''",
-       "gotaccountlink": "ಲಾಗಿನ್ ಆಲೆ",
-       "userlogin-resetlink": "ಈರೆನ ಲಾಗಿನ್ ವಿವರ ಮರತ್ತ್ಂಡೇ?",
        "userlogin-resetpassword-link": "ಈರೆನೆ ಪ್ರವೇಸೊ ಪದೊ ಮರತ್ತ್‌ಂಡಾ?",
        "userlogin-helplink2": "ಲಾಗಿನ್ ಆಯರ ಸಹಾಯೊ",
        "userlogin-createanother": "ಪೊಸ ಕಾತೆ ಸುರು ಮಲ್ಪುಲೆ",
        "createacct-another-email-ph": "ಇ-ಅಂಚೆ ವಿಳಾಸೊನು ಬದಲಾವಣೆ ಮಲ್ಪುಲೆ",
        "createaccountmail": "(ರಾಂಡಮ್) ತಾತ್ಕಾಲಿಕವಾದ್ ಯಾದೃಚ್ಛಿಕ ಪಾಸ್ವರ್ಡ್ ಆಯ್ಕೆ ಮಾಲ್ಪುಲೆ ಬುಕ್ಕೊ ಇಮೇಲ್ ವಿಳಾಸೊನು ಸೂಚಿಸದ್ : ಕಡಪುಡುಲೆ",
        "createacct-realname": "ನಿಜವಾಯಿನ ಪುದರ್(ಐಚ್ಛಿಕೊ)",
-       "createaccountreason": "ಕಾರಣ",
        "createacct-reason": "ಕಾರಣೊ",
        "createacct-reason-ph": "ಈರ್ ದಾಯೆ ನಾನಲ ಒಂಜಿ ಕಾತೆ ದೆತ್ತೊಂದುಲ್ಲರ್?",
        "createacct-submit": "ಪೊಸ ಕಾತೆ ಸುರು ಮಲ್ಪುಲೆ",
        "recentchanges-legend-heading": "<strong>ಲೆಜೆಂಡ್:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ಬೊಕ್ಕೊಲಾ ತೂಲೆ [[Special:NewPages|ಪೊಸ ಪುಟೊದ ಪಟ್ಟಿ]])",
        "recentchanges-submit": "ತೋಜಾಲೆ",
-       "rcfilters-filter-userExpLevel-learner-label": "ಕಲ್ಪುನರ್",
+       "rcfilters-filter-user-experience-level-learner-label": "ಕಲ್ಪುನರ್",
        "rclistfrom": "$3 $2 ರ್ದ್ ಸುರುವಾತಿನ ಪೊಸ ಬದಲಾವಣೆಲೆನ್ ತೊಜ್ಪಾವು",
        "rcshowhideminor": "$1 ಎಲ್ಯೆಲ್ಯ ಬದಲಾವಣೆಲು",
        "rcshowhideminor-show": "ತೋಜಾಲೆ",
index 78fce1e..9df7278 100644 (file)
        "noindex-category-desc": "Сторінка не індексується пошуковими роботами, тому що на ній є «чарівне слово» <code><nowiki>__NOINDEX__</nowiki></code>, і вона знаходиться в просторі імен, де дозволений цей прапор).",
        "index-category-desc": "На сторінці є «чарівне слово» <code><nowiki>__INDEX__</nowiki></code> (і сторінка знаходиться в просторі назв, де дозволений цей прапор), тому вона індексується пошуковими роботами в тих випадках, коли цього зазвичай не відбувається.",
        "post-expand-template-inclusion-category-desc": "Розмір сторінки стане більший за <code>$wgMaxArticleSize</code> після показу всіх шаблонів, тому деякі з них не були показані повністю.",
-       "post-expand-template-argument-category-desc": "Сторінка стане більшою за <code>$wgMaxArticleSize</code> після розкриття аргументу шаблона (що-небудь в потрійних фігурних дужках, наприклад, <code>{{{Foo}}})</code>).",
+       "post-expand-template-argument-category-desc": "Сторінка стане більшою за <code>$wgMaxArticleSize</code> після розкриття аргументу шаблону (щось у потрійних фігурних дужках, наприклад, <code>{{{Foo}}}</code>).",
        "expensive-parserfunction-category-desc": "На сторінці також використовується занадто багато ресурсомістких функцій (таких, як <code>#ifexist</code>). Детальніше - на сторінці [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
        "broken-file-category-desc": "Сторінка містить некоректне файлове посилання (посилання на неіснуючий файл).",
        "hidden-category-category-desc": "Ця категорія містить мітку <code><nowiki>__HIDDENCAT__</nowiki></code> у вмісті сторінки, що типово запобігає її відображенню на сторінках в розділі категорій.",
index de1dd5f..0d7e00a 100644 (file)
        "yourdomainname": "Vosse dominne",
        "login": "S' elodjî",
        "nav-login-createaccount": "Ahiver on conte, udon-bén s' elodjî",
-       "userlogin": "S' elodjî",
-       "userloginnocreate": "S' elodjî",
        "logout": "Si dislodjî",
        "userlogout": "Si dislodjî",
        "notloggedin": "Nén elodjî",
        "userlogin-joinproject": "S' edjîstrer so {{SITENAME}}",
-       "nologin": "Vos n' avoz nén d' conte so ç' wiki ci? $1.",
-       "nologinlink": "Ahivez on conte da vosse",
        "createaccount": "Ahiver on novea conte",
-       "gotaccount": "Vos avoz ddja on conte so ç' wiki ci? '''$1'''.",
-       "gotaccountlink": "Elodjîz vs",
-       "userlogin-resetlink": "Avoz rovyî les pondants et djondants po s' elodjî?",
        "createaccountmail": "Eployî on scret timporaire a l' astcheyance eyet l' evoyî so l' emile diné",
        "createacct-realname": "Vraiy no (opcionel)",
-       "createaccountreason": "Råjhon:",
        "createacct-reason": "Råjhon",
        "createacct-another-submit": "Ahiver èn ôte conte",
        "createacct-benefit-body1": "{{PLURAL:$1|candjmint|candjmints}}",
        "passwordreset-disabled": "Li rfijhaedje di screts a stî dismetou so ç' wiki ci.",
        "passwordreset-username": "No d' elodjaedje:",
        "passwordreset-domain": "Dominne:",
-       "passwordreset-capture": "Vey li messaedje di l' emile?",
-       "passwordreset-capture-help": "Si vos clitchîz cisse boesse ci, l' emile (eyet li scret timporaire) vos srè håyné e minme tins k' il est emilé.",
        "passwordreset-email": "Adresse emile:",
        "passwordreset-emailtitle": "Detays do contre so {{SITENAME}}",
        "changeemail": "Candjî ou disfacer l' adresse emile",
        "watchthis": "Shuve cist årtike",
        "savearticle": "Schaper l' pådje",
        "savechanges": "Schaper l' pådje",
+       "publishpage": "Schaper l' pådje",
+       "publishchanges": "Schaper les candjmints",
        "preview": "Vey divant",
        "showpreview": "Vey divant",
        "showdiff": "Vey les candjmints",
        "saveprefs": "Schaper les preferinces",
        "restoreprefs": "Rimete totes les prémetowès valixhances",
        "prefs-editing": "Boesse di tecse",
-       "rows": "Royes",
-       "columns": "Colones",
        "searchresultshead": "Håynaedje des rzultats di cweraedje",
        "stub-threshold": "Limite pol formataedje des loyéns djermons ($1):",
        "stub-threshold-sample-link": "egzimpe",
        "userrights-reason": "Råjhon:",
        "userrights-no-interwiki": "Vos n' avoz nén les permissions po candjî les droets des uzeus so ds ôtes wikis.",
        "userrights-nodatabase": "Li båze di dnêyes «$1» n' egzistêye nén ou n' est nén locåle.",
-       "userrights-nologin": "Vos vs divoz [[Special:UserLogin|elodjî]] avou on conte manaedjeu por vos pleur candjî les droets des uzeus.",
-       "userrights-notallowed": "Li conte da vosse n' pout nén radjouter ou rsaetchî des droets des uzeus.",
        "userrights-changeable-col": "Groupes ki vos ploz candjî",
        "userrights-unchangeable-col": "Groupes ki vos n' poloz nén candjî",
        "group": "Groupe:",
        "feedback-submit": "Evoyî",
        "searchsuggest-search": "Cweri",
        "searchsuggest-containing": "ki contént...",
-       "api-error-badaccess-groups": "Vos n' avoz nén l' droet d' eberweter des fitchîs so ç' wiki cial",
-       "api-error-copyuploaddisabled": "Les eberwetaedjes pa URL ni vont nén so ç' sierveu cial.",
-       "api-error-duplicate": "N a ddja {{PLURAL:$1|èn ôte fitchî|des ôtes fitchîs}} avou l' minme contnou so nosse waibe",
-       "api-error-duplicate-archive": "N aveut ddja {{PLURAL:$1|èn ôte fitchî|des ôtes fitchîs}} avou l' minme contnou so nosse waibe, mins {{PLURAL:$1|il a stî rsaetchî|il ont stî rsaetchîs}}.",
-       "api-error-empty-file": "Vosse fitchî est vude.",
        "api-error-emptypage": "C' est nén permetou d' ahiver ene novele pådje et l' leyî vude.",
-       "api-error-fetchfileerror": "Aroke divintrinne : ene sacwè a fwait berwete cwand on-z a volou rawè vosse fitchî",
-       "api-error-file-too-large": "Vosse fitchî est trop pezant",
-       "api-error-filename-tooshort": "Li no do fitchî est trop court",
-       "api-error-filetype-banned": "On n' pout nén eberweter des sfwaits fitchîs",
-       "api-error-filetype-missing": "I manke li cawete do fitchî",
-       "api-error-hookaborted": "Li candjmint ki vos vlîz fé a stî espaitchî pa on module di rawete.",
-       "api-error-http": "Aroke divintrinne : nou raloyaedje å sierveu",
-       "api-error-illegal-filename": "On n' pout nén prinde ci no la pol fitchî",
-       "api-error-internal-error": "Aroke divintrinne : gn a ene sacwè k' a må stî tins d' l' eredjistrumint d' vost eberwetêye",
-       "api-error-invalid-file-key": "Aroke divintrinne : Li fitchî n' a nén stî rtrové dins l' eredjistrumint provizwere",
-       "api-error-missingparam": "Aroke divintrinne : i manke des dnêyes dins vosse dimande",
-       "api-error-missingresult": "Aroke divintrinne : on n' såreut dire si l' fitchî a bén passé",
-       "api-error-mustbeloggedin": "Vos dvoz esse elodjî (eye) po-z aberweter des fitchîs",
-       "api-error-mustbeposted": "Aroke divintrinne : li programe n' eploye nén li boune hårdêye HTTP",
-       "api-error-noimageinfo": "L' eberwetaedje a bén stî, mins l' sierveu n' a pont dné d' racsegnes sol fitchî",
-       "api-error-nomodule": "Aroke divintrinne : pont d' voye d' eberwetaedje tchoezeye",
-       "api-error-ok-but-empty": "Aroke divintrinne : li sierveu n' respond nén",
-       "api-error-overwrite": "Vos n' ploz nén spotchî on fitchî k' egzistêye dedja",
        "api-error-stashfailed": "Aroke divintrinne : li sierveu a pierdou les dnêyes provizweres",
-       "api-error-timeout": "Li sierveu n' a nén respondou dins les tins",
-       "api-error-unclassified": "Aroke nén cnoxhowe",
-       "api-error-unknown-code": "Aroke nén cnoxhowe: «$1».",
-       "api-error-unknown-error": "Aroke divintrinne : gn a ene sacwè ki n' a nén stî tins d' l' eberwetaedje",
        "api-error-unknown-warning": "Adviertixhmint nén cnoxhou: «$1».",
        "api-error-unknownerror": "Aroke nén cnoxhowe: «$1».",
-       "api-error-uploaddisabled": "L' eberwetaedje ni va nén so ç' wiki cial",
-       "api-error-verification-error": "Ci fitchî la est cron, oudon-bén si cawete n' est nén boune",
        "duration-seconds": "$1 segonde{{PLURAL:$1||s}}",
        "duration-minutes": "$1 munute{{PLURAL:$1||s}}",
        "duration-hours": "$1 eure{{PLURAL:$1||s}}",
index b4fd680..e8d2ac7 100644 (file)
        "login": "אַרײַנלאָגירן",
        "login-security": "וועריפיצירט אייער אידענטיטעט",
        "nav-login-createaccount": "ארײַנלאָגירן / זיך אײַנשרײַבן",
-       "userlogin": "ארײַנלאָגירן / זיך אײַנשרײַבן",
-       "userloginnocreate": "אַרײַנלאגירן",
        "logout": "אַרױסלאָגירן",
        "userlogout": "אַרױסלאָגירן",
        "notloggedin": "נישט איינגעשריבן",
        "userlogin-noaccount": "איר האט נישט קיין קאנטע?",
        "userlogin-joinproject": "איינטרעטן ביי {{SITENAME}}",
-       "nologin": "איר האט נישט קיין קאנטע? '''$1'''.",
-       "nologinlink": "שאַפֿן אַ קאנטע",
        "createaccount": "שאַפֿן אַ נײַע קאנטע",
-       "gotaccount": "האסטו שוין א קאנטע? '''$1'''.",
-       "gotaccountlink": "אַרײַנלאגירן",
-       "userlogin-resetlink": "פארגעסן אײַערע אַרײַנלאָגירן פרטים?",
        "userlogin-resetpassword-link": "פֿאַרגעסן אײַער פאַסווארט?",
        "userlogin-helplink2": "הילף מיט ארײַנלאגירן",
        "userlogin-loggedin": "איר זענט שוין אריינלאגירט ווי {{GENDER:$1|$1}}.\nניצט די פארעם אונטן כדי אריינלאגירן ווי אן אנדער באניצער.",
        "createaccountmail": "ניצן א פראוויזאריש פאסווארט און שיקן צום געצייכנטן ע-פאסט אדרעס",
        "createaccountmail-help": "קען ווערן באניצט צו שאפֿן קאנטע פֿאר א צווייטן אן צו דערגיין דאס פאסווארט.",
        "createacct-realname": "עכטער נאמען (אפציאנאל)",
-       "createaccountreason": "אורזאַך:",
        "createacct-reason": "אורזאך",
        "createacct-reason-ph": "פֿארוואס שאפֿט איר נאך א קאנטע",
        "createacct-reason-help": "מעלדונג געוויזן אין קאנטע־שאפֿונג לאגבוך",
        "unusedimages": "נישט געניצטע טעקעס",
        "wantedcategories": "געזוכטע קאטעגאריעס",
        "wantedpages": "געזוכטע בלעטער",
+       "wantedpages-summary": "ליסטע פֿון נישט־פֿאראנע בלעטער מיט די מערסטע לינקען צו זיי, אויסשליסנדיק בלעטער וואס האבן נאר ווייטערפֿירונגען צו זיי. פֿאר א ליסטע פון נישט־פֿאראנע בלעטער מיט ווייטערפֿירונגען צו זיי, זעט [[{{#special:BrokenRedirects}}|די ליסטע פון צעבראכענע ווייטערפֿירונגען]].",
        "wantedpages-badtitle": "אומגילטיקער טיטל אין רעזולטאַט: $1",
        "wantedfiles": "געזוכטע טעקעס",
        "wantedfiletext-cat": "די פֿאלגנדע טעקעס ווערן געניצט אבער זיי עקזיסטירן נישט. טעקעס פון פֿרעמדע רעפאזיטאריעס קענען ווערן אריינגערעכנט טראץ זיי עקזיסטירן יא. אזעלכע גרייזן וועלן ווערן <del>אויסגעשריכן </del>. דערצו, בלעטער וואס ניצן אומעקזיסטירנדע טעקעס ווערן אריינגערעכנט אין [[:$1]].",
        "logentry-rights-autopromote": "$1 אויטאמאטיש  {{GENDER:$2|פראמאווירט}} פון $4 צו $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|האט ארויפגעלאדן}} $3",
        "rightsnone": "(גארנישט)",
-       "revdelete-summary": "רעדאקטירונג קיצור",
        "feedback-adding": "צולייגן פֿידבעק צו בלאַט...",
        "feedback-bugcheck": "געוואלדיק! אבער זייט בודק אז עס איז נישט איינער פון די [$1 באוואוסטע באגן].",
        "feedback-bugnew": "כ'האב בודק געווען. רעפארטירט א נייעם באג.",
index d6eed0a..0a467da 100644 (file)
        "page_first": "首页",
        "page_last": "末页",
        "histlegend": "差异选择:选中要对比的版本的单选按钮,按Enter键或下方的按钮。<br />说明:<strong>({{int:cur}})</strong>=与最后版本之间的差异,<strong>({{int:last}})</strong>=与上一版本之间的差异,<strong>{{int:minoreditletter}}</strong>=小编辑。",
-       "history-fieldset-title": "æµ\8fè§\88å\8e\86å\8f²",
+       "history-fieldset-title": "æ\90\9c索修订ç\89\88æ\9c¬",
        "history-show-deleted": "仅限修订版本删除",
        "histfirst": "最旧",
        "histlast": "最新",
        "rcfilters-invalid-filter": "无效过滤器",
        "rcfilters-empty-filter": "没有活跃的过滤器。已显示所有贡献。",
        "rcfilters-filterlist-title": "过滤器",
+       "rcfilters-filterlist-whatsthis": "这是什么?",
        "rcfilters-filterlist-feedbacklink": "在新(测试版)过滤器中提供反馈",
        "rcfilters-highlightbutton-title": "高亮结果",
        "rcfilters-highlightmenu-title": "选择颜色",
        "rcfilters-highlightmenu-help": "选择颜色来高亮该属性",
        "rcfilters-filterlist-noresults": "找不到过滤器",
+       "rcfilters-noresults-conflict": "找不到结果,因为搜索条件不一致",
+       "rcfilters-state-message-subset": "该过滤器没有影响,因为其结果已包含在以下影响更广的{{PLURAL:$2|过滤器}}中(尝试高亮来区别它):$1",
+       "rcfilters-state-message-fullcoverage": "组中选择的所有过滤器与选定过滤器相同,因此该过滤器没有影响。组包含:$1",
        "rcfilters-filtergroup-registration": "用户注册",
        "rcfilters-filter-registered-label": "已注册",
        "rcfilters-filter-registered-description": "登录编辑者。",
        "rcfilters-filter-unregistered-label": "未注册",
        "rcfilters-filter-unregistered-description": "未登录的编辑者。",
-       "rcfilters-filter-unregistered-conflicts-user-experience-level": "“未注册”过滤器未被激活,因为其影响已被以下体验{{PLURAL:$2|过滤器}}消除,而它只{{PLURAL:$2|找到}}注册用户:$1",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "该过滤器与以下体验{{PLURAL:$2|过滤器}}相冲突,而它只{{PLURAL:$2|寻找}}注册用户:$1",
        "rcfilters-filtergroup-authorship": "编辑的作者",
        "rcfilters-filter-editsbyself-label": "您自己的编辑",
        "rcfilters-filter-editsbyself-description": "由您编辑。",
        "rcfilters-filter-editsbyother-label": "由其他人编辑",
        "rcfilters-filter-editsbyother-description": "由其他用户(而不是您)创建的编辑。",
        "rcfilters-filtergroup-userExpLevel": "体验水平(仅限注册用户)",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "此过滤器未被激活,因为它只找到注册用户,而因此“未注册”过滤器正在消除其影响。",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "“未注册”过滤器与一个或更多体验过滤器相冲突。体验过滤器只寻找注册用户。冲突过滤器已在上方标记为未激活。",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "体验过滤器只寻找注册用户,因此该过滤器与“未注册”过滤器相冲突。",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "“未注册”过滤器与一个或更多体验过滤器相冲突,而它只寻找注册用户。冲突过滤器已在上方激活过滤器区域中被标记。",
        "rcfilters-filter-user-experience-level-newcomer-label": "新手",
        "rcfilters-filter-user-experience-level-newcomer-description": "少于10次编辑和4天活跃。",
        "rcfilters-filter-user-experience-level-learner-label": "初学者",
        "rcfilters-filter-categorization-description": "从分类中添加或移除页面的记录。",
        "rcfilters-filter-logactions-label": "记录的操作",
        "rcfilters-filter-logactions-description": "管理操作、账户创建、页面删除、上传....",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "“小编辑”过滤器与一个或多个更改类型过滤器冲突,因为其中某种更改类型不可指定为“小编辑”。冲突过滤器已在上方活跃过滤器中被标记。",
+       "rcfilters-hideminor-conflicts-typeofchange": "某种更改类型不可指定为“小编辑”,因此该过滤器与以下更改类型过滤器相冲突:$1",
+       "rcfilters-typeofchange-conflicts-hideminor": "这种更改类型过滤器与“小编辑”过滤器相冲突。某种更改类型不可指定为“小编辑”。",
        "rcnotefrom": "下面{{PLURAL:$5|是}}<strong>$3 $4</strong>之后的更改(最多显示<strong>$1</strong>个)。",
        "rclistfrom": "显示$3 $2之后的新更改",
        "rcshowhideminor": "$1小编辑",
        "colon-separator": ":",
        "pipe-separator": "&#32;|&#32;",
        "word-separator": "",
+       "ellipsis": "…",
        "parentheses": "($1)",
        "quotation-marks": "“$1”",
        "imgmultipageprev": "← 上一页",
index 054042d..352700e 100644 (file)
@@ -82,7 +82,8 @@
                        "Winstonyin",
                        "Wmr",
                        "烈羽",
-                       "和平奮鬥救地球"
+                       "和平奮鬥救地球",
+                       "Arthur2e5"
                ]
        },
        "tog-underline": "底線標示連結:",
        "comma-separator": ",",
        "colon-separator": ":",
        "word-separator": "",
+       "ellipsis": "…",
        "parentheses": " ($1)",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← 上一頁",
index 388ad8a..f7e0c0f 100644 (file)
@@ -26,9 +26,11 @@ require_once __DIR__ . '/Maintenance.php';
 /**
  * Maintenance script to create common password cdb database.
  *
- * Meant to take a file like
- * https://github.com/danielmiessler/SecLists/blob/master/Passwords/rockyou.txt?raw=true
- * as input.
+ * Meant to take a file like those from
+ * https://github.com/danielmiessler/SecLists
+ * For example:
+ * https://github.com/danielmiessler/SecLists/blob/fe2b40dd84/Passwords/rockyou.txt?raw=true
+ *
  * @see serialized/commonpasswords.cdb and PasswordPolicyChecks::checkPopularPasswordBlacklist
  * @since 1.27
  * @ingroup Maintenance
index 9fe5009..2c8c8b0 100644 (file)
@@ -33,7 +33,8 @@
                                        "mw.plugin.*",
                                        "mw.cookie",
                                        "mw.experiments",
-                                       "mw.viewport"
+                                       "mw.viewport",
+                                       "mw.htmlform.*"
                                ]
                        },
                        {
index b868295..5a5635b 100644 (file)
@@ -3,9 +3,11 @@
   "scripts": {
     "test": "grunt test",
     "doc": "jsduck",
-    "postdoc": "grunt copy:jsduck"
+    "postdoc": "grunt copy:jsduck",
+    "selenium": "killall -0 chromedriver 2>/dev/null || chromedriver --url-base=/wd/hub --port=4444 & grunt webdriver:test; killall chromedriver"
   },
   "devDependencies": {
+    "deepmerge": "1.3.2",
     "eslint": "3.12.2",
     "eslint-config-wikimedia": "0.3.0",
     "grunt": "1.0.1",
     "grunt-jsonlint": "1.1.0",
     "grunt-karma": "2.0.0",
     "grunt-stylelint": "0.7.0",
+    "grunt-webdriver": "2.0.3",
     "karma": "1.1.0",
     "karma-chrome-launcher": "2.0.0",
     "karma-firefox-launcher": "1.0.0",
     "karma-qunit": "1.0.0",
     "qunitjs": "1.22.0",
-    "stylelint-config-wikimedia": "0.4.1"
+    "stylelint-config-wikimedia": "0.4.1",
+    "wdio-junit-reporter": "0.2.0",
+    "wdio-mocha-framework": "0.5.8",
+    "wdio-spec-reporter": "0.0.5",
+    "webdriverio": "4.6.2"
   }
 }
index 6d08c44..a876472 100644 (file)
@@ -151,21 +151,14 @@ return [
                'targets' => [ 'mobile', 'desktop' ],
        ],
        'jquery.appear' => [
-               'deprecated' => [
-                       'message' => 'Please use "mediawiki.viewport" instead.',
-               ],
+               'deprecated' => 'Please use "mediawiki.viewport" instead.',
                'scripts' => 'resources/lib/jquery/jquery.appear.js',
        ],
-       'jquery.arrowSteps' => [
-               'deprecated' => true,
-               'scripts' => 'resources/src/jquery/jquery.arrowSteps.js',
-               'styles' => 'resources/src/jquery/jquery.arrowSteps.css',
-               'targets' => [ 'desktop', 'mobile' ],
-       ],
        'jquery.async' => [
                'scripts' => 'resources/lib/jquery/jquery.async.js',
        ],
        'jquery.autoEllipsis' => [
+               'deprecated' => 'Use CSS text-overflow instead.',
                'scripts' => 'resources/src/jquery/jquery.autoEllipsis.js',
                'dependencies' => 'jquery.highlightText',
                'targets' => [ 'desktop', 'mobile' ],
@@ -326,9 +319,7 @@ return [
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'jquery.jStorage' => [
-               'deprecated' => [
-                       'message' => 'Please use "mediawiki.storage" instead.',
-               ],
+               'deprecated' => 'Please use "mediawiki.storage" instead.',
                'scripts' => 'resources/lib/jquery/jquery.jStorage.js',
        ],
        'jquery.suggestions' => [
@@ -372,9 +363,7 @@ return [
        /* jQuery UI */
 
        'jquery.ui.core' => [
-               'deprecated' => [
-                       'message' => 'Please use "mediawiki.ui.button" or "oojs-ui" instead.',
-               ],
+               'deprecated' => 'Please use "mediawiki.ui.button" or "oojs-ui" instead.',
                'scripts' => 'resources/lib/jquery.ui/jquery.ui.core.js',
                'dependencies' => [
                        'jquery.ui.core.styles',
@@ -1092,6 +1081,12 @@ return [
                ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
+       'mediawiki.htmlform.checker' => [
+               'scripts' => [
+                       'resources/src/mediawiki/htmlform/htmlform.Checker.js',
+               ],
+               'targets' => [ 'desktop', 'mobile' ],
+       ],
        'mediawiki.htmlform.ooui' => [
                'scripts' => [
                        'resources/src/mediawiki/htmlform/htmlform.Element.js',
@@ -1352,11 +1347,6 @@ return [
                'dependencies' => 'mediawiki.util',
                'targets' => [ 'desktop', 'mobile' ],
        ],
-       'mediawiki.user.blockcookie' => [
-               'scripts' => 'resources/src/mediawiki/mediawiki.user.blockcookie.js',
-               'dependencies' => [ 'mediawiki.cookie', 'mediawiki.storage' ],
-               'targets' => [ 'desktop', 'mobile' ],
-       ],
        'mediawiki.user' => [
                'scripts' => 'resources/src/mediawiki/mediawiki.user.js',
                'dependencies' => [
@@ -1796,6 +1786,12 @@ return [
                        'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.HighlightColorPickerWidget.less',
                        'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterItemHighlightButton.less',
                ],
+               'skinStyles' => [
+                       'monobook' => [
+                               'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.Overlay.monobook.less',
+                               'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.CapsuleItemWidget.monobook.less',
+                       ],
+               ],
                'messages' => [
                        'rcfilters-activefilters',
                        'rcfilters-restore-default-filters',
@@ -1806,13 +1802,20 @@ return [
                        'rcfilters-filterlist-title',
                        'rcfilters-filterlist-feedbacklink',
                        'rcfilters-filterlist-noresults',
+                       'rcfilters-filterlist-whatsthis',
                        'rcfilters-highlightbutton-title',
                        'rcfilters-highlightmenu-title',
                        'rcfilters-highlightmenu-help',
+                       'rcfilters-noresults-conflict',
+                       'rcfilters-state-message-subset',
+                       'rcfilters-state-message-fullcoverage',
                        'recentchanges-noresult',
+                       'quotation-marks',
                ],
                'dependencies' => [
                        'oojs-ui',
+                       'mediawiki.language',
+                       'mediawiki.user',
                        'mediawiki.rcfilters.filters.dm',
                        'oojs-ui.styles.icons-moderation',
                        'oojs-ui.styles.icons-editing-core',
@@ -1899,6 +1902,14 @@ return [
                        'mediawiki.htmlform',
                ],
        ],
+       'mediawiki.special.changecredentials.js' => [
+               'scripts' => 'resources/src/mediawiki.special/mediawiki.special.changecredentials.js',
+               'dependencies' => [
+                       'mediawiki.api',
+                       'mediawiki.htmlform.ooui'
+               ],
+               'targets' => [ 'desktop', 'mobile' ],
+       ],
        'mediawiki.special.changeslist' => [
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.changeslist.css',
                'targets' => [ 'desktop', 'mobile' ],
@@ -2070,7 +2081,6 @@ return [
        'mediawiki.special.userlogin.signup.js' => [
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.userlogin.signup.js',
                'messages' => [
-                       'createacct-error',
                        'createacct-emailrequired',
                        'noname',
                        'userexists',
@@ -2079,6 +2089,7 @@ return [
                        'mediawiki.api',
                        'mediawiki.jqueryMsg',
                        'jquery.throttle-debounce',
+                       'mediawiki.htmlform.checker',
                ],
        ],
        'mediawiki.special.unwatchedPages' => [
@@ -2244,7 +2255,7 @@ return [
                        'mediawiki.api',
                        'jquery.byteLimit',
                        // TitleOptionWidget
-                       'jquery.autoEllipsis',
+                       'jquery.highlightText',
                ],
                'messages' => [
                        // NamespaceInputWidget
index 53ce966..a13441b 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.19.5
+ * OOjs UI v0.20.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-07T22:57:01Z
+ * Date: 2017-03-15T17:06:24Z
  */
 ( function ( OO ) {
 
index 369cf09..382c13b 100644 (file)
@@ -1,18 +1,19 @@
 /*!
- * OOjs UI v0.19.5
+ * OOjs UI v0.20.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-07T22:57:06Z
+ * Date: 2017-03-15T17:06:28Z
  */
 .oo-ui-element-hidden {
   display: none !important;
 }
 .oo-ui-buttonElement {
   display: inline-block;
+  line-height: normal;
   vertical-align: middle;
 }
 .oo-ui-buttonElement > .oo-ui-buttonElement-button {
@@ -24,7 +25,6 @@
   vertical-align: middle;
   font-family: inherit;
   font-size: inherit;
-  line-height: normal;
   white-space: nowrap;
   -webkit-touch-callout: none;
   -webkit-user-select: none;
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
   width: 1px;
 }
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
+  display: block;
+}
 .oo-ui-fieldLayout .oo-ui-fieldLayout-help {
   float: right;
 }
@@ -571,7 +575,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   opacity: 0.2;
 }
 .oo-ui-radioOptionWidget {
-  cursor: default;
   padding: 0;
   background-color: transparent;
 }
@@ -868,12 +871,16 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   display: block;
 }
 .oo-ui-dropdownInputWidget select {
+  background-position: -9999em 0;
+  background-repeat: no-repeat;
   width: 100%;
-  cursor: pointer;
   -webkit-box-sizing: border-box;
      -moz-box-sizing: border-box;
           box-sizing: border-box;
 }
+.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select {
+  cursor: pointer;
+}
 .oo-ui-dropdownInputWidget select {
   background-color: #fff;
   height: 2.5em;
@@ -1301,7 +1308,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   color: #ccc;
 }
 .oo-ui-checkboxMultioptionWidget {
-  cursor: default;
   padding: 0;
 }
 .oo-ui-checkboxMultioptionWidget .oo-ui-checkboxInputWidget,
index b041ef4..c4fdf20 100644 (file)
@@ -1,18 +1,19 @@
 /*!
- * OOjs UI v0.19.5
+ * OOjs UI v0.20.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-07T22:57:06Z
+ * Date: 2017-03-15T17:06:28Z
  */
 .oo-ui-element-hidden {
   display: none !important;
 }
 .oo-ui-buttonElement {
   display: inline-block;
+  line-height: normal;
   vertical-align: middle;
 }
 .oo-ui-buttonElement > .oo-ui-buttonElement-button {
@@ -24,7 +25,6 @@
   vertical-align: middle;
   font-family: inherit;
   font-size: inherit;
-  line-height: normal;
   white-space: nowrap;
   -webkit-touch-callout: none;
   -webkit-user-select: none;
   position: relative;
   min-height: 2.5em;
   border-radius: 2px;
-  padding: 0.546875em 1em;
+  padding: 0.625em 1em 0.546875em;
 }
 .oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button {
   min-width: 3.125em;
   min-width: 0;
 }
 .oo-ui-buttonElement-framed > input.oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-labelElement > .oo-ui-buttonElement-button {
+  line-height: 1;
+}
 .oo-ui-buttonElement-framed.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  line-height: 1.25;
+  line-height: 1.172em;
 }
 .oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
   display: block;
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
   width: 1px;
 }
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
+  display: block;
+}
 .oo-ui-fieldLayout .oo-ui-fieldLayout-help {
   float: right;
 }
@@ -664,7 +671,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   position: relative;
   display: block;
   border: 0;
-  padding: 0.25em 0.5em;
 }
 .oo-ui-optionWidget.oo-ui-widget-enabled {
   cursor: pointer;
@@ -716,22 +722,15 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   border-color: #fff;
 }
 .oo-ui-radioOptionWidget {
-  cursor: default;
-  padding: 0.25em 0;
-  background-color: transparent;
+  padding: 0.3125em 0;
 }
 .oo-ui-radioOptionWidget .oo-ui-radioInputWidget,
 .oo-ui-radioOptionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
   display: inline-block;
   vertical-align: middle;
 }
-.oo-ui-radioOptionWidget.oo-ui-optionWidget-selected,
-.oo-ui-radioOptionWidget.oo-ui-optionWidget-pressed,
-.oo-ui-radioOptionWidget.oo-ui-optionWidget-highlighted {
-  background-color: transparent;
-}
 .oo-ui-radioOptionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
-  padding: 0.25em 0.25em 0.25em 0.46875em;
+  padding-left: 0.46875em;
 }
 .oo-ui-radioOptionWidget .oo-ui-radioInputWidget {
   margin-right: 0;
@@ -1107,7 +1106,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   margin-top: 0;
 }
 .oo-ui-checkboxMultiselectInputWidget .oo-ui-fieldLayout .oo-ui-fieldLayout-body {
-  padding: 0.25em 0;
+  padding: 0.3125em 0;
 }
 .oo-ui-checkboxMultiselectInputWidget .oo-ui-fieldLayout .oo-ui-fieldLayout-body .oo-ui-labelElement-label {
   line-height: 1.5;
@@ -1126,12 +1125,16 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   display: block;
 }
 .oo-ui-dropdownInputWidget select {
+  background-position: -9999em 0;
+  background-repeat: no-repeat;
   width: 100%;
-  cursor: pointer;
   -webkit-box-sizing: border-box;
      -moz-box-sizing: border-box;
           box-sizing: border-box;
 }
+.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select {
+  cursor: pointer;
+}
 .oo-ui-dropdownInputWidget-php {
   border-right: 1px solid #a2a9b1;
   border-radius: 2px;
@@ -1151,6 +1154,15 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   font-family: inherit;
   vertical-align: middle;
 }
+.oo-ui-dropdownInputWidget select::-ms-expand {
+  display: none;
+}
+.oo-ui-dropdownInputWidget select:not( [no-ie] ) {
+  background-position: right 1.75em center;
+  width: calc( 100% + 1em );
+  height: 2.5em;
+  padding: 0 0 0 1em;
+}
 .oo-ui-dropdownInputWidget option {
   font-size: inherit;
   font-family: inherit;
@@ -1159,8 +1171,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-dropdownInputWidget.oo-ui-widget-enabled select {
   background-color: #f8f9fa;
-  background-position: -9999em 0;
-  background-repeat: no-repeat;
   color: #222;
   -webkit-transition: background-color 100ms, border-color 100ms, box-shadow 100ms;
      -moz-transition: background-color 100ms, border-color 100ms, box-shadow 100ms;
@@ -1180,15 +1190,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   outline: 0;
   box-shadow: inset 0 0 0 1px #36c;
 }
-.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select::-ms-expand {
-  display: none;
-}
-.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:not( [no-ie] ) {
-  background-position: right 1.75em center;
-  width: calc( 100% + 1em );
-  height: 2.5em;
-  padding: 0 0 0 1em;
-}
 .oo-ui-dropdownInputWidget.oo-ui-widget-disabled select {
   background-color: #eaecf0;
   color: #72777d;
@@ -1297,7 +1298,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   margin-top: 0;
 }
 .oo-ui-radioSelectInputWidget .oo-ui-fieldLayout .oo-ui-fieldLayout-body {
-  padding: 0.25em 0;
+  padding: 0.3125em 0;
 }
 .oo-ui-radioSelectInputWidget .oo-ui-fieldLayout .oo-ui-fieldLayout-body .oo-ui-labelElement-label {
   line-height: 1.5;
@@ -1497,6 +1498,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-textInputWidget.oo-ui-widget-disabled input,
 .oo-ui-textInputWidget.oo-ui-widget-disabled textarea {
   background-color: #eaecf0;
+  -webkit-text-fill-color: #72777d;
   color: #72777d;
   text-shadow: 0 1px 1px #fff;
   border-color: #c8ccd1;
@@ -1515,7 +1517,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-textInputWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
   left: 0;
-  max-height: 2.375em;
+  max-height: 2.5em;
   margin-left: 0.5em;
   background-position: right center;
 }
@@ -1525,7 +1527,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
   height: 100%;
-  max-height: 2.375em;
+  max-height: 2.5em;
   margin: 0 0.775em;
 }
 .oo-ui-textInputWidget > .oo-ui-labelElement-label {
@@ -1750,6 +1752,12 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   border-bottom-right-radius: 0;
   border-right-width: 0;
 }
+.oo-ui-comboBoxInputWidget.oo-ui-comboBoxInputWidget-empty input,
+.oo-ui-comboBoxInputWidget-php input {
+  border-top-right-radius: 2px;
+  border-bottom-right-radius: 2px;
+  border-right-width: 1px;
+}
 .oo-ui-comboBoxInputWidget-dropdownButton {
   width: 2.5em;
 }
@@ -1764,9 +1772,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   border-top-left-radius: 0;
   border-bottom-left-radius: 0;
 }
-.oo-ui-comboBoxInputWidget.oo-ui-comboBoxInputWidget-empty input {
-  border-right-width: 1px;
-}
 .oo-ui-comboBoxInputWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
   opacity: 1;
 }
@@ -1790,8 +1795,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   color: #72777d;
 }
 .oo-ui-checkboxMultioptionWidget {
-  cursor: default;
-  padding: 0.25em 0;
+  padding: 0.3125em 0;
 }
 .oo-ui-checkboxMultioptionWidget .oo-ui-checkboxInputWidget,
 .oo-ui-checkboxMultioptionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
@@ -1799,7 +1803,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   vertical-align: middle;
 }
 .oo-ui-checkboxMultioptionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
-  padding: 0.25em 0.25em 0.25em 0.46875em;
+  padding-left: 0.46875em;
 }
 .oo-ui-checkboxMultioptionWidget .oo-ui-checkboxInputWidget {
   margin-right: 0;
index f10bdfa..fe11d68 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.19.5
+ * OOjs UI v0.20.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-07T22:57:01Z
+ * Date: 2017-03-15T17:06:24Z
  */
 ( function ( OO ) {
 
@@ -1223,22 +1223,16 @@ OO.ui.Element.static.getClosestScrollableContainer = function ( el, dimension )
  * @param {string} [config.duration='fast'] jQuery animation duration value
  * @param {string} [config.direction] Scroll in only one direction, e.g. 'x' or 'y', omit
  *  to scroll in both directions
- * @param {Function} [config.complete] Function to call when scrolling completes.
- *  Deprecated since 0.15.4, use the return promise instead.
  * @return {jQuery.Promise} Promise which resolves when the scroll is complete
  */
 OO.ui.Element.static.scrollIntoView = function ( el, config ) {
-       var position, animations, callback, container, $container, elementDimensions, containerDimensions, $window,
+       var position, animations, container, $container, elementDimensions, containerDimensions, $window,
                deferred = $.Deferred();
 
        // Configuration initialization
        config = config || {};
 
        animations = {};
-       callback = typeof config.complete === 'function' && config.complete;
-       if ( callback ) {
-               OO.ui.warnDeprecation( 'Element#scrollIntoView: The `complete` callback config option is deprecated. Use the return promise instead.' );
-       }
        container = this.getClosestScrollableContainer( el, config.direction );
        $container = $( container );
        elementDimensions = this.getDimensions( el );
@@ -1281,16 +1275,10 @@ OO.ui.Element.static.scrollIntoView = function ( el, config ) {
        if ( !$.isEmptyObject( animations ) ) {
                $container.stop( true ).animate( animations, config.duration === undefined ? 'fast' : config.duration );
                $container.queue( function ( next ) {
-                       if ( callback ) {
-                               callback();
-                       }
                        deferred.resolve();
                        next();
                } );
        } else {
-               if ( callback ) {
-                       callback();
-               }
                deferred.resolve();
        }
        return deferred.promise();
@@ -3541,6 +3529,12 @@ OO.mixinClass( OO.ui.ButtonWidget, OO.ui.mixin.AccessKeyedElement );
  */
 OO.ui.ButtonWidget.static.cancelButtonMouseDownEvents = false;
 
+/**
+ * @static
+ * @inheritdoc
+ */
+OO.ui.ButtonWidget.static.tagName = 'span';
+
 /* Methods */
 
 /**
@@ -3718,6 +3712,14 @@ OO.ui.ButtonGroupWidget = function OoUiButtonGroupWidget( config ) {
 OO.inheritClass( OO.ui.ButtonGroupWidget, OO.ui.Widget );
 OO.mixinClass( OO.ui.ButtonGroupWidget, OO.ui.mixin.GroupElement );
 
+/* Static Properties */
+
+/**
+ * @static
+ * @inheritdoc
+ */
+OO.ui.ButtonGroupWidget.static.tagName = 'span';
+
 /**
  * IconWidget is a generic widget for {@link OO.ui.mixin.IconElement icons}. In general, IconWidgets should be used with OO.ui.LabelWidget,
  * which creates a label that identifies the icon’s function. See the [OOjs UI documentation on MediaWiki] [1]
@@ -5247,12 +5249,6 @@ OO.ui.PopupWidget.prototype.computePosition = function () {
  *  `backwards` or `forwards`.
  */
 OO.ui.PopupWidget.prototype.setAlignment = function ( align ) {
-       // Transform values deprecated since v0.11.0
-       if ( align === 'left' || align === 'right' ) {
-               OO.ui.warnDeprecation( 'PopupWidget#setAlignment parameter value `' + align + '` is deprecated. Use `force-right` or `force-left` instead.' );
-               align = { left: 'force-right', right: 'force-left' }[ align ];
-       }
-
        // Validate alignment
        if ( [ 'force-left', 'force-right', 'backwards', 'forwards', 'center' ].indexOf( align ) > -1 ) {
                this.align = align;
@@ -6723,7 +6719,8 @@ OO.ui.MenuSectionOptionWidget = function OoUiMenuSectionOptionWidget( config ) {
        OO.ui.MenuSectionOptionWidget.parent.call( this, config );
 
        // Initialization
-       this.$element.addClass( 'oo-ui-menuSectionOptionWidget' );
+       this.$element.addClass( 'oo-ui-menuSectionOptionWidget' )
+               .attr( 'role', '' );
 };
 
 /* Setup */
@@ -7939,23 +7936,6 @@ OO.ui.FloatingMenuSelectWidget.prototype.toggle = function ( visible ) {
        return this;
 };
 
-/*
- * The old name for the FloatingMenuSelectWidget widget, provided for backwards-compatibility.
- *
- * @class
- * @extends OO.ui.FloatingMenuSelectWidget
- *
- * @constructor
- * @deprecated since v0.12.5.
- */
-OO.ui.TextInputMenuSelectWidget = function OoUiTextInputMenuSelectWidget() {
-       OO.ui.warnDeprecation( 'TextInputMenuSelectWidget is deprecated. Use the FloatingMenuSelectWidget instead.' );
-       // Parent constructor
-       OO.ui.TextInputMenuSelectWidget.parent.apply( this, arguments );
-};
-
-OO.inheritClass( OO.ui.TextInputMenuSelectWidget, OO.ui.FloatingMenuSelectWidget );
-
 /**
  * Progress bars visually display the status of an operation, such as a download,
  * and can be either determinate or indeterminate:
@@ -8429,6 +8409,12 @@ OO.mixinClass( OO.ui.ButtonInputWidget, OO.ui.mixin.TitledElement );
  */
 OO.ui.ButtonInputWidget.static.supportsSimpleLabel = false;
 
+/**
+ * @static
+ * @inheritdoc
+ */
+OO.ui.ButtonInputWidget.static.tagName = 'span';
+
 /* Methods */
 
 /**
@@ -8543,6 +8529,14 @@ OO.ui.CheckboxInputWidget = function OoUiCheckboxInputWidget( config ) {
 
 OO.inheritClass( OO.ui.CheckboxInputWidget, OO.ui.InputWidget );
 
+/* Static Properties */
+
+/**
+ * @static
+ * @inheritdoc
+ */
+OO.ui.CheckboxInputWidget.static.tagName = 'span';
+
 /* Static Methods */
 
 /**
@@ -8740,10 +8734,17 @@ OO.ui.DropdownInputWidget.prototype.setOptions = function ( options ) {
                .clearItems()
                .addItems( options.map( function ( opt ) {
                        var optValue = widget.cleanUpValue( opt.data );
-                       return new OO.ui.MenuOptionWidget( {
-                               data: optValue,
-                               label: opt.label !== undefined ? opt.label : optValue
-                       } );
+
+                       if ( opt.optgroup === undefined ) {
+                               return new OO.ui.MenuOptionWidget( {
+                                       data: optValue,
+                                       label: opt.label !== undefined ? opt.label : optValue
+                               } );
+                       } else {
+                               return new OO.ui.MenuSectionOptionWidget( {
+                                       label: opt.optgroup
+                               } );
+                       }
                } ) );
 
        // Restore the previous value, or reset to something sensible
@@ -8836,6 +8837,14 @@ OO.ui.RadioInputWidget = function OoUiRadioInputWidget( config ) {
 
 OO.inheritClass( OO.ui.RadioInputWidget, OO.ui.InputWidget );
 
+/* Static Properties */
+
+/**
+ * @static
+ * @inheritdoc
+ */
+OO.ui.RadioInputWidget.static.tagName = 'span';
+
 /* Static Methods */
 
 /**
@@ -9266,7 +9275,7 @@ OO.ui.CheckboxMultiselectInputWidget.prototype.setOptions = function ( options )
  * @constructor
  * @param {Object} [config] Configuration options
  * @cfg {string} [type='text'] The value of the HTML `type` attribute: 'text', 'password', 'search',
- *  'email', 'url', 'date', 'month' or 'number'. Ignored if `multiline` is true.
+ *  'email', 'url' or 'number'. Ignored if `multiline` is true.
  *
  *  Some values of `type` result in additional behaviors:
  *
@@ -9793,8 +9802,6 @@ OO.ui.TextInputWidget.prototype.getSaneType = function ( config ) {
                'search',
                'email',
                'url',
-               'date',
-               'month',
                'number'
        ];
        return allowedTypes.indexOf( config.type ) !== -1 ? config.type : 'text';
@@ -10547,9 +10554,9 @@ OO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) {
        this.fieldWidget = fieldWidget;
        this.errors = [];
        this.notices = [];
-       this.$field = $( '<div>' );
+       this.$field = this.isFieldInline() ? $( '<span>' ) : $( '<div>' );
        this.$messages = $( '<ul>' );
-       this.$header = $( '<div>' );
+       this.$header = $( '<span>' );
        this.$body = $( '<div>' );
        this.align = null;
        if ( config.help ) {
@@ -10629,6 +10636,17 @@ OO.ui.FieldLayout.prototype.getField = function () {
        return this.fieldWidget;
 };
 
+/**
+ * Return `true` if the given field widget can be used with `'inline'` alignment (see
+ * #setAlignment). Return `false` if it can't or if this can't be determined.
+ *
+ * @return {boolean}
+ */
+OO.ui.FieldLayout.prototype.isFieldInline = function () {
+       // This is very simplistic, but should be good enough.
+       return this.getField().$element.prop( 'tagName' ).toLowerCase() === 'span';
+};
+
 /**
  * @protected
  * @param {string} kind 'error' or 'notice'
@@ -10665,6 +10683,10 @@ OO.ui.FieldLayout.prototype.setAlignment = function ( value ) {
                if ( [ 'left', 'right', 'top', 'inline' ].indexOf( value ) === -1 ) {
                        value = 'left';
                }
+               // Validate
+               if ( value === 'inline' && !this.isFieldInline() ) {
+                       value = 'top';
+               }
                // Reorder elements
                if ( value === 'top' ) {
                        this.$header.append( this.$label, this.$help );
@@ -10800,8 +10822,8 @@ OO.ui.ActionFieldLayout = function OoUiActionFieldLayout( fieldWidget, buttonWid
 
        // Properties
        this.buttonWidget = buttonWidget;
-       this.$button = $( '<div>' );
-       this.$input = $( '<div>' );
+       this.$button = $( '<span>' );
+       this.$input = this.isFieldInline() ? $( '<span>' ) : $( '<div>' );
 
        // Initialization
        this.$element
index 7b1c099..b4a6392 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.19.5
+ * OOjs UI v0.20.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-07T22:57:01Z
+ * Date: 2017-03-15T17:06:24Z
  */
 ( function ( OO ) {
 
index 7604589..479e2a5 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.19.5
+ * OOjs UI v0.20.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-07T22:57:06Z
+ * Date: 2017-03-15T17:06:28Z
  */
 .oo-ui-popupTool .oo-ui-popupWidget-popup,
 .oo-ui-popupTool .oo-ui-popupWidget-anchor {
index ad1746d..df77684 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.19.5
+ * OOjs UI v0.20.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-07T22:57:06Z
+ * Date: 2017-03-15T17:06:28Z
  */
 .oo-ui-tool.oo-ui-widget-enabled {
   -webkit-transition: background-color 100ms;
index 1574f6c..7d09854 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.19.5
+ * OOjs UI v0.20.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-07T22:57:01Z
+ * Date: 2017-03-15T17:06:24Z
  */
 ( function ( OO ) {
 
index 4ec3d1c..7f8389e 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.19.5
+ * OOjs UI v0.20.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-07T22:57:06Z
+ * Date: 2017-03-15T17:06:28Z
  */
 .oo-ui-draggableElement-handle,
 .oo-ui-draggableElement-handle.oo-ui-widget {
 .oo-ui-numberInputWidget-buttoned .oo-ui-buttonWidget,
 .oo-ui-numberInputWidget-buttoned .oo-ui-textInputWidget {
   display: table-cell;
+  height: 100%;
+}
+.oo-ui-numberInputWidget-buttoned .oo-ui-textInputWidget input {
+  height: 100%;
 }
 .oo-ui-numberInputWidget-field {
   display: table;
index f64a619..c79dc85 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.19.5
+ * OOjs UI v0.20.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-07T22:57:06Z
+ * Date: 2017-03-15T17:06:28Z
  */
 .oo-ui-draggableElement-handle,
 .oo-ui-draggableElement-handle.oo-ui-widget {
           box-sizing: border-box;
   display: block;
   right: 2.375em;
-  margin: 0;
-  padding-left: 0.5em;
-  line-height: 2.3;
+  padding-top: 0.625em;
+  padding-left: 0.546875em;
+  padding-bottom: 0.546875em;
+  line-height: 1.172em;
   white-space: nowrap;
 }
 .oo-ui-selectFileWidget-fileName {
   text-overflow: ellipsis;
 }
 .oo-ui-selectFileWidget-clearButton {
-  top: 0;
+  top: -1px;
   right: 0;
   min-width: 24px;
   width: 1.875em;
   margin-right: 0;
 }
 .oo-ui-selectFileWidget-clearButton .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  height: 2.3em;
+  height: 2.5em;
 }
 .oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-label {
   color: #72777d;
 }
 .oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon,
 .oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon,
-.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon,
+.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon {
+  opacity: 0.51;
+}
 .oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator,
 .oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator,
 .oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator {
-  opacity: 0.51;
+  opacity: 0.15;
 }
 .oo-ui-widget-disabled .oo-ui-selectFileWidget-dropLabel {
   display: none;
 .oo-ui-numberInputWidget-buttoned .oo-ui-buttonWidget,
 .oo-ui-numberInputWidget-buttoned .oo-ui-textInputWidget {
   display: table-cell;
+  height: 100%;
+}
+.oo-ui-numberInputWidget-buttoned .oo-ui-textInputWidget input {
+  height: 100%;
 }
 .oo-ui-numberInputWidget-field {
   display: table;
index d1fbe0d..c2e62fd 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.19.5
+ * OOjs UI v0.20.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-07T22:57:01Z
+ * Date: 2017-03-15T17:06:24Z
  */
 ( function ( OO ) {
 
@@ -2739,6 +2739,14 @@ OO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.mixin.TitledElement );
 OO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.mixin.FlaggedElement );
 OO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.mixin.TabIndexedElement );
 
+/* Static Properties */
+
+/**
+ * @static
+ * @inheritdoc
+ */
+OO.ui.ToggleButtonWidget.static.tagName = 'span';
+
 /* Methods */
 
 /**
@@ -3969,7 +3977,7 @@ OO.ui.CapsuleMultiselectWidget.prototype.addItems = function ( items ) {
        }
        if ( !same ) {
                this.emit( 'change', this.getItemsData() );
-               this.updateIfHeightChanged();
+               this.updateInputSize();
        }
 
        return this;
@@ -4009,7 +4017,7 @@ OO.ui.CapsuleMultiselectWidget.prototype.removeItems = function ( items ) {
        }
        if ( !same ) {
                this.emit( 'change', this.getItemsData() );
-               this.updateIfHeightChanged();
+               this.updateInputSize();
        }
 
        return this;
@@ -4022,7 +4030,7 @@ OO.ui.CapsuleMultiselectWidget.prototype.clearItems = function () {
        if ( this.items.length ) {
                OO.ui.mixin.GroupElement.prototype.clearItems.call( this );
                this.emit( 'change', this.getItemsData() );
-               this.updateIfHeightChanged();
+               this.updateInputSize();
        }
        return this;
 };
@@ -4235,6 +4243,7 @@ OO.ui.CapsuleMultiselectWidget.prototype.updateInputSize = function () {
                currentWidth = this.$input.width();
 
                if ( contentWidth < currentWidth ) {
+                       this.updateIfHeightChanged();
                        // All is fine, don't perform expensive calculations
                        return;
                }
@@ -4256,6 +4265,8 @@ OO.ui.CapsuleMultiselectWidget.prototype.updateInputSize = function () {
                }
                this.$input.width( Math.floor( bestWidth ) );
                this.updateIfHeightChanged();
+       } else {
+               this.updateIfHeightChanged();
        }
 };
 
@@ -4376,23 +4387,6 @@ OO.ui.CapsuleMultiselectWidget.prototype.focus = function () {
        return this;
 };
 
-/**
- * The old name for the CapsuleMultiselectWidget widget, provided for backwards-compatibility.
- *
- * @class
- * @extends OO.ui.CapsuleMultiselectWidget
- *
- * @constructor
- * @deprecated since 0.17.3; use OO.ui.CapsuleMultiselectWidget instead
- */
-OO.ui.CapsuleMultiSelectWidget = function OoUiCapsuleMultiSelectWidget() {
-       OO.ui.warnDeprecation( 'CapsuleMultiSelectWidget is deprecated. Use the CapsuleMultiselectWidget instead.' );
-       // Parent constructor
-       OO.ui.CapsuleMultiSelectWidget.parent.apply( this, arguments );
-};
-
-OO.inheritClass( OO.ui.CapsuleMultiSelectWidget, OO.ui.CapsuleMultiselectWidget );
-
 /**
  * SelectFileWidgets allow for selecting files, using the HTML5 File API. These
  * widgets can be configured with {@link OO.ui.mixin.IconElement icons} and {@link
index 4353b43..17caa33 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.19.5
+ * OOjs UI v0.20.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-07T22:57:06Z
+ * Date: 2017-03-15T17:06:28Z
  */
 .oo-ui-actionWidget.oo-ui-pendingElement-pending {
   background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
   color: #000;
 }
 .oo-ui-messageDialog-message {
-  font-size: 0.9em;
-  line-height: 1.25em;
-  color: #666;
-}
-.oo-ui-messageDialog-message-verbose {
   font-size: 1.1em;
   line-height: 1.5em;
+  color: #666;
   text-align: left;
 }
 .oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
index 823b1a1..0530610 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.19.5
+ * OOjs UI v0.20.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-07T22:57:06Z
+ * Date: 2017-03-15T17:06:28Z
  */
 .oo-ui-window {
   background: transparent;
   color: #000;
 }
 .oo-ui-messageDialog-message {
-  font-size: 0.9em;
-  line-height: 1.25;
-  color: #222;
-}
-.oo-ui-messageDialog-message-verbose {
   font-size: 1.1em;
   line-height: 1.4;
+  color: #222;
   text-align: left;
 }
 .oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
   border-bottom-width: 0;
 }
 .oo-ui-messageDialog-actions .oo-ui-actionWidget {
-  min-height: 3.4em;
+  min-height: 3.4375em;
   margin-right: 0;
 }
 .oo-ui-messageDialog-actions .oo-ui-actionWidget:last-child {
   border-radius: 0;
 }
 .oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
-  line-height: 3.4;
+  line-height: 3.4375em;
   text-align: center;
 }
 .oo-ui-messageDialog-actions .oo-ui-actionWidget:hover {
   overflow-y: auto;
 }
 .oo-ui-processDialog-content .oo-ui-window-head {
-  height: 3.4em;
+  height: 3.4375em;
 }
 .oo-ui-processDialog-content .oo-ui-window-body {
-  top: 3.4em;
-  outline: 1px solid rgba(0, 0, 0, 0.2);
+  top: 3.4375em;
+  outline: 1px solid #c8ccd1;
 }
 .oo-ui-processDialog-navigation {
   position: relative;
-  height: 3.4em;
-  padding: 0 1em;
+  height: 3.4375em;
 }
 .oo-ui-processDialog-location {
-  padding: 0.75em 0;
-  height: 1.875em;
+  height: 3.4375em;
   cursor: default;
   text-align: center;
 }
 .oo-ui-processDialog-title {
   font-weight: bold;
-  line-height: 1.875em;
+  line-height: 3.4375em;
 }
 .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed,
 .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed,
 .oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-framed {
-  margin: 0.5em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-frameless {
-  margin: 0;
+  margin: 0.46875em;
 }
 .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless .oo-ui-buttonElement-button,
 .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless .oo-ui-buttonElement-button,
   top: 1em;
   bottom: 1em;
   max-height: 100%;
-  max-height: calc(100% - 2em);
+  max-height: calc( 100% - 2em );
   border: 1px solid #a2a9b1;
   border-radius: 2px;
   box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.25);
index 586efb0..ab78a4a 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.19.5
+ * OOjs UI v0.20.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-07T22:57:01Z
+ * Date: 2017-03-15T17:06:24Z
  */
 ( function ( OO ) {
 
@@ -118,7 +118,10 @@ OO.ui.ActionWidget.prototype.propagateResize = function () {
                if ( width !== this.width || height !== this.height ) {
                        this.width = width;
                        this.height = height;
-                       this.emit( 'resize' );
+                       this.emit( 'resizePrivate' );
+                       if ( this.emit( 'resize' ) ) {
+                               OO.ui.warnDeprecation( 'ActionWidget: resize event is deprecated. See T129162.' );
+                       }
                }
        }
 
@@ -561,9 +564,13 @@ OO.ui.ActionSet.prototype.add = function ( actions ) {
                action = actions[ i ];
                action.connect( this, {
                        click: [ 'emit', 'click', action ],
-                       resize: [ 'emit', 'resize', action ],
                        toggle: [ 'onActionChange' ]
                } );
+               action.on( 'resizePrivate', function ( action ) {
+                       if ( this.emit( 'resize', action ) ) {
+                               OO.ui.warnDeprecation( 'ActionSet: resize event is deprecated. See T129162.' );
+                       }
+               }, [ action ], this );
                this.list.push( action );
        }
        this.organized = false;
@@ -2733,12 +2740,6 @@ OO.ui.MessageDialog.static.name = 'message';
  */
 OO.ui.MessageDialog.static.size = 'small';
 
-/**
- * @static
- * @deprecated since v0.18.4 as default; TODO: Remove
- */
-OO.ui.MessageDialog.static.verbose = true;
-
 /**
  * Dialog title.
  *
@@ -2856,11 +2857,6 @@ OO.ui.MessageDialog.prototype.getSetupProcess = function ( data ) {
                        this.message.setLabel(
                                data.message !== undefined ? data.message : this.constructor.static.message
                        );
-                       // @deprecated since v0.18.4 as default; TODO: Remove and make default instead.
-                       this.message.$element.toggleClass(
-                               'oo-ui-messageDialog-message-verbose',
-                               data.verbose !== undefined ? data.verbose : this.constructor.static.verbose
-                       );
                }, this );
 };
 
index ec18f29..5b6ac3c 100644 (file)
@@ -9,8 +9,6 @@
        },
        "images": {
                "add": { "file": "images/icons/add.svg" },
-               "beta": { "file": "images/icons/beta.svg", "deprecated": "Deprecated since v0.18.3, don't use." },
-               "betaLaunch": { "file": "images/icons/logo-wikimediaDiscovery.svg", "deprecated": "Moved since v0.18.3, use 'logoWikimediaDiscovery' from the 'Wikimedia' pack instead." },
                "bookmark": { "file": {
                        "ltr": "images/icons/bookmark-ltr.svg",
                        "rtl": "images/icons/bookmark-rtl.svg"
@@ -50,7 +48,6 @@
                        "ltr": "images/icons/printer-ltr.svg",
                        "rtl": "images/icons/printer-rtl.svg"
                } },
-               "ribbonPrize": { "file": "images/icons/ribbonPrize.svg", "deprecated": "Deprecated since v0.18.3, don't use." },
                "subtract": { "file": "images/icons/subtract.svg" },
                "sun": { "file": {
                        "ltr": "images/icons/sun-ltr.svg",
index c8385e4..b32ffbb 100644 (file)
@@ -3,10 +3,6 @@
        "intro": "@import '../../../../src/styles/common';",
        "images": {
                "block": { "file": "images/icons/block.svg" },
-               "blockUndo": { "file": {
-                       "ltr": "images/icons/unBlock-ltr.svg",
-                       "rtl": "images/icons/unBlock-rtl.svg"
-               }, "deprecated": "Renamed since v0.18.3, use 'unBlock' instead." },
                "unBlock": { "file": {
                        "ltr": "images/icons/unBlock-ltr.svg",
                        "rtl": "images/icons/unBlock-rtl.svg"
                        "ltr": "images/icons/flag-ltr.svg",
                        "rtl": "images/icons/flag-rtl.svg"
                } },
-               "flagUndo": { "file": {
-                       "ltr": "images/icons/unFlag-ltr.svg",
-                       "rtl": "images/icons/unFlag-rtl.svg"
-               }, "deprecated": "Renamed since v0.18.3, use 'unFlag' instead." },
                "unFlag": { "file": {
                        "ltr": "images/icons/unFlag-ltr.svg",
                        "rtl": "images/icons/unFlag-rtl.svg"
                        "ltr": "images/icons/unTrash-ltr.svg",
                        "rtl": "images/icons/unTrash-rtl.svg"
                } },
-               "trashUndo": { "file": {
-                       "ltr": "images/icons/unTrash-ltr.svg",
-                       "rtl": "images/icons/unTrash-rtl.svg"
-               }, "deprecated": "Renamed since v0.18.3, use 'unTrash' instead." },
                "ongoingConversation": {
                        "file": {
                                "ltr": "images/icons/ongoingConversation-ltr.svg",
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/beta-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/beta-invert.png
deleted file mode 100644 (file)
index c3b26b8..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/beta-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/beta-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/beta-invert.svg
deleted file mode 100644 (file)
index a140a5a..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#FFFFFF">
-    <path d="M12 4c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm4 12l-3-2-1 4-1-4-3 2 2-3-4-1 4-1-2-3 3 2 1-4 1 4 3-2-2 3 4 1-4 1 2 3z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/beta.png b/resources/lib/oojs-ui/themes/apex/images/icons/beta.png
deleted file mode 100644 (file)
index 7b31e1e..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/beta.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/beta.svg b/resources/lib/oojs-ui/themes/apex/images/icons/beta.svg
deleted file mode 100644 (file)
index 51a5c78..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M12 4c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm4 12l-3-2-1 4-1-4-3 2 2-3-4-1 4-1-2-3 3 2 1-4 1 4 3-2-2 3 4 1-4 1 2 3z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery-invert.png
deleted file mode 100644 (file)
index 0963538..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery-invert.svg
deleted file mode 100644 (file)
index 971ac48..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#FFFFFF">
-    <path d="M15.3 14.7C16.1 10.9 14.7 4 12 4c-2.7 0-4.2 6.7-3.4 10.5L7 18h2.7l.3 1h4c.2-.3.1-.5.3-1H17l-1.7-3.3zM12 10c-.8 0-1.5-.7-1.5-1.5S11.2 7 12 7s1.5.7 1.5 1.5S12.8 10 12 10zm2 10c0 1.1-2 2-2 2s-2-.9-2-2"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery.png b/resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery.png
deleted file mode 100644 (file)
index 6d3c067..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery.svg b/resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery.svg
deleted file mode 100644 (file)
index c3f99d6..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M15.3 14.7C16.1 10.9 14.7 4 12 4c-2.7 0-4.2 6.7-3.4 10.5L7 18h2.7l.3 1h4c.2-.3.1-.5.3-1H17l-1.7-3.3zM12 10c-.8 0-1.5-.7-1.5-1.5S11.2 7 12 7s1.5.7 1.5 1.5S12.8 10 12 10zm2 10c0 1.1-2 2-2 2s-2-.9-2-2"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize-invert.png
deleted file mode 100644 (file)
index 46a180d..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize-invert.svg
deleted file mode 100644 (file)
index 578f12b..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#FFFFFF">
-    <circle cx="11.5" cy="8.5" r="2.5"/>
-    <path d="M16.3 8.7L17 8l-.8-.8.4-.8-1.1-.5.1-.9-1.2-.2-.1-.9-1.2.2-.4-.8-1.1.5L11 3l-.8.8-.9-.4-.5 1.1-.9-.2-.2 1.2-.9.2.2 1.2-.9.4.5 1.1L6 9l.8.8-.4.8 1.1.5-.1.9 1.2.2.1.9 1.2-.2.4.8 1.1-.5.6.8.8-.8.8.4.5-1.1.9.1.2-1.2.9-.1-.2-1.2.8-.4-.4-1zM11.5 12C9.6 12 8 10.4 8 8.5S9.6 5 11.5 5 15 6.6 15 8.5 13.4 12 11.5 12zm.5 3l-.7-.7-1.1.6-.4-.7-.8.3V23l2.5-3 2.5 3v-8.5l-1-.5z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize.png b/resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize.png
deleted file mode 100644 (file)
index 1010574..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize.svg b/resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize.svg
deleted file mode 100644 (file)
index 45df8b7..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <circle cx="11.5" cy="8.5" r="2.5"/>
-    <path d="M16.3 8.7L17 8l-.8-.8.4-.8-1.1-.5.1-.9-1.2-.2-.1-.9-1.2.2-.4-.8-1.1.5L11 3l-.8.8-.9-.4-.5 1.1-.9-.2-.2 1.2-.9.2.2 1.2-.9.4.5 1.1L6 9l.8.8-.4.8 1.1.5-.1.9 1.2.2.1.9 1.2-.2.4.8 1.1-.5.6.8.8-.8.8.4.5-1.1.9.1.2-1.2.9-.1-.2-1.2.8-.4-.4-1zM11.5 12C9.6 12 8 10.4 8 8.5S9.6 5 11.5 5 15 6.6 15 8.5 13.4 12 11.5 12zm.5 3l-.7-.7-1.1.6-.4-.7-.8.3V23l2.5-3 2.5 3v-8.5l-1-.5z"/>
-</svg>
index 827a72e..f693e3f 100644 (file)
@@ -23,8 +23,6 @@
        },
        "images": {
                "add": { "file": "images/icons/add.svg", "variants": [ "constructive", "progressive" ] },
-               "beta": { "file": "images/icons/beta.svg", "deprecated": "Deprecated since v0.18.3, don't use." },
-               "betaLaunch": { "file": "images/icons/logo-wikimediaDiscovery.svg", "deprecated": "Moved since v0.18.3, use 'logoWikimediaDiscovery' from the 'Wikimedia' pack instead." },
                "bookmark": { "file": {
                        "ltr": "images/icons/bookmark-ltr.svg",
                        "rtl": "images/icons/bookmark-rtl.svg"
@@ -67,7 +65,6 @@
                        "ltr": "images/icons/printer-ltr.svg",
                        "rtl": "images/icons/printer-rtl.svg"
                } },
-               "ribbonPrize": { "file": "images/icons/ribbonPrize.svg", "deprecated": "Deprecated since v0.18.3, don't use." },
                "subtract": { "file": "images/icons/subtract.svg" },
                "sun": { "file": {
                        "ltr": "images/icons/sun-ltr.svg",
index b4acff1..0a1ccd7 100644 (file)
        },
        "images": {
                "block": { "file": "images/icons/block.svg", "variants": [ "destructive" ] },
-               "blockUndo": { "file": {
-                       "ltr": "images/icons/unBlock-ltr.svg",
-                       "rtl": "images/icons/unBlock-rtl.svg"
-               }, "deprecated": "Renamed since v0.18.3, use 'unBlock' instead." },
                "unBlock": { "file": {
                        "ltr": "images/icons/unBlock-ltr.svg",
                        "rtl": "images/icons/unBlock-rtl.svg"
                        "ltr": "images/icons/unFlag-ltr.svg",
                        "rtl": "images/icons/unFlag-rtl.svg"
                } },
-               "flagUndo": { "file": {
-                       "ltr": "images/icons/unFlag-ltr.svg",
-                       "rtl": "images/icons/unFlag-rtl.svg"
-               }, "deprecated": "Renamed since v0.18.3, use 'unFlag' instead." },
                "lock": { "file": {
                        "ltr": "images/icons/lock-ltr.svg",
                        "rtl": "images/icons/lock-rtl.svg"
                        "ltr": "images/icons/unTrash-ltr.svg",
                        "rtl": "images/icons/unTrash-rtl.svg"
                } },
-               "trashUndo": { "file": {
-                       "ltr": "images/icons/unTrash-ltr.svg",
-                       "rtl": "images/icons/unTrash-rtl.svg"
-               }, "deprecated": "Renamed since v0.18.3, use 'unTrash' instead." },
                "ongoingConversation": {
                        "file": {
                                "ltr": "images/icons/ongoingConversation-ltr.svg",
index 14f6b18..3bdecff 100644 (file)
                "progressive": {
                        "color": "#36c",
                        "global": true
-               },
-               "constructive": {
-                       "color": "#36c"
-               },
-               "destructive": {
-                       "color": "#d33"
-               },
-               "warning": {
-                       "color": "#ff5d00"
                }
        },
        "images": {
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-invert.png
deleted file mode 100644 (file)
index c3b26b8..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-invert.svg
deleted file mode 100644 (file)
index eca628f..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
-    <path d="M12 4c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm4 12l-3-2-1 4-1-4-3 2 2-3-4-1 4-1-2-3 3 2 1-4 1 4 3-2-2 3 4 1-4 1 2 3z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-progressive.png
deleted file mode 100644 (file)
index 4c67bac..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-progressive.svg
deleted file mode 100644 (file)
index ba896ef..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
-    <path d="M12 4c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm4 12l-3-2-1 4-1-4-3 2 2-3-4-1 4-1-2-3 3 2 1-4 1 4 3-2-2 3 4 1-4 1 2 3z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta.png
deleted file mode 100644 (file)
index 7b31e1e..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta.svg
deleted file mode 100644 (file)
index 51a5c78..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M12 4c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm4 12l-3-2-1 4-1-4-3 2 2-3-4-1 4-1-2-3 3 2 1-4 1 4 3-2-2 3 4 1-4 1 2 3z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-invert.png
deleted file mode 100644 (file)
index 46a180d..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-invert.svg
deleted file mode 100644 (file)
index 640d263..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
-    <circle cx="11.5" cy="8.5" r="2.5"/>
-    <path d="M16.3 8.7L17 8l-.8-.8.4-.8-1.1-.5.1-.9-1.2-.2-.1-.9-1.2.2-.4-.8-1.1.5L11 3l-.8.8-.9-.4-.5 1.1-.9-.2-.2 1.2-.9.2.2 1.2-.9.4.5 1.1L6 9l.8.8-.4.8 1.1.5-.1.9 1.2.2.1.9 1.2-.2.4.8 1.1-.5.6.8.8-.8.8.4.5-1.1.9.1.2-1.2.9-.1-.2-1.2.8-.4-.4-1zM11.5 12C9.6 12 8 10.4 8 8.5S9.6 5 11.5 5 15 6.6 15 8.5 13.4 12 11.5 12zm.5 3l-.7-.7-1.1.6-.4-.7-.8.3V23l2.5-3 2.5 3v-8.5l-1-.5z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-progressive.png
deleted file mode 100644 (file)
index 79effe1..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-progressive.svg
deleted file mode 100644 (file)
index c0aa287..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
-    <circle cx="11.5" cy="8.5" r="2.5"/>
-    <path d="M16.3 8.7L17 8l-.8-.8.4-.8-1.1-.5.1-.9-1.2-.2-.1-.9-1.2.2-.4-.8-1.1.5L11 3l-.8.8-.9-.4-.5 1.1-.9-.2-.2 1.2-.9.2.2 1.2-.9.4.5 1.1L6 9l.8.8-.4.8 1.1.5-.1.9 1.2.2.1.9 1.2-.2.4.8 1.1-.5.6.8.8-.8.8.4.5-1.1.9.1.2-1.2.9-.1-.2-1.2.8-.4-.4-1zM11.5 12C9.6 12 8 10.4 8 8.5S9.6 5 11.5 5 15 6.6 15 8.5 13.4 12 11.5 12zm.5 3l-.7-.7-1.1.6-.4-.7-.8.3V23l2.5-3 2.5 3v-8.5l-1-.5z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize.png
deleted file mode 100644 (file)
index 1010574..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize.svg
deleted file mode 100644 (file)
index 45df8b7..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <circle cx="11.5" cy="8.5" r="2.5"/>
-    <path d="M16.3 8.7L17 8l-.8-.8.4-.8-1.1-.5.1-.9-1.2-.2-.1-.9-1.2.2-.4-.8-1.1.5L11 3l-.8.8-.9-.4-.5 1.1-.9-.2-.2 1.2-.9.2.2 1.2-.9.4.5 1.1L6 9l.8.8-.4.8 1.1.5-.1.9 1.2.2.1.9 1.2-.2.4.8 1.1-.5.6.8.8-.8.8.4.5-1.1.9.1.2-1.2.9-.1-.2-1.2.8-.4-.4-1zM11.5 12C9.6 12 8 10.4 8 8.5S9.6 5 11.5 5 15 6.6 15 8.5 13.4 12 11.5 12zm.5 3l-.7-.7-1.1.6-.4-.7-.8.3V23l2.5-3 2.5 3v-8.5l-1-.5z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/alert-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/alert-progressive.png
deleted file mode 100644 (file)
index fa85ac3..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/alert-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/alert-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/alert-progressive.svg
deleted file mode 100644 (file)
index 900e477..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#36c">
-    <path d="M6 12A6 6 0 1 1 6 0a6 6 0 0 1 0 12zM5 7h2V2H5zm0 3h2V8H5z" id="alert"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-progressive.png
deleted file mode 100644 (file)
index 3539c88..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-progressive.svg
deleted file mode 100644 (file)
index 511359a..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#36c">
-    <g id="down">
-        <path id="arrow" d="M1 4h10L6 9 1 4"/>
-    </g>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-progressive.png
deleted file mode 100644 (file)
index 7d50f19..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-progressive.svg
deleted file mode 100644 (file)
index fc6cb9a..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#36c">
-    <g id="ltr">
-        <path id="arrow" d="M4 1v10l5-5-5-5"/>
-    </g>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-progressive.png
deleted file mode 100644 (file)
index 27bfa29..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-progressive.svg
deleted file mode 100644 (file)
index 8f1a254..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#36c">
-    <g id="rtl">
-        <path id="arrow" d="M8 11V1L3 6l5 5"/>
-    </g>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-progressive.png
deleted file mode 100644 (file)
index 521e438..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-progressive.svg
deleted file mode 100644 (file)
index 4e9221a..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#36c">
-    <g id="up">
-        <path id="arrow" d="M1 8h10L6 3 1 8"/>
-    </g>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear-progressive.png
deleted file mode 100644 (file)
index 325dbeb..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear-progressive.svg
deleted file mode 100644 (file)
index 4ea1013..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#36c">
-    <g id="clear">
-        <path id="circle-with-cross" d="M6 0C2.7 0 0 2.7 0 6s2.7 6 6 6 6-2.7 6-6-2.7-6-6-6zM3.5 2.5L6 5l2.5-2.5 1 1L7 6l2.5 2.5-1 1L6 7 3.5 9.5l-1-1L5 6 2.5 3.5z"/>
-    </g>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/required-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/required-progressive.png
deleted file mode 100644 (file)
index 01e84e6..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/required-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/required-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/required-progressive.svg
deleted file mode 100644 (file)
index ab95a3d..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#36c">
-    <path d="M5 1h2v10H5zm4.83 1.634l1 1.732-8.66 5-1-1.732zM1.17 4.366l1-1.732 8.66 5-1 1.732z" id="required"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr-progressive.png
deleted file mode 100644 (file)
index 84c7dbc..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr-progressive.svg
deleted file mode 100644 (file)
index 5e8e395..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#36c">
-    <g id="search">
-        <path id="magnifying-glass" d="M10.37 9.474L7.994 7.1l-.17-.1a3.45 3.45 0 0 0 .644-2.01A3.478 3.478 0 1 0 4.99 8.47c.75 0 1.442-.24 2.01-.648l.098.17 2.375 2.373c.19.188.543.142.79-.105s.293-.6.104-.79zm-5.38-2.27a2.21 2.21 0 1 1 2.21-2.21A2.21 2.21 0 0 1 4.99 7.21z"/>
-    </g>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl-progressive.png
deleted file mode 100644 (file)
index 0207a8b..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl-progressive.svg
deleted file mode 100644 (file)
index 015d02e..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#36c">
-    <g id="search">
-        <path id="magnifying-glass" d="M1.63 9.474L4.006 7.1l.17-.1a3.45 3.45 0 0 1-.644-2.01A3.478 3.478 0 1 1 7.01 8.47 3.43 3.43 0 0 1 5 7.822l-.098.17-2.375 2.373c-.19.188-.543.142-.79-.105s-.293-.6-.104-.79zm5.378-2.27A2.21 2.21 0 1 0 4.8 4.994 2.21 2.21 0 0 0 7.01 7.21z"/>
-    </g>
-</g></svg>
index 91d0358..df32417 100644 (file)
@@ -8,8 +8,7 @@
                        "global": true
                },
                "progressive": {
-                       "color": "#36c",
-                       "global": true
+                       "color": "#36c"
                },
                "constructive": {
                        "color": "#36c"
diff --git a/resources/src/jquery/images/jquery.arrowSteps.divider-ltr.png b/resources/src/jquery/images/jquery.arrowSteps.divider-ltr.png
deleted file mode 100644 (file)
index 84ed2a2..0000000
Binary files a/resources/src/jquery/images/jquery.arrowSteps.divider-ltr.png and /dev/null differ
diff --git a/resources/src/jquery/images/jquery.arrowSteps.divider-rtl.png b/resources/src/jquery/images/jquery.arrowSteps.divider-rtl.png
deleted file mode 100644 (file)
index c212aeb..0000000
Binary files a/resources/src/jquery/images/jquery.arrowSteps.divider-rtl.png and /dev/null differ
diff --git a/resources/src/jquery/images/jquery.arrowSteps.head-ltr.png b/resources/src/jquery/images/jquery.arrowSteps.head-ltr.png
deleted file mode 100644 (file)
index e6546bf..0000000
Binary files a/resources/src/jquery/images/jquery.arrowSteps.head-ltr.png and /dev/null differ
diff --git a/resources/src/jquery/images/jquery.arrowSteps.head-rtl.png b/resources/src/jquery/images/jquery.arrowSteps.head-rtl.png
deleted file mode 100644 (file)
index 2af30b9..0000000
Binary files a/resources/src/jquery/images/jquery.arrowSteps.head-rtl.png and /dev/null differ
diff --git a/resources/src/jquery/images/jquery.arrowSteps.tail-ltr.png b/resources/src/jquery/images/jquery.arrowSteps.tail-ltr.png
deleted file mode 100644 (file)
index 3ad990b..0000000
Binary files a/resources/src/jquery/images/jquery.arrowSteps.tail-ltr.png and /dev/null differ
diff --git a/resources/src/jquery/images/jquery.arrowSteps.tail-rtl.png b/resources/src/jquery/images/jquery.arrowSteps.tail-rtl.png
deleted file mode 100644 (file)
index 1d3048e..0000000
Binary files a/resources/src/jquery/images/jquery.arrowSteps.tail-rtl.png and /dev/null differ
diff --git a/resources/src/jquery/jquery.arrowSteps.css b/resources/src/jquery/jquery.arrowSteps.css
deleted file mode 100644 (file)
index 92c6c43..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-.arrowSteps {
-       list-style-type: none;
-       list-style-image: none;
-       border: 1px solid #666;
-       position: relative;
-}
-
-.arrowSteps li {
-       float: left;
-       padding: 0;
-       margin: 0;
-       border: 0;
-}
-
-.arrowSteps li div {
-       padding: 0.5em;
-       text-align: center;
-       white-space: nowrap;
-       overflow: hidden;
-}
-
-.arrowSteps li.arrow div {
-       /* @embed */
-       background: url( images/jquery.arrowSteps.divider-ltr.png ) no-repeat right center;
-}
-
-/* applied to the element preceding the highlighted step */
-.arrowSteps li.arrow.tail div {
-       /* @embed */
-       background: url( images/jquery.arrowSteps.tail-ltr.png ) no-repeat right center;
-}
-
-/* this applies to all highlighted, including the last */
-.arrowSteps li.head div {
-       /* @embed */
-       background: url( images/jquery.arrowSteps.head-ltr.png ) no-repeat left center;
-       font-weight: bold;
-}
-
-/* this applies to all highlighted arrows except the last */
-.arrowSteps li.arrow.head div {
-       /* TODO: eliminate duplication of jquery.arrowSteps.head.png embedding */
-       /* @embed */
-       background: url( images/jquery.arrowSteps.head-ltr.png ) no-repeat right center;
-}
diff --git a/resources/src/jquery/jquery.arrowSteps.js b/resources/src/jquery/jquery.arrowSteps.js
deleted file mode 100644 (file)
index b0c36c6..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-/*!
- * jQuery arrowSteps plugin
- * Copyright Neil Kandalgaonkar, 2010
- *
- * This work is licensed under the terms of the GNU General Public License,
- * version 2 or later.
- * (see http://www.fsf.org/licensing/licenses/gpl.html).
- * Derivative works and later versions of the code must be free software
- * licensed under the same or a compatible license.
- */
-
-/**
- * @class jQuery.plugin.arrowSteps
- */
-( function ( $ ) {
-       /**
-        * Show users their progress through a series of steps, via a row of items that fit
-        * together like arrows. One item can be highlighted at a time.
-        *
-        *     <ul id="robin-hood-daffy">
-        *       <li id="guard"><div>Guard!</div></li>
-        *       <li id="turn"><div>Turn!</div></li>
-        *       <li id="parry"><div>Parry!</div></li>
-        *       <li id="dodge"><div>Dodge!</div></li>
-        *       <li id="spin"><div>Spin!</div></li>
-        *       <li id="ha"><div>Ha!</div></li>
-        *       <li id="thrust"><div>Thrust!</div></li>
-        *     </ul>
-        *
-        *     <script>
-        *       $( '#robin-hood-daffy' ).arrowSteps();
-        *     </script>
-        *
-        * @return {jQuery}
-        * @chainable
-        */
-       $.fn.arrowSteps = function () {
-               var $steps, width, arrowWidth, $stepDiv,
-                       $el = this,
-                       paddingSide = $( 'body' ).hasClass( 'rtl' ) ? 'padding-left' : 'padding-right';
-
-               $el.addClass( 'arrowSteps' );
-               $steps = $el.find( 'li' );
-
-               width = parseInt( 100 / $steps.length, 10 );
-               $steps.css( 'width', width + '%' );
-
-               // Every step except the last one has an arrow pointing forward:
-               // at the right hand side in LTR languages, and at the left hand side in RTL.
-               // Also add in the padding for the calculated arrow width.
-               $stepDiv = $steps.filter( ':not(:last-child)' ).addClass( 'arrow' ).find( 'div' );
-
-               // Execute when complete page is fully loaded, including all frames, objects and images
-               $( window ).on( 'load', function () {
-                       arrowWidth = parseInt( $el.outerHeight(), 10 );
-                       $stepDiv.css( paddingSide, arrowWidth.toString() + 'px' );
-               } );
-
-               $el.data( 'arrowSteps', $steps );
-
-               return this;
-       };
-
-       /**
-        * Highlights the element selected by the selector.
-        *
-        *       $( '#robin-hood-daffy' ).arrowStepsHighlight( '#guard' );
-        *       // 'Guard!' is highlighted.
-        *
-        *       // ... user completes the 'guard' step ...
-        *
-        *       $( '#robin-hood-daffy' ).arrowStepsHighlight( '#turn' );
-        *       // 'Turn!' is highlighted.
-        *
-        * @param {string} selector
-        */
-       $.fn.arrowStepsHighlight = function ( selector ) {
-               var $previous,
-                       $steps = this.data( 'arrowSteps' );
-               $.each( $steps, function ( i, step ) {
-                       var $step = $( step );
-                       if ( $step.is( selector ) ) {
-                               if ( $previous ) {
-                                       $previous.addClass( 'tail' );
-                               }
-                               $step.addClass( 'head' );
-                       } else {
-                               $step.removeClass( 'head tail lasthead' );
-                       }
-                       $previous = $step;
-               } );
-       };
-
-       /**
-        * @class jQuery
-        * @mixins jQuery.plugin.arrowSteps
-        */
-}( jQuery ) );
index 70dc105..847afd4 100644 (file)
@@ -16,7 +16,7 @@
                        color = $.css( elem, attr );
 
                        // Keep going until we find an element that has color, or we hit the body
-                       if ( color !== '' && color !== 'transparent' || $.nodeName( elem, 'body' ) ) {
+                       if ( color !== '' && color !== 'transparent' || elem.nodeName.toLowerCase() === 'body' ) {
                                break;
                        }
 
index eef3846..7296811 100644 (file)
                        if (
                                e.type === 'click' &&
                                options.linksPassthru &&
-                               $.nodeName( e.target, 'a' ) &&
+                               e.target.nodeName.toLowerCase() === 'a' &&
                                $( e.target ).attr( 'href' ) &&
                                $( e.target ).attr( 'href' ) !== '#'
                        ) {
index 22323e8..3ec544c 100644 (file)
         * @cfg {boolean} [active] Group is active
         * @cfg {boolean} [fullCoverage] This filters in this group collectively cover all results
         * @cfg {Object} [conflicts] Defines the conflicts for this filter group
+        * @cfg {Object} [whatsThis] Defines the messages that should appear for the 'what's this' popup
+        * @cfg {string} [whatsThis.header] The header of the whatsThis popup message
+        * @cfg {string} [whatsThis.body] The body of the whatsThis popup message
+        * @cfg {string} [whatsThis.url] The url for the link in the whatsThis popup message
+        * @cfg {string} [whatsThis.linkMessage] The text for the link in the whatsThis popup message
         */
        mw.rcfilters.dm.FilterGroup = function MwRcfiltersDmFilterGroup( name, config ) {
                config = config || {};
@@ -30,6 +35,8 @@
                this.active = !!config.active;
                this.fullCoverage = !!config.fullCoverage;
 
+               this.whatsThis = config.whatsThis || {};
+
                this.conflicts = config.conflicts || {};
 
                this.aggregate( { update: 'filterItemUpdate' } );
                return this.name;
        };
 
+       /**
+        * Get the messags defining the 'whats this' popup for this group
+        *
+        * @return {Object} What's this messages
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.getWhatsThis = function () {
+               return this.whatsThis;
+       };
+
+       /**
+        * Check whether this group has a 'what's this' message
+        *
+        * @return {boolean} This group has a what's this message
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.hasWhatsThis = function () {
+               return !!this.whatsThis.body;
+       };
+
        /**
         * Get the conflicts associated with the entire group.
         * Conflict object is set up by filter name keys and conflict
                );
        };
 
+       /**
+        * Get the parameter representation from this group
+        *
+        * @return {Object} Parameter representation
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.getParamRepresentation = function () {
+               var i, values,
+                       result = {},
+                       filterItems = this.getItems();
+
+               if ( this.getType() === 'send_unselected_if_any' ) {
+                       // First, check if any of the items are selected at all.
+                       // If none is selected, we're treating it as if they are
+                       // all false
+
+                       // Go over the items and define the correct values
+                       for ( i = 0; i < filterItems.length; i++ ) {
+                               result[ filterItems[ i ].getParamName() ] = this.areAnySelected() ?
+                                       Number( !filterItems[ i ].isSelected() ) : 0;
+                       }
+
+               } else if ( this.getType() === 'string_options' ) {
+                       values = [];
+                       for ( i = 0; i < filterItems.length; i++ ) {
+                               if ( filterItems[ i ].isSelected() ) {
+                                       values.push( filterItems[ i ].getParamName() );
+                               }
+                       }
+
+                       result[ this.getName() ] = ( values.length === filterItems.length ) ?
+                               'all' : values.join( this.getSeparator() );
+               }
+
+               return result;
+       };
+
        /**
         * Get group type
         *
                return this.type;
        };
 
+       /**
+        * Get the prefix used for the filter names inside this group
+        *
+        * @return {string} Group prefix
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.getNamePrefix = function () {
+               return this.getName() + '__';
+       };
+
        /**
         * Get group's title
         *
index f162528..a066d9e 100644 (file)
@@ -5,7 +5,7 @@
         * @mixins OO.EventEmitter
         *
         * @constructor
-        * @param {string} name Filter name
+        * @param {string} param Filter param name
         * @param {mw.rcfilters.dm.FilterGroup} groupModel Filter group model
         * @param {Object} config Configuration object
         * @cfg {string} [group] The group this item belongs to
         * @cfg {Object} [conflicts] Defines the conflicts for this filter
         * @cfg {string} [cssClass] The class identifying the results that match this filter
         */
-       mw.rcfilters.dm.FilterItem = function MwRcfiltersDmFilterItem( name, groupModel, config ) {
+       mw.rcfilters.dm.FilterItem = function MwRcfiltersDmFilterItem( param, groupModel, config ) {
                config = config || {};
 
                // Mixin constructor
                OO.EventEmitter.call( this );
 
-               this.name = name;
+               this.param = param;
                this.groupModel = groupModel;
+               this.name = this.groupModel.getNamePrefix() + param;
 
                this.label = config.label || this.name;
                this.description = config.description;
                return this.name;
        };
 
+       /**
+        * Get the param name or value of this filter
+        *
+        * @return {string} Filter param name
+        */
+       mw.rcfilters.dm.FilterItem.prototype.getParamName = function () {
+               return this.param;
+       };
+
+       /**
+        * Get the message for the display area for the currently active conflict
+        *
+        * @return {string} Conflict result message key
+        */
+       mw.rcfilters.dm.FilterItem.prototype.getCurrentConflictResultMessage = function () {
+               var details = {};
+
+               // First look in filter's own conflicts
+               details = this.getConflictDetails( this.getOwnConflicts(), 'globalDescription' );
+               if ( !details.message ) {
+                       // Fall back onto conflicts in the group
+                       details = this.getConflictDetails( this.getGroupModel().getConflicts(), 'globalDescription' );
+               }
+
+               return details.message;
+       };
+
+       /**
+        * Get the details of the active conflict on this filter
+        *
+        * @param {Object} conflicts Conflicts to examine
+        * @param {string} [key='contextDescription'] Message key
+        * @return {Object} Object with conflict message and conflict items
+        * @return {string} return.message Conflict message
+        * @return {string[]} return.names Conflicting item labels
+        */
+       mw.rcfilters.dm.FilterItem.prototype.getConflictDetails = function ( conflicts, key ) {
+               var group,
+                       conflictMessage = '',
+                       itemLabels = [];
+
+               key = key || 'contextDescription';
+
+               $.each( conflicts, function ( filterName, conflict ) {
+                       if ( !conflict.item.isSelected() ) {
+                               return;
+                       }
+
+                       if ( !conflictMessage ) {
+                               conflictMessage = conflict[ key ];
+                               group = conflict.group;
+                       }
+
+                       if ( group === conflict.group ) {
+                               itemLabels.push( mw.msg( 'quotation-marks', conflict.item.getLabel() ) );
+                       }
+               } );
+
+               return {
+                       message: conflictMessage,
+                       names: itemLabels
+               };
+
+       };
+
+       /**
+        * Get the message representing the state of this model.
+        *
+        * @return {string} State message
+        */
+       mw.rcfilters.dm.FilterItem.prototype.getStateMessage = function () {
+               var messageKey, details, superset,
+                       affectingItems = [];
+
+               if ( this.isSelected() ) {
+                       if ( this.isConflicted() ) {
+                               // First look in filter's own conflicts
+                               details = this.getConflictDetails( this.getOwnConflicts() );
+                               if ( !details.message ) {
+                                       // Fall back onto conflicts in the group
+                                       details = this.getConflictDetails( this.getGroupModel().getConflicts() );
+                               }
+
+                               messageKey = details.message;
+                               affectingItems = details.names;
+                       } else if ( this.isIncluded() ) {
+                               superset = this.getSuperset();
+                               // For this message we need to collect the affecting superset
+                               affectingItems = this.getGroupModel().getSelectedItems( this )
+                                       .filter( function ( item ) {
+                                               return superset.indexOf( item.getName() ) !== -1;
+                                       } )
+                                       .map( function ( item ) {
+                                               return mw.msg( 'quotation-marks', item.getLabel() );
+                                       } );
+
+                               messageKey = 'rcfilters-state-message-subset';
+                       } else if ( this.isFullyCovered() ) {
+                               affectingItems = this.getGroupModel().getSelectedItems( this )
+                                       .map( function ( item ) {
+                                               return mw.msg( 'quotation-marks', item.getLabel() );
+                                       } );
+
+                               messageKey = 'rcfilters-state-message-fullcoverage';
+                       }
+               }
+
+               if ( messageKey ) {
+                       // Build message
+                       return mw.msg(
+                               messageKey,
+                               mw.language.listToText( affectingItems ),
+                               affectingItems.length
+                       );
+               }
+
+               // Display description
+               return this.getDescription();
+       };
+
        /**
         * Get the model of the group this filter belongs to
         *
        };
 
        /**
-        * Get filter conflicts
+        * Get all conflicts associated with this filter or its group
         *
         * Conflict object is set up by filter name keys and conflict
         * definition. For example:
         *              {
         *                      filterName: {
         *                              filter: filterName,
-        *                              group: group1
+        *                              group: group1,
+        *                              label: itemLabel,
+        *                              item: itemModel
         *                      }
         *                      filterName2: {
         *                              filter: filterName2,
         *                              group: group2
+        *                              label: itemLabel2,
+        *                              item: itemModel2
         *                      }
         *              }
         *
                return $.extend( {}, this.conflicts, this.getGroupModel().getConflicts() );
        };
 
+       /**
+        * Get the conflicts associated with this filter
+        *
+        * @return {Object} Filter conflicts
+        */
+       mw.rcfilters.dm.FilterItem.prototype.getOwnConflicts = function () {
+               return this.conflicts;
+       };
+
        /**
         * Set conflicts for this filter. See #getConflicts for the expected
         * structure of the definition.
                this.superset = superset || [];
        };
 
+       /**
+        * Set filter subset
+        *
+        * @param {string[]} subset Filter subset
+        */
+       mw.rcfilters.dm.FilterItem.prototype.setSubset = function ( subset ) {
+               this.subset = subset || [];
+       };
+
        /**
         * Check whether a filter exists in the subset list for this filter
         *
index 36fc4a7..f04cc85 100644 (file)
@@ -16,6 +16,7 @@
                this.defaultParams = {};
                this.defaultFiltersEmpty = null;
                this.highlightEnabled = false;
+               this.parameterMap = {};
 
                // Events
                this.aggregate( { update: 'filterItemUpdate' } );
                } );
        };
 
+       /**
+        * Get whether the model has any conflict in its items
+        *
+        * @return {boolean} There is a conflict
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.hasConflict = function () {
+               return this.getItems().some( function ( filterItem ) {
+                       return filterItem.isSelected() && filterItem.isConflicted();
+               } );
+       };
+
+       /**
+        * Get the first item with a current conflict
+        *
+        * @return {mw.rcfilters.dm.FilterItem} Conflicted item
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.getFirstConflictedItem = function () {
+               var conflictedItem;
+
+               $.each( this.getItems(), function ( index, filterItem ) {
+                       if ( filterItem.isSelected() && filterItem.isConflicted() ) {
+                               conflictedItem = filterItem;
+                               return false;
+                       }
+               } );
+
+               return conflictedItem;
+       };
+
        /**
         * Set filters and preserve a group relationship based on
         * the definition given by an object
         * @param {Array} filters Filter group definition
         */
        mw.rcfilters.dm.FiltersViewModel.prototype.initializeFilters = function ( filters ) {
-               var i, filterItem, selectedFilterNames, filterConflictResult, groupConflictResult,
+               var i, filterItem, selectedFilterNames, filterConflictResult, groupConflictResult, subsetNames,
                        model = this,
                        items = [],
                        supersetMap = {},
                        expandConflictDefinitions = function ( obj ) {
                                var result = {};
 
-                               $.each( obj, function ( group, conflicts ) {
-                                       var adjustedConflicts = {};
+                               $.each( obj, function ( key, conflicts ) {
+                                       var filterName,
+                                               adjustedConflicts = {};
+
                                        conflicts.forEach( function ( conflict ) {
+                                               var filter;
+
                                                if ( conflict.filter ) {
-                                                       adjustedConflicts[ conflict.filter ] = conflict;
+                                                       filterName = model.groups[ conflict.group ].getNamePrefix() + conflict.filter;
+                                                       filter = model.getItemByName( filterName );
+
+                                                       // Rename
+                                                       adjustedConflicts[ filterName ] = $.extend(
+                                                               {},
+                                                               conflict,
+                                                               {
+                                                                       filter: filterName,
+                                                                       item: filter
+                                                               }
+                                                       );
                                                } else {
                                                        // This conflict is for an entire group. Split it up to
                                                        // represent each filter
                                                        // Get the relevant group items
                                                        model.groups[ conflict.group ].getItems().forEach( function ( groupItem ) {
                                                                // Rebuild the conflict
-                                                               adjustedConflicts[ groupItem.getName() ] = $.extend( {}, conflict, { filter: groupItem.getName() } );
+                                                               adjustedConflicts[ groupItem.getName() ] = $.extend(
+                                                                       {},
+                                                                       conflict,
+                                                                       {
+                                                                               filter: groupItem.getName(),
+                                                                               item: groupItem
+                                                                       }
+                                                               );
                                                        } );
                                                }
                                        } );
 
-                                       result[ group ] = adjustedConflicts;
+                                       result[ key ] = adjustedConflicts;
                                } );
 
                                return result;
                                        type: data.type,
                                        title: mw.msg( data.title ),
                                        separator: data.separator,
-                                       fullCoverage: !!data.fullCoverage
+                                       fullCoverage: !!data.fullCoverage,
+                                       whatsThis: {
+                                               body: data.whatsThisBody,
+                                               header: data.whatsThisHeader,
+                                               linkText: data.whatsThisLinkText,
+                                               url: data.whatsThisUrl
+                                       }
                                } );
                        }
 
                                        group: group,
                                        label: mw.msg( data.filters[ i ].label ),
                                        description: mw.msg( data.filters[ i ].description ),
-                                       subset: data.filters[ i ].subset,
                                        cssClass: data.filters[ i ].cssClass
                                } );
 
-                               // For convenience, we should store each filter's "supersets" -- these are
-                               // the filters that have that item in their subset list. This will just
-                               // make it easier to go through whether the item has any other items
-                               // that affect it (and are selected) at any given time
                                if ( data.filters[ i ].subset ) {
+                                       subsetNames = [];
                                        data.filters[ i ].subset.forEach( function ( subsetFilterName ) { // eslint-disable-line no-loop-func
-                                               supersetMap[ subsetFilterName ] = supersetMap[ subsetFilterName ] || [];
+                                               var subsetName = model.groups[ group ].getNamePrefix() + subsetFilterName;
+                                               // For convenience, we should store each filter's "supersets" -- these are
+                                               // the filters that have that item in their subset list. This will just
+                                               // make it easier to go through whether the item has any other items
+                                               // that affect it (and are selected) at any given time
+                                               supersetMap[ subsetName ] = supersetMap[ subsetName ] || [];
                                                addArrayElementsUnique(
-                                                       supersetMap[ subsetFilterName ],
+                                                       supersetMap[ subsetName ],
                                                        filterItem.getName()
                                                );
+
+                                               // Translate subset param name to add the group name, so we
+                                               // get consistent naming. We know that subsets are only within
+                                               // the same group
+                                               subsetNames.push( subsetName );
                                        } );
+
+                                       // Set translated subset
+                                       filterItem.setSubset( subsetNames );
                                }
 
                                // Store conflicts
                                if ( data.filters[ i ].conflicts ) {
-                                       filterConflictMap[ data.filters[ i ].name ] = data.filters[ i ].conflicts;
+                                       filterConflictMap[ filterItem.getName() ] = data.filters[ i ].conflicts;
                                }
 
                                if ( data.type === 'send_unselected_if_any' ) {
                        }
                } );
 
+               // Add items to the model
+               this.addItems( items );
+
                // Expand conflicts
                groupConflictResult = expandConflictDefinitions( groupConflictMap );
                filterConflictResult = expandConflictDefinitions( filterConflictMap );
                        }
                } );
 
-               // Add items to the model
-               this.addItems( items );
+               // Create a map between known parameters and their models
+               $.each( this.groups, function ( group, groupModel ) {
+                       if ( groupModel.getType() === 'send_unselected_if_any' ) {
+                               // Individual filters
+                               groupModel.getItems().forEach( function ( filterItem ) {
+                                       model.parameterMap[ filterItem.getParamName() ] = filterItem;
+                               } );
+                       } else if ( groupModel.getType() === 'string_options' ) {
+                               // Group
+                               model.parameterMap[ groupModel.getName() ] = groupModel;
+                       }
+               } );
 
                this.emit( 'initialize' );
        };
         * @return {Object} Parameter state object
         */
        mw.rcfilters.dm.FiltersViewModel.prototype.getParametersFromFilters = function ( filterGroups ) {
-               var i, filterItems, anySelected, values,
-                       result = {},
+               var result = {},
                        groupItems = filterGroups || this.getFilterGroups();
 
                $.each( groupItems, function ( group, model ) {
-                       filterItems = model.getItems();
-
-                       if ( model.getType() === 'send_unselected_if_any' ) {
-                               // First, check if any of the items are selected at all.
-                               // If none is selected, we're treating it as if they are
-                               // all false
-                               anySelected = filterItems.some( function ( filterItem ) {
-                                       return filterItem.isSelected();
-                               } );
-
-                               // Go over the items and define the correct values
-                               for ( i = 0; i < filterItems.length; i++ ) {
-                                       result[ filterItems[ i ].getName() ] = anySelected ?
-                                               Number( !filterItems[ i ].isSelected() ) : 0;
-                               }
-                       } else if ( model.getType() === 'string_options' ) {
-                               values = [];
-                               for ( i = 0; i < filterItems.length; i++ ) {
-                                       if ( filterItems[ i ].isSelected() ) {
-                                               values.push( filterItems[ i ].getName() );
-                                       }
-                               }
-
-                               if ( values.length === filterItems.length ) {
-                                       result[ group ] = 'all';
-                               } else {
-                                       result[ group ] = values.join( model.getSeparator() );
-                               }
-                       }
+                       $.extend( result, model.getParamRepresentation() );
                } );
 
                return result;
        mw.rcfilters.dm.FiltersViewModel.prototype.sanitizeStringOptionGroup = function( groupName, valueArray ) {
                var result = [],
                        validNames = this.getGroupFilters( groupName ).map( function ( filterItem ) {
-                               return filterItem.getName();
+                               return filterItem.getParamName();
                        } );
 
                if ( valueArray.indexOf( 'all' ) > -1 ) {
         * @return {Object} Filter state object
         */
        mw.rcfilters.dm.FiltersViewModel.prototype.getFiltersFromParameters = function ( params ) {
-               var i, filterItem,
+               var i,
                        groupMap = {},
                        model = this,
                        base = this.getDefaultParams(),
 
                params = $.extend( {}, base, params );
 
+               // Go over the given parameters
                $.each( params, function ( paramName, paramValue ) {
-                       // Find the filter item
-                       filterItem = model.getItemByName( paramName );
-                       // Ignore if no filter item exists
-                       if ( filterItem ) {
-                               groupMap[ filterItem.getGroupName() ] = groupMap[ filterItem.getGroupName() ] || {};
+                       var itemOrGroup = model.parameterMap[ paramName ];
 
+                       if ( itemOrGroup instanceof mw.rcfilters.dm.FilterItem ) {
                                // Mark the group if it has any items that are selected
-                               groupMap[ filterItem.getGroupName() ].hasSelected = (
-                                       groupMap[ filterItem.getGroupName() ].hasSelected ||
+                               groupMap[ itemOrGroup.getGroupName() ] = groupMap[ itemOrGroup.getGroupName() ] || {};
+                               groupMap[ itemOrGroup.getGroupName() ].hasSelected = (
+                                       groupMap[ itemOrGroup.getGroupName() ].hasSelected ||
                                        !!Number( paramValue )
                                );
 
-                               // Add the relevant filter into the group map
-                               groupMap[ filterItem.getGroupName() ].filters = groupMap[ filterItem.getGroupName() ].filters || [];
-                               groupMap[ filterItem.getGroupName() ].filters.push( filterItem );
-                       } else if ( model.groups.hasOwnProperty( paramName ) ) {
+                               // Add filters
+                               groupMap[ itemOrGroup.getGroupName() ].filters = groupMap[ itemOrGroup.getGroupName() ].filters || [];
+                               groupMap[ itemOrGroup.getGroupName() ].filters.push( itemOrGroup );
+                       } else if ( itemOrGroup instanceof mw.rcfilters.dm.FilterGroup ) {
+                               groupMap[ itemOrGroup.getName() ] = groupMap[ itemOrGroup.getName() ] || {};
                                // This parameter represents a group (values are the filters)
                                // this is equivalent to checking if the group is 'string_options'
-                               groupMap[ paramName ] = { filters: model.groups[ paramName ].getItems() };
+                               groupMap[ itemOrGroup.getName() ].filters = itemOrGroup.getItems();
                        }
                } );
 
                                for ( i = 0; i < allItemsInGroup.length; i++ ) {
                                        filterItem = allItemsInGroup[ i ];
 
-                                       result[ filterItem.getName() ] = data.hasSelected ?
+                                       result[ filterItem.getName() ] = groupMap[ filterItem.getGroupName() ].hasSelected ?
                                                // Flip the definition between the parameter
                                                // state and the filter state
                                                // This is what the 'toggleSelected' value of the filter is
-                                               !Number( params[ filterItem.getName() ] ) :
+                                               !Number( params[ filterItem.getParamName() ] ) :
                                                // Otherwise, there are no selected items in the
                                                // group, which means the state is false
                                                false;
                                }
                        } else if ( model.groups[ group ].getType() === 'string_options' ) {
-                               paramValues = model.sanitizeStringOptionGroup( group, params[ group ].split( model.groups[ group ].getSeparator() ) );
+                               paramValues = model.sanitizeStringOptionGroup(
+                                       group,
+                                       params[ group ].split(
+                                               model.groups[ group ].getSeparator()
+                                       )
+                               );
 
                                for ( i = 0; i < allItemsInGroup.length; i++ ) {
                                        filterItem = allItemsInGroup[ i ];
                                                // is the same as all filters set to false
                                                false :
                                                // Otherwise, the filter is selected only if it appears in the parameter values
-                                               paramValues.indexOf( filterItem.getName() ) > -1;
+                                               paramValues.indexOf( filterItem.getParamName() ) > -1;
                                }
                        }
                } );
+
                return result;
        };
 
         * @param {boolean} [isSelected] Filter selected state
         */
        mw.rcfilters.dm.FiltersViewModel.prototype.toggleFilterSelected = function ( name, isSelected ) {
-               this.getItemByName( name ).toggleSelected( isSelected );
+               var item = this.getItemByName( name );
+
+               if ( item ) {
+                       item.toggleSelected( isSelected );
+               }
        };
 
        /**
index f8008b6..14eabe2 100644 (file)
         * @param {Array} filterStructure Filter definition and structure for the model
         */
        mw.rcfilters.Controller.prototype.initialize = function ( filterStructure ) {
+               var $changesList = $( '.mw-changeslist' ).first().contents();
                // Initialize the model
                this.filtersModel.initializeFilters( filterStructure );
                this.updateStateBasedOnUrl();
+
+               // Update the changes list with the existing data
+               // so it gets processed
+               this.changesListModel.update(
+                       $changesList.length ? $changesList : 'NO_RESULTS',
+                       $( 'fieldset.rcoptions' ).first()
+               );
+
        };
 
        /**
         * Empty all selected filters
         */
        mw.rcfilters.Controller.prototype.emptyFilters = function () {
+               var highlightedFilterNames = this.filtersModel
+                       .getHighlightedItems()
+                       .map( function ( filterItem ) { return { name: filterItem.getName() }; } );
+
                this.filtersModel.emptyAllFilters();
                this.filtersModel.clearAllHighlightColors();
                // Check all filter interactions
                this.filtersModel.reassessFilterInteractions();
 
                this.updateChangesList();
+
+               if ( highlightedFilterNames ) {
+                       this.trackHighlight( 'clearAll', highlightedFilterNames );
+               }
        };
 
        /**
        mw.rcfilters.Controller.prototype.setHighlightColor = function ( filterName, color ) {
                this.filtersModel.setHighlightColor( filterName, color );
                this.updateURL();
+               this.trackHighlight( 'set', { name: filterName, color: color } );
        };
 
        /**
        mw.rcfilters.Controller.prototype.clearHighlightColor = function ( filterName ) {
                this.filtersModel.clearHighlightColor( filterName );
                this.updateURL();
+               this.trackHighlight( 'clear', filterName );
        };
 
        /**
         * @param {string} filterName Name of the filter item
         */
        mw.rcfilters.Controller.prototype.clearFilter = function ( filterName ) {
-               var filterItem = this.filtersModel.getItemByName( filterName );
+               var filterItem = this.filtersModel.getItemByName( filterName ),
+                       isHighlighted = filterItem.isHighlighted();
 
-               if ( filterItem.isSelected() || filterItem.isHighlighted() ) {
+               if ( filterItem.isSelected() || isHighlighted ) {
                        this.filtersModel.clearHighlightColor( filterName );
                        this.filtersModel.toggleFilterSelected( filterName, false );
                        this.updateChangesList();
                        this.filtersModel.reassessFilterInteractions( filterItem );
                }
+
+               if ( isHighlighted ) {
+                       this.trackHighlight( 'clear', filterName );
+               }
        };
 
        /**
                        this.getUpdatedUri().toString()
                );
        };
+
+       /**
+        * Track usage of highlight feature
+        *
+        * @param {string} action
+        * @param {array|object|string} filters
+        */
+       mw.rcfilters.Controller.prototype.trackHighlight = function ( action, filters ) {
+               filters = $.type( filters ) === 'string' ? { name: filters } : filters;
+               filters = $.type( filters ) === 'object' ? [ filters ] : filters;
+               mw.track(
+                       'event.ChangesListHighlights',
+                       {
+                               action: action,
+                               filters: filters,
+                               userId: mw.user.getId()
+                       }
+               );
+       };
 }( mediaWiki, jQuery ) );
index 9fe0ec6..b16e84c 100644 (file)
@@ -3,7 +3,6 @@
 .mw-rcfilters-ui-capsuleItemWidget {
        background-color: #fff;
        border-color: #979797;
-       margin: 0 0.6em 0 0;
        color: #222;
 
        // Background and color of the capsule widget need a bit
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.CapsuleItemWidget.monobook.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.CapsuleItemWidget.monobook.less
new file mode 100644 (file)
index 0000000..04e5efe
--- /dev/null
@@ -0,0 +1,9 @@
+.mw-rcfilters-ui-capsuleItemWidget {
+       .oo-ui-buttonElement {
+               // Override the vertical align for the close button
+               // for some unknown reason, this rule, in combination
+               // with the negative margin-top rule, pushes all the
+               // close buttons up above the capsule item.
+               vertical-align: baseline;
+       }
+}
index c18fe5e..402f0ad 100644 (file)
@@ -1,6 +1,17 @@
 @import 'mw.rcfilters.mixins';
 
 .mw-rcfilters-ui-changesListWrapperWidget {
+       &-results {
+               width: 35em;
+               margin: 5em auto;
+
+               &-noresult,
+               &-conflict {
+                       font-weight: bold;
+                       margin-bottom: 0.5em;
+               }
+       }
+
        &-highlighted {
                ul {
                        list-style: none;
index 83491ac..d774ad2 100644 (file)
@@ -3,16 +3,51 @@
 .mw-rcfilters-ui-filterGroupWidget {
        padding-bottom: 0.5em;
 
-       &-title {
-               // TODO: Unify colors with official design palette
+       &-header {
                background: #eaecf0;
                padding: 0.5em 0.75em;
-               color: #555a5d;
-               .box-sizing( border-box );
+
+               &-title {
+                       // TODO: Unify colors with official design palette
+                       color: #555a5d;
+                       .box-sizing( border-box );
+                       display: inline-block;
+               }
+       }
+
+       &-whatsThisButton {
+               display: inline-block;
+               margin-left: 1.5em;
+
+               &.oo-ui-buttonElement {
+                       vertical-align: text-bottom;
+
+                       & > .oo-ui-buttonElement-button {
+                               font-weight: normal;
+                       }
+               }
+
+               &-popup-content {
+                       padding: 1em;
+
+                       &-header {
+                               font-weight: bold;
+                               margin-bottom: 1em;
+                       }
+
+                       &-link {
+                               margin: 1em 0;
+
+                       }
+
+                       .oo-ui-buttonElement-frameless.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+                               margin-left: 0;
+                       }
+               }
        }
 
        &-active {
-               .mw-rcfilters-ui-filterGroupWidget-title {
+               .mw-rcfilters-ui-filterGroupWidget-header-title {
                        font-weight: bold;
                }
        }
index ca19c22..b22abc6 100644 (file)
@@ -4,9 +4,7 @@
        direction: ltr;
 
        &-popup {
-               // We have to override OOUI's definition, which is set
-               // on the inline style of the popup
-               margin-top: 2em !important; /* stylelint-disable-line declaration-no-important */
+               margin-top: 1px;
                max-width: 650px;
 
                .oo-ui-popupWidget-body {
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.Overlay.monobook.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.Overlay.monobook.less
new file mode 100644 (file)
index 0000000..fae2b32
--- /dev/null
@@ -0,0 +1,3 @@
+.mw-rcfilters-ui-overlay {
+       font-size: 1.28em; /* 0.8em / x-small */
+}
index f28523a..728bb38 100644 (file)
         * @cfg {jQuery} [$overlay] A jQuery object serving as overlay for popups
         */
        mw.rcfilters.ui.CapsuleItemWidget = function MwRcfiltersUiCapsuleItemWidget( controller, model, config ) {
-               var $popupContent = $( '<div>' )
-                               .addClass( 'mw-rcfilters-ui-capsuleItemWidget-popup-content' ),
-                       descLabelWidget = new OO.ui.LabelWidget();
-
                // Configuration initialization
                config = config || {};
 
                this.controller = controller;
                this.model = model;
+               this.popupLabel = new OO.ui.LabelWidget();
                this.$overlay = config.$overlay || this.$element;
                this.positioned = false;
                this.popupTimeoutShow = null;
                                padded: false,
                                align: 'center',
                                position: 'above',
-                               $content: $popupContent
-                                       .append( descLabelWidget.$element ),
+                               $content: $( '<div>' )
+                                       .addClass( 'mw-rcfilters-ui-capsuleItemWidget-popup-content' )
+                                       .append( this.popupLabel.$element ),
                                $floatableContainer: this.$element,
                                classes: [ 'mw-rcfilters-ui-capsuleItemWidget-popup' ]
                        }
                }, config ) );
 
-               // Set initial text for the popup - the description
-               descLabelWidget.setLabel( this.model.getDescription() );
-
                this.$highlight = $( '<div>' )
                        .addClass( 'mw-rcfilters-ui-capsuleItemWidget-highlight' );
 
                        )
                        .toggleClass(
                                'mw-rcfilters-ui-capsuleItemWidget-conflicted',
-                               this.model.isConflicted()
+                               this.model.isSelected() && this.model.isConflicted()
                        );
        };
 
         * Respond to mouse enter event
         */
        mw.rcfilters.ui.CapsuleItemWidget.prototype.onMouseEnter = function () {
-               if ( this.model.getDescription() ) {
+               var labelText = this.model.getStateMessage();
+
+               if ( labelText ) {
+                       this.popupLabel.setLabel( labelText );
+
                        if ( !this.positioned ) {
                                // Recalculate anchor position to be center of the capsule item
                                this.popup.$anchor.css( 'margin-left', ( this.$element.width() / 2 ) );
index 84248e1..c7e6961 100644 (file)
         * @param {jQuery|string} $changesListContent The content of the updated changes list
         */
        mw.rcfilters.ui.ChangesListWrapperWidget.prototype.onModelUpdate = function ( $changesListContent ) {
-               var isEmpty = $changesListContent === 'NO_RESULTS';
+               var conflictItem,
+                       $message = $( '<div>' )
+                               .addClass( 'mw-rcfilters-ui-changesListWrapperWidget-results' ),
+                       isEmpty = $changesListContent === 'NO_RESULTS';
 
                this.$element.toggleClass( 'mw-changeslist', !isEmpty );
                this.$element.toggleClass( 'mw-changeslist-empty', isEmpty );
                if ( isEmpty ) {
                        this.$changesListContent = null;
-                       this.$element.empty().append(
-                               document.createTextNode( mw.message( 'recentchanges-noresult' ).text() )
-                       );
+                       this.$element.empty();
+
+                       if ( this.filtersViewModel.hasConflict() ) {
+                               conflictItem = this.filtersViewModel.getFirstConflictedItem();
+
+                               $message
+                                       .append(
+                                               $( '<div>' )
+                                                       .addClass( 'mw-rcfilters-ui-changesListWrapperWidget-results-conflict' )
+                                                       .text( mw.message( 'rcfilters-noresults-conflict' ).text() ),
+                                               $( '<div>' )
+                                                       .addClass( 'mw-rcfilters-ui-changesListWrapperWidget-results-message' )
+                                                       .text( mw.message( conflictItem.getCurrentConflictResultMessage() ).text() )
+                                       );
+                       } else {
+                               $message
+                                       .append(
+                                               $( '<div>' )
+                                                       .addClass( 'mw-rcfilters-ui-changesListWrapperWidget-results-noresult' )
+                                                       .text( mw.message( 'recentchanges-noresult' ).text() )
+                                       );
+                       }
+
+                       this.$element.append( $message );
                } else {
                        this.$changesListContent = $changesListContent;
                        this.$element.empty().append( this.$changesListContent );
index a06b103..e481bde 100644 (file)
 
                // Parent
                mw.rcfilters.ui.FilterCapsuleMultiselectWidget.parent.call( this, $.extend( true, {
-                       popup: { $autoCloseIgnore: filterInput.$element.add( this.$overlay ) }
+                       popup: {
+                               $autoCloseIgnore: filterInput.$element.add( this.$overlay ),
+                               $floatableContainer: filterInput.$element
+                       }
                }, config ) );
 
                this.controller = controller;
@@ -34,9 +37,7 @@
                this.selected = null;
 
                this.resetButton = new OO.ui.ButtonWidget( {
-                       icon: 'trash',
                        framed: false,
-                       title: mw.msg( 'rcfilters-clear-all-filters' ),
                        classes: [ 'mw-rcfilters-ui-filterCapsuleMultiselectWidget-resetButton' ]
                } );
 
                this.resetButton.setLabel(
                        currFiltersAreEmpty ? mw.msg( 'rcfilters-restore-default-filters' ) : ''
                );
+               this.resetButton.setTitle(
+                       currFiltersAreEmpty ? null : mw.msg( 'rcfilters-clear-all-filters' )
+               );
 
                this.resetButton.toggle( !hideResetButton );
                this.emptyFilterMessage.toggle( currFiltersAreEmpty );
index a750c44..e19208a 100644 (file)
         * @param {mw.rcfilters.Controller} controller Controller
         * @param {mw.rcfilters.dm.FilterGroup} model Filter group model
         * @param {Object} config Configuration object
+        * @cfg {jQuery} [$overlay] Overlay
         */
        mw.rcfilters.ui.FilterGroupWidget = function MwRcfiltersUiFilterGroupWidget( controller, model, config ) {
+               var whatsThisMessages,
+                       $header = $( '<div>' )
+                               .addClass( 'mw-rcfilters-ui-filterGroupWidget-header' ),
+                       $popupContent = $( '<div>' )
+                               .addClass( 'mw-rcfilters-ui-filterGroupWidget-whatsThisButton-popup-content' );
+
                config = config || {};
 
                // Parent
                this.controller = controller;
                this.model = model;
                this.filters = {};
+               this.$overlay = config.$overlay || this.$element;
 
                // Mixin constructors
                OO.ui.mixin.GroupWidget.call( this, config );
                OO.ui.mixin.LabelElement.call( this, $.extend( {}, config, {
                        label: this.model.getTitle(),
                        $label: $( '<div>' )
-                               .addClass( 'mw-rcfilters-ui-filterGroupWidget-title' )
+                               .addClass( 'mw-rcfilters-ui-filterGroupWidget-header-title' )
                } ) );
-               this.$overlay = config.$overlay || this.$element;
+
+               $header.append( this.$label );
+
+               if ( this.model.hasWhatsThis() ) {
+                       whatsThisMessages = this.model.getWhatsThis();
+
+                       // Create popup
+                       if ( whatsThisMessages.header ) {
+                               $popupContent.append(
+                                       ( new OO.ui.LabelWidget( {
+                                               label: mw.msg( whatsThisMessages.header ),
+                                               classes: [ 'mw-rcfilters-ui-filterGroupWidget-whatsThisButton-popup-content-header' ]
+                                       } ) ).$element
+                               );
+                       }
+                       if ( whatsThisMessages.body ) {
+                               $popupContent.append(
+                                       ( new OO.ui.LabelWidget( {
+                                               label: mw.msg( whatsThisMessages.body ),
+                                               classes: [ 'mw-rcfilters-ui-filterGroupWidget-whatsThisButton-popup-content-body' ]
+                                       } ) ).$element
+                               );
+                       }
+                       if ( whatsThisMessages.linkText && whatsThisMessages.url ) {
+                               $popupContent.append(
+                                       ( new OO.ui.ButtonWidget( {
+                                               framed: false,
+                                               flags: [ 'progressive' ],
+                                               href: whatsThisMessages.url,
+                                               label: mw.msg( whatsThisMessages.linkText ),
+                                               classes: [ 'mw-rcfilters-ui-filterGroupWidget-whatsThisButton-popup-content-link' ]
+                                       } ) ).$element
+                               );
+                       }
+
+                       // Add button
+                       this.whatsThisButton = new OO.ui.PopupButtonWidget( {
+                               framed: false,
+                               label: mw.msg( 'rcfilters-filterlist-whatsthis' ),
+                               $overlay: this.$overlay,
+                               classes: [ 'mw-rcfilters-ui-filterGroupWidget-whatsThisButton' ],
+                               flags: [ 'progressive' ],
+                               popup: {
+                                       padded: false,
+                                       align: 'center',
+                                       position: 'above',
+                                       $content: $popupContent,
+                                       classes: [ 'mw-rcfilters-ui-filterGroupWidget-whatsThisButton-popup' ]
+                               }
+                       } );
+
+                       $header
+                               .append( this.whatsThisButton.$element );
+               }
 
                // Populate
                this.populateFromModel();
                        .addClass( 'mw-rcfilters-ui-filterGroupWidget' )
                        .addClass( 'mw-rcfilters-ui-filterGroupWidget-name-' + this.model.getName() )
                        .append(
-                               this.$label,
+                               $header,
                                this.$group
                                        .addClass( 'mw-rcfilters-ui-filterGroupWidget-group' )
                        );
index e64a4c0..1fba18c 100644 (file)
                        }
                } else {
                        this.scrollToTop( this.capsule.$element, 10 );
+                       if ( !this.filterPopup.getSelectedFilter() ) {
+                               // No selection, scroll the popup list to top
+                               setTimeout( function () { this.capsule.popup.$body.scrollTop( 0 ); }.bind( this ), 0 );
+                       }
                }
        };
 
diff --git a/resources/src/mediawiki.special/mediawiki.special.changecredentials.js b/resources/src/mediawiki.special/mediawiki.special.changecredentials.js
new file mode 100644 (file)
index 0000000..9592879
--- /dev/null
@@ -0,0 +1,55 @@
+/*!
+ * JavaScript for change credentials form.
+ */
+( function ( mw, $, OO ) {
+       mw.hook( 'htmlform.enhance' ).add( function ( $root ) {
+               var api = new mw.Api();
+
+               $root.find( '.mw-changecredentials-validate-password.oo-ui-fieldLayout' ).each( function () {
+                       var currentApiPromise,
+                               self = OO.ui.FieldLayout.static.infuse( $( this ) );
+
+                       self.getField().setValidation( function ( password ) {
+                               var d;
+
+                               if ( currentApiPromise ) {
+                                       currentApiPromise.abort();
+                                       currentApiPromise = undefined;
+                               }
+
+                               password = $.trim( password );
+
+                               if ( password === '' ) {
+                                       self.setErrors( [] );
+                                       return true;
+                               }
+
+                               d = $.Deferred();
+                               currentApiPromise = api.post( {
+                                       action: 'validatepassword',
+                                       password: password,
+                                       formatversion: 2,
+                                       errorformat: 'html',
+                                       errorsuselocal: true,
+                                       uselang: mw.config.get( 'wgUserLanguage' )
+                               } ).done( function ( resp ) {
+                                       var pwinfo = resp.validatepassword,
+                                               good = pwinfo.validity === 'Good',
+                                               errors = [];
+
+                                       currentApiPromise = undefined;
+
+                                       if ( !good ) {
+                                               pwinfo.validitymessages.map( function ( m ) {
+                                                       errors.push( new OO.ui.HtmlSnippet( m.html ) );
+                                               } );
+                                       }
+                                       self.setErrors( errors );
+                                       d.resolve( good );
+                               } ).fail( d.reject );
+
+                               return d.promise( { abort: currentApiPromise.abort } );
+                       } );
+               } );
+       } );
+}( mediaWiki, jQuery, OO ) );
index 24f54d0..10e19e7 100644 (file)
        } );
 
        // Check if the username is invalid or already taken
-       $( function () {
-               var
-                       // We need to hook to all of these events to be sure we are notified of all changes to the
-                       // value of an <input type=text> field.
-                       events = 'keyup keydown change mouseup cut paste focus blur',
-                       $input = $( '#wpName2' ),
-                       $statusContainer = $( '#mw-createacct-status-area' ),
+       mw.hook( 'htmlform.enhance' ).add( function ( $root ) {
+               var $usernameInput = $root.find( '#wpName2' ),
+                       $passwordInput = $root.find( '#wpPassword2' ),
+                       $emailInput = $root.find( '#wpEmail' ),
+                       $realNameInput = $root.find( '#wpRealName' ),
                        api = new mw.Api(),
-                       currentRequest;
-
-               // Hide any present status messages.
-               function clearStatus() {
-                       $statusContainer.slideUp( function () {
-                               $statusContainer
-                                       .removeAttr( 'class' )
-                                       .empty();
-                       } );
-               }
+                       usernameChecker, passwordChecker;
 
-               // Returns a promise receiving a { state:, username: } object, where:
-               // * 'state' is one of 'invalid', 'taken', 'ok'
-               // * 'username' is the validated username if 'state' is 'ok', null otherwise (if it's not
-               //   possible to register such an account)
                function checkUsername( username ) {
                        // We could just use .then() if we didn't have to pass on .abort()…
                        var d, apiPromise;
                        apiPromise = api.get( {
                                action: 'query',
                                list: 'users',
-                               ususers: username // '|' in usernames is handled below
+                               ususers: username,
+                               usprop: 'cancreate',
+                               formatversion: 2,
+                               errorformat: 'html',
+                               errorsuselocal: true,
+                               uselang: mw.config.get( 'wgUserLanguage' )
                        } )
                                .done( function ( resp ) {
                                        var userinfo = resp.query.users[ 0 ];
 
-                                       if ( resp.query.users.length !== 1 ) {
-                                               // Happens if the user types '|' into the field
-                                               d.resolve( { state: 'invalid', username: null } );
-                                       } else if ( userinfo.invalid !== undefined ) {
-                                               d.resolve( { state: 'invalid', username: null } );
+                                       if ( resp.query.users.length !== 1 || userinfo.invalid ) {
+                                               d.resolve( { valid: false, messages: [ mw.message( 'noname' ).parseDom() ] } );
                                        } else if ( userinfo.userid !== undefined ) {
-                                               d.resolve( { state: 'taken', username: null } );
+                                               d.resolve( { valid: false, messages: [ mw.message( 'userexists' ).parseDom() ] } );
+                                       } else if ( !userinfo.cancreate ) {
+                                               d.resolve( {
+                                                       valid: false,
+                                                       messages: userinfo.cancreateerror ? userinfo.cancreateerror.map( function ( m ) {
+                                                               return m.html;
+                                                       } ) : []
+                                               } );
                                        } else {
-                                               d.resolve( { state: 'ok', username: username } );
+                                               d.resolve( { valid: true, messages: [] } );
                                        }
                                } )
                                .fail( d.reject );
                        return d.promise( { abort: apiPromise.abort } );
                }
 
-               function updateUsernameStatus() {
-                       var
-                               username = $.trim( $input.val() ),
-                               currentRequestInternal;
-
-                       // Abort any pending requests.
-                       if ( currentRequest ) {
-                               currentRequest.abort();
-                       }
+               function checkPassword() {
+                       // We could just use .then() if we didn't have to pass on .abort()…
+                       var apiPromise,
+                               d = $.Deferred();
 
-                       if ( username === '' ) {
-                               clearStatus();
-                               return;
+                       if ( $.trim( $usernameInput.val() ) === '' ) {
+                               d.resolve( { valid: true, messages: [] } );
+                               return d.promise();
                        }
 
-                       currentRequest = currentRequestInternal = checkUsername( username ).done( function ( info ) {
-                               var message;
-
-                               // Another request was fired in the meantime, the result we got here is no longer current.
-                               // This shouldn't happen as we abort pending requests, but you never know.
-                               if ( currentRequest !== currentRequestInternal ) {
-                                       return;
-                               }
-                               // If we're here, then the current request has finished, avoid calling .abort() needlessly.
-                               currentRequest = undefined;
-
-                               if ( info.state === 'ok' ) {
-                                       clearStatus();
-                               } else {
-                                       if ( info.state === 'invalid' ) {
-                                               message = mw.message( 'noname' ).text();
-                                       } else if ( info.state === 'taken' ) {
-                                               message = mw.message( 'userexists' ).text();
-                                       }
+                       apiPromise = api.post( {
+                               action: 'validatepassword',
+                               user: $usernameInput.val(),
+                               password: $passwordInput.val(),
+                               email: $emailInput.val() || '',
+                               realname: $realNameInput.val() || '',
+                               formatversion: 2,
+                               errorformat: 'html',
+                               errorsuselocal: true,
+                               uselang: mw.config.get( 'wgUserLanguage' )
+                       } )
+                               .done( function ( resp ) {
+                                       var pwinfo = resp.validatepassword || {};
+
+                                       d.resolve( {
+                                               valid: pwinfo.validity === 'Good',
+                                               messages: pwinfo.validitymessages ? pwinfo.validitymessages.map( function ( m ) {
+                                                       return m.html;
+                                               } ) : []
+                                       } );
+                               } )
+                               .fail( d.reject );
 
-                                       $statusContainer
-                                               .attr( 'class', 'errorbox' )
-                                               .empty()
-                                               .append(
-                                                       // Ugh…
-                                                       // TODO Change the HTML structure in includes/templates/Usercreate.php
-                                                       $( '<strong>' ).text( mw.message( 'createacct-error' ).text() ),
-                                                       $( '<br>' ),
-                                                       document.createTextNode( message )
-                                               )
-                                               .slideDown();
-                               }
-                       } ).fail( function () {
-                               clearStatus();
-                       } );
+                       return d.promise( { abort: apiPromise.abort } );
                }
 
-               $input.on( events, $.debounce( 1000, updateUsernameStatus ) );
+               usernameChecker = new mw.htmlform.Checker( $usernameInput, checkUsername );
+               usernameChecker.attach();
+
+               passwordChecker = new mw.htmlform.Checker( $passwordInput, checkPassword );
+               passwordChecker.attach( $usernameInput.add( $emailInput ).add( $realNameInput ) );
        } );
 }( mediaWiki, jQuery ) );
index 37e6e1a..3583e5e 100644 (file)
@@ -65,7 +65,9 @@
                } );
 
                // Highlight matching parts of link suggestion
-               this.$label.autoEllipsis( { hasSpan: false, tooltip: true, matchText: config.query } );
+               this.$label
+                       .highlightText( config.query )
+                       .attr( 'title', config.data );
 
                if ( config.missing ) {
                        this.$label.addClass( 'new' );
diff --git a/resources/src/mediawiki/htmlform/htmlform.Checker.js b/resources/src/mediawiki/htmlform/htmlform.Checker.js
new file mode 100644 (file)
index 0000000..3f53b63
--- /dev/null
@@ -0,0 +1,180 @@
+( function ( mw, $ ) {
+
+       mw.htmlform = {};
+
+       /**
+        * @class mw.htmlform.Checker
+        */
+
+       /**
+        * A helper class to add validation to non-OOUI HtmlForm fields.
+        *
+        * @constructor
+        * @param {jQuery} $element Form field generated by HTMLForm
+        * @param {Function} validator Validation callback
+        * @param {string} validator.value Value of the form field to be validated
+        * @param {jQuery.Promise} validator.return The promise should be resolved
+        *  with an object with two properties: Boolean 'valid' to indicate success
+        *  or failure of validation, and an array 'messages' to be passed to
+        *  setErrors() on failure.
+        */
+       mw.htmlform.Checker = function ( $element, validator ) {
+               this.validator = validator;
+               this.$element = $element;
+
+               this.$errorBox = $element.next( '.error' );
+               if ( !this.$errorBox.length ) {
+                       this.$errorBox = $( '<span>' );
+                       this.$errorBox.hide();
+                       $element.after( this.$errorBox );
+               }
+
+               this.currentValue = this.$element.val();
+       };
+
+       /**
+        * Attach validation events to the form element
+        *
+        * @param {jQuery} [$extraElements] Additional elements to listen for change
+        *  events on.
+        * @return {mw.htmlform.Checker}
+        * @chainable
+        */
+       mw.htmlform.Checker.prototype.attach = function ( $extraElements ) {
+               var $e,
+                       // We need to hook to all of these events to be sure we are
+                       // notified of all changes to the value of an <input type=text>
+                       // field.
+                       events = 'keyup keydown change mouseup cut paste focus blur';
+
+               $e = this.$element;
+               if ( $extraElements ) {
+                       $e = $e.add( $extraElements );
+               }
+               $e.on( events, $.debounce( 1000, this.validate.bind( this ) ) );
+
+               return this;
+       };
+
+       /**
+        * Validate the form element
+        * @return {jQuery.Promise}
+        */
+       mw.htmlform.Checker.prototype.validate = function () {
+               var currentRequestInternal,
+                       that = this,
+                       value = this.$element.val();
+
+               // Abort any pending requests.
+               if ( this.currentRequest && this.currentRequest.abort ) {
+                       this.currentRequest.abort();
+               }
+
+               if ( value === '' ) {
+                       this.currentValue = value;
+                       this.setErrors( [] );
+                       return;
+               }
+
+               this.currentRequest = currentRequestInternal = this.validator( value )
+                       .done( function ( info ) {
+                               var forceReplacement = value !== that.currentValue;
+
+                               // Another request was fired in the meantime, the result we got here is no longer current.
+                               // This shouldn't happen as we abort pending requests, but you never know.
+                               if ( that.currentRequest !== currentRequestInternal ) {
+                                       return;
+                               }
+                               // If we're here, then the current request has finished, avoid calling .abort() needlessly.
+                               that.currentRequest = undefined;
+
+                               that.currentValue = value;
+
+                               if ( info.valid ) {
+                                       that.setErrors( [], forceReplacement );
+                               } else {
+                                       that.setErrors( info.messages, forceReplacement );
+                               }
+                       } ).fail( function () {
+                               that.currentValue = null;
+                               that.setErrors( [] );
+                       } );
+
+               return currentRequestInternal;
+       };
+
+       /**
+        * Display errors associated with the form element
+        * @param {Array} errors Error messages. Each error message will be appended to a
+        *  `<span>` or `<li>`, as with jQuery.append().
+        * @param {boolean} [forceReplacement] Set true to force a visual replacement even
+        *  if the errors are the same. Ignored if errors are empty.
+        * @return {mw.htmlform.Checker}
+        * @chainable
+        */
+       mw.htmlform.Checker.prototype.setErrors = function ( errors, forceReplacement ) {
+               var $oldErrorBox, tagName, showFunc, text, replace,
+                       $errorBox = this.$errorBox;
+
+               if ( errors.length === 0 ) {
+                       $errorBox.slideUp( function () {
+                               $errorBox
+                                       .removeAttr( 'class' )
+                                       .empty();
+                       } );
+               } else {
+                       // Match behavior of HTMLFormField::formatErrors(), <span> or <ul>
+                       // depending on the count.
+                       tagName = errors.length === 1 ? 'span' : 'ul';
+
+                       // We have to animate the replacement if we're changing the tag. We
+                       // also want to if told to by the caller (i.e. to make it visually
+                       // obvious that the changed field value gives the same error) or if
+                       // the error text changes (because it makes more sense than
+                       // changing the text with no animation).
+                       replace = (
+                               forceReplacement || $errorBox.length > 1 ||
+                               $errorBox[ 0 ].tagName.toLowerCase() !== tagName
+                       );
+                       if ( !replace ) {
+                               text = $( '<' + tagName + '>' )
+                                       .append( errors.map( function ( e ) {
+                                               return errors.length === 1 ? e : $( '<li>' ).append( e );
+                                       } ) );
+                               if ( text.text() !== $errorBox.text() ) {
+                                       replace = true;
+                               }
+                       }
+
+                       $oldErrorBox = $errorBox;
+                       if ( replace ) {
+                               this.$errorBox = $errorBox = $( '<' + tagName + '>' );
+                               $errorBox.hide();
+                               $oldErrorBox.after( this.$errorBox );
+                       }
+
+                       showFunc = function () {
+                               if ( $oldErrorBox !== $errorBox ) {
+                                       $oldErrorBox
+                                               .removeAttr( 'class' )
+                                               .detach();
+                               }
+                               $errorBox
+                                       .attr( 'class', 'error' )
+                                       .empty()
+                                       .append( errors.map( function ( e ) {
+                                               return errors.length === 1 ? e : $( '<li>' ).append( e );
+                                       } ) )
+                                       .slideDown();
+                       };
+                       if ( $oldErrorBox !== $errorBox && $oldErrorBox.hasClass( 'error' ) ) {
+                               $oldErrorBox.slideUp( showFunc );
+                       } else {
+                               showFunc();
+                       }
+               }
+
+               return this;
+       };
+
+}( mediaWiki, jQuery ) );
index c82b9cb..282a2ee 100644 (file)
@@ -16,8 +16,7 @@
                parserDefaults = {
                        magic: {
                                PAGENAME: mw.config.get( 'wgPageName' ),
-                               PAGENAMEE: mw.util.wikiUrlencode( mw.config.get( 'wgPageName' ) ),
-                               SITENAME: mw.config.get( 'wgSiteName' )
+                               PAGENAMEE: mw.util.wikiUrlencode( mw.config.get( 'wgPageName' ) )
                        },
                        // Whitelist for allowed HTML elements in wikitext.
                        // Self-closing tags are not currently supported.
         * parsers, pass the relevant options to mw.jqueryMsg.parser.
         *
         * @private
-        * @param {Object} data
+        * @param {Object} data New data to extend parser defaults with
+        * @param {boolean} [deep=false] Whether the extend is done recursively (deep)
         */
-       mw.jqueryMsg.setParserDefaults = function ( data ) {
-               $.extend( parserDefaults, data );
+       mw.jqueryMsg.setParserDefaults = function ( data, deep ) {
+               if ( deep ) {
+                       $.extend( true, parserDefaults, data );
+               } else {
+                       $.extend( parserDefaults, data );
+               }
        };
 
        /**
diff --git a/resources/src/mediawiki/mediawiki.user.blockcookie.js b/resources/src/mediawiki/mediawiki.user.blockcookie.js
deleted file mode 100644 (file)
index ffff039..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-( function ( mw ) {
-
-       // If a user has been autoblocked, a cookie is set.
-       // Its value is replicated here in localStorage to guard against cookie-removal.
-       // This module will only be loaded when $wgCookieSetOnAutoblock is true.
-       // Ref: https://phabricator.wikimedia.org/T5233
-
-       if ( !mw.cookie.get( 'BlockID' ) && mw.storage.get( 'blockID' ) ) {
-               // The block ID exists in storage, but not in the cookie.
-               mw.cookie.set( 'BlockID', mw.storage.get( 'blockID' ) );
-
-       } else if ( parseInt( mw.cookie.get( 'BlockID' ), 10 ) > 0 && !mw.storage.get( 'blockID' ) ) {
-               // The block ID exists in the cookie, but not in storage.
-               // (When a block expires the cookie remains but its value is '', hence the integer check above.)
-               mw.storage.set( 'blockID', mw.cookie.get( 'BlockID' ) );
-
-       } else if ( mw.cookie.get( 'BlockID' ) === '' && mw.storage.get( 'blockID' ) ) {
-               // If only the empty string is in the cookie, remove the storage value. The block is no longer valid.
-               mw.storage.remove( 'blockID' );
-
-       }
-
-}( mediaWiki ) );
index 184dd43..6c059ec 100644 (file)
@@ -397,4 +397,33 @@ class XmlTest extends MediaWikiTestCase {
                        'encodeJsVar() with float-like string'
                );
        }
+
+       /**
+        * @covers Xml::listDropDown
+        */
+       public function testListDropDown() {
+               $this->assertEquals(
+                       '<select id="test-name" name="test-name" class="test-css" tabindex="2">' . "\n" .
+                               '<option value="other">other reasons</option>' .
+                               '<optgroup label="Foo"><option value="Foo 1">Foo 1</option>' .
+                               '<option value="Example" selected="">Example</option>' .
+                               '</optgroup><optgroup label="Bar">' .
+                               '<option value="Bar 1">Bar 1</option></optgroup>' . "\n" .
+                               '</select>',
+                       Xml::listDropDown(
+                               // name
+                               'test-name',
+                               // source list
+                               "* Foo\n** Foo 1\n** Example\n* Bar\n** Bar 1",
+                               // other
+                               'other reasons',
+                               // selected
+                               'Example',
+                               // class
+                               'test-css',
+                               // tabindex
+                               2
+                       )
+               );
+       }
 }
index 995c4be..68f9079 100644 (file)
@@ -88,15 +88,14 @@ class RecentChangeTest extends MediaWikiTestCase {
        }
 
        /**
-        * 50 mins and 100 mins are used here as the tests never take that long!
         * @return array
         */
        public function provideIsInRCLifespan() {
                return [
-                       [ 6000, time() - 3000, 0, true ],
-                       [ 3000, time() - 6000, 0, false ],
-                       [ 6000, time() - 3000, 6000, true ],
-                       [ 3000, time() - 6000, 6000, true ],
+                       [ 6000, -3000, 0, true ],
+                       [ 3000, -6000, 0, false ],
+                       [ 6000, -3000, 6000, true ],
+                       [ 3000, -6000, 6000, true ],
                ];
        }
 
@@ -104,8 +103,12 @@ class RecentChangeTest extends MediaWikiTestCase {
         * @covers RecentChange::isInRCLifespan
         * @dataProvider provideIsInRCLifespan
         */
-       public function testIsInRCLifespan( $maxAge, $timestamp, $tolerance, $expected ) {
+       public function testIsInRCLifespan( $maxAge, $offset, $tolerance, $expected ) {
                $this->setMwGlobals( 'wgRCMaxAge', $maxAge );
+               // Calculate this here instead of the data provider because the provider
+               // is expanded early on and the full test suite may take longer than 100 minutes
+               // when coverage is enabled.
+               $timestamp = time() + $offset;
                $this->assertEquals( $expected, RecentChange::isInRCLifespan( $timestamp, $tolerance ) );
        }
 
index 4a3b90a..7d12e59 100644 (file)
@@ -31,9 +31,7 @@ class ResourceLoaderFileModuleTest extends ResourceLoaderTestCase {
                                'deprecated' => true,
                        ],
                        'deprecatedTomorrow' => $base + [
-                               'deprecated' => [
-                                       'message' => 'Will be removed tomorrow.'
-                               ],
+                               'deprecated' => 'Will be removed tomorrow.'
                        ],
 
                        'htmlTemplateModule' => $base + [
index aeb82d1..3877288 100644 (file)
@@ -197,6 +197,62 @@ class ResourceLoaderImageModuleTest extends ResourceLoaderTestCase {
                ] ) );
                $this->assertInstanceOf( ResourceLoaderImage::class, $context->getImageObj() );
        }
+
+       public static function providerGetStyleDeclarations() {
+               return [
+                       [
+                               false,
+<<<TEXT
+background-image: url(rasterized.png);
+       background-image: linear-gradient(transparent, transparent), url(original.svg);
+       background-image: -o-linear-gradient(transparent, transparent), url(rasterized.png);
+TEXT
+                       ],
+                       [
+                               'data:image/svg+xml',
+<<<TEXT
+background-image: url(rasterized.png);
+       background-image: linear-gradient(transparent, transparent), url(data:image/svg+xml);
+       background-image: -o-linear-gradient(transparent, transparent), url(rasterized.png);
+TEXT
+                       ],
+
+               ];
+       }
+
+       /**
+        * @dataProvider providerGetStyleDeclarations
+        * @covers ResourceLoaderImageModule::getStyleDeclarations
+        */
+       public function testGetStyleDeclarations( $dataUriReturnValue, $expected ) {
+               $module = TestingAccessWrapper::newFromObject( new ResourceLoaderImageModule() );
+               $context = $this->getResourceLoaderContext();
+               $image = $this->getImageMock( $context, $dataUriReturnValue );
+
+               $styles = $module->getStyleDeclarations(
+                       $context,
+                       $image,
+                       'load.php'
+               );
+
+               $this->assertEquals( $expected, $styles );
+       }
+
+       private function getImageMock( ResourceLoaderContext $context, $dataUriReturnValue ) {
+               $image = $this->getMockBuilder( 'ResourceLoaderImage' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $image->method( 'getDataUri' )
+                       ->will( $this->returnValue( $dataUriReturnValue ) );
+               $image->expects( $this->any() )
+                       ->method( 'getUrl' )
+                       ->will( $this->returnValueMap( [
+                               [ $context, 'load.php', null, 'original', 'original.svg' ],
+                               [ $context, 'load.php', null, 'rasterized', 'rasterized.png' ],
+                       ] ) );
+
+               return $image;
+       }
 }
 
 class ResourceLoaderImageModuleTestable extends ResourceLoaderImageModule {
index a332528..4048ffe 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
+
 class ResourceLoaderWikiModuleTest extends ResourceLoaderTestCase {
 
        /**
@@ -214,6 +216,50 @@ class ResourceLoaderWikiModuleTest extends ResourceLoaderTestCase {
                $module = TestingAccessWrapper::newFromObject( $module );
                $this->assertEquals( $expected, $module->getTitleInfo( $context ), 'Title info' );
        }
+
+       /**
+        * @covers ResourceLoaderWikiModule::getContent
+        */
+       public function testGetContentForRedirects() {
+               // Set up context and module object
+               $context = $this->getResourceLoaderContext( [], new EmptyResourceLoader );
+               $module = $this->getMockBuilder( 'ResourceLoaderWikiModule' )
+                       ->setMethods( [ 'getPages', 'getContentObj' ] )
+                       ->getMock();
+               $module->expects( $this->any() )
+                       ->method( 'getPages' )
+                       ->will( $this->returnValue( [
+                               'MediaWiki:Redirect.js' => [ 'type' => 'script' ]
+                       ] ) );
+               $module->expects( $this->any() )
+                       ->method( 'getContentObj' )
+                       ->will( $this->returnCallback( function ( Title $title ) {
+                               if ( $title->getPrefixedText() === 'MediaWiki:Redirect.js' ) {
+                                       $handler = new JavaScriptContentHandler();
+                                       return $handler->makeRedirectContent(
+                                               Title::makeTitle( NS_MEDIAWIKI, 'Target.js' )
+                                       );
+                               } elseif ( $title->getPrefixedText() === 'MediaWiki:Target.js' ) {
+                                       return new JavaScriptContent( 'target;' );
+                               } else {
+                                       return null;
+                               }
+                       } ) );
+
+               // Mock away Title's db queries with LinkCache
+               MediaWikiServices::getInstance()->getLinkCache()->addGoodLinkObj(
+                       1, // id
+                       new TitleValue( NS_MEDIAWIKI, 'Redirect.js' ),
+                       1, // len
+                       1 // redirect
+               );
+
+               $this->assertEquals(
+                       "/*\nMediaWiki:Redirect.js\n*/\ntarget;\n",
+                       $module->getScript( $context ),
+                       'Redirect resolved by getContent'
+               );
+       }
 }
 
 class TestResourceLoaderWikiModule extends ResourceLoaderWikiModule {
index 9daae97..4e9d826 100644 (file)
@@ -150,23 +150,25 @@ class SpecialSearchTest extends MediaWikiTestCase {
                        [
                                'With suggestion and no rewritten query shows did you mean',
                                '/Did you mean: <a[^>]+>first suggestion/',
-                               new SpecialSearchTestMockResultSet( 'first suggestion', null, [
-                                       SearchResult::newFromTitle( Title::newMainPage() ),
-                               ] ),
+                               'first suggestion',
+                               null,
+                               [ Title::newMainPage() ]
                        ],
 
                        [
                                'With rewritten query informs user of change',
                                '/Showing results for <a[^>]+>first suggestion/',
-                               new SpecialSearchTestMockResultSet( 'asdf', 'first suggestion', [
-                                       SearchResult::newFromTitle( Title::newMainPage() ),
-                               ] ),
+                               'asdf',
+                               'first suggestion',
+                               [ Title::newMainPage() ]
                        ],
 
                        [
                                'When both queries have no results user gets no results',
                                '/There were no results matching the query/',
-                               new SpecialSearchTestMockResultSet( 'first suggestion', 'first suggestion', [] ),
+                               'first suggestion',
+                               'first suggestion',
+                               []
                        ],
                ];
        }
@@ -174,8 +176,24 @@ class SpecialSearchTest extends MediaWikiTestCase {
        /**
         * @dataProvider provideRewriteQueryWithSuggestion
         */
-       public function testRewriteQueryWithSuggestion( $message, $expectRegex, $results ) {
-               $mockSearchEngine = $this->mockSearchEngine( $results );
+       public function testRewriteQueryWithSuggestion(
+               $message,
+               $expectRegex,
+               $suggestion,
+               $rewrittenQuery,
+               array $resultTitles
+       ) {
+               $results = array_map( function( $title ) {
+                       return SearchResult::newFromTitle( $title );
+               }, $resultTitles );
+
+               $searchResults = new SpecialSearchTestMockResultSet(
+                       $suggestion,
+                       $rewrittenQuery,
+                       $results
+               );
+
+               $mockSearchEngine = $this->mockSearchEngine( $searchResults );
                $search = $this->getMockBuilder( 'SpecialSearch' )
                        ->setMethods( [ 'getSearchEngine' ] )
                        ->getMock();
index 6e702b6..66d35a5 100644 (file)
@@ -8,6 +8,41 @@
  * @covers SpecialWatchlist
  */
 class SpecialWatchlistTest extends SpecialPageTestBase {
+       public function setUp() {
+               parent::setUp();
+
+               $this->setTemporaryHook(
+                       'ChangesListSpecialPageFilters',
+                       null
+               );
+
+               $this->setTemporaryHook(
+                       'SpecialWatchlistQuery',
+                       null
+               );
+
+               $this->setTemporaryHook(
+                       'ChangesListSpecialPageQuery',
+                       null
+               );
+
+               $this->setMwGlobals(
+                       'wgDefaultUserOptions',
+                       [
+                               'extendwatchlist' => 1,
+                               'watchlistdays' => 3.0,
+                               'watchlisthideanons' => 0,
+                               'watchlisthidebots' => 0,
+                               'watchlisthideliu' => 0,
+                               'watchlisthideminor' => 0,
+                               'watchlisthideown' => 0,
+                               'watchlisthidepatrolled' => 0,
+                               'watchlisthidecategorization' => 1,
+                               'watchlistreloadautomatically' => 0,
+                       ]
+               );
+
+       }
 
        /**
         * Returns a new instance of the special page under test.
@@ -29,4 +64,124 @@ class SpecialWatchlistTest extends SpecialPageTestBase {
                $this->assertContains( '(nowatchlist)', $html );
        }
 
+       /**
+        * @dataProvider provideFetchOptionsFromRequest
+        */
+       public function testFetchOptionsFromRequest( $expectedValues, $preferences, $inputParams ) {
+               $page = TestingAccessWrapper::newFromObject(
+                       $this->newSpecialPage()
+               );
+
+               $context = new DerivativeContext( $page->getContext() );
+
+               $fauxRequest = new FauxRequest( $inputParams, /* $wasPosted= */ false );
+               $user = $this->getTestUser()->getUser();
+
+               foreach ( $preferences as $key => $value ) {
+                       $user->setOption( $key, $value );
+               }
+
+               $context->setRequest( $fauxRequest );
+               $context->setUser( $user );
+               $page->setContext( $context );
+
+               $page->registerFilters();
+               $formOptions = $page->getDefaultOptions();
+               $page->fetchOptionsFromRequest( $formOptions );
+
+               $this->assertArrayEquals(
+                       $expectedValues,
+                       $formOptions->getAllValues(),
+                       /* $ordered= */ false,
+                       /* $named= */ true
+               );
+       }
+
+       public function provideFetchOptionsFromRequest() {
+               // $defaults and $allFalse are just to make the expected values below
+               // shorter by hiding the background.
+
+               $page = TestingAccessWrapper::newFromObject(
+                       $this->newSpecialPage()
+               );
+
+               $this->setTemporaryHook(
+                       'ChangesListSpecialPageFilters',
+                       null
+               );
+
+               $page->registerFilters();
+
+               // Does not consider $preferences, just wiki's defaults
+               $wikiDefaults = $page->getDefaultOptions()->getAllValues();
+
+               $allFalse = $wikiDefaults;
+
+               foreach ( $allFalse as $key => &$value ) {
+                       if ( $value === true ) {
+                               $value = false;
+                       }
+               }
+
+               // This is not exposed on the form (only in preferences) so it
+               // respects the preference.
+               $allFalse['extended'] = true;
+
+               return [
+                       [
+                               [
+                                       'hideminor' => true,
+                               ] + $wikiDefaults,
+                               [],
+                               [
+                                       'hideMinor' => 1,
+                               ],
+                       ],
+
+                       [
+                               [
+                                       // First two same as prefs
+                                       'hideminor' => true,
+                                       'hidebots' => false,
+
+                                       // Second two overriden
+                                       'hideanons' => false,
+                                       'hideliu' => true,
+                               ] + $wikiDefaults,
+                               [
+                                       'watchlisthideminor' => 1,
+                                       'watchlisthidebots' => 0,
+
+                                       'watchlisthideanons' => 1,
+                                       'watchlisthideliu' => 0,
+                               ],
+                               [
+                                       'hideanons' => 0,
+                                       'hideliu' => 1,
+                               ],
+                       ],
+
+                       // Defaults/preferences for form elements are entirely ignored for
+                       // action=submit and omitted elements become false
+                       [
+                               [
+                                       'hideminor' => false,
+                                       'hidebots' => true,
+                                       'hideanons' => false,
+                                       'hideliu' => true,
+                               ] + $allFalse,
+                               [
+                                       'watchlisthideminor' => 0,
+                                       'watchlisthidebots' => 1,
+                                       'watchlisthideanons' => 1,
+                                       'watchlisthideliu' => 0,
+                               ],
+                               [
+                                       'hidebots' => 1,
+                                       'hideliu' => 1,
+                                       'action' => 'submit',
+                               ],
+                       ],
+               ];
+       }
 }
index 3232d08..271648f 100644 (file)
@@ -1,3 +1,4 @@
+/* eslint-disable camelcase */
 ( function ( mw ) {
        QUnit.module( 'mediawiki.rcfilters - FilterItem' );
 
@@ -9,7 +10,7 @@
                item = new mw.rcfilters.dm.FilterItem( 'filter1', group1 );
                assert.equal(
                        item.getName(),
-                       'filter1',
+                       'group1__filter1',
                        'Filter name is retained.'
                );
                assert.equal(
                        group1,
                        {
                                conflicts: {
-                                       conflict1: { group: 'group2', filter: 'conflict1' },
-                                       conflict2: { group: 'group2', filter: 'conflict2' },
-                                       conflict3: { group: 'group2', filter: 'conflict3' }
+                                       group2__conflict1: { group: 'group2', filter: 'group2__conflict1' },
+                                       group2__conflict2: { group: 'group2', filter: 'group2__conflict2' },
+                                       group2__conflict3: { group: 'group2', filter: 'group2__conflict3' }
                                }
                        }
                );
                assert.deepEqual(
                        item.getConflicts(),
                        {
-                               conflict1: { group: 'group2', filter: 'conflict1' },
-                               conflict2: { group: 'group2', filter: 'conflict2' },
-                               conflict3: { group: 'group2', filter: 'conflict3' }
+                               group2__conflict1: { group: 'group2', filter: 'group2__conflict1' },
+                               group2__conflict2: { group: 'group2', filter: 'group2__conflict2' },
+                               group2__conflict3: { group: 'group2', filter: 'group2__conflict3' }
                        },
                        'Conflict information is retained.'
                );
                assert.equal(
-                       // TODO: Consider allowing for either a FilterItem or a filter name
-                       // in this method, so it is consistent with the subset one
                        item.existsInConflicts( new mw.rcfilters.dm.FilterItem( 'conflict1', group2 ) ),
                        true,
                        'Specific item exists in conflicts.'
index 60a32c3..405fdcf 100644 (file)
@@ -1,3 +1,4 @@
+/* eslint-disable camelcase */
 ( function ( mw, $ ) {
        QUnit.module( 'mediawiki.rcfilters - FiltersViewModel', QUnit.newMwEnvironment( {
                messages: {
                                type: 'send_unselected_if_any',
                                filters: [
                                        {
-                                               name: 'group1filter1',
+                                               name: 'filter1',
                                                label: 'Group 1: Filter 1',
                                                description: 'Description of Filter 1 in Group 1'
                                        },
                                        {
-                                               name: 'group1filter2',
+                                               name: 'filter2',
                                                label: 'Group 1: Filter 2',
                                                description: 'Description of Filter 2 in Group 1'
                                        }
                                type: 'send_unselected_if_any',
                                filters: [
                                        {
-                                               name: 'group2filter1',
+                                               name: 'filter1',
                                                label: 'Group 2: Filter 1',
                                                description: 'Description of Filter 1 in Group 2'
                                        },
                                        {
-                                               name: 'group2filter2',
+                                               name: 'filter2',
                                                label: 'Group 2: Filter 2',
                                                description: 'Description of Filter 2 in Group 2'
                                        }
                                type: 'string_options',
                                filters: [
                                        {
-                                               name: 'group3filter1',
+                                               name: 'filter1',
                                                label: 'Group 3: Filter 1',
                                                description: 'Description of Filter 1 in Group 3'
                                        },
                                        {
-                                               name: 'group3filter2',
+                                               name: 'filter2',
                                                label: 'Group 3: Filter 2',
                                                description: 'Description of Filter 2 in Group 3'
                                        }
                model.initializeFilters( definition );
 
                assert.ok(
-                       model.getItemByName( 'group1filter1' ) instanceof mw.rcfilters.dm.FilterItem &&
-                       model.getItemByName( 'group1filter2' ) instanceof mw.rcfilters.dm.FilterItem &&
-                       model.getItemByName( 'group2filter1' ) instanceof mw.rcfilters.dm.FilterItem &&
-                       model.getItemByName( 'group2filter2' ) instanceof mw.rcfilters.dm.FilterItem &&
-                       model.getItemByName( 'group3filter1' ) instanceof mw.rcfilters.dm.FilterItem &&
-                       model.getItemByName( 'group3filter2' ) instanceof mw.rcfilters.dm.FilterItem,
+                       model.getItemByName( 'group1__filter1' ) instanceof mw.rcfilters.dm.FilterItem &&
+                       model.getItemByName( 'group1__filter2' ) instanceof mw.rcfilters.dm.FilterItem &&
+                       model.getItemByName( 'group2__filter1' ) instanceof mw.rcfilters.dm.FilterItem &&
+                       model.getItemByName( 'group2__filter2' ) instanceof mw.rcfilters.dm.FilterItem &&
+                       model.getItemByName( 'group3__filter1' ) instanceof mw.rcfilters.dm.FilterItem &&
+                       model.getItemByName( 'group3__filter2' ) instanceof mw.rcfilters.dm.FilterItem,
                        'Filters instantiated and stored correctly'
                );
 
                assert.deepEqual(
                        model.getSelectedState(),
                        {
-                               group1filter1: false,
-                               group1filter2: false,
-                               group2filter1: false,
-                               group2filter2: false,
-                               group3filter1: false,
-                               group3filter2: false
+                               group1__filter1: false,
+                               group1__filter2: false,
+                               group2__filter1: false,
+                               group2__filter2: false,
+                               group3__filter1: false,
+                               group3__filter2: false
                        },
                        'Initial state of filters'
                );
 
                model.toggleFiltersSelected( {
-                       group1filter1: true,
-                       group2filter2: true,
-                       group3filter1: true
+                       group1__filter1: true,
+                       group2__filter2: true,
+                       group3__filter1: true
                } );
                assert.deepEqual(
                        model.getSelectedState(),
                        {
-                               group1filter1: true,
-                               group1filter2: false,
-                               group2filter1: false,
-                               group2filter2: true,
-                               group3filter1: true,
-                               group3filter2: false
+                               group1__filter1: true,
+                               group1__filter2: false,
+                               group2__filter1: false,
+                               group2__filter2: true,
+                               group3__filter1: true,
+                               group3__filter2: false
                        },
                        'Updating filter states correctly'
                );
                                type: 'send_unselected_if_any',
                                filters: [
                                        {
-                                               name: 'group1filter1',
+                                               name: 'filter1',
                                                label: 'group1filter1-label',
                                                description: 'group1filter1-desc'
                                        },
                                        {
-                                               name: 'group1filter2',
+                                               name: 'filter2',
                                                label: 'group1filter2-label',
                                                description: 'group1filter2-desc'
                                        }
                                type: 'send_unselected_if_any',
                                filters: [
                                        {
-                                               name: 'group2filter1',
+                                               name: 'filter1',
                                                label: 'group2filter1-label',
                                                description: 'group2filter1-desc'
                                        },
                                        {
-                                               name: 'group2filter2',
+                                               name: 'filter2',
                                                label: 'group2filter2-label',
                                                description: 'group2filter2-desc'
                                        }
                                {
                                        query: 'group',
                                        expectedMatches: {
-                                               group1: [ 'group1filter1', 'group1filter2' ],
-                                               group2: [ 'group2filter1' ]
+                                               group1: [ 'group1__filter1', 'group1__filter2' ],
+                                               group2: [ 'group2__filter1' ]
                                        },
                                        reason: 'Finds filters starting with the query string'
                                },
                                {
                                        query: 'filter 2 in group',
                                        expectedMatches: {
-                                               group1: [ 'group1filter2' ],
-                                               group2: [ 'group2filter2' ]
+                                               group1: [ 'group1__filter2' ],
+                                               group2: [ 'group2__filter2' ]
                                        },
                                        reason: 'Finds filters containing the query string in their description'
                                },
                                {
                                        query: 'title',
                                        expectedMatches: {
-                                               group1: [ 'group1filter1', 'group1filter2' ],
-                                               group2: [ 'group2filter1', 'group2filter2' ]
+                                               group1: [ 'group1__filter1', 'group1__filter2' ],
+                                               group2: [ 'group2__filter1', 'group2__filter2' ]
                                        },
                                        reason: 'Finds filters containing the query string in their group title'
                                }
 
                // Select 1 filter
                model.toggleFiltersSelected( {
-                       hidefilter1: true,
-                       hidefilter2: false,
-                       hidefilter3: false,
-                       hidefilter4: false,
-                       hidefilter5: false,
-                       hidefilter6: false
+                       group1__hidefilter1: true,
+                       group1__hidefilter2: false,
+                       group1__hidefilter3: false,
+                       group2__hidefilter4: false,
+                       group2__hidefilter5: false,
+                       group2__hidefilter6: false
                } );
                // Only one filter in one group
                assert.deepEqual(
 
                // Select 2 filters
                model.toggleFiltersSelected( {
-                       hidefilter1: true,
-                       hidefilter2: true,
-                       hidefilter3: false,
-                       hidefilter4: false,
-                       hidefilter5: false,
-                       hidefilter6: false
+                       group1__hidefilter1: true,
+                       group1__hidefilter2: true,
+                       group1__hidefilter3: false,
+                       group2__hidefilter4: false,
+                       group2__hidefilter5: false,
+                       group2__hidefilter6: false
                } );
                // Two selected filters in one group
                assert.deepEqual(
 
                // Select 3 filters
                model.toggleFiltersSelected( {
-                       hidefilter1: true,
-                       hidefilter2: true,
-                       hidefilter3: true,
-                       hidefilter4: false,
-                       hidefilter5: false,
-                       hidefilter6: false
+                       group1__hidefilter1: true,
+                       group1__hidefilter2: true,
+                       group1__hidefilter3: true,
+                       group2__hidefilter4: false,
+                       group2__hidefilter5: false,
+                       group2__hidefilter6: false
                } );
                // All filters of the group are selected == this is the same as not selecting any
                assert.deepEqual(
 
                // Select 1 filter from string_options
                model.toggleFiltersSelected( {
-                       filter7: true,
-                       filter8: false,
-                       filter9: false
+                       group3__filter7: true,
+                       group3__filter8: false,
+                       group3__filter9: false
                } );
                // All filters of the group are selected == this is the same as not selecting any
                assert.deepEqual(
 
                // Select 2 filters from string_options
                model.toggleFiltersSelected( {
-                       filter7: true,
-                       filter8: true,
-                       filter9: false
+                       group3__filter7: true,
+                       group3__filter8: true,
+                       group3__filter9: false
                } );
                // All filters of the group are selected == this is the same as not selecting any
                assert.deepEqual(
 
                // Select 3 filters from string_options
                model.toggleFiltersSelected( {
-                       filter7: true,
-                       filter8: true,
-                       filter9: true
+                       group3__filter7: true,
+                       group3__filter8: true,
+                       group3__filter9: true
                } );
                // All filters of the group are selected == this is the same as not selecting any
                assert.deepEqual(
                        } ],
                        defaultFilterRepresentation = {
                                // Group 1 and 2, "send_unselected_if_any", the values of the filters are "flipped" from the values of the parameters
-                               hidefilter1: false,
-                               hidefilter2: true,
-                               hidefilter3: false,
-                               hidefilter4: true,
-                               hidefilter5: false,
-                               hidefilter6: true,
+                               group1__hidefilter1: false,
+                               group1__hidefilter2: true,
+                               group1__hidefilter3: false,
+                               group2__hidefilter4: true,
+                               group2__hidefilter5: false,
+                               group2__hidefilter6: true,
                                // Group 3, "string_options", default values correspond to parameters and filters
-                               filter7: false,
-                               filter8: true,
-                               filter9: false
+                               group3__filter7: false,
+                               group3__filter8: true,
+                               group3__filter9: false
                        },
                        model = new mw.rcfilters.dm.FiltersViewModel();
 
                                hidefilter2: '1'
                        } ),
                        $.extend( {}, defaultFilterRepresentation, {
-                               hidefilter1: false, // The text is "show filter 1"
-                               hidefilter2: false, // The text is "show filter 2"
-                               hidefilter3: false // The text is "show filter 3"
+                               group1__hidefilter1: false, // The text is "show filter 1"
+                               group1__hidefilter2: false, // The text is "show filter 2"
+                               group1__hidefilter3: false // The text is "show filter 3"
                        } ),
                        'One truthy parameter in a group whose other parameters are true by default makes the rest of the filters in the group false (unchecked)'
                );
                                hidefilter3: '1'
                        } ),
                        $.extend( {}, defaultFilterRepresentation, {
-                               hidefilter1: false, // The text is "show filter 1"
-                               hidefilter2: false, // The text is "show filter 2"
-                               hidefilter3: false // The text is "show filter 3"
+                               group1__hidefilter1: false, // The text is "show filter 1"
+                               group1__hidefilter2: false, // The text is "show filter 2"
+                               group1__hidefilter3: false // The text is "show filter 3"
                        } ),
                        'All paremeters in the same \'send_unselected_if_any\' group false is equivalent to none are truthy (checked) in the interface'
                );
                assert.deepEqual(
                        model.getSelectedState(),
                        $.extend( {}, defaultFilterRepresentation, {
-                               hidefilter5: false,
-                               hidefilter6: false
+                               group2__hidefilter5: false,
+                               group2__hidefilter6: false
                        } ),
                        'getFiltersFromParameters does not care about previous or existing state.'
                );
                assert.deepEqual(
                        model.getSelectedState(),
                        $.extend( {}, defaultFilterRepresentation, {
-                               filter7: true,
-                               filter8: false,
-                               filter9: false
+                               group3__filter7: true,
+                               group3__filter8: false,
+                               group3__filter9: false
                        } ),
                        'A \'string_options\' parameter containing 1 value, results in the corresponding filter as checked'
                );
                assert.deepEqual(
                        model.getSelectedState(),
                        $.extend( {}, defaultFilterRepresentation, {
-                               filter7: true,
-                               filter8: true,
-                               filter9: false
+                               group3__filter7: true,
+                               group3__filter8: true,
+                               group3__filter9: false
                        } ),
                        'A \'string_options\' parameter containing 2 values, results in both corresponding filters as checked'
                );
                assert.deepEqual(
                        model.getSelectedState(),
                        $.extend( {}, defaultFilterRepresentation, {
-                               filter7: false,
-                               filter8: false,
-                               filter9: false
+                               group3__filter7: false,
+                               group3__filter8: false,
+                               group3__filter9: false
                        } ),
                        'A \'string_options\' parameter containing all values, results in all filters of the group as unchecked.'
                );
                assert.deepEqual(
                        model.getSelectedState(),
                        $.extend( {}, defaultFilterRepresentation, {
-                               filter7: false,
-                               filter8: false,
-                               filter9: false
+                               group3__filter7: false,
+                               group3__filter8: false,
+                               group3__filter9: false
                        } ),
                        'A \'string_options\' parameter containing the value \'all\', results in all filters of the group as unchecked.'
                );
                assert.deepEqual(
                        model.getSelectedState(),
                        $.extend( {}, defaultFilterRepresentation, {
-                               filter7: true,
-                               filter8: false,
-                               filter9: true
+                               group3__filter7: true,
+                               group3__filter8: false,
+                               group3__filter9: true
                        } ),
                        'A \'string_options\' parameter containing an invalid value, results in the invalid value ignored and the valid corresponding filters checked.'
                );
                        } ],
                        defaultFilterRepresentation = {
                                // Group 1 and 2, "send_unselected_if_any", the values of the filters are "flipped" from the values of the parameters
-                               hidefilter1: false,
-                               hidefilter2: true,
-                               hidefilter3: false,
-                               hidefilter4: true,
-                               hidefilter5: false,
-                               hidefilter6: true
+                               group1__hidefilter1: false,
+                               group1__hidefilter2: true,
+                               group1__hidefilter3: false,
+                               group2__hidefilter4: true,
+                               group2__hidefilter5: false,
+                               group2__hidefilter6: true
                        },
                        model = new mw.rcfilters.dm.FiltersViewModel();
 
                assert.deepEqual(
                        model.getSelectedState(),
                        {
-                               hidefilter1: false,
-                               hidefilter2: false,
-                               hidefilter3: false,
-                               hidefilter4: false,
-                               hidefilter5: false,
-                               hidefilter6: false
+                               group1__hidefilter1: false,
+                               group1__hidefilter2: false,
+                               group1__hidefilter3: false,
+                               group2__hidefilter4: false,
+                               group2__hidefilter5: false,
+                               group2__hidefilter6: false
                        },
                        'Initial state: default filters are not selected (controller selects defaults explicitly).'
                );
 
                model.toggleFiltersSelected( {
-                       hidefilter1: false,
-                       hidefilter3: false
+                       group1__hidefilter1: false,
+                       group1__hidefilter3: false
                } );
 
                model.setFiltersToDefaults();
                                ]
                        } ],
                        baseFullState = {
-                               filter1: { selected: false, conflicted: false, included: false },
-                               filter2: { selected: false, conflicted: false, included: false },
-                               filter3: { selected: false, conflicted: false, included: false }
+                               group1__filter1: { selected: false, conflicted: false, included: false },
+                               group1__filter2: { selected: false, conflicted: false, included: false },
+                               group1__filter3: { selected: false, conflicted: false, included: false }
                        },
                        model = new mw.rcfilters.dm.FiltersViewModel();
 
                model.initializeFilters( definition );
                // Select a filter that has subset with another filter
                model.toggleFiltersSelected( {
-                       filter1: true
+                       group1__filter1: true
                } );
 
-               model.reassessFilterInteractions( model.getItemByName( 'filter1' ) );
+               model.reassessFilterInteractions( model.getItemByName( 'group1__filter1' ) );
                assert.deepEqual(
                        model.getFullState(),
                        $.extend( true, {}, baseFullState, {
-                               filter1: { selected: true },
-                               filter2: { included: true },
-                               filter3: { included: true }
+                               group1__filter1: { selected: true },
+                               group1__filter2: { included: true },
+                               group1__filter3: { included: true }
                        } ),
                        'Filters with subsets are represented in the model.'
                );
 
                // Select another filter that has a subset with the same previous filter
                model.toggleFiltersSelected( {
-                       filter2: true
+                       group1__filter2: true
                } );
                model.reassessFilterInteractions( model.getItemByName( 'filter2' ) );
                assert.deepEqual(
                        model.getFullState(),
                        $.extend( true, {}, baseFullState, {
-                               filter1: { selected: true },
-                               filter2: { selected: true, included: true },
-                               filter3: { included: true }
+                               group1__filter1: { selected: true },
+                               group1__filter2: { selected: true, included: true },
+                               group1__filter3: { included: true }
                        } ),
                        'Filters that have multiple subsets are represented.'
                );
 
-               // Remove one filter (but leave the other) that affects filter2
+               // Remove one filter (but leave the other) that affects filter3
                model.toggleFiltersSelected( {
-                       filter1: false
+                       group1__filter1: false
                } );
-               model.reassessFilterInteractions( model.getItemByName( 'filter1' ) );
+               model.reassessFilterInteractions( model.getItemByName( 'group1__filter1' ) );
                assert.deepEqual(
                        model.getFullState(),
                        $.extend( true, {}, baseFullState, {
-                               filter2: { selected: true, included: false },
-                               filter3: { included: true }
+                               group1__filter2: { selected: true, included: false },
+                               group1__filter3: { included: true }
                        } ),
                        'Removing a filter only un-includes its subset if there is no other filter affecting.'
                );
 
                model.toggleFiltersSelected( {
-                       filter2: false
+                       group1__filter2: false
                } );
-               model.reassessFilterInteractions( model.getItemByName( 'filter2' ) );
+               model.reassessFilterInteractions( model.getItemByName( 'group1__filter2' ) );
                assert.deepEqual(
                        model.getFullState(),
                        baseFullState,
                        },
                        getCurrentItemsMutedState = function () {
                                return {
-                                       filter1: isCapsuleItemMuted( 'filter1' ),
-                                       filter2: isCapsuleItemMuted( 'filter2' ),
-                                       filter3: isCapsuleItemMuted( 'filter3' ),
-                                       filter4: isCapsuleItemMuted( 'filter4' ),
-                                       filter5: isCapsuleItemMuted( 'filter5' ),
-                                       filter6: isCapsuleItemMuted( 'filter6' )
+                                       group1__filter1: isCapsuleItemMuted( 'group1__filter1' ),
+                                       group1__filter2: isCapsuleItemMuted( 'group1__filter2' ),
+                                       group1__filter3: isCapsuleItemMuted( 'group1__filter3' ),
+                                       group2__filter4: isCapsuleItemMuted( 'group2__filter4' ),
+                                       group2__filter5: isCapsuleItemMuted( 'group2__filter5' ),
+                                       group2__filter6: isCapsuleItemMuted( 'group2__filter6' )
                                };
                        },
                        baseMuteState = {
-                               filter1: false,
-                               filter2: false,
-                               filter3: false,
-                               filter4: false,
-                               filter5: false,
-                               filter6: false
+                               group1__filter1: false,
+                               group1__filter2: false,
+                               group1__filter3: false,
+                               group2__filter4: false,
+                               group2__filter5: false,
+                               group2__filter6: false
                        };
 
                model.initializeFilters( definition );
 
                // Select most (but not all) items in each group
                model.toggleFiltersSelected( {
-                       filter1: true,
-                       filter2: true,
-                       filter4: true,
-                       filter5: true
+                       group1__filter1: true,
+                       group1__filter2: true,
+                       group2__filter4: true,
+                       group2__filter5: true
                } );
 
                // Both groups have multiple (but not all) items selected, all items are non-muted
 
                // Select all items in 'fullCoverage' group (group2)
                model.toggleFiltersSelected( {
-                       filter6: true
+                       group2__filter6: true
                } );
 
                // Group2 (full coverage) has all items selected, all its items are muted
                assert.deepEqual(
                        getCurrentItemsMutedState(),
                        $.extend( {}, baseMuteState, {
-                               filter4: true,
-                               filter5: true,
-                               filter6: true
+                               group2__filter4: true,
+                               group2__filter5: true,
+                               group2__filter6: true
                        } ),
                        'All items in \'full coverage\' group are selected - all items in the group are muted'
                );
 
                // Select all items in non 'fullCoverage' group (group1)
                model.toggleFiltersSelected( {
-                       filter3: true
+                       group1__filter3: true
                } );
 
                // Group1 (full coverage) has all items selected, no items in it are muted (non full coverage)
                assert.deepEqual(
                        getCurrentItemsMutedState(),
                        $.extend( {}, baseMuteState, {
-                               filter4: true,
-                               filter5: true,
-                               filter6: true
+                               group2__filter4: true,
+                               group2__filter5: true,
+                               group2__filter6: true
                        } ),
                        'All items in a non \'full coverage\' group are selected - none of the items in the group are muted'
                );
 
                // Uncheck an item from each group
                model.toggleFiltersSelected( {
-                       filter3: false,
-                       filter5: false
+                       group1__filter3: false,
+                       group2__filter5: false
                } );
                assert.deepEqual(
                        getCurrentItemsMutedState(),
                                ]
                        } ],
                        baseFullState = {
-                               filter1: { selected: false, conflicted: false, included: false },
-                               filter2: { selected: false, conflicted: false, included: false },
-                               filter3: { selected: false, conflicted: false, included: false },
-                               filter4: { selected: false, conflicted: false, included: false },
-                               filter5: { selected: false, conflicted: false, included: false },
-                               filter6: { selected: false, conflicted: false, included: false }
+                               group1__filter1: { selected: false, conflicted: false, included: false },
+                               group1__filter2: { selected: false, conflicted: false, included: false },
+                               group1__filter3: { selected: false, conflicted: false, included: false },
+                               group2__filter4: { selected: false, conflicted: false, included: false },
+                               group2__filter5: { selected: false, conflicted: false, included: false },
+                               group2__filter6: { selected: false, conflicted: false, included: false }
                        },
                        model = new mw.rcfilters.dm.FiltersViewModel();
 
 
                // Select a filter that has a conflict with an entire group
                model.toggleFiltersSelected( {
-                       filter1: true // conflicts: entire of group 2 ( filter4, filter5, filter6)
+                       group1__filter1: true // conflicts: entire of group 2 ( filter4, filter5, filter6)
                } );
 
-               model.reassessFilterInteractions( model.getItemByName( 'filter1' ) );
+               model.reassessFilterInteractions( model.getItemByName( 'group1__filter1' ) );
 
                assert.deepEqual(
                        model.getFullState(),
                        $.extend( true, {}, baseFullState, {
-                               filter1: { selected: true },
-                               filter4: { conflicted: true },
-                               filter5: { conflicted: true },
-                               filter6: { conflicted: true }
+                               group1__filter1: { selected: true },
+                               group2__filter4: { conflicted: true },
+                               group2__filter5: { conflicted: true },
+                               group2__filter6: { conflicted: true }
                        } ),
                        'Selecting a filter that conflicts with a group sets all the conflicted group items as "conflicted".'
                );
 
                // Select one of the conflicts (both filters are now conflicted and selected)
                model.toggleFiltersSelected( {
-                       filter4: true // conflicts: filter 1
+                       group2__filter4: true // conflicts: filter 1
                } );
-               model.reassessFilterInteractions( model.getItemByName( 'filter4' ) );
+               model.reassessFilterInteractions( model.getItemByName( 'group2__filter4' ) );
 
                assert.deepEqual(
                        model.getFullState(),
                        $.extend( true, {}, baseFullState, {
-                               filter1: { selected: true, conflicted: true },
-                               filter4: { selected: true, conflicted: true },
-                               filter5: { conflicted: true },
-                               filter6: { conflicted: true }
+                               group1__filter1: { selected: true, conflicted: true },
+                               group2__filter4: { selected: true, conflicted: true },
+                               group2__filter5: { conflicted: true },
+                               group2__filter6: { conflicted: true }
                        } ),
                        'Selecting a conflicting filter inside a group, sets both sides to conflicted and selected.'
                );
 
                // Select a filter that has a conflict with a specific filter
                model.toggleFiltersSelected( {
-                       filter2: true // conflicts: filter6
+                       group1__filter2: true // conflicts: filter6
                } );
-
-               model.reassessFilterInteractions( model.getItemByName( 'filter2' ) );
+               model.reassessFilterInteractions( model.getItemByName( 'group1__filter2' ) );
 
                assert.deepEqual(
                        model.getFullState(),
                        $.extend( true, {}, baseFullState, {
-                               filter2: { selected: true },
-                               filter6: { conflicted: true }
+                               group1__filter2: { selected: true },
+                               group2__filter6: { conflicted: true }
                        } ),
                        'Selecting a filter that conflicts with another filter sets the other as "conflicted".'
                );
 
                // Select the conflicting filter
                model.toggleFiltersSelected( {
-                       filter6: true // conflicts: filter2
+                       group2__filter6: true // conflicts: filter2
                } );
 
-               model.reassessFilterInteractions( model.getItemByName( 'filter6' ) );
+               model.reassessFilterInteractions( model.getItemByName( 'group2__filter6' ) );
 
                assert.deepEqual(
                        model.getFullState(),
                        $.extend( true, {}, baseFullState, {
-                               filter2: { selected: true, conflicted: true },
-                               filter6: { selected: true, conflicted: true },
+                               group1__filter2: { selected: true, conflicted: true },
+                               group2__filter6: { selected: true, conflicted: true },
                                // This is added to the conflicts because filter6 is part of group2,
                                // who is in conflict with filter1; note that filter2 also conflicts
                                // with filter6 which means that filter1 conflicts with filter6 (because it's in group2)
                                // and also because its **own sibling** (filter2) is **also** in conflict with the
                                // selected items in group2 (filter6)
-                               filter1: { conflicted: true }
+                               group1__filter1: { conflicted: true }
                        } ),
                        'Selecting a conflicting filter with an individual filter, sets both sides to conflicted and selected.'
                );
 
                // Now choose a non-conflicting filter from the group
                model.toggleFiltersSelected( {
-                       filter5: true
+                       group2__filter5: true
                } );
 
-               model.reassessFilterInteractions( model.getItemByName( 'filter5' ) );
+               model.reassessFilterInteractions( model.getItemByName( 'group2__filter5' ) );
 
                assert.deepEqual(
                        model.getFullState(),
                        $.extend( true, {}, baseFullState, {
-                               filter2: { selected: true },
-                               filter6: { selected: true },
-                               filter5: { selected: true }
+                               group1__filter2: { selected: true },
+                               group2__filter6: { selected: true },
+                               group2__filter5: { selected: true }
                                // Filter6 and filter1 are no longer in conflict because
                                // filter5, while it is in conflict with filter1, it is
                                // not in conflict with filter2 - and since filter2 is
                // it is in conflict with the entire of group2, it means
                // filter1 is once again conflicted
                model.toggleFiltersSelected( {
-                       filter2: false
+                       group1__filter2: false
                } );
 
-               model.reassessFilterInteractions( model.getItemByName( 'filter2' ) );
+               model.reassessFilterInteractions( model.getItemByName( 'group1__filter2' ) );
 
                assert.deepEqual(
                        model.getFullState(),
                        $.extend( true, {}, baseFullState, {
-                               filter1: { conflicted: true },
-                               filter6: { selected: true },
-                               filter5: { selected: true }
+                               group1__filter1: { conflicted: true },
+                               group2__filter6: { selected: true },
+                               group2__filter5: { selected: true }
                        } ),
                        'Unselecting an item that did not conflict returns the conflict state.'
                );
 
                // Followup #2: Now actually select filter1, and make everything conflicted
                model.toggleFiltersSelected( {
-                       filter1: true
+                       group1__filter1: true
                } );
 
-               model.reassessFilterInteractions( model.getItemByName( 'filter1' ) );
+               model.reassessFilterInteractions( model.getItemByName( 'group1__filter1' ) );
 
                assert.deepEqual(
                        model.getFullState(),
                        $.extend( true, {}, baseFullState, {
-                               filter1: { selected: true, conflicted: true },
-                               filter6: { selected: true, conflicted: true },
-                               filter5: { selected: true, conflicted: true },
-                               filter4: { conflicted: true } // Not selected but conflicted because it's in group2
+                               group1__filter1: { selected: true, conflicted: true },
+                               group2__filter6: { selected: true, conflicted: true },
+                               group2__filter5: { selected: true, conflicted: true },
+                               group2__filter4: { conflicted: true } // Not selected but conflicted because it's in group2
                        } ),
                        'Selecting an item that conflicts with a whole group makes all selections in that group conflicted.'
                );
 
                // Select a filter that has a conflict with a specific filter
                model.toggleFiltersSelected( {
-                       filter2: true // conflicts: filter6
+                       group1__filter2: true // conflicts: filter6
                } );
 
-               model.reassessFilterInteractions( model.getItemByName( 'filter2' ) );
+               model.reassessFilterInteractions( model.getItemByName( 'group1__filter2' ) );
 
                assert.deepEqual(
                        model.getFullState(),
                        $.extend( true, {}, baseFullState, {
-                               filter2: { selected: true },
-                               filter6: { conflicted: true }
+                               group1__filter2: { selected: true },
+                               group2__filter6: { conflicted: true }
                        } ),
                        'Simple case: Selecting a filter that conflicts with another filter sets the other as "conflicted".'
                );
 
                model.toggleFiltersSelected( {
-                       filter3: true // conflicts: filter6
+                       group1__filter3: true // conflicts: filter6
                } );
 
-               model.reassessFilterInteractions( model.getItemByName( 'filter3' ) );
+               model.reassessFilterInteractions( model.getItemByName( 'group1__filter3' ) );
 
                assert.deepEqual(
                        model.getFullState(),
                        $.extend( true, {}, baseFullState, {
-                               filter2: { selected: true },
-                               filter3: { selected: true }
+                               group1__filter2: { selected: true },
+                               group1__filter3: { selected: true }
                        } ),
                        'Simple case: Selecting a filter that is not in conflict removes the conflict.'
                );
                        'Highlight is enabled on toggle.'
                );
 
-               model.setHighlightColor( 'filter1', 'color1' );
-               model.setHighlightColor( 'filter2', 'color2' );
+               model.setHighlightColor( 'group1__filter1', 'color1' );
+               model.setHighlightColor( 'group1__filter2', 'color2' );
 
                assert.deepEqual(
                        model.getHighlightedItems().map( function ( item ) {
                                return item.getName();
                        } ),
                        [
-                               'filter1',
-                               'filter2'
+                               'group1__filter1',
+                               'group1__filter2'
                        ],
                        'Highlighted items are highlighted.'
                );
 
                assert.equal(
-                       model.getItemByName( 'filter1' ).getHighlightColor(),
+                       model.getItemByName( 'group1__filter1' ).getHighlightColor(),
                        'color1',
                        'Item highlight color is set.'
                );
 
-               model.setHighlightColor( 'filter1', 'color1changed' );
+               model.setHighlightColor( 'group1__filter1', 'color1changed' );
                assert.equal(
-                       model.getItemByName( 'filter1' ).getHighlightColor(),
+                       model.getItemByName( 'group1__filter1' ).getHighlightColor(),
                        'color1changed',
                        'Item highlight color is changed on setHighlightColor.'
                );
 
-               model.clearHighlightColor( 'filter1' );
+               model.clearHighlightColor( 'group1__filter1' );
                assert.deepEqual(
                        model.getHighlightedItems().map( function ( item ) {
                                return item.getName();
                        } ),
                        [
-                               'filter2'
+                               'group1__filter2'
                        ],
                        'Clear highlight from an item results in the item no longer being highlighted.'
                );
                model = new mw.rcfilters.dm.FiltersViewModel();
                model.initializeFilters( definition );
 
-               model.setHighlightColor( 'filter1', 'color1' );
-               model.setHighlightColor( 'filter2', 'color2' );
-               model.setHighlightColor( 'filter3', 'color3' );
+               model.setHighlightColor( 'group1__filter1', 'color1' );
+               model.setHighlightColor( 'group1__filter2', 'color2' );
+               model.setHighlightColor( 'group1__filter3', 'color3' );
 
                assert.deepEqual(
                        model.getHighlightedItems().map( function ( item ) {
                                return item.getName();
                        } ),
                        [
-                               'filter1',
-                               'filter2',
-                               'filter3'
+                               'group1__filter1',
+                               'group1__filter2',
+                               'group1__filter3'
                        ],
                        'Even if highlights are not enabled, the items remember their highlight state'
                        // NOTE: When actually displaying the highlights, the UI checks whether
                model = new mw.rcfilters.dm.FiltersViewModel();
                model.initializeFilters( definition );
 
-               model.setHighlightColor( 'filter1', 'color1' );
-               model.setHighlightColor( 'filter6', 'color6' );
+               model.setHighlightColor( 'group1__filter1', 'color1' );
+               model.setHighlightColor( 'group1__filter6', 'color6' );
 
                assert.deepEqual(
                        model.getHighlightedItems().map( function ( item ) {
                                return item.getName();
                        } ),
                        [
-                               'filter1'
+                               'group1__filter1'
                        ],
                        'Items without a specified class identifier are not highlighted.'
                );
index 3b549bd..3c77a00 100644 (file)
                );
        } );
 
+       QUnit.test( 'setParserDefaults', function ( assert ) {
+               mw.jqueryMsg.setParserDefaults( {
+                       magic: {
+                               FOO: 'foo',
+                               BAR: 'bar'
+                       }
+               } );
+
+               assert.deepEqual(
+                       mw.jqueryMsg.getParserDefaults().magic,
+                       {
+                               FOO: 'foo',
+                               BAR: 'bar'
+                       },
+                       'setParserDefaults is shallow by default'
+               );
+
+               mw.jqueryMsg.setParserDefaults(
+                       {
+                               magic: {
+                                       BAZ: 'baz'
+                               }
+                       },
+                       true
+               );
+
+               assert.deepEqual(
+                       mw.jqueryMsg.getParserDefaults().magic,
+                       {
+                               FOO: 'foo',
+                               BAR: 'bar',
+                               BAZ: 'baz'
+                       },
+                       'setParserDefaults is deep if requested'
+               );
+       } );
 }( mediaWiki, jQuery ) );
diff --git a/tests/selenium/.eslintrc.json b/tests/selenium/.eslintrc.json
new file mode 100644 (file)
index 0000000..b2d0bdd
--- /dev/null
@@ -0,0 +1,11 @@
+{
+       "extends": "../../.eslintrc.json",
+       "env": {
+               "es6": true,
+               "mocha": true,
+               "node": true
+       },
+       "globals": {
+               "browser": false
+       }
+}
diff --git a/tests/selenium/README.md b/tests/selenium/README.md
new file mode 100644 (file)
index 0000000..479b958
--- /dev/null
@@ -0,0 +1,52 @@
+# Selenium tests
+
+## Prerequisites
+
+- [Chrome](https://www.google.com/chrome/)
+- [ChromeDriver](https://sites.google.com/a/chromium.org/chromedriver/)
+- [Node.js](https://nodejs.org/en/)
+- [MediaWiki-Vagrant](https://www.mediawiki.org/wiki/MediaWiki-Vagrant)
+
+Set up MediaWiki-Vagrant:
+
+    cd mediawiki/vagrant
+    vagrant up
+
+## Installation
+
+    cd mediawiki
+    npm install
+
+## Usage
+
+    npm run selenium
+
+To run only one file (for example page.js), you first need to spawn the chromedriver:
+
+    chromedriver --url-base=/wd/hub --port=4444
+
+Then in another terminal:
+
+    cd mediawiki/tests/selenium
+    ../../node_modules/.bin/wdio --spec page.js
+
+The runner reads the config file `wdio.conf.js` and runs the spec listed in
+`page.js`.
+
+The defaults in the configuration files aim are targetting  a MediaWiki-Vagrant
+installation on installation on http://127.0.0.1:8080 with a user Admin and
+password 'vagrant'.  Those settings can be overriden using environment
+variables:
+
+`MW_SERVER`: to be set to the value of your $wgServer
+`MW_SCRIPT_PATH`: ditto with  $wgScriptPath
+`MEDIAWIKI_USER`: username of an account that can create users on the wiki.
+`MEDIAWIKI_PASSWORD`: password for above user
+
+Example:
+
+    MW_SERVER=http://example.org MW_SCRIPT_PATH=/dev/w npm run selenium
+
+## Links
+
+- [Selenium/Node.js](https://www.mediawiki.org/wiki/Selenium/Node.js)
diff --git a/tests/selenium/pageobjects/createaccount.page.js b/tests/selenium/pageobjects/createaccount.page.js
new file mode 100644 (file)
index 0000000..a0b9490
--- /dev/null
@@ -0,0 +1,25 @@
+'use strict';
+const Page = require( './page' );
+
+class CreateAccountPage extends Page {
+
+       get username() { return browser.element( '#wpName2' ); }
+       get password() { return browser.element( '#wpPassword2' ); }
+       get confirmPassword() { return browser.element( '#wpRetype' ); }
+       get create() { return browser.element( '#wpCreateaccount' ); }
+       get heading() { return browser.element( '#firstHeading' ); }
+
+       open() {
+               super.open( 'Special:CreateAccount' );
+       }
+
+       createAccount( username, password ) {
+               this.open();
+               this.username.setValue( username );
+               this.password.setValue( password );
+               this.confirmPassword.setValue( password );
+               this.create.click();
+       }
+
+}
+module.exports = new CreateAccountPage();
diff --git a/tests/selenium/pageobjects/edit.page.js b/tests/selenium/pageobjects/edit.page.js
new file mode 100644 (file)
index 0000000..819c546
--- /dev/null
@@ -0,0 +1,22 @@
+'use strict';
+const Page = require( './page' );
+
+class EditPage extends Page {
+
+       get content() { return browser.element( '#wpTextbox1' ); }
+       get displayedContent() { return browser.element( '#mw-content-text' ); }
+       get heading() { return browser.element( '#firstHeading' ); }
+       get save() { return browser.element( '#wpSave' ); }
+
+       open( name ) {
+               super.open( name + '&action=edit' );
+       }
+
+       edit( name, content ) {
+               this.open( name );
+               this.content.setValue( content );
+               this.save.click();
+       }
+
+}
+module.exports = new EditPage();
diff --git a/tests/selenium/pageobjects/history.page.js b/tests/selenium/pageobjects/history.page.js
new file mode 100644 (file)
index 0000000..869484e
--- /dev/null
@@ -0,0 +1,13 @@
+'use strict';
+const Page = require( './page' );
+
+class HistoryPage extends Page {
+
+       get comment() { return browser.element( '#pagehistory .comment' ); }
+
+       open( name ) {
+               super.open( name + '&action=history' );
+       }
+
+}
+module.exports = new HistoryPage();
diff --git a/tests/selenium/pageobjects/page.js b/tests/selenium/pageobjects/page.js
new file mode 100644 (file)
index 0000000..864bdae
--- /dev/null
@@ -0,0 +1,11 @@
+// From http://webdriver.io/guide/testrunner/pageobjects.html
+'use strict';
+class Page {
+       constructor() {
+               this.title = 'My Page';
+       }
+       open( path ) {
+               browser.url( '/index.php?title=' + path );
+       }
+}
+module.exports = Page;
diff --git a/tests/selenium/pageobjects/preferences.page.js b/tests/selenium/pageobjects/preferences.page.js
new file mode 100644 (file)
index 0000000..98b87fe
--- /dev/null
@@ -0,0 +1,20 @@
+'use strict';
+const Page = require( './page' );
+
+class PreferencesPage extends Page {
+
+       get realName() { return browser.element( '#mw-input-wprealname' ); }
+       get save() { return browser.element( '#prefcontrol' ); }
+
+       open() {
+               super.open( 'Special:Preferences' );
+       }
+
+       changeRealName( realName ) {
+               this.open();
+               this.realName.setValue( realName );
+               this.save.click();
+       }
+
+}
+module.exports = new PreferencesPage();
diff --git a/tests/selenium/pageobjects/userlogin.page.js b/tests/selenium/pageobjects/userlogin.page.js
new file mode 100644 (file)
index 0000000..bdbd41b
--- /dev/null
@@ -0,0 +1,23 @@
+'use strict';
+const Page = require( './page' );
+
+class UserLoginPage extends Page {
+
+       get username() { return browser.element( '#wpName1' ); }
+       get password() { return browser.element( '#wpPassword1' ); }
+       get loginButton() { return browser.element( '#wpLoginAttempt' ); }
+       get userPage() { return browser.element( '#pt-userpage' ); }
+
+       open() {
+               super.open( 'Special:UserLogin' );
+       }
+
+       login( username, password ) {
+               this.open();
+               this.username.setValue( username );
+               this.password.setValue( password );
+               this.loginButton.click();
+       }
+
+}
+module.exports = new UserLoginPage();
diff --git a/tests/selenium/pageobjects/userlogout.page.js b/tests/selenium/pageobjects/userlogout.page.js
new file mode 100644 (file)
index 0000000..e355fd5
--- /dev/null
@@ -0,0 +1,11 @@
+'use strict';
+const Page = require( './page' );
+
+class UserLogoutPage extends Page {
+
+       open() {
+               super.open( 'Special:UserLogout' );
+       }
+
+}
+module.exports = new UserLogoutPage();
diff --git a/tests/selenium/specs/page.js b/tests/selenium/specs/page.js
new file mode 100644 (file)
index 0000000..da80aaf
--- /dev/null
@@ -0,0 +1,54 @@
+'use strict';
+const assert = require( 'assert' ),
+       HistoryPage = require( '../pageobjects/history.page' ),
+       EditPage = require( '../pageobjects/edit.page' );
+
+describe( 'Page', function () {
+
+       var content,
+               name;
+
+       beforeEach( function () {
+               content = Math.random().toString();
+               name = Math.random().toString();
+       } );
+
+       it( 'should be creatable', function () {
+
+               // create
+               EditPage.edit( name, content );
+
+               // check
+               assert.equal( EditPage.heading.getText(), name );
+               assert.equal( EditPage.displayedContent.getText(), content );
+
+       } );
+
+       it( 'should be editable', function () {
+
+               var content2 = Math.random().toString();
+
+               // create
+               EditPage.edit( name, content );
+
+               // edit
+               EditPage.edit( name, content2 );
+
+               // check content
+               assert.equal( EditPage.heading.getText(), name );
+               assert.equal( EditPage.displayedContent.getText(), content2 );
+
+       } );
+
+       it( 'should have history', function () {
+
+               // create
+               EditPage.edit( name, content );
+
+               // check
+               HistoryPage.open( name );
+               assert.equal( HistoryPage.comment.getText(), `(Created page with "${content}")` );
+
+       } );
+
+} );
diff --git a/tests/selenium/specs/user.js b/tests/selenium/specs/user.js
new file mode 100644 (file)
index 0000000..6746c5b
--- /dev/null
@@ -0,0 +1,59 @@
+'use strict';
+const assert = require( 'assert' ),
+       CreateAccountPage = require( '../pageobjects/createaccount.page' ),
+       UserLoginPage = require( '../pageobjects/userlogin.page' ),
+       UserLogoutPage = require( '../pageobjects/userlogout.page' ),
+       PreferencesPage = require( '../pageobjects/preferences.page' );
+
+describe( 'User', function () {
+
+       var password,
+               username;
+
+       beforeEach( function () {
+               username = `User-${Math.random().toString()}`;
+               password = Math.random().toString();
+       } );
+
+       it( 'should be able to create account', function () {
+
+               // create
+               CreateAccountPage.createAccount( username, password );
+
+               // check
+               assert.equal( CreateAccountPage.heading.getText(), `Welcome, ${username}!` );
+
+       } );
+
+       it( 'should be able to log in', function () {
+
+               // create
+               CreateAccountPage.createAccount( username, password );
+
+               // logout
+               UserLogoutPage.open();
+
+               // log in
+               UserLoginPage.login( username, password );
+
+               // check
+               assert.equal( UserLoginPage.userPage.getText(), username );
+
+       } );
+
+       it( 'should be able to change preferences', function () {
+
+               var realName = Math.random().toString();
+
+               // create
+               CreateAccountPage.createAccount( username, password );
+
+               // change real name
+               PreferencesPage.changeRealName( realName );
+
+               // check
+               assert.equal( PreferencesPage.realName.getValue(), realName );
+
+       } );
+
+} );
diff --git a/tests/selenium/wdio.conf.jenkins.js b/tests/selenium/wdio.conf.jenkins.js
new file mode 100644 (file)
index 0000000..4491c8e
--- /dev/null
@@ -0,0 +1,20 @@
+/* eslint no-undef: "error"*/
+/* eslint-env node*/
+'use strict';
+var merge = require( 'deepmerge' ),
+       wdioConf = require( './wdio.conf.js' );
+
+// Overwrite default settings
+exports.config = merge( wdioConf.config, {
+       username: 'WikiAdmin',
+       password: 'testpass',
+       screenshotPath: '../log/',
+       baseUrl: process.env.MW_SERVER + process.env.MW_SCRIPT_PATH,
+
+       reporters: [ 'spec', 'junit' ],
+       reporterOptions: {
+               junit: {
+                       outputDir: '../log/'
+               }
+       }
+} );
diff --git a/tests/selenium/wdio.conf.js b/tests/selenium/wdio.conf.js
new file mode 100644 (file)
index 0000000..b5dc61a
--- /dev/null
@@ -0,0 +1,228 @@
+/* eslint comma-dangle: 0 */
+/* eslint no-undef: "error"*/
+/* eslint no-console: 0 */
+/* eslint-env node*/
+'use strict';
+
+const path = require( 'path' );
+
+function relPath( foo ) {
+       return path.resolve( __dirname, '../..', foo );
+}
+
+exports.config = {
+
+       //
+       // ======
+       //
+       // ======
+       // Custom
+       // ======
+       // Define any custom variables.
+       // Example:
+       // username: 'Admin',
+       // Use if from tests with:
+       // browser.options.username
+       username: process.env.MEDIAWIKI_USER === undefined ?
+               'Admin' :
+               process.env.MEDIAWIKI_USER,
+       password: process.env.MEDIAWIKI_PASSWORD === undefined ?
+               'vagrant' :
+               process.env.MEDIAWIKI_PASSWORD,
+       //
+       // ==================
+       // Specify Test Files
+       // ==================
+       // Define which test specs should run. The pattern is relative to the directory
+       // from which `wdio` was called. Notice that, if you are calling `wdio` from an
+       // NPM script (see https://docs.npmjs.com/cli/run-script) then the current working
+       // directory is where your package.json resides, so `wdio` will be called from there.
+       //
+       specs: [
+               relPath( './tests/selenium/specs/**/*.js' ),
+               relPath( './extensions/*/tests/selenium/specs/**/*.js' ),
+               relPath( './extensions/VisualEditor/modules/ve-mw/tests/selenium/specs/**/*.js' )
+       ],
+       // Patterns to exclude.
+       exclude: [
+       // 'path/to/excluded/files'
+       ],
+       //
+       // ============
+       // Capabilities
+       // ============
+       // Define your capabilities here. WebdriverIO can run multiple capabilities at the same
+       // time. Depending on the number of capabilities, WebdriverIO launches several test
+       // sessions. Within your capabilities you can overwrite the spec and exclude options in
+       // order to group specific specs to a specific capability.
+       //
+       // First, you can define how many instances should be started at the same time. Let's
+       // say you have 3 different capabilities (Chrome, Firefox, and Safari) and you have
+       // set maxInstances to 1; wdio will spawn 3 processes. Therefore, if you have 10 spec
+       // files and you set maxInstances to 10, all spec files will get tested at the same time
+       // and 30 processes will get spawned. The property handles how many capabilities
+       // from the same test should run tests.
+       //
+       maxInstances: 1,
+       //
+       // If you have trouble getting all important capabilities together, check out the
+       // Sauce Labs platform configurator - a great tool to configure your capabilities:
+       // https://docs.saucelabs.com/reference/platforms-configurator
+       //
+       // For Chrome/Chromium https://sites.google.com/a/chromium.org/chromedriver/capabilities
+       capabilities: [ {
+               // maxInstances can get overwritten per capability. So if you have an in-house Selenium
+               // grid with only 5 firefox instances available you can make sure that not more than
+               // 5 instances get started at a time.
+               maxInstances: 1,
+               //
+               browserName: 'chrome',
+               // Since Chrome v57 https://bugs.chromium.org/p/chromedriver/issues/detail?id=1625
+               chromeOptions: {
+                       args: [ '--enable-automation' ]
+               }
+       } ],
+       //
+       // ===================
+       // Test Configurations
+       // ===================
+       // Define all options that are relevant for the WebdriverIO instance here
+       //
+       // By default WebdriverIO commands are executed in a synchronous way using
+       // the wdio-sync package. If you still want to run your tests in an async way
+       // e.g. using promises you can set the sync option to false.
+       sync: true,
+       //
+       // Level of logging verbosity: silent | verbose | command | data | result | error
+       logLevel: 'error',
+       //
+       // Enables colors for log output.
+       coloredLogs: true,
+       //
+       // Saves a screenshot to a given path if a command fails.
+       screenshotPath: './log/',
+       //
+       // Set a base URL in order to shorten url command calls. If your url parameter starts
+       // with "/", then the base url gets prepended.
+       baseUrl: (
+               process.env.MW_SERVER === undefined ?
+               'http://127.0.0.1:8080' :
+               process.env.MW_SERVER
+       ) + (
+               process.env.MW_SCRIPT_PATH === undefined ?
+               '/w' :
+               process.env.MW_SCRIPT_PATH
+       ),
+       //
+       // Default timeout for all waitFor* commands.
+       waitforTimeout: 20000,
+       //
+       // Default timeout in milliseconds for request
+       // if Selenium Grid doesn't send response
+       connectionRetryTimeout: 90000,
+       //
+       // Default request retries count
+       connectionRetryCount: 3,
+       //
+       // Initialize the browser instance with a WebdriverIO plugin. The object should have the
+       // plugin name as key and the desired plugin options as properties. Make sure you have
+       // the plugin installed before running any tests. The following plugins are currently
+       // available:
+       // WebdriverCSS: https://github.com/webdriverio/webdrivercss
+       // WebdriverRTC: https://github.com/webdriverio/webdriverrtc
+       // Browserevent: https://github.com/webdriverio/browserevent
+       // plugins: {
+       //     webdrivercss: {
+       //         screenshotRoot: 'my-shots',
+       //         failedComparisonsRoot: 'diffs',
+       //         misMatchTolerance: 0.05,
+       //         screenWidth: [320,480,640,1024]
+       //     },
+       //     webdriverrtc: {},
+       //     browserevent: {}
+       // },
+       //
+       // Test runner services
+       // Services take over a specific job you don't want to take care of. They enhance
+       // your test setup with almost no effort. Unlike plugins, they don't add new
+       // commands. Instead, they hook themselves up into the test process.
+       // services: [],//
+       // Framework you want to run your specs with.
+       // The following are supported: Mocha, Jasmine, and Cucumber
+       // see also: http://webdriver.io/guide/testrunner/frameworks.html
+       //
+       // Make sure you have the wdio adapter package for the specific framework installed
+       // before running any tests.
+       framework: 'mocha',
+
+       // Test reporter for stdout.
+       // The only one supported by default is 'dot'
+       // see also: http://webdriver.io/guide/testrunner/reporters.html
+       reporters: [ 'spec' ],
+       //
+       // Options to be passed to Mocha.
+       // See the full list at http://mochajs.org/
+       mochaOpts: {
+               ui: 'bdd',
+               timeout: 20000
+       },
+       //
+       // =====
+       // Hooks
+       // =====
+       // WebdriverIO provides several hooks you can use to interfere with the test process in order to enhance
+       // it and to build services around it. You can either apply a single function or an array of
+       // methods to it. If one of them returns with a promise, WebdriverIO will wait until that promise got
+       // resolved to continue.
+       //
+       // Gets executed once before all workers get launched.
+       // onPrepare: function ( config, capabilities ) {
+       // }
+       //
+       // Gets executed before test execution begins. At this point you can access all global
+       // variables, such as `browser`. It is the perfect place to define custom commands.
+       // before: function (capabilities, specs) {
+       // },
+       //
+       // Hook that gets executed before the suite starts
+       // beforeSuite: function (suite) {
+       // },
+       //
+       // Hook that gets executed _before_ a hook within the suite starts (e.g. runs before calling
+       // beforeEach in Mocha)
+       // beforeHook: function () {
+       // },
+       //
+       // Hook that gets executed _after_ a hook within the suite starts (e.g. runs after calling
+       // afterEach in Mocha)
+       //
+       // Function to be executed before a test (in Mocha/Jasmine) or a step (in Cucumber) starts.
+       // beforeTest: function (test) {
+       // },
+       //
+       // Runs before a WebdriverIO command gets executed.
+       // beforeCommand: function (commandName, args) {
+       // },
+       //
+       // Runs after a WebdriverIO command gets executed
+       // afterCommand: function (commandName, args, result, error) {
+       // },
+       //
+       // Function to be executed after a test (in Mocha/Jasmine) or a step (in Cucumber) starts.
+       // afterTest: function (test) {
+       // },
+       //
+       // Hook that gets executed after the suite has ended
+       // afterSuite: function (suite) {
+       // },
+       //
+       // Gets executed after all tests are done. You still have access to all global variables from
+       // the test.
+       // after: function (result, capabilities, specs) {
+       // },
+       //
+       // Gets executed after all workers got shut down and the process is about to exit. It is not
+       // possible to defer the end of the process using a promise.
+       // onComplete: function(exitCode) {
+       // }
+};
index de201b9..d97f8e8 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -22,6 +22,7 @@
  */
 
 use MediaWiki\Logger\LoggerFactory;
+use MediaWiki\MediaWikiServices;
 
 define( 'MW_NO_OUTPUT_COMPRESSION', 1 );
 require __DIR__ . '/includes/WebStart.php';
@@ -317,7 +318,9 @@ function wfStreamThumb( array $params ) {
                $streamtime = microtime( true ) - $starttime;
 
                if ( $status->isOK() ) {
-                       RequestContext::getMain()->getStats()->timing( 'media.thumbnail.stream', $streamtime );
+                       MediaWikiServices::getInstance()->getStatsdDataFactory()->timing(
+                               'media.thumbnail.stream', $streamtime
+                       );
                } else {
                        wfThumbError( 500, 'Could not stream the file', null, [ 'file' => $thumbName,
                                'path' => $thumbPath, 'error' => $status->getWikiText( false, false, 'en' ) ] );