Merge "Add some output for progress in populateChangeTagDef.php"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Tue, 26 Jun 2018 10:54:25 +0000 (10:54 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Tue, 26 Jun 2018 10:54:25 +0000 (10:54 +0000)
189 files changed:
Gruntfile.js
RELEASE-NOTES-1.32
docs/hooks.txt
includes/CategoryViewer.php
includes/DefaultSettings.php
includes/EditPage.php
includes/GitInfo.php
includes/Html.php
includes/MediaWikiServices.php
includes/Revision.php
includes/ServiceWiring.php
includes/Storage/PageUpdater.php
includes/Storage/RevisionSlots.php
includes/Storage/SqlBlobStore.php
includes/Xml.php
includes/actions/HistoryAction.php
includes/api/ApiMain.php
includes/api/ApiQueryFileRepoInfo.php
includes/api/i18n/ar.json
includes/api/i18n/cs.json
includes/api/i18n/de.json
includes/api/i18n/en.json
includes/api/i18n/fr.json
includes/api/i18n/he.json
includes/api/i18n/ko.json
includes/api/i18n/nl.json
includes/api/i18n/pt-br.json
includes/api/i18n/pt.json
includes/api/i18n/qqq.json
includes/api/i18n/zh-hans.json
includes/cache/MessageCache.php
includes/cache/localisation/LCStoreStaticArray.php
includes/changes/ChangesList.php
includes/changes/EnhancedChangesList.php
includes/changetags/ChangeTags.php
includes/content/ContentHandler.php
includes/diff/DifferenceEngine.php
includes/diff/TableDiffFormatter.php
includes/diff/WordAccumulator.php
includes/exception/MWExceptionRenderer.php
includes/htmlform/HTMLForm.php
includes/htmlform/HTMLFormField.php
includes/htmlform/fields/HTMLButtonField.php
includes/htmlform/fields/HTMLCheckField.php
includes/htmlform/fields/HTMLCheckMatrix.php
includes/htmlform/fields/HTMLFormFieldCloner.php
includes/htmlform/fields/HTMLFormFieldWithButton.php
includes/htmlform/fields/HTMLMultiSelectField.php
includes/htmlform/fields/HTMLRadioField.php
includes/htmlform/fields/HTMLSizeFilterField.php
includes/installer/WebInstaller.php
includes/installer/WebInstallerLanguage.php
includes/installer/WebInstallerOptions.php
includes/installer/i18n/es.json
includes/installer/i18n/he.json
includes/installer/i18n/nl.json
includes/installer/i18n/sr-ec.json
includes/libs/Xhprof.php
includes/libs/objectcache/WANObjectCache.php
includes/libs/rdbms/lbfactory/LBFactory.php
includes/libs/rdbms/loadbalancer/LoadBalancer.php
includes/logging/LogEventsList.php
includes/page/Article.php
includes/page/WikiPage.php
includes/pager/TablePager.php
includes/parser/Parser.php
includes/parser/Sanitizer.php
includes/preferences/DefaultPreferencesFactory.php
includes/profiler/ProfilerXhprof.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/skins/Skin.php
includes/specialpage/ChangesListSpecialPage.php
includes/specials/SpecialContributions.php
includes/specials/SpecialEmailuser.php
includes/specials/SpecialMergeHistory.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialUserrights.php
includes/specials/SpecialWatchlist.php
includes/specials/SpecialWhatlinkshere.php
includes/specials/pagers/AllMessagesTablePager.php
languages/LanguageConverter.php
languages/classes/LanguageEn.php
languages/data/Names.php
languages/i18n/ace.json
languages/i18n/ar.json
languages/i18n/as.json
languages/i18n/bar.json
languages/i18n/be-tarask.json
languages/i18n/bn.json
languages/i18n/bpy.json
languages/i18n/br.json
languages/i18n/bs.json
languages/i18n/ca.json
languages/i18n/cs.json
languages/i18n/cy.json
languages/i18n/de-formal.json
languages/i18n/de.json
languages/i18n/el.json
languages/i18n/en.json
languages/i18n/es.json
languages/i18n/eu.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/got.json
languages/i18n/he.json
languages/i18n/hr.json
languages/i18n/inh.json
languages/i18n/io.json
languages/i18n/it.json
languages/i18n/ko.json
languages/i18n/lfn.json
languages/i18n/lt.json
languages/i18n/lv.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/mni.json [new file with mode: 0644]
languages/i18n/my.json
languages/i18n/nan.json
languages/i18n/nap.json
languages/i18n/nds-nl.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/pl.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/sh.json
languages/i18n/sk.json
languages/i18n/sl.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/sv.json
languages/i18n/szl.json
languages/i18n/te.json
languages/i18n/ur.json
languages/i18n/vi.json
languages/i18n/wa.json
languages/i18n/zgh.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/messages/MessagesAb.php
maintenance/Maintenance.php
maintenance/jsduck/eg-iframe.html
resources/Resources.php
resources/src/mediawiki.base/mediawiki.base.js [new file with mode: 0644]
resources/src/mediawiki.base/mediawiki.errorLogger.js [new file with mode: 0644]
resources/src/mediawiki.hidpi/hidpi.js [deleted file]
resources/src/mediawiki.hidpi/skip.js [deleted file]
resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js
resources/src/mediawiki.rcfilters/mw.rcfilters.init.js
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterTagMultiselectWidget.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.WatchlistTopSectionWidget.less
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterTagMultiselectWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterWrapperWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.MainWrapperWidget.js
resources/src/mediawiki/mediawiki.base.js [deleted file]
resources/src/mediawiki/mediawiki.errorLogger.js [deleted file]
resources/src/mediawiki/mediawiki.js
tests/parser/DbTestRecorder.php
tests/parser/parserTests.txt
tests/phpunit/includes/HtmlTest.php
tests/phpunit/includes/MediaWikiServicesTest.php
tests/phpunit/includes/RevisionTest.php
tests/phpunit/includes/Storage/PageUpdaterTest.php
tests/phpunit/includes/Storage/RevisionSlotsTest.php
tests/phpunit/includes/Storage/SqlBlobStoreTest.php
tests/phpunit/includes/api/ApiMainTest.php
tests/phpunit/includes/api/ApiOptionsTest.php
tests/phpunit/includes/changetags/ChangeTagsTest.php
tests/phpunit/includes/libs/XhprofTest.php
tests/phpunit/includes/page/WikiPageDbTestBase.php
tests/phpunit/includes/resourceloader/ResourceLoaderStartUpModuleTest.php
tests/qunit/QUnitTestResources.php
tests/qunit/suites/resources/mediawiki/mediawiki.base.test.js [new file with mode: 0644]
tests/qunit/suites/resources/mediawiki/mediawiki.test.js
tests/selenium/pageobjects/recentchanges.page.js
tests/selenium/pageobjects/watchable.page.js [new file with mode: 0644]
tests/selenium/pageobjects/watchlist.page.js [new file with mode: 0644]
tests/selenium/specs/page.js
tests/selenium/specs/specialrecentchanges.js
tests/selenium/specs/specialwatchlist.js [new file with mode: 0644]
tests/selenium/specs/user.js
tests/selenium/wdio-mediawiki/CHANGELOG.md
tests/selenium/wdio-mediawiki/Util.js [new file with mode: 0644]
tests/selenium/wdio-mediawiki/package.json
tests/selenium/wdio.conf.js

index 8018212..6be908e 100644 (file)
@@ -33,9 +33,7 @@ module.exports = function ( grunt ) {
                                '!vendor/**',
                                // Explicitly say "**/*.js" here in case of symlinks
                                '!extensions/**/*.js',
-                               '!skins/**/*.js',
-                               // Skip functions aren't even parseable
-                               '!resources/src/mediawiki.hidpi/skip.js'
+                               '!skins/**/*.js'
                        ]
                },
                jsonlint: {
index 731f874..3c60124 100644 (file)
@@ -78,6 +78,9 @@ production.
     templated parameters.
 * It is now an error to submit too many values for a multi-valued parameter.
   This has generated a warning since MediaWiki 1.14.
+* Assertion failures from the 'assert' and 'assertuser' parameters will no
+  longer use the action module's custom response format, for the few modules
+  that use custom formatters that handle errors.
 
 === Action API internal changes in 1.32 ===
 * Added 'ApiParseMakeOutputPage' hook.
@@ -129,6 +132,7 @@ because of Phabricator reports.
   removed. Use JobQueueGroup::singleton()->push() instead.
 * The jquery.footHovzer module, for mediawiki.debug, was removed.
 * The es5-shim module, empty and deprecated since 1.29, was removed.
+* the dom-level2-shim module, empty and deprecated since 1.29, was removed.
 * The mediawiki.widgets.visibleByteLimit module alias, deprecated in 1.32, was
   removed. Use mediawiki.widgets.visibleLengthLimit instead.
 * The jquery.farbtastic module, unused since 1.18, was removed.
@@ -214,6 +218,7 @@ because of Phabricator reports.
 * (T176526) EditPage::getContextTitle() falling back to $wgTitle when the
   context title is unset is now deprecated; anything creating an EditPage
   instance should set the context title via ::setContextTitle().
+* The 'jquery.hidpi' module (polyfill for IMG srcset) is deprecated.
 
 === Other changes in 1.32 ===
 * …
index b452b94..708456c 100644 (file)
@@ -2394,7 +2394,9 @@ $row: the database row for this page (the recentchanges record and a few extras
 edit.
 $wikiPage: the WikiPage edited
 $rev: the new revision
-$baseID: the revision ID this was based off, if any
+$originalRevId: if the edit restores or repeats an earlier revision (such as a
+  rollback or a null revision), the ID of that earlier revision. False otherwise.
+  (Used to be called $baseID.)
 $user: the editing user
 &$tags: tags to apply to the edit and recent change
 
@@ -2502,7 +2504,9 @@ $flags: Flags passed to WikiPage::doEditContent()
 $revision: New Revision of the article (can be null for edits that change
   nothing)
 $status: Status object about to be returned by doEditContent()
-$baseRevId: the rev ID (or false) this edit was based on
+$originalRevId: if the edit restores or repeats an earlier revision (such as a
+  rollback or a null revision), the ID of that earlier revision. False otherwise.
+  (Used to be called $baseRevId.)
 $undidRevId: the rev ID (or 0) this edit undid
 
 'PageHistoryBeforeList': When a history page list is about to be constructed.
index 4202249..79ab8b4 100644 (file)
@@ -581,7 +581,7 @@ class CategoryViewer extends ContextSource {
 
                foreach ( $colContents as $char => $articles ) {
                        # Change space to non-breaking space to keep headers aligned
-                       $h3char = $char === ' ' ? '&#160;' : htmlspecialchars( $char );
+                       $h3char = $char === ' ' ? "\u{00A0}" : htmlspecialchars( $char );
 
                        $ret .= '<div class="mw-category-group"><h3>' . $h3char;
                        $ret .= "</h3>\n";
index 2c98283..3771df1 100644 (file)
@@ -1500,10 +1500,6 @@ $wgDirectoryMode = 0777;
  *
  * This means a 320x240 use of an image on the wiki will also generate 480x360 and 640x480
  * thumbnails, output via the srcset attribute.
- *
- * On older browsers, a JavaScript polyfill switches the appropriate images in after loading
- * the original low-resolution versions depending on the reported window.devicePixelRatio.
- * The polyfill can be found in the jquery.hidpi module.
  */
 $wgResponsiveImages = true;
 
@@ -1896,6 +1892,8 @@ $wgDBmwschema = null;
 
 /**
  * Default group to use when getting database connections.
+ * Will be used as default query group in ILoadBalancer::getConnection.
+ * @since 1.32
  */
 $wgDBDefaultGroup = null;
 
index 9209761..9a8a4a6 100644 (file)
@@ -235,7 +235,10 @@ class EditPage {
        /** @var string */
        public $action = 'submit';
 
-       /** @var bool */
+       /** @var bool Whether an edit conflict needs to be resolved. Detected based on whether
+        * $editRevId is different from the current revision. When a conflict has successfully
+        * been resolved by a 3-way-merge, this field is set to false.
+        */
        public $isConflict = false;
 
        /** @var bool New page or new section */
@@ -301,7 +304,7 @@ class EditPage {
        /** @var bool Has a summary been preset using GET parameter &summary= ? */
        public $hasPresetSummary = false;
 
-       /** @var Revision|bool|null */
+       /** @var Revision|bool|null A revision object corresponding to $this->editRevId. */
        public $mBaseRevision = false;
 
        /** @var bool */
@@ -342,7 +345,16 @@ class EditPage {
        /** @var string */
        public $edittime = '';
 
-       /** @var int */
+       /** @var int ID of the current revision at the time editing was initiated on the client.
+        * This is used to detect and resolve edit conflicts.
+        *
+        * @note 0 if the page did not exist at that time.
+        * @note When starting an edit from an old revision, this still records the current
+        * revision at the time , not the one the edit is based on.
+        *
+        * @see $oldid
+        * @see getBaseRevision()
+        */
        private $editRevId = null;
 
        /** @var string */
@@ -354,10 +366,16 @@ class EditPage {
        /** @var string */
        public $starttime = '';
 
-       /** @var int */
+       /** @var int Revision ID the edit is based on, or 0 if it's the current revision.
+        * @see $editRevId
+        */
        public $oldid = 0;
 
-       /** @var int */
+       /** @var int Revision ID the edit is based on, adjusted when an edit conflict is resolved.
+        * @see $editRevId
+        * @see $oldid
+        * @see getparentRevId()
+        */
        public $parentRevId = 0;
 
        /** @var string */
@@ -1184,6 +1202,7 @@ class EditPage {
                                if ( $undo > 0 && $undoafter > 0 ) {
                                        $undorev = Revision::newFromId( $undo );
                                        $oldrev = Revision::newFromId( $undoafter );
+                                       $undoMsg = null;
 
                                        # Sanity check, make sure it's the right page,
                                        # the revisions exist and they were not deleted.
@@ -1192,12 +1211,19 @@ class EditPage {
                                                !$undorev->isDeleted( Revision::DELETED_TEXT ) &&
                                                !$oldrev->isDeleted( Revision::DELETED_TEXT )
                                        ) {
-                                               $content = $this->page->getUndoContent( $undorev, $oldrev );
-
-                                               if ( $content === false ) {
-                                                       # Warn the user that something went wrong
-                                                       $undoMsg = 'failure';
+                                               if ( WikiPage::hasDifferencesOutsideMainSlot( $undorev, $oldrev ) ) {
+                                                       // Cannot yet undo edits that involve anything other the main slot.
+                                                       $undoMsg = 'main-slot-only';
                                                } else {
+                                                       $content = $this->page->getUndoContent( $undorev, $oldrev );
+
+                                                       if ( $content === false ) {
+                                                               # Warn the user that something went wrong
+                                                               $undoMsg = 'failure';
+                                                       }
+                                               }
+
+                                               if ( $undoMsg === null ) {
                                                        $oldContent = $this->page->getContent( Revision::RAW );
                                                        $popts = ParserOptions::newFromUserAndLang( $user, $wgContLang );
                                                        $newContent = $content->preSaveTransform( $this->mTitle, $user, $popts );
@@ -1254,7 +1280,8 @@ class EditPage {
                                        }
 
                                        $out = $this->context->getOutput();
-                                       // Messages: undo-success, undo-failure, undo-norev, undo-nochange
+                                       // Messages: undo-success, undo-failure, undo-main-slot-only, undo-norev,
+                                       // undo-nochange.
                                        $class = ( $undoMsg == 'success' ? '' : 'error ' ) . "mw-undo-{$undoMsg}";
                                        $this->editFormPageTop .= $out->parse( "<div class=\"{$class}\">" .
                                                $this->context->msg( 'undo-' . $undoMsg )->plain() . '</div>', true, /* interface */true );
@@ -2021,7 +2048,10 @@ ERROR;
 
                        wfDebug( "timestamp: {$timestamp}, edittime: {$this->edittime}\n" );
 
-                       // Check editRevId if set, which handles same-second timestamp collisions
+                       // An edit conflict is detected if the current revision is different from the
+                       // revision that was current when editing was initiated on the client.
+                       // This is checked based on the timestamp and revision ID.
+                       // TODO: the timestamp based check can probably go away now.
                        if ( $timestamp != $this->edittime
                                || ( $this->editRevId !== null && $this->editRevId != $latest )
                        ) {
@@ -2301,7 +2331,8 @@ ERROR;
        private function mergeChangesIntoContent( &$editContent ) {
                $db = wfGetDB( DB_MASTER );
 
-               // This is the revision the editor started from
+               // This is the revision that was current at the time editing was initiated on the client,
+               // even if the edit was based on an old revision.
                $baseRevision = $this->getBaseRevision();
                $baseContent = $baseRevision ? $baseRevision->getContent() : null;
 
@@ -2332,9 +2363,16 @@ ERROR;
        }
 
        /**
-        * @note: this method is very poorly named. If the user opened the form with ?oldid=X,
-        *        one might think of X as the "base revision", which is NOT what this returns.
-        * @return Revision|null Current version when the edit was started
+        * Returns the revision that was current at the time editing was initiated on the client,
+        * even if the edit was based on an old revision.
+        *
+        * @warning: this method is very poorly named. If the user opened the form with ?oldid=X,
+        *        one might think of X as the "base revision", which is NOT what this returns,
+        *        see oldid for that. One might further assume that this corresponds to the $baseRevId
+        *        parameter of WikiPage::doEditContent, which is not the case either.
+        *        getExpectedParentRevision() would perhaps be a better name.
+        *
+        * @return Revision|null Current version when editing was initiated on the client
         */
        public function getBaseRevision() {
                if ( !$this->mBaseRevision ) {
index 6270b27..363d7b8 100644 (file)
@@ -227,6 +227,7 @@ class GitInfo {
                        $date = false;
                        if ( is_file( $wgGitBin ) &&
                                is_executable( $wgGitBin ) &&
+                               !Shell::isDisabled() &&
                                $this->getHead() !== false
                        ) {
                                $cmd = [
index 2ca5229..0016426 100644 (file)
@@ -927,7 +927,7 @@ class Html {
                                'label', [
                                        'for' => $selectAttribs['id'] ?? null,
                                ], $params['label']
-                       ) . '&#160;';
+                       ) . "\u{00A0}";
                }
 
                // Wrap options in a <select>
index dbb18a7..ac15574 100644 (file)
@@ -789,6 +789,14 @@ class MediaWikiServices extends ServiceContainer {
                return $this->getService( 'SlotRoleStore' );
        }
 
+       /**
+        * @since 1.32
+        * @return NameTableStore
+        */
+       public function getChangeTagDefStore() {
+               return $this->getService( 'ChangeTagDefStore' );
+       }
+
        /**
         * @since 1.31
         * @return PreferencesFactory
index b9a03f5..dc15f97 100644 (file)
@@ -1038,7 +1038,18 @@ class Revision implements IDBAccessObject {
                        ? SqlBlobStore::makeAddressFromTextId( $row->old_id )
                        : null;
 
-               return self::getBlobStore( $wiki )->expandBlob( $text, $flags, $cacheKey );
+               $revisionText = self::getBlobStore( $wiki )->expandBlob( $text, $flags, $cacheKey );
+
+               if ( $revisionText === false ) {
+                       if ( isset( $row->old_id ) ) {
+                               wfLogWarning( __METHOD__ . ": Bad data in text row {$row->old_id}! " );
+                       } else {
+                               wfLogWarning( __METHOD__ . ": Bad data in text row! " );
+                       }
+                       return false;
+               }
+
+               return $revisionText;
        }
 
        /**
@@ -1063,6 +1074,11 @@ class Revision implements IDBAccessObject {
         * @return string|bool Decompressed text, or false on failure
         */
        public static function decompressRevisionText( $text, $flags ) {
+               if ( $text === false ) {
+                       // Text failed to be fetched; nothing to do
+                       return false;
+               }
+
                return self::getBlobStore()->decompressData( $text, $flags );
        }
 
index 379424c..425b789 100644 (file)
@@ -540,6 +540,24 @@ return [
                );
        },
 
+       'ChangeTagDefStore' => function ( MediaWikiServices $services ) {
+               return new NameTableStore(
+                       $services->getDBLoadBalancer(),
+                       $services->getMainWANObjectCache(),
+                       LoggerFactory::getInstance( 'NameTableSqlStore' ),
+                       'change_tag_def',
+                       'ctd_id',
+                       'ctd_name',
+                       null,
+                       false,
+                       function ( $insertFields ) {
+                               $insertFields['ctd_user_defined'] = 0;
+                               $insertFields['ctd_count'] = 0;
+                               return $insertFields;
+                       }
+               );
+       },
+
        'PreferencesFactory' => function ( MediaWikiServices $services ) {
                global $wgContLang;
                $authManager = AuthManager::singleton();
index 10caac4..7900210 100644 (file)
@@ -112,15 +112,9 @@ class PageUpdater {
        private $ajaxEditStash = true;
 
        /**
-        * The ID of the logical base revision the content of the new revision is based on.
-        * Not to be confused with the immediate parent revision (the current revision before the
-        * new revision is created).
-        * The base revision is the last revision known to the client, while the parent revision
-        * is determined on the server by grabParentRevision().
-        *
         * @var bool|int
         */
-       private $baseRevId = false;
+       private $originalRevId = false;
 
        /**
         * @var array
@@ -247,19 +241,19 @@ class PageUpdater {
        }
 
        /**
-        * Checks whether this update conflicts with another update performed since the specified base
-        * revision. A user level "edit conflict" is detected when the base revision known to the client
-        * and specified via setBaseRevisionId() is not the ID of the current revision before the
-        * update. If setBaseRevisionId() was not called, this method always returns false.
+        * Checks whether this update conflicts with another update performed between the client
+        * loading data to prepare an edit, and the client committing the edit. This is intended to
+        * detect user level "edit conflict" when the latest revision known to the client
+        * is no longer the current revision when processing the update.
         *
-        * Note that an update expected to be based on a non-existing page will have base revision ID 0,
-        * and is considered to have a conflict if a current revision exists (that is, the page was
-        * created since the base revision was determined by the client).
+        * An update expected to create a new page can be checked by setting $expectedParentRevision = 0.
+        * Such an update is considered to have a conflict if a current revision exists (that is,
+        * the page was created since the edit was initiated on the client).
         *
         * This method returning true indicates to calling code that edit conflict resolution should
         * be applied before saving any data. It does not prevent the update from being performed, and
         * it should not be confused with a "late" conflict indicated by the "edit-conflict" status.
-        * A "late" conflict is a CAS failure caused by an update being performed concurrently, between
+        * A "late" conflict is a CAS failure caused by an update being performed concurrently between
         * the time grabParentRevision() was called and the time saveRevision() trying to insert the
         * new revision.
         *
@@ -269,22 +263,21 @@ class PageUpdater {
         * for the update to be fixed to the page's current revision at this point in time.
         * It acts as a compare-and-swap (CAS) token in that it is guaranteed that saveRevision()
         * will fail with the "edit-conflict" status if the current revision of the page changes after
-        * hasEditConflict() was called and before saveRevision() could insert a new revision.
+        * hasEditConflict() (or grabParentRevision()) was called and before saveRevision() could insert
+        * a new revision.
         *
         * @see grabParentRevision()
         *
+        * @param int $expectedParentRevision The ID of the revision the client expects to be the
+        *        current one. Use 0 to indicate that the page is expected to not yet exist.
+        *
         * @return bool
         */
-       public function hasEditConflict() {
-               $baseId = $this->getBaseRevisionId();
-               if ( $baseId === false ) {
-                       return false;
-               }
-
+       public function hasEditConflict( $expectedParentRevision ) {
                $parent = $this->grabParentRevision();
                $parentId = $parent ? $parent->getId() : 0;
 
-               return $parentId !== $baseId;
+               return $parentId !== $expectedParentRevision;
        }
 
        /**
@@ -328,18 +321,13 @@ class PageUpdater {
 
        /**
         * Check flags and add EDIT_NEW or EDIT_UPDATE to them as needed.
-        * This also performs sanity checks against the base revision specified via setBaseRevisionId().
         *
         * @param int $flags
         * @return int Updated $flags
         */
        private function checkFlags( $flags ) {
                if ( !( $flags & EDIT_NEW ) && !( $flags & EDIT_UPDATE ) ) {
-                       if ( $this->baseRevId === false ) {
-                               $flags |= ( $this->derivedDataUpdater->pageExisted() ) ? EDIT_UPDATE : EDIT_NEW;
-                       } else {
-                               $flags |= ( $this->baseRevId > 0 ) ? EDIT_UPDATE : EDIT_NEW;
-                       }
+                       $flags |= ( $this->derivedDataUpdater->pageExisted() ) ? EDIT_UPDATE : EDIT_NEW;
                }
 
                return $flags;
@@ -398,37 +386,29 @@ class PageUpdater {
        }
 
        /**
-        * Returns the ID of the logical base revision of the update. Not to be confused with the
-        * immediate parent revision. The base revision is set via setBaseRevisionId(),
-        * the parent revision is determined by grabParentRevision().
+        * Returns the ID of an earlier revision that is being repeated or restored by this update.
         *
-        * Application may use this information to detect user level edit conflicts. Edit conflicts
-        * can be resolved by performing a 3-way merge, using the revision returned by this method as
-        * the common base of the conflicting revisions, namely the new revision being saved,
-        * and the revision returned by grabParentRevision().
-        *
-        * @return bool|int The ID of the base revision, 0 if the base is a non-existing page, false
-        *         if no base revision was specified.
+        * @return bool|int The original revision id, or false if no earlier revision is known to be
+        * repeated or restored by this update.
         */
-       public function getBaseRevisionId() {
-               return $this->baseRevId;
+       public function getOriginalRevisionId() {
+               return $this->originalRevId;
        }
 
        /**
-        * Sets the ID of the revision the content of this update is based on, if any.
-        * The base revision ID is not to be confused with the new revision's parent revision:
-        * the parent revision is the page's current revision immediately before the new revision
-        * is created; the base revision indicates what revision the client based the content of
-        * the new revision on. If base revision and parent revision are not the same, the update is
-        * considered to require edit conflict resolution.
+        * Sets the ID of an earlier revision that is being repeated or restored by this update.
+        * The new revision is expected to have the exact same content as the given original revision.
+        * This is used with rollbacks and with dummy "null" revisions which are created to record
+        * things like page moves.
+        *
+        * This value is passed to the PageContentSaveComplete and NewRevisionFromEditComplete hooks.
         *
-        * @param int|bool $baseRevId The ID of the base revision, or 0 if the update is expected to be
-        *        performed on a non-existing page. false can be used to indicate that the caller
-        *        doesn't care about the base revision.
+        * @param int|bool $originalRevId The original revision id, or false if no earlier revision
+        * is known to be repeated or restored by this update.
         */
-       public function setBaseRevisionId( $baseRevId ) {
-               Assert::parameterType( 'integer|boolean', $baseRevId, '$baseRevId' );
-               $this->baseRevId = $baseRevId;
+       public function setOriginalRevisionId( $originalRevId ) {
+               Assert::parameterType( 'integer|boolean', $originalRevId, '$originalRevId' );
+               $this->originalRevId = $originalRevId;
        }
 
        /**
@@ -589,10 +569,9 @@ class PageUpdater {
         * changes after grabParentRevision() was called and before saveRevision() can insert
         * a new revision, as per the CAS mechanism described above.
         *
-        * However, the actual parent revision is allowed to be different from the revision set
-        * with setBaseRevisionId(). The caller is responsible for checking this via
-        * hasEditConflict() and adjusting the content of the new revision accordingly,
-        * using a 3-way-merge if desired.
+        * The caller is however responsible for calling hasEditConflict() to detect a
+        * user-level edit conflict, and to adjust the content of the new revision accordingly,
+        * e.g. by using a 3-way-merge.
         *
         * MCR migration note: this replaces WikiPage::doEditContent. Callers that change to using
         * saveRevision() now need to check the "minoredit" themselves before using EDIT_MINOR.
@@ -660,9 +639,7 @@ class PageUpdater {
                // NOTE: This grabs the parent revision as the CAS token, if grabParentRevision
                // wasn't called yet. If the page is modified by another process before we are done with
                // it, this method must fail (with status 'edit-conflict')!
-               // NOTE: The actual parent revision may be different from $this->baseRevisionId.
-               // The caller is responsible for checking this via hasEditConflict and adjusting the
-               // content of the new revision accordingly, using a 3-way-merge.
+               // NOTE: The parent revision may be different from $this->baseRevisionId.
                $this->grabParentRevision();
                $flags = $this->checkFlags( $flags );
 
@@ -987,7 +964,7 @@ class PageUpdater {
                        $tags = $this->computeEffectiveTags( $flags );
                        Hooks::run(
                                'NewRevisionFromEditComplete',
-                               [ $wikiPage, $newLegacyRevision, $this->baseRevId, $user, &$tags ]
+                               [ $wikiPage, $newLegacyRevision, $this->getOriginalRevisionId(), $user, &$tags ]
                        );
 
                        // Update recentchanges
@@ -1064,7 +1041,7 @@ class PageUpdater {
                                        // TODO: replace legacy hook!
                                        // TODO: avoid pass-by-reference, see T193950
                                        $params = [ &$wikiPage, &$user, $mainContent, $summary->text, $flags & EDIT_MINOR,
-                                               null, null, &$flags, $newLegacyRevision, &$status, $this->baseRevId,
+                                               null, null, &$flags, $newLegacyRevision, &$status, $this->getOriginalRevisionId(),
                                                $this->undidRevId ];
                                        Hooks::run( 'PageContentSaveComplete', $params );
                                }
@@ -1218,7 +1195,7 @@ class PageUpdater {
                                        Hooks::run( 'PageContentInsertComplete', $params );
                                        // Trigger post-save hook
                                        // TODO: replace legacy hook!
-                                       $params = array_merge( $params, [ &$status, $this->baseRevId, 0 ] );
+                                       $params = array_merge( $params, [ &$status, $this->getOriginalRevisionId(), 0 ] );
                                        Hooks::run( 'PageContentSaveComplete', $params );
                                }
                        ),
index f37e722..ba9780f 100644 (file)
@@ -270,4 +270,43 @@ class RevisionSlots {
                return true;
        }
 
+       /**
+        * Find roles for which the $other RevisionSlots object has different content
+        * as this RevisionSlots object, including any roles that are present in one
+        * but not the other.
+        *
+        * @param RevisionSlots $other
+        *
+        * @return string[] a list of slot roles that are different.
+        */
+       public function getRolesWithDifferentContent( RevisionSlots $other ) {
+               if ( $other === $this ) {
+                       return [];
+               }
+
+               $aSlots = $this->getSlots();
+               $bSlots = $other->getSlots();
+
+               ksort( $aSlots );
+               ksort( $bSlots );
+
+               $different = array_keys( array_merge(
+                       array_diff_key( $aSlots, $bSlots ),
+                       array_diff_key( $bSlots, $aSlots )
+               ) );
+
+               /** @var SlotRecord[] $common */
+               $common = array_intersect_key( $aSlots, $bSlots );
+
+               foreach ( $common as $role => $s ) {
+                       $t = $bSlots[$role];
+
+                       if ( !$s->hasSameContent( $t ) ) {
+                               $different[] = $role;
+                       }
+               }
+
+               return $different;
+       }
+
 }
index 72de2c9..fb3ef94 100644 (file)
@@ -349,7 +349,7 @@ class SqlBlobStore implements IDBAccessObject, BlobStore {
                $blob = $this->expandBlob( $row->old_text, $row->old_flags, $blobAddress );
 
                if ( $blob === false ) {
-                       wfWarn( __METHOD__ . ": Bad data in text row $textId." );
+                       wfLogWarning( __METHOD__ . ": Bad data in text row $textId." );
                        return false;
                }
 
@@ -399,13 +399,13 @@ class SqlBlobStore implements IDBAccessObject, BlobStore {
                                                // No negative caching per BlobStore::getBlob()
                                                $blob = ExternalStore::fetchFromURL( $url, [ 'wiki' => $this->wikiId ] );
 
-                                               return $this->decompressData( $blob, $flags );
+                                               return $blob === false ? false : $this->decompressData( $blob, $flags );
                                        },
                                        [ 'pcGroup' => self::TEXT_CACHE_GROUP, 'pcTTL' => WANObjectCache::TTL_PROC_LONG ]
                                );
                        } else {
                                $blob = ExternalStore::fetchFromURL( $url, [ 'wiki' => $this->wikiId ] );
-                               return $this->decompressData( $blob, $flags );
+                               return $blob === false ? false : $this->decompressData( $blob, $flags );
                        }
                } else {
                        return $this->decompressData( $raw, $flags );
@@ -461,7 +461,7 @@ class SqlBlobStore implements IDBAccessObject, BlobStore {
         * @note direct use is deprecated, use getBlob() or SlotRecord::getContent() instead.
         * @todo make this private, there should be no need to use this method outside this class.
         *
-        * @param mixed $blob Reference to a text
+        * @param string $blob Blob in compressed/encoded form.
         * @param array $blobFlags Compression flags, such as 'gzip'.
         *   Note that not including 'utf-8' in $blobFlags will cause the data to be decoded
         *   according to the legacy encoding specified via setLegacyEncoding.
@@ -469,10 +469,8 @@ class SqlBlobStore implements IDBAccessObject, BlobStore {
         * @return string|bool Decompressed text, or false on failure
         */
        public function decompressData( $blob, array $blobFlags ) {
-               if ( $blob === false ) {
-                       // Text failed to be fetched; nothing to do
-                       return false;
-               }
+               // Revision::decompressRevisionText accepted false here, so defend against that
+               Assert::parameterType( 'string', $blob, '$blob' );
 
                if ( in_array( 'error', $blobFlags ) ) {
                        // Error row, return false
@@ -486,7 +484,7 @@ class SqlBlobStore implements IDBAccessObject, BlobStore {
                        $blob = gzinflate( $blob );
 
                        if ( $blob === false ) {
-                               wfLogWarning( __METHOD__ . ': gzinflate() failed' );
+                               wfWarn( __METHOD__ . ': gzinflate() failed' );
                                return false;
                        }
                }
index af38740..40be80b 100644 (file)
@@ -382,7 +382,7 @@ class Xml {
                $value = false, $attribs = []
        ) {
                list( $label, $input ) = self::inputLabelSep( $label, $name, $id, $size, $value, $attribs );
-               return $label . '&#160;' . $input;
+               return $label . "\u{00A0}" . $input;
        }
 
        /**
@@ -420,7 +420,7 @@ class Xml {
        public static function checkLabel( $label, $name, $id, $checked = false, $attribs = [] ) {
                global $wgUseMediaWikiUIEverywhere;
                $chkLabel = self::check( $name, $checked, [ 'id' => $id ] + $attribs ) .
-                       '&#160;' .
+                       "\u{00A0}" .
                        self::label( $label, $id, $attribs );
 
                if ( $wgUseMediaWikiUIEverywhere ) {
@@ -446,7 +446,7 @@ class Xml {
                $checked = false, $attribs = []
        ) {
                return self::radio( $name, $value, $checked, [ 'id' => $id ] + $attribs ) .
-                       '&#160;' .
+                       "\u{00A0}" .
                        self::label( $label, $id, $attribs );
        }
 
index ad26256..8ea50ec 100644 (file)
@@ -197,8 +197,8 @@ class HistoryAction extends FormlessAction {
                $content .= Xml::dateMenu(
                        ( $year == null ? MWTimestamp::getLocalInstance()->format( 'Y' ) : $year ),
                        $month
-               ) . '&#160;';
-               $content .= $tagSelector ? ( implode( '&#160;', $tagSelector ) . '&#160;' ) : '';
+               ) . "\u{00A0}";
+               $content .= $tagSelector ? ( implode( "\u{00A0}", $tagSelector ) . "\u{00A0}" ) : '';
                $content .= $checkDeleted . Html::submitButton(
                        $this->msg( 'historyaction-submit' )->text(),
                        [],
index c0c4895..f324eff 100644 (file)
@@ -1554,6 +1554,11 @@ class ApiMain extends ApiBase {
         */
        protected function executeAction() {
                $params = $this->setupExecuteAction();
+
+               // Check asserts early so e.g. errors in parsing a module's parameters due to being
+               // logged out don't override the client's intended "am I logged in?" check.
+               $this->checkAsserts( $params );
+
                $module = $this->setupModule();
                $this->mModule = $module;
 
@@ -1575,8 +1580,6 @@ class ApiMain extends ApiBase {
                        $this->setupExternalResponse( $module, $params );
                }
 
-               $this->checkAsserts( $params );
-
                // Execute
                $module->execute();
                Hooks::run( 'APIAfterExecute', [ &$module ] );
index 4589991..279bc0a 100644 (file)
@@ -81,6 +81,7 @@ class ApiQueryFileRepoInfo extends ApiQueryBase {
                                ApiBase::PARAM_DFLT => implode( '|', $props ),
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_TYPE => $props,
+                               ApiBase::PARAM_HELP_MSG_PER_VALUE => [],
                        ],
                ];
        }
@@ -100,14 +101,20 @@ class ApiQueryFileRepoInfo extends ApiQueryBase {
 
                $propValues[] = 'canUpload';
 
+               sort( $propValues );
                return $propValues;
        }
 
        protected function getExamplesMessages() {
-               return [
-                       'action=query&meta=filerepoinfo&friprop=apiurl|name|displayname'
-                               => 'apihelp-query+filerepoinfo-example-simple',
-               ];
+               $examples = [];
+
+               $props = array_intersect( [ 'apiurl', 'name', 'displayname' ], $this->getProps() );
+               if ( $props ) {
+                       $examples['action=query&meta=filerepoinfo&friprop=' . implode( '|', $props )] =
+                               'apihelp-query+filerepoinfo-example-simple';
+               }
+
+               return $examples;
        }
 
        public function getHelpUrls() {
index ca8ca7a..4b4177f 100644 (file)
        "apihelp-expandtemplates-paramvalue-prop-properties": "خصائص الصفحة التي تحددها الكلمات السحرية الموسعة في نص الويكي.",
        "apihelp-expandtemplates-paramvalue-prop-volatile": "إذا كان الإخراج سريع التأثر، ينبغي عدم استخدامه في أي مكان آخر داخل الصفحة.",
        "apihelp-expandtemplates-paramvalue-prop-ttl": "الحد الأقصى للوقت الذي يجب بعده إبطال ذاكرة التخزين المؤقت للنتيجة.",
+       "apihelp-expandtemplates-paramvalue-prop-modules": "تتم إضافة أية وحدات ResourceLoader التي طلبت تعيين دالات المحلل اللغوي إلى الإخراج، يجب طلب <kbd>jsconfigvars</kbd> أو <kbd>encodedjsconfigvars</kbd> بشكل مشترك مع <kbd>modules</kbd>.",
        "apihelp-expandtemplates-paramvalue-prop-jsconfigvars": "يعطي متغيرات تكوين جافا سكريبت الخاصة بهذه الصفحة.",
        "apihelp-expandtemplates-paramvalue-prop-encodedjsconfigvars": "يعطي متغيرات تكوين جافا سكريبت الخاصة بهذه الصفحة كسلسلة JSON.",
        "apihelp-expandtemplates-paramvalue-prop-parsetree": "شجرة تحليل XML للمدخلات.",
        "apihelp-query+alldeletedrevisions-param-user": "إددراج المراجعات بواسطة هذا المستخدم فقط.",
        "apihelp-query+alldeletedrevisions-param-excludeuser": "لا تسرد المراجعات بواسطة هذا المستخدم.",
        "apihelp-query+alldeletedrevisions-param-namespace": "أدرج الصفحات  في هذا النطاق فقط.",
-       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>ملاحظة:</strong> بسبب [[mw:Special:MyLanguage/Manual:$wgMiserMode|وضع miser]]، باستخدام <var>$1user</var> و<var>$1namespace</var> معا قد يؤدي إلى نتائج أقل من <var>$1limit</var> نتائج التي يتم عرضها قبل المتابعة، في الحالات القصوى، قد يتم إرجاع صفر نتائج.",
+       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>ملاحظة:</strong> بسبب [[mw:Special:MyLanguage/Manual:$wgMiserMode|وضع miser]]استخدام <var>$1user</var> و<var>$1namespace</var> معا قد يؤدي إلى نتائج أقل من <var>$1limit</var> نتائج التي يتم عرضها قبل المتابعة، في الحالات القصوى، قد يتم إرجاع صفر نتائج.",
        "apihelp-query+alldeletedrevisions-param-generatetitles": "عندما يُستخدَم كمولد، ولد عناوين بدلا من معرفات المراجعات.",
        "apihelp-query+alldeletedrevisions-example-user": "اذكر آخر 50 مشاركة محذوفة بواسطة المستخدم <kbd>Example</kbd.",
        "apihelp-query+alldeletedrevisions-example-ns-main": "سرد أول 50 مراجعات محذوفة في النطاق الرئيسي.",
        "apihelp-query+filearchive-paramvalue-prop-archivename": "يضيف اسم ملف إصدار الأرشيف للإصدارات غير الأحدث.",
        "apihelp-query+filearchive-example-simple": "عرض قائمة بجميع الملفات المحذوفة.",
        "apihelp-query+filerepoinfo-summary": "إرجاع معلومات التعريف حول مستودعات الصور المكونة في الويكي.",
-       "apihelp-query+filerepoinfo-param-prop": "أي خصائص المستودع يمكن الحصول عليها (قد يكون هناك المزيد متاح في بعض الويكيات): \n;apiurl:مسار إلى API المستودع ، مفيد للحصول على معلومات الصورة من المضيف.\n;name: مفتاح المستودع، يُستخدَم على سبيل المثال في قيم عودة <var>[[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> و[[Special:ApiHelp/query+imageinfo|معلومات الصورة]].",
+       "apihelp-query+filerepoinfo-param-prop": "أي خصائص المستودع للحصول عليها (قد يكون هناك المزيد متاح في بعض الويكيات).",
+       "apihelp-query+filerepoinfo-paramvalue-prop-apiurl": "مسار إلى API تطبيقات المستودع، مفيد في الحصول على معلومات الصورة من المضيف.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-articlepath": "مستودع الويكي <var>[[mw:Special:MyLanguage/Manual:$wgArticlePath|$wgArticlePath]]</var> أو ما يعادله.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-canUpload": "ما إذا كان يمكن رفع ملفات إلى هذا المستودع، على سبيل المثال عبر CORS والمصادقة المشتركة.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-displayname": "اسم قابل للقراءة من قبل الإنسان في مستودع الويكي.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-favicon": "مسار أيقونة المفضلة الخاصة بمستودع الويكي <var>[[mw:Special:MyLanguage/Manual:$wgFavicon|$wgFavicon]]</var>.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-fetchDescription": "ما إذا تم جلب صفحات وصف الملفات من هذا المستودع عند عرض صفحات وصف الملف المحلية.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-initialCapital": "ما إذا كانت أسماء الملفات تبدأ ضمنياً بحرف كبير.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-local": "سواء كان هذا المستودع محليا أم لا.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-name": "مفتاح المستودع، المستخدم على سبيل المثال في <var>[[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> and [[Special:ApiHelp/query+imageinfo|imageinfo]] يعيد القيم.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-rootUrl": "مسار مسار الجذر لمسارات الصورة.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-scriptDirUrl": "مسار مسار الجذر لتثبيت ميدياويكي الخاص بمستودع الويكي.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-server": "مستودع الويكي <var>[[mw:Special:MyLanguage/Manual:$wgServer|$wgServer]]</var> أو ما يعادله.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-thumbUrl": "مسار مسار الجذر لمسارات الصورة المصغرة.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-url": "مسار مسار المنطقة العامة.",
        "apihelp-query+filerepoinfo-example-simple": "الحصول على معلومات حول مستودعات الملفات.",
        "apihelp-query+fileusage-summary": "ابحث عن كل الصفحات التي تستخدم الملفات المعطاة.",
        "apihelp-query+fileusage-param-prop": "أي الخصائص للحصول عليها.",
        "apihelp-query+revisions+base-param-generatexml": "استخدم <kbd>[[Special:ApiHelp/expandtemplates|action=expandtemplates]]</kbd> أو <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd> بدلا من ذلك، قم بتوليد شجرة تحليل XML لمحتوى المراجعة (تتطلب $1prop=content).",
        "apihelp-query+revisions+base-param-parse": "استخدم <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd> بدلا من ذلك، تحليل محتوى المراجعة (يتطلب $1prop=content)، لأسباب تتعلق بالأداء; إذا تم استخدام هذا الخيار، يتم فرض $1limit إلى 1.",
        "apihelp-query+revisions+base-param-section": "استرجع محتويات رقم هذا القسم فقط.",
+       "apihelp-query+revisions+base-param-diffto": "استخدم <kbd>[[Special:ApiHelp/compare|action=compare]]</kbd> بدلا من ذلك، معرف المراجعة للتفريق بين كل مراجعة، استخدم <kbd>prev</kbd> و<kbd>next</kbd> و<kbd>cur</kbd> للمراجعة السابقة واللاحقة والحالية على التوالي.",
+       "apihelp-query+revisions+base-param-difftotext": "استخدم <kbd>[[Special:ApiHelp/compare|action=compare]]</kbd> بدلا من ذلك، النص للتفريق بين كل مراجعة، يختلف عدد محدود فقط من المراجعات، يتجاوز <var>$1diffto</var>، إذا تم تعيين <var>$1section</var>، فسيتم تمييز هذا القسم فقط مقابل هذا النص.",
        "apihelp-query+revisions+base-param-difftotextpst": "استخدم <kbd>[[Special:ApiHelp/compare|action=compare]]</kbd> بدلا من ذلك، قم بإجراء تحويل ما قبل الحفظ على النص قبل نشره، صالح فقط عند استخدامه مع <var>$1difftotext</var>.",
        "apihelp-query+revisions+base-param-contentformat": "تنسيق التسلسل المستخدم لـ<var>$1difftotext</var> والمتوقع لإخراج المحتوى.",
        "apihelp-query+search-summary": "إجراء بحث نص كامل.",
        "apihelp-query+usercontribs-summary": "الحصول على جميع التعديلات من قبل المستخدم.",
        "apihelp-query+usercontribs-param-limit": "الحد الأقصى لعدد المساهمات للعودة.",
        "apihelp-query+usercontribs-param-start": "الطابع الزمني للبدء للعودة منه.",
+       "apihelp-query+usercontribs-param-end": "الطابع الزمني للانتهاء للعودة إليه.",
+       "apihelp-query+usercontribs-param-user": "المستخدمون لاسترداد مساهمات لهم، لا يمكن استخدامه مع <var>$1userids</var> أو <var>$1userprefix</var>.",
+       "apihelp-query+usercontribs-param-userprefix": "استرداد المساهمات لجميع المستخدمين الذين تبدأ أسماؤهم بهذه القيمة، لا يمكن استخدامه مع <var>$1user</var> أو <var>$1userids</var>.",
+       "apihelp-query+usercontribs-param-userids": "معرفات المستخدم لاسترداد المساهمات لهم، لا يمكن استخدامه مع <var>$1user</var> أو <var>$1userprefix</var>.",
+       "apihelp-query+usercontribs-param-namespace": "إدراج المساهمات في هذه النطاقات فقط.",
        "apihelp-query+usercontribs-param-prop": "تضمين أجزاء إضافية من المعلومات:",
+       "apihelp-query+usercontribs-paramvalue-prop-ids": "يضيف معرف الصفحة ومعرف المراجعة.",
        "apihelp-query+usercontribs-paramvalue-prop-title": "يضيف معرف عنوان ونطاق الصفحة.",
+       "apihelp-query+usercontribs-paramvalue-prop-timestamp": "يضيف الطابع الزمني للتحرير.",
+       "apihelp-query+usercontribs-paramvalue-prop-comment": "يضيف تعليق التعديل.",
+       "apihelp-query+usercontribs-paramvalue-prop-parsedcomment": "يضيف التعليق المحلل للتحرير.",
+       "apihelp-query+usercontribs-paramvalue-prop-size": "يضيف الحجم الجديد للتحرير.",
+       "apihelp-query+usercontribs-paramvalue-prop-sizediff": "يضيف حجم دلتا التعديل ضد الأصل.",
+       "apihelp-query+usercontribs-paramvalue-prop-flags": "يضيف علامات التحرير.",
+       "apihelp-query+usercontribs-paramvalue-prop-patrolled": "يوسم التعديلات المراجعة.",
+       "apihelp-query+usercontribs-paramvalue-prop-autopatrolled": "يوسم التعديلات المراجعة تلقائيا.",
+       "apihelp-query+usercontribs-paramvalue-prop-tags": "يسرد وسوما للتحرير.",
+       "apihelp-query+usercontribs-param-show": "عرض العناصر التي تستوفي هذه المعايير فقط، مثل التعديلات الطفيفة فقط: <kbd>$2show=!minor</kbd>.\n\nإذا تم تعيين <kbd>$2show=patrolled</kbd> or <kbd>$2show=!patrolled</kbd>، فإن المراجعات أقدم من <var>[[mw:Special:MyLanguage/Manual:$wgRCMaxAge|$wgRCMaxAge]]</var> ($1 {{PLURAL:$1|ثانية|ثوانٍ}}) لن يتم عرضها.",
        "apihelp-query+usercontribs-param-tag": "إدراج المراجعات الموسومة بهذ الوسم فقط.",
        "apihelp-query+usercontribs-param-toponly": "سرد التغييرات التي هي أحدث مراجعة فقط.",
+       "apihelp-query+usercontribs-example-user": "عرض مساهمات المستخدم <kbd>Example</kbd>.",
+       "apihelp-query+usercontribs-example-ipprefix": "عرض المساهمات من جميع عناوين الآيبي بالبادئة <kbd>192.0.2.</kbd>.",
+       "apihelp-query+userinfo-summary": "الحصول على معلومات حول المستخدم الحالي.",
        "apihelp-query+userinfo-param-prop": "أية قطعة من المعلومات لتضمينها:",
+       "apihelp-query+userinfo-paramvalue-prop-blockinfo": "يوسم إذا تم منع المستخدم الحالي، من قبل أي شخص، ولأي سبب.",
+       "apihelp-query+userinfo-paramvalue-prop-hasmsg": "يضيف وسم <samp>messages</samp> إذا كان المستخدم الحالي لديه رسائل معلقة.",
+       "apihelp-query+userinfo-paramvalue-prop-groups": "يسرد كل المجموعات التي ينتمي إليها المستخدم الحالي.",
+       "apihelp-query+userinfo-paramvalue-prop-groupmemberships": "يسرد المجموعات التي تم تعيينها للمستخدم بشكل صريح، بما في ذلك تاريخ انتهاء عضوية كل مجموعة.",
+       "apihelp-query+userinfo-paramvalue-prop-implicitgroups": "يسرد جميع المجموعات التي يكون المستخدم الحالي عضوا فيها تلقائيا.",
+       "apihelp-query+userinfo-paramvalue-prop-rights": "يسرد جميع الصلاحيات التي يمتلكها المستخدم الحالي.",
+       "apihelp-query+userinfo-paramvalue-prop-changeablegroups": "يسرد المجموعات التي يمكن للمستخدم الحالي الإضافتة والإزالة منها.",
+       "apihelp-query+userinfo-paramvalue-prop-options": "يسرد جميع التفضيلات التي قام المستخدم الحالي بتعيينها.",
+       "apihelp-query+userinfo-paramvalue-prop-preferencestoken": "الحصول على رمز لتغيير تفضيلات المستخدم الحالي.",
+       "apihelp-query+userinfo-paramvalue-prop-editcount": "يضيف عدد تحرير المستخدم الحالي.",
+       "apihelp-query+userinfo-paramvalue-prop-ratelimits": "يسرد جميع حدود المعدل المطبقة على المستخدم الحالي.",
+       "apihelp-query+userinfo-paramvalue-prop-realname": "يضيف اسم المستخدم الحقيقي.",
+       "apihelp-query+userinfo-paramvalue-prop-email": "يضيف عنوان البريد الإلكتروني للمستخدم وتاريخ مصادقة البريد الإلكتروني.",
+       "apihelp-query+userinfo-paramvalue-prop-acceptlang": "يكرر الرأس <code>Accept-Language</code> الذي يرسله العميل بتنسيق منظم.",
+       "apihelp-query+userinfo-paramvalue-prop-registrationdate": "يضيف تاريخ تسجيل المستخدم.",
+       "apihelp-query+userinfo-paramvalue-prop-unreadcount": "يضيف عدد الصفحات غير المقروءة في قائمة مراقبة المستخدم (بحد أقصى $1; ترجع <samp>$2</samp> إذا كان أكثر).",
+       "apihelp-query+userinfo-paramvalue-prop-centralids": "يضيف المعرفات المركزية وحالة المرفقات للمستخدم.",
+       "apihelp-query+userinfo-param-attachedwiki": "باستخدام <kbd>$1prop=centralids</kbd>، حدد ما إذا كان المستخدم مرتبطا بالويكي المحدد بواسطة هذا المعرف.",
+       "apihelp-query+userinfo-example-simple": "الحصول على معلومات حول المستخدم الحالي.",
+       "apihelp-query+userinfo-example-data": "الحصول على معلومات حول المستخدم الحالي.",
+       "apihelp-query+users-summary": "الحصول على معلومات حول قائمة المستخدمين.",
        "apihelp-query+users-param-prop": "أية قطعة من المعلومات لتضمينها:",
+       "apihelp-query+users-paramvalue-prop-blockinfo": "يوسم إذا تم منع المستخدم الحالي، من قبل أي شخص، ولأي سبب.",
+       "apihelp-query+users-paramvalue-prop-groups": "يسرد كل المجموعات التي ينتمي إليها كل مستخدم.",
+       "apihelp-query+users-paramvalue-prop-groupmemberships": "يسرد المجموعات التي تم تعيينها للمستخدم بشكل صريح، بما في ذلك تاريخ انتهاء عضوية كل مجموعة.",
+       "apihelp-query+users-paramvalue-prop-implicitgroups": "يسرد كل المجموعات التي يوجد فيها المستخدم تلقائيا.",
+       "apihelp-query+users-paramvalue-prop-rights": "يسرد جميع الصلاحيات التي يمتلكها كل مستخدم.",
+       "apihelp-query+users-paramvalue-prop-editcount": "يضيف عدد تحرير المستخدم.",
+       "apihelp-query+users-paramvalue-prop-registration": "يضيف الطابع الزمني للتسجيل للمستخدم.",
+       "apihelp-query+users-paramvalue-prop-emailable": "يوسم إذا كان المستخدم يستطيع ويرغب في تلقي البريد الإلكتروني من خلال [[Special:Emailuser]].",
+       "apihelp-query+users-paramvalue-prop-gender": "يوسم الجنس من المستخدم: يرجع \"ذكر\" أو \"أنثى\" أو \"غير معروف\".",
+       "apihelp-query+users-paramvalue-prop-centralids": "يضيف المعرفات المركزية وحالة المرفقات للمستخدم.",
+       "apihelp-query+users-paramvalue-prop-cancreate": "يشير إلى ما إذا كان يمكن إنشاء حساب لأسماء مستخدمين صالحة ولكن غير مسجلة.",
+       "apihelp-query+users-param-attachedwiki": "باستخدام <kbd>$1prop=centralids</kbd>، حدد ما إذا كان المستخدم مرتبطا بالويكي المحدد بواسطة هذا المعرف.",
+       "apihelp-query+users-param-users": "قائمة من المستخدمين للحصول على معلومات عنهم.",
+       "apihelp-query+users-param-userids": "قائمة معرفات المستخدمين للحصول على معلومات عنهم.",
+       "apihelp-query+users-param-token": "استخدم [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] بدلا من ذلك.",
+       "apihelp-query+users-example-simple": "عودة المعلومات للمستخدم <kbd>Example</kbd>.",
+       "apihelp-query+watchlist-summary": "احصل على أحدث التغييرات على الصفحات في قائمة مراقبة المستخدم الحالي.",
+       "apihelp-query+watchlist-param-allrev": "تضمين مراجعات متعددة لنفس الصفحة في إطار زمني محدد.",
        "apihelp-query+watchlist-param-start": "الطابع الزمني لبدء العد منه.",
        "apihelp-query+watchlist-param-end": "الطابع الزمني لإنهاء التعداد.",
+       "apihelp-query+watchlist-param-namespace": "تصفية التغييرات على النطاقات المعطاة فقط.",
+       "apihelp-query+watchlist-param-user": "إددراج التغييرات بواسطة هذا المستخدم فقط.",
+       "apihelp-query+watchlist-param-excludeuser": "لا تسرد التغييرات بواسطة هذا المستخدم.",
+       "apihelp-query+watchlist-param-limit": "إجمالي عدد النتائج لإرجاعها لكل طلب.",
+       "apihelp-query+watchlist-param-prop": "أي الخصائص الإضافية للحصول عليها:",
+       "apihelp-query+watchlist-paramvalue-prop-ids": "يضيف معرفات المراجعات ومعرفات الصفحات.",
+       "apihelp-query+watchlist-paramvalue-prop-title": "يضيف عنوان الصفحة.",
+       "apihelp-query+watchlist-paramvalue-prop-flags": "يضيف علامات للتحرير.",
+       "apihelp-query+watchlist-paramvalue-prop-user": "يضيف المستخدم الذي قام بالتعديل.",
+       "apihelp-query+watchlist-paramvalue-prop-userid": "يضيف معرف المستخدم الذي أجرى التعديل.",
+       "apihelp-query+watchlist-paramvalue-prop-comment": "يضيف تعليق التعديل.",
+       "apihelp-query+watchlist-paramvalue-prop-parsedcomment": "يضيف التعليق المحلل للتحرير.",
+       "apihelp-query+watchlist-paramvalue-prop-timestamp": "يضيف الطابع الزمني للتحرير.",
+       "apihelp-query+watchlist-paramvalue-prop-patrol": "يوسم التعديلات المراجعة.",
+       "apihelp-query+watchlist-paramvalue-prop-autopatrol": "يوسم التعديلات المراجعة تلقائيا.",
+       "apihelp-query+watchlist-paramvalue-prop-sizes": "يضيف الأطوال القديمة والجديدة للصفحة.",
+       "apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "يإضيف الطابع الزمني عندما تم إبلاغ المستخدم آخر مرة عن التعديل.",
+       "apihelp-query+watchlist-paramvalue-prop-loginfo": "يضيف معلومات السجل عند الاقتضاء.",
+       "apihelp-query+watchlist-paramvalue-prop-tags": "يسرد الوسوم للدخول.",
+       "apihelp-query+watchlist-param-show": "إظهار العناصر التي تستوفي هذه المعايير فقط، على سبيل المثال، مشاهدة التعديلات الطفيفة فقط التي قام بها المستخدمون مسجلو الدخول، قم بتعيين $1show=minor|!anon.",
        "apihelp-query+watchlist-param-type": "أي أنواع التغييرات لعرضها.",
+       "apihelp-query+watchlist-paramvalue-type-edit": "تعديلات الصفحة العادية.",
+       "apihelp-query+watchlist-paramvalue-type-external": "التغييرات الخارجية.",
+       "apihelp-query+watchlist-paramvalue-type-new": "إنشاء الصفحات.",
+       "apihelp-query+watchlist-paramvalue-type-log": "ادخالات السجلات.",
+       "apihelp-query+watchlist-paramvalue-type-categorize": "تغييرات عضوية التصنيف.",
+       "apihelp-query+watchlist-param-owner": "يًستخدَم مع $1token للوصول إلى قائمة مراقبة مستخدم مختلف.",
+       "apihelp-query+watchlist-param-token": "رمز أمان (متوفر في [[Special:Preferences#mw-prefsection-watchlist|التفضيلات]]) للسماح بالوصول إلى قائمة مراقبة مستخدم آخر.",
+       "apihelp-query+watchlist-example-simple": "أدرج أعلى مراجعة للصفحات التي تم تغييرها مؤخرا في قائمة مراقبة المستخدم الحالية.",
+       "apihelp-query+watchlist-example-props": "احصل على معلومات إضافية حول المراجعة العليا للصفحات التي تم تغييرها مؤخرا في قائمة مراقبة المستخدم الحالية.",
+       "apihelp-query+watchlist-example-allrev": "يمكنك جلب معلومات حول جميع التغييرات الأخيرة على الصفحات في قائمة مراقبة المستخدم الحالي.",
+       "apihelp-query+watchlist-example-generator": "جلب معلومات الصفحة للصفحات التي تم تغييرها مؤخرا في قائمة مراقبة المستخدم الحالية.",
+       "apihelp-query+watchlist-example-generator-rev": "جلب معلومات المراجعة للتغييرات الأخيرة على الصفحات في قائمة مراقبة المستخدم الحالي.",
+       "apihelp-query+watchlist-example-wlowner": "أدرج أعلى مراجعة للصفحات التي تم تغييرها مؤخرا في قائمة مراقبة المستخدم <kbd>Example</kbd>.",
+       "apihelp-query+watchlistraw-summary": "الحصول على جميع صفحات قائمة مراقبة المستخدم الحالي.",
+       "apihelp-query+watchlistraw-param-namespace": "إدراج عناوين في النطاقات المعطاة فقط.",
+       "apihelp-query+watchlistraw-param-limit": "كم الإجمالي العدد للنتائج لإرجاعها لكل طلب.",
+       "apihelp-query+watchlistraw-param-prop": "أي الخصائص الإضافية للحصول عليها:",
+       "apihelp-query+watchlistraw-paramvalue-prop-changed": "يإضيف الطابع الزمني عندما تم إبلاغ المستخدم آخر مرة عن التعديل.",
+       "apihelp-query+watchlistraw-param-show": "إدراج العناصر التي تفي بهذه المعايير فقط.",
+       "apihelp-query+watchlistraw-param-owner": "يًستخدَم مع $1token للوصول إلى قائمة مراقبة مستخدم مختلف.",
+       "apihelp-query+watchlistraw-param-token": "رمز أمان (متوفر في [[Special:Preferences#mw-prefsection-watchlist|التفضيلات]]) للسماح بالوصول إلى قائمة مراقبة مستخدم آخر.",
+       "apihelp-query+watchlistraw-param-dir": "الاتجاه للإدراج فيه.",
+       "apihelp-query+watchlistraw-param-fromtitle": "العنوان (مع بادئة النطاق) لبدء العد منه.",
+       "apihelp-query+watchlistraw-param-totitle": "العنوان (مع بادئة النطاق) لإيقاف العد عنده.",
+       "apihelp-query+watchlistraw-example-simple": "سرد الصفحات في قائمة مراقبة المستخدم الحالي.",
+       "apihelp-query+watchlistraw-example-generator": "جلب معلومات الصفحة للصفحات في قائمة مراقبة المستخدم الحالية.",
+       "apihelp-removeauthenticationdata-summary": "إزالة بيانات المصادقة للمستخدم الحالي.",
+       "apihelp-removeauthenticationdata-example-simple": "محاولة إزالة بيانات المستخدم الحالي لـ<kbd>FooAuthenticationRequest</kbd>.",
+       "apihelp-resetpassword-summary": "إرسال بريد إلكتروني لإعادة تعيين كلمة المرور إلى مستخدم.",
+       "apihelp-resetpassword-extended-description-noroutes": "لا تتوفر طرق إعادة تعيين كلمة المرور.\n\nتمكين المسارات في <var>[[mw:Special:MyLanguage/Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var> لاستخدام هذه الوحدة.",
+       "apihelp-resetpassword-param-user": "تجري إعادة تعيين المستخدم.",
+       "apihelp-resetpassword-param-email": "تجري إعادة ضبط عنوان البريد الإلكتروني للمستخدم.",
+       "apihelp-resetpassword-example-user": "إرسال بريد إلكتروني لإعادة تعيين كلمة المرور إلى المستخدم <kbd>Example</kbd>.",
+       "apihelp-resetpassword-example-email": "رسال بريد إلكتروني لإعادة تعيين كلمة المرور لجميع المستخدمين الذين لديهم عنوان البريد الإلكتروني <kbd>user@example.com</kbd>.",
+       "apihelp-revisiondelete-summary": "حذف واسترجاع المراجعات.",
+       "apihelp-revisiondelete-param-type": "نوع حذف المراجعة الذي يتم تنفيذه.",
+       "apihelp-revisiondelete-param-target": "عنوان الصفحة لحذف المراجعة، إذا كان مطلوبا للنوع.",
+       "apihelp-revisiondelete-param-ids": "المعرفات للمراجعات لحذفها.",
+       "apihelp-revisiondelete-param-hide": "ماذا نختبئ لكل مراجعة.",
+       "apihelp-revisiondelete-param-show": "ما الذي يجب إظهاره لكل مراجعة.",
+       "apihelp-revisiondelete-param-suppress": "سواء إخفاء البيانات من الإداريين وكذلك الآخرين.",
+       "apihelp-revisiondelete-param-reason": "سبب للحذف أو الاسترجاع.",
+       "apihelp-revisiondelete-param-tags": "وسوم لتطبيقها على الإدخال في سجل الحذف.",
+       "apihelp-revisiondelete-example-revision": "إخفاء محتوى المراجعة <kbd>12345</kbd> في الصفحة <kbd>Main Page</kbd>.",
+       "apihelp-revisiondelete-example-log": "إخفاء كافة البيانات الموجودة في إدخال السجل <kbd>67890</kbd> بسبب <kbd>BLP violation</kbd>.",
+       "apihelp-rollback-summary": "التراجع عن آخر تعديل على الصفحة.",
+       "apihelp-rollback-extended-description": "إذا قام المستخدم الأخير الذي قام بتحرير الصفحة بإجراء تعديلات متعددة في صف، فسوف يتم استرجاعها مرة أخرى.",
+       "apihelp-rollback-param-title": "عنوان الصفحة للتراجع، لا يمكن استخدامه مع <var>$1project</var>.",
+       "apihelp-rollback-param-pageid": "معرف الصفحة للصفحة للتراجع، لا يمكن استخدامه مع <var>$1project</var>.",
+       "apihelp-rollback-param-tags": "وسوم للتطبيق على التراجع.",
+       "apihelp-rollback-param-user": "اسم المستخدم الذي سيتم إرجاع تعديلاته.",
+       "apihelp-rollback-param-summary": "ملخص تعديل مخصص، إذا كان فارغا، سيتم استخدام الملخص الافتراضي.",
+       "apihelp-rollback-param-markbot": "تعليم التعديلات المسترجعة كتعديلات بوت.",
+       "apihelp-rollback-param-watchlist": "إضافة أو إزالة الصفحة من قائمة مراقبة المستخدم الحالي أو استخدام التفضيلات أو عدم تغيير المراقبة بدون شروط.",
+       "apihelp-rollback-example-simple": "استرجاع التعديلات الأخيرة على الصفحة<kbd>Main Page</kbd> بواسطة المستخدم <kbd>Example</kbd>.",
+       "apihelp-rollback-example-summary": "استرجاع التعديلات الأخيرة على صفحة <kbd>Main Page</kbd>بواسطة مستخدم الآيبي <kbd>192.0.2.5</kbd> بالملخص <kbd>Reverting vandalism</kbd>، وتعليم تلك التعديلات والاسترجاع كتعديلات بوت.",
+       "apihelp-rsd-summary": "تصدير مخطط RSD (اكتشاف بسيط حقا).",
+       "apihelp-rsd-example-simple": "تصدير مخطط RSD.",
+       "apihelp-setnotificationtimestamp-summary": "تحديث الطابع الزمني للإخطار للصفحات المراقبة.",
+       "apihelp-setnotificationtimestamp-extended-description": "يؤثر هذا على إبراز الصفحات التي تم تغييرها في قائمة المراقبة والتاريخ، وإرسال البريد الإلكتروني عند تمكين التفضيل  \"{{int:tog-enotifwatchlistpages}}\".",
+       "apihelp-setnotificationtimestamp-param-entirewatchlist": "العمل على جميع الصفحات المراقبة.",
+       "apihelp-setnotificationtimestamp-param-timestamp": "الطابع الزمني الذي لتعيين الطابع الزمني للإشعار.",
+       "apihelp-setnotificationtimestamp-param-torevid": "مراجعة لضبط الطابع الزمني للإشعار عليها (صفحة واحدة فقط).",
+       "apihelp-setnotificationtimestamp-param-newerthanrevid": "مراجعة لضبط الطابع الزمني للإشعار الأحدث منها (صفحة واحدة فقط).",
+       "apihelp-setnotificationtimestamp-example-all": "إعادة تعيين حالة الإشعار لقائمة المراقبة بأكملها.",
+       "apihelp-setnotificationtimestamp-example-page": "إعادة ضبط حالة الإخطار لـ<kbd>Main page</kbd>.",
+       "apihelp-setnotificationtimestamp-example-pagetimestamp": "تعيين الطابع الزمني للإشعار للصفحة <kbd>Main page</kbd> حتى لا يتم عرض جميع التعديلات منذ 1 يناير 2012.",
+       "apihelp-setnotificationtimestamp-example-allpages": "إعادة تعيين حالة الإشعار للصفحات في نطاق <kbd>{{ns:user}}</kbd>.",
+       "apihelp-setpagelanguage-summary": "تغيير لغة صفحة.",
+       "apihelp-setpagelanguage-extended-description-disabled": "لا يُسمَح بتغيير لغة صفحة في هذا الويكي.\n\nتمكين <var>[[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]] لاستخدام هذا الإجراء.",
+       "apihelp-setpagelanguage-param-title": "عنوان الصفحة التي ترغب في تغيير لغتها، لا يمكن استخدامه مع <var>$1pageid</var>.",
+       "apihelp-setpagelanguage-param-pageid": "معرف الصفحة للصفحة التي ترغب في تغيير لغتها، لا يمكن استخدامه مع <var>$1title</var>.",
+       "apihelp-setpagelanguage-param-lang": "كود اللغة للغة لتغيير الصفحة إليها، استخدم <kbd>default</kbd> لإعادة تعيين الصفحة إلى لغة محتوى الويكي.",
+       "apihelp-setpagelanguage-param-reason": "سبب للتغيير.",
+       "apihelp-setpagelanguage-param-tags": "تغيير الوسوم لتطبيقها على إدخال السجل الناتج عن هذا الإجراء.",
+       "apihelp-setpagelanguage-example-language": "تغيير لغة <kbd>Main Page</kbd> إلى لغة الباسك.",
+       "apihelp-setpagelanguage-example-default": "تغيير لغة الصفحة بمعرف 123 إلى لغة محتوى الويكي الافتراضية.",
+       "apihelp-stashedit-summary": "إعداد تحرير في ذاكرة التخزين المؤقت المشتركة.",
+       "apihelp-stashedit-extended-description": "يهدف هذا إلى الاستخدام عبر AJAX من نموذج التحرير لتحسين أداء حفظ الصفحة.",
+       "apihelp-stashedit-param-title": "عنوان الصفحة التي يتم تحريرها.",
+       "apihelp-stashedit-param-section": "رقم القسم. <kbd>0</kbd> للقسم العلوي، <kbd>new</kbd> لقسم جديد.",
+       "apihelp-stashedit-param-sectiontitle": "العنوان لقسم جديد.",
+       "apihelp-stashedit-param-text": "محتوى الصفحة.",
+       "apihelp-stashedit-param-stashedtexthash": "رمز رقم محتوى الصفحة من وحدة تخزين سابقة لاستخدامها بدلا من ذلك.",
+       "apihelp-stashedit-param-contentmodel": "نموذج المحتوى للمحتوى الجديد.",
+       "apihelp-stashedit-param-contentformat": "نسق المحتوى التسلسلي المستخدم لنص المدخلات.",
+       "apihelp-stashedit-param-baserevid": "معرف المراجعة للمراجعة الأساسية.",
+       "apihelp-stashedit-param-summary": "تغيير الملخص.",
+       "apihelp-tag-summary": "إضافة أو إزالة وسوم التغيير من المراجعات الفردية أو إدخالات السجلات.",
+       "apihelp-tag-param-rcid": "واحد أو أكثر من التغييرات الحديثة للمعرفات التي يمكن من خلالها إضافة أو إزالة الوسم.",
+       "apihelp-tag-param-revid": "معرف تعديل واحد أو أكثر يمكن من خلاله إضافة أو إزالة الوسم.",
+       "apihelp-tag-param-logid": "واحد أو أكثر من معرفات إدخال السجل يمكن من خلاله إضافة أو إزالة الوسم.",
+       "apihelp-tag-param-add": "وسوم للإضافة، يمكن فقط إضافة وسوم محددة يدويا.",
+       "apihelp-tag-param-remove": "وسوم لإزالتها، لا يمكن إزالة سوى الوسوم المعرفة يدويا أو غير المعرفة تماما.",
+       "apihelp-tag-param-reason": "سبب للتغيير.",
+       "apihelp-tag-param-tags": "وسوم لتطبيقها على إدخال السجل الذي سيتم إنشاؤه كنتيجة لهذا الإجراء.",
+       "apihelp-tag-example-rev": "أضف الوسم <kbd>vandalism</kbd> إلى معرّف المراجعة 123 بدون تحديد سبب",
+       "apihelp-tag-example-log": "إزالة الوسم <kbd>spam</kbd> من معرف إدخال السجل 123 بالسبب <kbd>Wrongly applied</kbd>",
        "apihelp-tokens-summary": "الحصول على الرموز المميزة لإجراءات تعديل البيانات.",
+       "apihelp-tokens-extended-description": "تم إهمال هذه الوحدة لصالح [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
        "apihelp-tokens-param-type": "أنواع الرمز المميز للطلب.",
+       "apihelp-tokens-example-edit": "استرداد رمز تحرير (الافتراضي).",
+       "apihelp-tokens-example-emailmove": "استرداد رمز بريد إلكتروني ورمز نقل.",
+       "apihelp-unblock-summary": "إلغاء منع المستخدم.",
+       "apihelp-unblock-param-id": "معرف المنع لرفع المنع (تم الحصول عليه من خلال <kbd>list=blocks</kbd>)، لا يمكن استخدامه مع <var>$1user</var> أو <var>$1userid</var>.",
+       "apihelp-unblock-param-user": "اسم المستخدم، أو عنوان آيبي أو نطاق عنوان آيبي لمنعه، لا يمكن أن يُستخدَم جنبا إلى جنب مع <var>$1id</var> أو <var>$1userid</var>.",
+       "apihelp-unblock-param-userid": "معرف الآيبي لرفع منعه، لا يمكن أن يُستخدَم جنبا إلى جنب مع <var>$1id</var> أو <var>$1user</var>.",
+       "apihelp-unblock-param-reason": "سبب لرفع للمنع.",
+       "apihelp-unblock-param-tags": "تغيير الوسوم للتطبيق على الإدخال في سجل المنع.",
+       "apihelp-unblock-example-id": "رفع منع المعرف #<kbd>105</kbd>.",
+       "apihelp-unblock-example-user": "رفع منع المستخدم <kbd>Bob</kbd> بالسبب <kbd>Sorry Bob</kbd>.",
+       "apihelp-undelete-summary": "استعادة مراجعات صفحة محذوفة.",
+       "apihelp-undelete-extended-description": "يمكن استرداد قائمة المراجعات المحذوفة (بما في ذلك الطوابع الزمنية) من خلال [[Special:ApiHelp/query+deletedrevisions|prop=deletedrevisions]]، ويمكن استرداد قائمة معرفات الملفات المحذوفة من خلال [[Special:ApiHelp/query+filearchive|list=filearchive]].",
+       "apihelp-undelete-param-title": "عنوان الصفحة للاسترجاع.",
+       "apihelp-undelete-param-reason": "سبب للاسترجاع.",
+       "apihelp-undelete-param-tags": "تغيير وسوم لتطبيقها على الإدخال في سجل الحذف.",
+       "apihelp-undelete-param-timestamps": "الطوابع الزمنية للمراجعات للاسترجاع، إذا كانت كل من <var>$1timestamps</var> فارغة، فستتم استعادتها كلها.",
+       "apihelp-undelete-param-fileids": "الطوابع الزمنية لمراجعات الملف للاسترجاع، إذا كانت كل من <var>$1timestamps</var> فارغة، فستتم استعادتها كلها.",
+       "apihelp-undelete-param-watchlist": "إضافة أو إزالة الصفحة من قائمة مراقبة المستخدم الحالي أو استخدام التفضيلات أو عدم تغيير المراقبة بدون شروط.",
+       "apihelp-undelete-example-page": "استرجاع صفحة <kbd>Main Page</kbd>.",
+       "apihelp-undelete-example-revisions": "استرجاع مراجعتين لصفحة <kbd>Main Page</kbd>.",
+       "apihelp-unlinkaccount-summary": "إزالة حساب جهة خارجية مرتبط من المستخدم الحالي.",
+       "apihelp-unlinkaccount-example-simple": "محاولة إزالة رابط المستخدم الحالي للموفر المقترن بـ<kbd>FooAuthenticationRequest</kbd>.",
+       "apihelp-upload-summary": "رفع ملف أو الحصول على حالة المرفوعات المعلقة.",
+       "apihelp-upload-extended-description": "تتوفر عدة طرق: \n* ارفع محتويات الملف مباشرة، باستخدام الوسيط <var>$1file</var>.\n* ارفع الملف على أجزاء باستخدام الوسائط <var>$1filesize</var> و<var>$1chunk</var> و<var>$1offset</var>.\n*  اجعل خادم ميدياويكي يقوم بجلب ملف من مسار، باستخدام الوسيط <var>$1url</var>.\n*  أكمل عملية رفع سابقة فشلت بسبب التحذيرات، باستخدام الوسيط <var>$1filekey</var>.\nلاحظ أنه يجب إجراء HTTP POST كرفع ملف (أي استخدام <code>multipart/form-data</code>) عند إرسال <var>$1file</var>.",
+       "apihelp-upload-param-filename": "اسم الملف المستهدف.",
+       "apihelp-upload-param-comment": "تحميل تعليق الرفع، يُستخدَم أيضا كنص الصفحة الأولي للملفات الجديدة إذا لم يتم تحديد <var>$1text</var>.",
+       "apihelp-upload-param-tags": "غتيير الوسوم لتطبيقها على إدخال سجل الرفع ومراجعة صفحة الملف.",
+       "apihelp-upload-param-text": "النص الأولي للصفحة للملفات الجديدة.",
+       "apihelp-upload-param-watch": "راقب الصفحة.",
+       "apihelp-upload-param-watchlist": "إضافة أو إزالة الصفحة من قائمة مراقبة المستخدم الحالي أو استخدام التفضيلات أو عدم تغيير المراقبة بدون شروط.",
+       "apihelp-upload-param-ignorewarnings": "تجاهل أية تحذيرات.",
+       "apihelp-upload-param-file": "محتويات الملف.",
+       "apihelp-upload-param-url": "مسار لجلب الملف منه.",
+       "apihelp-upload-param-filekey": "المفتاح الذي يحدد التحميل السابق المخزن مؤقتا.",
+       "apihelp-upload-param-sessionkey": "نفس $1filekey، تتم صيانته للتوافق مع الإصدارات السابقة.",
+       "apihelp-upload-param-stash": "في حالة التعيين، سيخزن الخادم الملف مؤقتا بدلا من إضافته إلى المستودع.",
+       "apihelp-upload-param-filesize": "حجم ملف الرفع الكامل.",
+       "apihelp-upload-param-offset": "إزاحة القطعة بالبايت.",
+       "apihelp-upload-param-chunk": "محتويات القطعة.",
+       "apihelp-upload-param-async": "إجراء عمليات ملف كبيرة محتملة غير متزامنة عند الإمكان.",
+       "apihelp-upload-param-checkstatus": "فقط جلب حالة الرفع لمفتاح الملف المحدد.",
+       "apihelp-upload-example-url": "رفع من مسار.",
+       "apihelp-upload-example-filekey": "أكمل الرفع الذي أخفق بسبب التحذيرات.",
+       "apihelp-userrights-summary": "تغيير عضوية مجموعة المستخدم.",
+       "apihelp-userrights-param-user": "اسم المستخدم.",
+       "apihelp-userrights-param-userid": "معرف المستخدم.",
+       "apihelp-userrights-param-add": "أضف المستخدم إلى هذه المجموعات، أو إذا كان بالفعل عضوا، قم بتحديث صلاحية عضويته في تلك المجموعة.",
+       "apihelp-userrights-param-expiry": "الطوابع الزمنية لانتهاء الصلاحية، قد تكون نسبية (على سبيل المثال <kbd>5 months</kbd> or <kbd>2 weeks</kbd>) أو مطلقة (على سبيل المثال <kbd>2014-09-18T12:34:56Z</kbd>). إذا تم تعيين طابع زمني واحد فقط، فسيتم استخدامه لكافة المجموعات التي تم تمريرها إلى الوسيط <var>$1add</var>، استخدم <kbd>infinite</kbd> أو <kbd>indefinite</kbd> أو <kbd>infinity</kbd> أو <kbd>never</kbd> لمجموعة مستخدمين لا تنتهي صلاحيتها أبدا.",
+       "apihelp-userrights-param-remove": "أزل المستخدم من هذه المجموعات.",
+       "apihelp-userrights-param-reason": "سبب للتغيير.",
+       "apihelp-userrights-param-tags": "تغيير وسوم لتطبيقها على الإدخال في سجل صلاحيات المستخدم.",
+       "apihelp-userrights-example-user": "إضافة المستخدم <kbd>FooBot</kbd> إلى مجموعة <kbd>bot</kbd> وإزالته من المجموعات <kbd>sysop</kbd> و<kbd>bureaucrat</kbd>.",
+       "apihelp-userrights-example-userid": "إضافة المستخدم بالمعرف <kbd>123</kbd> إلى مجموعة <kbd>bot</kbd> وإزالته من المجموعات <kbd>sysop</kbd> و<kbd>bureaucrat</kbd>.",
+       "apihelp-userrights-example-expiry": "إضافة المستخدم <kbd>SometimeSysop</kbd> إلى مجموعة <kbd>sysop</kbd> لمدة شهر واحد.",
+       "apihelp-validatepassword-summary": "التحقق من صحة كلمة المرور ضد سياسات كلمة مرور الويكي.",
+       "apihelp-validatepassword-extended-description": "يتم الإبلاغ عن الصلاحية كـ<samp>Good</samp> إذا كانت كلمة المرور مقبولة، أو <samp>Change</samp> إذا كان قد يتم استخدام كلمة المرور لتسجيل الدخول ولكن يجب تغييرها، أو <samp>Invalid</samp> إذا كان كلمة المرور غير قابلة للاستخدام.",
+       "apihelp-validatepassword-param-password": "كلمة المرور للتحقق.",
+       "apihelp-validatepassword-param-user": "اسم المستخدم; للاستخدام عند اختبار إنشاء الحساب، يجب ألا يكون المستخدم المحدد موجودا.",
+       "apihelp-validatepassword-param-email": "عنوان البريد الإلكتروني; للاستخدام عند اختبار إنشاء الحساب.",
+       "apihelp-validatepassword-param-realname": "الاسم الحقيقي; للاستخدام عند اختبار إنشاء الحساب.",
+       "apihelp-validatepassword-example-1": "تحقق من كلمة المرور <kbd>foobar</kbd> للمستخدم الحالي.",
+       "apihelp-validatepassword-example-2": "تحقق من كلمة المرور <kbd>qwerty</kbd> لإنشاء المستخدم <kbd>Example</kbd>.",
+       "apihelp-watch-summary": "إضافة أو إزالة صفحات من قائمة مراقبة المستخدم الحالي.",
+       "apihelp-watch-param-title": "الصفحة ل(عدم)مراقبتها، استخدم <var>$1titles</var> بدلا من ذلك.",
+       "apihelp-watch-param-unwatch": "إذا تم التعيين فستتم إزالة الصفحة من قائمة المراقبة بدلا من مراقبتها.",
+       "apihelp-watch-example-watch": "راقب الصفحة <kbd>Main Page</kbd>.",
+       "apihelp-watch-example-unwatch": "ألغِ مراقبة الصفحة <kbd>Main Page</kbd>.",
+       "apihelp-watch-example-generator": "راقب الصفحات القليلة الأولى في النطاق الرئيسي.",
+       "apihelp-format-example-generic": "إرجاع نتيجة الاستعلام بتنسيق $1.",
+       "apihelp-format-param-wrappedhtml": "إرجاع HTML المطبوع بشكل جيد ووحدات ResourceLoader المرتبطة به ككائن JSON.",
+       "apihelp-json-summary": "بيانات الإخراج بتنسيق JSON.",
+       "apihelp-json-param-callback": "إذا تم تحديده، فسيقوم بإخراج الإخراج في استدعاء دالة معينة، للسلامة; سيتم تقييد جميع البيانات الخاصة بالمستخدم.",
+       "apihelp-json-param-utf8": "إذا تم تحديده، يقوم بترميز معظم (وليس كل) الأحرف غير ASCII كـUTF-8 بدلا من استبدالها بتسلسلات الهروب السداسية العشرية، افتراضي عندما لا يكون <var>formatversion</var>  <kbd>1</kbd>.",
+       "apihelp-json-param-ascii": "إذا تم تحديده، يشفر كل غير ASCII باستخدام تسلسلات الهروب السداسية العشرية، افتراضي عندما يكون <var>formatversion</var> <kbd>1</kbd>.",
+       "apihelp-jsonfm-summary": "بيانات الإخراج بتنسيق JSON (الطباعة بـHTML).",
+       "apihelp-none-summary": "عدم إخراج أي شيء.",
+       "apihelp-php-summary": "بيانات الإخراج بتنسيق PHP المتسلسل.",
+       "apihelp-phpfm-summary": "بيانات الإخراج بتنسيق JSON (الطباعة بـHTML).",
+       "apihelp-rawfm-summary": "بيانات الإخراج، بما في ذلك عناصر تصحيح الأخطاء، بتنسيق JSON (الطباعة بـHTML).",
+       "apihelp-xml-summary": "بيانات الإخراج بتنسيق XML.",
+       "apihelp-xml-param-xslt": "إذا تم تحديده، سيضيف الصفحة المسماة كورقة أنماط XSL، يجب أن تكون القيمة عنوانا في نطاق {{ns:MediaWiki}} ينتهي بـ<code>.xsl</code>.",
+       "apihelp-xml-param-includexmlnamespace": "If specified, adds an XML namespace.\nإذا تم تحديدها، سيضيف نطاق XML.",
+       "apihelp-xmlfm-summary": "بيانات الإخراج بتنسيق XML (الطباعة بـHTML).",
+       "api-format-title": "ناتج API ميدياويكي",
+       "api-format-prettyprint-header": "هذا هو تمثيل HTML لتنسيق $1، HTML مفيد في تصحيح الأخطاء، ولكنه غير مناسب لاستخدام التطبيق. \n\nحدد الوسيط <var>format</var> لتغيير نسق المخرجات، لمشاهدة تمثيل غير HTML لتنسيق $1; اضبط <kbd>format=$2</kbd>.\n\nراجع [[mw:Special:MyLanguage/API|التوثيق كاملا]]، أو [[Special:ApiHelp/main|مساعدة API]] لمزيد من المعلومات.",
+       "api-format-prettyprint-header-only-html": "هذا تمثيل HTML مخصص للتصحيح، وغير مناسب لاستخدام تطبيق HTML. \n\nراجع [[mw:Special:MyLanguage/API|التوثيق كاملا]]، أو [[Special:ApiHelp/main|مساعدة API]] لمزيد من المعلومات.",
+       "api-format-prettyprint-header-hyperlinked": "هذا هو تمثيل HTML لتنسيق $1، HTML مفيد في تصحيح الأخطاء، ولكنه غير مناسب لاستخدام التطبيق. \n\nحدد الوسيط <var>format</var> لتغيير نسق المخرجات، لمشاهدة تمثيل غير HTML لتنسيق $1; اضبط [$3 <kbd>format=$2</kbd>].\n\nراجع [[mw:API|التوثيق كاملا]]، أو [[Special:ApiHelp/main|مساعدة API]] لمزيد من المعلومات.",
+       "api-format-prettyprint-status": "سيتم إرجاع هذه الاستجابة بحالة HTTP $1 $2.",
+       "api-login-fail-aborted": "تتطلب المصادقة تفاعل المستخدم، والذي لا يدعمه <kbd>action=login</kbd>، لتتمكن من تسجيل الدخول باستخدام <kbd>action=login</kbd>; راجع [[Special:BotPasswords]]، لمتابعة استخدام تسجيل الدخول إلى الحساب الرئيسي; راجع <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
+       "api-login-fail-aborted-nobotpw": "تتطلب المصادقة تفاعل المستخدم، والذي لا يدعمه <kbd>action=login</kbd>، لتسجيل الدخول; راجع <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
+       "api-login-fail-badsessionprovider": "لا يمكن تسجيل الدخول باستخدام $1.",
+       "api-login-fail-sameorigin": "لا يمكن تسجيل الدخول عندما لا يتم تطبيق السياسة الأصلية.",
+       "api-pageset-param-titles": "قائمة عناوين للعمل عليها.",
+       "api-pageset-param-pageids": "قائمة بمعرفات الصفحات للعمل عليها.",
+       "api-pageset-param-revids": "قائمة بمعرفات المراجعات للعمل عليها.",
+       "api-pageset-param-generator": "احصل على قائمة الصفحات للعمل عليها من خلال تنفيذ وحدة الاستعلام المحددة.\n\n<strong>ملاحظة:</strong> يجب أن تبدأ أسماء وسطائط المولد بـ\"g\"، انظر الأمثلة.",
+       "api-pageset-param-redirects-generator": "حل التحويلات تلقائيا في <var>$1titles</var> و<var>$1pageids</var> و<var>$1revids</var> وفي الصفحات التي يتم إرجاعها بواسطة <var>$1generator</var>.",
+       "api-pageset-param-redirects-nogenerator": "حل التحويلات تلقائيا في <var>$1titles</var> و<var>$1pageids</var> و<var>$1revids</var>.",
+       "api-pageset-param-converttitles": "تحويل العناوين إلى المتغيرات الأخرى إذا لزم الأمر، يعمل فقط إذا كانت لغة محتوى الويكي تدعم تحويل المتغير، تتضمن اللغات التي تدعم تحويل المتغير $1.",
+       "api-help-title": "مساعدة API ميدياويكي",
+       "api-help-lead": "\nهذه صفحة توثيق ميدياويكي API التي تم إنشاؤها تلقائيا.\n\nوثائق وأمثلة: https://www.mediawiki.org/wiki/API",
+       "api-help-main-header": "الوحدة الرئيسية",
+       "api-help-undocumented-module": "لا توجد وثائق للوحدة $1.",
+       "api-help-flag-deprecated": "هذه الوحدة مهملة.",
+       "api-help-flag-internal": "<strong> هذه الوحدة داخلية أو غير مستقرة.</strong> قد تتغير عمليتها دون إشعار.",
+       "api-help-flag-readrights": "هذه الوحدة تتطلب صلاحيات القراءة.",
+       "api-help-flag-writerights": "هذه الوحدة تتطلب صلاحيات الكتابة.",
+       "api-help-flag-mustbeposted": "هذه الوحدة تقبل طلبات POST فقط.",
+       "api-help-flag-generator": "هذه الوحدة يمكن أن تُستخدَم كمولد.",
+       "api-help-source": "المصدر:$1",
+       "api-help-source-unknown": "المصدر: <span class=\"apihelp-unknown\">غير معروف</span>",
+       "api-help-license": "الترخيص: [[$1|$2]]",
+       "api-help-license-noname": "الترخيص: [[$1|انظر الوصلة]]",
+       "api-help-license-unknown": "الترخيص: <span class=\"apihelp-unknown\">غير معروف</span>",
+       "api-help-parameters": "{{PLURAL:$1|وسيط|وسائط}}:",
+       "api-help-param-deprecated": "مهمل.",
+       "api-help-param-required": "هذا الوسيط مطلوب.",
+       "api-help-param-templated": "هذا [[Special:ApiHelp/main#main/templatedparams|وسيط قالب]]، عند تقديم الطلب، $2.",
+       "api-help-param-templated-var-first": "يجب استبدال <var>&#x7B;$1&#x7D;</var> في اسم الوسيط بقيم <var>$2</var>",
+       "api-help-param-templated-var": "<var>&#x7B;$1&#x7D;</var> بقيم <var>$2</var>",
+       "api-help-datatypes-header": "أنواع البيانات",
+       "api-help-datatypes": "يجب أن يكون الإدخال إلى ميدياويكي هو UTF-8 المعيَّن لـNFC، قد يحاول ميدياويكي تحويل مدخلات أخرى، ولكن قد يتسبب ذلك في فشل بعض العمليات (مثل [[Special:ApiHelp/edit|التعديلات]] مع عمليات فحص MD5).\n\nتحتاج بعض أنواع الوسائط في طلبات API إلى مزيد من الشرح:\n;منطقية\n:تعمل الوسائط المنطقية مثل صناديق اختيار HTML: إذا تم تحديد الوسيط، بغض النظر عن القيمة، فيتم اعتباره صحيحا، للحصول على قيمة خاطئة; احذف الوسيط تماما.\n;الطابع الزمني\n:قد يتم تحديد الطوابع الزمنية بتنسيقات متعددة، يُوصَى بـISO 8601 التاريخ والوقت، جميع الأوقات بالتوقيت العالمي المنسق، يتم تجاهل أية منطقة زمنية مضمنة.\n:* تاريخ ووقت ISO 8601، <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd> (علامات الترقيم و<kbd>Z</kbd> اختيارية)\n:* تاريخ ووقت ISO 8601مع الثواني المجزأة (متجاهلة)، <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>.<var>00001</var>Z</kbd>  (الشرطات، والنقطتان الرأسيتان اختيارية و<kbd>Z</kbd>)\n:* تنسيق ميدياويكي، <kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* تنسيق رقمي عام، (توقيت اختياري، أو يتم تجاهل) <kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd> (منطقة زمنية اختيارية لـ<kbd>GMT</kbd>، <kbd>+<var>##</var></kbd>، أو يتم تجاهل <kbd>-<var>##</var></kbd>)\n:* تنسيق EXIF، <kbd><var>2001</var>:<var>01</var>:<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:*تنسيق RFC 2822 (قد يتم حذف المنطقة الزمنية)، <kbd><var>Mon</var>, <var>15</var> <var>Jan</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:*تنسيق RFC 850 format (قد يتم حذف المنطقة الزمنية)، <kbd><var>Monday</var>, <var>15</var>-<var>Jan</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* تنسيق C ctime format, <kbd><var>Mon</var> <var>Jan</var> <var>15</var> <var>14</var>:<var>56</var>:<var>00</var> <var>2001</var></kbd>\n:* الثواني منذ 1970-01-01T00:00:00Z كعدد صحيح يتراوح بين 1 و13 (باستثناء <kbd>0</kbd>)\n:* السلسلة <kbd>now</kbd>\n;فاصل بديل متعدد القيم\n:يتم عادةً إرسال الوسائط التي تأخذ قيم متعددة مع القيم المفصولة باستخدام حرف الأنبوب، على سبيل المثال <kbd>param=value1|value2</kbd> or <kbd>param=value1%7Cvalue2</kbd> إذا كانت القيمة يجب أن تحتوي على حرف الأنبوب، فاستخدم U+001F (فاصل الوحدة) مثل الفاصل ''و'' بادئة القيمة بـU+001F، على سبيل المثال <kbd>param=%1Fvalue1%1Fvalue2</kbd>.",
+       "api-help-templatedparams-header": "وسائط القالب",
+       "api-help-templatedparams": "تدعم وسائط القوالب الحالات التي تحتاج فيها API إلى قيمة لكل قيمة من وسيط آخر، على سبيل المثال، إذا كانت هناك وحدة API لطلب الفاكهة، فإنه قد يكون لديك وسيط <var>fruits</var>  لتحديد أي الفواكه تم طلبها ووسيط قالب <var>{fruit}-quantity</var>لتحديد عدد الفواكه لكل طلب، يمكن لعميل API الذي يريد 1 تفاحة، 5 موز، 20 فراولة ثم تقديم طلب مثل <kbd>fruits=apples|bananas|strawberries&apples-quantity=1&bananas-quantity=5&strawberries-quantity=20</kbd>.",
+       "api-help-param-type-limit": "النوع: عدد صحيح أو <kbd>max</kbd>",
+       "api-help-param-type-integer": "النوع: {{PLURAL:$1|1=عدد صحيح|2=قائمة الأعداد الصحيحة}}",
+       "api-help-param-type-boolean": "النوع: منطقية ([[Special:ApiHelp/main#main/datatypes|التفاصيل]])",
+       "api-help-param-type-timestamp": "النوع: {{PLURAL:$1|1=طابع زمني|2=قائمة الطوابع الزمنية}} ([[Special:ApiHelp/main#main/datatypes|الصيغ المسموح بها]])",
+       "api-help-param-type-user": "النوع: {{PLURAL:$1|1=اسم مستخدم|2=قائمة أسماء المستخدمين}}",
+       "api-help-param-list": "{{PLURAL:$1|1=إحدى القيم التالية|2=القيم (منفصلة مع <kbd>{{!}}</kbd> أو [[Special:ApiHelp/main#main/datatypes|البديل]])}}: $2",
+       "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=يجب أن تكون فارغة|يمكن أن تكون فارغة، أو $2}}",
+       "api-help-param-limit": "لا يُسمَح بأكثر من $1.",
+       "api-help-param-limit2": "لا يُسمَح بأكثر من $1 ($2 للبوتات).",
+       "api-help-param-integer-min": "يجب ألا تقل {{PLURAL:$1|1=القيمة|2=القيم}} عن $2.",
+       "api-help-param-integer-max": "يجب ألا تزيد {{PLURAL:$1|1=القيمة|2=القيم}} عن $3.",
+       "api-help-param-integer-minmax": "يجب أن تتراوح {{PLURAL:$1|1=القيمة|2=القيم}} بين $2 و$3.",
+       "api-help-param-upload": "يجب أن يتم نشره كرفع ملف باستخدام بيانات متعددة الأجزاء/النماذج.",
+       "api-help-param-multi-separate": "قيم منفصلة بـ<kbd>|</kbd> أو [[Special:ApiHelp/main#main/datatypes|بديل]].",
+       "api-help-param-multi-max": "الحد الأقصى لعدد القيم هو {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} للبوتات).",
+       "api-help-param-multi-max-simple": "الحد الأقصى لعدد القيم هو {{PLURAL:$1|$1}}.",
+       "api-help-param-multi-all": "لتحديد كل القيم; استخدم <kbd>$1</kbd>.",
+       "api-help-param-default": "الافتراضي: $1",
+       "api-help-param-default-empty": "الافتراضي: <span class=\"apihelp-empty\">(فارغ)</span>",
+       "api-help-param-token": "تم استرداد رمز مميز \"$1\" من [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
+       "api-help-param-token-webui": "للتوافق; يتم أيضا قبول الرمز المميز المستخدم في واجهة المستخدم على الويب.",
+       "api-help-param-disabled-in-miser-mode": "تم التعطيل بسبب [[mw:Special:MyLanguage/Manual:$wgMiserMode|وضع miser]].",
+       "api-help-param-limited-in-miser-mode": "<strong>ملاحظة:</strong> بسبب [[mw:Special:MyLanguage/Manual:$wgMiserMode|وضع miser]]; استخدام هذا قد يؤدي إلى نتائج أقل من <var>$1limit</var> نتائج التي يتم عرضها قبل المتابعة، في الحالات القصوى، قد يتم إرجاع صفر نتائج.",
+       "api-help-param-direction": "في أي اتجاه للتعداد:\n;الأحدث: سرد الأقدم أولا، ملاحظة: يجب أن يكون $1start قبل $1end.\n;older:List newest first (default). Note: $1start has to be later than $1end.\n;الأقدم: سرد الأحدث أولا (افتراضي)، ملاحظة: يجب أن يكون $1start بعد $1end.",
+       "api-help-param-continue": "عندما تتوفر المزيد من النتائج، استخدم هذا للمتابعة",
+       "api-help-param-no-description": "<span class=\"apihelp-empty\">(لا يوجد وصف)</span>",
+       "api-help-param-maxbytes": "Cلا يمكن أن يكون أطول من $1 {{PLURAL:$1|بايت}}.",
+       "api-help-param-maxchars": "Cلا يمكن أن يكون أطول من $1 {{PLURAL:$1|حرف|أحرف}}.",
+       "api-help-examples": "{{PLURAL:$1|مثال|أمثلة}}:",
+       "api-help-permissions": "{{PLURAL:$1|الإذن|الأذونات}}:",
+       "api-help-permissions-granted-to": "{{PLURAL:$1|ممنوحة لـ}}: $2",
+       "api-help-right-apihighlimits": "استخدم حدودا أعلى في استعلامات API (استعلامات بطيئة: $1، استعلامات سريعة: $2)، تنطبق حدود الاستعلامات البطيئة أيضا على وسائط متعددة القيم.",
+       "api-help-open-in-apisandbox": "<small>[فتح في ملعب]</small>",
+       "api-help-authmanager-general-usage": "الإجراء العام لاستخدام هذه الوحدة هو:\n# جلب الحقول المتاحة من <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> مع amirequestsfor=$4، $<kbd>amirequestsfor=$4</kbd> ورمز <kbd>$5</kbd> من <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.\nعرض الحقول للمستخدم، والحصول على تقديمها.\n# النشر في هذه الوحدة، مع توفير <var>$1returnurl</var> وأية حقول ذات صلة.\n# افحص <samp>status</samp> في الاستجابة.\n#* إذا تلقيت <samp>PASS</samp> أو <samp>FAIL</samp> أنت انتهيت، العملية نجحت أو لم تفعل.\n#* إذا تلقيت <samp>UI</samp>، قدم الحقول الجديدة للمستخدم والحصول على تقديمها، ثم انشر في هذه الوحدة باستخدام <var>$1continue</var> والحقول ذات الصلة المحددة، وكرر الخطوة 4.\n#* إذا تلقيت <samp>REDIRECT</samp>، وجه المستخدم إلى <samp>redirecttarget</samp> وانتظر العودة إلى <var>$1returnurl</var>، ثم انشر في هذه الوحدة باستخدام <var>$1continue</var> وأية حقول تم تمريرها إلى المسار للعودة ، وكرر الخطوة 4.\n#* إذا تلقيت <samp>RESTART</samp>، هذا يعني أن المصادقة ناجحة ولكن ليس لدينا حساب مستخدم مرتبط، قد تعامل هذا كـ<samp>UI</samp> أو كـ<samp>FAIL</samp>.",
+       "api-help-authmanagerhelper-requests": "استخدم فقط طلبات المصادقة هذه، بواسطة <samp>id</samp> الذي يتم إرجاعه من <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> with <kbd>amirequestsfor=$1</kbd> أو من رد سابق من هذه الوحدة.",
+       "api-help-authmanagerhelper-request": "استخدم طلب المصادقة هذا ، بواسطة <samp>id</samp> الذي يتم إرجاعه من <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> مع <kbd>amirequestsfor=$1</kbd>.",
+       "api-help-authmanagerhelper-messageformat": "تنسيق لاستخدامه في إرسال الرسائل.",
+       "api-help-authmanagerhelper-mergerequestfields": "دمج معلومات الحقل لجميع طلبات التوثيق في مصفوفة واحدة.",
+       "api-help-authmanagerhelper-preservestate": "الحفاظ على الحالة من محاولة تسجيل دخول فاشلة سابقة، إن أمكن.",
+       "api-help-authmanagerhelper-returnurl": "يجب أن يكون العودة لتدفقات المصادقة من الجهات الخارجية مطلقا، مطلوب إما هذا أو  <var>$1continue</var>.\n\nعند استلام استجابة <samp>REDIRECT</samp>، ستفتح عادةً متصفح أو عرض ويب للمسار <samp>redirecttarget</samp>المحدد لتدفق مصادقة طرف ثالث، عند اكتمال ذلك، سيرسل الطرف الثالث المتصفح أو عرض الويب إلى هذا المسار، يجب عليك استخلاص أي استعلام أو وسائط POST من المسار وتمريرها كطلب <var>$1continue</var> إلى وحدة API هذه.",
+       "api-help-authmanagerhelper-continue": "هذا الطلب استمرار بعد استجابة <samp>UI</samp> أو <samp>REDIRECT</samp> سابقة، مطلوب إما هذا أو <var>$1returnurl</var>.",
+       "api-help-authmanagerhelper-additional-params": "تقبل هذه الوحدة معايير إضافية بناءً على طلبات المصادقة المتاحة، استخدم <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> مع <kbd>amirequestsfor=$1</kbd> (أو استجابة سابقة من هذه الوحدة، إن وُجِدت) لتحديد الطلبات المتاحة والحقول التي يستخدمونها.",
+       "apierror-allimages-redirect": "استخدم <kbd>gaifilterredir=nonredirects</kbd> بدلا من <var>redirects</var> عند استخدام <kbd>allimages</kbd> كمولد.",
+       "apierror-allpages-generator-redirects": "استخدم <kbd>gaifilterredir=nonredirects</kbd> بدلا من <var>redirects</var> عند استخدام <kbd>allimages</kbd> كمولد.",
+       "apierror-appendnotsupported": "لا يمكن إلحاق الصفحات باستخدام نموذج المحتوى $1.",
+       "apierror-articleexists": "تم بالفعل إنشاء المقالة التي حاولت إنشاءها.",
+       "apierror-assertbotfailed": "التأكيد على فشل المستخدم في صلاحية <code>bot</code>.",
+       "apierror-assertnameduserfailed": "تأكيد أن المستخدم \"$1\" فشل.",
+       "apierror-assertuserfailed": "التأكيد على فشل تسجيل الدخول للمستخدم.",
+       "apierror-autoblocked": "عنوان الآيبي الخاص بك تم منعه تلقائيا; لأنه تم استخدامه بواسطة مستخدم ممنوع.",
+       "apierror-badconfig-resulttoosmall": "إن قيمة <code>$wgAPIMaxResultSize</code> في هذا الويكي صغيرة جدا لا تحتوي على معلومات النتائج الأساسية.",
+       "apierror-badcontinue": "متابعة غير صحيحة; يجب عليك تمرير القيمة الأصلية التي تم إرجاعها بواسطة الاستعلام السابق.",
+       "apierror-baddiff": "لا يمكن استرجاع الفرقك; إحدى أو كلا المراجعتين غير موجودة أو ليست لديك صلاحية لعرضها.",
+       "apierror-baddiffto": "يجب تعيين <var>$1diffto</var> على عدد غير سالب، <kbd>prev</kbd>, <kbd>next</kbd> أو <kbd>cur</kbd>.",
+       "apierror-badformat-generic": "التنسيق المطلوب $1 غير مدعوم لنموذج المحتوى $2.",
+       "apierror-badformat": "التنسيق المطلوب $1 غير مدعوم لنموذج المحتوى $2 المستخدم بواسطة $3.",
+       "apierror-badgenerator-notgenerator": "لا يمكن استخدام الوحدة <kbd>$1</kbd> كمولد.",
+       "apierror-badgenerator-unknown": "<kbd>generator=$1</kbd> مجهول.",
+       "apierror-badip": "وسيط الآيبي غير صالح.",
+       "apierror-badmd5": "رمز الرقم MD5 المتوفر غير صحيح.",
+       "apierror-badmodule-badsubmodule": "لا تحتوي الوحدة <kbd>$1</kbd> على وحدة فرعية \"$2\".",
+       "apierror-badmodule-nosubmodules": "لا تحتوي الوحدة <kbd>$1</kbd> على وحدات فرعية.",
+       "apierror-badparameter": "قيمة غير صالحة للوسيط <var>$1</var>.",
+       "apierror-badquery": "استعلام غير صالح.",
+       "apierror-badtimestamp": "قيمة غير صالحة \"$2\" لوسيط الطابع الزمني <var>$1</var>.",
+       "apierror-badtoken": "رمز CSRF غير صالح.",
+       "apierror-badupload": "وسيط رفع الملف <var>$1</var> ليس رفع ملف; تأكد من استخدام <code>multipart/form-data</code> لـPOST الخاص بك وقم بتضمين اسم ملف في الرأس <code>Content-Disposition</code>.",
+       "apierror-badurl": "قيمة غير صالحة \"$2\" لوسيط العنوان <var>$1</var>.",
+       "apierror-baduser": "قيمة غير صالحة \"$2\" لوسيط المستخدم <var>$1</var>.",
+       "apierror-badvalue-notmultivalue": "لا يمكن استخدام فصل U+001F متعدد القيم إلا لوسائط متعددة القيم.",
+       "apierror-bad-watchlist-token": "رمز قائمة مراقبة غير صحيح مقدم; يُرجَى تعيين رمز مميز في [[Special:Preferences]].",
+       "apierror-blockedfrommail": "لقد تم منعك من إرسال البريد الإلكتروني.",
+       "apierror-blocked": "لقد تم منعك من التحرير.",
+       "apierror-botsnotsupported": "هذه الواجهة غير مدعومة للبوتات.",
+       "apierror-cannot-async-upload-file": "لا يمكن الجمع بين الوسيطين <var>async</var> و<var>file</var>، إذا كنت تريد معالجة غير متزامنة لملفك المرفوع، فارفعه أولاً إلى المخبأ (باستخدام الوسيط <var>stash</var>) ثم انشر الملف المتقطع بشكل غير متزامن (باستخدام <var>filekey</var> و<var>async</var>).",
+       "apierror-cannotreauthenticate": "هذا الإجراء غير متاح لأن هويتك لا يمكن التحقق منها.",
+       "apierror-cannotviewtitle": "لا يُسمَح لك بعرض $1.",
+       "apierror-cantblock-email": "ليست لديك صلاحية لمنع المستخدمين من إرسال البريد الإلكتروني من خلال الويكي.",
+       "apierror-cantblock": "ليست لديك صلاحية لمنع المستخدمين.",
+       "apierror-cantchangecontentmodel": "ليست لديك صلاحية لمنع المستخدمين لتغيير نموذج محتوى صفحة.",
+       "apierror-canthide": "ليست لديك صلاحية إخفاء أسماء المستخدمين من سجل المنع.",
+       "apierror-cantimport-upload": "ليست لديك صلاحية استيراد الصفحات المرفوعة.",
+       "apierror-cantimport": "ليست لديك صلاحية لاستيراد الصفحات.",
+       "apierror-cantoverwrite-sharedfile": "الملف الهدف موجود في مستودع مشترك وليست لديك صلاحية لتجاوزه.",
+       "apierror-cantsend": "لم تقم بتسجيل الدخول أو ليس لديك عنوان بريد إلكتروني مؤكد أو غير مسموح لك بإرسال بريد إلكتروني إلى مستخدمين آخرين; لذلك لا يمكنك إرسال بريد إلكتروني.",
+       "apierror-cantundelete": "تعذر الاسترجاع: قد لا تكون المراجعات المطلوبة موجودة، أو ربما تم الاسترجاع بالفعل.",
+       "apierror-changeauth-norequest": "فشل في إنشاء طلب التغيير.",
+       "apierror-chunk-too-small": "الحد الأدنى لحجم القطعة هو $1 {{PLURAL:$1|بايت}} للقطع غير النهائية.",
+       "apierror-cidrtoobroad": "لا يُقبَل مدى $1 CIDR أكبر من /$2.",
+       "apierror-compare-no-title": "لا يمكن الحفظ المسبق للحفظ بدون عنوان; حاول تحديد <var>fromtitle</var> أو <var>totitle</var>.",
+       "apierror-compare-nosuchfromsection": "لا يوجد قسم $1 في المحتوى 'من'.",
+       "apierror-compare-nosuchtosection": "لا يوجد قسم $1 في المحتوى 'إلى'.",
+       "apierror-compare-relative-to-nothing": "لا توجد مراجعة 'من' لـ<var>torelative</var> لتكون نسبة.",
+       "apierror-contentserializationexception": "فشل تسلسل المحتوى: $1",
+       "apierror-contenttoobig": "يتجاوز المحتوى الذي أدخلته حد حجم المقالة البالغ $1 {{PLURAL:$1|كيلوبايت}}.",
+       "apierror-copyuploadbaddomain": "لا يُسمَح بالمرفوعات بواسطة مسار من هذا النطاق.",
+       "apierror-copyuploadbadurl": "لا يُسمَح بالرفع من هذا المسار.",
+       "apierror-create-titleexists": "لا يمكن حماية العناوين الموجودة باستخدام <kbd>create</kbd>.",
+       "apierror-csp-report": "خطأ في معالجة تقرير CSP: $1.",
+       "apierror-databaseerror": "[$1] خطأ في استعلام قاعدة البيانات.",
+       "apierror-deletedrevs-param-not-1-2": "لا يمكن استخدام الوسيط <var>$1</var> في الأوضاع 1 أو 2.",
+       "apierror-deletedrevs-param-not-3": "لا يمكن استخدام الوسيط <var>$1</var> في الوضع 3.",
+       "apierror-emptynewsection": "إنشاء أقسام جديدة فارغة غير ممكن.",
+       "apierror-emptypage": "لا يُسمَح بإنشاء صفحات جديدة فارغة.",
+       "apierror-exceptioncaught": "[$1] تم اكتشاف الاستثناء: $2",
+       "apierror-filedoesnotexist": "الملف غير موجود.",
+       "apierror-fileexists-sharedrepo-perm": "الملف الهدف موجود في مستودع مشترك; استخدم الوسيط <var>ignorewarnings</var> لتجاوزه.",
+       "apierror-filenopath": "لا يمكن الحصول على مسار الملف المحلي.",
+       "apierror-filetypecannotberotated": "لا يمكن تدوير نوع الملف.",
+       "apierror-formatphp": "لا يمكن تمثيل هذه الاستجابة باستخدام <kbd>format=php</kbd>; انظر https://phabricator.wikimedia.org/T68776.",
+       "apierror-imageusage-badtitle": "يجب أن يكون عنوان <<kbd>$1</kbd> ملفا.",
+       "apierror-import-unknownerror": "خطأ غير معروف في الاستيراد: $1.",
+       "apierror-integeroutofrange-abovebotmax": "لا يجوز أن يكون <var>$1</var> أكثر من $2 (معين إلى $3) للبوتات أو الإداريين.",
+       "apierror-integeroutofrange-abovemax": "لا يجوز أن يكون <var>$1</var> أكثر من $2 (معين إلى $3) للمستخدمين.",
+       "apierror-integeroutofrange-belowminimum": "لا يجوز أن يكون <var>$1</var> أقل من $2 (معين إلى $3)",
+       "apierror-invalidcategory": "اسم التصنيفف الذي أدخلته غير صالح.",
+       "apierror-invalid-chunk": "الإزاحة بالإضافة إلى الجزء الحالي أكبر من حجم الملف المطالب به.",
+       "apierror-invalidexpiry": "وقت انتهاء الصلاحية غير صالح \"$1\".",
+       "apierror-invalid-file-key": "ليس مفتاح ملف صالح.",
+       "apierror-invalidlang": "رمز لغة غير صالح للوسيط <var>$1</var>.",
+       "apierror-invalidoldimage": "يحتوي الوسيط <var>oldimage</var> على تنسيق غير صالح.",
+       "apierror-invalidparammix-cannotusewith": "لا يمكن استخدام الوسيط <kbd>$1</kbd> مع <kbd>$2</kbd>.",
+       "apierror-invalidparammix-mustusewith": "يمكن استخدام الوسيط <kbd>$1</kbd> مع <kbd>$2</kbd> فقط.",
+       "apierror-invalidparammix-parse-new-section": "لا يمكن دمج <kbd>section=new</kbd> مع الوسائط <var>oldid</var> أو <var>pageid</var> أو <var>page</var>; الرجاء استخدام <var>title</var> و<var>text</var>.",
+       "apierror-invalidparammix": "لا يمكن استخدام {{PLURAL:$2|الوسائط}} $1 معا.",
+       "apierror-invalidsection": "يجب أن يكون الوسيط <var>section</var> معرف قسم صالحا أو <kbd>new</kbd>.",
+       "apierror-invalidsha1base36hash": "رمز رقم SHA1Base36 المقدم غير صالح.",
+       "apierror-invalidsha1hash": "رمز رقم SHA1 المقدم غير صالح.",
+       "apierror-invalidtitle": "عنوان سيء \"$1\".",
+       "apierror-invalidurlparam": "قيمة غير صالحة لـ<var>$1urlparam</var> (<kbd>$2=$3</kbd>).",
+       "apierror-invaliduser": "اسم المستخدم غير صالح \"$1\".",
+       "apierror-invaliduserid": "معرف المستخدم <var>$1</var> غير صالح.",
+       "apierror-maxbytes": "لا يمكن أن يكون الوسيط <var>$1</var> أطول من $2 {{PLURAL:$2|بايت}}",
+       "apierror-maxchars": "لا يمكن أن يكون الوسيط <var>$1</var> أطول من $2 {{PLURAL:$2|حرف|أحرف}}",
+       "apierror-maxlag-generic": "في انتظار خادم قاعدة البيانات: تأخر $1 {{PLURAL:$1|ثانية|ثوانٍ}}.",
+       "apierror-maxlag": "في انتظار $2: تأخر $1 {{PLURAL:$1|ثانية|ثوانٍ}}.",
+       "apierror-mimesearchdisabled": "تم تعطيل بحث MIME في وضع Miser.",
+       "apierror-missingcontent-pageid": "محتوى مفقود لمعرف الصفحة $1.",
+       "apierror-missingcontent-revid": "محتوى مفقود لمعرف المراجعة $1.",
+       "apierror-missingparam-at-least-one-of": "مطلوب {{PLURAL:$2|الوسيط|واحد على الأقل من الوسائط}} $1.",
+       "apierror-missingparam-one-of": "مطلوب {{PLURAL:$2|الوسيط|واحد على الأقل من الوسائط}} $1.",
+       "apierror-missingparam": "يجب تعيين الوسيط <var>$1</var>.",
+       "apierror-missingrev-pageid": "لا توجد مراجعة حالية لمعرف الصفحة $1.",
+       "apierror-missingrev-title": "لا توجد مراجعة حالية للعنوان $1.",
+       "apierror-missingtitle-createonly": "يمكن حماية العناوين المفقودة فقط باستخدام <kbd>create</kbd>.",
+       "apierror-missingtitle": "الصفحة التي حددتها غير موجودة.",
+       "apierror-missingtitle-byname": "الصفحة $1 غير موجودة.",
+       "apierror-moduledisabled": "تم تعطيل الوحدة <kbd>$1</kbd>.",
+       "apierror-multival-only-one-of": "{{PLURAL:$3|فقط|واحد فقط من}} $2 مسموح به للوسيط <var>$1</var>.",
+       "apierror-multpages": "لا يجوز استخدام <var>$1</var> إلا مع صفحة واحدة.",
+       "apierror-mustbeloggedin-changeauth": "يجب عليك تسجيل الدخول لتغيير بيانات المصادقة.",
+       "apierror-mustbeloggedin-generic": "يجب أن تكون مسجلا.",
+       "apierror-mustbeloggedin-linkaccounts": "يجب عليك تسجيل الدخول لربط الحسابات.",
+       "apierror-mustbeloggedin-removeauth": "يجب عليك تسجيل الدخول لإزالة بيانات المصادقة.",
+       "apierror-mustbeloggedin-uploadstash": "لا يتوفر الرفع المخبأ إلا للمستخدمين المسجلين.",
+       "apierror-mustbeloggedin": "يجب تسجيل الدخول إلى $1.",
+       "apierror-mustbeposted": "تتطلب الوحدة <kbd>$1</kbd> طلب POST.",
+       "apierror-mustpostparams": "تم العثور على {{PLURAL:$2|الوسيط|الوسائط}} في سلسلة الاستعلام، ولكن يجب أن يكون في نص POST: $1.",
+       "apierror-noapiwrite": "تم تعطيل تحرير هذا الويكي من خلال  API; تأكد من تضمين العبارة <code>$wgEnableWriteAPI=true;</code> في ملف <code>LocalSettings.php</code> الخاص بالويكي.",
+       "apierror-nochanges": "لم يتم طلب أية تغييرات.",
+       "apierror-nodeleteablefile": "لا يوجد مثل هذا الإصدار القديم من الملف.",
+       "apierror-no-direct-editing": "التعديل المباشر عبر API غير مدعوم لنموذج المحتوى $1 المستخدم في $2.",
+       "apierror-noedit-anon": "لا يمكن للمستخدمين المجهولين تحرير الصفحات.",
+       "apierror-noedit": "ليست لديك صلاحية تعديل الصفحات.",
+       "apierror-noimageredirect-anon": "لا يمكن للمستخدمين المجهولين إنشاء تحويلات صور.",
+       "apierror-noimageredirect": "ليست لديك صلاحية تعديل الصفحات إنشاء تحويلات الصور.",
+       "apierror-nosuchlogid": "لا توجد مدخلة سجل بالمعرف $1.",
+       "apierror-nosuchpageid": "لا توجد صفحة بالمعرف $1.",
+       "apierror-nosuchrcid": "لا يوجد تغيير حديث بالمعرف $1.",
+       "apierror-nosuchrevid": "لا توجد مراجعة بالمعرف $1.",
+       "apierror-nosuchsection": "لا يوجد قسم $1.",
+       "apierror-nosuchsection-what": "لا يوجد قسم $1 في $2.",
+       "apierror-nosuchuserid": "لا يوجد مستخدم بالمعرف $1.",
+       "apierror-notarget": "لم تحدد هدفا صالحا لهذا الإجراء.",
+       "apierror-notpatrollable": "لا يمكن إجراء مراجعة للمراجعة $1 لأنها قديمة جدا.",
+       "apierror-nouploadmodule": "لا توجد وحدة رفع محددة.",
        "apierror-offline": "لم يمكن المتابعة بسبب مشاكل في الاتصال بالشبكة; تأكد من أنه لديك اتصال بالإنترنت وحاول مرة أخرى.",
+       "apierror-opensearch-json-warnings": "لا يمكن تمثيل التحذيرات بتنسيق OpenSearch JSON.",
+       "apierror-pagecannotexist": "النطاق لا يسمح بالصفحات الفعلية.",
+       "apierror-pagedeleted": "لقد تم حذف الصفحة منذ أن جلبت طابعها الزمني.",
+       "apierror-pagelang-disabled": "لا يُسمَح بتغيير لغة صفحة في هذا الويكي.",
+       "apierror-paramempty": "قد لا يكون الوسيط <var>$1</var> فارغا.",
+       "apierror-parsetree-notwikitext": "<kbd>prop=parsetree</kbd> مدعوم لمحتوى نص الويكي فقط.",
+       "apierror-parsetree-notwikitext-title": "<kbd>prop=parsetree</kbd> مدعوم لمحتوى نص الويكي فقط، يستخدم $1 نموذج المحتوى $2.",
+       "apierror-pastexpiry": "وقت انتهاء الصلاحية \"$1\" في الماضي.",
+       "apierror-permissiondenied": "ليست لديك صلاحية لـ$1.",
+       "apierror-permissiondenied-generic": "الإذن مرفوض.",
+       "apierror-permissiondenied-patrolflag": "تحتاج إلى صلاحية<code>patrol</code> أو <code>patrolmarks</code> لطلب علم مراجع.",
+       "apierror-permissiondenied-unblock": "ليست لديك صلاحية لرفع منع المستخدمين.",
+       "apierror-prefixsearchdisabled": "تم تعطيل البحث عن بادئة MIME في وضع Miser.",
+       "apierror-promised-nonwrite-api": "لا يمكن إرسال رأس HTTP <code>Promise-Non-Write-API-Action</code> إلى وحدات API الخاصة بوضع الكتابة.",
+       "apierror-protect-invalidaction": "نوع حماية غير صالح \"$1\".",
+       "apierror-protect-invalidlevel": "مستوى حماية غير صالح \"$1\".",
+       "apierror-ratelimited": "لقد تجاوزت حد المعدل الخاص بك; يُرجَى الانتظار بعض الوقت والمحاولة مرة أخرى.",
+       "apierror-readapidenied": "أنت بحاجة لصلاحية القراءة لاستخدام هذه الوحدة.",
+       "apierror-readonly": "الويكي حاليا في وضع القراءة فقط.",
+       "apierror-reauthenticate": "لم تقم بالمصادقة مؤخرًا في هذه الجلسة; الرجاء إعادة التصديق.",
+       "apierror-redirect-appendonly": "لقد حاولت إجراء التعديل باستخدام وضع تحويل التالي، والذي يجب استخدامه في الاقتران مع <kbd>section=new</kbd> أو <var>prependtext</var> أو <var>appendtext</var>.",
+       "apierror-revdel-mutuallyexclusive": "لا يمكن استخدام نفس الحقل في كل من <var>hide</var> و<var>show</var>.",
+       "apierror-revdel-needtarget": "مطلوب عنوان مستهدف لنوع RevDel هذا.",
+       "apierror-revdel-paramneeded": "هناك قيمة واحدة على الأقل مطلوبة لـ<var>hide</var> و/أو <var>show</var>.",
+       "apierror-revisions-badid": "لم يتم العثور على مراجعة للوسيط <var>$1</var>.",
+       "apierror-revisions-norevids": "لا يجوز استخدام الوسيط <var>revids</var> مع خيارات القائمة (<var>$1limit</var> و<var>$1startid</var> و<var>$1endid</var و<kbd>$1dir=newer</kbd> و<var>$1user</var> و<var>$1excludeuser</var> و<var>$1start</var> و<var>$1end</var>).",
+       "apierror-revisions-singlepage": "تم استخدام <var>titles</var> أو <var>pageids</var> أو مولد لتزويد صفحات متعددة، لكن يمكن استخدام وسائط <var>$1limit</var> و<var>$1startid</var> و<var>$1endid</var> و<kbd>$1dir=newer</kbd> و<var>$1user</var> و<var>$1excludeuser</var> و<var>$1start</var> و<var>$1end</var> في صفحة واحدة فقط.",
+       "apierror-revwrongpage": "r$1 ليست مراجعة $2.",
+       "apierror-searchdisabled": "تم تعطيل بحث <var>$1</var>.",
+       "apierror-sectionreplacefailed": "لا يمكن دمج القسم المحدث.",
+       "apierror-sectionsnotsupported": "الأقسام غير مدعومة لنموذج المحتوى $1.",
+       "apierror-sectionsnotsupported-what": "الأقسام غير مدعومة بواسطة $1.",
+       "apierror-show": "وسيط غير صحيحة; قد لا يتم تقديم قيم خاصة متبادلة.",
+       "apierror-siteinfo-includealldenied": "يمكن عرض جميع معلومات الخوادم ما لم يكن <var>$wgShowHostNames</var> صحيحا.",
+       "apierror-sizediffdisabled": "تم تعطيل فرق الحجم في وضع Miser.",
+       "apierror-spamdetected": "تم رفض تعديلك لأنه يحتوي على جزء من الرسائل غير المرغوب فيها: <code>$1</code>.",
+       "apierror-specialpage-cantexecute": "ليست لديك صلاحية لعرض نتائج هذه الصفحة الخاصة.",
+       "apierror-stashedfilenotfound": "تعذر العثور على الملف في المخبأ: $1.",
+       "apierror-stashedit-missingtext": "لم يتم العثور على نص متقطع مع رمز الرقم المحدد.",
+       "apierror-stashfailed-complete": "تم اكتمال الرفع المقسم بالفعل، تحقق من الحالة للتفاصيل.",
+       "apierror-stashfailed-nosession": "لا توجد جلسة رفع مقسمة بهذا المفتاح.",
+       "apierror-stashfilestorage": "تعذر تخزين الرفع في المخبأ: $1",
+       "apierror-stashinvalidfile": "ملف مخفي غير صالح.",
+       "apierror-stashnosuchfilekey": "لا يوجد مفتاح ملف كهذا: $1.",
+       "apierror-stashpathinvalid": "مفتاح الملف بتنسيق غير لائق أو غير صالح بأي شكل آخر: $1.",
+       "apierror-stashwrongowner": "مالك غير صحيح: $1",
+       "apierror-stashzerolength": "الملف ذو طول صفري، ولا يمكن تخزينه في المخبأ: $1.",
+       "apierror-systemblocked": "لقد تم منعك تلقائيا بواسطة ميدياويكي.",
+       "apierror-templateexpansion-notwikitext": "توسيع القالب مدعوم لمحتوى نص الويكي فقط، يستخدم $1 نموذج المحتوى $2.",
        "apierror-timeout": "لم يستجب الخادم ضمن الوقت المتوقع.",
-       "api-feed-error-title": "خطأ ($1)"
+       "apierror-toofewexpiries": "$1 انتهت صلاحية {{PLURAL:$1|الطابع الزمني المقدم|الطوابع الزمنية المقدمة}} حيث كان يلزم توفر $2 {{PLURAL:$2|ه|ها}}.",
+       "apierror-toomanyvalues": "تم توفير قيم كثيرة جدا للوسيط <var>$1</var>، الحد هو $2.",
+       "apierror-unknownaction": "لم يتم التعرف على الإجراء المحدد <kbd>$1</kbd>.",
+       "apierror-unknownerror-editpage": "خطأ غير معروف في صفحة التعديل: $1.",
+       "apierror-unknownerror-nocode": "خطأ غير معروف.",
+       "apierror-unknownerror": "خطأ غير معروف: \"$1\".",
+       "apierror-unknownformat": "تنسيق غير معروف \"$1\".",
+       "apierror-unrecognizedparams": "{{PLURAL:$2|وسيط غير معترف به|وسائط غير معترف بها}}: $1.",
+       "apierror-unrecognizedvalue": "قيمة غير معروفة للوسيط <var>$1</var>: $2.",
+       "apierror-unsupportedrepo": "مستودع الملفات المحلي لا يدعم الاستعلام عن كل الصور.",
+       "apierror-upload-filekeyneeded": "يجب توفير Must supply a <var>filekey</var> عندما يكون <var>offset</var> غير صفري.",
+       "apierror-upload-filekeynotallowed": "لا يمكن توفير <var>filekey</var> عندما يكون <var>offset</var> 0.",
+       "apierror-upload-inprogress": "الرفع من المخبأ قيد التقدم بالفعل.",
+       "apierror-upload-missingresult": "لا توجد نتيجة في بيانات الحالة.",
+       "apierror-urlparamnormal": "تعذر تطبيع وسائط الصور لـ$1.",
+       "apierror-writeapidenied": "لا يُسمَح لك بتعديل هذا الويكي من خلال API.",
+       "apiwarn-alldeletedrevisions-performance": "للحصول على أداء أفضل عند إنشاء العناوين; اضبط <kbd>$1dir=newer</kbd>.",
+       "apiwarn-badurlparam": "تعذر تحليل <var>$1urlparam</var> لـ$2، باستخدام العرض والطول فقط.",
+       "apiwarn-badutf8": "تحتوي القيمة التي تم تمريرها لـ<var>$1</var> على بيانات غير صالحة أو غير طبيعية، يجب أن تكون البيانات النصية صالحة، NFC-normalized Unicode بدون أحرف تحكم C0 غير HT (\\t) وLF (\\n) وCR (\\r).",
+       "apiwarn-checktoken-percentencoding": "تحقق من أن الرموز مثل \"+\" في الرمز المميز يتم ترميزها بشكل صحيح في المسار.",
+       "apiwarn-compare-nocontentmodel": "لا يمكن تحديد نموذج محتوى، على افتراض $1.",
+       "apiwarn-deprecation-deletedrevs": "تم إيقاف <kbd>list=deletedrevs</kbd>; الرجاء استخدام <kbd>prop=deletedrevisions</kbd> or <kbd>list=alldeletedrevisions</kbd> بدلا من ذلك.",
+       "apiwarn-deprecation-expandtemplates-prop": "نظرا لعدم تحديد أية قيم للوسيط <var>prop</var>; تم استخدام تنسيق قديم للإخراج، تم إيقاف هذا التنسيق، وفي المستقبل، سيتم تعيين قيمة افتراضية للوسيط <var>prop</var>، مما يؤدي إلى استخدام التنسيق الجديد دائما.",
+       "apiwarn-deprecation-httpsexpected": "HTTP المستخدمة عند توقع HTTPS.",
+       "apiwarn-deprecation-login-botpw": "تم إيقاف تسجيل الدخول إلى الحساب الرئيسي عبر <kbd>action=login</kbd> وقد يتوقف عن العمل دون سابق إنذار، لمتابعة تسجيل الدخول باستخدام <kbd>action=login</kbd>; راجع [[Special:BotPasswords]]، لمتابعة استخدام تسجيل الدخول إلى الحساب الرئيسي بأمان; راجع <kbd>action=clientlogin</kbd>.",
+       "apiwarn-deprecation-login-nobotpw": "تم إيقاف تسجيل الدخول إلى الحساب الرئيسي عبر <kbd>action=login</kbd>، وقد يتوقف عن العمل دون سابق إنذار، لتسجيل الدخول بأمان; راجع <kbd>action=clientlogin</kbd>.",
+       "apiwarn-deprecation-login-token": "تم إيقاف عمل رمز مميز عبر <kbd>action=login</kbd> ;استخدم <kbd>action=query&meta=tokens&type=login</kbd> بدلا من ذلك.",
+       "apiwarn-deprecation-parameter": "تم إيقاف الوسيط <var>$1</var>.",
+       "apiwarn-deprecation-parse-headitems": "تم إيقاف <kbd>prop=headitems</kbd> منذ ميدياويكي 1.28; استخدم <kbd>prop=headhtml</kbd> عند إنشاء مستندات HTML جديدة، أو <kbd>prop=modules|jsconfigvars</kbd> عند تحديث مستند من جانب العميل.",
+       "apiwarn-deprecation-purge-get": "تم إيقاف استخدام <kbd>action=purge</kbd> عبر GET; استخدم POST بدلا من ذلك.",
+       "apiwarn-deprecation-withreplacement": "تم إيقاف <kbd>$1</kbd>; الرجاء استخدام <kbd>$2</kbd> بدلا من ذلك.",
+       "apiwarn-difftohidden": "لا يمكنك إجراء مقارنة مع r$1: المحتوى مخفي.",
+       "apiwarn-errorprinterfailed": "فشل خطأ الطباعة; سوف يعيد دون وسائط.",
+       "apiwarn-errorprinterfailed-ex": "فشل خطأ الطباعة (سوف يعيد دون وسائط): $1.",
+       "apiwarn-ignoring-invalid-templated-value": "تجاهل القيمة <kbd>$2</kbd> في <var>$1</var> عند معالجة وسائط القوالب.",
+       "apiwarn-invalidcategory": "\"$1\" ليس تصنيفا.",
+       "apiwarn-invalidtitle": "\"$1\" ليس عنوانا صالحا.",
+       "apiwarn-invalidxmlstylesheetext": "يجب أن تحتوي ورقة الأنماط على الملحق <code>.xsl</code> extension.",
+       "apiwarn-invalidxmlstylesheet": "ورقة أنماط غير صالحة أو غير موجودة محددة.",
+       "apiwarn-invalidxmlstylesheetns": "يجب أن تكون ورقة الأنماط في نطاق {{ns:MediaWiki}}.",
+       "apiwarn-moduleswithoutvars": "تم تعيين الخاصية <kbd>modules</kbd> ولكن ليست <kbd>jsconfigvars</kbd> أو <kbd>encodedjsconfigvars</kbd>، متغيرات التكوين ضرورية للاستخدام السليم للوحدة.",
+       "apiwarn-notfile": "\"$1\" ليس ملفا.",
+       "apiwarn-nothumb-noimagehandler": "تعذر إنشاء الصورة المصغرة نظرا لعدم احتواء $1 على معالج صورة مقترن.",
+       "apiwarn-parse-nocontentmodel": "لم يتم إعطاء <var>title</var> أو <var>contentmodel</var>، على افتراض $1.",
+       "apiwarn-parse-revidwithouttext": "تم استخدام <var>revid</var> بدون <var>text</var>، وتم طلب خصائص الصفحة المحللة، هل تقصد استخدام <var>oldid</var> بدلا من <var>revid</var>؟",
+       "apiwarn-parse-titlewithouttext": "تم استخدام <var>title</var> بدون <var>text</var>، وتم طلب خصائص الصفحة المحللة، هل تقصد استخدام <var>page</var> بدلا من <var>title</var>؟",
+       "apiwarn-tokennotallowed": "الإجراء \"$1\" غير مسموح به للمستخدم الحالي.",
+       "apiwarn-tokens-origin": "قد لا يتم الحصول على الرموز عند عدم تطبيق السياسة الأصلية.",
+       "apiwarn-truncatedresult": "تم اقتطاع هذه النتيجة لأنها قد تكون أكبر من حد الـ$1 بايت.",
+       "apiwarn-unclearnowtimestamp": "تم إيقاف تمرير \"$2\" لوسيط الطابع الزمني <var>$1</var>; إذا احتجت لسبب ما إلى تحديد الوقت الحالي دون حسابه من جانب العميل، فاستخدم <kbd>now</kbd>.",
+       "apiwarn-unrecognizedvalues": "{{PLURAL:$3|قيمة|قيم}} غير معروفة للوسيط <var>$1</var>: $2.",
+       "apiwarn-unsupportedarray": "يستخدم الوسيط <var>$1</var> بنية مصفوفة PHP غير مدعومة.",
+       "apiwarn-urlparamwidth": "تجاهل قيمة العرض المحددة في <var>$1urlparam</var> ($2) لصالح قيمة العرض المشتقة من <var>$1urlwidth</var>/<var>$1urlheight</var> ($3).",
+       "apiwarn-validationfailed-badchars": "أحرف غير صالحة في المفتاح (مسموح فقط بـ<code>a-z</code> و<code>A-Z</code> و<code>0-9</code> و<code>_</code> و<code>-</code>).",
+       "apiwarn-validationfailed-badpref": "ليس تفضيلا صالحا.",
+       "apiwarn-validationfailed-cannotset": "لا يمكن ضبطها بواسطة هذه الوحدة.",
+       "apiwarn-validationfailed-keytoolong": "المفتاح طويل جدًا (لا يُسمَح بأكثر من $1 بايت).",
+       "apiwarn-validationfailed": "خطأ في التحقق من <kbd>$1</kbd>: $2",
+       "apiwarn-wgDebugAPI": "<strong>تحذير الأمان</strong>: تم تمكين <var>$wgDebugAPI</var>.",
+       "api-feed-error-title": "خطأ ($1)",
+       "api-usage-docref": "راجع $1 لاستخدام API.",
+       "api-usage-mailinglist-ref": "اشترك في القائمة البريدية لإعلان api ميدياويكي في &lt;https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce&gt ; للحصول على إشعار بإيقاف API وإيقاف التغييرات.",
+       "api-exception-trace": "$1 في $2($3)\n$4",
+       "api-credits-header": "الإحالات",
+       "api-credits": "مطورو API:\n* يوري أستراخان (مبتكر، المطور الرئيسي سبتمبر 2006 - سبتمبر 2007) \n* روان كاتو (المطور الرئيسي سبتمبر 2007-2009) \n* فيكتور فاسيليف \n* برايان تونغ مينه \n* سام ريد \n* براد يورش (المطور الرئيسي 2013 - الآن) \n\nيُرجَى إرسال تعليقاتك واقتراحاتك وأسئلتك لـmediawiki-api@lists.wikimedia.org\nأو إرسال تقريرا عن خطأ في https://phabricator.wikimedia.org/."
 }
index c69f267..09e4106 100644 (file)
@@ -15,7 +15,7 @@
                        "Ilimanaq29"
                ]
        },
-       "apihelp-main-extended-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Dokumentace]]\n* [[mw:Special:MyLanguage/API:FAQ|Otázky a odpovědi]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-mailová konference]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Oznámení k API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Chyby a požadavky]\n</div>\n<strong>Stav:</strong> Všechny funkce uvedené na této stránce by měly fungovat, ale API se stále aktivně vyvíjí a může se kdykoli změnit. Upozornění na změny získáte přihlášením se k [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ e-mailové konferenci mediawiki-api-announce].\n\n<strong>Chybné požadavky:</strong> Pokud jsou do API zaslány chybné požadavky, bude vrácena HTTP hlavička s klíčem „MediaWiki-API-Error“ a hodnota této hlavičky a chybový kód budou nastaveny na stejnou hodnotu. Více informací najdete [[mw:Special:MyLanguage/API:Errors_and_warnings|v dokumentaci]].\n\n<strong>Testování:</strong> Pro jednoduché testování požadavků na API zkuste [[Special:ApiSandbox]].",
+       "apihelp-main-extended-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Dokumentace]]\n* [[mw:Special:MyLanguage/API:FAQ|Otázky a odpovědi]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-mailová konference]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Oznámení k API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Chyby a požadavky]\n</div>\n<strong>Stav:</strong> Všechny funkce uvedené na této stránce by měly fungovat, ale API se stále aktivně vyvíjí a může se kdykoli změnit. Upozornění na změny získáte přihlášením se k [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ e-mailové konferenci mediawiki-api-announce].\n\n<strong>Chybné požadavky:</strong> Pokud jsou do API zaslány chybné požadavky, bude vrácena HTTP hlavička s klíčem „MediaWiki-API-Error“ a hodnota této hlavičky a chybový kód budou nastaveny na stejnou hodnotu. Více informací najdete [[mw:Special:MyLanguage/API:Errors_and_warnings|v dokumentaci]].\n\n<p class=\"mw-apisandbox-link\"><strong>Testování:</strong> Pro jednoduché testování požadavků na API zkuste [[Special:ApiSandbox]].</p>",
        "apihelp-main-param-action": "Která akce se má provést.",
        "apihelp-main-param-format": "Formát výstupu.",
        "apihelp-main-param-maxlag": "Maximální zpoždění lze použít, když je MediaWiki nainstalováno na cluster s replikovanou databází. Abyste se vyhnuli zhoršování už tak špatného replikačního zpoždění, můžete tímto parametrem nechat klienta čekat, dokud replikační zpoždění neklesne pod uvedenou hodnotu. V případě příliš vysokého zpoždění se vrátí chybový kód „<samp>maxlag</samp>“ s hlášením typu „<samp>Waiting for $host: $lag seconds lagged</samp>“.<br />Více informací najdete v [[mw:Special:MyLanguage/Manual:Maxlag_parameter|příručce]].",
index d0e9f1a..54fbef8 100644 (file)
        "apihelp-query+filearchive-paramvalue-prop-archivename": "Fügt den Dateinamen der Archivversion für die nicht-neuesten Versionen hinzu.",
        "apihelp-query+filearchive-example-simple": "Eine Liste aller gelöschten Dateien auflisten",
        "apihelp-query+filerepoinfo-summary": "Gebe Metainformationen über Bild-Repositorien zurück, die im Wiki eingerichtet sind.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-rootUrl": "Wurzel-URL-Pfad für Bildpfade.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-scriptDirUrl": "Wurzel-URL-Pfad für die MediaWiki-Installation des Repositoriumwikis.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-thumbUrl": "Wurzel-URL-Pfad für Vorschaubildpfade.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-url": "URL-Pfad der öffentlichen Zone.",
        "apihelp-query+filerepoinfo-example-simple": "Ruft Informationen über Dateirepositorien ab.",
        "apihelp-query+fileusage-summary": "Alle Seiten finden, die die angegebenen Dateien verwenden.",
        "apihelp-query+fileusage-param-prop": "Zurückzugebende Eigenschaften:",
index 94e1ac6..74efd82 100644 (file)
        "apihelp-query+filearchive-example-simple": "Show a list of all deleted files.",
 
        "apihelp-query+filerepoinfo-summary": "Return meta information about image repositories configured on the wiki.",
-       "apihelp-query+filerepoinfo-param-prop": "Which repository properties to get (there may be more available on some wikis):\n;apiurl:URL to the repository API - helpful for getting image info from the host.\n;name:The key of the repository - used in e.g. <var>[[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> and [[Special:ApiHelp/query+imageinfo|imageinfo]] return values.\n;displayname:The human-readable name of the repository wiki.\n;rooturl:Root URL for image paths.\n;local:Whether that repository is the local one or not.",
+       "apihelp-query+filerepoinfo-param-prop": "Which repository properties to get (properties available may vary on other wikis).",
+       "apihelp-query+filerepoinfo-paramvalue-prop-apiurl": "URL to the repository API - helpful for getting image info from the host.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-articlepath": "Repository wiki's <var>[[mw:Special:MyLanguage/Manual:$wgArticlePath|$wgArticlePath]]</var> or equivalent.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-canUpload": "Whether files can be uploaded to this repository, e.g. via CORS and shared authentication.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-displayname": "The human-readable name of the repository wiki.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-favicon": "Repository wiki's favicon URL, from <var>[[mw:Special:MyLanguage/Manual:$wgFavicon|$wgFavicon]]</var>.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-fetchDescription": "Whether file description pages are fetched from this repository when viewing local file description pages.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-initialCapital": "Whether file names implicitly start with a capital letter.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-local": "Whether that repository is the local one or not.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-name": "The key of the repository - used in e.g. <var>[[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> and [[Special:ApiHelp/query+imageinfo|imageinfo]] return values.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-rootUrl": "Root URL path for image paths.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-scriptDirUrl": "Root URL path for the repository wiki's MediaWiki installation.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-server": "Repository wiki's <var>[[mw:Special:MyLanguage/Manual:$wgServer|$wgServer]]</var> or equivalent.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-thumbUrl": "Root URL path for thumbnail paths.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-url": "Public zone URL path.",
        "apihelp-query+filerepoinfo-example-simple": "Get information about file repositories.",
 
        "apihelp-query+fileusage-summary": "Find all pages that use the given files.",
index 323a784..a80ff50 100644 (file)
        "apihelp-query+filearchive-paramvalue-prop-archivename": "Ajoute le nom de fichier de la version d’archive pour les versions autres que la dernière.",
        "apihelp-query+filearchive-example-simple": "Afficher une liste de tous les fichiers supprimés",
        "apihelp-query+filerepoinfo-summary": "Renvoyer les méta-informations sur les référentiels d’images configurés dans le wiki.",
-       "apihelp-query+filerepoinfo-param-prop": "Quelles propriétés du référentiel récupérer (il peut y en avoir plus de disponibles sur certains wikis) :\n;apiurl:URL de l’API du référentiel - utile pour obtenir les infos de l’image depuis l’hôte.\n;name:La clé du référentiel - utilisé par ex. dans les valeurs de retour de <var>[[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> et [[Special:ApiHelp/query+imageinfo|imageinfo]].\n;displayname:Le nom lisible du wiki référentiel.\n;rooturl:URL racine des chemins d’image.\n;local:Si ce référentiel est le référentiel local ou non.",
+       "apihelp-query+filerepoinfo-param-prop": "Quelles propriétés récupérer du référentiel (les propriétés disponibles peuvent varier sur les autres wikis).",
+       "apihelp-query+filerepoinfo-paramvalue-prop-apiurl": "URL vers l’API du dépôt — utile pour obtenir des informations sur l’image depuis l’hôte.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-articlepath": "<var>[[mw:Special:MyLanguage/Manual:$wgArticlePath|$wgArticlePath]]</var> du wiki du dépôt, ou équivalent.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-canUpload": "Si les fichiers peuvent être téléchargés sur ce dépôt, par ex. via CORS et l’authentification partagée.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-displayname": "Le nom lisible du wiki du dépôt.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-favicon": "URL de l'icône favorite du dépôt du wiki, depuis <var>[[mw:Special:MyLanguage/Manual:$wgFavicon|$wgFavicon]]</var>.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-fetchDescription": "Si les pages de description de fichier sont récupérées de ce dépôt lors de l’affichage des pages de description de fichier locales.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-initialCapital": "Si les noms de fichier commencent implicitement par une majuscule.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-local": "Si ce dépôt est local ou non.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-name": "La clé du dépôt — utilisée dans les valeurs de retour, par ex. <var>[[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> et [[Special:ApiHelp/query+imageinfo|imageinfo]] return values.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-rootUrl": "Chemin de l’URL racine pour les chemins d’image.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-scriptDirUrl": "Chemin de l’URL racine pour l’installation de MédiaWiki du wiki du dépôt.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-server": "<var>[[mw:Special:MyLanguage/Manual:$wgServer|$wgServer]]</var> du wiki du dépôt, ou équivalent.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-thumbUrl": "Chemin de l’URL racine pour les chemins des vignettes.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-url": "Chemin de l’URL de la zone publique.",
        "apihelp-query+filerepoinfo-example-simple": "Obtenir des informations sur les référentiels de fichier.",
        "apihelp-query+fileusage-summary": "Trouver toutes les pages qui utilisent les fichiers donnés.",
        "apihelp-query+fileusage-param-prop": "Quelles propriétés obtenir :",
index 057adc0..44910c8 100644 (file)
        "apihelp-query+filearchive-paramvalue-prop-archivename": "הוספת שם הקובץ של גרסה מאורכבת עבור גרסאות שאינן האחרונה.",
        "apihelp-query+filearchive-example-simple": "הצגת רשימת כל הקבצים המחוקים.",
        "apihelp-query+filerepoinfo-summary": "החזרת מידע מטא על מאגרי תמונות שמוגדרים בוויקי.",
-       "apihelp-query+filerepoinfo-param-prop": "אילו מאפייני מאגר לקבל (יכולים להיות יותר מזה באתרי ויקי אחדים):\n;apiurl:URL ל־API של המאגר – מועיל לקבלת מידע על התמונה מהמארח.\n;name:המפתח של המאגר – משמש למשל בערכים המוחזרים מ־<var>[[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> ומ־[[Special:ApiHelp/query+imageinfo|imageinfo]].\n;displayname:שם קריא של אתר הוויקי של המאגר.\n;rooturl:URL שורש לנתיבי תמונות.\n;local:האם המאגר הוא מקומי או לא.",
+       "apihelp-query+filerepoinfo-param-prop": "אילו מאפייני מאגר לקבל (המאפיינים הזמינים עשויים להשתנות באתרי ויקי אחרים).",
+       "apihelp-query+filerepoinfo-paramvalue-prop-apiurl": "כתובת URL ל־API של המאגר – שימושי לקבלת מידע על תמונות מהשרת המארח.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-articlepath": "ההגדרה <var dir=\"ltr\">[[mw:Special:MyLanguage/Manual:$wgArticlePath|$wgArticlePath]]</var> של אתר הוויקי של המאגר או ערך השווה לה.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-canUpload": "האם ניתן להעלות קבצים למאגר הזה, למשל באמצעות CORS ובאמצעות אימות משותף.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-displayname": "שם אתר הוויקי של המאגר (בפורמט שמתאים לקריאה על־ידי אדם).",
+       "apihelp-query+filerepoinfo-paramvalue-prop-favicon": "כתובת הצלמית של אתר הוויקי של המאגר, מתוך ההגדרה <var dir=\"ltr\">[[mw:Special:MyLanguage/Manual:$wgFavicon|$wgFavicon]]</var>.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-fetchDescription": "האם דפי תיאור של קבצים מאוחזרים מהמאגר הזה בעת צפייה בדפי תיאור של קבצים מקומיים.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-initialCapital": "האם שמות של קבצים מתחילים באות גדולה.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-local": "האם המאגר הזה הוא המאגר המקומי או לא.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-name": "מפתח המאגר, שנמצא בשימוש למשל בערכים המוחזרים של <var dir=\"ltr\">[[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> ושל [[Special:ApiHelp/query+imageinfo|imageinfo]].",
+       "apihelp-query+filerepoinfo-paramvalue-prop-rootUrl": "נתיב כתובת הבסיס עבור נתיבים של תמונות.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-scriptDirUrl": "נתיב כתובת הבסיס של התקנת מדיה־ויקי באתר הוויקי של המאגר.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-server": "ההגדרה <var dir=\"ltr\">[[mw:Special:MyLanguage/Manual:$wgServer|$wgServer]]</var> של אתר הוויקי של המאגר או ערך השווה לה.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-thumbUrl": "נתיב כתובת הבסיס עבור נתיבים של תמונות ממוזערות.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-url": "נתיב הכתובת של התחום הציבורי.",
        "apihelp-query+filerepoinfo-example-simple": "קבלת מידע על מאגרי קבצים.",
        "apihelp-query+fileusage-summary": "מציאת כל הדפים שמשתמשים בקבצים הנתונים.",
        "apihelp-query+fileusage-param-prop": "אילו מאפיינים לקבל:",
        "apihelp-query+recentchanges-param-limit": "כמה שינויים להחזיר בסך הכול.",
        "apihelp-query+recentchanges-param-type": "אילו סוגים של שינויים להציג.",
        "apihelp-query+recentchanges-param-toponly": "לרשום רק שינויים שהם הגרסה האחרונה.",
+       "apihelp-query+recentchanges-param-title": "סינון הרשומות לאלו הקשורות לדף.",
        "apihelp-query+recentchanges-param-generaterevisions": "בעת שימוש בתור מחולל, לחולל מזהי גרסה במקום כותרות. עיולי שינויים אחרונים ללא מזהה גרסה משויך (למשל רוב עיולי היומן) לא יחוללו דבר.",
        "apihelp-query+recentchanges-example-simple": "הצגת השינויים האחרונים.",
        "apihelp-query+recentchanges-example-generator": "קבלת מידע על הדף על שינויים אחרונים שלא נבדקו.",
index c486045..e2b6bb4 100644 (file)
        "apihelp-query+filearchive-paramvalue-prop-metadata": "그림의 버전에 대한 Exif 메타데이터를 나열합니다.",
        "apihelp-query+filearchive-example-simple": "삭제된 모든 파일의 목록을 표시합니다.",
        "apihelp-query+filerepoinfo-summary": "위키에 구성된 그림 저장소에 대한 메타 정보를 반환합니다.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-apiurl": "저장소 API의 URL - 호스트로부터 이미지 정보를 가져오는데 유용합니다.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-canUpload": "파일을 이 저장소에 올릴 수 있는지의 여부. (예: CORS를 통해, 공유 인증을 통해)",
+       "apihelp-query+filerepoinfo-paramvalue-prop-displayname": "사람이 식별할 수 있는 저장소 위키의 이름입니다.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-local": "해당 저장소가 로컬인지 아닌지의 여부입니다.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-rootUrl": "이미지 경로의 루트 URL 경로입니다.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-thumbUrl": "섬네일 경로의 루트 URL 경로입니다.",
        "apihelp-query+filerepoinfo-example-simple": "파일 저장소의 정보를 가져옵니다.",
        "apihelp-query+fileusage-summary": "제시된 파일을 사용하는 모든 문서를 찾습니다.",
        "apihelp-query+fileusage-param-prop": "얻고자 하는 속성:",
index d0148fe..271e36c 100644 (file)
@@ -31,6 +31,7 @@
        "apihelp-main-param-servedby": "De hostnaam van de server die de aanvraag heeft afgehandeld aan de resultaten toevoegen.",
        "apihelp-main-param-curtimestamp": "Huidige tijd aan de resultaten toevoegen.",
        "apihelp-main-param-responselanginfo": "De voor <var>uselang</var> en <var>errorlang</var> gebruikte talen aan de resultaten toevoegen.",
+       "apihelp-main-param-uselang": "Taal om te gebruiken voor berichtvertalingen. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> gecombineerd met <kbd>siprop=languages</kbd> toont een lijst met taalcodes. De waarde <kbd>user</kbd> gebruikt de taal die door de huidige gebruiker als voorkeur is ingesteld. De waarde <kbd>content</kbd> gebruikt de taal die de inhoud op de wiki heeft.",
        "apihelp-main-param-errorlang": "De voor waarschuwingen en fouten te gebruiken taal. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> met <kbd>siprop=languages</kbd> geeft een lijst van taalcodes, of stel <kbd>content</kbd> in om de taal van de inhoud van deze wiki te gebruiken, of stel <kbd>uselang</kbd> in om dezelfde waarde als de parameter <var>uselang</var> te gebruiken.",
        "apihelp-main-param-errorsuselocal": "Indien ingesteld maken foutmeldingen gebruik van lokaal-aangepaste berichten in de {{ns:MediaWiki}}-naamruimte.",
        "apihelp-block-summary": "Gebruiker blokkeren.",
        "apihelp-move-param-to": "Nieuwe paginanaam.",
        "apihelp-move-param-reason": "Reden voor de naamswijziging.",
        "apihelp-move-param-movetalk": "Hernoem de overlegpagina, indien deze bestaat.",
+       "apihelp-move-param-movesubpages": "Hernoem ook deelpagina's, indien van toepassing.",
        "apihelp-move-param-noredirect": "Geen doorverwijzing achterlaten.",
        "apihelp-move-param-watch": "Voeg de pagina en de doorverwijzing toe aan de volglijst van de huidige gebruiker.",
        "apihelp-move-param-unwatch": "Verwijder de pagina en de doorverwijzing van de volglijst van de huidige gebruiker.",
        "apihelp-opensearch-summary": "In de wiki zoeken met behulp het OpenSearchprotocol.",
        "apihelp-opensearch-param-search": "Zoektekst.",
        "apihelp-opensearch-param-limit": "Het maximale aantal weer te geven resultaten.",
-       "apihelp-opensearch-param-namespace": "Te doorzoeken naamruimten.",
+       "apihelp-opensearch-param-namespace": "Te doorzoeken naamruimten. Wordt genegeerd indien <var>$1search</var> met een geldige naamruimte voorvoegsel begint.",
        "apihelp-opensearch-param-suggest": "Niets doen als <var>[[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> onwaar is.",
        "apihelp-opensearch-param-redirects": "Hoe om te gaan met doorverwijzingen:\n;return:Retourneer de doorverwijzing.\n;resolve:Retourneer de doelpagina. Retourneert mogelijk minder dan $1limit resultaten.\nOm historische redenen is \"return\" de standaardinstelling voor <code>$1format=json</code>, en \"resolve\" voor andere formaten.",
        "apihelp-opensearch-param-format": "Het uitvoerformaat.",
        "apihelp-query+alldeletedrevisions-param-tag": "Alleen versies met dit label weergeven.",
        "apihelp-query+alldeletedrevisions-param-excludeuser": "Geen revisies door deze gebruiker weergeven.",
        "apihelp-query+alldeletedrevisions-param-namespace": "Alleen pagina's in deze naamruimte weergeven.",
+       "apihelp-query+alldeletedrevisions-example-user": "Toon de laatste 50 verwijderde bijdragen van gebruiker <kbd>Example</kbd>.",
+       "apihelp-query+alldeletedrevisions-example-ns-main": "Toon de eerse 50 verwijderde versies in de hoofdnaamruimte.",
        "apihelp-query+allfileusages-paramvalue-prop-title": "Voegt de titel van het bestand toe.",
        "apihelp-query+allfileusages-param-limit": "Hoeveel items er in totaal moeten worden getoond.",
        "apihelp-query+allimages-example-recent": "Toon een lijst van recentelijk geüploade bestanden, vergelijkbaar met [[Special:NewFiles]].",
        "apihelp-query+alllinks-param-namespace": "De door te lopen naamruimte.",
        "apihelp-query+alllinks-param-limit": "Hoeveel items er in totaal moeten worden getoond.",
+       "apihelp-query+allmessages-param-prop": "Welke eigenschappen op te vragen.",
        "apihelp-query+allmessages-param-enableparser": "Stel in om de parser in te schakelen, zorgt voor het voorverwerken van de wikitekst van een bericht (vervangen van magische woorden, afhandelen van sjablonen, enz.).",
        "apihelp-query+allmessages-param-lang": "Toon berichten in deze taal.",
        "apihelp-query+allmessages-param-from": "Toon berichten vanaf dit bericht.",
        "apihelp-query+allmessages-param-to": "Toon berichten tot aan dit bericht.",
+       "apihelp-query+allmessages-param-prefix": "Toon berichten met dit voorvoegsel.",
+       "apihelp-query+allpages-param-limit": "Het totaal aantal pagina's dat getoont moeten worden.",
        "apihelp-query+allredirects-summary": "Toon alle doorverwijzingen naar een naamruimte.",
+       "apihelp-query+allredirects-paramvalue-prop-title": "Voegt de titel van de doorverwijzing toe.",
+       "apihelp-query+allrevisions-summary": "Toon alle versies.",
        "apihelp-query+allrevisions-example-user": "Toon de laatste 50 bijdragen van gebruiker <kbd>Example</kbd>.",
        "apihelp-query+mystashedfiles-paramvalue-prop-type": "Vraag het MIME- en mediatype van het bestand op.",
        "apihelp-query+mystashedfiles-param-limit": "Hoeveel bestanden te tonen.",
+       "apihelp-query+alltransclusions-param-namespace": "De door te lopen naamruimte.",
+       "apihelp-query+allusers-param-dir": "Richting om in te sorteren.",
        "apihelp-query+allusers-param-excludegroup": "Sluit gebruikers in de gegeven groepen uit.",
        "apihelp-query+allusers-paramvalue-prop-blockinfo": "Voegt informatie over een actuele blokkade van de gebruiker toe.",
        "apihelp-query+allusers-paramvalue-prop-groups": "Toont de groepen waar de gebruiker in zit. Dit gebruikt meer serverbronnen en retourneert mogelijk minder resultaten dan de opgegeven limiet.",
        "apihelp-query+allusers-paramvalue-prop-rights": "Toont de rechten die de gebruiker heeft.",
        "apihelp-query+allusers-paramvalue-prop-editcount": "Voegt het aantal bewerkingen van de gebruiker toe.",
        "apihelp-query+allusers-paramvalue-prop-registration": "Voegt de registratiedatum van de gebruiker toe, indien beschikbaar (kan leeg zijn).",
+       "apihelp-query+allusers-param-limit": "Het totaal aantal aan gebruikersnamen dat getoont moet worden.",
        "apihelp-query+allusers-param-witheditsonly": "Toon alleen gebruikers die bewerkingen hebben gemaakt.",
        "apihelp-query+allusers-param-activeusers": "Toon alleen gebruikers die actief zijn geweest in de laatste {{PLURAL:$1|dag|$1 dagen}}.",
        "apihelp-query+allusers-example-Y": "Toon gebruikers vanaf <kbd>Y</kbd>.",
        "apihelp-query+categories-paramvalue-prop-hidden": "Markeert categorieën die verborgen zijn met <code>_&#95;HIDDENCAT_&#95;</code>",
        "apihelp-query+categories-param-show": "Welke soort categorieën te tonen.",
        "apihelp-query+categories-param-limit": "Hoeveel categorieën te tonen.",
+       "apihelp-query+categories-example-simple": "Toon de lijst waarin de pagina <kbd>Albert Einstein</kbd> zich bevind.",
+       "apihelp-query+categorymembers-summary": "Toon alle pagina's in de opgegeven categorie.",
        "apihelp-query+categorymembers-paramvalue-prop-ids": "Voegt de pagina-ID toe.",
        "apihelp-query+categorymembers-paramvalue-prop-title": "Voegt de titel en de naamruimte-ID van de pagina toe.",
+       "apihelp-query+categorymembers-param-limit": "Het maximale aantal weer te geven pagina's.",
        "apihelp-query+categorymembers-param-dir": "Richting om in te sorteren.",
+       "apihelp-query+categorymembers-example-simple": "Toon de eerste 10 pagina's in <kbd>Category:Physics</kbd>.",
        "apihelp-query+deletedrevisions-param-tag": "Alleen revisies met dit label weergeven.",
        "apihelp-query+deletedrevs-param-tag": "Alleen revisies met dit label weergeven.",
        "apihelp-query+embeddedin-param-namespace": "De door te lopen naamruimte.",
        "apihelp-query+imageusage-example-simple": "Toon pagina's die [[:File:Albert Einstein Head.jpg]] gebruiken.",
        "apihelp-query+imageusage-example-generator": "Toon informatie over pagina's die [[:File:Albert Einstein Head.jpg]] gebruiken.",
        "apihelp-query+iwbacklinks-param-prefix": "Voorvoegsel voor de interwiki.",
+       "apihelp-query+langbacklinks-example-simple": "Toon de pagina's die verwijzen naar [[:fr:Test]].",
+       "apihelp-query+linkshere-paramvalue-prop-pageid": "Pagina-ID van elke pagina.",
+       "apihelp-query+linkshere-paramvalue-prop-title": "Titel van elke pagina.",
+       "apihelp-query+linkshere-param-namespace": "Toon alleen pagina's in deze naamruimten.",
+       "apihelp-query+linkshere-example-simple": "Toon een lijst van pagina's die naar [[Main Page]] verwijzen.",
        "apihelp-query+logevents-param-type": "Logboekregels alleen voor dit type filteren.",
        "apihelp-query+logevents-param-tag": "Alleen logboekregels met dit label weergeven.",
        "apihelp-query+logevents-example-simple": "Recente logboekregels weergeven.",
+       "apihelp-query+pageswithprop-paramvalue-prop-ids": "Voegt de pagina-ID toe.",
+       "apihelp-query+prefixsearch-param-offset": "Aantal resultaten dat overgeslagen moeten worden.",
        "apihelp-query+protectedtitles-paramvalue-prop-level": "Voegt het beveiligingsniveau toe.",
        "apihelp-query+protectedtitles-example-simple": "Toon beveiligde titels.",
        "apihelp-query+querypage-param-limit": "Aantal te tonen resultaten.",
        "apihelp-query+querypage-example-ancientpages": "Toon resultaten van [[Special:Ancientpages]].",
        "apihelp-query+random-param-namespace": "Toon alleen pagina's in deze naamruimten.",
        "apihelp-query+random-param-limit": "Beperk hoeveel willekeurige pagina's worden getoond.",
+       "apihelp-query+random-param-redirect": "Gebruik in plaats daarvan <kbd>$1filterredir=redirects</kbd>.",
        "apihelp-query+random-example-simple": "Toon twee willekeurige pagina's uit de hoofdnaamruimte.",
        "apihelp-query+random-example-generator": "Toon pagina-informatie over twee willekeurige pagina's uit de hoofdnaamruimte.",
        "apihelp-query+recentchanges-param-user": "Toon alleen wijzigingen door deze gebruiker.",
        "apihelp-query+revisions+base-paramvalue-prop-tags": "Labels voor de versie.",
        "apihelp-query+revisions+base-param-difftotextpst": "Gebruik in plaats hiervan [[Special:ApiHelp/compare|action=compare]]. Een \"pre-save\"-transformatie uitvoeren op de tekst alvorens de verschillen te bepalen. Alleen geldig indien gebruikt met <var>$1difftotext</var>.",
        "apihelp-query+search-summary": "Voer een zoekopdracht in de volledige tekst uit.",
+       "apihelp-query+search-paramvalue-prop-score": "Genegeerd.",
+       "apihelp-query+search-paramvalue-prop-hasrelated": "Genegeerd.",
        "apihelp-query+search-param-limit": "Hoeveel pagina's te tonen.",
        "apihelp-query+search-example-simple": "Zoeken naar <kbd>meaning</kbd>.",
        "apihelp-query+siteinfo-paramvalue-prop-namespacealiases": "Lijst van geregistreerde naamruimte-aliassen.",
        "apihelp-query+usercontribs-example-ipprefix": "Bijdragen van alle IP-adressen met het voorvoegsel <kbd>192.0.2.</kbd> weergeven.",
        "apihelp-query+userinfo-summary": "Informatie over de huidige gebruiker opvragen.",
        "apihelp-query+userinfo-paramvalue-prop-realname": "Voegt de echte naam van de gebruiker toe.",
+       "apihelp-query+watchlist-paramvalue-prop-title": "Voegt de titel van de pagina toe.",
        "apihelp-query+watchlist-paramvalue-prop-loginfo": "Voegt logboekgegevens toe waar van toepassing.",
        "apihelp-query+watchlist-param-type": "Welke typen wijzigingen weer te geven:",
        "apihelp-query+watchlist-paramvalue-type-edit": "Gewone paginabewerkingen.",
        "apihelp-query+watchlist-paramvalue-type-new": "Nieuwe pagina's.",
        "apihelp-query+watchlist-paramvalue-type-log": "Logboekregels.",
        "apihelp-query+watchlist-paramvalue-type-categorize": "Wijzigingen in categorielidmaatschap.",
+       "apihelp-setpagelanguage-summary": "Wijzig de taal van een pagina.",
+       "apihelp-stashedit-param-sectiontitle": "De titel van een nieuw kopje.",
        "apihelp-stashedit-param-text": "Pagina-inhoud.",
+       "apihelp-unblock-summary": "Gebruikers deblokkeren.",
        "apihelp-unblock-param-user": "Te deblokkeren gebruikersnaam, IP-adres of IP-range. Kan niet in combinatie met <var>$1id</var> of <var>$1userid</var> gebruikt worden.",
        "apihelp-unblock-param-userid": "Te deblokkeren gebruikers-ID. Kan niet in combinatie met <var>$1id</var> of <var>$1user</var> gebruikt worden.",
+       "apihelp-unblock-param-reason": "Reden voor de deblokkade.",
+       "apihelp-upload-param-watch": "De pagina volgen.",
+       "apihelp-upload-param-ignorewarnings": "Eventuele waarschuwingen negeren.",
+       "apihelp-upload-param-file": "Bestandsinhoud.",
+       "apihelp-upload-param-filesize": "Bestandsgroote van de hele upload.",
+       "apihelp-userrights-param-user": "Gebruikersnaam.",
+       "apihelp-userrights-param-userid": "Gebruikers-ID.",
+       "apihelp-userrights-param-remove": "Verwijder de gebruiker uit deze groepen.",
+       "apihelp-userrights-param-reason": "Reden voor de wijziging.",
        "apihelp-json-param-formatversion": "Uitvoeropmaak:\n;1:Achterwaarts-compatibele opmaak (booleans in XML-stijl, <samp>*</samp>-sleutels voor contentnodes, enz.).\n;2:Experimentele moderne opmaak. Details kunnen wijzigen!\n;latest:Gebruik de meest recente opmaak (op het moment <kbd>2</kbd>), kan zonder waarschuwing wijzigen.",
+       "apihelp-jsonfm-summary": "Toon de data in het JSON formaat (opgemaakt in HTML).",
+       "apihelp-none-summary": "Toon niets.",
+       "apihelp-php-summary": "Toon de data in geserialiseerde PHP.",
        "apihelp-php-param-formatversion": "Uitvoeropmaak:\n;1:Achterwaarts-compatibele opmaak (booleans in XML-stijl, <samp>*</samp>-sleutels voor contentnodes, enz.).\n;2:Experimentele moderne opmaak. Details kunnen wijzigen!\n;latest:Gebruik de meest recente opmaak (op het moment <kbd>2</kbd>), kan zonder waarschuwing wijzigen.",
+       "apihelp-phpfm-summary": "Toon de data in geserialiseerde PHP (opgemaakt in HTML).",
        "apihelp-rawfm-summary": "Gegevens, inclusief debugelementen, in JSON-formaat (nette opmaak in HTML) uitvoeren.",
+       "apihelp-xml-summary": "Toon de data in het XML formaat.",
+       "apihelp-xmlfm-summary": "Toon de data in het XML formaat (opgemaakt in HTML).",
+       "api-format-title": "MediaWiki API resultaat.",
+       "api-format-prettyprint-header-hyperlinked": "Dit is de HTML uitvoer van het $1 formaat. HTML is geschikt voor het debuggen, maar ongeschikt voor applicatiegebruik.\n\nGeef de parameter <var>format</var> mee om het uitvoerformaat te wijzigen. Geef [$3 <kbd>format=$2</kbd>] mee om de niet-HTML uitvoer van het $1 formaat te zien.\n\nBekijk de [[mw:API|volledige documentatie]], of de [[Special:ApiHelp/main|API hulp]] voor meer informatie.",
+       "api-help-title": "MediaWiki API hulp",
+       "api-help-undocumented-module": "Er is geen documentatie voor de module $1.",
+       "api-help-flag-internal": "<strong>Deze module is voor intern gebruik of nog niet stabiel.</strong> De functionaliteit kan zonder enige voorafgaande melding wijzigen.",
        "api-help-flag-readrights": "Voor deze module zijn leesrechten nodig.",
        "api-help-flag-writerights": "Voor deze module zijn schrijfrechten nodig.",
+       "api-help-source": "Bron: $1",
+       "api-help-source-unknown": "Bron: <span class=\"apihelp-unknown\">onbekend</span>",
+       "api-help-license": "Licentie: [[$1|$2]]",
+       "api-help-license-noname": "Licentie: [[$1|Zie koppeling]]",
+       "api-help-license-unknown": "Licentie: <span class=\"apihelp-unknown\">onbekend</span>",
        "api-help-parameters": "{{PLURAL:$1|Parameter|Parameters}}:",
        "api-help-param-deprecated": "Verouderd.",
+       "api-help-param-required": "Deze parameter is verplicht.",
        "api-help-datatypes-header": "Gegevenstypen",
+       "api-help-param-type-limit": "Type: geheel getal of <kbd>max</kbd>",
+       "api-help-param-type-integer": "Type: {{PLURAL:$1|1=geheel getal|2=lijst met gehele getallen}}",
+       "api-help-param-type-user": "Type: {{PLURAL:$1|1=gebruikersnaam|2=lijst met gebruikersnamen}}",
+       "api-help-param-list": "{{PLURAL:$1|1=Een van de volgende waarden|2=Waarden (gescheiden met <kbd>{{!}}</kbd> of [[Special:ApiHelp/main#main/datatypes|alternatief]])}}: $2",
+       "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Moet leeg zijn|Moet leeg of $2 zijn}}",
+       "api-help-param-limit": "Niet meer dan $1 toegestaan.",
+       "api-help-param-limit2": "Niet meer dan $1 ($2 voor bots) toegestaan.",
+       "api-help-param-integer-min": "De {{PLURAL:$1|1=waarde|2=waardes}} mogen niet minder dan $2 zijn.",
+       "api-help-param-integer-max": "De {{PLURAL:$1|1=waarde|2=waardes}} mogen niet meer dan $3 zijn.",
+       "api-help-param-integer-minmax": "De {{PLURAL:$1|1=waarde|2=waardes}} moeten zich tussen $2 en $3 bevinden.",
+       "api-help-param-multi-max": "Het maximaal aantal waarden is {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} voor bots).",
+       "api-help-param-multi-max-simple": "Het maximaal aantal waarden is {{PLURAL:$1|$1}}.",
+       "api-help-param-multi-all": "Gebruik <kbd>$1</kbd> om alle waarden op te geven.",
        "api-help-param-default": "Standaard: $1",
+       "api-help-param-maxbytes": "Mag niet langer zijn dan $1 {{PLURAL:$1|byte|bytes}}.",
+       "api-help-param-maxchars": "Mag niet langer zijn dan $1 {{PLURAL:$1|teken|tekens}}.",
        "api-help-examples": "{{PLURAL:$1|Voorbeeld|Voorbeelden}}:",
+       "api-help-open-in-apisandbox": "<small>[open in de zandbak]</small>",
        "apierror-autoblocked": "Uw IP-adres is automatisch geblokkeerd, omdat het gebruikt werd door een geblokkeerde gebruiker.",
+       "apierror-badmd5": "De opgegeven MD5 hash is onjuist.",
+       "apierror-badmodule-badsubmodule": "De module <kbd>$1</kbd> heeft geen deelmodule \"$2\".",
        "apierror-badmodule-nosubmodules": "De module <kbd>$1</kbd> heeft geen submodules.",
+       "apierror-badparameter": "Ongeldige waarde voor parameter <var>$1</var>.",
        "apierror-blockedfrommail": "Het versturen van e-mail is voor u geblokkeerd.",
        "apierror-blocked": "Het bewerken is voor u geblokkeerd.",
+       "apierror-cannotviewtitle": "U hebt geen toestemming om $1 te bekijken.",
+       "apierror-cantblock": "U hebt geen rechten om gebruikers te blokkeren.",
+       "apierror-cantchangecontentmodel": "U hebt geen rechten om het inhoudsmodel van een pagina te wijzigen.",
+       "apierror-canthide": "U hebt geen rechten om gebruikersnamen van het blokkeerlogboek te verbergen.",
+       "apierror-cantimport-upload": "U hebt geen rechten om geuploade pagina's te importeren.",
+       "apierror-cantimport": "U hebt geen rechten om pagina's te importeren.",
        "apierror-filedoesnotexist": "Bestand bestaat niet.",
+       "apierror-filetypecannotberotated": "Dit bestandstype kan niet geroteerd worden.",
+       "apierror-import-unknownerror": "Onbekende fout trad op tijdens het importeren: $1.",
        "apierror-integeroutofrange-belowminimum": "<var>$1</var> mag niet minder zijn dan $2 (ingesteld op $3).",
        "apierror-invalidcategory": "De opgegeven categorienaam is niet geldig.",
+       "apierror-invalidtitle": "Ongeldige titel \"$1\".",
        "apierror-invaliduser": "Ongeldige gebruikersnaam \"$1\".",
+       "apierror-invaliduserid": "Gebruikers-ID <var>$1</var> is ongeldig.",
+       "apierror-maxbytes": "Parameter <var>$1</var> mag niet langer dan $2 {{PLURAL:$2|byte|bytes}} zijn",
+       "apierror-maxchars": "Parameter <var>$1</var> mag niet langer dan $2 {{PLURAL:$2|teken|tekens}} zijn",
        "apierror-maxlag-generic": "Wachten op een databaseserver: $1 {{PLURAL:$1|seconde|seconden}} vertraging.",
        "apierror-maxlag": "Wachten op $2: $1 {{PLURAL:$1|seconde|seconden}} vertraging.",
+       "apierror-missingparam-one-of": "{{PLURAL:$2|De parameter|Een van de parameters}} $1 is verplicht.",
+       "apierror-missingparam": "De parameter <var>$1</var> moet opgegeven zijn.",
+       "apierror-missingtitle-createonly": "Ontbrekende titels kunnen alleen beveiligd worden met <kbd>create</kbd>.",
        "apierror-missingtitle": "De opgegeven pagina bestaat niet.",
        "apierror-missingtitle-byname": "De pagina $1 bestaat niet.",
+       "apierror-moduledisabled": "De module <kbd>$1</kbd> is uitgeschakeld.",
+       "apierror-multival-only-one-of": "{{PLURAL:$3|Alleen|Alleen een uit}} $2 is toegestaan voor de parameter <var>$1</var>.",
        "apierror-mustbeloggedin-generic": "U moet ingelogd zijn.",
+       "apierror-mustbeloggedin": "U moet ingelogd zijn om $1.",
+       "apierror-noedit": "U hebt geen rechten om pagina's te bewerken.",
+       "apierror-noimageredirect-anon": "Anonieme gebruikers kunnen geen afbeeldingdoorverwijzingen aanmaken.",
+       "apierror-noimageredirect": "U hebt geen rechten om afbeeldingdoorverwijzingen aan te maken.",
+       "apierror-nosuchlogid": "Er is geen logboekregel met de ID $1.",
+       "apierror-nosuchpageid": "Er is geen pagina met de ID $1.",
+       "apierror-nosuchrcid": "Er is geen recente wijziging met de ID $1.",
+       "apierror-nosuchrevid": "Er is geen versie met de ID $1.",
+       "apierror-nosuchsection": "Er is geen kopje $1.",
+       "apierror-nosuchsection-what": "Er is geen kopje $1 in $2.",
        "apierror-nosuchuserid": "Er is geen gebruiker met ID $1.",
+       "apierror-notarget": "U hebt geen geldig doel opgegeven voor deze handeling.",
+       "apierror-notpatrollable": "De versie r$1 kan niet gemarkeerd worden omdat deze te oud is.",
+       "apierror-opensearch-json-warnings": "Waarschuwingen kunnen niet worden getoond in het OpenSearch JSON formaat.",
+       "apierror-pagelang-disabled": "Het wijzigen van de taal van een pagina is niet toegestaan op deze pagina.",
+       "apierror-paramempty": "De parameter <var>$1</var> mag niet leeg zijn.",
+       "apierror-pastexpiry": "Vervaldatum  \"$1\" is in het verleden.",
        "apierror-permissiondenied": "U hebt geen toestemming om $1.",
        "apierror-permissiondenied-generic": "Toegang geweigerd.",
+       "apierror-protect-invalidaction": "Ongeldig beveiligingstype \"$1\".",
+       "apierror-readapidenied": "U hebt leesrechten nodig om deze module te kunnen gebruiken.",
        "apierror-readonly": "De wiki is momenteel in alleen-lezen modus.",
+       "apierror-searchdisabled": "<var>$1</var> zoeken is uitgeschakeld.",
+       "apierror-sectionsnotsupported": "Kopjes worden niet ondersteund door inhoudsmodel $1.",
+       "apierror-sectionsnotsupported-what": "Kopjes worden niet ondersteund door $1.",
+       "apierror-stashwrongowner": "Onjuiste eigenaar: $1",
        "apierror-systemblocked": "U bent automatisch geblokkeerd door MediaWiki.",
        "apierror-timeout": "De server heeft niet binnen de verwachte tijd geantwoord.",
        "apierror-unknownerror-nocode": "Onbekende fout.",
        "apierror-unknownerror": "Onbekende fout: \"$1\".",
        "apierror-unrecognizedparams": "Niet-herkende {{PLURAL:$2|parameter|parameters}}: $1.",
+       "apiwarn-compare-nocontentmodel": "Het inhoudsmodel kon niet worden bepaald. $1 wordt aangenomen.",
        "apiwarn-invalidcategory": "\"$1\" is geen categorie.",
        "apiwarn-invalidtitle": "\"$1\" is geen geldige titel.",
+       "apiwarn-invalidxmlstylesheetext": "Stijlblad moet de bestandsextensie <code>.xsl</code> hebben.",
+       "apiwarn-invalidxmlstylesheet": "Ongeldig of niet-bestaand stijlblad opgegeven.",
+       "apiwarn-invalidxmlstylesheetns": "Het stijlblad moet zich in de {{ns:MediaWiki}} naamruimte bevinden.",
        "apiwarn-notfile": "\"$1\" is geen bestand.",
+       "apiwarn-parse-nocontentmodel": "Er is geen <var>title</var> of <var>contentmodel</var> opgegeven, $1 wordt aangenomen.",
+       "apiwarn-unrecognizedvalues": "Onbekende {{PLURAL:$3|waarde|waardes}} voor parameter <var>$1</var>: $2.",
        "apiwarn-validationfailed-badpref": "geen geldige voorkeur.",
        "api-feed-error-title": "Fout ($1)",
        "api-usage-docref": "Zie $1 voor API-gebruik.",
+       "api-exception-trace": "$1 in $2($3)\n$4",
        "api-credits-header": "Vermeldingen",
        "api-credits": "API-ontwikkelaars:\n* Yuri Astrakhan (oorspronkelijke ontwikkelaar, hoofdontwikkelaar september 2006 – september 2007)\n* Roan Kattouw (hoofdontwikkelaar september 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Brad Jorsch (hoofdontwikkelaar 2013–heden)\n\nStuur uw opmerkingen, suggesties en vragen naar mediawiki-api@lists.wikimedia.org\nof maak een bugrapport aan op https://phabricator.wikimedia.org/."
 }
index c177d2e..439f811 100644 (file)
        "apihelp-query+filearchive-paramvalue-prop-archivename": "Adiciona o nome do arquivo da versão arquivada para as versões não-mais recentes.",
        "apihelp-query+filearchive-example-simple": "Mostrar uma lista de todos os arquivos excluídos.",
        "apihelp-query+filerepoinfo-summary": "Retorna informações meta sobre repositórios de imagens configurados na wiki.",
-       "apihelp-query+filerepoinfo-param-prop": "Quais propriedades do repositório obter (pode haver mais disponível em algumas wikis):\n;apiurl: URL para a API do repositório - útil para obter informações de imagem do host.\n;name: A chave do repositório - usado em por exemplo, <var>[[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> e [[Special:ApiHelp/query+imageinfo|imageinfo]] valores de retorno.\n;displayname: O legível para humanos do repositório wiki.\n;rooturl: URL raiz para caminhos de imagem.\n; local: Se esse repositório é o local ou não.",
+       "apihelp-query+filerepoinfo-param-prop": "As propriedades do repositório que devem ser obtidas (as propriedades disponíveis podem variar noutras wikis).",
+       "apihelp-query+filerepoinfo-paramvalue-prop-apiurl": "URL para a API do repositório - útil para obter informação sobre imagens, do repositório.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-articlepath": "<var>[[mw:Special:MyLanguage/Manual:$wgArticlePath|$wgArticlePath]]</var> da wiki do repositório ou equivalente.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-canUpload": "Indica se podem ser carregados ficheiros neste repositório, por exemplo, via CORS e autenticação partilhada.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-displayname": "O nome legível da wiki do repositório.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-favicon": "O URL da favicon da wiki do repositório, de <var>[[mw:Special:MyLanguage/Manual:$wgFavicon|$wgFavicon]]</var>.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-fetchDescription": "Indica se as páginas de descrição de ficheiro devem ser obtidas deste repositório ao ver as páginas de descrição de ficheiros locais.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-initialCapital": "Indica se os nomes de arquivos começam implicitamente com letra maiúscula.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-local": "Indica se o repositório em questão é o local ou não.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-name": "A chave do repositório - usada, por exemplo, nos valores devolvidos em <var>[[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> e [[Special:ApiHelp/query+imageinfo|imageinfo]].",
+       "apihelp-query+filerepoinfo-paramvalue-prop-rootUrl": "Caminho do URL de raiz para os caminhos de imagens.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-scriptDirUrl": "Caminho do URL de raiz para a instalação MediaWiki da wiki do repositório.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-server": "<var>[[mw:Special:MyLanguage/Manual:$wgServer|$wgServer]]</var> da wiki do repositório ou equivalente.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-thumbUrl": "Caminho do URL de raiz para os caminhos das miniaturas.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-url": "Caminho do URL da zona pública.",
        "apihelp-query+filerepoinfo-example-simple": "Obter informações sobre repositórios de arquivos.",
        "apihelp-query+fileusage-summary": "Encontre todas as páginas que usam os arquivos dados.",
        "apihelp-query+fileusage-param-prop": "Quais propriedades obter:",
index 3240c66..ca43981 100644 (file)
        "apihelp-query+filearchive-paramvalue-prop-archivename": "Adiciona o nome de ficheiro da versão arquivada das versões anteriores à última.",
        "apihelp-query+filearchive-example-simple": "Mostrar uma lista de todos os ficheiros eliminados.",
        "apihelp-query+filerepoinfo-summary": "Devolver meta informação sobre os repositórios de imagens configurados na wiki.",
-       "apihelp-query+filerepoinfo-param-prop": "As propriedades do repositório que devem ser obtidas (em algumas wikis poderão haver mais disponíveis):\n;apiurl:URL para a API do repositório - útil para obter informação de imagens do servidor.\n;name:A chave para o repositório - usada, por exemplo, em <var>[[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> e nos valores de retorno de [[Special:ApiHelp/query+imageinfo|imageinfo]].\n;displayname:O nome legível da wiki repositório.\n;rooturl:URL de raiz para endereços de imagens.\n;local:Se o repositório é o local ou não.",
+       "apihelp-query+filerepoinfo-param-prop": "As propriedades do repositório que devem ser obtidas (as propriedades disponíveis podem variar noutras wikis).",
+       "apihelp-query+filerepoinfo-paramvalue-prop-apiurl": "URL para a API do repositório - útil para obter informação sobre imagens, do repositório.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-articlepath": "<var>[[mw:Special:MyLanguage/Manual:$wgArticlePath|$wgArticlePath]]</var> da wiki do repositório ou equivalente.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-canUpload": "Indica se podem ser carregados ficheiros neste repositório, por exemplo, via CORS e autenticação partilhada.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-displayname": "O nome legível da wiki do repositório.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-favicon": "O URL da favicon da wiki do repositório, de <var>[[mw:Special:MyLanguage/Manual:$wgFavicon|$wgFavicon]]</var>.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-fetchDescription": "Indica se as páginas de descrição de ficheiro devem ser obtidas deste repositório ao ver as páginas de descrição de ficheiros locais.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-initialCapital": "Indica se os nomes de ficheiros começam implicitamente com letra maiúscula.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-local": "Indica se o repositório em questão é o local ou não.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-name": "A chave do repositório - usada, por exemplo, nos valores devolvidos em <var>[[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> e [[Special:ApiHelp/query+imageinfo|imageinfo]].",
+       "apihelp-query+filerepoinfo-paramvalue-prop-rootUrl": "Caminho do URL de raiz para os caminhos de imagens.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-scriptDirUrl": "Caminho do URL de raiz para a instalação MediaWiki da wiki do repositório.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-server": "<var>[[mw:Special:MyLanguage/Manual:$wgServer|$wgServer]]</var> da wiki do repositório ou equivalente.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-thumbUrl": "Caminho do URL de raiz para os caminhos das miniaturas.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-url": "Caminho do URL da zona pública.",
        "apihelp-query+filerepoinfo-example-simple": "Obter informações sobre os repositórios de ficheiros.",
        "apihelp-query+fileusage-summary": "Encontrar todas as páginas que usam os ficheiros indicados.",
        "apihelp-query+fileusage-param-prop": "As propriedades a serem obtidas:",
index 1680bb8..2b4a587 100644 (file)
        "apihelp-query+filearchive-example-simple": "{{doc-apihelp-example|query+filearchive}}",
        "apihelp-query+filerepoinfo-summary": "{{doc-apihelp-summary|query+filerepoinfo}}",
        "apihelp-query+filerepoinfo-param-prop": "{{doc-apihelp-param|query+filerepoinfo|prop}}",
+       "apihelp-query+filerepoinfo-paramvalue-prop-apiurl": "{{doc-apihelp-paramvalue|query+filerepoinfo|prop|apiurl}}",
+       "apihelp-query+filerepoinfo-paramvalue-prop-articlepath": "{{doc-apihelp-paramvalue|query+filerepoinfo|prop|articlepath}}",
+       "apihelp-query+filerepoinfo-paramvalue-prop-canUpload": "{{doc-apihelp-paramvalue|query+filerepoinfo|prop|canUpload}}",
+       "apihelp-query+filerepoinfo-paramvalue-prop-displayname": "{{doc-apihelp-paramvalue|query+filerepoinfo|prop|displayname}}",
+       "apihelp-query+filerepoinfo-paramvalue-prop-favicon": "{{doc-apihelp-paramvalue|query+filerepoinfo|prop|favicon}}",
+       "apihelp-query+filerepoinfo-paramvalue-prop-fetchDescription": "{{doc-apihelp-paramvalue|query+filerepoinfo|prop|fetchDescription}}",
+       "apihelp-query+filerepoinfo-paramvalue-prop-initialCapital": "{{doc-apihelp-paramvalue|query+filerepoinfo|prop|initialCapital}}",
+       "apihelp-query+filerepoinfo-paramvalue-prop-local": "{{doc-apihelp-paramvalue|query+filerepoinfo|prop|local}}",
+       "apihelp-query+filerepoinfo-paramvalue-prop-name": "{{doc-apihelp-paramvalue|query+filerepoinfo|prop|name}}",
+       "apihelp-query+filerepoinfo-paramvalue-prop-rootUrl": "{{doc-apihelp-paramvalue|query+filerepoinfo|prop|rootUrl}}",
+       "apihelp-query+filerepoinfo-paramvalue-prop-scriptDirUrl": "{{doc-apihelp-paramvalue|query+filerepoinfo|prop|scriptDirUrl}}",
+       "apihelp-query+filerepoinfo-paramvalue-prop-server": "{{doc-apihelp-paramvalue|query+filerepoinfo|prop|server}}",
+       "apihelp-query+filerepoinfo-paramvalue-prop-thumbUrl": "{{doc-apihelp-paramvalue|query+filerepoinfo|prop|thumbUrl}}",
+       "apihelp-query+filerepoinfo-paramvalue-prop-url": "{{doc-apihelp-paramvalue|query+filerepoinfo|prop|url}}",
        "apihelp-query+filerepoinfo-example-simple": "{{doc-apihelp-example|query+filerepoinfo}}",
        "apihelp-query+fileusage-summary": "{{doc-apihelp-summary|query+fileusage}}",
        "apihelp-query+fileusage-param-prop": "{{doc-apihelp-param|query+fileusage|prop|paramvalues=1}}",
index 818f717..1cc7c5c 100644 (file)
        "apihelp-query+filearchive-paramvalue-prop-archivename": "添加用于非最新版本的存档版本的文件名。",
        "apihelp-query+filearchive-example-simple": "显示已删除文件列表。",
        "apihelp-query+filerepoinfo-summary": "返回有关wiki配置的图片存储库的元信息。",
-       "apihelp-query+filerepoinfo-param-prop": "要获取的存储库属性(这在一些wiki上可能有更多可用选项):\n;apiurl:链接至API的URL - 对从主机获取图片信息有用。\n;name:存储库关键词 - 用于例如<var>[[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var>,并且[[Special:ApiHelp/query+imageinfo|imageinfo]]会返回值。\n;displayname:人类可读的存储库wiki名称。\n;rooturl:图片路径的根URL。\n;local:存储库是否在本地。",
+       "apihelp-query+filerepoinfo-param-prop": "要获取的存储库属性(可用属性在其他wiki上可能不同)。",
+       "apihelp-query+filerepoinfo-paramvalue-prop-apiurl": "至存储库API的URL - 对从主机获取图片信息有用。",
+       "apihelp-query+filerepoinfo-paramvalue-prop-articlepath": "存储库wiki的<var>[[mw:Special:MyLanguage/Manual:$wgArticlePath|$wgArticlePath]]</var>或等价物。",
+       "apihelp-query+filerepoinfo-paramvalue-prop-canUpload": "文件是否可以上传至此存储库,例如通过CORS和共享身份验证。",
+       "apihelp-query+filerepoinfo-paramvalue-prop-displayname": "人类可读的存储库wiki名称。",
+       "apihelp-query+filerepoinfo-paramvalue-prop-favicon": "存储库wiki的网站图标URL,来自<var>[[mw:Special:MyLanguage/Manual:$wgFavicon|$wgFavicon]]</var>。",
+       "apihelp-query+filerepoinfo-paramvalue-prop-fetchDescription": "当查看本地文件说明页面时,文件描述页面是否检索自此存储库。",
+       "apihelp-query+filerepoinfo-paramvalue-prop-initialCapital": "文件名是否隐式地以大写字母开头。",
+       "apihelp-query+filerepoinfo-paramvalue-prop-local": "存储库是否为本地的。",
+       "apihelp-query+filerepoinfo-paramvalue-prop-name": "存储库的关键词 - 用于例如<var>[[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var>和[[Special:ApiHelp/query+imageinfo|imageinfo]]返回的值。",
+       "apihelp-query+filerepoinfo-paramvalue-prop-rootUrl": "用于图片路径的根URL路径。",
+       "apihelp-query+filerepoinfo-paramvalue-prop-scriptDirUrl": "用于存储库wiki的MediaWiki安装副本的根URL路径。",
+       "apihelp-query+filerepoinfo-paramvalue-prop-server": "存储库wiki的<var>[[mw:Special:MyLanguage/Manual:$wgServer|$wgServer]]</var>或等价物。",
+       "apihelp-query+filerepoinfo-paramvalue-prop-thumbUrl": "用于缩略图路径的根URL路径。",
+       "apihelp-query+filerepoinfo-paramvalue-prop-url": "公开区域URL路径。",
        "apihelp-query+filerepoinfo-example-simple": "获得有关文件存储库的信息。",
        "apihelp-query+fileusage-summary": "查找所有使用指定文件的页面。",
        "apihelp-query+fileusage-param-prop": "要获取的属性:",
index b6213c1..0854a43 100644 (file)
@@ -32,7 +32,8 @@ use Wikimedia\Rdbms\Database;
 define( 'MSG_CACHE_VERSION', 2 );
 
 /**
- * Message cache
+ * Cache of messages that are defined by MediaWiki namespace pages or by hooks
+ *
  * Performs various MediaWiki namespace-related functions
  * @ingroup Cache
  */
@@ -980,14 +981,15 @@ class MessageCache {
                        }
                        // Fall through and try invididual message cache below
                } else {
-                       // XXX: This is not cached in process cache, should it?
                        $message = false;
                        Hooks::run( 'MessagesPreLoad', [ $title, &$message, $code ] );
                        if ( $message !== false ) {
-                               return $message;
+                               $this->mCache[$code][$title] = ' ' . $message;
+                       } else {
+                               $this->mCache[$code][$title] = '!NONEXISTENT';
                        }
 
-                       return false;
+                       return $message;
                }
 
                // Individual message cache key
index 602c0ac..38700b8 100644 (file)
@@ -47,6 +47,13 @@ class LCStoreStaticArray implements LCStore {
        }
 
        public function startWrite( $code ) {
+               if ( !file_exists( $this->directory ) ) {
+                       if ( !wfMkdirParents( $this->directory, null, __METHOD__ ) ) {
+                               throw new MWException( "Unable to create the localisation store " .
+                                       "directory \"{$this->directory}\"" );
+                       }
+               }
+
                $this->currentLang = $code;
                $this->fname = $this->directory . '/' . $code . '.l10n.php';
                $this->data[$code] = [];
index d7e9052..703acd6 100644 (file)
@@ -152,7 +152,7 @@ class ChangesList extends ContextSource {
         * @param string $nothing To use for empty space
         * @return string
         */
-       public function recentChangesFlags( $flags, $nothing = '&#160;' ) {
+       public function recentChangesFlags( $flags, $nothing = "\u{00A0}" ) {
                $f = '';
                foreach ( array_keys( $this->getConfig()->get( 'RecentChangesFlags' ) ) as $flag ) {
                        $f .= isset( $flags[$flag] ) && $flags[$flag]
index bad5c5a..81eccbc 100644 (file)
@@ -715,10 +715,10 @@ class EnhancedChangesList extends ChangesList {
                }
 
                if ( isset( $data['timestampLink'] ) ) {
-                       $line .= '&#160;' . $data['timestampLink'];
+                       $line .= "\u{00A0}" . $data['timestampLink'];
                        unset( $data['timestampLink'] );
                }
-               $line .= '&#160;</td>';
+               $line .= "\u{00A0}</td>";
                $line .= Html::openElement( 'td', [
                        'class' => 'mw-changeslist-line-inner',
                        // Used for reliable determination of the affiliated page
index bd9cedc..97f124b 100644 (file)
@@ -21,9 +21,7 @@
  * @ingroup Change tagging
  */
 
-use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\NameTableStore;
 use Wikimedia\Rdbms\Database;
 
 class ChangeTags {
@@ -348,21 +346,7 @@ class ChangeTags {
                if ( count( $tagsToAdd ) ) {
                        $changeTagMapping = [];
                        if ( $wgChangeTagsSchemaMigrationStage > MIGRATION_OLD ) {
-                               $changeTagDefStore = new NameTableStore(
-                                       MediaWikiServices::getInstance()->getDBLoadBalancer(),
-                                       MediaWikiServices::getInstance()->getMainWANObjectCache(),
-                                       LoggerFactory::getInstance( 'NameTableSqlStore' ),
-                                       'change_tag_def',
-                                       'ctd_id',
-                                       'ctd_name',
-                                       null,
-                                       false,
-                                       function ( $insertFields ) {
-                                               $insertFields['ctd_user_defined'] = 0;
-                                               $insertFields['ctd_count'] = 0;
-                                               return $insertFields;
-                                       }
-                               );
+                               $changeTagDefStore = MediaWikiServices::getInstance()->getChangeTagDefStore();
 
                                foreach ( $tagsToAdd as $tag ) {
                                        $changeTagMapping[$tag] = $changeTagDefStore->acquireId( $tag );
index 3cfac8f..3b54494 100644 (file)
@@ -1069,7 +1069,7 @@ abstract class ContentHandler {
         * @param Revision $undo The revision to undo
         * @param Revision $undoafter Must be an earlier revision than $undo
         *
-        * @return mixed String on success, false on failure
+        * @return mixed Content on success, false on failure
         */
        public function getUndoContent( Revision $current, Revision $undo, Revision $undoafter ) {
                $cur_content = $current->getContent();
index 25ba36a..ff07fe7 100644 (file)
@@ -312,7 +312,7 @@ class DifferenceEngine extends ContextSource {
                                        $rollbackLink = Linker::generateRollback( $this->mNewRev, $this->getContext() );
                                        if ( $rollbackLink ) {
                                                $out->preventClickjacking();
-                                               $rollback = '&#160;&#160;&#160;' . $rollbackLink;
+                                               $rollback = "\u{00A0}\u{00A0}\u{00A0}" . $rollbackLink;
                                        }
                                }
 
@@ -342,7 +342,7 @@ class DifferenceEngine extends ContextSource {
                                        [ 'diff' => 'prev', 'oldid' => $this->mOldid ] + $query
                                );
                        } else {
-                               $prevlink = '&#160;';
+                               $prevlink = "\u{00A0}";
                        }
 
                        if ( $this->mOldRev->isMinor() ) {
@@ -395,7 +395,7 @@ class DifferenceEngine extends ContextSource {
                                [ 'diff' => 'next', 'oldid' => $this->mNewid ] + $query
                        );
                } else {
-                       $nextlink = '&#160;';
+                       $nextlink = "\u{00A0}";
                }
 
                if ( $this->mNewRev->isMinor() ) {
@@ -586,7 +586,7 @@ class DifferenceEngine extends ContextSource {
        protected function revisionDeleteLink( $rev ) {
                $link = Linker::getRevDeleteLink( $this->getUser(), $rev, $rev->getTitle() );
                if ( $link !== '' ) {
-                       $link = '&#160;&#160;&#160;' . $link . ' ';
+                       $link = "\u{00A0}\u{00A0}\u{00A0}" . $link . ' ';
                }
 
                return $link;
index 67f9a79..845c2bc 100644 (file)
@@ -43,9 +43,9 @@ class TableDiffFormatter extends DiffFormatter {
         * @return mixed
         */
        public static function escapeWhiteSpace( $msg ) {
-               $msg = preg_replace( '/^ /m', '&#160; ', $msg );
-               $msg = preg_replace( '/ $/m', ' &#160;', $msg );
-               $msg = preg_replace( '/  /', '&#160; ', $msg );
+               $msg = preg_replace( '/^ /m', "\u{00A0} ", $msg );
+               $msg = preg_replace( '/ $/m', " \u{00A0}", $msg );
+               $msg = preg_replace( '/  /', "\u{00A0} ", $msg );
 
                return $msg;
        }
@@ -123,7 +123,7 @@ class TableDiffFormatter extends DiffFormatter {
         * @return string
         */
        protected function contextLine( $line ) {
-               return $this->wrapLine( '&#160;', 'diff-context', $line );
+               return $this->wrapLine( "\u{00A0}", 'diff-context', $line );
        }
 
        /**
@@ -146,7 +146,7 @@ class TableDiffFormatter extends DiffFormatter {
         * @return string
         */
        protected function emptyLine() {
-               return '<td colspan="2">&#160;</td>';
+               return "<td colspan=\"2\">\u{00A0}</td>";
        }
 
        /**
index 88631ed..aefcfb7 100644 (file)
@@ -66,7 +66,7 @@ class WordAccumulator {
                        array_push( $this->lines, $this->line );
                } else {
                        # make empty lines visible by inserting an NBSP
-                       array_push( $this->lines, '&#160;' );
+                       array_push( $this->lines, "\u{00A0}" );
                }
                $this->line = '';
        }
index dc8dfd0..88b28df 100644 (file)
@@ -47,13 +47,15 @@ class MWExceptionRenderer {
                        self::printError( self::getText( $e ) );
                } elseif ( $mode === self::AS_PRETTY ) {
                        self::statusHeader( 500 );
+                       self::header( "Content-Type: $wgMimeType; charset=utf-8" );
                        if ( $e instanceof DBConnectionError ) {
                                self::reportOutageHTML( $e );
                        } else {
-                               self::header( "Content-Type: $wgMimeType; charset=utf-8" );
                                self::reportHTML( $e );
                        }
                } else {
+                       self::statusHeader( 500 );
+                       self::header( "Content-Type: $wgMimeType; charset=utf-8" );
                        if ( $eNew ) {
                                $message = "MediaWiki internal error.\n\n";
                                if ( self::showBackTrace( $e ) ) {
@@ -292,7 +294,7 @@ class MWExceptionRenderer {
         * @param Exception|Throwable $e
         */
        private static function reportOutageHTML( $e ) {
-               global $wgShowDBErrorBacktrace, $wgShowHostnames, $wgShowSQLErrors;
+               global $wgShowDBErrorBacktrace, $wgShowHostnames, $wgShowSQLErrors, $wgSitename;
 
                $sorry = htmlspecialchars( self::msg(
                        'dberr-problems',
@@ -317,8 +319,13 @@ class MWExceptionRenderer {
                }
 
                MessageCache::singleton()->disable(); // no DB access
-
-               $html = "<h1>$sorry</h1><p>$again</p><p><small>$info</small></p>";
+               $html = "<!DOCTYPE html>\n" .
+                               '<html><head>' .
+                               '<title>' .
+                               htmlspecialchars( $wgSitename ) .
+                               '</title>' .
+                               '<style>body { font-family: sans-serif; margin: 0; padding: 0.5em 2em; }</style>' .
+                               "</head><body><h1>$sorry</h1><p>$again</p><p><small>$info</small></p>";
 
                if ( $wgShowDBErrorBacktrace ) {
                        $html .= '<p>Backtrace:</p><pre>' .
@@ -327,7 +334,7 @@ class MWExceptionRenderer {
 
                $html .= '<hr />';
                $html .= self::googleSearchForm();
-
+               $html .= '</body></html>';
                echo $html;
        }
 
index e72faa0..e4f1743 100644 (file)
@@ -1662,7 +1662,7 @@ class HTMLForm extends ContextSource {
                                        $html[] = $retval;
 
                                        $labelValue = trim( $value->getLabel() );
-                                       if ( $labelValue !== '&#160;' && $labelValue !== '' ) {
+                                       if ( $labelValue !== "\u{00A0}" && $labelValue !== '' ) {
                                                $hasLabel = true;
                                        }
 
index a701575..31c7260 100644 (file)
@@ -397,9 +397,9 @@ abstract class HTMLFormField {
                if ( isset( $params['label-message'] ) ) {
                        $this->mLabel = $this->getMessage( $params['label-message'] )->parse();
                } elseif ( isset( $params['label'] ) ) {
-                       if ( $params['label'] === '&#160;' ) {
+                       if ( $params['label'] === '&#160;' || $params['label'] === "\u{00A0}" ) {
                                // Apparently some things set &nbsp directly and in an odd format
-                               $this->mLabel = '&#160;';
+                               $this->mLabel = "\u{00A0}";
                        } else {
                                $this->mLabel = htmlspecialchars( $params['label'] );
                        }
@@ -546,7 +546,7 @@ abstract class HTMLFormField {
                $horizontalLabel = $this->mParams['horizontal-label'] ?? false;
 
                if ( $horizontalLabel ) {
-                       $field = '&#160;' . $inputHtml . "\n$errors";
+                       $field = "\u{00A0}" . $inputHtml . "\n$errors";
                } else {
                        $field = Html::rawElement(
                                'div',
@@ -630,7 +630,7 @@ abstract class HTMLFormField {
 
                // the element could specify, that the label doesn't need to be added
                $label = $this->getLabel();
-               if ( $label && $label !== '&#160;' ) {
+               if ( $label && $label !== "\u{00A0}" ) {
                        $config['label'] = new OOUI\HtmlSnippet( $label );
                }
 
@@ -745,7 +745,7 @@ abstract class HTMLFormField {
                $label = $this->getLabelHtml( $cellAttributes );
 
                $html = "\n" . $errors .
-                       $label . '&#160;' .
+                       $label . "\u{00A0}" .
                        $inputHtml .
                        $helptext;
 
@@ -926,7 +926,13 @@ abstract class HTMLFormField {
         * @return string HTML
         */
        public function getLabel() {
-               return is_null( $this->mLabel ) ? '' : $this->mLabel;
+               if ( is_null( $this->mLabel ) ) {
+                       return '';
+               }
+               if ( $this->mLabel === '&#160;' ) {
+                       return "\u{00A0}";
+               }
+               return $this->mLabel;
        }
 
        public function getLabelHtml( $cellAttributes = [] ) {
@@ -940,7 +946,7 @@ abstract class HTMLFormField {
 
                $labelValue = trim( $this->getLabel() );
                $hasLabel = false;
-               if ( $labelValue !== '&#160;' && $labelValue !== '' ) {
+               if ( $labelValue !== "\u{00A0}" && $labelValue !== '' ) {
                        $hasLabel = true;
                }
 
index a19bd5a..7f7f718 100644 (file)
@@ -46,9 +46,9 @@ class HTMLButtonField extends HTMLFormField {
                if ( isset( $info['buttonlabel-message'] ) ) {
                        $this->buttonLabel = $this->getMessage( $info['buttonlabel-message'] )->parse();
                } elseif ( isset( $info['buttonlabel'] ) ) {
-                       if ( $info['buttonlabel'] === '&#160;' ) {
+                       if ( $info['buttonlabel'] === '&#160;' || $info['buttonlabel'] === "\u{00A0}" ) {
                                // Apparently some things set &nbsp directly and in an odd format
-                               $this->buttonLabel = '&#160;';
+                               $this->buttonLabel = "\u{00A0}";
                        } else {
                                $this->buttonLabel = htmlspecialchars( $info['buttonlabel'] );
                        }
index 9a956fb..7523b5f 100644 (file)
@@ -27,7 +27,7 @@ class HTMLCheckField extends HTMLFormField {
                }
 
                $chkLabel = Xml::check( $this->mName, $value, $attr ) .
-                       '&#160;' .
+                       "\u{00A0}" .
                        Html::rawElement( 'label', $attrLabel, $this->mLabel );
 
                if ( $wgUseMediaWikiUIEverywhere || $this->mParent instanceof VFormHTMLForm ) {
@@ -88,7 +88,7 @@ class HTMLCheckField extends HTMLFormField {
                ) {
                        return '';
                } else {
-                       return '&#160;';
+                       return "\u{00A0}";
                }
        }
 
index d885c9d..da68a62 100644 (file)
@@ -88,7 +88,7 @@ class HTMLCheckMatrix extends HTMLFormField implements HTMLNestedFilterable {
                $attribs = $this->getAttributes( [ 'disabled', 'tabindex' ] );
 
                // Build the column headers
-               $headerContents = Html::rawElement( 'td', [], '&#160;' );
+               $headerContents = Html::rawElement( 'td', [], "\u{00A0}" );
                foreach ( $columns as $columnLabel => $columnTag ) {
                        $headerContents .= Html::rawElement( 'td', [], $columnLabel );
                }
index 6beb996..dec162f 100644 (file)
@@ -296,7 +296,7 @@ class HTMLFormFieldCloner extends HTMLFormField {
                                $html .= $field->$getFieldHtmlMethod( $v );
 
                                $labelValue = trim( $field->getLabel() );
-                               if ( $labelValue != '&#160;' && $labelValue !== '' ) {
+                               if ( $labelValue != "\u{00A0}" && $labelValue !== '' ) {
                                        $hasLabel = true;
                                }
                        }
index b2290ce..716a092 100644 (file)
@@ -70,6 +70,6 @@ class HTMLFormFieldWithButton extends HTMLFormField {
         * @return String
         */
        public function getElement( $element ) {
-               return $element . '&#160;' . $this->getInputHTML( '' );
+               return $element . "\u{00A0}" . $this->getInputHTML( '' );
        }
 }
index e8a7e99..4b1bc55 100644 (file)
@@ -105,7 +105,7 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
                        $elementFunc = [ Html::class, $this->mOptionsLabelsNotFromMessage ? 'rawElement' : 'element' ];
                        $checkbox =
                                Xml::check( "{$this->mName}[]", $checked, $attribs ) .
-                               '&#160;' .
+                               "\u{00A0}" .
                                call_user_func( $elementFunc,
                                        'label',
                                        [ 'for' => $attribs['id'] ],
index f3bcc0e..41c2c10 100644 (file)
@@ -92,7 +92,7 @@ class HTMLRadioField extends HTMLFormField {
                                        $classes[] = 'mw-ui-radio';
                                }
                                $radio = Xml::radio( $this->mName, $info, $info === $value, $attribs + [ 'id' => $id ] );
-                               $radio .= '&#160;' . call_user_func( $elementFunc, 'label', [ 'for' => $id ], $label );
+                               $radio .= "\u{00A0}" . call_user_func( $elementFunc, 'label', [ 'for' => $id ], $label );
 
                                $html .= ' ' . Html::rawElement(
                                        'div',
index bd96d3c..d1f628c 100644 (file)
@@ -27,7 +27,7 @@ class HTMLSizeFilterField extends HTMLIntField {
                        $value >= 0,
                        $attribs
                );
-               $html .= '&#160;' . Xml::radioLabel(
+               $html .= "\u{00A0}" . Xml::radioLabel(
                        $this->msg( 'maximum-size' )->text(),
                        $this->mName . '-mode',
                        'max',
@@ -35,8 +35,8 @@ class HTMLSizeFilterField extends HTMLIntField {
                        $value < 0,
                        $attribs
                );
-               $html .= '&#160;' . parent::getInputHTML( $value ? abs( $value ) : '' );
-               $html .= '&#160;' . $this->msg( 'pagesize' )->parse();
+               $html .= "\u{00A0}" . parent::getInputHTML( $value ? abs( $value ) : '' );
+               $html .= "\u{00A0}" . $this->msg( 'pagesize' )->parse();
 
                return $html;
        }
index 018754b..4142e6f 100644 (file)
@@ -529,7 +529,7 @@ class WebInstaller extends Installer {
        public function getAcceptLanguage() {
                global $wgLanguageCode, $wgRequest;
 
-               $mwLanguages = Language::fetchLanguageNames();
+               $mwLanguages = Language::fetchLanguageNames( null, 'mwfile' );
                $headerLanguages = array_keys( $wgRequest->getAcceptLang() );
 
                foreach ( $headerLanguages as $lang ) {
@@ -758,7 +758,7 @@ class WebInstaller extends Installer {
         */
        public function label( $msg, $forId, $contents, $helpData = "" ) {
                if ( strval( $msg ) == '' ) {
-                       $labelText = '&#160;';
+                       $labelText = '\u{00A0}';
                } else {
                        $labelText = wfMessage( $msg )->escaped();
                }
@@ -1047,7 +1047,7 @@ class WebInstaller extends Installer {
 
                        $items[$value] =
                                Xml::radio( $params['controlName'], $value, $checked, $itemAttribs ) .
-                               '&#160;' .
+                               '\u{00A0}' .
                                Xml::tags( 'label', [ 'for' => $id ], $this->parse(
                                        isset( $params['itemLabels'] ) ?
                                                wfMessage( $params['itemLabels'][$value] )->plain() :
index 846be6c..85d1a2d 100644 (file)
@@ -30,7 +30,7 @@ class WebInstallerLanguage extends WebInstallerPage {
                $userLang = $r->getVal( 'uselang' );
                $contLang = $r->getVal( 'ContLang' );
 
-               $languages = Language::fetchLanguageNames();
+               $languages = Language::fetchLanguageNames( null, 'mwfile' );
                $lifetime = intval( ini_get( 'session.gc_maxlifetime' ) );
                if ( !$lifetime ) {
                        $lifetime = 1440; // PHP default
@@ -98,20 +98,13 @@ class WebInstallerLanguage extends WebInstallerPage {
         * @return string
         */
        public function getLanguageSelector( $name, $label, $selectedCode, $helpHtml = '' ) {
-               global $wgExtraLanguageCodes;
-
                $output = $helpHtml;
 
                $select = new XmlSelect( $name, $name, $selectedCode );
                $select->setAttribute( 'tabindex', $this->parent->nextTabIndex() );
 
-               $unwantedLanguageCodes = $wgExtraLanguageCodes +
-                       LanguageCode::getDeprecatedCodeMapping();
-               $languages = Language::fetchLanguageNames();
+               $languages = Language::fetchLanguageNames( null, 'mwfile' );
                foreach ( $languages as $code => $lang ) {
-                       if ( isset( $unwantedLanguageCodes[$code] ) ) {
-                               continue;
-                       }
                        $select->addOption( "$code - $lang", $code );
                }
 
index d798ea1..7f0d27d 100644 (file)
@@ -412,7 +412,7 @@ class WebInstallerOptions extends WebInstallerPage {
 
                return '<p>' .
                        Html::element( 'img', [ 'src' => $this->getVar( 'wgRightsIcon' ) ] ) .
-                       '&#160;&#160;' .
+                       '\u{00A0}\u{00A0}' .
                        htmlspecialchars( $this->getVar( 'wgRightsText' ) ) .
                        "</p>\n" .
                        "<p style=\"text-align: center;\">" .
index 921844d..41ac945 100644 (file)
        "config-license-help": "Muchos wikis públicos ponen todas las contribuciones bajo una [https://freedomdefined.org/Definition licencia libre].\nEsto ayuda a crear un sentido de propiedad comunitaria y alienta la contribución a largo plazo.\nEsto no es generalmente necesario para un wiki privado o corporativo.\n\nSi deseas poder utilizar texto de Wikipedia, y deseas que Wikipedia pueda aceptar el texto copiado de tu wiki, debes elegir <strong>{{int:config-license-cc-by-sa}}</strong>.\n\nWikipedia utilizaba anteriormente la licencia de documentación libre de GNU (GFDL).\nLa GFDL es una licencia válida, pero es difícil de entender.\nTambién es difícil reutilizar el contenido licenciado bajo la GFDL.",
        "config-email-settings": "Configuración de correo electrónico",
        "config-enable-email": "Activar el envío de correos electrónicos",
-       "config-enable-email-help": "Si quieres que el correo electrónico funcione, la [https://secure.php.net/manual/en/mail.configuration.php configuración PHP de correo electrónico] debe ser configurada correctamente.\nSi no quieres ninguna funcionalidad del correo electrónico, puedes desactivarla aquí.",
+       "config-enable-email-help": "Si quieres que el correo electrónico funcione, la [https://secure.php.net/manual/en/mail.configuration.php configuración PHP de correo electrónico] debe ser la correcta.\nSi no quieres ninguna funcionalidad de correo electrónico, puedes desactivarlas aquí.",
        "config-email-user": "Activar correo electrónico entre usuarios",
        "config-email-user-help": "Permitir que todos los usuarios intercambien correos electrónicos si lo han activado en sus preferencias.",
        "config-email-usertalk": "Activar notificaciones de páginas de discusión de usuarios",
index bc860d9..990b3bc 100644 (file)
        "config-support-info": "מדיה־ויקי תומכת במערכות מסדי הנתונים הבאות:\n\n$1\n\nאם אינך רואה את מסד הנתונים שלך ברשימה, יש לעקוב אחר ההוראות המקושרות לעיל כדי להפעיל את התמיכה.",
        "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] הוא היעד העיקרי עבור מדיה־ויקי ולו התמיכה הטובה ביותר. מדיה־ויקי עובדת גם עם [{{int:version-db-mariadb-url}} MariaDB] ועם [{{int:version-db-percona-url}} Percona Server], שתואמים ל־MySQL. (ר׳ [https://secure.php.net/manual/en/mysql.installation.php how to compile PHP with MySQL support])",
        "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] הוא מסד נתונים נפוץ בקוד פתוח והוא נפוץ בתור חלופה ל־MySQL. (ר׳ [https://secure.php.net/manual/en/pgsql.installation.php how to compile PHP with PostgreSQL support]).",
-       "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] הוא מסד נתונים קליל עם תמיכה טובה מאוד. (ר׳ [http://www.php.net/manual/en/pdo.installation.php How to compile PHP with SQLite support], משתמש ב־PDO)",
-       "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] הוא מסד נתונים עסקי מסחרי. (ר׳ [http://www.php.net/manual/en/oci8.installation.php How to compile PHP with OCI8 support])",
+       "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] הוא מסד נתונים קליל עם תמיכה טובה מאוד. (ר׳ [https://secure.php.net/manual/en/pdo.installation.php How to compile PHP with SQLite support], משתמש ב־PDO)",
+       "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] הוא מסד נתונים עסקי מסחרי. (ר׳ [https://secure.php.net/manual/en/oci8.installation.php How to compile PHP with OCI8 support])",
        "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] הוא מסד נתונים עסקי מסחרי לחלונות. ([https://secure.php.net/manual/en/sqlsrv.installation.php How to compile PHP with SQLSRV support])",
        "config-header-mysql": "הגדרות MySQL",
        "config-header-postgres": "הגדרות PostgreSQL",
        "config-license-help": "אתרי ויקי ציבוריים רבים מפרסמים את כל התרומות [https://freedomdefined.org/Definition ברישיון חופשי].\nזה עוזר ליצור תחושה של בעלות קהילתית ומעודד תרומה לאורך זמן.\nזה בדרך כלל לא נחוץ לאתר ויקי פרטי או אתר של חברה מסחרית.\n\nאם האפשרות להשתמש בטקסט מוויקיפדיה והאפשרות שוויקיפדיה תוכל תקבל עותקים של טקסטים מהוויקי שלך חשובות לך, כדאי לבחור ב<strong>{{int:config-license-cc-by-sa}}</strong>.\n\nויקיפדיה השתמשה בעבר ברישיון החופשי למסמכים של גנו (GNU FDL או GFDL).\nהוא עדיין רישיון תקין, אבל קשה להבנה.\nכמו־כן, קשה לעשות שימוש חוזר ביצירות שפורסמו לפי GFDL.",
        "config-email-settings": "הגדרות דוא״ל",
        "config-enable-email": "להפעיל דוא״ל יוצא",
-       "config-enable-email-help": "אם אתם רוצים שדוא״ל יעבוד, [Config-dbsupport-oracle/manual/en/mail.configuration.php אפשרויות הדוא״ל של PHP] צריכות להיות מוגדרות נכון.\nאם אינכם רוצים להפעיל שום אפשרויות דוא״ל, כבו אותן כאן ועכשיו.",
+       "config-enable-email-help": "אם אתם רוצים שדוא״ל יעבוד, [https://secure.php.net/manual/en/mail.configuration.php אפשרויות הדוא״ל של PHP] צריכות להיות מוגדרות נכון.\nאם אינכם רוצים להפעיל שום אפשרויות דוא״ל, כבו אותן כאן ועכשיו.",
        "config-email-user": "להפעיל שליחת דוא״ל ממשתמש למשתמש",
        "config-email-user-help": "לאפשר לכל המשתמשים לשלוח אחד לשני דוא״ל אם הם הפעילו את זה בהעדפות שלהם.",
        "config-email-usertalk": "להפעיל הודעות על דף שיחת משתמש",
index 6011a8b..2a1d1b1 100644 (file)
        "config-support-info": "MediaWiki ondersteunt de volgende databasesystemen:\n\n$1\n\nAls u het databasesysteem dat u wilt gebruiken niet in de lijst terugvindt, volg dan de handleiding waarnaar hierboven wordt verwezen om ondersteuning toe te voegen.",
        "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] is de primaire database voor MediaWiki en wordt het best ondersteund. MediaWiki werkt ook met [{{int:version-db-mariadb-url}} MariaDB] en [{{int:version-db-percona-url}} Percona Server], die MySQL compatibel zijn ([https://secure.php.net/manual/en/mysqli.installation.php hoe PHP te compileren met MySQL-ondersteuning]).",
        "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] is een populair open source databasesysteem als alternatief voor MySQL.([https://secure.php.net/manual/en/pgsql.installation.php Hoe u PHP kunt compileren met ondersteuning voor PostgreSQL])",
-       "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] is een zeer goed ondersteund lichtgewicht databasesysteem ([http://www.php.net/manual/en/pdo.installation.php hoe PHP gecompileerd moet zijn met ondersteuning voor SQLite]; gebruikt PDO).",
-       "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] is een commerciële database voor grote bedrijven ([http://www.php.net/manual/en/oci8.installation.php PHP compileren met ondersteuning voor OCI8]).",
+       "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] is een zeer goed ondersteund lichtgewicht databasesysteem ([https://secure.php.net/manual/en/pdo.installation.php hoe PHP gecompileerd moet zijn met ondersteuning voor SQLite]; gebruikt PDO).",
+       "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] is een commerciële database voor grote bedrijven ([https://secure.php.net/manual/en/oci8.installation.php PHP compileren met ondersteuning voor OCI8]).",
        "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] is een commerciële enterprisedatabase voor Windows ([https://secure.php.net/manual/en/sqlsrv.installation.php PHP compileren met ondersteuning voor SQLSRV]).",
        "config-header-mysql": "MySQL-instellingen",
        "config-header-postgres": "PostgreSQL-instellingen",
        "config-license-help": "In veel openbare wiki's zijn alle bijdragen beschikbaar onder een [https://freedomdefined.org/Definition vrije licentie].\nDit helpt bij het creëren van een gevoel van gemeenschappelijk eigendom en stimuleert bijdragen op lange termijn.\nDit is over het algemeen niet nodig is voor een particuliere of zakelijke wiki.\n\nAls u teksten uit Wikipedia wilt kunnen gebruiken en u wilt het mogelijk maken teksten uit uw wiki naar Wikipedia te kopiëren, kies dan de licentie <strong>{{int:config-license-cc-by-sa}}</strong>.\n\nDe GNU Free Documentation License is de oude licentie voor inhoud uit Wikipedia.\nDit is nog steeds een geldige licentie, maar deze licentie is lastig te begrijpen.\nHet is ook lastig inhoud te hergebruiken onder de GFDL.",
        "config-email-settings": "E-mailinstellingen",
        "config-enable-email": "Uitgaande e-mail inschakelen",
-       "config-enable-email-help": "Als u wilt dat e-mailen mogelijk is, dan moeten de [Config-dbsupport-oracle/manual/en/mail.configuration.php e-mailinstellingen van PHP] correct zijn.\nAls u niet wilt dat e-mailen mogelijk is, dan kunt u de instellingen hier uitschakelen.",
+       "config-enable-email-help": "Als u wilt dat e-mailen mogelijk is, dan moeten de [https://secure.php.net/manual/en/mail.configuration.php e-mailinstellingen van PHP] correct zijn.\nAls u niet wilt dat e-mailen mogelijk is, dan kunt u de instellingen hier uitschakelen.",
        "config-email-user": "E-mail tussen gebruikers inschakelen",
        "config-email-user-help": "Gebruikers toestaan e-mail aan elkaar te verzenden als dit in de voorkeuren is ingesteld.",
        "config-email-usertalk": "Gebruikersoverlegmeldingen inschakelen",
        "config-cache-options": "Instellingen voor het cachen van objecten:",
        "config-cache-help": "Het cachen van objecten wordt gebruikt om de snelheid van MediaWiki te verbeteren door vaak gebruikte gegevens te bewaren.\nMiddelgrote tot grote websites wordt geadviseerd dit in te schakelen en ook kleine sites merken de voordelen.",
        "config-cache-none": "Niets cachen.\nEr gaat geen functionaliteit verloren, maar dit kan invloed hebben op de prestaties.",
-       "config-cache-accel": "Cachen van objecten via PHP (APC, APCu, XCache of WinCache)",
+       "config-cache-accel": "Cachen van objecten via PHP (APC, APCu of WinCache)",
        "config-cache-memcached": "Memcached gebruiken (dit vereist aanvullende instellingen)",
        "config-memcached-servers": "Memcachedservers:",
        "config-memcached-help": "Lijst met IP-adressen te gebruiken voor Memcached.\nEén IP-adres per regel met een poortnummer.\nBijvoorbeeld:\n 127.0.0.1:11211\n 192.168.1.25:1234",
        "config-nofile": "Het bestand \"$1\" is niet gevonden. Is het verwijderd?",
        "config-extension-link": "Weet u dat u [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions uitbreidingen] kunt gebruiken voor uw wiki?\n\nU kunt [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category uitbreidingen op categorie] bekijken of ga naar de [https://www.mediawiki.org/wiki/Extension_Matrix uitbreidingenmatrix] om de volledige lijst met uitbreidingen te bekijken.",
        "config-skins-screenshots": "$1 (schermafbeeldingen: $2)",
+       "config-extensions-requires": "$1 (vereist $2)",
        "config-screenshot": "schermafbeelding",
        "mainpagetext": "<strong>De installatie van MediaWiki is geslaagd.</strong>",
        "mainpagedocfooter": "Raadpleeg de [https://meta.wikimedia.org/wiki/Special:MyLanguage/Help:Contents handleiding] voor informatie over het gebruik van de wikisoftware.\n\n== Meer hulp over MediaWiki ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lijst met instellingen]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Veelgestelde vragen (FAQ)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglijst voor aankondigingen van nieuwe versies]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Maak MediaWiki beschikbaar in uw taal]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Leer hoe u spam kunt voorkomen op uw wiki]"
index fa4ad6d..0957d8b 100644 (file)
@@ -8,7 +8,8 @@
                        "Сербијана",
                        "Zoranzoki21",
                        "Acamicamacaraca",
-                       "Obsuser"
+                       "Obsuser",
+                       "BadDog"
                ]
        },
        "config-desc": "Инсталација за Медијавики",
@@ -32,7 +33,7 @@
        "config-page-upgrade": "Надоградња постојеће инсталације",
        "config-page-dbsettings": "Подешавања базе података",
        "config-page-name": "Назив",
-       "config-page-options": "Ð\9fодеÑ\88аваÑ\9aа",
+       "config-page-options": "Ð\9eпÑ\86иÑ\98е",
        "config-page-install": "Инсталирај",
        "config-page-complete": "Завршено!",
        "config-page-restart": "Поновно покретање инсталације",
index e58d98f..8175427 100644 (file)
@@ -54,13 +54,14 @@ class Xhprof {
                        throw new Exception( 'Profiling is already enabled.' );
                }
                self::$enabled = true;
-               if ( function_exists( 'xhprof_enable' ) ) {
-                       xhprof_enable( $flags, $options );
-               } elseif ( function_exists( 'tideways_enable' ) ) {
-                       tideways_enable( $flags, $options );
-               } else {
-                       throw new Exception( "Neither xhprof nor tideways are installed" );
-               }
+               self::callAny(
+                       [
+                               'xhprof_enable',
+                               'tideways_enable',
+                               'tideways_xhprof_enable'
+                       ],
+                       [ $flags, $options ]
+               );
        }
 
        /**
@@ -71,12 +72,27 @@ class Xhprof {
        public static function disable() {
                if ( self::isEnabled() ) {
                        self::$enabled = false;
-                       if ( function_exists( 'xhprof_disable' ) ) {
-                               return xhprof_disable();
-                       } else {
-                               // tideways
-                               return tideways_disable();
+                       return self::callAny( [
+                               'xhprof_disable',
+                               'tideways_disable',
+                               'tideways_xhprof_disable'
+                       ] );
+               }
+       }
+
+       /**
+        * Call the first available function from $functions.
+        * @param array $functions
+        * @param array $args
+        * @throws Exception
+        */
+       protected static function callAny( array $functions, array $args = [] ) {
+               foreach ( $functions as $func ) {
+                       if ( function_exists( $func ) ) {
+                               return $func( ...$args );
                        }
                }
+
+               throw new Exception( "Neither xhprof nor tideways are installed" );
        }
 }
index 927a1e3..0913322 100644 (file)
@@ -1223,7 +1223,8 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                                }
                                // Use the busy fallback value if nothing else
                                if ( $busyValue !== null ) {
-                                       $this->stats->increment( "wanobjectcache.$kClass.miss.busy" );
+                                       $miss = is_infinite( $minTime ) ? 'renew' : 'miss';
+                                       $this->stats->increment( "wanobjectcache.$kClass.$miss.busy" );
 
                                        return is_callable( $busyValue ) ? $busyValue() : $busyValue;
                                }
@@ -1268,7 +1269,8 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                        $this->cache->changeTTL( self::MUTEX_KEY_PREFIX . $key, (int)$preCallbackTime - 60 );
                }
 
-               $this->stats->increment( "wanobjectcache.$kClass.miss.compute" );
+               $miss = is_infinite( $minTime ) ? 'renew' : 'miss';
+               $this->stats->increment( "wanobjectcache.$kClass.$miss.compute" );
 
                return $value;
        }
index 9a30383..856bd32 100644 (file)
@@ -38,23 +38,24 @@ use LogicException;
  */
 abstract class LBFactory implements ILBFactory {
        /** @var ChronologyProtector */
-       protected $chronProt;
+       private $chronProt;
        /** @var object|string Class name or object With profileIn/profileOut methods */
-       protected $profiler;
+       private $profiler;
        /** @var TransactionProfiler */
-       protected $trxProfiler;
+       private $trxProfiler;
        /** @var LoggerInterface */
-       protected $replLogger;
+       private $replLogger;
        /** @var LoggerInterface */
-       protected $connLogger;
+       private $connLogger;
        /** @var LoggerInterface */
-       protected $queryLogger;
+       private $queryLogger;
        /** @var LoggerInterface */
-       protected $perfLogger;
+       private $perfLogger;
        /** @var callable Error logger */
-       protected $errorLogger;
+       private $errorLogger;
        /** @var callable Deprecation logger */
-       protected $deprecationLogger;
+       private $deprecationLogger;
+
        /** @var BagOStuff */
        protected $srvCache;
        /** @var BagOStuff */
@@ -64,33 +65,33 @@ abstract class LBFactory implements ILBFactory {
 
        /** @var DatabaseDomain Local domain */
        protected $localDomain;
+
        /** @var string Local hostname of the app server */
-       protected $hostname;
+       private $hostname;
        /** @var array Web request information about the client */
-       protected $requestInfo;
-
-       /** @var mixed */
-       protected $ticket;
-       /** @var string|bool String if a requested DBO_TRX transaction round is active */
-       protected $trxRoundId = false;
-       /** @var string|bool Reason all LBs are read-only or false if not */
-       protected $readOnlyReason = false;
-       /** @var callable[] */
-       protected $replicationWaitCallbacks = [];
+       private $requestInfo;
+       /** @var bool Whether this PHP instance is for a CLI script */
+       private $cliMode;
+       /** @var string Agent name for query profiling */
+       private $agent;
 
        /** @var array[] $aliases Map of (table => (dbname, schema, prefix) map) */
-       protected $tableAliases = [];
+       private $tableAliases = [];
        /** @var string[] Map of (index alias => index) */
-       protected $indexAliases = [];
-
-       /** @var bool Whether this PHP instance is for a CLI script */
-       protected $cliMode;
-       /** @var string Agent name for query profiling */
-       protected $agent;
+       private $indexAliases = [];
+       /** @var callable[] */
+       private $replicationWaitCallbacks = [];
 
+       /** @var mixed */
+       private $ticket;
+       /** @var string|bool String if a requested DBO_TRX transaction round is active */
+       private $trxRoundId = false;
        /** @var string One of the ROUND_* class constants */
        private $trxRoundStage = self::ROUND_CURSORY;
 
+       /** @var string|bool Reason all LBs are read-only or false if not */
+       protected $readOnlyReason = false;
+
        /** @var string|null */
        private $defaultGroup = null;
 
index e01b24e..fe0c622 100644 (file)
@@ -38,10 +38,39 @@ use Exception;
  * @ingroup Database
  */
 class LoadBalancer implements ILoadBalancer {
-       /** @var array[] Map of (server index => server config array) */
-       private $servers;
+       /** @var ILoadMonitor */
+       private $loadMonitor;
+       /** @var callable|null Callback to run before the first connection attempt */
+       private $chronologyCallback;
+       /** @var BagOStuff */
+       private $srvCache;
+       /** @var WANObjectCache */
+       private $wanCache;
+       /** @var object|string Class name or object With profileIn/profileOut methods */
+       private $profiler;
+       /** @var TransactionProfiler */
+       private $trxProfiler;
+       /** @var LoggerInterface */
+       private $replLogger;
+       /** @var LoggerInterface */
+       private $connLogger;
+       /** @var LoggerInterface */
+       private $queryLogger;
+       /** @var LoggerInterface */
+       private $perfLogger;
+       /** @var callable Exception logger */
+       private $errorLogger;
+       /** @var callable Deprecation logger */
+       private $deprecationLogger;
+
+       /** @var DatabaseDomain Local Domain ID and default for selectDB() calls */
+       private $localDomain;
+
        /** @var Database[][][] Map of (connection category => server index => IDatabase[]) */
        private $conns;
+
+       /** @var array[] Map of (server index => server config array) */
+       private $servers;
        /** @var float[] Map of (server index => weight) */
        private $loads;
        /** @var array[] Map of (group => server index => weight) */
@@ -52,31 +81,24 @@ class LoadBalancer implements ILoadBalancer {
        private $waitTimeout;
        /** @var array The LoadMonitor configuration */
        private $loadMonitorConfig;
+       /** @var string Alternate ID string for the domain instead of DatabaseDomain::getId() */
+       private $localDomainIdAlias;
+       /** @var int */
+       private $maxLag = self::MAX_LAG_DEFAULT;
+
+       /** @var string Current server name */
+       private $hostname;
+       /** @var bool Whether this PHP instance is for a CLI script */
+       private $cliMode;
+       /** @var string Agent name for query profiling */
+       private $agent;
+
        /** @var array[] $aliases Map of (table => (dbname, schema, prefix) map) */
        private $tableAliases = [];
        /** @var string[] Map of (index alias => index) */
        private $indexAliases = [];
-
-       /** @var ILoadMonitor */
-       private $loadMonitor;
-       /** @var callable|null Callback to run before the first connection attempt */
-       private $chronologyCallback;
-       /** @var BagOStuff */
-       private $srvCache;
-       /** @var WANObjectCache */
-       private $wanCache;
-       /** @var object|string Class name or object With profileIn/profileOut methods */
-       protected $profiler;
-       /** @var TransactionProfiler */
-       protected $trxProfiler;
-       /** @var LoggerInterface */
-       protected $replLogger;
-       /** @var LoggerInterface */
-       protected $connLogger;
-       /** @var LoggerInterface */
-       protected $queryLogger;
-       /** @var LoggerInterface */
-       protected $perfLogger;
+       /** @var array[] Map of (name => callable) */
+       private $trxRecurringCallbacks = [];
 
        /** @var Database DB connection object that caused a problem */
        private $errorConnection;
@@ -94,32 +116,13 @@ class LoadBalancer implements ILoadBalancer {
        private $readOnlyReason = false;
        /** @var int Total connections opened */
        private $connsOpened = 0;
-       /** @var string|bool String if a requested DBO_TRX transaction round is active */
-       private $trxRoundId = false;
-       /** @var array[] Map of (name => callable) */
-       private $trxRecurringCallbacks = [];
-       /** @var DatabaseDomain Local Domain ID and default for selectDB() calls */
-       private $localDomain;
-       /** @var string Alternate ID string for the domain instead of DatabaseDomain::getId() */
-       private $localDomainIdAlias;
-       /** @var string Current server name */
-       private $host;
-       /** @var bool Whether this PHP instance is for a CLI script */
-       protected $cliMode;
-       /** @var string Agent name for query profiling */
-       protected $agent;
-
-       /** @var callable Exception logger */
-       private $errorLogger;
-       /** @var callable Deprecation logger */
-       private $deprecationLogger;
-
        /** @var bool */
        private $disabled = false;
        /** @var bool Whether any connection has been attempted yet */
        private $connectionAttempted = false;
-       /** @var int */
-       private $maxLag = self::MAX_LAG_DEFAULT;
+
+       /** @var string|bool String if a requested DBO_TRX transaction round is active */
+       private $trxRoundId = false;
        /** @var string Stage of the current transaction round in the transaction round life-cycle */
        private $trxRoundStage = self::ROUND_CURSORY;
 
@@ -247,7 +250,7 @@ class LoadBalancer implements ILoadBalancer {
                        $this->$key = $params[$key] ?? new NullLogger();
                }
 
-               $this->host = $params['hostname'] ?? ( gethostname() ?: 'unknown' );
+               $this->hostname = $params['hostname'] ?? ( gethostname() ?: 'unknown' );
                $this->cliMode = $params['cliMode'] ?? ( PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg' );
                $this->agent = $params['agent'] ?? '';
 
@@ -983,7 +986,7 @@ class LoadBalancer implements ILoadBalancer {
                        $oldDomain = key( $this->conns[$connFreeKey][$i] );
                        if ( strlen( $dbName ) && !$conn->selectDB( $dbName ) ) {
                                $this->lastError = "Error selecting database '$dbName' on server " .
-                                       $conn->getServer() . " from client host {$this->host}";
+                                       $conn->getServer() . " from client host {$this->hostname}";
                                $this->errorConnection = $conn;
                                $conn = false;
                        } else {
index 40498cd..911a8cc 100644 (file)
@@ -135,7 +135,7 @@ class LogEventsList extends ContextSource {
 
                // Tag filter
                if ( $tagSelector ) {
-                       $html .= Xml::tags( 'p', null, implode( '&#160;', $tagSelector ) );
+                       $html .= Xml::tags( 'p', null, implode( "\u{00A0}", $tagSelector ) );
                }
 
                // Filter links
index 1abf974..51136ff 100644 (file)
@@ -2114,11 +2114,11 @@ class Article implements Page {
         * @deprecated since 1.29. Use WikiPage::doEditContent() directly instead
         * @see WikiPage::doEditContent
         */
-       public function doEditContent( Content $content, $summary, $flags = 0, $baseRevId = false,
+       public function doEditContent( Content $content, $summary, $flags = 0, $originalRevId = false,
                User $user = null, $serialFormat = null
        ) {
                wfDeprecated( __METHOD__, '1.29' );
-               return $this->mPage->doEditContent( $content, $summary, $flags, $baseRevId,
+               return $this->mPage->doEditContent( $content, $summary, $flags, $originalRevId,
                        $user, $serialFormat
                );
        }
index 5bbdb6c..b970820 100644 (file)
@@ -202,7 +202,7 @@ class WikiPage implements Page, IDBAccessObject {
         * @param object|string|int $type
         * @return mixed
         */
-       private static function convertSelectType( $type ) {
+       protected static function convertSelectType( $type ) {
                switch ( $type ) {
                        case 'fromdb':
                                return self::READ_NORMAL;
@@ -1453,17 +1453,45 @@ class WikiPage implements Page, IDBAccessObject {
                return $ret;
        }
 
+       /**
+        * Helper method for checking whether two revisions have differences that go
+        * beyond the main slot.
+        *
+        * MCR migration note: this method should go away!
+        *
+        * @deprecated Use only as a stop-gap before refactoring to support MCR.
+        *
+        * @param Revision $a
+        * @param Revision $b
+        * @return bool
+        */
+       public static function hasDifferencesOutsideMainSlot( Revision $a, Revision $b ) {
+               $aSlots = $a->getRevisionRecord()->getSlots();
+               $bSlots = $b->getRevisionRecord()->getSlots();
+               $changedRoles = $aSlots->getRolesWithDifferentContent( $bSlots );
+
+               return ( $changedRoles !== [ 'main' ] );
+       }
+
        /**
         * Get the content that needs to be saved in order to undo all revisions
         * between $undo and $undoafter. Revisions must belong to the same page,
         * must exist and must not be deleted
+        *
         * @param Revision $undo
         * @param Revision $undoafter Must be an earlier revision than $undo
         * @return Content|bool Content on success, false on failure
         * @since 1.21
         * Before we had the Content object, this was done in getUndoText
         */
-       public function getUndoContent( Revision $undo, Revision $undoafter = null ) {
+       public function getUndoContent( Revision $undo, Revision $undoafter ) {
+               // TODO: MCR: replace this with a method that returns a RevisionSlotsUpdate
+
+               if ( self::hasDifferencesOutsideMainSlot( $undo, $undoafter ) ) {
+                       // Cannot yet undo edits that involve anything other the main slot.
+                       return false;
+               }
+
                $handler = $undo->getContentHandler();
                return $handler->getUndoContent( $this->getRevision(), $undo, $undoafter );
        }
@@ -1742,9 +1770,10 @@ class WikiPage implements Page, IDBAccessObject {
         * error will be returned. These two conditions are also possible with
         * auto-detection due to MediaWiki's performance-optimised locking strategy.
         *
-        * @param bool|int $baseRevId The revision ID this edit was based off, if any.
-        *   This is not the parent revision ID, rather the revision ID for older
-        *   content used as the source for a rollback, for example.
+        * @param bool|int $originalRevId: The ID of an original revision that the edit
+        * restores or repeats. The new revision is expected to have the exact same content as
+        * the given original revision. This is used with rollbacks and with dummy "null" revisions
+        * which are created to record things like page moves.
         * @param User $user The user doing the edit
         * @param string $serialFormat IGNORED.
         * @param array|null $tags Change tags to apply to this edit
@@ -1771,7 +1800,7 @@ class WikiPage implements Page, IDBAccessObject {
         * @throws MWException
         */
        public function doEditContent(
-               Content $content, $summary, $flags = 0, $baseRevId = false,
+               Content $content, $summary, $flags = 0, $originalRevId = false,
                User $user = null, $serialFormat = null, $tags = [], $undidRevId = 0
        ) {
                global $wgUser, $wgUseNPPatrol, $wgUseRCPatrol;
@@ -1796,7 +1825,7 @@ class WikiPage implements Page, IDBAccessObject {
                // used by this PageUpdater. However, there is no guarantee for this.
                $updater = $this->newPageUpdater( $user );
                $updater->setContent( 'main', $content );
-               $updater->setBaseRevisionId( $baseRevId );
+               $updater->setOriginalRevisionId( $originalRevId );
                $updater->setUndidRevisionId( $undidRevId );
 
                $needsPatrol = $wgUseRCPatrol || ( $wgUseNPPatrol && !$this->exists() );
@@ -2799,7 +2828,7 @@ class WikiPage implements Page, IDBAccessObject {
         * Callers are responsible for permission checks
         * (with ChangeTags::canAddTagsAccompanyingChange)
         *
-        * @return array
+        * @return array An array of error messages, as returned by Status::getErrorsArray()
         */
        public function commitRollback( $fromP, $summary, $bot,
                &$resultDetails, User $guser, $tags = null
@@ -2812,43 +2841,44 @@ class WikiPage implements Page, IDBAccessObject {
                        return [ [ 'readonlytext' ] ];
                }
 
-               // Get the last editor
-               $current = $this->getRevision();
+               // Begin revision creation cycle by creating a PageUpdater.
+               // If the page is changed concurrently after grabParentRevision(), the rollback will fail.
+               $updater = $this->newPageUpdater( $guser );
+               $current = $updater->grabParentRevision();
+
                if ( is_null( $current ) ) {
                        // Something wrong... no page?
                        return [ [ 'notanarticle' ] ];
                }
 
+               $currentEditorForPublic = $current->getUser( RevisionRecord::FOR_PUBLIC );
+               $legacyCurrent = new Revision( $current );
                $from = str_replace( '_', ' ', $fromP );
+
                // User name given should match up with the top revision.
-               // If the user was deleted then $from should be empty.
-               if ( $from != $current->getUserText() ) {
-                       $resultDetails = [ 'current' => $current ];
+               // If the revision's user is not visible, then $from should be empty.
+               if ( $from !== ( $currentEditorForPublic ? $currentEditorForPublic->getName() : '' ) ) {
+                       $resultDetails = [ 'current' => $legacyCurrent ];
                        return [ [ 'alreadyrolled',
                                htmlspecialchars( $this->mTitle->getPrefixedText() ),
                                htmlspecialchars( $fromP ),
-                               htmlspecialchars( $current->getUserText() )
+                               htmlspecialchars( $currentEditorForPublic ? $currentEditorForPublic->getName() : '' )
                        ] ];
                }
 
                // Get the last edit not by this person...
                // Note: these may not be public values
-               $userId = intval( $current->getUser( Revision::RAW ) );
-               $userName = $current->getUserText( Revision::RAW );
-               if ( $userId ) {
-                       $user = User::newFromId( $userId );
-                       $user->setName( $userName );
-               } else {
-                       $user = User::newFromName( $current->getUserText( Revision::RAW ), false );
-               }
-
-               $actorWhere = ActorMigration::newMigration()->getWhere( $dbw, 'rev_user', $user );
+               $actorWhere = ActorMigration::newMigration()->getWhere(
+                       $dbw,
+                       'rev_user',
+                       $current->getUser( RevisionRecord::RAW )
+               );
 
                $s = $dbw->selectRow(
                        [ 'revision' ] + $actorWhere['tables'],
                        [ 'rev_id', 'rev_timestamp', 'rev_deleted' ],
                        [
-                               'rev_page' => $current->getPage(),
+                               'rev_page' => $current->getPageId(),
                                'NOT(' . $actorWhere['conds'] . ')',
                        ],
                        __METHOD__,
@@ -2861,28 +2891,36 @@ class WikiPage implements Page, IDBAccessObject {
                if ( $s === false ) {
                        // No one else ever edited this page
                        return [ [ 'cantrollback' ] ];
-               } elseif ( $s->rev_deleted & Revision::DELETED_TEXT
-                       || $s->rev_deleted & Revision::DELETED_USER
+               } elseif ( $s->rev_deleted & RevisionRecord::DELETED_TEXT
+                       || $s->rev_deleted & RevisionRecord::DELETED_USER
                ) {
                        // Only admins can see this text
                        return [ [ 'notvisiblerev' ] ];
                }
 
                // Generate the edit summary if necessary
-               $target = Revision::newFromId( $s->rev_id, Revision::READ_LATEST );
+               $target = $this->getRevisionStore()->getRevisionById(
+                       $s->rev_id,
+                       RevisionStore::READ_LATEST
+               );
                if ( empty( $summary ) ) {
-                       if ( $from == '' ) { // no public user name
+                       if ( !$currentEditorForPublic ) { // no public user name
                                $summary = wfMessage( 'revertpage-nouser' );
                        } else {
                                $summary = wfMessage( 'revertpage' );
                        }
                }
+               $legacyTarget = new Revision( $target );
+               $targetEditorForPublic = $target->getUser( RevisionRecord::FOR_PUBLIC );
 
                // Allow the custom summary to use the same args as the default message
                $args = [
-                       $target->getUserText(), $from, $s->rev_id,
+                       $targetEditorForPublic ? $targetEditorForPublic->getName() : null,
+                       $currentEditorForPublic ? $currentEditorForPublic->getName() : null,
+                       $s->rev_id,
                        $wgContLang->timeanddate( wfTimestamp( TS_MW, $s->rev_timestamp ) ),
-                       $current->getId(), $wgContLang->timeanddate( $current->getTimestamp() )
+                       $current->getId(),
+                       $wgContLang->timeanddate( $current->getTimestamp() )
                ];
                if ( $summary instanceof Message ) {
                        $summary = $summary->params( $args )->inContentLanguage()->text();
@@ -2904,22 +2942,38 @@ class WikiPage implements Page, IDBAccessObject {
                        $flags |= EDIT_FORCE_BOT;
                }
 
-               $targetContent = $target->getContent();
-               $changingContentModel = $targetContent->getModel() !== $current->getContentModel();
+               // TODO: MCR: also log model changes in other slots, in case that becomes possible!
+               $currentContent = $current->getContent( 'main' );
+               $targetContent = $target->getContent( 'main' );
+               $changingContentModel = $targetContent->getModel() !== $currentContent->getModel();
 
                if ( in_array( 'mw-rollback', ChangeTags::getSoftwareTags() ) ) {
                        $tags[] = 'mw-rollback';
                }
 
-               // Actually store the edit
-               $status = $this->doEditContent(
-                       $targetContent,
-                       $summary,
-                       $flags,
-                       $target->getId(),
-                       $guser,
-                       null,
-                       $tags
+               // Build rollback revision:
+               // Restore old content
+               // TODO: MCR: test this once we can store multiple slots
+               foreach ( $target->getSlots()->getSlots() as $slot ) {
+                       $updater->inheritSlot( $slot );
+               }
+
+               // Remove extra slots
+               // TODO: MCR: test this once we can store multiple slots
+               foreach ( $current->getSlotRoles() as $role ) {
+                       if ( !$target->hasSlot( $role ) ) {
+                               $updater->removeSlot( $role );
+                       }
+               }
+
+               $updater->setOriginalRevisionId( $target->getId() );
+               $updater->setUndidRevisionId( $current->getId() );
+               $updater->addTags( $tags );
+
+               // Actually store the rollback
+               $rev = $updater->saveRevision(
+                       CommentStoreComment::newUnsavedComment( $summary ),
+                       $flags
                );
 
                // Set patrolling and bot flag on the edits, which gets rollbacked.
@@ -2936,10 +2990,15 @@ class WikiPage implements Page, IDBAccessObject {
                }
 
                if ( count( $set ) ) {
-                       $actorWhere = ActorMigration::newMigration()->getWhere( $dbw, 'rc_user', $user, false );
+                       $actorWhere = ActorMigration::newMigration()->getWhere(
+                               $dbw,
+                               'rc_user',
+                               $current->getUser( RevisionRecord::RAW ),
+                               false
+                       );
                        $dbw->update( 'recentchanges', $set,
                                [ /* WHERE */
-                                       'rc_cur_id' => $current->getPage(),
+                                       'rc_cur_id' => $current->getPageId(),
                                        'rc_timestamp > ' . $dbw->addQuotes( $s->rev_timestamp ),
                                        $actorWhere['conds'], // No tables/joins are needed for rc_user
                                ],
@@ -2947,18 +3006,17 @@ class WikiPage implements Page, IDBAccessObject {
                        );
                }
 
-               if ( !$status->isOK() ) {
-                       return $status->getErrorsArray();
+               if ( !$updater->wasSuccessful() ) {
+                       return $updater->getStatus()->getErrorsArray();
                }
 
-               // raise error, when the edit is an edit without a new version
-               $statusRev = $status->value['revision'] ?? null;
-               if ( !( $statusRev instanceof Revision ) ) {
-                       $resultDetails = [ 'current' => $current ];
+               // Report if the edit was not created because it did not change the content.
+               if ( $updater->isUnchanged() ) {
+                       $resultDetails = [ 'current' => $legacyCurrent ];
                        return [ [ 'alreadyrolled',
                                        htmlspecialchars( $this->mTitle->getPrefixedText() ),
                                        htmlspecialchars( $fromP ),
-                                       htmlspecialchars( $current->getUserText() )
+                                       htmlspecialchars( $targetEditorForPublic ? $targetEditorForPublic->getName() : '' )
                        ] ];
                }
 
@@ -2970,7 +3028,7 @@ class WikiPage implements Page, IDBAccessObject {
                        $log->setTarget( $this->mTitle );
                        $log->setComment( $summary );
                        $log->setParameters( [
-                               '4::oldmodel' => $current->getContentModel(),
+                               '4::oldmodel' => $currentContent->getModel(),
                                '5::newmodel' => $targetContent->getModel(),
                        ] );
 
@@ -2978,18 +3036,19 @@ class WikiPage implements Page, IDBAccessObject {
                        $log->publish( $logId );
                }
 
-               $revId = $statusRev->getId();
+               $revId = $rev->getId();
 
-               Hooks::run( 'ArticleRollbackComplete', [ $this, $guser, $target, $current ] );
+               Hooks::run( 'ArticleRollbackComplete', [ $this, $guser, $legacyTarget, $legacyCurrent ] );
 
                $resultDetails = [
                        'summary' => $summary,
-                       'current' => $current,
-                       'target' => $target,
+                       'current' => $legacyCurrent,
+                       'target' => $legacyTarget,
                        'newid' => $revId,
                        'tags' => $tags
                ];
 
+               // TODO: make this return a Status object and wrap $resultDetails in that.
                return [];
        }
 
index b6d5b94..4f5cb67 100644 (file)
@@ -119,7 +119,7 @@ abstract class TablePager extends IndexPager {
                // Make table header
                foreach ( $fields as $field => $name ) {
                        if ( strval( $name ) == '' ) {
-                               $s .= Html::rawElement( 'th', [], '&#160;' ) . "\n";
+                               $s .= Html::rawElement( 'th', [], "\u{00A0}" ) . "\n";
                        } elseif ( $this->isFieldSortable( $field ) ) {
                                $query = [ 'sort' => $field, 'limit' => $this->mLimit ];
                                $linkType = null;
@@ -192,7 +192,7 @@ abstract class TablePager extends IndexPager {
                        $formatted = strval( $this->formatValue( $field, $value ) );
 
                        if ( $formatted == '' ) {
-                               $formatted = '&#160;';
+                               $formatted = "\u{00A0}";
                        }
 
                        $s .= Html::rawElement( 'td', $this->getCellAttrs( $field, $value ), $formatted ) . "\n";
index a1b3064..0270828 100644 (file)
@@ -1353,15 +1353,7 @@ class Parser {
                }
 
                # Clean up special characters, only run once, next-to-last before doBlockLevels
-               $fixtags = [
-                       # French spaces, last one Guillemet-left
-                       # only if there is something before the space
-                       '/(.) (?=\\?|:|;|!|%|\\302\\273)/' => '\\1&#160;',
-                       # french spaces, Guillemet-right
-                       '/(\\302\\253) /' => '\\1&#160;',
-                       '/&#160;(!\s*important)/' => ' \\1', # Beware of CSS magic word !important, T13874.
-               ];
-               $text = preg_replace( array_keys( $fixtags ), array_values( $fixtags ), $text );
+               $text = Sanitizer::armorFrenchSpaces( $text );
 
                $text = $this->doBlockLevels( $text, $linestart );
 
index ff543db..21498f8 100644 (file)
@@ -1141,6 +1141,27 @@ class Sanitizer {
                return $encValue;
        }
 
+       /**
+        * Armor French spaces with a replacement character
+        *
+        * @since 1.32
+        * @param string $text Text to armor
+        * @param string $space Space character for the French spaces, defaults to '&#160;'
+        * @return string Armored text
+        */
+       public static function armorFrenchSpaces( $text, $space = '&#160;' ) {
+               // Replace $ with \$ and \ with \\
+               $space = preg_replace( '#(?<!\\\\)(\\$|\\\\)#', '\\\\$1', $space );
+               $fixtags = [
+                       # French spaces, last one Guillemet-left
+                       # only if there is something before the space
+                       '/(.) (?=[?:;!%»])/u' => "\\1$space",
+                       # French spaces, Guillemet-right
+                       '/(«) /u' => "\\1$space",
+               ];
+               return preg_replace( array_keys( $fixtags ), array_values( $fixtags ), $text );
+       }
+
        /**
         * Encode an attribute value for HTML tags, with extra armoring
         * against further wiki processing.
@@ -1168,6 +1189,9 @@ class Sanitizer {
                        '__'   => '&#95;_',
                ] );
 
+               # Armor against French spaces detection (T5158)
+               $encValue = self::armorFrenchSpaces( $encValue, '&#32;' );
+
                # Stupid hack
                $encValue = preg_replace_callback(
                        '/((?i)' . wfUrlProtocols() . ')/',
index bf6ab4a..03e4bdb 100644 (file)
@@ -1022,6 +1022,12 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                        'label-message' => 'tog-hideminor',
                        'section' => 'rc/advancedrc',
                ];
+               $defaultPreferences['rcfilters-rc-collapsed'] = [
+                       'type' => 'api',
+               ];
+               $defaultPreferences['rcfilters-wl-collapsed'] = [
+                       'type' => 'api',
+               ];
                $defaultPreferences['rcfilters-saved-queries'] = [
                        'type' => 'api',
                ];
index 2f2be47..55a5a1f 100644 (file)
  * ($wgProfiler['exclude']) containing an array of function names.
  * Shell-style patterns are also accepted.
  *
- * It is also possible to use the Tideways PHP extension, which is mostly
- * a drop-in replacement for Xhprof. Just change the XHPROF_FLAGS_* constants
- * to TIDEWAYS_FLAGS_*.
+ * This also supports Tideways-XHProf PHP extension, which is mostly a drop-in
+ * replacement for Xhprof (replace XHPROF_FLAGS_* with XHPROF_TIDEWAYS_FLAGS_*),
+ * as well as the older (discontinued) Tideways extension (TIDEWAYS_FLAGS_*).
  *
  * @copyright © 2014 Wikimedia Foundation and contributors
  * @ingroup Profiler
  * @see Xhprof
  * @see https://php.net/xhprof
  * @see https://github.com/facebook/hhvm/blob/master/hphp/doc/profiling.md
- * @see https://github.com/tideways/php-profiler-extension
+ * @see https://github.com/tideways/php-xhprof-extension
  */
 class ProfilerXhprof extends Profiler {
        /**
index 0416c85..b051d40 100644 (file)
@@ -336,7 +336,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
         * @return array
         */
        public static function getStartupModules() {
-               return [ 'jquery', 'mediawiki' ];
+               return [ 'jquery', 'mediawiki', 'mediawiki.base' ];
        }
 
        public static function getLegacyModules() {
@@ -396,7 +396,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        // This url may be preloaded. See getPreloadLinks().
                        '$VARS.baseModulesUri' => self::getStartupModulesUrl( $context ),
                ] );
-               $pairs['$CODE.registrations()'] = str_replace(
+               $pairs['$CODE.registrations();'] = str_replace(
                        "\n",
                        "\n\t",
                        trim( $this->getModuleRegistrations( $context ) )
@@ -429,8 +429,8 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        // Detect changes to the module registrations
                        'moduleHashes' => $this->getAllModuleHashes( $context ),
 
-                       'fileMtimes' => [
-                               filemtime( "$IP/resources/src/startup.js" ),
+                       'fileHashes' => [
+                               $this->safeFileHash( "$IP/resources/src/startup.js" ),
                        ],
                ];
                return $summary;
index 8384ca0..51be3b6 100644 (file)
@@ -212,11 +212,6 @@ abstract class Skin extends ContextSource {
                        'syndicate' => [],
                ];
 
-               // Support for high-density display images if enabled
-               if ( $config->get( 'ResponsiveImages' ) ) {
-                       $modules['core'][] = 'mediawiki.hidpi';
-               }
-
                // Preload jquery.tablesorter for mediawiki.page.ready
                if ( strpos( $out->getHTML(), 'sortable' ) !== false ) {
                        $modules['content'][] = 'jquery.tablesorter';
index 831644e..58944b4 100644 (file)
@@ -57,6 +57,12 @@ abstract class ChangesListSpecialPage extends SpecialPage {
         */
        protected static $limitPreferenceName;
 
+       /**
+        * Preference name for collapsing the active filter display. Subclasses should override this.
+        * @var string
+        */
+       protected static $collapsedPreferenceName;
+
        /** @var string */
        protected $rcSubpage;
 
@@ -779,9 +785,13 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                        foreach ( $jsData['messageKeys'] as $key ) {
                                $messages[$key] = $this->msg( $key )->plain();
                        }
-
                        $out->addBodyClasses( 'mw-rcfilters-enabled' );
 
+                       $collapsed = $this->getUser()->getBoolOption( static::$collapsedPreferenceName );
+                       if ( $collapsed ) {
+                               $out->addBodyClasses( 'mw-rcfilters-collapsed' );
+                       }
+
                        $out->addHTML(
                                ResourceLoader::makeInlineScript(
                                        ResourceLoader::makeMessageSetScript( $messages ),
@@ -790,6 +800,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                        );
 
                        $out->addJsConfigVars( 'wgStructuredChangeFilters', $jsData['groups'] );
+                       $out->addJsConfigVars( 'wgStructuredChangeFiltersCollapsedState', $collapsed );
 
                        $out->addJsConfigVars(
                                'wgRCFiltersChangeTags',
@@ -818,6 +829,10 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                                'wgStructuredChangeFiltersDaysPreferenceName',
                                static::$daysPreferenceName
                        );
+                       $out->addJsConfigVars(
+                               'wgStructuredChangeFiltersCollapsedPreferenceName',
+                               static::$collapsedPreferenceName
+                       );
 
                        $out->addJsConfigVars(
                                'StructuredChangeFiltersLiveUpdatePollingRate',
index 6fc8306..836dfcd 100644 (file)
@@ -556,7 +556,7 @@ class SpecialContributions extends IncludableSpecialPage {
                        $filterSelection = Html::rawElement(
                                'div',
                                [],
-                               implode( '&#160;', $tagFilter )
+                               implode( "\u{00A0}", $tagFilter )
                        );
                } else {
                        $filterSelection = Html::rawElement( 'div', [], '' );
@@ -609,7 +609,7 @@ class SpecialContributions extends IncludableSpecialPage {
                                $this->msg( 'namespace' )->text(),
                                'namespace',
                                ''
-                       ) . '&#160;' .
+                       ) . "\u{00A0}" .
                        Html::namespaceSelector(
                                [ 'selected' => $this->opts['namespace'], 'all' => '' ],
                                [
@@ -617,7 +617,7 @@ class SpecialContributions extends IncludableSpecialPage {
                                        'id' => 'namespace',
                                        'class' => 'namespaceselector',
                                ]
-                       ) . '&#160;' .
+                       ) . "\u{00A0}" .
                                Html::rawElement(
                                        'span',
                                        [ 'class' => 'mw-input-with-label' ],
@@ -630,7 +630,7 @@ class SpecialContributions extends IncludableSpecialPage {
                                                        'title' => $this->msg( 'tooltip-invert' )->text(),
                                                        'class' => 'mw-input'
                                                ]
-                                       ) . '&#160;'
+                                       ) . "\u{00A0}"
                                ) .
                                Html::rawElement( 'span', [ 'class' => 'mw-input-with-label' ],
                                        Xml::checkLabel(
@@ -642,7 +642,7 @@ class SpecialContributions extends IncludableSpecialPage {
                                                        'title' => $this->msg( 'tooltip-namespace_association' )->text(),
                                                        'class' => 'mw-input'
                                                ]
-                                       ) . '&#160;'
+                                       ) . "\u{00A0}"
                                )
                );
 
index 0e93194..4a939d4 100644 (file)
@@ -332,7 +332,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                        Html::label(
                                $this->msg( 'emailusername' )->text(),
                                'emailusertarget'
-                       ) . '&#160;' .
+                       ) . "\u{00A0}" .
                        Html::input(
                                'target',
                                $name,
index f122db8..89eb410 100644 (file)
@@ -224,11 +224,11 @@ class SpecialMergeHistory extends SpecialPage {
                                        '</td>
                                        <td class="mw-input">' .
                                        Xml::input( 'wpComment', 50, $this->mComment, [ 'id' => 'wpComment' ] ) .
-                                       '</td>
+                                       "</td>
                                        </tr>
                                        <tr>
-                                               <td>&#160;</td>
-                                               <td class="mw-submit">' .
+                                               <td>\u{00A0}</td>
+                                               <td class=\"mw-submit\">" .
                                        Xml::submitButton(
                                                $this->msg( 'mergehistory-submit' )->text(),
                                                [ 'name' => 'merge', 'id' => 'mw-merge-submit' ]
index bfef5e0..2496192 100644 (file)
@@ -35,6 +35,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
        protected static $savedQueriesPreferenceName = 'rcfilters-saved-queries';
        protected static $daysPreferenceName = 'rcdays'; // Use general RecentChanges preference
        protected static $limitPreferenceName = 'rcfilters-limit'; // Use RCFilters-specific preference
+       protected static $collapsedPreferenceName = 'rcfilters-rc-collapsed';
 
        private $watchlistFilterGroupDefinition;
 
index 22c6afe..0a35178 100644 (file)
@@ -658,7 +658,7 @@ class UserrightsPage extends SpecialPage {
                        )->escaped();
 
                $grouplist = '';
-               $count = count( $list );
+               $count = count( $list ) + count( $tempList );
                if ( $count > 0 ) {
                        $grouplist = $this->msg( 'userrights-groupsmember' )
                                ->numParams( $count )
index ce7fea9..f716e92 100644 (file)
@@ -35,6 +35,7 @@ class SpecialWatchlist extends ChangesListSpecialPage {
        protected static $savedQueriesPreferenceName = 'rcfilters-wl-saved-queries';
        protected static $daysPreferenceName = 'watchlistdays';
        protected static $limitPreferenceName = 'wllimit';
+       protected static $collapsedPreferenceName = 'rcfilters-wl-collapsed';
 
        private $maxDays;
 
@@ -525,7 +526,7 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                                                                $this->msg( 'watchlist-unwatch' )->text(), [
                                                                        'class' => 'mw-unwatch-link',
                                                                        'title' => $this->msg( 'tooltip-ca-unwatch' )->text()
-                                                               ], [ 'action' => 'unwatch' ] ) . '&#160;';
+                                                               ], [ 'action' => 'unwatch' ] ) . "\u{00A0}";
                                }
                        } );
                }
index c2adf8d..1d3ffd7 100644 (file)
@@ -523,7 +523,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                        ]
                );
 
-               $f .= '&#160;' .
+               $f .= "\u{00A0}" .
                        Xml::checkLabel(
                                $this->msg( 'invert' )->text(),
                                'invert',
index 35c9931..5addd9c 100644 (file)
@@ -357,7 +357,7 @@ class AllMessagesTablePager extends TablePager {
                        $formatted = strval( $this->formatValue( 'am_actual', $row->am_actual ) );
 
                        if ( $formatted === '' ) {
-                               $formatted = '&#160;';
+                               $formatted = "\u{00A0}";
                        }
 
                        $s .= Xml::tags( 'td', $this->getCellAttrs( 'am_actual', $row->am_actual ), $formatted )
index d11838a..ce35717 100644 (file)
@@ -224,7 +224,7 @@ class LanguageConverter {
        /**
         * Get the variant specified in the URL
         *
-        * @return mixed Variant if one found, false otherwise.
+        * @return mixed Variant if one found, null otherwise
         */
        public function getURLVariant() {
                global $wgRequest;
@@ -247,7 +247,7 @@ class LanguageConverter {
        /**
         * Determine if the user has a variant set.
         *
-        * @return mixed Variant if one found, false otherwise.
+        * @return mixed Variant if one found, null otherwise
         */
        protected function getUserVariant() {
                global $wgUser, $wgContLang;
@@ -284,7 +284,7 @@ class LanguageConverter {
        /**
         * Determine the language variant from the Accept-Language header.
         *
-        * @return mixed Variant if one found, false otherwise.
+        * @return mixed Variant if one found, null otherwise
         */
        protected function getHeaderVariant() {
                global $wgRequest;
index 6d603f5..b838d06 100644 (file)
@@ -43,28 +43,28 @@ class EnConverter extends LanguageConverter {
         * @return string
         */
        function translate( $text, $toVariant ) {
-               if ( $toVariant === 'en-x-piglatin' ) {
-                       // Only process words composed of standard English alphabet, leave the rest unchanged.
-                       // This skips some English words like 'naïve' or 'résumé', but we can live with that.
-                       // Ignore single letters and words which aren't lowercase or uppercase-first.
-                       return preg_replace_callback( '/[A-Za-z][a-z\']+/', function ( $matches ) {
-                               $word = $matches[0];
-                               if ( preg_match( '/^[aeiou]/i', $word ) ) {
-                                       return $word . 'way';
-                               } else {
-                                       return preg_replace_callback( '/^(s?qu|[^aeiou][^aeiouy]*)(.*)$/i', function ( $m ) {
-                                               $ucfirst = strtoupper( $m[1][0] ) === $m[1][0];
-                                               if ( $ucfirst ) {
-                                                       return ucfirst( $m[2] ) . lcfirst( $m[1] ) . 'ay';
-                                               } else {
-                                                       return $m[2] . $m[1] . 'ay';
-                                               }
-                                       }, $word );
-                               }
-                       }, $text );
-               } else {
+               if ( $toVariant !== 'en-x-piglatin' ) {
                        return $text;
                }
+
+               // Only process words composed of standard English alphabet, leave the rest unchanged.
+               // This skips some English words like 'naïve' or 'résumé', but we can live with that.
+               // Ignore single letters and words which aren't lowercase or uppercase-first.
+               return preg_replace_callback( '/[A-Za-z][a-z\']+/', function ( $matches ) {
+                       $word = $matches[0];
+                       if ( preg_match( '/^[aeiou]/i', $word ) ) {
+                               return $word . 'way';
+                       }
+
+                       return preg_replace_callback( '/^(s?qu|[^aeiou][^aeiouy]*)(.*)$/i', function ( $m ) {
+                               $ucfirst = strtoupper( $m[1][0] ) === $m[1][0];
+                               if ( $ucfirst ) {
+                                       return ucfirst( $m[2] ) . lcfirst( $m[1] ) . 'ay';
+                               }
+
+                               return $m[2] . $m[1] . 'ay';
+                       }, $word );
+               }, $text );
        }
 }
 
@@ -75,13 +75,12 @@ class EnConverter extends LanguageConverter {
  */
 class LanguageEn extends Language {
        function __construct() {
-               global $wgUsePigLatinVariant, $wgHooks;
+               global $wgUsePigLatinVariant;
 
                parent::__construct();
 
                if ( $wgUsePigLatinVariant ) {
                        $this->mConverter = new EnConverter( $this, 'en', [ 'en', 'en-x-piglatin' ] );
-                       $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
                }
        }
 }
index 3a96283..97ff012 100644 (file)
@@ -150,6 +150,7 @@ class Names {
                'en-gb' => 'British English', # British English
                'eo' => 'Esperanto', # Esperanto
                'es' => 'español', # Spanish
+               'es-419' => 'español de América Latina', # Spanish for the Latin America and Caribbean region
                'es-formal' => "español (formal)\u{200E}", # Spanish formal address
                'et' => 'eesti', # Estonian
                'eu' => 'euskara', # Basque
index 6b67e8d..605025c 100644 (file)
        "group": "Kawan:",
        "group-user": "Ureueng-ureueng ngui",
        "group-autoconfirmed": "Ureueng ngui nyang meu-konfirmasi otomatis",
+       "group-bot": "Bot",
        "group-sysop": "Ureuëng urôh",
        "group-bureaucrat": "Birôkrat",
        "group-suppress": "Ureueng kalön",
        "action-read": "beuët laman nyoe",
        "action-edit": "andam laman nyoë",
        "action-createpage": "peugöt laman",
+       "action-createaccount": "peugöt akun ureueng ngui nyoe",
        "action-move": "Peupinah laman nyoë",
        "nchanges": "$1 {{PLURAL:$1|neuubah}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|yôh seunaweuë seuneulheuëh kön}}",
        "protect-expiry-options": "1 jeum:1 hour,1 uroë:1 day,1 minggu:1 week,2 minggu:2 weeks,1 buleuën:1 month,3 buleuën:3 months,6 buleuën:6 months,1 thôn:1 year,sabé:infinite",
        "restriction-type": "Lindông:",
        "restriction-level": "Tingkat:",
+       "restriction-edit": "Andam",
+       "restriction-move": "Pupinah",
        "undeletebtn": "Peuriwang!",
        "undeletelink": "eu/peuriwang",
        "undeleteviewlink": "eu",
        "ipboptions": "2 jeum:2 hours,1 uroë:1 day,3 uroë:3 days,1 minggu:1 week,2 minggu:2 weeks,1 buleuën:1 month,3 buleuën:3 months,6 buleuën:6 months,1 thôn:1 year,sabé:infinite",
        "ipblocklist": "Ureuëng ngui teutheun",
        "ipblocklist-submit": "Mita",
+       "infiniteblock": "hana bataih",
        "blocklink": "theun",
        "unblocklink": "peugadöh theun",
        "change-blocklink": "gantoë theun",
        "blocklogentry": "theun [[$1]] ngön watèë maté tanggay $2 $3",
        "unblocklogentry": "peugadöh theun \"$1\"",
        "block-log-flags-nocreate": "pumeugöt akun geupumaté",
+       "proxyblocker": "Ngön theun proxy",
        "movepagetext": "Formulir di yup nyoë geunguy keu jak ubah nan saboh ôn ngön jak peupinah ban dum data riwayat u nan barô. Nan nyang trép euntreuk jeuët keu ôn peupinah u nan nyang barô. Hubông u nan trép hana meu’ubah. Neupeupaseuti keu neupréksa peuninah ôn nyang reulöh atawa meuganda lheuëh neupinah. Droëneuh nyang mat tanggông jaweuëb keu neupeupaseuti meunyo hubông laju teusambông u ôn nyang patôt.\n\nBeu neuingat that meunyo ôn '''h’an''' jan geupeupinah meunyo ka na ôn nyang geunguy nan barô, keucuali meunyo ôn nyan soh atawa nakeuh ôn peuninah ngön hana riwayat andam. Nyoë areutijih Droëneuh jeuët neu’ubah nan ôn keulayi lagèë söt meunyo Droëneuh neupeugöt seunalah, ngön Droëneuh h‘an jeuët neutimpa ôn nyang ka na.\n'''INGAT'''\nNyoë jeuët geupeuakébat neu’ubah nyang h’an neuduga ngön kreuëh ngön bacah keu ôn nyang meuceuhu. Neupeupaseuti Droëneuh meuphôm akébat nibak buët nyoë sigohlom neulanjut.",
        "movepagetalktext": "Ôn peugah haba nyang na hubôngan euntreuk teupinah keudroë '''keucuali meunyo:'''\n\n*Saboh ôn peugah haba nyang hana soh ka na di yup nan barô, atawa\n*Droëneuh hana neubôh tanda cunténg bak kutak di yup nyoë\n\nLam masalah nyoë, meunyo neuhawa, Droëneuh jeuët neupeupinah atawa neupeugabông ôn keudroë.",
        "newtitle": "Nan barô:",
        "pageinfo-language": "Bahsa asoe mieng",
        "pageinfo-content-model": "Modèl asoe mieng",
        "pageinfo-robot-policy": "Geuindèks lé robot",
+       "pageinfo-robot-index": "Geupeuidin",
+       "pageinfo-robot-noindex": "Hana geupeuidin",
        "pageinfo-watchers": "Jumeulah ureueng kalön mieng",
        "pageinfo-redirects-name": "Jumeulah peuninah u mieng nyoe",
+       "pageinfo-firstuser": "Ureueng peugot mieng",
+       "pageinfo-firsttime": "Uroe buleuen pumeugot mieng",
+       "pageinfo-edits": "Jumeulah neuandam ban dum",
+       "pageinfo-recent-edits": "Jumeulah neuandam ban-ban nyoe (lam $1 nyoe)",
        "pageinfo-toolboxlink": "Keutrangan miëng",
+       "pageinfo-contentpage-yes": "Nyo",
+       "patrol-log-page": "Log patroli",
        "previousdiff": "← Bida awai",
        "nextdiff": "Geunantoë lheuëh nyan →",
        "file-info-size": "$1 × $2 piksel, rayek beureukaih: $3, MIME jeunèh: $4",
        "confirm-unwatch-button": "Ka göt",
        "confirm-unwatch-top": "Sampôh laman nyoë nibak dapeuta keunalön droëneuh?",
        "imgmultipageprev": "← laman sigohlomjih",
+       "imgmultipagenext": "mieng lheueh nyoe →",
        "imgmultigo": "Jak!",
        "imgmultigoto": "Jak u mieng $1",
        "autosumm-new": "Geupeugöt laman ngön asoë '$1'",
        "tag-filter": "Saréng [[Special:Tags|tag]]:",
        "tag-filter-submit": "Saréng",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag}}]]: $2)",
+       "tags-active-yes": "Nyo",
+       "tags-active-no": "H`an",
+       "tags-hitcount": "$1 {{PLURAL:$1|neuubah}}",
        "logentry-delete-delete": "$1 {{GENDER:$2|geusampôh}} miëng $3",
        "logentry-move-move": "$1 {{GENDER:$2|geupinah}} mieng $3 u $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|geupinah}} mieng $3 u $4 hana geubôh peuninah",
index 8f9b163..0344828 100644 (file)
        "rcfilters-activefilters": "المرشحات النشطة",
        "rcfilters-activefilters-hide": "إخفاء",
        "rcfilters-activefilters-show": "عرض",
+       "rcfilters-activefilters-hide-tooltip": "إخفاء منطقة المرشحات النشطة",
+       "rcfilters-activefilters-show-tooltip": "إظهار منطقة المرشحات النشطة",
        "rcfilters-advancedfilters": "مرشحات متقدمة",
        "rcfilters-limit-title": "النتائج للعرض",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|تغيير|تغييرات}}، $2",
index cd3f350..7158a62 100644 (file)
@@ -21,7 +21,9 @@
                        "Dibya Dutta",
                        "Matma Rex",
                        "চাণক্য কুমাৰ দাস",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "Sagsag",
+                       "Bodhisattwa"
                ]
        },
        "tog-underline": "সংযোগসমূহ অধোৰেখিত কৰক:",
        "rcfilters-quickfilters-placeholder-title": "এতিয়ালৈকে কোনো ছেকনী সাঁচি থোৱা নাই",
        "rcfilters-quickfilters-placeholder-description": "আপোনাৰ ছেকনীৰ ছেটিংছ সাঁচি থ'বলৈ আৰু পাছত সেয়া ব্যৱহাৰ কৰিবলৈ তলত থকা সক্ৰিয় পৰিস্ৰাৱক ক্ষেত্ৰৰ বুক্‌মাৰ্ক চিহ্নটো ক্লিক কৰক।",
        "rcfilters-savedqueries-defaultlabel": "সঞ্চিত পৰিস্ৰাৱক",
+       "rcfilters-savedqueries-remove": "মচি পেলাওক",
        "rcfilters-show-new-changes": "নতুন সালসলনিবোৰ চাওক",
        "rcfilters-search-placeholder": "পৰিৱৰ্তনসমূহ ছেকক (ছেকনীৰ নামৰ বাবে মেন্যু বা সন্ধান ব্যৱহাৰ কৰক)",
        "rcfilters-highlightbutton-title": "ফলাফলসমূহ উজ্জ্বল কৰক",
        "special-characters-group-hebrew": "হিব্ৰু",
        "special-characters-group-bangla": "বাংলা",
        "special-characters-group-tamil": "তামিল",
-       "special-characters-group-telugu": "তà§\87লà§\87গু",
+       "special-characters-group-telugu": "তà§\87লà§\81গু",
        "special-characters-group-sinhala": "সিংহলী",
        "special-characters-group-gujarati": "গুজৰাটী",
        "special-characters-group-devanagari": "দেবনাগৰী",
index e4eeccc..c71494a 100644 (file)
@@ -19,7 +19,8 @@
                        "George Animal",
                        "Lokal Profil",
                        "Joe Watzmo",
-                       "WhatamIdoing"
+                       "WhatamIdoing",
+                       "Alexx"
                ]
        },
        "tog-underline": "Links unterstreichen:",
        "and": "&#32;und",
        "faq": "Oft gstejte Frong",
        "actions": "Aktiona",
-       "namespaces": "Namasramm",
+       "namespaces": "Namasram",
        "variants": "Variantn",
+       "navigation-heading": "Navigationsmenü",
        "errorpagetitle": "Fehla",
        "returnto": "Zruck za da Seitn $1.",
        "tagline": "Aus {{SITENAME}}",
        "permalink": "Permanenta Link",
        "print": "Drucken",
        "view": "Leesen",
-       "edit": "Werkln",
+       "view-foreign": "Af $1 ooschaung",
+       "edit": "Weakln",
        "create": "Aufbaun",
        "delete": "Leschn",
        "undelete_short": "{{PLURAL:$1|1 Version|$1 Versiona}} wiedaheastäin",
        "personaltools": "Mei Weakzeig",
        "talk": "Dischkrian",
        "views": "Osichtn",
-       "toolbox": "Werkzeigkisten",
+       "toolbox": "Weakzeig",
        "imagepage": "Daateiseiten åzoang",
        "mediawikipage": "Inhoitsseiten åzoang",
        "templatepage": "Vurlongseiten åzoang",
        "pool-errorunknown": "Unbekånnter Feeler",
        "aboutsite": "Iba {{SITENAME}}",
        "aboutpage": "Project:Iba",
-       "copyright": "Da Inhoid is unter da $1 vafiagbor.",
+       "copyright": "Den Inhoid gibts unta da Lizent $1, wen nix andast oogem is.",
        "copyrightpage": "{{ns:project}}:Urhebarecht",
        "currentevents": "Aktuelle Ereigniss",
        "currentevents-url": "Project:Aktuelle Ereigniss",
-       "disclaimers": "Impressum",
+       "disclaimers": "Hoftungsausschluss",
        "disclaimerpage": "Project:Impressum",
        "edithelp": "Huif fias Werkln",
        "mainpage": "Hoamseitn",
        "retrievedfrom": "Vh „$1“",
        "youhavenewmessages": "Du host $1 ($2).",
        "youhavenewmessagesmulti": "Du host neiche Nochrichtn: $1",
-       "editsection": "Werkln",
+       "editsection": "Weakln",
        "editold": "Werkln",
        "viewsourceold": "Quejtext ozoagn",
        "editlink": "werkln",
        "nstab-template": "Vorlog",
        "nstab-help": "Hüfeseiten",
        "nstab-category": "Kategorie",
+       "mainpage-nstab": "Hoamseitn",
        "nosuchaction": "De Akzion gibts ned",
        "nosuchactiontext": "Dé in da URL ågeewerne Akzión werd voh MediaWiki néd unterstytzd.\nEs kå a Schreibfeeler in da URL vurlieng óder es is a feelerhofter Link åklickt worn.\nEs kå sé aa um an Prógrammierfeeler in da Software, dé auf {{SITENAME}} bnutzd werd, håndeln.",
        "nosuchspecialpage": "De Speziaalsaiten gibts ned",
        "actionthrottled": "Aktionsfrequenz drossld",
        "actionthrottledtext": "A Anti-Spam-Skript begrenzd de Ozoi vo de Vaendarunga pro Minutn. Vasuachs in a boar Minutn wieda.",
        "protectedpagetext": "Dé Seiten is gschytzd worn, um Beorweitungen z' vahindern.",
-       "viewsourcetext": "Du kåst ower 'n Quötext åschaung und kópirn:",
+       "viewsourcetext": "Du konst a en Quejtext vo da Seitn ooschaugn und kopian:",
        "viewyourtext": "Du kåst 'n Quejtext vah '''deiner Beorwatung''' derer Seiten betrochten und kópiern:",
        "protectedinterface": "Dé Seiten do enthoit Text fyr d' Benutzerówerflächen voh da Software und is gschytzd, um an Missbrauch vurzbeing.",
        "editinginterface": "'''Ówocht:''' Dé Seiten do enthoit voh da MediaWiki-Software gnutzden Text. \nÄnderrungen auf derer Seiten wirken sé auf d' Benutzerówerflächen aus.\nZiag bittscheh im Foi voh Ywersétzungen in Betrocht, dé bei [https://translatewiki.net/wiki/Main_Page?setlang=de translatewiki.net], da Lókaalisiarungsblottform fyr MediaWiki, durchzfyrn.",
        "accountcreated": "Benytzerkonto is erstöid worn",
        "accountcreatedtext": "'s Benytzerkonto $1 is aigrichtt worn.",
        "loginlanguagelabel": "Sproch: $1",
-       "pt-login": "Eilogga",
+       "pt-login": "Omejdn",
+       "pt-createaccount": "Nutzakonto ooleng",
        "changepassword": "Posswort ändern",
        "oldpassword": "Oids Posswort:",
        "newpassword": "Neichs Posswort:",
        "accmailtext": "E zuafällig genariards Posswort fyr [[User talk:$1|$1]] is an $2 gschickt worn.\n\nDes Posswort fyr des naiche Benutzerkonto kå auf da Speziaalseiten  „[[Special:ChangePassword|Posswort ändern]]“ gändert wern.",
        "newarticle": "(Neich)",
        "newarticletext": "Du bist am Link gfoigt, wos no koa Seitn gibt.\nUm de Seitn ozlegn, trog dein Text im untan Kostn ei (schaug af da [$1 Huifeseitn] fia mea Infos).\nWens a Irrtum is, dassd do bist, nach druck in Zruck-Knopf vom Brausa.",
-       "anontalkpagetext": "---- ''De Seiten werd dodazua hergnumma, am ned-ågmöiderten Benutzer Nochrichten z' hinterlossen.\nWånnst mid de Kommentare auf derer Seiten nix åfanga kåst, is vamuatlich da friarerne Inhower vo derer IP-Adress gmoat und du kåstas ignorirn.\nWånnst a anonymer Benutzer bist und denkst, das irrelevante Kommentare ån di grichtt worn san, [[Special:UserLogin|möid de bittschee å]], um zuakynfteg Vawirrung z' vamein.''",
+       "anontalkpagetext": "----\n<em>Des is a Dischk vo an anonyman Nutze, wo no koa Konto ooglegt hod, oda wo s grod ned nutzt.</em>\nDesweng vawend ma a IP-Adress zua Identifiziarung.\nSo a IP-Adress kina mearane Nutza gmoasam vawendn.\nWannst du a anonma Nutza bist und mid dem Kommentar nix oofanga konst, konst da oafoch a [[Special:CreateAccount|Nutzakonto oolegn]] oda di [[Special:UserLogin|oomejdn]], damidst ned mid andan Nutzan vawexlst weasd.",
        "noarticletext": "De Seitn enthoid momentan koan Text ned.\nDu konst [[Special:Search/{{PAGENAME}}|nochm Titl]] in andan Seitn suacha,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} de Logbiacha duachsuacha],\noda [{{fullurl:{{FULLPAGENAME}}|action=edit}} de Seitn beorbatn]</span>.",
        "noarticletext-nopermission": "Af dea Seitn gibts zua Zeit koan Text.\nDu konst [[Special:Search/{{PAGENAME}}|in Seitntitl]] in andan Seitn suacha, oda <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} dia de Logbiachln dazua oschaugn]</span>, oba du hosd koa Berechtigung de Seitn ozlegn.",
        "userpage-userdoesnotexist": "Des Benutzerkonto „<nowiki>$1</nowiki>“ is ned vurhånden. Bittschee priaf, ob du de Seiten wirkle erstöin/beorweiten wüist.",
        "template-semiprotected": "(schreibgschitzt fia ned-ogmejdte Nutza)",
        "hiddencategories": "De Seitn is in {{PLURAL:$1|a vasteckde Kategorie|$1 vasteckde Kategorina}} eisortiad:",
        "nocreate-loggedin": "Du host koah Berechtigung, neiche Seiten z' erstön.",
-       "permissionserrors": "Berechtigungsfeeler",
+       "permissionserrors": "Berechtigungsfaila",
        "permissionserrorstext": "Du hosd koa Recht, des z doa. {{PLURAL:$1|Grund|Grind}}:",
        "permissionserrorstext-withaction": "Du hosd aus {{PLURAL:$1|foigendm Grund|foigendn Grind}} koa Recht ned, $2:",
        "recreate-moveddeleted-warn": "'''Obocht: Du legst a Seitn o, wo scho friaa glescht worn is.'''\n\nBittschee ibaleg da genau, obs sinnvoi is de Seitn ozlegn.\nDes Lesch- und Vaschiab-Logbuach dazua findsd do:",
        "histlegend": "Zua Ozoag vo de Endarunga oafoch de z vagleichandn Versiona und Schoitflechn „{{int:compareselectedversions}}“ druckn.<br />\n* ({{int:cur}}) = Unterschied zua aktuelln Version, ({{int:last}}) = Unterschied zua vorherign Version\n* Uhrzeid/Datum = Version za dera Zeid, Nutzanama/IP-Adress vom Beorbata, {{int:minoreditletter}} = Kloane Endarung",
        "history-fieldset-title": "Suach in da Versionsgschicht",
        "history-show-deleted": "Nua gleschte Versiona",
-       "histfirst": "Ejtaste",
+       "histfirst": "Ejdaste",
        "histlast": "Neiaste",
        "historyempty": "(laar)",
        "history-feed-title": "Versiónsgschicht",
        "shown-title": "Zoag $1 {{PLURAL:$1|Ergebnis|Ergebniss}} pro Seitn",
        "viewprevnext": "Zoag ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''Es gibt a Seiten, wo „[[:$1]]“ hoasst.'''",
-       "searchmenu-new": "'''De Seitn „[[:$1]]“ in em Wiki eastejn.'''",
+       "searchmenu-new": "<strong>Schreib an Artike „[[:$1]]“ in dem Wiki.</strong> {{PLURAL:$2|0=|Schaug da aa de Artike oo, wosd iwa dei Suach gfundn host.|Schaug da aa de gfundanan Suachagebniss oo.}}",
        "searchprofile-articles": "Inhoidsseitn",
        "searchprofile-images": "Muitimedia",
        "searchprofile-everything": "Ollas",
        "action-createpage": "Seiten z' dastön",
        "action-autopatrol": "eigerne Beorweitungen ois kontroilird markirn",
        "nchanges": "$1 {{PLURAL:$1|Endarung|Endarunga}}",
+       "enhancedrc-history": "Valaf",
        "recentchanges": "Letzte Endarunga",
        "recentchanges-legend": "Ozoagoptiona",
        "recentchanges-summary": "Auf derer Seiten kåst d' létzden Änderrungen auf '''{{SITENAME}}''' nochévavóing.",
        "recentchanges-label-minor": "Kloane Endarunga",
        "recentchanges-label-bot": "Endarung duach an Bot",
        "recentchanges-label-unpatrolled": "De Endarung is no ned kontrolliad worn",
-       "rcnotefrom": "Untn san de Endarunga seit  '''$2''' (bis za '''$1''' Ozoagn).",
+       "rcnotefrom": "Oozoagt {{PLURAL:$5|wead de Endarung|wean de Endarunga}} seitd <strong>$3, $4</strong> (max. <strong>$1</strong> Eihdräg).",
        "rclistfrom": "Nua Endarunga seit $3 $2 zoagn",
        "rcshowhideminor": "Kloane Endarunga $1",
        "rcshowhideminor-hide": "Ausblendn",
        "rcshowhidebots": "Bots $1",
-       "rcshowhideliu": "Eigloggte Nutza $1",
+       "rcshowhidebots-show": "Ozoang",
+       "rcshowhideliu": "Registriade Nutza $1",
        "rcshowhideliu-hide": "Ausblendn",
        "rcshowhideanons": "Anonyme Nutza $1",
        "rcshowhideanons-hide": "Ausblendn",
        "rcshowhidepatr": "Kontrolliade Endarunga $1",
        "rcshowhidemine": "Meine Beidreg $1",
        "rcshowhidemine-hide": "Ausblendn",
-       "rclinks": "De letztn Endarunga vo de letztn $2 Dog zoagn",
+       "rclinks": "Zoag de letztn $1 Endarunga vo de letztn $2 Dog.",
        "diff": "Untaschied",
        "hist": "Versiona",
        "hide": "Ausblendn",
        "newpageletter": "N",
        "boteditletter": "B",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|beówochtender|beówochtende}} Benutzer]",
+       "rc-change-size-new": "$1 {{PLURAL:$1|Byte|Bytes}} noch da Endarung",
        "newsectionsummary": "Neicher Obschnit /* $1 */",
        "rc-enhanced-expand": "Details zoagn (braucht JavaScript)",
        "rc-enhanced-hide": "Details vastecka",
        "recentchangeslinked-feed": "Valinkts priaffm",
        "recentchangeslinked-toolbox": "Endarunga af valinktn Seitn",
        "recentchangeslinked-title": "Endarunga wo vo „$1“ valinkt san",
-       "recentchangeslinked-summary": "Des is a Listn vo de letztn Endarunga af Seitn, de wo vo ana bstimmtn Seitn valinkt san (bzw. za ana bstimmtn Kategorie ghean).\nSeitn af [[Special:Watchlist|deina Beobochtungslistn]] san '''fett'''.",
+       "recentchangeslinked-summary": "Gib an Seitnnama oo, damidst de Endarunga siagst, wo zua oda vo da Seitn valinkt san. Damidst Mitglieda vo ana Kategorie siagst, gib „{{ns:category}}:''Nam vo da Kategorie''“ eih. 'Endarunga vo Seitn af [[Special:Watchlist|dainer Beobochtalistn]] san<strong>fett</strong> viaraghom.",
        "recentchangeslinked-page": "Seitn:",
        "recentchangeslinked-to": "Zoagt Änderrungen auf Seiten, dé do her valinken",
        "upload": "Affelodn",
        "sharedupload-desc-there": "De Datei stãmmt aus $1 und deaf bei ãndera Projekte vawendt wean. Schau auf'd [$2 Dateibeschreibungsseitn] fia weidare Infoamazionen.",
        "sharedupload-desc-here": "De Datei stammt aus $1 und deaf vo andan Projektn vawendt wean. De Bschreibung vo da [$2 Dateibschreibungsseitn] wead unen ozoagt.",
        "uploadnewversion-linktext": "A neiche Versión voh derer Daatei aufféloon",
+       "upload-disallowed-here": "Du konst de Datei ned iwaschreim.",
        "filerevert-defaultcomment": "zruckgsétzd auf dé Versión vom $1, $2 ($3)",
        "filerevert-submit": "Zrucksetzen",
        "filedelete-legend": "Lésch dé Daatei",
        "emailuserfooter": "Dé E-Mail is voh {{SITENAME}}-Benutzer „$1“ an „$2“ gsendt worn.",
        "usermessage-summary": "Systémnoochricht gspeicherd.",
        "usermessage-editor": "Systém-Messenger",
-       "watchlist": "Beobochtungslistn",
+       "watchlist": "Mei Beobochta",
        "mywatchlist": "Mei Beobochta",
        "watchlistfor2": "Vo $1 $2",
        "nowatchlist": "Es gibt koane Eihträg auf deiner Beówochtungslisten.",
        "notvisiblerev": "Versión is gléschd worn",
        "watchlist-details": "Du beoochst {{PLURAL:$1|$1 Seitn}}, Dischkriaseitn ned mitgrechnad",
        "wlheader-enotif": "Da E-Mail-Benoochrichtigungsdeanst is aktivierd.",
-       "wlheader-showupdated": "Seiten mid noh néd gseengne Änderrungen wern '''fett''' dorgstöd.",
-       "wlnote": "Es {{PLURAL:$1|fóigt d' létzde Änderrung|fóing d' létzden '''$1''' Änderrungen}} voh da/dé {{PLURAL:$2|Stund| '''$2''' Stunden}}. Staund: $3, $4 Uar.",
-       "wlshowlast": "Zoag dé Änderrungen voh dé létzden $1 Stunden, $2 Dog óder  (in dé létzden 30 Dog).",
+       "wlheader-showupdated": "Seitn mid no ned oogschaugtn Endarunga wean '''fett''' gschriem.",
+       "wlnote": "Es {{PLURAL:$1|foigt de letzte Endarung|foign de letztn <strong>$1</strong> Endarunga}} vo de letztn {{PLURAL:$2|Stunde|<strong>$2</strong> Stundn}}. Stand: $3, $4 Uah.",
+       "wlshowlast": "Zoag de Endarunga vo de letztn $1 Stund, $2 Dog.",
        "watchlist-options": "Mei Beobochta: Optiona",
        "watching": "Beówochten ...",
        "unwatching": "Néd Beówochten",
        "contributions": "{{GENDER:$1|Nutza}}beidreg",
        "contributions-title": "Nutzabeidräg vo „$1“",
        "mycontris": "Meine Beidreg",
-       "contribsub2": "Vo $1 ($2)",
+       "contribsub2": "Vo {{GENDER:$3|$1}} ($2)",
        "uctop": "(aktuell)",
        "month": "und Monad:",
        "year": "Bis zan Joar:",
        "importlogpage": "Import-Logbuach",
        "tooltip-pt-userpage": "Dei Nutzaseitn",
        "tooltip-pt-mytalk": "Dei Dischkriaseitn",
-       "tooltip-pt-preferences": "Deine Preferenzen",
+       "tooltip-pt-preferences": "{{GENDER:|Deine}} Prefarenzen",
        "tooltip-pt-watchlist": "A Listn vo Seitn, wos du beobochtest",
        "tooltip-pt-mycontris": "A Listn vo de oagna Beidreg",
        "tooltip-pt-login": "Warad schee, wensd di omejdn dadast, es is oba ned zwingend nedig.",
        "tooltip-pt-logout": "Auslogga",
+       "tooltip-pt-createaccount": "Mia lodn di eih, a Nutzakonto oozleng und di oozmejdn; es is owa ned nedig.",
        "tooltip-ca-talk": "Dischkrian iban Seitninhoid",
        "tooltip-ca-edit": "Du konsd de Seitn beorbatn. Bittschee vawendt in Vorschau-Knopf bevorsd speichasd.",
        "tooltip-ca-addsection": "Neichn Obschnitt ofanga",
        "lastmodifiedatby": "Dé Seiten is zletzt am $1 um $2 voh $3 gänderd worn.",
        "othercontribs": "Basiard auf da Orweid voh $1",
        "creditspage": "Seiteninformaziónen",
+       "simpleantispam-label": "Anti-Spam Check.\nDo <strong>nix</strong> eihdrong!",
        "pageinfo-redirects-name": "Ozoi vo de Weidaloatunga zua dea Seitn",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|Weidaloatung|Weidaloatunga}}; $3 {{PLURAL:$3|Untaseitn|Untaseitn}})",
+       "pageinfo-toolboxlink": "Seitninformation",
        "pageinfo-redirectsto": "Weidaloatunga af",
        "markedaspatrollederrortext": "Du muasst a Seitenänderrung auswön",
        "deletedrevision": "Oide Version $1 glöscht.",
        "file-info-size": "$1 × $2 Pixel, Dateigress: $3, MIME-Typ: $4",
        "file-nohires": "Es gibt koa hehare Aflesung.",
        "svg-long-desc": "SVG-Datei, Basisgress: $1 × $2 Pixl, Dateigress: $3",
-       "show-big-image": "Volle Aflesung",
+       "show-big-image": "Originaldatei",
+       "show-big-image-size": "$1 × $2 Pixel",
        "newimages": "Neiche Daatein",
        "newimages-summary": "Dé Speziaalseiten zoagt d' zlétzd aufféglooderne Daatei auh.",
        "noimages": "Koane Daatein gfunden.",
        "tags": "Gütige Änderrungsmarkiarunen",
        "tag-filter": "[[Special:Tags|Markiarungs]]-Fuita:",
        "tag-filter-submit": "Füter",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Markierung|Markiarunga}}]]: $2)",
        "tags-title": "Markiarungen",
        "tags-intro": "Dé Seiten zoagt olle Markiarungen, dé fyr Beorweidungen vawendt wern, sówia dé Bedeitung voh dé.",
        "tags-tag": "Markiarungsnåm",
        "htmlform-selectorother-other": "Åndre",
        "logentry-move-move_redir": "$1 hod de Seitn $3 af $4 {{GENDER:$2|verschom}} und hod dabei a Weidaloatung ibaschriem",
        "logentry-move-move_redir-noredirect": "$1 hod de Seitn $3 af $4 {{GENDER:$2|verschom}} und dabei a Weidaloatung ibaschriem, ohne a neiche ozlegn",
+       "logentry-newusers-create": "Nutzakonto $1 is {{GENDER:$2|eastejt}} worn",
        "searchsuggest-search": "Suach (af Boarisch oda Deutsch)",
        "searchsuggest-containing": "Voitextsuach noch ..."
 }
index a78003b..de9cec0 100644 (file)
        "converter-manual-rule-error": "Знойдзеная памылка ў ручным правіле моўнага канвэртару",
        "undo-success": "Рэдагаваньне можа быць адмененае. Калі ласка, параўнайце адрозьненьні паміж вэрсіямі, каб упэўніцца, што гэта адпаведныя зьмены, а потым запішыце зьмены для сканчэньня рэдагаваньня.",
        "undo-failure": "Рэдагаваньне ня можа быць скасаванае праз канфлікт паміж папярэднімі рэдагаваньнямі.",
+       "undo-main-slot-only": "Праўка ня можа быць адмененая, бо яна ўключае зьмест па-за асноўным месцам.",
        "undo-norev": "Рэдагаваньне ня можа быць адмененае, таму што яно не існуе альбо было выдаленае.",
        "undo-nochange": "Выглядае, што праўка ўжо была адмененая.",
        "undo-summary": "Скасаваньне праўкі $1 {{GENDER:$2|удзельніка|удзельніцы}} [[Special:Contributions/$2|$2]] ([[User talk:$2|гутаркі]])",
        "rcfilters-activefilters": "Актыўныя фільтры",
        "rcfilters-activefilters-hide": "Схаваць",
        "rcfilters-activefilters-show": "Паказаць",
+       "rcfilters-activefilters-hide-tooltip": "Схаваць поле актыўных фільтраў",
+       "rcfilters-activefilters-show-tooltip": "Паказаць поле актыўных фільтраў",
        "rcfilters-advancedfilters": "Пашыраныя фільтры",
        "rcfilters-limit-title": "Паказаць вынікаў",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|зьмена|зьмены|зьменаў}}, $2",
        "overwrite": "Замена існага файлу забароненая.",
        "unknown-error": "Узьнікла невядомая памылка.",
        "tmp-create-error": "Немагчыма стварыць часовы файл.",
-       "tmp-write-error": "Памылка запісу часовага файла.",
-       "large-file": "Рэкамэндаваны памер файлаў — ня болей $1;\nпамер гэтага файла — $2.",
-       "largefileserver": "Памер гэтага файла перавышае максымальна дазволены.",
-       "emptyfile": "Загружаны файл, здаецца, пусты. Магчыма гэты адбылося з-за памылкі ў назьве файла.\nУдакладніце, ці Вы сапраўды жадаеце загрузіць гэты файл.",
+       "tmp-write-error": "Памылка запісу часовага файлу.",
+       "large-file": "Рэкамэндаваны памер файлаў — ня болей за $1;\nпамер гэтага файлу — $2.",
+       "largefileserver": "Памер гэтага файлу перавышае максымальна дазволены сэрвэрам.",
+       "emptyfile": "Загружаны файл, здаецца, пусты. Магчыма гэта адбылося з-за памылкі ў назьве файлу. Калі ласка, удакладніце, ці вы сапраўды жадаеце загрузіць гэты файл.",
        "windows-nonascii-filename": "Гэтая вікі не падтрымлівае назвы файлаў з спэцыяльнымі сымбалямі.",
        "fileexists": "Файл з такой назвай ужо існуе. Калі ласка, праверце <strong>[[:$1]]</strong>, калі Вы ня ўпэўненыя, што жадаеце яго замяніць. [[$1|thumb]]",
        "filepageexists": "Старонка апісаньня для гэтага файла ўжо існуе як <strong>[[:$1]]</strong>, але файла з такой назвай няма.\nАпісаньне якое Вы дадалі ня зьявіцца на старонцы апісаньня.\nКаб яно там зьявілася, Вам трэба рэдагаваць яе самастойна.\n[[$1|thumb]]",
index 503f7ec..7585117 100644 (file)
        "resetpass-temp-password": "অস্থায়ী পাসওয়ার্ড:",
        "resetpass-abort-generic": "পাসওয়ার্ড পরিবর্তন একটি এক্সটেনশনের কারণে স্থগিত করা হয়েছে।",
        "resetpass-expired": "আপনার পাসওয়ার্ডের মেয়াদ উত্তীর্ণ হয়েছে। অ্যাকাউন্টে প্রবেশের জন্য অনুগ্রহ করে নতুন পাসওয়ার্ড নির্ধারণ করুন।",
-       "resetpass-expired-soft": "à¦\86পনার à¦ªà¦¾à¦¸à¦\93য়ারà§\8dডà§\87র à¦®à§\87য়াদ à¦\89তà§\8dতà§\80রà§\8dণ à¦¹à¦¯à¦¼à§\87à¦\9bà§\87 à¦\8fবà¦\82 à¦\86পনাà¦\95à§\87 à¦\8fà¦\95à¦\9fি à¦¨à¦¤à§\81ন à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦¨à¦¿à¦°à§\8dধারণ à¦\95রতà§\87 à¦¹à¦¬à§\87। à¦\85নà§\81à¦\97à§\8dরহ à¦\95রà§\87 à¦\8fà¦\96নà¦\87 à¦\8fà¦\95à¦\9fি à¦¨à¦¤à§\81ন à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦¨à¦¿à¦°à§\8dধারণ à¦\95রà§\81ন à¦\85থবা à¦ªà¦°à§\87 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রতà§\87 à¦\9aাà¦\87লà§\87 \"{{int:authprovider-resetpass-skip-label}}\" à¦¬à¦¾à¦\9fনà§\87 ক্লিক করুন।",
-       "resetpass-validity-soft": "à¦\86পনার à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦¬à§\88ধ à¦¨à¦¯à¦¼: $1\n\nদয়া à¦\95রà§\87 à¦\8fà¦\95à¦\9fি à¦¨à¦¤à§\81ন à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦¨à¦¿à¦°à§\8dধারণ করুন অথবা পরে করার জন্য \"{{int:authprovider-resetpass-skip-label}}\" ক্লিক করুন।",
+       "resetpass-expired-soft": "à¦\86পনার à¦ªà¦¾à¦¸à¦\93য়ারà§\8dডà§\87র à¦®à§\87য়াদ à¦\89তà§\8dতà§\80রà§\8dণ à¦¹à¦¯à¦¼à§\87à¦\9bà§\87 à¦\8fবà¦\82 à¦\86পনাà¦\95à§\87 à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রতà§\87 à¦¹à¦¬à§\87। à¦\85নà§\81à¦\97à§\8dরহ à¦\95রà§\87 à¦\8fà¦\96নà¦\87 à¦\8fà¦\95à¦\9fি à¦¨à¦¤à§\81ন à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦¨à¦¿à¦°à§\8dধারণ à¦\95রà§\81ন à¦\85থবা à¦ªà¦°à§\87 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রতà§\87 à¦\9aাà¦\87লà§\87 \"{{int:authprovider-resetpass-skip-label}}\" ক্লিক করুন।",
+       "resetpass-validity-soft": "à¦\86পনার à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦¬à§\88ধ à¦¨à¦¯à¦¼: $1\n\nদয়া à¦\95রà§\87 à¦\8fà¦\95à¦\9fি à¦¨à¦¤à§\81ন à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦\9aয়ন করুন অথবা পরে করার জন্য \"{{int:authprovider-resetpass-skip-label}}\" ক্লিক করুন।",
        "passwordreset": "পাসওয়ার্ড পুনঃস্থাপন করুন",
        "passwordreset-text-one": "ইমেইলের মাধ্যমে একটি অস্থায়ী পাসওয়ার্ড পেতে এই ফরম পূরণ করুন।",
        "passwordreset-text-many": "{{PLURAL:$1|ইমেইলের মাধ্যমে একটি অস্থায়ী পাসওয়ার্ড পেতে ঘরগুলির একটি পূরণ করুন।}}",
        "expansion-depth-exceeded-category-desc": "পাতাটি সর্বোচ্চ এক্সপশন সীমানা অতিক্রম করেছে।",
        "expansion-depth-exceeded-warning": "পাতাটি এক্সেপশন সীমানা অতিক্রম করেছে",
        "parser-unstrip-loop-warning": "ত্রুটিপূর্ণ লুপ খুঁজে পাওয়া গিয়েছে",
-       "unstrip-depth-warning": "লà§\81প à¦°à¦¿à¦\95ারশন সীমানা অতিক্রম করেছে ($1)",
-       "unstrip-depth-category": "পাতাà¦\97à§\81লি à¦¯à§\87à¦\96ানà§\87 unstrip à¦\97ভà§\80রতার à¦¸à§\80মা à¦\85তিà¦\95à§\8dরম à¦\95রà§\87à¦\9bà§\87ন",
+       "unstrip-depth-warning": "à¦\86নসà§\8dà¦\9fà§\8dরিপ à¦\97ভà§\80রতার সীমানা অতিক্রম করেছে ($1)",
+       "unstrip-depth-category": "পাতাসমà§\82হ à¦¯à§\87à¦\96ানà§\87 à¦\86নসà§\8dà¦\9fà§\8dরিপ à¦\97ভà§\80রতার à¦¸à§\80মা à¦\85তিà¦\95à§\8dরম à¦\95রà§\87à¦\9bà§\87",
        "unstrip-size-warning": "Unstrip আকারের সীমা অতিক্রম করেছে ($1)",
+       "unstrip-size-category": "পাতাসমূহ যেখানে আনস্ট্রিপ আকারের সীমা অতিক্রম করেছে",
        "converter-manual-rule-error": "ম্যানুয়াল ভাষা রূপান্তর নিয়মে ত্রুটি পাওয়া গিয়েছে",
        "undo-success": "সম্পাদনাটি বাতিল করা যাবে। অনুগ্রহ করে নিচের তুলনাটি পরীক্ষা করে দেখুন ও নিশ্চিত করুন যে এটাই আপনি করতে চান, এবং তারপর নিচের সম্পাদনাগুলি সংরক্ষণ করে সম্পাদনাটির বাতিল প্রক্রিয়া সমাপ্ত করুন।",
        "undo-failure": "এ সম্পাদনা মধ্যবর্তী সম্পাদনাসমূহের কারণে পূর্বাবস্থায় ফিরিয়ে নেওয়া যাবে না।",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|বাইট}}",
        "limitreport-expansiondepth": "সর্বোচ্চ গভীরতা বিস্তার",
        "limitreport-expensivefunctioncount": "ব্যয়বহুল পার্সার ফাংশন গণনা",
+       "limitreport-unstrip-depth": "Unstrip পুনরাবৃত্তির গভীরতা",
+       "limitreport-unstrip-size": "পরবর্তী-প্রসারিত unstrip আকার",
        "limitreport-unstrip-size-value": "$1/$2 {{PLURAL:$2|বাইট}}",
        "expandtemplates": "টেমপ্লেট সম্প্রসারণ",
        "expand_templates_intro": "এই বিশেষ পাতাটি কিছু উইকিটেক্সট গ্রহণ করে এবং এর ভেতরের সব টেমপ্লেট বারংবার সম্প্রসারিত করে।\nএছাড়াও এটি\n<code><nowiki>{{</nowiki>#language:...}}</code>-এর মত পার্সার ফাংশন,\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>-এর মত ভ্যারিয়েবল\nমোটকথা দ্বিতীয় বন্ধনীর মধ্যে অবস্থিত সবকিছুকেই সম্প্রসারিত করতে পারে।",
        "special-characters-group-hebrew": "হিব্রু",
        "special-characters-group-bangla": "বাংলা",
        "special-characters-group-tamil": "তামিল",
-       "special-characters-group-telugu": "তà§\87লà§\87গু",
+       "special-characters-group-telugu": "তà§\87লà§\81গু",
        "special-characters-group-sinhala": "সিংহলী",
        "special-characters-group-gujarati": "গুজরাটি",
        "special-characters-group-devanagari": "দেবনাগরী",
index 0e1c773..da44540 100644 (file)
@@ -5,7 +5,8 @@
                        "Uttam Singha, Dec 2006",
                        "아라",
                        "Macofe",
-                       "MtDu"
+                       "MtDu",
+                       "Bodhisattwa"
                ]
        },
        "tog-underline": "লিঙ্কর তলে দুরগ দিক:",
        "special-characters-group-persian": "ফারসি",
        "special-characters-group-hebrew": "হিব্রু",
        "special-characters-group-bangla": "বাংলা",
-       "special-characters-group-telugu": "তà§\87লà§\87গু",
+       "special-characters-group-telugu": "তà§\87লà§\81গু",
        "special-characters-group-sinhala": "শিংহলী",
        "special-characters-group-gujarati": "গুজরাতি",
        "special-characters-group-thai": "থাই",
index d93159b..a552b16 100644 (file)
        "customcssprotected": "N'oc'h ket aotreet da gemmañ ar bajenn CSS-mañ rak kavout a reer enni arventennoù personel un implijer all.",
        "customjsprotected": "N'oc'h ket aotreet da gemmañ ar bajenn JavaScript-mañ rak kavout a reer enni arventennoù personel un implijer all.",
        "mycustomcssprotected": "N'oc'h ket aotreet da gemmañ d'ar bajenn CSS-mañ.",
+       "mycustomjsonprotected": "N'oc'h ket aotreet da gemmañ ar bajenn JSON-mañ.",
        "mycustomjsprotected": "N'oc'h ket aotreet da gemmañ d'ar bajenn JavaScript-mañ.",
        "myprivateinfoprotected": "N'ho peus ket ar gwirioù evit kemmañ ho titouroù personel.",
        "mypreferencesprotected": "N'ho peus ket ar gwirioù evit kemmañ ho Penndibaboù.",
        "nosuchusershort": "N'eus perzhiad ebet gantañ an anv « $1 ». Gwiriit ar reizhskrivadur.",
        "nouserspecified": "Ret eo deoc'h spisaat un anv implijer.",
        "login-userblocked": "Stanket eo an implijer-mañ. N'eo ket aotret da gevreañ.",
-       "wrongpassword": "Ger-tremen kamm. Klaskit en-dro.",
+       "wrongpassword": "Ger-tremen pe anv implijer kamm. Klaskit en-dro.",
        "wrongpasswordempty": "Ger-tremen ebet. Lakait unan mar plij.",
        "passwordtooshort": "{{PLURAL:$1|1 arouezenn|$1 arouezenn}} hir a rank bezañ ar gerioù-tremen da nebeutañ.",
        "passwordtoolong": "N'hall ket ar gerioù-tremen bezañ enno ouzhpenn $1 {{PLURAL:$1|1 arouezenn|$1 arouezenn}}.",
-       "passwordtoopopular": "N'haller ket ober gant gerioù-ter boutin betek re. Grit gant ur ger-tremen raloc'h.",
+       "passwordtoopopular": "N'haller ket ober gant gerioù-kuzh boutin betek re. Grit gant ur ger-tremen diaesoc'h da gavout.",
        "password-name-match": "Rankout a ra ho ker-tremen bezañ disheñvel diouzh hoc'h anv implijer.",
        "password-login-forbidden": "Berzet eo ober gant an anv implijer hag ar ger-tremen-mañ.",
        "mailmypassword": "Adderaouekaat ar ger-tremen",
        "botpasswords-existing": "Gerioù-tremen botoù a zo anezho",
        "botpasswords-createnew": "Krouiñ ur ger-tremen bot nevez",
        "botpasswords-editexisting": "Cheñch ger-tremen ur bot a zo anezhañ c'hoazh",
+       "botpasswords-label-needsreset": "(ar ger kuzh a rank bezañ riñset)",
        "botpasswords-label-appid": "Anv ar robot",
        "botpasswords-label-create": "Krouiñ",
        "botpasswords-label-update": "Hizivaat",
        "postedit-confirmation-created": "Krouet eo bet ar bajenn.",
        "postedit-confirmation-restored": "Adsavet eo bet ar bajenn.",
        "postedit-confirmation-saved": "Enrollet eo bet ho kemmoù.",
+       "postedit-confirmation-published": "Embannet eo bet ho kemm.",
        "edit-already-exists": "N'eus ket bet gallet krouiñ ur bajenn nevez.\nKrouet e oa bet c'hoazh.",
        "defaultmessagetext": "Testenn dre ziouer",
        "content-failed-to-parse": "C'hwitet eo dielfennadur endalc'had $2 evit ar patrom $1: $3",
        "diff-multi-sameuser": "({{PLURAL:$1|Ur reizhadenn da c'hortoz|$1 reizhadenn da c'hortoz}} gant ar memes implijer kuzhet)",
        "diff-multi-otherusers": "({{PLURAL:$1|Ur reizhadenn da c'hortoz|$1 reizhadenn da c'hortoz}} gant {{PLURAL:$2|un implijer all|$2 implijer}} kuzhet.)",
        "diff-multi-manyusers": "({{PLURAL:$1|Ur reizhadenn da c'hortoz|$1 reizhadenn da c'hortoz}} gant muioc'h eget $2 {{PLURAL:$2|implijer|implijer}} kuzhet.)",
+       "diff-paragraph-moved-tonew": "Fiñvet eo bet ar rannbennad. Klikit evit mont davet al lec'hiadur nevez.",
+       "diff-paragraph-moved-toold": "Ar rannbennad azo bet fiñvet. Klikit evit mont davet al lec'hiadur gozh.",
        "difference-missing-revision": "!!{{PLURAL:$2|Un adweladur|$2 adweladurioù}} eus an disheñvelder ($1) {{PLURAL:$2|n'eo ket bet kavet|n'int ket bet adkavet}}.\n\nC'hoarvezout a ra peurliesañ pa vez heuliet ul liamm disheñvel dispredet war-zu ur bajenn zo bet dilamet.\nGallout a reot kavout munudoù e [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} renabl an dilamadurioù].",
        "searchresults": "Disoc'hoù enklask",
        "searchresults-title": "Disoc'hoù klask evit \"$1\"",
        "timezoneregion-indian": "Meurvor Indez",
        "timezoneregion-pacific": "Meurvor Habask",
        "allowemail": "Aotren ar posteloù a-berzh implijerien all",
+       "email-allow-new-users-label": "Aotreañ e-bostoù a-berzh an implijerien nevez",
+       "email-blacklist-label": "Difenn d'an implijerien-se da gas un e-bost din:",
        "prefs-searchoptions": "Klask",
        "prefs-namespaces": "Esaouennoù",
        "default": "dre ziouer",
        "prefs-files": "Restroù",
        "prefs-custom-css": "CSS personelaet",
+       "prefs-custom-json": "JSON hiniennel",
        "prefs-custom-js": "JS personelaet",
-       "prefs-common-config": "JavaScript ha CSS kenrannet evit an holl wiskadurioù :",
+       "prefs-common-config": "CSS/JSON/JavaScript kenrannet evit an holl wiskadurioù :",
        "prefs-reset-intro": "Ober gant ar bajenn-mañ a c'hallit evit adlakaat ho penndibaboù dre ziouer evit al lec'hienn-mañ. Kement-se n'hallo ket bezañ disc'hraet da c'houde.",
        "prefs-emailconfirm-label": "Kadarnaat ar postel :",
        "youremail": "Postel :",
        "right-editcontentmodel": "Kemmañ patrom danvez ur bajenn bennak",
        "right-editinterface": "Kemmañ an etrefas implijer",
        "right-editusercss": "Kemmañ restroù CSS implijerien all",
+       "right-edituserjson": "Kemmañ restroù JSON un implijer all",
        "right-edituserjs": "Kemmañ restroù JS implijerien all",
        "right-editmyusercss": "Aozañ ho restroù implijer CSS deoc'h-c'hwi",
+       "right-editmyuserjson": "Aozañ ho restroù implijer JSON deoc'h-c'hwi",
        "right-editmyuserjs": "Aoazañ ho restroù JavaScript implijer deoc'h-c'hwi",
        "right-viewmywatchlist": "Gwelet ho roll-evezhiañ deoc'h-c'hwi",
        "right-editmywatchlist": "Kemmañ ho roll evezhiañ deoc'h-c'hwi. Notit mat e vo c'hoazh ouzhpennet pajennoù hep ar gwir-mañ gant obererezhioù zo.",
        "grant-createaccount": "Krouiñ kontoù",
        "grant-createeditmovepage": "Krouiñ, aozañ ha dilec'hiañ pajennoù",
        "grant-delete": "Diverkañ ar pajennoù, an adweladennoù hag an enmontoù er marilh",
-       "grant-editinterface": "Kemmañ esaouenn anvioù MediaWiki hag ar CSS/JavaScript implijer",
-       "grant-editmycssjs": "Kemmañ ho CSS/JavaScript implijer",
+       "grant-editinterface": "Kemmañ esaouenn anvioù MediaWiki hag implijer CSS/JSON/JavaScript",
+       "grant-editmycssjs": "Kemmañ ho CSS/JSON/JavaScript implijer",
        "grant-editmyoptions": "Kemmañ ho penndibaboù implijer.",
        "grant-editmywatchlist": "Kemmañ ho roll evezhiañ",
        "grant-editpage": "Kemmañ pajennoù a zo anezho c'hoazh",
        "rcfilters-other-review-tools": "Ostilhoù reizhañ all",
        "rcfilters-group-results-by-page": "Strollañ an disoc'hoù dre bajenn",
        "rcfilters-activefilters": "Siloù oberiant",
+       "rcfilters-activefilters-hide": "Kuzhat",
+       "rcfilters-activefilters-show": "Diskouez",
        "rcfilters-advancedfilters": "Siloù araokaet",
        "rcfilters-limit-title": "Kemmoù da vezañ diskouezet",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|kemm|kemmoù}}, $2",
        "rcfilters-hideminor-conflicts-typeofchange-global": "Tabut zo etre ar sil \"Kemmoù dister\" hag unan pe meur a sil a Seurt kemmoù peogwir n'haller merkañ kemmoù zo evel \"dister\". Kavet e vo ar siloù o tabutal e takad ar siloù gweredekaet, a-us.",
        "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",
        "rcfilters-typeofchange-conflicts-hideminor": "Tabut zo etre ar sil-mañ Seurt kemmoù gant sil ar \"c'hemmoù dister\". Kemmoù zo n'hallont ket bezañ merket evel \"dister\".",
-       "rcfilters-filtergroup-lastRevision": "Stumm diwezhañ",
-       "rcfilters-filter-lastrevision-label": "Stumm diwezhañ",
+       "rcfilters-filtergroup-lastRevision": "Stumm a-vremañ pe stumm red",
+       "rcfilters-filter-lastrevision-label": "Stumm a-vremañ pe stumm red",
        "rcfilters-filter-lastrevision-description": "Kemm diwezhañ graet ouzh ur bajenn.",
        "rcfilters-filter-previousrevision-label": "Stummoù koshoc'h",
        "rcfilters-filter-previousrevision-description": "An holl gemmoù nemet ar c'hemm diwezhañ graet ouzh ur bajenn.",
+       "rcfilters-filter-excluded": "Skarzhet",
+       "rcfilters-tag-prefix-namespace-inverted": "<strong>:not</strong> $1",
+       "rcfilters-exclude-button-off": "Skarzhañ ar re dibabet",
+       "rcfilters-exclude-button-on": "Re dibabet skarzhet",
+       "rcfilters-filter-showlinkedfrom-label": "Diskouez ar c'hemmoù war ar bajennoù liammet",
        "rcfilters-filter-showlinkedto-label": "Diskouez ar c'hemmoù war ar bajennoù liammet",
        "rcfilters-target-page-placeholder": "Skrivañ anv ar bajenn (pe rummad)",
        "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ñ).",
        "uploadstash-refresh": "Freskaat roll ar restroù",
        "uploadstash-thumbnail": "gwelet ar munud",
        "uploadstash-exception": "Dibosupl stokañ an enporzhiadenn er sanailh ($1) : \"$2\".",
+       "uploadstash-bad-path-unknown-type": "Obererezh dianav \"$1\".",
+       "uploadstash-zero-length": "Ment ar restr a zo mann",
        "invalid-chunk-offset": "Direizh eo offset ar rannad",
        "img-auth-accessdenied": "Moned nac'het",
        "img-auth-nopathinfo": "Mankout a ra ar PATH_INFO.\nN'eo ket kefluniet ho servijer evit reiñ an titour-mañ.\nMarteze eo diazezet war CGI ha n'hall ket skorañ img_auth.\nGwelet https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization",
        "pageswithprop-legend": "Pajennoù gant ur perzh pajenn",
        "pageswithprop-text": "Rollañ a ra ar bajenn-mañ ar pajennoù a ra gant ur perzh pajenn dibar",
        "pageswithprop-prop": "Anv ar perzh :",
+       "pageswithprop-reverse": "Renkañ en urzh enep",
        "pageswithprop-submit": "Mont",
        "pageswithprop-prophidden-long": "talvoud perzh testenn hir kuzhet ($1)",
        "pageswithprop-prophidden-binary": "Talvoud perzh binarel kuzhet ($1)",
        "version-specialpages": "Pajennoù dibar",
        "version-parserhooks": "Astennoù an dielfenner",
        "version-variables": "Argemmennoù",
+       "version-editors": "Embannerien",
        "version-antispam": "Mirout ouzh ar strob",
        "version-other": "Diseurt",
        "version-mediahandlers": "Merer danvez liesvedia",
        "compare-revision-not-exists": "N'eus ket eus an adweladenn spisaet ganeoc'h.",
        "diff-form": "ur '''furmskrid'''",
        "permanentlink": "Peurliamm",
+       "permanentlink-submit": "Lammañ d'ar c'hemm",
        "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 an diaz roadennoù : $1)",
        "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>",
+       "edit-error-short": "Fazi : $1",
+       "edit-error-long": "Fazi:\n\n\n$1",
        "revid": "Adweladenn $1",
        "pageid": "ID ar bajenn $1",
        "rawhtml-notallowed": "N'hall an tikedennoù &lt;html&gt; bezañ implijet nemet er pajennoù normal.",
        "pagedata-title": "Roadennoù ar bajenn",
        "pagedata-bad-title": "Titl direizh : $1.",
        "passwordpolicies-group": "Strollad",
-       "passwordpolicies-policies": "Politikerezh"
+       "passwordpolicies-policies": "Politikerezh",
+       "passwordpolicies-policy-passwordcannotmatchusername": "Ar ger-kuzh ne c'hell ket bezañ an anv implijer"
 }
index 04530fa..5556e7e 100644 (file)
@@ -27,7 +27,8 @@
                        "Сербијана",
                        "Asmen",
                        "Obsuser",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "BadDog"
                ]
        },
        "tog-underline": "Podvlačenje linkova:",
        "allmessagesname": "Naziv",
        "allmessagesdefault": "Predodređeni tekst",
        "allmessagescurrent": "Trenutni tekst",
-       "allmessagestext": "Ovo je spisak svih sistemskih poruka u dostupnih u imenskom prostoru MediaWiki.\nPosjetite [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation lokalizaciju MediaWikija] i [https://translatewiki.net translatewiki.net] ako želite doprinijeti općoj lokalizaciji MediaWikija.",
+       "allmessagestext": "Ovo je spisak sistemskih poruka u dostupnih u imenskom prostoru MediaWiki.\nPosjetite [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation lokalizaciju MediaWikija] i [https://translatewiki.net translatewiki.net] ako želite doprinijeti općoj lokalizaciji MediaWikija.",
        "allmessagesnotsupportedDB": "Ova stranica ne može biti korištena jer je <i>wgUseDatabaseMessages</i> isključen.",
        "allmessages-filter-legend": "Filter",
        "allmessages-filter": "Filter po stanju podešavanja:",
        "tooltip-pt-createaccount": "Ohrabrujemo vas da otvorite nalog i prijavite se, međutim to nije obavezno",
        "tooltip-ca-talk": "Razgovor o sadržaju",
        "tooltip-ca-edit": "Uredi ovu stranicu",
-       "tooltip-ca-addsection": "Započnite novu sekciju.",
+       "tooltip-ca-addsection": "Započni novu sekciju.",
        "tooltip-ca-viewsource": "Ova stranica je zaštićena.\nMožete joj vidjeti izvorni kôd",
        "tooltip-ca-history": "Prethodne verzije ove stranice.",
        "tooltip-ca-protect": "Zaštitite stranicu od budućih izmjena",
index 5dac858..2ea950d 100644 (file)
@@ -59,7 +59,8 @@
                        "Xð",
                        "Abella",
                        "Pierpao",
-                       "Amire80"
+                       "Amire80",
+                       "Leptictidium"
                ]
        },
        "tog-underline": "Subratlla els enllaços:",
        "move-page": "Reanomena $1",
        "move-page-legend": "Reanomena la pàgina",
        "movepagetext": "Amb el formulari següent reanomenareu una pàgina, movent tot el seu historial al nou nom.\nEl títol anterior es convertirà en una pàgina de redirecció al nou títol.\nPodeu actualitzar automàticament les redireccions que apuntin al títol original.\nSi no ho feu, assegureu-vos de verificar les redireccions [[Special:DoubleRedirects|dobles]] o [[Special:BrokenRedirects|trencades]].\nSerà de la vostra responsabilitat verificar que els enllaços segueixin apuntant cap a on se suposa que ho han de fer.\n\nTingueu en compte que la pàgina <strong>no</strong> serà traslladada si ja existeix una pàgina amb el títol nou, tret que sigui una redirecció sense més historial.\nAixò significa que podeu reanomenar de nou una pàgina al seu títol original si cometeu un error, i que no podeu sobreescriure una pàgina existent.\n\n<strong>Nota:</strong>\nAçò pot ser un canvi dràstic i inesperat en una pàgina que sigui popular; \nassegureu-vos d'entendre les conseqüències que comporta abans de seguir endavant.",
-       "movepagetext-noredirectfixer": "Amb el formulari següent podeu reanomenar una pàgina movent tot el seu historial al nom nou.\nEl títol anterior es convertirà en una pàgina de redirecció al nou títol. \nAssegureu-vos de verificar les redireccions [[Special:DoubleRedirects|dobles]] o [[Special:BrokenRedirects|trencades]].\nÉs responsabilitat vostra assegurar que els enllaços continuen apuntant cap a on se suposa que han d'anar. \n\nTingueu en compte que la pàgina <strong>no</strong> serà traslladada si ja existeix una pàgina amb el títol nou, tret que sigui una redirecció i no tingui més historial. \nAixò significa que podeu reanomenar de nou una pàgina al seu títol original si cometeu un error, i que no podeu sobreescriure una pàgina existent.\n \n<strong>Nota:</strong>\nAixò pot ser un canvi dràstic i inesperat per una pàgina popular; \nassegureu-vos que sabeu el que feu abans de continuar.",
+       "movepagetext-noredirectfixer": "El formulari següent permet reanomenar una pàgina movent-ne tot l'historial al nom nou.\nEl títol anterior es convertirà en una pàgina de redirecció al nou títol. \nAssegureu-vos de verificar les redireccions [[Special:DoubleRedirects|dobles]] o [[Special:BrokenRedirects|trencades]].\nÉs responsabilitat vostra que els enllaços continuïn apuntant cap on se suposa que han d'anar. \n\nTingueu en compte que la pàgina <strong>no</strong> serà traslladada si ja existeix una pàgina amb el títol nou, tret que sigui una redirecció i no tingui més historial. \nAixò significa que podeu reanomenar de nou una pàgina al seu títol original si cometeu un error, i que no podeu sobreescriure una pàgina existent.\n \n<strong>Nota:</strong>\nAixò pot ser un canvi dràstic i inesperat per a una pàgina popular; \nassegureu-vos que sabeu el que feu abans de continuar.",
        "movepagetalktext": "Si marqueu aquesta casella, la pàgina de discussió associada també serà traslladada automàticament al nou títol, tret que ja existeixi allà una pàgina de discussió no buida.\n\nEn aquest cas, haureu de traslladar o fusionar la pàgina manualment si ho desitgeu.",
        "moveuserpage-warning": "'''Atenció:''' Esteu a punt de moure una pàgina d'usuari. Tingueu en compte que només la pàgina es desplaçarà i que el compte d'usuari ''no'' canviarà de nom.",
        "movecategorypage-warning": "<strong>Avís:</strong> Esteu a punt de moure una pàgina de categoria. Tingueu en compte que només es mourà aquesta pàgina, i que les pàgines dins la categoria antiga <em>no</em> es recategoritzaran automàticament en la nova.",
index 4997046..7b931c4 100644 (file)
        "converter-manual-rule-error": "Detekována chyba v pravidlech manuální jazykové konverze",
        "undo-success": "Editace může být zrušena. Zkontrolujte a pak potvrďte změny zobrazené níže.",
        "undo-failure": "Editace nemohla být zrušena kvůli konfliktu mezilehlých editací.",
+       "undo-main-slot-only": "Editace nemohla být zrušena, protože zapojuje obsah mimo hlavní sloupec",
        "undo-norev": "Tuto editaci není možné vrátit, protože neexistuje nebo byla smazána.",
        "undo-nochange": "Zdá se, že editace již byla zrušena.",
        "undo-summary": "Zrušena verze $1 od uživatele [[Special:Contributions/$2|$2]] ([[User talk:$2|diskuse]])",
        "rcfilters-filter-reviewstatus-unpatrolled-label": "Neprověřené",
        "rcfilters-filter-reviewstatus-manual-description": "Editace ručně označené jako prověřené.",
        "rcfilters-filter-reviewstatus-manual-label": "Ručně prověřené",
-       "rcfilters-filter-reviewstatus-auto-description": "Editace pokročilých uživatelů, jejichž práce je autoamticky označena jako prověřená.",
+       "rcfilters-filter-reviewstatus-auto-description": "Editace pokročilých uživatelů, jejichž práce je automaticky označena jako prověřená.",
        "rcfilters-filter-reviewstatus-auto-label": "Automaticky prověřené",
        "rcfilters-filtergroup-significance": "Důležitost",
        "rcfilters-filter-minor-label": "Malé editace",
        "revid": "revize $1",
        "pageid": "Stránka s ID $1",
        "rawhtml-notallowed": "Značky &lt;html&gt; nelze používat mimo běžné stránky.",
-       "gotointerwiki": "Opustit {{GENDER:4sg|{{SITENAME}}}}",
+       "gotointerwiki": "Opustit {{GRAMMAR:4sg|{{SITENAME}}}}",
        "gotointerwiki-invalid": "Zadaný název je neplatný.",
        "gotointerwiki-external": "Chystáte se opustit {{GRAMMAR:4sg|{{SITENAME}}}} a navštívit [[$2]], což je jiná webová stránka.\n\n'''[$1 Pokračovat na $1].'''",
        "undelete-cantedit": "Tuto stránku nemůžete obnovit, protože ji nejste oprávněni editovat.",
index e9ecf4d..5b2c82d 100644 (file)
@@ -57,7 +57,7 @@
        "tog-watchlisthideminor": "Cuddio golygiadau bychain rhag y rhestr wylio",
        "tog-watchlisthideliu": "Cuddio golygiadau gan ddefnyddwyr mewngofnodedig rhag y rhestr wylio",
        "tog-watchlistreloadautomatically": "Ail-lwyther y Rhestr wylio yn otomatigpan newider ffiltr (angen JavaScript)",
-       "tog-watchlistunwatchlinks": "Ychwanegwch ddolenau 'gwylio/heb eu gwylio' i'r cofnodion rydych yn eu gwylio (angen JavaScript)",
+       "tog-watchlistunwatchlinks": "Ychwanegwch farciau gweld/heb weld  ({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}) ar ddalennau rydych yn eu wgylio - gyda newidiadau (angen JavaScript)",
        "tog-watchlisthideanons": "Cuddio golygiadau gan ddefnyddwyr anhysbys rhag y rhestr wylio",
        "tog-watchlisthidepatrolled": "Cuddio golygiadau sydd wedi derbyn ymweliad patrôl rhag y rhestr wylio",
        "tog-watchlisthidecategorization": "Cuddiwch y categoriau",
        "resetpass-submit-loggedin": "Newidier y cyfrinair",
        "resetpass-submit-cancel": "Diddymu",
        "resetpass-wrong-oldpass": "Mae'r cyfrinair dros dro neu gyfredol yn annilys.\nEfallai eich bod wedi newid eich cyfrinair neu wedi gofyn am gyfrinair dros dro newydd.",
-       "resetpass-recycled": "Ailosodwch eich cyfrinair os gwelwch yn dda i rywbeth heblaw eich cyfrinair cyfredol.",
+       "resetpass-recycled": "Ailosodwch eich cyfrinair i rywbeth heblaw eich cyfrinair cyfredol.",
        "resetpass-temp-emailed": "Rydych wedi mewngofnodi gyda chod dros dro. I gwbwlhau hyn, mae'n rhaid i chi ailosod eich cyfrinair yma:",
        "resetpass-temp-password": "Cyfrinair dros dro:",
        "resetpass-abort-generic": "Mae estyniad wedi atal newid y cyfrinair.",
        "resetpass-expired": "Mae oes eich cyfrinair wedi dod i ben. Gosodwch gyfrinair newydd i fewngofnodi.",
-       "resetpass-expired-soft": "Mae eich cyfrinair wedi dod i ben ac mae'n rhaid ei ailosod. Dewisiwch gyfrinair newydd sbon nawr, neu cliciwch \"{{int:authprovider-resetpass-skip-label}}\" a'i ailosod rywdro eto.",
-       "resetpass-validity-soft": "Nid yw eich cyfrinair $1 yn dal ddilys.\n\nDewisiwch gyfrinair newydd nawr, neu gliciwch \"{{int:authprovider-resetpass-skip-label}}\" i'w ailosod yn nes ymlaen.",
+       "resetpass-expired-soft": "Mae eich cyfrinair wedi dod i ben ac mae'n rhaid ei ailosod. Dewisiwch gyfrinair newydd sbon nawr, neu gliciwch \"{{int:authprovider-resetpass-skip-label}}\" i'w ailosod rywdro eto.",
+       "resetpass-validity-soft": "Nid yw eich cyfrinair $1 yn ddilys.\n\nDewisiwch gyfrinair newydd nawr, neu gliciwch \"{{int:authprovider-resetpass-skip-label}}\" i'w ailosod.",
        "passwordreset": "Ailosod cyfrinair",
        "passwordreset-text-one": "Cwblhewch y ffurflen hon er mwyn ailosod eich cyfrinair.",
        "passwordreset-text-many": "{{PLURAL:$1|Llanwch un o'r blychau er mwyn derbyn cyfrinair dros dro mewn ebost.}}",
        "savechanges": "Cadw'r holl newidiadau",
        "publishpage": "Cyhoeddi tudalen",
        "publishchanges": "Cyhoeddi newidiadau",
+       "savearticle-start": "Cadw'r ddalen...",
+       "savechanges-start": "Cadw'r newidiadau...",
+       "publishpage-start": "Cyhoeddi'r ddalen...",
+       "publishchanges-start": "Cyhoeddi'r newidiadau...",
        "preview": "Rhagolwg",
        "showpreview": "Dangos rhagolwg",
        "showdiff": "Dangos newidiadau",
        "subject-preview": "Rhagolwg pwnc:",
        "previewerrortext": "Cafwyd nam tra'n ceisio creu rhagolwg o'r newidiadau.",
        "blockedtitle": "Mae'r defnyddiwr hwn wedi cael ei flocio",
-       "blockedtext": "'''Mae eich enw defnyddiwr neu gyfeiriad IP wedi cael ei flocio.'''\n\n$1 a osododd y bloc.\nY rheswm a roddwyd dros y blocio yw: ''$2''.\n\n*Dechreuodd y bloc am: $8\n*Bydd y bloc yn dod i ben am: $6\n*Bwriadwyd blocio: $7\n\nGallwch gysylltu â $1 neu un arall o'r [[{{MediaWiki:Grouppage-sysop}}|gweinyddwyr]] i drafod y bloc.\nSylwch mai dim ond y rhai sydd wedi gosod cyfeiriad e-bost yn eu [[Special:Preferences|dewisiadau defnyddiwr]], a hwnnw heb ei flocio, sydd yn gallu 'anfon e-bost at ddefnyddiwr' trwy'r wici.\n$3 yw eich cyfeiriad IP presennol. Cyfeirnod y bloc yw #$5.\nPan yn ysgrifennu at weinyddwr, cofiwch gynnwys yr holl fanylion uchod, os gwelwch yn dda.",
-       "autoblockedtext": "Rhoddwyd bloc yn awtomatig ar eich cyfeiriad IP oherwydd iddo gael ei ddefnyddio gan ddefnyddiwr arall, a bod bloc wedi ei roi ar hwnnw gan $1.\nY rheswm a roddwyd dros y bloc oedd:\n\n:''$2''\n\n*Dechreuodd y bloc am: $8\n*Daw'r bloc i ben am: $6\n*Bwriadwyd blocio: $7\n\nGallwch gysylltu â $1 neu un arall o'r [[{{MediaWiki:Grouppage-sysop}}|gweinyddwyr]] i drafod y bloc.\n\nSylwch mai dim ond y rhai sydd wedi gosod cyfeiriad e-bost yn eu [[Special:Preferences|dewisiadau defnyddiwr]], a hwnnw heb ei flocio, sydd yn gallu 'anfon e-bost at ddefnyddiwr' trwy'r wici.\n\nEich cyfeiriad IP presennol yw $3. Cyfeirnod y bloc yw $5. Nodwch y manylion hyn wrth drafod y bloc.",
+       "blockedtext": "Mae eich enw defnyddiwr neu gyfeiriad IP wedi cael ei flocio.</strong>\n\n$1 a osododd y bloc.\nY rheswm a roddwyd dros y blocio yw: <em>$2</em>.\n\n*Dechreuodd y bloc am: $8\n*Bydd y bloc yn dod i ben am: $6\n*Defnyddiwr a flociwyd: $7\n\nGallwch gysylltu â $1 neu un arall o'r [[{{MediaWiki:Grouppage-sysop}}|gweinyddwyr]] i drafod y bloc.\nSylwch mai dim ond y rhai sydd wedi gosod cyfeiriad e-bost yn eu [[Special:Preferences|dewisiadau defnyddiwr]], a hwnnw heb ei flocio, sy'n gallu 'anfon e-bost at ddefnyddiwr' trwy'r wici.\n$3 yw eich cyfeiriad IP presennol. Cyfeirnod y bloc yw #$5.\nPan yn ysgrifennu at weinyddwr, cofiwch gynnwys yr holl fanylion uchod, os gwelwch yn dda.",
+       "autoblockedtext": "Rhoddwyd bloc yn awtomatig ar eich cyfeiriad IP oherwydd iddo gael ei ddefnyddio gan ddefnyddiwr arall, a bod bloc wedi ei roi ar hwnnw gan $1.\nY rheswm a roddwyd dros y bloc oedd:\n\n:<em>$2</em>\n\n*Dechreuodd y bloc am: $8\n*Daw'r bloc i ben am: $6\n*Bwriadwyd blocio: $7\n\nGallwch gysylltu â $1 neu un arall o'r [[{{MediaWiki:Grouppage-sysop}}|gweinyddwyr]] i drafod y bloc.\n\nSylwch mai dim ond y rhai sydd wedi gosod cyfeiriad e-bost yn eu [[Special:Preferences|dewisiadau defnyddiwr]], a hwnnw heb ei flocio, sydd yn gallu 'anfon e-bost at ddefnyddiwr' trwy'r wici.\n\nEich cyfeiriad IP presennol yw $3. Cyfeirnod y bloc yw $5. Nodwch y manylion hyn wrth drafod y bloc.",
+       "systemblockedtext": "Mae eich enw defnyddiwr neu eich cyfeiriad IP wedi'i flocio gan MediaWiki.\nY rheswm yw:\n\n:<em>$2</em>\n\n* Dechrau'r bloc: $8\n* Daw'r bloc i ben: $6\n* Y person a geisiwyd ei flocio: $7\n\nEich cyfeiriad IP presennol yw $3.\nPan yn ysgrifennu at weinyddwr, cofiwch gynnwys yr holl fanylion uchod, os gwelwch yn dda.",
        "blockednoreason": "dim rheswm wedi ei roi",
        "whitelistedittext": "Rhaid $1 i olygu tudalennau.",
        "confirmedittext": "Mae'n rhaid i chi gadarnhau eich cyfeiriad e-bost cyn y gallwch ddechrau golygu tudalennau.\nGosodwch eich cyfeiriad e-bost drwy eich [[Special:Preferences|dewisiadau defnyddiwr]] ac yna'i gadarnhau, os gwelwch yn dda.",
        "userjspreview": "'''Cofiwch -- dim ond rhagolwg o'ch JavaScript yw hwn; nid yw wedi'i gadw eto!'''",
        "sitecsspreview": "'''Cofiwch - dim ond rhagolwg o'ch CSS yw hwn.'''\n'''Nid yw wedi'i gadw eto!'''",
        "sitejspreview": "'''Cofiwch - dim ond rhagolwg o'ch côd JavaScript yw hwn.'''\n'''Nid yw wedi'i rhoi ar gadw eto!'''",
-       "userinvalidconfigtitle": "'''Rhybudd:''' Nid oes gwedd o'r enw \"$1\".\nCofiwch bod y tudalennau .css a .js yn defnyddio llythrennau bach, e.e. {{ns:user}}:Foo/vector.css yn hytrach na {{ns:user}}:Foo/Vector.css.",
+       "userinvalidconfigtitle": "<strong>Rhybudd:</strong> Nid oes gwedd o'r enw \"$1\".\nCofiwch bod y tudalennau .css a .js yn defnyddio llythrennau bach, e.e. {{ns:user}}:Foo/vector.css yn hytrach na {{ns:user}}:Foo/Vector.css.",
        "updated": "(Diweddariad)",
        "note": "'''Dalier sylw:'''",
        "previewnote": "'''Cofiwch taw rhagolwg yw hwn.''' Nid yw eich gwaith wedi ei roi ar gadw eto!",
        "longpageerror": "'''GWALL: Mae'r testun yr ydych wedi ei osod yma yn {{PLURAL:$1|$1 cilobeit}} o hyd, ac yn hwy na'r hyd eithaf o {{PLURAL:$2|$2}} cilobeit.\nNi ellir ei roi ar gadw.'''",
        "readonlywarning": "<strong>Rhybudd: Mae'r gronfa ddata wedi'i chloi am gyfnod er mwyn cynnal a chadw, felly fyddwch chi ddim yn gallu cadw'ch golygiadau ar hyn o bryd.</strong>\nGallwch gopïo'r testun a'i gludo i ffeil destun er mwyn ei gadw tan yn hwyrach.\n\nCynigiodd y gweinyddwr a glodd y gronfa ddata y rheswm hwn dros ei chloi: $1",
        "protectedpagewarning": "'''RHYBUDD: Mae'r dudalen hon wedi'i diogelu. Dim ond gweinyddwyr sydd yn gallu ei golygu.'''\nDyma'r cofnod lòg diweddaraf, er gwybodaeth:",
-       "semiprotectedpagewarning": "'''Sylwer:''' Mae'r dudalen hon wedi ei chloi; dim ond defnyddwyr cofrestredig a allant ei golygu.\nDyma'r cofnod lòg diweddaraf, er gwybodaeth:",
-       "cascadeprotectedwarning": "<strong>Gofal:</strong> Mae'r ddalen hon wedi ei chloi fel mai dim ond defnyddwyr â [[Special:ListGroupRights|hawliau arbennig]] all olygu, gan fod y ddalen yn cael ei dynnu i fewn i'r dalennau canlynol:",
+       "semiprotectedpagewarning": "<strong>Sylwer:</strong> Mae'r ddalen hon wedi ei chloi; dim ond defnyddwyr cofrestredig a allant ei golygu.\nDyma'r cofnod lòg diweddaraf, er gwybodaeth:",
+       "cascadeprotectedwarning": "<strong>Gofal:</strong> Mae'r ddalen hon wedi ei chloi fel mai dim ond defnyddwyr â [[Special:ListGroupRights|hawliau arbennig]] all olygu, gan fod y ddalen yn cael ei dynnu i fewn i'r {{PLURAL:$1|ddalen|dalennau}} canlynol:",
        "titleprotectedwarning": "'''RHYBUDD:  Mae'r dudalen hon wedi ei chloi; dim ond rhai defnyddwyr sydd â'r [[Special:ListGroupRights|gallu]] i'w chreu.'''\nDyma'r cofnod lòg diweddaraf, er gwybodaeth:",
        "templatesused": "Defnyddir y {{PLURAL:$1|nodyn hwn|nodyn hwn|nodiadau hyn|nodiadau hyn|nodiadau hyn|nodiadau hyn}} yn y dudalen hon:",
        "templatesusedpreview": "Defnyddir y {{PLURAL:$1|nodyn hwn|nodyn hwn|nodiadau hyn|nodiadau hyn|nodiadau hyn|nodiadau hyn}} yn y rhagolwg hwn:",
index f7796da..9c8a5d5 100644 (file)
        "prefs-help-email": "Die Angabe einer E-Mail-Adresse ist optional, ermöglicht aber die Zusendung eines Ersatzpasswortes, sofern Sie Ihr Passwort vergessen haben.",
        "prefs-help-email-others": "Mit anderen Benutzern können Sie auch über die Benutzerdiskussionsseiten Kontakt aufnehmen, ohne dass Sie Ihre Identität offenlegen müssen.",
        "prefs-help-prefershttps": "Diese Einstellung wird bei Ihrer nächsten Anmeldung wirksam.",
-       "userrights-groups-help": "Sie können die Gruppenzugehörigkeit dieses Benutzers ändern:\n* Ein markiertes Kästchen bedeutet, dass der Benutzer Mitglied dieser Gruppe ist.\n* Ein nichtmarkiertes Kästchen bedeutet, dass der Benutzer nicht Mitglied dieser Gruppe ist.\n* Ein * bedeutet, dass Sie das Benutzerrecht nach Erteilung nicht wieder zurücknehmen können (oder umgekehrt).",
+       "userrights-groups-help": "Sie können die Gruppenzugehörigkeit {{GENDER:$1|dieses Benutzers|dieser Benutzerin}} ändern:\n* Ein markiertes Kästchen bedeutet, dass {{GENDER:$1|der Benutzer|die Benutzerin}} Mitglied dieser Gruppe ist.\n* Ein nicht markiertes Kästchen bedeutet, dass {{GENDER:$1|der Benutzer|die Benutzerin}} nicht dieser Gruppe angehört.\n* Ein * bedeutet, dass Sie das Benutzerrecht nach Erteilung nicht wieder zurücknehmen können, oder umgekehrt.\n* Ein # bedeutet, dass Sie den Zeitpunkt des Ablaufs dieser Gruppenzugehörigkeit nur nach hinten verlegen können. Sie können ihn nicht vorverlegen.",
        "userrights-no-interwiki": "Sie haben nicht die erforderliche Berechtigung, um Benutzerrechte in anderen Wikis ändern zu können.",
        "userrights-changeable-col": "Gruppenzugehörigkeit, die Sie ändern dürfen",
        "userrights-unchangeable-col": "Gruppenzugehörigkeit, die Sie nicht ändern dürfen",
index cab15ae..8fc95fb 100644 (file)
        "category-empty": "''Diese Kategorie enthält zurzeit keine Seiten oder Medien.''",
        "hidden-categories": "{{PLURAL:$1|Versteckte Kategorie|Versteckte Kategorien}}",
        "hidden-category-category": "Versteckte Kategorien",
-       "category-subcat-count": "{{PLURAL:$2|Diese Kategorie enthält nur folgende Unterkategorie.|Diese Kategorie enthält {{PLURAL:$1|folgende Unterkategorie|die folgende $1 Unterkategorien}}, von $2 insgesamt.}}",
-       "category-subcat-count-limited": "Diese Kategorie enthält folgende {{PLURAL:$1|Unterkategorie|$1 Unterkategorien}}:",
+       "category-subcat-count": "{{PLURAL:$2|Diese Kategorie enthält die folgende Unterkategorie:|Diese Kategorie enthält die {{PLURAL:$1|folgende Unterkategorie|folgenden $1 Unterkategorien}} ($2 insgesamt):}}",
+       "category-subcat-count-limited": "Diese Kategorie enthält die {{PLURAL:$1|folgende Unterkategorie|folgenden $1 Unterkategorien}}:",
        "category-article-count": "{{PLURAL:$2|Diese Kategorie enthält nur die folgende Seite.|Folgende {{PLURAL:$1|Seite ist| $1 Seiten sind}} in dieser Kategorie, von $2 insgesamt.}}",
        "category-article-count-limited": "{{PLURAL:$1|Folgende Seite ist|Die folgenden $1 Seiten sind}} in dieser Kategorie enthalten:",
        "category-file-count": "{{PLURAL:$2|Diese Kategorie enthält nur folgende Datei.|Folgende {{PLURAL:$1|Datei ist|$1 Dateien sind}} in dieser Kategorie, von $2 insgesamt.}}",
        "converter-manual-rule-error": "Bei der manuellen Sprachkonvertierungsregel wurde ein Fehler entdeckt.",
        "undo-success": "Die Bearbeitung kann rückgängig gemacht werden.\nBitte prüfe den Vergleich unten, um sicherzustellen, dass du dies tun möchtest, und speichere dann unten deine Änderungen, um die Bearbeitung rückgängig zu machen.",
        "undo-failure": "Die Änderung konnte nicht rückgängig gemacht werden, da der betroffene Abschnitt zwischenzeitlich verändert wurde.",
+       "undo-main-slot-only": "Die Bearbeitung konnte nicht rückgängig gemacht werden, da sie Inhalte außerhalb der Hauptspalte enthält.",
        "undo-norev": "Die Bearbeitung konnte nicht rückgängig gemacht werden, da sie nicht vorhanden ist oder gelöscht wurde.",
        "undo-nochange": "Anscheinend wurde diese Bearbeitung bereits rückgängig gemacht.",
        "undo-summary": "Änderung $1 von [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskussion]]) rückgängig gemacht.",
        "userrights-groupsmember": "Mitglied von:",
        "userrights-groupsmember-auto": "Automatisch Mitglied von:",
        "userrights-groupsmember-type": "$2",
-       "userrights-groups-help": "Du kannst die Gruppenzugehörigkeit {{GENDER:$1|dieses Benutzers|dieser Benutzerin}} ändern:\n* Ein markiertes Kästchen bedeutet, dass {{GENDER:$1|der Benutzer|die Benutzerin}} Mitglied dieser Gruppe ist.\n* Ein nicht markiertes Kästchen bedeutet, dass {{GENDER:$1|der Benutzer|die Benutzerin}} nicht Mitglied dieser Gruppe ist.\n* Ein * bedeutet, dass du das Benutzerrecht nach Erteilung nicht wieder zurücknehmen kannst (oder umgekehrt).\n* Ein # bedeutet, dass du den Zeitpunkt des Ablaufs dieser Gruppenmitgliedschaft nur nach hinten verschieben kannst. Du kannst ihn nicht vorverlegen.",
+       "userrights-groups-help": "Du kannst die Gruppenzugehörigkeit {{GENDER:$1|dieses Benutzers|dieser Benutzerin}} ändern:\n* Ein markiertes Kästchen bedeutet, dass {{GENDER:$1|der Benutzer|die Benutzerin}} Mitglied dieser Gruppe ist.\n* Ein nicht markiertes Kästchen bedeutet, dass {{GENDER:$1|der Benutzer|die Benutzerin}} nicht dieser Gruppe angehört.\n* Ein * bedeutet, dass du das Benutzerrecht nach Erteilung nicht wieder zurücknehmen kannst, oder umgekehrt.\n* Ein # bedeutet, dass du den Zeitpunkt des Ablaufs dieser Gruppenzugehörigkeit nur nach hinten verlegen kannst. Du kannst ihn nicht vorverlegen.",
        "userrights-reason": "Grund:",
        "userrights-no-interwiki": "Du hast nicht die erforderliche Berechtigung, um Benutzerrechte in anderen Wikis ändern zu können.",
        "userrights-nodatabase": "Die Datenbank $1 ist nicht vorhanden oder nicht lokal.",
        "rcfilters-activefilters": "Aktive Filter",
        "rcfilters-activefilters-hide": "Ausblenden",
        "rcfilters-activefilters-show": "Anzeigen",
+       "rcfilters-activefilters-hide-tooltip": "Bereich der aktiven Filter ausblenden",
+       "rcfilters-activefilters-show-tooltip": "Bereich der aktiven Filter anzeigen",
        "rcfilters-advancedfilters": "Erweiterte Filter",
        "rcfilters-limit-title": "Anzuzeigende Ergebnisse",
        "rcfilters-limit-and-date-label": "{{PLURAL:$1|Eine Änderung|$1 Änderungen}}, $2",
index 152ca60..bcb2ab9 100644 (file)
        "rcfilters-other-review-tools": "Άλλα εργαλεία ελέγχου",
        "rcfilters-group-results-by-page": "Ομαδοποίηση αποτελεσμάτων ανά σελίδα",
        "rcfilters-activefilters": "Ενεργά φίλτρα",
+       "rcfilters-activefilters-hide": "Απόκρυψη",
+       "rcfilters-activefilters-show": "Εμφάνιση",
        "rcfilters-advancedfilters": "Σύνθετα Φίλτρα",
        "rcfilters-limit-title": "Αλλαγές προς εμφάνιση",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|αλλαγή|αλλαγές}}, $2",
        "rcfilters-savedqueries-rename": "Μετονομασία",
        "rcfilters-savedqueries-setdefault": "Ορισμός ως προεπιλογή",
        "rcfilters-savedqueries-unsetdefault": "Αφαίρεση από προεπιλογή",
-       "rcfilters-savedqueries-remove": "Î\91Ï\86αίÏ\81εÏ\83η",
+       "rcfilters-savedqueries-remove": "Î\94ιαγÏ\81αÏ\86ή",
        "rcfilters-savedqueries-new-name-label": "Όνομα",
        "rcfilters-savedqueries-new-name-placeholder": "Περιγράψτε το σκοπό του φίλτρου",
        "rcfilters-savedqueries-apply-label": "Δημιουργία φίλτρου",
        "rcfilters-empty-filter": "Χωρίς ενεργά φίλτρα. Εμφανίζονται όλες οι συνεισφορές.",
        "rcfilters-filterlist-title": "Φίλτρα",
        "rcfilters-filterlist-whatsthis": "Πως λειτουργούν αυτά;",
-       "rcfilters-filterlist-feedbacklink": "Πείτε μας τι σκέφτεστε για αυτά τα (νέα) εργαλεία φιλτραρίσματος",
+       "rcfilters-filterlist-feedbacklink": "Πείτε μας τι σκέφτεστε για αυτά τα εργαλεία φιλτραρίσματος",
        "rcfilters-highlightbutton-title": "Επισήμανση αποτελεσμάτων",
        "rcfilters-highlightmenu-title": "Επιλέξτε ένα χρώμα",
        "rcfilters-highlightmenu-help": "Επιλέξτε ένα χρώμα για να επισημάνετε αυτή την ιδιότητα",
        "confirm-unwatch-top": "Κατάργηση αυτής της σελίδας από τη λίστα παρακολούθησης σας;",
        "confirm-rollback-button": "Εντάξει",
        "confirm-rollback-top": "Επαναφέρετε τις επεξεργασίες σε αυτή τη σελίδα;",
-       "semicolon-separator": ",&#32,",
+       "semicolon-separator": "•&#32;",
        "quotation-marks": "«$1»",
        "imgmultipageprev": "← προηγούμενη σελίδα",
        "imgmultipagenext": "επόμενη σελίδα →",
index 86a05f0..715f275 100644 (file)
        "converter-manual-rule-error": "Error detected in manual language conversion rule",
        "undo-success": "The edit can be undone.\nPlease check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.",
        "undo-failure": "The edit could not be undone due to conflicting intermediate edits.",
+       "undo-main-slot-only": "The edit could not be undone because it involves content outside the main slot.",
        "undo-norev": "The edit could not be undone because it does not exist or was deleted.",
        "undo-nochange": "The edit appears to have already been undone.",
        "undo-summary": "Undo revision $1 by [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]])",
        "rcfilters-activefilters": "Active filters",
        "rcfilters-activefilters-hide": "Hide",
        "rcfilters-activefilters-show": "Show",
+       "rcfilters-activefilters-hide-tooltip": "Hide Active Filters area",
+       "rcfilters-activefilters-show-tooltip": "Show Active Filters area",
        "rcfilters-advancedfilters": "Advanced filters",
        "rcfilters-limit-title": "Results to show",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|change|changes}}, $2",
index cc44a70..95f0955 100644 (file)
        "expansion-depth-exceeded-category": "Páginas que sobrepasan la profundidad de expansión",
        "expansion-depth-exceeded-category-desc": "Esta página sobrepasa la profundidad de expansión máxima.",
        "expansion-depth-exceeded-warning": "La página ha sobrepasado el límite de profundidad de expansión",
-       "parser-unstrip-loop-warning": "Se ha detectado un bucle en la función \"unstrip\"",
-       "unstrip-depth-warning": "Se ha superado el límite de recursividad de la función \"unstrip\" ($1)",
+       "parser-unstrip-loop-warning": "Se ha detectado un bucle en la función «unstrip»",
+       "unstrip-depth-warning": "Se ha superado el límite de recursividad de la función «unstrip» ($1)",
+       "unstrip-depth-category": "Páginas en que se excede el límite de profundidad de la función «unstrip»",
+       "unstrip-size-warning": "Se excedió el límite de tamaño de la función «unstrip» ($1)",
+       "unstrip-size-category": "Páginas en que se excede el límite de tamaño de la función «unstrip»",
        "converter-manual-rule-error": "Se ha detectado un error en una regla manual de conversión de idioma",
        "undo-success": "Puedes deshacer la edición. Antes de deshacer la edición, comprueba la siguiente comparación para verificar que realmente es lo que quieres hacer, y entonces guarda los cambios para así efectuar la reversión.",
        "undo-failure": "No se ha podido deshacer la edición ya que otro usuario ha realizado una edición intermedia.",
        "rcfilters-activefilters": "Filtros activos",
        "rcfilters-activefilters-hide": "Ocultar",
        "rcfilters-activefilters-show": "Mostrar",
+       "rcfilters-activefilters-hide-tooltip": "Ocultar apartado Filtros activos",
+       "rcfilters-activefilters-show-tooltip": "Mostrar apartado Filtros activos",
        "rcfilters-advancedfilters": "Filtros avanzados",
        "rcfilters-limit-title": "Resultados que mostrar",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|cambio|cambios}}, $2",
        "rcfilters-preference-label": "Ocultar la versión mejorada de Cambios recientes",
        "rcfilters-preference-help": "Revierte el rediseño de interfaz de 2017 y desactiva todas las herramientas añadidas desde entonces.",
        "rcfilters-watchlist-preference-label": "Ocultar la versión mejorada de la lista de seguimiento",
+       "rcfilters-watchlist-preference-help": "Revierte el rediseño de la interfaz de 2017 e indisponibiliza todas las herramientas añadidas desde entonces.",
        "rcfilters-filter-showlinkedfrom-label": "Mostrar cambios en páginas enlazadas desde",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>Páginas enlazadas desde</strong> la página seleccionada",
        "rcfilters-filter-showlinkedto-label": "Mostrar cambios en páginas que enlazan a",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|byte|bytes}}",
        "limitreport-expansiondepth": "Profundidad máxima de expansión",
        "limitreport-expensivefunctioncount": "Cuenta de la función expansiva del analizador",
+       "limitreport-unstrip-depth": "Profundidad de recursión de función «unstrip»",
        "limitreport-unstrip-size-value": "$1/$2 {{PLURAL:$2|byte|bytes}}",
        "expandtemplates": "Expandir plantillas",
        "expand_templates_intro": "Esta página especial toma un texto wiki y expande todas sus plantillas recursivamente.\nTambién expande las funciones sintácticas como <code><nowiki>{{</nowiki>#language:…}}</code>, y variables como\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>. De hecho, expande casi cualquier cosa que esté entre llaves dobles.",
index 3dd307e..d51ca07 100644 (file)
@@ -32,7 +32,8 @@
                        "Mikel Ibaiba",
                        "MarcoAurelio",
                        "Iñaki LL",
-                       "Amaia"
+                       "Amaia",
+                       "Matěj Suchánek"
                ]
        },
        "tog-underline": "Azpimarratu loturak:",
        "subject-preview": "Gaiaren aurrebista:",
        "previewerrortext": "Errore bat gertatu da aldaketak aurrezten saiatzean.",
        "blockedtitle": "Erabiltzailea blokeatuta dago",
-       "blockedtext": "<strong> Zure erabiltzaile izena edo IP helbidea blokeatuta dago. </strong>\n\nBlokeoa $1-ek ezarri du.\nEmandako arrazoia hau da: ''$2''.\n\n* Blokeoaren hasiera: $8\n* Blokeoaren bukaera: $6\n* Blokeatua: $7\n\nBlokeoa eztabaidatzeko, $1 edo beste [[{{MediaWiki:Grouppage-sysop}}|administratzaile]] batekin jarri zaitezke kontaktuan.\nEzingo duzu \"{{int:emailuser}}\" funtzioa erabili[[Special:Preferences|hobespenetan]] baliozkoa den helbide elektroniko bat izan ezean, eta tresna hori erabiltzeko aukera blokeatuta ez baduzu.\nOrain duzun IP helbidea $3 da, eta blokeoaren zenbakia #$5.\nMesedez, eman aipatutako datu hauek guztiak, blokeoari buruzko edozein eskaera egitean.",
-       "autoblockedtext": "Zure IP helbidea automatikoki blokeaturik dago, $1 administratzaileak blokeatutako beste wikilari batek erabili zuelako. Emandako arrazoia hau da:\n\n:''$2''\n\n* Blokeoaren hasiera: $8\n* Blokeoaren bukaera: $6\n* Blokeatua: $7\n\nBlokeoari buruz eztabaidatzeko, jo ezazu $1 administratzailearengana edo beste [[{{MediaWiki:Grouppage-sysop}}|administratzaile]] batengana.\n\n«Bidali mezu elektronikoa lankide honi» tresna erabili ahal izateko, ezinbestekoa da zure [[Special:Preferences|hobespenetan]] baliozkoa den helbide elektroniko bat emanda izatea, eta tresna hori erabiltzeko aukera zuri blokeatu ez izana.\n\nOrain duzun IP helbidea $3 da, eta blokeoaren zenbakia #$5 da.\n\nEman itzazu datu hauek guztiak, blokeoari buruzko edozein eskaera egitean.",
+       "blockedtext": "<strong> Zure erabiltzaile izena edo IP helbidea blokeatuta dago. </strong>\n\nBlokeoa $1-ek ezarri du.\nEmandako arrazoia hau da: ''$2''.\n\n* Blokeoaren hasiera: $8\n* Blokeoaren bukaera: $6\n* Blokeatua: $7\n\nBlokeoari buruz eztabaidatzeko, jo ezazu $1 edo beste [[{{MediaWiki:Grouppage-sysop}}|administratzaile]] batengana.\n\"{{int:emailuser}}\" tresna erabili ahal izateko, ezinbestekoa da zure [[Special:Preferences|hobespenetan]] baliozkoa den helbide elektroniko bat emanda izatea, eta tresna hori erabiltzeko aukera blokeatu ez izana.\nOrain duzun IP helbidea $3 da, eta blokeoaren zenbakia #$5.\nMesedez, eman aipatutako datu hauek guztiak, blokeoari buruzko edozein eskaera egitean.",
+       "autoblockedtext": "Zure IP helbidea automatikoki blokeaturik dago, $1-ek blokeatutako beste erabiltzaile batek erabili zuelako. Emandako arrazoia hau da:\n\n:<em>$2</em>\n\n* Blokeoaren hasiera: $8\n* Blokeoaren bukaera: $6\n* Blokeatua: $7\n\nBlokeoari buruz eztabaidatzeko, jo ezazu $1 edo beste [[{{MediaWiki:Grouppage-sysop}}|administratzaile]] batengana.\n\n\"{{int:emailuser}}\" tresna erabili ahal izateko, ezinbestekoa da zure [[Special:Preferences|hobespenetan]] baliozkoa den helbide elektroniko bat emanda izatea, eta tresna hori erabiltzeko aukera blokeatu ez izana.\n\nOrain duzun IP helbidea $3 da, eta blokeoaren zenbakia #$5.\n\nMesedez, eman itzazu aipatutako datu guztiak, blokeoari buruzko edozein eskaera egitean.",
        "systemblockedtext": "Zure erabiltzaile izena edo IP helbidea MediaWiki-k automatikoki blokeatu du.\nHau da emandako arrazoia:\n\n:<em>$2</em>\n\n*Bloke sarrera: $8\n*Blokearen iraungintzea: $6\n*Blokeo helburua: $7\n\nZure uneko IP helbidea: $3.\nSartu goiko xehetasun guztiak egiten dituzun kontsulta guztietan mesedez.",
        "blockednoreason": "ez da arrazoirik zehaztu",
        "whitelistedittext": "$1 behar duzu orrialdeak aldatu ahal izateko..",
        "blocked-notice-logextract": "Erabiltzaile hau blokeatuta dago une honetan.\nAzken blokeoaren erregistroa ageri da behean, erreferentzia gisa:",
        "clearyourcache": "<strong>Oharra:</strong> Gorde ondoren, zure nabigatzailearen katxea ekidin beharko duzu aldaketak ikusteko.\n* <strong>Firefox / Safari:</strong> <em>Shift</em> tekla sakatu birkargatzeko momentuan, edo <em>Ctrl-Shift-R</em> edo <em>Crtl-F5</em>  sakatu (<em>⌘-R</em> Mac batean)\n* <strong>Google Chrome:</strong> <em>Ctrl-Shift-R </em>  sakatu (<em>⌘-Shift-R</em> Mac batean)\n* <strong>Internet Explorer:</strong> <em>Ctrl</em> tekla sakatu birkargatzeko momentuan, edo <em>Ctrl-F5</em> sakatu\n* <strong>Opera</strong> erabiltzaileek <em>Tresnak → Hobespenak</em> atalera joan eta katxea garbitzeko aukera hautatu",
        "usercssyoucanpreview": "'''Laguntza:''' Zure CSS berria gorde aurretik probatzeko \"{{int:showpreview}}\" botoia erabili.",
+       "userjsonyoucanpreview": "<strong>Aholkua:</strong> Gorde aurretik, erabili \"{{int:showpreview}}\" botoia zure JSON berria probatzeko.",
        "userjsyoucanpreview": "'''Laguntza:''' Zure JS berria gorde aurretik probatzeko \"{{int:showpreview}}\" botoia erabili.",
        "usercsspreview": "'''Ez ahaztu zure CSS kodea aurreikusten zabiltzala.'''\n'''Oraindik gorde gabe dago!'''",
+       "userjsonpreview": "<strong>Gogoratu zure JSON erabiltzaile konfigurazioa probatzen/aurreikusten ari zarela. \nOraindik ez da gorde!</strong>",
        "userjspreview": "'''Gogoratu zure JavaScript kodea probatu/aurreikusten zabiltzala, oraindik ez da gorde!'''",
        "sitecsspreview": "'''Ez ahaztu zure CSS kodea aurreikusten zabiltzala.'''\n'''Oraindik gorde gabe dago!'''",
+       "sitejsonpreview": "<strong>Gogoratu JSON konfigurazio hau probatzen/aurreikusten baino ez zaudela. \nOraindik ez da gorde!</strong>",
        "sitejspreview": "'''Gogoratu zure JavaScript kodea probatu/aurreikusten zabiltzala'''\n'''Oraindik ez da gorde!'''",
-       "userinvalidconfigtitle": "'''Oharra:''' Ez da \"$1\" itxura existitzen. Kontuan izan .css eta .js fitxategi pertsonalizatuen izenak letra xehez idatzi behar direla; adibidez, {{ns:user}}:Adibide/vector.css, eta ez {{ns:user}}:Adibide/Vector.css.",
+       "userinvalidconfigtitle": "<strong>Oharra:</strong> Ez da \"$1\" itxura existitzen. Kontuan izan .css eta .js fitxategi pertsonalizatuen izenak letra xehez idatzi behar direla; adibidez, {{ns:user}}:Adibide/vector.css, eta ez {{ns:user}}:Adibide/Vector.css.",
        "updated": "(Eguneratua)",
        "note": "'''Oharra:'''",
        "previewnote": "'''Gogoratu hau aurrikuspen bat dela.'''\nZure aldaketak ez dira oraindik gorde!",
        "longpageerror": "'''Errorea: Bidali duzun testuak {{PLURAL:$1|kilobyte 1eko|$1 kilobyteko}} luzera du, eta {{PLURAL:$2|kilobyte 1eko|$2 kilobyteko}} maximoa baino luzeagoa da.'''\nEzin da gorde.",
        "readonlywarning": "<strong>Oharra: Datu-basea blokeatu egin da mantenu lanak burutzeko, beraz ezingo dituzu orain zure aldaketak gorde.</strong>I\nTestua fitxategi baten kopiatu dezakezu, eta beranduago erabiltzeko gorde.\n\nBlokeatu zuen administratzaileak honako azalpena eman zuen: $1",
        "protectedpagewarning": "'''Oharra:  Orri hau blokeatua dago administratzaileek soilik eraldatu ahal dezaten.'''\nAzken erregistroa ondoren ikusgai dago erreferentzia gisa:",
-       "semiprotectedpagewarning": "'''Oharra''': Orrialde hau erregistratutako erabiltzaileek bakarrik aldatzeko babestuta dago.\nErregistroko azken sarrera azpian jartzen da erreferentzia gisa:",
+       "semiprotectedpagewarning": "<strong>Oharra:</strong> Orrialde hau babestuta dago erregistratutako erabiltzaileek bakarrik aldatu ahal izateko.\nErregistroko azken sarrera jarraian ikusgarri dagoena da:",
        "cascadeprotectedwarning": "<strong>Oharra:</strong> Orrialde hau blokeatua izan da eta [[Special:ListGroupRights|baimen zehatzak]] dituzten erabiltzaileek baino ez dute berau aldatzeko ahalmena, honako {{PLURAL:$1|orrialdeko|orrialdeetako}} kaskada-babesean txertatuta dagoelako:",
        "titleprotectedwarning": "'''Oharra: Orrialde hau blokeatuta dago eta bakarrik [[Special:ListGroupRights|erabiltzaile batzuek]] sortu dezakete.'''\nAzken erregistroko sarrera ematen da azpian erreferentzia gisa:",
        "templatesused": "Orri honetan erabiltzen {{PLURAL:$1|den txantiloia|diren txantiloiak}}:",
        "expansion-depth-exceeded-warning": "Espantsio sakonera gainditu duten orrialdeak",
        "parser-unstrip-loop-warning": "Loop unstrip bat aurkitu da",
        "unstrip-depth-warning": "Unstrip errekurtsio limitea gainditu da ($1)",
+       "unstrip-depth-category": "Unstrip depth limitea gainditutako orrialdeak.",
+       "unstrip-size-warning": "Unstrip tamaina limitea gainditua ($1)",
+       "unstrip-size-category": "Unstrip tamaina limitea gainditutako orrialdeak.",
        "converter-manual-rule-error": "Akatsa aurkitu da hizkuntzen eskuszko konbertsio arauan",
        "undo-success": "Aldaketa desegin daiteke.\nMesedez beheko alderaketa egiaztatu, egin nahi duzuna hori dela frogatzeko, eta ondoren azpiko aldaketak gorde, aldaketa desegiten amaitzeko.",
        "undo-failure": "Ezin izan da aldaketa desegin tarteko aldaketekin gatazkak direla-eta.",
        "prefs-watchlist-edits": "Ikuspen zerrendan erakutsi beharreko aldaketa gehienezko kopurua:",
        "prefs-watchlist-edits-max": "Gehenezko zenbakia: 1000",
        "prefs-watchlist-token": "Jarraipen zerrendaren tokena:",
-       "prefs-watchlist-managetokens": "Kudeatu token-ak",
+       "prefs-watchlist-managetokens": "Token-ak kudeatu",
        "prefs-misc": "Denetarik",
        "prefs-resetpass": "Pasahitza aldatu",
        "prefs-changeemail": "Aldatu edo kendu e-mail helbidea",
        "stub-threshold-disabled": "Ezgaitua",
        "recentchangesdays": "Aldaketa berrietan erakutsi beharreko egun kopurua:",
        "recentchangesdays-max": "(gehienez {{PLURAL:$1|egun bat|$1 egun}})",
-       "recentchangescount": "Erakusteko aldaketa kopurua, lehenetsita:",
-       "prefs-help-recentchangescount": "Honek azken aldaketak, orrialdeen historiak eta logak barne-biltzen ditu.",
+       "recentchangescount": "Modu lehenetsian erakutsi beharreko zuzneketa kopurua azken aldaketa, orrialdeen historia eta erregistroetan:",
+       "prefs-help-recentchangescount": "Gehienezko zenbakia: 1000",
        "prefs-help-watchlist-token2": "Hau da zure jarraipen zerrendako web jarioaren giltza sekretua.\nEzagutzen duen orok zure jarraipen zerrenda irakurtzeko aukera izango du, ez partekatu.\n[[Special:ResetTokens|berrezarri dezakezu]].",
+       "prefs-help-tokenmanagement": "Zure jarraipen zerrenda Web bidez ikustea ahalbidetzen dizun ezkutuko kodea ikusi eta berrezarri dezakezu. Kodea ezagutzen duen edonork irakur dezake zure jarraipen zerrenda, beraz ez partekatu.",
        "savedprefs": "Zure hobespenak gorde egin dira.",
        "savedrights": "{{GENDER:$1|$1}} erabiltzailearen taldeak gorde dira.",
        "timezonelegend": "Ordu-eremua:",
        "default": "lehenetsia",
        "prefs-files": "Fitxategiak",
        "prefs-custom-css": "CSS pertsonalizatua",
+       "prefs-custom-json": "JSON pertsonalizatua",
        "prefs-custom-js": "JS pertsonalizatua",
-       "prefs-common-config": "Azal mota guztietan elkarbanatutako CSS/JS:",
+       "prefs-common-config": "CSS/JSON/JavaScript azal guztietarako partekatuak:",
        "prefs-reset-intro": "Orrialde hau erabil dezakezu zure guneko berezko hobespenak berreskuratzeko.\nHau ezin da desegin.",
        "prefs-emailconfirm-label": "E-posta baieztapena:",
        "youremail": "E-posta:",
        "right-editcontentmodel": "Aldatu orri bateko eduki eredua",
        "right-editinterface": "Erabiltzailearen interfazea aldatu",
        "right-editusercss": "Beste lankideen CSS fitxategiak aldatu",
+       "right-edituserjson": "Beste erabiltzaileen JSON fitxategiak aldatu",
        "right-edituserjs": "Beste lankideen JS fitxategiak aldatu",
        "right-editmyusercss": "Aldatu zure CSS fitxategi propioak",
+       "right-editmyuserjson": "Zure erabiltzaile JSON fitxategi propioak aldatu",
        "right-editmyuserjs": "Aldatu zure JavaScript fitxategi propioak",
        "right-viewmywatchlist": "Zure jarraipen zerrenda ikusi",
        "right-editmywatchlist": "Zure jarraipen zerrenda aldatu. Kontuan izan ekintza batzuek orrialdeak gehitu dituztela eskumen hau kenduta ere.",
        "grant-createeditmovepage": "Orrialdeak sortu, aldatu eta mugitu",
        "grant-delete": "Ezabatu orriak, berrikuspenak eta sarrerak",
        "grant-editinterface": "MediaWiki izen eremua eta CSS/JavaScript erabiltzailea aldatu",
-       "grant-editmycssjs": "Zure CSS/JavaScript aldatu",
+       "grant-editmycssjs": "Zure CSS/JSON/JavaScript erabiltzailea aldatu",
        "grant-editmyoptions": "Aldatu zure hobespenak",
        "grant-editmywatchlist": "Zure jarraipen zerrenda aldatu",
        "grant-editpage": "Aldatu dauden orrialdeak",
        "rcfilters-other-review-tools": "Beste berrikusketa tresnak",
        "rcfilters-group-results-by-page": "Talde emaitzak orrika",
        "rcfilters-activefilters": "Iragazki aktiboak",
+       "rcfilters-activefilters-hide": "Ezkutatu",
+       "rcfilters-activefilters-show": "Erakutsi",
+       "rcfilters-activefilters-hide-tooltip": "Ezkutatze Iragazki Aktiboen eremua",
+       "rcfilters-activefilters-show-tooltip": "Erakuste Iragazki Aktiboen eremua",
        "rcfilters-advancedfilters": "Iragazki aurreratuak",
        "rcfilters-limit-title": "Erakusteko emaitzak",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|aldaketa|aldaketak}}, $2",
        "rcfilters-savedqueries-rename": "Berrizendatu",
        "rcfilters-savedqueries-setdefault": "Lehenetsi",
        "rcfilters-savedqueries-unsetdefault": "Kendu lehenetsi gisa",
-       "rcfilters-savedqueries-remove": "Kendu",
+       "rcfilters-savedqueries-remove": "Ezabatu",
        "rcfilters-savedqueries-new-name-label": "Izena",
        "rcfilters-savedqueries-new-name-placeholder": "Deskribatu filtro honen helburua",
        "rcfilters-savedqueries-apply-label": "Sortu iragazkia",
        "rcfilters-empty-filter": "Filtro aktiborik ez dago. Ekarpen guztiak erakusten.",
        "rcfilters-filterlist-title": "Iragazkiak",
        "rcfilters-filterlist-whatsthis": "Nola erabiltzen da?",
-       "rcfilters-filterlist-feedbacklink": "Esaguzu zer pentsatzen duzun iragazteko tresna hauei buruz (berriak)",
+       "rcfilters-filterlist-feedbacklink": "Esaiguzu zer deritzozun iragazteko tresna hauei buruz",
        "rcfilters-highlightbutton-title": "Nabarmendu emaitzak",
        "rcfilters-highlightmenu-title": "Hautatu kolore bat",
        "rcfilters-highlightmenu-help": "Aukeratu kolore bat propietate hau nabarmentzeko",
        "rcfilters-filter-humans-label": "Gizaki (ez bot)",
        "rcfilters-filter-humans-description": "Gizaki editoreek egindako aldaketak.",
        "rcfilters-filtergroup-reviewstatus": "Berrikuspenaren egoera",
+       "rcfilters-filter-reviewstatus-unpatrolled-description": "Ez eskuz ezta automatikoki berrikusitako bezala markatutako aldaketak.",
        "rcfilters-filter-reviewstatus-unpatrolled-label": "Patruilagabea",
+       "rcfilters-filter-reviewstatus-manual-description": "Berrikusitako bezala eskuz markatutako aldaketak",
        "rcfilters-filter-reviewstatus-manual-label": "Eskuz patruilatuak",
+       "rcfilters-filter-reviewstatus-auto-description": "Erabiltzaile aurreratuek aldatuak, zeintzuen lanak automatikoki markatzen diren berrikusitako bezala.",
+       "rcfilters-filter-reviewstatus-auto-label": "Autoberrikusia",
        "rcfilters-filtergroup-significance": "Munta",
        "rcfilters-filter-minor-label": "Aldaketa txikiak",
        "rcfilters-filter-minor-description": "Egileak sailkatutako aldaketa txikiak.",
        "rcfilters-watchlist-showupdated": "Azkenengo aldaketak egin zirenetik bisitatu ez dituzun orrietan eman diren aldaketak <strong>lodi estiloan</strong> daude, markatzaile sendoekin.",
        "rcfilters-preference-label": "Azkenengo Aldaketen hobetutako bertsioa ezkutatu",
        "rcfilters-preference-help": "2017 interfazearen birmoldaketa eta geroztik gehitu diren tresna guztietara bueltatzen da.",
+       "rcfilters-watchlist-preference-label": "Ezkutatu jarraipen zerrendaren bertsio hobetua",
+       "rcfilters-watchlist-preference-help": "Alderantzikatu 2017ko interfaze diseinu berria eta ordutik eta ordura arte gehitutako tresnak.",
        "rcfilters-filter-showlinkedfrom-label": "-tik linkatutako orrietako aldaketak erakutsi",
        "rcfilters-filter-showlinkedfrom-option-label": "hautatutako orritik <strong>linkatutako orriak</strong>",
        "rcfilters-filter-showlinkedto-label": "-ra linkatutako orrietako aldaketak erakutsi",
        "recentchangeslinked-feed": "Lotutako orrietako aldaketak",
        "recentchangeslinked-toolbox": "Lotutako orrietako aldaketak",
        "recentchangeslinked-title": "«$1»(e)kin harremanetan dauden aldaketak",
-       "recentchangeslinked-summary": "Sartu orrialde baten izena orrialdearekin lotutako edota orrialdetik lotutako orrialdeetan aldaketak ikusteko. (Kategoria baten kideak ikusteko, idatzi Kategoria: Kategoria izena). [[Special:Watchlist|Zure jarraipen zerrendan]] dauden orrietan aldaketak <strong>letra lodian</strong> daude.",
+       "recentchangeslinked-summary": "Sartu orrialde baten izena orrialdearekin lotutako edota orrialdetik lotutako orrialdeetan aldaketak ikusteko. (Kategoria baten kideak ikusteko, idatzi {{ns:category}}: Kategoria izena). [[Special:Watchlist|Zure jarraipen zerrendan]] dauden orrietan aldaketak <strong>letra lodian</strong> daude.",
        "recentchangeslinked-page": "Orriaren izena:",
        "recentchangeslinked-to": "Lotutako orrietarako aldaketak erakutsi emandako orriaren ordez",
        "recentchanges-page-added-to-category": "«[[:$1]]» gehitu da kategoriara",
        "protectedtitles-submit": "Izenburuak erakutsi",
        "listusers": "Erabiltzaileen zerrenda",
        "listusers-editsonly": "Aldaketak egin dituzten erabiltzaileak soilik erakutsi",
+       "listusers-temporarygroupsonly": "Behin-behineko erabiltzaile taldeetako erabiltzaileak bakarrik erakutsi.",
        "listusers-creationsort": "Sorrera dataren arabera sailkatu",
        "listusers-desc": "Beheranzko ordenean antolatu",
        "usereditcount": "{{PLURAL:$1|edizio bat|$1 edizio}}",
        "dellogpage": "Ezabaketa erregistroa",
        "dellogpagetext": "Behean ageri da azken ezabaketen zerrenda.",
        "deletionlog": "ezabaketa erregistroa",
+       "log-name-create": "Orri sorkuntzaren erregistroa",
+       "log-description-create": "Azpian, sortutako azken orrien zerrenda ageri da.",
        "reverted": "Lehenagoko berrikuspen batera itzuli da",
        "deletecomment": "Arrazoia:",
        "deleteotherreason": "Arrazoi gehigarria:",
        "logentry-move-move": "$1 {{GENDER:$2|wikilariak}} «$3» orria «$4» izenera aldatu du",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|wikilariak}} «$3» orria «$4» izenera aldatu du, birzuzenketarik utzi gabe",
        "logentry-move-move_redir": "$1 {{GENDER:$2|wikilariak}} «$3» orria «$4» izenera aldatu du, birzuzenketaren gainetik",
-       "logentry-move-move_redir-noredirect": "$1 {{GENDER:wikilariak}} «$3» orria «$4» izenera aldatu du, birbideratze bat gainidatzita, birbideratzerik utzi gabe",
+       "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|wikilariak}} «$3» orria «$4» izenera aldatu du, birbideratze bat gainidatzita, birbideratzerik utzi gabe",
        "logentry-patrol-patrol": "$1(e)k $3 orrialdearen $4 berrikuspena patruilatutzat {{GENDER:$2|markatu}} du",
        "logentry-patrol-patrol-auto": "$1(e)k $3 orrialdearen $4 berrikuspena patruilatutzat {{GENDER:$2|markatu}} du",
        "logentry-newusers-newusers": "$1 erabiltzaile kontua {{GENDER:$2|sortu da}}",
        "limitreport-templateargumentsize-value": "{{PLURAL:$2|byte $1/$2|$1/$2 byte}}",
        "limitreport-expansiondepth": "Gehienezko espantsio sakonera",
        "limitreport-expensivefunctioncount": "Parser funtzio kontaketa garestia",
+       "limitreport-unstrip-depth": "Unstrip errekurtsio sakona",
        "expandtemplates": "Txantiloi ordezkatzailea",
        "expand_templates_intro": "Orri berezi honek wiki-testua hartu eta txantiloi guztiak modu errekurtsiboan zabaltzen ditu.\nOnartutako funtzio sintaktikoak ere ordezkatzen ditu, hala nola\n<code><nowiki>{{</nowiki>#language:…}}</code>; eta aldagaiak ere, hala nola\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nIzan ere, kortxete bikoitzen arteko ia edozer zabaltzen du.",
        "expand_templates_title": "Izenburua ({{FULLPAGENAME}} ordezkatzeko, eta abar):",
        "pagedata-title": "Orri data",
        "pagedata-text": "Orrialde honek orrien interfaze datuak eskaintzen ditu. Eman orrialdearen izenburua URLan, azpiorri sintaxia erabiliz.\n*Edukiaren negoziazioa zure bezeroaren onarpen goiburuan oinarritzen erabiltzen da. Horrek esan nahi du orriaren datuak zure bezeroak nahiago duen formatuan emango direla.",
        "pagedata-not-acceptable": "Bat egiten duen formaturik ez da aurkitu. Onartutako MIME motak: $1",
-       "pagedata-bad-title": "Izenburu baliogabea: $1"
+       "pagedata-bad-title": "Izenburu baliogabea: $1",
+       "unregistered-user-config": "Segurtasun arrazoiengatik JavaScript, CSS eta JSON erabiltzaile azpiorriak ezin dira kargatu erregistratu gabeko erabiltzaileen orrietan.",
+       "passwordpolicies": "Pasahitzen inguruko politika",
+       "passwordpolicies-summary": "Hona wiki honetako erabiltzaile taldeentzako pasahitzen politikaren zerrenda.",
+       "passwordpolicies-group": "Taldea",
+       "passwordpolicies-policies": "Politikak",
+       "passwordpolicies-policy-minimalpasswordlength": "Pasahitzak gutxienez {{PLURAL:$1|kraktere $1eko|$1 karaktereko}} luzera izan behar du",
+       "passwordpolicies-policy-minimumpasswordlengthtologin": "Pasahitzak gutxienez {{PLURAL:$1|kraktere $1eko|$1 karaktereko}} luzera izan behar du saioa hasi ahal izateko",
+       "passwordpolicies-policy-passwordcannotmatchusername": "Pasahitza ezin da erabiltzaile izenaren berdina izan",
+       "passwordpolicies-policy-passwordcannotmatchblacklist": "Pasahitza ezin da zerrenda beltzean zehaztutakoren bat izan"
 }
index 060a61b..24064d6 100644 (file)
        "rcfilters-other-review-tools": "Muut arviointityökalut",
        "rcfilters-group-results-by-page": "Ryhmitä tulokset sivujen mukaan",
        "rcfilters-activefilters": "Aktiiviset suodattimet",
+       "rcfilters-activefilters-hide": "Piilota",
+       "rcfilters-activefilters-show": "Näytä",
        "rcfilters-advancedfilters": "Kehittyneet suodattimet",
        "rcfilters-limit-title": "Näytettävät tulokset",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|muutos|muutosta}}, $2",
        "rcfilters-empty-filter": "Ei aktiivisia suodattimia. Kaikki muutokset näytetään.",
        "rcfilters-filterlist-title": "Suodattimet",
        "rcfilters-filterlist-whatsthis": "Miten nämä toimivat?",
-       "rcfilters-filterlist-feedbacklink": "Kerro mielipiteesi (uusista) suodattimista",
+       "rcfilters-filterlist-feedbacklink": "Kerro mielipiteesi näistä suodatintyökaluista",
        "rcfilters-highlightbutton-title": "Korosta tulokset",
        "rcfilters-highlightmenu-title": "Valitse väri",
        "rcfilters-highlightmenu-help": "Valitse korostusväri tälle ominaisuudelle",
        "dellogpage": "Poistoloki",
        "dellogpagetext": "Alla on loki viimeisimmistä poistoista.",
        "deletionlog": "poistoloki",
+       "logentry-create-create": "$1 {{GENDER:$2|loi}} sivun $3",
        "reverted": "Palautettu aikaisempaan versioon",
        "deletecomment": "Syy:",
        "deleteotherreason": "Muu syy tai tarkennus:",
index a81a622..6da8aae 100644 (file)
        "password-login-forbidden": "L’utilisation de ce nom d’utilisateur ou de ce mot de passe a été interdite.",
        "mailmypassword": "Réinitialiser le mot de passe",
        "passwordremindertitle": "Nouveau mot de passe temporaire pour {{SITENAME}}",
-       "passwordremindertext": "Quelqu’un (depuis l’adresse IP $1) a demandé un nouveau mot de\npasse pour {{SITENAME}} ($4). Un mot de passe temporaire pour l’utilisateur\n« $2 » a été créé et est « $3 ». Si cela était votre intention,\nvous devrez vous connecter et choisir un nouveau mot de passe.\nVotre mot de passe temporaire expirera dans $5 jour{{PLURAL:$5||s}}.\n\nSi vous n’êtes pas l’auteur de cette demande, ou si vous vous souvenez à présent de\nvotre mot de passe et ne souhaitez plus en changer, vous pouvez ignorer ce message\net continuer à utiliser votre ancien mot de passe.",
+       "passwordremindertext": "Quelqu’un (depuis l’adresse IP $1) a demandé un nouveau mot de\npasse pour {{SITENAME}} ($4). Un mot de passe temporaire pour l’utilisateur\n« $2 » a été créé et est « $3 ». Si cela était votre intention,\nvous devrez vous connecter et choisir un nouveau mot de passe.\nVotre mot de passe temporaire expirera dans $5 jour{{PLURAL:$5||s}}.\n\nSi vous n’êtes pas l’auteur de cette demande, ou si vous vous avez retrouvé votre mot de passe et ne souhaitez plus en changer, vous pouvez ignorer ce message\net continuer à utiliser votre ancien mot de passe.",
        "noemail": "Aucune adresse de courriel n’a été enregistrée pour l’utilisat{{GENDER:$1|eur|rice}} « $1 ».",
        "noemailcreate": "Vous devez fournir une adresse de courriel valide",
        "passwordsent": "Un nouveau mot de passe a été envoyé à l’adresse de courriel de l’utilisat{{GENDER:$1|eur|rice}} « $1 ».\nVeuillez vous reconnecter après l’avoir reçu.",
        "resetpass-submit-loggedin": "Changer de mot de passe",
        "resetpass-submit-cancel": "Annuler",
        "resetpass-wrong-oldpass": "Mot de passe actuel ou temporaire invalide.\nVous avez peut-être déjà changé votre mot de passe ou demandé un nouveau mot de passe temporaire.",
-       "resetpass-recycled": "Veuillez modifier votre mot de passe à quelque chose d’autre que l’actuel.",
+       "resetpass-recycled": "Veuillez modifier votre mot de passe avec autre chose que l’actuel.",
        "resetpass-temp-emailed": "Vous êtes connecté{{GENDER:||e}} avec un code temporaire fourni par courriel.\nPour terminer la connexion, vous devez fournir un nouveau mot de passe ici :",
        "resetpass-temp-password": "Mot de passe temporaire :",
        "resetpass-abort-generic": "La modification du mot de passe a été annulée par une extension.",
        "converter-manual-rule-error": "Erreur détectée dans la règle manuelle de conversion de langue",
        "undo-success": "Cette modification va être annulée.\nVeuillez vérifier les différences ci-dessous, puis publier l’annulation si c’est bien ce que vous voulez faire.",
        "undo-failure": "Cette modification ne peut pas être défaite : cela entrerait en conflit avec les modifications intermédiaires.",
+       "undo-main-slot-only": "La modification n'a pas pu être annulée car elle implique un contenu en dehors de la tranche principale.",
        "undo-norev": "La modification n’a pas pu être défaite parce qu’elle est inexistante ou qu’elle a été supprimée.",
        "undo-nochange": "Il semblerait que la modification ait déjà été annulée.",
        "undo-summary": "Annulation des modifications $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|discussion]])",
        "rcfilters-activefilters": "Filtres actifs",
        "rcfilters-activefilters-hide": "Masquer",
        "rcfilters-activefilters-show": "Afficher",
+       "rcfilters-activefilters-hide-tooltip": "Masquer la zone des Filtres actifs",
+       "rcfilters-activefilters-show-tooltip": "Afficher la zone des Filtres actifs",
        "rcfilters-advancedfilters": "Filtres avancés",
        "rcfilters-limit-title": "Résultats à afficher",
        "rcfilters-limit-and-date-label": "$1 modification{{PLURAL:$1||s}}, $2",
        "whatlinkshere-title": "Pages qui pointent vers « $1 »",
        "whatlinkshere-page": "Page :",
        "linkshere": "Les pages ci-dessous contiennent un lien vers <strong>$2</strong> :",
-       "nolinkshere": "Aucune page ne contient de lien vers <strong>$2</strong>.",
+       "nolinkshere": "Aucune page ne contient de liens vers <strong>$2</strong>.",
        "nolinkshere-ns": "Aucune page ne contient de liens vers <strong>$2</strong> dans l'espace de noms choisi.",
        "isredirect": "page de redirection",
        "istemplate": "inclusion",
index 24106ce..2236e97 100644 (file)
        "tooltip-search-go": "𐌲𐌰𐌲𐌲 𐌳𐌿 𐌻𐌰𐌿𐌱𐌰 𐌼𐌹𐌸 𐌸𐌰𐌼𐌼𐌰 𐌲𐌰𐌻𐌴𐌹𐌺𐌰𐌼𐌼𐌰 𐌽𐌰𐌼𐌹𐌽",
        "tooltip-search-fulltext": "𐍃𐍉𐌺𐌴𐌹 𐌻𐌰𐌿𐌱𐌰𐌽𐍃 𐌸𐌰𐌹𐌼 𐌱𐍉𐌺𐍉𐌼",
        "tooltip-p-logo": "𐌲𐌰𐍅𐌴𐌹𐍃 𐌷𐌰𐌿𐌱𐌹𐌳𐌰𐌻𐌰𐌿𐌱𐌹𐍃",
-       "tooltip-n-mainpage": "𐌲𐌰𐍅𐌴𐌹𐍃 𐌷𐌰𐌿𐌱𐌹𐌳𐌰𐌻𐌰𐌿𐌱𐌹𐍃",
+       "tooltip-n-mainpage": "𐌲𐌰𐍅𐌴𐌹𐍃𐍉 𐌷𐌰𐌿𐌱𐌹𐌳𐌰𐌻𐌰𐌿𐌱𐌹𐍃",
        "tooltip-n-mainpage-description": "𐌲𐌰𐍅𐌴𐌹𐍃 𐌷𐌰𐌿𐌱𐌹𐌳𐌰𐌻𐌰𐌿𐌱𐌹𐍃",
        "tooltip-n-portal": "𐌱𐌹 𐍆𐌰𐌿𐍂𐌰𐍅𐌰𐌿𐍂𐍀𐌰, 𐍈𐌰 𐌼𐌰𐌲𐍄 𐍄𐌰𐌿𐌾𐌰𐌽, 𐍈𐌰𐍂 𐌱𐌹𐌲𐌹𐍄𐌹𐍃 𐍅𐌰𐌹𐌷𐍄𐌹𐌽𐍃",
        "tooltip-n-currentevents": "𐌱𐌹𐌲𐌹𐍄 𐌼𐌰𐌹𐍃 𐌺𐌿𐌽𐌸𐌹 𐌱𐌹 𐌽𐌹𐌿𐌾𐍉𐍃 𐍅𐌰𐌿𐍂𐌸𐌰𐌽𐍉𐍃 𐍅𐌰𐌹𐌷𐍄𐌹𐌽𐍃",
index 93ad441..3b91696 100644 (file)
@@ -67,7 +67,7 @@
        "tog-shownumberswatching": "הצגת מספר המשתמשים העוקבים",
        "tog-oldsig": "החתימה הנוכחית שלך:",
        "tog-fancysig": "התייחסות לחתימה כקוד ויקי (ללא קישור אוטומטי)",
-       "tog-uselivepreview": "×\9c×\94ר×\90×\95ת תצוגה מקדימה בלי לטעון מחדש את הדף",
+       "tog-uselivepreview": "×\94צ×\92ת תצוגה מקדימה בלי לטעון מחדש את הדף",
        "tog-forceeditsummary": "הצגת אזהרה בעת הכנסת תקציר עריכה ריק",
        "tog-watchlisthideown": "הסתרת עריכות שלי ברשימת המעקב",
        "tog-watchlisthidebots": "הסתרת עריכות של בוטים ברשימת המעקב",
        "converter-manual-rule-error": "התגלתה שגיאה בכלל המרת שפה ידני",
        "undo-success": "ניתן לבטל את העריכה.\nאנא {{GENDER:|בדוק|בדקי|בדקו}} את השוואת הגרסאות שלהלן כדי לוודא שזה אכן מה {{GENDER:|שאתה רוצה|שאת רוצה|שאתם רוצים}} לעשות, ולאחר מכן {{GENDER:|שמור|שמרי|שמרו}} את השינויים למטה כדי לסיים את ביטול העריכה.",
        "undo-failure": "לא ניתן היה לבטל את העריכה עקב התנגשות עם עריכות מאוחרות יותר.",
+       "undo-main-slot-only": "לא ניתן היה לבטל את העריכה כיוון שהיא כוללת תוכן מחוץ למיקום הראשי.",
        "undo-norev": "לא ניתן היה לבטל את העריכה כי היא אינה קיימת או כי היא נמחקה.",
        "undo-nochange": "נראה שהעריכה כבר בוטלה.",
        "undo-summary": "ביטול גרסה $1 של [[Special:Contributions/$2|$2]] ([[User talk:$2|שיחה]])",
        "rcfilters-activefilters": "מסננים פעילים",
        "rcfilters-activefilters-hide": "הסתרה",
        "rcfilters-activefilters-show": "הצגה",
+       "rcfilters-activefilters-hide-tooltip": "הסתרת תיבת המסננים הפעילים",
+       "rcfilters-activefilters-show-tooltip": "הצגת תיבת המסננים הפעילים",
        "rcfilters-advancedfilters": "מסננים מתקדמים",
        "rcfilters-limit-title": "כמה תוצאות להראות",
        "rcfilters-limit-and-date-label": "{{PLURAL:$1|שינוי אחד|$1 שינויים}}, $2",
        "exif-colorspace": "מרחב הצבע",
        "exif-componentsconfiguration": "משמעות כל רכיב",
        "exif-compressedbitsperpixel": "שיטת דחיסת התמונה",
-       "exif-pixelxdimension": "רוחב התמונה הנכון",
-       "exif-pixelydimension": "גובה התמונה הנכון",
+       "exif-pixelxdimension": "רוחב התמונה",
+       "exif-pixelydimension": "גובה התמונה",
        "exif-usercomment": "הערות המשתמש",
        "exif-relatedsoundfile": "קובץ שמע מקושר",
        "exif-datetimeoriginal": "התאריך והשעה של יצירת הקובץ",
        "exif-subsectimedigitized": "תת־השניות של הפיכת הקובץ לדיגיטלי",
        "exif-exposuretime": "זמן חשיפה",
        "exif-exposuretime-format": "$1 שניות ($2)",
-       "exif-fnumber": "מספר F",
+       "exif-fnumber": "מספר המִפתח",
        "exif-exposureprogram": "תוכנית החשיפה",
        "exif-spectralsensitivity": "רגישות הספקטרום",
        "exif-isospeedratings": "דירוג מהירות ה־ISO",
        "exif-shutterspeedvalue": "מהירות צמצם ביחידות APEX",
        "exif-aperturevalue": "מִפתח APEX",
        "exif-brightnessvalue": "בהירות ביחידות APEX",
-       "exif-exposurebiasvalue": "נטיית החשיפה",
+       "exif-exposurebiasvalue": "נטיית החשיפה ביחידות APEX",
        "exif-maxaperturevalue": "גודל המִפתח המרבי",
        "exif-subjectdistance": "מרחק נושא הצילום",
        "exif-meteringmode": "שיטת מדידה",
        "exif-focallength-format": "{{PLURAL:$1|מילימטר אחד|$1 מילימטרים}}",
        "exif-subjectarea": "נושא האזור",
        "exif-flashenergy": "אנרגיית המַבזק",
-       "exif-focalplanexresolution": "×\9eש×\98×\97 ×\94פ×\95ק×\95ס ברזולוציה האופקית",
-       "exif-focalplaneyresolution": "×\9eש×\98×\97 ×\94פ×\95ק×\95ס ברזולוציה האנכית",
-       "exif-focalplaneresolutionunit": "×\99×\97×\99×\93ת ×\94×\9e×\99×\93×\94 ×©×\9c ×\9eש×\98×\97 ×\94פ×\95ק×\95ס ברזולוציה",
+       "exif-focalplanexresolution": "×\9eש×\98×\97 ×\94×\9e×\95ק×\93 ברזולוציה האופקית",
+       "exif-focalplaneyresolution": "×\9eש×\98×\97 ×\94×\9e×\95ק×\93 ברזולוציה האנכית",
+       "exif-focalplaneresolutionunit": "×\99×\97×\99×\93ת ×\94×\9e×\99×\93×\94 ×©×\9c ×\9eש×\98×\97 ×\94×\9e×\95ק×\93 ברזולוציה",
        "exif-subjectlocation": "נושא המיקום",
        "exif-exposureindex": "מדד החשיפה",
        "exif-sensingmethod": "שיטת חישה",
        "exif-customrendered": "עיבוד תמונה מותאם",
        "exif-exposuremode": "מצב החשיפה",
        "exif-whitebalance": "איזון צבע לבן",
-       "exif-digitalzoomratio": "×\99×\97ס ×\94×\96×\95×\9d ×\94×\93×\99×\92×\99×\98×\9c×\99",
+       "exif-digitalzoomratio": "×\99×\97ס ×\94×\94תקר×\91×\95ת ×\94×\93×\99×\92×\99×\98×\9c×\99ת",
        "exif-focallengthin35mmfilm": "אורך מוקדי העדשות בסרט צילום של 35 מ\"מ",
        "exif-scenecapturetype": "אופן צילום הסצנה",
        "exif-gaincontrol": "בקרת הסצנה",
        "exif-gpsaltituderef": "התייחסות גובה",
        "exif-gpsaltitude": "גובה",
        "exif-gpstimestamp": "זמן GPS (שעון אטומי)",
-       "exif-gpssatellites": "לוויינים ששמשו למדידה",
+       "exif-gpssatellites": "×\9c×\95×\95×\99×\99× ×\99×\9d ×©×©×\99×\9eש×\95 ×\9c×\9e×\93×\99×\93×\94",
        "exif-gpsstatus": "מעמד המקלט",
        "exif-gpsmeasuremode": "מצב מדידה",
        "exif-gpsdop": "דיוק מדידה",
        "exif-gpstrack": "מהירות התנועה",
        "exif-gpsimgdirectionref": "התייחסות לכיוון התמונה",
        "exif-gpsimgdirection": "כיוון התמונה",
-       "exif-gpsmapdatum": "מידע סקר מדידת הארץ שנעשה בו שימוש",
+       "exif-gpsmapdatum": "×\9e×\99×\93×¢ ×¢×\9c ×¡×§×¨ ×\9e×\93×\99×\93ת ×\94×\90רץ ×©× ×¢×©×\94 ×\91×\95 ×©×\99×\9e×\95ש",
        "exif-gpsdestlatituderef": "התייחסות לקו־הרוחב של היעד",
        "exif-gpsdestlatitude": "קו־הרוחב של היעד",
        "exif-gpsdestlongituderef": "התייחסות לקו־האורך של היעד",
        "exif-originalimageheight": "גובה התמונה לפני קיטוע",
        "exif-originalimagewidth": "רוחב התמונה לפני קיטוע",
        "exif-compression-1": "לא דחוס",
-       "exif-compression-2": "ק×\99×\93×\95×\93 ×\94×\95פ×\9e×\9f ×\9e×\95ת×\90×\9d ×\97×\93Ö¾×\9e×\99×\9e×\93×\99 ×\9c×\90×\95ר×\9a ×¨×\99צ×\94 CCITT ×§×\91×\95צ×\94 3",
+       "exif-compression-2": "קידוד הופמן מותאם חד־ממדי לאורך ריצה CCITT קבוצה 3",
        "exif-compression-3": "קידוד פקס CCITT קבוצה 3",
        "exif-compression-4": "קידוד פקס CCITT קבוצה 4",
        "exif-compression-6": "JPEG (ישן)",
        "exif-sensingmethod-4": "חיישן אזור בצבע עם שלושה שבבים",
        "exif-sensingmethod-5": "חיישן אזור עם צבע רציף",
        "exif-sensingmethod-7": "חיישן טריליניארי",
-       "exif-sensingmethod-8": "×\97×\99×\99ש×\9f ×¢×\9d ×¦×\91×¢ ×¨×¦×\99×£ ×\9c×\99× ×\99×\90רי",
+       "exif-sensingmethod-8": "×\97×\99×\99ש×\9f ×¢×\9d ×¦×\91×¢ ×¨×¦×\99×£ ×§×\95×\95י",
        "exif-filesource-3": "מצלמת תמונות ספרתית",
        "exif-scenetype-1": "תמונה שצולמה ישירות",
        "exif-customrendered-0": "תהליך רגיל",
        "exif-gpslatitude-s": "קו־רוחב דרומי",
        "exif-gpslongitude-e": "קו־אורך מזרחי",
        "exif-gpslongitude-w": "קו־אורך מערבי",
-       "exif-gpsaltitude-above-sealevel": "{{PLURAL:$1|×\9e×\98ר ×\90×\97ר|$1 מטרים}} מעל פני הים",
-       "exif-gpsaltitude-below-sealevel": "{{PLURAL:$1|×\9e×\98ר ×\90×\97ר|$1 מטרים}} מתחת לפני הים",
+       "exif-gpsaltitude-above-sealevel": "{{PLURAL:$1|×\9e×\98ר ×\90×\97×\93|$1 מטרים}} מעל פני הים",
+       "exif-gpsaltitude-below-sealevel": "{{PLURAL:$1|×\9e×\98ר ×\90×\97×\93|$1 מטרים}} מתחת לפני הים",
        "exif-gpsstatus-a": "מדידה בתהליך",
        "exif-gpsstatus-v": "מדידה בו־זמנית",
        "exif-gpsmeasuremode-2": "מדידה בשני ממדים",
        "exif-rating-rejected": "נדחה",
        "exif-isospeedratings-overflow": "מעל 65535",
        "exif-maxaperturevalue-value": "$1 APEX (יחידות: f/$2)",
-       "exif-iimcategory-ace": "אמנויות, תרבות ובידור",
+       "exif-iimcategory-ace": "×\90×\95×\9e× ×\95×\99×\95ת, ×ª×¨×\91×\95ת ×\95×\91×\99×\93×\95ר",
        "exif-iimcategory-clj": "פשע ומשפט",
        "exif-iimcategory-dis": "אסונות ותאונות",
        "exif-iimcategory-fin": "כלכלה ועסקים",
        "monthsall": "הכול",
        "confirmemail": "אימות כתובת דוא\"ל",
        "confirmemail_noemail": "אין לך כתובת דוא\"ל תקפה המוגדרת ב[[Special:Preferences|העדפות המשתמש]] שלך.",
-       "confirmemail_text": "{{GENDER:|עליך|עלייך|עליכם}} לאמת את כתובת הדוא\"ל {{GENDER:|שלך|שלך|שלכם}} לפני ש{{GENDER:|תוכל|תוכלי|תוכלו}} להשתמש בשירותי הדוא\"ל של {{SITENAME}}.\n{{GENDER:|לחץ|לחצי|לחצו}} על הכפתור שלמטה כדי לשלוח קוד אימות לכתובת הדוא\"ל ש{{GENDER:|הזנת|הזנת|הזנתם}}.\nההודעה {{GENDER:|שתקבל|שתקבלי|שתקבלו}} תכלול קישור שמכיל קוד;\n{{GENDER:|פתח|פתחי|פתחו}} את הקישור בדפדפן {{GENDER:|שלך|שלך|שלכם}} כדי לאשר שכתובת הדוא\"ל תקפה.",
-       "confirmemail_pending": "קוד האימות כבר נשלח לדואר האלקטרוני {{GENDER:|שלך|שלך|שלכם}};\nאם {{GENDER:|יצרת|יצרת|יצרתם}} את החשבון לאחרונה, כדאי להמתין מספר דקות עד שהדוא\"ל יגיע לפני בקשת קוד חדש.",
-       "confirmemail_send": "×\9cש×\9c×\95×\97 קוד אימות",
+       "confirmemail_text": "יש לאמת את כתובת הדוא\"ל כדי שניתן יהיה להשתמש בשירותי הדוא\"ל של {{SITENAME}}.\nכדי לשלוח קוד אימות לכתובת הדוא\"ל שהזנת, יש ללחוץ על הכפתור שלמטה.\nהודעת הדוא\"ל שתישלח תכלול קישור שמכיל קוד;\nיש לפתוח את הקישור בדפדפן כדי לאשר שכתובת הדוא\"ל תקפה.",
+       "confirmemail_pending": "קוד האימות כבר נשלח לדואר האלקטרוני שלך;\nאם יצרת את החשבון לאחרונה, כדאי להמתין מספר דקות עד שהדוא\"ל יגיע לפני בקשת קוד חדש.",
+       "confirmemail_send": "ש×\9c×\99×\97ת קוד אימות",
        "confirmemail_sent": "הדוא\"ל עם קוד האימות נשלח.",
-       "confirmemail_oncreate": "ק×\95×\93 ×\90×\99×\9e×\95ת ×\93×\95×\90\"×\9c × ×©×\9c×\97 ×\9c×\9bת×\95×\91ת ×\94×\93×\95×\90\"×\9c ×©×\9c×\9b×\9d. ×\94ק×\95×\93 ×\94×\96×\94 ×\90×\99× ×\95 × ×\93רש ×\9c×\9b× ×\99ס×\94, ×\90×\9a ×ª×¦×\98ר×\9b×\95 לספקו כדי להשתמש בכל תכונה מבוססת דוא\"ל באתר זה.",
-       "confirmemail_sendfailed": "אתר {{SITENAME}} לא הצליח לשלוח דוא\"ל האימות שלך.\nנא לבדוק שבכתובת הדוא\"ל שלך אין תווים בלתי־תקינים.\n\nמערכת שליחת הדוא\"ל החזירה את ההודעה הבאה: $1",
-       "confirmemail_invalid": "קוד האימות שגוי. ייתכן שפג תוקפו.",
+       "confirmemail_oncreate": "ק×\95×\93 ×\90×\99×\9e×\95ת × ×©×\9c×\97 ×\9c×\9bת×\95×\91ת ×\94×\93×\95×\90\"×\9c ×©×\9c×\9a.\n×\94ק×\95×\93 ×\94×\96×\94 ×\90×\99× ×\95 × ×\93רש ×\9c×\9b× ×\99ס×\94 ×\9c×\97ש×\91×\95×\9f, ×\90×\9a ×\99×\94×\99×\94 ×¦×\95ר×\9a לספקו כדי להשתמש בכל תכונה מבוססת דוא\"ל באתר זה.",
+       "confirmemail_sendfailed": "×\90תר {{SITENAME}} ×\9c×\90 ×\94צ×\9c×\99×\97 ×\9cש×\9c×\95×\97 ×\90ת ×\93×\95×\90\"×\9c ×\94×\90×\99×\9e×\95ת ×©×\9c×\9a.\n× ×\90 ×\9c×\91×\93×\95ק ×©×\91×\9bת×\95×\91ת ×\94×\93×\95×\90\"×\9c ×©×\9c×\9a ×\90×\99×\9f ×ª×\95×\95×\99×\9d ×\91×\9cת×\99־תק×\99× ×\99×\9d.\n\n×\9eער×\9bת ×©×\9c×\99×\97ת ×\94×\93×\95×\90\"×\9c ×\94×\97×\96×\99ר×\94 ×\90ת ×\94×\94×\95×\93×¢×\94 ×\94×\91×\90×\94: $1",
+       "confirmemail_invalid": "קוד האימות שגוי.\nייתכן שפג תוקפו.",
        "confirmemail_needlogin": "נדרשת $1 כדי לאמת את כתובת הדוא\"ל שלך.",
        "confirmemail_success": "כתובת הדוא\"ל שלך אושרה.\nכעת באפשרותך [[Special:UserLogin|להיכנס לחשבון שלך]] וליהנות מהאתר.",
        "confirmemail_loggedin": "כתובת הדוא\"ל שלך אושרה כעת.",
index 966953c..55eba4d 100644 (file)
@@ -38,7 +38,8 @@
                        "Сербијана",
                        "Wumbolo",
                        "Fitoschido",
-                       "Hamster"
+                       "Hamster",
+                       "BadDog"
                ]
        },
        "tog-underline": "Podcrtavanje poveznica",
        "group-suppress": "Otajnici",
        "group-all": "(svi)",
        "group-user-member": "{{GENDER:$1|suradnik|suradnica}}",
-       "group-autoconfirmed-member": "{{GENDER:$1|automatski potvrđen suradnik|automatski potvrđena suradnica}}",
+       "group-autoconfirmed-member": "{{GENDER:$1|automatski potvrđeni suradnik|automatski potvrđena suradnica}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|administrator|administratorica}}",
        "group-bureaucrat-member": "{{GENDER:$1|birokrat|birokratica}}",
        "allmessagesname": "Ime",
        "allmessagesdefault": "Prvotni tekst",
        "allmessagescurrent": "Trenutačni tekst",
-       "allmessagestext": "Ovo je popis svih sistemskih poruka u imenskom prostoru MediaWiki. Molimo posjetite [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation lokalizaciju MediaWikija] i [https://translatewiki.net translatewiki.net] ako želite doprinijeti lokalizaciji MediaWiki softvera.",
+       "allmessagestext": "Ovo je popis sistemskih poruka u imenskom prostoru MediaWiki. Molimo posjetite [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation lokalizaciju MediaWikija] i [https://translatewiki.net translatewiki.net] ako želite doprinijeti lokalizaciji MediaWiki softvera.",
        "allmessagesnotsupportedDB": "Ova stranica ne može biti korištena jer je isključen parametar '''$wgUseDatabaseMessages'''.",
        "allmessages-filter-legend": "Filtriraj",
        "allmessages-filter": "Filtriraj prema prilagođenom obliku:",
        "revdelete-unrestricted": "uklonjeno ograničenje za administratore",
        "logentry-block-block": "$1 {{GENDER:$2|blokirao|blokirala}} je {{GENDER:$4|$3}} na rok od $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|odblokirao|odblokirala}} je {{GENDER:$4|$3}}",
-       "logentry-block-reblock": "$1 {{GENDER:$2|promijenio|promijenila}} je postavke blokiranja {{GENDER:$4|suradnika|suradnice}} {{GENDER:$4|$3}} s krajnjim rokom koji ističe $5 $6",
+       "logentry-block-reblock": "$1 {{GENDER:$2|promijenio|promijenila}} je postavke blokiranja {{GENDER:$4|suradnika|suradnice}} {{GENDER:$4|$3}} s krajnjim rokom koji istječe $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|blokirao|blokirala}} je {{GENDER:$4|$3}} s krajnjim rokom koji ističe $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|promijenio|promijenila}} je postavke blokiranja {{GENDER:$4|suradnika|suradnice}} {{GENDER:$4|$3}} s krajnjim rokom koji ističe $5 $6",
        "logentry-import-interwiki": "$1 {{GENDER:$2|uvezao|uvezla}} je $3 s drugog wikija",
        "gotointerwiki-invalid": "Navedeni naslov nije valjan.",
        "gotointerwiki-external": "Napuštate projekt {{SITENAME}} da biste posjetili zasebno mrežno mjesto [[$2]].\n\n<strong>[$1 Nastavljate na $1]</strong>",
        "pagedata-title": "Podatci o stranici",
-       "pagedata-bad-title": "Naslov nije valjan: $1."
+       "pagedata-bad-title": "Naslov nije valjan: $1.",
+       "passwordpolicies": "Pravila za zaporke",
+       "passwordpolicies-summary": "Ovo je popis pravila za zaporke za suradničke grupe definirane na ovom wikiju.",
+       "passwordpolicies-policy-minimalpasswordlength": "Zaporka mora sadržavati najmanje {{PLURAL:$1|1 znak|$1 znaka|$1 znakova}}",
+       "passwordpolicies-policy-minimumpasswordlengthtologin": "Da biste se prijavili, zaporka mora sadržavati najmanje {{PLURAL:$1|1 znak|$1 znaka|$1 znakova}}",
+       "passwordpolicies-policy-passwordcannotmatchusername": "Zaporka ne može biti ista kao i suradničko ime",
+       "passwordpolicies-policy-passwordcannotmatchblacklist": "Zaporka se ne može podudarati sa zaporkama na crnoj listi",
+       "passwordpolicies-policy-maximalpasswordlength": "Zaporka mora biti kraća od {{PLURAL:$1|1 znaka|$1 znaka|$1 znakova}}"
 }
index cc3e900..99c4a8b 100644 (file)
        "actionthrottled": "Сухала доазув дар",
        "protectedpagetext": "Ер оагIув лораяь я цу тIа хувцамаш дергдоацаш.",
        "viewsourcetext": "Укх оагIон чухьнахьарча текстах бIаргатоха а, цунах кеп яьккха а, йиш я хьа.",
+       "exception-nologin-text-manual": "Укх оагIон тIакхача йиш хургйолаш $1 деза шо.",
        "virus-unknownscanner": "йовзанза антивирус:",
-       "logouttext": "<strong>Ð\9eаÑ\88а Ð±Ð¾Ð»Ñ\85 Ñ\87акÑ\85баÑ\8cккÑ\85аб.</strong>\n\nÐ\9dекоÑ\82оÑ\80Ñ\8bе Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b Ð¼Ð¾Ð³Ñ\83Ñ\82 Ð¿Ñ\80одолжиÑ\82Ñ\8c Ð¾Ñ\82обÑ\80ажаÑ\82Ñ\8cÑ\81Ñ\8f Ñ\82ак, Ñ\81ловно Ð²Ñ\8b Ð²Ñ\81е ÐµÑ\89Ñ\91 Ð½Ðµ Ð·Ð°Ð²ÐµÑ\80Ñ\88или Ñ\81еанÑ\81. Ð\94лÑ\8f Ð±Ð¾Ñ\80Ñ\8cбÑ\8b Ñ\81 Ñ\8dÑ\82им Ñ\8fвлением Ð¾Ð±Ð½Ð¾Ð²Ð¸Ñ\82е ÐºÑ\8dÑ\88 Ð±Ñ\80аÑ\83зеÑ\80а.",
+       "logouttext": "<strong>Ð\9eаÑ\88а Ð±Ð¾Ð»Ñ\85 Ñ\87акÑ\85баÑ\8cккÑ\85аб.</strong>\n\nЦÑ\85Ñ\8cайола Ð¾Ð°Ð³IонаÑ\88 Ñ\85Ñ\8cагÑ\83Ñ\88 Ñ\85ила Ð¼ÐµÐ³ Ð¾Ð°Ñ\88а Ð±Ð¾Ð»Ñ\85 Ñ\87акÑ\85баÑ\8cккÑ\85абоаÑ\86аÑ\88 Ñ\81анна. Ð\98з Ñ\85Ñ\83Ñ\80гдоаÑ\86аÑ\88 Ð±Ñ\80аÑ\83зеÑ\80а ÐºÑ\8dÑ\88 IоÑ\86IенÑ\8aе.",
        "welcomeuser": "Марша воагIалва, доакъашхо $1!",
        "yourname": "Дагара йоазон цIи:",
        "userlogin-yourname": "Доакъашхочун цӀи",
        "createacct-yourpasswordagain-ph": "Кхы цхьаькхаза Ӏочуязъе пароль",
        "userlogin-remembermypassword": "Ражача чувиса",
        "yourdomainname": "Хьа домен:",
-       "login": "ЧÑ\83вала/Ñ\8fла",
+       "login": "ЧÑ\83довла",
        "nav-login-createaccount": "Шоаш довзийтар / Дагара йоазув кхоллар",
        "logout": "Аравала/яла",
        "userlogout": "Аравала/яла",
        "emailauthenticated": "Хьа электронни пошта цIай бакъдаьд (тIатоадаьд) укх хана: $3, $2.",
        "emailconfirmlink": "Бакъде хьай электронни пошта цIай",
        "loginlanguagelabel": "Мотт: $1",
-       "pt-login": "ЧÑ\83вала/Ñ\8fла",
-       "pt-login-button": "ЧÑ\83вала/Ñ\8fла",
+       "pt-login": "ЧÑ\83довла",
+       "pt-login-button": "ЧÑ\83довла",
        "pt-createaccount": "Дагара йоазув хьакхолла",
        "pt-userlogout": "Аравала/яла",
        "changepassword": "КъайладIоaгIа дIахувцар",
        "blockedtitle": "Доакъашхочун чIега техаб",
        "blockedtext": "<strong>Хьа дагара йоазон е IP-адреса блоктехай.</strong>\n\nБлоктохар даьд $1 яхача администраторо.\nБелгалдаьд ер бахьан: «<em>$2</em>».\n\n* Блоктохара дух: $8\n* Блоктохара чаккхе: $6\n* Блоктохара дагалоаттам: $7\n\nХьа аьттув ба $1-ца е моллагIа кхыволча [[{{MediaWiki:Grouppage-sysop}}|администраторца]] бувзаме вала блоктохар тахкар духьа.\nТеркал делахь, хьа йиш хургьяц «письмо участнику» яхача функцех пайда эца, нагахьа санна хьай [[Special:Preferences|персональни настройкаш]] чу нийса дола электронни поштан адрес белгалдаькха деце, е нагахьа санна хьона теха блока чу цу тайпара каьхат дахьийтар могадаь деце.\nХьа IP-адрес — $3, блоктохара идентификатор — $5.\nБоккъала, белгалдаха уж хоамаш (дараш) Iайха моллагIа каьхат дохьийтача хана.",
        "blockednoreason": "бахьан белгалдаьккха дац",
-       "loginreqlink": "довзийта",
-       "loginreqpagetext": "Оаш шоаш $1 деза кхыйола оагIонашка хьожаргдолаш.",
+       "whitelistedittext": "Шо $1 деза оагIонашта хувцам бергболаш.",
+       "loginreqlink": "чудовла",
+       "loginreqpagetext": "Шо $1 деза кхыйола оагIонашка хьожаргдолаш.",
        "accmailtitle": "КъайладIоагӀа дӀадахьийтад",
        "newarticle": "(Kерда)",
        "newarticletext": "Шо тIатовжама гIолла дехьадаьннад йолаш йоацача оагӀон тӀа.\nИз хьакхолларгьйолаш кӀалхагӀа доалача корачу текст Iочуязъе (нагахьа санна кхетаде хала дале [$1 новкъосталара оагӀонга] хьажа).\nЦаховш укхаза нийсденнадале, шоай браузера чу '''Юха''' (Назад) яха тоIаера тӀа пӀелг тоӀабе.",
        "rcfilters-filter-minor-description": "Авторо зIамига да аьнна белгалдаь тоадаьраш.",
        "rcfilters-filter-major-label": "ЛерттIа хувцамаш",
        "rcfilters-filter-major-description": "Авторо зIамига да аьнна белгалдаьдоаца тоадаьраш.",
+       "rcfilters-filtergroup-watchlist": "Зема хьаязяьра чура оагӀонаш",
+       "rcfilters-filter-watchlist-watched-label": "Зема хьаязяьра чу",
+       "rcfilters-filter-watchlist-watched-description": "Хьа зема хьаязяьра чура оагӀонашта даь хувцамаш",
+       "rcfilters-filter-watchlist-watchednew-label": "Керда хувцамаш зема хьаязяьра чу",
+       "rcfilters-filter-watchlist-watchednew-description": "Хьа зема хьаязяьра чура оагӀонаш тӀа даь хьона хӀанзехьа бӀаргадайна доаца хувцамаш",
+       "rcfilters-filter-watchlist-notwatched-label": "Яц зема хьаязяьра чу",
+       "rcfilters-filter-watchlist-notwatched-description": "Ерригаш, Iа зем беш йола оагIонаш юкъерайоахаш.",
        "rcfilters-filtergroup-changetype": "Хувцама тайпа",
        "rcfilters-filter-pageedits-label": "ОагӀона тоадаьраш",
        "rcfilters-filter-pageedits-description": "Чулоацами, дувцара оагIонаши, оагIаташи тоаяр",
        "rcfilters-filter-lastrevision-description": "ОагIон тIа алхха тIехьара хинна хувцам.",
        "rcfilters-filter-previousrevision-label": "ТIехьара йоаца эрш",
        "rcfilters-filter-previousrevision-description": "«ТӀехьара эрш» мел доаца тоадаьраш.",
+       "rcfilters-view-tags": "Фосташ",
        "rcfilters-liveupdates-button": "Ши-шегIа кердадувлийта",
        "rcfilters-liveupdates-button-title-on": "ДIадоаде ши-шегIа кердадалар",
        "rcfilters-liveupdates-button-title-off": "Керда хувцам бешше хьахьокха",
        "recentchangeslinked-to": "Вешта, белгаляьккха оагIон тIахьожавеш дола оагIонашта даь хувцамаш хьахьокха.",
        "upload": "Файл чуяккха",
        "uploadbtn": "Файл чуяккха",
+       "uploadnologintext": "Шо $1 деза сервера тIа файлаш хьачуйоахаргйолаш.",
        "uploadlogpage": "Чуяьккхарий тептар",
        "filedesc": "Лоаца йоазонца сурт оттадар",
        "fileuploadsummary": "Лоаца сурт оттадар:",
        "nbytes": "$1 {{PLURAL:$1|байт}}",
        "nmembers": "$1 {{PLURAL:$1|объект}}",
        "prefixindex": "ОагӀонаш шоай цӀерий хьалхарча алапах хьахокхар",
-       "prefixindex-namespace": "ОагӀоний цӀераш шоай дешхьалхех хьахьокхар (цIерий моттиг «{{ns:$1}}»)",
+       "prefixindex-namespace": "ОагӀоний цӀераш шоай дешхьалхех хьахьокхар (цӀерий моттиг «{{ns:$1}}»)",
        "prefixindex-submit": "Хьахьокха",
        "prefixindex-strip": "ДIакъайлаяха хьелехача оагIоний дешхьалхенаш (префиксаш)",
        "shortpages": "Лоаца оагIонаш",
        "allpages-hide-redirects": "ДIакъайладаха дӀа-хьа хьожавераш",
        "categories": "ОагӀаташ",
        "categories-submit": "Хьахьокха",
+       "sp-deletedcontributions-contribs": "къахьегам",
        "linksearch": "Арахьара тIахьожаяргаш лахар",
        "linksearch-ns": "ЦIерий моттигаш:",
        "linksearch-ok": "Хьалаха",
        "blanknamespace": "(Кертера)",
        "contributions": "{{GENDER:$1|Доакъашхочун}} къахьегам",
        "contributions-title": "{{GENDER:$1|Доакъашхочун}} $1 къахьегам",
-       "mycontris": "Са Ðºъахьегам",
+       "mycontris": "Ð\9aъахьегам",
        "anoncontribs": "Къахьегам",
        "contribsub2": "Къахьегам {{GENDER:$3|$1}} ($2)",
        "nocontribs": "ДIадийха хувцамаш корадаьдац",
        "movepagebtn": "ОагIон цIи хувца",
        "pagemovedsub": "ОагӀонах керда цӀи тиллай",
        "movepage-moved": "'''«$1» яхача оагӀонах «$2» яха цӀи тиллай'''",
+       "movepage-moved-redirect": "Хьакхеллад дIа-юхаластар",
        "articleexists": "Иззамо цӀи йола оагӀув тхьовре йолаш я е оаш тилла цӀи мегаш яц.\nДехар да, кхыйола цӀи харжа.",
        "movetalk": "Дувца оттадара оагӀон а хувца цӀи",
        "movelogpage": "ЦӀераш хувцара тептар",
        "importlogpage": "Импорта тептар",
        "tooltip-pt-userpage": "{{GENDER:|Хьа}} доакъашхочун оагIув",
        "tooltip-pt-mytalk": "{{GENDER:|Хьа}} дувца оттадара оагIув",
+       "tooltip-pt-anontalk": "Шун IP-цIайна лаьрхIа дувцара оагӀув",
        "tooltip-pt-preferences": "{{GENDER:|Хьа оттамаш}}",
        "tooltip-pt-watchlist": "Iа зем бу оагIонаш",
-       "tooltip-pt-mycontris": "{{GENDER:|хьа}} хувцамаш",
-       "tooltip-pt-login": "Укхаза хьай цIи аьле чувала/яла йиша я, амма из параз дац",
+       "tooltip-pt-mycontris": "{{GENDER:|Хьа}} хувцамаш",
+       "tooltip-pt-anoncontribs": "Укх IP-цIайна тIара даь хувцамаш",
+       "tooltip-pt-login": "Укхаза ражача чу а даьнна регистраци е йиш я.",
        "tooltip-pt-logout": "Аравала/яла",
-       "tooltip-pt-createaccount": "Ð¥Ñ\8cа Ð±Ð¾ÐºÑ\8aо Ñ\8f Ð´Ð°Ð³Ð°Ñ\80а Ð¹Ð¾Ð°Ð·Ñ\83в Ñ\85Ñ\8cа Ð° ÐºÑ\85елла Ñ\80ажаÑ\87а Ñ\87Ñ\83вала.",
+       "tooltip-pt-createaccount": "ШÑ\83н Ð±Ð¾ÐºÑ\8aо Ñ\8f Ð´Ð°Ð³Ð°Ñ\80а Ð¹Ð¾Ð°Ð·Ñ\83в Ñ\85Ñ\8cа Ð° ÐºÑ\85елла Ñ\80ажаÑ\87а Ñ\87Ñ\83довла.",
        "tooltip-ca-talk": "ОагIон чулоацамах лаьца дувцар",
        "tooltip-ca-edit": "Нийсъе ер оагIув",
        "tooltip-ca-addsection": "Керда дáкъа хьаде",
index f1e5433..7f27e4a 100644 (file)
        "rcfilters-savedqueries-defaultlabel": "Konservita filtrili",
        "rcfilters-show-new-changes": "Videz la maxim recenta chanji",
        "rcfilters-search-placeholder": "Filtrar la modifikuri (uzez la menuo o serchez segun la nomo dil filtrilo)",
+       "rcfilters-filterlist-feedbacklink": "Dicez a ni quon vu pensas pri la filtrili",
        "rcfilters-filter-editsbyself-label": "Vua modifikuri",
+       "rcfilters-filter-editsbyother-label": "Modifikuri da altri",
+       "rcfilters-filter-editsbyother-description": "Omna modififuri, ecepte vua propra.",
        "rcfilters-filter-user-experience-level-registered-label": "Enrejistrita",
+       "rcfilters-filter-user-experience-level-registered-description": "Enrejistrita redakteri.",
        "rcfilters-filter-user-experience-level-unregistered-label": "Sen registro",
        "rcfilters-filter-user-experience-level-unregistered-description": "Redakteri qui ne facis 'log in'.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Nova uzeri",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Enrejistrita uzeri qui havas min kam 10 redakturi o 4 dii di aktiveso.",
        "rcfilters-filter-user-experience-level-learner-label": "Lernanti",
        "rcfilters-filter-user-experience-level-learner-description": "Redakteri enrejistrita kun konoco inter \"Nova uzeri\" ed \"experta uzeri.\"",
        "rcfilters-filter-user-experience-level-experienced-label": "Experta uzeri",
        "rcfilters-filter-user-experience-level-experienced-description": "Plu kam 30 dii di agemeso e 500 redakti.",
+       "rcfilters-filter-bots-description": "Redakturi kreita da automatala informatikoprogrami.",
        "rcfilters-filter-humans-label": "Homala (ne 'bot')",
        "rcfilters-filter-humans-description": "Redakturi kreita da homi.",
        "rcfilters-filtergroup-significance": "Senco",
+       "rcfilters-filtergroup-watchlist": "Pagini surveyata",
+       "rcfilters-filter-watchlist-watched-label": "En mea surveyo-listo",
+       "rcfilters-filter-watchlist-watched-description": "Modifikuri en pagini de vua surveyo-listo.",
+       "rcfilters-filter-watchlist-watchednew-label": "Nova modifikuri en la surveyo-listo",
        "rcfilters-filter-pageedits-label": "Redakti di pagini",
        "rcfilters-filter-pageedits-description": "Redakturi en la kontenajo dil Wiki, diskuti, deskriptado di kategorii...",
        "rcfilters-filter-newpages-label": "Kreado di pagini",
        "rcfilters-filter-newpages-description": "Redakturi qui kreas nova pagini.",
-       "rcfilters-filter-categorization-label": "Modifiki di la kategorio",
+       "rcfilters-filter-categorization-label": "Modifikuri di kategorio",
        "rcfilters-filter-logactions-label": "Agadi enrejistrata",
        "rcfilters-filter-logactions-description": "Agadi dal administreri, kreado di konti, efaco di pagini, sendo di arkivi...",
+       "rcfilters-view-tags": "Redakturi etiketizata",
        "rcfilters-liveupdates-button": "Quika aktualigi",
        "rcnotefrom": "Infre {{PLURAL:$5|esas la chanjo|esas la chanji}} de <strong>$3, $4</strong> (montrata til <strong>$1</strong>).",
        "rclistfrom": "Montrar nova chanji startante de $3 $2",
        "recentchangeslinked-summary": "Skribez la nomo di ula pagino por vidar la modifikuri en pagini ligita ad ol. (Por vidar la membri di ula kategoriio, skribez Kategorio:Nomo di la kategorio). Chanji en la pagini qui esas en [[Special:Watchlist|vua surveryo-listo]] aparos en <strong>dika literi</strong>.",
        "recentchangeslinked-page": "Nomo di la pagino:",
        "recentchangeslinked-to": "Montrez chanji a pagini ligita a la specigita pagino vice",
+       "recentchanges-page-added-to-category": "[[:$1]] adjuntita a kategorio",
        "autochange-username": "Automatala chanjo di MediaWiki",
        "upload": "Adkargar arkivo",
        "uploadbtn": "Adkargar arkivo",
        "duration-years": "$1 {{PLURAL:$1|yaro|yari}}",
        "limitreport-title": "Analizo di dati pri profilo:",
        "limitreport-ppvisitednodes": "Quanto di nodi vizitita dal preprocesoro",
+       "limitreport-ppgeneratednodes": "Quanto di nodi kreita dal preprocesoro",
        "limitreport-postexpandincludesize": "Grandeso dil inkluzo pos expanso",
        "limitreport-expansiondepth": "Maxima profundeso di expanso",
        "limitreport-expensivefunctioncount": "Kontado di funcioni kustoza di analizo sintaxala",
index c124df0..b3b617f 100644 (file)
        "botpasswords-existing": "Password bot esistenti",
        "botpasswords-createnew": "Crea una nuova password bot",
        "botpasswords-editexisting": "Modifica password bot esistenti",
+       "botpasswords-label-needsreset": "(occorre ripristinare la password)",
        "botpasswords-label-appid": "Nome bot:",
        "botpasswords-label-create": "Crea",
        "botpasswords-label-update": "Aggiorna",
        "pageswithprop-text": "Questa pagina elenca le pagine che utilizzano una particolare proprietà di pagina.",
        "pageswithprop-prop": "Nome proprietà:",
        "pageswithprop-reverse": "Ordinamento inverso",
+       "pageswithprop-sortbyvalue": "Ordina in base al valore della proprietà",
        "pageswithprop-submit": "Vai",
        "pageswithprop-prophidden-long": "valore testuale lungo della proprietà nascosto ($1)",
        "pageswithprop-prophidden-binary": "valore binario della proprietà nascosto ($1)",
        "import-mapping-subpage": "Importa come sottopagine della pagina seguente:",
        "import-upload-filename": "Nome file:",
        "import-upload-username-prefix": "Prefisso interwiki:",
+       "import-assign-known-users": "Assegna le modifiche agli utenti locali qualora l'utente indicato esista localmente",
        "import-comment": "Oggetto:",
        "importtext": "Si prega di esportare il file dal sito wiki di origine con la [[Special:Export|funzione di esportazione]], salvarlo sul proprio disco e poi caricarlo qui.",
        "importstart": "Importazione delle pagine in corso...",
        "watchlistedit-clear-titles": "Titoli:",
        "watchlistedit-clear-submit": "Svuota gli osservati speciali (sarà permanente!)",
        "watchlistedit-clear-done": "La lista degli osservati speciali è stata svuotata.",
+       "watchlistedit-clear-jobqueue": "I tuoi osservati speciali sono in corso di svuotamento. Potrebbe volerci un po' di tempo!",
        "watchlistedit-clear-removed": "{{PLURAL:$1|È stata eliminata una pagina|Sono state eliminate $1 pagine}}:",
        "watchlistedit-too-many": "Ci sono troppe pagine da visualizzare qui.",
        "watchlisttools-clear": "svuota la lista degli osservati speciali",
        "pagedata-bad-title": "Titolo non valido: $1.",
        "unregistered-user-config": "Per motivi di sicurezza, non è possibile caricare sottopagine utente JavaScript, CSS e JSON per utenti non registrati.",
        "passwordpolicies-group": "Gruppo",
+       "passwordpolicies-policies": "Politiche",
        "passwordpolicies-policy-minimalpasswordlength": "La password deve essere lunga almeno $1 {{PLURAL:$1|carattere|caratteri}}",
        "passwordpolicies-policy-minimumpasswordlengthtologin": "La password deve essere lunga almeno $1 {{PLURAL:$1|carattere|caratteri}} per poter accedere",
        "passwordpolicies-policy-passwordcannotmatchusername": "La password non può essere uguale al nome utente",
index de57a0d..f85711b 100644 (file)
        "rcfilters-activefilters": "사용 중인 필터",
        "rcfilters-activefilters-hide": "숨기기",
        "rcfilters-activefilters-show": "보이기",
+       "rcfilters-activefilters-hide-tooltip": "사용 중인 필터 영역 숨기기",
+       "rcfilters-activefilters-show-tooltip": "사용 중인 필터 영역 표시",
        "rcfilters-advancedfilters": "고급 필터",
        "rcfilters-limit-title": "표시할 결과 수",
        "rcfilters-limit-and-date-label": "{{PLURAL:$1|변경사항}} $1개, $2",
index f2c9726..4821c83 100644 (file)
        "savechanges": "Fisa cambias",
        "publishpage": "Publici paje",
        "publishchanges": "Publici cambias",
+       "publishchanges-start": "Publici cambias...",
        "preview": "Previde",
        "showpreview": "Mostra previde",
        "showdiff": "Mostra cambias",
index 5b2b669..a3c83f4 100644 (file)
@@ -38,7 +38,8 @@
                        "Nemo bis",
                        "Nersip",
                        "Manvydasz",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "Matěj Suchánek"
                ]
        },
        "tog-underline": "Nuorodos pabraukimas:",
        "create": "Sukurti",
        "create-local": "Pridėti vietos aprašymą",
        "delete": "Trinti",
-       "undelete_short": "Atkurti $1 {{PLURAL:$1:redagavimą|redagavimus|redagavimų}}",
+       "undelete_short": "Atkurti $1 {{PLURAL:$1|redagavimą|redagavimus|redagavimų}}",
        "viewdeleted_short": "Peržiūrėti $1 {{PLURAL:$1|ištrintą keitimą|ištrintus keitimus|ištrintų keitimų}}",
        "protect": "Užrakinti",
        "protect_change": "keisti",
index 7138233..5176eaf 100644 (file)
        "grant-generic": "\"$1\" tiesību paka",
        "grant-group-page-interaction": "Darboties ar lapām",
        "grant-group-file-interaction": "Darboties ar multimediju failiem",
+       "grant-group-watchlist-interaction": "Darboties ar tavu uzraugāmo lapu sarakstu",
        "grant-group-email": "Sūtīt e-pastu",
        "grant-group-high-volume": "Veikt liela apjoma aktivitātes",
        "grant-group-administration": "Veikt administratīvās darbības",
        "grant-group-private-information": "Piekļūt privātiem datiem par tevi",
+       "grant-group-other": "Dažādas darbības",
        "grant-blockusers": "Bloķēt un atbloķēt dalībniekus",
        "grant-createaccount": "Izveidot kontu",
        "grant-createeditmovepage": "Izveidot, labot un pārvietot lapas",
        "grant-uploadfile": "Augšupielādēt jaunus failus",
        "grant-basic": "Pamattiesības",
        "grant-viewdeleted": "Skatīt dzēstos failus un lapas",
+       "grant-viewmywatchlist": "Skatīt tavu uzraugāmo rakstu sarakstu",
        "newuserlogpage": "Jauno dalībnieku reģistrs",
        "newuserlogpagetext": "Jauno lietotājvārdu reģistrs.",
        "rightslog": "Dalībnieku tiesību reģistrs",
        "activeusers-submit": "Parādīt aktīvos dalībniekus",
        "listgrouprights": "Dalībnieku grupu tiesības",
        "listgrouprights-summary": "Šis ir šajā viki definēto dalībnieku grupu uzskaitījums, kopā ar tām atbilstošajām piekļuves tiesībām.\nPapildu informāciju par katru individuālu piekļuves tiesību veidu, iespējams, var atrast [[{{MediaWiki:Listgrouprights-helppage}}|šeit]].",
+       "listgrouprights-key": "Apzīmējumi:\n* <span class=\"listgrouprights-granted\">Piešķirtās tiesības</span>\n* <span class=\"listgrouprights-revoked\">Atceltās tiesības</span>",
        "listgrouprights-group": "Grupa",
        "listgrouprights-rights": "Tiesības",
        "listgrouprights-helppage": "Help:Grupu tiesības",
index 6283381..0b923d7 100644 (file)
        "converter-manual-rule-error": "Пронајдов грешка во правилото за рачно претворање на јазик",
        "undo-success": "Уредувањето може да се откаже.\nВе молиме споредете ги промените со претходната верзија за да проверите дали тоа е сигурно она што сакате да го направите, а потоа зачувајте ги промените за да го завршите откажувањето на претходното уредување.",
        "undo-failure": "Уредувањето не можеше да се откаже заради меѓувремени спротиставени уредувања.",
+       "undo-main-slot-only": "Уредувањето не може да се отповика бидејќи има содржина вон главниот жлеб.",
        "undo-norev": "Измената не можеше да биде вратена бидејќи не постои или била избришана.",
        "undo-nochange": "Се чини дека измената (уредувањето) е веќе вратена.",
        "undo-summary": "Откажано уредувањето $1 на уредникот [[Special:Contribs/$2|$2]] ([[User talk:$2|разговор]])",
        "rcfilters-activefilters": "Активни филтри",
        "rcfilters-activefilters-hide": "Скриј",
        "rcfilters-activefilters-show": "Прикажи",
+       "rcfilters-activefilters-hide-tooltip": "Скриј го подрачјето за активни филтри",
+       "rcfilters-activefilters-show-tooltip": "Покажи го подрачјето за активни филтри",
        "rcfilters-advancedfilters": "Напредни филтри",
        "rcfilters-limit-title": "Ставки за приказ",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|промена|промени}}, $2",
index 61b733b..b4d51b8 100644 (file)
        "botpasswords-label-grants": "ബാധകമായ അനുമതികൾ:",
        "botpasswords-label-grants-column": "അനുവദിച്ചിരിക്കുന്നവ",
        "resetpass_forbidden": "രഹസ്യവാക്കുകൾ മാറ്റുന്നത് അനുവദിക്കുന്നില്ല",
+       "resetpass_forbidden-reason": "രഹസ്യവാക്കുകൾ മാറ്റാൻ കഴിയില്ല: $1",
        "resetpass-no-info": "ഈ താൾ നേരിട്ടു കാണുന്നതിന് താങ്കൾ ലോഗിൻ ചെയ്തിരിക്കണം.",
        "resetpass-submit-loggedin": "രഹസ്യവാക്ക് മാറ്റുക",
        "resetpass-submit-cancel": "റദ്ദാക്കുക",
        "resetpass-wrong-oldpass": "താത്കാലികമായി ലഭിച്ച അല്ലെങ്കിൽ നിലവിലുള്ളതായി നൽകിയ രഹസ്യവാക്ക് അസാധുവാണ്.\nതാങ്കൾ രഹസ്യവാക്ക് വിജയകരമായി മാറ്റിയിട്ടുണ്ടാകാം അല്ലെങ്കിൽ പുതിയ താത്കാലിക രഹസ്യവാക്ക് അഭ്യർത്ഥിച്ചിട്ടുണ്ടാകാം.",
-       "resetpass-recycled": "താà´\99àµ\8dà´\95à´³àµ\81à´\9fàµ\86 à´°à´¹à´¸àµ\8dയവാà´\95àµ\8dà´\95àµ\8d à´¨à´¿à´²à´µà´¿à´²àµ\81à´³àµ\8dളതിൽ à´¨à´¿à´¨àµ\8dà´¨àµ\81à´\82 à´µàµ\8dയതàµ\8dയസàµ\8dതമായതാà´\95àµ\8dà´\95ുക.",
+       "resetpass-recycled": "താà´\99àµ\8dà´\95à´³àµ\81à´\9fàµ\86 à´°à´¹à´¸àµ\8dയവാà´\95àµ\8dà´\95àµ\8d à´¨à´¿à´²à´µà´¿à´²àµ\81à´³àµ\8dളതിൽ à´¨à´¿à´¨àµ\8dà´¨àµ\81à´\82 à´µàµ\8dയതàµ\8dയസàµ\8dതമായതായി à´®à´¾à´±àµ\8dà´±ുക.",
        "resetpass-temp-emailed": "ഇമെയിൽ വഴി ലഭിച്ച താൽക്കാലിക കോഡ് ഉപയോഗിച്ചാണ് താങ്കൾ പ്രവേശിച്ചിരിക്കുന്നത്.\nപ്രവേശനം പൂർത്തിയാക്കാൻ, ഇവിടെ പുതിയ രഹസ്യവാക്ക് സജ്ജമാക്കുക:",
        "resetpass-temp-password": "താത്കാലിക രഹസ്യവാക്ക്:",
        "resetpass-abort-generic": "രഹസ്യവാക്ക് മാറ്റുന്നത് ഒരു അനുബന്ധം തടഞ്ഞിരിക്കുന്നു.",
        "resetpass-expired": "താങ്കളുടെ രഹസ്യവാക്ക് കാലഹരണപ്പെട്ടിരിക്കുന്നു. പ്രവേശിക്കാനായി പുതിയ രഹസ്യവാക്ക് സജ്ജമാക്കുക.",
-       "resetpass-expired-soft": "താà´\99àµ\8dà´\95à´³àµ\81à´\9fàµ\86 à´°à´¹à´¸àµ\8dയവാà´\95àµ\8dà´\95àµ\8d à´\95ാലഹരണപàµ\8dà´ªàµ\86à´\9fàµ\8dà´\9fà´¿à´°à´¿à´\95àµ\8dà´\95àµ\81à´¨àµ\8dനതിനാൽ à´ªàµ\81à´¨à´\83à´¸à´\9càµ\8dà´\9càµ\80à´\95à´°à´¿à´\95àµ\8dà´\95àµ\87à´£àµ\8dà´\9fà´¤àµ\81à´£àµ\8dà´\9fàµ\8d. à´\87à´ªàµ\8dà´ªàµ\8bൾ à´¤à´¨àµ\8dà´¨àµ\86 à´ªàµ\81തിയ à´°à´¹à´¸àµ\8dയവാà´\95àµ\8dà´\95àµ\8d à´¤à´¿à´°à´\9eàµ\8dà´\9eàµ\86à´\9fàµ\81à´\95àµ\8dà´\95àµ\81à´\95 à´\85à´²àµ\8dà´²àµ\86à´\99àµ\8dà´\95ിൽ à´ªà´¿à´¨àµ\8dà´¨àµ\80à´\9fàµ\8d à´ªàµ\81à´¨à´\83à´¸à´\9càµ\8dà´\9càµ\80à´\95à´°à´¿à´\95àµ\8dà´\95ാനായി \"{{int:authprovider-resetpass-skip-label}}\" ഞെക്കുക.",
-       "resetpass-validity-soft": "താà´\99àµ\8dà´\95à´³àµ\81à´\9fàµ\86 à´°à´¹à´¸àµ\8dയവാà´\95àµ\8dà´\95àµ\8d à´¸à´¾à´§àµ\81തയàµ\81à´³àµ\8dളതലàµ\8dà´²: $1\n\nദയവായി à´ªàµ\81തിയàµ\8aà´°àµ\81 à´°à´¹à´¸àµ\8dയവാà´\95àµ\8dà´\95àµ\8d à´\87à´ªàµ\8dà´ªàµ\8bൾ à´¤à´¨àµ\8dà´¨àµ\86 à´¤à´¿à´°à´\9eàµ\8dà´\9eàµ\86à´\9fàµ\81à´\95àµ\8dà´\95àµ\81à´\95 à´\85à´²àµ\8dà´²àµ\86à´\99àµ\8dà´\95ിൽ à´ªà´¿à´¨àµ\8dà´¨àµ\80à´\9fàµ\8d à´ªàµ\81à´¨à´\83à´¸à´\9càµ\8dà´\9càµ\80à´\95à´°à´¿à´\95àµ\8dà´\95ുന്നതിനായി \"{{int:authprovider-resetpass-skip-label}}\" ഞെക്കുക.",
+       "resetpass-expired-soft": "താà´\99àµ\8dà´\95à´³àµ\81à´\9fàµ\86 à´°à´¹à´¸àµ\8dയവാà´\95àµ\8dà´\95àµ\8d à´\95ാലഹരണപàµ\8dà´ªàµ\86à´\9fàµ\8dà´\9fà´¿à´°à´¿à´\95àµ\8dà´\95àµ\81à´¨àµ\8dനതിനാൽ à´®à´¾à´±àµ\8dà´±àµ\87à´£àµ\8dà´\9fà´¤àµ\81à´£àµ\8dà´\9fàµ\8d. à´\87à´ªàµ\8dà´ªàµ\8bൾ à´¤à´¨àµ\8dà´¨àµ\86 à´ªàµ\81തിയ à´°à´¹à´¸àµ\8dയവാà´\95àµ\8dà´\95àµ\8d à´¤à´¿à´°à´\9eàµ\8dà´\9eàµ\86à´\9fàµ\81à´\95àµ\8dà´\95àµ\81à´\95 à´\85à´²àµ\8dà´²àµ\86à´\99àµ\8dà´\95ിൽ à´ªà´¿à´¨àµ\8dà´¨àµ\80à´\9fàµ\8d à´®à´¾à´±àµ\8dà´±àµ\81à´µാനായി \"{{int:authprovider-resetpass-skip-label}}\" ഞെക്കുക.",
+       "resetpass-validity-soft": "താà´\99àµ\8dà´\95à´³àµ\81à´\9fàµ\86 à´°à´¹à´¸àµ\8dയവാà´\95àµ\8dà´\95àµ\8d à´¸à´¾à´§àµ\81തയàµ\81à´³àµ\8dളതലàµ\8dà´²: $1\n\nദയവായി à´ªàµ\81തിയàµ\8aà´°àµ\81 à´°à´¹à´¸àµ\8dയവാà´\95àµ\8dà´\95àµ\8d à´\87à´ªàµ\8dà´ªàµ\8bൾ à´¤à´¨àµ\8dà´¨àµ\86 à´¤à´¿à´°à´\9eàµ\8dà´\9eàµ\86à´\9fàµ\81à´\95àµ\8dà´\95àµ\81à´\95 à´\85à´²àµ\8dà´²àµ\86à´\99àµ\8dà´\95ിൽ à´ªà´¿à´¨àµ\8dà´¨àµ\80à´\9fàµ\8d à´®à´¾à´±àµ\8dà´±ുന്നതിനായി \"{{int:authprovider-resetpass-skip-label}}\" ഞെക്കുക.",
        "passwordreset": "രഹസ്യവാക്ക് പുനഃക്രമീകരിക്കുക",
        "passwordreset-text-one": "രഹസ്യവാക്ക് പുനർസജ്ജീകരിക്കാനായി ഈ ഫോം പൂരിപ്പിക്കുക.",
        "passwordreset-text-many": "{{PLURAL:$1|ഇമെയിൽ വഴി താത്കാലിക രഹസ്യവാക്ക് ലഭിക്കാനായി താഴെ നൽകിയിരിക്കുന്നവയിൽ ഏതെങ്കിലുമൊന്ന് പൂരിപ്പിച്ചു നൽകുക.}}",
        "default": "സ്വതേ",
        "prefs-files": "പ്രമാണങ്ങൾ",
        "prefs-custom-css": "സ്വന്തം സി.എസ്.എസ്.",
+       "prefs-custom-json": "ഐച്ഛിക ജെസൺ",
        "prefs-custom-js": "സ്വന്തം ജെ.എസ്.",
        "prefs-common-config": "എല്ലാ ദൃശ്യരൂപങ്ങൾക്കുമായി പങ്ക് വെയ്ക്കപ്പെട്ട സി.എസ്.എസ്./ജെസൺ/ജാവാസ്ക്രിപ്റ്റ്:",
        "prefs-reset-intro": "സൈറ്റിൽ സ്വതേയുണ്ടാവേണ്ട ക്രമീകരണങ്ങൾ പുനഃക്രമീകരിക്കാൻ താങ്കൾക്ക് ഈ താൾ ഉപയോഗിക്കാവുന്നതാണ്.\nഇത് തിരിച്ചു ചെയ്യാൻ സാദ്ധ്യമല്ല.",
        "prefs-dateformat": "ദിന ലേഖന രീതി",
        "prefs-timeoffset": "സമയ വ്യത്യാസം",
        "prefs-advancedediting": "പൊതുവായിട്ടുള്ള ഐച്ഛികങ്ങൾ",
+       "prefs-developertools": "വികസന ഉപകരണങ്ങൾ",
        "prefs-editor": "എഡിറ്റർ",
        "prefs-preview": "എങ്ങനെയുണ്ടെന്ന് കാണൽ",
        "prefs-advancedrc": "വിപുലമായ ഉപാധികൾ",
        "rcfilters-other-review-tools": "മറ്റ് സംശോധന ഉപകരണങ്ങൾ",
        "rcfilters-group-results-by-page": "ഫലങ്ങൾ താളനുസരിച്ച് ഗണങ്ങളാക്കുക",
        "rcfilters-activefilters": "സജീവ അരിപ്പകൾ",
+       "rcfilters-activefilters-hide": "മറയ്ക്കുക",
+       "rcfilters-activefilters-show": "പ്രദർശിപ്പിക്കുക",
        "rcfilters-advancedfilters": "വിപുല അരിപ്പകൾ",
        "rcfilters-limit-title": "പ്രദർശിപ്പിക്കേണ്ട ഫലങ്ങൾ",
        "rcfilters-limit-and-date-label": "{{PLURAL:$1|ഒരു മാറ്റം|$1 മാറ്റങ്ങൾ}}, $2",
        "rcfilters-empty-filter": "സജീവ അരിപ്പകൾ ഇല്ല. എല്ലാ സംഭാവനകളും പ്രദർശിപ്പിക്കുന്നു.",
        "rcfilters-filterlist-title": "അരിപ്പകൾ",
        "rcfilters-filterlist-whatsthis": "ഇതെങ്ങനെയാണ് പ്രവർത്തിക്കുന്നത്?",
-       "rcfilters-filterlist-feedbacklink": "ഈ (പുതിയ) അരിച്ചെടുക്കൽ ഉപകരണങ്ങൾ എങ്ങനെയുണ്ടെന്ന് ഞങ്ങളോട് പറയുക",
+       "rcfilters-filterlist-feedbacklink": "ഈ അരിച്ചെടുക്കൽ ഉപകരണങ്ങൾ എങ്ങനെയുണ്ടെന്ന് ഞങ്ങളോട് പറയുക",
        "rcfilters-highlightbutton-title": "ഫലങ്ങൾ പ്രമുഖമാക്കി കാട്ടുക",
        "rcfilters-highlightmenu-title": "നിറം തിരഞ്ഞെടുക്കുക",
        "rcfilters-highlightmenu-help": "ഈ ഇനം പ്രമുഖമാക്കി കാട്ടാൻ ഒരു നിറം തിരഞ്ഞെടുക്കുക",
        "dellogpage": "മായ്ക്കൽ രേഖ",
        "dellogpagetext": "സമീപകാലത്ത് മായ്ക്കപ്പെട്ട താളുകളുടെ പട്ടിക താഴെ കാണാം.",
        "deletionlog": "മായ്ക്കൽ രേഖ",
+       "log-name-create": "താൾ സൃഷ്ടിയുടെ രേഖ",
+       "log-description-create": "സമീപകാലത്ത് സൃഷ്ടിക്കപ്പെട്ട താളുകളുടെ പട്ടിക താഴെ കാണാം.",
+       "logentry-create-create": "$3 എന്ന താൾ $1 {{GENDER:$2|സൃഷ്ടിച്ചു}}",
        "reverted": "പൂർവ്വസ്ഥിതിയിലേക്കാക്കിയിരിക്കുന്നു.",
        "deletecomment": "കാരണം:",
        "deleteotherreason": "മറ്റ്/കൂടുതൽ കാരണങ്ങൾ:",
        "thumbnail_dest_directory": "ലക്ഷ്യ ഡയറക്ടറി സൃഷ്ടിക്കുവാൻ സാധിച്ചില്ല",
        "thumbnail_image-type": "ചിത്രത്തിന്റെ തരം പിന്തുണക്കപ്പെട്ടതല്ല",
        "thumbnail_gd-library": "അപൂർണ്ണമായ ജി.ഡി. ലൈബ്രറി ക്രമീകരണം: ഫങ്ഷൻ $1 ലഭ്യമല്ല",
+       "thumbnail_image-size-zero": "ചിത്രപ്രമാണത്തിന്റെ വലിപ്പം പൂജ്യമായി കാണുന്നു.",
        "thumbnail_image-missing": "പ്രമാണം ലഭ്യമല്ലെന്നു കാണുന്നു: $1",
        "thumbnail_image-failure-limit": "ഈ ലഘുചിത്രം സൃഷ്ടിക്കാൻ നിരവധി പരാജയപ്പെട്ട ശ്രമങ്ങൾ ($1 അല്ലെങ്കിൽ കൂടുതൽ) നടന്നിട്ടുണ്ട്. ദയവായി പിന്നീട് ശ്രമിക്കുക.",
        "import": "താളുകൾ ഇറക്കുമതി ചെയ്യുക",
        "import-mapping-subpage": "ഇനിക്കൊടുക്കുന്ന താളിന്റെ ഉപതാളുകളായി ഇറക്കുമതി ചെയ്യുക:",
        "import-upload-filename": "പ്രമാണത്തിന്റെ പേര്‌",
        "import-upload-username-prefix": "അന്തർവിക്കി പൂർവ്വാക്ഷരങ്ങൾ:",
+       "import-assign-known-users": "പേരുനൽകിയിട്ടുള്ള ഉപയോക്താക്കൾ പ്രാദേശികമായി ഉണ്ടങ്കിൽ തിരുത്തുകൾ പ്രാദേശിക ഉപയോക്താക്കളുടേതായി നൽകുക",
        "import-comment": "കുറിപ്പ്:",
        "importtext": "ദയവായി സ്രോതസ്സ് വിക്കിയിൽ നിന്ന് [[Special:Export|കയറ്റുമതി ഉപകരണം]] ഉപയോഗിച്ച് പ്രമാണം കയറ്റുമതി ചെയ്യുക.\nഅത് താങ്കളുടെ കമ്പ്യൂട്ടറിൽ ശേഖരിച്ച് ഇവിടെ അപ്‌‌ലോഡ് ചെയ്യുക.",
        "importstart": "താളുകൾ ഇറക്കുമതി ചെയ്യുന്നു...",
        "imported-log-entries": "{{PLURAL:$1|രേഖയിലെ ഒരുൾപ്പെടുത്തൽ|രേഖയിലെ $1 ഉൾപ്പെടുത്തലുകൾ}} ഇറക്കുമതി ചെയ്തു.",
        "importfailed": "ഇറക്കുമതി പരാജയപ്പെട്ടു: <nowiki>$1</nowiki>",
        "importunknownsource": "അപരിചിതമായ ഇറക്കുമതി സ്രോതസ്സ് തരം",
+       "importnoprefix": "അന്തർവിക്കി പൂർവ്വപദം ഒന്നും നൽകിയിട്ടില്ലായിരുന്നു",
        "importcantopen": "ഇറക്കുമതി പ്രമാണം തുറക്കാൻ കഴിഞ്ഞില്ല",
        "importbadinterwiki": "മോശമായ അന്തർവിക്കി കണ്ണി",
        "importsuccess": "ഇറക്കുമതി ചെയ്തുകഴിഞ്ഞു!",
        "import-nonewrevisions": "ഒരു നാൾപ്പതിപ്പും ഇറക്കുമതി ചെയ്തിട്ടില്ല (എല്ലാം നിലവിൽ ഉണ്ട്, അല്ലെങ്കിൽ പിഴവുകളുള്ളതിനാൽ ഒഴിവാക്കി).",
        "xml-error-string": "$2 വരിയിൽ $1, നിര $3 (ബൈറ്റ് $4): $5",
        "import-upload": "എക്സ്.എം.എൽ. ഡേറ്റ അപ്‌‌ലോഡ് ചെയ്യുക",
-       "import-token-mismatch": "à´¸àµ\86ഷൻ à´¡à´¾à´±àµ\8dà´± à´¨à´·àµ\8dà´\9fà´ªàµ\8dà´ªàµ\86à´\9fàµ\8dà´\9fതിനാൽ à´¦à´¯à´µà´¾à´¯à´¿ à´µàµ\80à´£àµ\8dà´\9fàµ\81à´\82 à´¶àµ\8dരമിà´\95àµ\8dà´\95àµ\82à´\95",
+       "import-token-mismatch": "à´¸àµ\86ഷൻ à´¡àµ\87à´±àµ\8dà´± à´¨à´·àµ\8dà´\9fà´ªàµ\8dà´ªàµ\86à´\9fàµ\8dà´\9fà´¿à´°à´¿à´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨àµ\81.\n\nതാà´\99àµ\8dà´\95ൾ à´ªàµ\81റതàµ\8dà´¤àµ\8d à´\95à´\9fà´¨àµ\8dനിà´\9fàµ\8dà´\9fàµ\81à´£àµ\8dà´\9fà´¾à´\95à´¾à´\82. '''à´\87à´ªàµ\8dà´ªàµ\8bà´´àµ\81à´\82 à´ªàµ\8dà´°à´µàµ\87ശിà´\9aàµ\8dà´\9aà´¿à´°à´¿à´\95àµ\8dà´\95àµ\81à´\95യാണàµ\86à´¨àµ\8dà´¨àµ\8d à´\89റപàµ\8dà´ªàµ\8d à´µà´°àµ\81à´¤àµ\8dതിയിà´\9fàµ\8dà´\9fàµ\8d à´µàµ\80à´£àµ\8dà´\9fàµ\81à´\82 à´¶àµ\8dരമിà´\95àµ\8dà´\95àµ\81à´\95'''.\nà´\8eà´¨àµ\8dനിà´\9fàµ\8dà´\9fàµ\81à´\82 à´¶à´°à´¿à´¯à´¾à´µàµ\81à´¨àµ\8dനിലàµ\8dà´²àµ\86à´\99àµ\8dà´\95ിൽ [[Special:UserLogout|à´²àµ\8bà´\97àµ\97à´\9fàµ\8dà´\9fàµ\8d à´\9aàµ\86à´¯àµ\8dതതിനàµ\81 à´¶àµ\87à´·à´\82]] à´µàµ\80à´£àµ\8dà´\9fàµ\81à´\82 à´²àµ\8bà´\97ിൻ à´\9aàµ\86à´¯àµ\8dà´¤àµ\81à´¨àµ\8bà´\95àµ\8dà´\95àµ\81à´\95, à´¤à´¾à´\99àµ\8dà´\95à´³àµ\81à´\9fàµ\86 à´¬àµ\8dà´°àµ\97സർ à´\88 à´¸àµ\88à´±àµ\8dറിൽ à´¨à´¿à´¨àµ\8dà´¨àµ\81à´®àµ\81à´³àµ\8dà´³ à´\95àµ\81à´\95àµ\8dà´\95à´¿à´\95ൾ à´\85à´¨àµ\81വദിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨àµ\81à´£àµ\8dà´\9fàµ\86à´¨àµ\8dà´¨àµ\8d à´\89റപàµ\8dà´ªàµ\81വരàµ\81à´¤àµ\8dà´¤àµ\81à´\95.",
        "import-invalid-interwiki": "താങ്കൾ നിർദ്ദേശിച്ച വിക്കിയിൽനിന്നും ഇറക്കുമതിചെയ്യാൻ സാധിച്ചില്ല",
        "import-error-edit": "\"$1\" എന്ന താൾ തിരുത്താനുള്ള അനുമതി താങ്കൾക്ക് ഇല്ലാത്തതിനാൽ അത് ഇറക്കുമതി ചെയ്തില്ല.",
        "import-error-create": "\"$1\" എന്ന താൾ സൃഷ്ടിക്കാനുള്ള അനുമതി താങ്കൾക്ക് ഇല്ലാത്തതിനാൽ അത് ഇറക്കുമതി ചെയ്തില്ല.",
        "group-bot.css": "/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. ബോട്ടുകൾക്ക് ബാധകമായിരിക്കും */",
        "group-sysop.css": "/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. കാര്യനിർവാഹകർക്ക് ബാധകമായിരിക്കും */",
        "group-bureaucrat.css": "/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. ബ്യൂറോക്രാറ്റുകൾക്ക് ബാധകമായിരിക്കും */",
+       "common.json": "/* ഇവിടെ നൽകുന്ന ജെസൺ എല്ലാ ഉപയോക്താക്കൾക്കും, എല്ലാ താളുകളിലും പ്രവർത്തിക്കുന്നതായിരിക്കും */",
        "common.js": "/* ഇവിടെ നൽകുന്ന ജാവാസ്ക്രിപ്റ്റ് എല്ലാ ഉപയോക്താക്കൾക്കും, എല്ലാ താളുകളിലും പ്രവർത്തിക്കുന്നതായിരിക്കും */",
        "group-autoconfirmed.js": "/* ഇവിടെ നൽകുന്ന ജാവാസ്ക്രിപ്റ്റ് യാന്ത്രികമായി സ്ഥിരീകരിക്കപ്പെട്ട ഉപയോക്താക്കൾക്ക് ബാധകമായിരിക്കും */",
        "group-bot.js": "/* ഇവിടെ നൽകുന്ന ജാവാസ്ക്രിപ്റ്റ് ബോട്ടുകൾക്ക് ബാധകമായിരിക്കും */",
        "newimages-hidepatrolled": "റോന്തുചുറ്റപ്പെട്ട അപ്‌ലോഡുകൾ മറയ്ക്കുക",
        "newimages-mediatype": "മീഡിയ തരം:",
        "noimages": "ഒന്നും കാണാനില്ല.",
+       "gallery-slideshow-toggle": "ലഘുചിത്രങ്ങൾ മാറ്റിക്കാണിക്കുക",
        "ilsubmit": "തിരയൂ",
        "bydate": "ദിനക്രമത്തിൽ",
        "sp-newimages-showfrom": "$2, $1 നു ശേഷം അപ്‌ലോഡ് ചെയ്ത പ്രമാണങ്ങൾ പ്രദർശിപ്പിക്കുക",
diff --git a/languages/i18n/mni.json b/languages/i18n/mni.json
new file mode 100644 (file)
index 0000000..d6033e1
--- /dev/null
@@ -0,0 +1,588 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Awangba Mangang"
+               ]
+       },
+       "tog-underline": "ꯃꯔꯤꯂꯩꯅꯥꯍꯜꯂꯨ",
+       "tog-hideminor": "ꯂꯣꯠꯂꯨ ꯈꯖꯤꯛꯇꯪ ꯁꯣꯏꯕꯗꯒꯤ",
+       "tog-hidepatrolled": "ꯂꯣꯠꯂꯨ ꯈꯖꯤꯛꯇꯪ ꯁꯣꯏꯕꯗꯒꯤ ꯍꯧꯖꯤꯛꯀꯤ ꯑꯍꯣꯡꯕꯗꯒꯤ",
+       "tog-newpageshidepatrolled": "Hide patrolled pages from new page list",
+       "tog-hidecategorization": "ꯂꯥꯃꯥꯏꯒꯤ ꯃꯊꯪ ꯃꯅꯥꯎ ꯅꯥꯏꯕꯥ ꯂꯣꯠꯄꯥ",
+       "tog-extendwatchlist": "ꯌꯦꯡꯅꯕꯥ ꯄꯥꯔꯦꯡꯗꯨ ꯄꯥꯛꯊꯣꯛꯍꯟꯂꯨ ꯑꯍꯣꯡꯕꯥ ꯂꯣꯏꯅꯥ ꯎꯅꯕꯥ, ꯍꯧꯖꯤꯛꯀꯤ ꯈꯋꯥꯏꯗꯒꯤ ꯑꯅꯛꯄ ꯑꯍꯣꯡꯕꯗꯨ ꯅꯠꯇꯕꯥ",
+       "tog-usenewrc": "Group changes by page in recent changes and watchlist",
+       "tog-numberheadings": "ꯃꯁꯥ ꯃꯇꯣꯝꯇꯥ-ꯃꯁꯤꯡ-ꯃꯀꯣꯛꯁꯤꯡ",
+       "tog-showtoolbar": "ꯁꯦꯝꯒꯠꯅꯕ ꯇꯨꯜꯕꯥꯔ ꯎꯨꯠꯂꯨ",
+       "tog-editondblclick": "꯲ ꯔꯛ ꯅꯝꯃꯒꯥ ꯂꯥꯃꯥꯏꯗꯨ ꯁꯦꯝꯒꯠꯂꯨ",
+       "tog-editsectiononrightclick": "section titles ꯗ ꯌꯦꯠꯅ ꯅꯝꯗꯨꯅꯥ ꯁꯦꯝꯒꯠꯂꯛꯅꯕꯒꯤ ꯃꯐꯝꯗꯨ ꯌꯥꯍꯟꯂꯨ",
+       "tog-watchcreations": "ꯍꯥꯞꯆꯤꯟꯂꯨ ꯑꯩꯅꯥ ꯁꯦꯝꯂꯛꯄꯥ ꯂꯥꯃꯥꯏꯗꯨ ꯑꯃꯗꯤ ꯑꯩꯅꯥ ꯊꯥꯒꯠꯂꯛꯄꯥ ꯐꯥꯏꯜ ꯗꯨ ꯑꯩꯒꯤ ꯌꯦꯡꯅꯕꯥ ꯄꯔꯦꯡꯗꯥ",
+       "tog-watchdefault": "ꯍꯥꯞꯆꯤꯟꯂꯨ ꯂꯥꯃꯥꯏ ꯑꯃꯗꯤ ꯑꯩꯅꯥ ꯁꯦꯝꯒꯠꯂꯛꯄꯥ ꯐꯥꯏꯜ ꯗꯨ ꯑꯩꯒꯤ ꯌꯦꯡꯅꯕꯥ ꯄꯔꯦꯡꯗ",
+       "tog-watchmoves": "I move to my watchlist ꯍꯥꯞꯆꯤꯟꯂꯨ ꯂꯥꯃꯥꯏ ꯑꯃꯗꯤ ꯐꯥꯏꯜꯁꯤꯡ",
+       "tog-watchdeletion": "ꯍꯥꯞꯆꯤꯟꯂꯨ ꯂꯥꯃꯥꯏ ꯑꯃꯗꯤ ꯐꯥꯏꯜ ꯑꯩꯅꯥ ꯀꯛꯊꯠꯈꯤꯕꯥ ꯗꯨ ꯑꯩꯒꯤ ꯌꯦꯡꯅꯕꯥ ꯄꯔꯦꯡꯗꯥ",
+       "tog-watchuploads": "ꯍꯥꯞꯆꯤꯟꯂꯨ ꯑꯅꯧꯕꯥ ꯐꯥꯏꯜ ꯑꯩꯅꯥ ꯊꯥꯒꯠꯈꯤꯕꯗꯨ ꯑꯩꯒꯤ ꯌꯦꯡꯅꯕꯥ ꯄꯔꯦꯡꯗꯥ",
+       "tog-watchrollback": "ꯂꯥꯃꯥꯏ ꯍꯥꯞꯆꯤꯟꯂꯨ where I have performed a rollback to ꯑꯩꯒꯤ ꯌꯦꯡꯅꯕꯥ ꯄꯔꯦꯡꯗꯥ",
+       "tog-minordefault": "Mark all edits minor by default",
+       "tog-previewontop": "Show preview before edit box",
+       "tog-previewonfirst": "Show preview on first edit",
+       "tog-enotifwatchlistpages": "Email me when a page or a file on my watchlist is changed",
+       "tog-enotifusertalkpages": "Email me when my user talk page is changed",
+       "tog-enotifminoredits": "Email me also for minor edits of pages and files",
+       "tog-enotifrevealaddr": "Reveal my email address in notification emails",
+       "tog-shownumberswatching": " watching users ꯀꯤ ꯃꯁꯤꯡꯗꯨ ꯎꯨꯠꯂꯨ",
+       "tog-oldsig": "ꯅꯪꯒꯤ gi hanna leijariba khutyek",
+       "tog-fancysig": "Khutyek tu wikitext oina khanlu(Mashamatomta Samnafam yaodaba)",
+       "tog-uselivepreview": "Anouba ꯂꯥꯃꯥꯏ chingthadabida hannagido ootlu",
+       "tog-forceeditsummary": "Ahangba semgatlakpa hapchinlak pa matamda hairak o eingonda",
+       "tog-watchlisthideown": " watchlist tagi eigi semgatlakpa c lotlu",
+       "tog-watchlisthidebots": "watchlist tagi bot semgatlakpa du lotlu",
+       "tog-watchlisthideminor": "Yengnaba Parengdagi eigi apikpa semgatlak pa su lotlu",
+       "tog-watchlisthideliu": " watchlist tagi changsinlu sijinnariba shingna semgatlakliba du lotnaba",
+       "tog-watchlistreloadautomatically": "Reload the watchlist automatically whenever a filter is changed (JavaScript required)",
+       "tog-watchlistunwatchlinks": "Add direct unwatch/watch markers ({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}) to watched pages with changes (JavaScript required for toggle functionality)",
+       "tog-watchlisthideanons": " watchlist tagi changsinlu sijinnariba shingna semgatlakliba du lotnaba",
+       "tog-watchlisthidepatrolled": "Yengnaba Parengdagi eigi apikpa semgatlak pa su lotlu",
+       "tog-watchlisthidecategorization": "ꯂꯥꯃꯥꯏꯒꯤ ꯃꯊꯪ ꯃꯅꯥꯎ ꯅꯥꯏꯕꯥ ꯂꯣꯠꯄꯥ",
+       "tog-ccmeonemails": "Send me copies of emails I send to other users",
+       "tog-diffonly": "ꯂꯥꯃꯥꯏꯒꯤ ꯑꯌꯥꯎꯕꯥꯗꯨ ꯃꯈꯥꯒꯤ diffs ꯇꯥ ꯎꯨꯠꯀꯅꯨ",
+       "tog-showhiddencats": "ꯑꯔꯣꯠꯄꯥ ꯃꯊꯪ ꯃꯅꯥꯎ ꯅꯥꯏꯕꯗꯨ ꯎꯨꯠꯂꯨ",
+       "tog-norollbackdiff": "Don't show diff after performing a rollback",
+       "tog-useeditwarning": "Warn me when I leave an edit page with unsaved changes",
+       "tog-prefershttps": "Always use a secure connection while logged in",
+       "underline-always": "ꯑꯗꯨꯝ",
+       "underline-never": "ꯁꯪꯇꯧ ꯇꯧꯔꯣꯏꯗꯕꯥ",
+       "underline-default": "Skin or browser default",
+       "editfont-style": "font style ꯒꯤ ꯁꯦꯝꯒꯠꯂꯛꯅꯕꯥ ꯃꯐꯝ:",
+       "editfont-monospace": "Monospaced font",
+       "editfont-sansserif": "Sans-serif font",
+       "editfont-serif": "Serif font",
+       "sunday": "ꯅꯣꯡꯃꯥꯏꯖꯤꯡ",
+       "monday": "ꯅꯤꯡꯊꯧꯀꯥꯕꯥ",
+       "tuesday": "ꯂꯩꯄꯥꯛꯄꯣꯛꯄꯥ",
+       "wednesday": "ꯌꯨꯝꯁꯥꯀꯩꯁꯥ",
+       "thursday": "ꯁꯥꯒꯣꯜꯁꯦꯟ",
+       "friday": "ꯏꯔꯥꯏ",
+       "saturday": "ꯊꯥꯡꯖꯥ",
+       "sun": "ꯅꯨꯃꯤꯠ",
+       "mon": "ꯅꯤꯡ",
+       "tue": "ꯂꯩ",
+       "wed": "ꯌꯨꯝ",
+       "thu": "ꯁꯥꯀꯣꯜ",
+       "fri": "ꯏꯔꯥꯏ",
+       "sat": "ꯊꯥꯡ",
+       "january": "ꯖꯥꯅꯨꯋꯥꯔꯤ",
+       "february": "ꯐꯦꯕꯨꯋꯥꯔꯤ",
+       "march": "ꯃꯥꯔꯆ",
+       "april": "ꯑꯦꯄꯔꯤꯜ",
+       "may_long": "ꯃꯦ",
+       "june": "ꯖꯨꯟ",
+       "july": "ꯖꯨꯂꯥꯏ",
+       "august": "ꯑꯥꯒꯥꯁꯇ",
+       "september": "ꯁꯦꯄꯇꯦꯝꯕꯔ",
+       "october": "ꯑꯣꯛꯇꯣꯕꯔ",
+       "november": "ꯅꯣꯕꯦꯝꯕꯔ",
+       "december": "ꯗꯤꯁꯦꯝꯕꯔ",
+       "january-gen": "ꯖꯥꯅꯨꯋꯥꯔꯤ",
+       "february-gen": "ꯐꯦꯕꯨꯋꯥꯔꯤ",
+       "march-gen": "ꯃꯥꯔꯆ",
+       "april-gen": "ꯑꯦꯄꯔꯤꯜ",
+       "may-gen": "ꯃꯦ",
+       "june-gen": "ꯖꯨꯟ",
+       "july-gen": "ꯖꯨꯂꯥꯏ",
+       "august-gen": "ꯑꯥꯒꯥꯁꯇ",
+       "september-gen": "ꯁꯦꯞꯇꯦꯝꯕꯔ",
+       "october-gen": "ꯑꯣꯛꯇꯣꯕꯔ",
+       "november-gen": "ꯅꯣꯕꯦꯝꯕꯔ",
+       "december-gen": "ꯗꯤꯁꯦꯝꯕꯔ",
+       "jan": "ꯖꯥꯟ",
+       "feb": "ꯐꯦꯕ",
+       "mar": "ꯃꯥꯔ",
+       "apr": "ꯑꯦꯄꯔ",
+       "may": "ꯃꯦ",
+       "jun": "ꯖꯨꯟ",
+       "jul": "ꯖꯨꯜ",
+       "aug": "ꯑꯥꯒ",
+       "sep": "ꯁꯦꯞ",
+       "oct": "ꯑꯣꯇ",
+       "nov": "ꯅꯣꯕ",
+       "dec": "ꯗꯦꯈ",
+       "january-date": "$1 ꯖꯥꯅꯨꯋꯥꯔꯤ",
+       "february-date": "$1 ꯄꯦꯕꯔꯨꯋꯥꯔꯤ",
+       "march-date": "$1ꯃꯥꯔꯆ",
+       "april-date": "$1 ꯑꯦꯄꯔꯤꯜ",
+       "may-date": "$1 ꯃꯦ",
+       "june-date": "$1 ꯖꯨꯟ",
+       "july-date": "$1 ꯖꯨꯂꯥꯏ",
+       "august-date": "$1 ꯑꯒꯨꯁꯇ",
+       "september-date": "$1 ꯁꯦꯞꯇꯦꯝꯕꯔ",
+       "october-date": "$1 ꯑꯣꯛꯇꯣꯕꯔ",
+       "november-date": "$1 ꯅꯥꯕꯦꯝꯕꯔ",
+       "december-date": "$1 ꯗꯤꯁꯦꯝꯕꯔ",
+       "period-am": "ꯑꯦ ꯑꯦꯝ",
+       "period-pm": "ꯄꯤ ꯑꯦꯝ",
+       "pagecategories": "{{PLURAL:$1|Category|Categories}}",
+       "category_header": "$1 ꯗꯥ ꯂꯩꯕꯥ ꯂꯥꯃꯥꯏꯒꯤ ꯃꯆꯥꯈꯥꯏꯕꯥ",
+       "subcategories": "ꯃꯆꯥꯈꯥꯏꯕꯥ ꯃꯆꯥ",
+       "category-media-header": "$1 ꯗꯥ ꯂꯩꯕꯥ ꯃꯦꯗꯤꯌꯥꯒꯤ ꯃꯆꯥꯈꯥꯏꯕꯥ",
+       "category-empty": "<em>This category currently contains no pages or media.</em>",
+       "hidden-categories": "{{PLURAL:$1|Hidden category|Hidden categories}}",
+       "hidden-category-category": "ꯑꯔꯣꯠꯄꯥ ꯃꯊꯪ ꯃꯅꯥꯎ ꯅꯥꯏꯕꯥ",
+       "category-subcat-count": "{{PLURAL:$2|This category has only the following subcategory.|This category has the following {{PLURAL:$1|subcategory|$1 subcategories}}, out of $2 total.}}",
+       "category-subcat-count-limited": "This category has the following {{PLURAL:$1|subcategory|$1 subcategories}}.",
+       "category-article-count": "{{PLURAL:$2|This category contains only the following page.|The following {{PLURAL:$1|page is|$1 pages are}} in this category, out of $2 total.}}",
+       "category-article-count-limited": "The following {{PLURAL:$1|page is|$1 pages are}} in the current category.",
+       "category-file-count": "{{PLURAL:$2|This category contains only the following file.|The following {{PLURAL:$1|file is|$1 files are}} in this category, out of $2 total.}}",
+       "category-file-count-limited": "The following {{PLURAL:$1|file is|$1 files are}} in the current category.",
+       "listingcontinuesabbrev": "ꯆꯠꯊꯕꯥ",
+       "index-category": "Indexed ꯂꯥꯃꯥꯏꯁꯤꯡ",
+       "noindex-category": "Noindexed ꯂꯥꯃꯥꯏꯁꯤꯡ",
+       "broken-file-category": " ꯀꯥꯏꯔꯕꯥ file links ꯒꯥ ꯂꯣꯏꯅꯕꯥ ꯂꯥꯃꯥꯏꯁꯤꯡ",
+       "about": "ꯄꯣꯠꯇꯨꯗꯤ ꯃꯔꯝꯗꯥ",
+       "article": "ꯂꯥꯃꯥꯏꯁꯤꯗꯥ ꯌꯥꯎꯕꯥ ꯄꯨꯝꯅꯃꯛ",
+       "newwindow": "ꯑꯅꯧꯕꯥ ꯊꯣꯡꯅꯥꯎꯗꯥ ꯍꯥꯡꯗꯣꯛ ꯎ",
+       "cancel": "ꯀꯛꯊꯠꯄꯥ",
+       "moredotdotdot": "ꯋꯥꯠꯂꯤ",
+       "morenotlisted": "ꯃꯁꯤꯒꯤ ꯄꯔꯦꯡꯁꯤ ꯃꯄꯨꯡ ꯐꯥꯗꯦ",
+       "mypage": "ꯂꯥꯃꯥꯏ",
+       "mytalk": "ꯉꯥꯡꯐꯝ",
+       "anontalk": "ꯉꯥꯡꯐꯝ",
+       "navigation": "ꯆꯠꯄꯥ",
+       "and": "꯱ꯁꯪ #꯳꯲; ꯑꯃꯁꯨꯪ",
+       "faq": "FAQ",
+       "actions": "Actions",
+       "namespaces": "ꯃꯥꯃꯤꯡꯒꯤ ꯃꯐꯝ",
+       "variants": "ꯈꯦꯇꯅꯕꯥ",
+       "navigation-heading": "Chatnaba Yengfam",
+       "errorpagetitle": "ꯑꯔꯥꯟꯕꯥ",
+       "returnto": "$1 ꯗꯥ ꯍꯟꯂꯨ",
+       "tagline": "ꯃꯔꯝꯗꯥ ꯃꯐꯝꯗꯨꯒꯤ ꯃꯃꯤꯡ",
+       "help": "ꯃꯥꯇꯦꯡ",
+       "search": "ꯊꯤꯕꯥ",
+       "search-ignored-headings": " #<!-- leave this line exactly as it is --> <pre>\n# Headings that will be ignored by search.\n# Changes to this take effect as soon as the page with the heading is indexed.\n# You can force page reindexing by doing a null edit.\n# The syntax is as follows:\n#   * Everything from a \"#\" character to the end of the line is a comment.\n#   * Every non-blank line is the exact title to ignore, case and everything.\nReferences\nExternal links\nSee also\n #</pre> <!-- leave this line exactly as it is -->",
+       "searchbutton": "ꯇꯤꯕꯥ",
+       "go": "ꯆꯠꯂꯨ",
+       "searcharticle": "Chatlu",
+       "history": "ꯂꯥꯃꯥꯏꯒꯤ ꯄꯨꯋꯥꯔꯤ",
+       "history_short": "ꯄꯨꯋꯥꯔꯤ",
+       "history_small": "ꯄꯨꯋꯥꯔꯤ",
+       "updatedmarker": "updated since my last visit",
+       "printableversion": "ꯅꯝꯊꯣꯛꯄꯥꯌꯥꯕꯥ ꯃꯑꯣꯡ",
+       "permalink": "Matampumbagi Samafam",
+       "print": "ꯅꯝꯕꯥ",
+       "view": "ꯃꯤꯠꯌꯦꯡ",
+       "view-foreign": "$1 ꯗꯥ ꯌꯦꯡꯉꯨ",
+       "edit": "ꯁꯦꯝꯒꯠꯄꯥ",
+       "edit-local": "Edit local description",
+       "create": "ꯁꯥꯕꯥ",
+       "create-local": "ꯁꯨꯋꯥꯏꯒꯤ ꯁꯟꯗꯣꯛꯅꯥ ꯇꯥꯛꯄꯗꯨ ꯍꯥꯞꯆꯤꯟꯂꯨ",
+       "delete": "ꯀꯛꯊꯠꯄꯥ",
+       "undelete_short": "Undelete {{PLURAL:$1|one edit|$1 edits}}",
+       "viewdeleted_short": "View {{PLURAL:$1|one deleted edit|$1 deleted edits}}",
+       "protect": "ꯉꯥꯛꯊꯣꯛꯂꯕꯥ",
+       "protect_change": "ꯑꯍꯣꯡꯕꯥ",
+       "unprotect": "ꯍꯥꯛꯊꯣꯛꯂꯕꯥ ꯗꯨ ꯍꯣꯡꯕꯥ",
+       "newpage": "ꯑꯅꯧꯕꯥ ꯂꯥꯃꯥꯏ",
+       "talkpagelinktext": "ꯉꯥꯡꯐꯝ",
+       "specialpage": "MediaWiki:Bs-wikiadmin-mediawiki-akhannaba-lamai-text/mni",
+       "personaltools": "ꯏꯁꯥꯒꯥ ꯂꯣꯏꯅꯕꯥ ꯈꯨꯠꯂꯥꯏ",
+       "talk": "Khanna Neinaba",
+       "views": "ꯃꯤꯠꯌꯦꯡ",
+       "toolbox": "ꯈꯨꯠꯂꯥꯏ",
+       "tool-link-userrights": "Change {{GENDER:$1|user}} groups",
+       "tool-link-userrights-readonly": "View {{GENDER:$1|user}} groups",
+       "tool-link-emailuser": "Email this {{GENDER:$1|user}}",
+       "imagepage": "File lamai du ootlu",
+       "mediawikipage": "ꯄꯥꯎꯖꯦꯜꯒꯤ ꯂꯥꯃꯥꯏꯗꯨ ꯎꯨꯠꯂꯨ",
+       "templatepage": "ꯇꯦꯝꯄꯂꯦꯠꯀꯤ ꯂꯥꯃꯥꯏꯗꯨ ꯎꯨꯠꯂꯨ",
+       "viewhelppage": "ꯃꯇꯦꯡ ꯄꯥꯡꯅꯕꯒꯤ ꯂꯥꯃꯥꯏꯗꯨ ꯎꯨꯠꯂꯨ",
+       "categorypage": "Macahkhaiba lamai oootlooo",
+       "viewtalkpage": "ꯈꯟꯅꯥ ꯅꯩꯅꯕꯗꯨ ꯎꯨꯠꯂꯨ",
+       "otherlanguages": "ꯑꯇꯣꯞꯄꯥ ꯂꯣꯟꯁꯤꯡꯗꯥ",
+       "redirectedfrom": "(Redirected from $1)",
+       "redirectpagesub": "ꯑꯃꯨꯛ ꯍꯟꯂꯛꯄꯥ ꯂꯥꯃꯥꯏ",
+       "redirectto": "Redirect to:",
+       "lastmodifiedat": "$2$1 ꯃꯁꯤꯒꯤ ꯂꯃꯥꯏꯁꯤ ꯑꯔꯣꯏꯕꯥ ꯁꯦꯝꯒꯠꯈꯤꯕꯥ",
+       "viewcount": "This page has been accessed {{PLURAL:$1|once|$1 times}}?",
+       "protectedpage": "ꯍꯥꯛꯊꯣꯛꯂꯕꯥ ꯂꯥꯃꯥꯏ",
+       "jumpto": "ꯑꯗꯨꯗꯥ  ꯆꯣꯡꯈꯠꯄꯥ",
+       "jumptonavigation": "ꯆꯠꯄꯥ",
+       "jumptosearch": "ꯊꯤꯕꯥ",
+       "view-pool-error": "Sorry, the servers are overloaded at the moment.\nToo many users are trying to view this page.\nPlease wait a while before you try to access this page again.\n\n$1",
+       "generic-pool-error": "Sorry, the servers are overloaded at the moment.\nToo many users are trying to view this resource.\nPlease wait a while before you try to access this resource again.",
+       "pool-timeout": "ꯃꯇꯝ ꯍꯦꯟꯂꯦ ꯂꯣꯟꯅꯕꯥꯒꯤ ꯉꯥꯏꯕꯥ",
+       "pool-queuefull": "ꯄꯨꯜꯒꯤ ꯄꯔꯦꯡ ꯊꯟꯂꯦ",
+       "pool-errorunknown": "ꯁꯛꯈꯪꯗꯕꯥ ꯑꯔꯥꯟꯕꯥ",
+       "pool-servererror": "$1 ꯄꯨꯜ ꯀꯥꯎꯟꯇꯔ ꯇꯧꯅꯕꯥ ꯂꯩꯇꯔꯦ",
+       "poolcounter-usage-error": "$1:ꯁꯤꯖꯤꯟꯅꯔꯤꯕꯥ ꯑꯔꯥꯟꯕꯥ",
+       "aboutsite": "ꯃꯔꯝꯗꯥ ꯃꯐꯝꯗꯨꯒꯤ ꯃꯃꯤꯡ",
+       "aboutpage": "Project:ꯃꯔꯝꯗꯥ",
+       "copyright": "$1 ꯒꯤ ꯃꯇꯦꯡꯅ ꯃꯅꯨꯡꯒꯤ ꯑꯌꯥꯑꯣꯕꯥ ꯐꯪꯒꯅꯤ ꯅꯠꯇꯔꯒꯥ ꯏꯁꯤꯟꯗꯔꯤꯒꯩ",
+       "copyrightpage": "{{ns:project}}: ꯁꯤꯟꯗꯣꯔꯛꯄꯒꯤ ꯍꯛ",
+       "currentevents": "Houjikkee thouram",
+       "currentevents-url": "Project:houjikkee thouram",
+       "disclaimers": "ꯌꯥꯅꯤꯡꯗꯕꯥ ꯐꯣꯡꯗꯣꯛꯄꯁꯤꯡ",
+       "disclaimerpage": "Project:ꯃꯌꯥꯝꯒꯤ ꯑꯣꯏꯅꯥ ꯌꯥꯅꯤꯡꯗꯕꯥ ꯐꯣꯡꯗꯣꯔꯛꯄꯥ",
+       "edithelp": "ꯁꯦꯝꯒꯠꯅꯕꯥ ꯃꯥꯇꯦꯡ",
+       "helppage-top-gethelp": "ꯃꯥꯇꯦꯡ",
+       "mainpage": "ꯃꯔꯨ ꯑꯣꯏꯕꯥ ꯂꯃꯥꯏ",
+       "mainpage-description": "ꯃꯔꯨ ꯑꯣꯏꯕꯥ ꯂꯃꯥꯏ",
+       "policy-url": "Project:ꯈꯣꯡꯊꯥꯡ",
+       "portal": "Meeyam gi portal",
+       "portal-url": "Project:Meeyam gi oiba portal",
+       "privacy": "ꯑꯔꯣꯟꯕꯥ ꯊꯧꯔꯥꯡ",
+       "privacypage": "Project:ꯑꯔꯣꯟꯕꯥ ꯊꯧꯔꯥꯡ",
+       "badaccess": "ꯑꯌꯥꯕꯥꯗꯨ ꯁꯣꯏꯔꯦ",
+       "badaccess-group0": "ꯅꯪ ꯍꯧꯖꯤꯛ ꯑꯦꯛꯁꯟ ꯂꯧꯈꯠꯄꯥ ꯌꯥꯗꯔꯤ ꯅꯪꯅꯥ ꯍꯪꯒꯠꯆꯔꯤꯕꯗꯨꯒꯤ ꯃꯇꯥꯡꯗ",
+       "badaccess-groups": "The action you have requested is limited to users in {{PLURAL:$2|the group|one of the groups}}: $1.",
+       "versionrequired": "ꯃꯦꯗꯤꯌꯥ ꯋꯤꯀꯤꯅ ꯋꯥꯠꯂꯤꯕꯥ $1ꯕꯔꯖꯟ",
+       "versionrequiredtext": "ꯃꯦꯗꯤꯌꯥ ꯋꯤꯀꯤꯅ ꯋꯥꯠꯂꯤꯕꯥ $1ꯕꯔꯖꯟ ꯃꯁꯤꯒꯤ ꯂꯥꯃꯥꯏꯁꯤꯗꯥ ꯁꯤꯖꯤꯟꯅꯕꯥ [[Special:Version|version page]].",
+       "ok": "ꯌꯥꯔꯦ",
+       "retrievedfrom": "$1 ꯃꯐꯝꯗꯨꯗꯒꯤ ꯑꯣꯏꯔꯛꯄꯥ",
+       "youhavenewmessages": "{{PLURAL:$3|You have}} $1 ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|You have}} $1 from {{PLURAL:$3|another user|$3 users}} ($2).",
+       "youhavenewmessagesmanyusers": "ꯅꯪ $1 ꯂꯩꯔꯦ $2 ꯁꯤꯖꯤꯟꯅꯔꯤꯕꯥ ꯃꯌꯥꯝꯗꯒꯤ",
+       "newmessageslinkplural": "{{PLURAL:$1|a new message|999=new messages}}",
+       "newmessagesdifflinkplural": "ꯑꯔꯣꯏꯕꯥ {{PLURAL:$1|change|999=changes}}",
+       "youhavenewmessagesmulti": "$1 ꯅꯪꯒꯤ ꯑꯅꯧꯕꯥ ꯃꯦꯁꯦꯁ",
+       "editsection": "ꯁꯦꯝꯒꯠꯄꯥ",
+       "editold": "ꯁꯦꯝꯒꯠꯄꯥ",
+       "viewsourceold": "ꯍꯧꯔꯛꯐꯝ ꯎꯨꯇꯂꯨ",
+       "editlink": "ꯁꯦꯝꯒꯠꯄꯥ",
+       "viewsourcelink": "ꯍꯧꯔꯛꯐꯝ ꯎꯨꯇꯂꯨ",
+       "editsectionhint": "ꯁꯦꯝꯒꯠꯄꯒꯤ ꯁꯔꯨꯛ: $1",
+       "toc": "ꯑꯌꯥꯎꯕꯥ",
+       "showtoc": "ꯎꯨꯠꯂꯨ",
+       "hidetoc": "ꯂꯣꯇꯄꯥ",
+       "collapsible-collapse": "ꯁꯨꯞꯆꯤꯟꯕꯥ",
+       "collapsible-expand": "ꯄꯥꯛꯊꯣꯛꯄꯥ",
+       "confirmable-confirm": "Are {{GENDER:$1|you}} sure?",
+       "confirmable-yes": "ꯍꯣꯏ",
+       "confirmable-no": "ꯅꯠꯇꯦ",
+       "thisisdeleted": "View or restore $1?",
+       "viewdeleted": "$1 ꯌꯦꯡꯍꯟꯂꯨ?",
+       "restorelink": "{{PLURAL:$1|one deleted edit|$1 deleted edits}}",
+       "feedlinks": "ꯐꯤꯗ",
+       "feed-invalid": "ꯌꯥꯎꯗꯕꯥ subscription feed type.",
+       "feed-unavailable": "Syndication feeds are not available",
+       "site-rss-feed": "$1 RSS feed",
+       "site-atom-feed": "$1 ꯑꯦꯇꯣꯝ ꯇꯥꯛꯄꯥ",
+       "page-rss-feed": "\"$1\" RSS feed",
+       "page-atom-feed": "\"$1\" Atom feed",
+       "red-link-title": "$1 ꯂꯃꯥꯏꯗꯨ ꯂꯩꯇꯔꯦ",
+       "sort-descending": "ꯑꯇꯦꯟꯕꯥ ꯍꯟꯊꯔꯛꯂꯤꯕꯥ",
+       "sort-ascending": "ꯑꯇꯦꯟꯕꯥ ꯍꯦꯟꯒꯠꯂꯛꯂꯤꯕꯥ",
+       "nstab-main": "ꯂꯥꯃꯥꯏ",
+       "nstab-user": "Sijinnariba Lamai",
+       "nstab-media": "ꯃꯦꯗꯤꯌꯥꯒꯤ ꯂꯥꯃꯥꯏ",
+       "nstab-special": "MediaWiki:Bs-wikiadmin-mediawiki-akhannaba-lamai-text/mni",
+       "nstab-project": "ꯄꯥꯡꯊꯣꯛꯀꯗꯕꯥ ꯂꯥꯃꯥꯏ",
+       "nstab-image": "ꯈꯣꯝꯖꯤꯟꯗꯨꯅꯥ ꯍꯥꯞꯐꯝ",
+       "nstab-mediawiki": "ꯄꯥꯎꯖꯦꯜ",
+       "nstab-template": "ꯇꯦꯝꯄꯂꯦꯠ",
+       "nstab-help": "ꯂꯥꯃꯥꯏꯒꯤ ꯃꯇꯦꯂꯧꯐꯝ",
+       "nstab-category": "Machakhaiba",
+       "mainpage-nstab": "ꯃꯔꯨ ꯑꯣꯏꯕꯥ ꯂꯃꯥꯏ",
+       "nosuchaction": "ꯃꯁꯤꯒꯨꯕꯥ ꯃꯥꯑꯣꯡꯁꯤ ꯅꯠꯇꯦ",
+       "nosuchactiontext": "The action specified by the URL is invalid.\nYou might have mistyped the URL, or followed an incorrect link.\nThis might also indicate a bug in the software used by {{SITENAME}}.",
+       "nosuchspecialpage": "ꯃꯁꯤꯒꯥ ꯃꯥꯟꯅꯕꯥ ꯑꯈꯟꯅꯕꯥ ꯂꯥꯃꯥꯏ ꯂꯩꯇꯦ",
+       "nospecialpagetext": "<strong>You have requested an invalid special page.</strong>\n\nA list of valid special pages can be found at [[Special:SpecialPages|{{int:specialpages}}]].",
+       "error": "ꯑꯔꯥꯟꯕꯥ",
+       "databaseerror": "ꯗꯇꯥꯕꯦꯁꯀꯤ ꯑꯁꯣꯏꯕꯥ",
+       "databaseerror-text": "A database query error has occurred.\nThis may indicate a bug in the software.",
+       "databaseerror-textcl": "ꯗꯇꯥꯕꯦꯁꯀꯤ ꯅꯪꯉꯥꯏꯇꯕꯥ ꯑꯁꯣꯏꯕꯁꯤ ꯍꯧꯖꯤꯛ ꯃꯌꯣꯛꯅꯔꯤ",
+       "databaseerror-query": "Query: $1",
+       "databaseerror-function": "$1:ꯊꯧꯔꯝ",
+       "databaseerror-error": "ꯑꯁꯣꯏꯕꯥ: $1",
+       "transaction-duration-limit-exceeded": "To avoid creating high replication lag, this transaction was aborted because the write duration ($1) exceeded the $2 second limit.\nIf you are changing many items at once, try doing multiple smaller operations instead.",
+       "laggedslavemode": "<strong>Warning:</strong> Page may not contain recent updates.",
+       "readonly": "ꯗꯇꯥꯕꯦꯁ ꯊꯤꯡꯖꯤꯟꯂꯦ",
+       "enterlockreason": "ꯊꯤꯡꯖꯤꯟꯕꯒꯤ ꯃꯔꯝꯗꯨ ꯍꯥꯞꯄꯨ, ꯑꯦꯁꯇꯤꯃꯦꯠꯀꯥ ꯂꯣꯏꯅꯅ ꯍꯣꯔꯦꯟ ꯊꯤꯡꯖꯤꯟꯂꯤꯕꯗꯨ ꯊꯥꯗꯣꯧꯂꯕꯥ ꯃꯇꯝꯐꯥꯑꯣ",
+       "readonlytext": "The database is currently locked to new entries and other modifications, probably for routine database maintenance, after which it will be back to normal.\n\nThe system administrator who locked it offered this explanation: $1",
+       "missing-article": "The database did not find the text of a page that it should have found, named \"$1\" $2.\n\nThis is usually caused by following an outdated diff or history link to a page that has been deleted.\n\nIf this is not the case, you may have found a bug in the software.\nPlease report this to an [[Special:ListUsers/sysop|administrator]], making note of the URL.",
+       "missingarticle-rev": "(revision#: $1)",
+       "missingarticle-diff": "(Diff: $1, $2)",
+       "readonly_lag": "ꯗꯇꯥꯕꯦꯁ ꯁꯤ ꯃꯁꯥ ꯃꯇꯣꯝꯇꯥ ꯊꯤꯡꯖꯤꯟꯂꯦ while the slave database servers catch up to the master",
+       "nonwrite-api-promise-error": "The 'Promise-Non-Write-API-Action' HTTP header was sent but the request was to an API write module.",
+       "internalerror": "ꯃꯅꯨꯡꯒꯤ ꯑꯁꯣꯏꯕꯥ",
+       "internalerror_info": "ꯃꯅꯪꯨꯒꯤ ꯑꯁꯣꯏꯕꯥ: $1",
+       "internalerror-fatal-exception": "Fatal exception of type \"$1\"",
+       "filecopyerror": "ꯐꯥꯏꯜꯁꯤ ꯁꯤꯟꯗꯣꯛꯄꯥ ꯌꯥꯗꯔꯦ $1 ꯗꯒꯤ $2 ꯗꯥ",
+       "filerenameerror": "ꯐꯥꯏꯜꯁꯤ ꯑꯃꯨꯛ ꯅꯧꯅꯥ ꯃꯃꯤꯡ ꯊꯣꯟꯕꯥ ꯌꯥꯗꯔꯦ $1 ꯗꯒꯤ $2",
+       "filedeleteerror": "$1 ꯐꯥꯏꯜ ꯀꯛꯊꯠꯄꯥ ꯌꯥꯗꯔꯦ",
+       "directorycreateerror": "$1 ꯗꯥꯏꯔꯦꯛꯇꯔꯤ ꯁꯦꯝꯕꯥ ꯌꯥꯗꯔꯦ",
+       "directoryreadonlyerror": "$1 ꯗꯥꯏꯔꯦꯛꯇꯔꯤ ꯁꯤ ꯄꯥꯅꯕꯥ ꯈꯛꯇꯅꯤ",
+       "directorynotreadableerror": "$1 ꯗꯥꯏꯔꯦꯛꯇꯔꯤ ꯁꯤ ꯄꯥꯕꯥ ꯌꯥꯗꯦ",
+       "filenotfound": "$1 ꯐꯥꯏꯜ ꯊꯤꯕꯥ ꯐꯪꯗꯔꯦ",
+       "unexpected": "ꯊꯥꯖꯔꯨꯗꯕꯥ ꯃꯁꯤꯡ $1=$2",
+       "formerror": "ꯑꯔꯥꯟꯕꯥ: ꯐꯣꯝ ꯊꯥꯖꯤꯟꯕꯥ ꯌꯥꯗꯦ",
+       "badarticleerror": "ꯃꯁꯤꯒꯤ ꯂꯥꯃꯥꯏꯁꯤꯗꯥ ꯃꯁꯤꯒꯨꯝꯕꯥ ꯃꯥꯑꯣꯡꯁꯤ ꯄꯥꯡꯊꯣꯛꯄꯥ ꯌꯥꯗꯦ",
+       "cannotdelete": "ꯂꯥꯃꯥꯏ ꯅꯠꯇꯔꯒꯥ $1 ꯐꯥꯏꯜ ꯁꯤ ꯀꯛꯊꯠꯄꯥ ꯌꯥꯗꯦ. \nꯃꯁꯤ ꯍꯥꯟꯅꯅ ꯃꯤꯑꯣꯏ ꯈꯔꯅꯥ ꯀꯛꯊꯠꯈꯔꯦ",
+       "cannotdelete-title": "$1 ꯂꯥꯃꯥꯏꯁꯤ ꯀꯛꯊꯠꯄꯥ ꯌꯥꯗꯦ",
+       "delete-hook-aborted": "ꯀꯛꯊꯠꯄꯥ aborted by hook.\nIt gave no ꯁꯟꯇꯣꯛꯅꯥ ꯇꯥꯛꯄꯥ",
+       "no-null-revision": "$1ꯂꯥꯃꯥꯏꯒꯤ ꯑꯅꯧꯕꯥ ꯀꯔꯤꯝꯇꯥ ꯌꯥꯑꯣꯗꯕꯥ ꯑꯃꯨꯛꯍꯟꯕꯥ ꯃꯤꯠꯌꯦꯡꯗꯥ ꯁꯦꯝꯕꯥ ꯌꯥꯗꯦ",
+       "badtitle": "ꯑꯐꯠꯇꯕꯥ ꯃꯃꯤꯡ",
+       "badtitletext": "The requested page title was invalid, empty, or an incorrectly linked inter-language or inter-wiki title.\nIt may contain one or more characters that cannot be used in titles.",
+       "title-invalid-empty": "The requested page title is empty or contains only the name of a namespace.",
+       "title-invalid-utf8": "The requested page title contains an invalid UTF-8 sequence.",
+       "viewsource": "ꯍꯧꯔꯛꯐꯝ ꯎꯨꯇꯂꯨ",
+       "userlogin-yourname": "Username",
+       "userlogin-yourname-ph": "Enter your username",
+       "userlogin-yourpassword": "ꯆꯪꯁꯤꯟꯅꯕꯥ ꯋꯥꯍꯩ",
+       "createacct-yourpassword-ph": "ꯄꯥꯁꯋ꯭ꯇ ꯏꯔꯛ ꯎ",
+       "createacct-yourpasswordagain": "Confirm password",
+       "createacct-yourpasswordagain-ph": "ꯑꯃꯨꯛ ꯍꯟꯅꯥ ꯄꯥꯁꯋ꯭ꯇ ꯏꯌꯨ",
+       "login": "Chang Sinba",
+       "createaccount": "ꯑꯩꯒꯤ ꯑꯣꯏꯕꯥ ꯑꯃꯥ ꯁꯦꯝꯕꯥ",
+       "createacct-emailoptional": "Email address (ꯑꯇꯣꯞꯄꯥ ꯱)",
+       "createacct-email-ph": "Enter your email address",
+       "createacct-submit": "ꯅꯪꯒꯤ ꯑꯦꯀꯥꯎꯟꯇ ꯁꯦꯝꯕꯥ",
+       "createacct-benefit-heading": "{{SITENAME}} ꯁꯤ ꯅꯪꯒꯥ ꯃꯥꯟꯅꯕꯥ ꯃꯤꯑꯣꯏꯁꯤꯡꯅꯥ ꯁꯦꯝꯕꯅꯤ",
+       "createacct-benefit-body1": "{{PLURAL:$1|edit|edits}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|page|pages}}",
+       "createacct-benefit-body3": "ꯍꯧꯖꯤꯛꯀꯤ {{PLURAL:$1|contributor|contributors}}",
+       "loginlanguagelabel": "$1 ꯂꯣꯟ",
+       "pt-login": "Chang Sinba",
+       "pt-createaccount": "ꯑꯩꯒꯤ ꯑꯣꯏꯕꯥ ꯑꯃꯥ ꯁꯦꯝꯕꯥ",
+       "pt-userlogout": "Log out",
+       "bold_sample": "ꯆꯥꯎꯅꯥ ꯏꯕꯥ",
+       "bold_tip": "ꯆꯥꯎꯅꯥ ꯏꯕꯥ",
+       "italic_sample": "ꯋꯥꯔꯦꯡ ꯐꯆꯅꯥ ꯏꯕꯥ",
+       "italic_tip": "ꯋꯥꯔꯦꯡ ꯐꯩꯅꯥ ꯏꯕꯥ",
+       "link_sample": "ꯃꯩꯃꯤꯡꯃꯤ ꯁꯝꯅꯐꯝ",
+       "link_tip": "ꯃꯅꯨꯡꯒꯥ ꯁꯝꯅꯐꯝ",
+       "extlink_sample": "http://www.example.com link title",
+       "extlink_tip": "ꯑꯇꯣꯞꯄꯥꯒꯥ ꯁꯝꯅꯐꯝ",
+       "headline_sample": "ꯃꯀꯣꯛꯀꯤ ꯋꯥꯔꯦꯡ ꯄꯥꯔꯦꯡ",
+       "headline_tip": "꯲ ꯁꯨꯕꯥ ꯃꯀꯣꯛꯀꯤ ꯄꯔꯦꯡ",
+       "nowiki_sample": "ꯍꯥꯞꯆꯤꯟꯂꯨ non formating ꯋꯥꯔꯦꯡꯗꯨ ꯁꯤꯗꯥ",
+       "nowiki_tip": "ꯋꯤꯀꯤꯒꯤ ꯃꯥꯑꯣꯡ ꯁꯦꯝꯕꯗꯨ ꯊꯧꯑꯣꯏꯗꯕꯥ",
+       "image_tip": "ꯅꯝꯁꯤꯟꯂꯕꯥ ꯐꯥꯏꯜ",
+       "media_tip": "ꯐꯥꯏꯜꯒꯤ ꯁꯝꯅꯐꯝ",
+       "sig_tip": "ꯃꯇꯝꯒꯤ ꯏꯁꯇꯥꯝꯒꯥ ꯂꯣꯏꯟꯅꯥ ꯅꯪꯒꯤ ꯈꯨꯇꯌꯦꯛ",
+       "hr_tip": "ꯐꯩꯅꯥ ꯆꯤꯡꯕꯥ ꯂꯥ ꯏ (ꯃꯔꯤꯛ ꯃꯔꯤꯛ ꯑꯣꯏꯅꯥ ꯁꯤꯖꯤꯟꯅꯧ)",
+       "summary": "ꯑꯇꯦꯟꯕꯥ ꯁꯟꯗꯣꯛꯅꯥ ꯇꯥꯛꯄꯥ",
+       "minoredit": "ꯃꯁꯤ ꯑꯄꯤꯛꯄꯥ ꯁꯦꯝꯒꯠꯄꯅꯤ",
+       "watchthis": "ꯃꯁꯤꯒꯤ ꯂꯥꯃꯥꯏꯁꯤ ꯌꯦꯡꯉꯨ",
+       "savearticle": "ꯂꯥꯃꯥꯏ ꯇꯨꯪꯁꯤꯟꯕꯥ",
+       "showpreview": "ꯍꯥꯟꯅꯒꯤꯗꯨ ꯎꯨꯇꯂꯨ",
+       "showdiff": "ꯑꯍꯣꯡꯕꯗꯨ ꯎꯨꯇꯂꯨ",
+       "anoneditwarning": "<strong>Warning:</strong> You are not logged in. Your IP address will be publicly visible if you make any edits. If you <strong>[$1 log in]</strong> or <strong>[$2 create an account]</strong>, your edits will be attributed to your username, along with other benefits.",
+       "loginreqlink": "Chang Sinba",
+       "noarticletext": "There is currently no text in this page.\nYou can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs],\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} create this page]</span>.",
+       "noarticletext-nopermission": "There is currently no text in this page.\nYou can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages, or <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs]</span>, but you do not have permission to create this page.",
+       "creating": "Creating $1",
+       "editingsection": "Editing $1 (section)",
+       "template-protected": "ꯉꯥꯛꯊꯣꯛꯂꯕꯥ",
+       "template-semiprotected": "ꯇꯪꯈꯥꯏ ꯉꯥꯛꯊꯣꯛꯂꯕꯥ",
+       "revisionasof": "Revision as of $1",
+       "previousrevision": "ꯑꯔꯤꯕꯥ ꯑꯃꯨꯛ ꯍꯟꯅꯥ ꯌꯦꯡꯕꯥ",
+       "cur": "ꯍꯧ",
+       "last": "ꯃꯥꯃꯥꯡꯒꯤ",
+       "rev-delundel": "ꯑꯍꯣꯡꯕꯥ ꯎꯍꯟꯂꯤꯕꯥ",
+       "difference-title": "$1 ꯒꯤ ꯑꯃꯨꯛꯍꯟꯕꯥ ꯈꯦꯠꯅꯕꯥꯒꯤ ꯃꯔꯛ",
+       "lineno": "ꯂꯥ ꯏ $1",
+       "editundo": "ꯇꯧꯒꯅꯨ",
+       "diff-multi-sameuser": "({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by the same user not shown)",
+       "searchresults": "ꯊꯤꯕꯒꯤ ꯐꯣꯜ",
+       "searchresults-title": "Search results for \"$1\"",
+       "prevn": "ꯍꯥꯟꯅꯒꯤ {{PLURAL:$1|$1}}",
+       "nextn": "ꯃꯥꯊꯪ{{PLURAL:$1|$1}}",
+       "nextn-title": "Next $1 {{PLURAL:$1|result|results}}",
+       "shown-title": "Show $1 {{PLURAL:$1|result|results}} per page",
+       "viewprevnext": "ꯎꯨꯇꯂꯨ ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchmenu-new": "<strong>Create the page \"[[:$1]]\" on this wiki!</strong> {{PLURAL:$2|0=|See also the page found with your search.|See also the search results found.}}",
+       "searchprofile-articles": "Kamai c da yaoba pumnamak",
+       "searchprofile-images": "Multimedia",
+       "searchprofile-everything": "Pumnamak",
+       "searchprofile-advanced": "Khumangchaoba",
+       "searchprofile-articles-tooltip": "$1 da thiyu",
+       "searchprofile-images-tooltip": "File gi damak thiba",
+       "searchprofile-everything-tooltip": "Mashida yaoriba c loina thiyu (Ngamgani Lamgi ga loinana)",
+       "searchprofile-advanced-tooltip": "Custom gi ming eramdamgi thiyu",
+       "search-result-size": "$1 ({{PLURAL:$2|1 word|$2 words}})",
+       "search-redirect": "(redirect from $1)",
+       "search-section": "(section $1)",
+       "searchall": "ꯄꯨꯂꯞ",
+       "search-showingresults": "{{PLURAL:$4|Result <strong>$1</strong> of <strong>$3</strong>|Results <strong>$1 – $2</strong> of <strong>$3</strong>}}",
+       "search-nonefound": "ꯃꯁꯤꯒꯤ ꯐꯣꯜꯁꯤꯒꯥ ꯆꯥꯟꯅꯕꯥ ꯂꯩꯇꯦ",
+       "mypreferences": "Preferences",
+       "right-writeapi": "API sijinaduna eba",
+       "newuserlogpage": "User creation log",
+       "enhancedrc-history": "ꯄꯨꯋꯥꯔꯤ",
+       "recentchanges": "ꯍꯧꯖꯤꯛꯀꯤ ꯑꯣꯏꯕꯥ ꯑꯍꯣꯡꯕꯁꯤꯡ",
+       "recentchanges-legend": "ꯍꯧꯖꯤꯛꯀꯤ ꯑꯣꯏꯕꯥ ꯑꯍꯣꯡꯕꯥ ꯈꯟꯐꯝꯁꯤꯡ",
+       "recentchanges-summary": "ꯋꯤꯀꯤꯄꯦꯗꯤꯌꯥ ꯂꯃꯥꯏꯒꯤ ꯍꯧꯖꯤꯛꯀꯤ ꯑꯣꯏꯕꯥ ꯑꯍꯣꯡꯕꯒꯤ ꯃꯐꯝ ꯇꯥꯛꯄꯥ",
+       "recentchanges-label-newpage": "ꯃꯁꯤꯒꯤ ꯁꯦꯝꯒꯠꯄꯁꯤꯅꯥ ꯑꯅꯧꯕꯥ ꯂꯥꯃꯥꯏ ꯱ ꯁꯥꯔꯦ",
+       "recentchanges-label-minor": "ꯃꯁꯤ ꯑꯄꯤꯛꯄꯥ ꯁꯦꯝꯒꯠꯄꯅꯤ",
+       "recentchanges-label-bot": "ꯃꯁꯤꯒꯤ ꯁꯦꯝꯒꯠꯄꯁꯤ ꯕ ꯅꯥ ꯄꯥꯡꯊꯣꯛꯄꯅꯤ",
+       "recentchanges-label-unpatrolled": "ꯃꯁꯤꯒꯤ ꯁꯦꯝꯒꯠꯄꯁꯤ ꯍꯧꯖꯤꯛꯐꯥꯎ ꯌꯦꯡꯁꯤꯟꯗ꯭ꯔꯤ",
+       "recentchanges-label-plusminus": "ꯕꯥꯏꯠꯀꯤ ꯑꯍꯣꯡꯕꯒꯤ ꯃꯇꯪ ꯏꯟꯅꯥ ꯂꯥꯃꯥꯏꯁꯤꯒꯤ ꯑꯆꯧꯕꯥ ꯂꯦꯞꯄꯤ",
+       "recentchanges-legend-heading": "<ꯑꯀꯟꯕꯥ>ꯊꯥꯏꯅꯗꯒꯤ</ꯑꯀꯟꯕꯥ>",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (also see [[Special:NewPages|list of new pages]])",
+       "rclistfrom": "$2$3 ꯁꯤꯗꯒꯤ ꯍꯧꯔꯒꯥ ꯑꯅꯧꯕꯥ ꯑꯍꯣꯡꯕꯗꯨ ꯎꯨꯇꯂꯨ",
+       "rcshowhideminor": "$1 ꯄꯤꯛꯅꯥ ꯁꯦꯝꯒꯠꯄꯥ",
+       "rcshowhideminor-hide": "ꯂꯣꯇꯄꯥ",
+       "rcshowhidebots": "$1 bots",
+       "rcshowhidebots-show": "ꯎꯨꯇꯄꯥ",
+       "rcshowhideliu": "ꯃꯃꯤꯡ ꯆꯟꯂꯕꯥ ꯄꯥꯏꯔꯤꯕꯥ $1",
+       "rcshowhideliu-hide": "ꯂꯣꯇꯄꯥ",
+       "rcshowhideanons": "$1 ꯃꯁꯛ ꯃꯥꯅꯥꯗꯕꯥ ꯄꯥꯏꯔꯤꯕꯥ ꯃꯤ",
+       "rcshowhideanons-hide": "ꯂꯣꯇꯄꯥ",
+       "rcshowhidemine": "$1 ꯑꯩꯅꯥ ꯁꯦꯝꯒꯠꯄꯁꯤꯡ",
+       "rcshowhidemine-hide": "ꯂꯣꯇꯄꯥ",
+       "rclinks": "$1 ꯒꯤ ꯑꯔꯣꯏꯕꯥ ꯑꯍꯣꯡꯕꯥꯗꯎ ꯎꯨꯇꯂꯎ $2 ꯃꯅꯨꯡꯗꯥ",
+       "diff": "ꯈꯦꯠ",
+       "hist": "ꯄꯨꯋꯥ",
+       "hide": "ꯂꯣꯇꯄꯥ",
+       "show": "ꯎꯨꯇꯄꯥ",
+       "minoreditletter": "ꯃ",
+       "newpageletter": "ꯟ",
+       "boteditletter": "ꯕ",
+       "rc-change-size-new": "{{PLURAL:$1|$1}} ꯍꯣꯡꯗꯣꯛꯑꯕꯥ ꯃꯇꯨꯪꯗꯥ",
+       "recentchangeslinked": "ꯃꯔꯤꯂꯩꯅꯕꯥ ꯑꯍꯣꯡꯕꯁꯤꯡ",
+       "recentchangeslinked-toolbox": "ꯃꯔꯤꯂꯩꯅꯕꯥ ꯑꯍꯣꯡꯕꯁꯤꯡ",
+       "recentchangeslinked-title": "$1 ꯂꯩꯅꯕꯥ ꯑꯍꯣꯡꯕꯁꯤꯡ",
+       "recentchangeslinked-summary": "Enter a page name to see changes on pages linked to or from that page. (To see members of a category, enter {{ns:category}}:Name of category). Changes to pages on [[Special:Watchlist|your Watchlist]] are in <strong>bold</strong>.",
+       "recentchangeslinked-page": "ꯂꯥꯃꯥꯏ ꯃꯥꯃꯤꯡ",
+       "recentchangeslinked-to": "ꯂꯥꯃꯥꯏꯁꯤꯒꯥ ꯁꯝꯅꯐꯝꯒꯤ ꯑꯍꯣꯡꯕꯗꯨ ꯎꯠꯂꯨ ꯄꯤꯔꯝꯂꯤꯕꯥ ꯂꯥꯃꯥꯏꯗꯨ ꯃꯍꯨꯠꯇꯥ",
+       "upload": "ꯐꯥꯏꯜ ꯊꯥꯒꯠꯂꯨ",
+       "filedesc": "ꯑꯇꯦꯟꯕꯥ ꯁꯟꯗꯣꯛꯅꯥ ꯇꯥꯛꯄꯥ",
+       "license-header": "ꯑꯌꯥꯕꯥ",
+       "file-anchor-link": "ꯈꯣꯝꯖꯤꯟꯗꯨꯅꯥ ꯍꯥꯞꯐꯝ",
+       "filehist": "ꯐꯥꯏꯜꯒꯤ ꯄꯨꯋꯥꯔꯤ",
+       "filehist-help": "Cheichat/Matamda nammmu matam aduda file adu ooonaba",
+       "filehist-current": "Houjikki",
+       "filehist-datetime": "ꯆꯩꯆꯠ/ꯃꯇꯝ",
+       "filehist-thumb": "Khutpina namba",
+       "filehist-thumbtext": "Thumbnail for version as of $1",
+       "filehist-user": "ꯄꯥꯏꯔꯤꯕꯥ",
+       "filehist-dimensions": "ꯄꯥꯛ ꯆꯥꯎꯕꯥ",
+       "filehist-comment": "ꯑꯄꯥꯝꯕꯥ ꯐꯣꯡꯗꯣꯛ ꯎ",
+       "imagelinks": "ꯐꯥꯏꯜꯒꯤ ꯁꯤꯖꯤꯟꯅꯐꯝ",
+       "linkstoimage": "The following {{PLURAL:$1|page links|$1 pages link}} to this file:",
+       "nolinkstoimage": "ꯃꯁꯤꯒꯤ ꯂꯥꯃꯥꯏꯁꯤꯒꯥ ꯃꯔꯤ ꯂꯩꯅꯕꯥ ꯁꯝꯅꯐꯝ ꯐꯥꯏꯜ ꯂꯩꯇꯦ",
+       "sharedupload-desc-here": "This file is from $1 and may be used by other projects.\nThe description on its [$2 file description page] there is shown below.",
+       "upload-disallowed-here": "ꯃꯁꯤꯒꯤ ꯐꯥꯏꯜꯁꯤ ꯅꯪꯅꯥ ꯑꯃꯨꯛ ꯍꯟꯅꯥ ꯏꯕꯥ ꯌꯥꯔꯣꯏ",
+       "randompage": "ꯆꯥꯡ ꯅꯥꯏꯗꯕꯥ ꯂꯥꯃꯥꯏ",
+       "nbytes": "$1 {{PLURAL:$1|byte|bytes}}",
+       "newpages": "ꯑꯅꯧꯕꯥ ꯂꯥꯃꯥꯏꯁꯤꯡ",
+       "booksources": "ꯂꯥꯏꯔꯤꯛꯀꯤ ꯍꯧꯔꯛꯐꯝ",
+       "log": "ꯆꯪꯕꯥ",
+       "allpagessubmit": "ꯆꯠꯂꯨ",
+       "mywatchlist": "Watchlist",
+       "watch": "ꯌꯦꯡꯕꯥ",
+       "rollbacklink": "ꯑꯃꯨꯛ ꯍꯟꯍꯟꯕꯥ",
+       "namespace": "ꯃꯥꯃꯤꯡꯒꯤ ꯃꯐꯝ",
+       "invert": "Khanlibadu Makoktagi lak hanba",
+       "tooltip-invert": "Akhannaba maming gi manungda page tungi ahongba lotnaba oopu du yeng ngoo",
+       "namespace_association": "Maming eefam ga marileinaba",
+       "tooltip-namespace_association": "Oopu du yengoo maming eefam gi hiramga mari leinaba khangatlaba maming eefam amadi wa ngangfam manung channaba",
+       "blanknamespace": "ꯃꯔꯨꯑꯣꯏꯕꯥ",
+       "contributions": "{{GENDER:$1|User}} ꯈꯣꯝꯒꯠꯂꯛꯄꯁꯤꯡ",
+       "mycontris": "ꯈꯣꯝꯒꯠꯂꯛꯂꯤꯕꯁꯤꯡ",
+       "anoncontribs": "ꯈꯣꯝꯒꯠꯂꯛꯂꯤꯕꯁꯤꯡ",
+       "month": "ꯃꯗꯨꯒꯤ ꯊꯥꯗꯒꯤ (ꯑꯃꯗꯤ ꯅꯧꯔꯤꯕꯥ)",
+       "year": "ꯃꯗꯨꯒꯤ ꯆꯥꯍꯤꯗꯒꯤ (ꯑꯃꯗꯤ ꯅꯧꯔꯤꯕꯥ)",
+       "whatlinkshere": "ꯃꯁꯤꯗꯥ ꯀꯔꯤ ꯁꯝꯃꯤ",
+       "whatlinkshere-title": "$1 ꯒꯥ ꯃꯔꯤ ꯂꯩꯅꯕꯥ ꯁꯝꯅꯐꯝ",
+       "whatlinkshere-page": "ꯂꯥꯃꯥꯏ",
+       "linkshere": "$2<strong> ꯒꯥ ꯁꯝꯅꯐꯝ ꯑꯣꯏꯕꯥ ꯂꯥꯃꯥꯏꯁꯤꯡ",
+       "isredirect": "ꯑꯃꯨꯛ ꯍꯟꯂꯛꯄꯥ ꯂꯥꯃꯥꯏ",
+       "istemplate": " transclusions",
+       "isimage": "ꯐꯥꯏꯜꯒꯤ ꯁꯝꯅꯐꯝ",
+       "whatlinkshere-prev": "{{PLURAL:$1|previous|previous $1}}",
+       "whatlinkshere-next": "{{PLURAL:$1|next|next $1}}",
+       "whatlinkshere-links": " ꯁꯝꯅꯐꯝ",
+       "whatlinkshere-hideredirs": "$1 redirects",
+       "whatlinkshere-hidetrans": "$1 transclusions",
+       "whatlinkshere-hidelinks": "$1 ꯁꯝꯅꯐꯝ",
+       "whatlinkshere-filters": "ꯁꯦꯡꯇꯣꯛꯐꯝ",
+       "blocklink": "Thingba",
+       "contribslink": "ꯐꯪꯉꯛꯄꯥ",
+       "movelogpage": "ꯂꯣꯒ ꯁꯤ ꯂꯦꯡꯍꯟꯂꯨ",
+       "export": "ꯂꯥꯃꯥꯏꯁꯤꯡ ꯄꯨꯊꯣꯛꯈꯣ",
+       "thumbnail-more": "ꯆꯥꯑꯣꯍꯟꯕꯥ",
+       "tooltip-pt-userpage": "{{GENDER:|Your user}} ꯂꯥꯃꯥꯏ",
+       "tooltip-pt-mytalk": "{{GENDER:|Your}} ꯉꯥꯡꯐꯝ ꯂꯥꯃꯥꯏ",
+       "tooltip-pt-preferences": "{{GENDER:|Your}} preferences",
+       "tooltip-pt-watchlist": "ꯑꯍꯣꯡꯕꯗꯥ ꯌꯦꯡꯁꯤꯟꯅꯕꯥ ꯅꯪꯒꯤ ꯂꯥꯃꯥꯏ ꯄꯔꯦꯡ ꯱",
+       "tooltip-pt-mycontris": "A list of {{GENDER:|your}} ꯈꯣꯝꯒꯠꯂꯛꯂꯤꯕꯥ ꯁꯤꯡ",
+       "tooltip-pt-login": "ꯅꯪꯅꯥ ꯃꯅꯨꯡ ꯆꯪꯉꯛꯄꯁꯤ ꯄꯨꯛꯅꯤꯡ ꯊꯧꯒꯠꯂꯤ, ꯇꯧꯕꯇꯕꯨ ꯃꯁꯤ ꯁꯪꯁꯣꯏ ꯁꯣꯏꯗꯅꯥ ꯆꯡꯕꯗꯤ ꯅꯠꯇꯦ",
+       "tooltip-pt-logout": "Log out",
+       "tooltip-pt-createaccount": "ꯅꯪꯒꯤ ꯑꯣꯏꯕꯥ ꯱ ꯁꯦꯝꯕꯥ ꯑꯃꯥꯁꯨꯪ ꯃꯅꯨꯡ ꯆꯪꯁꯤꯟꯕꯥꯁꯤ ꯄꯨꯛꯅꯤꯡ ꯊꯧꯒꯠꯂꯤ, ꯇꯧꯕꯇꯕꯨ ꯃꯁꯤ ꯁꯪꯁꯣꯏ ꯁꯣꯏꯗꯅꯥ ꯆꯡꯕꯗꯤ ꯅꯠꯇꯦ",
+       "tooltip-ca-talk": "ꯃꯅꯨꯡꯆꯟꯂꯤꯕꯥ ꯂꯥꯃꯥꯏꯁꯤꯒꯤ ꯃꯇꯥꯁꯗꯥ ꯈꯟꯅꯥ ꯅꯩꯅꯕꯥ",
+       "tooltip-ca-edit": "ꯃꯁꯤꯒꯤ ꯂꯥꯃꯥꯏꯁꯤ ꯁꯦꯝꯒꯠꯂꯨ",
+       "tooltip-ca-addsection": "Anouba khaidokpadu houro",
+       "tooltip-ca-viewsource": "ꯃꯁꯤꯒꯤ ꯂꯥꯃꯥꯏꯁꯤ ꯉꯥꯛꯊꯣꯛꯂꯦ \nꯅꯪꯅꯥ ꯂꯥꯃꯥꯏꯁꯤꯒꯤ ꯍꯧꯔꯛꯐꯝ ꯎꯒꯅꯤ",
+       "tooltip-ca-history": "ꯍꯧꯈꯔꯕꯥ ꯂꯥꯃꯥꯏ ꯑꯃꯨꯛ ꯍꯟꯅꯥ ꯌꯦꯡꯕꯥ",
+       "tooltip-ca-move": "ꯃꯁꯤꯒꯤ ꯂꯥꯃꯥꯏꯁꯤ ꯂꯦꯡꯍꯟꯂꯨ",
+       "tooltip-ca-watch": "ꯅꯪꯒꯤ ꯌꯦꯡꯅꯕꯥ ꯄꯥꯔꯦꯡꯗꯨꯗꯥ ꯍꯥꯞꯆꯏꯟꯂꯨ ꯃꯁꯤꯒꯤ ꯂꯥꯃꯥꯏꯁꯤ",
+       "tooltip-search": "ꯊꯤꯔꯣ ꯃꯐꯝꯗꯨꯒꯤ ꯃꯃꯤꯡ",
+       "tooltip-search-go": "Leiraga Chatlu madugi chapchaba Lamai Duda",
+       "tooltip-search-fulltext": "ꯏꯔꯤꯕꯥ ꯃꯇꯦꯛꯁꯤꯒꯤ ꯂꯃꯥꯏ ꯁꯤ ꯊꯤꯔꯣ",
+       "tooltip-p-logo": "ꯃꯔꯨ ꯑꯣꯏꯕꯥ ꯂꯥꯃꯥꯏꯗꯨꯗꯥ ꯌꯧꯁꯤꯟꯂꯨ",
+       "tooltip-n-mainpage": "ꯃꯔꯨ ꯑꯣꯏꯕꯥ ꯂꯥꯃꯥꯏꯗꯨꯗꯥ ꯌꯧꯁꯤꯟꯂꯨ",
+       "tooltip-n-mainpage-description": "ꯃꯔꯨ ꯑꯣꯏꯕꯥ ꯂꯥꯃꯥꯏꯗꯨꯗꯥ ꯌꯧꯁꯤꯟꯂꯨ",
+       "tooltip-n-portal": "ꯊꯧꯑꯣꯡ ꯂꯥꯛꯄꯗꯨꯒꯤ ꯃꯔꯝꯗ꯬",
+       "tooltip-n-currentevents": "ꯆꯠꯊꯔꯤꯕꯥ ꯊꯧꯔꯝꯁꯤꯒꯤ ꯃꯅꯨꯒꯤ ꯑꯣꯏꯕꯥ ꯋꯥꯔꯣꯟꯗꯨ ꯄꯨꯊꯣꯛ ꯎ",
+       "tooltip-n-recentchanges": "ꯍꯧꯖꯤꯛꯀꯤ ꯑꯣꯏꯅꯥ ꯋꯤꯀꯤꯄꯦꯗꯤꯌꯥꯗꯥ ꯑꯍꯣꯡꯕꯥꯁꯤꯡꯒꯤ ꯄꯥꯔꯦꯡ",
+       "tooltip-n-randompage": "ꯆꯥꯡ ꯅꯥꯏꯗꯕꯥ ꯂꯃꯥꯏ ꯍꯥꯞꯆꯤꯟꯕꯥ",
+       "tooltip-n-help": "ꯄꯨꯊꯣꯔꯛꯅꯕꯥ ꯃꯐꯝꯅꯤ",
+       "tooltip-t-whatlinkshere": "Mashigi Lamai c da samliba wiki parent ama",
+       "tooltip-t-recentchangeslinked": "ꯃꯁꯤꯒꯤ ꯂꯃꯥꯏꯁꯤꯒꯥ ꯃꯔꯤ ꯂꯩꯅꯕꯥ ꯍꯧꯖꯤꯛꯀꯤ ꯑꯍꯣꯡꯕꯥ ꯂꯥꯃꯥꯏꯁꯤꯡ",
+       "tooltip-feed-atom": "ꯂꯥꯃꯥꯏꯁꯤꯒꯤ ꯃꯁꯥ ꯃꯇꯣꯝꯇꯥ ꯌꯣꯛꯈꯠꯂꯛꯄꯥ",
+       "tooltip-t-contributions": " {{GENDER:$1|this user}} ꯅꯥ ꯈꯣꯝꯖꯤꯟꯂꯛꯂꯤꯕꯥ ꯄꯥꯔꯦꯡ ꯱",
+       "tooltip-t-upload": "ꯐꯥꯏꯜꯁꯤꯡ ꯊꯥꯒꯠꯂꯨ",
+       "tooltip-t-specialpages": "Akhanaba Lamai gi Parent Ama",
+       "tooltip-t-print": "Namba Yaba ma ong  gi Lamai",
+       "tooltip-t-permalink": "Amuk han na yengba lamaisigi Lengdaba Samnafam",
+       "tooltip-ca-nstab-main": "ꯂꯃꯥꯏꯁꯤꯒꯤ ꯑꯌꯥꯎꯕꯁꯤꯡꯗꯨ ꯎꯨꯇꯂꯨ",
+       "tooltip-ca-nstab-user": "ꯁꯤꯖꯤꯟꯅꯔꯤꯕꯥ ꯂꯥꯃꯥꯏꯁꯤ ꯌꯦꯡꯕꯥ",
+       "tooltip-ca-nstab-special": "ꯃꯁꯤ ꯑꯈꯟꯅꯕꯥ ꯂꯥꯃꯥꯏꯅꯤ, ꯁꯦꯝꯒꯠꯄꯥ ꯌꯥꯔꯣꯏ",
+       "tooltip-ca-nstab-image": "File lamai du ootlu",
+       "tooltip-ca-nstab-template": "ꯇꯦꯝꯄꯂꯦꯠ ꯇꯨ ꯎꯨꯠꯂꯨ",
+       "tooltip-ca-nstab-category": "Macahkhaiba lamai sure oootlooo",
+       "tooltip-save": "ꯅꯪꯒꯤ ꯑꯍꯣꯡꯕꯗꯨ ꯇꯨꯡꯁꯤꯟꯂꯨ",
+       "tooltip-preview": "ꯅꯪꯒꯤ ꯑꯍꯣꯡꯕꯗꯨ ꯑꯃꯨꯛ ꯍꯟꯅꯥ ꯎꯠꯂꯨ. ꯆꯥꯟꯕꯤꯗꯨꯅꯥ ꯃꯁꯤ ꯍꯥꯟꯅꯥ ꯁꯤꯖꯤꯅꯧ ꯇꯪꯁꯤꯟꯗ꯭ꯔꯤꯉꯧꯗꯥ",
+       "tooltip-diff": "ꯅꯪꯅꯥ ꯏꯔꯤꯕꯥ ꯄꯥꯔꯦꯡꯗꯨꯗꯥ ꯑꯍꯣꯡꯕꯥ ꯎꯠꯂꯨ",
+       "tooltip-rollback": "ꯑꯔꯣꯏꯕꯥ ꯈꯣꯝꯒꯠꯛꯂꯤꯕꯥꯁꯤꯡꯒꯤ ꯁꯦꯝꯒꯠꯄꯁꯤꯡ ꯗꯨꯒꯤ ꯂꯥꯃꯥꯏ ꯑꯃꯨꯛ ꯅꯝꯕꯗꯥ ꯂꯥꯛꯍꯟꯂꯨ ꯍꯥꯟꯅꯒꯤ ꯃꯐꯝꯗꯨꯗꯥ",
+       "tooltip-undo": "\"Undo\" reverts this edit and opens the edit form in preview mode. It allows adding a reason in the summary.",
+       "tooltip-summary": "ꯑꯇꯦꯟꯕꯥ ꯀꯨꯞꯅꯥ ꯁꯟꯗꯣꯛꯅꯩ ꯇꯥꯛꯄꯥ ꯏꯌꯨ",
+       "simpleantispam-label": "Anti-spam check.\nDo <strong>not</strong> fill this in!",
+       "pageinfo-robot-noindex": "ꯌꯥꯍꯟꯗꯕꯥ",
+       "pageinfo-subpages-name": "ꯂꯥꯃꯥꯏꯁꯤ ꯒꯤ ꯃꯅꯨꯡ ꯆꯟꯕꯥ ꯀꯨꯞꯊꯕꯥ ꯂꯥꯃꯥꯏꯁꯤꯡ",
+       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|redirect|redirects}}; $3 {{PLURAL:$3|non-redirect|non-redirects}})",
+       "pageinfo-magic-words": "Magic {{PLURAL:$1|word|words}} ($1)",
+       "pageinfo-toolboxlink": "ꯂꯥꯃꯥꯏꯒꯤ ꯃꯇꯥꯡꯗꯥ",
+       "previousdiff": "ꯑꯔꯤꯕꯥ ꯁꯦꯝꯒꯠꯂꯛꯐꯝ",
+       "file-info-size": "$1 × $2 pixels, file size: $3, MIME type: $4",
+       "file-nohires": "ꯃꯁꯤꯗꯒꯤ ꯍꯦꯟꯅꯥ ꯁꯦꯡꯕꯥ ꯂꯩꯇꯔꯦ",
+       "svg-long-desc": "SVG file, nominally $1 × $2 pixels, file size: $3",
+       "show-big-image": "File Asengba",
+       "show-big-image-preview": "Size of this preview: $1.",
+       "show-big-image-other": "Other {{PLURAL:$2|resolution|resolutions}}: $1.",
+       "show-big-image-size": "$1 × $2 pixels",
+       "metadata": "ꯃꯦꯇꯥꯗꯥꯇꯥ",
+       "metadata-help": "This file contains additional information, probably added from the digital camera or scanner used to create or digitize it.\nIf the file has been modified from its original state, some details may not fully reflect the modified file.",
+       "metadata-fields": "ꯃꯥꯇꯥꯗꯥꯇꯥꯒꯤ ꯃꯥꯃꯤꯒꯤ ꯄꯥꯔꯦꯡ ꯑꯗꯨ ꯃꯥꯃꯤꯒꯤ ꯂꯥꯃꯥꯏꯗꯨꯒꯤ ꯄꯥꯎꯖꯦꯜꯗꯥ ꯎꯨꯇꯂꯦ ꯃꯦꯇꯥꯗꯥꯇꯥ ꯒꯤ\nꯎꯨꯇꯊꯣꯛꯐꯝꯗꯨ ꯀꯥꯏꯔꯥꯀꯥꯟꯗꯥ \nꯑꯇꯩꯗꯤ ꯂꯣꯠꯂꯅꯤ ꯎꯨꯇꯄꯥ ꯉꯝꯗꯕꯒꯤ\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "exif-orientation": "ꯃꯐꯝ ꯆꯥꯟꯅꯍꯟꯕꯥ",
+       "exif-xresolution": " resolution ꯐꯩꯅꯥ",
+       "exif-yresolution": " resolution ꯌꯨꯡꯅꯥ",
+       "exif-datetime": "ꯐꯥꯏꯜ ꯍꯣꯡꯕꯒꯤ ꯆꯩꯆꯠ ꯑꯃꯗꯤ ꯃꯇꯝ",
+       "exif-make": "Camera ꯁꯥꯔꯤꯕꯁꯤꯡ",
+       "exif-model": "Camera model",
+       "exif-software": "Software ꯁꯤꯖꯤꯟꯅꯔꯤꯕꯥ",
+       "exif-exifversion": "Exif version",
+       "exif-colorspace": "ꯉꯛꯁꯝꯒꯤ ꯑꯍꯥꯡꯕꯥ",
+       "exif-datetimeoriginal": "data generationꯒꯤ ꯃꯇꯝ ꯑꯝꯗꯤ ꯆꯩꯆꯠ",
+       "exif-datetimedigitized": "ꯃꯥꯃꯤ ꯇꯥꯏꯕꯪꯗꯥ ꯍꯥꯞꯆꯤꯟꯕꯒꯤ ꯃꯇꯝ ꯑꯃꯥꯗꯤ ꯆꯩꯆꯠ",
+       "exif-orientation-1": "ꯆꯥꯡ ꯅꯥꯏꯅꯥ",
+       "namespacesall": "Pullap",
+       "monthsall": "ꯄꯨꯂꯞ",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|talk]])",
+       "specialpages": "MediaWiki:Bs-wikiadmin-mediawiki-akhannaba-lamai-text/mni",
+       "tag-filter": "[[Special:Tags|Tag]] filter:",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|Tags}}]]: $2)",
+       "logentry-delete-delete": "$1 {{GENDER:$2|deleted}} page $3",
+       "logentry-newusers-create": "User account $1 was {{GENDER:$2|created}}",
+       "searchsuggest-search": "ꯊꯤꯔꯣ ꯃꯐꯝꯗꯨꯒꯤ ꯃꯃꯤꯡ"
+}
index 229c3d5..f7cd82c 100644 (file)
        "right-userrights": "အသုံးပြုသူ၏အခွင့်အရေးများအားလုံးကို တည်းဖြတ်ရန်",
        "right-userrights-interwiki": "အခြားဝီကီများမှ အသုံးပြုသူများ၏ အသုံးပြုသူအခွင့်အရေးများကို တည်းဖြတ်ရန်",
        "right-sendemail": "အခြားအသုံးပြုသူများကို အီးမေးပို့ရန်",
+       "grant-blockusers": "အသုံးပြုသူများအား ပိတ်ပင်ခြင်းနှင့် ပိတ်ပင်မှု ဖယ်ရှားခြင်း",
        "grant-editmywatchlist": "သင့် စောင့်ကြည့်စာရင်းကို တည်းဖြတ်ရန်",
        "newuserlogpage": "အသုံးပြုသူအသစ်ရောက်လာခြင်း မှတ်တမ်း",
        "newuserlogpagetext": "ဤသည်မှာ အသုံးပြုသူအသစ် ဖန်တီးမှု မှတ်တမ်း ဖြစ်သည်။",
        "whatlinkshere-hidelinks": "လင့်ခ်များ $1 ခု",
        "whatlinkshere-hideimages": "ဖိုင်အချိတ်အဆက်များ $1 ခု",
        "whatlinkshere-filters": "စိစစ်မှုများ",
+       "unblock": "အသုံးပြုသူကို ပိတ်ပင်ထားရာမှ ပြန်ဖွင့်ပေးရန်",
        "blockip": "{{GENDER:$1|အသုံးပြုသူ}} ပိတ်ပင်ရန်",
        "ipaddressorusername": "အိုင်ပီလိပ်စာ သို့ အသုံးပြုသူအမည် -",
        "ipbexpiry": "သက်တမ်းကုန်လွန်ရက် -",
        "unblocked": "[[User:$1|$1]] ကို ပိတ်ပင်ထားရာမှ ပြန်ဖွင့်ပေးလိုက်သည်",
        "unblocked-id": "$1 ကို ပိတ်ပင်ထားမှုကို ဖယ်ရှာလိုက်သည်",
        "blocklist": "ပိတ်ပင်ထားသော အသုံးပြုသူများ",
+       "autoblocklist": "အလိုအလျောက် ပိတ်ပင်မှုများ",
+       "autoblocklist-legend": "အလိုအလျောက် ပိတ်ပင်မှုများ စာရင်း",
+       "autoblocklist-localblocks": "ဒေသဆိုင်ရာ {{PLURAL:$1|အလိုအလျောက် ပိတ်ပင်မှု|အလိုအလျောက် ပိတ်ပင်မှုများ}}",
+       "autoblocklist-otherblocks": "အခြား {{PLURAL:$1|အလိုအလျောက် ပိတ်ပင်မှု|အလိုအလျောက် ပိတ်ပင်မှုများ}}",
        "ipblocklist": "ပိတ်ပင်ထားသော အသုံးပြုသူများ",
        "ipblocklist-legend": "ပိတ်ပင်ထားသော အသုံးပြုသူတစ်ဦးကို ရှာရန်",
        "ipblocklist-submit": "ရှာဖွေရန်",
        "log-action-filter-newusers-create2": "မှတ်ပုံတင်ထားသော အသုံးပြုသူမှ ဖန်တီးမှု",
        "log-action-filter-newusers-autocreate": "အလိုအလျောက် ဖန်တီးမှု",
        "log-action-filter-newusers-byemail": "အီးမေးလ်မှတဆင့် စကားဝှက်ပို့၍ ဖန်တီးမှု",
-       "gotointerwiki": "{{SITENAME}} မှ ထွက်ခွာနေသည်"
+       "gotointerwiki": "{{SITENAME}} မှ ထွက်ခွာနေသည်",
+       "passwordpolicies": "စကားဝှက် မူဝါဒများ",
+       "passwordpolicies-summary": "ဤသည်မှာ ဤဝီကီရှိ အသုံးပြုသူအုပ်စုများအတွက် အကျုံးဝင်သော စကားဝှက် မူဝါဒများ ဖြစ်သည်။"
 }
index 5adb853..c058b77 100644 (file)
@@ -10,7 +10,8 @@
                        "Macofe",
                        "進也",
                        "Liuxinyu970226",
-                       "Yoxem"
+                       "Yoxem",
+                       "Matěj Suchánek"
                ]
        },
        "tog-underline": "Liân-kiat oē té-sûn:",
        "filemissing": "Bô tóng-àn",
        "import": "Su-ji̍p ia̍h",
        "tooltip-pt-userpage": "{{GENDER:|Lí ê iōng-chiá}} ê ia̍h",
-       "tooltip-pt-mytalk": "{{GENDER:Lí}} ê thó-lūn ia̍h",
+       "tooltip-pt-mytalk": "{{GENDER:|Lí}} ê thó-lūn ia̍h",
        "tooltip-pt-preferences": "{{GENDER:|Lí ê}} siat-tēng",
        "tooltip-pt-watchlist": "你監視的頁有改過的清單",
        "tooltip-pt-mycontris": "{{GENDER:|Lí}} ê kòng-hiàn lia̍t-toaⁿ",
index 3dba87c..55cdb15 100644 (file)
        "backend-fail-usable": "Nun se può lieggere o scrivere 'o file \"$1\" pecché mancano 'e permesse sufficiente o nun esiste 'a cartella/cuntenitore.",
        "filejournal-fail-dbconnect": "Nun se può fà connessione a l'archivio d' 'o database pe' puté astipà archivie 'n rezza \"$1\".",
        "filejournal-fail-dbquery": "Nun se può agghiurnà l'archivio d' 'o database pe' puté astipà l'archivie 'n rezza \"$1\".",
-       "lockmanager-notlocked": "Nun se può sbloccà \"$1\"; nun è bluccato.",
+       "lockmanager-notlocked": "Nun se può sbloccà \"$1\"; nun sta bluccato.",
        "lockmanager-fail-closelock": "Nun se può nchiure 'o file 'e blocco pe' \"$1\".",
        "lockmanager-fail-deletelock": "Nun se può scancellà 'o file 'e blocco pe' \"$1\".",
        "lockmanager-fail-acquirelock": "Nun se può piglià 'o blocco pe' \"$1\".",
        "sorbsreason": "L'indirizzo IP vuosto è elencato comm'a nu proxy araputo dint' 'a lista DNSBL ausata 'a {{SITENAME}}.",
        "sorbs_create_account_reason": "L'indirizzo IP d' 'o vuosto è elencato comm'a nu proxy araputo dint' 'a DNSBL ausata 'a {{SITENAME}}. Nun putite crià nu cunto.",
        "xffblockreason": "N'indirizzo IP prisente dint' 'e cap'e paggena X-Forwarded-For, o chillu d' 'o vuosto o chillu 'e n'atu server proxy ca stat'ausann, è stato bloccato. 'O mutivo origgenale 'e blocco era: $1",
-       "cant-see-hidden-user": "L'utente ca state a bluccà è stato già bluccato e annascunnuto. Si nun tenite 'o deritto ''hideuser'', nun putite veré stu blocco d'utente.",
+       "cant-see-hidden-user": "L'utente ca state fremmanno he sito bluccato e annascunnuto già. Si nun tenite 'o deritto ''hideuser'', nun putite veré stu blocco utente.",
        "ipbblocked": "Nun putite bloccà o sbluccà utente pecche vuje stesso site bluccato.",
        "ipbnounblockself": "Nun avite permesso a ve bluccà vuje stesso.",
        "lockdb": "Nzerra 'o database",
        "lockdbsuccesstext": "'O database è stato bloccato.<br />\nArricuordateve 'e [[Special:UnlockDB|luvà 'o blocco]] appriesso c' 'a manutenziona sarrà fernuta.",
        "unlockdbsuccesstext": "'O database è stato sbluccato.",
        "lockfilenotwritable": "Nun se può scrivere ncopp' 'o file 'e blocco d' 'o database.\nPe' bluccà o sbluccà 'o database abbesuogne 'e scrivere dint' 'o server web.",
-       "databaselocked": "'O database è bluccato già.",
-       "databasenotlocked": "'O database nun è bluccato.",
+       "databaselocked": "'O database sta stutato già.",
+       "databasenotlocked": "'O database nun sta stutato.",
        "lockedbyandtime": "(pe' {{GENDER:$1|$1}} 'o $2 a 'e $3)",
        "move-page": "Mòve $1",
        "move-page-legend": "Mòve paggena",
        "tags-deactivate": "stuta",
        "tags-hitcount": "$1 {{PLURAL:$1|cagnamiento|cagnamiente}}",
        "tags-manage-no-permission": "Nun tenite 'o permesso pe' cagnà 'e tag.",
-       "tags-manage-blocked": "Nun putite cagnà sti tag quanno site bluccato/a.",
+       "tags-manage-blocked": "Nun putite cagnà sti tag quanno state {{GENDER:$1|fremmato|freammata}}.",
        "tags-create-heading": "Crìa nu tag nuovo",
        "tags-create-explanation": "Comme predefinito, 'e tag criate nuove nuove se farranno disponibbele pe ll'ausà ll'utente e re bot",
        "tags-create-tag-name": "Nomme 'e ll'etichetta ('o tag):",
        "tags-apply-not-allowed-one": "'O tag \"$1\" nun è premmesso a se ffà manualmente apprecà.",
        "tags-apply-not-allowed-multi": "{{PLURAL:$2|'O tag ccà abbascio nun è|'E tag ccà abbascio nun songo}} premmesse 'e s'apprecà manualmente: $1",
        "tags-update-no-permission": "Nun tenite premmesse pe' putè azzeccà o luvà tag 'e cagnamiento 'a 'e verziune nnividuale o entrate 'o log.",
-       "tags-update-blocked": "Nun putite azzeccà o luvà tag quanno site bluccato/a.",
+       "tags-update-blocked": "Nun putite azzeccà o luvà tag quanno state {{GENDER:$1|bluccato|bluccata}}.",
        "tags-update-add-not-allowed-one": "'O tag \"$1\" nun è premmesso 'e s'azzeccà 'n manuale.",
        "tags-update-add-not-allowed-multi": "{{PLURAL:$2|'O tag ccà abbascio nun è|'E tag ccà abbascio nu so'}} premmesse 'e s'azzeccà manualmente: $1",
        "tags-update-remove-not-allowed-one": "'O tag \"$1\" nun è permesso d' 'o luvà.",
        "revdelete-uname-unhid": "nomme utente fatto avvedè",
        "revdelete-restricted": "restriziune apprecate a ll'ammenistrature",
        "revdelete-unrestricted": "restriziune luvate a ll'ammenistrature",
-       "logentry-block-block": "$1 {{GENDER:$2|ave bluccato}} {{GENDER:$4|$3}} cu na scadenza 'e $5 $6",
+       "logentry-block-block": "$1 {{GENDER:$2|ave fremmato}} {{GENDER:$4|$3}} cu na scadenza 'e $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|ave sbluccato}} {{GENDER:$4|$3}}",
        "logentry-block-reblock": "$1 {{GENDER:$2|ave cagnato}} 'e mpustaziune 'e blocco pe' {{GENDER:$4|$3}} cu na scadenza 'e $5 $6",
-       "logentry-suppress-block": "$1 {{GENDER:$2|ave bluccato}} {{GENDER:$4|$3}} cu na scadenza 'e $5 $6",
+       "logentry-suppress-block": "$1 {{GENDER:$2|ave fremmato}} {{GENDER:$4|$3}} cu na scadenza 'e $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|cagnaje}} 'e mpustaziune 'e blocco 'e {{GENDER:$4|$3}} ch' 'ammaturasse a nu $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|ave mpurtato}} $3 pe' bbìa d' 'a carreca",
        "logentry-import-upload-details": "$1 {{GENDER:$2|mpurtaje}} $3 pe' carreca 'e file ($4 {{PLURAL:$4|verziona|verziune}})",
index 45a2f75..663fec1 100644 (file)
        "rcfilters-savedqueries-add-new-title": "Filterinstellingen upslån",
        "rcfilters-restore-default-filters": "Standardfilters weerummezetten",
        "rcfilters-clear-all-filters": "Alle filters vortdoon",
+       "rcfilters-show-new-changes": "Låt nyste wysigingen seen",
        "rcfilters-search-placeholder": "Filter wysigingen (gebruuk et menü of söök up filtername)",
        "rcfilters-filterlist-feedbacklink": "Låt uns weaten wat jy van disse (nye) filterhülpmiddels vinden",
        "rcfilters-highlightbutton-title": "Resultåten markeren",
        "rcfilters-view-namespaces-tooltip": "Filter resultåten up naamruumte",
        "rcfilters-view-tags-tooltip": "Filter resultåten döär gebruuk te maken van bewarkingsetiketten",
        "rcfilters-liveupdates-button": "Rechtstreakse aktualisering",
-       "rcfilters-liveupdates-button-title-off": "Nieje wiezigingen voortdalik laoten zien",
+       "rcfilters-liveupdates-button-title-off": "Nye wysigingen voorddalik låten seen",
        "rcnotefrom": "Dit bin de wiezigingen sinds <strong>$2</strong> (maximum van <strong>$1</strong> wiezigingen).",
        "rclistfrom": "Bekiek wiezigingen vanaof $3 $2",
        "rcshowhideminor": "$1 kleine wiezigingen",
index f91ed5b..ea57228 100644 (file)
        "converter-manual-rule-error": "Er is een fout gedetecteerd in een handmatig toegevoegde taalconversieregel.",
        "undo-success": "Deze bewerking kan ongedaan gemaakt worden.\nHieronder staat de tekst waarin de wijziging ongedaan is gemaakt.\nControleer voor het opslaan of het resultaat gewenst is.",
        "undo-failure": "De wijziging kan niet ongedaan gemaakt worden vanwege andere strijdige wijzigingen.",
+       "undo-main-slot-only": "De wijziging kan niet ongedaan gemaakt wordenomdat deze inhoud bevat die niet in het hoofdslot bevind.",
        "undo-norev": "De bewerking kon niet ongedaan gemaakt worden, omdat die niet bestaat of is verwijderd.",
        "undo-nochange": "De bewerking lijkt al ongedaan gemaakt te zijn.",
        "undo-summary": "Versie $1 van [[Special:Contributions/$2|$2]] ([[User talk:$2|overleg]]) ongedaan gemaakt",
        "rcfilters-activefilters": "Actieve filters",
        "rcfilters-activefilters-hide": "Verbergen",
        "rcfilters-activefilters-show": "Weergeven",
+       "rcfilters-activefilters-hide-tooltip": "Verberg actieve filters",
+       "rcfilters-activefilters-show-tooltip": "Toon active filters",
        "rcfilters-advancedfilters": "Geavanceerde filters",
        "rcfilters-limit-title": "Resultaten om te tonen",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|wijziging|wijzigingen}}, $2",
index fde0384..f51ac71 100644 (file)
        "mw-widgets-dateinput-placeholder-month": "ÅÅÅÅ-MM",
        "mw-widgets-titleinput-description-new-page": "sida finst ikkje enno",
        "mw-widgets-titleinput-description-redirect": "omdirigering til $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Legg til ein kategori …",
        "mw-widgets-usersmultiselect-placeholder": "Legg til fleire …",
        "date-range-from": "Frå dato:",
        "date-range-to": "Til dato:",
index 45fe433..60c36a9 100644 (file)
        "password-login-forbidden": "Wykorzystanie tej nazwy użytkownika lub hasła zostało zabronione.",
        "mailmypassword": "Zresetuj hasło",
        "passwordremindertitle": "Nowe tymczasowe hasło do {{GRAMMAR:D.lp|{{SITENAME}}}}",
-       "passwordremindertext": "Ktoś (prawdopodobnie Ty, spod adresu IP $1)\npoprosił o przesłanie nowego hasła do {{GRAMMAR:D.lp|{{SITENAME}}}} ($4).\nDla użytkownika „$2” zostało wygenerowane tymczasowe hasło i jest nim „$3”.\nJeśli było to zamierzone działanie, to po zalogowaniu się, musisz podać nowe hasło.\nTymczasowe hasło wygaśnie za {{PLURAL:$5|1 dzień|$5 dni}}.\n\nJeśli to nie Ty prosiłeś o przesłanie hasła lub przypomniałeś sobie hasło i nie chcesz go zmieniać, wystarczy, że zignorujesz tę wiadomość i dalej będziesz się posługiwać swoim dotychczasowym hasłem.",
+       "passwordremindertext": "Ktoś (z adresu IP $1) poprosił o przesłanie nowego hasła do {{GRAMMAR:D.lp|{{SITENAME}}}} ($4).\nDla użytkownika „$2” zostało wygenerowane tymczasowe hasło „$3”.\nJeśli było to zamierzone działanie, po zalogowaniu się, musisz podać nowe hasło.\nTymczasowe hasło wygaśnie za {{PLURAL:$5|1 dzień|$5 dni}}.\n\nJeśli to ktoś inny prosił o przesłanie hasła lub przypomniałeś sobie hasło i nie chcesz go zmieniać, wystarczy, że zignorujesz tę wiadomość i dalej będziesz się posługiwał swoim dotychczasowym hasłem.",
        "noemail": "Brak zdefiniowanego adresu e‐mail dla użytkownika „$1”.",
        "noemailcreate": "Musisz podać prawidłowy adres e‐mail",
        "passwordsent": "Nowe hasło zostało wysłane na adres e‐mail użytkownika „$1”.\nPo otrzymaniu go zaloguj się ponownie.",
        "expansion-depth-exceeded-warning": "Strona przekroczyła głębokość rozbudowy",
        "parser-unstrip-loop-warning": "Wykryto nieskończoną pętlę",
        "unstrip-depth-warning": "Przekroczono maksymalną głębokość zagnieżdżania ($1)",
+       "unstrip-depth-category": "Strony, które przekraczają limit zagnieżdżenia",
        "unstrip-size-warning": "Przekroczono maksymalną głębokość zagnieżdżania ($1)",
+       "unstrip-size-category": "Strony, które przekraczają dopuszczalny rozmiar dla funkcji unstrip",
        "converter-manual-rule-error": "Błąd w językowych regułach konwersji",
        "undo-success": "Edycja może zostać wycofana. Porównaj ukazane poniżej różnice między wersjami, a następnie zapisz zmiany.",
        "undo-failure": "Edycja nie może zostać wycofana z powodu konfliktu z wersjami pośrednimi.",
+       "undo-main-slot-only": "Zmiany nie można cofnąć, ponieważ dotyczy treści znajdujących się poza głównym wątkiem.",
        "undo-norev": "Edycja nie może być cofnięta, ponieważ nie istnieje lub została usunięta.",
        "undo-nochange": "Wygląda na to, że edycja została już anulowana.",
        "undo-summary": "Anulowanie wersji $1 autora [[Special:Contributions/$2|$2]] ([[User talk:$2|dyskusja]])",
        "rcfilters-activefilters": "Aktywne filtry",
        "rcfilters-activefilters-hide": "Ukryj",
        "rcfilters-activefilters-show": "Pokaż",
+       "rcfilters-activefilters-hide-tooltip": "Ukryj obszar aktywnych filtrów",
+       "rcfilters-activefilters-show-tooltip": "Pokaż obszar aktywnych filtrów",
        "rcfilters-advancedfilters": "Zaawansowane filtry",
        "rcfilters-limit-title": "Wyników do pokazania",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|zmiana|zmiany|zmian}}, $2",
        "rcfilters-watchlist-showupdated": "<strong>Wytłuszczono</strong> strony, których nie odwiedził{{GENDER:|e|a|e}}ś od czasu zapisania ostatnich zmian.",
        "rcfilters-preference-label": "Wyłącz ulepszenia strony Ostatnich zmian",
        "rcfilters-preference-help": "Wycofuje wszystkie zmiany interfejsu z 2017 i narzędzia dodane od tamtej pory.",
+       "rcfilters-watchlist-preference-label": "Ukryj ulepszoną wersję listy obserwowanych",
+       "rcfilters-watchlist-preference-help": "Wycofaj zmiany wyglądu interfejsu z 2017 i wszystkie narzędzia dodane wtedy i od tego czasu.",
        "rcfilters-filter-showlinkedfrom-label": "Pokaż zmiany na stronach linkowanych z",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>Strony linkowane z</strong> zaznaczonej strony",
        "rcfilters-filter-showlinkedto-label": "Pokaż zmiany na stronach linkujących do",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|bajt|bajty|bajtów}}",
        "limitreport-expansiondepth": "Największa głębokość ekspansji",
        "limitreport-expensivefunctioncount": "Liczba wywołań kosztownych funkcji parsera",
+       "limitreport-unstrip-depth": "Głębokość rekurencji funkcji unstrip",
+       "limitreport-unstrip-size": "Rozmiar dla funkcji unstrip po rozwinięciu",
        "limitreport-unstrip-size-value": "$1/$2 {{PLURAL:$2|bajt|bajty|bajtów}}",
        "expandtemplates": "Rozwijanie szablonów",
        "expand_templates_intro": "We wprowadzonym na tej stronie tekście źródłowym zostaną rozwinięte rekurencyjnie wszystkie szablony.\nRozwinięte także zostaną funkcje parsera takie jak\n<code><nowiki>{{</nowiki>#language:…}}</code> i zmienne jak\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nW zasadzie rozwijane jest prawie wszystko w podwójnych nawiasach klamrowych.",
index a77ff2d..d9b41c5 100644 (file)
                        "Trigonometria87",
                        "RadiX",
                        "Fitoschido",
-                       "Ed g2s"
+                       "Ed g2s",
+                       "Matěj Suchánek"
                ]
        },
        "tog-underline": "Ligação sublinhada:",
        "createacct-loginerror": "A conta foi criada com êxito, mas não pôde ser autenticado automaticamente. Por favor, faça o [[Special:UserLogin|início de sessão manualmente]].",
        "noname": "Você não colocou um nome de usuário válido.",
        "loginsuccesstitle": "Autenticado",
-       "loginsuccess": "'''Agora você está {{GENDER:autenticado|autenticada}} ao wiki {{SITENAME}} como \"$1\"'''.",
+       "loginsuccess": "'''Agora você está {{GENDER:|autenticado|autenticada}} ao wiki {{SITENAME}} como \"$1\"'''.",
        "nosuchuser": "Não existe nenhum usuário com o nome \"$1\".\nOs nomes de usuário são sensíveis a letras maiúsculas.\nVerifique se digitou corretamente ou [[Special:CreateAccount|crie uma nova conta]].",
        "nosuchusershort": "Não existe um usuário com o nome \"$1\". Verifique o nome que introduziu.",
        "nouserspecified": "Você precisa especificar um nome de usuário.",
        "rcfilters-activefilters": "Filtros ativos",
        "rcfilters-activefilters-hide": "Ocultar",
        "rcfilters-activefilters-show": "Exibir",
+       "rcfilters-activefilters-hide-tooltip": "Ocultar a área dos filtros ativos",
+       "rcfilters-activefilters-show-tooltip": "Mostrar a área dos filtros ativos",
        "rcfilters-advancedfilters": "Filtros avançados",
        "rcfilters-limit-title": "Resultados para mostrar",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|mudança|mudanças}}, $2",
index eed76f1..db51aa6 100644 (file)
@@ -87,7 +87,7 @@
        "tog-hidecategorization": "Ocultar categorização de páginas",
        "tog-extendwatchlist": "Listagem expandida de todas as mudanças às páginas vigiadas, não apenas das mais recentes",
        "tog-usenewrc": "Agrupar alterações por página nas mudanças recentes e páginas vigiadas",
-       "tog-numberheadings": "Auto-numerar cabeçalhos",
+       "tog-numberheadings": "Numerar cabeçalhos automaticamente",
        "tog-showtoolbar": "Mostrar barra de edição",
        "tog-editondblclick": "Editar páginas quando houver um clique duplo",
        "tog-editsectiononrightclick": "Possibilitar a edição de secções por clique com o botão direito no título da secção",
        "protect_change": "alterar",
        "unprotect": "Alterar proteção",
        "newpage": "Página nova",
-       "talkpagelinktext": "Discussão",
+       "talkpagelinktext": "discussão",
        "specialpage": "Página especial",
        "personaltools": "Ferramentas pessoais",
        "talk": "Discussão",
        "viewhelppage": "Ver página de ajuda",
        "categorypage": "Ver página de categoria",
        "viewtalkpage": "Ver discussão",
-       "otherlanguages": "Noutros idiomas",
+       "otherlanguages": "Noutras línguas",
        "redirectedfrom": "(Redirecionado de $1)",
        "redirectpagesub": "Página de redirecionamento",
        "redirectto": "Redireciona para:",
-       "lastmodifiedat": "Esta página foi editada pela última vez à(s) $2 de $1.",
+       "lastmodifiedat": "Esta página foi editada pela última vez às $2 de $1.",
        "viewcount": "Esta página foi acedida {{PLURAL:$1|uma vez|$1 vezes}}.",
        "protectedpage": "Página protegida",
        "jumpto": "Ir para:",
        "sort-descending": "Ordenar por ordem descendente",
        "sort-ascending": "Ordenar por ordem ascendente",
        "nstab-main": "Página",
-       "nstab-user": "Página d{{GENDER:{{BASEPAGENAME}}|o utilizador|a utilizadora|e utilizador(a)}}",
+       "nstab-user": "Página {{GENDER:{{BASEPAGENAME}}|do utilizador|da utilizadora}}",
        "nstab-media": "Multimédia",
        "nstab-special": "Página especial",
        "nstab-project": "Página do projeto",
        "undo-failure": "Não foi possível desfazer a edição por conflito com alterações intermédias.",
        "undo-norev": "Não foi possível desfazer a edição porque não existe ou foi apagada.",
        "undo-nochange": "A edição parece já ter sido desfeita.",
-       "undo-summary": "Desfez a edição $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|Discussão]])",
+       "undo-summary": "Desfez a edição $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|discussão]])",
        "undo-summary-username-hidden": "Desfez a edição $1 de um utilizador oculto",
        "cantcreateaccount-text": "A criação de contas a partir deste endereço IP (<strong>$1</strong>) foi bloqueada por [[User:$3|$3]].\n\nO motivo apresentado por $3 foi <em>$2</em>",
        "cantcreateaccount-range-text": "A criação de conta a partir dos endereços IP no intervalo <strong>$1</strong>, que inclui o seu endereço IP (<strong>$4</strong>), foi bloqueada por [[User:$3|$3]].\n\nO motivo apresentado por $3 foi <em>$2</em>",
        "rev-deleted-comment": "(resumo da edição suprimido)",
        "rev-deleted-user": "(nome de utilizador removido)",
        "rev-deleted-event": "(registos de detalhes eliminados)",
-       "rev-deleted-user-contribs": "[nome de utilizador(a) ou IP removido do histórico – edição ocultada das contribuições públicas]",
+       "rev-deleted-user-contribs": "[nome de utilizador ou IP removido do histórico – edição ocultada das contribuições públicas]",
        "rev-deleted-text-permission": "Esta revisão de página foi <strong>eliminada</strong>.\nEncontrará detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminações].",
        "rev-suppressed-text-permission": "Esta revisão de página foi <strong>suprimida</strong>.\nPode consultar os detalhes no [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registo de supressões].",
        "rev-deleted-text-unhide": "Esta revisão de página foi <strong>eliminada</strong>.\nEncontrará detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminações].\nPode mesmo assim [$1 ver esta revisão] se deseja prosseguir.",
        "gender-unknown": "Ao mencioná-lo, o software irá utilizar palavras de género neutro sempre que possível",
        "gender-male": "Ele é um utilizador",
        "gender-female": "Ela é uma utilizadora",
-       "prefs-help-gender": "Esta preferência é opcional.\nO software usa o seu valor para o endereçar e para o mencionar a outros usando o género gramatical apropriado.\nEsta informação será pública.",
+       "prefs-help-gender": "Esta preferência é opcional.\nO ''software'' usa o valor para se dirigir a si e para o mencionar a outros usando o género gramatical apropriado.\nEsta informação será pública.",
        "email": "Correio eletrónico",
        "prefs-help-realname": "O fornecimento do nome verdadeiro é opcional.\nSe optar por revelá-lo, será utilizado para atribuir-lhe crédito pelo seu trabalho.",
        "prefs-help-email": "Opcional: o endereço de correio eletrónico é opcional, mas será necessário para redefinir a palavra-passe caso esqueça a antiga.",
        "userrights-lookup-user": "Selecionar um utilizador",
        "userrights-user-editname": "Introduza um nome de utilizador:",
        "editusergroup": "Carregar grupos do utilizador",
-       "editinguser": "A modificar os privilégios {{GENDER:$1|do utilizador|da utilizadora|do(a) utilizador(a)}}  <strong>[[User:$1|$1]]</strong> $2",
+       "editinguser": "A modificar os privilégios {{GENDER:$1|do utilizador|da utilizadora}}  <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "A ver os privilégios {{GENDER:$1|do utilizador|da utilizadora}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Editar grupos {{GENDER:$1|do utilizador|da utilizadora}}",
        "userrights-viewusergroup": "Ver grupos {{GENDER:$1|do utilizador|da utilizadora}}",
-       "saveusergroups": "Gravar grupos {{GENDER:$1|do utilizador|da utilizadora|do(a) utilizador(a)}}",
+       "saveusergroups": "Gravar grupos {{GENDER:$1|do utilizador|da utilizadora}}",
        "userrights-groupsmember": "Membro de:",
        "userrights-groupsmember-auto": "Membro implícito de:",
        "userrights-groupsmember-type": "$1",
        "group-suppress": "Supressores",
        "group-all": "(todos)",
        "group-user-member": "{{GENDER:$1|utilizador|utilizadora}}",
-       "group-autoconfirmed-member": "{{GENDER:$1|utilizador autoconfirmado|utilizadora autoconfirmada|utilizador(a) autoconfirmado(a)}}",
+       "group-autoconfirmed-member": "{{GENDER:$1|utilizador autoconfirmado|utilizadora autoconfirmada}}",
        "group-bot-member": "{{GENDER:$1|robô}}",
        "group-sysop-member": "{{GENDER:$1|administrador|administradora}}",
        "group-bureaucrat-member": "{{GENDER:$1|burocrata}}",
-       "group-suppress-member": "{{GENDER:$1|supressor|supressora|supressor(a)}}",
+       "group-suppress-member": "{{GENDER:$1|supressor|supressora}}",
        "grouppage-user": "{{ns:project}}:Utilizadores",
        "grouppage-autoconfirmed": "{{ns:project}}:Autoconfirmados",
        "grouppage-bot": "{{ns:project}}:Robôs",
        "rcfilters-activefilters": "Filtros ativos",
        "rcfilters-activefilters-hide": "Ocultar",
        "rcfilters-activefilters-show": "Mostrar",
+       "rcfilters-activefilters-hide-tooltip": "Ocultar a área dos filtros ativos",
+       "rcfilters-activefilters-show-tooltip": "Mostrar a área dos filtros ativos",
        "rcfilters-advancedfilters": "Filtros avançados",
        "rcfilters-limit-title": "Resultados a mostrar",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|mudança|mudanças}}, $2",
        "uploadnewversion-linktext": "Carregar uma nova versão deste ficheiro",
        "shared-repo-from": "de $1",
        "shared-repo": "um repositório partilhado",
+       "filepage.css": "/* Os estilos CSS colocados aqui serão incluídos na página de descrição do ficheiro, também incluída nas wikis clientes externas */",
        "upload-disallowed-here": "Não pode substituir este ficheiro.",
        "filerevert": "Reverter $1",
        "filerevert-legend": "Reverter ficheiro",
        "listusersfrom": "Mostrar utilizadores começados por:",
        "listusers-submit": "Mostrar",
        "listusers-noresult": "Não foram encontrados utilizadores.",
-       "listusers-blocked": "({{GENDER:$1|bloqueado|bloqueada|bloqueado(a)}})",
+       "listusers-blocked": "({{GENDER:$1|bloqueado|bloqueada}})",
        "activeusers": "Utilizadores ativos",
        "activeusers-intro": "Esta é uma lista dos utilizadores com qualquer tipo de atividade {{PLURAL:$1|no último dia|nos últimos $1 dias}}.",
        "activeusers-count": "$1 {{PLURAL:$1|ação|ações}} {{PLURAL:$3|no último dia|nos últimos $3 dias}}",
        "nowikiemailtext": "Este utilizador optou por não receber correio eletrónico de outros utilizadores.",
        "emailnotarget": "O nome do destinatário não existe ou é inválido.",
        "emailtarget": "Introduza o nome do destinatário",
-       "emailusername": "Utilizador(a):",
+       "emailusername": "Utilizador:",
        "emailusernamesubmit": "Enviar",
        "email-legend": "Enviar uma mensagem a outro utilizador da wiki {{SITENAME}}",
        "emailfrom": "De:",
        "mywatchlist": "Páginas vigiadas",
        "watchlistfor2": "Para $1 $2",
        "nowatchlist": "A sua lista de páginas vigiadas está vazia.",
-       "watchlistanontext": "Por favor, inicie sessão para ver ou editar itens da sua lista de páginas vigiadas.",
+       "watchlistanontext": "Para ver ou editar entradas da sua lista de páginas vigiadas, inicie uma sessão, por favor.",
        "watchnologin": "Não está autenticado(a)",
        "addwatch": "Adicionar às páginas vigiadas",
-       "addedwatchtext": "\"[[:$1]]\" e a sua página de discussão foram adicionadas à sua [[Special:Watchlist|lista de páginas vigiadas]].",
-       "addedwatchtext-talk": "\"[[:$1]]\" e a sua página associada foram adicionadas à sua lista de [[Special:Watchlist|páginas vigiadas]].",
-       "addedwatchtext-short": "A página \"$1\" foi adicionada à sua lista de vigiadas.",
+       "addedwatchtext": "\"[[:$1]]\" e a respetiva página de discussão foram adicionadas à sua [[Special:Watchlist|lista de páginas vigiadas]].",
+       "addedwatchtext-talk": "\"[[:$1]]\" e a respetiva página associada foram adicionadas à sua lista de [[Special:Watchlist|páginas vigiadas]].",
+       "addedwatchtext-short": "A página \"$1\" foi adicionada às suas páginas vigiadas.",
        "removewatch": "Remover das páginas vigiadas",
-       "removedwatchtext": "\"[[:$1]]\" e a sua página de discussão foram removidas da sua lista de [[Special:Watchlist|páginas vigiadas]].",
-       "removedwatchtext-talk": "\"[[:$1]]\" e a sua página associada foram removidas da sua lista de [[Special:Watchlist|páginas vigiadas]].",
-       "removedwatchtext-short": "A página \"$1\" foi removida da sua lista de vigiadas.",
+       "removedwatchtext": "\"[[:$1]]\" e a respetiva página de discussão foram removidas da sua lista de [[Special:Watchlist|páginas vigiadas]].",
+       "removedwatchtext-talk": "\"[[:$1]]\" e a respetiva página associada foram removidas da sua lista de [[Special:Watchlist|páginas vigiadas]].",
+       "removedwatchtext-short": "A página \"$1\" foi removida das suas páginas vigiadas.",
        "watch": "Vigiar",
        "watchthispage": "Vigiar esta página",
        "unwatch": "Desinteressar-se",
        "unwatchthispage": "Parar de vigiar esta página",
        "notanarticle": "Não é uma página de conteúdo",
-       "notvisiblerev": "Edição eliminada",
+       "notvisiblerev": "A última revisão feita por um utilizador diferente foi eliminada",
        "watchlist-details": "{{PLURAL:$1|Existe $1 página|Existem $1 páginas}} na sua lista de páginas vigiadas (mais as páginas de discussão).",
        "wlheader-enotif": "A notificação por correio eletrónico está ativa.",
        "wlheader-showupdated": "As páginas modificadas desde a última vez que as visitou aparecem destacadas a <strong>negrito</strong>.",
        "deletepage": "Eliminar página",
        "confirm": "Confirmar",
        "excontent": "o conteúdo era: \"$1\"",
-       "excontentauthor": "o conteúdo era: \"$1\", e {{GENDER:$2|o único editor|a única editora|o(a) único(a) editor(a)}} era [[Special:Contributions/$2|$2]] ([[User talk:$2|discussão]])",
+       "excontentauthor": "o conteúdo era: \"$1\", e {{GENDER:$2|o único editor|a única editora}} era [[Special:Contributions/$2|$2]] ([[User talk:$2|discussão]])",
        "exbeforeblank": "o conteúdo antes de esvaziar era: \"$1\"",
        "delete-confirm": "Eliminar \"$1\"",
        "delete-legend": "Eliminar",
        "undelete-error-long": "Foram encontrados erros ao tentar restaurar o ficheiro:\n\n$1",
        "undelete-show-file-confirm": "Tem a certeza de que quer ver a revisão eliminada do ficheiro \"<nowiki>$1</nowiki>\" de $2 às $3?",
        "undelete-show-file-submit": "Sim",
-       "namespace": "Domínio:",
+       "namespace": "Espaço nominal:",
        "invert": "Inverter seleção",
        "tooltip-invert": "Marque esta caixa para esconder as alterações a páginas no domínio selecionado (e no domínio associado, se escolheu fazê-lo)",
        "tooltip-whatlinkshere-invert": "Marque esta caixa de seleção para ocultar ligações de páginas dentro do domínio selecionado.",
-       "namespace_association": "Domínio associado",
+       "namespace_association": "Espaço nominal associado",
        "tooltip-namespace_association": "Marque esta caixa para incluir também o domínio de conteúdo ou de discussão associado à sua seleção",
        "blanknamespace": "(Principal)",
        "contributions": "Contribuições {{GENDER:$1|do utilizador|da utilizadora}}",
        "javascripttest": "Teste de JavaScript",
        "javascripttest-pagetext-unknownaction": "Ação \"$1\" desconhecida.",
        "javascripttest-qunit-intro": "Consulte a [ $1 documentação de testes] no mediawiki.org.",
-       "tooltip-pt-userpage": "A sua página de {{GENDER:|utilizador|utilizadora|utilizador(a)}}",
+       "tooltip-pt-userpage": "A sua página de {{GENDER:|utilizador|utilizadora}}",
        "tooltip-pt-anonuserpage": "A página de utilizador para o endereço IP que está a usar",
        "tooltip-pt-mytalk": "A {{GENDER:|sua}} página de discussão",
        "tooltip-pt-anontalk": "Discussão sobre edições feitas a partir deste endereço IP",
        "tooltip-t-recentchangeslinked": "Mudanças recentes nas páginas para as quais esta contém hiperligações",
        "tooltip-feed-rss": "''Feed'' RSS desta página",
        "tooltip-feed-atom": "''Feed'' Atom desta página",
-       "tooltip-t-contributions": "Ver as contribuições {{GENDER:$1|deste utilizador|desta utilizadora|deste(a) utilizador(a)}}",
-       "tooltip-t-emailuser": "Enviar uma mensagem de correio a {{GENDER:$1|este utilizador|esta utilizadora|este(a) utilizador(a)}}",
+       "tooltip-t-contributions": "Ver as contribuições {{GENDER:$1|deste utilizador|desta utilizadora}}",
+       "tooltip-t-emailuser": "Enviar uma mensagem de correio a {{GENDER:$1|este utilizador|esta utilizadora}}",
        "tooltip-t-info": "Mais informações sobre esta página",
        "tooltip-t-upload": "Carregar ficheiros",
        "tooltip-t-specialpages": "Lista de páginas especiais",
        "interlanguage-link-title-nonlang": "$1 – $2",
        "common.css": "/* Código CSS colocado aqui será aplicado a todos os temas */",
        "print.css": "/* Código CSS colocado aqui afectará as impressões */",
-       "noscript.css": "/* Os estilos CSS colocados aqui afetarão os utilizadores que tenham o JavaScript desativado em seus navegadores */",
+       "noscript.css": "/* Os estilos CSS colocados aqui afetarão os utilizadores que tenham o JavaScript desativado */",
+       "group-autoconfirmed.css": "/* Os estilos CSS colocados aqui só afetarão os utilizadores autoconfirmados */",
+       "group-user.css": "/* Os estilos CSS colocados aqui só afetarão os utilizadores registados */",
+       "group-bot.css": "/* Os estilos CSS colocados aqui só afetarão robôs */",
+       "group-sysop.css": "/* Os estilos CSS colocados aqui só afetarão os administradores */",
+       "group-bureaucrat.css": "/* Os estilos CSS colocados aqui só afetarão os burocratas */",
        "common.json": "/* Qualquer JSON colocado aqui será carregado para todos os utilizadores em cada carregamento de página. */",
        "common.js": "/* Código Javascript colocado aqui será carregado para todos os utilizadores em cada carregamento de página */",
+       "group-autoconfirmed.js": "/* O código JavaScript colocado aqui só será carregado para utilizadores autoconfirmados */",
+       "group-user.js": "/* O código JavaScript colocado aqui só será carregado para utilizadores registados */",
+       "group-bot.js": "/* O código JavaScript colocado aqui só será carregado para robôs */",
+       "group-sysop.js": "/* O código JavaScript colocado aqui só será carregado para administradores */",
+       "group-bureaucrat.js": "/* O código JavaScript colocado aqui só será carregado para burocratas */",
        "anonymous": "{{PLURAL:$1|Utilizador anónimo|Utilizadores anónimos}} da wiki {{SITENAME}}",
        "siteuser": "$1 da wiki {{SITENAME}}",
        "anonuser": "utilizador anónimo $1 da wiki {{SITENAME}}",
-       "lastmodifiedatby": "Esta página foi editada pela última vez à(s) $2 de $1 por $3.",
+       "lastmodifiedatby": "Esta página foi editada pela última vez às $2 de $1 por $3.",
        "othercontribs": "Baseado no trabalho de $1.",
        "others": "outros",
        "siteusers": "{{PLURAL:$2|um utilizador|$2 utilizadores}} da wiki {{SITENAME}} ($1)",
        "exif-compression-2": "CCITT Grupo 3 1-D Codificação Unidimensional Huffman Modificado e Run Length Encoding",
        "exif-compression-3": "CCITT Grupo 3 codificação de fax",
        "exif-compression-4": "CCITT Grupo 4 codificação de fax",
+       "exif-compression-6": "JPEG (antigo)",
        "exif-copyrighted-true": "Direitos de autor reservados",
        "exif-copyrighted-false": "Estado dos direitos de autor indefinido",
-       "exif-photometricinterpretation-1": "Preto e branco (Preto é 0)",
+       "exif-photometricinterpretation-0": "Preto e branco (branco é 0)",
+       "exif-photometricinterpretation-1": "Preto e branco (preto é 0)",
+       "exif-photometricinterpretation-3": "Palete",
+       "exif-photometricinterpretation-4": "Máscara de transparência",
+       "exif-photometricinterpretation-5": "Separados (provavelmente CMYK)",
+       "exif-photometricinterpretation-9": "CIE L*a*b* (codificação ICC)",
+       "exif-photometricinterpretation-10": "CIE L*a*b* (codificação ITU)",
+       "exif-photometricinterpretation-32803": "Matriz de filtros de cores",
+       "exif-photometricinterpretation-34892": "Linear não processado",
        "exif-unknowndate": "Data desconhecida",
        "exif-orientation-1": "Normal",
        "exif-orientation-2": "Espelhamento horizontal",
        "exif-orientation-8": "Rodado 90° no sentido horário",
        "exif-planarconfiguration-1": "formato irregular",
        "exif-planarconfiguration-2": "formato plano",
+       "exif-xyresolution-i": "$1 ppp",
        "exif-xyresolution-c": "$1 pt/cm",
        "exif-colorspace-65535": "Cor não calibrada",
        "exif-componentsconfiguration-0": "não existe",
        "exif-meteringmode-1": "Média",
        "exif-meteringmode-2": "MédiaPonderadaAoCentro",
        "exif-meteringmode-3": "Ponto",
-       "exif-meteringmode-4": "MultiPonto",
+       "exif-meteringmode-4": "Multiponto",
        "exif-meteringmode-5": "Padrão",
        "exif-meteringmode-6": "Parcial",
        "exif-meteringmode-255": "Outro",
        "autosumm-changed-redirect-target": "Alteração do redirecionamento de [[$1]] para [[$2]]",
        "autosumm-new": "Criou a página com \"$1\"",
        "autosumm-newblank": "Página em branco criada",
-       "lag-warn-normal": "Alterações realizadas {{PLURAL:$1|no último segundo|nos últimos $1 segundos}} podem não constar desta lista.",
-       "lag-warn-high": "Devido a latência elevada no acesso ao servidor da base de dados, as alterações realizadas {{PLURAL:$1|no último segundo|nos últimos $1 segundos}} podem não constar desta lista.",
+       "size-pixel": "$1 {{PLURAL:$1|píxel|píxeis}}",
+       "lag-warn-normal": "As alterações realizadas {{PLURAL:$1|no último segundo|nos últimos $1 segundos}} podem não constar desta lista.",
+       "lag-warn-high": "Devido a uma latência elevada no acesso ao servidor da base de dados, as alterações realizadas {{PLURAL:$1|no último segundo|nos últimos $1 segundos}} podem não constar desta lista.",
        "watchlistedit-normal-title": "Editar lista de páginas vigiadas",
        "watchlistedit-normal-legend": "Remover páginas da lista de páginas vigiadas",
        "watchlistedit-normal-explain": "As suas páginas vigiadas são listadas abaixo.\nPara remover uma página, marque a caixa de seleção correspondente e clique o botão \"{{int:Watchlistedit-normal-submit}}\".\nTambém pode [[Special:EditWatchlist/raw|editar a lista de páginas vigiadas em forma de texto]].",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|protegeu}} $3 $4 [em cascata]",
        "logentry-protect-modify": "$1 {{GENDER:$2|alterou}} o nível de proteção para $3 $4",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|alterou}} o nível de proteção para $3 $4 [em cascata]",
-       "logentry-rights-rights": "$1 {{GENDER:$2|modificou}} os privilégios {{GENDER:$3|do utilizador $3|da utilizadora $3|do(a) utilizador(a) $3}} de $4 para $5",
+       "logentry-rights-rights": "$1 {{GENDER:$2|modificou}} os privilégios {{GENDER:$3|do utilizador|da utilizadora}} $3 de $4 para $5",
        "logentry-rights-rights-legacy": "$1 alterou os grupos de $3",
        "logentry-rights-autopromote": "$1 foi automaticamente {{GENDER:$2|promovido|promovida}} de $4 a $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|carregou}} $3",
        "authmanager-email-label": "Correio eletrónico",
        "authmanager-email-help": "Endereço de correio eletrónico",
        "authmanager-realname-label": "Nome verdadeiro",
-       "authmanager-realname-help": "Nome verdadeiro do(a) utilizador(a)",
+       "authmanager-realname-help": "Nome verdadeiro do utilizador",
        "authmanager-provider-password": "Autenticação baseada em palavra-passe",
        "authmanager-provider-password-domain": "Autenticação baseada em palavra-passe e domínio",
        "authmanager-provider-temporarypassword": "Palavra-passe temporária",
index 0b92009..082230f 100644 (file)
        "converter-manual-rule-error": "Used as error message when a manual conversion rule for the [[mw:Language_converter|language converter]] has errors. For example it's not using the correct syntax, or not supplying text in all variants.",
        "undo-success": "Text on special page to confirm edit revert. You arrive on this page by clicking on the \"undo\" link on a revision history special page.\n\n{{Identical|Undo}}",
        "undo-failure": "Message appears if an attempt to revert an edit by clicking the \"undo\" link on the page history fails.\n\nSee also:\n* {{msg-mw|Undo-norev}}\n* {{msg-mw|Undo-nochange}}\n{{Identical|Undo}}",
+       "undo-main-slot-only": "Message appears if an attempt to revert an edit by clicking the \"undo\" link on the page history fails because it involves content outside the page's main slot, which is not yet supported.\nThis message is temporary, see https://phabricator.wikimedia.org/T189808\n\nSee also:\n* {{msg-mw|Undo-failure}}\n{{Identical|Undo}}",
        "undo-norev": "Message appears if an attempt to revert an edit by clicking the \"undo\" link on the page history fails.\n\nSee also:\n* {{msg-mw|Undo-failure}}\n* {{msg-mw|Undo-nochange}}\n{{Identical|Undo}}",
        "undo-nochange": "Message appears if an attempt to revert an edit by clicking the \"undo\" link results in an edit making no change to the current version of the page.\n\nSee also:\n* {{msg-mw|Undo-failure}}\n* {{msg-mw|Undo-norev}}",
        "undo-summary": "Edit summary for an undo action. Parameters:\n* $1 - revision ID\n* $2 - username\n{{Identical|Undo}}",
        "rcfilters-activefilters": "{{doc-important|Translations of this message should not more than 3 cm long, otherwise it will make bad user experiences for potential mobile users.}}\nTitle for the filters selection showing the active filters.",
        "rcfilters-activefilters-hide": "Label for the button that hides the active filters list and dropdown in [[Special:RecentChanges]].\n{{Identical|Hide}}",
        "rcfilters-activefilters-show": "Label for the button that shows the active filters list and dropdown in [[Special:RecentChanges]].\n{{Identical|Show}}",
+       "rcfilters-activefilters-hide-tooltip": "Tooltip for the button that hides the active filters list and dropdown in [[Special:RecentChanges]].",
+       "rcfilters-activefilters-show-tooltip": "Tooltip for the button that shows the active filters list and dropdown in [[Special:RecentChanges]].",
        "rcfilters-advancedfilters": "Title for the buttons allowing the user to switch to the various advanced filters views.",
        "rcfilters-limit-title": "Title for the options to change the number of results shown.",
        "rcfilters-limit-and-date-label": "Title for the button that opens the operation to control how many results to show and in which time period to search. \n\nParameters: $1 - Number of results shown\n\n$2 - Time period to search. One of {{msg-mw|rcfilters-days-title}} or {{msg-mw|rcfilters-hours-title}} is used as $2\n{{Identical|Change}}",
index 1af8000..4bc493c 100644 (file)
@@ -10,7 +10,8 @@
                        "Macofe",
                        "Purodha",
                        "Fitoschido",
-                       "Ruthven"
+                       "Ruthven",
+                       "Matěj Suchánek"
                ]
        },
        "tog-underline": "Collegaminde sottolinèate:",
        "prefs-help-recentchangescount": "Quiste 'nglude le urteme cangiaminde, le storie de le pàggene e le archivije.",
        "prefs-help-watchlist-token2": "Queste jè 'a chiave segrete a le feed d'u web de l'elenghe de le pàggene condrollate tune.\nCengate vò ccu canosce ce pò leggere l'elenghe de le pàggene condrollate tune, accussì non g'ù pò condividere.\nCe è abbesogne, [[Special:ResetTokens|'u puè azzerà]].",
        "savedprefs": "Le preferenze tue onne state aggiornete.",
-       "savedrights": "Le gruppe utinde de {{GENDER:$1$1}} onne state reggistrate.",
+       "savedrights": "Le gruppe utinde de {{GENDER:$1|$1}} onne state reggistrate.",
        "timezonelegend": "Orarie d'a zone:",
        "localtime": "Orarie lochele:",
        "timezoneuseserverdefault": "Ause 'u valore de default de uicchi ($1)",
        "tooltip-feed-rss": "RSS feed pe sta pàgene",
        "tooltip-feed-atom": "Atom feed pe sta pàgene",
        "tooltip-t-contributions": "Vide l'elenghe de le condrebbute de {{GENDER:$1|stu utende}}",
-       "tooltip-t-emailuser": "Manne n'e-mail a {{GENDER:$1stu utende}}",
+       "tooltip-t-emailuser": "Manne n'e-mail a {{GENDER:$1|stu utende}}",
        "tooltip-t-info": "Cchiù 'mbormaziune sus a sta pàgene",
        "tooltip-t-upload": "Careche le file",
        "tooltip-t-specialpages": "Liste de tutte le pàggene speciale",
index 5994991..15ee8d6 100644 (file)
        "converter-manual-rule-error": "Ошибка в ручном правиле преобразования языка",
        "undo-success": "Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.",
        "undo-failure": "Правка не может быть отменена из-за несовместимости промежуточных изменений.",
+       "undo-main-slot-only": "Правка не может быть отменена, поскольку оно включает контент вне основного слота.",
        "undo-norev": "Правка не может быть отменена, так как её не существует или она была удалена.",
        "undo-nochange": "Правка, похоже, уже была отменена.",
        "undo-summary": "Отмена правки $1, сделанной [[Special:Contributions/$2|$2]] ([[User talk:$2|обсуждение]])",
        "rcfilters-activefilters": "Активные фильтры",
        "rcfilters-activefilters-hide": "Скрыть",
        "rcfilters-activefilters-show": "Показать",
+       "rcfilters-activefilters-hide-tooltip": "Скрыть область активных фильтров",
+       "rcfilters-activefilters-show-tooltip": "Показать область активных фильтров",
        "rcfilters-advancedfilters": "Расширенные фильтры",
        "rcfilters-limit-title": "Результаты для показа",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|изменение|изменения|изменений}}, $2",
index b66b47c..f4b87ed 100644 (file)
@@ -16,7 +16,8 @@
                        "Xð",
                        "Сербијана",
                        "Acamicamacaraca",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "BadDog"
                ]
        },
        "tog-underline": "Podvuci linkove:",
        "allmessagesname": "Naziv",
        "allmessagesdefault": "Uobičajeni tekst",
        "allmessagescurrent": "Trenutni tekst",
-       "allmessagestext": "Ovo je spisak svih sistemskih poruka u dostupnih u MediaWiki imenskom prostoru.\nMolimo posjetite [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki lokalizaciju] i [https://translatewiki.net translatewiki.net] ako želite doprinijeti općoj lokalizaciji MediaWikija.",
+       "allmessagestext": "Ovo je spisak sistemskih poruka u dostupnih u MediaWiki imenskom prostoru.\nMolimo posjetite [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki lokalizaciju] i [https://translatewiki.net translatewiki.net] ako želite doprinijeti općoj lokalizaciji MediaWikija.",
        "allmessagesnotsupportedDB": "Ova stranica ne može biti korištena jer je '''$wgUseDatabaseMessages''' isključen.",
        "allmessages-filter-legend": "Filter",
        "allmessages-filter": "Filter po stanju podešavanja:",
index 69a38b4..f1ff7f0 100644 (file)
@@ -37,7 +37,8 @@
                        "LacoR",
                        "Xð",
                        "Pmikolas44",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "Matěj Suchánek"
                ]
        },
        "tog-underline": "Podčiarkovať odkazy:",
        "watcherrortext": "Vyskytla sa chyba počas zmeny nastavenia vášho zoznamu sledovaných pre „$1“.",
        "enotif_reset": "Označiť všetky stránky ako „navštívené“",
        "enotif_impersonal_salutation": "používateľ {{GRAMMAR:genitív|{{SITENAME}}}}",
-       "enotif_subject_deleted": "Stránku {{GENDER:genitív|{{SITENAME}}}} „$1“ odstránil používateľ $2",
-       "enotif_subject_created": "Stránku {{GENDER:genitív|{{SITENAME}}}} „$1“ vytvoril používateľ $2",
-       "enotif_subject_moved": "Stránku {{GENDER:genitív|{{SITENAME}}}} „$1“ presunul používateľ $2",
-       "enotif_subject_restored": "Stránku {{GENDER:genitív|{{SITENAME}}}} „$1“ obnovil používateľ $2",
-       "enotif_subject_changed": "Stránku {{GENDER:genitív|{{SITENAME}}}} „$1“ zmenil používateľ $2",
+       "enotif_subject_deleted": "Stránku {{GRAMMAR:genitív|{{SITENAME}}}} „$1“ odstránil používateľ {{GENDER:$2|$2}}",
+       "enotif_subject_created": "Stránku {{GRAMMAR:genitív|{{SITENAME}}}} „$1“ vytvoril používateľ {{GENDER:$2|$2}}",
+       "enotif_subject_moved": "Stránku {{GRAMMAR:genitív|{{SITENAME}}}} „$1“ presunul používateľ {{GENDER:$2|$2}}",
+       "enotif_subject_restored": "Stránku {{GRAMMAR:genitív|{{SITENAME}}}} „$1“ obnovil používateľ {{GENDER:$2|$2}}",
+       "enotif_subject_changed": "Stránku {{GRAMMAR:genitív|{{SITENAME}}}} „$1“ zmenil používateľ {{GENDER:$2|$2}}",
        "enotif_body_intro_deleted": "Stránka {{GENDER:genitív|{{SITENAME}}}} „$1“ zmazal $PAGEEDITDATE používateľ $2, pozri $3.",
        "enotif_body_intro_created": "Stránka {{GENDER:genitív|{{SITENAME}}}} „$1“ vytvoril $PAGEEDITDATE používateľ $2, pozri aktuálnu verziu $3.",
        "enotif_body_intro_moved": "Stránka {{GENDER:genitív|{{SITENAME}}}} „$1“ presunul $PAGEEDITDATE používateľ $2, pozri aktuálnu verziu $3.",
        "ipb-unblock-addr": "Odblokovať $1",
        "ipb-unblock": "Odblokovať používateľa alebo IP adresu",
        "ipb-blocklist": "Zobraziť existujúce blokovania",
-       "ipb-blocklist-contribs": "Príspevky {{GENDER:redaktora|redaktorky}} $1",
+       "ipb-blocklist-contribs": "Príspevky {{GENDER:$1|redaktora|redaktorky}} $1",
        "ipb-blocklist-duration-left": "zostáva $1",
        "unblockip": "Odblokovať používateľa",
        "unblockiptext": "Použite tento formulár na obnovenie možnosti zápisov\nz/od momentálne zablokovanej IP adresy/používateľa.",
index 90ec173..9f8a28b 100644 (file)
@@ -15,7 +15,8 @@
                        "Matma Rex",
                        "NegativeTwelveDollars",
                        "Xð",
-                       "HairyFotr"
+                       "HairyFotr",
+                       "Upwinxp"
                ]
        },
        "tog-underline": "Podčrtavanje povezav:",
        "converter-manual-rule-error": "Odkril sem napako v ročnem pravilu pretvorbe jezikov",
        "undo-success": "Urejanje ste razveljavili. Prosimo, preverite prikazano primerjavo redakcij in, če ustrezajo, shranite spremembe.",
        "undo-failure": "Zaradi navzkrižij urejanj, ki so se vmes pojavila, tega urejanja ni moč razveljaviti.",
+       "undo-main-slot-only": "Urejanja nismo mogli razveljaviti, ker vključuje vsebino zunaj glavne reže.",
        "undo-norev": "Urejanja ni mogoče razveljaviti, ker ne obstaja ali je bilo izbrisano.",
        "undo-nochange": "Zdi se, da je urejanje nekdo že razveljavil.",
        "undo-summary": "Redakcija $1 uporabnika [[Special:Contributions/$2|$2]] ([[User talk:$2|pogovor]]) razveljavljena",
        "rcfilters-activefilters": "Dejavni filtri",
        "rcfilters-activefilters-hide": "Skrij",
        "rcfilters-activefilters-show": "Prikaži",
+       "rcfilters-activefilters-hide-tooltip": "Skrij območje Aktivnih filtrov",
+       "rcfilters-activefilters-show-tooltip": "Pokaži območje Aktivnih filtrov",
        "rcfilters-advancedfilters": "Napredni filtri",
        "rcfilters-limit-title": "Rezultati za prikaz",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|sprememba|spremembi|spremembe|sprememb}}, $2",
        "exif-lightsource-19": "Običajna svetloba C",
        "exif-lightsource-24": "ISO-ateljejski volfram",
        "exif-lightsource-255": "Drugačen",
-       "exif-flash-fired-0": "Flash se ni sprožil",
-       "exif-flash-fired-1": "Flash se je sprožil",
+       "exif-flash-fired-0": "Bliskavica se ni sprožila",
+       "exif-flash-fired-1": "Bliskavica se je sprožila",
        "exif-flash-return-0": "stroboskop ni uporabil funkcije zaznavanja",
        "exif-flash-return-2": "stroboskop ni zaznal svetlobe",
        "exif-flash-return-3": "stroboskop je zaznal svetlobo",
index 32944c2..fe91686 100644 (file)
        "youhavenewmessagesmulti": "Имате нове поруке на $1",
        "editsection": "уреди",
        "editold": "уреди",
-       "viewsourceold": "изворни код",
+       "viewsourceold": "изворни кôд",
        "editlink": "уреди",
-       "viewsourcelink": "изворни код",
+       "viewsourcelink": "изворни кôд",
        "editsectionhint": "Уреди одељак „$1“",
        "toc": "Садржај",
        "showtoc": "прикажи",
        "hidetoc": "сакриј",
-       "collapsible-collapse": "Скупи",
-       "collapsible-expand": "Ð\9fÑ\80икажи",
+       "collapsible-collapse": "скупи",
+       "collapsible-expand": "пÑ\80оÑ\88иÑ\80и",
        "confirmable-confirm": "Да ли {{GENDER:$1|сте}} сигурни?",
        "confirmable-yes": "Да",
        "confirmable-no": "Не",
        "perfcached": "Следећи подаци су кеширани и можда нису ажурирани. У кешу {{PLURAL:$1|је доступан највише један резултат|су доступна највише $1 резултата|је доступно највише $1 резултата}}.",
        "perfcachedts": "Следећи подаци су кеширани и последњи пут ажурирани на датум $2 у $3 ч. У кешу {{PLURAL:$4|је доступан највише један резултат|су доступна највише $4 резултата|је доступно највише $4 резултата}}.",
        "querypage-no-updates": "Ажурирање ове странице је тренутно онемогућено.\nПодаци који се овде налазе могу бити застарели.",
-       "viewsource": "Изворни код",
-       "viewsource-title": "Изворни код за страницу $1",
+       "viewsource": "Изворни кôд",
+       "viewsource-title": "Изворни кôд за страницу $1",
        "actionthrottled": "Радња је успорена",
        "actionthrottledtext": "У циљу борбе против непожељних порука, ограничене су вам измене у одређеном времену, а управо сте прешли то ограничење. Покушајте поново за неколико минута.",
        "protectedpagetext": "Ова страница је закључана за измене и друге радње.",
-       "viewsourcetext": "Можете читати и копирати изворник ове странице.",
-       "viewyourtext": "Можете да погледате и копирате изворник <strong>ваших измена</strong> на овој страници.",
+       "viewsourcetext": "Можете да погледате и копирате изворни кôд ове странице.",
+       "viewyourtext": "Можете да погледате и копирате изворни кôд <strong>Ваших измена</strong> на овој страници.",
        "protectedinterface": "Ова страница садржи текст интерфејса за софтвер на овом викију и заштићена је ради спречавања злоупотребе.\nДа бисте додали или изменили преводе било којег викија, посетите [https://translatewiki.net/ translatewiki.net], пројекат за локализацију Медијавикија.",
        "editinginterface": "<strong>Упозорење:</strong> уређујете страницу која се користи за приказивање текста корисничког окружења.\nИзмене на овој страници ће утицати на све кориснике овог викија.",
        "translateinterface": "Да додате или промените преводе за све викије, посетите [https://translatewiki.net/ Транслејтвики], пројекат за локализацију Медијавикија.",
        "customcssprotected": "Немате дозволу да мењате ову CSS страницу јер садржи лична подешавања другог корисника.",
        "customjsprotected": "Немате дозволу да мењате ову страницу JavaScript јер садржи лична подешавања другог корисника.",
        "mycustomcssprotected": "Немате дозволу за мењање ове CSS странице.",
+       "mycustomjsonprotected": "Немате дозволу за мењање ове JSON странице.",
        "mycustomjsprotected": "Немате дозволу за мењање ове JavaScript странице.",
        "myprivateinfoprotected": "Немате дозволу за мењање ваших личних информација.",
        "mypreferencesprotected": "Немате дозволу за мењање ваших подешавања.",
        "nocookieslogin": "{{SITENAME}} користи колачиће за пријављивање корисника.\nВама су колачићи онемогућени. Омогућите их и покушајте поново.",
        "nocookiesfornew": "Кориснички налог није отворен јер његов извор није потврђен.\nОмогућите колачиће на прегледачу и поново учитајте страницу.",
        "nocookiesforlogin": "{{int:nocookieslogin}}",
+       "createacct-loginerror": "Налог је успешно направљен, али се не можете аутоматски пријавити. Пређите на [[Special:UserLogin|ручно пријављивање]].",
        "noname": "Унели сте неисправно корисничко име.",
        "loginsuccesstitle": "Успешно пријављивање",
        "loginsuccess": "<strong>Пријављени сте на {{SITENAME}} као „$1”.</strong>",
        "wrongpasswordempty": "Нисте унели лозинку. Покушајте поново.",
        "passwordtooshort": "Лозинка мора имати најмање {{PLURAL:$1|један знак|$1 знака|$1 знакова}}.",
        "passwordtoolong": "Лозинке не могу бити дуже од {{PLURAL:$1|$1 знака|$1 знакова}}.",
-       "passwordtoopopular": "ЧеÑ\81Ñ\82о ÐºÐ¾Ñ\80иÑ\88Ñ\9bене Ñ\88иÑ\84Ñ\80е Ð½Ðµ Ð¼Ð¾Ð³Ñ\83 Ð±Ð¸Ñ\82и ÐºÐ¾Ñ\80иÑ\88Ñ\9bене. Ð\9cолимо Ð¸Ð·Ð°Ð±ÐµÑ\80иÑ\82е Ñ\81ложениÑ\98Ñ\83 Ð»Ð¾Ð·Ð¸Ð½ÐºÑ\83.",
+       "passwordtoopopular": "ЧеÑ\81Ñ\82о Ð¸Ð·Ð°Ð±Ñ\80ане Ð»Ð¾Ð·Ð¸Ð½ÐºÐµ Ð½Ðµ Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\81е ÐºÐ¾Ñ\80иÑ\81Ñ\82е. Ð\98забеÑ\80иÑ\82е Ð»Ð¾Ð·Ð¸Ð½ÐºÑ\83 ÐºÐ¾Ñ\98Ñ\83 Ñ\98е Ñ\82еже Ð¿Ð¾Ð³Ð¾Ð´Ð¸Ñ\82и.",
        "password-name-match": "Лозинка се мора разликовати од корисничког имена.",
        "password-login-forbidden": "Коришћење овог корисничког имена и лозинке је забрањено.",
        "mailmypassword": "Ресетуј лозинку",
        "passwordremindertitle": "{{SITENAME}} — привремена лозинка",
-       "passwordremindertext": "Неко, вероватно ви, са IP адресе $1 је затражио нову лозинку на викију {{SITENAME}} ($4).\nСтворена је привремена лозинка за {{GENDER:$2|корисника|корисницу|корисника}} $2 која гласи $3.\nУколико је ово ваш захтев, сада се пријавите и поставите нову лозинку.\nПривремена лозинка истиче за {{PLURAL:$5|један дан|$5 дана}}.\n\nАко је неко други затражио промену лозинке, или сте се сетили ваше лозинке и не желите да је мењате, занемарите ову поруку.",
+       "passwordremindertext": "Неко са IP адресе $1 је затражио нову лозинку на викију {{SITENAME}} ($4).\nСтворена је привремена лозинка за {{GENDER:$2|корисника|корисницу|корисника}} $2 која гласи $3.\nУколико је ово ваш захтев, сада се пријавите и поставите нову лозинку.\nПривремена лозинка истиче за {{PLURAL:$5|један дан|$5 дана}}.\n\nАко је неко други затражио промену лозинке, или сте се сетили ваше лозинке и не желите да је мењате, занемарите ову поруку.",
        "noemail": "Не постоји имејл адреса за {{GENDER:$1|корисника|корисницу}} $1.",
        "noemailcreate": "Морате навести исправну имејл адресу.",
        "passwordsent": "Нова лозинка је послата на имејл адресу {{GENDER:$1|корисника|кориснице|корисника}} $1.\nПријавите се пошто је примите.",
        "blocked-mailpassword": "Ваша IP адреса има забрану уређивања. Ради спречавања злоупотребе, није дозвољено враћање лозинке са ње.",
-       "eauthentsent": "На наведену имејл адресу је послат потврдни код.\nПре него што пошаљемо даљње поруке, пратите упутства с имејла да бисте потврдили да сте Ви отворили налог.",
+       "eauthentsent": "На наведену имејл адресу је послат потврдни кôд.\nПре него што пошаљемо даљње поруке, пратите упутства с имејла да бисте потврдили да сте Ви отворили налог.",
        "throttled-mailpassword": "Порука за промену лозинке је послата у {{PLURAL:$1|1=последњих сат времена|последња $1 сата|последњих $1 сати}}.\nДа бисмо спречили злоупотребу, подсетник шаљемо само једном у року од {{PLURAL:$1|1=сат времена|$1 сата|$1 сати}}.",
        "mailerror": "Грешка при слању поруке: $1",
        "acct_creation_throttle_hit": "Посетиоци овог викија који користе вашу IP адресу су већ отворили {{PLURAL:$1|1=један налог|$1 налога}} претходни $2, што је највећи дозвољени број у том временском периоду.\nЗбог тога посетиоци с ове IP адресе тренутно не могу отворити више налога.",
        "changepassword-throttled": "Превише пута сте покушали да се пријавите.\nМолимо вас да сачекате $1 пре него што покушате поново.",
        "botpasswords": "Лозинке ботова",
        "botpasswords-disabled": "Лозинке ботова су онемогућене.",
+       "botpasswords-no-central-id": "Да би сте користили ботовске лозинке, морате бити пријављени на средишњи налог.",
        "botpasswords-existing": "Постојећа лозинка бота",
        "botpasswords-createnew": "Направи нову лозинку за бота",
        "botpasswords-editexisting": "Измени постојећу лозинку за бота",
+       "botpasswords-label-needsreset": "(лозинку треба ресетовати)",
        "botpasswords-label-appid": "Име бота:",
        "botpasswords-label-create": "Направи",
        "botpasswords-label-update": "Ажурирај",
        "resetpass-submit-loggedin": "Промени лозинку",
        "resetpass-submit-cancel": "Откажи",
        "resetpass-wrong-oldpass": "Неисправна привремена или тренутна лозинка.\nМожда сте већ променили лозинку или сте затражили нову привремену лозинку.",
-       "resetpass-recycled": "Унели сте садашњу лозинку, да бисте ресетовали лозинку морате унети нову.",
+       "resetpass-recycled": "Унели сте садашњу лозинку, да бисте променили лозинку морате унети нову.",
        "resetpass-temp-emailed": "Пријавили сте се са привременим кодом из имејла.\nДа бисте завршили пријављивање морате поставити нову лозинку овде:",
        "resetpass-temp-password": "Привремена лозинка:",
        "resetpass-abort-generic": "Промену лозинке је спречио додатак.",
        "resetpass-expired": "Ваша лозинка је истекла. Поставите нову лозинку да бисте се пријавили.",
-       "resetpass-expired-soft": "Ваша лозинка је истекла и морате поставити нову. Поставите нову лозинку или кликните „{{int:authprovider-resetpass-skip-label}}“ да је поставите касније.",
-       "resetpass-validity-soft": "Ð\92аÑ\88а Ð»Ð¾Ð·Ð¸Ð½ÐºÐ° Ð½Ð¸Ñ\98е Ð¸Ñ\81пÑ\80авна: $1\n\nÐ\9cолимо Ð¸Ð·Ð°Ð±ÐµÑ\80иÑ\82е Ð½Ð¾Ð²Ñ\83 Ð¸Ð»Ð¸ ÐºÐ»Ð¸ÐºÐ½Ð¸Ñ\82е â\80\9e{{int:authprovider-resetpass-skip-label}}â\80\9c Ð´Ð° Ñ\80еÑ\81еÑ\82Ñ\83Ñ\98ете касније.",
+       "resetpass-expired-soft": "Ваша лозинка је истекла и морате је променити. Поставите нову лозинку или кликните „{{int:authprovider-resetpass-skip-label}}“ да је промените касније.",
+       "resetpass-validity-soft": "Ð\92аÑ\88а Ð»Ð¾Ð·Ð¸Ð½ÐºÐ° Ð½Ð¸Ñ\98е Ð¸Ñ\81пÑ\80авна: $1\n\nÐ\9cолимо Ð¸Ð·Ð°Ð±ÐµÑ\80иÑ\82е Ð½Ð¾Ð²Ñ\83 Ð¸Ð»Ð¸ ÐºÐ»Ð¸ÐºÐ½Ð¸Ñ\82е â\80\9e{{int:authprovider-resetpass-skip-label}}â\80\9c Ð´Ð° Ñ\98е Ð¿Ñ\80омените касније.",
        "passwordreset": "Обнављање лозинке",
        "passwordreset-text-one": "Попуните овај образац да бисте добили привремену лозинку на имејл.",
        "passwordreset-text-many": "{{PLURAL:$1|Испуните једно од поља како бисте добили привремену лозинку на имејл.}}",
        "previewerrortext": "Догодила се грешка приликом приказивања ваших измена.",
        "blockedtitle": "Корисник је блокиран",
        "blockedtext": "<strong>Ваше корисничко име или IP адреса је блокирана.</strong>\n\nБлокирање је {{GENDER:$4|извршио|извршила}} $1.\nРазлог је <em>$2</em>.\n\n* Почетак блокирања: $8\n* Истек блокирања: $6\n* Блокирани: $7\n\nМожете да се обратите {{GENDER:$4|кориснику|корисници}} $1 или [[{{MediaWiki:Grouppage-sysop}}|администратору]] ради дискусије о блокирању.\nНе можете да користите могућност „{{int:emailuser}}” осим ако сте унели валидну имејл адресу у својим [[Special:Preferences|подешавањима]] налога и нисте блокирани од коришћења исте.\nВаша тренутна IP адреса је $3, а ID блокирања #$5.\nНаведите све информације одозго при стварању било каквих упита.",
-       "autoblockedtext": "Ваша IP адреса је блокирана јер ју је употребљавао други корисник, кога је {{GENDER:$4|блокирао|блокирала}} $1.\nРазлог:\n\n:<em>$2</em>\n\n* Датум блокирања: $8\n* Блокирање истиче: $6\n* Име корисника: $7\n\nОбратите се {{GENDER:$4|кориснику|корисници}} $1 или [[{{MediaWiki:Grouppage-sysop}}|администратору]] да разјасните ствар.\n\nНе можете користити могућност „Пошаљи имејл овом кориснику“ ако нисте унели исправну имејл адресу у [[Special:Preferences|подешавањима]].\n\nВаша блокирана IP адреса је $3, а ID $5.\nНаведите све податке изнад при стварању било каквих упита.",
+       "autoblockedtext": "Ваша IP адреса је блокирана јер ју је употребљавао други корисник, кога је {{GENDER:$4|блокирао|блокирала}} $1.\nРазлог:\n\n:<em>$2</em>\n\n* Датум блокирања: $8\n* Блокирање истиче: $6\n* Име корисника: $7\n\nОбратите се {{GENDER:$4|кориснику|корисници}} $1 или [[{{MediaWiki:Grouppage-sysop}}|администратору]] да разјасните ствар.\n\nНе можете користити могућност „{{int:emailuser}}“ ако нисте унели исправну имејл адресу у [[Special:Preferences|подешавањима]].\n\nВаша блокирана IP адреса је $3, а ID $5.\nНаведите све податке изнад при стварању било каквих упита.",
        "blockednoreason": "разлог није наведен",
        "whitelistedittext": "За уређивање странице је потребно да будете $1.",
        "confirmedittext": "Морате да потврдите своју имејл адресу пре уређивања страница.\nПоставите и потврдите имејл адресу преко [[Special:Preferences|подешавања]].",
        "userpage-userdoesnotexist": "Кориснички налог „<nowiki>$1</nowiki>“ није отворен.\nРазмислите да ли заиста желите да направите/уредите ову страницу.",
        "userpage-userdoesnotexist-view": "Кориснички налог „$1“ није отворен.",
        "blocked-notice-logextract": "Овај корисник је тренутно блокиран.\nИзвештај о последњем блокирању можете погледати испод:",
-       "clearyourcache": "<strong>Ð\9dапомена:</strong> Ð½Ð°ÐºÐ¾Ð½ Ñ\87Ñ\83ваÑ\9aа, Ð¼Ð¾Ð¶Ð´Ð° Ñ\9bеÑ\82е Ð¼Ð¾Ñ\80аÑ\82и Ð´Ð° Ð¾Ñ\87иÑ\81Ñ\82иÑ\82е ÐºÐµÑ\88 Ð¿Ñ\80егледаÑ\87а ÐºÐ°ÐºÐ¾ Ð±Ð¸Ñ\81Ñ\82е Ð²Ð¸Ð´ÐµÐ»Ð¸ Ð¸Ð·Ð¼ÐµÐ½Ðµ.\n* <strong>ФаÑ\98еÑ\80Ñ\84окÑ\81 / Ð¡Ð°Ñ\84аÑ\80и:</strong> Ð´Ñ\80жиÑ\82е <em>Shift</em> Ð¸ ÐºÐ»Ð¸ÐºÐ½Ð¸Ñ\82е Ð½Ð° <em>Ð\9eÑ\81вежи</em>, Ð¸Ð»Ð¸ Ð¿Ñ\80иÑ\82иÑ\81ниÑ\82е <em>Ctrl-F5</em> Ð¸Ð»Ð¸ <em>Ctrl-R</em> (<em>â\8c\98-R</em> Ð½Ð° Ð\9cекÑ\83)\n* <strong>Ð\93Ñ\83гл ÐºÑ\80оÑ\83м:</strong> Ð¿Ñ\80иÑ\82иÑ\81ниÑ\82е <em>Ctrl-Shift-R</em> (<em>â\8c\98-Shift-R</em> Ð½Ð° Ð\9cекÑ\83)\n* <strong>Ð\98нÑ\82еÑ\80неÑ\82 ÐµÐºÑ\81плоÑ\80еÑ\80:</strong> Ð´Ñ\80жиÑ\82е <em>Ctrl</em> Ð¸ ÐºÐ»Ð¸ÐºÐ½Ð¸Ñ\82е Ð½Ð° <em>Ð\9eÑ\81вежи</em> Ð¸Ð»Ð¸ Ð¿Ñ\80иÑ\82иÑ\81ниÑ\82е <em>Ctrl-F5</em>\n* <strong>Ð\9eпеÑ\80а:</strong> Ð¸Ð´Ð¸Ñ\82е Ð½Ð° <em>Ð\90лаÑ\82ке â\86\92 Ð\9fодеÑ\88аваÑ\9aа</em> (<em>Ð\9eпеÑ\80а â\86\92 Ð\9fоÑ\81Ñ\82авке</em> на Меку) и затим <em>Приватност и безбедност → Очистите податке о прегледима → Кеширане слике и датотеке</em>.",
+       "clearyourcache": "<strong>Ð\9dапомена:</strong> Ð\9dакон Ñ\87Ñ\83ваÑ\9aа, Ð¼Ð¾Ð¶Ð´Ð° Ñ\9bеÑ\82е Ð¼Ð¾Ñ\80аÑ\82и Ð´Ð° Ð¾Ñ\87иÑ\81Ñ\82иÑ\82е ÐºÐµÑ\88 Ð¿Ñ\80егледаÑ\87а ÐºÐ°ÐºÐ¾ Ð±Ð¸Ñ\81Ñ\82е Ð²Ð¸Ð´ÐµÐ»Ð¸ Ð¸Ð·Ð¼ÐµÐ½Ðµ.\n* <strong>ФаÑ\98еÑ\80Ñ\84окÑ\81 / Ð¡Ð°Ñ\84аÑ\80и:</strong> Ð\94Ñ\80жиÑ\82е <em>Shift</em> Ð¸ ÐºÐ»Ð¸ÐºÐ½Ð¸Ñ\82е Ð½Ð° <em>Ð\9eÑ\81вежи</em> Ð¸Ð»Ð¸ Ð¿Ñ\80иÑ\82иÑ\81ниÑ\82е <em>Ctrl-F5</em> Ð¸Ð»Ð¸ <em>Ctrl-R</em> (<em>â\8c\98-R</em> Ð½Ð° Ð\9cекÑ\83)\n* <strong>Ð\93Ñ\83гл ÐºÑ\80оÑ\83м:</strong> Ð\9fÑ\80иÑ\82иÑ\81ниÑ\82е <em>Ctrl-Shift-R</em> (<em>â\8c\98-Shift-R</em> Ð½Ð° Ð\9cекÑ\83)\n* <strong>Ð\98нÑ\82еÑ\80неÑ\82 ÐµÐºÑ\81плоÑ\80еÑ\80:</strong> Ð\94Ñ\80жиÑ\82е <em>Ctrl</em> Ð¸ ÐºÐ»Ð¸ÐºÐ½Ð¸Ñ\82е Ð½Ð° <em>Ð\9eÑ\81вежи</em> Ð¸Ð»Ð¸ Ð¿Ñ\80иÑ\82иÑ\81ниÑ\82е <em>Ctrl-F5</em>\n* <strong>Ð\9eпеÑ\80а:</strong> Ð\98диÑ\82е Ð½Ð° <em>Ð\90лаÑ\82ке â\86\92 Ð\9fодеÑ\88аваÑ\9aа</em> (<em>Ð\9eпеÑ\80а â\86\92 Ð\9fодеÑ\88аваÑ\9aа</em> на Меку) и затим <em>Приватност и безбедност → Очистите податке о прегледима → Кеширане слике и датотеке</em>.",
        "usercssyoucanpreview": "<strong>Савет:<strong> кориситите дугме „{{int:showpreview}}“ да испробате свој нови CSS пре него што га сачувате.",
        "userjsyoucanpreview": "<strong>Савет:</strong> кориситите дугме „{{int:showpreview}}“ да испробате свој нови јаваскрипт пре него што га сачувате.",
        "usercsspreview": "<strong>Ово је само преглед CSS-а.\nСтраница још није сачувана!</strong>",
        "currentrevisionlink": "Тренутна измена",
        "cur": "трен",
        "next": "след",
-       "last": "разл",
+       "last": "претх",
        "page_first": "прва",
        "page_last": "последња",
        "histlegend": "Избор разлика: изаберите кутијице измена за упоређивање и притисните ентер или дугме на дну.<br />\nОбјашњење: <strong>({{int:cur}})</strong> = разлика с тренутном изменом, <strong>({{int:last}})</strong> = разлика с претходном изменом, <strong>{{int:minoreditletter}}</strong> = мања измена",
        "compareselectedversions": "Упореди изабране измене",
        "showhideselectedversions": "Промени видљивост изабраних измена",
        "editundo": "поништи",
-       "diff-empty": "(Ð\9dема разлике)",
+       "diff-empty": "(нема разлике)",
        "diff-multi-sameuser": "({{PLURAL:$1|Једна међуизмена истог корисника није приказана|$1 међуизмене истог корисника нису приказане|$1 међуизмена истог корисника није приказано}})",
        "diff-multi-otherusers": "({{PLURAL:$1|Једна међуизмена|$1 међуизмене|$1 међуизмена}} од стране {{PLURAL:$2|још једног корисника није приказана|$2 корисника није приказано}})",
        "diff-multi-manyusers": "({{PLURAL:$1|Није приказана међуизмена|Нису приказане $1 међуизмене|Није приказано $1 међуизмена}} од више од $2 корисника)",
        "prefs-watchlist-edits": "Највећи број измена приказаних на списку надгледања:",
        "prefs-watchlist-edits-max": "Највећа вредност је хиљаду",
        "prefs-watchlist-token": "Жетон списка надгледања:",
+       "prefs-watchlist-managetokens": "Управљај жетонима",
        "prefs-misc": "Друга подешавања",
        "prefs-resetpass": "промени лозинку",
        "prefs-changeemail": "промени или уклони имејл адресу",
        "prefs-dateformat": "Формат датума",
        "prefs-timeoffset": "Временска разлика",
        "prefs-advancedediting": "Главна подешавања",
+       "prefs-developertools": "Програмерске алатке",
        "prefs-editor": "Уређивач",
        "prefs-preview": "Претпреглед",
        "prefs-advancedrc": "Напредна подешавања",
        "prefs-opt-out": "Онемогућавање побољшања",
        "prefs-advancedrendering": "Напредна подешавања",
-       "prefs-advancedsearchoptions": "Ð\9dапÑ\80една Ð¿Ð¾Ð´ÐµÑ\88аваÑ\9aа",
+       "prefs-advancedsearchoptions": "Ð\9dапÑ\80едне Ð¾Ð¿Ñ\86иÑ\98е",
        "prefs-advancedwatchlist": "Напредна подешавања",
        "prefs-displayrc": "Подешавања приказа",
        "prefs-displaywatchlist": "Подешавања приказа",
        "right-editcontentmodel": "мењање модела садржаја странице",
        "right-editinterface": "уређивање корисничког окружења",
        "right-editusercss": "уређивање туђих CSS датотека",
+       "right-edituserjson": "уређивање туђих JSON датотека",
        "right-edituserjs": "уређивање туђих JavaScript датотека",
        "right-editmyusercss": "уређивање сопствених CSS датотека",
+       "right-editmyuserjson": "уређивање сопствених JSON датотека",
        "right-editmyuserjs": "уређивање сопствених JavaScript датотека",
        "right-viewmywatchlist": "преглед сопственог списка надгледања",
        "right-editmywatchlist": "уређивање сопственог списка надгледања; неке предузете радње ће свеједно додати странице на списак и без овог права",
        "grant-delete": "Брисање страница, измена и уноса у дневницима",
        "grant-editinterface": "Уређивање Медијавики именског простора и корисничких CSS/JSON/Јаваскрипт страница",
        "grant-editmycssjs": "Уређивање вашег CSS/JSON/Јаваскрипта",
-       "grant-editmyoptions": "УÑ\80еÑ\92иваÑ\9aе Ð²аших подешавања",
+       "grant-editmyoptions": "УÑ\80еÑ\92иваÑ\9aе Ð\92аших подешавања",
        "grant-editmywatchlist": "Уређивање вашег списка надгледања",
        "grant-editpage": "Уређивање постојећих страница",
        "grant-editprotected": "Уређивање заштићених страница",
        "action-userrights-interwiki": "уређивање корисничких права на другим викијима",
        "action-siteadmin": "закључавање или откључавање базе података",
        "action-sendemail": "слање имејлова",
-       "action-editmyoptions": "Ñ\83Ñ\80еÑ\92иваÑ\9aе Ð²аших подешавања",
+       "action-editmyoptions": "Ñ\83Ñ\80еÑ\92иваÑ\9aе Ð\92аших подешавања",
        "action-editmywatchlist": "измену сопственог списак надгледања",
        "action-viewmywatchlist": "преглед вашег списак надгледања",
        "action-viewmyprivateinfo": "прегледање ваших личних података",
        "recentchanges-summary": "Пратите скорашње измене на овој страници.",
        "recentchanges-noresult": "Нема измена у задатом периоду који одговарају овим критеријумима.",
        "recentchanges-timeout": "Ова претрага је истекла. Можда желите да покушате другачије параметре претраге.",
-       "recentchanges-network": "Ð\97бог Ñ\82еÑ\85ниÑ\87ког Ð¿Ñ\80облема Ð½Ðµ Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\83Ñ\87иÑ\82ам Ñ\80езÑ\83лÑ\82аÑ\82е. Ð\9fокÑ\83Ñ\88аÑ\98Ñ\82е Ð¿Ð¾Ð½Ð¾Ð²Ð½Ð¾ Ð´Ð° Ñ\83Ñ\87иÑ\82ате страницу.",
+       "recentchanges-network": "Ð\97бог Ñ\82еÑ\85ниÑ\87ког Ð¿Ñ\80облема Ð½Ðµ Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\83Ñ\87иÑ\82ам Ñ\80езÑ\83лÑ\82аÑ\82е. Ð\9fокÑ\83Ñ\88аÑ\98Ñ\82е Ð´Ð° Ð¾Ñ\81вежите страницу.",
        "recentchanges-notargetpage": "Унесите назив странице како бисте видели сродне измене.",
        "recentchanges-feed-description": "Пратите скорашње измене уз помоћ овог довода.",
        "recentchanges-label-newpage": "Нова страница",
        "recentchanges-label-minor": "Ово је мања измена",
-       "recentchanges-label-bot": "Ову измену је начинио бот",
+       "recentchanges-label-bot": "Ову измену је направио бот",
        "recentchanges-label-unpatrolled": "Ова измена још није патролирана",
        "recentchanges-label-plusminus": "Промена величине странице у бајтовима",
        "recentchanges-legend-heading": "<strong>Легенда:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|списак нових страница]])",
        "recentchanges-submit": "Прикажи",
-       "rcfilters-tag-remove": "Уклоните филтер „$1”",
+       "rcfilters-tag-remove": "Уклони филтер „$1”",
        "rcfilters-legend-heading": "<strong>Списак скраћеница:</strong>",
-       "rcfilters-other-review-tools": "Ð\9eÑ\81Ñ\82але алатке за преглед",
+       "rcfilters-other-review-tools": "Ð\94Ñ\80Ñ\83ге алатке за преглед",
        "rcfilters-group-results-by-page": "Групиши резултате по страницама",
        "rcfilters-activefilters": "Активни филтери",
+       "rcfilters-activefilters-hide": "Сакриј",
+       "rcfilters-activefilters-show": "Прикажи",
+       "rcfilters-activefilters-hide-tooltip": "Сакриј подручје активних филтера",
+       "rcfilters-activefilters-show-tooltip": "Прикажи подручје активних филтера",
        "rcfilters-advancedfilters": "Напредни филтери",
        "rcfilters-limit-title": "Број измена за приказ",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|измена|измене|измена}}, $2",
-       "rcfilters-date-popup-title": "Временски период",
+       "rcfilters-date-popup-title": "Временски период за претрагу",
        "rcfilters-days-title": "Скорашњи дани",
        "rcfilters-hours-title": "Скорашњи сати",
        "rcfilters-days-show-days": "$1 {{PLURAL:$1|дан|дана}}",
        "rcfilters-days-show-hours": "$1 {{PLURAL:$1|сат|сата}}",
        "rcfilters-highlighted-filters-list": "Истакнуто: $1",
        "rcfilters-quickfilters": "Сачувани филтери",
-       "rcfilters-quickfilters-placeholder-title": "Још увек нема сачуваних филтера",
-       "rcfilters-quickfilters-placeholder-description": "Да бисте сачували своја подешавања филтера и употребљавали их касније, кликните на икону за ознаку у подручју активних филтера, испод.",
+       "rcfilters-quickfilters-placeholder-title": "Још нема сачуваних филтера",
+       "rcfilters-quickfilters-placeholder-description": "Да бисте сачували своја подешавања филтера и поново их употребљавали касније, кликните на икону за обележавање у подручју активних филтера, испод.",
        "rcfilters-savedqueries-defaultlabel": "Сачувани филтери",
        "rcfilters-savedqueries-rename": "Преименуј",
        "rcfilters-savedqueries-setdefault": "Постави као подразумевано",
        "rcfilters-savedqueries-apply-label": "Направи филтер",
        "rcfilters-savedqueries-apply-and-setdefault-label": "Направи подразумевани филтер",
        "rcfilters-savedqueries-cancel-label": "Откажи",
-       "rcfilters-savedqueries-add-new-title": "Сачувајте тренутна подешавања филтера",
+       "rcfilters-savedqueries-add-new-title": "Сачувај тренутна подешавања филтера",
        "rcfilters-savedqueries-already-saved": "Ови филтери су већ сачувани. Измените Ваша подешавања како бисте направили нове сачуване филтере.",
        "rcfilters-restore-default-filters": "Врати подразумеване филтере",
-       "rcfilters-clear-all-filters": "Уклоните све филтере",
-       "rcfilters-show-new-changes": "Ð\9fогледаÑ\98 Ð½ајновије измене",
-       "rcfilters-search-placeholder": "Филтрирајте измене (користите мени или претрагу за име филтера)",
+       "rcfilters-clear-all-filters": "Уклони све филтере",
+       "rcfilters-show-new-changes": "Ð\9dајновије измене",
+       "rcfilters-search-placeholder": "Филтрирај измене (користите мени или претрагу за име филтера)",
        "rcfilters-invalid-filter": "Неисправан филтер",
        "rcfilters-empty-filter": "Нема активних филтера. Сви доприноси су приказани.",
        "rcfilters-filterlist-title": "Филтери",
        "rcfilters-filterlist-whatsthis": "Како ово функционише?",
-       "rcfilters-filterlist-feedbacklink": "Реците нам шта мислите о овим (новим) алаткама за филтрирање",
+       "rcfilters-filterlist-feedbacklink": "Реците нам шта мислите о овим алаткама за филтрирање",
        "rcfilters-highlightbutton-title": "Истакни резултате",
-       "rcfilters-highlightmenu-title": "Ð\9eдабеÑ\80и боју",
+       "rcfilters-highlightmenu-title": "Ð\98забеÑ\80иÑ\82е боју",
        "rcfilters-highlightmenu-help": "Изаберите боју да бисте истакнули ово својство",
        "rcfilters-filterlist-noresults": "Нема пронађених филтера",
        "rcfilters-noresults-conflict": "Није пронађен ниједан резултат јер су критеријуми претраге сукобљени",
        "rcfilters-filter-user-experience-level-unregistered-label": "Нерегистровани",
        "rcfilters-filter-user-experience-level-unregistered-description": "Уредници који нису пријављени.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Новајлије",
-       "rcfilters-filter-user-experience-level-newcomer-description": "Регистровани уредници са мање од 10 измена и 4 дана активности.",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Регистровани уредници који имају мање од 10 измена или 4 дана активности.",
        "rcfilters-filter-user-experience-level-learner-label": "Ученици",
-       "rcfilters-filter-user-experience-level-learner-description": "РегиÑ\81Ñ\82Ñ\80овани Ñ\83Ñ\80едниÑ\86и Ñ\81а Ð²Ð¸Ñ\88е Ð¸Ñ\81кÑ\83Ñ\81Ñ\82ва Ð¾Ð´ â\80\9eноваÑ\98лиÑ\98аâ\80\9d, Ð°Ð»Ð¸ Ð¼Ð°Ñ\9aе Ð¾Ð´ „искусних корисника”.",
+       "rcfilters-filter-user-experience-level-learner-description": "РегиÑ\81Ñ\82Ñ\80овани Ñ\83Ñ\80едниÑ\86и Ñ\87иÑ\98е Ñ\98е Ð¸Ñ\81кÑ\83Ñ\81Ñ\82во Ð¸Ð·Ð¼ÐµÑ\92Ñ\83 â\80\9eноваÑ\98лиÑ\98аâ\80\9d Ð¸ „искусних корисника”.",
        "rcfilters-filter-user-experience-level-experienced-label": "Искусни корисници",
        "rcfilters-filter-user-experience-level-experienced-description": "Регистровани уредници са више од 500 измена и 30 дана активности.",
        "rcfilters-filtergroup-automated": "Аутоматизовани доприноси",
        "rcfilters-filter-bots-label": "Бот",
-       "rcfilters-filter-bots-description": "Ð\98змене Ð½Ð°Ð¿Ñ\80авÑ\99ене Ð°Ñ\83Ñ\82омаÑ\82изованим Ð°Ð»Ð°Ñ\82има.",
+       "rcfilters-filter-bots-description": "Ð\98змене Ð½Ð°Ð¿Ñ\80авÑ\99ене Ð°Ñ\83Ñ\82омаÑ\82изованим Ð°Ð»Ð°Ñ\82кама.",
        "rcfilters-filter-humans-label": "Човек (није бот)",
        "rcfilters-filter-humans-description": "Измене које су направили људи-уредници.",
-       "rcfilters-filtergroup-reviewstatus": "Патролираност",
-       "rcfilters-filter-reviewstatus-unpatrolled-description": "Измене нису ручно или аутоматски означене патролираним.",
+       "rcfilters-filtergroup-reviewstatus": "Прегледаност",
+       "rcfilters-filter-reviewstatus-unpatrolled-description": "Ð\98змене ÐºÐ¾Ñ\98е Ð½Ð¸Ñ\81Ñ\83 Ñ\80Ñ\83Ñ\87но Ð¸Ð»Ð¸ Ð°Ñ\83Ñ\82омаÑ\82Ñ\81ки Ð¾Ð·Ð½Ð°Ñ\87ене Ð¿Ð°Ñ\82Ñ\80олиÑ\80аним.",
        "rcfilters-filter-reviewstatus-unpatrolled-label": "Непатролирано",
-       "rcfilters-filter-reviewstatus-manual-description": "Измене ручно означене патролираним.",
+       "rcfilters-filter-reviewstatus-manual-description": "Измене које су ручно означене патролираним.",
        "rcfilters-filter-reviewstatus-manual-label": "Ручно патролирано",
-       "rcfilters-filter-reviewstatus-auto-description": "Ð\98змене Ð¸Ñ\81кÑ\83Ñ\81ниÑ\85 Ñ\83Ñ\80едника чији је рад аутоматски означен патролираним.",
+       "rcfilters-filter-reviewstatus-auto-description": "Ð\98змене Ð½Ð°Ð¿Ñ\80едниÑ\85 ÐºÐ¾Ñ\80иÑ\81ника чији је рад аутоматски означен патролираним.",
        "rcfilters-filter-reviewstatus-auto-label": "Аутоматски патролирано",
        "rcfilters-filtergroup-significance": "Значај",
        "rcfilters-filter-minor-label": "Мање измене",
-       "rcfilters-filter-minor-description": "Ð\98змене ÐºÐ¾Ñ\98е Ñ\98е Ð°Ñ\83Ñ\82оÑ\80 Ð¾Ð·Ð½Ð°Ñ\87ио ÐºÐ°Ð¾ Ð¼Ð°Ñ\9aе.",
+       "rcfilters-filter-minor-description": "Ð\98змене ÐºÐ¾Ñ\98е Ñ\98е Ð°Ñ\83Ñ\82оÑ\80 Ð¾Ð·Ð½Ð°Ñ\87ио Ð¼Ð°Ñ\9aим.",
        "rcfilters-filter-major-label": "Не-мање измене",
-       "rcfilters-filter-major-description": "Ð\98змене ÐºÐ¾Ñ\98е Ð½Ð¸Ñ\81Ñ\83 Ð¾Ð·Ð½Ð°Ñ\87ене ÐºÐ°Ð¾ Ð¼Ð°Ñ\9aе.",
+       "rcfilters-filter-major-description": "Ð\98змене ÐºÐ¾Ñ\98е Ð½Ð¸Ñ\81Ñ\83 Ð¾Ð·Ð½Ð°Ñ\87ене Ð¼Ð°Ñ\9aим.",
        "rcfilters-filtergroup-watchlist": "Странице на списку надгледања",
        "rcfilters-filter-watchlist-watched-label": "На списку надгледања",
        "rcfilters-filter-watchlist-watched-description": "Измене страница на Вашем списку надгледања.",
        "rcfilters-filter-watchlistactivity-unseen-description": "Измене страница које нисте посетили од када су направљене измене.",
        "rcfilters-filter-watchlistactivity-seen-label": "Погледане измене",
        "rcfilters-filter-watchlistactivity-seen-description": "Измене страница које сте посетили од када су направљене измене.",
-       "rcfilters-filtergroup-changetype": "Тип измене",
+       "rcfilters-filtergroup-changetype": "Ð\92Ñ\80Ñ\81Ñ\82а измене",
        "rcfilters-filter-pageedits-label": "Измене страница",
        "rcfilters-filter-pageedits-description": "Измене вики садржаја, расправа, описа категорија…",
        "rcfilters-filter-newpages-label": "Прављење страница",
-       "rcfilters-filter-newpages-description": "Измене којима се стварају нове странице.",
+       "rcfilters-filter-newpages-description": "Измене којима се праве нове странице.",
        "rcfilters-filter-categorization-label": "Измене категорија",
        "rcfilters-filter-categorization-description": "Записи о страницама додатим или уклоњеним из категорија.",
-       "rcfilters-filter-logactions-label": "РадÑ\9aе Ð·Ð°Ð±ÐµÐ»ÐµÐ¶ÐµÐ½Ðµ Ñ\83 Ð´Ð½ÐµÐ²Ð½Ð¸Ñ\86има",
-       "rcfilters-filter-logactions-description": "Административне радње, стварање налога, брисање страница, отпремања…",
+       "rcfilters-filter-logactions-label": "Ð\97абележене Ñ\80адÑ\9aе",
+       "rcfilters-filter-logactions-description": "Административне радње, прављење налога, брисање страница, отпремања…",
        "rcfilters-hideminor-conflicts-typeofchange-global": "Филтер за „мање” измене је у сукобу са једним или више филтера типа измена, зато што одређени типови измена не могу да се означе као „мање”. Сукобљени филтери су означени у подручју Активни филтери, изнад.",
        "rcfilters-hideminor-conflicts-typeofchange": "Одређени типови измена не могу да се означе као „мање”, тако да је овај филтер у сукобу са следећим филтерима типа измена: $1",
        "rcfilters-typeofchange-conflicts-hideminor": "Овај филтер типа измене је у сукобу са филтером за „мање” измене. Одређени типови измена не могу да се означе као „мање”.",
        "rcfilters-exclude-button-off": "Изостави означено",
        "rcfilters-exclude-button-on": "Изостави одабрано",
        "rcfilters-view-tags": "Означене измене",
-       "rcfilters-view-namespaces-tooltip": "Филтрирајте резултате према именском простору",
-       "rcfilters-view-tags-tooltip": "Филтрирајте резултате према ознаци измене",
+       "rcfilters-view-namespaces-tooltip": "Филтрирај резултате према именском простору",
+       "rcfilters-view-tags-tooltip": "Филтрирај резултате према ознаци измене",
        "rcfilters-view-return-to-default-tooltip": "Повратак на главни мени",
        "rcfilters-view-tags-help-icon-tooltip": "Сазнајте више о означеним изменама",
        "rcfilters-liveupdates-button": "Ажурирај уживо",
-       "rcfilters-liveupdates-button-title-on": "Искључите ажурирања уживо",
-       "rcfilters-liveupdates-button-title-off": "Ð\9fÑ\80иказ Ð½Ð¾Ð²Ð¸Ñ\85 Ð¸Ð·Ð¼ÐµÐ½Ð° уживо",
+       "rcfilters-liveupdates-button-title-on": "Искључи ажурирања уживо",
+       "rcfilters-liveupdates-button-title-off": "Ð\9fÑ\80икажи Ð½Ð¾Ð²Ðµ Ð¸Ð·Ð¼ÐµÐ½Ðµ уживо",
        "rcfilters-watchlist-markseen-button": "Означи све измене као погледане",
        "rcfilters-watchlist-edit-watchlist-button": "Промени списак надгледаних страница",
        "rcfilters-watchlist-showupdated": "Измене на страницама које нисте посетили од када је измена извршена су <strong>подебљане</strong>, са испуњеним ознакама.",
        "rcfilters-preference-label": "Сакриј побољшану верзију скорашњих измена",
        "rcfilters-preference-help": "Поништава редизајн интерфејса из 2017. и све алатке додате тада и после.",
+       "rcfilters-watchlist-preference-label": "Сакриј побољшану верзију списка надгледања",
        "rcfilters-filter-showlinkedfrom-label": "Прикажи измене на страницама са којих долазе везе",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>Странице са којих долазе везе до</strong> изабране странице",
        "rcfilters-filter-showlinkedto-label": "Прикажи измене на страницама ка којима воде везе",
        "copyuploaddisabled": "Отпремање путем веб-адресе је онемогућено.",
        "uploaddisabledtext": "Отпремање датотека је онемогућено.",
        "php-uploaddisabledtext": "Отпремање датотека је онемогућено у PHP-у.\nПроверите подешавања file_uploads.",
-       "uploadscripted": "Датотека садржи HTML или скриптни код који може бити погрешно протумачен од стране прегледача.",
+       "uploadscripted": "Датотека садржи HTML или скриптни кôд који може бити погрешно протумачен од стране прегледача.",
        "upload-scripted-pi-callback": "Датотека која садржи инструкције за обраду XML стилског облика се не може отпремити.",
        "upload-scripted-dtd": "Није могуће отпремање SVG датотека које садрже нестандардну DTD декларацију.",
        "uploaded-script-svg": "Пронађен скриптни елеменат „$1“ у постављеној SVG датотеци.",
        "destfilename": "Назив:",
        "upload-maxfilesize": "Максимална величина датотеке: $1",
        "upload-description": "Опис датотеке",
-       "upload-options": "Ð\9fодеÑ\88аваÑ\9aа отпремања",
+       "upload-options": "Ð\9eпÑ\86иÑ\98е отпремања",
        "watchthisupload": "Надгледај ову датотеку",
        "filewasdeleted": "Датотека с овим називом је раније послата, али је обрисана.\nПроверите $1 пре него што наставите с поновним слањем.",
        "filename-bad-prefix": "Назив датотеке коју шаљете почиње са <strong>„$1“</strong>, а њега обично додељују дигитални фотоапарати.\nИзаберите назив датотеке који описује њен садржај.",
        "deadendpages": "Странице без унутрашњих веза",
        "deadendpagestext": "Следеће странице немају везе до других страница на овом викију.",
        "protectedpages": "Заштићене странице",
+       "protectedpages-filters": "Филтери:",
        "protectedpages-indef": "Само неограничене заштите",
        "protectedpages-summary": "На овој страници се налази списак тренутно заштићених страница. За списак заштићених наслова види [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Само преносиве заштите",
        "protectedtitles-submit": "Прикажи наслове",
        "listusers": "Списак корисника",
        "listusers-editsonly": "Прикажи само кориснике који су уређивали",
+       "listusers-temporarygroupsonly": "Прикажи само кориснике у привременим корисничким групама",
        "listusers-creationsort": "Поређај по датуму стварања",
        "listusers-desc": "Поређај у опадајућем редоследу",
        "usereditcount": "$1 {{PLURAL:$1|измена|измене|измена}}",
        "apisandbox-dynamic-error-exists": "Параметар под називом \"$1\" већ постоји.",
        "apisandbox-deprecated-parameters": "Застарели параметри",
        "apisandbox-fetch-token": "Аутоматски попуни токен",
+       "apisandbox-add-multi": "Додај",
        "apisandbox-submit-invalid-fields-title": "Нека поља нису исправна",
        "apisandbox-submit-invalid-fields-message": "Молимо Вас поправите означена поља и покушајте поново.",
        "apisandbox-results": "Резултати",
        "wlshowhidepatr": "патролиране измене",
        "wlshowhidemine": "моје измене",
        "wlshowhidecategorization": "категоризацију страница",
-       "watchlist-options": "Ð\9fодеÑ\88аваÑ\9aа списка надгледања",
+       "watchlist-options": "Ð\9eпÑ\86иÑ\98е списка надгледања",
        "watching": "Надгледање…",
        "unwatching": "Уклањање са списка надгледања...",
        "watcherrortext": "Дошло је до грешке при промени поставки вашег списка надгледања за „$1“.",
        "minimum-size": "Најмања величина",
        "maximum-size": "Највећа величина:",
        "pagesize": "(бајтови)",
-       "restriction-edit": "Уређивање",
-       "restriction-move": "Ð\9fремештање",
+       "restriction-edit": "уређивање",
+       "restriction-move": "премештање",
        "restriction-create": "прављење",
        "restriction-upload": "отпремање",
        "restriction-level-sysop": "потпуно заштићено",
        "allmessagesname": "Назив",
        "allmessagesdefault": "Подразумевани текст",
        "allmessagescurrent": "Тренутни текст поруке",
-       "allmessagestext": "Ð\9eво Ñ\98е Ñ\81пиÑ\81ак Ñ\81виÑ\85 Ñ\81иÑ\81Ñ\82емÑ\81киÑ\85 Ð¿Ð¾Ñ\80Ñ\83ка ÐºÐ¾Ñ\98е Ñ\81Ñ\83 Ð´Ð¾Ñ\81Ñ\82Ñ\83пне Ñ\83 Ð¸Ð¼ÐµÐ½Ñ\81ком Ð¿Ñ\80оÑ\81Ñ\82оÑ\80Ñ\83 â\80\9eÐ\9cедиÑ\98авикиâ\80\9c.\nÐ\9fоÑ\81еÑ\82иÑ\82е [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Ð\9cедиÑ\98авики Ð»Ð¾ÐºÐ°Ð»Ð¸Ð·Ð°Ñ\86иÑ\98Ñ\83] Ð¸ [https://translatewiki.net Ð¢Ñ\80анÑ\81леÑ\98Ñ\82вики] Ð°ÐºÐ¾ Ð¶ÐµÐ»Ð¸Ñ\82е Ð´Ð° Ð¿Ð¾Ð¼Ð¾Ð³Ð½ÐµÑ\82е Ñ\83 Ð¿Ñ\80евоÑ\92еÑ\9aÑ\83.",
+       "allmessagestext": "Ð\9eво Ñ\98е Ñ\81пиÑ\81ак Ñ\81иÑ\81Ñ\82емÑ\81киÑ\85 Ð¿Ð¾Ñ\80Ñ\83ка Ð´Ð¾Ñ\81Ñ\82Ñ\83пниÑ\85 Ñ\83 Ð¸Ð¼ÐµÐ½Ñ\81ком Ð¿Ñ\80оÑ\81Ñ\82оÑ\80Ñ\83 â\80\9eÐ\9cедиÑ\98авикиâ\80\9c.\nÐ\9fоÑ\81еÑ\82иÑ\82е [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Ð\9cедиÑ\98авики Ð»Ð¾ÐºÐ°Ð»Ð¸Ð·Ð°Ñ\86иÑ\98Ñ\83] Ð¸ [https://translatewiki.net translatewiki.net] Ð°ÐºÐ¾ Ð¶ÐµÐ»Ð¸Ñ\82е Ð´Ð° Ð´Ð¾Ð¿Ñ\80инеÑ\81еÑ\82е Ð¾Ð¿Ñ\88Ñ\82оÑ\98 Ð»Ð¾ÐºÐ°Ð»Ð¸Ð·Ð°Ñ\86иÑ\98и Ð\9cедиÑ\98авикиÑ\98а.",
        "allmessagesnotsupportedDB": "Ова страница не може да се користи јер је '''$wgUseDatabaseMessages''' онемогућен.",
        "allmessages-filter-legend": "Филтер",
        "allmessages-filter": "Филтрирај по стању:",
        "import-error-special": "Не могу да увезем страницу „$1“ јер она припада посебном именском простору које не прихвата странице.",
        "import-error-invalid": "Не могу да увезем страницу „$1“ јер је њен назив неисправан.",
        "import-error-unserialize": "Верзија $2 странице $1 не може бити прочитана/увезена. Записано је да верзија користи $3 тип садржаја у $4 формату.",
-       "import-options-wrong": "{{PLURAL:$2|Ð\9fогÑ\80еÑ\88но Ð¿Ð¾Ð´ÐµÑ\88аваÑ\9aе|Ð\9fогÑ\80еÑ\88на Ð¿Ð¾Ð´ÐµÑ\88аваÑ\9aа}}: <nowiki>$1</nowiki>",
+       "import-options-wrong": "{{PLURAL:$2|Ð\9fогÑ\80еÑ\88на Ð¾Ð¿Ñ\86иÑ\98а|Ð\9fогÑ\80еÑ\88не Ð¾Ð¿Ñ\86иÑ\98е}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "Наведена основна страница има неисправан наслов.",
        "import-rootpage-nosubpage": "Именски простор „$1“ основне странице не дозвољава подстранице.",
        "importlogpage": "Дневник увоза",
        "tooltip-pt-logout": "Одјавите се",
        "tooltip-pt-createaccount": "Препоручијемо Вам да отворите налог и пријавите се, иако то није обавезно",
        "tooltip-ca-talk": "Разговор о страници са садржајем",
-       "tooltip-ca-edit": "Уредите ову страницу",
-       "tooltip-ca-addsection": "Започните нови одељак",
-       "tooltip-ca-viewsource": "Ð\9eва Ñ\81Ñ\82Ñ\80аниÑ\86а Ñ\98е Ð·Ð°ÐºÑ\99Ñ\83Ñ\87ана. \nÐ\9cожеÑ\82е Ð¿Ð¾Ð³Ð»ÐµÐ´Ð°Ñ\82и Ð¸Ð·Ð²Ð¾Ñ\80ни Ñ\82екÑ\81Ñ\82.",
+       "tooltip-ca-edit": "Уреди ову страницу",
+       "tooltip-ca-addsection": "Започни нови одељак",
+       "tooltip-ca-viewsource": "Ð\9eва Ñ\81Ñ\82Ñ\80аниÑ\86а Ñ\98е Ð·Ð°ÐºÑ\99Ñ\83Ñ\87ана. \nÐ\9cожеÑ\82е Ð´Ð° Ð¿Ð¾Ð³Ð»ÐµÐ´Ð°Ñ\82е Ñ\9aен Ð¸Ð·Ð²Ð¾Ñ\80ни ÐºÃ´Ð´",
        "tooltip-ca-history": "Претходне измене ове странице",
        "tooltip-ca-protect": "Заштитите ову страницу",
        "tooltip-ca-unprotect": "Промени заштиту ове странице",
        "tooltip-ca-nstab-template": "Погледајте шаблон",
        "tooltip-ca-nstab-help": "Погледајте страницу за помоћ",
        "tooltip-ca-nstab-category": "Погледајте страницу категорија",
-       "tooltip-minoredit": "Означите ову измену као мању",
+       "tooltip-minoredit": "Означи као мању измену",
        "tooltip-save": "Сачувајте своје измене",
-       "tooltip-publish": "Објавите своје измене",
+       "tooltip-publish": "Објави своје измене",
        "tooltip-preview": "Прегледајте своје измене. Користите ово дугме пре чувања.",
        "tooltip-diff": "Погледајте које измене сте направили на тексту",
        "tooltip-compareselectedversions": "Погледаjте разлике између две изабране измене ове странице.",
-       "tooltip-watch": "Додајте ову страницу на свој списак надгледања",
+       "tooltip-watch": "Додај ову страницу на свој списак надгледања",
        "tooltip-watchlistedit-normal-submit": "Уклони наслове",
        "tooltip-watchlistedit-raw-submit": "Ажурирај списак",
        "tooltip-recreate": "Поново направите страницу иако је обрисана",
        "filedelete-archive-read-only": "Сервер не може да пише по складишној фасцикли ($1).",
        "previousdiff": "← Старија измена",
        "nextdiff": "Новија измена →",
-       "mediawarning": "<strong>Упозорење:</strong> ова врста датотеке може садржати штетан код.\nАко га покренете, Ваш рачунар може бити угрожен.",
+       "mediawarning": "<strong>Упозорење:</strong> ова врста датотеке може садржати штетан кôд.\nАко га покренете, Ваш рачунар може бити угрожен.",
        "imagemaxsize": "Ограничење величине слике:<br /><em>(на страницама за опис датотека)</em>",
        "thumbsize": "Величина минијатуре:",
        "widthheight": "$1 × $2",
        "exif-keywords": "Кључне речи",
        "exif-worldregioncreated": "Област света где је сликана фотографија",
        "exif-countrycreated": "Земља где је сликана фотографија",
-       "exif-countrycodecreated": "Код земље где је слика направљена",
+       "exif-countrycodecreated": "Кôд земље где је слика направљена",
        "exif-provinceorstatecreated": "Покрајина или држава где је сликана фотографија",
        "exif-citycreated": "Град где је сликана фотографија",
        "exif-sublocationcreated": "Област града где је сликана фотографија",
        "exif-worldregiondest": "Приказана област света",
        "exif-countrydest": "Приказана земља",
-       "exif-countrycodedest": "Код приказане земље",
+       "exif-countrycodedest": "Кôд приказане земље",
        "exif-provinceorstatedest": "Приказана покрајина или држава",
        "exif-citydest": "Приказани град",
        "exif-sublocationdest": "Приказана област града",
        "exif-urgency": "Хитност",
        "exif-fixtureidentifier": "Назив рубрике",
        "exif-locationdest": "Приказана локација",
-       "exif-locationdestcode": "Код приказаног места",
+       "exif-locationdestcode": "Кôд приказаног места",
        "exif-objectcycle": "Доба дана за који је медиј намењен",
        "exif-contact": "Подаци за контакт",
        "exif-writer": "Писац",
        "exif-contentwarning": "Упозорење о садржају",
        "exif-giffilecomment": "Коментар на датотеку GIF",
        "exif-intellectualgenre": "Врста ставке",
-       "exif-subjectnewscode": "Код предмета",
-       "exif-scenecode": "IPTC код сцене",
+       "exif-subjectnewscode": "Кôд предмета",
+       "exif-scenecode": "IPTC кôд сцене",
        "exif-event": "Приказани догађај",
        "exif-organisationinimage": "Приказана организација",
        "exif-personinimage": "Приказана особа",
        "confirmemail": "Потврда имејл адресе",
        "confirmemail_noemail": "Нисте унели исправну имејл адресу у [[Special:Preferences|подешавањима]].",
        "confirmemail_text": "{{SITENAME}} захтева да потврдите имејл адресу пре него што почнете да користите могућности имејла.\nКликните на дугме испод за слање поруке на вашу адресу.\nУ поруци ће се налазити веза с потврдним кодом;\nунесите је у прегледач да бисте потврдили да је ваша имејл адреса исправна.",
-       "confirmemail_pending": "Потврдни код вам је већ послат. Ако сте управо отворили налог, онда вероватно треба да сачекате неколико минута да пристигне, пре него што поново затражите нови код.",
-       "confirmemail_send": "Пошаљи потврдни код",
+       "confirmemail_pending": "Потврдни кôд вам је већ послат. Ако сте управо отворили налог, онда вероватно треба да сачекате неколико минута да пристигне, пре него што поново затражите нови кôд.",
+       "confirmemail_send": "Пошаљи потврдни кôд",
        "confirmemail_sent": "Потврдна порука је послата.",
-       "confirmemail_oncreate": "Послат је потврдни код на вашу имејл адресу.\nОвај код није потребан за пријављивање, али вам треба да бисте укључили могућности имејла на викију.",
+       "confirmemail_oncreate": "Послат је потврдни кôд на вашу имејл адресу.\nОвај кôд није потребан за пријављивање, али вам треба да бисте укључили могућности имејла на викију.",
        "confirmemail_sendfailed": "{{SITENAME}} не може да пошаље имејл потврду.\nПроверите да ли је имејл адреса правилно написана.\n\nГрешка: $1",
        "confirmemail_invalid": "Потврдни код је неисправан. Вероватно је истекао.",
        "confirmemail_needlogin": "Морате бити $1 да бисте потврдили имејл адресу.",
        "tags": "Важеће ознаке измена",
        "tag-filter": "Филтер за [[Special:Tags|ознаке]]:",
        "tag-filter-submit": "Филтрирај",
-       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Ð\9eзнака|Ð\9eзнаке}}]]: $2)",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|ознака|ознаке}}]]: $2)",
        "tag-mw-contentmodelchange": "промена модела садржаја",
        "tag-mw-contentmodelchange-description": "Измене које мењају модел садржаја странице",
        "tag-mw-new-redirect": "ново преусмерење",
        "tag-mw-replace-description": "Измене које уклањају више од 90% садржаја странице",
        "tag-mw-rollback": "враћање",
        "tag-mw-rollback-description": "Измене које враћају страницу на претходне измене",
-       "tag-mw-undo": "поништена ранија измена",
+       "tag-mw-undo": "поништење",
        "tag-mw-undo-description": "Измене које поништавају претходне измене",
        "tags-title": "Ознаке",
        "tags-intro": "На овој страници је наведен списак ознака с којима програм може да означи измене и његово значење.",
        "feedback-cancel": "Откажи",
        "feedback-close": "Урађено",
        "feedback-external-bug-report-button": "Пријави грешку",
-       "feedback-dialog-title": "Ð\9fоÑ\88аÑ\99и Ð¿Ð¾Ð²Ñ\80аÑ\82нÑ\83 Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\98Ñ\83",
+       "feedback-dialog-title": "СлаÑ\9aе Ð¿Ð¾Ð²Ñ\80аÑ\82не Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\98е",
        "feedback-error1": "Грешка: непрепознат резултат од АПИ-ја",
        "feedback-error2": "Грешка: уређивање није успело",
        "feedback-error3": "Грешка: нема одговора од АПИ-ја",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (омогућена)",
        "mediastatistics": "Статистика датотека",
        "mediastatistics-summary": "Статистике о типовима послатих датотека. Овде су урачунате само најновије верзије датотека. Старе или обрисане верзије нису урачунате.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 бајт|$1 бајта|$1 бајтова}} ($2; $3%)",
+       "mediastatistics-bytespertype": "Укупна величина датотеке овог одељка: {{PLURAL:$1|$1 бајт|$1 бајта|$1 бајтова}} ($2; $3%).",
+       "mediastatistics-allbytes": "Укупна величина свих датотека: {{PLURAL:$1|$1 бајт|$1 бајта|$1 бајтова}} ($2).",
        "mediastatistics-table-mimetype": "MIME тип",
        "mediastatistics-table-extensions": "Могуће екстензије",
        "mediastatistics-table-count": "Број датотека",
        "json-error-state-mismatch": "Невалидан или покварени JSON",
        "json-error-ctrl-char": "Грешка контролног симбола, могуће је да је неисправно енкодиран",
        "json-error-syntax": "Грешка у синтакси",
+       "json-error-utf8": "Малформирани UTF-8 знаци, могуће је да су неисправно енкодирани",
+       "json-error-recursion": "Једна или више рекурзивних референци у вредности коју треба енкодирати.",
+       "json-error-inf-or-nan": "Једна или више NAN или INF вредности у вредности коју треба енкодирати",
        "json-error-unsupported-type": "Дата је вреднос врсте која се не може енкодирати",
        "headline-anchor-title": "Веза до овог одељка",
        "special-characters-group-latin": "Латиница",
        "date-range-to": "До датума:",
        "sessionprovider-generic": "$1 сесије",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "сесије са колачићима",
+       "sessionprovider-nocookies": "Колачићи су можда онемогућени. Уверите се да су колачићи омогућени и почните поново.",
        "randomrootpage": "Случајна коренска страница",
        "log-action-filter-block": "Тип блокирања:",
        "log-action-filter-contentmodel": "Тип промене модела садржаја:",
index 54f471d..b1c1bc3 100644 (file)
@@ -30,7 +30,8 @@
                        "Prevodim",
                        "Bugoslav",
                        "Acamicamacaraca",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "BadDog"
                ]
        },
        "tog-underline": "Podvlačenje veza:",
        "userpage-userdoesnotexist": "Korisnički nalog „<nowiki>$1</nowiki>“ nije otvoren.\nRazmislite da li zaista želite da napravite/uredite ovu stranicu.",
        "userpage-userdoesnotexist-view": "Korisnički nalog „$1“ nije otvoren.",
        "blocked-notice-logextract": "Ovaj korisnik je trenutno blokiran.\nIzveštaj o poslednjem blokiranju možete pogledati ispod:",
-       "clearyourcache": "<strong>Napomena:</strong> nakon čuvanja, možda ćete morati da očistite keš pregledača kako biste videli promene.\n* <strong>Fajerfoks / Safari:</strong> držite <em>Shift</em> i kliknite na <em>Osveži</em>, ili pritisnite <em>Ctrl-F5</em> ili <em>Ctrl-R</em> (<em>⌘-R</em> na Meku)\n* <strong>Gugl kroum:</strong> pritisnite <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> na Meku)\n* <strong>Internet eksplorer:</strong> držite <em>Ctrl</em> i kliknite na <em>Osveži</em> ili pritisnite <em>Ctrl-F5</em>\n* <strong>Opera:</strong> idite na <em>Alatke → Podešavanja</em> (<em>Opera → Postavke</em> na Meku) i zatim <em>Privatnost i bezbednost → Očistite podatke o pregledima → Keširane slike i datoteke</em>.",
+       "clearyourcache": "<strong>Napomena:</strong> Nakon čuvanja, možda ćete morati da očistite keš pregledača kako biste videli izmene.\n* <strong>Fajerfoks/Safari:</strong> Držite <em>Shift</em> i kliknite na <em>Osveži</em> ili pritisnite <em>Ctrl-F5</em> ili <em>Ctrl-R</em> (<em>⌘-R</em> na Meku)\n* <strong>Gugl kroum:</strong> Pritisnite <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> na Meku)\n* <strong>Internet eksplorer:</strong> Držite <em>Ctrl</em> i kliknite na <em>Osveži</em> ili pritisnite <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Idite na <em>Alatke → Podešavanja</em> (<em>Opera → Postavke</em> na Meku) i zatim <em>Privatnost i bezbednost → Očistite podatke o pregledima → Keširane slike i datoteke</em>.",
        "usercssyoucanpreview": "'''Savet:''' korisitite dugme „{{int:showpreview}}“ da isprobate svoj novi CSS pre nego što ga sačuvate.",
        "userjsyoucanpreview": "'''Savet:''' korisitite dugme „{{int:showpreview}}“ da isprobate svoj novi javaskript pre nego što ga sačuvate.",
        "usercsspreview": "'''Ovo je samo pregled CSS-a.'''\n'''Stranica još nije sačuvana!'''",
        "minimum-size": "Najmanja veličina",
        "maximum-size": "Najveća veličina:",
        "pagesize": "(bajtovi)",
-       "restriction-edit": "Uređivanje",
-       "restriction-move": "Premeštanje",
+       "restriction-edit": "uređivanje",
+       "restriction-move": "premeštanje",
        "restriction-create": "pravljenje",
        "restriction-upload": "otpremanje",
        "restriction-level-sysop": "potpuno zaštićeno",
        "tooltip-ca-talk": "Razgovor o stranici sa sadržajem",
        "tooltip-ca-edit": "Uredi ovu stranicu",
        "tooltip-ca-addsection": "Započnite novi odeljak",
-       "tooltip-ca-viewsource": "Ова страница је закључана. \nМожете погледати изворни текст.",
+       "tooltip-ca-viewsource": "Ova stranica je zaključana. \nMožete da pogledate njen izvorni kôd",
        "tooltip-ca-history": "Prethodne verzije ove stranice",
        "tooltip-ca-protect": "Zaštitite ovu stranicu",
        "tooltip-ca-unprotect": "Promeni zaštitu ove stranice",
index 3a72579..726da33 100644 (file)
        "converter-manual-rule-error": "Fel upptäcktes i manuell språkkonverteringsregel",
        "undo-success": "Redigeringen kan göras ogjord.\nVar god och kontrollera jämförelsen nedan för att bekräfta att detta är vad du avser att göra, och spara sedan ändringarna nedan för att göra redigeringen ogjord.",
        "undo-failure": "Redigeringen kunde inte göras ogjord på grund av konflikt med mellanliggande redigeringar.",
+       "undo-main-slot-only": "Redigeringen kunde inte göras ogjord eftersom den omfattar innehåll utanför huvudplatsen.",
        "undo-norev": "Redigeringen kan inte göras ogjord eftersom den inte finns eller har raderats.",
        "undo-nochange": "Det verkar som att redigeringen redan har blivit ogjord.",
        "undo-summary": "Gör version $1 av [[Special:Contributions/$2|$2]] ([[User talk:$2|diskussion]]) ogjord",
        "rcfilters-activefilters": "Aktiva filter",
        "rcfilters-activefilters-hide": "Dölj",
        "rcfilters-activefilters-show": "Visa",
+       "rcfilters-activefilters-hide-tooltip": "Dölj området för aktiva filter",
+       "rcfilters-activefilters-show-tooltip": "Visa området för aktiva filter",
        "rcfilters-advancedfilters": "Avancerade filter",
        "rcfilters-limit-title": "Resultat att visa",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|ändring|ändringar}}, $2",
        "rcfilters-days-show-hours": "$1 {{PLURAL:$1|timme|timmar}}",
        "rcfilters-highlighted-filters-list": "Markerade: $1",
        "rcfilters-quickfilters": "Sparade filter",
-       "rcfilters-quickfilters-placeholder-title": "Inga filter har sparats ännu",
+       "rcfilters-quickfilters-placeholder-title": "Inga filter har ännu sparats",
        "rcfilters-quickfilters-placeholder-description": "För att spara dina filterinställningar och återanvända dem senare, klicka på bokmärkesikonen under \"Aktiva filter\" nedan.",
        "rcfilters-savedqueries-defaultlabel": "Sparade filter",
        "rcfilters-savedqueries-rename": "Döp om",
        "tag-mw-undo": "Ångra",
        "tag-mw-undo-description": "Redigeringar som ångrar föregående redigeringar med ångralänken",
        "tags-title": "Märken",
-       "tags-intro": "Denna sida listar de märken som programvaran kan markera en redigering med, och deras betydelse.",
+       "tags-intro": "Denna sida listar de märken som programvaran kan markera en redigering med, samt deras betydelse.",
        "tags-tag": "Märkesnamn",
        "tags-display-header": "Utseende på listor över ändringar",
        "tags-description-header": "Full beskrivning av betydelse",
index 4701127..9e5717c 100644 (file)
@@ -20,7 +20,8 @@
                        "Macofe",
                        "Uostofchuodnego",
                        "Przem(1)s",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "Matěj Suchánek"
                ]
        },
        "tog-underline": "Podsztrychniyniy linkōw:",
        "listusers": "Lista užytkowńikůw",
        "listusers-editsonly": "Pokoż yno użytkowńikůw kere majům sprowjyńa",
        "usereditcount": "$1 {{PLURAL:$1|sprowjyńe|sprowjyńa|sprowjyń}}",
-       "usercreated": "{{GENDER:$3:Utworzono}} $1 uo $2",
+       "usercreated": "{{GENDER:$3|Utworzono}} $1 uo $2",
        "newpages": "Nowe zajty",
        "newpages-username": "Mjano użytkowńika:",
        "ancientpages": "Nojstarše artikle",
index 6ed30a6..9b2077c 100644 (file)
        "mw-widgets-titleinput-description-redirect": "$1 కు దారిమార్పు",
        "mw-widgets-categoryselector-add-category-placeholder": "ఓ వర్గాన్ని చేర్చండి...",
        "mw-widgets-usersmultiselect-placeholder": "మరిన్ని చేర్చండి...",
+       "date-range-from": "తేదీ నుండి",
+       "date-range-to": "తేదీ వరకు",
        "sessionprovider-generic": "$1 సెషన్లు",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "కూకీ-ఆధారిత సెషన్లు",
        "log-action-filter-block": "నిరోధపు రకం:",
index 65c4cc8..45a3874 100644 (file)
        "specialpages-group-media": "میڈیا رپورٹیں اور اپلوڈ کردہ",
        "specialpages-group-users": "صارفین اور اختیارات",
        "specialpages-group-highuse": "کثیر مستعمل صفحات",
-       "specialpages-group-pages": "فہارست صفحات",
+       "specialpages-group-pages": "صفحات کی فہرستیں",
        "specialpages-group-pagetools": "آلات صفحہ",
        "specialpages-group-wiki": "ڈیٹا اور آلات",
        "specialpages-group-redirects": "رجوع مکرر کے حامل خصوصی صفحات",
index a05f234..122c6df 100644 (file)
        "resetpass-submit-loggedin": "Thay đổi mật khẩu",
        "resetpass-submit-cancel": "Hủy bỏ",
        "resetpass-wrong-oldpass": "Mật khẩu tạm hoặc mật khẩu hiện thời không hợp lệ.\nCó thể bạn đã thay đổi mật khẩu của mình hoặc đã yêu cầu cung cấp một mật khẩu tạm mới.",
-       "resetpass-recycled": "Xin vui lòng chọn một mật khẩu khác với mật khẩu hiện tại.",
+       "resetpass-recycled": "Xin vui lòng thay đổi mật khẩu của bạn thành mật khẩu khác.",
        "resetpass-temp-emailed": "Bạn đã đăng nhập bằng mật khẩu tạm gửi qua thư điện tử. Để hoàn tất việc đăng nhập, bạn phải tạo lại mật khẩu mới tại đây:",
        "resetpass-temp-password": "Mật khẩu tạm:",
        "resetpass-abort-generic": "Một phần mở rộng đã hủy bỏ tác vụ thay đổi mật khẩu.",
        "resetpass-expired": "Mật khẩu của bạn đã hết hạn. Xin vui lòng tạo lại mật khẩu mới để đăng nhập.",
-       "resetpass-expired-soft": "Mật khẩu của bạn đã hết hạn và cần được đặt lại. Xin vui lòng chọn một mật khẩu mới lúc bây giờ hoặc bấm “{{int:authprovider-resetpass-skip-label}}” để đặt lại sau.",
-       "resetpass-validity-soft": "Mật khẩu của bạn không hợp lệ: $1\n\nXin hãy chọn mật khẩu mới bây giờ hoặc bấm “{{int:authprovider-resetpass-skip-label}}” để đặt lại sau.",
+       "resetpass-expired-soft": "Mật khẩu của bạn đã hết hạn và cần được thay đổi. Xin vui lòng thay đổi mật khẩu mới lúc bây giờ hoặc bấm “{{int:authprovider-resetpass-skip-label}}” để thay đổi sau.",
+       "resetpass-validity-soft": "Mật khẩu của bạn không hợp lệ: $1\n\nXin hãy chọn mật khẩu mới bây giờ hoặc bấm “{{int:authprovider-resetpass-skip-label}}” để thay đổi sau.",
        "passwordreset": "Tái tạo mật khẩu",
        "passwordreset-text-one": "Hãy điền mẫu đơn này để tái tạo mật khẩu.",
        "passwordreset-text-many": "Điền vào {{PLURAL:$1}}một hộp sau để nhận một mật khẩu tạm thời qua thư điện tử.",
        "rcfilters-other-review-tools": "Công cụ duyệt khác",
        "rcfilters-group-results-by-page": "Nhóm kết quả theo trang",
        "rcfilters-activefilters": "Bộ lọc hiện hành",
+       "rcfilters-activefilters-hide": "Ẩn",
+       "rcfilters-activefilters-show": "Hiện",
        "rcfilters-advancedfilters": "Bộ lọc nâng cao",
        "rcfilters-limit-title": "Số kết quả hiển thị",
        "rcfilters-limit-and-date-label": "$1 thay đổi, $2",
        "uploadstash-file-not-found-no-remote-thumb": "Nạp hình thu nhỏ thất bại: $1\nURL = $2",
        "uploadstash-file-not-found-missing-content-type": "Thiếu đầu đề kiểu-nội-dung (content-type).",
        "uploadstash-not-logged-in": "Người dùng chưa đăng nhập, các tập tin phải do người dùng đã đăng nhập tải lên.",
-       "uploadstash-no-such-key": "Khoá không tồn tại ($1), không thể xoá.",
+       "uploadstash-no-such-key": "Khóa không tồn tại ($1), không thể xóa.",
        "uploadstash-zero-length": "Tập tin có dung lượng bằng không.",
        "invalid-chunk-offset": "Khúc lệch (chunk offset) không hợp lệ",
        "img-auth-accessdenied": "Không cho phép truy cập",
        "dellogpage": "Nhật trình xóa",
        "dellogpagetext": "Dưới đây là danh sách các trang bị xóa gần đây nhất.",
        "deletionlog": "nhật trình xóa",
+       "log-name-create": "Nhật trình tạo trang",
+       "log-description-create": "Dưới đây là danh sách các trang được tạo gần đây nhất.",
        "logentry-create-create": "$1 {{GENDER:$2|đã tạo}} trang $3",
        "reverted": "Đã hồi phục một phiên bản cũ",
        "deletecomment": "Lý do:",
        "autosumm-blank": "Đã tẩy trống trang",
        "autosumm-replace": "Đã thay thế cả nội dung bằng “$1”",
        "autoredircomment": "Đổi hướng đến [[$1]]",
-       "autosumm-removed-redirect": "X đổi hướng đến trang [[$1]]",
+       "autosumm-removed-redirect": "Xóa đổi hướng đến trang [[$1]]",
        "autosumm-changed-redirect-target": "Thay đổi trang đích của đổi hướng từ [[$1]] sang [[$2]]",
        "autosumm-new": "Tạo trang mới với nội dung “$1”",
        "autosumm-newblank": "Đã tạo trang trống",
        "watchlistedit-clear-titles": "Các tiêu đề:",
        "watchlistedit-clear-submit": "Xóa sạch danh sách theo dõi (không thể lùi lại!)",
        "watchlistedit-clear-done": "Đã xóa sạch danh sách theo dõi của bạn.",
-       "watchlistedit-clear-jobqueue": "Danh sách theo dõi của bạn đang bị x. Quá trình này có thể tốn một khoảng thời gian!",
+       "watchlistedit-clear-jobqueue": "Danh sách theo dõi của bạn đang bị xóa. Quá trình này có thể tốn một khoảng thời gian!",
        "watchlistedit-clear-removed": "$1 tựa đề đã được xóa khỏi danh sách:",
        "watchlistedit-too-many": "Danh sách có quá nhiều trang để hiển thị.",
        "watchlisttools-clear": "Xóa sạch danh sách theo dõi",
        "tag-mw-contentmodelchange-description": "Sửa đổi [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel thay đổi kiểu nội dung] của trang",
        "tag-mw-new-redirect": "Trang đổi hướng mới",
        "tag-mw-new-redirect-description": "Các sửa đổi tạo ra trang đổi hướng mới hoặc biến một trang thành trang đổi hướng.",
-       "tag-mw-removed-redirect": "X đổi hướng",
+       "tag-mw-removed-redirect": "Xóa đổi hướng",
        "tag-mw-removed-redirect-description": "Các thay đổi biến một trang đổi hướng thành trang không đổi hướng",
        "tag-mw-changed-redirect-target": "Thay đổi trang đích của đổi hướng",
        "tag-mw-changed-redirect-target-description": "Các thay đổi làm thay đổi trang đích của một trang đổi hướng",
        "tag-mw-blank": "Tẩy trống trang",
-       "tag-mw-blank-description": "Các sửa đổi tẩy trống (x trắng) một trang",
+       "tag-mw-blank-description": "Các sửa đổi tẩy trống (xóa trắng) một trang",
        "tag-mw-replace": "Thay thế nội dung",
        "tag-mw-replace-description": "Các sửa đổi thay đổi trên 90% nội dung của một trang",
        "tag-mw-rollback": "Lùi tất cả",
index de47edf..70ec8d2 100644 (file)
@@ -8,7 +8,8 @@
                        "아라",
                        "Macofe",
                        "Matma Rex",
-                       "Reptilien.19831209BE1"
+                       "Reptilien.19831209BE1",
+                       "Matěj Suchánek"
                ]
        },
        "tog-underline": "Sorlignî les loyéns:",
        "saveusergroups": "Schaper les groupes d' uzeus",
        "userrights-groupsmember": "Mimbe di:",
        "userrights-groupsmember-auto": "Mimbe implicite di:",
-       "userrights-groups-help": "Vos ploz candjî les groupes ki {{GENDER:$1|cist uzeu|ciste uzeuse}} apårtént:\n* Ene boesse clitcheye c' est k' {{GENDER:$|il|elle}} est mimbe do groupe.\n* Ene boesse disclitcheye c' est k' {{GENDER:$|i|ele}} n' end est nén mimbe.\n* Ene sitoele (*) mostere k' on n' pout nén rsaetchî l' groupe on côp k' il a stî radjouté, ou årvierdimint.",
+       "userrights-groups-help": "Vos ploz candjî les groupes ki {{GENDER:$1|cist uzeu|ciste uzeuse}} apårtént:\n* Ene boesse clitcheye c' est k' {{GENDER:$1|il|elle}} est mimbe do groupe.\n* Ene boesse disclitcheye c' est k' {{GENDER:$1|i|ele}} n' end est nén mimbe.\n* Ene sitoele (*) mostere k' on n' pout nén rsaetchî l' groupe on côp k' il a stî radjouté, ou årvierdimint.",
        "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.",
index 2ed7c43..997f73d 100644 (file)
        "viewsource": "ⵙⴽⵏ ⴰⵙⴰⴳⵎ",
        "viewsource-title": "ⵥⵕ ⴰⵖⴱⴰⵍⵓ ⵉ $1",
        "viewsourcetext": "ⵜⵣⵎⵔⴷ ⴰⴷ ⵜⵥⵔⴷ ⴷ ⴰⴷ ⵜⵙⵙⵏⵖⵍⴷ ⴰⵙⴰⴳⵎ ⵏ ⵜⴰⵙⵏⴰ ⴰⴷ",
+       "welcomeuser": "ⴰⵏⵙⵓⴼ, $1!",
+       "yourname": "ⵉⵙⵎ ⵏ ⵓⵙⵎⵔⴰⵙ",
        "userlogin-yourname": "ⵉⵙⵎ ⵏ ⵓⵙⵎⵔⴰⵙ",
        "userlogin-yourname-ph": "ⵙⵙⴽⵛⵎ ⵉⵙⵎ ⵏ ⵓⵏⵙⵙⵎⵔⵙ ⵏⵏⵎ/ⴽ",
+       "createacct-another-username-ph": "ⵙⵙⴽⵛⵎ ⵉⵙⵎ ⵏ ⵓⵏⵙⵙⵎⵔⵙ ⵏⵏⵎ/ⴽ",
        "yourpassword": "ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ",
        "userlogin-yourpassword": "ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ",
        "userlogin-yourpassword-ph": "ⵙⵙⴽⵛⵎ ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵏⵏⴽ",
        "userlogin-resetpassword-link": "ⵜⴻⵜⵜⵓⴷ ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵏⵏⵎ/ⴽ?",
        "createacct-emailoptional": "ⵉⵎⴰⵢⵍ (ⴰⵔⵓⵛⵛⵉⵍ)",
        "createacct-email-ph": "ⵙⵙⴽⵛⵎ ⴰⵏⵙⴰ ⵉⵎⴰⵢⵍ ⵏⵏⴽ",
+       "createacct-realname": "ⵉⵙⵎ ⵏ ⵜⵉⴷⵜ (‍ⵎ ⵜⵔⵉⵜ)",
        "createacct-reason": "ⵜⴰⵎⵏⵜⵉⵍⵜ",
        "createacct-submit": "ⵔⵥⵎ ⴰⵎⵉⴹⴰⵏ {{GENDER:|ⵏⵏⴽ|ⵏⵏⵎ}}",
+       "createacct-another-submit": "ⵙⵏⴼⵍⵓⵍ ⴰⵎⵉⴹⴰⵏ",
        "createacct-benefit-heading": "{{SITENAME}} ⵜⴻⵜⵜⵓⴽ ⵙⴳ ⵎⵉⴷⴷⵏ ⴰⵎ ⴽⵢⵢⵉⵏ",
        "createacct-benefit-body1": "{{PLURAL:$1|ⴰⵙⵏⴼⵍ|ⵉⵙⵏⴼⴰⵍ}}",
        "createacct-benefit-body2": "{{PLURAL:$1|ⵜⴰⵙⵏⴰ|ⵜⴰⵙⵏⵉⵡⵉⵏ}}",
        "createacct-benefit-body3": "{{PLURAL:$1|ⴰⵏⴰⵎⵓ|ⵉⵏⴰⵎⵓⵜⵏ}} {{PLURAL:$1|ⴰⵎⴳⴳⴰⵔⵓ|ⵉⵎⴳⴳⵓⵔⴰ}}",
+       "mailmypassword": "ⵔⴰⵔ ⴷ ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ",
        "loginlanguagelabel": "ⵜⵓⵜⵍⴰⵢⵜ: $1",
        "pt-login": "ⴽⵛⵎ",
        "pt-login-button": "ⴽⵛⵎ",
        "pt-createaccount": "ⵙⵏⴼⵍⵓⵍ ⴰⵎⵉⴹⴰⵏ",
        "pt-userlogout": "ⴼⴼⵖ",
+       "oldpassword": "ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵜⴰⵇⴱⵓⵔⵜ",
        "newpassword": "ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵜⴰⵎⴰⵢⵏⵓⵜ",
        "botpasswords-label-create": "ⵙⵏⵓⵍⴼⵓ",
+       "botpasswords-label-cancel": "ⵙⵔ",
        "botpasswords-label-delete": "ⴽⴽⵙ",
+       "resetpass-submit-cancel": "ⵙⵔ",
        "passwordreset": "ⵔⴰⵔ ⴷ ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ",
+       "passwordreset-username": "ⵉⵙⵎ ⵏ ⵓⵙⵎⵔⴰⵙ:",
        "changeemail-newemail": "ⵉⵎⴰⵢⵍ ⴰⵎⴰⵢⵏⵓ:",
        "changeemail-none": "(ⵓⵍⴰ ⵢⴰⵏ)",
        "bold_sample": "ⴰⴹⵔⵉⵙ ⴰⵣⵓⵔⴰⵔ",
        "minoredit": "ⵡⴰ ⴷ ⴰⵙⵏⴼⵍ ⵓⵎⵥⵉⵢ",
        "watchthis": "ⵎⵎⴰⵜⵔ ⵜⴰⵙⵏⴰ ⴰⴷ",
        "savearticle": "ⵃⴹⵓ ⵜⴰⵙⵏⴰ",
+       "publishchanges": "ⴼⵙⵔ ⵉⵙⵏⴼⵍⵏ",
+       "savearticle-start": "ⵃⴹⵓ ⵜⴰⵙⵏⴰ",
+       "savechanges-start": "ⵃⴹⵓ ⵉⵙⵏⴼⵍⵏ",
+       "publishpage-start": "ⴼⵙⵔ ⵜⴰⵙⵏⴰ...",
+       "publishchanges-start": "ⴼⵙⵔ ⵉⵙⵏⴼⵓⵍⵏ...",
        "showpreview": "ⵙⴽⵏ ⴰⴱⵔⵉⴼⵢⵓ",
        "showdiff": "ⵙⵎⴰⵍ ⵉⵙⵏⴼⵍⵏ",
        "loginreqlink": "ⴽⵛⵎ",
+       "accmailtitle": "ⵜⴰⴳⵓⵔⵉ ⵓⵣⵔⴰⵢ ⵜⴻⵜⵜⵡⴰⵣⵏ",
        "newarticle": "(ⴰⵎⴰⵢⵏⵓ)",
        "newarticletext": "ⵜⴹⴼⴰⵔⴷ ⵢⴰⵏ ⵓⵙⵖⵏ ⵖⵔ ⵢⴰⵜ ⵜⴰⵙⵏⴰ ⵏⵏⴰ ⵓⵔ ⵜⴰ ⵉⵍⵍⵉⵏ. \nⴰⴼⴰⴷ ⴰⴷ ⵜⵙⵏⵓⵍⴼⵓⴷ ⵜⴰⵙⵏⴰ, ⵙⵙⵏⵜⵉ ⵜⵉⵔⵔⴰ ⴳ ⵓⴼⵏⵉⵇ ⴳ ⵉⵣⴷⴷⴰⵔ (ⵥⵔ [$1 ⵜⴰⵙⵏⴰ ⵏ ⵜⵡⵉⵙⵉ] ⵉ ⵡⵓⴳⴳⴰⵔ ⵏ ⵉⵏⵖⵎⵉⵙⵏ). \nⵎⴽ ⵜⵍⵍⵉⴷ ⴷⴰ ⵙ ⵓⵣⴳⴰⵍ, ⴰⴽⵍ ⵖⴼ <strong>ⴰⵖⵓⵍ</strong> ⴳ ⵓⵙⴰⵔⴰ ⵏⵏⴽ.",
        "noarticletext": "ⵓⵔ ⵉⵍⵍⵉ ⴽⵔⴰ ⵏ ⵓⴹⵔⵉⵙ ⴳ ⵜⴰⵙⵏⴰ ⴰⴷ ⵖⵉⵍⴰ. \nⵜⵣⵎⵔⴷ ⴰⴷ [[Special:Search/{{PAGENAME}}|ⵜⵔⵣⵓⴷ ⵖⴼ ⵓⵣⵡⵍ ⵏⵏⵙ]] ⴳ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵢⴰⴹⵏ, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ⵔⵣⵓ ⵖⴼ logs ⵖⵔⵙ ⵉⵇⵇⵏⴻⵏ],\nⵏⵖ [{{fullurl:{{FULLPAGENAME}}|action=edit}} ⵙⵏⵓⵍⴼⵓ ⵜⴰⵙⵏⴰ]</span>.",
        "editing": "ⴰⵙⵏⴼⵍ ⵏ $1",
        "creating": "ⴰⵙⵏⵓⵍⴼⵓ ⵏ $1",
        "editingsection": "ⵙⵏⴼⵍ ⴰⴳⵣⵣⵓⵎ $1",
+       "yourtext": "ⴰⴹⵕⵉⵙ ⵏⵏⴽ/ⵎ",
        "templatesused": "{{PLURAL:$1|ⵜⴰⵙⴽⴽⴰ|ⵜⴰⵙⴽⴽⵉⵡⵉⵏ}} {{PLURAL:$1|ⵉⵜⵜⵓⵙⵎⵔⵙⵏ|ⵜⵜⵓⵙⵎⵔⵙⵏⵉⵏ}} ⴳ ⵜⴰⵙⵏⴰ ⴰⴷ:",
        "template-protected": "(ⵉⵜⵜⵢⴰⵔⴰⵢ)",
        "template-semiprotected": "(ⵜⵎⵃⴹⴰ ⵙ ⵓⴳⵣⵎⴰⵏ)",
        "hiddencategories": "ⵜⴰⵙⵏⴰ ⴰ ⴷ ⴰⴳⵎⴰⵎ ⵏ {{PLURAL:$1|1 ⵏⵜⵍ ⴰⵙⵎⵉⵍ|$1 ⵏⵜⵍ ⵉⵙⵎⵉⵍⵏ}}:",
        "permissionserrorstext-withaction": "ⵓⵔ ⴷⴰⵔⴽ ⵜⵓⵔⴰⴳⵜ ⴰⴼⴰⴷ ⴰⴷ $2, ⵙ {{PLURAL:$1|reason|reasons}}:",
        "content-model-wikitext": "wikitext",
+       "content-model-javascript": "JavaScript",
        "currentrev-asof": "ⴰⵣⵣⵔⴰⵢ ⴰⵎⴳⴳⴰⵔⵓ ⴳ $1",
        "revisionasof": "ⵜⵓⵏⵖⵉⵍⵜ ⵏ $1",
        "previousrevision": "ⵜⵓⵏⵖⵉⵍⵜ ⵜⴰⵇⴱⵓⵔⵜ",
        "currentrevisionlink": "ⴰⵣⵣⵔⴰⵢ ⴰⵎⴳⴳⴰⵔⵓ",
        "cur": "ⵎⵔⵏ",
        "last": "ⵓⵣⵡⵔ",
+       "page_last": "ⴰⵎⴳⴳⴰⵔⵓ",
        "history-fieldset-title": "ⵔⵣⵓ ⵖⴼ ⵉⵣⵣⵔⴰⵢⵏ",
        "histfirst": "ⴰⵇⴱⵓⵔ",
        "histlast": "ⴰⵎⴰⵢⵏⵓ",
        "history-feed-title": "ⴰⵎⵣⵔⵓⵢ ⵏ ⵓⵣⵣⵔⴰⵢ",
        "history-feed-description": "ⴰⵎⵣⵔⵓⵢ ⵏ ⵓⵣⵣⵔⴰⵢ ⵉ ⵜⴰⵙⵏⴰ ⴰⴷ ⴳ ⵡⵉⴽⵉ",
        "history-feed-item-nocomment": "$1 ⵖⵔ $2",
+       "rev-showdeleted": "ⵙⴽⵏ",
        "revdelete-show-file-submit": "ⵢⴰⵀ",
        "revdelete-log": "ⵜⴰⵎⵏⵜⵉⵍⵜ:",
        "mergehistory-reason": "ⵜⴰⵎⵏⵜⵉⵍⵜ:",
        "file-anchor-link": "ⴰⴼⴰⵢⵍⵓ",
        "filehist": "ⴰⵎⵣⵔⵓⵢ ⵏ ⵓⴼⴰⵢⵍⵓ",
        "filehist-help": "ⴰⴷⵔ ⵖⴼ ⵓⵙⴰⴽⵓⴷ/ⴰⴽⵓⴷ ⵃⵎⴰ ⴰⴷ ⵜⵥⵔⴷ ⴰⵙⴷⴰⵡ ⵎⴰⵎⴽ ⵢⴰⴷⵍⵍⵉ ⵉⴳⴰ ⴰⵇⵓⴷ ⴰⵏ.",
+       "filehist-deleteall": "ⴽⴽⵙ ⵎⴰⵕⵕⴰ",
        "filehist-deleteone": "ⴽⴽⵙ",
        "filehist-current": "ⴰⵎⵉⵔⴰⵏ",
        "filehist-datetime": "ⴰⵙⴰⴽⵓⴷ/ⴰⴽⵓⴷ",
        "filedelete-submit": "ⴽⴽⵙ",
        "download": "ⴰⴳⵎ",
        "randompage": "ⵜⴰⵙⵏⴰ ⵜⴰⴷⵀⵎⴰⵙⵜ",
+       "randomincategory-submit": "ⴷⴷⵓ",
        "statistics": "ⴰⵙⵏⵎⴽⵜⴰ",
        "statistics-pages": "ⵜⴰⵙⵏⵉⵡⵉⵏ",
+       "pageswithprop-submit": "ⴷⴷⵓ",
        "brokenredirects-edit": "ⵙⵏⴼⵍ",
        "brokenredirects-delete": "ⴽⴽⵙ",
        "withoutinterwiki-legend": "ⴰⵣⵡⵉⵔ",
        "categories": "ⵉⵙⵎⵉⵍⵏ",
        "sp-deletedcontributions-contribs": "ⵜⵓⵎⵓⵜⵉⵏ",
        "listgrouprights-members": "ⵜⴰⵍⴳⴰⵎⵜ ⵏ ⵉⴳⵎⴰⵎⵏ",
+       "listgrouprights-addgroup-all": "ⵔⵏⵓ ⵎⴰⵕⵕⴰ ⵜⵉⵔⴰⴱⴱⵓⵜⵉⵏ",
+       "listgrouprights-removegroup-all": "ⴽⴽⵙ ⵎⴰⵕⵕⴰ ⵜⵉⵔⴰⴱⴱⵓⵜⵉⵏ",
        "emailmessage": "ⵜⵓⵣⵉⵏⵜ:",
        "usermessage-editor": "ⵓⴷⵓⵙ ⵏ ⵓⵎⵢⴰⵣⴰⵏ",
        "watchlist": "ⵜⴰⵍⴳⴰⵎⵜ ⵏ ⵓⴹⴼⴼⵓⵔ",
        "whatlinkshere-title": "ⵜⴰⵙⵏⵉⵡⵉⵏ ⵉⵣⴷⵉⵏ ⵖⵔ $1",
        "whatlinkshere-page": "ⵜⴰⵙⵏⴰ:",
        "linkshere": "ⵜⴰⵙⵏⵉⵡⵉⵏ ⴰⴷ ⵣⴷⵉⵏ ⵖⵔ <strong>$1</strong>:",
-       "nolinkshere": "ⵓⵔ ⵍⵍⵉⵏ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵉⵣⴷⵉⵏ ⵖⵔ <strong>$1</strong>",
+       "nolinkshere": "ⵓⵔ ⵍⵍⵉⵏ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵉⵣⴷⵉⵏ ⵖⵔ <strong>$2</strong>",
        "isredirect": "ⵙⵡⴰⵍⴰ ⵜⴰⵙⵏⴰ",
        "istemplate": "ⴰⵙⵙⵓⵎⵢ",
        "isimage": "ⴰⵙⵖⵓⵏ ⵏ ⵓⴼⴰⵢⵍⵓ",
        "whatlinkshere-hidelinks": "$1 ⵉⵙⵖⵓⵏⴻⵏ",
        "whatlinkshere-hideimages": "$1 ⵉⵣⴷⴰⵢⵏ ⵖⵔ ⵓⴼⵉⵍⵢⵓ",
        "whatlinkshere-filters": "ⵜⵉⵙⵜⵜⴰⵢⵉⵏ",
+       "whatlinkshere-submit": "ⴷⴷⵓ",
        "ipbreason": "ⵜⴰⵎⵏⵜⵉⵍⵜ:",
        "ipboptions": "2 ⵜⵙⵔⴰⴳⵉⵏ:2 ⵜⵙⵔⴰⴳⵉⵏ,1 ⵡⴰⵙⵙ:1 ⵡⴰⵙⵙ,3 ⵡⵓⵙⵙⴰⵏ:3 ⵡⵓⵙⵙⴰⵏ,1 ⵉⵎⴰⵍⴰⵙⵙ:1 ⵉⵎⴰⵍⴰⵙⵙ,2 ⵉⵎⴰⵍⴰⵙⵙⵏ:2 ⵉⵎⴰⵍⴰⵙⵙⵏ,1 ⵡⴰⵢⵢⵓⵔ:1 ⵡⴰⵢⵢⵓⵔ,3 ⵉⵢⵢⵉⵔⵏ:3 ⵉⵢⵢⵉⵔⵏ,6 ⵉⵢⵢⵉⵔⵏ:6 ⵉⵢⵢⵉⵔⵏ,1 ⵓⵙⴳⴳⴰⵙ:1 ⵓⵙⴳⴳⴰⵙ,ⴰⵔⵓⵙⵎⵉⵍ:ⴰⵔⵓⵙⵎⵉⵍ",
        "blocklist-reason": "ⵜⴰⵎⵏⵜⵉⵍⵜ",
        "exif-dc-contributor": "ⵉⵏⴰⵎⵓⵜⵏ",
        "exif-iimcategory-edu": "ⴰⵙⴳⵎⵉ",
        "exif-iimcategory-hth": "ⵜⴰⴷⵓⵙⵉ",
-       "namespacesall": "ⴰⴽⴽⵯ",
+       "namespacesall": "âµ\8eâ´°âµ\95âµ\95â´°",
        "monthsall": "ⵎⴰⵕⵕⴰ",
        "confirm_purge_button": "ⵡⴰⵅⵅⴰ",
        "confirm-watch-button": "ⵡⴰⵅⵅⴰ",
        "imgmultigo": "ⴷⴷⵓ!",
        "imgmultigoto": "ⴷⴷⵓ ⵖⵔ ⵜⴰⵙⵏⴰ ⴰⴷ $1",
        "img-lang-default": "(ⵜⵓⵜⵍⴰⵢⵜ ⵙ ⵓⵡⵏⵓⵍ)",
+       "img-lang-go": "ⴷⴷⵓ",
+       "table_pager_limit_submit": "ⴷⴷⵓ",
+       "watchlistedit-clear-explain": "ⵎⴰⵕⵕⴰ",
        "watchlisttools-clear": "ⵙⴼⴹ ⵜⴰⵍⴳⴰⵎⵜ ⵏ ⵓⴹⴼⴼⵓⵔ",
        "watchlisttools-view": "ⵙⴽⵏ ⵉⵙⵏⵉⴼⵉⵍⵏ ⴷ ⵢⵓⵙⴰⵏ",
        "watchlisttools-edit": "ⵥⵕ ⴷ ⵜⵙⵏⴼⵍⴷ ⵜⴰⵍⴳⴰⵎⵜ ⵏ ⵓⴹⴼⴼⵓⵔ",
        "pagelang-name": "ⵜⴰⵙⵏⴰ",
        "pagelang-language": "ⵜⵓⵜⵍⴰⵢⵜ",
        "right-pagelang": "ⵙⵏⴼⵍ ⵜⵓⵜⵍⴰⵢⵜ ⵏ ⵜⴰⵙⵏⴰ",
+       "mediastatistics-header-total": "ⵎⴰⵕⵕⴰ ⵉⴼⵓⵍⵢⴰ",
+       "log-action-filter-all": "ⵎⴰⵕⵕⴰ",
+       "authmanager-authplugin-setpass-denied": "ⵎⴰⵕⵕⴰ",
        "authmanager-email-label": "ⵉⵎⴰⵢⵍ",
        "authmanager-realname-label": "ⵉⵙⵎ ⴰⵎⴷⴷⴰⵜ",
        "authmanager-realname-help": "ⵉⵙⵎ ⴰⵎⴷⴷⴰⵜ ⵏ ⵓⵏⵙⵙⵔⵎⵙ",
index 0bc666c..fad61bf 100644 (file)
@@ -98,7 +98,8 @@
                        "逆襲的天邪鬼",
                        "WhitePhosphorus",
                        "A2093064",
-                       "EagerLin"
+                       "EagerLin",
+                       "Deathkon"
                ]
        },
        "tog-underline": "链接下划线:",
        "resetpass-submit-loggedin": "更改密码",
        "resetpass-submit-cancel": "取消",
        "resetpass-wrong-oldpass": "临时密码或当前密码无效。您可能已经更改了您的密码,或者请求了新的临时密码。",
-       "resetpass-recycled": "请更改您的密码为与当前密码不同的密码。",
+       "resetpass-recycled": "请将您的密码更改为除当前密码以外的其他密码。",
        "resetpass-temp-emailed": "您使用了通过电子邮件发送的临时密码登录。要完成登录,您必须在此设置一个新密码:",
        "resetpass-temp-password": "临时密码:",
        "resetpass-abort-generic": "密码更改已经被扩展程序中止。",
        "converter-manual-rule-error": "在手动语言转换规则中检测到错误",
        "undo-success": "该编辑可以被撤销。请检查下面的对比以核实您想要撤销的内容,然后保存下面的更改以完成撤销。",
        "undo-failure": "因存在冲突的中间编辑,本编辑不能撤销。",
+       "undo-main-slot-only": "编辑无法撤销,因为其涉及主位置以外的内容。",
        "undo-norev": "该编辑无法撤消,因为它不存在或已被删除。",
        "undo-nochange": "这次编辑似乎已被撤销。",
        "undo-summary": "撤销[[Special:Contributions/$2|$2]]([[User talk:$2|讨论]])的版本$1",
        "rcfilters-activefilters": "应用的过滤器",
        "rcfilters-activefilters-hide": "隐藏",
        "rcfilters-activefilters-show": "显示",
+       "rcfilters-activefilters-hide-tooltip": "隐藏激活过滤器区域",
+       "rcfilters-activefilters-show-tooltip": "显示激活过滤器区域",
        "rcfilters-advancedfilters": "高级过滤器",
        "rcfilters-limit-title": "要显示的结果",
        "rcfilters-limit-and-date-label": "$1次{{PLURAL:$1|更改}},$2",
index 626a454..a6c497a 100644 (file)
        "tog-watchlisthidebots": "隱藏監視清單中機器人的編輯",
        "tog-watchlisthideminor": "隱藏監視清單中的次要修訂",
        "tog-watchlisthideliu": "隱藏監視清單中已登入使用者的編輯",
-       "tog-watchlistreloadautomatically": "查詢條件變更時自動重新讀取監視清單(需要使用 JavaScript)",
+       "tog-watchlistreloadautomatically": "篩選條件變更時自動重新讀取監視清單(需要使用 JavaScript)",
        "tog-watchlistunwatchlinks": "為帶有變更的監試頁面添加直接(取消)監視標記({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}),需要 JavaScript 來打開功能",
        "tog-watchlisthideanons": "隱藏監視清單中匿名使用者的編輯",
        "tog-watchlisthidepatrolled": "隱藏監視清單中已巡查的編輯",
        "thu": "四",
        "fri": "五",
        "sat": "六",
-       "january": "1月",
+       "january": "月",
        "february": "二月",
        "march": "三月",
        "april": "四月",
        "september": "九月",
        "october": "十月",
        "november": "十一月",
-       "december": "12月",
+       "december": "十二月",
        "january-gen": "一月",
        "february-gen": "二月",
        "march-gen": "三月",
        "helppage-top-gethelp": "說明",
        "mainpage": "首頁",
        "mainpage-description": "首頁",
-       "policy-url": "Project:Policy",
+       "policy-url": "Project:方針",
        "portal": "社群入口",
        "portal-url": "Project:社群入口",
        "privacy": "隱私政策",
        "converter-manual-rule-error": "手動語言轉換規則時偵測到錯誤",
        "undo-success": "此編輯可以被還原。\n請檢查以下比較表,確認您是否要還原,然後儲存以下變更以完成編輯還原。",
        "undo-failure": "由於編輯的修訂間有衝突,此編輯不能還原。",
+       "undo-main-slot-only": "編輯無法還原,因為有包含到在主分配之外的內容。",
        "undo-norev": "此編輯不存在或已被刪除,無法還原。",
        "undo-nochange": "此編輯已被還原。",
        "undo-summary": "取消由 [[Special:Contributions/$2|$2]] ([[User talk:$2|對話]]) 所作出的修訂 $1",
        "revdelete-text-file": "已刪除的檔案版本仍會出現於檔案歷史中,但內容將不開放存取。",
        "logdelete-text": "已刪除的日誌活動仍會出現於日誌中,但其部分內容將不會向公眾開放存取。",
        "revdelete-text-others": "若未設定額外條件,其他管理員仍有權限檢視與取消刪除隱藏的內容。",
-       "revdelete-confirm": "è«\8b確èª\8dæ\82¨æ\98¯å\90¦æ\98\8eç\99½æ­¤å\8b\95ä½\9cæ\9c\83é\80 æ\88\90ç\9a\84å¾\8cæ\9e\9cï¼\8c以å\8f\8aæ\82¨æ\89\80å\81\9aç\9a\84å\8b\95ä½\9cæ\98¯å\90¦ç¬¦å\90\88[[{{MediaWiki:Policy-url}}|æ\94¿ç­\96]]規範。",
+       "revdelete-confirm": "è«\8b確èª\8dæ\82¨æ\98¯å\90¦æ\98\8eç\99½æ­¤å\8b\95ä½\9cæ\9c\83é\80 æ\88\90ç\9a\84å¾\8cæ\9e\9cï¼\8c以å\8f\8aæ\82¨æ\89\80å\81\9aç\9a\84å\8b\95ä½\9cæ\98¯å\90¦ç¬¦å\90\88[[{{MediaWiki:Policy-url}}|æ\96¹é\87\9d]]規範。",
        "revdelete-suppress-text": "禁止顯示應<strong>只有</strong>在下述情形時使用:\n* 潛在誹謗的資訊\n* 不恰當的個人資料\n*: <em>住家地址、電話號碼、身分證號碼等。</em>",
        "revdelete-legend": "設定顯示限制",
        "revdelete-hide-text": "修訂文字",
        "rcfilters-legend-heading": "<strong>縮寫列表:</strong>",
        "rcfilters-other-review-tools": "其他檢閱工具",
        "rcfilters-group-results-by-page": "按頁面分組結果",
-       "rcfilters-activefilters": "使用的篩選",
+       "rcfilters-activefilters": "使用的篩選",
        "rcfilters-activefilters-hide": "隱藏",
        "rcfilters-activefilters-show": "顯示",
-       "rcfilters-advancedfilters": "進階查詢條件",
+       "rcfilters-activefilters-hide-tooltip": "隱藏使用的篩選區域",
+       "rcfilters-activefilters-show-tooltip": "顯示使用的篩選區域",
+       "rcfilters-advancedfilters": "進階篩選條件",
        "rcfilters-limit-title": "要顯示的結果",
        "rcfilters-limit-and-date-label": "$1次{{PLURAL:$1|變更}},$2",
        "rcfilters-date-popup-title": "搜尋的時間段",
        "rcfilters-days-show-days": "$1{{PLURAL:$1|天}}",
        "rcfilters-days-show-hours": "$1{{PLURAL:$1|小時}}",
        "rcfilters-highlighted-filters-list": "已明顯標示:$1",
-       "rcfilters-quickfilters": "儲存的查詢條件",
+       "rcfilters-quickfilters": "儲存的篩選條件",
        "rcfilters-quickfilters-placeholder-title": "尚未保存過濾器",
-       "rcfilters-quickfilters-placeholder-description": "要儲存您的篩選器設定並供以後重新使用,點選下方啟用的篩選器區域之內的書籤圖示。",
+       "rcfilters-quickfilters-placeholder-description": "要儲存您的篩選設定並供以後重新使用,點選下方啟用的篩選區域之內的書籤圖示。",
        "rcfilters-savedqueries-defaultlabel": "已儲存的查詢條件",
        "rcfilters-savedqueries-rename": "重新命名",
        "rcfilters-savedqueries-setdefault": "設為預設",
        "rcfilters-savedqueries-unsetdefault": "取消設為預設",
        "rcfilters-savedqueries-remove": "刪除",
        "rcfilters-savedqueries-new-name-label": "名稱",
-       "rcfilters-savedqueries-new-name-placeholder": "說明查詢條件的用途",
+       "rcfilters-savedqueries-new-name-placeholder": "說明篩選條件的用途",
        "rcfilters-savedqueries-apply-label": "建立查詢條件",
-       "rcfilters-savedqueries-apply-and-setdefault-label": "建立預設過濾器",
+       "rcfilters-savedqueries-apply-and-setdefault-label": "建立預設篩選",
        "rcfilters-savedqueries-cancel-label": "取消",
-       "rcfilters-savedqueries-add-new-title": "儲存目前的過濾器設定",
-       "rcfilters-savedqueries-already-saved": "這些過濾已被儲存。變更您的設定,來建立新的已儲存過濾。",
+       "rcfilters-savedqueries-add-new-title": "儲存目前的篩選設定",
+       "rcfilters-savedqueries-already-saved": "這些篩選已被儲存。變更您的設定,來建立新的已儲存篩選。",
        "rcfilters-restore-default-filters": "還原預設過濾條件",
-       "rcfilters-clear-all-filters": "清除所有過濾條件",
+       "rcfilters-clear-all-filters": "清除所有篩選條件",
        "rcfilters-show-new-changes": "檢視最新變更",
-       "rcfilters-search-placeholder": "過濾變更(使用選單或搜尋過濾名稱)",
-       "rcfilters-invalid-filter": "無效的過濾條件",
+       "rcfilters-search-placeholder": "篩選變更(使用選單或搜尋篩選名稱)",
+       "rcfilters-invalid-filter": "無效的篩選條件",
        "rcfilters-empty-filter": "沒有使用中的過濾條件。已顯示所有的貢獻。",
-       "rcfilters-filterlist-title": "過濾條件",
+       "rcfilters-filterlist-title": "篩選",
        "rcfilters-filterlist-whatsthis": "這些是怎樣工作的?",
-       "rcfilters-filterlist-feedbacklink": "告訴我們您對這些過濾工具有什麼想法",
+       "rcfilters-filterlist-feedbacklink": "告訴我們您對這些篩選工具有什麼想法",
        "rcfilters-highlightbutton-title": "明顯標示結果",
        "rcfilters-highlightmenu-title": "選擇顏色",
        "rcfilters-highlightmenu-help": "選擇要明顯標示此屬性的色彩",
-       "rcfilters-filterlist-noresults": "查無過濾條件",
+       "rcfilters-filterlist-noresults": "查無篩選條件",
        "rcfilters-noresults-conflict": "因搜尋條件衝突,查無結果",
-       "rcfilters-state-message-subset": "此過濾條件沒有效果,因其結果包含了以下範圍更廣的{{PLURAL:$2|過濾條件|過濾條件}}其中之一 (嘗試以明顯標示來區別它):$1",
-       "rcfilters-state-message-fullcoverage": "選擇在此群組中的所有過濾條件與沒選擇時相同,代表此過濾條件沒有效果。群組包含了:$1",
+       "rcfilters-state-message-subset": "此篩選條件沒有效果,因其結果包含了以下範圍更廣的{{PLURAL:$2|篩選條件|篩選條件}}其中之一(嘗試以明顯標示來區別它):$1",
+       "rcfilters-state-message-fullcoverage": "選擇在此群組中的所有篩選條件與沒選擇時相同,代表此篩選條件沒有效果。群組包含了:$1",
        "rcfilters-filtergroup-authorship": "貢獻的作者",
        "rcfilters-filter-editsbyself-label": "您的編輯",
        "rcfilters-filter-editsbyself-description": "您的貢獻",
        "rcfilters-filter-categorization-description": "從分類中添加或移除頁面的記錄。",
        "rcfilters-filter-logactions-label": "日誌動作",
        "rcfilters-filter-logactions-description": "管理動作、帳號建立、頁面刪除、上傳…",
-       "rcfilters-hideminor-conflicts-typeofchange-global": "\"次要編輯\" 過濾條件與一個或多個變更類型過濾條件衝突,因為某些變更類型無法指定為 \"次要\"。衝突的過濾條件已在上方使用的過濾條件區域中標示。",
-       "rcfilters-hideminor-conflicts-typeofchange": "某些變更類型無法指定為 \"次要\",所以此過濾條件與以下變更類型的過濾條件衝突:$1",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "\"次要編輯\" 過濾條件與一個或多個變更類型篩選條件衝突,因為某些變更類型無法指定為 \"次要\"。衝突的篩選條件已在上方使用的篩選條件區域中標示。",
+       "rcfilters-hideminor-conflicts-typeofchange": "某些變更類型無法指定為 \"次要\",所以此篩選條件與以下變更類型的篩選條件衝突:$1",
        "rcfilters-typeofchange-conflicts-hideminor": "此變更類型過濾條件與 \"次要編輯\" 過濾條件衝突,某些變更類型無法指定為 \"次要\"。",
        "rcfilters-filtergroup-lastRevision": "最新修訂版本",
        "rcfilters-filter-lastrevision-label": "最新修訂版本",
        "rcfilters-exclude-button-off": "排除選項",
        "rcfilters-exclude-button-on": "排除所選",
        "rcfilters-view-tags": "標記的編輯",
-       "rcfilters-view-namespaces-tooltip": "按命名空間過濾結果",
+       "rcfilters-view-namespaces-tooltip": "按命名空間篩選結果",
        "rcfilters-view-tags-tooltip": "按編輯標籤過濾結果",
-       "rcfilters-view-return-to-default-tooltip": "返回主過濾選單",
+       "rcfilters-view-return-to-default-tooltip": "返回主篩選選單",
        "rcfilters-view-tags-help-icon-tooltip": "了解更多關於標記編輯的資訊",
        "rcfilters-liveupdates-button": "動態更新",
        "rcfilters-liveupdates-button-title-on": "關閉動態更新",
        "uploaded-wrong-setting-svg": "於已上傳的 SVG 檔案中找到 <code>&lt;set to=\"$1\"&gt;</code>,已禁止使用 \"set\" 標籤加入 remote/data/script 目標至任何屬性。",
        "uploaded-setting-handler-svg": "於已上傳的 SVG 檔案中找到 <code>$1=\"$2\"</code>,已禁止 SVG 使用 remote/data/script 設定 \"handler\" 屬性。",
        "uploaded-remote-url-svg": "於已上傳的 SVG 檔案中找到 <code>$1=\"$2\"</code>,已禁止 SVG 使用任何遠端 URL 設定樣式。",
-       "uploaded-image-filter-svg": "於已上傳的 SVG 檔案中找到圖片過濾器使用 URL:<code>&lt;$1 $2=\"$3\"&gt;</code>。",
+       "uploaded-image-filter-svg": "於已上傳的 SVG 檔案中找到以 URL 形式的圖片篩選:<code>&lt;$1 $2=\"$3\"&gt;</code>。",
        "uploadscriptednamespace": "此 SVG 檔案使用了非法的命名空間 \"<nowiki>$1</nowiki>\"。",
        "uploadinvalidxml": "無法解析已上傳檔案中的 XML。",
        "uploadvirus": "該檔案含有病毒!\n詳細資料:$1",
        "filedelete-maintenance": "維護期間檔案刪除和還原暫停使用。",
        "filedelete-maintenance-title": "無法刪除檔案",
        "mimesearch": "MIME 搜尋",
-       "mimesearch-summary": "本頁面可搜尋檔案的 MIME 類型。\n輸入格式:內容類型/子類型 或 內容類型/*,如 <code>image/jpeg</code>。",
+       "mimesearch-summary": "本頁面可篩選檔案的 MIME 類型。\n輸入格式:內容類型/子類型 或 內容類型/*,如 <code>image/jpeg</code>。",
        "mimetype": "MIME 類型:",
        "download": "下載",
        "unwatchedpages": "未監視的頁面",
        "whatlinkshere-hidetrans": "$1 引用",
        "whatlinkshere-hidelinks": "$1 連結",
        "whatlinkshere-hideimages": "$1 檔案連結",
-       "whatlinkshere-filters": "篩選",
+       "whatlinkshere-filters": "篩選",
        "whatlinkshere-submit": "前往",
        "autoblockid": "自動封鎖 #$1",
        "block": "封鎖使用者",
        "allmessages-filter-unmodified": "未修改",
        "allmessages-filter-all": "全部",
        "allmessages-filter-modified": "已修改",
-       "allmessages-prefix": "依字首搜尋:",
+       "allmessages-prefix": "依字首篩選:",
        "allmessages-language": "語言:",
        "allmessages-filter-submit": "執行",
        "allmessages-filter-translate": "翻譯",
index 9ad5951..93260fe 100644 (file)
@@ -73,3 +73,5 @@ $magicWords = [
        'special'                   => [ '0', 'цастәи', 'служебная', 'special' ],
        'index'                     => [ '1', '__АИНДЕКС__', '__ИНДЕКС__', '__INDEX__' ],
 ];
+
+$linkTrail = '/^([a-zабвгҕдежзӡикқҟлмнопҧрстҭуфхҳцҵчҷҽҿшыҩџьә]+)(.*)$/sDu';
index 39f8c2a..245bb47 100644 (file)
@@ -1143,6 +1143,8 @@ abstract class Maintenance {
                }
                if ( $this->hasOption( 'dbgroupdefault' ) ) {
                        $wgDBDefaultGroup = $this->getOption( 'dbgroupdefault', null );
+
+                       MediaWikiServices::getInstance()->getDBLoadBalancerFactory()->destroy();
                }
 
                if ( $this->getDbType() == self::DB_ADMIN && isset( $wgDBadminuser ) ) {
index f19a69b..8475dca 100644 (file)
@@ -43,8 +43,8 @@
        </script>
        <script src="modules/lib/jquery/jquery.js"></script>
        <script src="modules/src/mediawiki/mediawiki.js"></script>
-       <script src="modules/src/mediawiki/mediawiki.base.js"></script>
-       <script src="modules/src/mediawiki/mediawiki.errorLogger.js"></script>
+       <script src="modules/src/mediawiki.base/mediawiki.base.js"></script>
+       <script src="modules/src/mediawiki.base/mediawiki.errorLogger.js"></script>
        <script src="modules/lib/oojs/oojs.jquery.js"></script>
        <script src="modules/lib/oojs-ui/oojs-ui-core.js"></script>
        <script src="modules/lib/oojs-ui/oojs-ui-widgets.js"></script>
index 69e9a2b..44b028d 100644 (file)
@@ -228,6 +228,7 @@ return [
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'jquery.hidpi' => [
+               'deprecated' => 'Use of the srcset polyfill is deprecated since MediaWiki 1.32.0',
                'scripts' => 'resources/src/jquery/jquery.hidpi.js',
                'targets' => [ 'desktop', 'mobile' ],
        ],
@@ -848,12 +849,18 @@ return [
                'scripts' => [
                        'resources/src/mediawiki/mediawiki.js',
                        'resources/src/mediawiki/mediawiki.requestIdleCallback.js',
-                       'resources/src/mediawiki/mediawiki.errorLogger.js',
-                       'resources/src/mediawiki/mediawiki.base.js',
                ],
                'debugScripts' => 'resources/src/mediawiki/mediawiki.log.js',
                'targets' => [ 'desktop', 'mobile' ],
        ],
+       'mediawiki.base' => [
+               // Keep in sync with maintenance/jsduck/eg-iframe.html
+               'scripts' => [
+                       'resources/src/mediawiki.base/mediawiki.errorLogger.js',
+                       'resources/src/mediawiki.base/mediawiki.base.js',
+               ],
+               'targets' => [ 'desktop', 'mobile' ],
+       ],
        'mediawiki.apihelp' => [
                'styles' => 'resources/src/mediawiki.apihelp.css',
                'targets' => [ 'desktop' ],
@@ -1045,12 +1052,6 @@ return [
                ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
-       'mediawiki.hidpi' => [
-               'scripts' => 'resources/src/mediawiki.hidpi/hidpi.js',
-               'dependencies' => 'jquery.hidpi',
-               'skipFunction' => 'resources/src/mediawiki.hidpi/skip.js',
-               'targets' => [ 'desktop', 'mobile' ],
-       ],
        'mediawiki.hlist' => [
                'targets' => [ 'desktop', 'mobile' ],
                'styles' => [
@@ -1889,6 +1890,8 @@ return [
                        'rcfilters-activefilters',
                        'rcfilters-activefilters-hide',
                        'rcfilters-activefilters-show',
+                       'rcfilters-activefilters-hide-tooltip',
+                       'rcfilters-activefilters-show-tooltip',
                        'rcfilters-advancedfilters',
                        'rcfilters-group-results-by-page',
                        'rcfilters-limit-title',
@@ -2765,12 +2768,6 @@ return [
                ],
        ],
 
-       /* dom-level2-shim */
-       'dom-level2-shim' => [
-               'deprecated' => 'Use of the "dom-level2-shim" module is deprecated since MediaWiki 1.29.0',
-               'targets' => [ 'desktop', 'mobile' ],
-       ],
-
        /**
         * html5shiv
         *
diff --git a/resources/src/mediawiki.base/mediawiki.base.js b/resources/src/mediawiki.base/mediawiki.base.js
new file mode 100644 (file)
index 0000000..ed24af3
--- /dev/null
@@ -0,0 +1,644 @@
+/*!
+ * This file is currently loaded as part of the 'mediawiki' module and therefore
+ * concatenated to mediawiki.js and executed at the same time. This file exists
+ * to help prepare for splitting up the 'mediawiki' module.
+ * This effort is tracked at https://phabricator.wikimedia.org/T192623
+ *
+ * In short:
+ *
+ * - mediawiki.js will be reduced to the minimum needed to define mw.loader and
+ *   mw.config, and then moved to its own private "mediawiki.loader" module that
+ *   can be embedded within the StartupModule response.
+ *
+ * - mediawiki.base.js and other files in this directory will remain part of the
+ *   "mediawiki" module, and will remain a default/implicit dependency for all
+ *   regular modules, just like jquery and wikibits already are.
+ */
+/* globals mw */
+( function () {
+       'use strict';
+
+       var slice = Array.prototype.slice,
+               mwLoaderTrack = mw.track,
+               trackCallbacks = $.Callbacks( 'memory' ),
+               trackHandlers = [],
+               hasOwn = Object.prototype.hasOwnProperty;
+
+       /**
+        * Object constructor for messages.
+        *
+        * Similar to the Message class in MediaWiki PHP.
+        *
+        * Format defaults to 'text'.
+        *
+        *     @example
+        *
+        *     var obj, str;
+        *     mw.messages.set( {
+        *         'hello': 'Hello world',
+        *         'hello-user': 'Hello, $1!',
+        *         'welcome-user': 'Welcome back to $2, $1! Last visit by $1: $3'
+        *     } );
+        *
+        *     obj = new mw.Message( mw.messages, 'hello' );
+        *     mw.log( obj.text() );
+        *     // Hello world
+        *
+        *     obj = new mw.Message( mw.messages, 'hello-user', [ 'John Doe' ] );
+        *     mw.log( obj.text() );
+        *     // Hello, John Doe!
+        *
+        *     obj = new mw.Message( mw.messages, 'welcome-user', [ 'John Doe', 'Wikipedia', '2 hours ago' ] );
+        *     mw.log( obj.text() );
+        *     // Welcome back to Wikipedia, John Doe! Last visit by John Doe: 2 hours ago
+        *
+        *     // Using mw.message shortcut
+        *     obj = mw.message( 'hello-user', 'John Doe' );
+        *     mw.log( obj.text() );
+        *     // Hello, John Doe!
+        *
+        *     // Using mw.msg shortcut
+        *     str = mw.msg( 'hello-user', 'John Doe' );
+        *     mw.log( str );
+        *     // Hello, John Doe!
+        *
+        *     // Different formats
+        *     obj = new mw.Message( mw.messages, 'hello-user', [ 'John "Wiki" <3 Doe' ] );
+        *
+        *     obj.format = 'text';
+        *     str = obj.toString();
+        *     // Same as:
+        *     str = obj.text();
+        *
+        *     mw.log( str );
+        *     // Hello, John "Wiki" <3 Doe!
+        *
+        *     mw.log( obj.escaped() );
+        *     // Hello, John &quot;Wiki&quot; &lt;3 Doe!
+        *
+        * @class mw.Message
+        *
+        * @constructor
+        * @param {mw.Map} map Message store
+        * @param {string} key
+        * @param {Array} [parameters]
+        */
+       function Message( map, key, parameters ) {
+               this.format = 'text';
+               this.map = map;
+               this.key = key;
+               this.parameters = parameters === undefined ? [] : slice.call( parameters );
+               return this;
+       }
+
+       Message.prototype = {
+               /**
+                * Get parsed contents of the message.
+                *
+                * The default parser does simple $N replacements and nothing else.
+                * This may be overridden to provide a more complex message parser.
+                * The primary override is in the mediawiki.jqueryMsg module.
+                *
+                * This function will not be called for nonexistent messages.
+                *
+                * @return {string} Parsed message
+                */
+               parser: function () {
+                       return mw.format.apply( null, [ this.map.get( this.key ) ].concat( this.parameters ) );
+               },
+
+               /**
+                * Add (does not replace) parameters for `$N` placeholder values.
+                *
+                * @param {Array} parameters
+                * @return {mw.Message}
+                * @chainable
+                */
+               params: function ( parameters ) {
+                       var i;
+                       for ( i = 0; i < parameters.length; i++ ) {
+                               this.parameters.push( parameters[ i ] );
+                       }
+                       return this;
+               },
+
+               /**
+                * Convert message object to its string form based on current format.
+                *
+                * @return {string} Message as a string in the current form, or `<key>` if key
+                *  does not exist.
+                */
+               toString: function () {
+                       var text;
+
+                       if ( !this.exists() ) {
+                               // Use ⧼key⧽ as text if key does not exist
+                               // Err on the side of safety, ensure that the output
+                               // is always html safe in the event the message key is
+                               // missing, since in that case its highly likely the
+                               // message key is user-controlled.
+                               // '⧼' is used instead of '<' to side-step any
+                               // double-escaping issues.
+                               // (Keep synchronised with Message::toString() in PHP.)
+                               return '⧼' + mw.html.escape( this.key ) + '⧽';
+                       }
+
+                       if ( this.format === 'plain' || this.format === 'text' || this.format === 'parse' ) {
+                               text = this.parser();
+                       }
+
+                       if ( this.format === 'escaped' ) {
+                               text = this.parser();
+                               text = mw.html.escape( text );
+                       }
+
+                       return text;
+               },
+
+               /**
+                * Change format to 'parse' and convert message to string
+                *
+                * If jqueryMsg is loaded, this parses the message text from wikitext
+                * (where supported) to HTML
+                *
+                * Otherwise, it is equivalent to plain.
+                *
+                * @return {string} String form of parsed message
+                */
+               parse: function () {
+                       this.format = 'parse';
+                       return this.toString();
+               },
+
+               /**
+                * Change format to 'plain' and convert message to string
+                *
+                * This substitutes parameters, but otherwise does not change the
+                * message text.
+                *
+                * @return {string} String form of plain message
+                */
+               plain: function () {
+                       this.format = 'plain';
+                       return this.toString();
+               },
+
+               /**
+                * Change format to 'text' and convert message to string
+                *
+                * If jqueryMsg is loaded, {{-transformation is done where supported
+                * (such as {{plural:}}, {{gender:}}, {{int:}}).
+                *
+                * Otherwise, it is equivalent to plain
+                *
+                * @return {string} String form of text message
+                */
+               text: function () {
+                       this.format = 'text';
+                       return this.toString();
+               },
+
+               /**
+                * Change the format to 'escaped' and convert message to string
+                *
+                * This is equivalent to using the 'text' format (see #text), then
+                * HTML-escaping the output.
+                *
+                * @return {string} String form of html escaped message
+                */
+               escaped: function () {
+                       this.format = 'escaped';
+                       return this.toString();
+               },
+
+               /**
+                * Check if a message exists
+                *
+                * @see mw.Map#exists
+                * @return {boolean}
+                */
+               exists: function () {
+                       return this.map.exists( this.key );
+               }
+       };
+
+       /**
+        * @class mw
+        * @singleton
+        */
+
+       /**
+        * @inheritdoc mw.inspect#runReports
+        * @method
+        */
+       mw.inspect = function () {
+               var args = arguments;
+               mw.loader.using( 'mediawiki.inspect', function () {
+                       mw.inspect.runReports.apply( mw.inspect, args );
+               } );
+       };
+
+       /**
+        * Format a string. Replace $1, $2 ... $N with positional arguments.
+        *
+        * Used by Message#parser().
+        *
+        * @since 1.25
+        * @param {string} formatString Format string
+        * @param {...Mixed} parameters Values for $N replacements
+        * @return {string} Formatted string
+        */
+       mw.format = function ( formatString ) {
+               var parameters = slice.call( arguments, 1 );
+               return formatString.replace( /\$(\d+)/g, function ( str, match ) {
+                       var index = parseInt( match, 10 ) - 1;
+                       return parameters[ index ] !== undefined ? parameters[ index ] : '$' + match;
+               } );
+       };
+
+       // Expose Message constructor
+       mw.Message = Message;
+
+       /**
+        * Get a message object.
+        *
+        * Shortcut for `new mw.Message( mw.messages, key, parameters )`.
+        *
+        * @see mw.Message
+        * @param {string} key Key of message to get
+        * @param {...Mixed} parameters Values for $N replacements
+        * @return {mw.Message}
+        */
+       mw.message = function ( key ) {
+               var parameters = slice.call( arguments, 1 );
+               return new Message( mw.messages, key, parameters );
+       };
+
+       /**
+        * Get a message string using the (default) 'text' format.
+        *
+        * Shortcut for `mw.message( key, parameters... ).text()`.
+        *
+        * @see mw.Message
+        * @param {string} key Key of message to get
+        * @param {...Mixed} parameters Values for $N replacements
+        * @return {string}
+        */
+       mw.msg = function () {
+               return mw.message.apply( mw.message, arguments ).toString();
+       };
+
+       /**
+        * Track an analytic event.
+        *
+        * This method provides a generic means for MediaWiki JavaScript code to capture state
+        * information for analysis. Each logged event specifies a string topic name that describes
+        * the kind of event that it is. Topic names consist of dot-separated path components,
+        * arranged from most general to most specific. Each path component should have a clear and
+        * well-defined purpose.
+        *
+        * Data handlers are registered via `mw.trackSubscribe`, and receive the full set of
+        * events that match their subcription, including those that fired before the handler was
+        * bound.
+        *
+        * @param {string} topic Topic name
+        * @param {Object} [data] Data describing the event, encoded as an object
+        */
+       mw.track = function ( topic, data ) {
+               mwLoaderTrack( topic, data );
+               trackCallbacks.fire( mw.trackQueue );
+       };
+
+       /**
+        * Register a handler for subset of analytic events, specified by topic.
+        *
+        * Handlers will be called once for each tracked event, including any events that fired before the
+        * handler was registered; 'this' is set to a plain object with a 'timeStamp' property indicating
+        * the exact time at which the event fired, a string 'topic' property naming the event, and a
+        * 'data' property which is an object of event-specific data. The event topic and event data are
+        * also passed to the callback as the first and second arguments, respectively.
+        *
+        * @param {string} topic Handle events whose name starts with this string prefix
+        * @param {Function} callback Handler to call for each matching tracked event
+        * @param {string} callback.topic
+        * @param {Object} [callback.data]
+        */
+       mw.trackSubscribe = function ( topic, callback ) {
+               var seen = 0;
+               function handler( trackQueue ) {
+                       var event;
+                       for ( ; seen < trackQueue.length; seen++ ) {
+                               event = trackQueue[ seen ];
+                               if ( event.topic.indexOf( topic ) === 0 ) {
+                                       callback.call( event, event.topic, event.data );
+                               }
+                       }
+               }
+
+               trackHandlers.push( [ handler, callback ] );
+
+               trackCallbacks.add( handler );
+       };
+
+       /**
+        * Stop handling events for a particular handler
+        *
+        * @param {Function} callback
+        */
+       mw.trackUnsubscribe = function ( callback ) {
+               trackHandlers = trackHandlers.filter( function ( fns ) {
+                       if ( fns[ 1 ] === callback ) {
+                               trackCallbacks.remove( fns[ 0 ] );
+                               // Ensure the tuple is removed to avoid holding on to closures
+                               return false;
+                       }
+                       return true;
+               } );
+       };
+
+       // Fire events from before track() triggred fire()
+       trackCallbacks.fire( mw.trackQueue );
+
+       /**
+        * Registry and firing of events.
+        *
+        * MediaWiki has various interface components that are extended, enhanced
+        * or manipulated in some other way by extensions, gadgets and even
+        * in core itself.
+        *
+        * This framework helps streamlining the timing of when these other
+        * code paths fire their plugins (instead of using document-ready,
+        * which can and should be limited to firing only once).
+        *
+        * Features like navigating to other wiki pages, previewing an edit
+        * and editing itself – without a refresh – can then retrigger these
+        * hooks accordingly to ensure everything still works as expected.
+        *
+        * Example usage:
+        *
+        *     mw.hook( 'wikipage.content' ).add( fn ).remove( fn );
+        *     mw.hook( 'wikipage.content' ).fire( $content );
+        *
+        * Handlers can be added and fired for arbitrary event names at any time. The same
+        * event can be fired multiple times. The last run of an event is memorized
+        * (similar to `$(document).ready` and `$.Deferred().done`).
+        * This means if an event is fired, and a handler added afterwards, the added
+        * function will be fired right away with the last given event data.
+        *
+        * Like Deferreds and Promises, the mw.hook object is both detachable and chainable.
+        * Thus allowing flexible use and optimal maintainability and authority control.
+        * You can pass around the `add` and/or `fire` method to another piece of code
+        * without it having to know the event name (or `mw.hook` for that matter).
+        *
+        *     var h = mw.hook( 'bar.ready' );
+        *     new mw.Foo( .. ).fetch( { callback: h.fire } );
+        *
+        * Note: Events are documented with an underscore instead of a dot in the event
+        * name due to jsduck not supporting dots in that position.
+        *
+        * @class mw.hook
+        */
+       mw.hook = ( function () {
+               var lists = {};
+
+               /**
+                * Create an instance of mw.hook.
+                *
+                * @method hook
+                * @member mw
+                * @param {string} name Name of hook.
+                * @return {mw.hook}
+                */
+               return function ( name ) {
+                       var list = hasOwn.call( lists, name ) ?
+                               lists[ name ] :
+                               lists[ name ] = $.Callbacks( 'memory' );
+
+                       return {
+                               /**
+                                * Register a hook handler
+                                *
+                                * @param {...Function} handler Function to bind.
+                                * @chainable
+                                */
+                               add: list.add,
+
+                               /**
+                                * Unregister a hook handler
+                                *
+                                * @param {...Function} handler Function to unbind.
+                                * @chainable
+                                */
+                               remove: list.remove,
+
+                               /**
+                                * Run a hook.
+                                *
+                                * @param {...Mixed} data
+                                * @return {mw.hook}
+                                * @chainable
+                                */
+                               fire: function () {
+                                       return list.fireWith.call( this, null, slice.call( arguments ) );
+                               }
+                       };
+               };
+       }() );
+
+       /**
+        * HTML construction helper functions
+        *
+        *     @example
+        *
+        *     var Html, output;
+        *
+        *     Html = mw.html;
+        *     output = Html.element( 'div', {}, new Html.Raw(
+        *         Html.element( 'img', { src: '<' } )
+        *     ) );
+        *     mw.log( output ); // <div><img src="&lt;"/></div>
+        *
+        * @class mw.html
+        * @singleton
+        */
+       mw.html = ( function () {
+               function escapeCallback( s ) {
+                       switch ( s ) {
+                               case '\'':
+                                       return '&#039;';
+                               case '"':
+                                       return '&quot;';
+                               case '<':
+                                       return '&lt;';
+                               case '>':
+                                       return '&gt;';
+                               case '&':
+                                       return '&amp;';
+                       }
+               }
+
+               return {
+                       /**
+                        * Escape a string for HTML.
+                        *
+                        * Converts special characters to HTML entities.
+                        *
+                        *     mw.html.escape( '< > \' & "' );
+                        *     // Returns &lt; &gt; &#039; &amp; &quot;
+                        *
+                        * @param {string} s The string to escape
+                        * @return {string} HTML
+                        */
+                       escape: function ( s ) {
+                               return s.replace( /['"<>&]/g, escapeCallback );
+                       },
+
+                       /**
+                        * Create an HTML element string, with safe escaping.
+                        *
+                        * @param {string} name The tag name.
+                        * @param {Object} [attrs] An object with members mapping element names to values
+                        * @param {string|mw.html.Raw|mw.html.Cdata|null} [contents=null] The contents of the element.
+                        *
+                        *  - string: Text to be escaped.
+                        *  - null: The element is treated as void with short closing form, e.g. `<br/>`.
+                        *  - this.Raw: The raw value is directly included.
+                        *  - this.Cdata: The raw value is directly included. An exception is
+                        *    thrown if it contains any illegal ETAGO delimiter.
+                        *    See <https://www.w3.org/TR/html401/appendix/notes.html#h-B.3.2>.
+                        * @return {string} HTML
+                        */
+                       element: function ( name, attrs, contents ) {
+                               var v, attrName, s = '<' + name;
+
+                               if ( attrs ) {
+                                       for ( attrName in attrs ) {
+                                               v = attrs[ attrName ];
+                                               // Convert name=true, to name=name
+                                               if ( v === true ) {
+                                                       v = attrName;
+                                                       // Skip name=false
+                                               } else if ( v === false ) {
+                                                       continue;
+                                               }
+                                               s += ' ' + attrName + '="' + this.escape( String( v ) ) + '"';
+                                       }
+                               }
+                               if ( contents === undefined || contents === null ) {
+                                       // Self close tag
+                                       s += '/>';
+                                       return s;
+                               }
+                               // Regular open tag
+                               s += '>';
+                               switch ( typeof contents ) {
+                                       case 'string':
+                                               // Escaped
+                                               s += this.escape( contents );
+                                               break;
+                                       case 'number':
+                                       case 'boolean':
+                                               // Convert to string
+                                               s += String( contents );
+                                               break;
+                                       default:
+                                               if ( contents instanceof this.Raw ) {
+                                                       // Raw HTML inclusion
+                                                       s += contents.value;
+                                               } else if ( contents instanceof this.Cdata ) {
+                                                       // CDATA
+                                                       if ( /<\/[a-zA-z]/.test( contents.value ) ) {
+                                                               throw new Error( 'mw.html.element: Illegal end tag found in CDATA' );
+                                                       }
+                                                       s += contents.value;
+                                               } else {
+                                                       throw new Error( 'mw.html.element: Invalid type of contents' );
+                                               }
+                               }
+                               s += '</' + name + '>';
+                               return s;
+                       },
+
+                       /**
+                        * Wrapper object for raw HTML passed to mw.html.element().
+                        *
+                        * @class mw.html.Raw
+                        * @constructor
+                        * @param {string} value
+                        */
+                       Raw: function ( value ) {
+                               this.value = value;
+                       },
+
+                       /**
+                        * Wrapper object for CDATA element contents passed to mw.html.element()
+                        *
+                        * @class mw.html.Cdata
+                        * @constructor
+                        * @param {string} value
+                        */
+                       Cdata: function ( value ) {
+                               this.value = value;
+                       }
+               };
+       }() );
+
+       /**
+        * Execute a function as soon as one or more required modules are ready.
+        *
+        * Example of inline dependency on OOjs:
+        *
+        *     mw.loader.using( 'oojs', function () {
+        *         OO.compare( [ 1 ], [ 1 ] );
+        *     } );
+        *
+        * Example of inline dependency obtained via `require()`:
+        *
+        *     mw.loader.using( [ 'mediawiki.util' ], function ( require ) {
+        *         var util = require( 'mediawiki.util' );
+        *     } );
+        *
+        * Since MediaWiki 1.23 this also returns a promise.
+        *
+        * Since MediaWiki 1.28 the promise is resolved with a `require` function.
+        *
+        * @member mw.loader
+        * @param {string|Array} dependencies Module name or array of modules names the
+        *  callback depends on to be ready before executing
+        * @param {Function} [ready] Callback to execute when all dependencies are ready
+        * @param {Function} [error] Callback to execute if one or more dependencies failed
+        * @return {jQuery.Promise} With a `require` function
+        */
+       mw.loader.using = function ( dependencies, ready, error ) {
+               var deferred = $.Deferred();
+
+               // Allow calling with a single dependency as a string
+               if ( typeof dependencies === 'string' ) {
+                       dependencies = [ dependencies ];
+               }
+
+               if ( ready ) {
+                       deferred.done( ready );
+               }
+               if ( error ) {
+                       deferred.fail( error );
+               }
+
+               try {
+                       // Resolve entire dependency map
+                       dependencies = mw.loader.resolve( dependencies );
+               } catch ( e ) {
+                       return deferred.reject( e ).promise();
+               }
+
+               mw.loader.enqueue( dependencies, function () {
+                       deferred.resolve( mw.loader.require );
+               }, deferred.reject );
+
+               return deferred.promise();
+       };
+
+       // Alias $j to jQuery for backwards compatibility
+       // @deprecated since 1.23 Use $ or jQuery instead
+       mw.log.deprecate( window, '$j', $, 'Use $ or jQuery instead.' );
+}() );
diff --git a/resources/src/mediawiki.base/mediawiki.errorLogger.js b/resources/src/mediawiki.base/mediawiki.errorLogger.js
new file mode 100644 (file)
index 0000000..e86aff6
--- /dev/null
@@ -0,0 +1,58 @@
+/**
+ * Try to catch errors in modules which don't do their own error handling.
+ *
+ * @class mw.errorLogger
+ * @singleton
+ */
+( function ( mw ) {
+       'use strict';
+
+       mw.errorLogger = {
+               /**
+                * Fired via mw.track when an error is not handled by local code and is caught by the
+                * window.onerror handler.
+                *
+                * @event global_error
+                * @param {string} errorMessage Error errorMessage.
+                * @param {string} url URL where error was raised.
+                * @param {number} lineNumber Line number where error was raised.
+                * @param {number} [columnNumber] Line number where error was raised. Not all browsers
+                *   support this.
+                * @param {Error|Mixed} [errorObject] The error object. Typically an instance of Error, but anything
+                *   (even a primitive value) passed to a throw clause will end up here.
+                */
+
+               /**
+                * Install a window.onerror handler that will report via mw.track, while preserving
+                * any previous handler.
+                *
+                * @param {Object} window
+                */
+               installGlobalHandler: function ( window ) {
+                       // We will preserve the return value of the previous handler. window.onerror works the
+                       // opposite way than normal event handlers (returning true will prevent the default
+                       // action, returning false will let the browser handle the error normally, by e.g.
+                       // logging to the console), so our fallback old handler needs to return false.
+                       var oldHandler = window.onerror || function () { return false; };
+
+                       /**
+                        * Dumb window.onerror handler which forwards the errors via mw.track.
+                        *
+                        * @param {string} errorMessage
+                        * @param {string} url
+                        * @param {number} lineNumber
+                        * @param {number} [columnNumber]
+                        * @param {Error|Mixed} [errorObject]
+                        * @return {boolean} True to prevent the default action
+                        * @fires global_error
+                        */
+                       window.onerror = function ( errorMessage, url, lineNumber, columnNumber, errorObject ) {
+                               mw.track( 'global.error', { errorMessage: errorMessage, url: url,
+                                       lineNumber: lineNumber, columnNumber: columnNumber, errorObject: errorObject } );
+                               return oldHandler.apply( this, arguments );
+                       };
+               }
+       };
+
+       mw.errorLogger.installGlobalHandler( window );
+}( mediaWiki ) );
diff --git a/resources/src/mediawiki.hidpi/hidpi.js b/resources/src/mediawiki.hidpi/hidpi.js
deleted file mode 100644 (file)
index ecee450..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-jQuery( function ( $ ) {
-       // Apply hidpi images on DOM-ready
-       // Some may have already partly preloaded at low resolution.
-       $( 'body' ).hidpi();
-} );
diff --git a/resources/src/mediawiki.hidpi/skip.js b/resources/src/mediawiki.hidpi/skip.js
deleted file mode 100644 (file)
index 26b63c7..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-/*!
- * Skip function for mediawiki.hdpi.js.
- */
-return 'srcset' in new Image();
index cd3f684..3e900f0 100644 (file)
@@ -15,6 +15,8 @@
         * @cfg {string} savedQueriesPreferenceName Where to save the saved queries
         * @cfg {string} daysPreferenceName Preference name for the days filter
         * @cfg {string} limitPreferenceName Preference name for the limit filter
+        * @cfg {string} collapsedPreferenceName Preference name for collapsing and showing
+        *  the active filters area
         * @cfg {boolean} [normalizeTarget] Dictates whether or not to go through the
         *  title normalization to separate title subpage/parts into the target= url
         *  parameter
@@ -26,6 +28,7 @@
                this.savedQueriesPreferenceName = config.savedQueriesPreferenceName;
                this.daysPreferenceName = config.daysPreferenceName;
                this.limitPreferenceName = config.limitPreferenceName;
+               this.collapsedPreferenceName = config.collapsedPreferenceName;
                this.normalizeTarget = !!config.normalizeTarget;
 
                this.requestCounter = {};
                this.updateNumericPreference( 'usenewrc', Number( newValue ) );
        };
 
+       /**
+        * Update the collapsed state value
+        *
+        * @param {boolean} isCollapsed Filter area is collapsed
+        */
+       mw.rcfilters.Controller.prototype.updateCollapsedState = function ( isCollapsed ) {
+               this.updateNumericPreference( this.collapsedPreferenceName, Number( isCollapsed ) );
+       };
+
        /**
         * Update a numeric preference with a new value
         *
index d181532..c918df8 100644 (file)
@@ -15,6 +15,8 @@
                                savedQueriesPreferenceName = mw.config.get( 'wgStructuredChangeFiltersSavedQueriesPreferenceName' ),
                                daysPreferenceName = mw.config.get( 'wgStructuredChangeFiltersDaysPreferenceName' ),
                                limitPreferenceName = mw.config.get( 'wgStructuredChangeFiltersLimitPreferenceName' ),
+                               activeFiltersCollapsedName = mw.config.get( 'wgStructuredChangeFiltersCollapsedPreferenceName' ),
+                               initialCollapsedState = mw.config.get( 'wgStructuredChangeFiltersCollapsedState' ),
                                filtersModel = new mw.rcfilters.dm.FiltersViewModel(),
                                changesListModel = new mw.rcfilters.dm.ChangesListViewModel( $initialFieldset ),
                                savedQueriesModel = new mw.rcfilters.dm.SavedQueriesModel( filtersModel ),
@@ -25,6 +27,7 @@
                                                savedQueriesPreferenceName: savedQueriesPreferenceName,
                                                daysPreferenceName: daysPreferenceName,
                                                limitPreferenceName: limitPreferenceName,
+                                               collapsedPreferenceName: activeFiltersCollapsedName,
                                                normalizeTarget: specialPage === 'Recentchangeslinked'
                                        }
                                );
                                savedQueriesModel,
                                changesListModel,
                                {
+                                       $wrapper: $( 'body' ),
                                        $topSection: $topSection,
                                        $filtersContainer: $( '.rcfilters-container' ),
                                        $changesListContainer: $( '.mw-changeslist, .mw-changeslist-empty' ),
-                                       $formContainer: $initialFieldset
+                                       $formContainer: $initialFieldset,
+                                       collapsed: initialCollapsedState
                                }
                        );
 
index 11972de..fad409b 100644 (file)
@@ -5,7 +5,9 @@
 @rcfilters-spinner-size: 12px;
 @rcfilters-head-min-height: 210px;
 @rcfilters-head-margin-bottom: 20px;
-@rcfilters-wl-head-min-height: 270px;
+@rcfilters-wl-head-min-height: 295px;
+@rcfilters-head-min-height-collapsed: 130px;
+@rcfilters-wl-head-min-height-collapsed: 220px;
 
 // Corrections for the standard special page
 .client-js {
        // On the watchlist, reserve a bit more
        .mw-special-Watchlist .rcfilters-head {
                min-height: @rcfilters-wl-head-min-height;
+
+       }
+
+       .mw-rcfilters-collapsed {
+               .rcfilters-head {
+                       min-height: @rcfilters-head-min-height-collapsed;
+               }
+
+               // On the watchlist, reserve a bit more
+               &.mw-special-Watchlist .rcfilters-head {
+                       min-height: @rcfilters-wl-head-min-height-collapsed;
+               }
        }
 
        .mw-recentchanges-toplinks {
        body:not( .mw-rcfilters-ui-initialized ) .rcfilters-spinner {
                display: block;
                // When initializing, display the spinner on top of the area where the UI will appear
-               margin-top: -( @rcfilters-head-min-height + @rcfilters-head-margin-bottom ) / 2;
+               margin-top: -( @rcfilters-head-min-height + @rcfilters-head-margin-bottom ) / 1.5;
        }
        body.mw-rcfilters-ui-loading .rcfilters-spinner {
                display: block;
                // When loading new results, display the spinner on top of the results area
-               margin-top: 2em;
+               margin-top: -( @rcfilters-head-min-height + @rcfilters-head-margin-bottom ) / 8;
        }
 
        #contentSub,
        // space. This makes the min-height trick work better.
        .watchlistDetails {
                float: left;
+               // The 20em should match the min-width we are setting up
+               // for the .mw-rcfilters-ui-watchlistTopSectionWidget-editWatchlistButton
+               // in mw.rcfilters.ui.WatchlistTopSectionWidget.less
+               width: ~'calc( 100% - 20em )';
        }
 }
 
index 83ca2bd..7721275 100644 (file)
@@ -22,7 +22,7 @@
                line-height: normal;
        }
 
-       &-collapsed {
+       .mw-rcfilters-collapsed & {
                // Taking from the handle, since border-bottom is set on the
                // filters view which is hidden when collapsed
                border-bottom: 1px solid @colorGray10;
                        display: flex;
                        flex-wrap: nowrap;
                        justify-content: space-between;
-               }
 
-               &-title {
-                       padding: 0.6em 0; // Same top padding as the handle
-                       white-space: nowrap;
-                       min-width: 0; // This has to be here to enable the text truncation
-                       overflow: hidden;
-                       text-overflow: ellipsis;
-               }
+                       &-title {
+                               padding: 0.6em 0; // Same top padding as the handle
+                               flex: 0 0 auto;
+                       }
+                       &-queryName {
+                               flex: 1 1 auto;
+                               padding: 0.6em 0; // Same top padding as the handle
+                               white-space: nowrap;
+                               min-width: 0; // This has to be here to enable the text truncation
+                               overflow: hidden;
+                               text-overflow: ellipsis;
+                       }
 
-               &-hideshow {
-                       margin-left: 0.5em;
-                       padding-left: 0.5em;
+                       &-hideshow {
+                               flex: 0 0 auto;
+                               margin-left: 0.5em;
+                               padding-left: 0.5em;
+                       }
                }
 
                &-content {
                                overflow: hidden;
                                text-overflow: ellipsis;
                                white-space: nowrap;
+                               // This is necessary for Firefox to be able to
+                               // truncate the text. Without this rule, the label
+                               // is treated as if it's full-width, and while it is
+                               // being truncated with the overflow:hidden,
+                               // the ellipses isn't showing properly.
+                               // This rule seems to convince Firefox to re-render,
+                               // fix the label's width properly, and add the ellipses
+                               max-width: 100%;
                        }
                }
        }
index 4307c6f..52f7ff2 100644 (file)
@@ -7,6 +7,10 @@
 
        &-editWatchlistButton {
                vertical-align: bottom;
+               // Match the width that we are setting up for the loading
+               // of the .watchlistDetails in mw.rcfilters.less
+               min-width: 20em;
+               text-align: right;
 
                // actual button
                .oo-ui-buttonWidget {
index 5df7032..d59fdfb 100644 (file)
@@ -12,6 +12,9 @@
         * @param {mw.rcfilters.dm.SavedQueriesModel} savedQueriesModel Saved queries model
         * @param {Object} config Configuration object
         * @cfg {jQuery} [$overlay] A jQuery object serving as overlay for popups
+        * @cfg {jQuery} [$wrapper] A jQuery object for the wrapper of the general
+        *  system. If not given, falls back to this widget's $element
+        * @cfg {boolean} [collapsed] Filter area is collapsed
         */
        mw.rcfilters.ui.FilterTagMultiselectWidget = function MwRcfiltersUiFilterTagMultiselectWidget( controller, model, savedQueriesModel, config ) {
                var rcFiltersRow,
                this.model = model;
                this.queriesModel = savedQueriesModel;
                this.$overlay = config.$overlay || this.$element;
+               this.$wrapper = config.$wrapper || this.$element;
                this.matchingQuery = null;
                this.currentView = this.model.getCurrentView();
+               this.collapsed = false;
 
                // Parent
                mw.rcfilters.ui.FilterTagMultiselectWidget.parent.call( this, $.extend( true, {
                this.hideShowButton = new OO.ui.ButtonWidget( {
                        framed: false,
                        flags: [ 'progressive' ],
-                       label: mw.msg( 'rcfilters-activefilters-hide' ),
                        classes: [ 'mw-rcfilters-ui-filterTagMultiselectWidget-hideshowButton' ]
                } );
-               this.collapsed = false;
+               this.toggleCollapsed( !!config.collapsed );
 
                if ( !mw.user.isAnon() ) {
                        this.saveQueryButton = new mw.rcfilters.ui.SaveFiltersPopupButtonWidget(
                                .addClass( 'mw-rcfilters-ui-filterTagMultiselectWidget-wrapper-top' )
                                .append(
                                        $( '<div>' )
-                                               .addClass( 'mw-rcfilters-ui-filterTagMultiselectWidget-wrapper-title' )
-                                               .append(
-                                                       title.$element,
-                                                       this.savedQueryTitle.$element
-                                               ),
+                                               .addClass( 'mw-rcfilters-ui-filterTagMultiselectWidget-wrapper-top-title' )
+                                               .append( title.$element ),
                                        $( '<div>' )
-                                               .addClass( 'mw-rcfilters-ui-filterTagMultiselectWidget-wrapper-hideshow' )
+                                               .addClass( 'mw-rcfilters-ui-filterTagMultiselectWidget-wrapper-top-queryName' )
+                                               .append( this.savedQueryTitle.$element ),
+                                       $( '<div>' )
+                                               .addClass( 'mw-rcfilters-ui-filterTagMultiselectWidget-wrapper-top-hideshow' )
                                                .append(
                                                        this.hideShowButton.$element
                                                )
        mw.rcfilters.ui.FilterTagMultiselectWidget.prototype.toggleCollapsed = function ( isCollapsed ) {
                isCollapsed = isCollapsed === undefined ? !this.collapsed : !!isCollapsed;
 
-               if ( this.collapsed !== isCollapsed ) {
-                       this.collapsed = isCollapsed;
-
-                       if ( isCollapsed ) {
-                               // If we are collapsing, close the menu, in case it was open
-                               // We should make sure the menu closes before the rest of the elements
-                               // are hidden, otherwise there is an unknown error in jQuery as ooui
-                               // sets and unsets properties on the input (which is hidden at that point)
-                               this.menu.toggle( false );
-                       }
-                       this.input.setDisabled( isCollapsed );
-                       this.hideShowButton.setLabel( mw.msg(
-                               isCollapsed ? 'rcfilters-activefilters-show' : 'rcfilters-activefilters-hide'
-                       ) );
+               this.collapsed = isCollapsed;
 
-                       this.$element.toggleClass( 'mw-rcfilters-ui-filterTagMultiselectWidget-collapsed', isCollapsed );
+               if ( isCollapsed ) {
+                       // If we are collapsing, close the menu, in case it was open
+                       // We should make sure the menu closes before the rest of the elements
+                       // are hidden, otherwise there is an unknown error in jQuery as ooui
+                       // sets and unsets properties on the input (which is hidden at that point)
+                       this.menu.toggle( false );
                }
+               this.input.setDisabled( isCollapsed );
+               this.hideShowButton.setLabel( mw.msg(
+                       isCollapsed ? 'rcfilters-activefilters-show' : 'rcfilters-activefilters-hide'
+               ) );
+               this.hideShowButton.setTitle( mw.msg(
+                       isCollapsed ? 'rcfilters-activefilters-show-tooltip' : 'rcfilters-activefilters-hide-tooltip'
+               ) );
+
+               // Toggle the wrapper class, so we have min height values correctly throughout
+               this.$wrapper.toggleClass( 'mw-rcfilters-collapsed', isCollapsed );
+
+               // Save the state
+               this.controller.updateCollapsedState( isCollapsed );
        };
 
        /**
index dba24fc..a5a8187 100644 (file)
@@ -13,6 +13,9 @@
         * @param {Object} [config] Configuration object
         * @cfg {Object} [filters] A definition of the filter groups in this list
         * @cfg {jQuery} [$overlay] A jQuery object serving as overlay for popups
+        * @cfg {jQuery} [$wrapper] A jQuery object for the wrapper of the general
+        *  system. If not given, falls back to this widget's $element
+        * @cfg {boolean} [collapsed] Filter area is collapsed
         */
        mw.rcfilters.ui.FilterWrapperWidget = function MwRcfiltersUiFilterWrapperWidget(
                controller, model, savedQueriesModel, changesListModel, config
                this.queriesModel = savedQueriesModel;
                this.changesListModel = changesListModel;
                this.$overlay = config.$overlay || this.$element;
+               this.$wrapper = config.$wrapper || this.$element;
 
                this.filterTagWidget = new mw.rcfilters.ui.FilterTagMultiselectWidget(
                        this.controller,
                        this.model,
                        this.queriesModel,
-                       { $overlay: this.$overlay }
+                       {
+                               $overlay: this.$overlay,
+                               collapsed: config.collapsed,
+                               $wrapper: this.$wrapper
+                       }
                );
 
                this.liveUpdateButton = new mw.rcfilters.ui.LiveUpdateButtonWidget(
index 8002045..eab8499 100644 (file)
@@ -14,6 +14,9 @@
         * @cfg {jQuery} $filtersContainer
         * @cfg {jQuery} $changesListContainer
         * @cfg {jQuery} $formContainer
+        * @cfg {boolean} [collapsed] Filter area is collapsed
+        * @cfg {jQuery} [$wrapper] A jQuery object for the wrapper of the general
+        *  system. If not given, falls back to this widget's $element
         */
        mw.rcfilters.ui.MainWrapperWidget = function MwRcfiltersUiMainWrapperWidget(
                controller, model, savedQueriesModel, changesListModel, config
@@ -31,6 +34,7 @@
                this.$changesListContainer = config.$changesListContainer;
                this.$formContainer = config.$formContainer;
                this.$overlay = $( '<div>' ).addClass( 'mw-rcfilters-ui-overlay' );
+               this.$wrapper = config.$wrapper || this.$element;
 
                this.savedLinksListWidget = new mw.rcfilters.ui.SavedLinksListWidget(
                        controller, savedQueriesModel, { $overlay: this.$overlay }
@@ -42,7 +46,9 @@
                        savedQueriesModel,
                        changesListModel,
                        {
-                               $overlay: this.$overlay
+                               $overlay: this.$overlay,
+                               $wrapper: this.$wrapper,
+                               collapsed: config.collapsed
                        }
                );
 
diff --git a/resources/src/mediawiki/mediawiki.base.js b/resources/src/mediawiki/mediawiki.base.js
deleted file mode 100644 (file)
index 9683570..0000000
+++ /dev/null
@@ -1,585 +0,0 @@
-/*!
- * This file is currently loaded as part of the 'mediawiki' module and therefore
- * concatenated to mediawiki.js and executed at the same time. This file exists
- * to help prepare for splitting up the 'mediawiki' module.
- * This effort is tracked at https://phabricator.wikimedia.org/T192623
- *
- * In short:
- *
- * - mediawiki.js will be reduced to the minimum needed to define mw.loader and
- *   mw.config, and then moved to its own private "mediawiki.loader" module that
- *   can be embedded within the StartupModule response.
- *
- * - mediawiki.base.js and other files in this directory will remain part of the
- *   "mediawiki" module, and will remain a default/implicit dependency for all
- *   regular modules, just like jquery and wikibits already are.
- */
-/* globals mw */
-( function () {
-       'use strict';
-
-       var slice = Array.prototype.slice,
-               mwLoaderTrack = mw.track,
-               trackCallbacks = $.Callbacks( 'memory' ),
-               trackHandlers = [],
-               hasOwn = Object.prototype.hasOwnProperty;
-
-       /**
-        * Object constructor for messages.
-        *
-        * Similar to the Message class in MediaWiki PHP.
-        *
-        * Format defaults to 'text'.
-        *
-        *     @example
-        *
-        *     var obj, str;
-        *     mw.messages.set( {
-        *         'hello': 'Hello world',
-        *         'hello-user': 'Hello, $1!',
-        *         'welcome-user': 'Welcome back to $2, $1! Last visit by $1: $3'
-        *     } );
-        *
-        *     obj = new mw.Message( mw.messages, 'hello' );
-        *     mw.log( obj.text() );
-        *     // Hello world
-        *
-        *     obj = new mw.Message( mw.messages, 'hello-user', [ 'John Doe' ] );
-        *     mw.log( obj.text() );
-        *     // Hello, John Doe!
-        *
-        *     obj = new mw.Message( mw.messages, 'welcome-user', [ 'John Doe', 'Wikipedia', '2 hours ago' ] );
-        *     mw.log( obj.text() );
-        *     // Welcome back to Wikipedia, John Doe! Last visit by John Doe: 2 hours ago
-        *
-        *     // Using mw.message shortcut
-        *     obj = mw.message( 'hello-user', 'John Doe' );
-        *     mw.log( obj.text() );
-        *     // Hello, John Doe!
-        *
-        *     // Using mw.msg shortcut
-        *     str = mw.msg( 'hello-user', 'John Doe' );
-        *     mw.log( str );
-        *     // Hello, John Doe!
-        *
-        *     // Different formats
-        *     obj = new mw.Message( mw.messages, 'hello-user', [ 'John "Wiki" <3 Doe' ] );
-        *
-        *     obj.format = 'text';
-        *     str = obj.toString();
-        *     // Same as:
-        *     str = obj.text();
-        *
-        *     mw.log( str );
-        *     // Hello, John "Wiki" <3 Doe!
-        *
-        *     mw.log( obj.escaped() );
-        *     // Hello, John &quot;Wiki&quot; &lt;3 Doe!
-        *
-        * @class mw.Message
-        *
-        * @constructor
-        * @param {mw.Map} map Message store
-        * @param {string} key
-        * @param {Array} [parameters]
-        */
-       function Message( map, key, parameters ) {
-               this.format = 'text';
-               this.map = map;
-               this.key = key;
-               this.parameters = parameters === undefined ? [] : slice.call( parameters );
-               return this;
-       }
-
-       Message.prototype = {
-               /**
-                * Get parsed contents of the message.
-                *
-                * The default parser does simple $N replacements and nothing else.
-                * This may be overridden to provide a more complex message parser.
-                * The primary override is in the mediawiki.jqueryMsg module.
-                *
-                * This function will not be called for nonexistent messages.
-                *
-                * @return {string} Parsed message
-                */
-               parser: function () {
-                       return mw.format.apply( null, [ this.map.get( this.key ) ].concat( this.parameters ) );
-               },
-
-               /**
-                * Add (does not replace) parameters for `$N` placeholder values.
-                *
-                * @param {Array} parameters
-                * @return {mw.Message}
-                * @chainable
-                */
-               params: function ( parameters ) {
-                       var i;
-                       for ( i = 0; i < parameters.length; i++ ) {
-                               this.parameters.push( parameters[ i ] );
-                       }
-                       return this;
-               },
-
-               /**
-                * Convert message object to its string form based on current format.
-                *
-                * @return {string} Message as a string in the current form, or `<key>` if key
-                *  does not exist.
-                */
-               toString: function () {
-                       var text;
-
-                       if ( !this.exists() ) {
-                               // Use ⧼key⧽ as text if key does not exist
-                               // Err on the side of safety, ensure that the output
-                               // is always html safe in the event the message key is
-                               // missing, since in that case its highly likely the
-                               // message key is user-controlled.
-                               // '⧼' is used instead of '<' to side-step any
-                               // double-escaping issues.
-                               // (Keep synchronised with Message::toString() in PHP.)
-                               return '⧼' + mw.html.escape( this.key ) + '⧽';
-                       }
-
-                       if ( this.format === 'plain' || this.format === 'text' || this.format === 'parse' ) {
-                               text = this.parser();
-                       }
-
-                       if ( this.format === 'escaped' ) {
-                               text = this.parser();
-                               text = mw.html.escape( text );
-                       }
-
-                       return text;
-               },
-
-               /**
-                * Change format to 'parse' and convert message to string
-                *
-                * If jqueryMsg is loaded, this parses the message text from wikitext
-                * (where supported) to HTML
-                *
-                * Otherwise, it is equivalent to plain.
-                *
-                * @return {string} String form of parsed message
-                */
-               parse: function () {
-                       this.format = 'parse';
-                       return this.toString();
-               },
-
-               /**
-                * Change format to 'plain' and convert message to string
-                *
-                * This substitutes parameters, but otherwise does not change the
-                * message text.
-                *
-                * @return {string} String form of plain message
-                */
-               plain: function () {
-                       this.format = 'plain';
-                       return this.toString();
-               },
-
-               /**
-                * Change format to 'text' and convert message to string
-                *
-                * If jqueryMsg is loaded, {{-transformation is done where supported
-                * (such as {{plural:}}, {{gender:}}, {{int:}}).
-                *
-                * Otherwise, it is equivalent to plain
-                *
-                * @return {string} String form of text message
-                */
-               text: function () {
-                       this.format = 'text';
-                       return this.toString();
-               },
-
-               /**
-                * Change the format to 'escaped' and convert message to string
-                *
-                * This is equivalent to using the 'text' format (see #text), then
-                * HTML-escaping the output.
-                *
-                * @return {string} String form of html escaped message
-                */
-               escaped: function () {
-                       this.format = 'escaped';
-                       return this.toString();
-               },
-
-               /**
-                * Check if a message exists
-                *
-                * @see mw.Map#exists
-                * @return {boolean}
-                */
-               exists: function () {
-                       return this.map.exists( this.key );
-               }
-       };
-
-       /**
-        * @class mw
-        * @singleton
-        */
-
-       /**
-        * @inheritdoc mw.inspect#runReports
-        * @method
-        */
-       mw.inspect = function () {
-               var args = arguments;
-               mw.loader.using( 'mediawiki.inspect', function () {
-                       mw.inspect.runReports.apply( mw.inspect, args );
-               } );
-       };
-
-       /**
-        * Format a string. Replace $1, $2 ... $N with positional arguments.
-        *
-        * Used by Message#parser().
-        *
-        * @since 1.25
-        * @param {string} formatString Format string
-        * @param {...Mixed} parameters Values for $N replacements
-        * @return {string} Formatted string
-        */
-       mw.format = function ( formatString ) {
-               var parameters = slice.call( arguments, 1 );
-               return formatString.replace( /\$(\d+)/g, function ( str, match ) {
-                       var index = parseInt( match, 10 ) - 1;
-                       return parameters[ index ] !== undefined ? parameters[ index ] : '$' + match;
-               } );
-       };
-
-       // Expose Message constructor
-       mw.Message = Message;
-
-       /**
-        * Get a message object.
-        *
-        * Shortcut for `new mw.Message( mw.messages, key, parameters )`.
-        *
-        * @see mw.Message
-        * @param {string} key Key of message to get
-        * @param {...Mixed} parameters Values for $N replacements
-        * @return {mw.Message}
-        */
-       mw.message = function ( key ) {
-               var parameters = slice.call( arguments, 1 );
-               return new Message( mw.messages, key, parameters );
-       };
-
-       /**
-        * Get a message string using the (default) 'text' format.
-        *
-        * Shortcut for `mw.message( key, parameters... ).text()`.
-        *
-        * @see mw.Message
-        * @param {string} key Key of message to get
-        * @param {...Mixed} parameters Values for $N replacements
-        * @return {string}
-        */
-       mw.msg = function () {
-               return mw.message.apply( mw.message, arguments ).toString();
-       };
-
-       /**
-        * Track an analytic event.
-        *
-        * This method provides a generic means for MediaWiki JavaScript code to capture state
-        * information for analysis. Each logged event specifies a string topic name that describes
-        * the kind of event that it is. Topic names consist of dot-separated path components,
-        * arranged from most general to most specific. Each path component should have a clear and
-        * well-defined purpose.
-        *
-        * Data handlers are registered via `mw.trackSubscribe`, and receive the full set of
-        * events that match their subcription, including those that fired before the handler was
-        * bound.
-        *
-        * @param {string} topic Topic name
-        * @param {Object} [data] Data describing the event, encoded as an object
-        */
-       mw.track = function ( topic, data ) {
-               mwLoaderTrack( topic, data );
-               trackCallbacks.fire( mw.trackQueue );
-       };
-
-       /**
-        * Register a handler for subset of analytic events, specified by topic.
-        *
-        * Handlers will be called once for each tracked event, including any events that fired before the
-        * handler was registered; 'this' is set to a plain object with a 'timeStamp' property indicating
-        * the exact time at which the event fired, a string 'topic' property naming the event, and a
-        * 'data' property which is an object of event-specific data. The event topic and event data are
-        * also passed to the callback as the first and second arguments, respectively.
-        *
-        * @param {string} topic Handle events whose name starts with this string prefix
-        * @param {Function} callback Handler to call for each matching tracked event
-        * @param {string} callback.topic
-        * @param {Object} [callback.data]
-        */
-       mw.trackSubscribe = function ( topic, callback ) {
-               var seen = 0;
-               function handler( trackQueue ) {
-                       var event;
-                       for ( ; seen < trackQueue.length; seen++ ) {
-                               event = trackQueue[ seen ];
-                               if ( event.topic.indexOf( topic ) === 0 ) {
-                                       callback.call( event, event.topic, event.data );
-                               }
-                       }
-               }
-
-               trackHandlers.push( [ handler, callback ] );
-
-               trackCallbacks.add( handler );
-       };
-
-       /**
-        * Stop handling events for a particular handler
-        *
-        * @param {Function} callback
-        */
-       mw.trackUnsubscribe = function ( callback ) {
-               trackHandlers = trackHandlers.filter( function ( fns ) {
-                       if ( fns[ 1 ] === callback ) {
-                               trackCallbacks.remove( fns[ 0 ] );
-                               // Ensure the tuple is removed to avoid holding on to closures
-                               return false;
-                       }
-                       return true;
-               } );
-       };
-
-       // Fire events from before track() triggred fire()
-       trackCallbacks.fire( mw.trackQueue );
-
-       /**
-        * Registry and firing of events.
-        *
-        * MediaWiki has various interface components that are extended, enhanced
-        * or manipulated in some other way by extensions, gadgets and even
-        * in core itself.
-        *
-        * This framework helps streamlining the timing of when these other
-        * code paths fire their plugins (instead of using document-ready,
-        * which can and should be limited to firing only once).
-        *
-        * Features like navigating to other wiki pages, previewing an edit
-        * and editing itself – without a refresh – can then retrigger these
-        * hooks accordingly to ensure everything still works as expected.
-        *
-        * Example usage:
-        *
-        *     mw.hook( 'wikipage.content' ).add( fn ).remove( fn );
-        *     mw.hook( 'wikipage.content' ).fire( $content );
-        *
-        * Handlers can be added and fired for arbitrary event names at any time. The same
-        * event can be fired multiple times. The last run of an event is memorized
-        * (similar to `$(document).ready` and `$.Deferred().done`).
-        * This means if an event is fired, and a handler added afterwards, the added
-        * function will be fired right away with the last given event data.
-        *
-        * Like Deferreds and Promises, the mw.hook object is both detachable and chainable.
-        * Thus allowing flexible use and optimal maintainability and authority control.
-        * You can pass around the `add` and/or `fire` method to another piece of code
-        * without it having to know the event name (or `mw.hook` for that matter).
-        *
-        *     var h = mw.hook( 'bar.ready' );
-        *     new mw.Foo( .. ).fetch( { callback: h.fire } );
-        *
-        * Note: Events are documented with an underscore instead of a dot in the event
-        * name due to jsduck not supporting dots in that position.
-        *
-        * @class mw.hook
-        */
-       mw.hook = ( function () {
-               var lists = {};
-
-               /**
-                * Create an instance of mw.hook.
-                *
-                * @method hook
-                * @member mw
-                * @param {string} name Name of hook.
-                * @return {mw.hook}
-                */
-               return function ( name ) {
-                       var list = hasOwn.call( lists, name ) ?
-                               lists[ name ] :
-                               lists[ name ] = $.Callbacks( 'memory' );
-
-                       return {
-                               /**
-                                * Register a hook handler
-                                *
-                                * @param {...Function} handler Function to bind.
-                                * @chainable
-                                */
-                               add: list.add,
-
-                               /**
-                                * Unregister a hook handler
-                                *
-                                * @param {...Function} handler Function to unbind.
-                                * @chainable
-                                */
-                               remove: list.remove,
-
-                               /**
-                                * Run a hook.
-                                *
-                                * @param {...Mixed} data
-                                * @return {mw.hook}
-                                * @chainable
-                                */
-                               fire: function () {
-                                       return list.fireWith.call( this, null, slice.call( arguments ) );
-                               }
-                       };
-               };
-       }() );
-
-       /**
-        * HTML construction helper functions
-        *
-        *     @example
-        *
-        *     var Html, output;
-        *
-        *     Html = mw.html;
-        *     output = Html.element( 'div', {}, new Html.Raw(
-        *         Html.element( 'img', { src: '<' } )
-        *     ) );
-        *     mw.log( output ); // <div><img src="&lt;"/></div>
-        *
-        * @class mw.html
-        * @singleton
-        */
-       mw.html = ( function () {
-               function escapeCallback( s ) {
-                       switch ( s ) {
-                               case '\'':
-                                       return '&#039;';
-                               case '"':
-                                       return '&quot;';
-                               case '<':
-                                       return '&lt;';
-                               case '>':
-                                       return '&gt;';
-                               case '&':
-                                       return '&amp;';
-                       }
-               }
-
-               return {
-                       /**
-                        * Escape a string for HTML.
-                        *
-                        * Converts special characters to HTML entities.
-                        *
-                        *     mw.html.escape( '< > \' & "' );
-                        *     // Returns &lt; &gt; &#039; &amp; &quot;
-                        *
-                        * @param {string} s The string to escape
-                        * @return {string} HTML
-                        */
-                       escape: function ( s ) {
-                               return s.replace( /['"<>&]/g, escapeCallback );
-                       },
-
-                       /**
-                        * Create an HTML element string, with safe escaping.
-                        *
-                        * @param {string} name The tag name.
-                        * @param {Object} [attrs] An object with members mapping element names to values
-                        * @param {string|mw.html.Raw|mw.html.Cdata|null} [contents=null] The contents of the element.
-                        *
-                        *  - string: Text to be escaped.
-                        *  - null: The element is treated as void with short closing form, e.g. `<br/>`.
-                        *  - this.Raw: The raw value is directly included.
-                        *  - this.Cdata: The raw value is directly included. An exception is
-                        *    thrown if it contains any illegal ETAGO delimiter.
-                        *    See <https://www.w3.org/TR/html401/appendix/notes.html#h-B.3.2>.
-                        * @return {string} HTML
-                        */
-                       element: function ( name, attrs, contents ) {
-                               var v, attrName, s = '<' + name;
-
-                               if ( attrs ) {
-                                       for ( attrName in attrs ) {
-                                               v = attrs[ attrName ];
-                                               // Convert name=true, to name=name
-                                               if ( v === true ) {
-                                                       v = attrName;
-                                                       // Skip name=false
-                                               } else if ( v === false ) {
-                                                       continue;
-                                               }
-                                               s += ' ' + attrName + '="' + this.escape( String( v ) ) + '"';
-                                       }
-                               }
-                               if ( contents === undefined || contents === null ) {
-                                       // Self close tag
-                                       s += '/>';
-                                       return s;
-                               }
-                               // Regular open tag
-                               s += '>';
-                               switch ( typeof contents ) {
-                                       case 'string':
-                                               // Escaped
-                                               s += this.escape( contents );
-                                               break;
-                                       case 'number':
-                                       case 'boolean':
-                                               // Convert to string
-                                               s += String( contents );
-                                               break;
-                                       default:
-                                               if ( contents instanceof this.Raw ) {
-                                                       // Raw HTML inclusion
-                                                       s += contents.value;
-                                               } else if ( contents instanceof this.Cdata ) {
-                                                       // CDATA
-                                                       if ( /<\/[a-zA-z]/.test( contents.value ) ) {
-                                                               throw new Error( 'mw.html.element: Illegal end tag found in CDATA' );
-                                                       }
-                                                       s += contents.value;
-                                               } else {
-                                                       throw new Error( 'mw.html.element: Invalid type of contents' );
-                                               }
-                               }
-                               s += '</' + name + '>';
-                               return s;
-                       },
-
-                       /**
-                        * Wrapper object for raw HTML passed to mw.html.element().
-                        *
-                        * @class mw.html.Raw
-                        * @constructor
-                        * @param {string} value
-                        */
-                       Raw: function ( value ) {
-                               this.value = value;
-                       },
-
-                       /**
-                        * Wrapper object for CDATA element contents passed to mw.html.element()
-                        *
-                        * @class mw.html.Cdata
-                        * @constructor
-                        * @param {string} value
-                        */
-                       Cdata: function ( value ) {
-                               this.value = value;
-                       }
-               };
-       }() );
-}() );
diff --git a/resources/src/mediawiki/mediawiki.errorLogger.js b/resources/src/mediawiki/mediawiki.errorLogger.js
deleted file mode 100644 (file)
index e86aff6..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/**
- * Try to catch errors in modules which don't do their own error handling.
- *
- * @class mw.errorLogger
- * @singleton
- */
-( function ( mw ) {
-       'use strict';
-
-       mw.errorLogger = {
-               /**
-                * Fired via mw.track when an error is not handled by local code and is caught by the
-                * window.onerror handler.
-                *
-                * @event global_error
-                * @param {string} errorMessage Error errorMessage.
-                * @param {string} url URL where error was raised.
-                * @param {number} lineNumber Line number where error was raised.
-                * @param {number} [columnNumber] Line number where error was raised. Not all browsers
-                *   support this.
-                * @param {Error|Mixed} [errorObject] The error object. Typically an instance of Error, but anything
-                *   (even a primitive value) passed to a throw clause will end up here.
-                */
-
-               /**
-                * Install a window.onerror handler that will report via mw.track, while preserving
-                * any previous handler.
-                *
-                * @param {Object} window
-                */
-               installGlobalHandler: function ( window ) {
-                       // We will preserve the return value of the previous handler. window.onerror works the
-                       // opposite way than normal event handlers (returning true will prevent the default
-                       // action, returning false will let the browser handle the error normally, by e.g.
-                       // logging to the console), so our fallback old handler needs to return false.
-                       var oldHandler = window.onerror || function () { return false; };
-
-                       /**
-                        * Dumb window.onerror handler which forwards the errors via mw.track.
-                        *
-                        * @param {string} errorMessage
-                        * @param {string} url
-                        * @param {number} lineNumber
-                        * @param {number} [columnNumber]
-                        * @param {Error|Mixed} [errorObject]
-                        * @return {boolean} True to prevent the default action
-                        * @fires global_error
-                        */
-                       window.onerror = function ( errorMessage, url, lineNumber, columnNumber, errorObject ) {
-                               mw.track( 'global.error', { errorMessage: errorMessage, url: url,
-                                       lineNumber: lineNumber, columnNumber: columnNumber, errorObject: errorObject } );
-                               return oldHandler.apply( this, arguments );
-                       };
-               }
-       };
-
-       mw.errorLogger.installGlobalHandler( window );
-}( mediaWiki ) );
index 7d40ce7..68d9d9e 100644 (file)
                                script.parentNode.removeChild( script );
                        }
 
+                       /**
+                        * Add one or more modules to the module load queue.
+                        *
+                        * See also #work().
+                        *
+                        * @private
+                        * @param {string|string[]} dependencies Module name or array of string module names
+                        * @param {Function} [ready] Callback to execute when all dependencies are ready
+                        * @param {Function} [error] Callback to execute when any dependency fails
+                        */
+                       function enqueue( dependencies, ready, error ) {
+                               // Allow calling by single module name
+                               if ( typeof dependencies === 'string' ) {
+                                       dependencies = [ dependencies ];
+                               }
+
+                               if ( allReady( dependencies ) ) {
+                                       // Run ready immediately
+                                       if ( ready !== undefined ) {
+                                               ready();
+                                       }
+
+                                       return;
+                               }
+
+                               if ( anyFailed( dependencies ) ) {
+                                       if ( error !== undefined ) {
+                                               // Execute error immediately if any dependencies have errors
+                                               error(
+                                                       new Error( 'One or more dependencies failed to load' ),
+                                                       dependencies
+                                               );
+                                       }
+
+                                       return;
+                               }
+
+                               // Not all dependencies are ready, add to the load queue...
+
+                               // Add ready and error callbacks if they were given
+                               if ( ready !== undefined || error !== undefined ) {
+                                       jobs.push( {
+                                               // Narrow down the list to modules that are worth waiting for
+                                               dependencies: dependencies.filter( function ( module ) {
+                                                       var state = mw.loader.getState( module );
+                                                       return state === 'registered' || state === 'loaded' || state === 'loading' || state === 'executing';
+                                               } ),
+                                               ready: ready,
+                                               error: error
+                                       } );
+                               }
+
+                               dependencies.forEach( function ( module ) {
+                                       var state = mw.loader.getState( module );
+                                       // Only queue modules that are still in the initial 'registered' state
+                                       // (not ones already loading, ready or error).
+                                       if ( state === 'registered' && queue.indexOf( module ) === -1 ) {
+                                               // Private modules must be embedded in the page. Don't bother queuing
+                                               // these as the server will deny them anyway (T101806).
+                                               if ( registry[ module ].group === 'private' ) {
+                                                       registry[ module ].state = 'error';
+                                                       handlePending( module );
+                                                       return;
+                                               }
+                                               queue.push( module );
+                                       }
+                               } );
+
+                               mw.loader.work();
+                       }
+
                        /**
                         * Executes a loaded module, making it ready to use
                         *
                                ( function () {
                                        var pending = 0;
                                        checkCssHandles = function () {
+                                               var ex, dependencies;
                                                // cssHandlesRegistered ensures we don't take off too soon, e.g. when
                                                // one of the cssHandles is fired while we're still creating more handles.
                                                if ( cssHandlesRegistered && pending === 0 && runScript ) {
                                                        if ( module === 'user' ) {
                                                                // Implicit dependency on the site module. Not real dependency because
                                                                // it should run after 'site' regardless of whether it succeeds or fails.
-                                                               mw.loader.using( [ 'site' ] ).always( runScript );
+                                                               // Note: This is a simplified version of mw.loader.using(), inlined here
+                                                               // as using() depends on jQuery (T192623).
+                                                               try {
+                                                                       dependencies = resolve( [ 'site' ] );
+                                                               } catch ( e ) {
+                                                                       ex = e;
+                                                                       runScript();
+                                                               }
+                                                               if ( ex === undefined ) {
+                                                                       enqueue( dependencies, runScript, runScript );
+                                                               }
                                                        } else {
                                                                runScript();
                                                        }
                                checkCssHandles();
                        }
 
-                       /**
-                        * Add one or more modules to the module load queue.
-                        *
-                        * See also #work().
-                        *
-                        * @private
-                        * @param {string|string[]} dependencies Module name or array of string module names
-                        * @param {Function} [ready] Callback to execute when all dependencies are ready
-                        * @param {Function} [error] Callback to execute when any dependency fails
-                        */
-                       function enqueue( dependencies, ready, error ) {
-                               // Allow calling by single module name
-                               if ( typeof dependencies === 'string' ) {
-                                       dependencies = [ dependencies ];
-                               }
-
-                               // Add ready and error callbacks if they were given
-                               if ( ready !== undefined || error !== undefined ) {
-                                       jobs.push( {
-                                               // Narrow down the list to modules that are worth waiting for
-                                               dependencies: dependencies.filter( function ( module ) {
-                                                       var state = mw.loader.getState( module );
-                                                       return state === 'registered' || state === 'loaded' || state === 'loading' || state === 'executing';
-                                               } ),
-                                               ready: ready,
-                                               error: error
-                                       } );
-                               }
-
-                               dependencies.forEach( function ( module ) {
-                                       var state = mw.loader.getState( module );
-                                       // Only queue modules that are still in the initial 'registered' state
-                                       // (not ones already loading, ready or error).
-                                       if ( state === 'registered' && queue.indexOf( module ) === -1 ) {
-                                               // Private modules must be embedded in the page. Don't bother queuing
-                                               // these as the server will deny them anyway (T101806).
-                                               if ( registry[ module ].group === 'private' ) {
-                                                       registry[ module ].state = 'error';
-                                                       handlePending( module );
-                                                       return;
-                                               }
-                                               queue.push( module );
-                                       }
-                               } );
-
-                               mw.loader.work();
-                       }
-
                        function sortQuery( o ) {
                                var key,
                                        sorted = {},
                                 */
                                addStyleTag: newStyleTag,
 
+                               enqueue: enqueue,
+
+                               resolve: resolve,
+
                                /**
                                 * Start loading of all queued module dependencies.
                                 *
                                        }
                                },
 
-                               /**
-                                * Execute a function as soon as one or more required modules are ready.
-                                *
-                                * Example of inline dependency on OOjs:
-                                *
-                                *     mw.loader.using( 'oojs', function () {
-                                *         OO.compare( [ 1 ], [ 1 ] );
-                                *     } );
-                                *
-                                * Example of inline dependency obtained via `require()`:
-                                *
-                                *     mw.loader.using( [ 'mediawiki.util' ], function ( require ) {
-                                *         var util = require( 'mediawiki.util' );
-                                *     } );
-                                *
-                                * Since MediaWiki 1.23 this also returns a promise.
-                                *
-                                * Since MediaWiki 1.28 the promise is resolved with a `require` function.
-                                *
-                                * @param {string|Array} dependencies Module name or array of modules names the
-                                *  callback depends on to be ready before executing
-                                * @param {Function} [ready] Callback to execute when all dependencies are ready
-                                * @param {Function} [error] Callback to execute if one or more dependencies failed
-                                * @return {jQuery.Promise} With a `require` function
-                                */
-                               using: function ( dependencies, ready, error ) {
-                                       var deferred = $.Deferred();
-
-                                       // Allow calling with a single dependency as a string
-                                       if ( typeof dependencies === 'string' ) {
-                                               dependencies = [ dependencies ];
-                                       }
-
-                                       if ( ready ) {
-                                               deferred.done( ready );
-                                       }
-                                       if ( error ) {
-                                               deferred.fail( error );
-                                       }
-
-                                       try {
-                                               // Resolve entire dependency map
-                                               dependencies = resolve( dependencies );
-                                       } catch ( e ) {
-                                               return deferred.reject( e ).promise();
-                                       }
-                                       if ( allReady( dependencies ) ) {
-                                               // Run ready immediately
-                                               deferred.resolve( mw.loader.require );
-                                       } else if ( anyFailed( dependencies ) ) {
-                                               // Execute error immediately if any dependencies have errors
-                                               deferred.reject(
-                                                       new Error( 'One or more dependencies failed to load' ),
-                                                       dependencies
-                                               );
-                                       } else {
-                                               // Not all dependencies are ready, add to the load queue
-                                               enqueue( dependencies, function () {
-                                                       deferred.resolve( mw.loader.require );
-                                               }, deferred.reject );
-                                       }
-
-                                       return deferred.promise();
-                               },
-
                                /**
                                 * Load an external script or one or more modules.
                                 *
                                        // Resolve remaining list using the known dependency tree.
                                        // This also filters out modules with unknown dependencies. (T36853)
                                        filtered = resolveStubbornly( filtered );
-                                       // If all modules are ready, or if any modules have errors, nothing to be done.
-                                       if ( allReady( filtered ) || anyFailed( filtered ) ) {
-                                               return;
-                                       }
-                                       if ( filtered.length === 0 ) {
-                                               return;
-                                       }
                                        // Some modules are not yet ready, add to module load queue.
                                        enqueue( filtered, undefined, undefined );
                                },
 
        };
 
-       // Alias $j to jQuery for backwards compatibility
-       // @deprecated since 1.23 Use $ or jQuery instead
-       mw.log.deprecate( window, '$j', $, 'Use $ or jQuery instead.' );
-
        // Attach to window and globally alias
        window.mw = window.mediaWiki = mw;
 }( jQuery ) );
index f68f595..2089f64 100644 (file)
@@ -41,7 +41,8 @@ class DbTestRecorder extends TestRecorder {
                        || !$this->db->tableExists( 'testitem' )
                ) {
                        print "WARNING> `testrun` table not found in database. Trying to create table.\n";
-                       $this->db->sourceFile( $this->db->patchPath( 'patch-testrun.sql' ) );
+                       $updater = DatabaseUpdater::newForDB( $this->db );
+                       $this->db->sourceFile( $updater->patchPath( $this->db, 'patch-testrun.sql' ) );
                        echo "OK, resuming.\n";
                }
 
index afddd78..ce4df85 100644 (file)
@@ -6589,7 +6589,7 @@ Element attributes with double ! should not be broken up by <th>
 !! html/php
 <table>
 <tr>
-<td><div style="color: red !important;" data-contrived="put this here &#124;&#124;">hi</div>
+<td><div style="color: red&#32;!important;" data-contrived="put this here &#124;&#124;">hi</div>
 </td></tr></table>
 
 !! html/parsoid
@@ -6610,7 +6610,7 @@ parsoid=wt2html
 !! html/php
 <table>
 <tr>
-<td>style="color: red !important;" data-contrived="put this here</td>
+<td>style="color: red&#160;!important;" data-contrived="put this here</td>
 <td>foo
 </td></tr></table>
 
@@ -18685,7 +18685,7 @@ Punctuation: CSS !important (T13874)
 !! wikitext
 <div style="width:50% !important">important</div>
 !! html
-<div style="width:50% !important">important</div>
+<div style="width:50%&#32;!important">important</div>
 
 !!end
 
@@ -18694,7 +18694,7 @@ Punctuation: CSS ! important (T13874; with space after)
 !! wikitext
 <div style="width:50% ! important">important</div>
 !! html
-<div style="width:50% ! important">important</div>
+<div style="width:50%&#32;! important">important</div>
 
 !!end
 
@@ -23954,10 +23954,10 @@ Play a bit with r67090 and T5158
 <div style="width:50%&#160;!important">&nbsp;</div>
 <div style="border : solid;">&nbsp;</div>
 !! html/php
-<div style="width:50% !important">&#160;</div>
+<div style="width:50%&#32;!important">&#160;</div>
 <div style="width:50% !important">&#160;</div>
 <div style="width:50% !important">&#160;</div>
-<div style="border&#160;: solid;">&#160;</div>
+<div style="border&#32;: solid;">&#160;</div>
 
 !! html/parsoid
 <div style="width:50% !important" data-parsoid='{"stx":"html"}'><span typeof="mw:Entity" data-parsoid='{"srcContent":" "}'> </span></div>
@@ -23967,6 +23967,15 @@ Play a bit with r67090 and T5158
 
 !! end
 
+!! test
+T5158: Test for French spaces in attributes
+!! wikitext
+<br style=" clear : both ; " />
+!! html/php
+<p><br style="clear&#32;: both&#32;;" />
+</p>
+!! end
+
 !! test
 HTML5 data attributes
 !! wikitext
index 974373b..3c8fa25 100644 (file)
@@ -331,7 +331,7 @@ class HtmlTest extends MediaWikiTestCase {
                );
 
                $this->assertEquals(
-                       '<label for="mw-test-namespace">Select a namespace:</label>&#160;' .
+                       '<label for="mw-test-namespace">Select a namespace:</label>' . "\u{00A0}" .
                                '<select id="mw-test-namespace" name="wpNamespace">' . "\n" .
                                '<option value="all">all</option>' . "\n" .
                                '<option value="0">(Main)</option>' . "\n" .
@@ -359,7 +359,7 @@ class HtmlTest extends MediaWikiTestCase {
                );
 
                $this->assertEquals(
-                       '<label for="namespace">Select a namespace:</label>&#160;' .
+                       '<label for="namespace">Select a namespace:</label>' . "\u{00A0}" .
                                '<select id="namespace" name="namespace">' . "\n" .
                                '<option value="0">(Main)</option>' . "\n" .
                                '<option value="1">Talk</option>' . "\n" .
index 03588ae..93c7ed3 100644 (file)
@@ -11,6 +11,7 @@ use MediaWiki\Services\ServiceDisabledException;
 use MediaWiki\Shell\CommandFactory;
 use MediaWiki\Storage\BlobStore;
 use MediaWiki\Storage\BlobStoreFactory;
+use MediaWiki\Storage\NameTableStore;
 use MediaWiki\Storage\RevisionLookup;
 use MediaWiki\Storage\RevisionStore;
 use MediaWiki\Storage\SqlBlobStore;
@@ -348,6 +349,7 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
                        'RevisionLookup' => [ 'RevisionLookup', RevisionLookup::class ],
                        'HttpRequestFactory' => [ 'HttpRequestFactory', HttpRequestFactory::class ],
                        'CommentStore' => [ 'CommentStore', CommentStore::class ],
+                       'ChangeTagDefStore' => [ 'ChangeTagDefStore', NameTableStore::class ],
                ];
        }
 
index cf2c64a..6de37af 100644 (file)
@@ -443,6 +443,31 @@ class RevisionTest extends MediaWikiTestCase {
                $this->testGetRevisionText( $expected, $rowData );
        }
 
+       public function provideGetRevisionTextWithZlibExtension_badData() {
+               yield 'Generic gzip test' => [
+                       'This is a small goat of revision text.',
+                       [
+                               'old_flags' => 'gzip',
+                               'old_text' => 'DEAD BEEF',
+                       ],
+               ];
+       }
+
+       /**
+        * @covers Revision::getRevisionText
+        * @dataProvider provideGetRevisionTextWithZlibExtension_badData
+        */
+       public function testGetRevisionWithZlibExtension_badData( $expected, $rowData ) {
+               $this->checkPHPExtension( 'zlib' );
+               Wikimedia\suppressWarnings();
+               $this->assertFalse(
+                       Revision::getRevisionText(
+                               (object)$rowData
+                       )
+               );
+               Wikimedia\suppressWarnings( true );
+       }
+
        private function getWANObjectCache() {
                return new WANObjectCache( [ 'cache' => new HashBagOStuff() ] );
        }
@@ -809,6 +834,7 @@ class RevisionTest extends MediaWikiTestCase {
        public function testGetRevisionText_external_returnsFalseWhenNotEnoughUrlParts(
                $text
        ) {
+               Wikimedia\suppressWarnings();
                $this->assertFalse(
                        Revision::getRevisionText(
                                (object)[
@@ -817,6 +843,7 @@ class RevisionTest extends MediaWikiTestCase {
                                ]
                        )
                );
+               Wikimedia\suppressWarnings( true );
        }
 
        /**
index 24107b1..bdabf9c 100644 (file)
@@ -58,12 +58,9 @@ class PageUpdaterTest extends MediaWikiTestCase {
                $oldStats = $this->db->selectRow( 'site_stats', '*', '1=1' );
 
                $this->assertFalse( $updater->wasCommitted(), 'wasCommitted' );
-               $this->assertFalse( $updater->getBaseRevisionId(), 'getBaseRevisionId' );
+               $this->assertFalse( $updater->getOriginalRevisionId(), 'getOriginalRevisionId' );
                $this->assertSame( 0, $updater->getUndidRevisionId(), 'getUndidRevisionId' );
 
-               $updater->setBaseRevisionId( 0 );
-               $this->assertSame( 0, $updater->getBaseRevisionId(), 'getBaseRevisionId' );
-
                $updater->addTag( 'foo' );
                $updater->addTags( [ 'bar', 'qux' ] );
 
@@ -77,10 +74,12 @@ class PageUpdaterTest extends MediaWikiTestCase {
 
                $parent = $updater->grabParentRevision();
 
-               // TODO: test that hasEditConflict() grabs the parent revision
                $this->assertNull( $parent, 'getParentRevision' );
                $this->assertFalse( $updater->wasCommitted(), 'wasCommitted' );
-               $this->assertFalse( $updater->hasEditConflict(), 'hasEditConflict' );
+
+               // TODO: test that hasEditConflict() grabs the parent revision
+               $this->assertFalse( $updater->hasEditConflict( 0 ), 'hasEditConflict' );
+               $this->assertTrue( $updater->hasEditConflict( 1 ), 'hasEditConflict' );
 
                // TODO: test failure with EDIT_UPDATE
                // TODO: test EDIT_MINOR, EDIT_BOT, etc
@@ -158,10 +157,12 @@ class PageUpdaterTest extends MediaWikiTestCase {
 
                $oldStats = $this->db->selectRow( 'site_stats', '*', '1=1' );
 
-               // TODO: test page update does not fail with mismatching base rev ID
-               $baseRev = $title->getLatestRevID( Title::GAID_FOR_UPDATE );
-               $updater->setBaseRevisionId( $baseRev );
-               $this->assertSame( $baseRev, $updater->getBaseRevisionId(), 'getBaseRevisionId' );
+               $updater->setOriginalRevisionId( 7 );
+               $this->assertSame( 7, $updater->getOriginalRevisionId(), 'getOriginalRevisionId' );
+
+               $this->assertFalse( $updater->hasEditConflict( $parentId ), 'hasEditConflict' );
+               $this->assertTrue( $updater->hasEditConflict( $parentId - 1 ), 'hasEditConflict' );
+               $this->assertTrue( $updater->hasEditConflict( 0 ), 'hasEditConflict' );
 
                // TODO: MCR: test additional slots
                $updater->setContent( 'main', new TextContent( 'Lorem Ipsum' ) );
@@ -332,48 +333,6 @@ class PageUpdaterTest extends MediaWikiTestCase {
                $this->assertTrue( $status->hasMessage( 'edit-already-exists' ), 'edit-already-exists' );
        }
 
-       /**
-        * @covers \MediaWiki\Storage\PageUpdater::saveRevision()
-        * @covers \MediaWiki\Storage\PageUpdater::setBaseRevisionId()
-        */
-       public function testFailureOnBaseRevision() {
-               $user = $this->getTestUser()->getUser();
-
-               $title = $this->getDummyTitle( __METHOD__ );
-
-               // start editing non-existing page
-               $page = WikiPage::factory( $title );
-               $updater = $page->newPageUpdater( $user );
-
-               // update for base revision 7 should fail
-               $summary = CommentStoreComment::newUnsavedComment( 'udpate?!' );
-               $updater->setBaseRevisionId( 7 ); // expect page to exist
-               $updater->setContent( 'main', new TextContent( 'Lorem ipsum' ) );
-               $updater->saveRevision( $summary );
-               $status = $updater->getStatus();
-
-               $this->assertFalse( $updater->wasSuccessful(), 'wasSuccessful()' );
-               $this->assertNull( $updater->getNewRevision(), 'getNewRevision()' );
-               $this->assertFalse( $status->isOK(), 'getStatus()->isOK()' );
-               $this->assertTrue( $status->hasMessage( 'edit-gone-missing' ), 'edit-gone-missing' );
-
-               // create the page
-               $this->createRevision( $page, __METHOD__ );
-
-               // update for base revision 0 should fail
-               $summary = CommentStoreComment::newUnsavedComment( 'create?!' );
-               $updater = $page->newPageUpdater( $user );
-               $updater->setBaseRevisionId( 0 ); // expect page to not exist
-               $updater->setContent( 'main', new TextContent( 'dolor sit amet' ) );
-               $updater->saveRevision( $summary );
-               $status = $updater->getStatus();
-
-               $this->assertFalse( $updater->wasSuccessful(), 'wasSuccessful()' );
-               $this->assertNull( $updater->getNewRevision(), 'getNewRevision()' );
-               $this->assertFalse( $status->isOK(), 'getStatus()->isOK()' );
-               $this->assertTrue( $status->hasMessage( 'edit-already-exists' ), 'edit-already-exists' );
-       }
-
        public function provideSetRcPatrolStatus( $patrolled ) {
                yield [ RecentChange::PRC_UNPATROLLED ];
                yield [ RecentChange::PRC_AUTOPATROLLED ];
index ef14a9e..52647c2 100644 (file)
@@ -224,4 +224,34 @@ class RevisionSlotsTest extends MediaWikiTestCase {
                $this->assertSame( $same, $b->hasSameContent( $a ) );
        }
 
+       public function provideGetRolesWithDifferentContent() {
+               $fooX = SlotRecord::newUnsaved( 'x', new TextContent( 'Foo' ) );
+               $barZ = SlotRecord::newUnsaved( 'z', new TextContent( 'Bar' ) );
+               $fooY = SlotRecord::newUnsaved( 'y', new TextContent( 'Foo' ) );
+               $barZS = SlotRecord::newSaved( 7, 7, 'xyz', $barZ );
+               $barZ2 = SlotRecord::newUnsaved( 'z', new TextContent( 'Baz' ) );
+
+               $a = $this->newRevisionSlots( [ 'x' => $fooX, 'z' => $barZ ] );
+               $a2 = $this->newRevisionSlots( [ 'x' => $fooX, 'z' => $barZ ] );
+               $a3 = $this->newRevisionSlots( [ 'x' => $fooX, 'z' => $barZS ] );
+               $b = $this->newRevisionSlots( [ 'y' => $fooY, 'z' => $barZ ] );
+               $c = $this->newRevisionSlots( [ 'x' => $fooX, 'z' => $barZ2 ] );
+
+               yield 'same instance' => [ $a, $a, [] ];
+               yield 'same slots' => [ $a, $a2, [] ];
+               yield 'same content' => [ $a, $a3, [] ];
+
+               yield 'different roles' => [ $a, $b, [ 'x', 'y' ] ];
+               yield 'different content' => [ $a, $c, [ 'z' ] ];
+       }
+
+       /**
+        * @dataProvider provideGetRolesWithDifferentContent
+        * @covers \MediaWiki\Storage\RevisionSlots::getRolesWithDifferentContent
+        */
+       public function testGetRolesWithDifferentContent( RevisionSlots $a, RevisionSlots $b, $roles ) {
+               $this->assertArrayEquals( $roles, $a->getRolesWithDifferentContent( $b ) );
+               $this->assertArrayEquals( $roles, $b->getRolesWithDifferentContent( $a ) );
+       }
+
 }
index 07f1f82..b5f7322 100644 (file)
@@ -86,9 +86,9 @@ class SqlBlobStoreTest extends MediaWikiTestCase {
        }
 
        public function provideDecompress() {
-               yield '(no legacy encoding), false in false out' => [ false, false, [], false ];
                yield '(no legacy encoding), empty in empty out' => [ false, '', [], '' ];
                yield '(no legacy encoding), empty in empty out' => [ false, 'A', [], 'A' ];
+               yield '(no legacy encoding), error flag -> false' => [ false, 'X', [ 'error' ], false ];
                yield '(no legacy encoding), string in with gzip flag returns string' => [
                        // gzip string below generated with gzdeflate( 'AAAABBAAA' )
                        false, "sttttr\002\022\000", [ 'gzip' ], 'AAAABBAAA',
@@ -166,6 +166,16 @@ class SqlBlobStoreTest extends MediaWikiTestCase {
                );
        }
 
+       /**
+        * @covers \MediaWiki\Storage\SqlBlobStore::decompressData
+        */
+       public function testDecompressData_InvalidArgumentException() {
+               $store = $this->getBlobStore();
+
+               $this->setExpectedException( InvalidArgumentException::class );
+               $store->decompressData( false, [] );
+       }
+
        /**
         * @covers \MediaWiki\Storage\SqlBlobStore::compressData
         */
index 584c60c..f06d97e 100644 (file)
@@ -434,6 +434,35 @@ class ApiMainTest extends ApiTestCase {
                }
        }
 
+       /**
+        * Test that 'assert' is processed before module errors
+        */
+       public function testAssertBeforeModule() {
+               // Sanity check that the query without assert throws too-many-titles
+               try {
+                       $this->doApiRequest( [
+                               'action' => 'query',
+                               'titles' => implode( '|', range( 1, ApiBase::LIMIT_SML1 + 1 ) ),
+                       ], null, null, new User );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( ApiUsageException $e ) {
+                       $this->assertTrue( self::apiExceptionHasCode( $e, 'too-many-titles' ), 'sanity check' );
+               }
+
+               // Now test that the assert happens first
+               try {
+                       $this->doApiRequest( [
+                               'action' => 'query',
+                               'titles' => implode( '|', range( 1, ApiBase::LIMIT_SML1 + 1 ) ),
+                               'assert' => 'user',
+                       ], null, null, new User );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( ApiUsageException $e ) {
+                       $this->assertTrue( self::apiExceptionHasCode( $e, 'assertuserfailed' ),
+                               "Error '{$e->getMessage()}' matched expected 'assertuserfailed'" );
+               }
+       }
+
        /**
         * Test if all classes in the main module manager exists
         */
index c0fecf0..fbc1bed 100644 (file)
@@ -66,7 +66,7 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                        $preferences[$k] = [
                                'type' => 'text',
                                'section' => 'test',
-                               'label' => '&#160;',
+                               'label' => "\u{00A0}",
                        ];
                }
 
@@ -81,7 +81,7 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                                ],
                        ],
                        'section' => 'test',
-                       'label' => '&#160;',
+                       'label' => "\u{00A0}",
                        'prefix' => 'testmultiselect-',
                        'default' => [],
                ];
index 216228a..d7c8ec4 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @covers ChangeTags
  * @group Database
@@ -505,6 +507,7 @@ class ChangeTagsTest extends MediaWikiTestCase {
                $dbw = wfGetDB( DB_MASTER );
                $dbw->delete( 'change_tag', '*' );
                $dbw->delete( 'change_tag_def', '*' );
+               MediaWikiServices::getInstance()->resetServiceForTesting( 'ChangeTagDefStore' );
 
                $rcId = 123;
                ChangeTags::updateTags( [ 'tag1', 'tag2' ], [], $rcId );
index 0ea1328..ccad4a4 100644 (file)
@@ -37,4 +37,77 @@ class XhprofTest extends PHPUnit\Framework\TestCase {
                $enabled->setValue( true );
                $xhprof->getMethod( 'enable' )->invoke( null );
        }
+
+       /**
+        * callAny() calls the first function of the list.
+        *
+        * @covers Xhprof::callAny
+        * @dataProvider provideCallAny
+        */
+       public function testCallAny( array $functions, array $args, $expectedResult ) {
+               $xhprof = new ReflectionClass( Xhprof::class );
+               $callAny = $xhprof->getMethod( 'callAny' );
+               $callAny->setAccessible( true );
+
+               $this->assertEquals( $expectedResult,
+                       $callAny->invoke( null, $functions, $args ) );
+       }
+
+       /**
+        * Data provider for testCallAny().
+       */
+       public function provideCallAny() {
+               return [
+                       [
+                               [ 'wfTestCallAny_func1', 'wfTestCallAny_func2', 'wfTestCallAny_func3' ],
+                               [ 3, 4 ],
+                               12
+                       ],
+                       [
+                               [ 'wfTestCallAny_nosuchfunc1', 'wfTestCallAny_func2', 'wfTestCallAny_func3' ],
+                               [ 3, 4 ],
+                               7
+                       ],
+                       [
+                               [ 'wfTestCallAny_nosuchfunc1', 'wfTestCallAny_nosuchfunc2', 'wfTestCallAny_func3' ],
+                               [ 3, 4 ],
+                               -1
+                       ]
+
+               ];
+       }
+
+       /**
+        * callAny() throws an exception when all functions are unavailable.
+        *
+        * @expectedException        Exception
+        * @expectedExceptionMessage Neither xhprof nor tideways are installed
+        * @covers Xhprof::callAny
+        */
+       public function testCallAnyNoneAvailable() {
+               $xhprof = new ReflectionClass( Xhprof::class );
+               $callAny = $xhprof->getMethod( 'callAny' );
+               $callAny->setAccessible( true );
+
+               $callAny->invoke( $xhprof, [
+                       'wfTestCallAny_nosuchfunc1',
+                       'wfTestCallAny_nosuchfunc2',
+                       'wfTestCallAny_nosuchfunc3'
+               ] );
+       }
+}
+
+/** Test function #1 for XhprofTest::testCallAny */
+function wfTestCallAny_func1( $a, $b ) {
+       return $a * $b;
+}
+
+/** Test function #2 for XhprofTest::testCallAny */
+function wfTestCallAny_func2( $a, $b ) {
+       return $a + $b;
+}
+
+/** Test function #3 for XhprofTest::testCallAny */
+function wfTestCallAny_func3( $a, $b ) {
+       return $a - $b;
 }
index 6a87dfb..63cf02f 100644 (file)
@@ -1028,6 +1028,7 @@ more stuff
                // Use the confirmed group for user2 to make sure the user is different
                $user2 = $this->getTestUser( [ 'confirmed' ] )->getUser();
 
+               // TODO: MCR: test rollback of multiple slots!
                $page = $this->newPage( __METHOD__ );
 
                // Make some edits
@@ -1083,6 +1084,11 @@ more stuff
                $this->assertEquals( $rev2->getSha1(), $page->getRevision()->getSha1(),
                        "rollback did not revert to the correct revision" );
                $this->assertEquals( "one\n\ntwo", $page->getContent()->getNativeData() );
+
+               // TODO: MCR: assert origin once we write slot data
+               // $mainSlot = $page->getRevision()->getRevisionRecord()->getSlot( 'main' );
+               // $this->assertTrue( $mainSlot->isInherited(), 'isInherited' );
+               // $this->assertSame( $rev2->getId(), $mainSlot->getOrigin(), 'getOrigin' );
        }
 
        /**
index 6983704..810d1fe 100644 (file)
@@ -561,4 +561,32 @@ mw.loader.register( [
                );
        }
 
+       /**
+        * @covers ResourceLoaderStartupModule::getDefinitionSummary
+        */
+       public function testGetVersionHash_varyConfig() {
+               $context = $this->getResourceLoaderContext();
+
+               $this->setMwGlobals( 'wgArticlePath', '/w1' );
+               $module = new ResourceLoaderStartupModule();
+               $version1 = $module->getVersionHash( $context );
+               $module = new ResourceLoaderStartupModule();
+               $version2 = $module->getVersionHash( $context );
+               $this->setMwGlobals( 'wgArticlePath', '/w3' );
+               $module = new ResourceLoaderStartupModule();
+               $version3 = $module->getVersionHash( $context );
+
+               $this->assertEquals(
+                       $version1,
+                       $version2,
+                       'Deterministic version hash'
+               );
+
+               $this->assertNotEquals(
+                       $version1,
+                       $version3,
+                       'Config change impacts version hash'
+               );
+       }
+
 }
index 1ec6f72..3b511c2 100644 (file)
@@ -70,6 +70,7 @@ return [
                        'tests/qunit/suites/resources/mediawiki/mediawiki.template.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.template.mustache.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.test.js',
+                       'tests/qunit/suites/resources/mediawiki/mediawiki.base.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.loader.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.html.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.inspect.test.js',
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.base.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.base.test.js
new file mode 100644 (file)
index 0000000..c415953
--- /dev/null
@@ -0,0 +1,126 @@
+( function ( mw ) {
+       QUnit.module( 'mediawiki.base' );
+
+       QUnit.test( 'mw.hook - basic', function ( assert ) {
+               var q = [];
+               mw.hook( 'test.hook.basic' ).add( function () {
+                       q.push( 'basic' );
+               } );
+
+               mw.hook( 'test.hook.basic' ).fire();
+               assert.deepEqual( q, [ 'basic' ], 'Callback' );
+       } );
+
+       QUnit.test( 'mw.hook - name', function ( assert ) {
+               var q = [];
+               mw.hook( 'hasOwnProperty' ).add( function () {
+                       q.push( 'prototype' );
+               } );
+
+               mw.hook( 'hasOwnProperty' ).fire();
+               assert.deepEqual( q, [ 'prototype' ], 'Callback' );
+       } );
+
+       QUnit.test( 'mw.hook - data', function ( assert ) {
+               var q;
+
+               mw.hook( 'test.hook.data' ).add( function ( data1, data2 ) {
+                       q = [ data1, data2 ];
+               } );
+               mw.hook( 'test.hook.data' ).fire( 'example', [ 'two' ] );
+
+               assert.deepEqual( q,
+                       [
+                               'example',
+                               [ 'two' ]
+                       ],
+                       'Data containing a string and an array'
+               );
+       } );
+
+       QUnit.test( 'mw.hook - chainable', function ( assert ) {
+               var hook, add, fire, q = [];
+
+               hook = mw.hook( 'test.hook.chainable' );
+               assert.strictEqual( hook.add(), hook, 'hook.add is chainable' );
+               assert.strictEqual( hook.remove(), hook, 'hook.remove is chainable' );
+               assert.strictEqual( hook.fire(), hook, 'hook.fire is chainable' );
+
+               hook = mw.hook( 'test.hook.detach' );
+               add = hook.add;
+               fire = hook.fire;
+               add( function ( x, y ) {
+                       q.push( x, y );
+               } );
+               fire( 'x', 'y' );
+               assert.deepEqual( q, [ 'x', 'y' ], 'Contextless firing with data' );
+       } );
+
+       QUnit.test( 'mw.hook - memory before', function ( assert ) {
+               var q;
+
+               q = [];
+               mw.hook( 'test.hook.fireBefore' ).fire().add( function () {
+                       q.push( 'X' );
+               } );
+               assert.deepEqual( q, [ 'X' ], 'Remember previous firing for newly added handler' );
+
+               q = [];
+               mw.hook( 'test.hook.fireTwiceBefore' ).fire( 'Y1' ).fire( 'Y2' ).add( function ( data ) {
+                       q.push( data );
+               } );
+               assert.deepEqual( q, [ 'Y2' ], 'Remember only the most recent firing' );
+       } );
+
+       QUnit.test( 'mw.hook - memory before and after', function ( assert ) {
+               var q1 = [], q2 = [];
+               mw.hook( 'test.hook.many' )
+                       .add( function ( chr ) {
+                               q1.push( chr );
+                       } )
+                       .fire( 'x' ).fire( 'y' ).fire( 'z' )
+                       .add( function ( chr ) {
+                               q2.push( chr );
+                       } );
+
+               assert.deepEqual( q1, [ 'x', 'y', 'z' ], 'Multiple fires after callback addition' );
+               assert.deepEqual( q2, [ 'z' ], 'Last fire applied to new handler' );
+       } );
+
+       QUnit.test( 'mw.hook - data variadic', function ( assert ) {
+               var q = [];
+               function callback( chr ) {
+                       q.push( chr );
+               }
+
+               mw.hook( 'test.hook.variadic' )
+                       .add(
+                               callback,
+                               callback,
+                               function ( chr ) {
+                                       q.push( chr );
+                               },
+                               callback
+                       )
+                       .fire( 'x' )
+                       .remove(
+                               function () {
+                                       'not-added';
+                               },
+                               callback
+                       )
+                       .fire( 'y' )
+                       .remove( callback )
+                       .fire( 'z' );
+
+               assert.deepEqual(
+                       q,
+                       [ 'x', 'x', 'x', 'x', 'y', 'z' ],
+                       '"add" and "remove" support variadic arguments. ' +
+                               '"add" does not filter unique. ' +
+                               '"remove" removes all equal by reference. ' +
+                               '"remove" is silent if the function is not found'
+               );
+       } );
+
+}( mediaWiki ) );
index 6458b17..83e695f 100644 (file)
 
                assert.strictEqual( mw.msg( 'int-msg' ), 'Some Other Message', 'int is resolved' );
        } );
-
-       QUnit.test( 'mw.hook', function ( assert ) {
-               var hook, add, fire, chars, callback;
-
-               mw.hook( 'test.hook.unfired' ).add( function () {
-                       assert.ok( false, 'Unfired hook' );
-               } );
-
-               mw.hook( 'test.hook.basic' ).add( function () {
-                       assert.ok( true, 'Basic callback' );
-               } );
-               mw.hook( 'test.hook.basic' ).fire();
-
-               mw.hook( 'hasOwnProperty' ).add( function () {
-                       assert.ok( true, 'hook with name of predefined method' );
-               } );
-               mw.hook( 'hasOwnProperty' ).fire();
-
-               mw.hook( 'test.hook.data' ).add( function ( data1, data2 ) {
-                       assert.strictEqual( data1, 'example', 'Fire with data (string param)' );
-                       assert.deepEqual( data2, [ 'two' ], 'Fire with data (array param)' );
-               } );
-               mw.hook( 'test.hook.data' ).fire( 'example', [ 'two' ] );
-
-               hook = mw.hook( 'test.hook.chainable' );
-               assert.strictEqual( hook.add(), hook, 'hook.add is chainable' );
-               assert.strictEqual( hook.remove(), hook, 'hook.remove is chainable' );
-               assert.strictEqual( hook.fire(), hook, 'hook.fire is chainable' );
-
-               hook = mw.hook( 'test.hook.detach' );
-               add = hook.add;
-               fire = hook.fire;
-               add( function ( x, y ) {
-                       assert.deepEqual( [ x, y ], [ 'x', 'y' ], 'Detached (contextless) with data' );
-               } );
-               fire( 'x', 'y' );
-
-               mw.hook( 'test.hook.fireBefore' ).fire().add( function () {
-                       assert.ok( true, 'Invoke handler right away if it was fired before' );
-               } );
-
-               mw.hook( 'test.hook.fireTwiceBefore' ).fire().fire().add( function () {
-                       assert.ok( true, 'Invoke handler right away if it was fired before (only last one)' );
-               } );
-
-               chars = [];
-
-               mw.hook( 'test.hook.many' )
-                       .add( function ( chr ) {
-                               chars.push( chr );
-                       } )
-                       .fire( 'x' ).fire( 'y' ).fire( 'z' )
-                       .add( function ( chr ) {
-                               assert.strictEqual( chr, 'z', 'Adding callback later invokes right away with last data' );
-                       } );
-
-               assert.deepEqual( chars, [ 'x', 'y', 'z' ], 'Multiple callbacks with multiple fires' );
-
-               chars = [];
-               callback = function ( chr ) {
-                       chars.push( chr );
-               };
-
-               mw.hook( 'test.hook.variadic' )
-                       .add(
-                               callback,
-                               callback,
-                               function ( chr ) {
-                                       chars.push( chr );
-                               },
-                               callback
-                       )
-                       .fire( 'x' )
-                       .remove(
-                               function () {
-                                       'not-added';
-                               },
-                               callback
-                       )
-                       .fire( 'y' )
-                       .remove( callback )
-                       .fire( 'z' );
-
-               assert.deepEqual(
-                       chars,
-                       [ 'x', 'x', 'x', 'x', 'y', 'z' ],
-                       '"add" and "remove" support variadic arguments. ' +
-                               '"add" does not filter unique. ' +
-                               '"remove" removes all equal by reference. ' +
-                               '"remove" is silent if the function is not found'
-               );
-       } );
-
 }( mediaWiki ) );
index 02d3843..edecc91 100644 (file)
@@ -2,12 +2,7 @@ const Page = require( 'wdio-mediawiki/Page' );
 
 class RecentChangesPage extends Page {
        get changesList() { return browser.element( '.mw-changeslist' ); }
-       get changesListTitles() { return this.changesList.$$( '.mw-changeslist-title' ); }
-       get titles() {
-               return this.changesListTitles.map( function ( element ) {
-                       return element.getText();
-               } );
-       }
+       get titles() { return this.changesList.$$( '.mw-changeslist-title' ); }
 
        open() {
                super.openTitle( 'Special:RecentChanges' );
diff --git a/tests/selenium/pageobjects/watchable.page.js b/tests/selenium/pageobjects/watchable.page.js
new file mode 100644 (file)
index 0000000..896b2f4
--- /dev/null
@@ -0,0 +1,13 @@
+const Page = require( 'wdio-mediawiki/Page' );
+
+class WatchablePage extends Page {
+
+       get confirmWatch() { return browser.element( '#mw-content-text button[type="submit"]' ); }
+
+       watch( title ) {
+               super.openTitle( title, { action: 'watch' } );
+               this.confirmWatch.click();
+       }
+}
+
+module.exports = new WatchablePage();
diff --git a/tests/selenium/pageobjects/watchlist.page.js b/tests/selenium/pageobjects/watchlist.page.js
new file mode 100644 (file)
index 0000000..58a003f
--- /dev/null
@@ -0,0 +1,15 @@
+const Page = require( 'wdio-mediawiki/Page' );
+
+class WatchlistPage extends Page {
+       get titles() {
+               return browser.element( '.mw-changeslist' )
+                       .$$( '.mw-changeslist-line .mw-title' );
+       }
+
+       open() {
+               super.openTitle( 'Special:Watchlist' );
+       }
+
+}
+
+module.exports = new WatchlistPage();
index 069a6aa..032cbf0 100644 (file)
@@ -4,16 +4,13 @@ const assert = require( 'assert' ),
        RestorePage = require( '../pageobjects/restore.page' ),
        EditPage = require( '../pageobjects/edit.page' ),
        HistoryPage = require( '../pageobjects/history.page' ),
-       UserLoginPage = require( '../pageobjects/userlogin.page' );
+       UserLoginPage = require( '../pageobjects/userlogin.page' ),
+       Util = require( 'wdio-mediawiki/Util' );
 
 describe( 'Page', function () {
        var content,
                name;
 
-       function getTestString( suffix = 'defaultsuffix' ) {
-               return Math.random().toString() + '-Iñtërnâtiônàlizætiøn☃-' + suffix;
-       }
-
        before( function () {
                // disable VisualEditor welcome dialog
                UserLoginPage.open();
@@ -22,8 +19,8 @@ describe( 'Page', function () {
 
        beforeEach( function () {
                browser.deleteCookie();
-               content = getTestString( 'beforeEach-content' );
-               name = getTestString( 'beforeEach-name' );
+               content = Util.getTestString( 'beforeEach-content-' );
+               name = Util.getTestString( 'BeforeEach-name-' );
        } );
 
        it( 'should be creatable', function () {
@@ -36,7 +33,7 @@ describe( 'Page', function () {
        } );
 
        it( 'should be re-creatable', function () {
-               let initialContent = getTestString( 'initialContent' );
+               let initialContent = Util.getTestString( 'initialContent-' );
 
                // create
                browser.call( function () {
@@ -63,7 +60,7 @@ describe( 'Page', function () {
                } );
 
                // edit
-               let editContent = getTestString( 'editContent' );
+               let editContent = Util.getTestString( 'editContent-' );
                EditPage.edit( name, editContent );
 
                // check
index 418fbb1..ee06971 100644 (file)
@@ -1,19 +1,16 @@
 const assert = require( 'assert' ),
        Api = require( 'wdio-mediawiki/Api' ),
-       RecentChangesPage = require( '../pageobjects/recentchanges.page' );
+       RecentChangesPage = require( '../pageobjects/recentchanges.page' ),
+       Util = require( 'wdio-mediawiki/Util' );
 
 describe( 'Special:RecentChanges', function () {
        let content,
                name;
 
-       function getTestString() {
-               return Math.random().toString() + '-öäü-♠♣♥♦';
-       }
-
        beforeEach( function () {
                browser.deleteCookie();
-               content = getTestString();
-               name = getTestString();
+               content = Util.getTestString();
+               name = Util.getTestString();
        } );
 
        it( 'shows page creation', function () {
@@ -23,7 +20,7 @@ describe( 'Special:RecentChanges', function () {
 
                RecentChangesPage.open();
 
-               assert.strictEqual( name, RecentChangesPage.titles[ 0 ] );
+               assert.strictEqual( RecentChangesPage.titles[ 0 ].getText(), name );
        } );
 
 } );
diff --git a/tests/selenium/specs/specialwatchlist.js b/tests/selenium/specs/specialwatchlist.js
new file mode 100644 (file)
index 0000000..de36b90
--- /dev/null
@@ -0,0 +1,41 @@
+const assert = require( 'assert' ),
+       Api = require( 'wdio-mediawiki/Api' ),
+       WatchlistPage = require( '../pageobjects/watchlist.page' ),
+       WatchablePage = require( '../pageobjects/watchable.page' ),
+       LoginPage = require( 'wdio-mediawiki/LoginPage' ),
+       Util = require( 'wdio-mediawiki/Util' );
+
+describe( 'Special:Watchlist', function () {
+       let username, password;
+
+       before( function () {
+               username = Util.getTestString( 'user-' );
+               password = Util.getTestString( 'password-' );
+
+               browser.call( function () {
+                       return Api.createAccount( username, password );
+               } );
+       } );
+
+       beforeEach( function () {
+               browser.deleteCookie();
+               LoginPage.login( username, password );
+       } );
+
+       it( 'should show page with new edit', function () {
+               const title = Util.getTestString( 'Title-' );
+
+               browser.call( function () {
+                       return Api.edit( title, Util.getTestString() ); // create
+               } );
+               WatchablePage.watch( title );
+               browser.call( function () {
+                       return Api.edit( title, Util.getTestString() ); // edit
+               } );
+
+               WatchlistPage.open();
+
+               assert.strictEqual( WatchlistPage.titles[ 0 ].getText(), title );
+       } );
+
+} );
index 4d22645..b64d9f5 100644 (file)
@@ -2,7 +2,8 @@ const assert = require( 'assert' ),
        CreateAccountPage = require( '../pageobjects/createaccount.page' ),
        PreferencesPage = require( '../pageobjects/preferences.page' ),
        UserLoginPage = require( 'wdio-mediawiki/LoginPage' ),
-       Api = require( 'wdio-mediawiki/Api' );
+       Api = require( 'wdio-mediawiki/Api' ),
+       Util = require( 'wdio-mediawiki/Util' );
 
 describe( 'User', function () {
        var password,
@@ -16,8 +17,8 @@ describe( 'User', function () {
 
        beforeEach( function () {
                browser.deleteCookie();
-               username = `User-${Math.random().toString()}`;
-               password = Math.random().toString();
+               username = Util.getTestString( 'User-' );
+               password = Util.getTestString();
        } );
 
        it( 'should be able to create account', function () {
@@ -42,7 +43,7 @@ describe( 'User', function () {
        } );
 
        it( 'should be able to change preferences', function () {
-               var realName = Math.random().toString();
+               var realName = Util.getTestString();
 
                // create
                browser.call( function () {
index bfce387..50e940f 100644 (file)
@@ -1,6 +1,10 @@
 # Notable changes
 
-## [Unreleased]
+## v0.2.0
+
+* Util: Added getTestString().
+
+## v0.1.0
 
 * Api: Added initial version.
 * Page: Added initial version.
diff --git a/tests/selenium/wdio-mediawiki/Util.js b/tests/selenium/wdio-mediawiki/Util.js
new file mode 100644 (file)
index 0000000..fe1ebed
--- /dev/null
@@ -0,0 +1,5 @@
+module.exports = {
+       getTestString( prefix = '' ) {
+               return prefix + Math.random().toString() + '-Iñtërnâtiônàlizætiøn☃';
+       }
+};
index be7ed33..56ea045 100644 (file)
@@ -1,6 +1,6 @@
 {
   "name": "wdio-mediawiki",
-  "version": "0.1.0",
+  "version": "0.2.0",
   "description": "WebdriverIO plugin for testing a MediaWiki site.",
   "homepage": "https://gerrit.wikimedia.org/g/mediawiki/core/+/master/tests/selenium/wdio-mediawiki/",
   "license": "MIT",
index f785d36..8b47dff 100644 (file)
@@ -46,6 +46,7 @@ exports.config = {
                relPath( './tests/selenium/specs/**/*.js' ),
                relPath( './extensions/*/tests/selenium/specs/**/*.js' ),
                relPath( './extensions/VisualEditor/modules/ve-mw/tests/selenium/specs/**/*.js' ),
+               relPath( './extensions/Wikibase/repo/tests/selenium/specs/**/*.js' ),
                relPath( './skins/*/tests/selenium/specs/**/*.js' )
        ],
        // Patterns to exclude