Merge "Set default wgMultiContentRevisionSchemaMigrationStage to write-both"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 19 Jul 2018 16:59:29 +0000 (16:59 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 19 Jul 2018 16:59:29 +0000 (16:59 +0000)
269 files changed:
RELEASE-NOTES-1.32
autoload.php
composer.json
docs/hooks.txt
docs/uidesign/table-layout.html [deleted file]
includes/Category.php
includes/DefaultSettings.php
includes/GlobalFunctions.php
includes/Linker.php
includes/MediaWikiServices.php
includes/OutputPage.php
includes/PageProps.php
includes/Preferences.php
includes/PrefixSearch.php
includes/ServiceWiring.php
includes/Setup.php
includes/Title.php
includes/actions/HistoryAction.php
includes/api/ApiQuerySearch.php
includes/api/i18n/zh-hant.json
includes/auth/AuthManager.php
includes/auth/ConfirmLinkSecondaryAuthenticationProvider.php
includes/cache/LinkCache.php
includes/changes/ChangesList.php
includes/changes/EnhancedChangesList.php
includes/config/ConfigRepository.php [new file with mode: 0644]
includes/deferred/LinksDeletionUpdate.php
includes/filerepo/FileBackendDBRepoWrapper.php
includes/filerepo/RepoGroup.php
includes/htmlform/fields/HTMLTitleTextField.php
includes/htmlform/fields/HTMLUserTextField.php
includes/installer/i18n/be-tarask.json
includes/installer/i18n/bn.json
includes/installer/i18n/es.json
includes/installer/i18n/gl.json
includes/installer/i18n/ru.json
includes/installer/i18n/sr-ec.json
includes/installer/i18n/zh-hans.json
includes/jobqueue/JobQueueGroup.php
includes/jobqueue/JobQueueSecondTestQueue.php [deleted file]
includes/libs/MapCacheLRU.php
includes/libs/filebackend/FileBackendStore.php
includes/libs/filebackend/SwiftFileBackend.php
includes/libs/lockmanager/MemcLockManager.php
includes/libs/objectcache/BagOStuff.php
includes/libs/objectcache/MultiWriteBagOStuff.php
includes/libs/objectcache/WANObjectCache.php
includes/libs/rdbms/database/Database.php
includes/logging/LogEventsList.php
includes/page/WikiPage.php
includes/pager/TablePager.php
includes/parser/Parser.php
includes/preferences/DefaultPreferencesFactory.php
includes/preferences/Filter.php [new file with mode: 0644]
includes/preferences/IntvalFilter.php [new file with mode: 0644]
includes/preferences/MultiUsernameFilter.php [new file with mode: 0644]
includes/preferences/TimezoneFilter.php [new file with mode: 0644]
includes/registration/ExtensionJsonValidator.php
includes/registration/ExtensionProcessor.php
includes/registration/ExtensionRegistry.php
includes/registration/Processor.php
includes/registration/VersionChecker.php
includes/search/SearchDatabase.php
includes/search/SearchEngine.php
includes/search/SearchMssql.php
includes/search/SearchMySQL.php
includes/search/SearchOracle.php
includes/search/SearchPostgres.php
includes/search/SearchSqlite.php
includes/shell/Command.php
includes/specialpage/LoginSignupSpecialPage.php
includes/specials/SpecialEditTags.php
includes/specials/SpecialEmailuser.php
includes/specials/SpecialNewpages.php
includes/specials/SpecialSearch.php
includes/specials/pagers/ContribsPager.php
includes/specials/pagers/DeletedContribsPager.php
includes/user/PasswordReset.php
includes/user/User.php
includes/widget/search/SearchFormWidget.php
languages/i18n/af.json
languages/i18n/ais.json
languages/i18n/am.json
languages/i18n/an.json
languages/i18n/ar.json
languages/i18n/arc.json
languages/i18n/ary.json
languages/i18n/arz.json
languages/i18n/as.json
languages/i18n/ase.json
languages/i18n/ast.json
languages/i18n/awa.json
languages/i18n/az.json
languages/i18n/azb.json
languages/i18n/ba.json
languages/i18n/bcc.json
languages/i18n/bcl.json
languages/i18n/be-tarask.json
languages/i18n/be.json
languages/i18n/bg.json
languages/i18n/bgn.json
languages/i18n/bjn.json
languages/i18n/bn.json
languages/i18n/br.json
languages/i18n/bs.json
languages/i18n/ca.json
languages/i18n/ce.json
languages/i18n/ckb.json
languages/i18n/crh-cyrl.json
languages/i18n/crh-latn.json
languages/i18n/cs.json
languages/i18n/cy.json
languages/i18n/da.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/dsb.json
languages/i18n/el.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/eu.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fo.json
languages/i18n/fr.json
languages/i18n/frp.json
languages/i18n/frr.json
languages/i18n/ga.json
languages/i18n/gd.json
languages/i18n/gl.json
languages/i18n/grc.json
languages/i18n/gsw.json
languages/i18n/gu.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hif-latn.json
languages/i18n/hr.json
languages/i18n/hrx.json
languages/i18n/hsb.json
languages/i18n/hu.json
languages/i18n/ia.json
languages/i18n/id.json
languages/i18n/ilo.json
languages/i18n/inh.json
languages/i18n/io.json
languages/i18n/is.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/jv.json
languages/i18n/ka.json
languages/i18n/kab.json
languages/i18n/khw.json
languages/i18n/kk-cyrl.json
languages/i18n/km.json
languages/i18n/ko.json
languages/i18n/krc.json
languages/i18n/ksh.json
languages/i18n/la.json
languages/i18n/lb.json
languages/i18n/lfn.json
languages/i18n/lg.json
languages/i18n/li.json
languages/i18n/lij.json
languages/i18n/lki.json
languages/i18n/lrc.json
languages/i18n/lt.json
languages/i18n/lus.json
languages/i18n/lv.json
languages/i18n/lzh.json
languages/i18n/mai.json
languages/i18n/mdf.json
languages/i18n/mg.json
languages/i18n/min.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/mn.json
languages/i18n/mni.json
languages/i18n/mr.json
languages/i18n/ms.json
languages/i18n/mt.json
languages/i18n/my.json
languages/i18n/myv.json
languages/i18n/nap.json
languages/i18n/nb.json
languages/i18n/nds-nl.json
languages/i18n/nds.json
languages/i18n/ne.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/oc.json
languages/i18n/or.json
languages/i18n/pl.json
languages/i18n/pms.json
languages/i18n/pnb.json
languages/i18n/prg.json
languages/i18n/ps.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/qu.json
languages/i18n/rm.json
languages/i18n/ro.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/rue.json
languages/i18n/sa.json
languages/i18n/sah.json
languages/i18n/scn.json
languages/i18n/sco.json
languages/i18n/sd.json
languages/i18n/ses.json
languages/i18n/sgs.json
languages/i18n/sh.json
languages/i18n/si.json
languages/i18n/sk.json
languages/i18n/skr-arab.json
languages/i18n/sl.json
languages/i18n/sli.json
languages/i18n/sq.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/stq.json
languages/i18n/su.json
languages/i18n/sv.json
languages/i18n/szl.json
languages/i18n/ta.json
languages/i18n/tay.json
languages/i18n/te.json
languages/i18n/th.json
languages/i18n/tk.json
languages/i18n/tl.json
languages/i18n/tr.json
languages/i18n/tt-cyrl.json
languages/i18n/tt-latn.json
languages/i18n/ug-arab.json
languages/i18n/uk.json
languages/i18n/ur.json
languages/i18n/vec.json
languages/i18n/vep.json
languages/i18n/vi.json
languages/i18n/vo.json
languages/i18n/war.json
languages/i18n/yi.json
languages/i18n/yo.json
languages/i18n/yue.json
languages/i18n/zgh.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/i18n/zh-hk.json
maintenance/interwiki.list
maintenance/interwiki.sql
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.less
resources/src/mediawiki.toc.styles/screen.less
tests/parser/parserTests.txt
tests/phpunit/data/registration/duplicate_keys.json [new file with mode: 0644]
tests/phpunit/includes/GlobalFunctions/wfArrayFilterTest.php
tests/phpunit/includes/MediaWikiServicesTest.php
tests/phpunit/includes/WebRequestTest.php
tests/phpunit/includes/api/ApiOptionsTest.php
tests/phpunit/includes/libs/MapCacheLRUTest.php
tests/phpunit/includes/libs/objectcache/BagOStuffTest.php
tests/phpunit/includes/preferences/DefaultPreferencesFactoryTest.php
tests/phpunit/includes/preferences/FiltersTest.php [new file with mode: 0644]
tests/phpunit/includes/registration/ExtensionJsonValidatorTest.php
tests/phpunit/includes/registration/VersionCheckerTest.php
tests/phpunit/includes/search/SearchEngineTest.php
tests/phpunit/includes/specials/SpecialPreferencesTest.php
tests/phpunit/mocks/search/MockCompletionSearchEngine.php

index 5110e51..5435213 100644 (file)
@@ -53,6 +53,9 @@ production.
   pages.
 * The array of hidden options ($opts) passed to the 'SpecialSearchPowerBox' hook
   is now passed by reference, allowing extensions to modify or even unset it.
+* Added new 'OutputPageAfterGetHeadLinksArray' hook, allowing extensions to
+  modify the return value of OutputPage#getHeadLinksArray in order to add,
+  remove or otherwise alter the elements to be output in the page <head>.
 
 === External library changes in 1.32 ===
 * …
@@ -89,6 +92,9 @@ production.
 * 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.
+* (T198935) User list preferences such as `email-blacklist` and similar
+  extension preferences are no longer represented as arrays when returned by
+  action=query&meta=userinfo&uiprop=options.
 
 === Action API internal changes in 1.32 ===
 * Added 'ApiParseMakeOutputPage' hook.
@@ -186,8 +192,6 @@ because of Phabricator reports.
   CapsuleMultiselectWidget. The following methods may no longer be used:
   * setItemsFromData: Use setValue instead
   * getItemsData: Use getItems instead and get the data property
-* The hook 'LogEventsListGetExtraInputs' now needs a form descriptor array
-  and not plain HTML.
 * LanguageCode::bcp47() now always returns a valid BCP 47 code.  This means
   that some MediaWiki-specific language codes, such as `simple`, are mapped
   into valid BCP 47 codes (eg `en-simple`).
@@ -261,6 +265,20 @@ because of Phabricator reports.
 * (T100681) Use of the Parsoid v1 API with the VirtualRESTService, deprecated in
   MediaWiki 1.26,  is now hard-deprecated. All known clients were converted to
   the Parsoid v3 API in May 2015.
+* $input is deprecated in hook 'LogEventsListGetExtraInputs'. Use
+  $formDescriptor instead.
+* SearchEngine::transformSearchTerm( $term ) should no longer be called prior
+  to running searchText. This method was mainly implemented to support the
+  'prefix' URI param in SpecialSearch, but there are no reasons to expose this
+  logic as it should be handled internally by SearchEngine implementations
+  supporting this feature. SearchEngine implementations should no longer
+  override this methods.
+* SearchEngine::replacePrefixes( $query ) should no longer be called prior
+  to running searchText/searchTitle.
+* (T199657) Messages for $wgFilterLogTypes labels should be no longer be in the
+  'log-show-hide-[type]' format. Instead use 'logeventslist-[type]-log'.
+* Global functions  wfArrayFilter() and wfArrayFilterByKey() are deprecated.
+  use array_filter() directly.
 
 === Other changes in 1.32 ===
 * (T198811) The following tables have had their UNIQUE indexes turned into
index 40b8acf..64c34b5 100644 (file)
@@ -703,7 +703,6 @@ $wgAutoloadLocalClasses = [
        'JobQueueMemory' => __DIR__ . '/includes/jobqueue/JobQueueMemory.php',
        'JobQueueReadOnlyError' => __DIR__ . '/includes/jobqueue/JobQueue.php',
        'JobQueueRedis' => __DIR__ . '/includes/jobqueue/JobQueueRedis.php',
-       'JobQueueSecondTestQueue' => __DIR__ . '/includes/jobqueue/JobQueueSecondTestQueue.php',
        'JobRunner' => __DIR__ . '/includes/jobqueue/JobRunner.php',
        'JobSpecification' => __DIR__ . '/includes/jobqueue/JobSpecification.php',
        'JpegHandler' => __DIR__ . '/includes/media/JpegHandler.php',
@@ -889,6 +888,7 @@ $wgAutoloadLocalClasses = [
        'MediaWiki\\Auth\\Throttler' => __DIR__ . '/includes/auth/Throttler.php',
        'MediaWiki\\Auth\\UserDataAuthenticationRequest' => __DIR__ . '/includes/auth/UserDataAuthenticationRequest.php',
        'MediaWiki\\Auth\\UsernameAuthenticationRequest' => __DIR__ . '/includes/auth/UsernameAuthenticationRequest.php',
+       'MediaWiki\\Config\\ConfigRepository' => __DIR__ . '/includes/config/ConfigRepository.php',
        'MediaWiki\\DB\\PatchFileLocation' => __DIR__ . '/includes/db/PatchFileLocation.php',
        'MediaWiki\\Diff\\ComplexityException' => __DIR__ . '/includes/diff/ComplexityException.php',
        'MediaWiki\\Diff\\WordAccumulator' => __DIR__ . '/includes/diff/WordAccumulator.php',
index f8de4c3..3cd5ea3 100644 (file)
@@ -63,6 +63,7 @@
                "mediawiki/mediawiki-codesniffer": "20.0.0",
                "monolog/monolog": "~1.22.1",
                "nikic/php-parser": "3.1.3",
+               "seld/jsonlint": "1.7.1",
                "nmred/kafka-php": "0.1.5",
                "phpunit/phpunit": "4.8.36 || ^6.5",
                "psy/psysh": "0.9.6",
index c7874c3..40777da 100644 (file)
@@ -2187,6 +2187,7 @@ $autocreated: Boolean, whether this was an auto-creation
 Special:Log for a specific log type
 $type: String of log type being displayed
 $logEventsList: LogEventsList object for context and access to the WebRequest
+&$input: string HTML of an input element (deprecated, use $formDescriptor instead)
 &$formDescriptor: array HTMLForm's form descriptor
 
 'LogEventsListShowLogExtract': Called before the string is added to OutputPage.
@@ -2439,6 +2440,12 @@ users and/or IP addresses too.
 &$otherBlockLink: An array with links to other block logs
 $ip: The requested IP address or username
 
+'OutputPageAfterGetHeadLinksArray': Called in OutputPage#getHeadLinksArray right
+before returning the result.
+&$tags: array containing all <head> links generated so far. The array format is
+"link name or number => 'link HTML'".
+$out: the OutputPage object
+
 'OutputPageBeforeHTML': A page has been processed by the parser and the
 resulting HTML is about to be displayed.
 &$parserOutput: the parserOutput (object) that corresponds to the page
diff --git a/docs/uidesign/table-layout.html b/docs/uidesign/table-layout.html
deleted file mode 100644 (file)
index 2c26819..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-       <style>
-               /** This is just for coloring: */
-               table { border: 1px solid #CC0; }
-               td { border: 1px solid  #CCC; }
-
-               table {
-                       width: 100%;
-                       table-layout: fixed;
-               }
-
-               #first {
-                       width: 300px;
-               }
-       </style>
-</head>
-<body>
-
-<p>
-This play with table-layout:fixed; and applying the width to colgroup or col element. Firefox only recongize the width if it is applied on col element!</p>
-<p>
-On a perfect browser, both tables should look the same</p>
-
-<dl>
-       <dt>colgroup</dt>
-       <dd>300 px width is applied to the first colgroup element</dd>
-</dl>
-<div style="width: 400px;">
-<table>
-       <colgroup id="first" /></colgroup>
-       <colgroup id="second"/></colgroup>
-       <colgroup id="third" /></colgroup>
-       <tr>
-               <td>Very long?</td>
-               <td>#</td>
-               <td>$</td>
-       </tr>
-</table>
-</div>
-
-<dl>
-       <dt>col</dt>
-       <dd>Each colgroup has an additional col element. The first col element is applied the 300 px width</dd>
-</dl>
-
-<div style="width: 400px;">
-<table>
-       <colgroup><col id="first" /></colgroup>
-       <colgroup><col id="second"/></colgroup>
-       <colgroup><col id="third" /></colgroup>
-       <tr>
-               <td>Very long?</td>
-               <td>#</td>
-               <td>$</td>
-       </tr>
-</table>
-</div>
index f8ac8ae..3352c2c 100644 (file)
@@ -420,4 +420,45 @@ class Category {
 
                return true;
        }
+
+       /**
+        * Call refreshCounts() if there are no entries in the categorylinks table
+        * or if the category table has a row that states that there are no entries
+        *
+        * Due to lock errors or other failures, the precomputed counts can get out of sync,
+        * making it hard to know when to delete the category row without checking the
+        * categorylinks table.
+        *
+        * @return bool Whether links were refreshed
+        * @since 1.32
+        */
+       public function refreshCountsIfEmpty() {
+               $dbw = wfGetDB( DB_MASTER );
+
+               $hasLink = $dbw->selectField(
+                       'categorylinks',
+                       '1',
+                       [ 'cl_to' => $this->getName() ],
+                       __METHOD__
+               );
+               if ( !$hasLink ) {
+                       $this->refreshCounts(); // delete any category table entry
+
+                       return true;
+               }
+
+               $hasBadRow = $dbw->selectField(
+                       'category',
+                       '1',
+                       [ 'cat_title' => $this->getName(), 'cat_pages <= 0' ],
+                       __METHOD__
+               );
+               if ( $hasBadRow ) {
+                       $this->refreshCounts(); // clean up this row
+
+                       return true;
+               }
+
+               return false;
+       }
 }
index a74866e..2811613 100644 (file)
@@ -377,7 +377,13 @@ $wgActionPaths = [];
  */
 
 /**
- * Uploads have to be specially set up to be secure
+ * Allow users to upload files.
+ *
+ * Use $wgLocalFileRepo to control how and where uploads are stored.
+ * Disabled by default as for security reasons.
+ * See <https://www.mediawiki.org/wiki/Manual:Configuring_file_uploads>.
+ *
+ * @since 1.5
  */
 $wgEnableUploads = false;
 
@@ -491,8 +497,8 @@ $wgImgAuthUrlPathMap = [];
  *   - scriptDirUrl      URL of the MediaWiki installation, equivalent to $wgScriptPath, e.g.
  *                       https://en.wikipedia.org/w
  *   - articleUrl        Equivalent to $wgArticlePath, e.g. https://en.wikipedia.org/wiki/$1
- *   - fetchDescription  Fetch the text of the remote file description page. Equivalent to
- *                       $wgFetchCommonsDescriptions.
+ *   - fetchDescription  Fetch the text of the remote file description page and display them
+ *                       on the local wiki.
  *   - abbrvThreshold    File names over this size will use the short form of thumbnail names.
  *                       Short thumbnail names only have the width, parameters, and the extension.
  *
@@ -500,7 +506,8 @@ $wgImgAuthUrlPathMap = [];
  *   - dbType, dbServer, dbUser, dbPassword, dbName, dbFlags
  *                       equivalent to the corresponding member of $wgDBservers
  *   - tablePrefix       Table prefix, the foreign wiki's $wgDBprefix
- *   - hasSharedCache    True if the wiki's shared cache is accessible via the local $wgMemc
+ *   - hasSharedCache    Set to true if the foreign wiki's $wgMainCacheType is identical to,
+ *                       and accesible from, this wiki.
  *
  * ForeignAPIRepo:
  *   - apibase              Use for the foreign API's URL
@@ -518,17 +525,133 @@ $wgImgAuthUrlPathMap = [];
 $wgLocalFileRepo = false;
 
 /**
+ * Enable the use of files from one or more other wikis.
+ *
+ * If you operate multiple wikis, you can declare a shared upload path here.
+ * Uploads to the local wiki will NOT be stored here - See $wgLocalFileRepo
+ * and $wgUploadDirectory for that.
+ *
+ * The wiki will only consider the foreign repository if no file of the given name
+ * is found in the local repository (e.g. via `[[File:..]]` syntax).
+ *
+ * @since 1.11
  * @see $wgLocalFileRepo
  */
 $wgForeignFileRepos = [];
 
 /**
- * Use Commons as a remote file repository. Essentially a wrapper, when this
- * is enabled $wgForeignFileRepos will point at Commons with a set of default
- * settings
+ * Use Wikimedia Commons as a foreign file repository.
+ *
+ * This is a shortcut for adding an entry to to $wgForeignFileRepos
+ * for https://commons.wikimedia.org, using ForeignAPIRepo with the
+ * default settings.
+ *
+ * @since 1.16
  */
 $wgUseInstantCommons = false;
 
+/**
+ * Shortcut for adding an entry to $wgForeignFileRepos.
+ *
+ * Uses the folowing variables:
+ *
+ * - directory: $wgSharedUploadDirectory.
+ * - url: $wgSharedUploadPath.
+ * - hashLevels: Based on $wgHashedSharedUploadDirectory.
+ * - thumbScriptUrl: $wgSharedThumbnailScriptPath.
+ * - transformVia404: Based on $wgGenerateThumbnailOnParse.
+ * - descBaseUrl: $wgRepositoryBaseUrl.
+ * - fetchDescription: $wgFetchCommonsDescriptions.
+ *
+ * If $wgSharedUploadDBname is set, it uses the ForeignDBRepo
+ * class, with also the following variables:
+ *
+ * - dbName: $wgSharedUploadDBname.
+ * - dbType: $wgDBtype.
+ * - dbServer: $wgDBserver.
+ * - dbUser: $wgDBuser.
+ * - dbPassword: $wgDBpassword.
+ * - dbFlags: Based on $wgDebugDumpSql.
+ * - tablePrefix: $wgSharedUploadDBprefix,
+ * - hasSharedCache: $wgCacheSharedUploads.
+ *
+ * @var bool
+ * @since 1.3
+ */
+$wgUseSharedUploads = false;
+
+/**
+ * Shortcut for the 'directory' setting of $wgForeignFileRepos.
+ * Only used if $wgUseSharedUploads is enabled.
+ *
+ * @var string
+ * @since 1.3
+ */
+$wgSharedUploadDirectory = null;
+
+/**
+ * Shortcut for the 'url' setting of $wgForeignFileRepos.
+ * Only used if $wgUseSharedUploads is enabled.
+ *
+ * @var string
+ * @since 1.3
+ */
+$wgSharedUploadPath = null;
+
+/**
+ * Shortcut for the 'hashLevels' setting of $wgForeignFileRepos.
+ * Only used if $wgUseSharedUploads is enabled.
+ *
+ * @var bool
+ * @since 1.3
+ */
+$wgHashedSharedUploadDirectory = true;
+
+/**
+ * Shortcut for the 'descBaseUrl' setting of $wgForeignFileRepos.
+ * Only used if $wgUseSharedUploads is enabled.
+ *
+ * @since 1.5
+ */
+$wgRepositoryBaseUrl = 'https://commons.wikimedia.org/wiki/File:';
+
+/**
+ * Shortcut for the 'fetchDescription' setting of $wgForeignFileRepos.
+ * Only used if $wgUseSharedUploads is enabled.
+ *
+ * @var bool
+ * @since 1.5
+ */
+$wgFetchCommonsDescriptions = false;
+
+/**
+ * Shortcut for the ForeignDBRepo 'dbName' setting in $wgForeignFileRepos.
+ * Set this to false if the uploads do not come from a wiki.
+ * Only used if $wgUseSharedUploads is enabled.
+ *
+ * @var bool|string
+ * @since 1.4
+ */
+$wgSharedUploadDBname = false;
+
+/**
+ * Shortcut for the ForeignDBRepo 'tablePrefix' setting in $wgForeignFileRepos.
+ * Only used if $wgUseSharedUploads is enabled.
+ *
+ * @var string
+ * @since 1.5
+ */
+$wgSharedUploadDBprefix = '';
+
+/**
+ * Shortcut for the ForeignDBRepo 'hasSharedCache' setting in $wgForeignFileRepos.
+ * Only used if $wgUseSharedUploads is enabled.
+ *
+ * @var bool
+ * @since 1.5
+ */
+$wgCacheSharedUploads = true;
+
 /**
  * Array of foreign file repo names (set in $wgForeignFileRepos above) that
  * are allowable upload targets. These wikis must have some method of
@@ -676,53 +799,6 @@ $wgShowEXIF = function_exists( 'exif_read_data' );
  */
 $wgUpdateCompatibleMetadata = false;
 
-/**
- * If you operate multiple wikis, you can define a shared upload path here.
- * Uploads to this wiki will NOT be put there - they will be put into
- * $wgUploadDirectory.
- * If $wgUseSharedUploads is set, the wiki will look in the shared repository if
- * no file of the given name is found in the local repository (for [[File:..]],
- * [[Media:..]] links). Thumbnails will also be looked for and generated in this
- * directory.
- *
- * Note that these configuration settings can now be defined on a per-
- * repository basis for an arbitrary number of file repositories, using the
- * $wgForeignFileRepos variable.
- */
-$wgUseSharedUploads = false;
-
-/**
- * Full path on the web server where shared uploads can be found
- */
-$wgSharedUploadPath = null;
-
-/**
- * Fetch commons image description pages and display them on the local wiki?
- */
-$wgFetchCommonsDescriptions = false;
-
-/**
- * Path on the file system where shared uploads can be found.
- */
-$wgSharedUploadDirectory = null;
-
-/**
- * DB name with metadata about shared directory.
- * Set this to false if the uploads do not come from a wiki.
- */
-$wgSharedUploadDBname = false;
-
-/**
- * Optional table prefix used in database.
- */
-$wgSharedUploadDBprefix = '';
-
-/**
- * Cache shared metadata in memcached.
- * Don't do this if the commons wiki is in a different memcached domain
- */
-$wgCacheSharedUploads = true;
-
 /**
  * Allow for upload to be copied from an URL.
  * The timeout for copy uploads is set by $wgCopyUploadTimeout.
@@ -821,7 +897,11 @@ $wgUploadMissingFileUrl = false;
 $wgThumbnailScriptPath = false;
 
 /**
- * @see $wgThumbnailScriptPath
+ * Shortcut for the 'thumbScriptUrl' setting of $wgForeignFileRepos.
+ * Only used if $wgUseSharedUploads is enabled.
+ *
+ * @var string
+ * @since 1.3
  */
 $wgSharedThumbnailScriptPath = false;
 
@@ -840,23 +920,6 @@ $wgSharedThumbnailScriptPath = false;
  */
 $wgHashedUploadDirectory = true;
 
-/**
- * Set the following to false especially if you have a set of files that need to
- * be accessible by all wikis, and you do not want to use the hash (path/a/aa/)
- * directory layout.
- */
-$wgHashedSharedUploadDirectory = true;
-
-/**
- * Base URL for a repository wiki. Leave this blank if uploads are just stored
- * in a shared directory and not meant to be accessible through a separate wiki.
- * Otherwise the image description pages on the local wiki will link to the
- * image description page on this wiki.
- *
- * Please specify the namespace, as in the example below.
- */
-$wgRepositoryBaseUrl = "https://commons.wikimedia.org/wiki/File:";
-
 /**
  * This is the list of preferred extensions for uploading files. Uploading files
  * with extensions not in this list will trigger a warning.
@@ -7703,8 +7766,8 @@ $wgLogRestrictions = [
  * hidden by default unless the link is clicked. Import logs will be shown by
  * default, and hidden when the link is clicked.
  *
- * A message of the form log-show-hide-[type] should be added, and will be used
- * for the link text.
+ * A message of the form logeventslist-[type]-log should be added, and will be
+ * used for the link text.
  */
 $wgFilterLogTypes = [
        'patrol' => true,
index 3ea020f..afad5c4 100644 (file)
@@ -141,7 +141,7 @@ function wfArrayDiff2_cmp( $a, $b ) {
 }
 
 /**
- * Like array_filter with ARRAY_FILTER_USE_BOTH, but works pre-5.6.
+ * @deprecated since 1.32, use array_filter() with ARRAY_FILTER_USE_BOTH directly
  *
  * @param array $arr
  * @param callable $callback Will be called with the array value and key (in that order) and
@@ -149,17 +149,11 @@ function wfArrayDiff2_cmp( $a, $b ) {
  * @return array
  */
 function wfArrayFilter( array $arr, callable $callback ) {
-       if ( defined( 'ARRAY_FILTER_USE_BOTH' ) ) {
-               return array_filter( $arr, $callback, ARRAY_FILTER_USE_BOTH );
-       }
-       $filteredKeys = array_filter( array_keys( $arr ), function ( $key ) use ( $arr, $callback ) {
-               return call_user_func( $callback, $arr[$key], $key );
-       } );
-       return array_intersect_key( $arr, array_fill_keys( $filteredKeys, true ) );
+       return array_filter( $arr, $callback, ARRAY_FILTER_USE_BOTH );
 }
 
 /**
- * Like array_filter with ARRAY_FILTER_USE_KEY, but works pre-5.6.
+ * @deprecated since 1.32, use array_filter() with ARRAY_FILTER_USE_KEY directly
  *
  * @param array $arr
  * @param callable $callback Will be called with the array key and should return a bool which
@@ -167,9 +161,7 @@ function wfArrayFilter( array $arr, callable $callback ) {
  * @return array
  */
 function wfArrayFilterByKey( array $arr, callable $callback ) {
-       return wfArrayFilter( $arr, function ( $val, $key ) use ( $callback ) {
-               return call_user_func( $callback, $key );
-       } );
+       return array_filter( $arr, $callback, ARRAY_FILTER_USE_KEY );
 }
 
 /**
index 3f0ecf6..f160fd6 100644 (file)
@@ -1564,6 +1564,7 @@ class Linker {
                return '<div id="toc" class="toc">'
                        . Html::element( 'input', [
                                'type' => 'checkbox',
+                               'role' => 'button',
                                'id' => 'toctogglecheckbox',
                                'class' => 'toctogglecheckbox',
                                'style' => 'display:none',
index a756d50..7a4c2df 100644 (file)
@@ -27,6 +27,7 @@ use Wikimedia\Rdbms\LBFactory;
 use LinkCache;
 use Wikimedia\Rdbms\LoadBalancer;
 use MediaHandlerFactory;
+use MediaWiki\Config\ConfigRepository;
 use MediaWiki\Linker\LinkRenderer;
 use MediaWiki\Linker\LinkRendererFactory;
 use MediaWiki\Services\SalvageableService;
@@ -855,6 +856,13 @@ class MediaWikiServices extends ServiceContainer {
                return $this->getService( 'OldRevisionImporter' );
        }
 
+       /**
+        * @return ConfigRepository
+        */
+       public function getConfigRepository() {
+               return $this->getService( 'ConfigRepository' );
+       }
+
        ///////////////////////////////////////////////////////////////////////////
        // NOTE: When adding a service getter here, don't forget to add a test
        // case for it in MediaWikiServicesTest::provideGetters() and in
index 34de7c6..5965cbe 100644 (file)
@@ -3530,6 +3530,13 @@ class OutputPage extends ContextSource {
                        ] );
                }
 
+               // Allow extensions to add, remove and/or otherwise manipulate these links
+               // If you want only to *add* <head> links, please use the addHeadItem()
+               // (or addHeadItems() for multiple items) method instead.
+               // This hook is provided as a last resort for extensions to modify these
+               // links before the output is sent to client.
+               Hooks::run( 'OutputPageAfterGetHeadLinksArray', [ &$tags, $this ] );
+
                return $tags;
        }
 
index ff8deee..df2451c 100644 (file)
@@ -81,7 +81,7 @@ class PageProps {
         * Create a PageProps object
         */
        private function __construct() {
-               $this->cache = new ProcessCacheLRU( self::CACHE_SIZE );
+               $this->cache = new MapCacheLRU( self::CACHE_SIZE );
        }
 
        /**
@@ -89,8 +89,8 @@ class PageProps {
         * @param int $size
         */
        public function ensureCacheSize( $size ) {
-               if ( $this->cache->getSize() < $size ) {
-                       $this->cache->resize( $size );
+               if ( $this->cache->getMaxSize() < $size ) {
+                       $this->cache->setMaxSize( $size );
                }
        }
 
@@ -267,11 +267,11 @@ class PageProps {
         * @return string|bool property value array or false if not found
         */
        private function getCachedProperty( $pageID, $propertyName ) {
-               if ( $this->cache->has( $pageID, $propertyName, self::CACHE_TTL ) ) {
-                       return $this->cache->get( $pageID, $propertyName );
+               if ( $this->cache->hasField( $pageID, $propertyName, self::CACHE_TTL ) ) {
+                       return $this->cache->getField( $pageID, $propertyName );
                }
-               if ( $this->cache->has( 0, $pageID, self::CACHE_TTL ) ) {
-                       $pageProperties = $this->cache->get( 0, $pageID );
+               if ( $this->cache->hasField( 0, $pageID, self::CACHE_TTL ) ) {
+                       $pageProperties = $this->cache->getField( 0, $pageID );
                        if ( isset( $pageProperties[$propertyName] ) ) {
                                return $pageProperties[$propertyName];
                        }
@@ -286,8 +286,8 @@ class PageProps {
         * @return string|bool property value array or false if not found
         */
        private function getCachedProperties( $pageID ) {
-               if ( $this->cache->has( 0, $pageID, self::CACHE_TTL ) ) {
-                       return $this->cache->get( 0, $pageID );
+               if ( $this->cache->hasField( 0, $pageID, self::CACHE_TTL ) ) {
+                       return $this->cache->getField( 0, $pageID );
                }
                return false;
        }
@@ -300,7 +300,7 @@ class PageProps {
         * @param mixed $propertyValue value of property
         */
        private function cacheProperty( $pageID, $propertyName, $propertyValue ) {
-               $this->cache->set( $pageID, $propertyName, $propertyValue );
+               $this->cache->setField( $pageID, $propertyName, $propertyValue );
        }
 
        /**
@@ -311,6 +311,6 @@ class PageProps {
         */
        private function cacheProperties( $pageID, $pageProperties ) {
                $this->cache->clear( $pageID );
-               $this->cache->set( 0, $pageID, $pageProperties );
+               $this->cache->setField( 0, $pageID, $pageProperties );
        }
 }
index c458af0..a8a312c 100644 (file)
@@ -300,30 +300,6 @@ class Preferences {
                throw new Exception( __METHOD__ . '() is deprecated and does nothing' );
        }
 
-       /**
-        * Handle the form submission if everything validated properly
-        *
-        * @deprecated since 1.31, use PreferencesFactory
-        *
-        * @param array $formData
-        * @param HTMLForm $form
-        * @return bool|Status|string
-        */
-       public static function tryFormSubmit( $formData, $form ) {
-               $preferencesFactory = self::getDefaultPreferencesFactory();
-               return $preferencesFactory->legacySaveFormData( $formData, $form );
-       }
-
-       /**
-        * @param array $formData
-        * @param HTMLForm $form
-        * @return Status
-        */
-       public static function tryUISubmit( $formData, $form ) {
-               $preferencesFactory = self::getDefaultPreferencesFactory();
-               return $preferencesFactory->legacySubmitForm( $formData, $form );
-       }
-
        /**
         * Get a list of all time zones
         * @param Language $language Language used for the localized names
index 5127158..63a4d9c 100644 (file)
@@ -58,54 +58,14 @@ abstract class PrefixSearch {
                        return []; // Return empty result
                }
 
-               $hasNamespace = $this->extractNamespace( $search );
-               if ( $hasNamespace ) {
-                       list( $namespace, $search ) = $hasNamespace;
-                       $namespaces = [ $namespace ];
-               } else {
-                       $namespaces = $this->validateNamespaces( $namespaces );
-                       Hooks::run( 'PrefixSearchExtractNamespace', [ &$namespaces, &$search ] );
+               $hasNamespace = SearchEngine::parseNamespacePrefixes( $search, false, true );
+               if ( $hasNamespace !== false ) {
+                       list( $search, $namespaces ) = $hasNamespace;
                }
 
                return $this->searchBackend( $namespaces, $search, $limit, $offset );
        }
 
-       /**
-        * Figure out if given input contains an explicit namespace.
-        *
-        * @param string $input
-        * @return false|array Array of namespace and remaining text, or false if no namespace given.
-        */
-       protected function extractNamespace( $input ) {
-               if ( strpos( $input, ':' ) === false ) {
-                       return false;
-               }
-
-               // Namespace prefix only
-               $title = Title::newFromText( $input . 'Dummy' );
-               if (
-                       $title &&
-                       $title->getText() === 'Dummy' &&
-                       !$title->inNamespace( NS_MAIN ) &&
-                       !$title->isExternal()
-               ) {
-                       return [ $title->getNamespace(), '' ];
-               }
-
-               // Namespace prefix with additional input
-               $title = Title::newFromText( $input );
-               if (
-                       $title &&
-                       !$title->inNamespace( NS_MAIN ) &&
-                       !$title->isExternal()
-               ) {
-                       // getText provides correct capitalization
-                       return [ $title->getNamespace(), $title->getText() ];
-               }
-
-               return false;
-       }
-
        /**
         * Do a prefix search for all possible variants of the prefix
         * @param string $search
index 6da537d..7d49080 100644 (file)
@@ -38,6 +38,7 @@
  */
 
 use MediaWiki\Auth\AuthManager;
+use MediaWiki\Config\ConfigRepository;
 use MediaWiki\Interwiki\ClassicInterwikiLookup;
 use MediaWiki\Linker\LinkRendererFactory;
 use MediaWiki\Logger\LoggerFactory;
@@ -104,6 +105,10 @@ return [
                return $factory;
        },
 
+       'ConfigRepository' => function ( MediaWikiServices $services ) {
+               return new ConfigRepository( $services->getConfigFactory() );
+       },
+
        'MainConfig' => function ( MediaWikiServices $services ) {
                // Use the 'main' config from the ConfigFactory service.
                return $services->getConfigFactory()->makeConfig( 'main' );
index 41d5945..4d9c495 100644 (file)
@@ -278,7 +278,7 @@ $wgGalleryOptions += [
 ];
 
 /**
- * Initialise $wgLocalFileRepo from backwards-compatible settings
+ * Shortcuts for $wgLocalFileRepo
  */
 if ( !$wgLocalFileRepo ) {
        $wgLocalFileRepo = [
@@ -294,8 +294,15 @@ if ( !$wgLocalFileRepo ) {
                'deletedHashLevels' => $wgHashedUploadDirectory ? 3 : 0
        ];
 }
+
+if ( !isset( $wgLocalFileRepo['backend'] ) ) {
+       // Create a default FileBackend name.
+       // FileBackendGroup will register a default, if absent from $wgFileBackends.
+       $wgLocalFileRepo['backend'] = $wgLocalFileRepo['name'] . '-backend';
+}
+
 /**
- * Initialise shared repo from backwards-compatible settings
+ * Shortcuts for $wgForeignFileRepos
  */
 if ( $wgUseSharedUploads ) {
        if ( $wgSharedUploadDBname ) {
@@ -346,13 +353,6 @@ if ( $wgUseInstantCommons ) {
                'apiThumbCacheExpiry' => 0,
        ];
 }
-/*
- * Add on default file backend config for file repos.
- * FileBackendGroup will handle initializing the backends.
- */
-if ( !isset( $wgLocalFileRepo['backend'] ) ) {
-       $wgLocalFileRepo['backend'] = $wgLocalFileRepo['name'] . '-backend';
-}
 foreach ( $wgForeignFileRepos as &$repo ) {
        if ( !isset( $repo['directory'] ) && $repo['class'] === ForeignAPIRepo::class ) {
                $repo['directory'] = $wgUploadDirectory; // b/c
index b583554..8586ad7 100644 (file)
@@ -37,7 +37,7 @@ use MediaWiki\MediaWikiServices;
  *       and does not rely on global state or the database.
  */
 class Title implements LinkTarget {
-       /** @var MapCacheLRU */
+       /** @var HashBagOStuff */
        static private $titleCache = null;
 
        /**
@@ -371,11 +371,11 @@ class Title implements LinkTarget {
        }
 
        /**
-        * @return MapCacheLRU
+        * @return HashBagOStuff
         */
        private static function getTitleCache() {
                if ( self::$titleCache == null ) {
-                       self::$titleCache = new MapCacheLRU( self::CACHE_MAX );
+                       self::$titleCache = new HashBagOStuff( [ 'maxKeys' => self::CACHE_MAX ] );
                }
                return self::$titleCache;
        }
index bd64a41..20637fc 100644 (file)
@@ -788,7 +788,10 @@ class HistoryPager extends ReverseChronologicalPager {
                $attribs = [ 'data-mw-revid' => $rev->getId() ];
 
                Hooks::run( 'PageHistoryLineEnding', [ $this, &$row, &$s, &$classes, &$attribs ] );
-               $attribs = wfArrayFilterByKey( $attribs, [ Sanitizer::class, 'isReservedDataAttribute' ] );
+               $attribs = array_filter( $attribs,
+                       [ Sanitizer::class, 'isReservedDataAttribute' ],
+                       ARRAY_FILTER_USE_KEY
+               );
 
                if ( $classes ) {
                        $attribs['class'] = implode( ' ', $classes );
index 3d87a5f..f5461e0 100644 (file)
@@ -66,9 +66,19 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                $search->setFeatureData( 'rewrite', (bool)$params['enablerewrites'] );
                $search->setFeatureData( 'interwiki', (bool)$interwiki );
 
-               $query = $search->transformSearchTerm( $query );
-               $query = $search->replacePrefixes( $query );
+               $nquery = $search->transformSearchTerm( $query );
+               if ( $nquery !== $query ) {
+                       $query = $nquery;
+                       wfDeprecated( 'SearchEngine::transformSearchTerm() (overridden by ' .
+                               get_class( $search ) . ')', '1.32' );
+               }
 
+               $nquery = $search->replacePrefixes( $query );
+               if ( $nquery !== $query ) {
+                       $query = $nquery;
+                       wfDeprecated( 'SearchEngine::replacePrefixes() (overridden by ' .
+                                                 get_class( $search ) . ')', '1.32' );
+               }
                // Perform the actual search
                if ( $what == 'text' ) {
                        $matches = $search->searchText( $query );
index ac7a7b5..8e96b31 100644 (file)
        "apihelp-query+allredirects-param-limit": "要回傳的項目總數。",
        "apihelp-query+allrevisions-summary": "列出所有修訂版本。",
        "apihelp-query+alltransclusions-param-limit": "要回傳的項目總數。",
+       "apihelp-query+allusers-param-from": "起始列舉的使用者名稱。",
+       "apihelp-query+allusers-example-Y": "列出以<kbd>Y</kbd>開頭的使用者。",
        "apihelp-query+authmanagerinfo-summary": "取得目前身分核對狀態的資訊。",
        "apihelp-query+categories-param-limit": "要回傳的分類數量。",
        "apihelp-query+categoryinfo-summary": "回傳有關指定分類的資訊。",
index ca59ec7..d3fd5fc 100644 (file)
@@ -886,8 +886,11 @@ class AuthManager implements LoggerAwareInterface {
         * returned success.
         *
         * @param AuthenticationRequest $req
+        * @param bool $isAddition Set true if this represents an addition of
+        *  credentials rather than a change. The main difference is that additions
+        *  should not invalidate BotPasswords. If you're not sure, leave it false.
         */
-       public function changeAuthenticationData( AuthenticationRequest $req ) {
+       public function changeAuthenticationData( AuthenticationRequest $req, $isAddition = false ) {
                $this->logger->info( 'Changing authentication data for {user} class {what}', [
                        'user' => is_string( $req->username ) ? $req->username : '<no name>',
                        'what' => get_class( $req ),
@@ -897,7 +900,9 @@ class AuthManager implements LoggerAwareInterface {
 
                // When the main account's authentication data is changed, invalidate
                // all BotPasswords too.
-               \BotPassword::invalidateAllPasswordsForUser( $req->username );
+               if ( !$isAddition ) {
+                       \BotPassword::invalidateAllPasswordsForUser( $req->username );
+               }
        }
 
        /**@}*/
index 7f121cd..c2d730c 100644 (file)
@@ -119,7 +119,9 @@ class ConfirmLinkSecondaryAuthenticationProvider extends AbstractSecondaryAuthen
                                $status = $this->manager->allowsAuthenticationDataChange( $req );
                                $statuses[] = [ $req, $status ];
                                if ( $status->isGood() ) {
-                                       $this->manager->changeAuthenticationData( $req );
+                                       // We're not changing credentials, just adding a new link
+                                       // to an already-known user.
+                                       $this->manager->changeAuthenticationData( $req, /* $isAddition */ true );
                                } else {
                                        $anyFailed = true;
                                }
index 58ed771..260038a 100644 (file)
@@ -32,10 +32,10 @@ use MediaWiki\MediaWikiServices;
  * @ingroup Cache
  */
 class LinkCache {
-       /** @var HashBagOStuff */
-       private $mGoodLinks;
-       /** @var HashBagOStuff */
-       private $mBadLinks;
+       /** @var MapCacheLRU */
+       private $goodLinks;
+       /** @var MapCacheLRU */
+       private $badLinks;
        /** @var WANObjectCache */
        private $wanCache;
 
@@ -52,8 +52,8 @@ class LinkCache {
        const MAX_SIZE = 10000;
 
        public function __construct( TitleFormatter $titleFormatter, WANObjectCache $cache ) {
-               $this->mGoodLinks = new HashBagOStuff( [ 'maxKeys' => self::MAX_SIZE ] );
-               $this->mBadLinks = new HashBagOStuff( [ 'maxKeys' => self::MAX_SIZE ] );
+               $this->goodLinks = new MapCacheLRU( self::MAX_SIZE );
+               $this->badLinks = new MapCacheLRU( self::MAX_SIZE );
                $this->wanCache = $cache;
                $this->titleFormatter = $titleFormatter;
        }
@@ -87,7 +87,7 @@ class LinkCache {
         * @return int Page ID or zero
         */
        public function getGoodLinkID( $title ) {
-               $info = $this->mGoodLinks->get( $title );
+               $info = $this->goodLinks->get( $title );
                if ( !$info ) {
                        return 0;
                }
@@ -103,7 +103,7 @@ class LinkCache {
         */
        public function getGoodLinkFieldObj( LinkTarget $target, $field ) {
                $dbkey = $this->titleFormatter->getPrefixedDBkey( $target );
-               $info = $this->mGoodLinks->get( $dbkey );
+               $info = $this->goodLinks->get( $dbkey );
                if ( !$info ) {
                        return null;
                }
@@ -116,7 +116,7 @@ class LinkCache {
         */
        public function isBadLink( $title ) {
                // Use get() to ensure it records as used for LRU.
-               return $this->mBadLinks->get( $title ) !== false;
+               return $this->badLinks->has( $title );
        }
 
        /**
@@ -134,7 +134,7 @@ class LinkCache {
                $revision = 0, $model = null, $lang = null
        ) {
                $dbkey = $this->titleFormatter->getPrefixedDBkey( $target );
-               $this->mGoodLinks->set( $dbkey, [
+               $this->goodLinks->set( $dbkey, [
                        'id' => (int)$id,
                        'length' => (int)$len,
                        'redirect' => (int)$redir,
@@ -153,7 +153,7 @@ class LinkCache {
         */
        public function addGoodLinkObjFromRow( LinkTarget $target, $row ) {
                $dbkey = $this->titleFormatter->getPrefixedDBkey( $target );
-               $this->mGoodLinks->set( $dbkey, [
+               $this->goodLinks->set( $dbkey, [
                        'id' => intval( $row->page_id ),
                        'length' => intval( $row->page_len ),
                        'redirect' => intval( $row->page_is_redirect ),
@@ -169,7 +169,7 @@ class LinkCache {
        public function addBadLinkObj( LinkTarget $target ) {
                $dbkey = $this->titleFormatter->getPrefixedDBkey( $target );
                if ( !$this->isBadLink( $dbkey ) ) {
-                       $this->mBadLinks->set( $dbkey, 1 );
+                       $this->badLinks->set( $dbkey, 1 );
                }
        }
 
@@ -177,7 +177,7 @@ class LinkCache {
         * @param string $title Prefixed DB key
         */
        public function clearBadLink( $title ) {
-               $this->mBadLinks->delete( $title );
+               $this->badLinks->clear( $title );
        }
 
        /**
@@ -185,8 +185,8 @@ class LinkCache {
         */
        public function clearLink( LinkTarget $target ) {
                $dbkey = $this->titleFormatter->getPrefixedDBkey( $target );
-               $this->mBadLinks->delete( $dbkey );
-               $this->mGoodLinks->delete( $dbkey );
+               $this->badLinks->clear( $dbkey );
+               $this->goodLinks->clear( $dbkey );
        }
 
        /**
@@ -332,7 +332,7 @@ class LinkCache {
         * Clears cache
         */
        public function clear() {
-               $this->mGoodLinks->clear();
-               $this->mBadLinks->clear();
+               $this->goodLinks->clear();
+               $this->badLinks->clear();
        }
 }
index c0822c3..eb9febe 100644 (file)
@@ -44,7 +44,7 @@ class ChangesList extends ContextSource {
        /** @var callable */
        protected $changeLinePrefixer;
 
-       /** @var BagOStuff */
+       /** @var MapCacheLRU */
        protected $watchMsgCache;
 
        /**
@@ -72,7 +72,7 @@ class ChangesList extends ContextSource {
                        $this->skin = $obj;
                }
                $this->preCacheMessages();
-               $this->watchMsgCache = new HashBagOStuff( [ 'maxKeys' => 50 ] );
+               $this->watchMsgCache = new MapCacheLRU( 50 );
                $this->linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
                $this->filterGroups = $filterGroups;
        }
@@ -602,10 +602,9 @@ class ChangesList extends ContextSource {
                if ( $count <= 0 ) {
                        return '';
                }
-               $cache = $this->watchMsgCache;
-               return $cache->getWithSetCallback(
-                       $cache->makeKey( 'watching-users-msg', $count ),
-                       $cache::TTL_INDEFINITE,
+
+               return $this->watchMsgCache->getWithSetCallback(
+                       "watching-users-msg:$count",
                        function () use ( $count ) {
                                return $this->msg( 'number_of_watching_users_RCview' )
                                        ->numParams( $count )->escaped();
index cdfbf56..28b30d8 100644 (file)
@@ -472,7 +472,10 @@ class EnhancedChangesList extends ChangesList {
                        // skip entry if hook aborted it
                        return [];
                }
-               $attribs = wfArrayFilterByKey( $attribs, [ Sanitizer::class, 'isReservedDataAttribute' ] );
+               $attribs = array_filter( $attribs,
+                       [ Sanitizer::class, 'isReservedDataAttribute' ],
+                       ARRAY_FILTER_USE_KEY
+               );
 
                $lineParams['recentChangesFlagsRaw'] = [];
                if ( isset( $data['recentChangesFlags'] ) ) {
@@ -704,9 +707,9 @@ class EnhancedChangesList extends ChangesList {
                }
                $attribs = $data['attribs'];
                unset( $data['attribs'] );
-               $attribs = wfArrayFilterByKey( $attribs, function ( $key ) {
+               $attribs = array_filter( $attribs, function ( $key ) {
                        return $key === 'class' || Sanitizer::isReservedDataAttribute( $key );
-               } );
+               }, ARRAY_FILTER_USE_KEY );
 
                $prefix = '';
                if ( is_callable( $this->changeLinePrefixer ) ) {
diff --git a/includes/config/ConfigRepository.php b/includes/config/ConfigRepository.php
new file mode 100644 (file)
index 0000000..c87a344
--- /dev/null
@@ -0,0 +1,224 @@
+<?php
+/**
+ * Copyright 2016
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+namespace MediaWiki\Config;
+
+use MediaWiki\Services\SalvageableService;
+use Wikimedia\Assert\Assert;
+
+/**
+ * Object which holds currently registered configuration options.
+ *
+ * @since 1.32
+ */
+class ConfigRepository implements SalvageableService {
+       /** @var \ConfigFactory */
+       private $configFactory;
+
+       /** @var array */
+       private $configItems = [
+               'private' => [],
+               'public' => [],
+       ];
+
+       /**
+        * @param \ConfigFactory $configFactory
+        */
+       public function __construct( \ConfigFactory $configFactory ) {
+               $this->configFactory = $configFactory;
+       }
+
+       /**
+        * Returns true, if this repository contains a configuration with a specific name.
+        *
+        * @param string $name The name of the config to check the existence of
+        * @param bool $alsoPrivate If set to true, will check the private config options, too
+        * @return bool
+        */
+       public function has( $name, $alsoPrivate = false ) {
+               return isset( $this->configItems['public'][$name] ) ||
+                       ( $alsoPrivate && isset( $this->configItems['private'][$name] ) );
+       }
+
+       /**
+        * Returns the ConfigItem with the given name, if there's one. Throws a ConfigException
+        * otherwise.
+        *
+        * @param string $name The name of the configuration option to get
+        * @return array
+        * @throws \ConfigException
+        */
+       public function get( $name ) {
+               if ( !$this->has( $name, true ) ) {
+                       throw new \ConfigException( 'The configuration option ' . $name . ' does not exist.' );
+               }
+               if ( isset( $this->configItems['public'][$name] ) ) {
+                       return $this->configItems['public'][$name];
+               }
+               return $this->configItems['private'][$name];
+       }
+
+       /**
+        * Returns an array of all configuration items saved in this ConfigRepository. This includes
+        * all configuration options, including the ones marked as private and public.
+        *
+        * Note: This function does not do any permission checks or something similar. You should not
+        * use this function, if the output will be available to the public audience! Use
+        * ConfigRepository::getPublic() instead.
+        *
+        * @return array
+        */
+       public function getAll() {
+               return array_merge( $this->configItems['private'], $this->configItems['public'] );
+       }
+
+       /**
+        * Returns an array of all public configuration options saved in this ConfigRepository.
+        *
+        * @return array
+        */
+       public function getPublic() {
+               return $this->configItems['public'];
+       }
+
+       /**
+        * Returns the current value of the configuration option. If no ConfigRegistry was provided
+        * when the config was added to the repository, the default value will be returned.
+        *
+        * @param string $name The name of the configuration option to get the value of
+        * @return mixed
+        * @throws \ConfigException
+        */
+       public function getValueOf( $name ) {
+               $config = $this->get( $name );
+               if ( !isset( $config['configregistry'] ) ) {
+                       return $config['value'];
+               }
+
+               return $this->configFactory->makeConfig( $config['configregistry'] )->get( $name );
+       }
+
+       /**
+        * Returns the description of the given config option, This can be either a localized
+        * description, if one such, or the (maybe english only) description provided in the
+        * definition of the configuration. If both is not provided an empty string is returned.
+        *
+        * @param string $name The name of the configuration option to get the description of
+        * @return string HTML-escaped string
+        */
+       public function getDescriptionOf( $name ) {
+               $config = $this->get( $name );
+               if ( isset( $config['descriptionmsg'] ) ) {
+                       return wfMessage( $config['descriptionmsg'] )->escaped();
+               }
+               if ( isset( $config['description'] ) ) {
+                       return htmlspecialchars( $config['description'] );
+               }
+               return '';
+       }
+
+       /**
+        * Adds the definition of a configuration to this repository.
+        *
+        * @param string $name the name of the config
+        * @param array $config Options of this config. Values are:
+        *  - value: The default value of this configuration, required
+        *  - providedby: The name of the provider of this config (an extension, core, ...), required
+        *  - configregistry: The name of the config to retrieve the value with, required
+        *  - public: whether this option is public or not, if not set, the option is considered as
+        *    "private", optional
+        *  - description: the not localized description of this config option, optional
+        *  - descriptionmsg: The message key of the localized description of this configuration
+        *    option, optional
+        * @throws \ConfigException
+        */
+       public function add( $name, array $config ) {
+               if ( $this->has( $name ) ) {
+                       throw new \ConfigException( 'A configuration with the name ' . $name .
+                               'does already exist. It is provided by: ' .
+                               $this->get( $name )['providedby'] );
+               }
+               if ( isset( $config['public'] ) && $config['public'] ) {
+                       $this->configItems['public'][$name] = $config;
+               } else {
+                       $this->configItems['private'][$name] = $config;
+               }
+       }
+
+       /**
+        * Returns true, if there're no elements in this instance, otherwise false.
+        *
+        * @param bool $includePrivate Whether configuration options, that are marked as private
+        * should be included in this check.
+        * @return bool
+        */
+       public function isEmpty( $includePrivate = false ) {
+               if ( $includePrivate ) {
+                       return empty( $this->configItems['private'] ) &&
+                               empty( $this->configItems[ 'public'] );
+               }
+               return empty( $this->configItems['public'] );
+       }
+
+       /**
+        * Re-uses existing Cache objects from $other. Cache objects are only re-used if the
+        * registered factory function for both is the same.
+        *
+        * @see SalvageableService::salvage()
+        *
+        * @param SalvageableService $other The object to salvage state from. $other must have the
+        * exact same type as $this.
+        */
+       public function salvage( SalvageableService $other ) {
+               Assert::parameterType( self::class, $other, '$other' );
+
+               /** @var ConfigRepository $other */
+               $otherCurrentObj = $other->current();
+               foreach ( $other->configItems['public'] as $name => $otherConfig ) {
+                       if ( isset( $this->configItems['public'][$name] ) ) {
+                               continue;
+                       }
+
+                       $this->add( $name, $otherConfig );
+
+                       // recover the pointer of the other config repository
+                       if ( $otherCurrentObj === $otherConfig ) {
+                               end( $this->configItems['public'] );
+                       }
+               }
+               foreach ( $other->configItems['private'] as $name => $otherConfig ) {
+                       if ( isset( $this->configItems['private'][$name] ) ) {
+                               continue;
+                       }
+
+                       $this->add( $name, $otherConfig );
+
+                       // recover the pointer of the other config repository
+                       if ( $otherCurrentObj === $otherConfig ) {
+                               end( $this->configItems['private'] );
+                       }
+               }
+
+               // disable $other
+               $other->configItems = [];
+       }
+}
index 9f6257c..f370e43 100644 (file)
@@ -101,7 +101,8 @@ class LinksDeletionUpdate extends DataUpdate implements EnqueueableDataUpdate {
                if ( $title->getNamespace() === NS_CATEGORY ) {
                        // T166757: do the update after the main job DB commit
                        DeferredUpdates::addCallableUpdate( function () use ( $title ) {
-                               $this->refreshCategoryIfEmpty( $title );
+                               $cat = Category::newFromName( $title->getDBkey() );
+                               $cat->refreshCountsIfEmpty();
                        } );
                }
 
@@ -187,35 +188,6 @@ class LinksDeletionUpdate extends DataUpdate implements EnqueueableDataUpdate {
                ScopedCallback::consume( $scopedLock );
        }
 
-       /**
-        * @param Title $title
-        */
-       private function refreshCategoryIfEmpty( Title $title ) {
-               $dbw = $this->getDB();
-
-               $row = $dbw->selectRow(
-                       'category',
-                       [ 'cat_id', 'cat_title', 'cat_pages', 'cat_subcats', 'cat_files' ],
-                       [ 'cat_title' => $title->getDBkey(), 'cat_pages <= 100' ],
-                       __METHOD__
-               );
-
-               if ( !$row ) {
-                       return; // nothing to delete
-               }
-
-               $cat = Category::newFromRow( $row, $title );
-               $hasLink = $dbw->selectField(
-                       'categorylinks',
-                       '1',
-                       [ 'cl_to' => $title->getDBkey() ],
-                       __METHOD__
-               );
-               if ( !$hasLink ) {
-                       $cat->refreshCounts(); // delete the category table entry
-               }
-       }
-
        private function batchDeleteByPK( $table, array $conds, array $pk, $bSize ) {
                $services = MediaWikiServices::getInstance();
                $lbFactory = $services->getDBLoadBalancerFactory();
index dbb5421..b445487 100644 (file)
@@ -45,7 +45,7 @@ class FileBackendDBRepoWrapper extends FileBackend {
        protected $repoName;
        /** @var Closure */
        protected $dbHandleFunc;
-       /** @var ProcessCacheLRU */
+       /** @var MapCacheLRU */
        protected $resolvedPathCache;
        /** @var DBConnRef[] */
        protected $dbs;
@@ -59,7 +59,7 @@ class FileBackendDBRepoWrapper extends FileBackend {
                $this->backend = $config['backend'];
                $this->repoName = $config['repoName'];
                $this->dbHandleFunc = $config['dbHandleFactory'];
-               $this->resolvedPathCache = new ProcessCacheLRU( 100 );
+               $this->resolvedPathCache = new MapCacheLRU( 100 );
        }
 
        /**
@@ -102,8 +102,8 @@ class FileBackendDBRepoWrapper extends FileBackend {
                // @TODO: batching
                $resolved = [];
                foreach ( $paths as $i => $path ) {
-                       if ( !$latest && $this->resolvedPathCache->has( $path, 'target', 10 ) ) {
-                               $resolved[$i] = $this->resolvedPathCache->get( $path, 'target' );
+                       if ( !$latest && $this->resolvedPathCache->hasField( $path, 'target', 10 ) ) {
+                               $resolved[$i] = $this->resolvedPathCache->getField( $path, 'target' );
                                continue;
                        }
 
@@ -127,12 +127,12 @@ class FileBackendDBRepoWrapper extends FileBackend {
                                        continue;
                                }
                                $resolved[$i] = $this->getPathForSHA1( $sha1 );
-                               $this->resolvedPathCache->set( $path, 'target', $resolved[$i] );
+                               $this->resolvedPathCache->setField( $path, 'target', $resolved[$i] );
                        } elseif ( $container === "{$this->repoName}-deleted" ) {
                                $name = basename( $path ); // <hash>.<ext>
                                $sha1 = substr( $name, 0, strpos( $name, '.' ) ); // ignore extension
                                $resolved[$i] = $this->getPathForSHA1( $sha1 );
-                               $this->resolvedPathCache->set( $path, 'target', $resolved[$i] );
+                               $this->resolvedPathCache->setField( $path, 'target', $resolved[$i] );
                        } else {
                                $resolved[$i] = $path;
                        }
index fa4567e..90c8707 100644 (file)
@@ -98,7 +98,7 @@ class RepoGroup {
        function __construct( $localInfo, $foreignInfo ) {
                $this->localInfo = $localInfo;
                $this->foreignInfo = $foreignInfo;
-               $this->cache = new ProcessCacheLRU( self::MAX_CACHE_SIZE );
+               $this->cache = new MapCacheLRU( self::MAX_CACHE_SIZE );
        }
 
        /**
@@ -141,8 +141,8 @@ class RepoGroup {
                        && empty( $options['latest'] )
                ) {
                        $time = $options['time'] ?? '';
-                       if ( $this->cache->has( $dbkey, $time, 60 ) ) {
-                               return $this->cache->get( $dbkey, $time );
+                       if ( $this->cache->hasField( $dbkey, $time, 60 ) ) {
+                               return $this->cache->getField( $dbkey, $time );
                        }
                        $useCache = true;
                } else {
@@ -166,7 +166,7 @@ class RepoGroup {
                $image = $image ?: false; // type sanity
                # Cache file existence or non-existence
                if ( $useCache && ( !$image || $image->isCacheable() ) ) {
-                       $this->cache->set( $dbkey, $time, $image );
+                       $this->cache->setField( $dbkey, $time, $image );
                }
 
                return $image;
index 602ddee..0ad41d4 100644 (file)
@@ -41,6 +41,11 @@ class HTMLTitleTextField extends HTMLTextField {
                        return parent::validate( $value, $alldata );
                }
 
+               // Default value (from getDefault()) is null, which breaks Title::newFromTextThrow() below
+               if ( $value === null ) {
+                       $value = '';
+               }
+
                if ( !$this->mParams['required'] && $value === '' ) {
                        // If this field is not required and the value is empty, that's okay, skip validation
                        return parent::validate( $value, $alldata );
index e193970..d672314 100644 (file)
@@ -34,6 +34,11 @@ class HTMLUserTextField extends HTMLTextField {
        }
 
        public function validate( $value, $alldata ) {
+               // Default value (from getDefault()) is null, User::newFromName() expects a string
+               if ( $value === null ) {
+                       $value = '';
+               }
+
                // check, if a user exists with the given username
                $user = User::newFromName( $value, false );
                $rangeError = null;
@@ -43,7 +48,7 @@ class HTMLUserTextField extends HTMLTextField {
                } elseif (
                        // check, if the user exists, if requested
                        ( $this->mParams['exists'] && $user->getId() === 0 ) &&
-                       // check, if the username is a valid IP address, otherweise save the error message
+                       // check, if the username is a valid IP address, otherwise save the error message
                        !( $this->mParams['ipallowed'] && IP::isValid( $value ) ) &&
                        // check, if the username is a valid IP range, otherwise save the error message
                        !( $this->mParams['iprange'] && ( $rangeError = $this->isValidIPRange( $value ) ) === true )
index ccc2659..46d0aed 100644 (file)
        "config-type-oracle": "Oracle",
        "config-type-mssql": "Microsoft SQL Server",
        "config-support-info": "MediaWiki падтрымлівае наступныя сыстэмы базаў зьвестак:\n\n$1\n\nКалі Вы ня бачыце сыстэму базаў зьвестак, якую Вы спрабуеце выкарыстоўваць ў сьпісе ніжэй, перайдзіце па спасылцы інструкцыі, якая знаходзіцца ніжэй, каб уключыць падтрымку.",
-       "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] зьяўляецца галоўнай мэтай MediaWiki і падтрымліваецца лепей за ўсё. MediaWiki таксама працуе з [{{int:version-db-mariadb-url}} MariaDB] і [{{int:version-db-percona-url}} Percona Server], якія сумяшчальныя з MySQL. ([https://secure.php.net/manual/en/mysqli.installation.php Як скампіляваць PHP з падтрымкай MySQL])",
+       "config-dbsupport-mysql": "* [{{int:version-db-mariadb-url}} MariaDB] зьяўляецца галоўнай мэтай MediaWiki і падтрымліваецца найлепш. MediaWiki таксама працуе з [{{int:version-db-mysql-url}} MySQL] і [{{int:version-db-percona-url}} Percona Server], якія сумяшчальныя з MariaDB. ([https://secure.php.net/manual/en/mysqli.installation.php Як скампіляваць PHP з падтрымкай MySQL])",
        "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] — папулярная сыстэма базы зьвестак з адкрытым кодам, якая зьяўляецца альтэрнатывай MySQL. ([https://secure.php.net/manual/en/pgsql.installation.php Як кампіляваць PHP з падтрымкай PostgreSQL])",
        "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] — невялікая сыстэма базы зьвестак, якая мае вельмі добрую падтрымку. ([https://secure.php.net/manual/en/pdo.installation.php Як кампіляваць PHP з падтрымкай SQLite], выкарыстоўвае PDO)",
        "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] зьяўляецца камэрцыйнай прафэсійнай базай зьвестак. ([https://secure.php.net/manual/en/oci8.installation.php Як скампіляваць PHP з падтрымкай OCI8])",
        "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] — камэрцыйная база зьвестак для Windows. ([https://secure.php.net/manual/en/sqlsrv.installation.php Як скампіляваць PHP з падтрымкай SQLSRV])",
-       "config-header-mysql": "Налады MySQL",
+       "config-header-mysql": "Налады MariaDB/MySQL",
        "config-header-postgres": "Налады PostgreSQL",
        "config-header-sqlite": "Налады SQLite",
        "config-header-oracle": "Налады Oracle",
index ebee20b..a98e013 100644 (file)
@@ -65,6 +65,7 @@
        "config-sqlite-dir": "এসকিউলাইট ডেটা ডিরেক্টরি:",
        "config-oracle-def-ts": "পূর্বনির্ধারিত টেবিলস্পেস",
        "config-oracle-temp-ts": "সাময়কি টেবিলস্পেস:",
+       "config-type-mysql": "MariaDB, MySQL, বা উপযুক্তগুলি",
        "config-type-mssql": "মাইক্রোসফট এসকিউএল সার্ভার",
        "config-dbsupport-postgres": "* MySQL-এর বিকল্প হিসেবে [{{int:version-db-postgres-url}} PostgreSQL] হচ্ছে একটি জনপ্রিয় ওপেন সোর্স ডাটাবেস ব্যবস্থা। ([https://secure.php.net/manual/en/pgsql.installation.php PostgreSQL সমর্থনসহ কিভাবে PHP সঙ্কলন করবেন])",
        "config-header-mysql": "MariaDB/MySQL সেটিং",
index c41ba8e..ee89d1f 100644 (file)
        "config-type-oracle": "Oracle",
        "config-type-mssql": "Microsoft SQL Server",
        "config-support-info": "MediaWiki es compatible con los siguientes sistemas de bases de datos:\n\n$1\n\nSi no encuentras en el listado el sistema de base de datos que estás intentando utilizar, sigue las instrucciones enlazadas arriba para activar la compatibilidad.",
-       "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] es la base de datos mayoritaria para MediaWiki y la que goza de mayor compatibilidad. MediaWiki también funciona con [{{int:version-db-mariadb-url}} MariaDB] y [{{int:version-db-percona-url}} Percona Server], que son compatibles con MySQL. ([https://secure.php.net/manual/es/mysql.installation.php Cómo compilar PHP con compatibilidad MySQL])",
+       "config-dbsupport-mysql": "* [{{int:version-db-mariadb-url}} MariaDB] es la base de datos mayoritaria para MediaWiki y la que goza de mayor compatibilidad. MediaWiki también funciona con [{{int:version-db-myslql-url}} MySQL] y [{{int:version-db-percona-url}} Percona Server], que son compatibles con MariaDB. ([https://secure.php.net/manual/es/mysql.installation.php Cómo compilar PHP con compatibilidad MySQL])",
        "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] es un sistema de base de datos popular de código abierto, alternativa a MySQL. ([https://secure.php.net/manual/es/pgsql.installation.php Cómo compilar PHP con compatibilidad PostgreSQL]).",
        "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] es un sistema de base de datos ligero con gran compatibilidad con MediaWiki. ([https://secure.php.net/manual/en/pdo.installation.php Cómo compilar PHP con compatibilidad SQLite], usando PDO)",
        "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] es una base de datos comercial a nivel empresarial. ([https://secure.php.net/manual/en/oci8.installation.php Cómo compilar PHP con compatibilidad con OCI8])",
        "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] es un sistema comercial de base de datos empresariales para Windows. ([https://secure.php.net/manual/en/sqlsrv.installation.php Cómo compilar PHP con compatibilidad con SQLSRV])",
-       "config-header-mysql": "Configuración de MySQL",
+       "config-header-mysql": "Configuración de MariaDB/MySQL",
        "config-header-postgres": "Configuración de PostgreSQL",
        "config-header-sqlite": "Configuración de SQLite",
        "config-header-oracle": "Configuración de Oracle",
index e619978..b4658b6 100644 (file)
        "config-sqlite-dir-help": "SQLite recolle todos os datos nun ficheiro único.\n\nO servidor web debe ter permisos sobre o directorio para que poida escribir nel durante a instalación.\n\nAdemais, o servidor <strong>non</strong> debe ser accesible a través da web, motivo polo que non está no mesmo lugar ca os ficheiros PHP.\n\nAsemade, o programa de instalación escribirá un ficheiro <code>.htaccess</code>, pero se erra alguén pode obter acceso á súa base de datos.\nIsto inclúe datos de usuario (enderezos de correo electrónico, contrasinais codificados), así como revisións borradas e outros datos restrinxidos no wiki.\n\nConsidere poñer a base de datos nun só lugar, por exemplo en <code>/var/lib/mediawiki/oseuwiki</code>.",
        "config-oracle-def-ts": "Espazo de táboas por defecto:",
        "config-oracle-temp-ts": "Espazo de táboas temporal:",
-       "config-type-mysql": "MySQL (ou compatible)",
+       "config-type-mysql": "MariaDB, MySQL ou compatíbel",
        "config-type-postgres": "PostgreSQL",
        "config-type-sqlite": "SQLite",
        "config-type-oracle": "Oracle",
        "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] é un sistema de base de datos lixeiro moi ben soportado. ([http://www.php.net/manual/en/pdo.installation.php Como compilar o PHP con soporte SQLite], emprega PDO)",
        "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] é un sistema comercial de xestión de base de datos de nivel empresarial. ([http://www.php.net/manual/en/oci8.installation.php Como compilar o PHP con compatibilidade OCI8])",
        "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] é un sistema comercial de xestión de base de datos de nivel empresarial para Windows. ([https://secure.php.net/manual/en/sqlsrv.installation.php Como compilar o PHP con compatibilidade SQLSRV])",
-       "config-header-mysql": "Configuración do MySQL",
+       "config-header-mysql": "Configuración MariaDB/MySQL",
        "config-header-postgres": "Configuración do PostgreSQL",
        "config-header-sqlite": "Configuración do SQLite",
        "config-header-oracle": "Configuración do Oracle",
        "config-db-web-create": "Crear a conta se aínda non existe",
        "config-db-web-no-create-privs": "A conta que especificou para a instalación non ten os privilexios suficientes para crear unha conta.\nA conta que se especifique aquí xa debe existir.",
        "config-mysql-engine": "Motor de almacenamento:",
-       "config-mysql-innodb": "InnoDB",
+       "config-mysql-innodb": "InnoDB (recomendado)",
        "config-mysql-myisam": "MyISAM",
        "config-mysql-myisam-dep": "<strong>Atención:</strong> Seleccionou MyISAM como o motor de almacenamento para MySQL, unha combinación non recomendada para MediaWiki, porque:\n* practicamente non soporta os accesos simultáneos debido ao bloqueo de táboas\n* é máis propenso a corromperse ca outros motores\n* o código base de MediaWiki non sempre manexa o MyISAM como debera\n\nSe a súa instalación MySQL soporta InnoDB, recoméndase elixilo no canto de MyISAM.\nSe a súa instalación MySQL non soporta InnoDB, quizais sexa boa idea realizar unha actualización.",
        "config-mysql-only-myisam-dep": "<strong>Atención:</strong> MyISAM é o único motor de almacenamento para MySQL nesta máquina, unha combinación non recomendada para MediaWiki, porque:\n* practicamente non soporta os accesos simultáneos debido ao bloqueo de táboas\n* é máis propenso a corromperse ca outros motores\n* o código base de MediaWiki non sempre manexa o MyISAM como debera\n\nA súa instalación MySQL non soporta InnoDB, quizais sexa boa idea realizar unha actualización.",
        "config-nofile": "Non se puido atopar o ficheiro \"$1\". Se cadra, foi borrado.",
        "config-extension-link": "Sabía que o seu wiki soporta [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensións]?\n\nPode explorar as [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensións por categoría] ou a [https://www.mediawiki.org/wiki/Extension_Matrix matriz de extensións] para ollar a lista completa de extensións.",
        "config-skins-screenshots": "$1 (capturas de pantalla: $2)",
+       "config-extensions-requires": "$1 (require $2)",
        "config-screenshot": "captura de pantalla",
        "mainpagetext": "<strong>Instalouse MediaWiki.</strong>",
        "mainpagedocfooter": "Consulte a [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents guía de usuario] para obter máis información sobre como usar o software wiki.\n\n== Primeiros pasos ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista das opcións de configuración]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Preguntas máis frecuentes sobre MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo dos lanzamentos de MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localice MediaWiki á súa lingua]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Aprenda como combater a publicidade na súa wiki]"
index 6f36421..9d9f677 100644 (file)
        "config-type-oracle": "Oracle",
        "config-type-mssql": "Microsoft SQL Server",
        "config-support-info": "MediaWiki поддерживает следующие СУБД:\n\n$1\n\nЕсли вы не видите своей системы хранения данных в этом списке, следуйте инструкциям, на которые есть ссылка выше, чтобы получить поддержку.",
-       "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] — основная база данных для MediaWiki, которая поддерживается лучше всего. MediaWiki также работает с [{{int:version-db-mariadb-url}} MariaDB] и [{{int:version-db-percona-url}} Percona Server], которые являются MySQL-совместимыми. (См.[https://secure.php.net/manual/ru/mysql.installation.php Как собрать PHP с поддержкой MySQL])",
+       "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] — основная база данных для MediaWiki, которая поддерживается лучше всего. MediaWiki также работает с [{{int:version-db-mariadb-url}} MariaDB] и [{{int:version-db-percona-url}} Percona Server], которые являются MariaDB-совместимыми. (См.[https://secure.php.net/manual/ru/mysql.installation.php Как собрать PHP с поддержкой MySQL])",
        "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] — популярная СУБД с открытым исходным кодом, альтернатива MySQL. ([https://secure.php.net/manual/ru/pgsql.installation.php Как собрать PHP с поддержкой PostgreSQL]).",
        "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] — это легковесная система баз данных, имеющая очень хорошую поддержку. ([https://secure.php.net/manual/ru/pdo.installation.php Как собрать PHP с поддержкой SQLite], работающей посредством PDO)",
        "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] — это коммерческая корпоративная база данных. ([https://secure.php.net/manual/ru/oci8.installation.php Как собрать PHP с поддержкой OCI8])",
        "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] — это коммерческая корпоративная база данных для Windows. ([https://secure.php.net/manual/ru/sqlsrv.installation.php Как собрать PHP с поддержкой SQLSRV])",
-       "config-header-mysql": "Настройки MySQL",
+       "config-header-mysql": "Настройки MariaDB/MySQL",
        "config-header-postgres": "Настройки PostgreSQL",
        "config-header-sqlite": "Настройки SQLite",
        "config-header-oracle": "Настройки Oracle",
        "config-db-web-create": "Создать учётную запись, если она ещё не существует",
        "config-db-web-no-create-privs": "Учётная запись, указанная вами для установки, не обладает достаточными правами для создания учётной записи.\nУказанная здесь учётная запись уже должна существовать.",
        "config-mysql-engine": "Движок базы данных:",
-       "config-mysql-innodb": "InnoDB",
+       "config-mysql-innodb": "InnoDB (рекомендуется)",
        "config-mysql-myisam": "MyISAM",
        "config-mysql-myisam-dep": "''' Внимание.''' Вы выбрали механизм MyISAM для хранения данных MySQL. Он не рекомендуется к использованию по следующим причинам:\n* он слабо поддерживает параллелизм из-за табличных блокировок;\n* более склонен к потере данных, по сравнению с другими механизмами;\n* код MediaWiki не всегда учитывает особенности MyISAM должным образом.\n\nЕсли ваша MySQL поддерживает InnoDB, настоятельно рекомендуется выбрать этот механизм.\nЕсли ваша MySQL не поддерживает InnoDB, возможно, настало время обновиться.",
        "config-mysql-only-myisam-dep": "<strong>Предупреждение:</strong> MyISAM — единственная доступная система хранения данных для MySQL на этом компьютере, и она не рекомендуется для использования совместно с MediaWiki, потому что:\n* слабо поддерживает параллелизм из-за блокировки таблиц\n* больше других систем подвержена повреждению\n* кодовая база MediaWiki не всегда обрабатывает MyISAM так, как следует\n\nВаша MySQL не поддерживает InnoDB, так что, возможно, настало время для обновления.",
index 0957d8b..62f2538 100644 (file)
        "config-db-password": "Лозинка базе података:",
        "config-db-port": "Порт базе података:",
        "config-db-schema": "Шема за Медијавики:",
-       "config-type-mysql": "MySQL (или компактибилан)",
+       "config-type-mysql": "MariaDB, MySQL, или компактибилан",
        "config-type-postgres": "PostgreSQL",
        "config-type-sqlite": "SQLite",
        "config-type-oracle": "Oracle",
        "config-type-mssql": "Microsoft SQL Server",
-       "config-header-mysql": "MySQL подешавања",
+       "config-header-mysql": "MariaDB/MySQL подешавања",
        "config-header-mssql": "Подешавања Microsoft SQL Server-а",
        "config-invalid-db-type": "Неважећи тип базе података.",
        "config-mssql-old": "Потребан је Microsoft SQL Server $1 или новији. Ви имате $2.",
-       "config-mysql-innodb": "InnoDB",
+       "config-mysql-innodb": "InnoDB (препоручено)",
        "config-mysql-myisam": "MyISAM",
        "config-mssql-auth": "Тип провере идентитета:",
        "config-mssql-sqlauth": "Провера идентитета SQL Server-а",
index 3470cc4..37706fa 100644 (file)
@@ -71,7 +71,7 @@
        "config-unicode-using-intl": "使用[https://pecl.php.net/intl intl PECL扩展程序]标准化Unicode。",
        "config-unicode-pure-php-warning": "<strong>警告:</strong>因为尚未安装 [https://pecl.php.net/intl intl PECL 扩展]以处理 Unicode 正常化,故只能退而采用运行较慢的纯 PHP 实现的方法。如果您运行着一个高流量的网站,请参阅 [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode标准化]一文。",
        "config-unicode-update-warning": "<strong>警告:</strong>Unicode正常化封装器的已安装版本使用了旧版本的[http://site.icu-project.org/ ICU项目]库。如果您需要使用Unicode,请将其[https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations 升级]。",
-       "config-no-db": "无法找到合适的数据库驱动!您需要为PHP安装数据库驱动。目前支持以下数据库{{PLURAL:$2|类型}}:$1。\n\n如果您自己编译了PHP,请通过启用数据库客户端重新配置它,例如使用 <code>./configure --with-mysqli</code>。如果您从 Debian 或 Ubuntu 安装包安装了PHP,那么您也需要安装,例如 <code>php-mysql</code> 安装包。",
+       "config-no-db": "无法找到合适的数据库驱动!您需要为PHP安装数据库驱动。目前支持以下数据库{{PLURAL:$2|类型}}:$1。\n\n如果您自己编译了PHP,请通过启用数据库客户端重新配置它,例如使用<code>./configure --with-mysqli</code>。如果您从Debian或Ubuntu安装包安装了PHP,那么您也需要安装一些组件包,例如<code>php-mysql</code>。",
        "config-outdated-sqlite": "<strong>警告:</strong>您已安装SQLite $1,但是它的版本低于最低要求版本$2。因此您无法选择SQLite。",
        "config-no-fts3": "<strong>警告:</strong>已编译的SQLite不包含[//sqlite.org/fts3.html FTS3模块],后台搜索功能将不可用。",
        "config-pcre-old": "<strong>致命错误:</strong>需要PCRE $1 或更高版本。\n您的 PHP 二进制文件与 PCRE $2 链接。\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE 详细信息]。",
        "config-sqlite-dir-help": "SQLite会将所有的数据存储于单一文件中。\n\n您所提供的目录必须在安装过程中对网页服务器可写。\n\n该目录<strong>不应</strong>允许通过web访问,因此我们不会将数据文件和PHP文件放在一起。\n\n安装程序在创建数据文件时,亦会在相同目录下创建<code>.htaccess</code>以控制权限。假若此等控制失效,则可能会将您的数据文件暴露于公共空间,让他人可以获取用户数据(电子邮件地址、杂凑后的密码)、被删除的版本以及其他在wiki上被限制访问的数据。\n\n请考虑将数据库统一放置在某处,如<code>/var/lib/mediawiki/yourwiki</code>下。",
        "config-oracle-def-ts": "默认表空间:",
        "config-oracle-temp-ts": "临时表空间:",
-       "config-type-mysql": "MySQL(或兼容程序)",
+       "config-type-mysql": "MariaDB、MySQL或兼容程序",
        "config-type-mssql": "微软SQL服务器",
        "config-support-info": "MediaWiki支持以下数据库系统:\n\n$1\n\n如果您在下面列出的数据库系统中没有找到您希望使用的系统,请根据上方链向的指引启用支持。",
-       "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL]是MediaWiki的首选数据库,对它的支持最为完备。MediaWiki也可以在[{{int:version-db-mariadb-url}} MariaDB]和[{{int:version-db-percona-url}} Percona Server]下工作,它们与MySQL兼容。([https://secure.php.net/manual/en/mysqli.installation.php 如何将对MySQL的支持编译进PHP中])",
+       "config-dbsupport-mysql": "* [{{int:version-db-mariadb-url}} MariaDB]是用于MediaWiki的主要数据库,对它的支持最为完备。MediaWiki也可以在[{{int:version-db-mysql-url}} MySQL]和[{{int:version-db-percona-url}} Percona Server]下工作,它们与MariaDB兼容。([https://secure.php.net/manual/en/mysqli.installation.php 如何将对MySQL的支持编译进PHP中])",
        "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL]是一种流行的开源数据库系统,可作为MySQL的替代。([https://secure.php.net/manual/en/pgsql.installation.php 如何将对PostgreSQL的支持编译进PHP中])",
        "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite]是一种轻量级的数据库系统,能被良好地支持。([https://secure.php.net/manual/en/pdo.installation.php 如何将对SQLite的支持编译进PHP中],须使用PDO)",
        "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle]是一种商用企业级的数据库。([https://secure.php.net/manual/en/oci8.installation.php 如何将对OCI8的支持编译进PHP中])",
        "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server]是一个适用于Windows的商业性企业数据库。([https://secure.php.net/manual/en/sqlsrv.installation.php 如何编译带有SQLSRV支持的PHP])",
-       "config-header-mysql": "MySQL设置",
+       "config-header-mysql": "MariaDB/MySQL设置",
        "config-header-postgres": "PostgreSQL设置",
        "config-header-sqlite": "SQLite设置",
        "config-header-oracle": "Oracle设置",
        "config-db-web-create": "如果帐号不存在,则自动创建",
        "config-db-web-no-create-privs": "您指定给安装程序的帐号缺少创建帐号的权限,因此您指定的帐号必须已经存在。",
        "config-mysql-engine": "存储引擎:",
-       "config-mysql-innodb": "InnoDB",
+       "config-mysql-innodb": "InnoDB(推荐)",
        "config-mysql-myisam": "MyISAM",
        "config-mysql-myisam-dep": "<strong>警告:</strong>您选择了MyISAM作为MySQL的存储引擎,MediaWiki并不推荐您这么做,因为:\n* 它仅能通过表锁定来勉强支持并发\n* 与其他引擎相比,它更容易被损坏\n* MediaWiki代码库并不总会去处理MyISAM\n\n如果您的MySQL程序支持InnoDB,我们高度推荐您使用该引擎替代MyISAM。\n如果您的MySQL程序不支持InnoDB,请考虑升级。",
        "config-mysql-only-myisam-dep": "<strong>警告:</strong>MyISAM是MySQL在此机器上唯一可用的存储引擎,但它不适合用于MediaWiki,因为:\n*因为表级锁定,它几乎不支持并发。\n*它相比其他引擎更容易损坏。\n*MediaWiki代码不能总是按照预期操作MyISAM。\n\n你的MySQL不支持InnoDB,是时候升级了。",
index addc7fc..37c8890 100644 (file)
@@ -62,7 +62,7 @@ class JobQueueGroup {
        protected function __construct( $wiki, $readOnlyReason ) {
                $this->wiki = $wiki;
                $this->readOnlyReason = $readOnlyReason;
-               $this->cache = new ProcessCacheLRU( 10 );
+               $this->cache = new MapCacheLRU( 10 );
        }
 
        /**
@@ -154,8 +154,8 @@ class JobQueueGroup {
                        $this->get( $type )->push( $jobs );
                }
 
-               if ( $this->cache->has( 'queues-ready', 'list' ) ) {
-                       $list = $this->cache->get( 'queues-ready', 'list' );
+               if ( $this->cache->hasField( 'queues-ready', 'list' ) ) {
+                       $list = $this->cache->getField( 'queues-ready', 'list' );
                        if ( count( array_diff( array_keys( $jobsByType ), $list ) ) ) {
                                $this->cache->clear( 'queues-ready' );
                        }
@@ -244,10 +244,10 @@ class JobQueueGroup {
                        }
                } else { // any job in the "default" jobs types
                        if ( $flags & self::USE_CACHE ) {
-                               if ( !$this->cache->has( 'queues-ready', 'list', self::PROC_CACHE_TTL ) ) {
-                                       $this->cache->set( 'queues-ready', 'list', $this->getQueuesWithJobs() );
+                               if ( !$this->cache->hasField( 'queues-ready', 'list', self::PROC_CACHE_TTL ) ) {
+                                       $this->cache->setField( 'queues-ready', 'list', $this->getQueuesWithJobs() );
                                }
-                               $types = $this->cache->get( 'queues-ready', 'list' );
+                               $types = $this->cache->getField( 'queues-ready', 'list' );
                        } else {
                                $types = $this->getQueuesWithJobs();
                        }
diff --git a/includes/jobqueue/JobQueueSecondTestQueue.php b/includes/jobqueue/JobQueueSecondTestQueue.php
deleted file mode 100644 (file)
index e63f01f..0000000
+++ /dev/null
@@ -1,290 +0,0 @@
-<?php
-
-/**
- * A wrapper for the JobQueue that delegates all the method calls to a single,
- * main queue, and also pushes all the jobs to a second job queue that's being
- * debugged.
- *
- * This class was temporary added to test transitioning to the JobQueueEventBus
- * and will removed after the transition is completed. This code is only needed
- * while we are testing the new infrastructure to be able to compare the results
- * between the queue implementations and make sure that they process the same jobs,
- * deduplicate correctly, compare the delays, backlogs and make sure no jobs are lost.
- * When the new infrastructure is well tested this will not be needed any more.
- *
- * @deprecated since 1.30
- * @since 1.30
- */
-class JobQueueSecondTestQueue extends JobQueue {
-
-       /**
-        * @var JobQueue
-        */
-       private $mainQueue;
-
-       /**
-        * @var JobQueue
-        */
-       private $debugQueue;
-
-       /**
-        * @var bool
-        */
-       private $onlyWriteToDebugQueue;
-
-       protected function __construct( array $params ) {
-               if ( !isset( $params['mainqueue'] ) ) {
-                       throw new MWException( "mainqueue parameter must be provided to the debug queue" );
-               }
-
-               if ( !isset( $params['debugqueue'] ) ) {
-                       throw new MWException( "debugqueue parameter must be provided to the debug queue" );
-               }
-
-               $conf = [ 'wiki' => $params['wiki'], 'type' => $params['type'] ];
-               $this->mainQueue = JobQueue::factory( $params['mainqueue'] + $conf );
-               $this->debugQueue = JobQueue::factory( $params['debugqueue'] + $conf );
-               $this->onlyWriteToDebugQueue = $params['readonly'] ?? false;
-
-               // We need to construct parent after creating the main and debug queue
-               // because super constructor calls some methods we delegate to the main queue.
-               parent::__construct( $params );
-       }
-
-       /**
-        * Get the allowed queue orders for configuration validation
-        *
-        * @return array Subset of (random, timestamp, fifo, undefined)
-        */
-       protected function supportedOrders() {
-               return $this->mainQueue->supportedOrders();
-       }
-
-       /**
-        * Get the default queue order to use if configuration does not specify one
-        *
-        * @return string One of (random, timestamp, fifo, undefined)
-        */
-       protected function optimalOrder() {
-               return $this->mainQueue->optimalOrder();
-       }
-
-       /**
-        * Find out if delayed jobs are supported for configuration validation
-        *
-        * @return bool Whether delayed jobs are supported
-        */
-       protected function supportsDelayedJobs() {
-               return $this->mainQueue->supportsDelayedJobs();
-       }
-
-       /**
-        * @see JobQueue::isEmpty()
-        * @return bool
-        */
-       protected function doIsEmpty() {
-               return $this->mainQueue->doIsEmpty();
-       }
-
-       /**
-        * @see JobQueue::getSize()
-        * @return int
-        */
-       protected function doGetSize() {
-               return $this->mainQueue->doGetSize();
-       }
-
-       /**
-        * @see JobQueue::getAcquiredCount()
-        * @return int
-        */
-       protected function doGetAcquiredCount() {
-               return $this->mainQueue->doGetAcquiredCount();
-       }
-
-       /**
-        * @see JobQueue::getDelayedCount()
-        * @return int
-        */
-       protected function doGetDelayedCount() {
-               return $this->mainQueue->doGetDelayedCount();
-       }
-
-       /**
-        * @see JobQueue::getAbandonedCount()
-        * @return int
-        */
-       protected function doGetAbandonedCount() {
-               return $this->mainQueue->doGetAbandonedCount();
-       }
-
-       /**
-        * @see JobQueue::batchPush()
-        * @param IJobSpecification[] $jobs
-        * @param int $flags
-        */
-       protected function doBatchPush( array $jobs, $flags ) {
-               if ( !$this->onlyWriteToDebugQueue ) {
-                       $this->mainQueue->doBatchPush( $jobs, $flags );
-               }
-
-               try {
-                       $this->debugQueue->doBatchPush( $jobs, $flags );
-               } catch ( Exception $exception ) {
-                       MWExceptionHandler::logException( $exception );
-               }
-       }
-
-       /**
-        * @see JobQueue::pop()
-        * @return Job|bool
-        */
-       protected function doPop() {
-               return $this->mainQueue->doPop();
-       }
-
-       /**
-        * @see JobQueue::ack()
-        * @param Job $job
-        * @return Job|bool
-        */
-       protected function doAck( Job $job ) {
-               return $this->mainQueue->doAck( $job );
-       }
-
-       /**
-        * @see JobQueue::deduplicateRootJob()
-        * @param IJobSpecification $job
-        * @throws MWException
-        * @return bool
-        */
-       protected function doDeduplicateRootJob( IJobSpecification $job ) {
-               return $this->mainQueue->doDeduplicateRootJob( $job );
-       }
-
-       /**
-        * @see JobQueue::isRootJobOldDuplicate()
-        * @param Job $job
-        * @return bool
-        */
-       protected function doIsRootJobOldDuplicate( Job $job ) {
-               return $this->mainQueue->doIsRootJobOldDuplicate( $job );
-       }
-
-       /**
-        * @param string $signature Hash identifier of the root job
-        * @return string
-        */
-       protected function getRootJobCacheKey( $signature ) {
-               return $this->mainQueue->getRootJobCacheKey( $signature );
-       }
-
-       /**
-        * @see JobQueue::delete()
-        * @return bool
-        * @throws MWException
-        */
-       protected function doDelete() {
-               return $this->mainQueue->doDelete();
-       }
-
-       /**
-        * @see JobQueue::waitForBackups()
-        * @return void
-        */
-       protected function doWaitForBackups() {
-               $this->mainQueue->doWaitForBackups();
-       }
-
-       /**
-        * @see JobQueue::flushCaches()
-        * @return void
-        */
-       protected function doFlushCaches() {
-               $this->mainQueue->doFlushCaches();
-       }
-
-       /**
-        * Get an iterator to traverse over all available jobs in this queue.
-        * This does not include jobs that are currently acquired or delayed.
-        * Note: results may be stale if the queue is concurrently modified.
-        *
-        * @return Iterator
-        * @throws JobQueueError
-        */
-       public function getAllQueuedJobs() {
-               return $this->mainQueue->getAllQueuedJobs();
-       }
-
-       /**
-        * Get an iterator to traverse over all delayed jobs in this queue.
-        * Note: results may be stale if the queue is concurrently modified.
-        *
-        * @return Iterator
-        * @throws JobQueueError
-        * @since 1.22
-        */
-       public function getAllDelayedJobs() {
-               return $this->mainQueue->getAllDelayedJobs();
-       }
-
-       /**
-        * Get an iterator to traverse over all claimed jobs in this queue
-        *
-        * Callers should be quick to iterator over it or few results
-        * will be returned due to jobs being acknowledged and deleted
-        *
-        * @return Iterator
-        * @throws JobQueueError
-        * @since 1.26
-        */
-       public function getAllAcquiredJobs() {
-               return $this->mainQueue->getAllAcquiredJobs();
-       }
-
-       /**
-        * Get an iterator to traverse over all abandoned jobs in this queue
-        *
-        * @return Iterator
-        * @throws JobQueueError
-        * @since 1.25
-        */
-       public function getAllAbandonedJobs() {
-               return $this->mainQueue->getAllAbandonedJobs();
-       }
-
-       /**
-        * Do not use this function outside of JobQueue/JobQueueGroup
-        *
-        * @return string
-        * @since 1.22
-        */
-       public function getCoalesceLocationInternal() {
-               return $this->mainQueue->getCoalesceLocationInternal();
-       }
-
-       /**
-        * @see JobQueue::getSiblingQueuesWithJobs()
-        * @param array $types List of queues types
-        * @return array|null (list of queue types) or null if unsupported
-        */
-       protected function doGetSiblingQueuesWithJobs( array $types ) {
-               return $this->mainQueue->doGetSiblingQueuesWithJobs( $types );
-       }
-
-       /**
-        * @see JobQueue::getSiblingQueuesSize()
-        * @param array $types List of queues types
-        * @return array|null (list of queue types) or null if unsupported
-        */
-       protected function doGetSiblingQueueSizes( array $types ) {
-               return $this->mainQueue->doGetSiblingQueueSizes( $types );
-       }
-
-       /**
-        * @throws JobQueueReadOnlyError
-        */
-       protected function assertNotReadOnly() {
-               $this->mainQueue->assertNotReadOnly();
-       }
-}
index e891c9e..ad5e58d 100644 (file)
@@ -135,7 +135,7 @@ class MapCacheLRU implements IExpiringStore, Serializable {
         * Check if a key exists
         *
         * @param string $key
-        * @param float $maxAge Ignore items older than this many seconds (since 1.32)
+        * @param float $maxAge Ignore items older than this many seconds [optional] (since 1.32)
         * @return bool
         */
        public function has( $key, $maxAge = 0.0 ) {
@@ -157,10 +157,11 @@ class MapCacheLRU implements IExpiringStore, Serializable {
         * If the item is already set, it will be pushed to the top of the cache.
         *
         * @param string $key
-        * @return mixed Returns null if the key was not found
+        * @param float $maxAge Ignore items older than this many seconds [optional] (since 1.32)
+        * @return mixed Returns null if the key was not found or is older than $maxAge
         */
-       public function get( $key ) {
-               if ( !$this->has( $key ) ) {
+       public function get( $key, $maxAge = 0.0 ) {
+               if ( !$this->has( $key, $maxAge ) ) {
                        return null;
                }
 
@@ -193,7 +194,7 @@ class MapCacheLRU implements IExpiringStore, Serializable {
        /**
         * @param string|int $key
         * @param string|int $field
-        * @param float $maxAge
+        * @param float $maxAge Ignore items older than this many seconds [optional] (since 1.32)
         * @return bool
         */
        public function hasField( $key, $field, $maxAge = 0.0 ) {
@@ -205,8 +206,18 @@ class MapCacheLRU implements IExpiringStore, Serializable {
                return ( $maxAge <= 0 || $this->getAge( $key, $field ) <= $maxAge );
        }
 
-       public function getField( $key, $field ) {
-               return $this->get( $key )[$field] ?? null;
+       /**
+        * @param string|int $key
+        * @param string|int $field
+        * @param float $maxAge Ignore items older than this many seconds [optional] (since 1.32)
+        * @return mixed Returns null if the key was not found or is older than $maxAge
+        */
+       public function getField( $key, $field, $maxAge = 0.0 ) {
+               if ( !$this->hasField( $key, $field, $maxAge ) ) {
+                       return null;
+               }
+
+               return $this->cache[$key][$field];
        }
 
        /**
index 118464c..e2d56b0 100644 (file)
@@ -40,9 +40,9 @@ abstract class FileBackendStore extends FileBackend {
        protected $memCache;
        /** @var BagOStuff */
        protected $srvCache;
-       /** @var ProcessCacheLRU Map of paths to small (RAM/disk) cache items */
+       /** @var MapCacheLRU Map of paths to small (RAM/disk) cache items */
        protected $cheapCache;
-       /** @var ProcessCacheLRU Map of paths to large (RAM/disk) cache items */
+       /** @var MapCacheLRU Map of paths to large (RAM/disk) cache items */
        protected $expensiveCache;
 
        /** @var array Map of container names to sharding config */
@@ -73,8 +73,8 @@ abstract class FileBackendStore extends FileBackend {
                $this->mimeCallback = $config['mimeCallback'] ?? null;
                $this->srvCache = new EmptyBagOStuff(); // disabled by default
                $this->memCache = WANObjectCache::newEmpty(); // disabled by default
-               $this->cheapCache = new ProcessCacheLRU( self::CACHE_CHEAP_SIZE );
-               $this->expensiveCache = new ProcessCacheLRU( self::CACHE_EXPENSIVE_SIZE );
+               $this->cheapCache = new MapCacheLRU( self::CACHE_CHEAP_SIZE );
+               $this->expensiveCache = new MapCacheLRU( self::CACHE_EXPENSIVE_SIZE );
        }
 
        /**
@@ -627,11 +627,11 @@ abstract class FileBackendStore extends FileBackend {
                }
                $ps = $this->scopedProfileSection( __METHOD__ . "-{$this->name}" );
                $latest = !empty( $params['latest'] ); // use latest data?
-               if ( !$latest && !$this->cheapCache->has( $path, 'stat', self::CACHE_TTL ) ) {
+               if ( !$latest && !$this->cheapCache->hasField( $path, 'stat', self::CACHE_TTL ) ) {
                        $this->primeFileCache( [ $path ] ); // check persistent cache
                }
-               if ( $this->cheapCache->has( $path, 'stat', self::CACHE_TTL ) ) {
-                       $stat = $this->cheapCache->get( $path, 'stat' );
+               if ( $this->cheapCache->hasField( $path, 'stat', self::CACHE_TTL ) ) {
+                       $stat = $this->cheapCache->getField( $path, 'stat' );
                        // If we want the latest data, check that this cached
                        // value was in fact fetched with the latest available data.
                        if ( is_array( $stat ) ) {
@@ -648,21 +648,21 @@ abstract class FileBackendStore extends FileBackend {
                if ( is_array( $stat ) ) { // file exists
                        // Strongly consistent backends can automatically set "latest"
                        $stat['latest'] = $stat['latest'] ?? $latest;
-                       $this->cheapCache->set( $path, 'stat', $stat );
+                       $this->cheapCache->setField( $path, 'stat', $stat );
                        $this->setFileCache( $path, $stat ); // update persistent cache
                        if ( isset( $stat['sha1'] ) ) { // some backends store SHA-1 as metadata
-                               $this->cheapCache->set( $path, 'sha1',
+                               $this->cheapCache->setField( $path, 'sha1',
                                        [ 'hash' => $stat['sha1'], 'latest' => $latest ] );
                        }
                        if ( isset( $stat['xattr'] ) ) { // some backends store headers/metadata
                                $stat['xattr'] = self::normalizeXAttributes( $stat['xattr'] );
-                               $this->cheapCache->set( $path, 'xattr',
+                               $this->cheapCache->setField( $path, 'xattr',
                                        [ 'map' => $stat['xattr'], 'latest' => $latest ] );
                        }
                } elseif ( $stat === false ) { // file does not exist
-                       $this->cheapCache->set( $path, 'stat', $latest ? 'NOT_EXIST_LATEST' : 'NOT_EXIST' );
-                       $this->cheapCache->set( $path, 'xattr', [ 'map' => false, 'latest' => $latest ] );
-                       $this->cheapCache->set( $path, 'sha1', [ 'hash' => false, 'latest' => $latest ] );
+                       $this->cheapCache->setField( $path, 'stat', $latest ? 'NOT_EXIST_LATEST' : 'NOT_EXIST' );
+                       $this->cheapCache->setField( $path, 'xattr', [ 'map' => false, 'latest' => $latest ] );
+                       $this->cheapCache->setField( $path, 'sha1', [ 'hash' => false, 'latest' => $latest ] );
                        $this->logger->debug( __METHOD__ . ": File $path does not exist.\n" );
                } else { // an error occurred
                        $this->logger->warning( __METHOD__ . ": Could not stat file $path.\n" );
@@ -709,8 +709,8 @@ abstract class FileBackendStore extends FileBackend {
                }
                $ps = $this->scopedProfileSection( __METHOD__ . "-{$this->name}" );
                $latest = !empty( $params['latest'] ); // use latest data?
-               if ( $this->cheapCache->has( $path, 'xattr', self::CACHE_TTL ) ) {
-                       $stat = $this->cheapCache->get( $path, 'xattr' );
+               if ( $this->cheapCache->hasField( $path, 'xattr', self::CACHE_TTL ) ) {
+                       $stat = $this->cheapCache->getField( $path, 'xattr' );
                        // If we want the latest data, check that this cached
                        // value was in fact fetched with the latest available data.
                        if ( !$latest || $stat['latest'] ) {
@@ -719,7 +719,7 @@ abstract class FileBackendStore extends FileBackend {
                }
                $fields = $this->doGetFileXAttributes( $params );
                $fields = is_array( $fields ) ? self::normalizeXAttributes( $fields ) : false;
-               $this->cheapCache->set( $path, 'xattr', [ 'map' => $fields, 'latest' => $latest ] );
+               $this->cheapCache->setField( $path, 'xattr', [ 'map' => $fields, 'latest' => $latest ] );
 
                return $fields;
        }
@@ -740,8 +740,8 @@ abstract class FileBackendStore extends FileBackend {
                }
                $ps = $this->scopedProfileSection( __METHOD__ . "-{$this->name}" );
                $latest = !empty( $params['latest'] ); // use latest data?
-               if ( $this->cheapCache->has( $path, 'sha1', self::CACHE_TTL ) ) {
-                       $stat = $this->cheapCache->get( $path, 'sha1' );
+               if ( $this->cheapCache->hasField( $path, 'sha1', self::CACHE_TTL ) ) {
+                       $stat = $this->cheapCache->getField( $path, 'sha1' );
                        // If we want the latest data, check that this cached
                        // value was in fact fetched with the latest available data.
                        if ( !$latest || $stat['latest'] ) {
@@ -749,7 +749,7 @@ abstract class FileBackendStore extends FileBackend {
                        }
                }
                $hash = $this->doGetFileSha1Base36( $params );
-               $this->cheapCache->set( $path, 'sha1', [ 'hash' => $hash, 'latest' => $latest ] );
+               $this->cheapCache->setField( $path, 'sha1', [ 'hash' => $hash, 'latest' => $latest ] );
 
                return $hash;
        }
@@ -788,8 +788,8 @@ abstract class FileBackendStore extends FileBackend {
                        $path = self::normalizeStoragePath( $src );
                        if ( $path === null ) {
                                $fsFiles[$src] = null; // invalid storage path
-                       } elseif ( $this->expensiveCache->has( $path, 'localRef' ) ) {
-                               $val = $this->expensiveCache->get( $path, 'localRef' );
+                       } elseif ( $this->expensiveCache->hasField( $path, 'localRef' ) ) {
+                               $val = $this->expensiveCache->getField( $path, 'localRef' );
                                // If we want the latest data, check that this cached
                                // value was in fact fetched with the latest available data.
                                if ( !$latest || $val['latest'] ) {
@@ -802,7 +802,7 @@ abstract class FileBackendStore extends FileBackend {
                foreach ( $this->doGetLocalReferenceMulti( $params ) as $path => $fsFile ) {
                        $fsFiles[$path] = $fsFile;
                        if ( $fsFile ) { // update the process cache...
-                               $this->expensiveCache->set( $path, 'localRef',
+                               $this->expensiveCache->setField( $path, 'localRef',
                                        [ 'object' => $fsFile, 'latest' => $latest ] );
                        }
                }
@@ -1102,7 +1102,7 @@ abstract class FileBackendStore extends FileBackend {
                }
 
                // Enlarge the cache to fit the stat entries of these files
-               $this->cheapCache->resize( max( 2 * count( $paths ), self::CACHE_CHEAP_SIZE ) );
+               $this->cheapCache->setMaxSize( max( 2 * count( $paths ), self::CACHE_CHEAP_SIZE ) );
 
                // Load from the persistent container caches
                $this->primeContainerCache( $paths );
@@ -1129,7 +1129,7 @@ abstract class FileBackendStore extends FileBackend {
                $status->success = $subStatus->success; // not done in merge()
 
                // Shrink the stat cache back to normal size
-               $this->cheapCache->resize( self::CACHE_CHEAP_SIZE );
+               $this->cheapCache->setMaxSize( self::CACHE_CHEAP_SIZE );
 
                return $status;
        }
@@ -1323,23 +1323,23 @@ abstract class FileBackendStore extends FileBackend {
                        if ( is_array( $stat ) ) { // file exists
                                // Strongly consistent backends can automatically set "latest"
                                $stat['latest'] = $stat['latest'] ?? $latest;
-                               $this->cheapCache->set( $path, 'stat', $stat );
+                               $this->cheapCache->setField( $path, 'stat', $stat );
                                $this->setFileCache( $path, $stat ); // update persistent cache
                                if ( isset( $stat['sha1'] ) ) { // some backends store SHA-1 as metadata
-                                       $this->cheapCache->set( $path, 'sha1',
+                                       $this->cheapCache->setField( $path, 'sha1',
                                                [ 'hash' => $stat['sha1'], 'latest' => $latest ] );
                                }
                                if ( isset( $stat['xattr'] ) ) { // some backends store headers/metadata
                                        $stat['xattr'] = self::normalizeXAttributes( $stat['xattr'] );
-                                       $this->cheapCache->set( $path, 'xattr',
+                                       $this->cheapCache->setField( $path, 'xattr',
                                                [ 'map' => $stat['xattr'], 'latest' => $latest ] );
                                }
                        } elseif ( $stat === false ) { // file does not exist
-                               $this->cheapCache->set( $path, 'stat',
+                               $this->cheapCache->setField( $path, 'stat',
                                        $latest ? 'NOT_EXIST_LATEST' : 'NOT_EXIST' );
-                               $this->cheapCache->set( $path, 'xattr',
+                               $this->cheapCache->setField( $path, 'xattr',
                                        [ 'map' => false, 'latest' => $latest ] );
-                               $this->cheapCache->set( $path, 'sha1',
+                               $this->cheapCache->setField( $path, 'sha1',
                                        [ 'hash' => false, 'latest' => $latest ] );
                                $this->logger->debug( __METHOD__ . ": File $path does not exist.\n" );
                        } else { // an error occurred
@@ -1769,14 +1769,14 @@ abstract class FileBackendStore extends FileBackend {
                        $path = $pathNames[$cacheKey];
                        if ( is_array( $val ) ) {
                                $val['latest'] = false; // never completely trust cache
-                               $this->cheapCache->set( $path, 'stat', $val );
+                               $this->cheapCache->setField( $path, 'stat', $val );
                                if ( isset( $val['sha1'] ) ) { // some backends store SHA-1 as metadata
-                                       $this->cheapCache->set( $path, 'sha1',
+                                       $this->cheapCache->setField( $path, 'sha1',
                                                [ 'hash' => $val['sha1'], 'latest' => false ] );
                                }
                                if ( isset( $val['xattr'] ) ) { // some backends store headers/metadata
                                        $val['xattr'] = self::normalizeXAttributes( $val['xattr'] );
-                                       $this->cheapCache->set( $path, 'xattr',
+                                       $this->cheapCache->setField( $path, 'xattr',
                                                [ 'map' => $val['xattr'], 'latest' => false ] );
                                }
                        }
index 143f854..31882de 100644 (file)
@@ -129,7 +129,7 @@ class SwiftFileBackend extends FileBackendStore {
                        $this->memCache = $config['wanCache'];
                }
                // Process cache for container info
-               $this->containerStatCache = new ProcessCacheLRU( 300 );
+               $this->containerStatCache = new MapCacheLRU( 300 );
                // Cache auth token information to avoid RTTs
                if ( !empty( $config['cacheAuthInfo'] ) && isset( $config['srvCache'] ) ) {
                        $this->srvCache = $config['srvCache'];
@@ -1033,7 +1033,7 @@ class SwiftFileBackend extends FileBackendStore {
         * @param array $val Stat value
         */
        public function loadListingStatInternal( $path, array $val ) {
-               $this->cheapCache->set( $path, 'stat', $val );
+               $this->cheapCache->setField( $path, 'stat', $val );
        }
 
        protected function doGetFileXAttributes( array $params ) {
@@ -1188,7 +1188,7 @@ class SwiftFileBackend extends FileBackendStore {
                                // Set the file stat process cache in passing
                                $stat = $this->getStatFromHeaders( $rhdrs );
                                $stat['latest'] = $isLatest;
-                               $this->cheapCache->set( $path, 'stat', $stat );
+                               $this->cheapCache->setField( $path, 'stat', $stat );
                        } elseif ( $rcode === 404 ) {
                                $tmpFiles[$path] = false;
                        } else {
@@ -1395,10 +1395,10 @@ class SwiftFileBackend extends FileBackendStore {
 
                if ( $bypassCache ) { // purge cache
                        $this->containerStatCache->clear( $container );
-               } elseif ( !$this->containerStatCache->has( $container, 'stat' ) ) {
+               } elseif ( !$this->containerStatCache->hasField( $container, 'stat' ) ) {
                        $this->primeContainerCache( [ $container ] ); // check persistent cache
                }
-               if ( !$this->containerStatCache->has( $container, 'stat' ) ) {
+               if ( !$this->containerStatCache->hasField( $container, 'stat' ) ) {
                        $auth = $this->getAuthentication();
                        if ( !$auth ) {
                                return null;
@@ -1418,7 +1418,7 @@ class SwiftFileBackend extends FileBackendStore {
                                if ( $bypassCache ) {
                                        return $stat;
                                } else {
-                                       $this->containerStatCache->set( $container, 'stat', $stat ); // cache it
+                                       $this->containerStatCache->setField( $container, 'stat', $stat ); // cache it
                                        $this->setContainerCache( $container, $stat ); // update persistent cache
                                }
                        } elseif ( $rcode === 404 ) {
@@ -1431,7 +1431,7 @@ class SwiftFileBackend extends FileBackendStore {
                        }
                }
 
-               return $this->containerStatCache->get( $container, 'stat' );
+               return $this->containerStatCache->getField( $container, 'stat' );
        }
 
        /**
@@ -1583,7 +1583,7 @@ class SwiftFileBackend extends FileBackendStore {
 
        protected function doPrimeContainerCache( array $containerInfo ) {
                foreach ( $containerInfo as $container => $info ) {
-                       $this->containerStatCache->set( $container, 'stat', $info );
+                       $this->containerStatCache->setField( $container, 'stat', $info );
                }
        }
 
index f1f749f..7f5f003 100644 (file)
@@ -46,7 +46,7 @@ class MemcLockManager extends QuorumLockManager {
 
        /** @var MemcachedBagOStuff[] Map of (server name => MemcachedBagOStuff) */
        protected $cacheServers = [];
-       /** @var HashBagOStuff Server status cache */
+       /** @var MapCacheLRU Server status cache */
        protected $statusCache;
 
        /**
@@ -81,7 +81,7 @@ class MemcLockManager extends QuorumLockManager {
                        $this->cacheServers[$name] = new $class( $params );
                }
 
-               $this->statusCache = new HashBagOStuff();
+               $this->statusCache = new MapCacheLRU( 100 );
        }
 
        protected function getLocksOnServer( $lockSrv, array $pathsByType ) {
@@ -252,13 +252,13 @@ class MemcLockManager extends QuorumLockManager {
                        throw new InvalidArgumentException( "Invalid cache server '$lockSrv'." );
                }
 
-               $online = $this->statusCache->get( "online:$lockSrv" );
-               if ( $online === false ) {
+               $online = $this->statusCache->get( "online:$lockSrv", 30 );
+               if ( $online === null ) {
                        $online = $this->cacheServers[$lockSrv]->set( __CLASS__ . ':ping', 1, 1 );
                        if ( !$online ) { // server down?
                                $this->logger->warning( __METHOD__ . ": Could not contact $lockSrv." );
                        }
-                       $this->statusCache->set( "online:$lockSrv", (int)$online, 30 );
+                       $this->statusCache->set( "online:$lockSrv", (int)$online );
                }
 
                return $online ? $this->cacheServers[$lockSrv] : null;
index 0100fb2..782f4c6 100644 (file)
@@ -371,7 +371,13 @@ abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface {
         * @return bool Success
         */
        protected function mergeViaLock( $key, $callback, $exptime = 0, $attempts = 10, $flags = 0 ) {
-               if ( !$this->lock( $key, 6 ) ) {
+               if ( $attempts <= 1 ) {
+                       $timeout = 0; // clearly intended to be "non-blocking"
+               } else {
+                       $timeout = 3;
+               }
+
+               if ( !$this->lock( $key, $timeout ) ) {
                        return false;
                }
 
index 64bfa95..043f8cb 100644 (file)
@@ -122,7 +122,7 @@ class MultiWriteBagOStuff extends BagOStuff {
                        && $missIndexes
                        && ( $flags & self::READ_VERIFIED ) == self::READ_VERIFIED
                ) {
-                       // Backfill the value to the lower (and often larger) cache tiers
+                       // Backfill the value to the higher (and often faster/smaller) cache tiers
                        $this->doWrite(
                                $missIndexes, $this->asyncWrites, 'set', $key, $value, self::UPGRADE_TTL
                        );
@@ -171,6 +171,23 @@ class MultiWriteBagOStuff extends BagOStuff {
                return $this->doWrite( $this->cacheIndexes, $this->asyncWrites, 'decr', $key, $value );
        }
 
+       public function merge( $key, callable $callback, $exptime = 0, $attempts = 10, $flags = 0 ) {
+               $asyncWrites = ( ( $flags & self::WRITE_SYNC ) == self::WRITE_SYNC )
+                       ? false
+                       : $this->asyncWrites;
+
+               return $this->doWrite(
+                       $this->cacheIndexes,
+                       $asyncWrites,
+                       'merge',
+                       $key,
+                       $callback,
+                       $exptime,
+                       $attempts,
+                       $flags
+               );
+       }
+
        public function lock( $key, $timeout = 6, $expiry = 6, $rclass = '' ) {
                // Only need to lock the first cache; also avoids deadlocks
                return $this->caches[0]->lock( $key, $timeout, $expiry, $rclass );
@@ -202,7 +219,7 @@ class MultiWriteBagOStuff extends BagOStuff {
                $ret = true;
                $args = array_slice( func_get_args(), 3 );
 
-               if ( count( $indexes ) > 1 && $asyncWrites ) {
+               if ( array_diff( $indexes, [ 0 ] ) && $asyncWrites && $method !== 'merge' ) {
                        // Deep-clone $args to prevent misbehavior when something writes an
                        // object to the BagOStuff then modifies it afterwards, e.g. T168040.
                        $args = unserialize( serialize( $args ) );
index e30e061..2989c81 100644 (file)
@@ -87,7 +87,7 @@ use Psr\Log\NullLogger;
 class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
        /** @var BagOStuff The local datacenter cache */
        protected $cache;
-       /** @var HashBagOStuff[] Map of group PHP instance caches */
+       /** @var MapCacheLRU[] Map of group PHP instance caches */
        protected $processCaches = [];
        /** @var string Purge channel name */
        protected $purgeChannel;
@@ -1061,7 +1061,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                if ( $pcTTL >= 0 && $this->callbackDepth == 0 ) {
                        $group = $opts['pcGroup'] ?? self::PC_PRIMARY;
                        $procCache = $this->getProcessCache( $group );
-                       $value = $procCache->get( $key );
+                       $value = $procCache->has( $key, $pcTTL ) ? $procCache->get( $key ) : false;
                } else {
                        $procCache = false;
                        $value = false;
@@ -1117,7 +1117,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
 
                        // Update the process cache if enabled
                        if ( $procCache && $value !== false ) {
-                               $procCache->set( $key, $value, $pcTTL );
+                               $procCache->set( $key, $value );
                        }
                }
 
@@ -1385,10 +1385,11 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
        ) {
                $valueKeys = array_keys( $keyedIds->getArrayCopy() );
                $checkKeys = $opts['checkKeys'] ?? [];
+               $pcTTL = $opts['pcTTL'] ?? self::TTL_UNCACHEABLE;
 
                // Load required keys into process cache in one go
                $this->warmupCache = $this->getRawKeysForWarmup(
-                       $this->getNonProcessCachedKeys( $valueKeys, $opts ),
+                       $this->getNonProcessCachedKeys( $valueKeys, $opts, $pcTTL ),
                        $checkKeys
                );
                $this->warmupKeyMisses = 0;
@@ -1480,11 +1481,12 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                $idsByValueKey = $keyedIds->getArrayCopy();
                $valueKeys = array_keys( $idsByValueKey );
                $checkKeys = $opts['checkKeys'] ?? [];
+               $pcTTL = $opts['pcTTL'] ?? self::TTL_UNCACHEABLE;
                unset( $opts['lockTSE'] ); // incompatible
                unset( $opts['busyValue'] ); // incompatible
 
                // Load required keys into process cache in one go
-               $keysGet = $this->getNonProcessCachedKeys( $valueKeys, $opts );
+               $keysGet = $this->getNonProcessCachedKeys( $valueKeys, $opts, $pcTTL );
                $this->warmupCache = $this->getRawKeysForWarmup( $keysGet, $checkKeys );
                $this->warmupKeyMisses = 0;
 
@@ -2103,12 +2105,12 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
 
        /**
         * @param string $group
-        * @return HashBagOStuff
+        * @return MapCacheLRU
         */
        protected function getProcessCache( $group ) {
                if ( !isset( $this->processCaches[$group] ) ) {
                        list( , $n ) = explode( ':', $group );
-                       $this->processCaches[$group] = new HashBagOStuff( [ 'maxKeys' => (int)$n ] );
+                       $this->processCaches[$group] = new MapCacheLRU( (int)$n );
                }
 
                return $this->processCaches[$group];
@@ -2117,15 +2119,16 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
        /**
         * @param array $keys
         * @param array $opts
+        * @param int $pcTTL
         * @return array List of keys
         */
-       private function getNonProcessCachedKeys( array $keys, array $opts ) {
+       private function getNonProcessCachedKeys( array $keys, array $opts, $pcTTL ) {
                $keysFound = [];
                if ( isset( $opts['pcTTL'] ) && $opts['pcTTL'] > 0 && $this->callbackDepth == 0 ) {
                        $pcGroup = $opts['pcGroup'] ?? self::PC_PRIMARY;
                        $procCache = $this->getProcessCache( $pcGroup );
                        foreach ( $keys as $key ) {
-                               if ( $procCache->get( $key ) !== false ) {
+                               if ( $procCache->has( $key, $pcTTL ) ) {
                                        $keysFound[] = $key;
                                }
                        }
index d11b51b..dc3260d 100644 (file)
@@ -3844,9 +3844,11 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                $this->assertOpen();
 
                $this->runOnTransactionPreCommitCallbacks();
+
                $writeTime = $this->pendingWriteQueryDuration( self::ESTIMATE_DB_APPLY );
                $this->doCommit( $fname );
                $this->trxStatus = self::STATUS_TRX_NONE;
+
                if ( $this->trxDoneWrites ) {
                        $this->lastWriteTime = microtime( true );
                        $this->trxProfiler->transactionWritingOut(
@@ -3894,14 +3896,18 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                        // Avoid fatals if close() was called
                        $this->assertOpen();
 
+                       $writeTime = $this->pendingWriteQueryDuration( self::ESTIMATE_DB_APPLY );
                        $this->doRollback( $fname );
                        $this->trxStatus = self::STATUS_TRX_NONE;
                        $this->trxAtomicLevels = [];
+
                        if ( $this->trxDoneWrites ) {
                                $this->trxProfiler->transactionWritingOut(
                                        $this->server,
                                        $this->dbName,
-                                       $this->trxShortId
+                                       $this->trxShortId,
+                                       $writeTime,
+                                       $this->trxWriteAffectedRows
                                );
                        }
                }
index fdcaa1b..73aaa4f 100644 (file)
@@ -123,9 +123,19 @@ class LogEventsList extends ContextSource {
                $formDescriptor['page'] = $this->getTitleInputDesc( $title );
 
                // Add extra inputs if any
+               // This could either be a form descriptor array or a string with raw HTML.
+               // We need it to work in both cases and show a deprecation warning if it
+               // is a string. See T199495.
                $extraInputsDescriptor = $this->getExtraInputsDesc( $types );
-               if ( !empty( $extraInputsDescriptor ) ) {
+               if (
+                       is_array( $extraInputsDescriptor ) &&
+                       !empty( $extraInputsDescriptor )
+               ) {
                        $formDescriptor[ 'extra' ] = $extraInputsDescriptor;
+               } elseif ( is_string( $extraInputsDescriptor ) ) {
+                       // We'll add this to the footer of the form later
+                       $extraInputsString = $extraInputsDescriptor;
+                       wfDeprecated( 'Using $input in LogEventsListGetExtraInputs hook', '1.32' );
                }
 
                // Title pattern, if allowed
@@ -163,8 +173,18 @@ class LogEventsList extends ContextSource {
                $htmlForm = new HTMLForm( $formDescriptor, $this->getContext() );
                $htmlForm
                        ->setSubmitText( $this->msg( 'logeventslist-submit' )->text() )
+                       ->setMethod( 'get' )
                        ->setWrapperLegendMsg( 'log' );
 
+               // TODO This will should be removed at some point. See T199495.
+               if ( isset( $extraInputsString ) ) {
+                       $htmlForm->addFooterText( Html::rawElement(
+                               'div',
+                               null,
+                               $extraInputsString
+                       ) );
+               }
+
                $htmlForm->prepareForm()->displayForm( false );
        }
 
@@ -176,7 +196,12 @@ class LogEventsList extends ContextSource {
                $options = [];
                $default = [];
                foreach ( $filter as $type => $val ) {
-                       $options[ $this->msg( "logeventslist-{$type}-log" )->text() ] = $type;
+                       $message = $this->msg( "logeventslist-{$type}-log" );
+                       // FIXME: Remove this check once T199657 is fully resolved.
+                       if ( !$message->exists() ) {
+                               $message = $this->msg( "log-show-hide-{$type}" )->params( $this->msg( 'show' )->text() );
+                       }
+                       $options[ $message->text() ] = $type;
 
                        if ( $val === 0 ) {
                                $default[] = $type;
@@ -260,7 +285,6 @@ class LogEventsList extends ContextSource {
                        'class' => 'HTMLTitleTextField',
                        'label-message' => 'speciallogtitlelabel',
                        'name' => 'page',
-                       'value' => $title,
                        'required' => false
                ];
        }
@@ -279,27 +303,24 @@ class LogEventsList extends ContextSource {
 
        /**
         * @param array $types
-        * @return array Form descriptor
+        * @return array|string Form descriptor or string with HTML
         */
        private function getExtraInputsDesc( $types ) {
                if ( count( $types ) == 1 ) {
                        if ( $types[0] == 'suppress' ) {
-                               $offender = $this->getRequest()->getVal( 'offender' );
-                               $user = User::newFromName( $offender, false );
-                               if ( !$user || ( $user->getId() == 0 && !IP::isIPAddress( $offender ) ) ) {
-                                       $offender = ''; // Blank field if invalid
-                               }
                                return [
                                        'type' => 'text',
                                        'label-message' => 'revdelete-offender',
                                        'name' => 'offender',
-                                       'value' => $offender,
                                ];
                        } else {
                                // Allow extensions to add their own extra inputs
+                               // This could be an array or string. See T199495.
+                               $input = ''; // Deprecated
                                $formDescriptor = [];
-                               Hooks::run( 'LogEventsListGetExtraInputs', [ $types[0], $this, &$formDescriptor ] );
-                               return $formDescriptor;
+                               Hooks::run( 'LogEventsListGetExtraInputs', [ $types[0], $this, &$input, &$formDescriptor ] );
+
+                               return empty( $formDescriptor ) ? $input : $formDescriptor;
                        }
                }
 
@@ -402,7 +423,10 @@ class LogEventsList extends ContextSource {
 
                // Let extensions add data
                Hooks::run( 'LogEventsListLineEnding', [ $this, &$ret, $entry, &$classes, &$attribs ] );
-               $attribs = wfArrayFilterByKey( $attribs, [ Sanitizer::class, 'isReservedDataAttribute' ] );
+               $attribs = array_filter( $attribs,
+                       [ Sanitizer::class, 'isReservedDataAttribute' ],
+                       ARRAY_FILTER_USE_KEY
+               );
                $attribs['class'] = implode( ' ', $classes );
 
                return Html::rawElement( 'li', $attribs, $ret ) . "\n";
index 7cc25bd..a1b2e57 100644 (file)
@@ -1470,7 +1470,7 @@ class WikiPage implements Page, IDBAccessObject {
                $bSlots = $b->getRevisionRecord()->getSlots();
                $changedRoles = $aSlots->getRolesWithDifferentContent( $bSlots );
 
-               return ( $changedRoles !== [ 'main' ] );
+               return ( $changedRoles !== [ 'main' ] && $changedRoles !== [] );
        }
 
        /**
@@ -3343,23 +3343,10 @@ class WikiPage implements Page, IDBAccessObject {
                foreach ( $deleted as $catName ) {
                        $cat = Category::newFromName( $catName );
                        Hooks::run( 'CategoryAfterPageRemoved', [ $cat, $this, $id ] );
-               }
-
-               // Refresh counts on categories that should be empty now
-               if ( count( $deleted ) ) {
-                       $rows = $dbw->select(
-                               'category',
-                               [ 'cat_id', 'cat_title', 'cat_pages', 'cat_subcats', 'cat_files' ],
-                               [ 'cat_title' => $deleted, 'cat_pages <= 100' ],
-                               __METHOD__
-                       );
-                       foreach ( $rows as $row ) {
-                               $cat = Category::newFromRow( $row );
-                               // T166757: do the update after this DB commit
-                               DeferredUpdates::addCallableUpdate( function () use ( $cat ) {
-                                       $cat->refreshCounts();
-                               } );
-                       }
+                       // Refresh counts on categories that should be empty now (after commit, T166757)
+                       DeferredUpdates::addCallableUpdate( function () use ( $cat ) {
+                               $cat->refreshCountsIfEmpty();
+                       } );
                }
        }
 
index 4f5cb67..f38ed27 100644 (file)
@@ -298,7 +298,6 @@ abstract class TablePager extends IndexPager {
                $types = [ 'first', 'prev', 'next', 'last' ];
 
                $queries = $this->getPagingQueries();
-               $links = [];
 
                $buttons = [];
 
index fd5ccb8..12d899b 100644 (file)
@@ -4216,6 +4216,13 @@ class Parser {
                        # Avoid insertion of weird stuff like <math> by expanding the relevant sections
                        $safeHeadline = $this->mStripState->unstripBoth( $safeHeadline );
 
+                       # Remove any <style> or <script> tags (T198618)
+                       $safeHeadline = preg_replace(
+                               '#<(style|script)(?: [^>]*[^>/])?>.*?</\1>#is',
+                               '',
+                               $safeHeadline
+                       );
+
                        # Strip out HTML (first regex removes any tag not allowed)
                        # Allowed tags are:
                        # * <sup> and <sub> (T10393)
index 8c113f4..830da06 100644 (file)
@@ -20,7 +20,6 @@
 
 namespace MediaWiki\Preferences;
 
-use CentralIdLookup;
 use Config;
 use DateTime;
 use DateTimeZone;
@@ -53,6 +52,7 @@ use SpecialPage;
 use SpecialPreferences;
 use Status;
 use Title;
+use UnexpectedValueException;
 use User;
 use UserGroupMembership;
 use Xml;
@@ -94,22 +94,6 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                $this->logger = new NullLogger();
        }
 
-       /**
-        * @return callable[]
-        */
-       protected function getSaveFilters() {
-               // Wrap intval() so that we can pass it multiple parameters and treat all filters the same.
-               $intvalFilter = function ( $value, $alldata ) {
-                       return intval( $value );
-               };
-               return [
-                       'timecorrection' => [ $this, 'filterTimezoneInput' ],
-                       'rclimit' => $intvalFilter,
-                       'wllimit' => $intvalFilter,
-                       'searchlimit' => $intvalFilter,
-               ];
-       }
-
        /**
         * @inheritDoc
         */
@@ -178,9 +162,11 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                $disable = !$user->isAllowed( 'editmyoptions' );
 
                $defaultOptions = User::getDefaultOptions();
+               $userOptions = $user->getOptions();
+               $this->applyFilters( $userOptions, $defaultPreferences, 'filterForForm' );
                # # Prod in defaults from the user
                foreach ( $defaultPreferences as $name => &$info ) {
-                       $prefFromUser = $this->getOptionFromUser( $name, $info, $user );
+                       $prefFromUser = $this->getOptionFromUser( $name, $info, $userOptions );
                        if ( $disable && !in_array( $name, $this->getSaveBlacklist() ) ) {
                                $info['disabled'] = 'disabled';
                        }
@@ -209,11 +195,11 @@ class DefaultPreferencesFactory implements PreferencesFactory {
         *
         * @param string $name
         * @param array $info
-        * @param User $user
+        * @param array $userOptions
         * @return array|string
         */
-       protected function getOptionFromUser( $name, $info, User $user ) {
-               $val = $user->getOption( $name );
+       protected function getOptionFromUser( $name, $info, array $userOptions ) {
+               $val = $userOptions[$name] ?? null;
 
                // Handling for multiselect preferences
                if ( ( isset( $info['type'] ) && $info['type'] == 'multiselect' ) ||
@@ -223,7 +209,7 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                        $val = [];
 
                        foreach ( $options as $value ) {
-                               if ( $user->getOption( "$prefix$value" ) ) {
+                               if ( $userOptions["$prefix$value"] ?? false ) {
                                        $val[] = $value;
                                }
                        }
@@ -239,7 +225,7 @@ class DefaultPreferencesFactory implements PreferencesFactory {
 
                        foreach ( $columns as $column ) {
                                foreach ( $rows as $row ) {
-                                       if ( $user->getOption( "$prefix$column-$row" ) ) {
+                                       if ( $userOptions["$prefix$column-$row"] ?? false ) {
                                                $val[] = "$column-$row";
                                        }
                                }
@@ -653,16 +639,12 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                                ];
 
                                if ( $this->config->get( 'EnableUserEmailBlacklist' ) ) {
-                                       $lookup = CentralIdLookup::factory();
-                                       $ids = $user->getOption( 'email-blacklist', [] );
-                                       $names = $ids ? $lookup->namesFromCentralIds( $ids, $user ) : [];
-
                                        $defaultPreferences['email-blacklist'] = [
                                                'type' => 'usersmultiselect',
                                                'label-message' => 'email-blacklist-label',
                                                'section' => 'personal/email',
-                                               'default' => implode( "\n", $names ),
                                                'disabled' => $disableEmailPrefs,
+                                               'filter' => MultiUsernameFilter::class,
                                        ];
                                }
                        }
@@ -850,6 +832,7 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                        'size' => 20,
                        'section' => 'rendering/timeoffset',
                        'id' => 'wpTimeCorrection',
+                       'filter' => TimezoneFilter::class,
                ];
        }
 
@@ -1010,6 +993,7 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                        'label-message' => 'recentchangescount',
                        'help-message' => 'prefs-help-recentchangescount',
                        'section' => 'rc/displayrc',
+                       'filter' => IntvalFilter::class,
                ];
                $defaultPreferences['usenewrc'] = [
                        'type' => 'toggle',
@@ -1153,6 +1137,7 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                        'label-message' => 'prefs-watchlist-edits',
                        'help' => $context->msg( 'prefs-watchlist-edits-max' )->escaped(),
                        'section' => 'watchlist/displaywatchlist',
+                       'filter' => IntvalFilter::class,
                ];
                $defaultPreferences['extendwatchlist'] = [
                        'type' => 'toggle',
@@ -1533,9 +1518,11 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                # Used message keys: 'accesskey-preferences-save', 'tooltip-preferences-save'
                $htmlForm->setSubmitTooltip( 'preferences-save' );
                $htmlForm->setSubmitID( 'prefcontrol' );
-               $htmlForm->setSubmitCallback( function ( array $formData, HTMLForm $form ) {
-                       return $this->submitForm( $formData, $form );
-               } );
+               $htmlForm->setSubmitCallback(
+                       function ( array $formData, HTMLForm $form ) use ( $formDescriptor ) {
+                               return $this->submitForm( $formData, $form, $formDescriptor );
+                       }
+               );
 
                return $htmlForm;
        }
@@ -1584,64 +1571,16 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                return $opt;
        }
 
-       /**
-        * @param string $tz
-        * @param array $alldata
-        * @return string
-        */
-       protected function filterTimezoneInput( $tz, array $alldata ) {
-               $data = explode( '|', $tz, 3 );
-               switch ( $data[0] ) {
-                       case 'ZoneInfo':
-                               $valid = false;
-
-                               if ( count( $data ) === 3 ) {
-                                       // Make sure this timezone exists
-                                       try {
-                                               new DateTimeZone( $data[2] );
-                                               // If the constructor didn't throw, we know it's valid
-                                               $valid = true;
-                                       } catch ( Exception $e ) {
-                                               // Not a valid timezone
-                                       }
-                               }
-
-                               if ( !$valid ) {
-                                       // If the supplied timezone doesn't exist, fall back to the encoded offset
-                                       return 'Offset|' . intval( $tz[1] );
-                               }
-                               return $tz;
-                       case 'System':
-                               return $tz;
-                       default:
-                               $data = explode( ':', $tz, 2 );
-                               if ( count( $data ) == 2 ) {
-                                       $data[0] = intval( $data[0] );
-                                       $data[1] = intval( $data[1] );
-                                       $minDiff = abs( $data[0] ) * 60 + $data[1];
-                                       if ( $data[0] < 0 ) {
-                                               $minDiff = - $minDiff;
-                                       }
-                               } else {
-                                       $minDiff = intval( $data[0] ) * 60;
-                               }
-
-                               # Max is +14:00 and min is -12:00, see:
-                               # https://en.wikipedia.org/wiki/Timezone
-                               $minDiff = min( $minDiff, 840 );  # 14:00
-                               $minDiff = max( $minDiff, -720 ); # -12:00
-                               return 'Offset|' . $minDiff;
-               }
-       }
-
        /**
         * Handle the form submission if everything validated properly
         *
         * @param array $formData
         * @param HTMLForm $form
+        * @param array[] $formDescriptor
         * @return bool|Status|string
         */
-       protected function saveFormData( $formData, HTMLForm $form ) {
+       protected function saveFormData( $formData, HTMLForm $form, array $formDescriptor ) {
+               /** @var \User $user */
                $user = $form->getModifiedUser();
                $hiddenPrefs = $this->config->get( 'HiddenPrefs' );
                $result = true;
@@ -1651,12 +1590,7 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                }
 
                // Filter input
-               foreach ( array_keys( $formData ) as $name ) {
-                       $filters = $this->getSaveFilters();
-                       if ( isset( $filters[$name] ) ) {
-                               $formData[$name] = call_user_func( $filters[$name], $formData[$name], $formData );
-                       }
-               }
+               $this->applyFilters( $formData, $formDescriptor, 'filterFromForm' );
 
                // Fortunately, the realname field is MUCH simpler
                // (not really "private", but still shouldn't be edited without permission)
@@ -1713,16 +1647,32 @@ class DefaultPreferencesFactory implements PreferencesFactory {
        }
 
        /**
-        * DO NOT USE. Temporary function to punch hole for the Preferences class.
-        *
-        * @deprecated since 1.31, its inception
+        * Applies filters to preferences either before or after form usage
         *
-        * @param array $formData
-        * @param HTMLForm $form
-        * @return bool|Status|string
+        * @param array &$preferences
+        * @param array $formDescriptor
+        * @param string $verb Name of the filter method to call, either 'filterFromForm' or
+        *              'filterForForm'
         */
-       public function legacySaveFormData( $formData, HTMLForm $form ) {
-               return $this->saveFormData( $formData, $form );
+       protected function applyFilters( array &$preferences, array $formDescriptor, $verb ) {
+               foreach ( $formDescriptor as $preference => $desc ) {
+                       if ( !isset( $desc['filter'] ) || !isset( $preferences[$preference] ) ) {
+                               continue;
+                       }
+                       $filterDesc = $desc['filter'];
+                       if ( $filterDesc instanceof Filter ) {
+                               $filter = $filterDesc;
+                       } elseif ( class_exists( $filterDesc ) ) {
+                               $filter = new $filterDesc();
+                       } elseif ( is_callable( $filterDesc ) ) {
+                               $filter = $filterDesc();
+                       } else {
+                               throw new UnexpectedValueException(
+                                       "Unrecognized filter type for preference '$preference'"
+                               );
+                       }
+                       $preferences[$preference] = $filter->$verb( $preferences[$preference] );
+               }
        }
 
        /**
@@ -1730,10 +1680,11 @@ class DefaultPreferencesFactory implements PreferencesFactory {
         *
         * @param array $formData
         * @param HTMLForm $form
+        * @param array $formDescriptor
         * @return Status
         */
-       protected function submitForm( array $formData, HTMLForm $form ) {
-               $res = $this->saveFormData( $formData, $form );
+       protected function submitForm( array $formData, HTMLForm $form, array $formDescriptor ) {
+               $res = $this->saveFormData( $formData, $form, $formDescriptor );
 
                if ( $res === true ) {
                        $context = $form->getContext();
@@ -1763,19 +1714,6 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                return ( $res === true ? Status::newGood() : $res );
        }
 
-       /**
-        * DO NOT USE. Temporary function to punch hole for the Preferences class.
-        *
-        * @deprecated since 1.31, its inception
-        *
-        * @param array $formData
-        * @param HTMLForm $form
-        * @return Status
-        */
-       public function legacySubmitForm( array $formData, HTMLForm $form ) {
-               return $this->submitForm( $formData, $form );
-       }
-
        /**
         * Get a list of all time zones
         * @param Language $language Language used for the localized names
diff --git a/includes/preferences/Filter.php b/includes/preferences/Filter.php
new file mode 100644 (file)
index 0000000..670dd5b
--- /dev/null
@@ -0,0 +1,39 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+namespace MediaWiki\Preferences;
+
+/**
+ * Base interface for user preference flters that work as a middleware between
+ * storage and interface.
+ */
+interface Filter {
+       /**
+        * @param mixed $value
+        * @return mixed
+        */
+       public function filterForForm( $value );
+
+       /**
+        * @param mixed $value
+        * @return mixed
+        */
+       public function filterFromForm( $value );
+}
diff --git a/includes/preferences/IntvalFilter.php b/includes/preferences/IntvalFilter.php
new file mode 100644 (file)
index 0000000..0dd3fc5
--- /dev/null
@@ -0,0 +1,38 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+namespace MediaWiki\Preferences;
+
+class IntvalFilter implements Filter {
+
+       /**
+        * @inheritDoc
+        */
+       public function filterForForm( $value ) {
+               return $value;
+       }
+
+       /**
+        * @inheritDoc
+        */
+       public function filterFromForm( $value ) {
+               return intval( $value );
+       }
+}
diff --git a/includes/preferences/MultiUsernameFilter.php b/includes/preferences/MultiUsernameFilter.php
new file mode 100644 (file)
index 0000000..2d8ae3c
--- /dev/null
@@ -0,0 +1,86 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+namespace MediaWiki\Preferences;
+
+use CentralIdLookup;
+
+class MultiUsernameFilter implements Filter {
+       /**
+        * @var CentralIdLookup|null
+        */
+       private $lookup;
+       /** @var CentralIdLookup|int User querying central usernames or one of the audience constants */
+       private $userOrAudience;
+
+       /**
+        * @param CentralIdLookup|null $lookup
+        * @param int $userOrAudience
+        */
+       public function __construct( CentralIdLookup $lookup = null,
+               $userOrAudience = CentralIdLookup::AUDIENCE_PUBLIC
+       ) {
+               $this->lookup = $lookup;
+               $this->userOrAudience = $userOrAudience;
+       }
+
+       /**
+        * @inheritDoc
+        */
+       public function filterFromForm( $names ) {
+               $names = trim( $names );
+               if ( $names !== '' ) {
+                       $names = preg_split( '/\n/', $names, -1, PREG_SPLIT_NO_EMPTY );
+                       $ids = $this->getLookup()->centralIdsFromNames( $names, $this->userOrAudience );
+                       if ( $ids ) {
+                               return implode( "\n", $ids );
+                       }
+               }
+               // If the user list is empty, it should be null (don't save) rather than an empty string
+               return null;
+       }
+
+       /**
+        * @inheritDoc
+        */
+       public function filterForForm( $value ) {
+               $ids = self::splitIds( $value );
+               $names = $ids ? $this->getLookup()->namesFromCentralIds( $ids, $this->userOrAudience ) : [];
+               return implode( "\n", $names );
+       }
+
+       /**
+        * Splits a newline separated list of user ids into a
+        *
+        * @param string $str
+        * @return int[]
+        */
+       public static function splitIds( $str ) {
+               return array_map( 'intval', preg_split( '/\n/', $str, -1, PREG_SPLIT_NO_EMPTY ) );
+       }
+
+       /**
+        * @return CentralIdLookup
+        */
+       private function getLookup() {
+               $this->lookup = $this->lookup ?? CentralIdLookup::factory();
+               return $this->lookup;
+       }
+}
diff --git a/includes/preferences/TimezoneFilter.php b/includes/preferences/TimezoneFilter.php
new file mode 100644 (file)
index 0000000..53f12de
--- /dev/null
@@ -0,0 +1,84 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+namespace MediaWiki\Preferences;
+
+use DateTimeZone;
+use Exception;
+
+class TimezoneFilter implements Filter {
+
+       /**
+        * @inheritDoc
+        */
+       public function filterForForm( $value ) {
+               return $value;
+       }
+
+       /**
+        * @inheritDoc
+        */
+       public function filterFromForm( $tz ) {
+               $data = explode( '|', $tz, 3 );
+               switch ( $data[0] ) {
+                       case 'ZoneInfo':
+                               $valid = false;
+
+                               if ( count( $data ) === 3 ) {
+                                       // Make sure this timezone exists
+                                       try {
+                                               new DateTimeZone( $data[2] );
+                                               // If the constructor didn't throw, we know it's valid
+                                               $valid = true;
+                                       } catch ( Exception $e ) {
+                                               // Not a valid timezone
+                                       }
+                               }
+
+                               if ( !$valid ) {
+                                       // If the supplied timezone doesn't exist, fall back to the encoded offset
+                                       return 'Offset|' . intval( $tz[1] );
+                               }
+                               return $tz;
+                       case 'System':
+                               return $tz;
+                       default:
+                               $data = explode( ':', $tz, 2 );
+                               if ( count( $data ) == 2 ) {
+                                       $data[0] = intval( $data[0] );
+                                       $data[1] = intval( $data[1] );
+                                       $minDiff = abs( $data[0] ) * 60 + $data[1];
+                                       if ( $data[0] < 0 ) {
+                                               $minDiff = - $minDiff;
+                                       }
+                               } else {
+                                       $minDiff = intval( $data[0] ) * 60;
+                               }
+
+                               # Max is +14:00 and min is -12:00, see:
+                               # https://en.wikipedia.org/wiki/Timezone
+                               # 14:00
+                               $minDiff = min( $minDiff, 840 );
+                               # -12:00
+                               $minDiff = max( $minDiff, -720 );
+                               return 'Offset|' . $minDiff;
+               }
+       }
+}
index 564ea6b..9d6c1a5 100644 (file)
 
 use Composer\Spdx\SpdxLicenses;
 use JsonSchema\Validator;
+use Seld\JsonLint\JsonParser;
+use Seld\JsonLint\ParsingException;
 
 /**
+ * Validate extension.json files against their JSON schema.
+ *
+ * This is used for static validation from the command-line via
+ * validateRegistrationFile.php, and the PHPUnit structure test suite
+ * (ExtensionJsonValidationTest).
+ *
+ * The files are normally read by the ExtensionRegistry
+ * and ExtensionProcessor classes.
+ *
  * @since 1.29
  */
 class ExtensionJsonValidator {
@@ -54,6 +65,10 @@ class ExtensionJsonValidator {
                                'The spdx-licenses library cannot be found, please install it through composer.'
                        );
                        return false;
+               } elseif ( !class_exists( JsonParser::class ) ) {
+                       call_user_func( $this->missingDepCallback,
+                               'The JSON lint library cannot be found, please install it through composer.'
+                       );
                }
 
                return true;
@@ -65,8 +80,14 @@ class ExtensionJsonValidator {
         * @throws ExtensionJsonValidationError on any failure
         */
        public function validate( $path ) {
-               $data = json_decode( file_get_contents( $path ) );
-               if ( !is_object( $data ) ) {
+               $contents = file_get_contents( $path );
+               $jsonParser = new JsonParser();
+               try {
+                       $data = $jsonParser->parse( $contents, JsonParser::DETECT_KEY_CONFLICTS );
+               } catch ( ParsingException $e ) {
+                       if ( $e instanceof \Seld\JsonLint\DuplicateKeyException ) {
+                               throw new ExtensionJsonValidationError( $e->getMessage() );
+                       }
                        throw new ExtensionJsonValidationError( "$path is not valid JSON" );
                }
 
index a803e3a..d0a9871 100644 (file)
@@ -162,6 +162,11 @@ class ExtensionProcessor implements Processor {
         */
        protected $credits = [];
 
+       /**
+        * @var array
+        */
+       protected $config = [];
+
        /**
         * Any thing else in the $info that hasn't
         * already been processed
@@ -290,6 +295,7 @@ class ExtensionProcessor implements Processor {
 
                return [
                        'globals' => $this->globals,
+                       'config' => $this->config,
                        'defines' => $this->defines,
                        'callbacks' => $this->callbacks,
                        'credits' => $this->credits,
@@ -493,6 +499,11 @@ class ExtensionProcessor implements Processor {
                                        $value = "$dir/$value";
                                }
                                $this->addConfigGlobal( "$prefix$key", $value, $info['name'] );
+                               $data['providedby'] = $info['name'];
+                               if ( isset( $info['ConfigRegistry'][0] ) ) {
+                                       $data['configregistry'] = array_keys( $info['ConfigRegistry'] )[0];
+                               }
+                               $this->config[$key] = $data;
                        }
                }
        }
index c58b55e..d21ae41 100644 (file)
@@ -36,7 +36,7 @@ class ExtensionRegistry {
        /**
         * Bump whenever the registration cache needs resetting
         */
-       const CACHE_VERSION = 6;
+       const CACHE_VERSION = 7;
 
        /**
         * Special key that defines the merge strategy
index 210deb1..636d3b3 100644 (file)
@@ -25,6 +25,7 @@ interface Processor {
         * @return array With following keys:
         *     'globals' - variables to be set to $GLOBALS
         *     'defines' - constants to define
+        *     'config' - configuration information
         *     'callbacks' - functions to be executed by the registry
         *     'credits' - metadata to be stored by registry
         *     'attributes' - registration info which isn't a global variable
index 9c673bc..59853b4 100644 (file)
@@ -117,7 +117,7 @@ class VersionChecker {
                                                }
                                                break;
                                        case 'extensions':
-                                       case 'skin':
+                                       case 'skins':
                                                foreach ( $values as $dependency => $constraint ) {
                                                        $extError = $this->handleExtensionDependency(
                                                                $dependency, $constraint, $extension, $dependencyType
@@ -169,7 +169,7 @@ class VersionChecker {
         * @param string $dependencyName The name of the dependency
         * @param string $constraint The required version constraint for this dependency
         * @param string $checkedExt The Extension, which depends on this dependency
-        * @param string $type Either 'extension' or 'skin'
+        * @param string $type Either 'extensions' or 'skins'
         * @return bool|array false for no errors, or an array of info
         */
        private function handleExtensionDependency( $dependencyName, $constraint, $checkedExt,
index f2929a3..93f8d23 100644 (file)
@@ -28,7 +28,7 @@ use Wikimedia\Rdbms\IDatabase;
  * @ingroup Search
  * @since 1.23
  */
-class SearchDatabase extends SearchEngine {
+abstract class SearchDatabase extends SearchEngine {
        /**
         * @var IDatabase Slave database for reading from for results
         */
@@ -45,6 +45,38 @@ class SearchDatabase extends SearchEngine {
                }
        }
 
+       /**
+        * @param string $term
+        * @return SearchResultSet|Status|null
+        */
+       final public function doSearchText( $term ) {
+               return $this->doSearchTextInDB( $this->extractNamespacePrefix( $term ) );
+       }
+
+       /**
+        * Perform a full text search query and return a result set.
+        *
+        * @param string $term Raw search term
+        * @return SqlSearchResultSet
+        */
+       abstract protected function doSearchTextInDB( $term );
+
+       /**
+        * @param string $term
+        * @return SearchResultSet|null
+        */
+       final public function doSearchTitle( $term ) {
+               return $this->doSearchTitleInDB( $this->extractNamespacePrefix( $term ) );
+       }
+
+       /**
+        * Perform a title-only search query and return a result set.
+        *
+        * @param string $term Raw search term
+        * @return SqlSearchResultSet
+        */
+       abstract protected function doSearchTitleInDB( $term );
+
        /**
         * Return a 'cleaned up' search string
         *
@@ -58,4 +90,19 @@ class SearchDatabase extends SearchEngine {
                $lc = $this->legalSearchChars( self::CHARS_ALL );
                return trim( preg_replace( "/[^{$lc}]/", " ", $text ) );
        }
+
+       /**
+        * Extract the optional namespace prefix and set self::namespaces
+        * accordingly and return the query string
+        * @param string $term
+        * @return string the query string without any namespace prefix
+        */
+       final protected function extractNamespacePrefix( $term ) {
+               $queryAndNs = self::parseNamespacePrefixes( $term );
+               if ( $queryAndNs === false ) {
+                       return $term;
+               }
+               $this->namespaces = $queryAndNs[1];
+               return $queryAndNs[0];
+       }
 }
index 63c4610..30c2271 100644 (file)
@@ -244,6 +244,8 @@ abstract class SearchEngine {
         * search=test&prefix=Main_Page/Archive -> test prefix:Main Page/Archive
         * @param string $term
         * @return string
+        * @deprecated since 1.32 this should now be handled internally by the
+        * search engine
         */
        public function transformSearchTerm( $term ) {
                return $term;
@@ -385,16 +387,12 @@ abstract class SearchEngine {
         * or namespace names and set the list of namespaces
         * of this class accordingly.
         *
+        * @deprecated since 1.32; should be handled internally by the search engine
         * @param string $query
         * @return string
         */
        function replacePrefixes( $query ) {
-               $queryAndNs = self::parseNamespacePrefixes( $query );
-               if ( $queryAndNs === false ) {
-                       return $query;
-               }
-               $this->namespaces = $queryAndNs[1];
-               return $queryAndNs[0];
+               return $query;
        }
 
        /**
@@ -402,11 +400,21 @@ abstract class SearchEngine {
         * or namespace names
         *
         * @param string $query
+        * @param bool $withAllKeyword activate support of the "all:" keyword and its
+        * translations to activate searching on all namespaces.
+        * @param bool $withPrefixSearchExtractNamespaceHook call the PrefixSearchExtractNamespace hook
+        *  if classic namespace identification did not match.
         * @return false|array false if no namespace was extracted, an array
         * with the parsed query at index 0 and an array of namespaces at index
         * 1 (or null for all namespaces).
-        */
-       public static function parseNamespacePrefixes( $query ) {
+        * @throws FatalError
+        * @throws MWException
+        */
+       public static function parseNamespacePrefixes(
+               $query,
+               $withAllKeyword = true,
+               $withPrefixSearchExtractNamespaceHook = false
+       ) {
                global $wgContLang;
 
                $parsed = $query;
@@ -414,40 +422,48 @@ abstract class SearchEngine {
                        return false;
                }
                $extractedNamespace = null;
-               $allkeywords = [];
-
-               $allkeywords[] = wfMessage( 'searchall' )->inContentLanguage()->text() . ":";
-               // force all: so that we have a common syntax for all the wikis
-               if ( !in_array( 'all:', $allkeywords ) ) {
-                       $allkeywords[] = 'all:';
-               }
 
                $allQuery = false;
-               foreach ( $allkeywords as $kw ) {
-                       if ( strncmp( $query, $kw, strlen( $kw ) ) == 0 ) {
-                               $extractedNamespace = null;
-                               $parsed = substr( $query, strlen( $kw ) );
-                               $allQuery = true;
-                               break;
+               if ( $withAllKeyword ) {
+                       $allkeywords = [];
+
+                       $allkeywords[] = wfMessage( 'searchall' )->inContentLanguage()->text() . ":";
+                       // force all: so that we have a common syntax for all the wikis
+                       if ( !in_array( 'all:', $allkeywords ) ) {
+                               $allkeywords[] = 'all:';
+                       }
+
+                       foreach ( $allkeywords as $kw ) {
+                               if ( strncmp( $query, $kw, strlen( $kw ) ) == 0 ) {
+                                       $extractedNamespace = null;
+                                       $parsed = substr( $query, strlen( $kw ) );
+                                       $allQuery = true;
+                                       break;
+                               }
                        }
                }
 
                if ( !$allQuery && strpos( $query, ':' ) !== false ) {
-                       // TODO: should we unify with PrefixSearch::extractNamespace ?
                        $prefix = str_replace( ' ', '_', substr( $query, 0, strpos( $query, ':' ) ) );
                        $index = $wgContLang->getNsIndex( $prefix );
                        if ( $index !== false ) {
                                $extractedNamespace = [ $index ];
                                $parsed = substr( $query, strlen( $prefix ) + 1 );
+                       } elseif ( $withPrefixSearchExtractNamespaceHook ) {
+                               $hookNamespaces = [ NS_MAIN ];
+                               $hookQuery = $query;
+                               Hooks::run( 'PrefixSearchExtractNamespace', [ &$hookNamespaces, &$hookQuery ] );
+                               if ( $hookQuery !== $query ) {
+                                       $parsed = $hookQuery;
+                                       $extractedNamespace = $hookNamespaces;
+                               } else {
+                                       return false;
+                               }
                        } else {
                                return false;
                        }
                }
 
-               if ( trim( $parsed ) == '' ) {
-                       $parsed = $query; // prefix was the whole query
-               }
-
                return [ $parsed, $extractedNamespace ];
        }
 
@@ -530,34 +546,11 @@ abstract class SearchEngine {
         * @return string Simplified search string
         */
        protected function normalizeNamespaces( $search ) {
-               // Find a Title which is not an interwiki and is in NS_MAIN
-               $title = Title::newFromText( $search );
-               $ns = $this->namespaces;
-               if ( $title && !$title->isExternal() ) {
-                       $ns = [ $title->getNamespace() ];
-                       $search = $title->getText();
-                       if ( $ns[0] == NS_MAIN ) {
-                               $ns = $this->namespaces; // no explicit prefix, use default namespaces
-                               Hooks::run( 'PrefixSearchExtractNamespace', [ &$ns, &$search ] );
-                       }
-               } else {
-                       $title = Title::newFromText( $search . 'Dummy' );
-                       if ( $title && $title->getText() == 'Dummy'
-                                       && $title->getNamespace() != NS_MAIN
-                                       && !$title->isExternal()
-                       ) {
-                               $ns = [ $title->getNamespace() ];
-                               $search = '';
-                       } else {
-                               Hooks::run( 'PrefixSearchExtractNamespace', [ &$ns, &$search ] );
-                       }
+               $queryAndNs = self::parseNamespacePrefixes( $search, false, true );
+               if ( $queryAndNs !== false ) {
+                       $this->setNamespaces( $queryAndNs[1] );
+                       return $queryAndNs[0];
                }
-
-               $ns = array_map( function ( $space ) {
-                       return $space == NS_MEDIA ? NS_FILE : $space;
-               }, $ns );
-
-               $this->setNamespaces( $ns );
                return $search;
        }
 
index 30ac92d..289f925 100644 (file)
@@ -34,7 +34,7 @@ class SearchMssql extends SearchDatabase {
         * @param string $term Raw search term
         * @return SqlSearchResultSet
         */
-       protected function doSearchText( $term ) {
+       protected function doSearchTextInDB( $term ) {
                $resultSet = $this->db->query( $this->getQuery( $this->filter( $term ), true ) );
                return new SqlSearchResultSet( $resultSet, $this->searchTerms );
        }
@@ -45,7 +45,7 @@ class SearchMssql extends SearchDatabase {
         * @param string $term Raw search term
         * @return SqlSearchResultSet
         */
-       protected function doSearchTitle( $term ) {
+       protected function doSearchTitleInDB( $term ) {
                $resultSet = $this->db->query( $this->getQuery( $this->filter( $term ), false ) );
                return new SqlSearchResultSet( $resultSet, $this->searchTerms );
        }
index 9a03ebe..6253b55 100644 (file)
@@ -167,7 +167,7 @@ class SearchMySQL extends SearchDatabase {
         * @param string $term Raw search term
         * @return SqlSearchResultSet
         */
-       protected function doSearchText( $term ) {
+       protected function doSearchTextInDB( $term ) {
                return $this->searchInternal( $term, true );
        }
 
@@ -177,7 +177,7 @@ class SearchMySQL extends SearchDatabase {
         * @param string $term Raw search term
         * @return SqlSearchResultSet
         */
-       protected function doSearchTitle( $term ) {
+       protected function doSearchTitleInDB( $term ) {
                return $this->searchInternal( $term, false );
        }
 
index 7fe5b53..6d7e988 100644 (file)
@@ -64,7 +64,7 @@ class SearchOracle extends SearchDatabase {
         * @param string $term Raw search term
         * @return SqlSearchResultSet
         */
-       protected function doSearchText( $term ) {
+       protected function doSearchTextInDB( $term ) {
                if ( $term == '' ) {
                        return new SqlSearchResultSet( false, '' );
                }
@@ -79,7 +79,7 @@ class SearchOracle extends SearchDatabase {
         * @param string $term Raw search term
         * @return SqlSearchResultSet
         */
-       protected function doSearchTitle( $term ) {
+       protected function doSearchTitleInDB( $term ) {
                if ( $term == '' ) {
                        return new SqlSearchResultSet( false, '' );
                }
index 729e528..6d5f117 100644 (file)
@@ -37,7 +37,7 @@ class SearchPostgres extends SearchDatabase {
         * @param string $term Raw search term
         * @return SqlSearchResultSet
         */
-       protected function doSearchTitle( $term ) {
+       protected function doSearchTitleInDB( $term ) {
                $q = $this->searchQuery( $term, 'titlevector', 'page_title' );
                $olderror = error_reporting( E_ERROR );
                $resultSet = $this->db->query( $q, 'SearchPostgres', true );
@@ -45,7 +45,7 @@ class SearchPostgres extends SearchDatabase {
                return new SqlSearchResultSet( $resultSet, $this->searchTerms );
        }
 
-       protected function doSearchText( $term ) {
+       protected function doSearchTextInDB( $term ) {
                $q = $this->searchQuery( $term, 'textvector', 'old_text' );
                $olderror = error_reporting( E_ERROR );
                $resultSet = $this->db->query( $q, 'SearchPostgres', true );
index 1dc37d2..0ed477a 100644 (file)
@@ -156,7 +156,7 @@ class SearchSqlite extends SearchDatabase {
         * @param string $term Raw search term
         * @return SqlSearchResultSet
         */
-       protected function doSearchText( $term ) {
+       protected function doSearchTextInDB( $term ) {
                return $this->searchInternal( $term, true );
        }
 
@@ -166,7 +166,7 @@ class SearchSqlite extends SearchDatabase {
         * @param string $term Raw search term
         * @return SqlSearchResultSet
         */
-       protected function doSearchTitle( $term ) {
+       protected function doSearchTitleInDB( $term ) {
                return $this->searchInternal( $term, false );
        }
 
index 8ae517e..1154e05 100644 (file)
@@ -437,12 +437,12 @@ class Command {
                        @trigger_error( '' );
                        restore_error_handler();
 
-                       $readPipes = wfArrayFilterByKey( $pipes, function ( $fd ) use ( $desc ) {
+                       $readPipes = array_filter( $pipes, function ( $fd ) use ( $desc ) {
                                return $desc[$fd][0] === 'pipe' && $desc[$fd][1] === 'r';
-                       } );
-                       $writePipes = wfArrayFilterByKey( $pipes, function ( $fd ) use ( $desc ) {
+                       }, ARRAY_FILTER_USE_KEY );
+                       $writePipes = array_filter( $pipes, function ( $fd ) use ( $desc ) {
                                return $desc[$fd][0] === 'pipe' && $desc[$fd][1] === 'w';
-                       } );
+                       }, ARRAY_FILTER_USE_KEY );
                        // stream_select parameter names are from the POV of us being able to do the operation;
                        // proc_open desriptor types are from the POV of the process doing it.
                        // So $writePipes is passed as the $read parameter and $readPipes as $write.
index d5c889a..e94f3db 100644 (file)
@@ -265,6 +265,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                         $this->getUser()->isLoggedIn()
                ) {
                        $this->successfulAction();
+                       return;
                }
 
                // If logging in and not on HTTPS, either redirect to it or offer a link.
index 3db7eda..b657335 100644 (file)
@@ -166,7 +166,7 @@ class SpecialEditTags extends UnlistedSpecialPage {
                                [],
                                [
                                        'page' => $this->targetObj->getPrefixedText(),
-                                       'hide_tag_log' => '0',
+                                       'wpfilters' => [ 'tag' ],
                                ]
                        );
                        if ( !$this->targetObj->isSpecialPage() ) {
index d7ce414..9248a40 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup SpecialPage
  */
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Preferences\MultiUsernameFilter;
 
 /**
  * A special page that allows users to send e-mails to other users
@@ -247,8 +248,9 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                }
 
                if ( $sender !== null ) {
-                       $blacklist = $target->getOption( 'email-blacklist', [] );
+                       $blacklist = $target->getOption( 'email-blacklist', '' );
                        if ( $blacklist ) {
+                               $blacklist = MultiUsernameFilter::splitIds( $blacklist );
                                $lookup = CentralIdLookup::factory();
                                $senderId = $lookup->centralIdFromLocalUser( $sender );
                                if ( $senderId !== 0 && in_array( $senderId, $blacklist ) ) {
index a93b522..da2b688 100644 (file)
@@ -398,7 +398,10 @@ class SpecialNewpages extends IncludableSpecialPage {
 
                // Let extensions add data
                Hooks::run( 'NewPagesLineEnding', [ $this, &$ret, $result, &$classes, &$attribs ] );
-               $attribs = wfArrayFilterByKey( $attribs, [ Sanitizer::class, 'isReservedDataAttribute' ] );
+               $attribs = array_filter( $attribs,
+                       [ Sanitizer::class, 'isReservedDataAttribute' ],
+                       ARRAY_FILTER_USE_KEY
+               );
 
                if ( count( $classes ) ) {
                        $attribs['class'] = implode( ' ', $classes );
index 13259c9..2cff90e 100644 (file)
@@ -194,6 +194,9 @@ class SpecialSearch extends SpecialPage {
                $request = $this->getRequest();
                list( $this->limit, $this->offset ) = $request->getLimitOffset( 20, '' );
                $this->mPrefix = $request->getVal( 'prefix', '' );
+               if ( $this->mPrefix !== '' ) {
+                       $this->setExtraParam( 'prefix', $this->mPrefix );
+               }
 
                $user = $this->getUser();
 
@@ -300,7 +303,6 @@ class SpecialSearch extends SpecialPage {
                $search->setLimitOffset( $this->limit, $this->offset );
                $search->setNamespaces( $this->namespaces );
                $search->prefix = $this->mPrefix;
-               $term = $search->transformSearchTerm( $term );
 
                Hooks::run( 'SpecialSearchSetupEngine', [ $this, $this->profile, $search ] );
                if ( !Hooks::run( 'SpecialSearchResultsPrepend', [ $this, $out, $term ] ) ) {
@@ -312,9 +314,20 @@ class SpecialSearch extends SpecialPage {
                $showSuggestion = $title === null || !$title->isKnown();
                $search->setShowSuggestion( $showSuggestion );
 
-               // fetch search results
+               $rewritten = $search->transformSearchTerm( $term );
+               if ( $rewritten !== $term ) {
+                       $term = $rewritten;
+                       wfDeprecated( 'SearchEngine::transformSearchTerm() (overridden by ' .
+                               get_class( $search ) . ')', '1.32' );
+               }
+
                $rewritten = $search->replacePrefixes( $term );
+               if ( $rewritten !== $term ) {
+                       wfDeprecated( 'SearchEngine::replacePrefixes() (overridden by ' .
+                                                 get_class( $search ) . ')', '1.32' );
+               }
 
+               // fetch search results
                $titleMatches = $search->searchTitle( $rewritten );
                $textMatches = $search->searchText( $rewritten );
 
@@ -531,6 +544,28 @@ class SpecialSearch extends SpecialPage {
                        );
                }
 
+               if ( $this->mPrefix !== '' ) {
+                       $subtitle = $this->msg( 'search-filter-title-prefix' )->plaintextParams( $this->mPrefix );
+                       $params = $this->powerSearchOptions();
+                       unset( $params['prefix'] );
+                       $params += [
+                               'search' => $term,
+                               'fulltext' => 1,
+                       ];
+
+                       $subtitle .= ' (';
+                       $subtitle .= Xml::element(
+                               'a',
+                               [
+                                       'href' => $this->getPageTitle()->getLocalURL( $params ),
+                                       'title' => $this->msg( 'search-filter-title-prefix-reset' ),
+                               ],
+                               $this->msg( 'search-filter-title-prefix-reset' )
+                       );
+                       $subtitle .= ')';
+                       $out->setSubtitle( $subtitle );
+               }
+
                $out->addJsConfigVars( [ 'searchTerm' => $term ] );
                $out->addModules( 'mediawiki.special.search' );
                $out->addModuleStyles( [
@@ -712,6 +747,18 @@ class SpecialSearch extends SpecialPage {
                $this->extraParams[$key] = $value;
        }
 
+       /**
+        * The prefix value send to Special:Search using the 'prefix' URI param
+        * It means that the user is willing to search for pages whose titles start with
+        * this prefix value.
+        * (Used by the InputBox extension)
+        *
+        * @return string
+        */
+       public function getPrefix() {
+               return $this->mPrefix;
+       }
+
        protected function getGroupName() {
                return 'pages';
        }
index 205364f..59fa948 100644 (file)
@@ -593,7 +593,10 @@ class ContribsPager extends RangeChronologicalPager {
 
                // Let extensions add data
                Hooks::run( 'ContributionsLineEnding', [ $this, &$ret, $row, &$classes, &$attribs ] );
-               $attribs = wfArrayFilterByKey( $attribs, [ Sanitizer::class, 'isReservedDataAttribute' ] );
+               $attribs = array_filter( $attribs,
+                       [ Sanitizer::class, 'isReservedDataAttribute' ],
+                       ARRAY_FILTER_USE_KEY
+               );
 
                // TODO: Handle exceptions in the catch block above.  Do any extensions rely on
                // receiving empty rows?
index f261b72..ee7eb3e 100644 (file)
@@ -221,7 +221,10 @@ class DeletedContribsPager extends IndexPager {
 
                // Let extensions add data
                Hooks::run( 'DeletedContributionsLineEnding', [ $this, &$ret, $row, &$classes, &$attribs ] );
-               $attribs = wfArrayFilterByKey( $attribs, [ Sanitizer::class, 'isReservedDataAttribute' ] );
+               $attribs = array_filter( $attribs,
+                       [ Sanitizer::class, 'isReservedDataAttribute' ],
+                       ARRAY_FILTER_USE_KEY
+               );
 
                if ( $classes === [] && $attribs === [] && $ret === '' ) {
                        wfDebug( "Dropping Special:DeletedContribution row that could not be formatted\n" );
index 39c0c1b..f65bae5 100644 (file)
@@ -240,7 +240,9 @@ class PasswordReset implements LoggerAwareInterface {
 
                $passwords = [];
                foreach ( $reqs as $req ) {
-                       $this->authManager->changeAuthenticationData( $req );
+                       // This is adding a new temporary password, not intentionally changing anything
+                       // (even though it might technically invalidate an old temporary password).
+                       $this->authManager->changeAuthenticationData( $req, /* $isAddition */ true );
                }
 
                $this->logger->info(
index ea8cd57..2ba01ff 100644 (file)
@@ -5507,12 +5507,6 @@ class User implements IDBAccessObject, UserIdentity {
                                }
                        }
 
-                       // Convert the email blacklist from a new line delimited string
-                       // to an array of ids.
-                       if ( isset( $data['email-blacklist'] ) && $data['email-blacklist'] ) {
-                               $data['email-blacklist'] = array_map( 'intval', explode( "\n", $data['email-blacklist'] ) );
-                       }
-
                        foreach ( $data as $property => $value ) {
                                $this->mOptionOverrides[$property] = $value;
                                $this->mOptions[$property] = $value;
@@ -5540,26 +5534,6 @@ class User implements IDBAccessObject, UserIdentity {
                // Not using getOptions(), to keep hidden preferences in database
                $saveOptions = $this->mOptions;
 
-               // Convert usernames to ids.
-               if ( isset( $this->mOptions['email-blacklist'] ) ) {
-                       if ( $this->mOptions['email-blacklist'] ) {
-                               $value = $this->mOptions['email-blacklist'];
-                               // Email Blacklist may be an array of ids or a string of new line
-                               // delimnated user names.
-                               if ( is_array( $value ) ) {
-                                       $ids = array_filter( $value, 'is_numeric' );
-                               } else {
-                                       $lookup = CentralIdLookup::factory();
-                                       $ids = $lookup->centralIdsFromNames( explode( "\n", $value ), $this );
-                               }
-                               $this->mOptions['email-blacklist'] = $ids;
-                               $saveOptions['email-blacklist'] = implode( "\n", $this->mOptions['email-blacklist'] );
-                       } else {
-                               // If the blacklist is empty, set it to null rather than an empty string.
-                               $this->mOptions['email-blacklist'] = null;
-                       }
-               }
-
                // Allow hooks to abort, for instance to save to a global profile.
                // Reset options to default state before saving.
                if ( !Hooks::run( 'UserSaveOptions', [ $this, &$saveOptions ] ) ) {
index e40ae29..2302177 100644 (file)
@@ -100,6 +100,10 @@ class SearchFormWidget {
 
                $html .= $layout;
 
+               if ( $this->specialSearch->getPrefix() !== '' ) {
+                       $html .= Html::hidden( 'prefix', $this->specialSearch->getPrefix() );
+               }
+
                if ( $totalResults > 0 && $offset < $totalResults ) {
                        $html .= Xml::tags(
                                'div',
index c6e0c38..744400a 100644 (file)
        "markedaspatrollederrornotify": "Merk as gekontroleerd het misluk.",
        "patrol-log-page": "Kontroleringslogboek",
        "patrol-log-header": "Die logboek wys weergawes wat as gekontroleer gemerk is.",
-       "log-show-hide-patrol": "Nasienlogboek $1",
        "confirm-markpatrolled-button": "OK",
        "deletedrevision": "Ou weergawe $1 geskrap",
        "filedeleteerror-short": "Fout met verwydering van lêer: $1",
index be9ce98..b00e768 100644 (file)
        "markedaspatrollederrornotify": "silusi tayza-mikibi mungangaw.",
        "patrol-log-page": "tayza mikibi nasulitan nazipa’an",
        "patrol-log-header": "uyniyan sa u tayza-mikibi masumaday baziyong a nasulitan-nazipa’an.",
-       "log-show-hide-patrol": "$1 tayza mikibi nasulitan nazipa’an",
-       "log-show-hide-tag": "$1 tazihan-paya nasulitan nazipa’an",
        "confirm-markpatrolled-button": "malucekay",
        "confirm-markpatrolled-top": "silusi $2 a sumad $3 ku tayza-mikibi?",
        "deletedrevision": "masipu malumanay misumad nu ayaway $1",
index b174021..0612ee9 100644 (file)
        "markedaspatrollederrortext": "የተመለከተ ሆኖ ለማሳለፍ አንድን ዕትም መወሰን አለብዎት።",
        "markedaspatrollederror-noautopatrol": "የራስዎን ለውጥ የተመለከተ ሆኖ ለማሳለፍ አይችሉም።",
        "patrol-log-page": "የማሳለፊያ መዝገብ",
-       "log-show-hide-patrol": "ማሳለፊያ መዝገቦች",
        "deletedrevision": "የቆየው ዕትም $1 አጠፋ",
        "filedeleteerror-short": "የፋይል ማጥፋት ስኅተት፦ $1",
        "filedeleteerror-long": "ፋይሉን በማጥፋት ስህተቶች ተነስተዋል፦\n\n$1",
index 0c3da7e..6e2147d 100644 (file)
        "markedaspatrollederror-noautopatrol": "No tiene premisos ta sinyalar os suyos propios cambios como controlatos.",
        "patrol-log-page": "Rechistro de control de revisions",
        "patrol-log-header": "Iste ye un rechistro de revisions patrullatas.",
-       "log-show-hide-patrol": "$1 o rechistro de patrullache",
        "deletedrevision": "S'ha borrato a versión antiga $1",
        "filedeleteerror-short": "Error borrando o fichero: $1",
        "filedeleteerror-long": "Se troboron errors borrando o fichero:\n\n$1",
index 8d12ba0..b08c8f0 100644 (file)
        "markedaspatrollederrornotify": "لم ينجح وسم هذه النسخة بأنها مراجعة",
        "patrol-log-page": "سجل الخفر",
        "patrol-log-header": "هذا سجل بالمراجعات المراجعة.",
-       "log-show-hide-patrol": "$1 سجل الخفر",
-       "log-show-hide-tag": "$1 سجل الوسوم",
        "confirm-markpatrolled-button": "موافق",
        "confirm-markpatrolled-top": "علم على المراجعة $3 من $2 كمراجعة؟",
        "deletedrevision": "حذف المراجعة القديمة $1",
index 5e2e307..9c910c2 100644 (file)
        "markedaspatrollednotify": "ܫܘܚܠܦܐ ܗܢܐ ܥܠ $1 ܐܫܬܘܕܥ ܐܝܟ ܟܪܝܟܐ.",
        "markedaspatrollederrornotify": "ܠܐ ܐܬܢܨܚ ܫܘܘܕܥܐ ܐܝܟ ܟܪܝܟܬܐ",
        "patrol-log-page": "ܣܓܠܐ ܕܟܪܟܐ",
-       "log-show-hide-patrol": "$1 ܣܓܠܐ ܕܟܪܟܐ",
        "filedeleteerror-short": "ܦܘܕܐ ܒܫܝܦܐ ܕܠܦܦܐ: $1",
        "filedeleteerror-long": "ܦܘܕ̈ܐ ܐܫܟܚܬ ܟܕ ܫܝܦܐ ܠܦܦܐ:\n\n$1",
        "previousdiff": "← ܫܘܚܠܦܐ ܕܩܕܡ",
index fb7eec7..135dca5 100644 (file)
        "pageinfo-authors": "ĝadad l-mo'llifin l-mĥṫalfin",
        "pageinfo-toolboxlink": "معلومات على الصفحة",
        "markaspatrolleddiff": "marki kamorajaaa",
-       "log-show-hide-patrol": "$1 sijjil lkhafr",
        "previousdiff": "Ṫ-Ṫeĝdil li mbeĝd",
        "nextdiff": "Ṫ-Ṫeĝdila li mbeĝd",
        "thumbsize": "ḫajm l-miniatur:",
index 9152090..b1f5f84 100644 (file)
        "markedaspatrollederror-noautopatrol": "مش مسموح ليك تعلم على تغييراتك الشخصية كأنها متراجعة.",
        "patrol-log-page": "سجل المراجعة",
        "patrol-log-header": "دا سجل بالنسخ المتراجعة",
-       "log-show-hide-patrol": "$1 سجل المراجعة",
        "deletedrevision": "مسح النسخة القديمة $1",
        "filedeleteerror-short": "غلط مسح الملف: $1",
        "filedeleteerror-long": "حصلت غلطات و الملف دا بيتمسح :\n\n$1",
index 7158a62..fead6f8 100644 (file)
        "markedaspatrollederrornotify": "নিৰীক্ষণবিহীন ৰূপে চিহ্নিত কৰা হ’ল",
        "patrol-log-page": "নিৰীক্ষণ অভিলেখ",
        "patrol-log-header": "এইখন নিৰীক্ষিত সংশোধনসমূহৰ অভিলেখ ।",
-       "log-show-hide-patrol": "নিৰীক্ষণ অভিলেখ $1",
        "deletedrevision": "পুৰণি সংশোধনী $1 বিলোপ কৰা হ’ল",
        "filedeleteerror-short": "নথি বিলোপ কৰাত ত্ৰুটি: $1",
        "filedeleteerror-long": "এই নথিখন বিলোপ কৰাত সমস্যা হৈছে :\n\n$1",
index 1017e86..382ce27 100644 (file)
        "tooltip-summary": "M535x523S14c50508x492S14c58469x492S22520503x477S22520465x477 M529x528S11541487x496S11549471x501S20e00503x488S26507516x473 M554x523S14c40530x476S14c48446x492S26502515x489S26516468x507S20340495x489S20348487x506",
        "patrol-log-page": "M518x560S2035a492x545S10e50501x522S31500482x483 M518x536S15a37483x465S18550493x476S15a37483x509S15a51486x513",
        "patrol-log-header": "M508x525S10004493x475S22a04494x510 M518x560S2035a492x545S10e50501x522S31500482x483 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M518x536S15a37483x465S18550493x476S15a37483x509S15a51486x513",
-       "log-show-hide-tag": "$1 M519x514S15a28482x487S11502489x498 M518x536S15a37483x465S18550493x476S15a37483x509S15a51486x513",
        "filedeleteerror-short": "M527x532S1ea40473x511S1f540512x478S22a07497x504S2f700512x468 M520x523S14c19480x496S15a01497x497S20710483x477 M518x526S2ff00482x483S19a00487x506 S38700463x496 $1",
        "ilsubmit": "M546x525S2ff00482x483S16d10492x505S2e502519x502",
        "metadata": "M520x523S14c19480x496S15a01497x497S20710483x477 M538x522S18517516x486S1851f461x495S2ff00482x483S14c00513x436S14c08461x445S26a00511x469S26a10459x478",
index 8f248ce..d49e1c5 100644 (file)
        "databaseerror-function": "Función: $1",
        "databaseerror-error": "Error: $1",
        "transaction-duration-limit-exceeded": "Para evitar crear un gran atrasu na replicación, esta transaición albortóse porque la duración de la escritura ($1) pasó la llende de $2 {{PLURAL:$2|segundu|segundos}}.\nSi tas cambiando munchos oxetos al mesmu tiempu, intenta meyor facer operaciones múltiples más pequeñes.",
-       "laggedslavemode": "'''Avisu:''' Esta páxina pue que nun tenga actualizaciones recientes.",
+       "laggedslavemode": "<strong>Avisu:</strong> Escurque esta páxina nun tenga anovamientos de recién.",
        "readonly": "Base de datos candada",
        "enterlockreason": "Introduz un motivu pal candáu, amestando una estimación de cuándo va tener llugar el descandáu",
        "readonlytext": "Nestos momentos la base de datos ta candada pa nueves entraes y otros cambios, seique por un mantenimientu de rutina, y n'acabando too volverá a la normalidá.\n\nL'alministrador del sistema que la candó conseñó esti motivu: $1",
        "filenotfound": "Nun pudo atopase'l ficheru «$1».",
        "unexpected": "Valor inesperáu: «$1»=«$2».",
        "formerror": "Fallu: Nun se pudo unviar el formulariu.",
-       "badarticleerror": "Esta aición nun pue facese nesta páxina.",
+       "badarticleerror": "Esta aición nun puede facese nesta páxina.",
        "cannotdelete": "Nun pudo desaniciase la páxina o'l ficheru «$1».\nSeique daquién yá lo desaniciara.",
-       "cannotdelete-title": "Nun se pue desaniciar la páxina «$1»",
+       "cannotdelete-title": "La páxina «$1» nun puede desaniciase",
        "delete-hook-aborted": "Desaniciu albortáu pol enganche.\nNun conseñó esplicación.",
        "no-null-revision": "Nun pudo crease una nueva revisión nula pa la páxina «$1»",
        "badtitle": "Títulu incorreutu",
-       "badtitletext": "El títulu de páxina solicitáu nun ye válidu, ta baleru o tien enllaces interllingua o interwiki incorreutos.\nPue contener un caráuter o más que nun puen usase nos títulos.",
+       "badtitletext": "El títulu de páxina solicitáu nun ye válidu, ta vacíu o tien enllaces interllingua o interwiki incorreutos.\nPuede contener un caráuter o más que nun pueden usase nos títulos.",
        "title-invalid-empty": "El títulu de páxina solicitáu ta baleru o sólo contien el nome d'un espaciu de nomes.",
        "title-invalid-utf8": "El títulu de páxina solicitáu contien una secuencia UTF-8 inválida.",
        "title-invalid-interwiki": "El títulu de páxina solicitáu contien un enllaz interwiki que nun puede usase nos títulos.",
        "viewsource": "Ver fonte",
        "viewsource-title": "Ver la fonte de $1",
        "actionthrottled": "Aición llendada",
-       "actionthrottledtext": "Como midida escontra abusos, nun se pué repetir esta aición munches vegaes en pocu tiempu, y trespasasti esa llende.\nVuelve a intentalo n'unos minutos.",
+       "actionthrottledtext": "Como midida escontra abusos, nun puedes repetir esta aición munches vegaes en pocu tiempu, y trespasasti esa llende.\nVuelve a tentalo en dellos minutos.",
        "protectedpagetext": "Esta páxina ta candada pa torgar ediciones y otres aiciones.",
        "viewsourcetext": "Pues ver y copiar la fonte d'esta páxina.",
        "viewyourtext": "Pues ver y copiar la fonte de <strong>les tos ediciones</strong> d'esta páxina.",
        "blockednoreason": "nun se dio nengún motivu",
        "whitelistedittext": "Tienes d'$1 pa editar páxines.",
        "confirmedittext": "Tienes de confirmar la direición de corréu electrónicu enantes d'editar páxines.\nPor favor, configura y valida la direición de corréu nes [[Special:Preferences|preferencies d'usuariu]].",
-       "nosuchsectiontitle": "Nun pue atopase la seición",
+       "nosuchsectiontitle": "Nun s'alcontró la seición",
        "nosuchsectiontext": "Intentasti editar una seición que nun esiste.\nSeique se treslladara o desaniciara mientres víes la páxina.",
        "loginreqtitle": "Ye necesario aniciar sesión",
        "loginreqlink": "aniciar sesión",
        "newarticletext": "Siguisti un enllaz a un artículu qu'inda nun esiste.\nPa crear la páxina, empecipia a escribir nel cuadru d'embaxo (mira la [$1 páxina d'ayuda] pa más información).\nSi llegasti equí por enquivocu, calca nel botón <strong>atrás</strong> del to restolador.",
        "anontalkpagetext": "----\n''Esta ye la páxina d'alderique pa un usuariu anónimu qu'inda nun creó una cuenta o que nun la usa.''\nPola mor d'ello ha usase la direición numbérica IP pa identificalu/la.\nTala IP pue compartise por varios usuarios.\nSi yes un usuariu anónimu y notes qu'hai comentarios irrelevantes empobinaos pa ti, por favor [[Special:CreateAccount|crea una cuenta]] o [[Special:UserLogin|anicia sesiín]] pa torgar futures confusiones con otros usuarios anónimos.",
        "noarticletext": "Nestos momentos nun hai testu nesta páxina.\nPuedes [[Special:Search/{{PAGENAME}}|buscar esti títulu de páxina]] n'otres páxines,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar los rexistros rellacionaos],\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} crear esta páxina]</span>.",
-       "noarticletext-nopermission": "Nestos momentos nun hai testu nesta páxina.\nPue [[Special:Search/{{PAGENAME}}|buscar esti títulu de páxina]] n'otres páxines o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar los rexistros rellacionaos]</span>, pero nun tiene permisu pa crear esta páxina.",
+       "noarticletext-nopermission": "Nestos momentos nun hai testu nesta páxina.\nPuedes [[Special:Search/{{PAGENAME}}|buscar esti títulu de páxina]] n'otres páxines o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar los rexistros rellacionaos]</span>, pero nun tienes permisu pa crear esta páxina.",
        "missing-revision": "La revisión #$1 de la páxina llamada \"{{FULLPAGENAME}}\" nun esiste.\n\nDe vezu la causa d'esto ye siguir un enllaz antiguu del historial a una páxina que se desanició.\nSe puen alcontrar más detalles nel [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rexistru de desanicios].",
        "userpage-userdoesnotexist": "La cuenta d'usuariu «$1» nun ta rexistrada.\nPor favor comprueba si quies crear/editar esta páxina.",
        "userpage-userdoesnotexist-view": "La cuenta d'usuariu «$1» nun ta rexistrada.",
        "yourdiff": "Diferencies",
        "copyrightwarning": "Por favor, ten en cuenta que toles collaboraciones de {{SITENAME}} considérense espublizaes baxo la $2 (ver $1 pa más detalles). Si nun quies que'l to trabayu s'edite ensin midida y se distribuya al debalu, nun lu pongas equí.<br />\nAmás tas prometiéndonos qu'escribisti esto tu mesmu, o que lo copiasti d'una fonte llibre, de dominiu públicu o asemeyada.\n<strong>¡Nun unvies obres con drechos d'autor ensin permisu!</strong>",
        "copyrightwarning2": "Por favor, ten en cuenta que toles contribuciones de {{SITENAME}} se puen editar, alterar o desaniciar por otros usuarios. Si nun quies que'l to trabayu s'edite ensin midida, nun lu pongas equí.<br />\nAmás tas dexándonos afitao qu'escribisti esto tu mesmu, o que lo copiasti d'una fonte llibre de dominiu públicu o asemeyao (ver $1 pa más detalles).\n'''¡Nun pongas trabayos con drechos d'autor ensin permisu!'''",
-       "editpage-cannot-use-custom-model": "El modelu de conteníu d'esta páxina nun pue cambiase.",
+       "editpage-cannot-use-custom-model": "El modelu de conteníu d'esta páxina nun puede cambiase.",
        "longpageerror": "'''ERROR: El testu qu'unviasti tien {{PLURAL:$1|un quilobyte|$1 quilobytes}}, que pasa del máximu de {{PLURAL:$2|un quilobyte|$2 quilobytes}}.'''\nNun se pue grabar.",
        "readonlywarning": "<strong>Avisu: La base de datos ta candada por mantenimientu, polo que nun vas poder guardar les tos ediciones nestos momentos.</strong>\nSeique habríes copiar y apegar el testu nun ficheru de testu y guardalu pa intentalo sero.\n\nL'alministrador del sistema que la candó dio esta esplicación: $1",
        "protectedpagewarning": "'''Avisu: Esta páxina ta candada pa que sólo los alministradores puean editala.'''\nLa cabera entrada del rexistru s'ufre darréu pa referencia:",
        "moveddeleted-notice-recent": "Esta páxina desanicióse apocayá (dientro de les postreres 24 hores).\nEl rexistru de desanicios, proteiciones y tresllaos de la páxina amuésense de siguío como referencia.",
        "log-fulllog": "Ver el rexistru ensembre",
        "edit-hook-aborted": "Edición albortada pol enganche.\nNun dio esplicación.",
-       "edit-gone-missing": "Nun se pudo actualizar la páxina.\nPaez que se desanició.",
+       "edit-gone-missing": "Nun pudo actualizase la páxina.\nPaez que se desanició.",
        "edit-conflict": "Conflictu d'edición.",
        "edit-no-change": "S'inoró la to edición, porque nun se fizo nengún cambéu nel testu.",
        "postedit-confirmation-created": "Creóse la páxina.",
        "converter-manual-rule-error": "Detectóse un error na regla de conversión manual de llingua",
        "undo-success": "La edición se pue esfacer.\nPor favor comprueba la comparanza d'abaxo pa confirmar que ye eso lo que quies facer, y depués guarda los cambios p'acabar d'esfacer la edición.",
        "undo-failure": "Nun pudo esfacese la edición por aciu d'ediciones intermedies conflictives.",
-       "undo-norev": "Nun se pudo esfacer la edición porque nun esiste o se desanició.",
+       "undo-norev": "Nun pudo desfacese la edición porque nun esiste o se desanició.",
        "undo-nochange": "Paez que la edición yá ta desfecha.",
        "undo-summary": "Esfacer la revisión $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|alderique]])",
        "undo-summary-username-hidden": "Desfacer la revisión $1 d'un usuariu tapecíu",
        "mergehistory-merge": "Les siguientes revisiones de [[:$1]] puen fusionase'n [[:$2]]. Usa la columna de botones d'opción pa fusionar namai les revisiones creaes na y enantes de la hora especificada.\nHas fixate en que si uses los enllaces de navegación esborraránse les seleiciones feches nesta columna.",
        "mergehistory-go": "Amosar ediciones fusionables",
        "mergehistory-submit": "Fusionar revisiones",
-       "mergehistory-empty": "Nun se pue fusionar nenguna revisión.",
+       "mergehistory-empty": "Nun puede fusionase nenguna revisión.",
        "mergehistory-done": "$3 {{PLURAL:$3|revisión|revisiones}} de $1 {{PLURAL:$3|fusionóse|fusionáronse}} en [[:$2]].",
        "mergehistory-fail": "Nun pudo facese la fusión d'historiales, por favor comprueba los parámetros de páxina y hora.",
        "mergehistory-fail-bad-timestamp": "La marca de tiempu ye inválida.",
        "powersearch-togglenone": "Dengún",
        "powersearch-remember": "Recordar la seleición pa guetes futures",
        "search-external": "Busca esterna",
-       "searchdisabled": "La busca en {{SITENAME}} ta desactivada. Mentanto, pues buscar en Google.\nHas fixate en que'l conteníu de los sos índices de {{SITENAME}} pué tar desfasáu.",
+       "searchdisabled": "La busca en {{SITENAME}} ta desactivada. Mentanto, puedes buscar en Google.\nRepara en que'l conteníu de los sos índices de {{SITENAME}} puede tar desfasáu.",
        "search-error": "Hebo un error al buscar: $1",
        "search-warning": "Hebo un avisu al buscar: $1",
        "preferences": "Preferencies",
        "badfilename": "El nome del ficheru cambióse a «$1».",
        "filetype-mime-mismatch": "La estensión de ficheru \".$1\" nun casa cola triba MIME detectada del ficheru ($2).",
        "filetype-badmime": "Los ficheros de la triba MIME \"$1\" nun tienen permitida la xubida.",
-       "filetype-bad-ie-mime": "Nun se pue xubir esti ficheru porque Internet Explorer detectalu como \"$1\", que nun ta permitíu y pue ser una triba de ficheru peligrosa.",
+       "filetype-bad-ie-mime": "Nun puede xubise esti ficheru porque Internet Explorer detectaríalu como «$1», que ye una triba de ficheru que nun ta permitida y ye posiblemente peligrosa.",
        "filetype-unwanted-type": "'''\".$1\"''' ye una triba de ficheru non recomendáu.\n{{PLURAL:$3|La triba de ficheru preferida ye|Les tribes de ficheru preferíes son}} $2.",
        "filetype-banned-type": "'''\".$1\"''' {{PLURAL:$4|nun ye una triba de ficheru permitida|nun son tribes de ficheru permitíes}}.\n{{PLURAL:$3|La triba de ficheru permitida ye|Les tribes de ficheru permitíes son}} $2.",
        "filetype-missing": "El ficheru nun tien estensión (como \".jpg\").",
        "upload-form-label-not-own-work-local-generic-local": "Quiciabes tamién quieras tentar [[Special:Upload|la páxina de cargues predeterminada]].",
        "upload-form-label-own-work-message-generic-foreign": "Entiendo que toi xubiendo esti ficheru a un depósitu compartíu. Confirmo que toi faciéndolo cumpliendo les condiciones de serviciu y les polítiques de llicencies d'esi sitiu.",
        "upload-form-label-not-own-work-message-generic-foreign": "Si nun puedes xubir esti ficheru baxo les polítiques del depósitu compartíu, zarra esti diálogu y tenta otru métodu.",
-       "upload-form-label-not-own-work-local-generic-foreign": "Tamién pué interesate usar [[Special:Upload|la páxina de carga de {{SITENAME}}]] si esti ficheru pué xubise allí baxo les sos polítiques.",
+       "upload-form-label-not-own-work-local-generic-foreign": "Tamién puedes tentar usar [[Special:Upload|la páxina de carga de {{SITENAME}}]], si esti ficheru puede xubise allí baxo les sos polítiques.",
        "backend-fail-stream": "Nun se pudo tresmitir el ficheru $1.",
        "backend-fail-backup": "Nun se pudo facer copia de seguridá del ficheru $1.",
        "backend-fail-notexists": "El ficheru $1 nun esiste.",
        "filedelete-reason-dropdown": "*Motivos habituales pal desaniciu\n** Frayamientu de Copyright\n** Ficheru duplicáu",
        "filedelete-edit-reasonlist": "Editar los motivos del desaniciu",
        "filedelete-maintenance": "El desaniciu y restauración de ficheros ta desactivao temporalmente mientres ta en mantenimientu.",
-       "filedelete-maintenance-title": "Nun se pue desaniciar el ficheru",
+       "filedelete-maintenance-title": "Nun puede desaniciase'l ficheru",
        "mimesearch": "Busca MIME",
        "mimesearch-summary": "Esta páxina permite filtriar los ficheros pol so tipu MIME.\nEntrada: contenttype/subtype o contenttype/*, p.ex. <code>image/jpeg</code>.",
        "mimetype": "Triba MIME:",
        "listgrouprights-namespaceprotection-namespace": "Espaciu de nomes",
        "listgrouprights-namespaceprotection-restrictedto": "Permisu(os) d'edición del usuariu",
        "listgrants": "Permisos",
-       "listgrants-summary": "Esta ye la llista d'autorizaciones colos accesos asociaos a los permisos de usuario. los usuarios puen autorizar a les aplicaciones qu'usen la so cuenta, pero con permisos llendaos basándose nos permisos que'l usuariu diera a l'aplicación. Sicasí, una aplicación qu'actua nel nome d'un usuariu nun pué usar realmente permisos que nun tenga'l propiu usuariu.\nPué haber [[{{MediaWiki:Listgrouprights-helppage}}|más información]] tocante a los permisos individuales.",
+       "listgrants-summary": "Esta ye la llista d'autorizaciones colos accesos asociaos a los permisos d'usuariu. Los usuarios pueden autorizar que les aplicaciones usen la so cuenta, pero con permisos llendaos basándose nos permisos que'l usuariu diera a l'aplicación. Sicasí, una aplicación qu'actua nel nome d'un usuariu nun puede usar realmente permisos que nun tenga'l propiu usuariu.\nPuede haber [[{{MediaWiki:Listgrouprights-helppage}}|más información]] tocante a los permisos individuales.",
        "listgrants-grant": "Permisu",
        "listgrants-rights": "Permisos",
        "trackingcategories": "Categoríes de siguimientu",
        "changecontentmodel-cannot-convert": "El conteníu de [[:$1]] nun puede convertise a un tipu de $2.",
        "changecontentmodel-nodirectediting": "El modelu de conteníu $1 nun tien encontu pa edición direuta",
        "changecontentmodel-emptymodels-title": "Nun hai modelos de conteníu disponibles",
-       "changecontentmodel-emptymodels-text": "El conteníu de [[:$1]] nun pue convertise a nengún tipu.",
+       "changecontentmodel-emptymodels-text": "El conteníu de [[:$1]] nun puede convertise a nengún tipu.",
        "log-name-contentmodel": "Rexistru de cambios del modelu de conteníu",
        "log-description-contentmodel": "Esta páxina recueye los cambeos nel modelu de conteníu de les páxines, y les páxines creaes con un modelu de conteníu distintu del predetermináu.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|creó}} la páxina $3 usando un modelu de conteníu non predetermináu «$5»",
        "prot_1movedto2": "[[$1]] treslladáu a [[$2]]",
        "protect-badnamespace-title": "Espaciu de nomes non protexible",
        "protect-badnamespace-text": "Les páxines d'esti espaciu de nomes nun se puen protexer.",
-       "protect-norestrictiontypes-text": "Esta páxina nun se pue protexer porque nun ta disponible dengún tipu de torga.",
+       "protect-norestrictiontypes-text": "Esta páxina nun puede protexese porque nun ta disponible nengún tipu de torga.",
        "protect-norestrictiontypes-title": "Páxina non protexible",
        "protect-legend": "Confirmar proteición",
        "protectcomment": "Motivu:",
        "tooltip-ca-nstab-main": "Ver la páxina de conteníu",
        "tooltip-ca-nstab-user": "Ver la páxina d'usuariu",
        "tooltip-ca-nstab-media": "Ver la páxina de multimedia",
-       "tooltip-ca-nstab-special": "Esta ye una páxina especial y nun pué editase",
+       "tooltip-ca-nstab-special": "Esta ye una páxina especial que nun puede editase",
        "tooltip-ca-nstab-project": "Vera la páxina de proyeutu",
        "tooltip-ca-nstab-image": "Ver la páxina del ficheru",
        "tooltip-ca-nstab-mediawiki": "Ver el mensaxe del sistema",
        "markedaspatrollederrornotify": "Falló l'aición de marcar como revisáu.",
        "patrol-log-page": "Rexistru de supervisión",
        "patrol-log-header": "Esti ye un rexistru de les revisiones supervisaes.",
-       "log-show-hide-patrol": "$1 rexistru de supervisión",
-       "log-show-hide-tag": "$1 rexistru d'etiquetes",
        "confirm-markpatrolled-button": "Aceutar",
        "confirm-markpatrolled-top": "¿Marcar la revisión $3 de $2 como patrullada?",
        "deletedrevision": "Desaniciada la revisión antigua $1",
        "permanentlink-submit": "Dir a la revisión",
        "dberr-problems": "¡Sentímoslo! Esti sitiu ta esperimentando dificultaes téuniques.",
        "dberr-again": "Tenta esperar dellos minutos y recargar.",
-       "dberr-info": "(Nun se pue entrar na base de datos: $1)",
-       "dberr-info-hidden": "(Nun se pue entrar na base de datos)",
+       "dberr-info": "(Nun hai accesu a la base de datos: $1)",
+       "dberr-info-hidden": "(Nun hai accesu a la base de datos)",
        "dberr-usegoogle": "Pue probar a buscar con Google mentanto.",
        "dberr-outofdate": "Atalanta que los sos índices del nuesu conteníu seique nun tean actualizaos.",
        "dberr-cachederror": "Esta ye una copia na caché de la páxina que se pidiera, y pue que nun tea actualizada.",
index 48d79d2..dde8033 100644 (file)
        "markedaspatrollederrornotify": "जाँचा हुआ चिन्हित करना असफल रहा।",
        "patrol-log-page": "परीक्षण लॉग",
        "patrol-log-header": "यह परीक्षित अवतरणों की लॉग है।",
-       "log-show-hide-patrol": "परीक्षण लॉग $1",
-       "log-show-hide-tag": "$1 चिप्पी लग",
        "deletedrevision": "पुरान अवतरण $1 हटाय दिहा गा है",
        "filedeleteerror-short": "फ़ाईल हटावै मा समस्या: $1",
        "filedeleteerror-long": "फ़ाइल हटावै में आवा गल्ती:\n\n$1",
index 6cef2fb..f567f5d 100644 (file)
        "markedaspatrollednotify": "\"$1\" səhifəsindəki bu redaktə patrullanmış kimi işarələndi.",
        "patrol-log-page": "Patrul gündəliyi",
        "patrol-log-header": "Bu yoxlanmış dəyişikliklərin gündəliyidir.",
-       "log-show-hide-patrol": "$1 patrul gündəliyi",
        "deletedrevision": "Köhnə versiyaları silindi $1.",
        "filedeleteerror-short": "Fayl silinərkən xəta: $1",
        "filedeleteerror-long": "Fayl silinərkən üzə çıxan xətalar:\n\n$1",
index d3aeeb5..f3b60a1 100644 (file)
        "markedaspatrollederrornotify": "دولانماق برچسبی مووفقیت سیز اولدو",
        "patrol-log-page": "دولانما ژورنالی",
        "patrol-log-header": "بو یوخلانمیش دییشیک‌لیک‌لرین ژورنالی‌دیر.",
-       "log-show-hide-patrol": "$1 دولانما ژورنالی",
-       "log-show-hide-tag": "اِتیکت ژورنالی $1",
        "deletedrevision": "کؤهنه نوسخه لری سیلیندی $1.",
        "filedeleteerror-short": "فایل سیلینرکن ختا: $1",
        "filedeleteerror-long": "فایل سیلینرکن اوزه چیخان ختا‌لار:\n\n$1",
index 8a24243..79b9215 100644 (file)
        "markedaspatrollederrornotify": "Патрулләнгән тип билдәләү уңышһыҙ тамамланды.",
        "patrol-log-page": "Тикшереү яҙмалары журналы",
        "patrol-log-header": "Был — тикшерелгән өлгөләр яҙмалары журналы.",
-       "log-show-hide-patrol": "тикшереү яҙмалары журналын $1",
-       "log-show-hide-tag": "$1 билдәләр журналы",
        "confirm-markpatrolled-button": "Яҡшы",
        "confirm-markpatrolled-top": "$2 битенең $3 версияһын тикшерелгән тип һанарғамы?",
        "deletedrevision": "Иҫке $1 өлгөһө юйылды",
index bd8bac4..e0e4805 100644 (file)
        "markedaspatrollederror-noautopatrol": "شما را اجازت نیست وتی تغییراتء په عنوان نظارت بیتگین نشان کنیت.",
        "patrol-log-page": "آمار نظارت",
        "patrol-log-header": "شی آماری چه بازبینی آن گشتی انت.",
-       "log-show-hide-patrol": "$1  آمار گشت",
        "deletedrevision": "قدیمی بازبینی $1 حذف بوت",
        "filedeleteerror-short": "حطا حذف فایل: $1",
        "filedeleteerror-long": "حطای پیش آتک وهدی که فایل حذف بیگت:\n\n$1",
index ca68364..2913aa2 100644 (file)
        "markedaspatrollederrornotify": "Pagmamarka bilang patrolyado na nagpalya.",
        "patrol-log-page": "Laóg kan Pigpapatrolya",
        "patrol-log-header": "Ini an sarong talaan kan patrolyadong mga rebisyon.",
-       "log-show-hide-patrol": "$1 talaan sa patrolya",
        "deletedrevision": "Pigparâ an lumang pagribay na $1.",
        "filedeleteerror-short": "Salâ sa pagparà kan dokumento: $1",
        "filedeleteerror-long": "May mga nasabat na salâ mientras na pigpaparâ an ''file'':\n\n$1",
index 1ea49e4..7adacba 100644 (file)
        "diff-paragraph-moved-toold": "Параграф быў перанесены. Націсьніце, каб перайсьці ў першапачатковае месца.",
        "difference-missing-revision": "{{PLURAL:$2|$2 вэрсія|$2 вэрсіі|$2 вэрсіяў}} з гэтымі адрозьненьнямі ($1) {{PLURAL:$2|не была|не былі}} знойдзеныя.\n\nЗвычайна гэта здараецца з-за пераходу па састарэлай спасылцы на старонку, якая была выдаленая.\nПадрабязнасьці можна знайсьці ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].",
        "searchresults": "Вынікі пошуку",
+       "search-filter-title-prefix": "Шукаем толькі на старонках, назвы якіх пачынаюцца з «$1»",
        "searchresults-title": "Вынікі пошуку для «$1»",
        "titlematches": "Супадзеньні ў назвах старонак",
        "textmatches": "Супадзеньні ў тэкстах старонак",
        "uploadscriptednamespace": "Гэты SVG-файл утрымлівае недапушчальную прастору назваў «<nowiki>$1</nowiki>».",
        "uploadinvalidxml": "Не атрымалася прааналізаваць XML у загружаным файле.",
        "uploadvirus": "Файл утрымлівае вірус! Падрабязнасьці: $1",
-       "uploadjava": "Файл зьяўляецца ZIP-архівам, які зьмяшчае .class-файл Java.\nЗагрузка Java-файлаў забароненая ў мэтах бясьпекі.",
+       "uploadjava": "Файл зьяўляецца ZIP-архівам, які зьмяшчае .class-файл Java.\nЗагрузка Java-файлаў забароненая, бо яны могуць быць прычынай абыходу абмежаваньняў бясьпекі.",
        "upload-source": "Крынічны файл",
-       "sourcefilename": "Пачатковая назва файла:",
+       "sourcefilename": "Пачатковая назва файлу:",
        "sourceurl": "URL-адрас крыніцы:",
        "destfilename": "Канчатковая назва файла:",
        "upload-maxfilesize": "Максымальны памер файла: $1",
        "speciallogtitlelabel": "Мэта (назва ці {{ns:user}}:імя_ўдзельніка для ўдзельніка):",
        "log": "Журналы падзеяў",
        "logeventslist-submit": "Паказаць",
-       "logeventslist-more-filters": "Ð\91олей Ñ\84Ñ\96лÑ\8cÑ\82Ñ\80аÑ\9e:",
+       "logeventslist-more-filters": "Ð\9fаказаÑ\86Ñ\8c Ð´Ð°Ð´Ð°Ñ\82ковÑ\8bÑ\8f Ð¶Ñ\83Ñ\80налÑ\8b:",
        "logeventslist-patrol-log": "Журнал патруляваньня",
        "logeventslist-tag-log": "Журнал метак",
        "all-logs-page": "Усе публічныя журналы падзеяў",
        "uctop": "(апошняя)",
        "month": "Ад месяца (і раней):",
        "year": "Ад году (і раней):",
+       "date": "З даты (і раней):",
        "sp-contributions-newbies": "Паказаць унёсак толькі з новых рахункаў",
        "sp-contributions-newbies-sub": "Унёсак пачынаючых",
        "sp-contributions-newbies-title": "Унёсак удзельнікаў з новых рахункаў",
        "markedaspatrollederrornotify": "Не атрымалася адпатруляваць старонку.",
        "patrol-log-page": "Журнал патруляваньняў",
        "patrol-log-header": "Гэта журнал патруляваных вэрсіяў.",
-       "log-show-hide-patrol": "$1 журнал патруляваньняў",
-       "log-show-hide-tag": "$1 журнал метак",
        "confirm-markpatrolled-button": "Добра",
        "confirm-markpatrolled-top": "Пазначыць вэрсію $3 старонкі $2 як патруляваную?",
        "deletedrevision": "Выдаленая старая вэрсія $1",
index 2277444..3d04e0e 100644 (file)
        "markedaspatrollederrornotify": "Не ўдалося пазначыць як ухваленую.",
        "patrol-log-page": "Журнал ухваленых",
        "patrol-log-header": "Журнал ухваленых версій",
-       "log-show-hide-patrol": "$1 журнал ухваленняў",
-       "log-show-hide-tag": "$1 журнал бірак",
        "confirm-markpatrolled-button": "Добра",
        "confirm-markpatrolled-top": "Пазначыць версію $3 старонкі $2 як патруляваную?",
        "deletedrevision": "Сцёрта старая версія $1",
index 480f28c..c93390d 100644 (file)
        "markedaspatrollederrornotify": "Неуспешно отбелязване на редакция като патрулирана.",
        "patrol-log-page": "Дневник на патрула",
        "patrol-log-header": "Тази страница съдържа дневник на проверените версии.",
-       "log-show-hide-patrol": "$1 на дневника на патрула",
-       "log-show-hide-tag": "$1 на дневника на отбелязванията",
        "confirm-markpatrolled-button": "Добре",
        "confirm-markpatrolled-top": "Маркиране на редакция $3 на $2 като патрулирана?",
        "deletedrevision": "Изтрита стара версия $1",
index b9500ab..4d9537c 100644 (file)
        "markedaspatrollederrornotify": "گشت وارته ئی برچسپ جتین ناکام ات.",
        "patrol-log-page": "گشتئ سیاه چال",
        "patrol-log-header": "ای سیاهه شه گشت وارته ئین ایڈیٹ ئان است.",
-       "log-show-hide-patrol": "$1 گشت جنوکین سیاهه",
-       "log-show-hide-tag": "$1 خالیجای ٹاپه",
        "deletedrevision": "$1 قدیمی پاک بوته ئین نخسه ئی است",
        "filedeleteerror-short": "خطا بئ فایلی پاک کورتین: $1",
        "filedeleteerror-long": "بی پدا  پاک کورتین ئی وختا خطا رخ دات:\n\n$1",
index f6da61e..d677a0b 100644 (file)
        "markedaspatrollederrornotify": "Manandai sabagai paitihan nang gagal.",
        "patrol-log-page": "Log pa-awasan",
        "patrol-log-header": "Ngini adalah sabuah log matan raralatan nang ta-awasi.",
-       "log-show-hide-patrol": "$1 log pa-awasan",
        "deletedrevision": "Raralatan lawas tahapus: $1",
        "filedeleteerror-short": "Kasalahan mahapus barakas: $1",
        "filedeleteerror-long": "Kasalahan tarikin parhatan mahapus barakas:\n\n$1",
index 5f5e085..6b86915 100644 (file)
        "actionthrottled": "কাজের গতি ধীরকরণ",
        "actionthrottledtext": "অপব্যবহার প্রতিরোধক সমাধান হিসেবে এই কাজটি খুব কম সময়ে অনেক বেশিবার সম্পাদন করার উপর সীমা বেঁধে দেওয়া হয়েছে, এবং আপনি সেই সীমা অতিক্রম করেছেন।\nঅনুগ্রহ করে কয়েক মিনিট পরে আবার চেষ্টা করুন।",
        "protectedpagetext": "সম্পাদনা অথবা অন্যান্য কাজে বাধা দিতে এই পাতাটিকে সুরক্ষিত করা হয়েছে।",
-       "viewsourcetext": "à¦\8f à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦\86পনি দেখতে এবং উৎসের প্রতিলিপি করতে পারবেন।",
+       "viewsourcetext": "à¦\86পনি à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি দেখতে এবং উৎসের প্রতিলিপি করতে পারবেন।",
        "viewyourtext": "আপনি এই পাতায় করা <strong>আপনার সম্পাদনাগুলি</strong> দেখতে এবং প্রতিলিপি করতে পারেন।",
        "protectedinterface": "এই পাতার বিষয়বস্তু এই উইকি সফটওয়্যারের একটি ইন্টারফেস বার্তা প্রদান করে, তাই এটি যাতে অপব্যবহারে না করা হয়, সেজন্য এটিকে সুরক্ষিত করে রাখা হয়েছে।\nসকল উইকির অনুবাদে কোনো ধরনের সংযোজন বা পরিবর্তন করতে অনুগ্রহ করে মিডিয়াউইকি স্থানীয়করণ প্রকল্প [https://translatewiki.net/ translatewiki.net] ব্যবহার করুন।",
        "editinginterface": "<strong>সতর্ক বার্তা:</strong> আপনি এমন একটি পাতা সম্পাদনা করছেন যা সফটওয়্যারের জন্য ইন্টারফেস লেখা সরবরাহ করে।\nএই পাতাতে সংঘটিত পরিবর্তন এই উইকির অন্যান্য ব্যবহারকারীদের জন্য দৃশ্যমান ইন্টারফেসে প্রভাব ফেলবে।",
        "postedit-confirmation-published": "আপনার সম্পাদনা প্রকাশিত হয়েছে।",
        "edit-already-exists": "নতুন পাতা সৃষ্টি করা যায়নি।\nপাতাটি ইতিমধ্যেই বিদ্যমান।",
        "defaultmessagetext": "আদি টেক্সট",
-       "content-failed-to-parse": "$1 à¦®à¦¡à§\87লà§\87র à¦\9cনà§\8dয $2 à¦\95নà§\8dà¦\9fà§\87নà§\8dà¦\9f à¦ªà¦¾à¦°à§\8dস à¦\95রা à¦¯à¦¾à¦\9aà§\8dà¦\9bà§\87 à¦¨à¦¾: $3",
+       "content-failed-to-parse": "$1 à¦®à¦¡à§\87লà§\87র à¦\9cনà§\8dয $2 à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81 à¦ªà¦¾à¦°à§\8dস à¦\95রতà§\87 à¦¬à§\8dযরà§\8dথ à¦¹à¦¯à¦¼à§\87à¦\9bà§\87: $3",
        "invalid-content-data": "ভুল কন্টেন্ট ডাটা",
-       "content-not-allowed-here": "\"$1\" à¦\95নà§\8dà¦\9fà§\87নà§\8dà¦\9fà¦\9fি [[$2]] পাতায় অনুমোদিত নয়",
+       "content-not-allowed-here": "\"$1\" à¦¸à¦¾à¦®à¦\97à§\8dরà§\80 [[$2]] পাতায় অনুমোদিত নয়",
        "editwarning-warning": "এই পাতাটি ত্যাগ করলে আপনার আপনার করা পরিবর্তনগুলো হারিয়ে যেতে পারে।\nআপনি যদি প্রবেশ করা থাকেন, আপনি এই সতর্কীকরণ বার্তাটি আপনার পছন্দের \"সম্পাদনা\" অনুচ্ছেদ থেকে নিস্ক্রিয় করতে পারেন।",
        "editpage-invalidcontentmodel-title": "বিষয়বস্তু মডেল সমর্থিত নয়",
        "editpage-invalidcontentmodel-text": "এই \"$1\" বিষয়বস্তু মডেলটি অসমর্থিত।",
        "editpage-notsupportedcontentformat-title": "উল্লেখিত পদ্ধতি সমর্থনযোগ্য নয়।",
        "editpage-notsupportedcontentformat-text": "$1 লেখার ফরম্যাট, $2 কন্টেন্ট মডেলের উপযোগী নয়।",
-       "content-model-wikitext": "à¦\89à¦\87à¦\95িà¦\9fà§\87à¦\95à§\8dসà¦\9f",
+       "content-model-wikitext": "à¦\89à¦\87à¦\95িপাঠà§\8dয",
        "content-model-text": "সাধারণ লেখা",
        "content-model-javascript": "জাভাস্ক্রিপ্ট",
        "content-model-css": "সিএসএস",
        "diff-paragraph-moved-toold": "অনুচ্ছেদ স্থানান্তর করা হয়েছে। পুরনো অবস্থানে যাওয়ার জন্য ক্লিক করুন।",
        "difference-missing-revision": "এই পার্থক্যের ($1) অন্তর্গত {{PLURAL:$2|একটি সংশোধিত সংস্করণ|$2টি সংশোধিত সংস্করণ}} খুঁজে পাওয়া যাচ্ছে না।\n\nসাধারণত মুছে ফেলা হয়েছে এমন পাতার মেয়াদ উত্তীর্ণ ইতিহাস পাতার লিংক খোলার কারণে এটি হতে পারে। \n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} পাতা অবলুপ্তি লগে] বিস্তারিত তথ্য জানা যাবে।",
        "searchresults": "অনুসন্ধানের ফলাফল",
+       "search-filter-title-prefix-reset": "সব পাতা অনুসন্ধান করুন",
        "searchresults-title": "\"$1\" অনুসন্ধানের ফলাফল",
        "titlematches": "নিবন্ধের শিরোনাম মিলেছে",
        "textmatches": "পাতার লেখার সাথে মিলেছে",
        "yourrealname": "আসল নাম *",
        "yourlanguage": "ভাষা:",
        "yourvariant": "বিষয়বস্তুর ভাষার বিকল্প:",
-       "prefs-help-variant": "à¦\89à¦\87à¦\95িতà§\87 à¦\95নà§\8dà¦\9fà§\87নà§\8dà¦\9f à¦ªà¦¾à¦¤à¦¾ à¦¦à§\87à¦\96ার à¦\9cনà§\8dয à¦\86পনার à¦ªà¦\9bনà§\8dদà§\87র à¦¬à§\88শিষà§\8dà¦\9f।",
+       "prefs-help-variant": "à¦\8fà¦\87 à¦\89à¦\87à¦\95িতà§\87 à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81র à¦ªà¦¾à¦¤à¦¾ à¦¦à§\87à¦\96ার à¦\9cনà§\8dয à¦\86পনার à¦ªà¦\9bনà§\8dদà§\87র à¦¬à§\88à¦\95লà§\8dপিà¦\95 à¦¬à¦¾ à¦¬à¦¾à¦¨à¦¾à¦¨।",
        "yournick": "স্বাক্ষর:",
        "prefs-help-signature": "আলাপ পাতায় আপনার মন্তব্য অবশ্যই \"<nowiki>~~~~</nowiki>\" চিহ্ন দ্বারা স্বাক্ষরিত হতে হবে, যা স্বয়ংক্রিয়ভাবে আপনার স্বাক্ষর ও সময় সংযুক্ত করবে।",
        "badsig": "অবৈধ স্বাক্ষর; এইচটিএমএল ট্যাগ পরীক্ষা করুন।",
        "action-viewmywatchlist": "আপনার নজরতালিকা দেখুন",
        "action-viewmyprivateinfo": "আপনার ব্যক্তিগত তথ্য দেখুন",
        "action-editmyprivateinfo": "আপনার ব্যক্তিগত তথ্য সম্পাদনা করুন",
-       "action-editcontentmodel": "পাতার à¦\95নà§\8dà¦\9fà§\87নà§\8dà¦\9f à¦®à¦¡à§\87ল à¦¸à¦®à§\8dপাদনা à¦\95রà§\81ন",
+       "action-editcontentmodel": "à¦\8fà¦\95à¦\9fি à¦ªà¦¾à¦¤à¦¾à¦° à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81র à¦®à¦¡à§\87ল à¦¸à¦®à§\8dপাদনা à¦\95রার",
        "action-managechangetags": "ট্যাগ তৈরি ও সক্রিয়/নিষ্ক্রিয়",
        "action-applychangetags": "আপনার পরিবর্তনগুলোর সাথে ট্যাগ সংযোজন করুন",
        "action-changetags": "নির্দিষ্ট সংস্করণ এবং লগ ভুক্তিগুলিতে যথেচ্ছভাবে ট্যাগ সংযোজন ও অপসারণ করা",
        "speciallogtitlelabel": "লক্ষ্য (ব্যবহারকারীর জন্য শিরোনাম বা {{ns:user}}:ব্যবহারকারী নাম):",
        "log": "লগগুলি",
        "logeventslist-submit": "দেখাও",
-       "logeventslist-more-filters": "à¦\86রà§\8b à¦\9bাà¦\81à¦\95নি:",
+       "logeventslist-more-filters": "à¦\85তিরিà¦\95à§\8dত à¦²à¦\97 à¦¦à§\87à¦\96ান:",
        "logeventslist-patrol-log": "পরীক্ষণ লগ",
        "logeventslist-tag-log": "ট্যাগ লগ",
        "all-logs-page": "সব প্রকাশ্য লগ",
        "trackingcategories-disabled": "বিষয়শ্রেণীটি বিকল",
        "mailnologin": "প্রাপকের ঠিকানা নেই",
        "mailnologintext": "অন্য ব্যবহারকারীদেরকে ই-মেইল পাঠাতে হলে আপনাকে অবশ্যই আগে [[Special:UserLogin|লগ-ইন]] করতে হবে এবং ''[[Special:Preferences|আপনার পছন্দ তালিকায়]] আপনার ই-মেইল ঠিকানাটি ঠিকমত দিতে হবে।",
-       "emailuser": "à¦\87মà§\87à¦\87ল à¦\95রà§\8b",
+       "emailuser": "à¦\8fà¦\87 à¦¬à§\8dযবহারà¦\95ারà§\80à¦\95à§\87 à¦\87মà§\87à¦\87ল à¦\95রà§\81ন",
        "emailuser-title-target": "{{GENDER:$1|ব্যবহারকারীকে}} ইমেইল পাঠান",
        "emailuser-title-notarget": "ব্যবহারকারীকে ই-মেইল করুন",
        "emailpagetext": "আপনি নিচের ফর্মটি ব্যবহার করে এই {{GENDER:$1|ব্যবহারকারীকে}} একটি ই-মেইল পাঠাতে পারেন।\nআপনি [[Special:Preferences|আপনার ব্যবহারকারী পছন্দে]] যে ই-মেইল ঠিকানাটি প্রবেশ করিয়েছেন সেটিকে ই-মেইলের ''প্রেরক'' হিসেবে দেখানো হবে, যেনো মেইলের প্রাপক আপনাকে উত্তর দিতে পারেন।",
        "immobile-target-namespace-iw": "পাতা স্থানান্তরের ক্ষেত্রে ইন্টারউইকি লিংক ব্যবহার করা যাবে না।",
        "immobile-source-page": "এই পাতাটির স্থানান্তর সম্ভব নয়।",
        "immobile-target-page": "গন্তব্য শিরোনামে স্থানান্তর করা যাবে না।",
-       "bad-target-model": "à¦\86পনার à¦\89লà§\8dলà§\87à¦\96িত à¦\95নà§\8dà¦\9fà§\87নà§\8dà¦\9f à¦®à¦¡à§\87লà¦\9fি à¦\86লাদা। $1 à¦¥à§\87à¦\95à§\87 $2 à¦\95নভারà§\8dà¦\9f à¦\95রা à¦¯à¦¾à¦\9aà§\8dà¦\9bে না।",
+       "bad-target-model": "à¦\86à¦\95াà¦\99à§\8dà¦\95à§\8dষিত à¦\97নà§\8dতবà§\8dযà¦\9fি à¦\8fà¦\95à¦\9fি à¦­à¦¿à¦¨à§\8dন à¦¸à¦¾à¦®à¦\97à§\8dরà§\80র à¦®à¦¡à§\87ল à¦¬à§\8dযবহার à¦\95রà§\87। $1 à¦¥à§\87à¦\95à§\87 $2-à¦\8f à¦°à§\82পানà§\8dতর à¦\95রা à¦¯à¦¾à¦¬ে না।",
        "imagenocrossnamespace": "কোনো ফাইল ফাইলনয় এমন নামস্থানে স্থানান্তর সম্ভব নয়",
        "nonfile-cannot-move-to-file": "কোনো ফাইলনয় এমন কোনো পাতা ফাইল নামস্থানে স্থানান্তর সম্ভব নয়",
        "imagetypemismatch": "নতুন ফাইল এক্সটেনশনটি ফাইলের ধরনের সাথে মিলছে না",
        "import-error-interwiki": "\"$1\" পাতাটি আমদানি করা যায়নি কারণ এই নামটি বহিঃসংযোগর জন্য নির্ধারিত (আন্তঃউইকি)।",
        "import-error-special": "\"$1\" পাতাটি আমদানি করা যায়নি কারণ এটি একটি বিশেষ নামস্থানকে নির্দেশ করে যেটি সম্পাদনার জন্য অনুমোদিত নয়।",
        "import-error-invalid": "\"$1\" পাতাটি আমদানি করা যায়নি কারণ নামটি সঠিক নয়।",
-       "import-error-unserialize": "$1 à¦ªà¦¾à¦¤à¦¾à¦° $2 à¦¸à¦\82সà§\8dà¦\95রণà¦\9fি à¦¸à¦¿à¦°à¦¿à¦¯à¦¼à¦¾à¦²à¦¾à¦\87à¦\9c à¦\95রা à¦¯à¦¾à¦\9aà§\8dà¦\9bà§\87 à¦¨à¦¾à¥¤ à¦\8fà¦\87 à¦°à¦¿à¦­à¦¿à¦¶à¦¨à§\87 $4 à¦¹à¦¿à¦¸à¦¾à¦¬à§\87 $3 à¦\95নà§\8dà¦\9fà§\87নà§\8dà¦\9f à¦®à¦¡à§\87লà§\87 à¦¸à¦¿à¦°à¦¿à¦¯à¦¼à¦¾à¦²à¦¾à¦\87à¦\9c করা আছে।",
+       "import-error-unserialize": "$1 à¦ªà¦¾à¦¤à¦¾à¦° $2 à¦¸à¦\82সà§\8dà¦\95রণà¦\9fি à¦§à¦¾à¦°à¦¾à¦¬à¦¾à¦¹à¦¿à¦\95ভাবà§\87 à¦ªà§\8dরà¦\95াশ à¦\95রা à¦¯à¦¾à¦\9aà§\8dà¦\9bà§\87 à¦¨à¦¾à¥¤ à¦\8fà¦\87 à¦¸à¦\82সà§\8dà¦\95রণà§\87 $4 à¦¹à¦¿à¦¸à¦¾à¦¬à§\87 $3 à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81র à¦®à¦¡à§\87লà§\87 à¦§à¦¾à¦°à¦¾à¦¬à¦¾à¦¹à¦¿à¦\95ভাবà§\87 à¦ªà§\8dরà¦\95াশ করা আছে।",
        "import-error-bad-location": "বিষয়বস্তু মডেল $3 ব্যবহার করে সম্পাদিত $2 নং সংশোধনটি \"$1\" পাতায় সংরক্ষণ করা যাবে না, কারণ ঐ মডেলটি ঐ পাতাতে প্রযোজ্য নয়।",
        "import-options-wrong": "{{PLURAL:$2|পছন্দ}} নির্বাচনে ভুল: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "মূল পাতার ভুল শিরনাম দেয়া হয়েছে।",
        "markedaspatrollederrornotify": "পরীক্ষিত হিসাবে চিহ্নিত করতে ব্যর্থ।",
        "patrol-log-page": "পরীক্ষণ লগ",
        "patrol-log-header": "এটি যাচাইকৃত রিভিশনের তালিকা।",
-       "log-show-hide-patrol": "পরীক্ষণ লগ $1",
-       "log-show-hide-tag": "ট্যাগ লগ $1",
        "confirm-markpatrolled-button": "ঠিক আছে",
        "confirm-markpatrolled-top": "$2-এর $3 নং সংস্করণটি পরীক্ষিত হিসেবে চিহ্নিত করবেন?",
        "deletedrevision": "মুছে ফেলা পুরাতন সংশোধন $1",
index a552b16..48526f5 100644 (file)
        "markedaspatrollederrornotify": "N'eus ket bet gallet merkañ evel gwiriet.",
        "patrol-log-page": "Log gwiriañ",
        "patrol-log-header": "Setu ur marilh eus ar stummoù patrouilhet.",
-       "log-show-hide-patrol": "$1 istor ar stummoù gwiriet",
-       "log-show-hide-tag": "$1 marilh an dikedenn",
        "confirm-markpatrolled-button": "Mat eo",
        "confirm-markpatrolled-top": "Merkañ adweladenn $3 eus $2 evel gwiriet ?",
        "deletedrevision": "Diverket stumm kozh $1.",
index 0f18d91..e31278b 100644 (file)
        "markedaspatrollederrornotify": "Označavanje stranice pregledanom nije uspjelo.",
        "patrol-log-page": "Zapisnik patroliranja",
        "patrol-log-header": "Ovo je zapisnik patroliranih izmjena.",
-       "log-show-hide-patrol": "$1 zapisnik patroliranja",
-       "log-show-hide-tag": "$1 zapisnik oznaka",
        "confirm-markpatrolled-button": "U redu",
        "confirm-markpatrolled-top": "Označiti izmjenu $3 stranice $2 patroliranom?",
        "deletedrevision": "Obrisana stara izmjena $1",
index 3579d72..d2854d6 100644 (file)
        "markedaspatrollederrornotify": "Ha fallat la marca com a patrullat.",
        "patrol-log-page": "Registre de supervisió",
        "patrol-log-header": "Això és un registre de les revisions patrullades.",
-       "log-show-hide-patrol": "$1 el registre de patrulla",
-       "log-show-hide-tag": "$1 el registre d’etiquetes",
        "confirm-markpatrolled-button": "D'acord",
        "confirm-markpatrolled-top": "Voleu marcar la revisió $3 de $2 com a patrullada?",
        "deletedrevision": "S'ha eliminat la revisió antiga $1.",
index 32cb94b..21e3132 100644 (file)
        "markedaspatrollederrornotify": "Хийцамаш хьаьжжина сана билгал бан цабелира.",
        "patrol-log-page": "ТӀехьажаран тептар",
        "patrol-log-header": "Хьажжина версеш йолу тептар.",
-       "log-show-hide-patrol": "$1 тӀехьажаран тептар",
-       "log-show-hide-tag": "$1 билгалонийн тептар",
        "confirm-markpatrolled-button": "ХӀаъ",
        "deletedrevision": "ДӀаяьккхина шира верси $1",
        "filedeleteerror-short": "Файл дӀаяккхаран гӀалат: $1",
index 53337d1..6ea5b13 100644 (file)
        "history-feed-item-nocomment": "$1 لە $2",
        "history-feed-empty": "لاپەڕەی داخوازی‌کراو بوونی نیە.<br />\nلەوانەیە لەسەر ویکی سڕدرابێتەوە یان ناوی گۆڕدرابێت.<br />\nبۆ لاپەڕەی وەک ئەوە هەوڵی [[Special:Search|گەڕان لەسەر ویکی]] بدە.",
        "rev-deleted-comment": "(کورتەی دەستکاری سڕایەوە)",
-       "rev-deleted-user": "(Ù\86اÙ\88Û\8c Ø¨Û\95کارÙ\87Û\8eÙ\86Û\95ر Ø³Ú\95اÛ\8cەوە)",
+       "rev-deleted-user": "(Ù\86اÙ\88Û\8c Ø¨Û\95کارÙ\87Û\8eÙ\86Û\95ر Ø³Ú\95دراÙ\88Û\95تەوە)",
        "rev-deleted-event": "(لۆگی کردەوە سڕایەوە)",
        "rev-deleted-text-permission": "ئەم پێداچوونەوەیە لەم پەڕەیە '''سڕدراوەتەوە'''.\nوردەکاری سەبارەت بەوە لە [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} لۆگی سڕینەوە]دا دەست دەکەوێت.",
        "rev-deleted-text-unhide": "ئەم پێداچوونەوەیە لەم پەڕەیە '''سڕدراوەتەوە'''.\nوردەکاری سەبارەت بەوە لە [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} لۆگی سڕینەوە]دا دەست دەکەوێت.\nھێشتا ئەگەر بتەوێ دەتوانی [$1 ئەم پێداچوونەوەیە ببینی].",
        "markedaspatrollederrornotify": "نیشانکردن وەک پاس دراو سەرکەوتوو نەبوو.",
        "patrol-log-page": "لۆگی پاسدان",
        "patrol-log-header": "ئەمە لۆگێکی پێداچوونەوە پاس دراوەکانە.",
-       "log-show-hide-patrol": "لۆگی پاسدان $1",
        "confirm-markpatrolled-button": "باشە",
        "deletedrevision": "پێداچوونەوەی کۆنی سڕاوە $1",
        "filedeleteerror-short": "هەڵە لە سڕینەوەی پەڕگە: $1",
index c06c758..2241458 100644 (file)
        "spam_blanking": "Бар олгъан версияларда $1 сайтына багълантылар бар, темизлев",
        "pageinfo-language": "Саифе ичиндекисининъ тили",
        "patrol-log-page": "Тешкерюв журналы",
-       "log-show-hide-patrol": "Тешкерюв журналыны $1",
        "deletedrevision": "$1 сайылы эски версия ёкъ этильди.",
        "filedeleteerror-short": "Файл ёкъ эткенде хата чыкъты: $1",
        "filedelete-missing": "\"$1\" адлы файл ёкъ этилип оламай, чюнки ойле бир файл ёкъ.",
index 8728109..02405da 100644 (file)
        "spam_blanking": "Bar olğan versiyalarda $1 saytına bağlantılar bar, temizlev",
        "pageinfo-language": "Saife içindekisiniñ tili",
        "patrol-log-page": "Teşkerüv jurnalı",
-       "log-show-hide-patrol": "Teşkerüv jurnalını $1",
        "deletedrevision": "$1 sayılı eski versiya yoq etildi.",
        "filedeleteerror-short": "Fayl yoq etkende hata çıqtı: $1",
        "filedelete-missing": "\"$1\" adlı fayl yoq etilip olamay, çünki öyle bir fayl yoq.",
index d8e9640..e3cf411 100644 (file)
        "diff-paragraph-moved-toold": "Odstavec byl přesunut. Kliknutím skočíte na původní umístění.",
        "difference-missing-revision": "{{PLURAL:$2|Jedna z revizí|$2 revize|$2 revizí}} k požadovanému porovnání ($1) {{PLURAL:$2|neexistuje|neexistují|neexistuje}}.\n\nToto je obvykle způsobeno tím, že jste následovali zastaralý odkaz na historickou verzi stránky, jež byla smazána.\nPodrobnosti mohou být uvedeny v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} knize smazaných stránek].",
        "searchresults": "Výsledky hledání",
+       "search-filter-title-prefix": "Hledání pouze ve stránkách, jejichž název začíná na „$1“",
+       "search-filter-title-prefix-reset": "Hledat ve všech stránkách",
        "searchresults-title": "Výsledky hledání „$1“",
        "titlematches": "Stránky s odpovídajícím názvem",
        "textmatches": "Stránky s odpovídajícím textem",
        "speciallogtitlelabel": "Cíl (název nebo {{ns:user}}:Jméno pro uživatele):",
        "log": "Protokolovací záznamy",
        "logeventslist-submit": "Zobrazit",
-       "logeventslist-more-filters": "Další filtry:",
+       "logeventslist-more-filters": "Zobrazit další záznamy:",
        "logeventslist-patrol-log": "Kniha prověřených editací",
        "logeventslist-tag-log": "Kniha značek",
        "all-logs-page": "Všechny veřejné záznamy",
        "markedaspatrollederrornotify": "Nepodařilo se označit jako prověřené.",
        "patrol-log-page": "Kniha prověřených editací",
        "patrol-log-header": "Toto je kniha prověřených verzí.",
-       "log-show-hide-patrol": "$1 knihu záznamů patroly",
-       "log-show-hide-tag": "$1 knihu značek",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Označit revizi $3 stránky $2 jako prověřenou?",
        "deletedrevision": "Smazána stará revize $1",
index 5b2c82d..5ebb20d 100644 (file)
        "markedaspatrollederrornotify": "Methwyd rhoi marc ymweliad patrôl arni.",
        "patrol-log-page": "Lòg patrolio",
        "patrol-log-header": "Mae'r lòg hwn yn dangos y golygiadau sydd wedi derbyn ymweliad patrôl.",
-       "log-show-hide-patrol": "$1 lòg patrolio",
        "confirm-markpatrolled-button": "Iawn",
        "confirm-markpatrolled-top": "Nodi fod diwygiad $3 o $2 wedi cael sêl-bendith golygydd?",
        "deletedrevision": "Wedi dileu hen ddiwygiad $1.",
index 875e447..618c606 100644 (file)
        "markedaspatrollederrornotify": "Markering som patruljeret mislykkedes.",
        "patrol-log-page": "Kontrollog",
        "patrol-log-header": "Patruljerede versioner.",
-       "log-show-hide-patrol": "$1 patruljeringslog",
-       "log-show-hide-tag": "$1 taglog",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Marker version $3 af $2 som patruljeret?",
        "deletedrevision": "Slettede gammel version $1",
index 143f26c..5c67e95 100644 (file)
        "diff-paragraph-moved-toold": "Der Absatz wurde verschoben. Klicken, um zur alten Stelle zu springen.",
        "difference-missing-revision": "{{PLURAL:$2|Eine Version|$2 Versionen}} dieser Unterschiedsanzeige ($1) {{PLURAL:$2|wurde|wurden}} nicht gefunden.\n\nDieser Fehler wird normalerweise von einem veralteten Link zur Versionsgeschichte einer Seite verursacht, die zwischenzeitlich gelöscht wurde.\nEinzelheiten sind im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Lösch-Logbuch] vorhanden.",
        "searchresults": "Suchergebnisse",
+       "search-filter-title-prefix": "Nur in Seiten suchen, deren Titel mit „$1“ beginnt.",
+       "search-filter-title-prefix-reset": "Alle Seiten durchsuchen",
        "searchresults-title": "Suchergebnisse für „$1“",
        "titlematches": "Übereinstimmungen mit Seitentiteln",
        "textmatches": "Übereinstimmungen mit Inhalten",
        "speciallogtitlelabel": "Ziel (Titel oder {{ns:user}}:Benutzername für einen Benutzer):",
        "log": "Logbücher",
        "logeventslist-submit": "Anzeigen",
-       "logeventslist-more-filters": "Weitere Filter:",
+       "logeventslist-more-filters": "Zusätzliche Logbücher anzeigen:",
        "logeventslist-patrol-log": "Kontroll-Logbuch",
        "logeventslist-tag-log": "Markierungs-Logbuch",
        "all-logs-page": "Alle öffentlichen Logbücher",
        "markedaspatrollederrornotify": "Der Versuch, die Version als kontrolliert zu markieren, ist fehlgeschlagen.",
        "patrol-log-page": "Kontroll-Logbuch",
        "patrol-log-header": "Dies ist das Kontroll-Logbuch.",
-       "log-show-hide-patrol": "Kontroll-Logbuch $1",
-       "log-show-hide-tag": "Markierungs-Logbuch $1",
        "confirm-markpatrolled-button": "Okay",
        "confirm-markpatrolled-top": "Version $3 von $2 als kontrolliert markieren?",
        "deletedrevision": "alte Version $1 gelöscht",
index ba91d02..1ba6eec 100644 (file)
        "markedaspatrollederrornotify": "Nışan kerdışê dewriyey nêbı",
        "patrol-log-page": "Qeydé çımsernayoğan",
        "patrol-log-header": "Ena listeyê logi revizyonê devriyeyi mocneno.",
-       "log-show-hide-patrol": "Qeydé Çımsernayoğan $1",
-       "log-show-hide-tag": "$1 qeydê etiketi",
        "confirm-markpatrolled-button": "TEMAM",
        "deletedrevision": "Veriyono kihan $1 wederna",
        "filedeleteerror-short": "Wedarnayişê dosya de ğelati esto: $1",
index 1bd76b6..0cff6d9 100644 (file)
        "markedaspatrollederrornotify": "Markěrowanje ako doglědowane njejo se raźiło.",
        "patrol-log-page": "Protokol kontrolow",
        "patrol-log-header": "To jo protokol pśekontrolowanych wersijow.",
-       "log-show-hide-patrol": "Protokol doglědowanja $1",
        "deletedrevision": "wulašowana stara wersija: $1",
        "filedeleteerror-short": "Zmólka pśi wulašowanju dataje: $1",
        "filedeleteerror-long": "Pśi wulašowanju dataje su se zwěsćili zmólki:\n\n$1",
index 6b223f8..9e8b647 100644 (file)
        "markedaspatrollederrornotify": "Σήμανση ως ελεγμένη απέτυχε.",
        "patrol-log-page": "Αρχείο καταγραφής περιπολιών",
        "patrol-log-header": "Αυτό είναι μητρώο ελεγμένων αναθεωρήσεων.",
-       "log-show-hide-patrol": "$1 μητρώου ελέγχου επεξεργασιών",
-       "log-show-hide-tag": "$1 ετικέττα καταγραφής",
        "confirm-markpatrolled-button": "Εντάξει",
        "deletedrevision": "Η παλιά έκδοση της $1 διαγράφτηκε",
        "filedeleteerror-short": "Σφάλμα κατά τη διαγραφή του αρχείου: $1",
index 8d5bc72..bc35c9e 100644 (file)
        "difference-missing-revision": "{{PLURAL:$2|One revision|$2 revisions}} of this difference ($1) {{PLURAL:$2|was|were}} not found.\n\nThis is usually caused by following an outdated diff link to a page that has been deleted.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
        "search-summary": "",
        "searchresults": "Search results",
+       "search-filter-title-prefix": "Only searching in pages whose title starts with \"$1\"",
+       "search-filter-title-prefix-reset": "Search all pages",
        "searchresults-title": "Search results for \"$1\"",
        "titlematches": "Page title matches",
        "textmatches": "Page text matches",
        "speciallogtitlelabel": "Target (title or {{ns:user}}:username for user):",
        "log": "Logs",
        "logeventslist-submit": "Show",
-       "logeventslist-more-filters": "More filters:",
+       "logeventslist-more-filters": "Show additional logs:",
        "logeventslist-patrol-log": "Patrol log",
        "logeventslist-tag-log": "Tag log",
        "all-logs-page": "All public logs",
        "markedaspatrollederrornotify": "Marking as patrolled failed.",
        "patrol-log-page": "Patrol log",
        "patrol-log-header": "This is a log of patrolled revisions.",
-       "log-show-hide-patrol": "$1 patrol log",
-       "log-show-hide-tag": "$1 tag log",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Mark revision $3 of $2 as patrolled?",
        "deletedrevision": "Deleted old revision $1",
index bf4dc22..8348065 100644 (file)
        "markedaspatrollederrornotify": "Malsukcesis marki la dosieron kiel patrolatan.",
        "patrol-log-page": "Protokolo pri patrolado",
        "patrol-log-header": "Jen protokolo de patrolitaj versioj.",
-       "log-show-hide-patrol": "$1 protokolo pri patrolado",
-       "log-show-hide-tag": "$1 etikedan protokolon",
        "confirm-markpatrolled-button": "Ek!",
        "confirm-markpatrolled-top": "Marki version $3 el $2 kiel patrolita?",
        "deletedrevision": "Forigita malnova versio $1",
index 74a7ce4..c30014a 100644 (file)
                        "Athena in Wonderland",
                        "Truebamateo",
                        "La Mantis",
-                       "Amaia"
+                       "Amaia",
+                       "Tiberius1701"
                ]
        },
        "tog-underline": "Subrayar los enlaces:",
        "rcfilters-empty-filter": "No hay filtros activos. Se muestran todas las contribuciones.",
        "rcfilters-filterlist-title": "Filtros",
        "rcfilters-filterlist-whatsthis": "¿Cómo funcionan?",
-       "rcfilters-filterlist-feedbacklink": "Comparte tus comentarios sobre estas (nuevas) herramientas de filtrado",
+       "rcfilters-filterlist-feedbacklink": "Dinos lo que piensas sobre estas herramientas de filtrado",
        "rcfilters-highlightbutton-title": "Resaltar los resultados",
        "rcfilters-highlightmenu-title": "Selecciona un color",
        "rcfilters-highlightmenu-help": "Selecciona un color para resaltar esta propiedad",
        "rcfilters-watchlist-edit-watchlist-button": "Edita tu lista de seguimiento",
        "rcfilters-watchlist-showupdated": "Los cambios hechos a páginas que no has visitado desde que se efectuaron aparecen en <strong>negrita</strong>, acompañados de marcadores sólidos.",
        "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-preference-help": "Revierte el rediseño de la 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-watchlist-preference-help": "Revierte el rediseño de la interfaz de 2017 y desactiva 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",
        "speciallogtitlelabel": "Objetivo (título o {{ns:user}}:nombre de usuario):",
        "log": "Registros",
        "logeventslist-submit": "Mostrar",
+       "logeventslist-more-filters": "Más filtros:",
+       "logeventslist-patrol-log": "Registro de revisiones",
+       "logeventslist-tag-log": "Registro de etiquetas",
        "all-logs-page": "Todos los registros públicos",
        "alllogstext": "Vista combinada de todos los registros de {{SITENAME}}.\nPuedes filtrar la vista seleccionando un tipo de registro, el nombre del usuario o la página afectada. Se distinguen mayúsculas de minúsculas.",
        "logempty": "No hay elementos en el registro con esas condiciones.",
        "markedaspatrollederrornotify": "Error al marcar como verificado.",
        "patrol-log-page": "Registro de revisiones",
        "patrol-log-header": "Este es un registro de revisiones verificadas.",
-       "log-show-hide-patrol": "$1 registro de verificación",
-       "log-show-hide-tag": "$1 registro de etiquetas",
        "confirm-markpatrolled-button": "Aceptar",
        "confirm-markpatrolled-top": "¿Marcar la revisión $3 de $2 como verificada?",
        "deletedrevision": "Borrada revisión antigua $1",
index 74c4d97..a4ff0fb 100644 (file)
        "markedaspatrollederrornotify": "Kontrollituks märkimine ebaõnnestus.",
        "patrol-log-page": "Kontrollimislogi",
        "patrol-log-header": "See on kontrollitud redaktsioonide logi.",
-       "log-show-hide-patrol": "$1 kontrollimislogi",
-       "log-show-hide-tag": "$1 märgiste logi",
        "confirm-markpatrolled-button": "Sobib",
        "confirm-markpatrolled-top": "Kas märgid lehekülje $2 redaktsiooni $3 kontrollituks?",
        "deletedrevision": "Kustutatud vanem versioon $1",
index c547056..126d314 100644 (file)
        "log": "Erregistroak",
        "logeventslist-submit": "Erakutsi",
        "logeventslist-more-filters": "Iragazki gehiago:",
+       "logeventslist-tag-log": "Etiketen erregistroa",
        "all-logs-page": "Erregistro publiko guztiak",
        "alllogstext": "{{SITENAME}} orrialdearen erregistro guztien erakusketa konbinatua.\nErregistro mota, erabiltzailearen izena edota orrialdearen izena iragaziz bistaratu daiteke. Letra larriak eta xeheak bereizten dira.",
        "logempty": "Ez dago emaitzarik erregistroan.",
        "markedaspatrollederrornotify": "Patruilatu gisa markatzean akatsa egon da.",
        "patrol-log-page": "Patrullatze loga",
        "patrol-log-header": "Hau patruliatutako aldaketen log bat da.",
-       "log-show-hide-patrol": "$1 patruilatze loga",
-       "log-show-hide-tag": "$1 etiketa erregistroa",
        "confirm-markpatrolled-button": "Ados",
        "confirm-markpatrolled-top": "$2ren $3 berrikusketa patruilatu bezala markatu?",
        "deletedrevision": "$1 berrikuspen zaharra ezabatu da",
index 3eb42f9..329a19c 100644 (file)
        "markedaspatrollederrornotify": "زدن برچسب گشت، ناموفق بود.",
        "patrol-log-page": "سیاههٔ گشت",
        "patrol-log-header": "این سیاهه‌ای از ویرایش‌های گشت‌خورده است.",
-       "log-show-hide-patrol": "$1 سیاههٔ گشت‌زنی",
-       "log-show-hide-tag": "$1 سیاهه برچسب",
        "confirm-markpatrolled-button": "تأیید",
        "confirm-markpatrolled-top": "نسخهٔ $3 از $2 علامت گشت بخورد؟",
        "deletedrevision": "$1 نسخهٔ حذف شدهٔ قدیمی",
index f3637c3..7bbd46b 100644 (file)
@@ -57,7 +57,8 @@
                        "4shadoww",
                        "Pahkiqaz",
                        "Rueter",
-                       "Kyykaarme"
+                       "Kyykaarme",
+                       "Surjection"
                ]
        },
        "tog-underline": "Linkkien alleviivaus:",
@@ -94,7 +95,7 @@
        "tog-watchlisthideminor": "Piilota pienet muokkaukset tarkkailulistalta",
        "tog-watchlisthideliu": "Piilota kirjautuneiden käyttäjien muokkaukset tarkkailulistalta",
        "tog-watchlistreloadautomatically": "Päivitä tarkkailulista automaattisesti aina kun jotakin suodatinta on muutettu (vaatii JavaScriptiä)",
-       "tog-watchlistunwatchlinks": "Lisää suorat tarkkailemattomat/tarkkaillut linkit tarkkailulistan merkintöihin (JavaScriptiä edellytetään nappuloiden toiminnallisuuteen)",
+       "tog-watchlistunwatchlinks": "Lisää suorat tarkkailemattomat/tarkkaillut linkit ({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}) tarkkailulistan muutettujen sivujen merkintöihin (JavaScriptiä edellytetään nappuloiden toiminnallisuuteen)",
        "tog-watchlisthideanons": "Piilota rekisteröitymättömien käyttäjien muokkaukset tarkkailulistalta",
        "tog-watchlisthidepatrolled": "Piilota muutostentarkastajien hyväksymät muokkaukset tarkkailulistalta",
        "tog-watchlisthidecategorization": "Piilota sivujen luokitusmuutokset",
        "versionrequiredtext": "MediaWikistä tarvitaan vähintään versio $1 tämän sivun käyttämiseen. Katso [[Special:Version|versio]].",
        "ok": "OK",
        "pagetitle": "$1 – {{SITENAME}}",
-       "retrievedfrom": "Noudettu kohteesta $1",
+       "retrievedfrom": "Noudettu kohteesta \"$1\"",
        "youhavenewmessages": "Sinulle on $1 ($2).",
-       "youhavenewmessagesfromusers": "Sinulle on $1 {{PLURAL:$3|toiselta käyttäjältä|$3 käyttäjältä}} ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Sinulle on}} $1 {{PLURAL:$3|toiselta käyttäjältä|$3 käyttäjältä}} ($2).",
        "youhavenewmessagesmanyusers": "Sinulle on $1 uusia viestejä useilta käyttäjiltä ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|uusi viesti|999=uusia viestejä}}",
        "newmessagesdifflinkplural": "{{PLURAL:$1|viimeinen muutos|999=viimeiset muutokset}}",
        "editold": "muokkaa",
        "viewsourceold": "näytä wikiteksti",
        "editlink": "muokkaa",
-       "viewsourcelink": "näytä lähdekoodi",
+       "viewsourcelink": "näytä wikiteksti",
        "editsectionhint": "Muokkaa osiota $1",
        "toc": "Sisällysluettelo",
        "showtoc": "näytä",
        "databaseerror-query": "Kysely: $1",
        "databaseerror-function": "Toiminto (funktio): $1",
        "databaseerror-error": "Virhe: $1",
+       "transaction-duration-limit-exceeded": "Korkean toistoviiveen välttämiseksi tämä transaktio keskeytettiin, koska kirjoituksen pituus ($1) ylitti $2 sekunnin rajan.\nJos muutat monia kohteita samaan aikaan, voit yrittää operaation halkaisemista pienempiin osiin.",
        "laggedslavemode": "'''Varoitus:''' Sivu ei välttämättä sisällä viimeisimpiä muutoksia.",
        "readonly": "Tietokanta on lukittu",
        "enterlockreason": "Anna lukituksen syy sekä sen arvioitu poistamisaika",
        "cascadeprotected": "Tämä sivu on suojattu muokkauksilta, koska se on sisällytetty {{PLURAL:$1|seuraavaan tarttuvasti suojattuun sivuun|seuraaviin tarttuvasti suojattuihin sivuihin}}:\n$2",
        "namespaceprotected": "Sinulla ei ole oikeutta muokata sivuja, jotka ovat nimiavaruudessa <strong>$1</strong>.",
        "customcssprotected": "Sinulla ei ole oikeutta muuttaa tätä CSS-sivua, koska se sisältää toisen käyttäjän henkilökohtaisia asetuksia.",
+       "customjsonprotected": "Sinulla ei ole oikeutta muuttaa tätä JSON-sivua, koska se sisältää toisen käyttäjän henkilökohtaisia asetuksia.",
        "customjsprotected": "Sinulla ei ole oikeutta muuttaa tätä JavaScript-sivua, koska se sisältää toisen käyttäjän henkilökohtaisia asetuksia.",
        "mycustomcssprotected": "Sinulla ei ole oikeutta muokata tätä CSS-sivua.",
        "mycustomjsonprotected": "Sinulla ei ole oikeutta muokata tätä JSON-sivua.",
        "botpasswords-label-delete": "Poista",
        "botpasswords-label-resetpassword": "Hanki uusi salasana",
        "botpasswords-label-grants": "Valittavissa olevat toimintaoikeudet:",
+       "botpasswords-help-grants": "Toimintaoikeudet sallivat pääsyn oikeuksiin, joita käyttäjätililläsi jo on. Toimintaoikeuden käyttöönotto täällä ei lisää käyttäjätilillesi oikeuksia, joita sillä ei jo ole. Lisätietoja löytyy [[Special:ListGrants|toimintaoikeuksien luettelosta]].",
        "botpasswords-label-grants-column": "Myönnetään",
        "botpasswords-bad-appid": "Botin nimi \"$1\" ei kelpaa.",
        "botpasswords-insert-failed": "Botin nimen \"$1\" lisääminen epäonnsitui. Onko se jo lisätty?",
        "resetpass-temp-password": "Väliaikainen salasana:",
        "resetpass-abort-generic": "Laajennus keskeytti salasanan vaihdon.",
        "resetpass-expired": "Salasanasi on vanhentunut. Valitse uusi salasana, jotta pääset kirjautumaan sisään.",
-       "resetpass-expired-soft": "Salasanasi on vanhentunut ja se pitää uudistaa. Valitse uusi salasana nyt tai paina \"{{int:authprovider-resetpass-skip-label}}\", niin voit uudistaa salasanan myöhemmin.",
+       "resetpass-expired-soft": "Salasanasi on vanhentunut ja se pitää vaihtaa. Valitse uusi salasana nyt tai paina \"{{int:authprovider-resetpass-skip-label}}\", niin voit vaihtaa salasanan myöhemmin.",
        "resetpass-validity-soft": "Salasanasi ei ole kelvollinen: $1\n\nValitse nyt uusi salasana tai paina \"{{int:authprovider-resetpass-skip-label}}\", niin voit vaihtaa sen myöhemmin.",
        "passwordreset": "Salasanan uusiminen",
        "passwordreset-text-one": "Täytä tämä lomake uudistaaksesi salasanasi.",
        "passwordreset-emailelement": "Käyttäjätunnus: \n$1\n\nVäliaikainen salasana: \n$2",
        "passwordreset-emailsentemail": "Jos tämä on sinun tunnuksellesi rekisteröity sähköpostiosoite, salasanan uudistamisesta kertova viesti lähetetään.",
        "passwordreset-emailsentusername": "Jos on olemassa vastaava rekisteröity sähköpostiosoite, salasanan uudistamisesta kertova viesti lähetetään.",
+       "passwordreset-nocaller": "Kutsuja on määriteltävä",
        "passwordreset-nosuchcaller": "Kutsuvaa funktiota ei ole olemassa: $1",
        "passwordreset-ignored": "Salasanan palauttamista ei käsitelty. Ehkä tarjoajaa ei ollut määritetty?",
        "passwordreset-invalidemail": "Virheellinen sähköpostiosoite",
        "accmailtext": "Satunnaisesti generoitu salasana käyttäjälle [[User talk:$1|$1]] on lähetetty osoitteeseen $2. Sen voi vaihtaa kirjautumisen jälkeen [[Special:ChangePassword|asetussivulla]].",
        "newarticle": "(Uusi)",
        "newarticletext": "Linkki toi sivulle, jota ei vielä ole.\nVoit luoda sivun kirjoittamalla alla olevaan kenttään (katso [$1 ohjesivulta] lisätietoja).\nJos et halua luoda sivua, käytä selaimen paluutoimintoa.",
-       "anontalkpagetext": "----''Tämä on nimettömän käyttäjän keskustelusivu. Hän ei ole joko luonut itselleen käyttäjätunnusta tai ei käytä sitä. Siksi hänet tunnistetaan nyt numeerisella IP-osoitteella. Kyseinen IP-osoite voi olla useamman henkilön käytössä. Jos olet nimetön käyttäjä, ja sinusta tuntuu, että aiheettomia kommentteja on ohjattu sinulle, [[Special:CreateAccount|luo itsellesi käyttäjätunnus]] tai [[Special:UserLogin|kirjaudu sisään]] välttääksesi jatkossa sekaannukset muiden nimettömien käyttäjien kanssa.''",
+       "anontalkpagetext": "----''Tämä on nimettömän käyttäjän keskustelusivu. Hän ei ole joko luonut itselleen käyttäjätunnusta tai ei käytä sitä, jonka vuoksi hänet tunnistetaan nyt numeerisella IP-osoitteella. Kyseinen IP-osoite voi olla useamman henkilön käytössä. Jos olet nimetön käyttäjä ja sinusta tuntuu, että aiheettomia kommentteja on ohjattu sinulle, [[Special:CreateAccount|luo itsellesi käyttäjätunnus]] tai [[Special:UserLogin|kirjaudu sisään]] välttääksesi jatkossa sekaannukset muiden nimettömien käyttäjien kanssa.''",
        "noarticletext": "Tällä hetkellä tällä sivulla ei ole tekstiä.\nVoit [[Special:Search/{{PAGENAME}}|etsiä sivun nimellä]] muilta sivuilta,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} hakea aiheeseen liittyviä lokeja]\ntai [{{fullurl:{{FULLPAGENAME}}|action=edit}} luoda tämän sivun]</span>.",
        "noarticletext-nopermission": "Tällä hetkellä tällä sivulla ei ole tekstiä.\nVoit [[Special:Search/{{PAGENAME}}|etsiä sivun nimellä]] muilta sivuilta tai <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} hakea aiheeseen liittyviä lokeja]</span>, mutta sinulla ei ole oikeutta luoda tätä sivua.",
        "missing-revision": "Sivusta \"{{FULLPAGENAME}}\" ei ole olemassa versiota $1.\n\nYleensä tämä johtuu vanhentuneesta historialinkistä sivulle, joka on poistettu.\nTarkempia tietoja löytyy [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} poistolokista].",
        "userjsonyoucanpreview": "<strong>Vihje:</strong> Käytä \"{{int:showpreview}}\" painiketta testataksesi uutta JSON:iasi ennen tallentamista.",
        "userjsyoucanpreview": "Voit testata uutta JavaScriptiä ennen tallennusta käyttämällä painiketta ”{{int:showpreview}}”.",
        "usercsspreview": "'''Tämä on CSS:n esikatselu. Muutoksia ei ole vielä tallennettu.'''",
+       "userjsonpreview": "<strong>Huomaa, että tämä on vasta JSON-käyttäjäasetusten esikatselu.\nMuutoksia ei ole vielä tallennettu!</strong>",
        "userjspreview": "'''Tämä on JavaScriptin esikatselu.'''",
        "sitecsspreview": "'''Huomaa, että tämä on vasta CSS:n esikatselu.''' \n'''Muutoksia ei ole vielä tallennettu.'''",
+       "sitejsonpreview": "<strong>Huomaa, että tämä on vasta JSON-asetusten esikatselu.\nMuutoksia ei ole vielä tallennettu!</strong>",
        "sitejspreview": "'''Huomaa, että tämä on vasta JavaScript-koodin esikatselu.'''\n'''Muutoksia ei ole vielä tallennettu.'''",
        "userinvalidconfigtitle": "<strong>Varoitus:</strong> Tyyliä nimeltä ”$1” ei ole olemassa. Muista, että käyttäjän määrittelemät .css-, -json- ja .js-sivut alkavat pienellä alkukirjaimella, esim. {{ns:user}}:Matti Meikäläinen/vector.css eikä {{ns:user}}:Matti Meikäläinen/Vector.css.",
        "updated": "(Päivitetty)",
        "content-model-css": "CSS",
        "content-json-empty-object": "Tyhjä objekti",
        "content-json-empty-array": "Tyhjä array",
-       "deprecated-self-close-category": "Sivut, joissa on virheellisiä itsensäsulkevia HTLM-tageja",
+       "deprecated-self-close-category": "Sivut, joissa on virheellisiä itsensäsulkevia HTML-tageja",
        "deprecated-self-close-category-desc": "Sivulla on virheellisiä itsensäsulkevia HTML-tageja, kuten <code>&lt;b/></code> tai <code>&lt;span/></code>. Niiden käyttäytyminen muuttuu pian HTLM5:n määritysten mukaiseksi, joten niiden käyttö wikitekstissä on vanhentunut.",
        "duplicate-args-warning": "<strong>Varoitus:</strong> [[:$1]] kutsuu mallinetta [[:$2]] niin, että parametrille \"$3\" on annettu enemmän kuin yksi arvo. Ainoastaan viimeksi annettu arvo otetaan huomioon.",
        "duplicate-args-category": "Sivut, jotka käyttävät kaksinkertaisia argumentteja mallinekutsuissa",
        "post-expand-template-argument-category": "Käsittelemättömiä mallinemuuttujia sisältävät sivut",
        "parser-template-loop-warning": "Mallinesilmukka havaittu: [[$1]]",
        "template-loop-category": "Sivut, joissa on mallinesilmukoita",
+       "template-loop-category-desc": "Tämä sivu sisältää mallinesilmukan, eli itseänsä kutsuvan mallineen.",
        "template-loop-warning": "<strong>Varoitus:</strong> Tämä sivu kutsuu mallinetta [[:$1]] joka aiheuttaa mallinesilmukan (loputon rekursiivinen kutsu).",
        "parser-template-recursion-depth-warning": "Mallineen rekursioraja ylittyi ($1)",
        "language-converter-depth-warning": "Kielimuuntimen syvyysraja ylittyi ($1)",
        "expansion-depth-exceeded-warning": "Sivu ylitti laajentamissyvyyden.",
        "parser-unstrip-loop-warning": "Unstrip-silmukka havaittiin",
        "unstrip-depth-warning": "Unstrip-rekursion enimmäissyvyys ($1) ylitettiin",
+       "unstrip-depth-category": "Sivut, joissa unstrip-enimmäissyvyys ylittyy",
+       "unstrip-size-warning": "Unstrip-kokoraja ($1) ylitettiin",
+       "unstrip-size-category": "Sivut, joissa unstrip-kokoraja ylittyy",
        "converter-manual-rule-error": "Kielivarianttisäännössä on virhe",
        "undo-success": "Kumoaminen voidaan suorittaa.\nVarmista alla olevasta vertailusta, että haluat saada aikaan tämän lopputuloksen, ja sen jälkeen tallenna alla näkyvät muutokset.",
        "undo-failure": "Muokkausta ei voi kumota välissä olevien ristiriitaisten muutosten vuoksi.",
+       "undo-main-slot-only": "Muokkausta ei voitu kumota, koska muokkaus koskee sisältöä pääalueen ulkopuolella.",
        "undo-norev": "Muokkausta ei voida kumota, koska sitä ei ole olemassa tai se on poistettu.",
        "undo-nochange": "Tämä muokkaus näyttää olevan jo kumottu.",
        "undo-summary": "Kumottu muokkaus $1, jonka teki [[Special:Contributions/$2|$2]] ([[User talk:$2|keskustelu]])",
        "diff-paragraph-moved-toold": "Kappale siirrettiin. Klikkaa hypätäksesi vanhaan sijaintiin.",
        "difference-missing-revision": "{{PLURAL:$2|Yhtä versiota|$2 versiota}} tästä vertailusta ($1) {{PLURAL:$2|ei}} löytynyt.\n\nUseimmiten tämä johtuu vanhentuneesta vertailulinkistä poistettuun sivuun.\nLisätietoja löytyy [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} poistolokista].",
        "searchresults": "Hakutulokset",
+       "search-filter-title-prefix": "Haetaan vain sivuista, joiden otsikko alkaa \"$1\"",
+       "search-filter-title-prefix-reset": "Hae kaikista sivuista",
        "searchresults-title": "Haun tulokset hakusanalle ”$1”",
        "titlematches": "Osumat sivujen otsikoissa",
        "textmatches": "Osumat sivujen teksteissä",
        "prefs-watchlist-edits": "Tarkkailulistalla näytettävien muokkausten enimmäismäärä:",
        "prefs-watchlist-edits-max": "Enintään 1000",
        "prefs-watchlist-token": "Tarkkailulistan avain:",
+       "prefs-watchlist-managetokens": "Hallitse avaimia",
        "prefs-misc": "Muut",
        "prefs-resetpass": "Muuta salasana",
        "prefs-changeemail": "Muuta tai poista sähköpostiosoite",
        "recentchangescount": "Näytettävien muutoksien määrä tuoreissa muutoksissa, sivujen historioissa ja logeissa oletuksena",
        "prefs-help-recentchangescount": "Maksimiluku 1000",
        "prefs-help-watchlist-token2": "Tämä on salainen avain tarkkailulistasi verkkosyötteeseen.\nKuka tahansa, joka tietää sen voi lukea tarkkailulistaasi, joten älä paljasta sitä.\nJos sinun täytyy, [[Special:ResetTokens|voit uudistaa sen]].",
+       "prefs-help-tokenmanagement": "Voit nähdä ja nollata tilisi salaisen avaimen, jota käyttämällä pääset katsomaan tarkastuslistasi verkkosyötettä. Kuka tahansa sen tietävä voi lukea tarkkailulistaasi, joten älä paljasta sitä.",
        "savedprefs": "Asetuksesi on tallennettu.",
        "savedrights": "Käyttäjän {{GENDER:$1|$1}} käyttäjäryhmät on tallennettu.",
        "timezonelegend": "Aikavyöhyke",
        "prefs-editor": "Muokkain",
        "prefs-preview": "Esikatselu",
        "prefs-advancedrc": "Lisäasetukset",
+       "prefs-opt-out": "Jättäydy pois uudistuksista",
        "prefs-advancedrendering": "Lisäasetukset",
        "prefs-advancedsearchoptions": "Lisäasetukset",
        "prefs-advancedwatchlist": "Lisäasetukset",
        "userrights-expiry-options": "1 päivä:1 day,1 viikko:1 week,1 kuukausi:1 month,3 kuukautta:3 months,6 kuukautta:6 months,1 vuosi:1 year",
        "userrights-invalid-expiry": "Ryhmän \"$1\" vanhentumisaika on virheellinen.",
        "userrights-expiry-in-past": "Ryhmän \"$1\" vanhentumisaika on mennyt.",
+       "userrights-cannot-shorten-expiry": "Et voi aikaistaa ryhmän \"$1\" jäsenyyden erääntymisaikoja. Vain käyttäjät, joilla on oikeus lisätä ja poistaa ryhmiä, voivat aikaistaa erääntymisaikoja.",
        "userrights-conflict": "Päällekkäinen käyttöoikeuksien muutos! Tarkista tekemäsi muutokset ja vahvista ne.",
        "group": "Ryhmä",
        "group-user": "käyttäjät",
        "rcfilters-activefilters": "Aktiiviset suodattimet",
        "rcfilters-activefilters-hide": "Piilota",
        "rcfilters-activefilters-show": "Näytä",
+       "rcfilters-activefilters-hide-tooltip": "Piilota Aktiiviset suodattimet -alue",
+       "rcfilters-activefilters-show-tooltip": "Näytä Aktiiviset suodattimet -alue",
        "rcfilters-advancedfilters": "Kehittyneet suodattimet",
        "rcfilters-limit-title": "Näytettävät tulokset",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|muutos|muutosta}}, $2",
        "rcfilters-preference-help": "Peruuttaa vuoden 2017 käyttöliittymän uudistuksen ja kaikki sen jälkeen lisätyt työkalut.",
        "rcfilters-watchlist-preference-label": "Piilota tarkkailulistan parannettu versio",
        "rcfilters-watchlist-preference-help": "Poistaa käytöstä vuoden 2017 ulkoasun uudistuksen ja kaikki sen jälkeen lisätyt työkalut.",
+       "rcfilters-filter-showlinkedfrom-label": "Näytä muutokset sivuilla, jonne on linkki sivulta",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>Sivut, joihin linkitetään</strong> valitulta sivulta",
+       "rcfilters-filter-showlinkedto-label": "Näytä muutokset sivuilla, joista on linkki sivulle",
        "rcfilters-filter-showlinkedto-option-label": "<strong>Sivut, jotka linkittävät</strong> valitulle sivulle",
        "rcfilters-target-page-placeholder": "Anna sivun nimi (tai luokka)",
        "rcnotefrom": "Alla ovat muutokset <strong>$3, $4</strong> lähtien. (Enintään <strong>$1</strong> näytetään.)",
        "upload-http-error": "HTTP-virhe: $1",
        "upload-copy-upload-invalid-domain": "Tiedostojen tallentamista tästä verkko-osoitteesta ei ole sallittu.",
        "upload-foreign-cant-upload": "Tätä wikiä ei ole konfiguroitu tallentamaan tiedostoja pyydettyyn ulkoiseen tiedostovarastoon.",
+       "upload-foreign-cant-load-config": "Ulkoisen tietovaraston tiedostotallennusten asetusten lataus epäonnistui.",
+       "upload-dialog-disabled": "Tätä lomaketta käyttävät tiedostojen tallennukset ovat poistettu käytöstä tästä wikistä.",
        "upload-dialog-title": "Tiedoston tallennus",
        "upload-dialog-button-cancel": "Peru",
        "upload-dialog-button-back": "Takaisin",
        "uploadstash-errclear": "Tiedostojen tyhjentäminen epäonnistui.",
        "uploadstash-refresh": "Päivitä tiedostoluettelo",
        "uploadstash-thumbnail": "näytä pienoiskuva",
+       "uploadstash-exception": "Tiedostoa ei kyetty säilömään latausmuistiin ($1): \"$2\"",
        "uploadstash-bad-path": "\nPolkua ei ole.",
        "uploadstash-bad-path-invalid": "Polku ei kelpaa.",
        "uploadstash-bad-path-unknown-type": "Tuntematon tyyppi \"$1\".",
+       "uploadstash-bad-path-unrecognized-thumb-name": "Tunnistamaton pienoiskuvan nimi.",
+       "uploadstash-bad-path-no-handler": "Tiedoston $2 MIME-tyypille $1 ei löytynyt käsittelijää.",
        "uploadstash-bad-path-bad-format": "Avain \"$1\" ei ole sopivassa muodossa.",
        "uploadstash-file-not-found": "Avainta \"$1\" ei löytynyt kätköstä.",
+       "uploadstash-file-not-found-no-thumb": "Pienoiskuvaa ei voitu saada.",
+       "uploadstash-file-not-found-no-local-path": "Skaalatulla kohteella ei ole paikallista polkua.",
        "uploadstash-file-not-found-no-object": "Ei voitu luoda paikallista tiedostokohdetta pienoiskuvalle.",
+       "uploadstash-file-not-found-no-remote-thumb": "Pienoiskuvan haku epäonnistui: $1\nURL = $2",
        "uploadstash-file-not-found-missing-content-type": "Puuttuva sisältötyypin ylätunniste",
+       "uploadstash-file-not-found-not-exists": "Polkua ei löytynyt, tai ei selkotiedosto.",
+       "uploadstash-file-too-large": "Yli $1 tavun kokoista tiedostoa ei voida käsitellä.",
        "uploadstash-not-logged-in": "Käyttäjää ei ole kirjautunut sisään, tiedostojen on kuuluttava käyttäjille.",
        "uploadstash-wrong-owner": "Tämä tiedosto ($1) ei kuulu nykyiselle käyttäjälle.",
        "uploadstash-no-such-key": "Ei tälläistä avainta ($1), ei voi poistaa.",
        "uploadnewversion-linktext": "Tallenna uusi versio tästä tiedostosta",
        "shared-repo-from": "kohteesta $1",
        "shared-repo": "yhteinen mediavarasto",
+       "filepage.css": "/* Tänne syötetty CSS-koodi sisältyy tiedoston kuvaussivulle sekä muunkielisille asiakaswikeille */",
        "upload-disallowed-here": "Et voi tallentaa uutta tiedostoa tämän tilalle.",
        "filerevert": "Tiedoston $1 palautus",
        "filerevert-legend": "Tiedoston palautus",
        "uncategorizedcategories": "Luokittelemattomat luokat",
        "uncategorizedimages": "Luokittelemattomat tiedostot",
        "uncategorizedtemplates": "Luokittelemattomat mallineet",
+       "uncategorized-categories-exceptionlist": "# Sisältää luettelon luokkia, joita ei tulisi mainita Special:UncategorizedCategories-sivulla. Yksi riviä kohden, alkaen \"*\"-merkillä. Muilla merkeillä alkavat rivit jätetään huomiotta. Käytä \"#\"-merkkiä kommenttien kirjoittamiseen.",
        "unusedcategories": "Käyttämättömät luokat",
        "unusedimages": "Käyttämättömät tiedostot",
        "wantedcategories": "Halutut luokat",
        "protectedtitles-summary": "Tällä sivulla on lueteltu ne sivut, jotka on tällä hetkellä suojattu uudelleenluonnilta. Nähdäksesi luettelon olemassaolevista suojatuista sivuista katso [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Ei suojattuja sivunimiä näillä hakuehdoilla.",
        "protectedtitles-submit": "Hae sivunimet",
-       "listusers": "Käyttäjien luettelo",
+       "listusers": "Käyttäjäluettelo",
        "listusers-editsonly": "Näytä vain käyttäjät, joilla on muokkauksia",
        "listusers-temporarygroupsonly": "Näytä vain väliaikaisten käyttäjäryhmien käyttäjät",
        "listusers-creationsort": "Lajittele tunnuksen luontipäivämäärän mukaan",
        "apisandbox-dynamic-parameters-add-label": "Lisää parametri:",
        "apisandbox-dynamic-parameters-add-placeholder": "Parametrin nimi",
        "apisandbox-dynamic-error-exists": "Parametri nimellä ”$1” on jo olemassa.",
+       "apisandbox-templated-parameter-reason": "Tämä [[Special:ApiHelp/main#main/templatedparams|mallineparametri]] tarjotaan kohteen $2 {{PLURAL:$1|arvon|arvojen}} pohjalta.",
        "apisandbox-deprecated-parameters": "Käytöstä poistuneet parametrit",
        "apisandbox-fetch-token": "Lisää token automaattisesti",
        "apisandbox-add-multi": "Lisää",
        "apisandbox-sending-request": "API-pyyntöä lähetetään...",
        "apisandbox-loading-results": "API-tuloksia vastaanotetaan...",
        "apisandbox-results-error": "Tapahtui virhe ladattaessa API-kyselyn vastausta: $1",
+       "apisandbox-results-login-suppressed": "Tämä pyyntö on käsitelty uloskirjautuneena käyttäjänä, sillä sitä voitaisiin käyttää selaimen Same-Origin-turvakeinon kiertämiseen. Huomioi, että API:n hiekkalaatikon automaattinen avaimen käsittely ei toimi oikein tämänkaltaisen pyyntöjen kanssa, joten sinun tulee täyttää ne käsin.",
+       "apisandbox-request-selectformat-label": "Näytä pyyntödata muodossa:",
        "apisandbox-request-format-url-label": "URL-kyselymerkkijono",
        "apisandbox-request-url-label": "Pyynnön URL",
        "apisandbox-request-json-label": "Pyydetty JSON:",
        "apisandbox-request-time": "Pyyntöön kulunut aika: {{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "Korjaa \"token\" ja lähetä uudelleen",
+       "apisandbox-results-fixtoken-fail": "\"$1\"-avaimen haku epäonnistui.",
        "apisandbox-alert-page": "Tällä sivulla olevat kentät eivät ole kelvollisia.",
        "apisandbox-alert-field": "Tässä kentässä oleva arvo ei ole kelvollinen.",
        "apisandbox-continue": "Jatka",
        "apisandbox-continue-clear": "Tyhjennä",
+       "apisandbox-continue-help": "{{int:apisandbox-continue}} [https://www.mediawiki.org/wiki/API:Query#Continuing_queries jatkaa] viimeistä pyyntöä; {{int:apisandbox-continue-clear}} nollaa jatkamisparametrit.",
        "apisandbox-param-limit": "Kirjoita <kbd>max</kbd> käyttääksesi ylärajaa.",
        "apisandbox-multivalue-all-namespaces": "$1 (Kaikki nimiavaruudet)",
        "apisandbox-multivalue-all-values": "$1 (Kaikki arvot)",
        "speciallogtitlelabel": "Kohde (sivu tai {{ns:user}}:käyttäjänimi):",
        "log": "Lokit",
        "logeventslist-submit": "Näytä",
-       "logeventslist-more-filters": "Lisää suodattimia:",
+       "logeventslist-more-filters": "Näytä lisää lokeja:",
        "logeventslist-patrol-log": "Partiointiloki",
        "logeventslist-tag-log": "Merkkausloki",
        "all-logs-page": "Kaikki julkiset lokit",
        "listgrouprights-namespaceprotection-namespace": "Nimiavaruus",
        "listgrouprights-namespaceprotection-restrictedto": "Käyttäjän muokkausoikeudet",
        "listgrants": "Toimintaoikeudet",
+       "listgrants-summary": "Alla on luettelo toimintaoikeuksista sekä niiden vastaavista pääsytavoista käyttäjäoikeuksiin. Käyttäjät voivat valtuuttaa sovelluksia käyttämään heidän tiliään rajoitetuin oikeuksien riippuen toimintaoikeuksista, jota käyttäjä on sovellukselle myöntänyt. Käyttäjän puolesta toimiva sovellus ei kuitenkaan voi käyttää oikeuksia, joita käyttäjällä ei ole.\nYksittäisistä oikeuksista saattaa olla saatavilla [[{{MediaWiki:Listgrouprights-helppage}}|lisätietoa]].",
        "listgrants-grant": "Toimintaoikeus (grant)",
        "listgrants-rights": "Oikeudet (rights)",
        "trackingcategories": "Tarkkailuluokat",
        "notvisiblerev": "Versio on poistettu",
        "watchlist-details": "Tarkkailulistallasi on {{PLURAL:$1|$1 sivu|$1 sivua}} (keskustelusivut mukaan lukien).",
        "wlheader-enotif": "Sähköposti-ilmoitus on käytössä.",
-       "wlheader-showupdated": "Sivut, joita on muokattu viimeisen käyntisi jälkeen, on '''lihavoitu'''.",
+       "wlheader-showupdated": "Sivut, joita on muokattu viimeisen käyntisi jälkeen, on <strong>lihavoitu</strong>.",
        "wlnote": "Alla {{PLURAL:$1|on viimeisin muutos|ovat viimeisimmät <strong>$1</strong> muutosta}} edellisen {{PLURAL:$2|tunnin|<strong>$2</strong> tunnin}} ajalta $3 kello $4 lukien.",
        "wlshowlast": "Näytä edelliset $1 tuntia tai $2 päivää",
        "watchlist-hide": "Piilota",
        "dellogpagetext": "Alla on loki viimeisimmistä poistoista.",
        "deletionlog": "poistoloki",
        "log-name-create": "Sivujen luonnin loki",
+       "log-description-create": "Alla on luettelo viimeisimmistä sivujen luonneista.",
        "logentry-create-create": "$1 {{GENDER:$2|loi}} sivun $3",
        "reverted": "Palautettu aikaisempaan versioon",
        "deletecomment": "Syy:",
        "contributions-userdoesnotexist": "Käyttäjätunnusta ”$1” ei ole rekisteröity.",
        "nocontribs": "Näihin ehtoihin sopivia muokkauksia ei löytynyt.",
        "uctop": "(uusin)",
-       "month": "Kuukausi",
+       "month": "Alkaen kuukaudesta (ja aiemmin):",
        "year": "Vuosi",
+       "date": "Alkaen päiväydestä (ja aiemmin):",
        "sp-contributions-newbies": "Näytä uusien tulokkaiden muutokset",
        "sp-contributions-newbies-sub": "Uusien käyttäjien muokkaukset",
        "sp-contributions-newbies-title": "Uusien käyttäjien muokkaukset",
        "import-mapping-subpage": "Tuonti seuraavan sivun alasivuiksi:",
        "import-upload-filename": "Tiedostonimi:",
        "import-upload-username-prefix": "Interwiki-etuliite:",
+       "import-assign-known-users": "Siirrä muokkaukset paikallisille käyttäjille, jos samanniminen käyttäjä on paikallisesti olemassa",
        "import-comment": "Kommentti:",
        "importtext": "Vie sivuja lähdewikistä käyttäen [[Special:Export|vientityökalua]].\nTallenna tiedot koneellesi ja tuo ne tällä sivulla.",
        "importstart": "Tuodaan sivuja...",
        "tooltip-pt-watchlist": "Lista sivuista, joiden muokkauksia tarkkailet",
        "tooltip-pt-mycontris": "Luettelo {{GENDER:|omista muokkauksistasi}}",
        "tooltip-pt-anoncontribs": "Luettelo tästä IP-osoitteesta tehdyistä muokkauksista",
-       "tooltip-pt-login": "Kirjaudu sisään tai luo tunnus",
+       "tooltip-pt-login": "On suositeltavaa kirjautua sisään. Se ei kuitenkaan ole pakollista.",
        "tooltip-pt-login-private": "Tämän wikin käyttö edellyttää kirjautumista",
        "tooltip-pt-logout": "Kirjaudu ulos",
        "tooltip-pt-createaccount": "On suositeltavaa luoda käyttäjätunnus ja kirjautua sisään. Se ei kuitenkaan ole pakollista.",
        "group-bot.css": "/* Tämä sivun tyylit muuttavat bottien tyylejä */",
        "group-sysop.css": "/* Tämä sivun tyylit muuttavat ylläpitäjien tyylejä */",
        "group-bureaucrat.css": "/* Tämä sivun tyylit muuttavat byrokraattien tyylejä */",
+       "common.json": "/* Tämän sivun JSON-koodi liitetään jokaiseen sivulataukseen */",
        "common.js": "/* Tämän sivun JavaScript-koodi liitetään jokaiseen sivulataukseen */",
        "group-autoconfirmed.js": "/* Tämän sivun JavaScript-koodi liitetään vain automaattisesti hyväksytyille käyttäjille */",
        "group-user.js": "/* Tämän sivun JavaScript ladataan vain rekisteröityneille käyttäjille */",
        "markedaspatrollederrornotify": "Tarkastetuksi merkitseminen epäonnistui.",
        "patrol-log-page": "Muutostentarkastusloki",
        "patrol-log-header": "Tämä on loki tarkastetuista muutoksista.",
-       "log-show-hide-patrol": "$1 muutostentarkastusloki",
-       "log-show-hide-tag": "$1 merkkausloki",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Merkitäänkö versio $3 kohdesivusta $2 partioiduksi?",
        "deletedrevision": "Poistettiin vanha versio $1",
        "exif-photometricinterpretation-1": "Mustavalkoinen (musta on 0)",
        "exif-photometricinterpretation-3": "Paletti",
        "exif-photometricinterpretation-4": "Läpinäkyvyysmaski",
+       "exif-photometricinterpretation-5": "Erotettu (luultavasti CMYK)",
        "exif-photometricinterpretation-9": "CIE L*a*b* (ICC-koodaus)",
        "exif-photometricinterpretation-10": "CIE L*a*b* (ITU-koodaus)",
        "exif-unknowndate": "Tuntematon päiväys",
        "version-entrypoints": "Aloituskohtien URL-osoitteet",
        "version-entrypoints-header-entrypoint": "Aloituskohta",
        "version-entrypoints-header-url": "URL",
+       "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Artikkelin polku]",
+       "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Skriptin polku]",
        "version-libraries": "Asennetut kirjastot",
        "version-libraries-library": "Kirjasto",
        "version-libraries-version": "Versio",
        "mw-widgets-usersmultiselect-placeholder": "Lisää enemmän...",
        "date-range-from": "Aloituspäivä:",
        "date-range-to": "Päättymispäivä:",
-       "sessionmanager-tie": "Cannot combine multiple request authentication types: $1.",
+       "sessionmanager-tie": "Monentyyppisiä kirjautumispyyntöjä ei voi yhdistää: $1.",
        "sessionprovider-generic": "$1 istuntoa",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "istuntoja, joissa on evästeet käytössä",
        "sessionprovider-nocookies": "Evästeet on voitu poistaa käytöstä. Varmista, että sinulla on evästeet käytössä ja yritä sitten uudelleen.",
        "unlinkaccounts-success": "Tunnuksen linkitys poistettiin.",
        "authenticationdatachange-ignored": "Varmennustietojen muutosta ei käsitelty. Ehkä palveluntarjoajaa ei määritelty?",
        "userjsispublic": "Huomio: JavaScript-alasivuilla ei tulisi olla luottamuksellisia tietoja, koska muut käyttäjät voivat nähdä ne.",
+       "userjsonispublic": "Huomio: JSON-alasivuilla ei tulisi olla luottamuksellisia tietoja, koska muut käyttäjät voivat nähdä ne.",
        "usercssispublic": "Huomio: CSS-alasivuilla ei tulisi olla luottamuksellisia tietoja, koska muut käyttäjät voivat nähdä ne.",
        "restrictionsfield-badip": "Virheellinen IP-osoite tai alue: $1",
        "restrictionsfield-label": "Sallitut IP-alueet:",
        "undelete-cantedit": "Et voi palauttaa tätä sivua, koska sinulla ei ole oikeutta muokata tätä sivua.",
        "undelete-cantcreate": "Et voi palauttaa tätä sivua, koska tällä nimellä ei ole olemassaolevaa sivua eikä sinulla ole oikeutta luoda tätä sivua.",
        "pagedata-title": "Sivudata",
+       "pagedata-text": "Tämä sivu tarjoaa datarajapinnan sivuihin. Syötä sivun otsikko URL-osoitteeseen käyttäen alasivusyntaksia.\n* Automaattisen kielivalinnan toiminta riippuu asiakasohjelman Accept-otsikkotiedosta. Tämä tarkoittaa sitä, että asiakasohjelma saa sivun tiedot haluamassaan muodossa.",
        "pagedata-not-acceptable": "Vastaavaa muotoa ei löytynyt. Tuetut MIME-tyypit: $1",
        "pagedata-bad-title": "Virheellinen otsikko: $1.",
+       "unregistered-user-config": "Turvallisuussyistä JavaScript-, CSS- ja JSON-käyttäjäalasivuja ei voi ladata rekisteröimättömiltä käyttäjiltä.",
        "passwordpolicies": "Salasanakäytännöt",
        "passwordpolicies-summary": "Tämä on luettelo käytössä olevista salasanakäytännöistä tämän wikin käyttäjäryhmille.",
        "passwordpolicies-group": "Ryhmä",
index 86e2160..af388a4 100644 (file)
        "markedaspatrollederrornotify": "Tað miseydnaðist at merkja sum eftirkannað.",
        "patrol-log-page": "Eftirlitsloggur",
        "patrol-log-header": "Hetta er ein loggur yvir patruljeraðum síðuversjónum.",
-       "log-show-hide-patrol": "$1 patrulleringsloggur",
        "deletedrevision": "Slettaði gamla síðuversjón $1",
        "filedeleteerror-short": "Feilur hendi við sletting av fílu: $1",
        "previousdiff": "← Eldri broytingar",
index ab015fa..723ab6d 100644 (file)
        "diff-paragraph-moved-toold": "Le paragraphe a été déplacé. Cliquez pour accéder à l'ancien emplacement.",
        "difference-missing-revision": "{{PLURAL:$2|Une révision|$2 révisions}} de cette différence ($1) {{PLURAL:$2|n’a pas été trouvée|n’ont pas été trouvées}}.\n\nCela survient en général en suivant un lien de différence désuet vers une page qui a été supprimée.\nVous pouvez trouver des détails dans le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} journal des suppressions].",
        "searchresults": "Résultats de la recherche",
+       "search-filter-title-prefix": "Recherche seulement des pages dont le titre commence par « $1 »",
+       "search-filter-title-prefix-reset": "Rechercher toutes les pages",
        "searchresults-title": "Résultats de recherche pour « $1 »",
        "titlematches": "Correspondances dans les titres des pages",
        "textmatches": "Correspondances dans le texte des pages",
        "speciallogtitlelabel": "Cible (titre ou {{ns:user}}:nom d'utilisateur) :",
        "log": "Journaux d’opérations",
        "logeventslist-submit": "Lister",
-       "logeventslist-more-filters": "Davantage de filtres:",
+       "logeventslist-more-filters": "Afficher des journaux supplémentaires :",
        "logeventslist-patrol-log": "Journal des relectures",
        "logeventslist-tag-log": "Journal des balises",
        "all-logs-page": "Tous les journaux publics",
        "markedaspatrollederrornotify": "Échec du marquage de la modification comme relue.",
        "patrol-log-page": "Journal des relectures",
        "patrol-log-header": "Voici l’historique des versions relues.",
-       "log-show-hide-patrol": "$1 l’historique des relectures",
-       "log-show-hide-tag": "$1 le journal des balises",
        "confirm-markpatrolled-button": "Valider",
        "confirm-markpatrolled-top": "Marquer la révision $3 de $2 comme relue ?",
        "deletedrevision": "Ancienne version $1 supprimée",
index 0057921..b10a3f6 100644 (file)
        "markedaspatrollederrornotify": "Falyita du marcâjo du changement coment gouardâ.",
        "patrol-log-page": "Jornâl de gouârda",
        "patrol-log-header": "Vê-que un jornâl de les vèrsions gouardâyes.",
-       "log-show-hide-patrol": "$1 lo jornâl de gouârda",
-       "log-show-hide-tag": "$1 lo jornâl de les balises",
        "deletedrevision": "Vielye vèrsion $1 suprimâye",
        "filedeleteerror-short": "Fôta pendent la suprèssion du fichiér : $1",
        "filedeleteerror-long": "Des fôtes sont étâyes rencontrâyes pendent la suprèssion du fichiér :\n\n$1",
index b69d49c..dffd28b 100644 (file)
        "markedaspatrollederrornotify": "Det werjuun küd ei üs kontroliaret kääntiakent wurd.",
        "patrol-log-page": "Kontrol-logbuk",
        "patrol-log-header": "Det as det kontrol-logbuk.",
-       "log-show-hide-patrol": "Kontrol-logbuk $1",
-       "log-show-hide-tag": "Markiarang-logbuk $1",
        "deletedrevision": "Ual werjuun $1 stregen",
        "filedeleteerror-short": "Bi't striken faan det datei $1 as wat skiaf gingen.",
        "filedeleteerror-long": "Bi't striken faan det datei as wat skiaf gingen:\n\n$1",
index 0747907..703d080 100644 (file)
        "rcpatroldisabled": "Mhíchumasaíodh Patról na n-Athruithe is Déanaí",
        "rcpatroldisabledtext": "Tá an tréith Patról na n-Athruithe is Déanaí míchumasaithe faoi láthair.",
        "patrol-log-page": "Log phatról",
-       "log-show-hide-patrol": "$1 log phatról",
        "deletedrevision": "Scriosadh an seanleagan $1",
        "filedeleteerror-short": "Earráid comhad a scriosadh: $1",
        "previousdiff": "← Gabh chuig an difear roimhe seo",
index e1f8fc2..6ebfeab 100644 (file)
        "botpasswords-created-body": "Chaidh am facal-faire bot airson a’ bhot air a bheil “$1” aig a’ chleachdaiche “$2” a chruthachadh.",
        "botpasswords-updated-title": "Chaidh am facal-faire bot ùrachadh",
        "resetpass_forbidden": "Cha ghabh na faclan-faire atharrachadh",
+       "resetpass_forbidden-reason": "Cha ghabh na faclan-faire atharrachadh: $1",
        "resetpass-no-info": "Feumaidh tu logadh a-steach mus dèan thu inntrigeadh dìreach dhan duilleag seo.",
        "resetpass-submit-loggedin": "Atharraich am facal-faire",
        "resetpass-submit-cancel": "Sguir dheth",
        "resetpass-temp-password": "Facal-faire sealach:",
        "resetpass-abort-generic": "Chuir leudachan crìoch air atharrachadh an fhacail-fhaire.",
        "resetpass-expired": "Dh'fhalbh an ùine air an fhacal-fhaire agad. Suidhich facal-faire ùr airson logadh a-steach.",
-       "resetpass-expired-soft": "Dh'fhalbh an ùine air an fhacal-fhaire agad is feumaidh tu ath-shuidheachadh. Tagh fear ùr no briog air \"{{int:authprovider-resetpass-skip-label}}\" gus ath-shuidheachadh às a dhèidh seo.",
-       "resetpass-validity-soft": "Chan eil am facal-faire seo dligheach: $1\n\nTagh facal-faire ùr an-dràsta no briog air \"{{int:authprovider-resetpass-skip-label}}\" gus ath-shuidheachadh às a dhèidh seo.",
+       "resetpass-expired-soft": "Dh'fhalbh an ùine air an fhacal-fhaire agad is feumaidh tu atharrachadh. Tagh fear ùr no briog air “{{int:authprovider-resetpass-skip-label}}” gus atharrachadh às a dhèidh seo.",
+       "resetpass-validity-soft": "Chan eil am facal-faire seo dligheach: $1\n\nTagh facal-faire ùr an-dràsta no briog air “{{int:authprovider-resetpass-skip-label}}” gus atharrachadh às a dhèidh seo.",
        "passwordreset": "Ath-shuidhich am facal-faire",
        "passwordreset-text-one": "Lìon am foirm seo gus am facal-faire agad ath-shuidheachadh.",
        "passwordreset-text-many": "Lìon {{PLURAL:$1|an raon|aon dhe na raointean}} gus facal-faire sealach fhaighinn air a' phost-d.",
        "passwordreset-emailtext-user": "Dh'iarr an cleachdaiche $1 air {{SITENAME}} ath-shuidheachadh an fhacail-fhaire air {{SITENAME}} ($4). Tha {{PLURAL:$3|an cunntas-cleachdaiche|na cunntasan-cleachdaiche}} a leanas co-cheangailte ris an t-seòladh puist-d seo:\n\n$2\n\nFalbhaidh an ùine air {{PLURAL:$3|an fhacal-fhaire shealach|na faclan-faire sealach}} seo an ceann $5 {{PLURAL:$5|latha|latha|làithean|latha}}.\nBu chòir dhut logadh a-steach agus facal-faire ùr a thaghadh an-dràsta. Ma dh'iarr cuideigin eile seo no ma chuimhnich thu air an fhacal-fhaire agad 's mur eil thu airson atharrachadh tuilleadh, leig seachad an teachdaireachd seo 's lean ort leis an t-seann fhacal-fhaire.",
        "passwordreset-emailelement": "Ainm-cleachdaiche: \n$1\n\nFacal-faire sealach: \n$2",
        "passwordreset-emailsentemail": "Ma tha am post-d seo co-cheangailte ris a’ chunntas agad, thèid post-d airson ath-shuidheachadh an fhacail-fhaire a chur.",
+       "passwordreset-emailsentusername": "Ma tha post-d co-cheangailte ris an ainm-chleachdaiche seo, thèid post-d airson ath-shuidheachadh an fhacail-fhaire a chur.",
+       "passwordreset-nocaller": "Feumaidh tu gairmear a chur ann",
+       "passwordreset-nosuchcaller": "Chan eil an gairmear seo ann: $1",
+       "passwordreset-ignored": "Cha b’ urrainn dhuinn ath-shuidheachadh an fhacail-fhaire a làimhseachadh. Dh’fhaoidte nach deach solaraiche a rèiteachadh.",
+       "passwordreset-invalidemail": "Seòladh puist-d mì-dhligheach",
+       "passwordreset-nodata": "Cha deach ainm-cleachdaiche no seòladh puist-d a thoirt seachad",
        "changeemail": "Atharraich no thoir air falbh an seòladh puist-d",
        "changeemail-header": "Lìon am foirm seo a dh’atharrachadh an t-seòlaidh phuist-d agad. Ma tha thu airson an co-cheangal eadar post-d sam bith is an cunntas agad a thoirt air falbh, fàg an seòladh ùr bàn nuair a chuireas tu am foirm.",
        "changeemail-no-info": "Feumaidh tu logadh a-steach mus dèan thu inntrigeadh dìreach dhan duilleag seo.",
        "changeemail-password": "Am facal-faire agad air {{SITENAME}}:",
        "changeemail-submit": "Atharraich am post-d",
        "changeemail-throttled": "Dh'fheuch thu ri logadh a-steach ro thric.\nFuirich ort $1 mus feuch thu ris a-rithist.",
+       "changeemail-nochange": "Cuir a-steach post-d ùr eile.",
        "resettokens": "Ath-shuidhich na tòcanan",
        "resettokens-text": "'S urrainn dhut tòcanan ath-shuidheachadh a bheir cothrom dhut air cuid a dhàta prìobhaideach a tha co-cheangailte ris a' chunntas agad.\n\nBu chòir dhut seo a dhèanamh ma thug thu do chuideigin e air mhearachd no ma bhris cuideigin a-steach air a' chunntas agad.",
        "resettokens-no-tokens": "Chan eil tòcan ann a ghabhas ath-shuidheachadh.",
        "savechanges": "Sàbhail na dh’atharraich thu",
        "publishpage": "Foillsich an duilleag",
        "publishchanges": "Foillsich na mùthaidhean",
+       "savearticle-start": "Sàbhail an duilleag...",
+       "savechanges-start": "Sàbhail na h-atharraichean...",
+       "publishpage-start": "Foillsich an duilleag...",
+       "publishchanges-start": "Foillsich na mùthaidhean...",
        "preview": "Ro-shealladh",
        "showpreview": "Seall an ro-shealladh",
        "showdiff": "Seall na mùthaidhean",
        "anonpreviewwarning": "<em>Chan eil thu air logadh a-steach. Ma nì thu sàbhaladh, thèid an seòladh IP agad a chlàradh ann an eachdraidh deasachadh na duilleige seo.</em>",
        "missingsummary": "<strong>Cuimhnich:</strong> Cha dug thu seachad gearr-chunntas air na dh'atharraich thu.\nMa bhriogas tu air \"$1\" a-rithist, thèid na dheasaich thu a shàbhaladh as aonais gearr-chunntais.",
        "selfredirect": "<strong>Rabhadh:</strong> Tha thu ag ath-stiùireadh duilleag dha fhèin.\nDh'fhaoidte gun do shònraich thu an t-amas cearr airson an ath-stiùiridh no gu bheil thu a' deasachadh an duilleag cearr.\nMa nì thu briogadh air \"$1\" a-rithist,m thèid an ath-stiùireadh a chruthachadh co-dhiù.",
-       "missingcommenttext": "Cuir a-steach beachd gu h-ìosal.",
+       "missingcommenttext": "Cuir a-steach beachd.",
        "missingcommentheader": "<strong>Cuimhnich:</strong> Cha dug thu seachad cuspair airson a’ bheachd seo.\nMa bhriogas tu air “$1” a-rithist, thèid na dheasaich thu a shàbhaladh as aonais.",
-       "summary-preview": "Ro-shealladh a' ghearr-chunntais:",
+       "summary-preview": "Ro-shealladh gearr-chunntas an deasachaidh:",
        "subject-preview": "Ro-shealladh a’ chuspair:",
+       "previewerrortext": "Thachair mearachd fhad ’s a bha sinn airson ro-shealladh nan atharraichean a shealltainn dhut.",
        "blockedtitle": "Tha an cleachdair air a bhacadh",
-       "blockedtext": "<strong>Chaidh an t-ainm-cleachdaiche no an seòladh IP agad a bhacadh.</strong>\n\n'S e $1 a chur am bacadh seo ort.\n{{GENDER:$1|Thug e|Thug i|Thugadh}} an cèill gun do {{GENDER:$1|rinn e|rinn i|rinneadh}} sin air sgàth an adhbhair seo: <em>$2</em>.\n\n* Toiseach a' bhacaidh: $8\n* Deireadh a' bhacaidh: $6\n* An neach air a bheil am bacadh: $7\n\n'S urrainn dhut fios a chur gu $1 no [[{{MediaWiki:Grouppage-sysop}}|rianair]] eile gus am bacadh seo a dheasbad.\nChan urrainn dhut am feart \"Cuir post-d dhan chleachdaiche seo\" a chleachdadh ach ma tha seòladh puist-d dligheach ann an [[Special:Preferences|roghainnean a' chunntais agad]] agus mura deach bacadh a chur air a chleachdadh.\n'S e $3 an seòladh IP làithreach agus agus 's e #$5 ID a' bhacaidh.\nThoir iomradh air a' mhion-fhiosrachadh gu h-àrd ma chuireas tu ceist sam bith mu dhèidhinn.",
+       "blockedtext": "<strong>Chaidh an t-ainm-cleachdaiche no an seòladh IP agad a bhacadh.</strong>\n\n’S e $1 a chur am bacadh seo ort.\n’S e “<em>$2</em>” an t-adbhar a thug iad.\n\n* Toiseach a’ bhacaidh: $8\n* Deireadh a’ bhacaidh: $6\n* An neach air a bheil am bacadh: $7\n\n’S urrainn dhut fios a chur gu $1 no [[{{MediaWiki:Grouppage-sysop}}|rianaire]] eile gus am bacadh seo a dheasbad.\nChan urrainn dhut an gleus “Cuir post-d dhan chleachdaiche seo” a chleachdadh ach ma tha seòladh puist-d dligheach ann an [[Special:Preferences|roghainnean a’ chunntais agad]] agus mura deach bacadh a chur air a chleachdadh.\n’S e $3 an seòladh IP làithreach agus agus ’s e #$5 ID a’ bhacaidh.\nThoir iomradh air a’ mhion-fhiosrachadh gu h-àrd ma chuireas tu ceist sam bith mu dhèidhinn.",
        "autoblockedtext": "Chaidh an seòladh IP agad a bhacadh gu fèin-obrachail a chionn 's gun deach a chleachdadh le cuideigin eile a chaidh a bhacadh le $1.\n{{GENDER:$1|Thug e|Thug i|Thugadh}} an cèill gun do {{GENDER:$1|rinn e|rinn i|rinneadh}} sin air sgàth an adhbhair seo: \n\n:<em>$2</em>.\n\n* Toiseach a' bhacaidh: $8\n* Deireadh a' bhacaidh: $6\n* An neach air a bheil am bacadh: $7\n\n'S urrainn dhut fios a chur gu $1 no [[{{MediaWiki:Grouppage-sysop}}|rianair]] eile gus am bacadh seo a dheasbad.\n\nDh'fhaoidte nach urrainn dhut am feart \"Cuir post-d dhan chleachdaiche seo\" a chleachdadh ach ma tha seòladh puist-d dligheach ann an [[Special:Preferences|roghainnean a' chunntais agad]] agus mura deach bacadh a chur air a chleachdadh.\n\n'S e $3 an seòladh IP làithreach agus agus 's e #$5 ID a' bhacaidh.\nThoir iomradh air a' mhion-fhiosrachadh gu h-àrd ma chuireas tu ceist sam bith mu dhèidhinn.",
        "blockednoreason": "cha deach adhbhar a shònrachadh",
        "whitelistedittext": "Feumaidh tu $1 mus urrainn dhut duilleagan a dheasachadh.",
        "recentchanges-legend-heading": "<strong>Treòir:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (faic [[Special:NewPages|liosta nan duilleagan ùra]] cuideachd)",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
+       "rcfilters-legend-heading": "<strong>Liosta nan giorrachaidhean:</strong>",
+       "rcfilters-activefilters": "Criathragan gnìomhach",
+       "rcfilters-activefilters-hide": "Falaich",
+       "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}}, $2",
+       "rcfilters-days-show-days": "$1 {{PLURAL:$1|latha|latha|làithean|latha}}",
+       "rcfilters-quickfilters": "Criathragan air an sàbhaladh",
+       "rcfilters-quickfilters-placeholder-title": "Cha do shàbhail thu criathrag fhathast",
+       "rcfilters-quickfilters-placeholder-description": "Gus roghainnean nan criathragan agad a shàbhaladh is an cleachdadh às ùr uaireigin eile, briog air ìomhaigheag a’ chomharra-lìn ann an raon na criathraige bheò gu h-ìosal.",
+       "rcfilters-savedqueries-defaultlabel": "Criathragan air an sàbhaladh",
+       "rcfilters-search-placeholder": "Criathraich na h-atharraichean (cleachd an clàr-taice no lorg ainm criathraige)",
+       "rcfilters-filterlist-whatsthis": "Ciamar a dh’obraicheas iad seo?",
+       "rcfilters-highlightbutton-title": "Soillsich toraidhean",
+       "rcfilters-filterlist-noresults": "Cha do lorg sinn criathrag",
+       "rcfilters-filtergroup-userExpLevel": "Clàradh is eòlas a’ chleachdaiche",
+       "rcfilters-filter-user-experience-level-registered-label": "Air clàradh a-steach",
+       "rcfilters-filter-user-experience-level-unregistered-label": "Gun chlàradh a-steach",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Deasaichean a chlàraich a-steach ach a rinn nas lugha na 10 deasachaidhean no aig a bheil nas lugha na 4 làithean de ghnìomhachd.",
+       "rcfilters-filter-user-experience-level-learner-description": "Deasaichean a rinn clàradh a-steach is aig a bheil eòlas eadar feadhainn air ùr-thighinn is feadhainn shàr-eòlach.",
+       "rcfilters-filter-user-experience-level-experienced-description": "Deasaichean a chlàraich a-steach ach a rinn barrachd air 500 deasachadh is aig a bheil barrachd air 30 latha de ghnìomhachd.",
+       "rcfilters-filtergroup-watchlistactivity": "Gnìomhachd a’ chlàir-fhaire",
+       "rcfilters-filter-watchlistactivity-unseen-label": "Atharraichean gun choimhead",
+       "rcfilters-filter-watchlistactivity-unseen-description": "Atharraichean air duilleagan air nach do thadhail thu on a chaidh an atharrachadh.",
+       "rcfilters-filter-watchlistactivity-seen-label": "Atharraichean air coimhead",
+       "rcfilters-filter-watchlistactivity-seen-description": "Atharraichean air duilleagan air an do thadhail thu on a chaidh an atharrachadh.",
+       "rcfilters-filter-pageedits-label": "Deasachadh duilleige",
+       "rcfilters-filter-newpages-label": "Cruthachadh duilleige",
+       "rcfilters-filter-newpages-description": "Deasachadh a chruthaich duilleag ùr.",
+       "rcfilters-filter-logactions-label": "Gnìomhan logaichte",
+       "rcfilters-filtergroup-lastRevision": "Na mùthaidhean as ùire",
+       "rcfilters-filter-lastrevision-description": "Dìreach an t-àtharrachadh as ùire air duilleag.",
+       "rcfilters-liveupdates-button": "Ùrachadh beò",
+       "rcfilters-liveupdates-button-title-off": "Seall atharraichean ùra fhad ’s a thathar gan dèanamh",
+       "rcfilters-watchlist-markseen-button": "Comharraich gun dug thu sùil air gach atharrachadh",
+       "rcfilters-watchlist-edit-watchlist-button": "Deasaich liosta nan duilleagan air a’ chlàr-fhaire agad",
        "rcnotefrom": "Chì thu {{PLURAL:$5|am mùthadh|na mùthaidhean|na mùthaidhean|na mùthaidhean}} o <strong>$3 $4</strong> (gu ruige <strong>$1</strong> dhiubh) gu h-ìosal.",
        "rclistfrom": "Seall na mùthaidhean ùra a-mach o $3 $2",
        "rcshowhideminor": "$1 mùthaidhean beaga",
        "rcshowhidemine": "$1 na mùthaidhean agam",
        "rcshowhidemine-show": "Seall",
        "rcshowhidemine-hide": "Falaich",
+       "rcshowhidecategorization-hide": "Falaich",
        "rclinks": "Seall {{PLURAL:$1|an $1 mhùthadh|an $1 mhùthadh|na $1 mùthaidhean|am $1 mùthadh}} mu dheireadh thairis air {{PLURAL:$2|an $2 latha|an $2 latha|na $2 làithean|am $2 latha}} mu dheireadh",
        "diff": "diofar",
        "hist": "eachdr",
        "recentchangeslinked-feed": "Mùthaidhean buntainneach",
        "recentchangeslinked-toolbox": "Mùthaidhean buntainneach",
        "recentchangeslinked-title": "Mùthaidhean co-cheangailte ri \"$1\"",
-       "recentchangeslinked-summary": "Seo liosta nam mùthaidhean a chaidh a chur air duilleagan a tha a' ceangal o dhuilleag shònraichte (no ri buill ann an roinn-seòrsa sònraichte).\nTha duilleagan air a' [[Special:Watchlist|chlàr-fhaire]] agad ann an litrichean <strong>troma</strong>.",
+       "recentchangeslinked-summary": "Cuir a-steach ainm duilleige airson atharraichean fhaicinn air duilleagan a tha a’ ceangal ris an duilleag ud no uaipe. (Airson buill de roinn-seòrsa fhaicinn, cuir a-steach {{ns:category}}:Ainm roinn-seòrsa). Tha atharraichean air duilleagan a tha air a’ [[Special:Watchlist|chlàr-fhaire]] agad ann an clò <strong>trom</strong>.",
        "recentchangeslinked-page": "Ainm na duilleige:",
        "recentchangeslinked-to": "Seall mùthaidhean nan duilleagan a tha a' ceangal ris an duilleag sin 'na àite",
        "upload": "Luchdaich suas faidhle",
        "deadendpages": "Duilleagan cùile-dùinte",
        "deadendpagestext": "Cha dèan na duilleagan seo ceangal gu duilleag sam bith eile air {{SITENAME}}.",
        "protectedpages": "Duilleagan fo dhìon",
+       "protectedpages-filters": "Criathragan:",
        "protectedpages-indef": "Dìonan buana a-mhàin",
        "protectedpages-summary": "Chì thu na duilleagan a tha ann 's gan dìon an-seo. Faic [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]] airson liosta dhe na tiotalan a tha 'gan dìon o chruthachadh.",
        "protectedpages-cascade": "Dìonan o bhith mar eas a-mhàin",
        "unwatchthispage": "Na cum sùil tuilleadh",
        "notanarticle": "Chan e duilleag susbaint a tha ann",
        "notvisiblerev": "Chaidh am mùthadh mu dheireadh le cleachdaiche eile a sguabadh às",
-       "watchlist-details": "Tha {{PLURAL:$1|$1 duilleag|$1 dhuilleag|$1 duilleagan|$1 duilleag}} air a' chlàr-fhaire agad, gun luaidh air na duilleagan deasbaireachd.",
+       "watchlist-details": "Tha {{PLURAL:$1|$1 duilleag|$1 dhuilleag|$1 duilleagan|$1 duilleag}} air a’ chlàr-fhaire agad (agus duilleagan deasbaireachd a bharrachd air sin).",
        "wlheader-enotif": "Tha brathan-naidheachd air a' phost-d an comas.",
        "wlheader-showupdated": "Tha clò <strong>trom</strong> air duilleagan a chaidh atharrachadh on turas mu dheireadh a thadhail thu orra.",
        "wlnote": "Chì thu gu h-ìosal {{PLURAL:$1|a' $1 mhùthadh|an $1 mhùthadh|na $1 mùthaidhean|am $1 mùthadh}} mu dheireadh san {{PLURAL:$2|$2 uair a thìde|$2 uair a thìde|$2 uairean a thìde|$2 uair a thìde}} mu dheireadh, mar a bha e $3, $4.",
        "wlshowlast": "Seall na $1 uairean a thìde mu dheireadh $2 làithean mu dheireadh",
+       "watchlist-hide": "Falaich",
        "watchlist-options": "Roghainnean mo chlàir-faire",
        "watching": "'Ga chur air a' chlàr-fhaire...",
        "unwatching": "A' toirt far a' chlàir-fhaire...",
        "markedaspatrollederrornotify": "Cha b' urrainn dhuinn comharra freiceadain a chur ris.",
        "patrol-log-page": "Loga nam freiceadan",
        "patrol-log-header": "Seo loga nam mùthaidhean le comharra freiceadain riutha.",
-       "log-show-hide-patrol": "$1 loga nam freiceadan",
        "deletedrevision": "Chaidh an seann mhùthadh $1 a sguabadh às",
        "filedeleteerror-short": "Mearachd a' sguabadh às an fhaidhle: $1",
        "filedeleteerror-long": "Thachair mearachd le sguabadh às an fhaidhle:\n\n$1",
index 71d62a2..13e7581 100644 (file)
        "expansion-depth-exceeded-warning": "A páxina supera a profundidade de expansión",
        "parser-unstrip-loop-warning": "Detectouse un bucle inamovible",
        "unstrip-depth-warning": "Excedeuse o límite de recursión inamovible ($1)",
+       "unstrip-depth-category": "Páxinas nas que se excede o límite de profundidade de eliminación de etiquetas",
+       "unstrip-size-warning": "Límite de profundidade de eliminación de etiquetas superado ($1)",
+       "unstrip-size-category": "Páxinas nas que se excede o límite de tamaño de eliminación de etiquetas",
        "converter-manual-rule-error": "Detectouse un erro na regra manual de conversión da lingua",
        "undo-success": "A edición pódese desfacer.\nComprobe a comparación que aparece a continuación para confirmar que isto é o que desexa facer; despois, garde os cambios para desfacer a edición.",
        "undo-failure": "Non se pode desfacer a edición debido a un conflito con algunha das edicións intermedias.",
        "rcfilters-watchlist-showupdated": "Os cambios feitos en páxinas que non visitou dende que se efectuaron aparecen en <strong>grosas</strong>, acompañados de marcadores sólidos.",
        "rcfilters-preference-label": "Ocultar a versión mellorada de cambios recentes",
        "rcfilters-preference-help": "Reverte o redeseño da interface de 2017 e tódalas ferramentas engadidas dende entón.",
+       "rcfilters-watchlist-preference-label": "Agochar a versión mellorada da lista de vixiancia",
        "rcfilters-filter-showlinkedfrom-label": "Amosar os cambios en páxinas ligadas desde",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>Páxinas ligadas desde</strong> a páxina seleccionada",
        "rcfilters-filter-showlinkedto-label": "Amosar os cambios en páxinas que ligan con",
        "log": "Rexistros",
        "logeventslist-submit": "Amosar",
        "logeventslist-more-filters": "Máis filtros:",
+       "logeventslist-patrol-log": "Rexistro de patrullas",
+       "logeventslist-tag-log": "Rexistro de etiquetas",
        "all-logs-page": "Todos os rexistros públicos",
        "alllogstext": "Vista combinada de todos os rexistros dipoñibles en {{SITENAME}}.\nPode precisar máis a vista seleccionando o tipo de rexistro, o nome do usuario ou o título da páxina afectada.",
        "logempty": "Non se atopou ningún elemento relacionado no rexistro.",
        "uctop": "(última revisión)",
        "month": "Desde o mes de (e anteriores):",
        "year": "Desde o ano (e anteriores):",
+       "date": "Dende a data (e anteriores):",
        "sp-contributions-newbies": "Mostrar só as contribucións das contas de usuario novas",
        "sp-contributions-newbies-sub": "Contribucións dos usuarios novos",
        "sp-contributions-newbies-title": "Contribucións dos usuarios novos",
        "group-bot.css": "/* O CSS que se coloque aquí afectará soamente aos bots */",
        "group-sysop.css": "/* O CSS que se coloque aquí afectará soamente aos administradores */",
        "group-bureaucrat.css": "/* O CSS que se coloque aquí afectará soamente aos burócratas */",
+       "common.json": "/* Calquera JSON que haxa aquí será cargado para todos os usuarios en tódalas cargas de páxinas. */",
        "common.js": "/* Calquera JavaScript que haxa aquí será cargado para todos os usuarios en cada páxina que vexan. */",
        "group-autoconfirmed.js": "/* Calquera JavaScript que haxa aquí será cargado soamente para os usuarios autoconfirmados */",
        "group-user.js": "/* Calquera código JavaScript escrito aquí cargarase para tódolos usuarios rexistrados */",
        "markedaspatrollederrornotify": "Erro ao marcar como revisada.",
        "patrol-log-page": "Rexistro de revisións patrulladas",
        "patrol-log-header": "Este é un rexistro das revisións patrulladas.",
-       "log-show-hide-patrol": "$1 o rexistro de patrullas",
-       "log-show-hide-tag": "$1 o rexistro de etiquetas",
        "confirm-markpatrolled-button": "Aceptar",
        "confirm-markpatrolled-top": "Quere marcar a revisión $3 de \"$2\" como patrullada?",
        "deletedrevision": "Revisión vella e borrada de \"$1\"",
index 494289f..4b224c2 100644 (file)
        "markedaspatrollederrortext": "Δεῖ σε ὁρίσειν ἀναθεώρησιν τινὰ ἵνα σεσημασμένη αὕτη ᾖ ὡς περιπολουμένη.",
        "patrol-log-page": "Κατάλογος περιπόλων",
        "patrol-log-header": "Ὅδε ἐστὶ κατάλογος περιπολουμένων ἀναθεωρήσεων.",
-       "log-show-hide-patrol": "$1 κατάλογος περιπόλου",
        "deletedrevision": "Προτέρα ἔκδοσις διαγραφεῖσα $1",
        "filedeleteerror-short": "Ἀρχεῖον διαγράφον σφάλματα: $1",
        "filedeleteerror-long": "Σφάλματα ἀπαντἠθησαν ἐν τῷ διαγράφειν τὸ ἀρχεῖον:\n\n$1",
index b907454..7554e12 100644 (file)
        "markedaspatrollederrornotify": "D Markierig als kontrolliert isch nid glunge.",
        "patrol-log-page": "Kontroll-Logbuech",
        "patrol-log-header": "Des isch s Kontroll-Logbuech.",
-       "log-show-hide-patrol": "Kontroll-Logbuech $1",
-       "log-show-hide-tag": "Markierigs-Logbuech $1",
        "deletedrevision": "alti Version: $1",
        "filedeleteerror-short": "Fähler bi dr Datei-Leschig: $1",
        "filedeleteerror-long": "Bi dr Datei-Leschig sin Fähler feschtgstellt wore:\n\n$1",
index eaa92e2..d5d9435 100644 (file)
        "markedaspatrollederror-noautopatrol": "તમે તમારા પોતાના ફેરફારોને નીરીક્ષિત અંકિત ન કરી શકો",
        "patrol-log-page": "ચકાસણી લોગ",
        "patrol-log-header": "આ નીરીક્ષિત ફેરફાઓનો લોગ છે",
-       "log-show-hide-patrol": "$1 ચકાસણી લોગ",
        "deletedrevision": "જુના સુધારા ભૂસો $1",
        "filedeleteerror-short": "ફાઇલ : $1 ભૂંસવામાં તૃટિ",
        "filedeleteerror-long": "$1 આ ફાઈલ ભૂંસતી વખતે ચૂક થઈ",
index d617622..66fc366 100644 (file)
        "markedaspatrollederrornotify": "סימון השינוי כבדוק נכשל.",
        "patrol-log-page": "יומן שינויים בדוקים",
        "patrol-log-header": "יומן זה מציג גרסאות שנבדקו.",
-       "log-show-hide-patrol": "$1 יומן שינויים בדוקים",
-       "log-show-hide-tag": "$1 יומן תגיות",
        "confirm-markpatrolled-button": "אישור",
        "confirm-markpatrolled-top": "לסמן את גרסה $3 בדף $2 כבדוקה?",
        "deletedrevision": "מחיקת גרסה ישנה ($1)",
index 62b8ba6..d290292 100644 (file)
        "markedaspatrollederrornotify": "जाँचा हुआ चिन्हित करना असफल रहा।",
        "patrol-log-page": "परीक्षण लॉग",
        "patrol-log-header": "यह परीक्षित अवतरणों की लॉग है।",
-       "log-show-hide-patrol": "परीक्षण लॉग $1",
-       "log-show-hide-tag": "$1 टैग लॉग",
        "confirm-markpatrolled-button": "ठीक है",
        "confirm-markpatrolled-top": "$2 के $3 संशोधन को परीक्षित चिन्ह्नत करे?",
        "deletedrevision": "पुराना अवतरण $1 हटा दिया",
index abd9720..bce4509 100644 (file)
        "markedaspatrollederrornotify": "Patrolled mark kare ke kosis fail hoe gais hae.",
        "patrol-log-page": "Pahraa de waala suchi",
        "patrol-log-header": "Ii pahraa dewa gais badlao ke suchi hai.",
-       "log-show-hide-patrol": "$1 pahraa de waala suchi",
-       "log-show-hide-tag": "$1 tag log",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Mark karo ki ii revision $3 of $2 patrolled hai?",
        "deletedrevision": "Purana badlao ke mitae dia hai $1",
index 013c0b1..ccdca67 100644 (file)
        "markedaspatrollederrornotify": "Označavanje stranice pregledanom nije uspjelo.",
        "patrol-log-page": "Evidencija ophodnji i samoophodnji",
        "patrol-log-header": "Ovo su evidencije ophođenih izmjena.",
-       "log-show-hide-patrol": "$1 evidenciju ophodnji",
-       "log-show-hide-tag": "$1 evidenciju oznaka",
        "confirm-markpatrolled-button": "U redu",
        "confirm-markpatrolled-top": "Označiti izmjenu $3 stranice $2 pregledanom?",
        "deletedrevision": "izbrisana stara inačica $1",
index 4290382..8b28e9f 100644 (file)
        "markedaspatrollederrornotify": "Der Versuch, die Version als wie kontrolliert se markiere, ist fehlgeschlooht.",
        "patrol-log-page": "Kontroll-Logbuch",
        "patrol-log-header": "Das ist das Kontroll-Logbuch.",
-       "log-show-hide-patrol": "Kontroll-Logbuch $1",
        "deletedrevision": "alte Version $1 abgewischt",
        "filedeleteerror-short": "Fehler bei Datei-Abwäsch: $1",
        "filedeleteerror-long": "Bei der Datei-Abwischung woorre Fehler festgestellt:\n\n$1",
index 814ac0d..f979761 100644 (file)
        "markedaspatrollederrornotify": "Markěrowanje jako dohladowane je so njeporadźiło.",
        "patrol-log-page": "Protokol přepruwowanjow",
        "patrol-log-header": "To je protokol dohladowanych wersijow.",
-       "log-show-hide-patrol": "Protokol dohladowanja $1",
-       "log-show-hide-tag": "Protokol markěrowanjow $1",
        "confirm-markpatrolled-button": "W porjadku",
        "confirm-markpatrolled-top": "Wersiju $3 strony $2 jako přehladowanu markěrować?",
        "deletedrevision": "Stara wersija $1 wušmórnjena",
index 97848de..a21edc9 100644 (file)
        "markedaspatrollederrornotify": "Nem sikerült ellenőrzöttnek jelölni.",
        "patrol-log-page": "Ellenőrzési napló (patrol)",
        "patrol-log-header": "Ez az ellenőrzött változatok naplója.",
-       "log-show-hide-patrol": "járőrnapló $1",
-       "log-show-hide-tag": "címkenapló $1",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Ellenőrzöttnek jelölöd a(z) $2 lap $3 változatát?",
        "deletedrevision": "Régebbi változat törölve: $1",
index 9eed78c..48828ae 100644 (file)
        "markedaspatrollederrornotify": "Le marcar como patruliate ha fallite.",
        "patrol-log-page": "Registro de patrulia",
        "patrol-log-header": "Isto es un registro de versiones patruliate.",
-       "log-show-hide-patrol": "$1 le registro de versiones patruliate",
-       "log-show-hide-tag": "$1 registro de etiquettas",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Marcar le version $3 de $2 como patruliate?",
        "deletedrevision": "Deleva le ancian version $1",
index 0ffc1dd..fc966d7 100644 (file)
        "markedaspatrollederrornotify": "Menandai sebagai terpatroli gagal.",
        "patrol-log-page": "Log patroli",
        "patrol-log-header": "Ini adalah log revisi terpatroli.",
-       "log-show-hide-patrol": "$1 log patroli",
-       "log-show-hide-tag": "log tag $1",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Tandai revisi $3 dari $2 sebagai terperiksa?",
        "deletedrevision": "Revisi lama yang dihapus $1",
index 269e7a0..e174f14 100644 (file)
        "markedaspatrollederrornotify": "Ti panagmarka a kas napatruliaan ket napaay.",
        "patrol-log-page": "Listaan ti napatruliaan",
        "patrol-log-header": "Daytoy ket listaan dagiti napatruliaan a rebision.",
-       "log-show-hide-patrol": "$1 listaan ti napatruliaan",
-       "log-show-hide-tag": "$1 ti listaan ti etiketa",
        "confirm-markpatrolled-button": "Sige",
        "confirm-markpatrolled-top": "Markaan ti rebision $3 iti $2 a kas napatruliaan?",
        "deletedrevision": "Naikkat a daan a rebision ti $1",
index 01fc2fd..9b87ad7 100644 (file)
        "pageinfo-contentpage": "Счётчико чулацаме оагIув санна лоархI",
        "pageinfo-contentpage-yes": "XIаа",
        "patrol-log-page": "ТӀахьожама тептар",
-       "log-show-hide-patrol": "$1 патрул яра тептар",
-       "log-show-hide-tag": "$1 фостий тептар",
        "previousdiff": "← КъаьнагIа дола нийсдаьр",
        "nextdiff": "КердагӀа дола нийсдаьр →",
        "imagemaxsize": "Сурта боарамá доазув тохар:<br />''(Файлах лаьца дувцача оагӀона)''",
index fb166c1..9b69a62 100644 (file)
        "tags-delete-too-many-uses": "L'etiketo \"$1\" uzesas en plua kam $2 {{PLURAL:$2|revizo|revizi}}, do ol ne povas eskartesar.",
        "tags-delete-warnings-after-delete": "L'etiketo \"$1\" efacesis, ma la sequanta {{PLURAL:$2|avizo|avizi}} renkontresis:",
        "tags-activate-not-found": "L'etiketo \"$1\" ne existas.",
+       "tags-update-blocked": "Dum ke {{GENDER:$1|vu}} blokusabos, vu ne povos modifikar od efacar etiketi.",
        "dberr-problems": "Pardonez! Ica retopagino subisas teknikala problemi.",
        "dberr-again": "Voluntez vartar kelka minuti, e riprobez acesar ol.",
        "dberr-info": "(Ne povis acesar la datumaro: $1)",
index 6d5ce82..f14b845 100644 (file)
        "markedaspatrollederrornotify": "Mistókst að merkja síðuna sem yfirfarna.",
        "patrol-log-page": "Yfirferðarskrá",
        "patrol-log-header": "Þetta er skrá yfir yfirfarnar breytingar.",
-       "log-show-hide-patrol": "$1 listi yfir yfirfarnar síður",
-       "log-show-hide-tag": "$1 merkjaannáll",
        "confirm-markpatrolled-button": "Í lagi",
        "deletedrevision": "Eyddi gamla útgáfu $1",
        "filedeleteerror-short": "Villa við eyðingu: $1",
index fc75c3f..f18538b 100644 (file)
        "rcfilters-activefilters": "Filtri attivi",
        "rcfilters-activefilters-hide": "Nascondi",
        "rcfilters-activefilters-show": "Mostra",
+       "rcfilters-activefilters-hide-tooltip": "Nascondi area dei filtri attivi",
        "rcfilters-advancedfilters": "Filtri avanzati",
        "rcfilters-limit-title": "Risultati da mostrare",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|modifica|modifiche}}, $2",
        "rcfilters-watchlist-showupdated": "Le modifiche alle pagine che non hai ancora visitato da quando le modifiche sono avvenute, vengono evidenziate in <strong>grassetto</strong> e con dei pallini pieni.",
        "rcfilters-preference-label": "Nascondi la versione migliorata delle ultime modifiche",
        "rcfilters-preference-help": "Ripristina la riprogettazione dell'interfaccia 2017 e tutti gli strumenti aggiunti allora e da allora.",
+       "rcfilters-watchlist-preference-label": "Nascondi la versione migliorata degli osservati speciali",
+       "rcfilters-watchlist-preference-help": "Ripristina la riprogettazione dell'interfaccia 2017 e tutti gli strumenti aggiunti allora e da allora.",
        "rcfilters-filter-showlinkedfrom-label": "Mostra le modifiche alle pagine collegate da",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>Pagine con collegamenti da</strong> la pagina selezionata",
        "rcfilters-filter-showlinkedto-label": "Mostra le modifiche alle pagine che collegano a",
        "markedaspatrollederrornotify": "Errore durante la verifica.",
        "patrol-log-page": "Modifiche verificate",
        "patrol-log-header": "Di seguito sono elencate le verifiche delle modifiche.",
-       "log-show-hide-patrol": "$1 registro delle modifiche verificate",
-       "log-show-hide-tag": "$1 registro delle etichette",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Segna versione $3 di $2 come verificata?",
        "deletedrevision": "Cancellata la vecchia versione di $1.",
index 082ed36..ca6445d 100644 (file)
        "rcfilters-other-review-tools": "その他の監視ツール",
        "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": "過去$2の$1{{PLURAL:$1|件の変更}}",
        "rcfilters-empty-filter": "絞り込みは行われていません。全ての項目が表示さます。",
        "rcfilters-filterlist-title": "フィルター",
        "rcfilters-filterlist-whatsthis": "これらはどのように機能しますか?",
-       "rcfilters-filterlist-feedbacklink": "(新しい)絞り込み機能に関するフィードバックをお願いします",
+       "rcfilters-filterlist-feedbacklink": "絞り込み機能に関するフィードバック",
        "rcfilters-highlightbutton-title": "該当項目を強調表示する",
        "rcfilters-highlightmenu-title": "色を選ぶ",
        "rcfilters-highlightmenu-help": "この項目を何色で強調表示するか選択してください",
        "markedaspatrollederrornotify": "巡回済みにするのに失敗しました。",
        "patrol-log-page": "巡回記録",
        "patrol-log-header": "以下は巡回された版の記録です。",
-       "log-show-hide-patrol": "巡回記録を$1",
-       "log-show-hide-tag": "タグ記録を$1",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "ページ$2の$3の版を巡回済みにマークしますか?",
        "deletedrevision": "古い版 $1 を削除しました",
        "tag-mw-contentmodelchange-description": "ページの[https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel コンテンツモデルを変更]する",
        "tag-mw-new-redirect": "新規リダイレクト",
        "tag-mw-new-redirect-description": "新たな転送ページの作成または既存ページの転送化の編集",
-       "tag-mw-removed-redirect": "転送廃止",
-       "tag-mw-removed-redirect-description": "既存の転送を廃止する編集",
+       "tag-mw-removed-redirect": "リダイレクト解消",
+       "tag-mw-removed-redirect-description": "既存のリダイレクトを解消する編集",
        "tag-mw-changed-redirect-target": "転送先変更",
        "tag-mw-changed-redirect-target-description": "転送先を変更する編集",
        "tag-mw-blank": "白紙化",
index 336b741..d4fa406 100644 (file)
        "markedaspatrollederrornotify": "Penanda patroli gagal dibuat.",
        "patrol-log-page": "Log patroli",
        "patrol-log-header": "Iki log revisi sing wis dipatroli.",
-       "log-show-hide-patrol": "$1 log patroli",
        "confirm-markpatrolled-button": "YA",
        "deletedrevision": "Revisi lawas sing dibusak $1.",
        "filedeleteerror-short": "Kaluputan nalika mbusak berkas: $1",
index 951289f..2982e73 100644 (file)
        "markedaspatrollederrornotify": "პატრულირებულად მონიშვნა ვერ მოხერხდა.",
        "patrol-log-page": "პატრულირების ჟურნალი",
        "patrol-log-header": "ეს არის პატრულირებულ ვერსიათა ჟურნალი.",
-       "log-show-hide-patrol": "$1 პატრულირების ჟურნალი",
-       "log-show-hide-tag": "$1 დასათაურების ჟურნალი",
        "confirm-markpatrolled-button": "კარგი",
        "confirm-markpatrolled-top": "მოინიშნოს $2-ის $3 ცვლილება  შემოწმებულად?",
        "deletedrevision": "წაშლილია ძველი ვერსია $1.",
index 89b564b..631949d 100644 (file)
        "markedaspatrollederrornotify": "Axṣar n ucṛaḍ am aken yetsenqed.",
        "patrol-log-page": "Aɣmis n usenqad",
        "patrol-log-header": "Atan amezruy n ileqman yetwalsɣren.",
-       "log-show-hide-patrol": "$1 amezruy n alstiɣuryin",
        "deletedrevision": "Tasiwelt taqdimt $1 tettumḥa.",
        "filedeleteerror-short": "Tuccḍ deg tukksa n ufaylu : $1",
        "filedeleteerror-long": "Llant tuccḍiwin deg tukksa n ufaylu :\n\n$1",
index 1752c1c..d9b0a87 100644 (file)
        "sp-contributions-logs": "لاگز",
        "sp-contributions-talk": "تبادلہ خیال",
        "sp-contributions-search": "تان نیویشیرو مضمونن تلاش کورے",
-       "sp-contributions-username": "آئی.پی پتہ یا اسمِ صارف:",
+       "sp-contributions-username": "آئی پی پتہ یا صارف نام:",
        "sp-contributions-toponly": "صرف حالیہ ترین نظرثانی ترمیماتن پشاؤے",
        "sp-contributions-submit": "Search/تلاش",
        "whatlinkshere": "ھیارا کیہ کیہ لنک شینی",
index 86a0d7f..93f7982 100644 (file)
        "markedaspatrollederrornotify": "Тексерілді деп белгіленбеді.",
        "patrol-log-page": "Тексеру журналы",
        "patrol-log-header": "Бұл тексерілген нұсқалар журналы",
-       "log-show-hide-patrol": "$1 тексеру журналы",
-       "log-show-hide-tag": "$1 белгі журналы",
        "deletedrevision": "Ескі түзетуін жойды: $1",
        "filedeleteerror-short": "Файл жою қатесі: $1",
        "filedeleteerror-long": "Файлды жойғанда қателер кездесті:\n\n$1",
index 6c05903..abb26c9 100644 (file)
        "markedaspatrollederror": "មិនអាចគូសចំណាំថាបានល្បាត",
        "patrol-log-page": "កំណត់ហេតុនៃការតាមដាន",
        "patrol-log-header": "នេះជាកំណត់ហេតុនៃកំណែ​ប្រែ​ដែល​បាន​តាមដាន",
-       "log-show-hide-patrol": "កំណត់ហេតុនៃការតាមដាន $1",
        "confirm-markpatrolled-button": "យល់ព្រម",
        "deletedrevision": "កំណែចាស់ដែលត្រូវបានលុបចេញ $1",
        "filedeleteerror-short": "កំហុសនៃការលុបឯកសារ៖ $1",
index 0108114..9f8a587 100644 (file)
        "markedaspatrollederrornotify": "점검한 것으로 표시를 실패했습니다.",
        "patrol-log-page": "점검 기록",
        "patrol-log-header": "문서 점검에 대한 기록입니다.",
-       "log-show-hide-patrol": "점검 기록을 $1",
-       "log-show-hide-tag": "태그 기록을 $1",
        "confirm-markpatrolled-button": "확인",
        "confirm-markpatrolled-top": "$2의 $3 판을 점검한 것으로 표시하시겠습니까?",
        "deletedrevision": "예전 $1 판이 삭제되었습니다.",
index f8b077a..89e4ac1 100644 (file)
        "markedaspatrollednotify": "«$1» бетдеги бу тюрлениу тинтиб къаралгъанча белгиленди.",
        "patrol-log-page": "Патруль этиуню журналы",
        "patrol-log-header": "Бу осмакъланнган версияланы журналыды.",
-       "log-show-hide-patrol": "Осмакълауну журналы $1",
        "deletedrevision": "$1 эски версия кетерилгенди.",
        "filedeleteerror-short": "Файл кетериуню халаты: $1",
        "filedeleteerror-long": "Файлны кетериуде халатлагъа тюбелди:\n\n$1",
index 970fd3d..d3f6dbd 100644 (file)
        "markedaspatrollederrornotify": "Dat di Sigg nohjekik es, kunnte mer nit faßhalde.",
        "patrol-log-page": "Logbohch vun de nohjelohrte Änderonge",
        "patrol-log-header": "<!-- -->",
-       "log-show-hide-patrol": "$1 et Logbuch vum Sigge nohlooere",
-       "log-show-hide-tag": "Donn et Logbohch vun de Makkehronge $1",
        "deletedrevision": "De ahle Väsjohn „$1“ es fottjeschmeße",
        "filedeleteerror-short": "Fähler bem Dattei-Fottschmiiße: $1",
        "filedeleteerror-long": "Bem Fosooch, de Dattei fottzeschmihße, hatte mer Fähler:\n\n$1",
index 5833a57..edb6586 100644 (file)
        "markaspatrolledtext": "Indicare hanc paginam qua circumita",
        "markedaspatrolled": "Indicare hanc paginam qua circumita",
        "patrol-log-page": "Acta emendationum circumitarum",
-       "log-show-hide-patrol": "$1 acta emendationum circumitarum",
        "deletedrevision": "Abolita redactio imaginis $1",
        "previousdiff": "← Differentia superior",
        "nextdiff": "Differentia proxima →",
index 130d2ca..7d5ea83 100644 (file)
        "diff-paragraph-moved-toold": "Den Abschnitt gouf geréckelt. Klickt fir op déi al Plaz ze sprangen.",
        "difference-missing-revision": "{{PLURAL:$2|Eng Versioun|$2 Versioune}} vun dëser Differenz ($1) {{PLURAL:$2|gouf|goufen}} net fonnt.\n\nDat geschitt normalerweis wann Dir op e vereelste Link vun enger Versioun vun enger Säit klickt déi geläscht ginn ass.\nDetailer fannt Dir am [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Logbuch vum Läschen].",
        "searchresults": "Resultat vum Sichen",
+       "search-filter-title-prefix-reset": "Op all de Säite sichen",
        "searchresults-title": "Resultater vum Sichen no \"$1\"",
        "titlematches": "Iwwereneestëmmungen am Säitentitel",
        "textmatches": "Iwwereneestëmmungen am Säitentext",
        "block": "Benotzer spären",
        "unblock": "D'Spär vum Benotzer ophiewen",
        "blockip": "{{GENDER:$1|Benotzer}} spären",
-       "blockiptext": "Benotzt dëse Formulaire fir eng spezifesch IP-Adress oder e Benotzernumm ze spären.\nDëst soll nëmmen am Fall vu Vandalismus gemaach ginn, en accordance mat den [[{{MediaWiki:Policy-url}}|interne Richlinen]].\nGitt e spezifesche Grond un (zum Beispill Säite wou Vandalismus virgefall ass).\nDir kënnt IP-Beräicher spären an deem Dir d' [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR] Syntax benotzt; de gréissten erlaabte Beräich as  /$1 fir IPv4 an /$2 fir IPv6",
+       "blockiptext": "Benotzt dëse Formulaire fir eng spezifesch IP-Adress oder e Benotzernumm ze spären.\nDëst soll nëmmen am Fall vu Vandalismus gemaach ginn, en accordance mat den [[{{MediaWiki:Policy-url}}|interne Richtlinnen]].\nGitt e spezifesche Grond un (zum Beispill Säite wou Vandalismus virgefall ass).\nDir kënnt IP-Beräicher spären an deem Dir d' [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR] Syntax benotzt; de gréissten erlaabte Beräich as  /$1 fir IPv4 an /$2 fir IPv6",
        "ipaddressorusername": "IP-Adress oder Benotzernumm:",
        "ipbexpiry": "Gültegkeet:",
        "ipbreason": "Grond:",
-       "ipbreason-dropdown": "*Heefeg Ursaache fir Benotzer ze spären:\n**Bewosst falsch Informatiounen an eng oder méi Säite gesat\n**Ouni Grond Inhalt vu Säite geläscht\n**Spam-Verknëppunge mat externe Säiten\n**Topereien an d'Säite gesat\n**Beleidegt oder bedréit aner Mataarbechter\n**Mëssbrauch vu verschiddene Benotzernimm\n**Net akzeptabele Benotzernumm",
+       "ipbreason-dropdown": "*Heefeg Ursaache fir Benotzer ze spären:\n**Bewosst falsch Informatiounen an eng oder méi Säite gesat\n**Ouni Grond Inhalt vu Säite geläscht\n**Spam-Verknëppunge mat externe Säiten\n**Topereien an d'Säite gesat\n**Beleidegt oder bedreet aner Mataarbechter\n**Mëssbrauch vu verschiddene Benotzernimm\n**Net akzeptabele Benotzernumm",
        "ipb-hardblock": "Verhënneren datt ageloggt Benotzer vun dëser IP-Adress aus Ännerunge maache kënnen",
        "ipbcreateaccount": "Opmaache vun engem Benotzerkont verhënneren",
        "ipbemailban": "Verhënneren datt de Benotzer E-Maile verschéckt",
        "markedaspatrollederrornotify": "Markéieren als kontrolléiert huet net funktionéiert.",
        "patrol-log-page": "Logbuch vun den iwwerkuckte Versiounen",
        "patrol-log-header": "Dëst ass d'Logbuch vun den nogekuckte Versiounen.",
-       "log-show-hide-patrol": "Kontroll-Logbuch $1",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Versioun $3 vu(n) $2 als kontrolléiert markéieren?",
        "deletedrevision": "Al, geläscht Versioun vu(n) $1",
index 4821c83..f279596 100644 (file)
        "markedaspatrollederrornotify": "La marca como patruliada ia fali.",
        "patrol-log-page": "Arcivo de patrulias",
        "patrol-log-header": "Esta es un rejistra de revisas patruliada.",
-       "log-show-hide-patrol": "$1 rejistra de patrulias",
-       "log-show-hide-tag": "$1 rejistra de eticetas",
        "confirm-markpatrolled-button": "Oce",
        "confirm-markpatrolled-top": "Marca revisa $3 de $2 como patruliada?",
        "deletedrevision": "Sutrae revisa vea $1",
index b1e6101..fe1221f 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Kizito",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Erinamukuta"
                ]
        },
        "tog-underline": "Enyunzi ebengako olukoloboze?",
        "nstab-template": "Lutiba",
        "nstab-help": "Buyambi",
        "nstab-category": "Ttuluba lya",
+       "mainpage-nstab": "Olupapula Olusinga Omugaso",
        "nosuchaction": "Ekikolwa ekyo tekisoboka",
        "nosuchactiontext": "Ekikolwa ekikongojedwa mu URL tekisoboka.<br />\nOyinza okuba nga URL wagiwandise bubi, oba yo URL y'eyinza okuba nga ya nsobi.<br />\nKiyinza ate okuba nti sofutiweya {{SITENAME}} gy'ekozesa erimu ebitali bituufu.",
        "nosuchspecialpage": "Olwo olupapula olwawule teruliwo",
index 23ea9cb..f7db609 100644 (file)
        "markedaspatrollederrornotify": "Markere es gecontroleerd mislök.",
        "patrol-log-page": "Markeerlogbook",
        "patrol-log-header": "Dit logbook bevat versies die gemarkeerd zeen es gecontroleerd.",
-       "log-show-hide-patrol": "Markeerlogbook $1",
-       "log-show-hide-tag": "$1 labellogbook",
        "confirm-markpatrolled-button": "Ok",
        "confirm-markpatrolled-top": "Markeer bewirking $3 van $2 es gecontroleerd?",
        "deletedrevision": "Aw versie $1 gewis",
index a47b186..3849fa2 100644 (file)
        "markedaspatrollederrornotify": "Errô durante a veifica.",
        "patrol-log-page": "Modiffiche controlæ",
        "patrol-log-header": "Questo o l'è 'n registro de revixoin controlæ.",
-       "log-show-hide-patrol": "$1 registro di controlli",
-       "log-show-hide-tag": "$1 registro di etichette",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Marca verscion $3 de $2 comme veificâ?",
        "deletedrevision": "Scassou a vegia verscion de $1.",
index e474285..2e98cb9 100644 (file)
        "markedaspatrollederrornotify": "زدن برچسب گشت، ناموفق بود.",
        "patrol-log-page": "سیاههٔ گشت",
        "patrol-log-header": "این سیاهه‌ای از ویرایش‌های گشت‌خورده است.",
-       "log-show-hide-patrol": "$1 سیاههٔ گشت‌زنی",
-       "log-show-hide-tag": "$1 سیاهه برچسب",
        "deletedrevision": "$1 نسخهٔ حذف شدهٔ قدیمی",
        "filedeleteerror-short": "خطا در حذف پرونده: $1",
        "filedeleteerror-long": "در زمان حذف پرونده خطا رخ داد:\n\n$1",
index fb7a5ee..ab62a89 100644 (file)
        "markedaspatrollederrornotify": "نشودار کردن چی نشودار بیه شکست حرده",
        "patrol-log-page": "پهرستنومه گشتن",
        "patrol-log-header": "یه پهرستنومه وانئریا سردیاری کرده هئ.",
-       "log-show-hide-patrol": "$1 پهرستنومه سردیاری کردن",
-       "log-show-hide-tag": "سردیس پهرستنومه $1",
        "deletedrevision": "وانئری دماتری پاکسابیه د $1",
        "filedeleteerror-short": "خطا پاک نبیئن جانیا:$1",
        "filedeleteerror-long": "د گات پاکسا کردن جانیا یه گل خطا پیش اوما:\n\n\n$1",
index 27d7605..78a2748 100644 (file)
        "markedaspatrollederrornotify": "Nepavyko pažymėti kaip patikrinto.",
        "patrol-log-page": "Patikrinimų sąrašas",
        "patrol-log-header": "Tai patvirtintų versijų sąrašas.",
-       "log-show-hide-patrol": "$1 patvirtinimų sąrašą",
-       "log-show-hide-tag": "$1 žymės žurnalas",
        "confirm-markpatrolled-button": "GERAI",
        "deletedrevision": "Ištrinta sena versija $1",
        "filedeleteerror-short": "Klaida trinant rinkmeną: $1",
index 800bcef..d7c7e26 100644 (file)
        "markedaspatrolledtext": "[[:$1]] ennawnna thlansa hi vil anga chhinchhiah a ni.",
        "markedaspatrollederror": "Vil anga chhinchhiah theih a ni lo",
        "patrol-log-page": "Vil chhinchhiahna",
-       "log-show-hide-patrol": "Vil chhinchhiahna $1",
        "filedeleteerror-long": "Taksa paih tum laiin buaina a lo thleng\n\n$1",
        "previousdiff": "←Siamţhatna hlui zâwk",
        "nextdiff": "Siamţhatna thar zâwk→",
index 5176eaf..e3a3066 100644 (file)
        "markedaspatrollednotify": "Šī izmaiņa lapā \"$1\" ir atzīmēta kā patrulēta.",
        "patrol-log-page": "Pārbaudes reģistrs",
        "patrol-log-header": "Šis ir pārbaudīto versiju reģistrs.",
-       "log-show-hide-patrol": "$1 pārbaudes reģistrs",
        "confirm-markpatrolled-button": "Labi",
        "confirm-markpatrolled-top": "Atzīmēt lapas \"$2\" versiju $3 kā pārbaudītu?",
        "deletedrevision": "Izdzēstā vecā versija $1",
index 8d86a73..43496d7 100644 (file)
        "markedaspatrollederror-noautopatrol": "己易不可自審。",
        "patrol-log-page": "誌哨",
        "patrol-log-header": "此乃誌哨也。",
-       "log-show-hide-patrol": "$1誌巡",
        "deletedrevision": "刪舊審$1",
        "filedeleteerror-short": "刪檔有誤:$1",
        "filedeleteerror-long": "刪檔有誤:\n\n$1",
index 8e2a16b..d4c3e75 100644 (file)
        "markedaspatrollederrornotify": "जाँचल चिन्हासी असफल भेल।",
        "patrol-log-page": "परीक्षण लौग",
        "patrol-log-header": "ई परीक्षित अवतरणसभक लौग छी।",
-       "log-show-hide-patrol": "$1 निरीक्षण लौग",
-       "log-show-hide-tag": "$1 ट्याग लग",
        "deletedrevision": "पुरान संशोधन $1 हटा देलौं",
        "filedeleteerror-short": "संचिका मेटेबामे भ्रम : $1",
        "filedeleteerror-long": "संचिका मेटेबा काल भ्रम संकेत भेटल:\n$1",
index 4c8257a..8f4fd3c 100644 (file)
        "markedaspatrollederror-noautopatrol": "Тондейть аф мярьгови тяштемс эсь полфнемацень кода патрулень варжафт.",
        "patrol-log-page": "Патрулень лувомась",
        "patrol-log-header": "Патруль ала верзиетнень лувомась.",
-       "log-show-hide-patrol": "$1 патрулень лувомась",
        "deletedrevision": "Нардаф сире илякстоптома $1",
        "filedeleteerror-short": "Лиссь эльбятькс нардамста файл: $1",
        "filedeleteerror-long": "Лиссть эльбятькст нардамста файл:\n\n$1",
index aea1f0e..264389c 100644 (file)
        "markedaspatrollederrornotify": "Tsy nahamarika azy ho voaara-maso.",
        "patrol-log-page": "Laogin'ny fanovana voamarina",
        "patrol-log-header": "Ity dia laogy mikasikan'ny fanovana voamarina.",
-       "log-show-hide-patrol": "$1 ny laogy mikasikan'ny versiona voamarina",
-       "log-show-hide-tag": "$1 laogim-balizy",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Hanamarika ny reviziôna $3 an'i $2 ho voamarina?",
        "deletedrevision": "Fanovana an'i $1 taloha voafafa.",
index 4a7c7e1..642e01e 100644 (file)
        "rcpatroldisabled": "Patroli parubahan baru dimatian",
        "patrol-log-page": "Log patroli",
        "patrol-log-header": "Iko daftar log revisi nan alah dipatroli.",
-       "log-show-hide-patrol": "$1 log patroli",
        "previousdiff": "← Revisi sabalunnyo",
        "nextdiff": "Revisi salanjuiknyo →",
        "imagemaxsize": "Bateh ukuran gambar:<br />''(untuak laman katarangan berkas)''",
index b4b35ff..e7e4e6c 100644 (file)
        "markedaspatrollederrornotify": "Означувањето како испатролирано не успеа.",
        "patrol-log-page": "Дневник на патролирања",
        "patrol-log-header": "Ова е дневник на патролирани преработки.",
-       "log-show-hide-patrol": "$1 дневник на патролирање",
-       "log-show-hide-tag": "$1 дневник на ознаки",
        "confirm-markpatrolled-button": "ОК",
        "confirm-markpatrolled-top": "Да ја означан преработката $3 на $2 како испатролирана?",
        "deletedrevision": "Избришана стара преработка $1.",
index b4d51b8..de580c9 100644 (file)
        "markedaspatrollederrornotify": "റോന്തുചുറ്റിയതെന്ന് അടയാളപ്പെടുത്തൽ പരാജയപ്പെട്ടു.",
        "patrol-log-page": "റോന്തുചുറ്റൽ പ്രവർത്തനരേഖ",
        "patrol-log-header": "റോന്തുചുറ്റപ്പെട്ട നാൾപ്പതിപ്പുകളുടെ രേഖയാണിത്",
-       "log-show-hide-patrol": "റോന്തുചുറ്റൽ രേഖ $1",
-       "log-show-hide-tag": "ടാഗ് രേഖ $1",
        "confirm-markpatrolled-button": "ശരി",
        "confirm-markpatrolled-top": "$2 താളിലെ $3 നാൾപ്പതിപ്പ് റോന്തുചുറ്റിയതായി അടയാളപ്പെടുത്തണോ?",
        "deletedrevision": "$1 എന്ന പഴയ പതിപ്പ് മായ്ച്ചിരിക്കുന്നു",
index d7d3dc5..84528b9 100644 (file)
        "markedaspatrollederror-noautopatrol": "Та өөрийн өөрчлөлтүүдээ эргүүлээр хянагдсан гэж тэмдэглэж болохгүй.",
        "patrol-log-page": "Эргүүлийн лог",
        "patrol-log-header": "Энэ нь манагдсан засваруудын лог юм.",
-       "log-show-hide-patrol": "мануулын логийг $1",
        "deletedrevision": "Хуучин засвар $1 нь устгагдлаа",
        "filedeleteerror-short": "Файлыг устгахад алдаа гарлаа: $1",
        "filedeleteerror-long": "Дараах файлыг устгахад алдаа гарлаа:\n\n$1",
index 1819d0e..5f22f95 100644 (file)
        "mypreferences": "Preferences",
        "group-bot": "ꯕꯣꯇꯁꯤꯡ",
        "group-sysop": "ꯆꯨꯞꯂꯤ ꯄꯥꯏꯔꯤꯕꯁꯤꯡ",
-       "grouppage-bot": "ꯕꯣꯇ ꯁꯤꯡ{{ns:project}}",
-       "grouppage-sysop": "ꯉꯥꯛ ꯁꯦꯟꯂꯤꯕ {{ns: project}}",
+       "grouppage-bot": "{{ns:project}}:ꯕꯣꯠꯁꯤꯡ",
+       "grouppage-sysop": "ꯉꯥꯛ ꯁꯦꯟꯂꯤꯕ {{ns:project}}",
        "right-writeapi": "API sijinaduna eba",
        "newuserlogpage": "User creation log",
        "action-edit": "ꯃꯁꯤꯒꯤ ꯂꯥꯃꯥꯏꯁꯤ ꯁꯦꯝꯒꯠꯂꯨ",
+       "action-createaccount": "ꯃꯁꯤ ꯁꯤꯖꯤꯟꯅꯔꯤꯕ ꯑꯦꯀꯥꯎꯟ ꯁꯤ ꯁꯦꯝꯃꯨ",
        "enhancedrc-history": "ꯄꯨꯋꯥꯔꯤ",
        "recentchanges": "ꯍꯧꯖꯤꯛꯀꯤ ꯑꯣꯏꯕꯥ ꯑꯍꯣꯡꯕꯁꯤꯡ",
        "recentchanges-legend": "ꯍꯧꯖꯤꯛꯀꯤ ꯑꯣꯏꯕꯥ ꯑꯍꯣꯡꯕꯥ ꯈꯟꯐꯝꯁꯤꯡ",
        "rollbacklink": "ꯑꯃꯨꯛ ꯍꯟꯍꯟꯕꯥ",
        "rollbacklinkcount": "rollback $1 {{PLURAL:$1|edit|edits}}",
        "protectlogpage": "ꯂꯣꯒ ꯉꯥꯛꯊꯣꯛꯄꯥ",
+       "protectedarticle": "\"[[$1]]\" ꯉꯥꯛꯊꯣꯛꯂꯦ",
+       "protect-default": "ꯁꯤꯖꯤꯟꯅꯔꯤꯕꯁꯤꯡ ꯄꯨꯂꯞ ꯌꯥꯍꯟꯕ",
        "restriction-edit": "ꯁꯦꯝꯒꯠꯄꯥ",
        "restriction-move": "ꯂꯦꯡꯍꯟꯕꯥ",
        "namespace": "ꯃꯥꯃꯤꯡꯒꯤ ꯃꯐꯝ",
        "whatlinkshere-title": "$1 ꯒꯥ ꯃꯔꯤ ꯂꯩꯅꯕꯥ ꯁꯝꯅꯐꯝ",
        "whatlinkshere-page": "ꯂꯥꯃꯥꯏ",
        "linkshere": "$2<strong> ꯒꯥ ꯁꯝꯅꯐꯝ ꯑꯣꯏꯕꯥ ꯂꯥꯃꯥꯏꯁꯤꯡ",
+       "nolinkshere": " <strong>$2</strong> ꯃꯁꯤꯒ ꯁꯝꯅꯕ ꯂꯥꯃꯥꯏꯁꯤꯡ ꯂꯩꯇꯦ",
        "isredirect": "ꯑꯃꯨꯛ ꯍꯟꯂꯛꯄꯥ ꯂꯥꯃꯥꯏ",
        "istemplate": " transclusions",
        "isimage": "ꯐꯥꯏꯜꯒꯤ ꯁꯝꯅꯐꯝ",
        "whatlinkshere-hidelinks": "$1 ꯁꯝꯅꯐꯝ",
        "whatlinkshere-hideimages": "$1 ꯒꯤ ꯐꯥꯏꯜ ꯁꯝꯅꯐꯝ",
        "whatlinkshere-filters": "ꯁꯦꯡꯇꯣꯛꯐꯝ",
-       "ipboptions": "ꯄꯨꯪ ꯲:2 hours| ꯅꯣꯡꯃ:1 day|ꯅꯨꯃꯤꯠ ꯳ꯅꯤ:3 days|ꯆꯥꯌꯣꯜ ꯱: 1 week |ꯆꯥꯌꯣꯜ ꯲: 2weeks |ꯊꯥ ꯱: 1 month|ꯊꯥ ꯳: 3 months |ꯊꯥ ꯶: 6 months |ꯆꯥꯍꯤ ꯱: 1 year |ꯃꯁꯤꯡꯊꯤꯉꯝꯗꯅ:infinite ‌.",
+       "ipboptions": "ꯄꯨꯪ ꯲:2 hours,  ꯅꯣꯡꯃ:1 day, ꯅꯨꯃꯤꯠ ꯳ꯅꯤ:3 days, ꯆꯥꯌꯣꯜ ꯱: 1 week, ꯆꯥꯌꯣꯜ ꯲: 2weeks, ꯊꯥ ꯱: 1 month, ꯊꯥ ꯳: 3 months, ꯊꯥ ꯶: 6 months, ꯆꯥꯍꯤ ꯱: 1 year, ꯃꯁꯤꯡꯊꯤꯉꯝꯗꯅ:infinite ‌.",
        "infiniteblock": "ꯃꯁꯤꯡ ꯊꯤꯉꯝꯗꯅ",
        "blocklink": "ꯊꯤꯡꯕ",
        "contribslink": "ꯈꯣꯝ",
        "tooltip-ca-delete": "ꯃꯁꯤꯒꯤ ꯂꯥꯃꯥꯏꯁꯤ ꯀꯛꯊꯠꯂꯨ",
        "tooltip-ca-move": "ꯃꯁꯤꯒꯤ ꯂꯥꯃꯥꯏꯁꯤ ꯂꯦꯡꯍꯟꯂꯨ",
        "tooltip-ca-watch": "ꯅꯪꯒꯤ ꯌꯦꯡꯅꯕꯥ ꯄꯥꯔꯦꯡꯗꯨꯗꯥ ꯍꯥꯞꯆꯏꯟꯂꯨ ꯃꯁꯤꯒꯤ ꯂꯥꯃꯥꯏꯁꯤ",
+       "tooltip-ca-unwatch": "ꯅꯪꯒꯤ ꯌꯦꯡꯅꯕ ꯄꯥꯔꯦꯡ ꯗꯒꯤ ꯃꯁꯤꯒꯤ ꯂꯥꯃꯥꯏꯁꯤ ꯂꯧꯊꯣꯛ ꯎ",
        "tooltip-search": "ꯊꯤꯔꯣ",
        "tooltip-search-go": "ꯂꯩꯔꯒꯥ ꯆꯠꯂꯨ ꯃꯗꯨꯒꯤ ꯆꯞꯆꯕ ꯂꯥꯃꯥꯏ ꯗꯨꯗ",
        "tooltip-search-fulltext": "ꯏꯔꯤꯕꯥ ꯃꯇꯦꯛꯁꯤꯒꯤ ꯂꯃꯥꯏ ꯁꯤ ꯊꯤꯔꯣ",
index 4f0d86b..7fa61b8 100644 (file)
        "markedaspatrollederrornotify": "'पहारा दिला' म्हणून अंकित करणे विफल झाले.",
        "patrol-log-page": "टेहळणीतील नोंदी",
        "patrol-log-header": "ही पाहणीनंतरच्या निरीक्षणाची नोंद आहे.",
-       "log-show-hide-patrol": "$1 गस्तीची नोंद",
        "confirm-markpatrolled-button": "ठीक आहे",
        "confirm-markpatrolled-top": "$2च्या $3 आवृत्तीवर पहारा दिला म्हणून खूण करायची?",
        "deletedrevision": "जुनी आवृत्ती ($1) वगळली.",
index dc34016..50f6e19 100644 (file)
        "markedaspatrollederrornotify": "Penandaan sebagai dironda gagal.",
        "patrol-log-page": "Log pemeriksaan",
        "patrol-log-header": "Yang berikut ialah log rondaan bagi semakan.",
-       "log-show-hide-patrol": "$1 log rondaan",
-       "log-show-hide-tag": "$1 log teg",
        "deletedrevision": "Menghapuskan semakan lama $1.",
        "filedeleteerror-short": "Ralat ketika menghapuskan fail: $1",
        "filedeleteerror-long": "Berlaku ralat ketika menghapuskan fail tersebut:\n\n$1",
index 25a622a..5ab6b4c 100644 (file)
        "markedaspatrollederrornotify": "L-ivverifikar tal-modifika falla.",
        "patrol-log-page": "Modifiki verifikati",
        "patrol-log-header": "Dan huwa reġistru ta' reviżjonijiet verifikati.",
-       "log-show-hide-patrol": "$1 r-reġistru tal-modifiki verifikati",
-       "log-show-hide-tag": "$1 r-reġistru tat-tikketti",
        "deletedrevision": "Reviżjoni preċedenti, mħassra: $1",
        "filedeleteerror-short": "Problema waqt li kont qiegħed tħassar il-fajl: $1",
        "filedeleteerror-long": "Ġew verifikati xi problemi waqt li kont qiegħed tħassar il-fajl:\n\n$1",
index da5d40d..cf3cc7f 100644 (file)
        "markedaspatrolledtext": "[[:$1]] ၏ ရွေးချယ်ထားသော တည်းဖြတ်မူကို စောင့်ကြပ်စစ်ဆေးပြီးကြောင်း မှတ်သားပြီးပါပြီ။",
        "markedaspatrollednotify": "$1 သို့ ဤပြောင်းလဲမှုအား စောင့်ကြပ်စစ်ဆေးပြီးကြောင်း မှတ်သားပြီးပါပြီ။",
        "patrol-log-page": "စောင့်ကြပ်စစ်ဆေးမှု မှတ်တမ်း",
-       "log-show-hide-patrol": "စောင့်ကြပ်စစ်ဆေးမှု မှတ်တမ်း $1",
        "filedeleteerror-short": "ဖိုင်ဖျက်ရာတွင် အမှားအယွင်း - $1",
        "previousdiff": "← တည်းဖြတ်မူ အဟောင်း",
        "nextdiff": "ပိုသစ်သော တည်းဖြတ်မှု",
index df0f72b..20ebd82 100644 (file)
        "markaspatrolledtext": "Тешкстамс те лопанть ванстнемань ютазекс",
        "markedaspatrolled": "Тешкстазь ванстнемань ютазекс",
        "patrol-log-page": "Ванстнемадо конёв",
-       "log-show-hide-patrol": "$1 патрулонь журналонть",
        "deletedrevision": "Нардань ташто лиякстомтома $1",
        "filedeleteerror-short": "\"$1\" керьмазонть нардамсто лиссь ильведевкс",
        "previousdiff": "← Седе икелень верзиязо",
index 83ef7bf..6b18e71 100644 (file)
        "markedaspatrollederrornotify": "Errore pe' tramente ca se nzegnava comme cuntrullata.",
        "patrol-log-page": "Riggistro 'e cuntrolle",
        "patrol-log-header": "Chest'è nu riggistro ch' 'e verziune cuntrullate.",
-       "log-show-hide-patrol": "$1 riggistro 'e cuntrolle",
-       "log-show-hide-tag": "$1 tag log",
        "deletedrevision": "Viecchia verziona scancellata $1",
        "filedeleteerror-short": "Errore pe' tramente ca se scancellava nu file: $1",
        "filedeleteerror-long": "N'errore s'è apprisentato pe' tramente ca se scancellava 'o file:\n\n$1",
index 266ba64..16b9bcb 100644 (file)
@@ -51,7 +51,8 @@
                        "Nemo bis",
                        "Telaneo",
                        "Jon Harald Søby",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "Orf3us"
                ]
        },
        "tog-underline": "Strek under lenker:",
        "diff-paragraph-moved-toold": "Avsnittet ble flyttet. Klikk for å hoppe til den gamle plasseringen.",
        "difference-missing-revision": "{{PLURAL:$2|En revisjon|$2 revisjoner}} av denne forskjellen ($1) {{PLURAL:$2|ble|ble}} ikke funnet.\n\nDette skyldes som regel at en gammel forskjell-lenke er fulgt til en side som er slettet.\nDetaljer kan finnes i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} sletteloggen].",
        "searchresults": "Søkeresultater",
+       "search-filter-title-prefix-reset": "Søk i alle sider",
        "searchresults-title": "Søkeresultater for «$1»",
        "titlematches": "Artikkeltitler med treff på forespørselen",
        "textmatches": "Artikkeltekster med treff på forespørselen",
        "markedaspatrollederrornotify": "Patruljering feilet.",
        "patrol-log-page": "Patruljeringslogg",
        "patrol-log-header": "Dette er en logg over patruljerte sideversjoner.",
-       "log-show-hide-patrol": "$1 patruljeringslogg",
-       "log-show-hide-tag": "$1 merkelogg",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Merk revisjon $3 av $2 som patruljert?",
        "deletedrevision": "Slettet gammel revisjon $1.",
index 663fec1..a03d104 100644 (file)
        "markedaspatrollederrornotify": "Markeren as nao-ekeken is mislokt.",
        "patrol-log-page": "Markeerlogboek",
        "patrol-log-header": "In dit logboek staon de versies die op nao-ekeken ezet bin.",
-       "log-show-hide-patrol": "Markeerlogboek $1",
        "deletedrevision": "Vortedaone ouwe versie $1.",
        "filedeleteerror-short": "Fout bie t vortdoon van bestaand: $1",
        "filedeleteerror-long": "Der waren fouten bie t vortdoon van t bestaand:\n\n$1",
index 3ae3f9c..c5b1a28 100644 (file)
        "markedaspatrollederror-noautopatrol": "Du kannst de Saken, de du sülvst ännert hest, nich as nakeken marken.",
        "patrol-log-page": "Nakiek-Logbook",
        "patrol-log-header": "Dit is dat Patrolleer-Logbook.",
-       "log-show-hide-patrol": "Nakiek-Logbook $1",
        "deletedrevision": "Löschte ole Version $1",
        "filedeleteerror-short": "Fehler bi dat Wegsmieten vun de Datei: $1",
        "filedeleteerror-long": "Dat geev Fehlers bi dat Wegsmieten vun de Datei:\n\n$1",
index fcd4a28..5002cfa 100644 (file)
@@ -27,7 +27,8 @@
                        "रमेश सिंह बोहरा",
                        "Nirajan pant",
                        "Drjpoudel",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "Nabin Sapkota"
                ]
        },
        "tog-underline": "रेखाङ्कित लिङ्क:",
        "subject-preview": "विषयको पूर्वावलोकन:",
        "previewerrortext": "तपाईंको परिवर्तनको पूर्वावलोकन बनाउन खोज्दा समस्या आएको छ ।",
        "blockedtitle": "प्रयोककर्तालाई रोक लगाइएको छ",
-       "blockedtext": "'''तपाà¤\88à¤\82à¤\95à¥\8b à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¨à¤¾à¤® à¤¯à¤¾ à¤\86à¤\87 à¤ªà¥\80 à¤ à¥\87à¤\97ानालाà¤\88 à¤°à¥\8bà¤\95 à¤²à¤\97ाà¤\87à¤\8fà¤\95à¥\8b à¤\9b à¥¤'''\n\nरà¥\8bà¤\95 à¤²à¤\97ाà¤\89नà¥\87  $1.\nरà¥\8bà¤\95 à¤²à¤\97ाà¤\89नाà¤\95à¥\8b à¤\95ारण ''$2''.\n\n* à¤°à¥\8bà¤\95 à¤¸à¥\81रà¥\82 à¤¹à¥\81नà¥\87 : $8\n* à¤°à¥\8bà¤\95 à¤¸à¤\95िनà¥\87: $6\n* à¤°à¥\8bà¤\95बाà¤\9f à¤²à¤\95à¥\8dषित: $7\n\nतपाà¤\88à¤\82लà¥\87  $1 à¤µà¤¾ à¤\85रà¥\81 à¤\95à¥\81नà¥\88  [[{{MediaWiki:Grouppage-sysop}}|पà¥\8dरवनà¥\8dधà¤\95]] à¤¸à¤\81à¤\97 à¤°à¥\8bà¤\95à¤\95à¥\8b à¤¬à¤¾à¤°à¥\87मा à¤\9bलफल à¤\97रà¥\8dन à¤¸à¤®à¥\8dपरà¥\8dà¤\95 à¤\97रà¥\8dन à¤¸à¤\95à¥\8dनà¥\81हà¥\81नà¥\8dà¤\9b à¥¤\nतपाà¤\88à¤\81लà¥\87  'पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dतालाà¤\88 à¤\87-मà¥\87ल à¤\97रà¥\8dनà¥\87 ' सुविधा मान्य इमेल ठेगाना [[Special:Preferences|अभिरुचीहरू]]मा नखुलाए सम्म प्रयोगगर्न पाउनुहुने छैन र यसको प्रयोग गर्नबाट रोक लगाइएको छैन ।\nतपाईंको IP ठेगाना $3 को, र रोक्का संख्या #$5.\nकृपया तपाईँको प्रश्नमा सबै जानकारी खुलाउनुहोला ।",
+       "blockedtext": "'''तपाà¤\88à¤\82à¤\95à¥\8b à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¨à¤¾à¤® à¤µà¤¾ à¤\86à¤\87पà¥\80 à¤ à¥\87à¤\97ानालाà¤\88 à¤°à¥\8bà¤\95 à¤²à¤\97ाà¤\87à¤\8fà¤\95à¥\8b à¤\9b à¥¤'''\n\nरà¥\8bà¤\95 à¤²à¤\97ाà¤\89नà¥\87  $1.\nरà¥\8bà¤\95 à¤²à¤\97ाà¤\89नाà¤\95à¥\8b à¤\95ारण ''$2''.\n\n* à¤°à¥\8bà¤\95 à¤¸à¥\81रà¥\82 à¤¹à¥\81नà¥\87 : $8\n* à¤°à¥\8bà¤\95 à¤¸à¤\95िनà¥\87: $6\n* à¤°à¥\8bà¤\95बाà¤\9f à¤²à¤\95à¥\8dषित: $7\n\nतपाà¤\88à¤\82लà¥\87  $1 à¤µà¤¾ à¤\85रà¥\81 à¤\95à¥\81नà¥\88  [[{{MediaWiki:Grouppage-sysop}}|पà¥\8dरवनà¥\8dधà¤\95]] à¤¸à¤\81à¤\97 à¤°à¥\8bà¤\95à¤\95à¥\8b à¤¬à¤¾à¤°à¥\87मा à¤\9bलफल à¤\97रà¥\8dन à¤¸à¤®à¥\8dपरà¥\8dà¤\95 à¤\97रà¥\8dन à¤¸à¤\95िनà¥\8dà¤\9b à¥¤\nतपाà¤\88à¤\81लà¥\87  ''{{int:emailuser}}'' सुविधा मान्य इमेल ठेगाना [[Special:Preferences|अभिरुचीहरू]]मा नखुलाए सम्म प्रयोगगर्न पाउनुहुने छैन र यसको प्रयोग गर्नबाट रोक लगाइएको छैन ।\nतपाईंको IP ठेगाना $3 को, र रोक्का संख्या #$5.\nकृपया तपाईँको प्रश्नमा सबै जानकारी खुलाउनुहोला ।",
        "autoblockedtext": "तपाईंको IP ठेगानामाथि रोक लगाइएकोछ किन भनें यो अर्को प्रयोगकर्ताले प्रयोग गरेको थियो, जसलाई $1ले रोक लगाएका थिए। \nरोक लगाउनुको कारण:\n:''$2''  \n\n* रोकावट सुरु: $8\n* रोकावट सकिने: $6\n* रोकावटको प्रयोजन: $7\n\nतपाईं $1 सित सम्पर्क गर्न सक्नुहुन्छ अथवा कुनै [[{{MediaWiki:Grouppage-sysop}}|प्रबन्धक]]सँग रोकबारे चर्चा गर्न सक्नुहुन्छ ।\n\nध्यान दिनुहोस् कि तपाईंले यस प्रयोगकर्ताका लागि ई-मेलको प्रयोग तबसम्म गर्नसक्नुहुन्न जबसम्म तपाईंको [[Special:Preferences|अभिरुचि]] पंजिकृत गर्नु हुन्न वा यस ई-मेलको प्रयोगमाथि रोक लगाइएको हुँदैन । \n\nतपाईंको वर्तमान IP ठेगाना हो- $3, अनि रोक लगाइएको ID हो- #$5.\nकृपया कुनै बेला सोधनी गर्नु परे उपर्युक्त विवरण दर्शाउनु होला ।",
        "blockednoreason": "कारण दिइएको छैन",
        "whitelistedittext": "पाना सम्पादन गर्न तपाँईले $1 गर्नु पर्दछ।",
        "accmailtext": "जथाभावीरूपमा सृजना गरिएको प्रवेशशब्द प्रयोगकर्ता [[User talk:$1|$1]] को  $2 मा पठाइएको छ।\n\nयो नयाँ खाताको प्रवेशशब्द  ''[[Special:ChangePassword|change password]]'' मा प्रवेश गरेर परिवर्तन गर्न सकिन्छ ।",
        "newarticle": "(नयाँ)",
        "newarticletext": "तपाईंले अहिले सम्म नभएको पृष्ठको लिङ्क पहिल्याउनु भएको छ।\nयो पृष्ठ निर्माण गर्न तलको कोष्ठमा टाइप गर्नुहोस्  ।(थप जानकारीको लागि [$1 help page] हेर्नुहोस् )।\nयहाँ त्यत्तिकै आइपुग्नु भएको हो भने , ब्राउजरको  '''back''' बटन थिच्नुहोस् ।",
-       "anontalkpagetext": "----''यो वार्तालाप पृष्ठ अज्ञात प्रयोगकर्ताको हो जसले अहिलेसम्म खाता बनाएकै छैन, अथवा जसले यस पृष्ठको उपयोग गर्दैन।\nयस कारण हामीले उसलाई उसको आइ पी (IP) ठेगानाले चिन्न सक्छौं। \nयस्तो आइ पी (IP) ठेगाना धेरै प्रयोगकर्ताहरूको साझा हुनसक्छ।\nयदि तपाईं अज्ञात प्रयोगकर्ता हुनुहुन्छ र तपाईंमाथि अचाहिँदो टिप्पणी भएको अनुभव गर्नुहुन्छ भने भविष्यमा अन्य अज्ञात प्रयोगकर्तासितको भ्रमबाट बाँच्न कृपया [[Special:CreateAccount|खाता खोल्नुहोस्]] अथवा [[Special:UserLogin|प्रवेश गर्नुहोस्]] ''",
+       "anontalkpagetext": "----''यो वार्तालाप पृष्ठ अज्ञात प्रयोगकर्ताको हो जसले अहिलेसम्म खाता बनाएकै छैन, अथवा जसले यस पृष्ठको उपयोग गर्दैन।\nयस कारण हामीले उसलाई उसको आइपी ठेगानाले चिन्न सक्छौं। \nयस्तो आइपी ठेगाना धेरै प्रयोगकर्ताहरूको साझा हुनसक्छ।\nयदि तपाईं अज्ञात प्रयोगकर्ता हुनुहुन्छ र तपाईंमाथि अचाहिँदो टिप्पणी भएको अनुभव गर्नुहुन्छ भने भविष्यमा अन्य अज्ञात प्रयोगकर्तासित अलमलिनबाट बच्न कृपया [[Special:CreateAccount|खाता खोल्नुहोस्]] अथवा [[Special:UserLogin|प्रवेश गर्नुहोस्]] ''",
        "noarticletext": "यस लेखमा अहिले केहि पनि पाठ छैन ।\nतपाईंले अन्य पृष्ठमा [[Special:Search/{{PAGENAME}}|यस पृष्ठको शीर्षकको लागि खोज]] गर्न सक्नुहुन्छ ।\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} पृष्ठ सम्बन्धित ढड्डामा खोज],\nवा [{{fullurl:{{FULLPAGENAME}}|action=edit}}  यसै पृष्ठलाई सम्पादन गर्ने]</span>.",
        "noarticletext-nopermission": "यस लेखमा अहिले कुनै पनि पाठ छैन ।\nतपाईंले अन्य पृष्ठमा [[Special:Search/{{PAGENAME}}|यस पृष्ठको शीर्षकको लागि खोज]] गर्न सक्नुहुन्छ,\nअथवा <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|पृष्ठ={{FULLPAGENAMEE}}}} सम्बन्धित लगहरू खोज्न सक्नुहुनेछ ]</span> तर तपाईंलाई नयाँ पृष्ठ बनाउने अधिकार छैन।",
        "missing-revision": "\"{{FULLPAGENAME}}\" पृष्ठको अवतरण #$1 रहेको छैन।\n\nसामान्य रूपमा यसो एउटा हटाइएको पृष्ठको पुरानो लिङ्कमा क्लिक गर्दा हुन्छ।\nअधिक जानकारीको लागि तपाईं [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} हटाएको लग] हेर्न सक्नुहुन्छ।",
        "recentchangeslinked-feed": "सम्बन्धित परिवर्तनहरू",
        "recentchangeslinked-toolbox": "सम्बन्धित परिवर्तनहरू",
        "recentchangeslinked-title": "\"$1\" सँग सम्बन्धित परिवर्तन",
-       "recentchangeslinked-summary": "यà¥\8b à¤¸à¥\82à¤\9aà¥\80 à¤¨à¤¿à¤°à¥\8dदिषà¥\8dà¤\9f à¤ªà¥\83षà¥\8dठ (वा à¤¨à¤¿à¤°à¥\8dदिषà¥\8dà¤\9f à¤¶à¥\8dरà¥\87णà¥\80)सित à¤\9cà¥\8bडिà¤\8fà¤\95ा à¤­à¤°à¥\8dà¤\96रà¥\88 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤­à¤\8fà¤\95ा à¤ªà¥\83षà¥\8dठà¤\95à¥\8b  à¤¹à¥\8b à¥¤ [[Special:Watchlist|तपाà¤\88à¤\82à¤\95à¥\8b à¤¨à¤¿à¤\97रानà¥\80 सूची]]का पृष्ठहरू <strong>गाढा अक्षरमा</strong> छन् ।",
+       "recentchangeslinked-summary": "à¤\95à¥\81नà¥\88 à¤ªà¥\83षà¥\8dठà¤\95à¥\8b à¤µà¤¾  à¤¯à¤¸à¤¸à¤\81à¤\97 à¤¸à¤®à¥\8dबनà¥\8dधित à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¹à¥\87रà¥\8dनà¤\95à¥\8b à¤²à¤¾à¤\97ि à¤\89à¤\95à¥\8dत à¤ªà¥\83षà¥\8dठà¤\95à¥\8b à¤¨à¤¾à¤® à¤¹à¤¾à¤²à¥\8dनà¥\81हà¥\8bस। (à¤\95à¥\81नà¥\88 à¤¶à¥\8dरà¥\87णà¥\80à¤\95à¥\8b à¤¸à¤¾à¤®à¤¾à¤\97à¥\8dरà¥\80हरà¥\81à¤\95à¥\8b à¤²à¤¾à¤\97ि {{ns:category}}: à¤¶à¥\8dरà¥\87णà¥\80à¤\95à¥\8b à¤¨à¤¾à¤® à¤¹à¤²à¥\8dनà¥\81हà¥\8bस à¥¤  [[Special:Watchlist|तपाà¤\88à¤\82à¤\95à¥\8b à¤\85वलà¥\8bà¤\95न सूची]]का पृष्ठहरू <strong>गाढा अक्षरमा</strong> छन् ।",
        "recentchangeslinked-page": "पृष्ठ नाम:",
        "recentchangeslinked-to": "यसको सट्टा यो पृष्ठसँग जोडिएका पृष्ठहरूको परिवर्तन देखाउने",
        "upload": "फाइल उर्ध्वभरण",
        "unwatchthispage": "निगरानीबाट हटाउने",
        "notanarticle": "सामाग्री सहितको पेज हैन",
        "notvisiblerev": "पूर्वावलोकन हटाइयो",
-       "watchlist-details": "तपाà¤\88à¤\82à¤\95à¥\8b à¤¨à¤¿à¤\97रानà¥\80 à¤¸à¥\82à¤\9aà¥\80मा à¤°à¤¹à¥\87à¤\95ा {{PLURAL:$1|$1 à¤ªà¥\83षà¥\8dठ|$1 à¤ªà¥\83षà¥\8dठहरà¥\82}} à¤µà¤¾à¤°à¥\8dतालाप à¤ªà¥\83षà¥\8dठ à¤\97निà¤\8fà¤\95ा à¤\9bà¥\88ननà¥\8d।",
+       "watchlist-details": "तपाà¤\88à¤\82à¤\95à¥\8b à¤\85वलà¥\8bà¤\95न à¤¸à¥\82à¤\9aà¥\80मा à¤°à¤¹à¥\87à¤\95ा {{PLURAL:$1|$1 à¤ªà¥\83षà¥\8dठ|$1 à¤ªà¥\83षà¥\8dठहरà¥\82}} (तथा à¤µà¤¾à¤°à¥\8dतालाप à¤ªà¥\83षà¥\8dठहरà¥\82)।",
        "wlheader-enotif": "ईमेल जानकारी सक्रिय गरियो ।",
        "wlheader-showupdated": "तपाईंले पछिल्लो पल्ट भ्रमण गरेपछि परिवर्तन भएका पृष्ठहरूलाई <strong>गाढा<strong> गरेर देखाइएको छ ।",
        "wlnote": "$3 र $4 अनुसार विगत {{PLURAL:$2|घण्टामा|'''$2''' घण्टाहरूमा}} {{PLURAL:$1|गरिएको अन्तिम परिवर्तन तल दिइएकोछ|गरिएका अन्तिम  '''$1''' परिवर्तनहरू तल दिइएका छन्}}।",
        "markedaspatrollederrornotify": "गस्ती अङ्कित गर्न विफल।",
        "patrol-log-page": "निगरानीको लग",
        "patrol-log-header": "गस्ती गरिएका संस्करणहरूको लग यस प्रकार रहेका छन् ।",
-       "log-show-hide-patrol": "$1 निगरानी लग",
-       "log-show-hide-tag": "$1 ट्याग लग",
        "confirm-markpatrolled-button": "ठीक छ",
        "deletedrevision": "पुराना पुनरावलोकनहरू $1 मेटिए",
        "filedeleteerror-short": "$1 फाइल मेटाइमा भूल",
        "version-libraries-description": "वर्णन",
        "version-libraries-authors": "लेखकहरू",
        "redirect": "फाइल, प्रयोगकर्ता, वा संशोधन आइडीको आधारमा अनुप्रेषित गर्ने",
-       "redirect-summary": "यस à¤µà¤¿à¤¶à¥\87ष à¤ªà¥\83षà¥\8dठ (पà¥\8dरदान à¤\97रिà¤\8fà¤\95à¥\8b à¤«à¤¾à¤\87लनाम), à¤ªà¥\83षà¥\8dठà¤\95à¥\8b (पà¥\83षà¥\8dठ à¤\86à¤\87डà¥\80 à¤\85थवा à¤\85वतरण à¤\86à¤\87डà¥\80), à¤µà¤¾ (पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤\86à¤\87डà¥\80) à¤°à¤¾à¤\96à¥\8dदा à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dतापà¥\83षà¥\8dठमा à¤®à¤¾ à¤¸à¤¾à¤°à¤¿à¤¨à¥\87à¤\9b। à¤\89दाहरण: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], à¤µà¤¾ [[{{#Special:Redirect}}/user/101]]।",
+       "redirect-summary": "यस à¤µà¤¿à¤¶à¥\87ष à¤ªà¥\83षà¥\8dठ (पà¥\8dरदान à¤\97रिà¤\8fà¤\95à¥\8b à¤«à¤¾à¤\87लनाम), à¤ªà¥\83षà¥\8dठà¤\95à¥\8b (पà¥\83षà¥\8dठ à¤\86à¤\87डà¥\80 à¤\85थवा à¤\85वतरण à¤\86à¤\87डà¥\80), à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤ªà¥\83षà¥\8dठ (पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤\86à¤\87डà¥\80) à¤µà¤¾ à¤²à¤\97 à¤\87नà¥\8dà¤\9fà¥\8dरà¥\80 (दिà¤\88à¤\8fà¤\95à¥\8b à¤²à¤\97 à¤\86à¤\87डà¥\80) à¤°à¤¾à¤\96à¥\8dदा à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤ªà¥\83षà¥\8dठमा à¤\85नà¥\81पà¥\8dरà¥\87षण à¤¹à¥\81नà¥\87à¤\9b à¥¤ à¤\89दाहरण: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]] à¤µà¤¾  [[{{#Special:Redirect}}/logid/186]]।",
        "redirect-submit": "जाने",
        "redirect-lookup": "खोजी:",
        "redirect-value": "मानः",
index 5e9df7c..3613d2d 100644 (file)
        "diff-paragraph-moved-toold": "Deze paragraaf is verplaatst. Klik om naar de oude locatie te springen.",
        "difference-missing-revision": "{{PLURAL:$2|Eén versie|$2 versies}} van deze verschillen ($1) {{PLURAL:$2|is|zijn}} niet aangetroffen.\n\nDit wordt meestal veroorzaakt door het volgen van een verouderde koppeling verschillen voor een pagina die is verwijderd.\nMeer gegevens zijn mogelijk te vinden in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderingslogboek].",
        "searchresults": "Zoekresultaten",
+       "search-filter-title-prefix": "Alleen zoeken naar pagina's waarvan de titel begint met \"$1\"",
+       "search-filter-title-prefix-reset": "Alle zoeken naar alle pagina's",
        "searchresults-title": "Zoekresultaten voor \"$1\"",
        "titlematches": "Overeenkomst met onderwerp",
        "textmatches": "Overeenkomst met inhoud",
        "speciallogtitlelabel": "Doel (paginanaam of {{ns:user}}:gebruikersnaam voor gebruiker):",
        "log": "Logboeken",
        "logeventslist-submit": "Weergeven",
-       "logeventslist-more-filters": "Meer filters:",
+       "logeventslist-more-filters": "Toon extra logboeken:",
        "logeventslist-patrol-log": "Markeerlogboek",
        "logeventslist-tag-log": "Labellogboek",
        "all-logs-page": "Alle openbare logboeken",
        "markedaspatrollederrornotify": "Markeren als gecontroleerd mislukt.",
        "patrol-log-page": "Markeerlogboek",
        "patrol-log-header": "Dit logboek bevat versies die gemarkeerd zijn als gecontroleerd.",
-       "log-show-hide-patrol": "markeerlogboek $1",
-       "log-show-hide-tag": "labellogboek $1",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Wilt u bewerking $3 van $2 als gecontroleerd markeren?",
        "deletedrevision": "De oude versie $1 is verwijderd",
index 1e14438..81cb5e8 100644 (file)
        "dellogpage": "Slettelogg",
        "dellogpagetext": "Her er ei liste over dei siste slettingane.",
        "deletionlog": "slettelogg",
+       "logentry-create-create": "$1 {{GENDER:$2|oppretta}} sida $3",
        "reverted": "Attenderulla til ein tidlegare versjon",
        "deletecomment": "Årsak:",
        "deleteotherreason": "Annan grunn:",
        "markedaspatrollederrornotify": "Det gjekk ikkje å merkja endringa som patruljert.",
        "patrol-log-page": "Patruljeringslogg",
        "patrol-log-header": "Dette er ein logg over patruljerte sideversjonar.",
-       "log-show-hide-patrol": "$1 patruljeringslogg",
-       "log-show-hide-tag": "$1 merkelogg",
        "deletedrevision": "Slett gammal versjon $1",
        "filedeleteerror-short": "Feil ved sletting av fila: $1",
        "filedeleteerror-long": "Det vart ein feil under filslettinga av:\n\n$1",
index 0810158..6913368 100644 (file)
        "markedaspatrollederrornotify": "Fracàs del marcatge coma contrarotlat.",
        "patrol-log-page": "Istoric de las versions patrolhadas",
        "patrol-log-header": "Vaquí un jornal de las versions patrolhadas.",
-       "log-show-hide-patrol": "$1 l'istoric de las relecturas",
-       "log-show-hide-tag": "$1 lo jornal de las balisas",
        "confirm-markpatrolled-button": "D'acòrdi",
        "deletedrevision": "La version anciana $1 es estada suprimida.",
        "filedeleteerror-short": "Error al moment de la supression del fichièr : $1",
index b5f8913..602eaa4 100644 (file)
        "markedaspatrollederrornotify": "ଶ୍ରେଣୀବିଭାଗ କରିହେଲାନି ।",
        "patrol-log-page": "ଜଗିବା ଇତିହାସ",
        "patrol-log-header": "ଏହା ଏକ ଜଗାଯାଇଥିବା ସଂସ୍କରଣର ଇତିହାସ ।",
-       "log-show-hide-patrol": "$1 ଜଗିବା ଇତିହାସ",
        "deletedrevision": "ଲିଭାଯାଇଥିବା ପୁରୁଣା $1",
        "filedeleteerror-short": "ଫାଇଲ ଲିଭାଇବାରେ ଅସୁବିଧା: $1",
        "filedeleteerror-long": "ତଳଲିଖିତ ଫାଇଲକୁ ଲିଭାଇବାରେ ଅସୁବିଧା:\n\n$1",
index 2d0ff9b..a897ee6 100644 (file)
        "markedaspatrollederrornotify": "Oznaczenie strony jako sprawdzonej nie powiodło się.",
        "patrol-log-page": "Rejestr patrolowania",
        "patrol-log-header": "Poniżej znajduje się rejestr patrolowania stron.",
-       "log-show-hide-patrol": "$1 rejestr sprawdzania",
-       "log-show-hide-tag": "$1 rejestr znaczników",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Oznaczyć wersję $3 strony $2 jako sprawdzoną?",
        "deletedrevision": "Usunięto poprzednie wersje $1",
index 726c303..f837484 100644 (file)
        "markedaspatrollederrornotify": "Marcadura com verificà falìa.",
        "patrol-log-page": "Registr dij contròj",
        "patrol-log-header": "Cost-sì a l'é un registr ëd le revision controlà.",
-       "log-show-hide-patrol": "$1 registr verificà",
-       "log-show-hide-tag": "tichëtta d'argistr $1",
        "deletedrevision": "Veja version scancelà $1",
        "filedeleteerror-short": "Eror ën scanceland l'archivi: $1",
        "filedeleteerror-long": "A-i son ësta-ie dj'eror ën scanceland l'archivi:\n\n$1",
index 9e105c7..449de37 100644 (file)
        "pageinfo-edits": "تبدیلیاں گنتی",
        "pageinfo-authors": "وکھرے لکھاریاں دی گنتی",
        "pageinfo-toolboxlink": "صفحہ جانکاری",
+       "pageinfo-protect-cascading-yes": "ہاں",
        "markaspatrolleddiff": "ویکھے گۓ دا نشان لاؤ",
        "markaspatrolledtext": "ایس صفے تے ویکھن دا نشان لاؤ",
        "markedaspatrolled": "ویکھن دا نشان لاؤ",
        "markedaspatrollederror-noautopatrol": "تھوانوں اے اجازت نئیں جے تسی اپنی تبدیلیاں تے گشت دا نشان لاؤ۔",
        "patrol-log-page": "گشت لاگ",
        "patrol-log-header": "اے گست لائیآں ہوئیآن ریوین دی لاگ اے۔",
-       "log-show-hide-patrol": "$1 گشت لاگ",
        "deletedrevision": "پرانیاں مٹائیاں ریوین $1",
        "filedeleteerror-short": "فاغل مٹان چ غلطی: $1",
        "filedeleteerror-long": "فائل مٹان لگیاں غلطیاں ہوئیاں:\n$1",
        "logentry-newusers-create": "$1 {{GENDER:$2|بنایا}} اک ورتن والا کھاتہ",
        "logentry-newusers-create2": "$1 {{GENDER:$2|بنایا}} {{GENDER:$4|اک ورتن کھاتہ}} $3",
        "logentry-newusers-autocreate": "کھاتہ $1 اپنے آپ ای {{GENDER:$2|بنایا گیا}} بنایا گیا۔",
+       "logentry-protect-protect": "$1 نے $3 نوں {{GENDER:$2|محفوظ کیتا}}  $4",
        "logentry-upload-upload": "$1 {{جنس:$2|چڑھائی گئی}} $3",
        "rightsnone": "(کوئی وی نئیں)",
        "feedback-adding": "مشورہ  صفے تے دیو۔۔۔۔۔۔۔",
index d4923fe..27f1641 100644 (file)
        "markedaspatrollederror-noautopatrol": "Ni assei enwarīntan, kāi pazentlitun swajjans kitawīdinsnans kāigi \"izbandātans\".",
        "patrol-log-page": "Izbandāsnas registerin",
        "patrol-log-header": "Sta ast izbandātan wersiōnin regīsterin.",
-       "log-show-hide-patrol": "$1 izbandāsnas registerin",
        "deletedrevision": "Āupausinā di panzdaumans wersiōnins stesse $1",
        "filedeleteerror-short": "Blānda prei zūrbrukes $1 āupausinsnan",
        "filedeleteerror-long": "Blāndas tikka prei zūrbrukes āupausinsnan:\n\n$1",
index ad46b4d..210aebe 100644 (file)
        "markedaspatrollederrornotify": "د څارل شوي په توگه په نښه کول نابريال شو.",
        "patrol-log-page": "د څارنې يادښت",
        "patrol-log-header": "دا د څارل شويو مخکتنو يو يادښت دی.",
-       "log-show-hide-patrol": "د څارنې يادښت $1",
-       "log-show-hide-tag": "نښلن يادښت $1",
        "confirm-markpatrolled-button": "ښه",
        "deletedrevision": "د $1 زړه ړنگه شوې بڼه",
        "filedeleteerror-short": "د دوتنې د ړنگولو ستونزه: $1",
index a947f6b..1551ac1 100644 (file)
        "markedaspatrollederrornotify": "Falha ao marcar como patrulhada.",
        "patrol-log-page": "Registro de edições patrulhadas",
        "patrol-log-header": "Este é um registro de edições patrulhadas.",
-       "log-show-hide-patrol": "$1 registro de edições patrulhadas",
-       "log-show-hide-tag": "$1 etiqueta de log",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Marque a revisão $3 de $2 como patrulhado?",
        "deletedrevision": "Apagou a versão antiga $1",
index 33047fe..aedf188 100644 (file)
        "converter-manual-rule-error": "Erro detetado na regra de conversão de língua manual",
        "undo-success": "É possível desfazer a edição.\nVerifique a comparação abaixo, por favor, para se certificar de que corresponde ao que pretende fazer.\nDepois grave as alterações, para finalizar e desfazer a edição.",
        "undo-failure": "Não foi possível desfazer a edição por conflito com alterações intermédias.",
+       "undo-main-slot-only": "Não foi possível desfazer a edição porque ela envolve conteúdo fora da zona principal.",
        "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]])",
        "diff-paragraph-moved-toold": "O parágrafo foi movido. Clique para saltar para a posição anterior.",
        "difference-missing-revision": "{{PLURAL:$2|Uma revisão|$2 revisões}} desta diferença ($1) não {{PLURAL:$2|foi encontrada|foram encontradas}}.\n\nIsto é geralmente causado por seguir uma hiperligação de diferenças desatualizada para uma página que foi eliminada.\nOs detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminação].",
        "searchresults": "Resultados da pesquisa",
+       "search-filter-title-prefix": "A pesquisar só nas páginas cujo título começa por \"$1\"",
+       "search-filter-title-prefix-reset": "Pesquisar em todas as páginas",
        "searchresults-title": "Resultados da pesquisa de \"$1\"",
        "titlematches": "Resultados no título das páginas",
        "textmatches": "Resultados no conteúdo das páginas",
        "speciallogtitlelabel": "Alvo (título ou página ou {{ns:user}}:nome de utilizador):",
        "log": "Registos",
        "logeventslist-submit": "Mostrar",
-       "logeventslist-more-filters": "Mais filtros:",
+       "logeventslist-more-filters": "Mostrar registos adicionais:",
        "logeventslist-patrol-log": "Registo de edições patrulhadas",
        "logeventslist-tag-log": "Registo de etiquetas",
        "all-logs-page": "Todos os registos públicos",
        "uctop": "(atual)",
        "month": "Até o mês:",
        "year": "Até o ano:",
+       "date": "Na data (e anteriores):",
        "sp-contributions-newbies": "Mostrar só as contribuições de contas recentes",
        "sp-contributions-newbies-sub": "Para contas novas",
        "sp-contributions-newbies-title": "Contribuições de contas novas",
        "markedaspatrollederrornotify": "A marcação como patrulhada falhou.",
        "patrol-log-page": "Registo de edições patrulhadas",
        "patrol-log-header": "Este é um registo de edições patrulhadas.",
-       "log-show-hide-patrol": "$1 registo de edições patrulhadas",
-       "log-show-hide-tag": "$1 registo de etiquetas",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Marcar a revisão $3 de $2 como patrulhada?",
        "deletedrevision": "Apagou a versão antiga $1",
index cc1614e..573c029 100644 (file)
        "difference-missing-revision": "Text displayed when the requested revision does not exist using a diff link.\n\nExample: [{{canonicalurl:Project:News|diff=426850&oldid=99999999}} Diff with invalid revision#]\n\nParameters:\n* $1 - the list of missing revisions IDs\n* $2 - the number of items in $1 (one or two)",
        "search-summary": "{{doc-specialpagesummary|search}}",
        "searchresults": "This is the title of the page that contains the results of a search.\n\n{{Identical|Search results}}",
+       "search-filter-title-prefix": "Subtitle added to indicate that the user is filtering for pages whose title starts with $1, \n* $1 - the title prefix",
+       "search-filter-title-prefix-reset": "Appears next to {{msg-mw|search-filter-title-prefix}} as a link to let users reset the prefix filter",
        "searchresults-title": "Appears as page title in the html header of the search result special page.\n\nParameters:\n* $1 - the search term",
        "titlematches": "Used as section header in [[Special:Search]].\n\nThis message is followed by search results.",
        "textmatches": "When displaying search results",
        "speciallogtitlelabel": "Used in [[Special:Log]] as a label for an input field with which the log can be filtered.  This filter selects for pages or users on which a log action was performed.",
        "log": "{{doc-special|Log}}\n{{Identical|Log}}",
        "logeventslist-submit": "Submit button on [[Special:Log]]\n{{Identical|Show}}",
-       "logeventslist-more-filters": "More filters label on [[Special:Log]]",
+       "logeventslist-more-filters": "Label on [[Special:Log]]. Some log types are hidden by default when viewing \"all\" logs, because they might be very verbose, and these options show them.",
        "logeventslist-patrol-log": "Patrol log option label on [[Special:Log]]",
        "logeventslist-tag-log": "Tag log option label on [[Special:Log]]",
        "all-logs-page": "{{doc-logpage}}\nTitle of [[Special:Log]].",
        "markedaspatrollederrornotify": "Notification shown after the user has failed to mark a change as patrolled.\n\nSee also:\n* {{msg-mw|Markedaspatrollednotify}} - notification on success",
        "patrol-log-page": "{{doc-logpage}}",
        "patrol-log-header": "Text that appears above the log entries on the [[Special:log|patrol log]].",
-       "log-show-hide-patrol": "Used in [[Special:Log]]. Parameters:\n* $1 - link text; one of {{msg-mw|Show}} or {{msg-mw|Hide}}\n{{Related|Log-show-hide}}",
-       "log-show-hide-tag": "Used in [[Special:Log]]. Parameters:\n* $1 - link text; one of {{msg-mw|Show}} or {{msg-mw|Hide}}\n{{Related|Log-show-hide}}",
        "confirm-markpatrolled-button": "Used as Submit button text.\n{{Identical|OK}}",
        "confirm-markpatrolled-top": "Confirmation message on interstitial form.\n\nParameters:\n* $1 - Target page title\n* $2 - Link to target page with page title as label\n* $3 - Link to recent change diff with revision ID as label",
        "deletedrevision": "Used as log comment. Parameters:\n* $1 - archive name of old image",
index 3275e0b..c734d04 100644 (file)
        "markedaspatrollederrornotify": "Qhawakipasqa niyqa manam aypanchu.",
        "patrol-log-page": "Qhawakipay hallch'a",
        "patrol-log-header": "Kayqa patrullasqa musuqchasqakunamanta hallch'asqam.",
-       "log-show-hide-patrol": "$1 patrullay hallch'a",
        "deletedrevision": "Qullusqam mawk'a qhawakipasqa $1",
        "filedeleteerror-short": "Manam atinichu kay willañiqita qulluyta: $1",
        "filedeleteerror-long": "Pantasqakunam rikch'akurqan kay willañiqita qulluypi:\n\n$1",
index 7bed158..c673979 100644 (file)
        "markedaspatrollederrornotify": "Sbagl durant marcar sco controllà.",
        "patrol-log-page": "Protocol da controllas",
        "patrol-log-header": "Quai è il protocol da las versiuns controlladas.",
-       "log-show-hide-patrol": "$1 il protocol da controllas",
        "deletedrevision": "Stizzà la versiun veglia $1.",
        "filedeleteerror-short": "Errur cun stizzar la datoteca: $1",
        "filedeleteerror-long": "Cun stizzar la datoteca èn errurs vegnidas constatadas:\n\n$1",
index 7259340..8598d92 100644 (file)
        "markedaspatrollederrornotify": "Marcarea ca patrulată a eșuat.",
        "patrol-log-page": "Jurnal verificări",
        "patrol-log-header": "Aceasta este o listă a tuturor versiunilor marcate ca verificate.",
-       "log-show-hide-patrol": "$1 jurnalul versiunilor verificate",
-       "log-show-hide-tag": "$1 jurnal etichete",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Marcați revizia $3 a $2 ca patrulată?",
        "deletedrevision": "A fost ștearsă vechea versiune $1.",
index 4bc493c..e32a7c2 100644 (file)
        "markedaspatrollederrornotify": "Signate cumme condrollate fallite.",
        "patrol-log-page": "Archivije de le condrolle",
        "patrol-log-header": "Quiste è l'archivije de le revisiune condrollate.",
-       "log-show-hide-patrol": "$1 archivije de le condrolle",
-       "log-show-hide-tag": "$1 archivije de le tag",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Signe 'a revisione $3 de $2 cumme condrollate?",
        "deletedrevision": "Vecchia revisione scangellete $1",
index c688b3f..36834f6 100644 (file)
        "diff-paragraph-moved-toold": "Пункт был перемещен. Нажмите, чтобы перейти к старому местоположению.",
        "difference-missing-revision": "Не {{PLURAL:$2|1=найдена|найдены}} {{PLURAL:$2|$2 версия|$2 версий|$2 версии|1=одна из версий}} для этого сравнения ($1).\n\nТакое обычно случается при переходе по устаревшей ссылке сравнения версий для страницы, которая была удалена.\nПодробности могут быть в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].",
        "searchresults": "Результаты поиска",
+       "search-filter-title-prefix-reset": "Искать все страницы",
        "searchresults-title": "Поиск «$1»",
        "titlematches": "Совпадения в названиях страниц",
        "textmatches": "Совпадения в текстах страниц",
        "rcfilters-filter-major-description": "Правки, не помеченные как малые.",
        "rcfilters-filtergroup-watchlist": "Страницы в списке наблюдения",
        "rcfilters-filter-watchlist-watched-label": "В списке наблюдения",
-       "rcfilters-filter-watchlist-watched-description": "Изменения страниц в вашем Списке наблюдения.",
+       "rcfilters-filter-watchlist-watched-description": "Изменения страниц в вашем списке наблюдения.",
        "rcfilters-filter-watchlist-watchednew-label": "Новые изменения в списке наблюдения",
        "rcfilters-filter-watchlist-watchednew-description": "Правки на страницах из вашего списка наблюдения, которые вы не просмотрели с их совершения.",
        "rcfilters-filter-watchlist-notwatched-label": "Нет в списке наблюдения",
        "rcfilters-watchlist-showupdated": "Изменения страниц, которые вы не посещали с того момента, как они изменились, выделены <strong>жирным</strong> и отмечены полным маркером.",
        "rcfilters-preference-label": "Скрыть улучшенную версию «Свежих правок»",
        "rcfilters-preference-help": "Откатывает редизайн интерфейса 2017 года и все инструменты, добавленные с тех пор.",
-       "rcfilters-watchlist-preference-label": "Скрыть улучшенную версию Списка наблюдения",
+       "rcfilters-watchlist-preference-label": "Скрыть улучшенную версию cписка наблюдения",
        "rcfilters-watchlist-preference-help": "Отменяет редизайн интерфейса 2017 года и все инструменты, добавленные тогда и позднее.",
        "rcfilters-filter-showlinkedfrom-label": "Показать правки на ссылаемых страницах",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>Страницы, на которые ссылается</strong> выбранная",
        "speciallogtitlelabel": "Цель (название или {{ns:user}}:имя участника):",
        "log": "Журналы",
        "logeventslist-submit": "Показать",
-       "logeventslist-more-filters": "Ð\91олÑ\8cÑ\88е Ñ\84илÑ\8cÑ\82Ñ\80ов:",
+       "logeventslist-more-filters": "Ð\9fоказаÑ\82Ñ\8c Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ\82елÑ\8cнÑ\8bе Ð¶Ñ\83Ñ\80налÑ\8b:",
        "logeventslist-patrol-log": "Журнал патрулирования",
        "logeventslist-tag-log": "Журнал меток",
        "all-logs-page": "Все доступные журналы",
        "tooltip-ca-talk": "Обсуждение основной страницы",
        "tooltip-ca-edit": "Редактировать данную страницу",
        "tooltip-ca-addsection": "Создать новый раздел",
-       "tooltip-ca-viewsource": "Эта страница защищена от изменений. Вы можете посмотреть и скопировать её исходный текст.",
+       "tooltip-ca-viewsource": "Эта страница защищена от изменений. Вы можете посмотреть  её исходный текст.",
        "tooltip-ca-history": "Журнал изменений страницы",
        "tooltip-ca-protect": "Защитить страницу от изменений",
        "tooltip-ca-unprotect": "Изменить защиту этой страницы",
        "markedaspatrollederrornotify": "Отметить изменение как проверенное не удалось.",
        "patrol-log-page": "Журнал патрулирования",
        "patrol-log-header": "Это журнал патрулированных версий.",
-       "log-show-hide-patrol": "$1 журнал патрулирования",
-       "log-show-hide-tag": "$1 журнал меток",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Пометить версию $3 страницы $2 как отпатрулированную?",
        "deletedrevision": "Удалена старая версия $1",
index 070f620..591f262 100644 (file)
        "markedaspatrollederrornotify": "Не вдало ся поставити позначку про патролёваня",
        "patrol-log-page": "Книга перевіреных едітовань",
        "patrol-log-header": "Тото є книга перевіреных верзій.",
-       "log-show-hide-patrol": "$1 книгу записів патролованя",
        "deletedrevision": "Змазана стара ревізія $1",
        "filedeleteerror-short": "Хыба мазаня файлу: $1",
        "filedeleteerror-long": "Выникла хыба під час мазаня файлу:\n\n$1",
index 513e64d..6ce1512 100644 (file)
        "markedaspatrollederrornotify": "समीक्षितम् इति चिह्नीकरणं विफलम्।",
        "patrol-log-page": "निरीक्षिता संरक्षितावलिः",
        "patrol-log-header": "इयम् आरक्षितपुनरावृत्तीनां सूचिका अस्ति ।",
-       "log-show-hide-patrol": "$1 इत्यनेन निरीक्षिता संरक्षितावलिः",
-       "log-show-hide-tag": "$1 चिह्नाऽऽवलिः",
        "deletedrevision": "अपमर्जितप्राचीनपुनरावृत्तिः $1",
        "filedeleteerror-short": "सञ्चिकानपमर्जने दोषः : $1",
        "filedeleteerror-long": " सञ्चिकानामपमर्जने आगता समस्या  $1",
index 2214def..0bad36e 100644 (file)
        "markedaspatrollederrornotify": "Бэлиэтэммит курдук бэлиэтиир сатаммата.",
        "patrol-log-page": "Бэрэбиэркэ сурунаала",
        "patrol-log-header": "Ботуруулламмыт торумнар сурунааллара.",
-       "log-show-hide-patrol": "$1 ботурууллааһын сурунаала",
-       "log-show-hide-tag": "$1 тиэк сурунаала",
        "confirm-markpatrolled-button": "Сөп",
        "confirm-markpatrolled-top": "$2 сирэй $3 торумун ботуруулламмыт курдук бэлиэтиигин дуо?",
        "deletedrevision": "$1 урукку торума сотулунна",
index fc69e1e..3f8abdf 100644 (file)
        "markedaspatrollederrornotify": "La marcatura comu virificatu nun arriniscìu.",
        "patrol-log-page": "Riggistru dî canciamenti virificati",
        "patrol-log-header": "Chistu è nu riggistru dî virsioni virificati.",
-       "log-show-hide-patrol": "$1 lu riggistru dî canciamenti virificati",
-       "log-show-hide-tag": "$1 lu riggistru di l'etichetti",
        "deletedrevision": "Cancillata na virsioni vecchia di $1",
        "filedeleteerror-short": "Erruri ntâ cancillazzioni dû file: $1",
        "filedeleteerror-long": "Ammatteru erruri ntô tintativu di cancillari lu file:\n\n$1",
index fd746f1..aabc640 100644 (file)
        "markedaspatrollederrornotify": "Maurking aes patrowed failed.",
        "patrol-log-page": "Patrow log",
        "patrol-log-header": "This is ae log o patrowed reveesions.",
-       "log-show-hide-patrol": "$1 patrow log",
-       "log-show-hide-tag": "$1 tag log",
        "deletedrevision": "Delytit auld reveesion $1.",
        "filedeleteerror-short": "Mistak delytin file: $1",
        "filedeleteerror-long": "mistaks were encoontered while delytin the file:\n\n$1",
index 435729a..a147e4b 100644 (file)
        "compareselectedversions": "چونڊيل پرت ڀيٽيو",
        "editundo": "اڻڪريو",
        "diff-empty": "(ڪو بہ تفاوت ڪونھي)",
+       "diff-multi-sameuser": "({{PLURAL:$1|هڪ تڪڙو مسودو|$1 تڪڙا مسودا}} ساڳي واپرائيندڙ طرفان ظهار نه ٿيندا)",
        "searchresults": "ڳولا نتيجا",
        "searchresults-title": "”$1“ لاءِ ڳولا نتيجا",
        "titlematches": "صفحي جو عنوان مشابھت رکي ٿو",
        "timezoneregion-indian": "سنڌي ساگر",
        "timezoneregion-pacific": "ماٺو ساگر",
        "allowemail": "ٻين واپرائيندڙن کي مون ڏانھن برقٽپال ڪرڻ جي اجازت ڏيو",
+       "email-allow-new-users-label": "نوان واپرائيندڙ برق ٽپال موڪلين",
        "prefs-searchoptions": "ڳولا",
        "prefs-namespaces": "نانءُپولار",
        "default": "ڏنل",
        "yourrealname": "اصل نالو:",
        "yourlanguage": "ٻولي:",
        "yournick": "نئين صحيح:",
+       "prefs-help-signature": "بحث صفحي تي رايا ڏيڻ وقت هن نشانين ذريعي \"<nowiki>~~~~</nowiki>\" دستخط ڪيو، جيڪي پاڻ مرادو توهان جي دستخط ۽ وقت ۾ تبديل ٿي ويندا.",
        "badsiglength": "اها صحيح هيڪاندي ڊگھي آهي.\nاها وڌ ۾ وڌ $1 {{PLURAL:$1|اکر|اکرن}} تي ٻڌل هوڻ گھرجي.",
        "yourgender": "توهان ڪهڙو تعارف چاهيندا؟",
        "gender-unknown": "توهان جو ذڪر ڪندي، جيترو ٿي سگھيو، منطقگري بي جنس لفظن جو استعمال ڪندي.",
        "gender-male": "هيءُ وڪي صفحا سنواريندو آهي",
        "gender-female": "هيءَ وڪي صفحا سنواريندي آهي",
+       "prefs-help-gender": "هن ترجيح جي تربيت اختياري آهي.\nاوهان يا ٻين واپرائيندڙن جو سافٽويئر ويليو ذريعي مناسب وياڪرڻي جنس مطابق ذڪر ڪندو.\nهي معلومات عام هوندي.",
        "email": "برقٽپال",
        "prefs-help-realname": "اصل نالو اختياري آهي.\nجيڪڏهن توهان اصل نالو ڄاڻائڻ جو فيصلو ٿا ڪريو، تہ اهو توهان کي توهان جي ڪم جي مڃتا ڏيڻ لاءِ ڪم آندو ويندو.",
        "prefs-help-email": "برقٽپال ڄاڻائڻ اختياري آهي، پر جڏهن توهان ڳجھولفظ وسري ويندا آهيو، تڏهن ان جو استعمال توهان کي نئون ڳجھولفظ ڏيڻ لاءِ استعمال ڪيو ويندو آهي.",
        "emailuser": "هن واپرائيندڙ کي برقٽپال اماڻيو",
        "emailuser-title-target": "ھن {{GENDER:$1|واپرائيندڙ}} ڏانھن برقٽپال موڪليو",
        "emailuser-title-notarget": "واپرائيندڙ ڏانھن برقٽپال اماڻيو",
+       "emailpagetext": "هيٺ ڏنل فارم جي ذريعي اوهان هن {{GENDER:$1|واپرائيندڙ}} کي برقي ٽپال پيغام موڪلي سگھو ٿا. جيڪو برق ٽپال پتو اوهان [[Special:Preferences|پنهنجي ترجيحات]] ۾ ڏنو آهي اهو هتي \"کان\" جي طور نظر ايندو، جيئن وصول ڪندڙ اوهان کي سڌو جواب ڏئي سگھي.",
        "usermaildisabled": "واپرائيندڙ برقٽپال ناقابلِڪار بڻيل",
        "usermaildisabledtext": "توهان هن وڪي تي ٻين واپرائيندڙن ڏانهن برقٽپال نٿا موڪلي سگھو",
        "noemailtitle": "برقٽپال پتو ناھي",
        "whatlinkshere-next": "{{PLURAL:$1|اڳيون|اڳيان $1}}",
        "whatlinkshere-links": "← ڳنڍڻا",
        "whatlinkshere-hideredirs": "$1 چوري ٿو",
+       "whatlinkshere-hidetrans": "$1 شموليت",
        "whatlinkshere-hidelinks": "$1 ڳنڍڻا",
        "whatlinkshere-hideimages": "$1 ڳنڍي ٿو",
        "whatlinkshere-filters": "ڇاڻيون",
        "movepagetext": "هيٺيون فارم استعمال ڪندي ڪنهن صفحي کي نئون عنوان ڏئي سگھجي ٿو، جنهن سان سمورو صفحو نئين عنوان ڏانهن هليو ويندو. \nاڳوڻو عنوان نئين عنوان ڏانهن چورڻو بنجي ويندو. \nتوهان  چورڻن کي سنواري سگھو ٿا جيڪي اصل عنوان ڏانهن خودبخود اشارو ڪن ٿا.\nانهي ڳالهه جي پڪ ڪري وٺو ته [[Special:BrokenRedirects|ٽٽل چورڻا]] يا [[Special:DoubleRedirects|ٻٽا چورڻا]] نه هجن.\nان ڳالهه جي پڪ ڪرڻ ذميواري توهان تي آهي ته ڳنڍڻا اتي ئي وٺي وڃن ٿا جتي انهن کي وٺي وڃڻ گھرجي.\n\nياد رکندا ته جيڪڏهن نئين عنوان سان اڳي ئي ڪو مضمون موجود آهي ته پوءِ صفحو '''نه''' چوريو ويندو، سوا ان جي ته موجوده صفحو محظ خالي آهي يا ڪا به سوانح نه رکندڙ ڪو چورڻو آهي.\n\n<strong>نوٽ!</strong>\nاها هڪ مقبول صفحي لاءِ ڪا غير متوقه ۽ انتهائي اڻوڻندڙ تبديلي ثابت ٿي سگھي ٿي؛ براءِ مهرباني اڳتي وڌڻ کان اڳ پڪ ڪندا ته توهان اها تبديلي آڻڻ جي نتيجن کان چڱيءَ ريت واقف آهيو.",
        "movepagetext-noredirectfixer": "هيٺيون فارم استعمال ڪندي ڪنهن صفحي کي نئون عنوان ڏئي سگھجي ٿو، جنهن سان سمورو صفحو نئين عنوان ڏانهن هليو ويندو. \nاڳوڻو عنوان نئين عنوان ڏانهن چورڻو بنجي ويندو. \nتوهان  چورڻن کي سنواري سگھو ٿا جيڪي اصل عنوان ڏانهن خودبخود اشارو ڪن ٿا.\nانهي ڳالهه جي پڪ ڪري وٺو ته [[Special:BrokenRedirects|ٽٽل چورڻا]] يا [[Special:DoubleRedirects|ٻٽا چورڻا]] نه هجن.\nان ڳالهه جي پڪ ڪرڻ ذميواري توهان تي آهي ته ڳنڍڻا اتي ئي وٺي وڃن ٿا جتي انهن کي وٺي وڃڻ گھرجي.\n\nياد رکندا ته جيڪڏهن نئين عنوان سان اڳي ئي ڪو مضمون موجود آهي ته پوءِ صفحو '''نه''' چوريو ويندو، سوا ان جي ته موجوده صفحو محظ خالي آهي يا ڪا به سوانح نه رکندڙ ڪو چورڻو آهي.\n\n<strong>نوٽ!</strong>\nاها هڪ مقبول صفحي لاءِ ڪا غير متوقه ۽ انتهائي اڻوڻندڙ تبديلي ثابت ٿي سگھي ٿي؛ مهرباني ڪري اڳتي وڌڻ کان اڳ پڪ ڪندا ته توهان اها تبديلي آڻڻ جي نتيجن کان چڱيءَ ريت واقف آهيو.",
        "movepagetalktext": "جيڪڏهن توهان هن خاني کي نشان لڳائيندئو، واسطيدار مباحثي صفحو پاڻ ئي چوريو ويندو ماسواءِ اتي ڪو اڳ ئي ڪو غيرخالي مباحثي صفحو موجود هجي.\n\nان صورت ۾، جيڪڏهن توهان چاهيو ته صفحي کي پاڻ چوري يا ضم ڪري سگھو ٿا.",
+       "movecategorypage-warning": "<strong>چتاءُ:</strong> اوهان زمري واري صفحي کي چورڻ وڃي رهيا آهيو. ياد رکو صرف صفحو چورندو، جيڪڏهن ڪي به صفحا پراڻي زمري ۾ شامل آهن، انهن جي نئين زمري ۾ درجابندي <em>نه</em> ٿيندي.",
        "movenotallowed": "توهان کي صفحا چورڻ جي اجازت حاصل ڪانهي.",
        "movenotallowedfile": "توهان کي فائيلس چورڻ جي اجازت حاصل ڪانهي.",
        "newtitle": "نئون عنوان:",
        "tooltip-compareselectedversions": "هن صفحي جن ٻن چونڊيل پرتن درميان تفاوت ڏسو.",
        "tooltip-watch": "هيءُ صفحو پنهنجي نظر ۾ فھرست ۾ شامل ڪريو",
        "tooltip-rollback": "\"واپس ورايو\" ھن صفحي ۾ پوئين ڀاڱيدار جي ڪيل ترميم(ن) کي ھڪ ٽڙڪ سان اڻڪري ٿو",
+       "tooltip-undo": "\"اڻڪريو\" هن ترميم کي واپس ڪيو ۽ پيش نگاه ۾ ترميم کي کوليو. اهو اوهان کي تت شامل ڪرڻ جو موقعو ڏيندو.",
        "tooltip-preferences-save": "ترجيحون سانڍيو",
        "tooltip-summary": "ننڍو خلاصو ڏيو",
        "anonymous": "{{SITENAME}} جا گمنام {{PLURAL:$1|واپرائيندڙ|واپرائيندڙَ}}",
        "sunday-at": "$1 بجي آچر",
        "yesterday-at": "$1 بجي ڪالهہ",
        "metadata": "اعدادِ اعداد",
+       "metadata-help": "هن فائل ۾ وڌيڪ ڄاڻ موجود آهي، جيڪو ڪنهن ڊجيٽل ڪيمرا يا اسڪينر متعلق آهي،  جنهن سان هي عڪس چٽيو ويو آهي. \nجيڪڏهن فائل ترميم ڪيل هجي ته پوءِ ممڪن آهي ته ڪجه ڄاڻ ضايع ٿي چڪو هجي.",
        "metadata-expand": "توسيعي تفصيل ڏيکاريو",
        "metadata-collapse": "توسيعي تفصيل لڪايو",
        "metadata-fields": "عڪس جي ميٽا ڊيٽا فيلڊ لسٽ ڪيل آهي هن پيغام ۾ جيڪو شامل ڪيو ويندو عڪس جي صفحي جي ڊسپلي تي، جڏهن ميٽا ڊيٽا جي ٽيبل ختم ٿيندي، ٻيا طئي ٿيل طريقي سان لڪل هوندا. \n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "watchlisttools-view": "لاڳاپيل تبديليون ڏسو",
        "watchlisttools-edit": "نظر ۾ فهرست ڏسو ۽ سنواريو",
        "watchlisttools-raw": "ڪچي نظر ۾ فھرست سنواريو",
+       "hijri-calendar-m1": "محرم",
+       "hijri-calendar-m2": "صفر",
+       "hijri-calendar-m3": "ربيع الاول",
+       "hijri-calendar-m4": "ربيع الثاني",
+       "hijri-calendar-m5": "جمادي الاول",
+       "hijri-calendar-m6": "جمادي الثاني",
+       "hijri-calendar-m7": "رجب",
+       "hijri-calendar-m8": "شعبان",
+       "hijri-calendar-m9": "رمضان",
        "hijri-calendar-m10": "شوال",
        "hijri-calendar-m11": "ذوالقعد",
+       "hijri-calendar-m12": "ذوالحج",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ڳالھ]])",
        "version": "ڀيرو",
        "version-extensions": "تنصيب شده توسيعات",
        "logentry-patrol-patrol-auto": "$1 پاڻمرادو صفحي $3 جي $4 مسودي تي گشت ڪيل طور {{GENDER:$2|نشان لڳايو}}",
        "logentry-newusers-create": "واپرائيندڙ کاتو $1 {{GENDER:$2|سرجيو ويو}}",
        "logentry-newusers-autocreate": "واپرائيندڙ کاتو $1 پاڻمرادو {{GENDER:$2|تخليق ڪيو}} ويو",
+       "logentry-protect-protect": "$1 {{GENDER:$2|محفوظ ڪيو}} $3 $4",
        "logentry-upload-upload": "$1 {{GENDER:$2|چاڙهيو}} $3",
        "logentry-upload-overwrite": "$1 $3 جو ھڪ نئون ورزن {{GENDER:$2|چاڙھيو}}",
        "rightsnone": "(ڪو بہ نہ)",
index d98c844..9a26fdc 100644 (file)
        "markedaspatrollederrornotify": "Goo ma šilbay kaŋ a ga kurandi.",
        "patrol-log-page": "Kuryan taariki",
        "patrol-log-header": "Woo ti filla kurantey taarikoo.",
-       "log-show-hide-patrol": "kuryan taariki $1",
        "deletedrevision": "Filla žeena tuusante $1",
        "filedeleteerror-short": "Tuku tuusuyan firka: $1",
        "filedeleteerror-long": "Firkayaŋ bangay tukoo tuusuyanoo waate:\n\n$1",
index e1e2ee9..be33940 100644 (file)
        "markedaspatrolled": "Pažīmiets kāp patėkrints",
        "markedaspatrolledtext": "Pasėrinkta versėjė siekmingā pažīmieta kāp patėkrinta",
        "patrol-log-page": "Patikrinėma istuorėjė",
-       "log-show-hide-patrol": "$1 patvirtėnėmu saraša",
        "deletedrevision": "Ėštrinta sena versėjė $1.",
        "filedeleteerror-short": "Klaida trėnont faila: $1",
        "previousdiff": "← Onkstesnis pakeitėms",
index f4b87ed..d8a7a88 100644 (file)
        "markedaspatrollederrornotify": "Nije uspjelo označavanje ove stranice kao patrolirane.",
        "patrol-log-page": "Evidencija patroliranja",
        "patrol-log-header": "Ovdje se nalazi evidencija patroliranih revizija.",
-       "log-show-hide-patrol": "$1 zapis patroliranja",
        "deletedrevision": "Obrisana stara revizija $1",
        "filedeleteerror-short": "Greška pri brisanju datoteke: $1",
        "filedeleteerror-long": "Desile su se greške pri brisanju datoteke:\n\n$1",
index 3d4068c..ebec299 100644 (file)
        "markedaspatrollederror-noautopatrol": "ඔබගේ ස්වීය වෙනස්වීම් පරික්‍ෂාකර බැලූ ලෙස සලකුණු කිරීමට ඔබ හට ඉඩ දෙනු නොලැබේ.",
        "patrol-log-page": "පරික්ෂාකිරීම් සටහන",
        "patrol-log-header": "මෙය පරික්‍ෂාකර බැලූ සංශෝධනයන්ගේ ලඝු-සටහනකි.",
-       "log-show-hide-patrol": "පරික්‍ෂාකිරීම් ලඝු-සටහන් $1",
-       "log-show-hide-tag": "$1 ටැගය ලඝු-සටහන",
        "deletedrevision": "පැරැණි සංශෝධනය $1 මකාදමන ලදි",
        "filedeleteerror-short": "ගොනුව මකාදැමීමේ දෝෂය: $1",
        "filedeleteerror-long": "ගොනුව මකාදැමීමේදී දෝෂයන් හමුවුණි:\n\n$1",
index 3f26e1b..4accf55 100644 (file)
        "dellogpage": "Záznam zmazaní",
        "dellogpagetext": "Tu je zoznam posledných zmazaní.",
        "deletionlog": "záznam zmazaní",
+       "log-name-create": "Záznam vytvorení stránok",
+       "log-description-create": "Toto je zoznam posledných vytvorených stránok.",
        "reverted": "Obnovené na skoršiu verziu",
        "deletecomment": "Dôvod:",
        "deleteotherreason": "Iný/ďalší dôvod:",
        "markedaspatrollederrornotify": "Nepodarilo sa označiť ako preverené.",
        "patrol-log-page": "Záznam preverených úprav",
        "patrol-log-header": "Toto je záznam preverených revízií.",
-       "log-show-hide-patrol": "$1 záznam preverených úprav",
-       "log-show-hide-tag": "$1 záznam značiek",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Označiť revíziu $3 stránky $2 ako preverenú?",
        "deletedrevision": "Zmazať staré verzie $1",
index f5d84d8..a9d9e7c 100644 (file)
@@ -9,7 +9,7 @@
        "tog-hideminor": "چھوٹیاں تبدیلیاں لُکاؤ",
        "tog-hidepatrolled": "تازہ تبدیلیاں وچوں زیرنگرانی تبدیلیاں لکاؤ",
        "tog-newpageshidepatrolled": "نویں ورقیاں دی فہرست وچوں نگرانی ہیٹھ ورقے لُکاؤ",
-       "tog-hidecategorization": "Ù\88رÙ\82Û\8cاں Ø¯Û\8cاں Ù\82سÙ\85 بندی لُکاؤ",
+       "tog-hidecategorization": "Ù\88رÙ\82Û\8cاں Ø¯Û\8cاں Ù\88Ù\86Ú©Û\8c بندی لُکاؤ",
        "tog-numberheadings": "سرخیاں کوں خود کار نمبر ݙیوو",
        "tog-showtoolbar": "آلات ترمیم ݙکھاؤ",
        "tog-editondblclick": "ڈبل کلک نال ورقے وچ تبدیلیاں کرو",
@@ -20,8 +20,8 @@
        "tog-watchlisthideown": "میݙیاں تبدیلیاں اکھیں ہیٹھ فہرست وچوں لکاؤ",
        "tog-watchlisthidebots": "بوٹ دیاں تبدیلیاں اکھیں ہیٹھ فہرست وچوں لکاؤ",
        "tog-watchlisthideminor": "چھوٹیاں تبدیلیاں اکھیں ہیٹھ فہرست وچوں لکاؤ",
-       "tog-watchlisthidecategorization": "Ù\88رÙ\82Û\8cاں Ø¯Û\8cاں Ù\82سÙ\85 بندی لُکاؤ",
-       "tog-showhiddencats": "Ù\84Ú³Û\8cاں Ù\82سÙ\85اں ݙکھاؤ",
+       "tog-watchlisthidecategorization": "Ù\88رÙ\82Û\8cاں Ø¯Û\8cاں Ù\88Ù\86Ú©Û\8c بندی لُکاؤ",
+       "tog-showhiddencats": "Ù\84Ú³Û\8cاں Ù\88Ù\86Ú©Û\8cاں ݙکھاؤ",
        "underline-always": "ہمیشہ",
        "underline-never": "کݙاہیں وی کائناں",
        "underline-default": "سکن یا براؤزر دا طے شدہ",
        "december-date": "$1 دسمبر",
        "period-am": "سویر",
        "period-pm": "شام",
-       "pagecategories": "{{PLURAL:$1|زمرہ|زمرہ جات}}",
-       "category_header": "زمرہ \"$1\" وچ ورقے",
-       "subcategories": "ذیلی زمرہ جات",
-       "category-media-header": "زمرہ \"$1\" وچ میڈیا",
+       "pagecategories": "{{PLURAL:$1|ونکی|ونکیاں}}",
+       "category_header": "ونکی \"$1\" وچ ورقے",
+       "subcategories": "ذیلی ونکیاں",
+       "category-media-header": "ونکی \"$1\" وچ میڈیا",
        "category-empty": "<em>ایں قسم وچ اڄݨ تائیں کوئی ورقہ یا میڈیا کائنی۔</em>",
-       "hidden-categories": "{{PLURAL:$1|Ù¾Ù\88Ø´Û\8cدÛ\81 Ø²Ù\85رÛ\81|Ù¾Ù\88Ø´Û\8cدÛ\81 Ø²Ù\85رÛ\81 Ø¬Ø§Øª}}",
-       "hidden-category-category": "Ù\84Ú©Û\8cاں Ù\82سÙ\85اں",
+       "hidden-categories": "{{PLURAL:$1|Ù\84Ú³Û\8c Ù\88Ù\86Ú©Û\8c\84Ù\8fÚ³Û\8cاں Ù\88Ù\86Ú©Û\8cاں}}",
+       "hidden-category-category": "Ù\84Ú©Û\8cاں Ù\88Ù\86Ú©Û\8cاں",
        "listingcontinuesabbrev": "جاری۔",
        "index-category": "فہرست شدہ ورقے",
        "noindex-category": "غیر فہرست شدہ صفحات",
        "faq": "عام طور تے پچھے ونڄݨ آلے سوال",
        "actions": "کم",
        "namespaces": "ناں جاہیں",
-       "variants": "Ù\82سÙ\85اں",
+       "variants": "Ù\88Ù\86Ú©Û\8cاں",
        "navigation-heading": "نیوی ڳیشݨ فہرست",
        "errorpagetitle": "نقص",
        "returnto": "واپس $1 چلو",
        "nstab-mediawiki": "سنیہہ",
        "nstab-template": "سانچہ",
        "nstab-help": "مدد ورقہ",
-       "nstab-category": "زمرہ",
+       "nstab-category": "ونکی",
        "mainpage-nstab": "وݙا ورقہ",
        "nosuchaction": "کوئی اینجھا کم کائنی",
        "nosuchspecialpage": "اینجھا کوئی خاص ورقہ کائنی",
        "templatesusedpreview": "ایں کچے کم تے  ورتے ڳئے {{PLURAL:$1|سانچے|سانچہ}}:",
        "template-protected": "(بچایا ڳیا)",
        "template-semiprotected": "(نیم محفوظ)",
-       "hiddencategories": "اÛ\8cÛ\81 Ù\88رÙ\82Û\81 {{PLURAL:$1|1 Ù\84Ù\8fÚ©Û\92 Ø²Ù\85رÛ\8cاں|$1 Ù\84کا Ø²Ù\85رÛ\81 }} وچ شامل ہے:",
+       "hiddencategories": "اÛ\8cÛ\81 Ù\88رÙ\82Û\81 {{PLURAL:$1|1 Ù\84Ù\8fÚ³Û\8cاں Ù\88Ù\86Ú©Û\8cاں|$1 Ù\84Ú³Û\8c Ù\88Ù\86Ú©Û\8c }} وچ شامل ہے:",
        "permissionserrors": "خطائے اجازت",
        "permissionserrorstext-withaction": "انہاں {{PLURAL:$1|وجہ|وجوہات}} پاروں تہاکوں$2 دی اجازت کائنی",
        "moveddeleted-notice": "ایہ ورقہ مٹایا ڳیا ہے۔ مٹاوݨ دا لاگ،حفاظت دا لاگ تے ورقہ ٹورݨ دا لاگ  حوالے کیتے ہیٹھاں ݙتے ہوئے ہن۔",
        "upload-form-label-usage-title": "استعمال",
        "upload-form-label-usage-filename": "فائل دا ناں",
        "upload-form-label-own-work": "یہ میݙا ذاتی کم ہے",
-       "upload-form-label-infoform-categories": "Ù\82سÙ\85اںØ\8c Ø²Ù\85رÛ\92",
+       "upload-form-label-infoform-categories": "Ù\88Ù\86Ú©Û\8cاں",
        "upload-form-label-infoform-date": "تاریخ",
        "backend-fail-delete": "مِسَل \"$1\" کوں مٹایا نی ونڄ سڳیا۔",
        "license": "اجازت نامہ:",
        "filedelete-submit": "مٹاؤ",
        "filedelete-maintenance-title": "مِسل نی مٹا سڳدے",
        "randompage": "رلے ملے ورقے",
-       "randomincategory-category": "Ù\82سÙ\85:",
+       "randomincategory-category": "Ù\88Ù\86Ú©Û\8c:",
        "randomincategory-submit": "ڄلو",
        "statistics": "شماريات",
        "statistics-pages": "ورقے",
        "allarticles": "سارے مقالے",
        "allpagessubmit": "ڄلو",
        "allpages-hide-redirects": "رجوع مکررات لکاؤ",
-       "categories": "زمرہ",
+       "categories": "ونکی",
        "categories-submit": "ݙِکھاؤ",
        "deletedcontributions": "ورتݨ آلے دے کم مٹا ݙتے ڳئے",
        "linksearch-ok": "ڳولو",
        "pageinfo-recent-edits": "حالیہ ترامیم دی تعداد (گزشتہ $1 وچ)",
        "pageinfo-recent-authors": "مختلف مصنفین دی حالیہ تعداد",
        "pageinfo-magic-words": "جادوئی {{PLURAL:$1|لفظ|الفاظ}} ($1)",
-       "pageinfo-hidden-categories": "Ù¾Ù\88Ø´Û\8cدÛ\81 {{PLURAL:$1|زÙ\85رÛ\81|زÙ\85رÛ\81 Ø¬Ø§Øª}} ($1)",
+       "pageinfo-hidden-categories": "Ù\84Ú³Û\92 {{PLURAL:$1|Ù\88Ù\86Ú©Û\8c\88Ù\86Ú©Û\8cاں}} ($1)",
        "pageinfo-templates": "زیر استعمال {{PLURAL:$1|سانچہ|سانچے}} ($1)",
        "pageinfo-toolboxlink": "معلومات ورقہ",
        "pageinfo-contentpage": "شمار بطور ورقہ",
index 81cba7f..a3d729e 100644 (file)
        "session_fail_preview": "Oprostite! Zaradi izgube podatkov o seji nam vašega urejanja žal ni uspelo obdelati.\n\nMorda ste bili odjavljeni. <strong>Prosimo, preverite, da ste še vedno prijavljeni, in poskusite znova.</strong>\nČe še vedno ne deluje, se poskusite [[Special:UserLogout|odjaviti]] in znova prijaviti; prav tako preverite, da vaš brskalnik dovoljuje piškotke s te strani.",
        "session_fail_preview_html": "Oprostite! Zaradi izgube podatkov o seji nam vašega urejanja ni uspelo obdelati.\n\n<em>Ker ima {{SITENAME}} omogočen surov HTML, smo predogled skrili kot previdnostni ukrep pred napadi z JavaScriptom.</em>\n\n<strong>Če gre za dobronameren poskus urejanja, vas prosimo, da poskusite znova.</strong>\nČe še vedno ne deluje, se poskusite [[Special:UserLogout|odjaviti]] in znova prijaviti; prav tako preverite, da vaš brskalnik dovoljuje piškotke s te strani.",
        "token_suffix_mismatch": "'''Vaše urejanje je bilo zavrnjeno, ker je vaš odjemalec pokvaril ločila v urejevalnem zahtevku.'''\nUrejanje je bilo zavrnjeno z namenom preprečitve okvare v besedilu strani.\nNajvečkrat je razlog uporaba hroščato spletno anonimizacijsko storitev.",
-       "edit_form_incomplete": "'''Nekateri deli urejevalnega obrazca niso dosegli strežnika; prepričajte se, da so vaša urejanja neokrnjena in poskusite znova.'''",
+       "edit_form_incomplete": "<strong>Nekateri deli urejevalnega obrazca niso dosegli strežnika; prepričajte se, da so vaša urejanja neokrnjena, in poskusite znova.</strong>",
        "editing": "Urejanje $1",
        "creating": "Ustvarjanje strani $1",
        "editingsection": "Urejanje $1 (razdelek)",
        "prefs-help-signature": "Komentarje na pogovornih straneh je treba podpisati s »<nowiki>~~~~</nowiki>«, kar bo pretvorjeno v vaš podpis s časovnim žigom.",
        "badsig": "Neveljaven surovi podpis; preverite oznake HTML.",
        "badsiglength": "Vaš podpis je preobsežen.\nNe sme biti daljši od $1 {{PLURAL:$1|znaka|znakov}}.",
-       "yourgender": "Kako vam je ljubše, da vas opišemo?",
-       "gender-unknown": "Ko boste omenjeni, bo programje uporabilo nevtralen spol, kjer je to mogoče",
+       "yourgender": "Kako želiš biti obravnavan?",
+       "gender-unknown": "Ob tvoji omembi bo programje uporabilo nevtralne izraze za spol, kjer je to mogoče",
        "gender-male": "On ureja wikistrani.",
        "gender-female": "Ona ureja wikistrani.",
        "prefs-help-gender": "Nastavitev ni obvezna.\nProgramje uporablja njeno vrednost za vaše naslavljanje in omenjanje v ustreznem slovničnem spolu.\nPodatek bo javno prikazan.",
        "rcfilters-liveupdates-button-title-on": "Izklopi posodobitve v živo",
        "rcfilters-liveupdates-button-title-off": "Prikaži nove spremembe, ko se zgodijo",
        "rcfilters-watchlist-markseen-button": "Označi vse spremembe kot pregledane",
-       "rcfilters-watchlist-edit-watchlist-button": "Uredite svoj seznam nadzorovanih strani",
+       "rcfilters-watchlist-edit-watchlist-button": "Uredi svoj seznam nadzorovanih strani",
        "rcfilters-watchlist-showupdated": "Spremembe strani, ki jih niste obiskali od zadnje spremembe, so prikazane <strong>krepko</strong>, z močnimi oznakami.",
        "rcfilters-preference-label": "Skrij izboljšano različico Zadnjih sprememb",
        "rcfilters-preference-help": "Povrne preoblikovanje vmesnika leta 2017 in vsa takrat in od takrat dodana orodja.",
        "watchlist": "Spisek nadzorov",
        "mywatchlist": "Spisek nadzorov",
        "watchlistfor2": "Za $1 $2",
-       "nowatchlist": "Vaš spisek nadzorov je prazen.",
+       "nowatchlist": "Tvoj spisek nadzorov je prazen.",
        "watchlistanontext": "Za pregled ali urejanje vsebine vašega spiska nadzorov se morate prijaviti.",
        "watchnologin": "Niste prijavljeni",
        "addwatch": "Dodaj na spisek nadzorov",
        "markedaspatrollederrornotify": "Označevanje kot nadzorovano ni uspelo.",
        "patrol-log-page": "Dnevnik patrulje",
        "patrol-log-header": "To je dnevnik nadzorovanih redakcij.",
-       "log-show-hide-patrol": "$1 dnevnik nadzora",
-       "log-show-hide-tag": "$1 dnevnik oznak",
        "confirm-markpatrolled-button": "V redu",
        "confirm-markpatrolled-top": "Označimo redakcijo $3 strani $2 kot nadzorovano?",
        "deletedrevision": "Prejšnja redakcija $1 je izbrisana",
        "lag-warn-high": "Zaradi visoke zasedenosti strežniških podatkovnih baz, spremembe novejše od $1 {{PLURAL:$1|sekunde|sekund}} morda ne bodo prikazane na seznamu.",
        "watchlistedit-normal-title": "Uredi spisek nadzorov",
        "watchlistedit-normal-legend": "Odstrani strani iz spiska nadzorov",
-       "watchlistedit-normal-explain": "Strani na vašem spisku nadzorov so prikazane spodaj.\nDa odstranite stran, označite kvadratek poleg nje in kliknite »{{int:Watchlistedit-normal-submit}}«.\nLahko tudi [[Special:EditWatchlist/raw|uredite gol spisek]].",
+       "watchlistedit-normal-explain": "Spodaj so prikazane strani tvojega spiska nadzorov.\nZa odstranitev strani označi kvadratek poleg nje in klikni »{{int:Watchlistedit-normal-submit}}«.\nLahko tudi [[Special:EditWatchlist/raw|urediš gol spisek]].",
        "watchlistedit-normal-submit": "Odstrani strani",
        "watchlistedit-normal-done": "Z vašega spiska nadzorov {{PLURAL:$1|je bila odstranjena $1 stran|sta bili odstranjeni $1 strani|so bile odstranjene $1 strani|je bilo odstranjenih $1 strani}}:",
        "watchlistedit-raw-title": "Urejanje golega spiska nadzorov",
index 0c01fdd..2514d5b 100644 (file)
        "markedaspatrollederror-noautopatrol": "Is ies ne erlaubt, eigene Beoarbeetunga ols kontrolliert zu markieren.",
        "patrol-log-page": "Kontroll-Logbichl",
        "patrol-log-header": "Dies ies doas Kontroll-Logbuch.",
-       "log-show-hide-patrol": "Kontroll-Logbichl $1",
        "deletedrevision": "aale Version: $1",
        "filedeleteerror-short": "Fahler bei Datei-Läschung: $1",
        "filedeleteerror-long": "Bei dar Datei-Läschung wurden Fahler festgestellt:\n\n$1",
index c1be4c3..d1f3d62 100644 (file)
        "markedaspatrollederrornotify": "Shënimi si i patrulluar dështoi.",
        "patrol-log-page": "Regjistri i patrollimeve",
        "patrol-log-header": "Këto janë të dhëna të revizioneve të patrulluara.",
-       "log-show-hide-patrol": "$1 regjistri i patrollimeve",
-       "log-show-hide-tag": "$1 regjistri i etiketave",
        "confirm-markpatrolled-button": "Në rregull",
        "confirm-markpatrolled-top": "Shëno versionin $3 nga $2 si të patrolluar",
        "deletedrevision": "Gris versionin e vjetër $1",
index d615041..c0515a5 100644 (file)
        "databaselocked": "База података је већ закључана.",
        "databasenotlocked": "База није закључана.",
        "lockedbyandtime": "(од $1 дана $2 у $3)",
-       "move-page": "Ð\9fÑ\80емеÑ\88Ñ\82аÑ\9aе â\80\9e$1â\80\9c",
+       "move-page": "Ð\9fÑ\80емеÑ\88Ñ\82аÑ\9aе â\80\9e$1â\80\9d",
        "move-page-legend": "Премештање странице",
        "movepagetext": "Доњи образац ће преименовати страницу, премештајући целу историју на ново име.\nСтари наслов постаће преусмерење на нови.\nМожете ажурирати преусмерења која воде до изворног наслова;\nпогледајте [[Special:DoubleRedirects|двострука]] или [[Special:BrokenRedirects|покварена]] преусмерења.\nНа вама је одговорност да везе и даље иду тамо где треба.\n\nСтраница <strong>неће</strong> бити премештена ако већ постоји страница с тим именом (осим ако је празна, садржи преусмерење или нема историју измена).\nТо значи да можете вратити страницу на претходно име ако погрешите, али не можете ''преписати'' постојећу.\n\n<strong>Напомена:</strong>\nОво може представљати драстичну и неочекивану измену за популарну страницу;\nдобро размислите о последицама пре него што наставите.",
        "movepagetext-noredirectfixer": "Доњи образац ће преименовати страницу, премештајући целу историју на ново име.\nСтари наслов постаће преусмерење на нови.\nПогледајте [[Special:DoubleRedirects|двострука]] или [[Special:BrokenRedirects|покварена]] преусмерења.\nНа вама је одговорност да везе и даље иду тамо где треба.\n\nСтраница <strong>неће</strong> бити премештена ако већ постоји страница с тим именом (осим ако је празна, садржи преусмерење или нема историју измена).\nТо значи да можете вратити страницу на претходно име ако погрешите, али не можете ''преписати'' постојећу.\n\n<strong>Напомена:</strong>\nОво може представљати драстичну и неочекивану измену за популарну страницу;\nдобро размислите о последицама пре него што наставите.",
        "markedaspatrollederrornotify": "Означавање ове измене патролираном није успело.",
        "patrol-log-page": "Дневник патролирања",
        "patrol-log-header": "Ово је дневник патролираних измена.",
-       "log-show-hide-patrol": "$1 дневник патролирања",
-       "log-show-hide-tag": "$1 дневник ознака",
        "confirm-markpatrolled-button": "У реду",
        "confirm-markpatrolled-top": "Означити измену $3 странице $2 патролираном?",
        "deletedrevision": "Обрисана стара измена $1.",
index 9164ff1..7d879a1 100644 (file)
                ]
        },
        "tog-underline": "Podvlačenje veza:",
-       "tog-hideminor": "Sakrij manje izmene u spisku skorašnjih izmena",
-       "tog-hidepatrolled": "Sakrij patrolirane izmene u spisku skorašnjih izmena",
+       "tog-hideminor": "Sakrij manje izmene sa spiska skorašnjih izmena",
+       "tog-hidepatrolled": "Sakrij patrolirane izmene sa spiska skorašnjih izmena",
        "tog-newpageshidepatrolled": "Sakrij patrolirane stranice sa spiska novih stranica",
        "tog-hidecategorization": "Sakrij kategorizaciju stranica",
        "tog-extendwatchlist": "Proširi spisak nadgledanja za prikaz svih izmena, ne samo skorašnjih",
-       "tog-usenewrc": "Grupni prikaz izmena svake pojedinačne stranice u skorašnjim izmenama i spisku nadgledanja",
+       "tog-usenewrc": "Grupiši izmene po stranici u skorašnjim izmenama i spisku nadgledanja",
        "tog-numberheadings": "Automatski numeriši podnaslove",
-       "tog-showtoolbar": "Prikaži traku s alatkama za uređivanje",
-       "tog-editondblclick": "Uređivanje stranica dvostrukim klikom",
+       "tog-showtoolbar": "Traka sa alatkama za uređivanje",
+       "tog-editondblclick": "Uredi stranice dvostrukim klikom",
        "tog-editsectiononrightclick": "Uređivanje odeljaka desnim klikom na njihove naslove",
-       "tog-watchcreations": "Dodaj stranice koje napravim i datoteke koje pošaljem u spisak nadgledanja",
-       "tog-watchdefault": "Dodaj stranice i datoteke koje izmenim u spisak nadgledanja",
-       "tog-watchmoves": "Dodaj stranice i datoteke koje premestim u spisak nadgledanja",
-       "tog-watchdeletion": "Dodaj stranice i datoteke koje obrišem u spisak nadgledanja",
-       "tog-watchuploads": "Dodaj datoteke koje otpremim u spisak nadgledanja",
-       "tog-watchrollback": "Dodaj stranice na kojima sam vratio izmene u spisak nadgledanja",
+       "tog-watchcreations": "Dodaj stranice koje napravim i datoteke koje otpremim u moj spisak nadgledanja",
+       "tog-watchdefault": "Dodaj stranice i datoteke koje izmenim u moj spisak nadgledanja",
+       "tog-watchmoves": "Dodaj stranice i datoteke koje premestim u moj spisak nadgledanja",
+       "tog-watchdeletion": "Dodaj stranice i datoteke koje obrišem u moj spisak nadgledanja",
+       "tog-watchuploads": "Dodaj datoteke koje otpremim u moj spisak nadgledanja",
+       "tog-watchrollback": "Dodaj stranice na kojima sam vratio izmene u moj spisak nadgledanja",
        "tog-minordefault": "Označavaj sve izmene kao manje",
-       "tog-previewontop": "Prikaži pregled pre okvira za uređivanje",
-       "tog-previewonfirst": "Prikaži pregled na prvoj izmeni",
-       "tog-enotifwatchlistpages": "Pošalji mi imejl kada se promeni stranica/datoteka koju nadgledam",
-       "tog-enotifusertalkpages": "Pošalji mi imejl kada se promeni moja stranica za razgovor",
-       "tog-enotifminoredits": "Pošalji mi imejl i za manje izmene u stranicama i datotekama",
-       "tog-enotifrevealaddr": "Prikaži moju imejl adresu u porukama obaveštenja",
+       "tog-previewontop": "Prikaži pretpregled pre okvira za uređivanje",
+       "tog-previewonfirst": "Prikaži pretpregled pri prvoj izmeni",
+       "tog-enotifwatchlistpages": "Pošalji mi imejl kada se promeni stranica ili datoteka sa mog spiska nadgledanja",
+       "tog-enotifusertalkpages": "Pošalji mi imejl kad se promeni moja stranica za razgovor",
+       "tog-enotifminoredits": "Pošalji mi imejl i kod manjih izmena stranica i datoteka",
+       "tog-enotifrevealaddr": "Otkrij moju imejl adresu u porukama obaveštenja",
        "tog-shownumberswatching": "Prikaži broj korisnika koji nadgledaju",
-       "tog-oldsig": "Potpis:",
+       "tog-oldsig": "Vaš postojeći potpis:",
        "tog-fancysig": "Smatraj potpis kao vikitekst (bez samopovezivanja)",
-       "tog-uselivepreview": "Koristi trenutni pregled",
+       "tog-uselivepreview": "Prikaži pretpregled bez ponovnog učitavanja stranice",
        "tog-forceeditsummary": "Upozori me kada ne unesem opis izmene",
        "tog-watchlisthideown": "Sakrij moje izmene sa spiska nadgledanja",
        "tog-watchlisthidebots": "Sakrij izmene botova sa spiska nadgledanja",
        "tog-watchlisthideminor": "Sakrij manje izmene sa spiska nadgledanja",
        "tog-watchlisthideliu": "Sakrij izmene prijavljenih korisnika sa spiska nadgledanja",
-       "tog-watchlistreloadautomatically": "Automatski osveži spisak nadgledanja kad god se filter izmeni (potrebna JavaScript-a)",
+       "tog-watchlistreloadautomatically": "Automatski osveži spisak nadgledanja kad god se filter izmeni (potreban JavaScript)",
+       "tog-watchlistunwatchlinks": "Dodaj veze za direktno dodavanje/uklanjanje stavki sa spiska nadgledanja (potreban JavaScript)",
        "tog-watchlisthideanons": "Sakrij izmene anonimnih korisnika sa spiska nadgledanja",
        "tog-watchlisthidepatrolled": "Sakrij patrolirane izmene sa spiska nadgledanja",
        "tog-watchlisthidecategorization": "Sakrij kategorizaciju stranica",
        "tog-ccmeonemails": "Pošalji mi kopije imejlova koje pošaljem drugim korisnicima",
        "tog-diffonly": "Ne prikazuj sadržaj stranice ispod razlika",
-       "tog-showhiddencats": "Prikaži skrivene kategorije",
+       "tog-showhiddencats": "Skrivene kategorije",
        "tog-norollbackdiff": "Ne prikazuj razliku nakon izvršenog vraćanja",
-       "tog-useeditwarning": "Upozori me kada napuštam stranicu sa nesačuvanim promenama",
-       "tog-prefershttps": "Uvek koristi bezbednu konekciju dok sam prijavljen.",
-       "underline-always": "uvek podvlači",
-       "underline-never": "nikad ne podvlači",
+       "tog-useeditwarning": "Upozori me kada napuštam stranicu sa nesačuvanim izmenama",
+       "tog-prefershttps": "Uvek koristi sigurnu vezu dok sam prijavljen.",
+       "underline-always": "uvek",
+       "underline-never": "nikad",
        "underline-default": "prema temi ili pregledaču",
-       "editfont-style": "Izgled fonta u uređivačkom okviru:",
+       "editfont-style": "Stil fonta u okviru za uređivanje:",
        "editfont-monospace": "srazmerno širok font",
        "editfont-sansserif": "beserifni font",
        "editfont-serif": "serifni font",
        "category-file-count-limited": "{{PLURAL:$1|1=Sledeća datoteka je|Sledeće $1 datoteke su|Sledećih $1 datoteka je}} u ovoj kategoriji.",
        "listingcontinuesabbrev": "nast.",
        "index-category": "Popisane stranice",
-       "noindex-category": "Neindeksirane stranice",
+       "noindex-category": "Nepopisane stranice",
        "broken-file-category": "Stranice s neispravnim vezama do datoteka",
+       "categoryviewer-pagedlinks": "$1 ($2)",
+       "category-header-numerals": "$1–$2",
        "about": "O nama",
        "article": "Članak",
        "newwindow": "(otvara se u novom prozoru)",
        "variants": "Varijante",
        "navigation-heading": "Navigacioni meni",
        "errorpagetitle": "Greška",
-       "returnto": "Nazad na $1.",
+       "returnto": "Nazad na stranicu „$1“.",
        "tagline": "Izvor: {{SITENAME}}",
        "help": "Pomoć",
        "search": "Pretraga",
-       "search-ignored-headings": "#<!-- ovu liniju ostavite onakvu kakva jeste --> <pre>\n# Naslovi koji će biti ignorisani upitom\n# Promene su vidljive odmah nakon što stranica sa naslovom bude popisana\n# Možete iznuditi ponovno popisivanje sa \"null\" promenom\n# Sintaksa je sledeća:\n# * Svaka vrsta koja započinje \"#\" znakom pa sve do kraja je komentar\n# * Svaka ne prazna vrsta je tačan naslov za zanemariti, u tačnom obliku\nReference\nSpoljašnje veze\nPogledajte\n#</pre> <!-- ovu liniju ostavite onakvu kakva jeste -->",
+       "search-ignored-headings": " #<!-- ne menjajte ništa u ovom redu --> <pre>\n# Naslovi koji će biti zanemareni pri pretrazi.\n# Izmene su vidljive odmah nakon što se stranica sa naslovom popiše.\n# Možete iznuditi ponovno popisivanje „nultom” izmenom.\n# Sintaksa je sledeća:\n#  * Svaki red koji započinje znakom „#” je komentar.\n#  * Svaki ne prazni red je tačan naslov koji će biti zanemaren, s tim da se razlikuju mala i velika slova i sve ostalo\nReference\nSpoljašnje veze\nTakođe pogledajte\n #</pre> <!-- ne menjajte ništa u ovom redu -->",
        "searchbutton": "Pretraži",
        "go": "Idi",
        "searcharticle": "Idi",
        "permalink": "Trajna veza",
        "print": "Štampaj",
        "view": "Pogledaj",
-       "view-foreign": "Vidi na projektu $1",
+       "view-foreign": "Pogledaj na projektu $1",
        "edit": "Uredi",
        "edit-local": "Uredi lokalni opis",
        "create": "Napravi",
        "create-local": "Dodaj lokalni opis",
        "delete": "Obriši",
-       "undelete_short": "Vrati {{PLURAL:$1|1=jednu obrisanu izmenu|$1 obrisane izmene|$1 obrisanih izmena}}",
+       "undelete_short": "Vrati {{PLURAL:$1|obrisanu izmenu|$1 obrisane izmene|$1 obrisanih izmena}}",
        "viewdeleted_short": "Pogledaj {{PLURAL:$1|obrisanu izmenu|$1 obrisane izmene|$1 obrisanih izmena}}",
        "protect": "Zaštiti",
        "protect_change": "promeni",
        "views": "Pregledi",
        "toolbox": "Alatke",
        "tool-link-userrights": "Uredi {{GENDER:$1|korisničke}} grupe",
-       "tool-link-userrights-readonly": "Prikaži {{GENDER:$1|korisnik}} grupe",
-       "tool-link-emailuser": "Pošalji imejl",
+       "tool-link-userrights-readonly": "{{GENDER:$1|Korisničke}} grupe",
+       "tool-link-emailuser": "Pošalji imejl {{GENDER:$1|korisniku|korisnici}}",
        "imagepage": "Pogledaj stranicu datoteke",
        "mediawikipage": "Pogledaj stranicu poruke",
        "templatepage": "Pogledaj stranicu šablona",
        "viewhelppage": "Pogledaj stranicu pomoći",
-       "categorypage": "Pogledaj stranicu kategorija",
+       "categorypage": "Pogledaj stranicu kategorije",
        "viewtalkpage": "Pogledaj razgovor",
        "otherlanguages": "Na drugim jezicima",
        "redirectedfrom": "(preusmereno sa $1)",
        "redirectpagesub": "Preusmerenje",
        "redirectto": "Preusmerava na:",
        "lastmodifiedat": "Ova stranica je poslednji put uređena na datum $1 u $2 č.",
-       "viewcount": "Ova stranica je pregledana {{PLURAL:$1|jedanput|$1 puta|$1 puta}}.",
+       "viewcount": "Ovoj stranici je pristupljeno {{PLURAL:$1|jedanput|$1 puta}}.",
        "protectedpage": "Zaštićena stranica",
        "jumpto": "Idi na:",
        "jumptonavigation": "navigaciju",
        "pool-timeout": "Istek vremena čeka na zaključavanje",
        "pool-queuefull": "Red je pun zahteva",
        "pool-errorunknown": "Nepoznata greška",
-       "pool-servererror": "Brojač fonda trenutno nije dostupan ($1)",
-       "poolcounter-usage-error": "Greška tokom upotrebe: $1",
+       "pool-servererror": "Usluga brojača redova nije dostupna ($1).",
+       "poolcounter-usage-error": "Greška pri upotrebi: $1",
        "aboutsite": "O projektu {{SITENAME}}",
-       "aboutpage": "Project:O nama",
+       "aboutpage": "Project:O_projektu_{{SITENAME}}",
        "copyright": "Sadržaj je dostupan pod licencom $1 osim ako je drugačije navedeno.",
        "copyrightpage": "{{ns:project}}:Autorska prava",
        "currentevents": "Aktuelnosti",
        "mainpage-description": "Glavna strana",
        "policy-url": "Project:Pravila",
        "portal": "Portal zajednice",
-       "portal-url": "Project:Radionica",
+       "portal-url": "Project:Portal zajednice",
        "privacy": "Politika privatnosti",
        "privacypage": "Project:Politika privatnosti",
        "badaccess": "Greške u ovlašćenjima",
-       "badaccess-group0": "Nije vam dozvoljeno da izvršite zahtevanu radnju.",
+       "badaccess-group0": "Nije Vam dozvoljeno da izvršite zahtevanu radnju.",
        "badaccess-groups": "Radnja koju ste zahtevali je ograničena samo korisnicima u {{PLURAL:$2|sledećoj grupi|sledećim grupama}}: $1.",
-       "versionrequired": "Potrebno je izdanje $1 Medijavikija",
+       "versionrequired": "Potrebna je verzija $1 Medijavikija",
        "versionrequiredtext": "Potrebno je izdanje $1 Medijavikija da biste koristili ovu stranicu.\nPogledajte stranicu za [[Special:Version|izdanje]].",
        "ok": "U redu",
        "pagetitle": "$1 — {{SITENAME}}",
        "pagetitle-view-mainpage": "{{SITENAME}}",
        "backlinksubtitle": "← $1",
        "retrievedfrom": "Preuzeto iz „$1“",
-       "youhavenewmessages": "Imate $1 ($2).",
-       "youhavenewmessagesfromusers": "Imate $1 od {{PLURAL:$3|drugog korisnika|$3 korisnika|$3 korisnika}} ($2).",
+       "youhavenewmessages": "{{PLURAL:$3|Imate}} $1 ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Imate}} $1 od {{PLURAL:$3|drugog korisnika|$3 korisnika}} ($2).",
        "youhavenewmessagesmanyusers": "Imate $1 od mnogo korisnika ($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|novu poruku|999=nove poruke}}",
-       "newmessagesdifflinkplural": "{{PLURAL:$1|poslednja izmena|999=poslednje izmene}}",
-       "youhavenewmessagesmulti": "Imate novih poruka na $1",
+       "newmessageslinkplural": "{{PLURAL:$1|novu poruku|nove poruke|novih poruka}}",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|poslednja izmena|poslednje izmene|poslednjih izmena}}",
+       "youhavenewmessagesmulti": "Imate nove poruke na $1",
        "editsection": "uredi",
        "editold": "uredi",
        "viewsourceold": "izvorni kod",
        "editlink": "uredi",
        "viewsourcelink": "izvorni kod",
-       "editsectionhint": "Uredi odeljak „$1“",
+       "editsectionhint": "Uredite odeljak „$1“",
        "toc": "Sadržaj",
        "showtoc": "prikaži",
        "hidetoc": "sakrij",
-       "collapsible-collapse": "Skupi",
-       "collapsible-expand": "Proširi",
+       "collapsible-collapse": "sakrij",
+       "collapsible-expand": "prikaži",
        "confirmable-confirm": "Da li {{GENDER:$1|ste}} sigurni?",
        "confirmable-yes": "Da",
        "confirmable-no": "Ne",
-       "thisisdeleted": "Pogledati ili vratiti $1?",
-       "viewdeleted": "Pogledati $1?",
-       "restorelink": "{{PLURAL:$1|1=obrisanu izmenu|$1 obrisane izmene|$1 obrisanih izmena}}",
+       "thisisdeleted": "Pogledaj ili vrati $1?",
+       "viewdeleted": "Pogledaj $1?",
+       "restorelink": "{{PLURAL:$1|obrisanu izmenu|$1 obrisane izmene|$1 obrisanih izmena}}",
        "feedlinks": "Dovod:",
        "feed-invalid": "Neispravna vrsta dovoda.",
        "feed-unavailable": "Dovodi nisu dostupni",
        "sort-descending": "Poređaj opadajuće",
        "sort-ascending": "Poređaj rastuće",
        "nstab-main": "Stranica",
-       "nstab-user": "{{GENDER:{{BASEPAGENAME}}|Korisnik|Korisnica}}",
+       "nstab-user": "{{GENDER:{{BASEPAGENAME}}|Korisnik|Korisnica|Korisnik}}",
        "nstab-media": "Mediji",
        "nstab-special": "Posebno",
        "nstab-project": "Projekat",
        "nosuchaction": "Nema takve radnje",
        "nosuchactiontext": "Radnja navedena u adresi nije ispravna.\nMožda ste pogrešno napisali adresu ili ste pratili zastarelu vezu.\nMoguće je i da se radi o grešci u softveru vikija.",
        "nosuchspecialpage": "Nema takve posebne stranice",
-       "nospecialpagetext": "<strong>Posebna stranica ne postoji.</strong>\n\nSpisak svih posebnih stranica nalazi se [[Special:SpecialPages|ovde]].",
+       "nospecialpagetext": "<strong>Posebna stranica koju ste zahtevali ne postoji.</strong>\n\nSpisak svih posebnih stranica nalazi se na „[[Special:SpecialPages|{{int:specialpages}}]]”.",
        "error": "Greška",
        "databaseerror": "Greška u bazi podataka",
        "databaseerror-text": "Došlo je do greške u upitu baze podataka. Možda je u pitanju programska greška.",
        "databaseerror-function": "Funkcija: $1",
        "databaseerror-error": "Greška: $1",
        "transaction-duration-limit-exceeded": "Zbog izbegavanja velikih kopirajućih zaostajanja, ova transakcija je prekinuta zbog toga što je trajanje zapisivanja ($1) premašilo ($2) sekundi ograničenja. \nUkoliko menjate puno artikala odjednom, pokušajte sa više manjih operacija.",
-       "laggedslavemode": "<strong>Upozorenje:</strong> stranica je možda zastarela.",
+       "laggedslavemode": "<strong>Upozorenje:</strong> moguće je da stranica nije ažurirana.",
        "readonly": "Baza podataka je zaključana",
        "enterlockreason": "Unesite razlog za zaključavanje, uključujući i vreme otključavanja",
        "readonlytext": "Baza podataka je trenutno zaključana, što znači da je nije moguće menjati.\n\nSistemski administrator je naveo sledeće objašnjenje: $1",
        "missingarticle-diff": "(razlika: $1, $2)",
        "readonly_lag": "Baza podataka je automatski zaključana da bi se sekundarni serveri baze podataka uskladili s glavnim.",
        "internalerror": "Unutrašnja greška",
-       "internalerror_info": "Unutrašnja greška: $1",
-       "internalerror-fatal-exception": "Kritični izuzetak tipa $1",
-       "filecopyerror": "Ne mogu da umnožim datoteku „$1“ u „$2“.",
+       "internalerror_info": "Interna greška: $1",
+       "internalerror-fatal-exception": "Fatalna greška tipa „$1“",
+       "filecopyerror": "Ne mogu da kopiram datoteku „$1“ u „$2“.",
        "filerenameerror": "Ne mogu da preimenujem datoteku „$1“ u „$2“.",
        "filedeleteerror": "Ne mogu da obrišem datoteku „$1“.",
-       "directorycreateerror": "Ne mogu da napravim fasciklu „$1“.",
+       "directorycreateerror": "Ne mogu da napravim direktorijum „$1“.",
        "directoryreadonlyerror": "Direktorijum „$1“ je samo za čitanje.",
        "directorynotreadableerror": "Direktorijum „$1“ nije čitljiv.",
        "filenotfound": "Ne mogu da pronađem datoteku „$1“.",
        "unexpected": "Neočekivana vrednost: „$1“=„$2“.",
-       "formerror": "Greška: ne mogu da pošaljem obrazac",
+       "formerror": "Greška: ne mogu da pošaljem obrazac.",
        "badarticleerror": "Ova radnja se ne može izvršiti na ovoj stranici.",
        "cannotdelete": "Ne mogu da obrišem stranicu ili datoteku „$1“.\nVerovatno ju je neko drugi obrisao.",
        "cannotdelete-title": "Ne mogu da obrišem stranicu „$1“",
        "delete-hook-aborted": "Brisanje je prekinula kuka.\nNije dato nikakvo obrazloženje.",
-       "no-null-revision": "Nije moguće napraviti \"null\" reviziju za stranicu $1",
+       "no-null-revision": "Ne mogu da napravim novu praznu verziju za stranicu „$1“",
        "badtitle": "Neispravan naslov",
        "badtitletext": "Naslov stranice je neispravan, prazan ili je međujezički ili međuviki naslov pogrešno povezan.\nMožda sadrži znakove koji se ne mogu koristiti u naslovima.",
-       "title-invalid-empty": "Zatraženi naslov strane je prazan ili sadrži samo razmak.",
-       "title-invalid-utf8": "Zatraženi naslov stranice sadrži nevažeći UTF-8 niz.",
-       "title-invalid-interwiki": "Zatraženi naslov stranice sadrži \"interwiki\" vezu koja ne može biti upotrebljenja za naslove.",
-       "title-invalid-talk-namespace": "Zatraženi naslov strane se odnosi na stranicu za razgovor koja ne može da postoji.",
-       "title-invalid-characters": "Traženi naslov ima nevažeće karaktere: „$1“.",
-       "title-invalid-relative": "Naslov ima relativan put. Relativni naslovi (./, ../) su nevažeći, zato što će često biti nedostupni kroz korisnički pretraživač.",
-       "title-invalid-magic-tilde": "Naslov stranice koju ste tražili je nevažeći jer sadrži magični niz tildi (<nowiki>~~~</nowiki>)",
-       "title-invalid-too-long": "Naslov stranice koju ste tražili je predugačak. Ne sme da bude duži od $1 {{PLURAL:$1|bajt|bajtovi}} u UTF-8 znacima.",
-       "title-invalid-leading-colon": "Naslov stranice koju ste tražili sadrži dvotačku na početku.",
+       "title-invalid-empty": "Traženo ime stranice je prazno ili sadrži samo naziv imenskog prostora.",
+       "title-invalid-utf8": "Traženi naziv stranice sadrži nevažeći UTF-8 znak.",
+       "title-invalid-interwiki": "Traženi naslov stranice sadrži unutrašnju viki vezu koja ne može biti korištena u naslovima.",
+       "title-invalid-talk-namespace": "Traženi naslov stranice se odnosi na stranicu za razgovor koja ne može postojati.",
+       "title-invalid-characters": "Traženi naslov ima nevažeće znakove: „$1“.",
+       "title-invalid-relative": "Naslov ima relativnu putanju. Relativni naslovi stranica (./, ../) nisu važeći jer će često biti nedostupni u korisničkom pregledaču.",
+       "title-invalid-magic-tilde": "Traženi naslov stranice sadrži nevažeći sled magičnog znaka tilda (<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "Traženi naziv stranice je predugačak. Ne sme biti duži od $1 {{PLURAL:$1|bajta|bajtova}} u UTF-8 kodiranju.",
+       "title-invalid-leading-colon": "Zahtevani naslov stranice sadrži nevažeću dvotačku na početku.",
        "perfcached": "Sledeći podaci su keširani i možda nisu ažurirani. U kešu {{PLURAL:$1|je dostupan najviše jedan rezultat|su dostupna najviše $1 rezultata|je dostupno najviše $1 rezultata}}.",
        "perfcachedts": "Sledeći podaci su keširani i poslednji put ažurirani na datum $2 u $3 č. U kešu {{PLURAL:$4|je dostupan najviše jedan rezultat|su dostupna najviše $4 rezultata|je dostupno najviše $4 rezultata}}.",
        "querypage-no-updates": "Ažuriranje ove stranice je trenutno onemogućeno.\nPodaci koji se ovde nalaze mogu biti zastareli.",
        "viewsource": "Izvorni kod",
-       "viewsource-title": "Izvorni tekst stranice $1",
+       "viewsource-title": "Izvorni kod za stranicu $1",
        "actionthrottled": "Radnja je usporena",
-       "actionthrottledtext": "Kao meru protiv zloupotrebe, ograničeno vam je izvođenje ove radnje previše puta u kratkom vremenskom periodu, a vi ste premašili ovo ograničenje.\nMolimo pokušajte ponovo za nekoliko minuta.",
+       "actionthrottledtext": "U cilju borbe protiv nepoželjnih poruka, ograničene su vam izmene u određenom vremenu, a upravo ste prešli to ograničenje. Pokušajte ponovo za nekoliko minuta.",
        "protectedpagetext": "Ova stranica je zaključana za izmene i druge radnje.",
        "viewsourcetext": "Možete da čitate i kopirate izvornik ove stranice.",
        "viewyourtext": "Možete da pogledate i kopirate izvorni kod <strong>Vaših izmena</strong> na ovoj stranici.",
        "editinginterface": "<strong>Upozorenje:</strong> uređujete stranicu koja se koristi za prikazivanje teksta korisničkog okruženja.\nIzmene na ovoj stranici će uticati na sve korisnike ovog vikija.",
        "translateinterface": "Da dodate ili promenite prevode za sve vikije, posetite [https://translatewiki.net/ Translejtviki], projekat za lokalizaciju Medijavikija.",
        "cascadeprotected": "Ova stranica je zaključana jer sadrži {{PLURAL:$1|sledeću stranicu koja je zaštićena|sledeće stranice koje su zaštićene}} „prenosivom“ zaštitom:\n$2",
-       "namespaceprotected": "Nemate dozvolu da uređujete stranice u imenskom prostoru <strong>$1</strong>.",
+       "namespaceprotected": "Nemate dozvolu da uređujete stranice u imenskom prostoru: <strong>$1</strong>.",
        "customcssprotected": "Nemate dozvolu da menjate ovu CSS stranicu jer sadrži lična podešavanja drugog korisnika.",
-       "customjsprotected": "Nemate dozvolu da menjate ovu stranicu javaskripta jer sadrži lične postavke drugog korisnika.",
+       "customjsprotected": "Nemate dozvolu da menjate ovu stranicu JavaScript jer sadrži lična podešavanja drugog korisnika.",
        "mycustomcssprotected": "Nemate dozvolu za menjanje ove CSS stranice.",
+       "mycustomjsonprotected": "Nemate dozvolu za menjanje ove JSON stranice.",
        "mycustomjsprotected": "Nemate dozvolu za menjanje ove JavaScript stranice.",
        "myprivateinfoprotected": "Nemate dozvolu za menjanje vaših ličnih informacija.",
        "mypreferencesprotected": "Nemate dozvolu za menjanje vaših podešavanja.",
        "exception-nologin": "Niste prijavljeni",
        "exception-nologin-text": "Prijavite se da biste pristupili ovoj stranici ili radnji.",
        "exception-nologin-text-manual": "Morate biti $1 da biste pristupili ovoj stranici ili radnji.",
-       "virus-badscanner": "Neispravna postavka: nepoznati skener za viruse: ''$1''",
+       "virus-badscanner": "Neispravno podešavanje: nepoznati skener za viruse: <em>$1</em>",
        "virus-scanfailed": "neuspešno skeniranje (kod $1)",
        "virus-unknownscanner": "nepoznati antivirus:",
-       "logouttext": "<strong>Odjavljeni ste.</strong>\n\nImajte na umu da neke stranice mogu nastaviti da se prikazuju kao da ste još prijavljeni, sve dok ne očistite privremenu memoriju svog pregledača.",
-       "welcomeuser": "Dobrodošli, $1!",
+       "logouttext": "<strong>Sada ste odjavljeni.</strong>\n\nZapamtite da neke stranice mogu da nastave da se prikazuju kao da ste još uvek prijavljeni, dok ne očistite privremenu memoriju svog pregledača.",
+       "cannotlogoutnow-title": "Odjava trenutno nije moguća",
+       "cannotlogoutnow-text": "Odjava nije moguća tokom upotrebe $1.",
+       "welcomeuser": "Dobro došli, $1!",
        "welcomecreation-msg": "Vaš nalog je otvoren.\nNe zaboravite da promenite svoja [[Special:Preferences|podešavanja]].",
        "yourname": "Korisničko ime:",
        "userlogin-yourname": "Korisničko ime",
        "userlogin-yourpassword": "Lozinka",
        "userlogin-yourpassword-ph": "Unesite svoju lozinku",
        "createacct-yourpassword-ph": "Unesite lozinku",
-       "yourpasswordagain": "Potvrda lozinke:",
+       "yourpasswordagain": "Ponovo unesi lozinku:",
        "createacct-yourpasswordagain": "Potvrdite lozinku",
-       "createacct-yourpasswordagain-ph": "Unesite lozinku još jednom",
+       "createacct-yourpasswordagain-ph": "Unesite lozinku ponovo",
        "userlogin-remembermypassword": "Ostavi me prijavljenog/u",
        "userlogin-signwithsecure": "Koristite sigurnu konekciju",
+       "cannotlogin-title": "Prijava nije moguća",
+       "cannotlogin-text": "Prijava nije moguća",
+       "cannotloginnow-title": "Prijava trenutno nije moguća",
+       "cannotloginnow-text": "Prijava nije moguća kada se koristi $1.",
+       "cannotcreateaccount-title": "Otvaranje naloga nije moguće",
+       "cannotcreateaccount-text": "Direktno pravljenje naloga nije omogućeno na ovom vikiju.",
        "yourdomainname": "Domen:",
        "password-change-forbidden": "Ne možete da promenite lozinku na ovom vikiju.",
        "externaldberror": "Došlo je do greške pri prepoznavanju baze podataka ili nemate ovlašćenja da ažurirate svoj spoljni nalog.",
        "login": "Prijavi me",
-       "login-security": "Verifikacija vašeg identiteta",
+       "login-security": "Verifikacija vašeg indentiteta",
        "nav-login-createaccount": "Prijava/registracija",
        "logout": "Odjava",
        "userlogout": "Odjava",
        "notloggedin": "Niste prijavljeni",
        "userlogin-noaccount": "Nemate nalog?",
-       "userlogin-joinproject": "Otvorite ga",
+       "userlogin-joinproject": "Pridružite se projektu {{SITENAME}}",
        "createaccount": "Otvori nalog",
        "userlogin-resetpassword-link": "Zaboravili ste lozinku?",
        "userlogin-helplink2": "Pomoć pri prijavljivanju",
        "userlogin-loggedin": "Već ste prijavljeni kao {{GENDER:$1|$1}}.\nKoristite donji obrazac da biste se prijavili kao drugi korisnik.",
+       "userlogin-reauth": "Morate se ponovo prijaviti da bi verifikovali da ste {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Otvori još jedan nalog",
        "createacct-emailrequired": "Imejl adresa",
-       "createacct-emailoptional": "Imejl adresa (opciono)",
-       "createacct-email-ph": "Unesite Vašu imejl adresu",
+       "createacct-emailoptional": "Imejl adresa (neobavezno)",
+       "createacct-email-ph": "Unesite svoju imejl adresu",
        "createacct-another-email-ph": "Unesite imejl adresu",
-       "createaccountmail": "Koristite privremenu, slučajno stvorenu lozinku i pošaljite na navedenu adresu elektronske pošte",
-       "createacct-realname": "Pravo ime (opciono)",
+       "createaccountmail": "Koristite privremenu, slučajno stvorenu lozinku i pošaljite na navedenu imejl adresu",
+       "createaccountmail-help": "Može se koristiti da se nekome napravi nalog bez saznanja lozinke.",
+       "createacct-realname": "Pravo ime (neobavezno)",
        "createacct-reason": "Razlog",
        "createacct-reason-ph": "Zašto pravite još jedan nalog?",
+       "createacct-reason-help": "Poruka koja se prikazuje u dnevniku stvaranja korisničkih naloga",
        "createacct-submit": "Otvori nalog",
        "createacct-another-submit": "Otvori nalog",
+       "createacct-continue-submit": "Nastavite otvaranje naloga",
+       "createacct-another-continue-submit": "Nastavite otvaranje naloga",
        "createacct-benefit-heading": "{{SITENAME}} je projekat koji stvaraju ljudi poput Vas.",
-       "createacct-benefit-body1": "{{PLURAL:$1|izmena|izmene}}",
-       "createacct-benefit-body2": "{{PLURAL:$1|stranica|stranice}}",
-       "createacct-benefit-body3": "{{PLURAL:$1|aktivni korisnik|aktivnih korisnika}}",
+       "createacct-benefit-body1": "{{PLURAL:$1|izmena|izmene|izmena}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|stranica|stranice|stranica}}",
+       "createacct-benefit-body3": "nedavno {{PLURAL:$1|aktivni korisnik|aktivna korisnika|aktivnih korisnika}}",
        "badretype": "Unete lozinke se ne poklapaju.",
-       "usernameinprogress": "Nalog za ovo korisničko ime se već pravi, molimo sačekajte.",
+       "usernameinprogress": "Nalog za ovo korisničko ime se već pravi, sačekajte.",
        "userexists": "Korisničko ime je zauzeto. Izaberite drugo.",
        "loginerror": "Greška pri prijavljivanju",
        "createacct-error": "Došlo je do greške pri otvaranju naloga",
-       "createaccounterror": "Ne mogu da otvorim nalog: $1",
+       "createaccounterror": "Ne mogu da otvorim nalog: $1.",
        "nocookiesnew": "Korisnički nalog je otvoren, ali niste prijavljeni.\n{{SITENAME}} koristi kolačiće za prijavu. Vama su kolačići onemogućeni.\nOmogućite ih, pa se onda prijavite sa svojim korisničkim imenom i lozinkom.",
        "nocookieslogin": "{{SITENAME}} koristi kolačiće za prijavljivanje korisnika.\nVama su kolačići onemogućeni. Omogućite ih i pokušajte ponovo.",
        "nocookiesfornew": "Korisnički nalog nije otvoren jer njegov izvor nije potvrđen.\nOmogućite kolačiće na pregledaču i ponovo učitajte stranicu.",
        "nocookiesforlogin": "{{int:nocookieslogin}}",
+       "createacct-loginerror": "Nalog je uspešno napravljen, ali se ne možete automatski prijaviti. Pređite na [[Special:UserLogin|ručno prijavljivanje]].",
        "noname": "Uneli ste neispravno korisničko ime.",
        "loginsuccesstitle": "Uspešno prijavljivanje",
-       "loginsuccess": "'''Prijavljeni ste kao „$1“.'''",
+       "loginsuccess": "<strong>Prijavljeni ste na {{SITENAME}} kao „$1”.</strong>",
        "nosuchuser": "Ne postoji korisnik s imenom „$1“.\nKorisnička imena su osetljiva na mala i velika slova.\nProverite da li ste ga dobro uneli ili [[Special:CreateAccount|otvorite novi nalog]].",
        "nosuchusershort": "Korisnik s imenom „$1“ ne postoji.\nProverite da li ste pravilno napisali.",
        "nouserspecified": "Morate navesti korisničko ime.",
        "login-userblocked": "{{GENDER:$1|Ovaj korisnik je blokiran|Ova korisnica je blokirana|Ovaj korisnik je blokiran}}. Prijava nije dozvoljena.",
-       "wrongpassword": "Uneli ste neispravnu lozinku. Pokušajte ponovo.",
+       "wrongpassword": "Uneli ste neispravno korisničko ime ili lozinku. Pokušajte ponovo.",
        "wrongpasswordempty": "Niste uneli lozinku. Pokušajte ponovo.",
        "passwordtooshort": "Lozinka mora imati najmanje {{PLURAL:$1|jedan znak|$1 znaka|$1 znakova}}.",
        "passwordtoolong": "Lozinke ne mogu biti duže od {{PLURAL:$1|$1 znaka|$1 znakova}}.",
+       "passwordtoopopular": "Često izabrane lozinke ne mogu da se koriste. Izaberite lozinku koju je teže pogoditi.",
        "password-name-match": "Lozinka se mora razlikovati od korisničkog imena.",
        "password-login-forbidden": "Korišćenje ovog korisničkog imena i lozinke je zabranjeno.",
        "mailmypassword": "Resetuj lozinku",
        "passwordremindertitle": "{{SITENAME}} — privremena lozinka",
-       "passwordremindertext": "Neko, verovatno vi, sa IP adrese $1 je zatražio novu lozinku na vikiju {{SITENAME}} ($4).\nStvorena je privremena lozinka za {{GENDER:$2|korisnika|korisnicu|korisnika}} $2 koja glasi $3.\nUkoliko je ovo vaš zahtev, sada se prijavite i postavite novu lozinku.\nPrivremena lozinka ističe za {{PLURAL:$5|jedan dan|$5 dana|$5 dana}}.\n\nAko je neko drugi zatražio promenu lozinke, ili ste se setili vaše lozinke i ne želite da je menjate, zanemarite ovu poruku.",
+       "passwordremindertext": "Neko sa IP adrese $1 je zatražio novu lozinku na vikiju {{SITENAME}} ($4).\nStvorena je privremena lozinka za {{GENDER:$2|korisnika|korisnicu|korisnika}} $2 koja glasi $3.\nUkoliko je ovo vaš zahtev, sada se prijavite i postavite novu lozinku.\nPrivremena lozinka ističe za {{PLURAL:$5|jedan dan|$5 dana}}.\n\nAko je neko drugi zatražio promenu lozinke, ili ste se setili vaše lozinke i ne želite da je menjate, zanemarite ovu poruku.",
        "noemail": "Ne postoji imejl adresa za {{GENDER:$1|korisnika|korisnicu}} $1.",
        "noemailcreate": "Morate navesti ispravnu imejl adresu.",
        "passwordsent": "Nova lozinka je poslata na imejl adresu {{GENDER:$1|korisnika|korisnice|korisnika}} $1.\nPrijavite se pošto je primite.",
-       "blocked-mailpassword": "Vašoj IP adresi je onemogućeno uređivanje stranica, kao i mogućnost zahtevanja nove lozinke.",
-       "eauthentsent": "Na navedenu imejl adresu je poslat potvrdni kod.\nPre nego što pošaljemo daljnje poruke, pratite uputstva s imejla da biste potvrdili da ste Vi otvorili nalog.",
+       "blocked-mailpassword": "Vaša IP adresa ima zabranu uređivanja. Radi sprečavanja zloupotrebe, nije dozvoljeno vraćanje lozinke sa nje.",
+       "eauthentsent": "Na navedenu imejl adresu je poslat potvrdni kôd.\nPre nego što pošaljemo daljnje poruke, pratite uputstva s imejla da biste potvrdili da ste Vi otvorili nalog.",
        "throttled-mailpassword": "Poruka za promenu lozinke je poslata u {{PLURAL:$1|1=poslednjih sat vremena|poslednja $1 sata|poslednjih $1 sati}}.\nDa bismo sprečili zloupotrebu, podsetnik šaljemo samo jednom u roku od {{PLURAL:$1|1=sat vremena|$1 sata|$1 sati}}.",
        "mailerror": "Greška pri slanju poruke: $1",
        "acct_creation_throttle_hit": "Posetioci ovog vikija koji koriste vašu IP adresu su već otvorili {{PLURAL:$1|1=jedan nalog|$1 naloga}} prethodni $2, što je najveći dozvoljeni broj u tom vremenskom periodu.\nZbog toga posetioci s ove IP adrese trenutno ne mogu otvoriti više naloga.",
-       "emailauthenticated": "Vaša imejl adresa je potvrđena $2 u $3.",
-       "emailnotauthenticated": "Vaša imejl adresa još nije potvrđena.\nImejl neće biti poslat ni u jednom od sledećih slučajeva.",
-       "noemailprefs": "Unesite imejl adresu kako bi ove mogućnosti radile.",
+       "emailauthenticated": "Vaša imejl adresa je potvrđena na dan $2 u $3.",
+       "emailnotauthenticated": "Vaša imejl adresa još uvek nije potvrđena.\nImejl neće biti poslat ni u jednom od sledećih slučajeva.",
+       "noemailprefs": "Navedite imejl adresu u svojim podešavanjima za rad ovih mogućnosti.",
        "emailconfirmlink": "Potvrdite svoju imejl adresu",
        "invalidemailaddress": "Imejl adresa ne može biti prihvaćena jer je neispravnog oblika.\nUnesite ispravnu adresu ili ostavite prazno polje.",
        "cannotchangeemail": "Na ovom vikiju ne možete promeniti imejl adresu naloga.",
        "accountcreatedtext": "Korisnički nalog [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) je otvoren.",
        "createaccount-title": "Otvaranje korisničkog naloga za {{SITENAME}}",
        "createaccount-text": "Neko je otvorio nalog s vašom imejl adresom na {{SITENAME}} ($4) pod imenom $2 i lozinkom $3.\nPrijavite se i promenite svoju lozinku.\n\nAko je ovo greška, zanemarite ovu poruku.",
-       "login-throttled": "Previše puta ste pokušali da se prijavite. \nMolimo vas da sačekate $1 pre nego što pokušate ponovo.",
+       "login-throttled": "Previše puta ste pokušali da se prijavite.\nMolimo vas da sačekate $1 pre nego što pokušate ponovo.",
        "login-abort-generic": "Neuspešna prijava – prekinuto",
        "login-migrated-generic": "Vaš nalog je migriran i vaše korisničko više ne postoji na ovom vikiju.",
        "loginlanguagelabel": "Jezik: $1",
        "pt-userlogout": "Odjavi me",
        "php-mail-error-unknown": "Nepoznata greška u funkciji PHP mail().",
        "user-mail-no-addy": "Pokušali ste da pošaljete imejl bez imejl adrese.",
-       "user-mail-no-body": "Pokušano slanje elektronske poruke s praznim ili nerazumno kratkim sadržajem.",
+       "user-mail-no-body": "Pokušano slanje imejla s praznim ili nerazumno kratkim sadržajem.",
        "changepassword": "Promeni lozinku",
        "resetpass_announce": "Da biste završili prijavu, podesite novu lozinku ovde.",
        "resetpass_text": "<!-- Ovde unesite tekst -->",
        "newpassword": "Nova lozinka:",
        "retypenew": "Potvrda lozinke:",
        "resetpass_submit": "Postavi lozinku i prijavi me",
-       "changepassword-success": "Vaša lozinka je promenjena.",
+       "changepassword-success": "Vaša lozinka je uspešno promenjena!",
        "changepassword-throttled": "Previše puta ste pokušali da se prijavite.\nMolimo vas da sačekate $1 pre nego što pokušate ponovo.",
        "botpasswords": "Lozinke botova",
+       "botpasswords-disabled": "Lozinke botova su onemogućene.",
+       "botpasswords-no-central-id": "Da bi ste koristili botovske lozinke, morate biti prijavljeni na središnji nalog.",
+       "botpasswords-existing": "Postojeća lozinka bota",
+       "botpasswords-createnew": "Napravi novu lozinku za bota",
+       "botpasswords-editexisting": "Izmeni postojeću lozinku za bota",
+       "botpasswords-label-needsreset": "(lozinku treba resetovati)",
        "botpasswords-label-appid": "Ime bota:",
        "botpasswords-label-create": "Napravi",
        "botpasswords-label-update": "Ažuriraj",
        "botpasswords-label-cancel": "Otkaži",
        "botpasswords-label-delete": "Obriši",
+       "botpasswords-label-resetpassword": "Resetuj lozinku",
+       "botpasswords-label-grants": "Primenljive dozvole:",
        "botpasswords-label-grants-column": "Odobreno",
+       "botpasswords-bad-appid": "„$1” nije validan naziv bota.",
+       "botpasswords-insert-failed": "Neuspešno dodavanje bota \"$1\". Da li je već dodat?",
+       "botpasswords-update-failed": "Nije moguće ažurirati bota \"$1\". Da li je obrisan?",
+       "botpasswords-created-title": "Napravljena lozinka bota",
+       "botpasswords-created-body": "Lozinka za bota „$1” korisnika „$2” je napravljena.",
+       "botpasswords-updated-title": "Lozinka bota promenjena",
+       "botpasswords-updated-body": "Lozinka za bota „$1” korisnika „$2” je ažurirana.",
+       "botpasswords-deleted-title": "Obrisana lozinka bota",
+       "botpasswords-deleted-body": "Lozinka za bota „$1” korisnika „$2” je obrisana.",
+       "botpasswords-no-provider": "BotPasswordsSessionProvider nije dostupan.",
+       "botpasswords-restriction-failed": "Ne možete se prijaviti zbog ograničenja lozinki za botove.",
+       "botpasswords-not-exist": "Korisnik „$1“ nema lozinku bota „$2“.",
        "resetpass_forbidden": "Lozinka ne može biti promenjena",
+       "resetpass_forbidden-reason": "Lozinke nije moguće promeniti: $1",
        "resetpass-no-info": "Morate biti prijavljeni da biste pristupili ovoj stranici.",
        "resetpass-submit-loggedin": "Promeni lozinku",
        "resetpass-submit-cancel": "Otkaži",
-       "resetpass-wrong-oldpass": "Neispravna privremena ili tekuća lozinka.\nMožda ste već promenili lozinku ili ste zatražili novu privremenu lozinku.",
-       "resetpass-recycled": "Uneli ste sadašnju lozinku, da biste resetovali lozinku morate uneti novu.",
-       "resetpass-temp-emailed": "Prijavili ste se sa privremenim kodom iz imejla.\nDa biste završili prijavljivanje morate postaviti novu lozinku ovde:",
+       "resetpass-wrong-oldpass": "Neispravna privremena ili trenutna lozinka.\nMožda ste već promenili lozinku ili ste zatražili novu privremenu lozinku.",
+       "resetpass-recycled": "Uneli ste sadašnju lozinku, da biste promenili lozinku morate uneti novu.",
+       "resetpass-temp-emailed": "Prijavili ste se sa privremenim kôdom iz imejla.\nDa biste završili prijavljivanje morate postaviti novu lozinku ovde:",
        "resetpass-temp-password": "Privremena lozinka:",
        "resetpass-abort-generic": "Promenu lozinke je sprečio dodatak.",
        "resetpass-expired": "Vaša lozinka je istekla. Postavite novu lozinku da biste se prijavili.",
-       "resetpass-expired-soft": "Vaša lozinka je istekla i morate postaviti novu. Postavite novu lozinku ili kliknite „{{int:authprovider-resetpass-skip-label}}“ da je postavite kasnije.",
-       "resetpass-validity-soft": "Vaša lozinka nije valjana: $1\n\nMolimo izaberite novu ili kliknite „{{int:authprovider-resetpass-skip-label}}“ da resetujete kasnije.",
+       "resetpass-expired-soft": "Vaša lozinka je istekla i morate je promeniti. Postavite novu lozinku ili kliknite „{{int:authprovider-resetpass-skip-label}}“ da je promenite kasnije.",
+       "resetpass-validity-soft": "Vaša lozinka nije ispravna: $1\n\nMolimo izaberite novu ili kliknite „{{int:authprovider-resetpass-skip-label}}“ da je promenite kasnije.",
        "passwordreset": "Obnavljanje lozinke",
        "passwordreset-text-one": "Popunite ovaj obrazac da biste dobili privremenu lozinku na imejl.",
        "passwordreset-text-many": "{{PLURAL:$1|Ispunite jedno od polja kako biste dobili privremenu lozinku na imejl.}}",
        "passwordreset-emailtext-ip": "Neko (verovatno Vi, sa IP adrese $1) je zatražio novu lozinku na vikiju {{SITENAME}} ($4).\nSledeći {{PLURAL:$3|korisnički nalog je povezan|korisnički nalozi su povezani}} s ovom imejl adresom:\n\n$2\n\n{{PLURAL:$3|Privremena lozinka ističe|Privremene lozinke ističu}} za {{PLURAL:$5|jedan dan|$5 dana}}.\nPrijavite se i izaberite novu lozinku. Ako je neko drugi zahtevao ovu radnju ili ste se setili lozinke i ne želite da je menjate, zanemarite ovu poruku i nastavite koristiti staru lozinku.",
        "passwordreset-emailtext-user": "{{GENDER:$1|Korisnik je zatražio|Korisnica je zatražila}} podsetnik o podacima za prijavu na vikiju {{SITENAME}} ($4).\nSledeći {{PLURAL:$3|korisnički nalog je povezan|korisnički nalozi su povezani}} s ovom imejl adresom:\n\n$2\n\n{{PLURAL:$3|Privremena lozinka ističe|Privremene lozinke ističu}} za {{PLURAL:$5|jedan dan|$5 dana}}.\nPrijavite se i izaberite novu lozinku. Ako je neko drugi zahtevao ovu radnju ili ste se setili lozinke i ne želite da je menjate, zanemarite ovu poruku.",
        "passwordreset-emailelement": "Korisničko ime: \n$1\n\nPrivremena lozinka: \n$2",
-       "passwordreset-emailsentemail": "Podsetnik o lozinci je poslat na vašu adresu.",
+       "passwordreset-emailsentemail": "Ako je ovo imejl adresa povezana sa Vašim nalogom, podsetnik o lozinci će biti poslat na imejl.",
        "passwordreset-emailsentusername": "Ako ste naveli imejl adresu prilikom registracije, biće poslat imejl za resetovanje lozinke.",
-       "changeemail": "Promeni ili ukloni imejl adresu",
-       "changeemail-header": "Promenite e-adresu naloga",
+       "passwordreset-nocaller": "Pozivalac se mora navesti",
+       "passwordreset-nosuchcaller": "Pozivalac ne postoji: $1",
+       "passwordreset-ignored": "Resetovanje lozinke nije uspelo. Možda poslužilac nije konfigurisan?",
+       "passwordreset-invalidemail": "Neispravna imejl adresa",
+       "passwordreset-nodata": "Korisničko ime i adresa e-pošte nisu navedeni",
+       "changeemail": "Promena ili uklanjanje imejl adrese",
+       "changeemail-header": "Popunite ovaj obrazac da bi ste promenili Vašu imejl adresu. Ako želi da uskratite pristup bilo kojoj imejl adresi Vašem nalogu, ostavite prazno polje za novu imejl adresu prilikom popunjavanje obrasca.",
        "changeemail-no-info": "Morate biti prijavljeni da biste pristupili ovoj stranici.",
        "changeemail-oldemail": "Trenutna imejl adresa:",
        "changeemail-newemail": "Nova imejl adresa:",
        "changeemail-throttled": "Previše puta ste pokušali da se prijavite.\nMolimo vas da sačekate $1 pre nego što pokušate ponovo.",
        "changeemail-nochange": "Unesite drugu imejl adresu.",
        "resettokens": "Resetovanje žetona",
+       "resettokens-text": "Možete ponovo postaviti žetone koji će vam omogućiti pristup određenim privatnim podacima povezanim sa vašim nalogom ovde.\n\nTrebali biste to da uradite ako ih mimo volje podelite s nekim ili ako je vaš nalog ugrožen.",
        "resettokens-no-tokens": "Nema žetona za resetovanje.",
        "resettokens-tokens": "Žetoni:",
        "resettokens-token-label": "$1 (trenutna vrednost: $2)",
-       "resettokens-watchlist-token": "Žeton za veb dovod (Atom/RSS) vašeg [[Special:Watchlist|spiska nadgledanja]]",
+       "resettokens-watchlist-token": "Žeton za veb dovod (Atom/RSS) [[Special:Watchlist|izmena na stranicama u vašem spisku nadgledanja]]",
        "resettokens-done": "Žetoni su resetovani",
        "resettokens-resetbutton": "Resetuj izabrane žetone",
        "bold_sample": "Podebljan tekst",
        "bold_tip": "Podebljan tekst",
-       "italic_sample": "Iskošeni tekst",
-       "italic_tip": "Iskošeni tekst",
+       "italic_sample": "Iskošen tekst",
+       "italic_tip": "Iskošen tekst",
        "link_sample": "Naslov veze",
        "link_tip": "Unutrašnja veza",
-       "extlink_sample": "http://www.primer.com naslov veze",
-       "extlink_tip": "Spoljna veza (s predmetkom http://)",
-       "headline_sample": "Naslov",
-       "headline_tip": "Podnaslov",
+       "extlink_sample": "http://www.example.com/ naslov veze",
+       "extlink_tip": "Spoljašnja veza (s prefiksom http://)",
+       "headline_sample": "Tekst naslova",
+       "headline_tip": "Podnaslov (nivo 2)",
        "nowiki_sample": "Ubacite neoblikovan tekst ovde",
        "nowiki_tip": "Zanemari viki oblikovanje",
        "image_sample": "Primer.jpg",
-       "image_tip": "Ugrađena datoteka",
+       "image_tip": "Ugrađivanje datoteke",
        "media_sample": "Primer.ogg",
        "media_tip": "Veza",
        "sig_tip": "Vaš potpis sa trenutnim vremenom",
-       "hr_tip": "Vodoravna linija (koristiti retko)",
+       "hr_tip": "Vodoravna linija (koristite retko)",
        "summary": "Opis izmene:",
        "subject": "Tema:",
        "minoredit": "Ovo je manja izmena",
        "savechanges": "Sačuvaj izmene",
        "publishpage": "Objavi stranicu",
        "publishchanges": "Objavi izmene",
+       "savearticle-start": "Sačuvaj stranicu...",
+       "savechanges-start": "Sačuvaj izmene...",
+       "publishpage-start": "Objavi stranicu...",
+       "publishchanges-start": "Objavi izmene...",
        "preview": "Pretpregled",
        "showpreview": "Prikaži pretpregled",
        "showdiff": "Prikaži izmene",
        "blankarticle": "<strong>Upozorenje:</strong> Stranica koju pravite je prazna.\nAko još jednom pritisnete „$1”, stranica će biti napravljena bez ikakvog sadržaja.",
        "anoneditwarning": "<strong>Upozorenje:</strong> Niste prijavljeni. Ako objavite stranicu, Vaša IP adresa će biti javno vidljiva u njenoj istoriji izmena i drugde. Ako se <strong>[$1 prijavite]</strong> ili <strong>[$2 otvorite nalog]</strong>, pored ostalih pogodnosti koje dobijate Vaše izmene će biti pripisivane Vašem korisničkom imenu.",
        "anonpreviewwarning": "<em>Niste prijavljeni. Ako objavite stranicu, Vaša IP adresa će biti javno vidljiva u njenoj istoriji izmena i drugde.</em>",
-       "missingsummary": "'''Podsetnik:''' Niste uneli opis izmene.\nAko ponovo kliknete na „$1”, Vaša izmena će biti sačuvana bez opisa.",
+       "missingsummary": "<strong>Podsetnik:</strong> Niste uneli opis izmene.\nAko ponovo kliknete na „$1”, Vaša izmena će biti sačuvana bez opisa.",
        "selfredirect": "<strong>Upozorenje:</strong> Preusmeravate ovu stranicu na nju samu.\nMožda vam je odredišna stranica za preusmerenje pogrešna ili uređujete pogrešnu stranicu.\nAko još jednom pritisnete „$1”, preusmerenje će svejedno biti napravljeno.",
-       "missingcommenttext": "Unesite komentar ispod.",
+       "missingcommenttext": "Molimo unesite komentar.",
        "missingcommentheader": "<strong>Napomena:</strong> Niste uneli naslov teme ovog komentara.\nAko ponovo kliknete na „$1”, izmena će biti sačuvana bez naslova.",
-       "summary-preview": "Pregled opisa:",
-       "subject-preview": "Pregled tema:",
+       "summary-preview": "Pregled opisa izmene:",
+       "subject-preview": "Pregled teme:",
+       "previewerrortext": "Dogodila se greška prilikom prikazivanja vaših izmena.",
        "blockedtitle": "Korisnik je blokiran",
-       "blockedtext": "<strong>Vaše korisničko ime ili IP adresa je blokirana.</strong>\n\nBlokiranje je {{GENDER:$4|izvršio|izvršila}} $1.\nRazlog je <em>$2</em>.\n\n* Datum blokiranja: $8\n* Blokiranje ističe: $6\n* Ime korisnika: $7\n\nObratite se {{GENDER:$4|korisniku|korisnici}} $1 ili [[{{MediaWiki:Grouppage-sysop}}|administratoru]] da razjasnite stvar.\nNe možete koristiti mogućnost „Pošalji imejl ovom korisniku“ ako niste uneli ispravnu imejl adresu u [[Special:Preferences|podešavanjima]].\nVaša blokirana IP adresa je $3, a ID blokiranja $5.\nNavedite sve podatke iznad pri stvaranju bilo kakvih upita.",
-       "autoblockedtext": "Vaša IP adresa je blokirana jer ju je upotrebljavao drugi korisnik, koga je {{GENDER:$4|blokirao|blokirala}} $1.\nRazlog:\n\n:<em>$2</em>\n\n* Datum blokiranja: $8\n* Blokiranje ističe: $6\n* Ime korisnika: $7\n\nObratite se {{GENDER:$4|korisniku|korisnici}} $1 ili [[{{MediaWiki:Grouppage-sysop}}|administratoru]] da razjasnite stvar.\n\nNe možete koristiti mogućnost „Pošalji imejl ovom korisniku“ ako niste uneli ispravnu imejl adresu u [[Special:Preferences|podešavanjima]].\n\nVaša blokirana IP adresa je $3, a ID $5.\nNavedite sve podatke iznad pri stvaranju bilo kakvih upita.",
+       "blockedtext": "<strong>Vaše korisničko ime ili IP adresa je blokirana.</strong>\n\nBlokiranje je {{GENDER:$4|izvršio|izvršila}} $1.\nRazlog je <em>$2</em>.\n\n* Početak blokiranja: $8\n* Istek blokiranja: $6\n* Blokirani: $7\n\nMožete da se obratite {{GENDER:$4|korisniku|korisnici}} $1 ili [[{{MediaWiki:Grouppage-sysop}}|administratoru]] radi diskusije o blokiranju.\nNe možete da koristite mogućnost „{{int:emailuser}}” osim ako ste uneli validnu imejl adresu u svojim [[Special:Preferences|podešavanjima]] naloga i niste blokirani od korišćenja iste.\nVaša trenutna IP adresa je $3, a ID blokiranja #$5.\nNavedite sve informacije odozgo pri stvaranju bilo kakvih upita.",
+       "autoblockedtext": "Vaša IP adresa je blokirana jer ju je upotrebljavao drugi korisnik, koga je {{GENDER:$4|blokirao|blokirala}} $1.\nRazlog:\n\n:<em>$2</em>\n\n* Datum blokiranja: $8\n* Blokiranje ističe: $6\n* Ime korisnika: $7\n\nObratite se {{GENDER:$4|korisniku|korisnici}} $1 ili [[{{MediaWiki:Grouppage-sysop}}|administratoru]] da razjasnite stvar.\n\nNe možete koristiti mogućnost „{{int:emailuser}}“ ako niste uneli ispravnu imejl adresu u [[Special:Preferences|podešavanjima]].\n\nVaša blokirana IP adresa je $3, a ID $5.\nNavedite sve podatke iznad pri stvaranju bilo kakvih upita.",
        "blockednoreason": "razlog nije naveden",
        "whitelistedittext": "Za uređivanje stranice je potrebno da budete $1.",
        "confirmedittext": "Morate da potvrdite svoju imejl adresu pre uređivanja stranica.\nPostavite i potvrdite imejl adresu preko [[Special:Preferences|podešavanja]].",
-       "nosuchsectiontitle": "Ne mogu da pronađem odeljak",
+       "nosuchsectiontitle": "Ne mogu da pronađem odeljak.",
        "nosuchsectiontext": "Pokušali ste da uredite odeljak koji ne postoji.\nMožda je premešten ili obrisan dok ste pregledali stranicu.",
        "loginreqtitle": "Potrebna je prijava",
        "loginreqlink": "prijavljeni",
        "loginreqpagetext": "Morate biti $1 da biste videli druge stranice.",
        "accmailtitle": "Lozinka je poslata.",
-       "accmailtext": "Lozika za {{GENDER:$1|korisnika|korisnicu}} [[User talk:$1|$1]] je poslata na $2. Nakon prijave, lozinka se može promeniti [[Special:ChangePassword|ovde]].",
+       "accmailtext": "Lozinka za {{GENDER:$1|korisnika|korisnicu}} [[User talk:$1|$1]] je poslata na $2. Nakon prijave, lozinka se može promeniti [[Special:ChangePassword|ovde]].",
        "newarticle": "(novi)",
        "newarticletext": "Došli ste na stranicu koja još ne postoji.\nDa biste je napravili, počnite da kucate u prozor ispod ovog teksta (pogledajte [$1 stranicu za pomoć]).\nAko ste ovde došli greškom, vratite se na prethodnu stranicu.",
-       "anontalkpagetext": "---- Ovo je stranica za razgovor s anonimnim korisnikom koji još nema nalog ili ga ne koristi.\nZbog toga moramo da koristimo brojčanu IP adresu kako bismo ga prepoznali.\nTakvu adresu može deliti više korisnika.\nAko ste anonimni korisnik i mislite da su vam upućene primedbe, [[Special:CreateAccount|otvorite nalog]] ili se [[Special:UserLogin|prijavite]] da biste izbegli buduću zabunu s ostalim anonimnim korisnicima.",
-       "noarticletext": "Na ovoj stranici trenutno nema sadržaja.\nMožete [[Special:Search/{{PAGENAME}}|potražiti ovaj naslov]] na drugim stranicama,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pretražiti srodne izveštaje] ili [{{fullurl:{{FULLPAGENAME}}|action=edit}} napraviti ovu stranicu]</span>.",
-       "noarticletext-nopermission": "Na ovoj stranici trenutno nema sadržaja.\nMožete [[Special:Search/{{PAGENAME}}|potražiti ovaj naslov]] na drugim stranicama ili <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pretražiti srodne dnevnike]</span>, ali nemate dozvolu da napravite ovu stranicu.",
+       "anontalkpagetext": "----\n<em>Ovo je stranica za razgovor s anonimnim korisnikom koji još nema nalog ili ga ne koristi.</em>\nZbog toga moramo da koristimo brojčanu IP adresu kako bismo ga prepoznali.\nTakvu adresu može deliti više korisnika.\nAko ste anonimni korisnik i mislite da su vam upućene primedbe, [[Special:CreateAccount|otvorite nalog]] ili se [[Special:UserLogin|prijavite]] da biste izbegli buduću zabunu s ostalim anonimnim korisnicima.",
+       "noarticletext": "Na ovoj stranici trenutno nema teksta.\nMožete [[Special:Search/{{PAGENAME}}|potražiti ovaj naslov]] na drugim stranicama,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pretražiti srodne izveštaje] ili [{{fullurl:{{FULLPAGENAME}}|action=edit}} napraviti ovu stranicu]</span>.",
+       "noarticletext-nopermission": "Na ovoj stranici trenutno nema teksta.\nMožete [[Special:Search/{{PAGENAME}}|potražiti ovaj naslov]] na drugim stranicama ili <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pretražiti srodne dnevnike]</span>, ali nemate dozvolu da napravite ovu stranicu.",
        "missing-revision": "Ne mogu da pronađem izmenu br. $1 na stranici pod nazivom „{{FULLPAGENAME}}“.\n\nOvo se obično dešava kada pratite zastarelu vezu do stranice koja je obrisana.\nViše informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} dnevniku brisanja].",
        "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 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!'''",
-       "userjspreview": "'''Ovo je samo pregled javaskripta.'''\n'''Stranica još nije sačuvana!'''",
-       "sitecsspreview": "'''Ovo je samo pregled CSS-a.'''\n'''Stranica još nije sačuvana!'''",
-       "sitejspreview": "'''Ovo je samo pregled javaskripta.'''\n'''Stranica još nije sačuvana!'''",
-       "userinvalidconfigtitle": "<strong>Upozorenje:</strong> ne postoji tema „$1“.\nPrilagođene stranice CSS i javaskript počinju malim slovom, npr. {{ns:user}}:Foo/vector.css, a ne {{ns:user}}:Foo/Vector.css.",
-       "updated": "(Ažurirano)",
+       "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 → Podešavanja</em> na Meku) i zatim <em>Privatnost i bezbednost → Očistite podatke o pregledima → Keširane slike i datoteke</em>.",
+       "usercssyoucanpreview": "<strong>Savet:<strong> korisitite dugme „{{int:showpreview}}“ da isprobate svoj novi CSS pre nego što ga sačuvate.",
+       "userjsyoucanpreview": "<strong>Savet:</strong> korisitite dugme „{{int:showpreview}}“ da isprobate svoj novi javaskript pre nego što ga sačuvate.",
+       "usercsspreview": "<strong>Ovo je samo pregled CSS-a.\nStranica još nije sačuvana!</strong>",
+       "userjspreview": "<strong>Ovo je samo pregled javaskripta.\nStranica još nije sačuvana!</strong>",
+       "sitecsspreview": "<strong>Ovo je samo pregled CSS-a.\nStranica još nije sačuvana!</strong>",
+       "sitejspreview": "<strong>Ovo je samo pregled javaskripta.\nStranica još nije sačuvana!</strong>",
+       "userinvalidconfigtitle": "<strong>Upozorenje:</strong> ne postoji tema „$1“.\nPrilagođene stranice CSS, JSON i Javaskript počinju malim slovom, npr. {{ns:user}}:Foo/vector.css, a ne {{ns:user}}:Foo/Vector.css.",
+       "updated": "(ažurirano)",
        "note": "<strong>Napomena:</strong>",
        "previewnote": "<strong>Ne zaboravite da je ovo samo pretpregled.</strong>\nVaše izmene još nisu sačuvane!",
        "continue-editing": "Idi na uređivački okvir",
-       "previewconflict": "Ovaj pregled oslikava kako će tekst u tekstualnom okviru izgledati.",
+       "previewconflict": "Ovaj pregled oslikava kako će izgledati tekst u tekstualnom okviru.",
        "session_fail_preview": "Izvinjavamo se! Nismo mogli da obradimo Vašu izmenu zbog gubitka podataka sesije.\n\nMožda ste odjavljeni. <strong>Proverite da li ste prijavljeni i pokušajte ponovo</strong>.\nAko i dalje ne radi, pokušajte da se [[Special:UserLogout|odjavite]] i ponovo prijavite, te proverite da li su na Vašem pretraživaču dozvoljeni kolačići sa ovog sajta.",
-       "session_fail_preview_html": "'''Nismo mogli da obradimo vašu izmenu zbog gubitka podataka sesije.'''\n\n''Budući da je na ovom vikiju omogućen unos HTML oznaka, pregled je sakriven kao mera predostrožnosti protiv napada preko javaskripta.''\n\n'''Ako ste pokušali da napravite pravu izmenu, pokušajte ponovo.\nAko i dalje ne radi, pokušajte da se [[Special:UserLogout|odjavite]] i ponovo prijavite.'''",
-       "token_suffix_mismatch": "'''Vaša izmena je odbačena jer je vaš pregledač ubacio znakove interpunkcije u novčić uređivanja.\nTo se ponekad događa kada se koristi neispravan posrednik.'''",
+       "session_fail_preview_html": "Nismo mogli da obradimo vašu izmenu zbog gubitka podataka sesije.\n\n<em>Budući da je na ovom vikiju omogućen unos HTML oznaka, pregled je sakriven kao mera predostrožnosti protiv napada preko javaskripta.</em>\n\n<strong>Ako ste pokušali da napravite pravu izmenu, pokušajte ponovo.<strong>\nAko i dalje ne radi, pokušajte da se [[Special:UserLogout|odjavite]] i ponovo prijavite i proverite da li Vaš pregledač dozvoljava kolačiće sa ovog sajta.",
+       "token_suffix_mismatch": "<strong>Vaša izmena je odbačena jer je vaš pregledač ubacio znakove interpunkcije u novčić uređivanja.</strong>\nTo se ponekad događa kada se koristi neispravan posrednik.",
        "edit_form_incomplete": "<strong>Neki delovi obrasca za uređivanje nisu stigli do servera. Proverite da li su vaše izmene nepromenjene i pokušajte ponovo.</strong>",
        "editing": "Uređujete $1",
        "creating": "Pravljenje stranice $1",
        "yourtext": "Vaš tekst",
        "storedversion": "Uskladištena izmena",
        "editingold": "<strong>Upozorenje: uređujete zastarelu izmenu ove stranice.</strong>\nAko je sačuvate, sve novije izmene će biti izgubljene.",
+       "unicode-support-fail": "Vaš pregledač ne podržava Unicode. On je neopohodan za uređivanje stranica, pa zato ne mogu sačuvati izmenu.",
        "yourdiff": "Razlike",
-       "copyrightwarning": "Imajte na umu da se svi doprinosi na ovom vikiju smatraju kao objavljeni pod licencom $2 (više na $1).\nAko ne želite da se vaši tekstovi menjaju i razmenjuju bez ograničenja, onda ih ne šaljite ovde.<br />\nIsto tako obećavate da ste vi autor teksta, ili da ste ga umnožili s izvora koji je u javnom vlasništvu.\n'''Ne šaljite radove zaštićene autorskim pravima bez dozvole!'''",
-       "copyrightwarning2": "Imajte na umu da se svi doprinosi na ovom vikiju mogu menjati, vraćati ili brisati od drugih korisnika.\nAko ne želite da se vaši tekstovi slobodno menjaju i raspodeljuju, ne šaljite ih ovde.<br />\nIsto tako obećavate da ste vi autor teksta, ili da ste ga umnožili s izvora koji je u javnom vlasništvu (više na $1).\n'''Ne šaljite radove zaštićene autorskim pravima bez dozvole!'''",
-       "longpageerror": "'''Greška: tekst koji ste uneli je veličine {{PLURAL:$1|jedan kilobajt|$1 kilobajta|$1 kilobajta}}, što je veće od {{PLURAL:$2|dozvoljenog jednog kilobajta|dozvoljena $2 kilobajta|dozvoljenih $2 kilobajta}}.'''\nStranica ne može biti sačuvana.",
+       "copyrightwarning": "Imajte na umu da se svi doprinosi na ovom vikiju smatraju kao objavljeni pod licencom $2 (više na $1).\nAko ne želite da se vaši tekstovi menjaju i razmenjuju bez ograničenja, onda ih ne šaljite ovde.<br />\nIsto tako obećavate da ste Vi autor teksta, ili da ste ga umnožili s izvora koji je u javnom vlasništvu.\n<strong>Ne šaljite radove zaštićene autorskim pravima bez dozvole!</strong>",
+       "copyrightwarning2": "Imajte na umu da se svi doprinosi na ovom vikiju mogu menjati, vraćati ili brisati od drugih korisnika.\nAko ne želite da se vaši tekstovi slobodno menjaju i raspodeljuju, ne šaljite ih ovde.<br />\nIsto tako obećavate da ste vi autor teksta, ili da ste ga umnožili s izvora koji je u javnom vlasništvu (više na $1).\n<strong>Ne šaljite radove zaštićene autorskim pravima bez dozvole!</strong>",
+       "editpage-cannot-use-custom-model": "Model sadržaja ove stranice se ne može promeniti.",
+       "longpageerror": "<strong>Greška: tekst koji ste uneli je veličine {{PLURAL:$1|jedan kilobajt|$1 kilobajta}}, što je veće od {{PLURAL:$2|dozvoljenog jednog kilobajta|dozvoljena $2 kilobajta|dozvoljenih $2 kilobajta}}.</strong>\nStranica ne može biti sačuvana.",
        "readonlywarning": "<strong>Upozorenje: baza podataka je zaključana radi održavanja, tako da trenutno nećete moći da sačuvate izmene.</strong>\nMožda biste želeli sačuvati tekst za kasnije u nekoj tekstualnoj datoteci.\n\nSistemski administrator je naveo sledeće objašnjenje: $1",
        "protectedpagewarning": "<strong>Upozorenje: ova stranica je zaštićena, tako da samo administratori mogu da je menjaju.</strong>\nPoslednji zapis u dnevniku je prikazan ispod:",
-       "semiprotectedpagewarning": "<strong>Napomena:</strong> Ova stranica je zaštićena, tako da samo registrovani korisnici mogu da je uređuju.\nPoslednji zapis u dnevniku prikazan je ispod kao referenca:",
+       "semiprotectedpagewarning": "<strong>Napomena:</strong> ova stranica je zaštićena, tako da samo registrovani korisnici mogu da je uređuju.\nPoslednji zapis u dnevniku je prikazan ispod kao referenca:",
        "cascadeprotectedwarning": "<strong>Upozorenje:</strong> Ova stranica je zaštićena tako da je mogu uređivati samo korisnici sa [[Special:ListGroupRights|određenim pravima]] (administratori), jer je ista uključena u {{PLURAL:$1|sledeću stranicu koja je zaštićena|sledeće stranice koje su zaštićene}} „prenosivom” zaštitom:",
-       "titleprotectedwarning": "<strong>Upozorenje: ovu stranicu mogu napraviti samo korisnici [[Special:ListGroupRights|s određenim pravima]].</strong>\nIspod su navedeni poslednji zapisi u dnevniku:",
-       "templatesused": "{{PLURAL:$1|Šablon|Šabloni}} na ovoj stranici:",
-       "templatesusedpreview": "{{PLURAL:$1|Šablon|Šabloni}} u ovom pregledu:",
+       "titleprotectedwarning": "<strong>Upozorenje: ovu stranicu mogu napraviti samo korisnici [[Special:ListGroupRights|s određenim pravima]].</strong>\nPoslednji zapis u dnevniku je prikazan ispod:",
+       "templatesused": "{{PLURAL:$1|Šablon koji se koristi|Šabloni koji se koriste}} na ovoj stranici:",
+       "templatesusedpreview": "{{PLURAL:$1|Šablon|Šabloni}} u ovom pretpregledu:",
        "templatesusedsection": "{{PLURAL:$1|Šablon|Šabloni}} u ovom odeljku:",
        "template-protected": "(zaštićeno)",
        "template-semiprotected": "(poluzaštićeno)",
        "permissionserrors": "Greška u dozvoli",
        "permissionserrorstext": "Nemate ovlašćenje za ovu radnju iz {{PLURAL:$1|1=sledećeg|sledećih}} razloga:",
        "permissionserrorstext-withaction": "Nemate dozvolu za $2 iz {{PLURAL:$1|sledećeg|sledećih}} razloga:",
+       "contentmodelediterror": "Ne možete urediti ovu izmenu jer je njen model sadržaja <code>$1</code>, što se razlikuje od trenutnog modela sadržaja stranice <code>$2</code>.",
        "recreate-moveddeleted-warn": "<strong>Upozorenje: ponovo pravite stranicu koja je prethodno obrisana.</strong>\n\nRazmotrite da li je prikladno da nastavite s uređivanjem ove stranice.\nOvde je navedena istorija brisanja i premeštanja s obrazloženjem:",
        "moveddeleted-notice": "Ova stranica je obrisana.\nDnevnik brisanja, zaštite i premeštanja stranice nalazi se ispod.",
-       "moveddeleted-notice-recent": "Žao nam je, ova stranica je nedavno obrisana (u poslednjih 24 sata).\nOvde je navedena istorija brisanja i premeštanja s obrazloženjem.",
+       "moveddeleted-notice-recent": "Žao nam je, ova stranica je nedavno obrisana (u poslednjih 24 sata).\nIstorija njenog brisanja, zaštite i premeštanja nalazi se ispod:",
        "log-fulllog": "Pogledaj celu istoriju",
        "edit-hook-aborted": "Izmenu je prekinula kuka.\nNije dato nikakvo obrazloženje.",
        "edit-gone-missing": "Ne mogu da ažuriram stranicu.\nIzgleda da je obrisana.",
        "postedit-confirmation-created": "Stranica je napravljena.",
        "postedit-confirmation-restored": "Stranica je vraćena.",
        "postedit-confirmation-saved": "Vaša izmena je sačuvana.",
+       "postedit-confirmation-published": "Vaša izmena je objavljena.",
        "edit-already-exists": "Ne mogu da napravim stranicu.\nIzgleda da ona već postoji.",
        "defaultmessagetext": "Podrazumevani tekst poruke",
        "content-failed-to-parse": "Ne mogu da raščlanim sadržaj tipa $2 za model $1: $3",
        "invalid-content-data": "Neispravni podaci sadržaja",
        "content-not-allowed-here": "Sadržaj modela „$1“ nije dozvoljen na stranici [[$2]]",
        "editwarning-warning": "Ako napustite ovu stranicu, izgubićete sve izmene koje ste napravili. Ako ste prijavljeni, možete onemogućiti ovo upozorenje u svojim podešavanjima, u odeljku „{{int:prefs-editing}}“.",
+       "editpage-invalidcontentmodel-title": "Model sadržaja nije podržan",
+       "editpage-invalidcontentmodel-text": "Model sadržaja „$1“ nije podržan.",
        "editpage-notsupportedcontentformat-title": "Format sadržaja nije podržan",
+       "editpage-notsupportedcontentformat-text": "Format sadržaja $1 nije podržan za model sadržaja $2.",
        "content-model-wikitext": "vikitekst",
        "content-model-text": "čist tekst",
        "content-model-javascript": "javaskript",
        "content-model-css": "CSS",
+       "content-model-json": "JSON",
+       "content-json-empty-object": "Prazan objekat",
+       "content-json-empty-array": "Prazan niz",
+       "deprecated-self-close-category": "Stranice koje koriste nevalidne samozatvarajuće HTML tagove",
        "duplicate-args-warning": "<strong>Upozorenje:</strong> [[:$1]] poziva [[:$2]] sa više od jedne vrednosti za parametar „$3“. Samo poslednja navedena vrednost će biti korišćena.",
-       "expensive-parserfunction-warning": "'''Upozorenje:''' ova stranica sadrži previše poziva za raščlanjivanje.\n\nTrebalo bi da ima manje od $2 {{PLURAL:$2|poziv|poziva|poziva}}, a sada ima $1.",
+       "duplicate-args-category": "Stranice s dupliranim argumentima kod poziva šablona",
+       "duplicate-args-category-desc": "Stranica sadrži pozive šablona koji koriste dvostruke argumente, kao što su <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> ili <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
+       "expensive-parserfunction-warning": "<strong>Upozorenje:</strong> ova stranica sadrži previše poziva za raščlanjivanje.\n\nTrebalo bi da ima manje od $2 {{PLURAL:$2|poziv|poziva}}, a sada ima $1.",
        "expensive-parserfunction-category": "Stranice s previše poziva za raščlanjivanje",
-       "post-expand-template-inclusion-warning": "'''Upozorenje:''' veličina uključenog šablona je prevelika.\nNeki šabloni neće biti uključeni.",
-       "post-expand-template-inclusion-category": "Stranice gde su uključeni šabloni preveliki",
+       "post-expand-template-inclusion-warning": "<strong>Upozorenje:</strong> veličina obuhvaćenog šablona je prevelika.\nNeki šabloni neće biti obuhvaćeni.",
+       "post-expand-template-inclusion-category": "Stranice gde su obuhvaćeni preveliki šabloni",
        "post-expand-template-argument-warning": "'''Upozorenje:''' ova stranica sadrži najmanje jedan argument u šablonu koji ima preveliku veličinu.\nOvakve argumente bi trebalo izbegavati.",
        "post-expand-template-argument-category": "Stranice koje sadrže izostavljene argumente u šablonu",
        "parser-template-loop-warning": "Otkrivena je petlja šablona: [[$1]]",
+       "template-loop-category": "Stranice sa petljama šablona",
+       "template-loop-category-desc": "Stranica sadrži petlju šablona, tj. šablon koji poziva sam rebe rekurzivno.",
        "parser-template-recursion-depth-warning": "Dubina uključivanja šablona je prekoračena ($1)",
        "language-converter-depth-warning": "Prekoračena je granica dubine jezičkog pretvarača ($1)",
        "node-count-exceeded-category": "Stranice u kojima je prekoračen broj čvorova",
+       "node-count-exceeded-category-desc": "Stranice sa previše čvorova (node).",
        "node-count-exceeded-warning": "Stranica u kojoj je prekoračen broj čvorova",
        "expansion-depth-exceeded-category": "Stranice u kojima je prekoračena dubina proširenja",
+       "expansion-depth-exceeded-category-desc": "Stranica je prekoračila najveću dubinu proširenja.",
        "expansion-depth-exceeded-warning": "Stranica u kojoj je prekoračena dubina proširenja",
        "parser-unstrip-loop-warning": "Utvrđena je petlja",
        "unstrip-depth-warning": "Prekoračen limit Unstrip rekurzije ($1)",
        "undo-summary-username-hidden": "Poništi izmenu $1 skrivenog korisnika",
        "cantcreateaccount-text": "Otvaranje naloga s ove IP adrese (<strong>$1</strong>) je blokirao/la [[User:$3|$3]].\n\nRazlog koji je naveo/la $3 je <em>$2</em>",
        "cantcreateaccount-range-text": "Otvaranje naloga sa IP adresa u rasponu <strong>$1</strong>, koji uključuje i vašu IP adresu (<strong>$4</strong>) je blokirao/la [[User:$3|$3]].\n\nRazlog koji je naveo/la $3 je <em>$2</em>",
-       "viewpagelogs": "Pogledaj dnevnike ove stranice",
+       "viewpagelogs": "Dnevnici ove stranice",
        "nohistory": "Ne postoji istorija izmena ove stranice.",
-       "currentrev": "Tekuća izmena",
+       "currentrev": "Trenutna izmena",
        "currentrev-asof": "Trenutna izmena na datum $2 u $3",
-       "revisionasof": "Izmena od $2 u $3",
-       "revision-info": "Izmena od $1 koju je {{GENDER:$6|uredio $2|uredila $2}}$7",
+       "revisionasof": "Izmena na datum $2 u $3",
+       "revision-info": "Izmena od $1 od strane {{GENDER:$6|korisnika $2|korisnice $2}}$7",
        "previousrevision": "← Starija izmena",
        "nextrevision": "Novija izmena →",
-       "currentrevisionlink": "Tekuća izmena",
+       "currentrevisionlink": "Trenutna izmena",
        "cur": "tren",
        "next": "sled",
        "last": "razl",
        "page_first": "prva",
        "page_last": "poslednja",
-       "histlegend": "Izbor razlika: izaberite kutijice izmena za upoređivanje i pritisnite enter ili dugme na dnu.<br />\nObjašnjenje: <strong>({{int:cur}})</strong> = razlika s trenutnom izmenom, <strong>({{int:last}})</strong> = razlika s prethodnom izmenom, <strong>{{int:minoreditletter}}</strong> = mala izmena",
-       "history-fieldset-title": "Pregled izmena",
+       "histlegend": "Izbor razlika: izaberite kutijice izmena za upoređivanje i pritisnite enter ili dugme na dnu.<br />\nObjašnjenje: <strong>({{int:cur}})</strong> = razlika s trenutnom izmenom, <strong>({{int:last}})</strong> = razlika s prethodnom izmenom, <strong>{{int:minoreditletter}}</strong> = manja izmena",
+       "history-fieldset-title": "Pretraga izmena",
        "history-show-deleted": "Samo obrisane izmene",
        "histfirst": "najstarije",
        "histlast": "najnovije",
        "history-feed-description": "Istorija izmena ove stranice na vikiju",
        "history-feed-item-nocomment": "$1 u $2",
        "history-feed-empty": "Tražena stranica ne postoji.\nMoguće da je obrisana s vikija ili je preimenovana.\nPokušajte da [[Special:Search|pretražite viki]] za slične stranice.",
+       "history-edit-tags": "Uredi oznake izabranih izmena",
        "rev-deleted-comment": "(opis izmene uklonjen)",
        "rev-deleted-user": "(korisničko ime uklonjeno)",
        "rev-deleted-event": "(detalji unosa uklonjeni)",
        "rev-deleted-user-contribs": "[korisničko ime ili IP adresa je uklonjena – izmena je sakrivena sa spiska doprinosa]",
        "rev-deleted-text-permission": "Izmena ove stranice je '''obrisana'''.\nDetalje možete videti u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} istoriji brisanja].",
+       "rev-suppressed-text-permission": "Izmena ove stranice je <strong>sakrivena</strong>. Više detalja možete naći u [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} istoriji sakrivanja].",
        "rev-deleted-text-unhide": "Izmena ove stranice je '''obrisana'''.\nDetalje možete videti u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} istoriji brisanja].\nIpak možete da [$1 vidite ovu izmenu] ako želite da nastavite.",
        "rev-suppressed-text-unhide": "Izmena ove stranice je '''sakrivena'''.\nDetalje možete videti u [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} istoriji sakrivanja].\nIpak možete da [$1 vidite ovu izmenu] ako želite da nastavite.",
        "rev-deleted-text-view": "Izmena ove stranice je '''obrisana'''.\nMožete je pogledati; više detalja možete naći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} istoriji brisanja].",
        "revdelete-no-file": "Tražena datoteka ne postoji.",
        "revdelete-show-file-confirm": "Želite li da vidite obrisanu izmenu datoteke „<nowiki>$1</nowiki>“ od $2; $3?",
        "revdelete-show-file-submit": "Da",
-       "revdelete-selected-text": "{{PLURAL:$1|Izabrana izmena|Izabrane izmene}} [[:$2]]:",
+       "revdelete-selected-text": "{{PLURAL:$1|Izabrana izmena|Izabrane izmene|Izabranih izmena}} [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|Izabrana verzija datoteke|Izabrane verzije datoteke}} [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Izabrana stavka u istoriji|Izabrane stavke u istoriji}}:",
        "revdelete-text-text": "Izbrisane izmene će i dalje biti vidljive u istoriji stranice, ali delovi njihovog sadržaja neće biti javno dostupni.",
        "mergehistory-empty": "Nema izmena za spajanje.",
        "mergehistory-done": "$3 {{PLURAL:$3|izmena stranice $1 je spojena|izmene stranice $1 su spojene|izmena stranice $1 je spojeno}} u [[:$2]].",
        "mergehistory-fail": "Ne mogu da spojim istorije. Proverite stranicu i vremenske parametre.",
+       "mergehistory-fail-bad-timestamp": "Vremenska oznaka nije ispravna.",
+       "mergehistory-fail-invalid-source": "Izvorna stranica nije ispravna.",
+       "mergehistory-fail-invalid-dest": "Odredišna stranica nije ispravna.",
+       "mergehistory-fail-no-change": "Spajanje istorije nije spojilo nijednu izmenu. Proverite parametre stranice i vremena.",
+       "mergehistory-fail-permission": "Nemate ovlašćenje za spajanje istorije.",
+       "mergehistory-fail-self-merge": "Izvorna i odredišna stranica ne mogu biti iste.",
+       "mergehistory-fail-timestamps-overlap": "Izvorne izmene se preklapaju ili dolaze nakon odredišnih izmena.",
        "mergehistory-fail-toobig": "Nije moguće spojiti istorije jer više od $1 {{PLURAL:$1|izmene će biti premeštene|izmena će biti premešteno}}.",
        "mergehistory-no-source": "Izvorna stranica $1 ne postoji.",
        "mergehistory-no-destination": "Odredišna stranica $1 ne postoji.",
        "compareselectedversions": "Uporedi izabrane izmene",
        "showhideselectedversions": "Promeni vidljivost izabranih izmena",
        "editundo": "poništi",
-       "diff-empty": "(Nema razlike)",
-       "diff-multi-sameuser": "({{PLURAL:$1|Jedna međuizmena istog korisnika nije prikazana|$1 međuizmene istog korisnika nije prikazano|$1 međuizmena istog korisnika nije prikazano}})",
+       "diff-empty": "(nema razlike)",
+       "diff-multi-sameuser": "({{PLURAL:$1|Jedna međuizmena istog korisnika nije prikazana|$1 međuizmene istog korisnika nisu prikazane|$1 međuizmena istog korisnika nije prikazano}})",
        "diff-multi-otherusers": "({{PLURAL:$1|Jedna međuizmena|$1 međuizmene|$1 međuizmena}} od strane {{PLURAL:$2|još jednog korisnika nije prikazana|$2 korisnika nije prikazano}})",
        "diff-multi-manyusers": "({{PLURAL:$1|Nije prikazana međuizmena|Nisu prikazane $1 međuizmene|Nije prikazano $1 međuizmena}} od više od $2 korisnika)",
+       "diff-paragraph-moved-tonew": "Odlomak je premešten. Kliknite da pređete na njegovo novo mesto.",
+       "diff-paragraph-moved-toold": "Odlomak je premešten. Kliknite da pređete na njegovo staro mesto.",
        "difference-missing-revision": "Ne mogu da pronađem {{PLURAL:$2|jednu izmenu|$2 izmene|$2 izmena}} od ove razlike ($1).\n\nOvo se obično dešava kada pratite zastarelu vezu do stranice koja je obrisana.\nViše informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} dnevniku brisanja].",
        "searchresults": "Rezultati pretrage",
        "searchresults-title": "Rezultati pretrage za „$1“",
        "titlematches": "Naslov stranice odgovara",
        "textmatches": "Tekst stranice odgovara",
        "notextmatches": "Nijedan tekst stranice ne odgovara",
-       "prevn": "prethodnih {{PLURAL:$1|$1}}",
-       "nextn": "sledećih {{PLURAL:$1|$1}}",
+       "prevn": "{{PLURAL:$1|prethodnu $1|prethodne $1|prethodnih $1}}",
+       "nextn": "{{PLURAL:$1|sledeću $1|sledeće $1|sledećih $1}}",
        "prev-page": "prethodna stranica",
        "next-page": "sledeća stranica",
        "prevn-title": "$1 {{PLURAL:$1|prethodni  rezultat|prethodna rezultata|prethodnih rezultata}}",
        "nextn-title": "$1 {{PLURAL:$1|sledeći rezultat|sledeća rezultata|sledećih rezultata}}",
-       "shown-title": "Prikaži $1 {{PLURAL:$1|rezultat|rezultata|rezultata}} po stranici",
+       "shown-title": "Prikaži $1 {{PLURAL:$1|rezultat|rezultata}} po stranici",
        "viewprevnext": "Pogledaj ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "<strong>Postoji stranica pod nazivom „[[:$1]]”!</strong> {{PLURAL:$2|0=|Takođe pogledajte druge pronađene rezultate pretrage.}}",
-       "searchmenu-new": "<strong>Napravite stranicu „[[:$1]]”!</strong> {{PLURAL:$2|0=|Takođe pogledajte rezultat pretrage.|Takođe pogledajte rezultate pretrage.}}",
-       "searchprofile-articles": "Članci",
+       "searchmenu-new": "<strong>Napravite stranicu „[[:$1]]” na ovom vikiju!</strong> {{PLURAL:$2|0=|Takođe pogledajte rezultat pretrage.|Takođe pogledajte rezultate pretrage.}}",
+       "searchprofile-articles": "Stranice sa sadržajem",
        "searchprofile-images": "Datoteke",
        "searchprofile-everything": "Sve",
        "searchprofile-advanced": "Napredno",
        "searchprofile-images-tooltip": "Pretražite datoteke",
        "searchprofile-everything-tooltip": "Pretražite sav sadržaj (uključujući stranice za razgovor)",
        "searchprofile-advanced-tooltip": "Pretražite prilagođene imenske prostore",
-       "search-result-size": "$1 ({{PLURAL:$2|1 reč|$2 reči|$2 reči}})",
+       "search-result-size": "$1 ({{PLURAL:$2|1 reč|$2 reči}})",
        "search-result-category-size": "{{PLURAL:$1|1 član|$1 člana|$1 članova}}, ({{PLURAL:$2|1 potkategorija|$2 potkategorije|$2 potkategorija}}, {{PLURAL:$3|1 datoteka|$3 datoteke|$3 datoteka}})",
-       "search-redirect": "(preusmereno sa $1)",
+       "search-redirect": "(preusmerenje sa $1)",
        "search-section": "(odeljak $1)",
        "search-category": "(kategorija $1)",
        "search-file-match": "(podudara se sadržaj datoteke)",
-       "search-suggest": "Da li ste mislili na: $1",
+       "search-suggest": "Da li ste mislili: $1",
        "search-rewritten": "Prikazani rezultati za $1. Ipak pretraži $2.",
-       "search-interwiki-caption": "Bratski projekti",
+       "search-interwiki-caption": "Rezultati sa sestrinskih projekata",
        "search-interwiki-default": "Rezultati sa $1:",
        "search-interwiki-more": "(više)",
+       "search-interwiki-more-results": "još rezultata",
        "search-relatedarticle": "Povezano",
        "searchrelated": "povezano",
        "searchall": "sve",
        "showingresults": "Ispod {{PLURAL:$1|je prikazan <strong>1</strong> rezultat|su prikazana <strong>$1</strong> rezultata|je prikazano <strong>$1</strong> rezultata}}, počev od broja <strong>$2</strong>.",
        "showingresultsinrange": "Ispod {{PLURAL:$1|je prikazan <strong>1</strong> rezultat|su prikazana <strong>$1</strong> rezultata|je prikazano <strong>$1</strong> rezultata}}, u rasponu od <strong>$2</strong> do <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Rezultat <strong>$1</strong> od <strong>$3</strong>|Rezultati <strong>$1—$2</strong> od <strong>$3</strong>}}",
-       "search-nonefound": "Nema poklapanja.",
+       "search-nonefound": "Nisu pronađeni rezultati koji odgovaraju upitu.",
+       "search-nonefound-thiswiki": "Nema rezultata na ovom sajtu koji se poklapaju sa terminom pretrage.",
        "powersearch-legend": "Napredna pretraga",
        "powersearch-ns": "Pretraga po imenskim prostorima:",
        "powersearch-togglelabel": "Izaberi:",
        "powersearch-toggleall": "Sve",
        "powersearch-togglenone": "Ništa",
        "powersearch-remember": "Zapamti moj izbor za buduće pretrage",
-       "search-external": "Spoljna pretraga",
+       "search-external": "Spoljašnja pretraga",
        "searchdisabled": "Pretraga je onemogućena.\nU međuvremenu možete tražiti preko Gugla.\nUpamtite da njegovi popisi ovog vikija mogu biti zastareli.",
        "search-error": "Došlo je do greške prilikom pretrage: $1",
+       "search-warning": "Upozorenje prilikom pretrage: $1",
        "preferences": "Podešavanja",
        "mypreferences": "Podešavanja",
        "prefs-edits": "Broj izmena:",
        "prefsnologintext2": "Morate biti prijavljeni da biste menjali svoja podešavanja.",
        "prefs-skin": "Tema",
-       "skin-preview": "Pregledaj",
+       "skin-preview": "pregledaj",
        "datedefault": "Svejedno",
        "prefs-labs": "Probne mogućnosti",
        "prefs-user-pages": "Korisničke stranice",
        "prefs-watchlist": "Spisak nadgledanja",
        "prefs-editwatchlist": "Uređivanje spiska nadgledanja",
        "prefs-editwatchlist-label": "Uređivanje spiska:",
-       "prefs-editwatchlist-edit": "Uredi spisak",
-       "prefs-editwatchlist-raw": "Uredi sirov spisak",
-       "prefs-editwatchlist-clear": "Isprazni spisak",
+       "prefs-editwatchlist-edit": "uredi spisak",
+       "prefs-editwatchlist-raw": "uredi sirov spisak",
+       "prefs-editwatchlist-clear": "isprazni spisak",
        "prefs-watchlist-days": "Broj dana u spisku nadgledanja:",
        "prefs-watchlist-days-max": "Najviše $1 {{PLURAL:$1|dan|dana|dana}}",
-       "prefs-watchlist-edits": "Najveći broj izmena u proširenom spisku nadgledanja:",
-       "prefs-watchlist-edits-max": "Najveća vrednost je hiljadu",
+       "prefs-watchlist-edits": "Najveći broj izmena prikazanih na spisku nadgledanja:",
+       "prefs-watchlist-edits-max": "Najveći broj: 1000",
        "prefs-watchlist-token": "Žeton spiska nadgledanja:",
+       "prefs-watchlist-managetokens": "Upravljaj žetonima",
        "prefs-misc": "Druga podešavanja",
-       "prefs-resetpass": "Promeni lozinku",
-       "prefs-changeemail": "Promeni ili ukloni imejl adresu",
-       "prefs-setemail": "Postavi imejl adresu",
-       "prefs-email": "Postavke imejla",
+       "prefs-resetpass": "promeni lozinku",
+       "prefs-changeemail": "promeni ili ukloni imejl adresu",
+       "prefs-setemail": "postavi imejl adresu",
+       "prefs-email": "Opcije imejla",
        "prefs-rendering": "Izgled",
        "saveprefs": "Sačuvaj",
-       "restoreprefs": "Vrati sve na podrazumevano (u svim odeljcima)",
+       "restoreprefs": "Vrati sva podrazumevana podešavanja (u svim odeljcima)",
        "prefs-editing": "Uređivanje",
        "searchresultshead": "Pretraga",
        "stub-threshold": "Prag za oblikovanje veze kao klice ($1):",
        "stub-threshold-sample-link": "primer",
-       "stub-threshold-disabled": "Onemogućeno",
+       "stub-threshold-disabled": "onemogućeno",
        "recentchangesdays": "Broj dana u skorašnjim izmenama:",
        "recentchangesdays-max": "Najviše $1 {{PLURAL:$1|dan|dana}}",
-       "recentchangescount": "Broj izmena za prikaz:",
-       "prefs-help-recentchangescount": "Podrazumeva skorašnje izmene, istorije stranica i dnevnike.",
-       "prefs-help-watchlist-token2": "Ovo je tajni ključ za veb-dovod Vašeg spiska nadgledanja. \nSvako ko zna ovaj ključ biće u mogućnosti da vidi Vaša nadgledanja; stoga, ključ nemojte odavati nikome. \nAko je potrebno, ključ možete [[Special:ResetTokens|resetovati]].",
+       "recentchangescount": "Podrazumevani broj izmena za prikaz u skorašnjim izmenama, istorijama stranica i dnevnicima:",
+       "prefs-help-recentchangescount": "Najveća broj: 1000",
+       "prefs-help-watchlist-token2": "Ovo je tajni ključ za veb-dovod Vašeg spiska nadgledanja. \nSvako ko zna ovaj ključ biće u mogućnosti da čita Vaš spisak nadgledanja, zato ga nemojte deliti. \nAko je potrebno, [[Special:ResetTokens|možete ga obnoviti]].",
        "savedprefs": "Vaša podešavanja su sačuvana.",
-       "savedrights": "Korisnička prava za {{GENDER:$1|$1}} su sačuvana.",
+       "savedrights": "Korisničke grupe za {{GENDER:$1|$1}} su sačuvane.",
        "timezonelegend": "Vremenska zona:",
        "localtime": "Lokalno vreme:",
        "timezoneuseserverdefault": "podrazumevane vrednosti ($1)",
        "timezoneregion-europe": "Evropa",
        "timezoneregion-indian": "Indijski okean",
        "timezoneregion-pacific": "Tihi okean",
-       "allowemail": "Omogući primanje imejlova od drugih korisnika",
+       "allowemail": "Dozvoli primanje imejlova od drugih korisnika",
+       "email-allow-new-users-label": "Dozvoli primanje imejlova od novajlija",
+       "email-blacklist-label": "Zabrani primanje imejlova od sledećih korisnika:",
        "prefs-searchoptions": "Pretraga",
        "prefs-namespaces": "Imenski prostori",
-       "default": "podrazumevano",
+       "default": "podrazumevana",
        "prefs-files": "Datoteke",
-       "prefs-custom-css": "Prilagođeni CSS",
-       "prefs-custom-js": "Prilagođeni javaskript",
-       "prefs-common-config": "Deljeni CSS/javaskript za sve teme:",
-       "prefs-reset-intro": "Možete koristiti ovu stranicu da poništite svoje postavke na podrazumevane vrednosti.\nOva radnja se ne može vratiti.",
+       "prefs-custom-css": "prilagođeni CSS",
+       "prefs-custom-json": "Prilagođeni JSON",
+       "prefs-custom-js": "prilagođeni Javaskript",
+       "prefs-common-config": "Deljeni CSS/JSON/Javaskript za sve teme:",
+       "prefs-reset-intro": "Možete koristiti ovu stranicu da poništite svoja podešavanja na podrazumevane vrednosti.\nOva radnja se ne može vratiti.",
        "prefs-emailconfirm-label": "Potvrda imejla:",
        "youremail": "Imejl:",
        "username": "{{GENDER:$1|Korisničko ime}}:",
-       "prefs-memberingroups": "{{PLURAL:$1|Grupa|Grupe}}:",
+       "prefs-memberingroups": "{{GENDER:$2|Član|Članica}} {{PLURAL:$1|grupe|grupâ}}:",
        "prefs-memberingroups-type": "$1",
        "group-membership-link-with-expiry": "$1 (do $2)",
        "prefs-registration": "Vreme registracije:",
        "yourvariant": "Varijanta jezika:",
        "prefs-help-variant": "Željena varijanta ili pravopis za prikaz stranica sa sadržajem ovog vikija.",
        "yournick": "Novi potpis:",
-       "prefs-help-signature": "Komentare na stranicama za razgovor potpisujte sa četiri tilde: <nowiki>~~~~</nowiki>. Ovaj vikitekst će biti pretvoren u Vaš potpis i trenutno vreme.",
+       "prefs-help-signature": "Komentari na stranicama za razgovor treba da budu potpisani sa „<nowiki>~~~~</nowiki>“ koje će biti pretvoreno u Vaš potpis s trenutnim vremenom.",
        "badsig": "Potpis je neispravan.\nProverite oznake HTML.",
        "badsiglength": "Vaš potpis je predugačak.\nNe sme biti duži od $1 {{PLURAL:$1|znaka|znaka|znakova}}.",
        "yourgender": "Kako želite da se predstavite?",
-       "gender-unknown": "Ne želim da se predstavim",
+       "gender-unknown": "Kad Vas spominje, softver će koristiti rodno neutralne reči kad god je to moguće",
        "gender-male": "On uređuje viki stranice",
        "gender-female": "Ona uređuje viki stranice",
-       "prefs-help-gender": "Neobavezno: koristi se za ispravno obraćanje softvera korisnicima, zavisno od njihovog pola.\nOvaj podatak će biti javan.",
+       "prefs-help-gender": "Postavljanje ovog podešavanja je neobavezno.\nSoftver koristi datu vrednost da bi Vam se obratio i spomenuo Vas drugima koristeći odgovarajući gramatički rod.\nOva informacija će biti javna.",
        "email": "Imejl",
        "prefs-help-realname": "Pravo ime nije obavezno.\nAko izaberete da ga unesete, ono će biti korišćeno za pripisivanje vašeg rada.",
-       "prefs-help-email": "Imejl adresa nije obavezna, ali je potrebna u slučaju da zaboravite lozinku.",
-       "prefs-help-email-others": "Možete je koristiti i da omogućite drugima da vas kontaktiraju preko korisničke stranice ili stranice za razgovor, bez otkrivanja svog identiteta.",
+       "prefs-help-email": "Imejl adresa nije obavezna, ali je potrebna za obnavljanje lozinke, ako je zaboravite.",
+       "prefs-help-email-others": "Takođe možete izabrati da dopustite drugima da Vas kontaktiraju preko imejla putem veze na Vašoj korisničkoj stranici ili stranici za razgovor.\nVaša imejl adresa neće biti prikazana drugim korisnicima koji Vas kontaktiraju.",
        "prefs-help-email-required": "Potrebna je imejl adresa.",
-       "prefs-info": "Osnovni podaci",
+       "prefs-info": "Osnovne informacije",
        "prefs-i18n": "Internacionalizacija",
        "prefs-signature": "Potpis",
        "prefs-dateformat": "Format datuma",
        "prefs-timeoffset": "Vremenska razlika",
        "prefs-advancedediting": "Glavna podešavanja",
+       "prefs-developertools": "Programerske alatke",
        "prefs-editor": "Uređivač",
        "prefs-preview": "Pretpregled",
-       "prefs-advancedrc": "Napredne postavke",
+       "prefs-advancedrc": "Napredne opcije",
        "prefs-opt-out": "Onemogućavanje poboljšanja",
-       "prefs-advancedrendering": "Napredne postavke",
-       "prefs-advancedsearchoptions": "Napredne postavke",
-       "prefs-advancedwatchlist": "Napredne postavke",
-       "prefs-displayrc": "Postavke prikaza",
-       "prefs-displaywatchlist": "Postavke prikaza",
+       "prefs-advancedrendering": "Napredne opcije",
+       "prefs-advancedsearchoptions": "Napredne opcije",
+       "prefs-advancedwatchlist": "Napredne opcije",
+       "prefs-displayrc": "Podešavanja prikaza",
+       "prefs-displaywatchlist": "Podešavanja prikaza",
        "prefs-tokenwatchlist": "Žeton",
        "prefs-diffs": "Razlike",
        "prefs-help-prefershttps": "Ova podešavanja će stupiti na snagu pri sledećoj prijavi.",
        "prefswarning-warning": "Promenili ste vaša podešavanja ali niste ih još sačuvali.\nAko ne pritisnete „$1“ vaša podešavanja će biti izgubljena.",
        "prefs-tabs-navigation-hint": "Savet: možete koristiti tipke sa levom i desnom strelicom za kretanje kroz kartice.",
-       "userrights": "Upravljanje korisničkim pravima",
-       "userrights-lookup-user": "Upravljanje korisničkim grupama",
+       "userrights": "Korisnička prava",
+       "userrights-lookup-user": "Izaberi korisnika",
        "userrights-user-editname": "Korisničko ime:",
-       "editusergroup": "Uredi {{GENDER:$1|korisničke}} grupe",
-       "editinguser": "Menjate korisnička prava {{GENDER:$1|korisnika|korisnice|korisnika}} '''[[User:$1|$1]]''' $2",
-       "userrights-editusergroup": "Promena korisničkih grupa",
+       "editusergroup": "Učitaj korisničke grupe",
+       "editinguser": "Menjate korisnička prava {{GENDER:$1|korisnika|korisnice}} <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "Korisnička prava {{GENDER:$1|korisnika|korisnice}} <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "Promena {{GENDER:$1|korisničkih}} grupa",
+       "userrights-viewusergroup": "Pregled {{GENDER:$1|korisničkih}} grupa",
        "saveusergroups": "Sačuvaj {{GENDER:$1|korisničke}} grupe",
        "userrights-groupsmember": "Član:",
        "userrights-groupsmember-auto": "Podrazumevano član i:",
-       "userrights-groups-help": "Možete promeniti grupe kojima ovaj korisnik pripada.\n* Označen kvadratić označava da se korisnik nalazi u toj grupi.\n* Neoznačen kvadratić označava da se korisnik ne nalazi u toj grupi.\n* Zvezdica označava da ne možete ukloniti grupu ako je dodate i obratno.",
+       "userrights-groups-help": "Možete promeniti grupe kojima ovaj korisnik pripada:\n* Označen kvadratić označava da se korisnik nalazi u toj grupi.\n* Neoznačen kvadratić označava da se korisnik ne nalazi u toj grupi.\n* Zvezdica (*) označava da ne možete ukloniti tu grupu ako je dodate i obratno.\n* Taraba (#) označava da jedino možete odložiti vreme isteka članstva u toj grupi; ne možete ga ubrzati.",
        "userrights-reason": "Razlog:",
        "userrights-no-interwiki": "Nemate ovlašćenja da menjate korisnička prava na drugim vikijima.",
        "userrights-nodatabase": "Baza podataka $1 ne postoji ili nije lokalna.",
        "userrights-changeable-col": "Grupe koje možete da promenite",
        "userrights-unchangeable-col": "Grupe koje ne možete da promenite",
        "userrights-irreversible-marker": "$1*",
+       "userrights-expiry-current": "Ističe $1",
+       "userrights-expiry-none": "Ne ističe",
+       "userrights-expiry": "Ističe:",
        "userrights-expiry-existing": "Postojeće vreme isteka: $3, $2",
        "userrights-expiry-othertime": "Drugo vreme:",
+       "userrights-expiry-options": "1 dan:1 day,1 nedelja:1 week,1 mesec:1 month,3 meseca:3 months,6 meseci:6 months,1 godina:1 year",
+       "userrights-invalid-expiry": "Vreme isticanja grupe „$1“ nije ispravno.",
+       "userrights-expiry-in-past": "Vreme isticanja grupe „$1“ je prošlo.",
+       "userrights-cannot-shorten-expiry": "Ne možete ubrzati istek članstva u grupi „$1”. Samo korisnici sa dozvolom da dodaju ili uklone ovu grupu mogu da ubrzaju rok isteka.",
        "userrights-conflict": "Sukob promena korisničkih prava! Molimo proverite vaše izmene.",
        "group": "Grupa:",
        "group-user": "Korisnici",
        "group-user-member": "{{GENDER:$1|korisnik|korisnica|korisnik}}",
        "group-autoconfirmed-member": "{{GENDER:$1|automatski potvrđen korisnik|automatski potvrđena korisnica}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
-       "group-sysop-member": "{{GENDER:$1|administrator|administratorka}}",
+       "group-sysop-member": "{{GENDER:$1|administrator|administratorka|administrator}}",
        "group-bureaucrat-member": "{{GENDER:$1|birokrata|birokratkinja}}",
        "group-suppress-member": "{{GENDER:$1|brisač izmena}}",
        "grouppage-user": "{{ns:project}}:Korisnici",
        "right-createpage": "pravljenje stranica (izuzev stranica za razgovor)",
        "right-createtalk": "pravljenje stranica za razgovor",
        "right-createaccount": "otvaranje novih korisničkih naloga",
+       "right-autocreateaccount": "Prijavite se automatski sa eksternim korisničkim nalogom",
        "right-minoredit": "označavanje izmena manjim",
-       "right-move": "Premeštanje stranica",
+       "right-move": "premeštanje stranica",
        "right-move-subpages": "premeštanje stranica s njihovim podstranicama",
        "right-move-rootuserpages": "premeštanje osnovnih korisničkih stranica",
-       "right-move-categorypages": "Premeštanje kategorija",
-       "right-movefile": "Premeštanje datoteka",
+       "right-move-categorypages": "premeštanje kategorija",
+       "right-movefile": "premeštanje datoteka",
        "right-suppressredirect": "premeštanje stranica bez ostavljanja preusmerenja",
-       "right-upload": "Otpremanje datoteka",
+       "right-upload": "otpremanje datoteka",
        "right-reupload": "zamenjivanje postojećih datoteka",
        "right-reupload-own": "zamenjivanje sopstvenih datoteka",
        "right-reupload-shared": "menjanje datoteka na deljenom skladištu multimedije",
        "right-purge": "čišćenje keš memorije stranice bez potvrde",
        "right-autoconfirmed": "bez ograničavanja stavki za IP adrese",
        "right-bot": "smatranje izmena kao automatski proces",
-       "right-nominornewtalk": "neposedovanje malih izmena na stranicama za razgovor otvara prozor za nove poruke",
+       "right-nominornewtalk": "neposedovanje manjih izmena na stranicama za razgovor otvara prozor za nove poruke",
        "right-apihighlimits": "korišćenje viših granica za upite iz API-ja",
-       "right-writeapi": "pisanje API-ja",
+       "right-writeapi": "mogućnost pisanja API-ja",
        "right-delete": "brisanje stranica",
        "right-bigdelete": "brisanje stranica s velikom istorijom",
        "right-deletelogentry": "brisanje i vraćanje određenih stavki u dnevniku",
        "right-viewsuppressed": "pregledanje izmena skrivenih od svih korisnika",
        "right-suppressionlog": "pregledanje privatnih dnevnika",
        "right-block": "blokiranje daljih izmena drugih korisnika",
-       "right-blockemail": "Blokiraj korisniku slanje imejla",
+       "right-blockemail": "blokiranje korisnika da šalju imejl",
        "right-hideuser": "blokiranje korisničkog imena i njegovo sakrivanje od javnosti",
        "right-ipblock-exempt": "zaobilaženje blokiranja IP adrese, automatska blokiranja i blokiranja opsega",
        "right-unblockself": "deblokiranje samog sebe",
        "right-protect": "menjanje stepena zaštite i uređivanje stranica pod prenosivom zaštitom",
-       "right-editprotected": "uređivanje stranice pod zaštitom „{{int:protect-level-sysop}}“",
+       "right-editprotected": "uređivanje stranica pod zaštitom „{{int:protect-level-sysop}}“",
        "right-editsemiprotected": "uređivanje stranica pod zaštitom „{{int:protect-level-autoconfirmed}}“",
+       "right-editcontentmodel": "menjanje modela sadržaja stranice",
        "right-editinterface": "uređivanje korisničkog okruženja",
        "right-editusercss": "uređivanje tuđih CSS datoteka",
        "right-edituserjson": "uređivanje tuđih JSON datoteka",
        "right-editmyusercss": "uređivanje sopstvenih CSS datoteka",
        "right-editmyuserjson": "uređivanje sopstvenih JSON datoteka",
        "right-editmyuserjs": "uređivanje sopstvenih JavaScript datoteka",
-       "right-viewmywatchlist": "vidi sopstveni spisak nadgledanja",
+       "right-viewmywatchlist": "pregled sopstvenog spiska nadgledanja",
        "right-editmywatchlist": "uređivanje sopstvenog spiska nadgledanja; neke preduzete radnje će svejedno dodati stranice na spisak i bez ovog prava",
-       "right-viewmyprivateinfo": "vidite svoje lične podatke (npr. imejl adresu, pravo ime)",
-       "right-editmyprivateinfo": "uređivanje sopstvenih ličnih podataka (npr. imejl adresa, pravo ime)",
+       "right-viewmyprivateinfo": "pregled svojih ličnih podataka (npr. imejl adresu, pravo ime)",
+       "right-editmyprivateinfo": "uređivanje sopstvenih ličnih podataka (npr. imejl adrese, pravog imena)",
        "right-editmyoptions": "uređivanje sopstvenih podešavanja",
        "right-rollback": "brzo vraćanje izmena poslednjeg korisnika koji je menjao određenu stranicu",
        "right-markbotedits": "označavanje vraćenih izmena kao izmene bota",
        "right-userrights-interwiki": "uređivanje korisničkih prava na drugim vikijima",
        "right-siteadmin": "zaključavanje i otključavanje baze podataka",
        "right-override-export-depth": "izvoz stranica uključujući i povazene stranice do dubine od pet veza",
-       "right-sendemail": "Pošalji imejl drugim korisnicima",
+       "right-sendemail": "slanje imejla drugim korisnicima",
        "right-managechangetags": "pravljenje i (de)aktiviranje [[Special:Tags|oznaka]]",
+       "right-applychangetags": "primenjivanje [[Special:Tags|oznaka]] na nečije izmene",
+       "right-changetags": "dodavanje i uklanjanje raznih [[Special:Tags|oznaka]] na pojedinačnim izmenama i unosima u dnevnicima",
+       "right-deletechangetags": "brisanje [[Special:Tags|oznaka]] iz baze podataka",
+       "grant-generic": "Skup prava „$1“",
        "grant-group-page-interaction": "Uređivanje stranica",
        "grant-group-file-interaction": "Uređivanje datoteka",
        "grant-group-watchlist-interaction": "Uređivanje vašeg spiska nadgledanja",
-       "grant-group-email": "Slanje e-poruka",
+       "grant-group-email": "Pošalji imejl",
+       "grant-group-high-volume": "Izvršavanje velikog broja radnji",
+       "grant-group-customization": "Prilagođavanje i podešavanja",
+       "grant-group-administration": "Izvršavanje administrativnih radnji",
+       "grant-group-private-information": "Pristupanje Vašim ličnim podacima",
+       "grant-group-other": "Razne aktivnosti",
+       "grant-blockusers": "Blokiranje i deblokiranje korisnika",
        "grant-createaccount": "Otvaranje naloga",
        "grant-createeditmovepage": "Pravljenje, uređivanje i premeštanje stranica",
        "grant-delete": "Brisanje stranica, izmena i unosa u dnevnicima",
-       "grant-editinterface": "Uređivanje Medijaviki imenskog prostora i korisničkih CSS/JavaScript stranica",
+       "grant-editinterface": "Uređivanje Medijaviki imenskog prostora i korisničkih CSS/JSON/Javaskript stranica",
+       "grant-editmycssjs": "Uređivanje vašeg CSS/JSON/Javaskripta",
+       "grant-editmyoptions": "Uređivanje Vaših podešavanja",
        "grant-editmywatchlist": "Uređivanje vašeg spiska nadgledanja",
        "grant-editpage": "Uređivanje postojećih stranica",
        "grant-editprotected": "Uređivanje zaštićenih stranica",
+       "grant-highvolume": "Masovno uređivanje",
+       "grant-oversight": "Skrivanje korisnika i izmena",
+       "grant-patrol": "Patroliranje izmena",
+       "grant-privateinfo": "Pristupi privatnim informacijama",
+       "grant-protect": "Zaključavanje i otključavanje stranica",
+       "grant-rollback": "Vraćanje izmena",
+       "grant-sendemail": "Slanje imejlova drugim korisnicima",
        "grant-uploadeditmovefile": "Otpremanje, zamena i premeštanje datoteka",
        "grant-uploadfile": "Otpremanje novih datoteka",
+       "grant-basic": "Osnovna prava",
+       "grant-viewdeleted": "Pregled obrisanih stranica i datoteka",
+       "grant-viewmywatchlist": "Pregled vašeg spisak nadgledanja",
+       "grant-viewrestrictedlogs": "Pregledanje ograničenih unosa u dnevniku",
        "newuserlogpage": "Dnevnik novih korisnika",
        "newuserlogpagetext": "Ovo je dnevnik novih korisnika.",
        "rightslog": "Dnevnik korisničkih prava",
        "action-createpage": "pravljenje stranica",
        "action-createtalk": "pravljenje stranica za razgovor",
        "action-createaccount": "otvaranje ovog korisničkog naloga",
+       "action-autocreateaccount": "automatsko pravljenje ovog spoljašnjeg korisničkog naloga",
        "action-history": "gledanje istorije ove stranice",
        "action-minoredit": "označavanje ove izmene kao manje",
        "action-move": "premeštanje ove stranice",
        "action-upload_by_url": "otpremanje ove datoteke preko veb-adrese",
        "action-writeapi": "pisanje API-ja",
        "action-delete": "brisanje ove stranice",
-       "action-deleterevision": "brisanje ove izmene",
-       "action-deletedhistory": "pregledanje obrisane istorije ove stranice",
+       "action-deleterevision": "brisanje izmena",
+       "action-deletelogentry": "birsanje unosa u dnevnicima",
+       "action-deletedhistory": "pregledanje obrisane istorije stranice",
+       "action-deletedtext": "pregled obrisanog teksta izmene",
        "action-browsearchive": "pretraživanje obrisanih stranica",
-       "action-undelete": "vraćanje ove stranice",
-       "action-suppressrevision": "pregledanje i vraćanje ove sakrivene izmene",
+       "action-undelete": "vraćanje stranica",
+       "action-suppressrevision": "pregledanje i vraćanje sakrivenih izmena",
        "action-suppressionlog": "pregledanje ove privatne istorije",
        "action-block": "blokiranje daljih izmena ovog korisnika",
        "action-protect": "menjanje stepena zaštite ove stranice",
        "action-userrights-interwiki": "uređivanje korisničkih prava na drugim vikijima",
        "action-siteadmin": "zaključavanje ili otključavanje baze podataka",
        "action-sendemail": "slanje imejlova",
+       "action-editmyoptions": "uređivanje Vaših podešavanja",
        "action-editmywatchlist": "izmenu sopstvenog spisak nadgledanja",
        "action-viewmywatchlist": "pregled vašeg spisak nadgledanja",
        "action-viewmyprivateinfo": "pregledanje vaših ličnih podataka",
        "action-editmyprivateinfo": "uređivanje vaših ličnih podataka",
-       "action-managechangetags": "pravljenje i/ili brisanje oznaka iz baze podataka",
+       "action-editcontentmodel": "menjanje modela sadržaja stranice",
+       "action-managechangetags": "pravljenje i (de)aktiviranje oznaka",
+       "action-applychangetags": "dodavanje oznaka na vaše izmene",
+       "action-changetags": "dodavanje i uklanjanje raznih oznaka na pojedinačnim izmenama i unosima u dnevnicima",
+       "action-deletechangetags": "Obriši oznake iz baze podataka",
+       "action-purge": "čišćenje privremene memorije ove stranice",
        "nchanges": "$1 {{PLURAL:$1|izmena|izmene|izmena}}",
+       "ntimes": "$1×",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|izmena od vaše poslednje posete}}",
        "enhancedrc-history": "istorija",
        "recentchanges": "Skorašnje izmene",
        "recentchanges-legend": "Opcije skorašnjih izmena",
        "recentchanges-summary": "Pratite skorašnje izmene na ovoj stranici.",
-       "recentchanges-noresult": "Nema promena u zadatom vremenu za zadate kriterijume.",
+       "recentchanges-noresult": "Nema izmena u zadatom periodu koji odgovaraju ovim kriterijumima.",
+       "recentchanges-timeout": "Ova pretraga je istekla. Možda želite da pokušate drugačije parametre pretrage.",
+       "recentchanges-network": "Zbog tehničkog problema ne mogu da učitam rezultate. Pokušajte da osvežite stranicu.",
        "recentchanges-notargetpage": "Unesite naziv stranice kako biste videli srodne izmene.",
        "recentchanges-feed-description": "Pratite skorašnje izmene uz pomoć ovog dovoda.",
-       "recentchanges-label-newpage": "Nova stranica",
+       "recentchanges-label-newpage": "Ovom izmenom je napravljena nova stranica",
        "recentchanges-label-minor": "Ovo je manja izmena",
        "recentchanges-label-bot": "Ovu izmenu je napravio bot",
        "recentchanges-label-unpatrolled": "Ova izmena još nije patrolirana",
        "recentchanges-label-plusminus": "Promena veličine stranice u bajtovima",
        "recentchanges-legend-heading": "<strong>Legenda:</strong>",
-       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|spisak novih stranica]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (takođe pogledajte [[Special:NewPages|spisak novih stranica]])",
+       "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "Prikaži",
+       "rcfilters-tag-remove": "Uklonite filter „$1“",
        "rcfilters-legend-heading": "<strong>Spisak skraćenica:</strong>",
-       "rcfilters-other-review-tools": "Ostali alati za pregled:",
+       "rcfilters-other-review-tools": "Druge alatke za pregled",
+       "rcfilters-group-results-by-page": "Grupiši rezultate po stranicama",
        "rcfilters-activefilters": "Aktivni filteri",
+       "rcfilters-activefilters-hide": "Sakrij",
+       "rcfilters-activefilters-show": "Prikaži",
+       "rcfilters-activefilters-hide-tooltip": "Sakrijte područje aktivnih filtera",
+       "rcfilters-activefilters-show-tooltip": "Prikažite područje aktivnih filtera",
        "rcfilters-advancedfilters": "Napredni filteri",
        "rcfilters-limit-title": "Broj izmena za prikaz",
+       "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|izmena|izmene|izmena}}, $2",
+       "rcfilters-date-popup-title": "Vremenski period za pretragu",
+       "rcfilters-days-title": "Skorašnji dani",
        "rcfilters-hours-title": "Skorašnji sati",
-       "rcfilters-days-show-days": "$1 {{PLURAL:$1|dana|dana}}",
+       "rcfilters-days-show-days": "$1 {{PLURAL:$1|dan|dana}}",
        "rcfilters-days-show-hours": "$1 {{PLURAL:$1|sat|sata}}",
+       "rcfilters-highlighted-filters-list": "Istaknuto: $1",
+       "rcfilters-quickfilters": "Sačuvani filteri",
+       "rcfilters-quickfilters-placeholder-title": "Još nema sačuvanih filtera",
        "rcfilters-quickfilters-placeholder-description": "Da biste sačuvali svoja podešavanja filtera i ponovo ih upotrebljavali kasnije, kliknite na ikonu za oznaku u području aktivnih filtera — ispod.",
-       "rcfilters-search-placeholder": "Filtriraj skorašnje izmene (upotrebite meni ili potražite ime filtera)",
+       "rcfilters-savedqueries-defaultlabel": "Sačuvani filteri",
+       "rcfilters-savedqueries-rename": "Preimenuj",
+       "rcfilters-savedqueries-setdefault": "Postavi kao podrazumevano",
+       "rcfilters-savedqueries-unsetdefault": "Ukloni kao podrazumevano",
+       "rcfilters-savedqueries-remove": "Ukloni",
+       "rcfilters-savedqueries-new-name-label": "Ime",
+       "rcfilters-savedqueries-new-name-placeholder": "Opišite svrhu filtera",
+       "rcfilters-savedqueries-apply-label": "Napravi filter",
+       "rcfilters-savedqueries-apply-and-setdefault-label": "Napravi podrazumevani filter",
+       "rcfilters-savedqueries-cancel-label": "Otkaži",
+       "rcfilters-savedqueries-add-new-title": "Sačuvajte trenutna podešavanja filtera",
+       "rcfilters-savedqueries-already-saved": "Ovi filteri su već sačuvani. Izmenite Vaša podešavanja da biste napravili nove sačuvane filtere.",
+       "rcfilters-restore-default-filters": "Vrati podrazumevane filtere",
+       "rcfilters-clear-all-filters": "Uklonite sve filtere",
+       "rcfilters-show-new-changes": "Najnovije izmene",
+       "rcfilters-search-placeholder": "Filtrirajte izmene (koristite meni ili pretragu za ime filtera)",
+       "rcfilters-invalid-filter": "Neispravan filter",
+       "rcfilters-empty-filter": "Nema aktivnih filtera. Svi doprinosi su prikazani.",
+       "rcfilters-filterlist-title": "Filteri",
+       "rcfilters-filterlist-whatsthis": "Kako ovo funkcioniše?",
+       "rcfilters-filterlist-feedbacklink": "Recite nam šta mislite o ovim alatkama za filtriranje",
+       "rcfilters-highlightbutton-title": "Istakni rezultate",
+       "rcfilters-highlightmenu-title": "Izbor boje",
+       "rcfilters-highlightmenu-help": "Izaberite boju da biste istaknuli ovo svojstvo",
+       "rcfilters-filterlist-noresults": "Nema pronađenih filtera",
+       "rcfilters-noresults-conflict": "Nije pronađen nijedan rezultat jer su kriterijumi pretrage sukobljeni",
+       "rcfilters-state-message-subset": "Ovaj filter nema efekta jer su njegovi rezultati uključeni sa onima {{PLURAL:$2|sledećeg, šireg filtera|sledećih, širih filtera}} (pokušajte sa označavanjem da biste ih raspoznali): $1",
+       "rcfilters-state-message-fullcoverage": "Odabir svih filtera u grupi je isto kao i odabir nijednog, tako da ovaj filter nema efekta. Grupa uključuje: $1",
        "rcfilters-filtergroup-authorship": "Autorstvo doprinosa",
        "rcfilters-filter-editsbyself-label": "Vaše izmene",
+       "rcfilters-filter-editsbyself-description": "Vaši doprinosi.",
        "rcfilters-filter-editsbyother-label": "Izmene drugih",
        "rcfilters-filter-editsbyother-description": "Sve izmene osim Vaših.",
+       "rcfilters-filtergroup-userExpLevel": "Korisnička registracija i iskustvo",
        "rcfilters-filter-user-experience-level-registered-label": "Registrovani",
        "rcfilters-filter-user-experience-level-registered-description": "Prijavljeni urednici.",
        "rcfilters-filter-user-experience-level-unregistered-label": "Neregistrovani",
        "rcfilters-filter-user-experience-level-unregistered-description": "Urednici koji nisu prijavljeni.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Novajlije",
-       "rcfilters-filter-user-experience-level-newcomer-description": "Manje od 10 izmena i 4 dana aktivnosti.",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Registrovani urednici koji imaju manje od 10 izmena ili 4 dana aktivnosti.",
        "rcfilters-filter-user-experience-level-learner-label": "Učenici",
-       "rcfilters-filter-user-experience-level-learner-description": "Više dana aktivnosti i izmena od „novajlija”, ali manje od „iskusnih korisnika”.",
+       "rcfilters-filter-user-experience-level-learner-description": "Registrovani urednici čije je iskustvo između „novajlija” i „iskusnih korisnika”.",
        "rcfilters-filter-user-experience-level-experienced-label": "Iskusni korisnici",
        "rcfilters-filter-user-experience-level-experienced-description": "Registrovani urednici sa više od 500 izmena i 30 dana aktivnosti.",
-       "rcfilters-filter-bots-description": "Izmene napravljene automatizovanim alatima.",
+       "rcfilters-filtergroup-automated": "Automatizovani doprinosi",
+       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-bots-description": "Izmene napravljene automatizovanim alatkama.",
        "rcfilters-filter-humans-label": "Čovek (nije bot)",
        "rcfilters-filter-humans-description": "Izmene koje su napravili ljudi-urednici.",
+       "rcfilters-filtergroup-reviewstatus": "Patroliranost",
+       "rcfilters-filter-reviewstatus-unpatrolled-description": "Izmene koje nisu ručno ili automatski označene patroliranim.",
        "rcfilters-filter-reviewstatus-unpatrolled-label": "Nepatrolirano",
+       "rcfilters-filter-reviewstatus-manual-description": "Izmene koje su ručno označene patroliranim.",
+       "rcfilters-filter-reviewstatus-manual-label": "Ručno patrolirano",
+       "rcfilters-filter-reviewstatus-auto-description": "Izmene naprednih korisnika čiji je rad automatski označen patroliranim.",
+       "rcfilters-filter-reviewstatus-auto-label": "Automatski patrolirano",
+       "rcfilters-filtergroup-significance": "Značaj",
        "rcfilters-filter-minor-label": "Manje izmene",
        "rcfilters-filter-minor-description": "Izmene koje je autor označio kao manje.",
        "rcfilters-filter-major-label": "Ne-manje izmene",
        "rcfilters-filter-major-description": "Izmene koje nisu označene kao manje.",
-       "rcfilters-filter-watchlist-watched-description": "Izmene stranica koje su na Vašem spisku nadgledanja.",
+       "rcfilters-filtergroup-watchlist": "Stranice na spisku nadgledanja",
+       "rcfilters-filter-watchlist-watched-label": "Na spisku nadgledanja",
+       "rcfilters-filter-watchlist-watched-description": "Izmene stranica na Vašem spisku nadgledanja.",
        "rcfilters-filter-watchlist-watchednew-label": "Nove izmene na spisku nadgledanja",
        "rcfilters-filter-watchlist-watchednew-description": "Izmene stranica na spisku nadgledanja koje niste posetili od kada su napravljene izmene.",
+       "rcfilters-filter-watchlist-notwatched-label": "Nije na spisku nadgledanja",
        "rcfilters-filter-watchlist-notwatched-description": "Sve osim izmena stranica na Vašem spisku nadgledanja.",
-       "rcfilters-filtergroup-changetype": "Vrsta izmene",
+       "rcfilters-filtergroup-watchlistactivity": "Stanje na spisku nadgledanja",
+       "rcfilters-filter-watchlistactivity-unseen-label": "Nepogledane izmene",
+       "rcfilters-filter-watchlistactivity-unseen-description": "Izmene stranica koje niste posetili od kada su napravljene izmene.",
+       "rcfilters-filter-watchlistactivity-seen-label": "Pogledane izmene",
+       "rcfilters-filter-watchlistactivity-seen-description": "Izmene stranica koje ste posetili od kada su napravljene izmene.",
+       "rcfilters-filtergroup-changetype": "Tip izmene",
        "rcfilters-filter-pageedits-label": "Izmene stranica",
-       "rcfilters-filter-pageedits-description": "Izmene viki sadržaja, rasprava, opisa kategorija...",
-       "rcfilters-filter-newpages-label": "Stvaranje stranica",
-       "rcfilters-filter-newpages-description": "Izmene kojima se stvaraju nove stranice.",
+       "rcfilters-filter-pageedits-description": "Izmene viki sadržaja, rasprava, opisa kategorija",
+       "rcfilters-filter-newpages-label": "Pravljenje stranica",
+       "rcfilters-filter-newpages-description": "Izmene kojima se prave nove stranice.",
        "rcfilters-filter-categorization-label": "Izmene kategorija",
-       "rcfilters-filter-logactions-label": "Radnje zabeležene u dnevnicima",
+       "rcfilters-filter-categorization-description": "Zapisi o stranicama dodatim ili uklonjenim iz kategorija.",
+       "rcfilters-filter-logactions-label": "Zabeležene radnje",
+       "rcfilters-filter-logactions-description": "Administrativne radnje, pravljenje naloga, brisanje stranica, otpremanja…",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "Filter za „manje” izmene je u sukobu sa jednim ili više filtera tipa izmena, zato što određeni tipovi izmena ne mogu da se označe kao „manje”. Sukobljeni filteri su označeni u području Aktivni filteri, iznad.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Određeni tipovi izmena ne mogu da se označe kao „manje”, tako da je ovaj filter u sukobu sa sledećim filterima tipa izmena: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Ovaj filter tipa izmene je u sukobu sa filterom za „manje” izmene. Određeni tipovi izmena ne mogu da se označe kao „manje”.",
        "rcfilters-filtergroup-lastRevision": "Poslednje izmene",
        "rcfilters-filter-lastrevision-label": "Poslednja izmena",
+       "rcfilters-filter-lastrevision-description": "Samo najnovija izmena na stranici.",
        "rcfilters-filter-previousrevision-label": "Nije poslednja izmena",
        "rcfilters-filter-previousrevision-description": "Sve izmene koje nisu „poslednje izmene”.",
+       "rcfilters-filter-excluded": "Izostavljeno",
+       "rcfilters-tag-prefix-namespace-inverted": "<strong>:nije</strong> $1",
+       "rcfilters-exclude-button-off": "Izostavi označeno",
+       "rcfilters-exclude-button-on": "Izostavi odabrano",
        "rcfilters-view-tags": "Označene izmene",
-       "rcfilters-view-namespaces-tooltip": "Filter rezultata prema imenskom prostoru",
-       "rcfilters-view-tags-tooltip": "Filtriranje rezultata prema oznaci izmene",
+       "rcfilters-view-namespaces-tooltip": "Filtrirajte rezultate prema imenskom prostoru",
+       "rcfilters-view-tags-tooltip": "Filtrirajte rezultate prema oznaci izmene",
+       "rcfilters-view-return-to-default-tooltip": "Povratak na glavni meni",
        "rcfilters-view-tags-help-icon-tooltip": "Saznajte više o označenim izmenama",
-       "rcfilters-liveupdates-button": "Ažuriranja uživo",
-       "rcfilters-watchlist-markseen-button": "Označi sve izmene kao viđene",
-       "rcfilters-watchlist-showupdated": "Izmene na stranicama koje niste posetili od kada je izmena izvršena su <strong>podebljane</strong>, sa ispunjenim oznakama.",
+       "rcfilters-liveupdates-button": "Ažuriraj uživo",
+       "rcfilters-liveupdates-button-title-on": "Isključite ažuriranja uživo",
+       "rcfilters-liveupdates-button-title-off": "Prikažite nove izmene uživo",
+       "rcfilters-watchlist-markseen-button": "Označi sve izmene kao pogledane",
+       "rcfilters-watchlist-edit-watchlist-button": "Promeni spisak nadgledanih stranica",
+       "rcfilters-watchlist-showupdated": "Izmene stranica koje niste posetili od kada je izmena izvršena su <strong>podebljane</strong>, sa ispunjenim oznakama.",
        "rcfilters-preference-label": "Sakrij poboljšanu verziju skorašnjih izmena",
        "rcfilters-preference-help": "Poništava redizajn interfejsa iz 2017. i sve alatke dodate tada i posle.",
+       "rcfilters-watchlist-preference-label": "Sakrij poboljšanu verziju spiska nadgledanja",
+       "rcfilters-filter-showlinkedfrom-label": "Prikaži izmene na stranicama sa kojih dolaze veze",
+       "rcfilters-filter-showlinkedfrom-option-label": "<strong>Stranice sa kojih dolaze veze do</strong> izabrane stranice",
+       "rcfilters-filter-showlinkedto-label": "Prikaži izmene na stranicama ka kojima vode veze",
+       "rcfilters-filter-showlinkedto-option-label": "<strong>Stranice ka kojima vode veze sa</strong> izabrane stranice",
+       "rcfilters-target-page-placeholder": "Unesite ime stranice (ili kategorije)",
        "rcnotefrom": "Ispod {{PLURAL:$5|je izmena|su izmene}} od <strong>$3, $4</strong> (do <strong>$1</strong> prikazano).",
-       "rclistfrom": "Prikaži nove izmene počev od $2 $3",
+       "rclistfromreset": "Resetuj odabir datuma",
+       "rclistfrom": "Prikaži nove izmene počev od $2, $3",
        "rcshowhideminor": "$1 manje izmene",
        "rcshowhideminor-show": "Prikaži",
        "rcshowhideminor-hide": "Sakrij",
        "recentchangeslinked-feed": "Srodne izmene",
        "recentchangeslinked-toolbox": "Srodne izmene",
        "recentchangeslinked-title": "Srodne izmene sa „$1“",
-       "recentchangeslinked-summary": "Ova posebna stranica prikazuje spisak poslednjih izmena na stranicama koje su povezane (ili članovi određene kategorije).\nStranice s [[Special:Watchlist|vašeg spiska nadgledanja]] su '''podebljane'''.",
+       "recentchangeslinked-summary": "Unesite ime stranice da biste videli promene na stranicama koje su povezane sa ili sa te stranice. (Da biste videli članove kategorije, unesite {{ns:category}}:Ime kategorije). Promene na stranicama koje su na [[Special:Watchlist|Vašem spisku nadgledanja]] su <strong>podebljane</strong>.",
        "recentchangeslinked-page": "Naziv stranice:",
        "recentchangeslinked-to": "Prikaži izmene stranica koje su povezane s datom stranicom",
        "recentchanges-page-added-to-category": "[[:$1]] je dodata u kategoriju",
-       "recentchanges-page-added-to-category-bundled": "[[:$1]] i još [[Special:WhatLinksHere/$1|{{PLURAL:$2|jedna stranica|$2 stranice}}]] su dodate u kategoriju",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] je dodana u kategoriju, [[Special:WhatLinksHere/$1|ova stranica je povezana sa drugim stranicama]]",
        "recentchanges-page-removed-from-category": "[[:$1]] je uklonjena iz kategorije",
-       "recentchanges-page-removed-from-category-bundled": "[[:$1]] i još [[Special:WhatLinksHere/$1|{{PLURAL:$2|jedna stranica|$2 stranice}}]] su uklonjene iz kategorije",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] je uklonjena iz kategorije, [[Special:WhatLinksHere/$1|ova stranica je povezana sa drugim stranicama]]",
        "autochange-username": "Medijaviki automatska izmena",
-       "upload": "Otpremi datoteku",
+       "upload": "Otpremanje datoteke",
        "uploadbtn": "Otpremi datoteku",
        "reuploaddesc": "Nazad na obrazac za otpremanje",
        "upload-tryagain": "Pošalji izmenjeni opis datoteke",
+       "upload-tryagain-nostash": "Pošaljite re-otpremljenu datoteku i izmenjen opis",
        "uploadnologin": "Niste prijavljeni",
        "uploadnologintext": "Morate biti $1 da biste otpremali datoteke.",
        "upload_directory_missing": "Fascikla za slanje ($1) nedostaje i server je ne može napraviti.",
        "windows-nonascii-filename": "Ovaj viki ne podržava nazive datoteka s posebnim znacima.",
        "fileexists": "Datoteka s ovim nazivom već postoji. Pogledajte <strong>[[:$1]]</strong> ako niste sigurni da li želite da je promenite.\n[[$1|thumb]]",
        "filepageexists": "Stranica s opisom ove datoteke je već napravljena ovde <strong>[[:$1]]</strong>, iako datoteka ne postoji.\nOpis koji ste naveli se neće pojaviti na stranici s opisom.\nDa bi se vaš opis ovde našao, potrebno je da ga ručno izmenite.\n[[$1|thumb]]",
-       "fileexists-extension": "Datoteka sa sličnim nazivom već postoji: [[$2|thumb]]\n* Naziv datoteke koju šaljete: <strong>[[:$1]]</strong>\n* Naziv postojeće datoteke: <strong>[[:$2]]</strong>\nIzaberite drugačiji naziv.",
+       "fileexists-extension": "Datoteka sa sličnim nazivom već postoji: [[$2|thumb]]\n* Naziv datoteke koju šaljete: <strong>[[:$1]]</strong>\n* Naziv postojeće datoteke: <strong>[[:$2]]</strong>\nDa li želite da koristite prepoznatljivije ime?",
        "fileexists-thumbnail-yes": "Izgleda da je datoteka umanjeno izdanje slike ''(thumbnail)''.\n[[$1|thumb]]\nProverite datoteku <strong>[[:$1]]</strong>.\nAko je proverena datoteka ista slika originalne veličine, nije potrebno slati dodatnu sliku.",
        "file-thumbnail-no": "Datoteka počinje sa <strong>$1</strong>.\nIzgleda da se radi o umanjenoj slici ''(thumbnail)''.\nUkoliko imate ovu sliku u punoj veličini, pošaljite je, a ako nemate, promenite naziv datoteke.",
        "fileexists-forbidden": "Datoteka s ovim nazivom već postoji i ne može se zameniti.\nAko i dalje želite da pošaljete datoteku, vratite se i izaberite drugi naziv.\n[[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Datoteka s ovim nazivom već postoji u zajedničkoj ostavi.\nVratite se i pošaljite datoteku s drugim nazivom.\n[[File:$1|thumb|center|$1]]",
+       "fileexists-no-change": "Datoteka je duplikat trenutne verzije <strong>[[:$1]]</strong>.",
+       "fileexists-duplicate-version": "Datoteka je duplikat {{PLURAL:$2|stare verzije|starih verzija}} <strong>[[:$1]]</strong>.",
        "file-exists-duplicate": "Ovo je duplikat {{PLURAL:$1|sledeće datoteke|sledećih datoteka}}:",
        "file-deleted-duplicate": "Datoteka istovetna ovoj ([[:$1]]) je prethodno obrisana.\nPogledajte istoriju brisanja pre ponovnog slanja.",
+       "file-deleted-duplicate-notitle": "Datoteka identična ovoj prethodno je obrisana i ime joj je sakriveno.\nTrebali biste pitati nekoga ko može videti podatke skrivenih datoteka da pregleda situaciju pre nego što ponovo otpremite datoteku.",
        "uploadwarning": "Upozorenje pri otpremanju",
        "uploadwarning-text": "Izmenite opis datoteke i pokušajte ponovo.",
+       "uploadwarning-text-nostash": "Re-otpremite datoteku, izmenite opis ispod i pokušajte ponovo.",
        "savefile": "Sačuvaj datoteku",
        "uploaddisabled": "Otpremanje je onemogućeno.",
        "copyuploaddisabled": "Otpremanje putem veb-adrese je onemogućeno.",
        "uploaddisabledtext": "Otpremanje datoteka je onemogućeno.",
        "php-uploaddisabledtext": "Otpremanje datoteka je onemogućeno u PHP-u.\nProverite podešavanja file_uploads.",
-       "uploadscripted": "Datoteka sadrži HTML ili skriptni kod koji može biti pogrešno protumačen od strane pregledača.",
+       "uploadscripted": "Datoteka sadrži HTML ili skriptni kôd koji može biti pogrešno protumačen od strane pregledača.",
+       "upload-scripted-pi-callback": "Datoteka koja sadrži instrukcije za obradu XML stilskog oblika se ne može otpremiti.",
+       "upload-scripted-dtd": "Nije moguće otpremanje SVG datoteka koje sadrže nestandardnu DTD deklaraciju.",
+       "uploaded-script-svg": "Pronađen skriptni elemenat „$1“ u postavljenoj SVG datoteci.",
+       "uploaded-hostile-svg": "Pronađen nebezbedan CSS u stilskom elementu postavljene SVG datoteke.",
+       "uploaded-event-handler-on-svg": "Nije dozvoljeno postavljanje atributa koji kontrolišu događaje <code>$1=\"$2\"</code> u SVG datotekama.",
+       "uploaded-href-unsafe-target-svg": "Pronađen href sa nesigurnim podacima: URI odredište <code>&lt;$1 $2=\"$3\"&gt;</code> u postavljenoj SVG datoteci.",
+       "uploaded-animate-svg": "Pronađena „animate“ oznaka koja možda menja href koristeći se „from“ atributom <code>&lt;$1 $2=\"$3\"&gt;</code> u postavljenoj SVG datoteci.",
        "uploadscriptednamespace": "Ova SVG datoteka sadrži pogrešan imenski prostor „<nowiki>$1</nowiki>“",
+       "uploadinvalidxml": "Nije moguće raščlaniti XML otpremljene datoteke.",
        "uploadvirus": "Datoteka sadrži virus!\nDetalji: $1",
        "uploadjava": "Datoteka je formata ZIP koji sadrži java .class element.\nSlanje java datoteka nije dozvoljeno jer one mogu izazvati zaobilaženje sigurnosnih ograničenja.",
        "upload-source": "Izvorna datoteka",
        "destfilename": "Naziv:",
        "upload-maxfilesize": "Maksimalna veličina datoteke: $1",
        "upload-description": "Opis datoteke",
-       "upload-options": "Postavke otpremanja",
+       "upload-options": "Opcije otpremanja",
        "watchthisupload": "Nadgledaj ovu datoteku",
        "filewasdeleted": "Datoteka s ovim nazivom je ranije poslata, ali je obrisana.\nProverite $1 pre nego što nastavite s ponovnim slanjem.",
        "filename-bad-prefix": "Naziv datoteke koju šaljete počinje sa <strong>„$1“</strong>, a njega obično dodeljuju digitalni fotoaparati.\nIzaberite naziv datoteke koji opisuje njen sadržaj.",
        "upload-too-many-redirects": "Adresa sadrži previše preusmerenja",
        "upload-http-error": "Došlo je do HTTP greške: $1",
        "upload-copy-upload-invalid-domain": "Primerci otpremanja nisu dostupni na ovom domenu.",
-       "upload-dialog-title": "Otpremanje datoteka",
+       "upload-dialog-disabled": "Postavljanje datoteka pomoću ovog dijaloga je onemogućeno na ovom vikiju.",
+       "upload-dialog-title": "Otpremi datoteku",
        "upload-dialog-button-cancel": "Otkaži",
+       "upload-dialog-button-back": "Nazad",
        "upload-dialog-button-done": "Gotovo",
        "upload-dialog-button-save": "Sačuvaj",
        "upload-dialog-button-upload": "Otpremi",
        "upload-form-label-infoform-title": "Detalji",
-       "upload-form-label-infoform-name": "Ime",
+       "upload-form-label-infoform-name": "Naziv",
        "upload-form-label-infoform-description": "Opis",
+       "upload-form-label-usage-title": "Upotrebe",
        "upload-form-label-usage-filename": "Naziv datoteke",
        "upload-form-label-own-work": "Ovo je moje sopstveno delo",
        "upload-form-label-infoform-categories": "Kategorije",
        "upload-form-label-infoform-date": "Datum",
+       "upload-form-label-not-own-work-local-generic-local": "Takođe možete pokušati [[Special:Upload|podrazumevanu stranicu za otpremanje]].",
        "backend-fail-stream": "Ne mogu da emitujem datoteku $1.",
        "backend-fail-backup": "Ne mogu da napravim rezervu datoteke $1.",
        "backend-fail-notexists": "Datoteka $1 ne postoji.",
        "lockmanager-fail-closelock": "Ne mogu da zatvorim katanac za „$1“.",
        "lockmanager-fail-deletelock": "Ne mogu da obrišem katanac za „$1“.",
        "lockmanager-fail-acquirelock": "Ne mogu da se zaključam za „$1“.",
-       "lockmanager-fail-openlock": "Ne mogu da otvorim katanac za „$1“.",
+       "lockmanager-fail-openlock": "Ne mogu da otvorim katanac za „$1“. Uverite se da je Vaš direktorijum za otpremanje ispravno konfigurisan i da Vaš veb-server ima dozvolu da piše u tom direktorijumu. Pogledajte https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgUploadDirectory za više informacija.",
        "lockmanager-fail-releaselock": "Ne mogu da oslobodim katanac za „$1“.",
        "lockmanager-fail-db-bucket": "Ne mogu da kontaktiram s dovoljno katanaca u kanti $1.",
        "lockmanager-fail-db-release": "Ne mogu da oslobodim katance u bazi $1.",
        "uploadstash-summary": "Ova stranica pruža pristup datotekama koje su otpremljene ili se otpremaju, ali još nisu objavljene. Ove datoteke nisu vidljive nikome, osim korisniku koji ih je otpremio.",
        "uploadstash-clear": "Očisti sakrivene datoteke",
        "uploadstash-nofiles": "Nemate sakrivene datoteke.",
-       "uploadstash-badtoken": "Izvršavanje date radnje nije uspelo. Razlog tome može biti istek vremena za uređivanje. Pokušajte ponovo.",
+       "uploadstash-badtoken": "Izvršavanje ove radnje nije uspelo, razlog tome može biti istek vremena za uređivanje. Pokušajte ponovo.",
        "uploadstash-errclear": "Čišćenje datoteka nije uspelo.",
        "uploadstash-refresh": "Osveži spisak datoteka",
+       "uploadstash-thumbnail": "pogledaj minijaturu",
+       "uploadstash-exception": "Ne mogu sačuvati datoteku u skladište ($1): „$2“.",
+       "uploadstash-bad-path": "Putanja ne postoji.",
+       "uploadstash-bad-path-invalid": "Putanja nije ispravna.",
+       "uploadstash-bad-path-unknown-type": "Nepoznat tip „$1“.",
+       "uploadstash-bad-path-unrecognized-thumb-name": "Neprepoznato ime minijature.",
+       "uploadstash-bad-path-bad-format": "Ključ „$1“ nije u odgovarajućem obliku.",
+       "uploadstash-file-not-found-no-thumb": "Ne mogu dobiti minijaturu.",
+       "uploadstash-file-not-found-no-local-path": "Nema lokalne putanje za umanjenu stavku.",
+       "uploadstash-file-not-found-no-object": "Ne mogu napraviti lokalni datotečni objekat za minijaturu.",
+       "uploadstash-file-not-found-no-remote-thumb": "Dobavljanje minijature nije uspelo: $1\nAdresa = $2",
+       "uploadstash-file-not-found-missing-content-type": "Nedostaje zaglavlje za vrstu sadržaja.",
+       "uploadstash-file-not-found-not-exists": "Ne mogu naći putanju ili ovo nije obična datoteka.",
+       "uploadstash-file-too-large": "Ne mogu poslužiti datoteku veću od $1 {{PLURAL:$1|bajta|bajtova}}",
+       "uploadstash-not-logged-in": "Niko nije prijavljen. Datoteke moraju pripadati korisnicima.",
+       "uploadstash-wrong-owner": "Ova datoteka ($1) ne pripada trenutnom korisniku.",
+       "uploadstash-no-such-key": "Nema takvog ključa ($1). Ne mogu ukloniti.",
+       "uploadstash-no-extension": "Nema traženog dodatka.",
+       "uploadstash-zero-length": "Datoteka je prazna",
        "invalid-chunk-offset": "Neispravna polazna tačka",
        "img-auth-accessdenied": "Pristup je odbijen",
        "img-auth-nopathinfo": "Nedostaje PATH_INFO.\nVaš server nije podešen da prosleđuje ovakve podatke.\nMožda je zasnovan na CGI-ju koji ne podržava img_auth.\nPogledajte https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization?uselang=sr-ec.",
        "img-auth-nologinnWL": "Niste prijavljeni i „$1” nije na spisku dozvoljenih.",
        "img-auth-nofile": "Datoteka „$1“ ne postoji.",
        "img-auth-isdir": "Pokušavate da pristupite fascikli „$1“.\nDozvoljen je samo pristup datotekama.",
-       "img-auth-streaming": "Učitavanje „$1“.",
+       "img-auth-streaming": "Učitavam „$1“...",
        "img-auth-public": "Svrha img_auth.php je da prosleđuje datoteke iz privatnih vikija.\nOvaj viki je postavljen kao javni.\nRadi sigurnosti, img_auth.php je onemogućen.",
        "img-auth-noread": "Korisnik nema pristup za čitanje „$1“.",
        "http-invalid-url": "Neispravna adresa: $1",
        "upload-curl-error28": "Otpremanje je isteklo",
        "upload-curl-error28-text": "Server ne odgovara na upit.\nProverite da li sajt radi, malo osačekajte i pokušajte ponovo.\nProbajte kasnije kada bude manje opterećenje.",
        "license": "Licenca:",
-       "license-header": "Licenca:",
+       "license-header": "Licenciranje",
        "nolicense": "Nije izabrano",
        "licenses-edit": "Uredi izbor licenci",
        "license-nopreview": "(pregled nije dostupan)",
        "upload_source_url": "(vaša izabrana datoteka od ispravnih i javno dostupnih adresa)",
        "upload_source_file": "(vaša odabrana datoteka sa vašeg računara)",
        "listfiles-delete": "obriši",
-       "listfiles-summary": "Ova posebna stranica prikazuje sve poslate datoteke.",
+       "listfiles-summary": "Ova posebna stranica prikazuje sve otpremljene datoteke.",
        "listfiles_search_for": "Naziv datoteke:",
-       "listfiles-userdoesnotexist": "Korisnički nalog „$1“ nije registrovan.",
+       "listfiles-userdoesnotexist": "Korisnički nalog „$1“ nije otvoren.",
        "imgfile": "datoteka",
        "listfiles": "Spisak datoteka",
        "listfiles_thumb": "Minijatura",
        "listfiles_size": "Veličina",
        "listfiles_description": "Opis",
        "listfiles_count": "Verzije",
-       "listfiles-show-all": "Obuhvati stare verzije slika",
+       "listfiles-show-all": "Obuhvati stare verzije datoteka",
        "listfiles-latestversion": "Trenutna verzija",
        "listfiles-latestversion-yes": "Da",
        "listfiles-latestversion-no": "Ne",
        "filehist-revert": "vrati",
        "filehist-current": "trenutno",
        "filehist-datetime": "Datum/vreme",
-       "filehist-thumb": "Umanjeni prikaz",
-       "filehist-thumbtext": "Umanjeni prikaz za izdanje od $1",
+       "filehist-thumb": "Minijatura",
+       "filehist-thumbtext": "Minijatura za verziju na dan $1",
        "filehist-nothumb": "Nema umanjenog prikaza",
        "filehist-user": "Korisnik",
        "filehist-dimensions": "Dimenzije",
        "filehist-comment": "Komentar",
        "imagelinks": "Upotreba datoteke",
        "linkstoimage": "{{PLURAL:$1|Sledeća stranica koristi|$1 sledeće stranice koriste|$1 sledećih stranica koristi}} ovu datoteku:",
-       "linkstoimage-more": "Više od $1 {{PLURAL:$1|stranice|stranice|stranica}} je povezano s ovom datotekom.\nSledeći spisak prikazuje samo {{PLURAL:$1|prvu stranicu povezanu|prve $1 stranice povezane|prvih $1 stranica povezanih}} s ovom datotekom.\nDostupan je i [[Special:WhatLinksHere/$2|potpuni spisak]].",
+       "linkstoimage-more": "Više od $1 {{PLURAL:$1|stranica|stranice|stranica}} je povezano s ovom datotekom.\nSledeći spisak prikazuje samo {{PLURAL:$1|prvu stranicu povezanu|prve $1 stranice povezane|prvih $1 stranica povezanih}} s ovom datotekom.\nDostupan je i [[Special:WhatLinksHere/$2|potpuni spisak]].",
        "nolinkstoimage": "Nema stranica koje koriste ovu datoteku.",
        "morelinkstoimage": "Pogledajte [[Special:WhatLinksHere/$1|više veza]] do ove datoteke.",
        "linkstoimage-redirect": "$1 (preusmerenje datoteke) $2",
        "filerevert-submit": "Vrati",
        "filerevert-success": "Datoteka '''[[Media:$1|$1]]''' je vraćena na [$4 izdanje od $2; $3].",
        "filerevert-badversion": "Ne postoji ranije lokalno izdanje datoteke s navedenim vremenskim podacima.",
+       "filerevert-identical": "Trenutna izmena datoteke indentična je izabranoj.",
        "filedelete": "Obriši $1",
        "filedelete-legend": "Obriši datoteku",
        "filedelete-intro": "Brišete datoteku '''[[Media:$1|$1]]''' zajedno s njenom istorijom.",
        "pageswithprop-legend": "Strane s osobinom strane",
        "pageswithprop-text": "Ova strana izlistava strane koje imaju određenu osobinu",
        "pageswithprop-prop": "Ime osobine:",
+       "pageswithprop-reverse": "Poređaj u suprotnom redosledu",
+       "pageswithprop-sortbyvalue": "Poređaj prema svojstvima",
        "pageswithprop-submit": "Idi",
+       "pageswithprop-prophidden-long": "sakriveno dugo tekstualno svojstvo ($1)",
+       "pageswithprop-prophidden-binary": "sakriveno dugo binarno svojstvo ($1)",
        "doubleredirects": "Dvostruka preusmerenja",
        "doubleredirectstext": "Ova stranica prikazuje stranice koje preusmeravaju na druga preusmerenja.\nSvaki red sadrži veze prema prvom i drugom preusmerenju, kao i odredišnu stranicu drugog preusmerenja koja je obično „pravi“ članak na koga prvo preusmerenje treba da upućuje.\n<del>Precrtani</del> unosi su već rešeni.",
        "double-redirect-fixed-move": "[[$1]] je premešten.\nAutomatski je ažurirano i sada preusmerava na [[$2]].",
-       "double-redirect-fixed-maintenance": "Automatski ispravlja dvostruka preusmerenja iz [[$1]] u [[$2]]. Kao deo održavanja.",
+       "double-redirect-fixed-maintenance": "Automatski ispravlja dvostruka preusmerenja iz [[$1]] u [[$2]] kao deo održavanja",
        "double-redirect-fixer": "Ispravljač preusmerenja",
        "brokenredirects": "Pokvarena preusmerenja",
        "brokenredirectstext": "Sledeća preusmerenja upućuju na nepostojeće stranice:",
        "deadendpages": "Stranice bez unutrašnjih veza",
        "deadendpagestext": "Sledeće stranice nemaju veze do drugih stranica na ovom vikiju.",
        "protectedpages": "Zaštićene stranice",
+       "protectedpages-filters": "Filteri:",
        "protectedpages-indef": "Samo neograničene zaštite",
        "protectedpages-summary": "Na ovoj stranici se nalazi spisak trenutno zaštićenih stranica. Za spisak zaštićenih naslova vidi [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Samo prenosive zaštite",
        "protectedtitles-submit": "Prikaži naslove",
        "listusers": "Spisak korisnika",
        "listusers-editsonly": "Prikaži samo korisnike koji su uređivali",
+       "listusers-temporarygroupsonly": "Prikaži samo korisnike u privremenim korisničkim grupama",
        "listusers-creationsort": "Poređaj po datumu stvaranja",
-       "listusers-desc": "Sortiraj u opadajućem redosledu",
+       "listusers-desc": "Poređaj u opadajućem redosledu",
        "usereditcount": "$1 {{PLURAL:$1|izmena|izmene|izmena}}",
        "usercreated": "{{GENDER:$3|je napravio|je napravila|je napravio}} dana $1 u $2",
        "newpages": "Nove stranice",
        "nopagetitle": "Ne postoji takva stranica",
        "nopagetext": "Tražena stranica ne postoji.",
        "pager-newer-n": "{{PLURAL:$1|noviji 1|novija $1|novijih $1}}",
-       "pager-older-n": "{{PLURAL:$1|stariji 1|starijih $1}}",
+       "pager-older-n": "{{PLURAL:$1|stariji 1|starija $1|starijih $1}}",
        "suppress": "Potisni",
        "querypage-disabled": "Ova posebna stranica je onemogućena radi poboljšanja performansi.",
        "apihelp": "API pomoć",
        "apihelp-no-such-module": "Modul „$1“ nije pronađen.",
        "apisandbox": "API pesak",
+       "apisandbox-jsonly": "JavaScript je neophodan za korišćenje API peska.",
        "apisandbox-api-disabled": "API je onemogućen na ovom sajtu.",
-       "apisandbox-submit": "Postavi zahtev",
+       "apisandbox-submit": "Pošalji zahtev",
+       "apisandbox-reset": "Očisti",
+       "apisandbox-retry": "Pokušaj ponovo",
+       "apisandbox-loading": "Učitavam informacije za API modul „$1”...",
+       "apisandbox-load-error": "Došlo je do greške prilikom učitavanja informacija za API modul \"$1\": $2",
+       "apisandbox-no-parameters": "Ovaj API modul nema parametre.",
+       "apisandbox-helpurls": "Linkovi za pomoć",
+       "apisandbox-examples": "Primeri",
+       "apisandbox-dynamic-parameters": "Dodatni parametri",
+       "apisandbox-dynamic-parameters-add-label": "Dodaj parametar:",
+       "apisandbox-dynamic-parameters-add-placeholder": "Naziv parametra",
+       "apisandbox-dynamic-error-exists": "Parametar pod nazivom \"$1\" već postoji.",
+       "apisandbox-deprecated-parameters": "Zastareli parametri",
+       "apisandbox-fetch-token": "Automatski popuni token",
+       "apisandbox-add-multi": "Dodaj",
+       "apisandbox-submit-invalid-fields-title": "Neka polja nisu ispravna",
+       "apisandbox-submit-invalid-fields-message": "Molimo Vas popravite označena polja i pokušajte ponovo.",
        "apisandbox-results": "Rezultati",
+       "apisandbox-sending-request": "Slanje API zahteva...",
+       "apisandbox-loading-results": "Prijem API rezultata...",
+       "apisandbox-results-error": "Došlo je do greške prilikom učitavanja rezultata API upita: $1.",
+       "apisandbox-request-selectformat-label": "Prikaži sahtevane podatke kao:",
        "apisandbox-request-url-label": "Adresa zahteva:",
+       "apisandbox-request-format-json-label": "JSON",
+       "apisandbox-request-json-label": "Zatražite JSON:",
+       "apisandbox-request-time": "Vreme za izvršavanje zahtjeva: {{PLURAL:$1|$1 milisekunda|$1 milisekunde|$1 milisekundi}}",
+       "apisandbox-results-fixtoken": "Ispravi žeton i pošalji ponovo",
+       "apisandbox-results-fixtoken-fail": "Nisam uspeo da dobijem žeton „$1“.",
+       "apisandbox-alert-page": "Polja na stranici su neispravna.",
+       "apisandbox-alert-field": "Vrednost ovog polja je neispravna.",
+       "apisandbox-continue": "Nastavi",
+       "apisandbox-continue-clear": "Očisti",
+       "apisandbox-param-limit": "Unesite <kbd>max</kbd> da bi ste koristili najveće ograničenje.",
+       "apisandbox-multivalue-all-namespaces": "$1 (svi imenski prostori)",
+       "apisandbox-multivalue-all-values": "$1 (sve vrednosti)",
        "booksources": "Štampani izvori",
-       "booksources-search-legend": "Traži književne izvore",
+       "booksources-search-legend": "Pretraži štampane izvore",
        "booksources-isbn": "ISBN:",
        "booksources-search": "Pretraži",
        "booksources-text": "Ispod se nalazi spisak veza ka sajtovima koji se bave prodajom novih i polovnih knjiga, a koji bi mogli imati dodatne podatke o knjigama koje tražite:",
        "booksources-invalid-isbn": "Navedeni ISBN broj nije ispravan. Proverite da nije došlo do greške pri umnožavanju iz prvobitnog izvora.",
+       "magiclink-tracking-rfc": "Stranice s magičnim RFC vezama",
+       "magiclink-tracking-pmid": "Stranice s magičnim PMID vezama",
        "magiclink-tracking-isbn": "Stranice sa ISBN magičnim vezama",
        "specialloguserlabel": "Izvršilac:",
        "speciallogtitlelabel": "Cilj (naslov ili {{ns:user}}:korisničko ime):",
        "deletedcontributions": "Obrisani korisnički doprinosi",
        "deletedcontributions-title": "Obrisani korisnički doprinosi",
        "sp-deletedcontributions-contribs": "doprinosi",
-       "linksearch": "Pretraga spoljnih veza",
+       "linksearch": "Pretraga spoljašnjih veza",
        "linksearch-pat": "Obrazac pretrage:",
        "linksearch-ns": "Imenski prostor:",
        "linksearch-ok": "Pretraži",
        "activeusers-intro": "Ovo je spisak korisnika koji su bili aktivni {{PLURAL:$1|1=prethodni dan|u poslednja $1 dana|u poslednjih $1 dana}}.",
        "activeusers-count": "$1 {{PLURAL:$1|radnja|radnje|radnji}} {{PLURAL:$3|prethodni dan|u poslednja $3 dana|u poslednjih $3 dana}}",
        "activeusers-from": "Prikaži korisnike počev od:",
+       "activeusers-groups": "Prikaži korisnike koji su članovi grupa:",
+       "activeusers-excludegroups": "Izuzmi korisnike koji su članovi grupa:",
        "activeusers-noresult": "Korisnik nije pronađen.",
        "activeusers-submit": "Prikaži aktivne korisnike",
        "listgrouprights": "Prava korisničkih grupa",
        "listgrouprights-namespaceprotection-namespace": "Imenski prostor",
        "listgrouprights-namespaceprotection-restrictedto": "Prava potrebna za uređivanje",
        "listgrants": "Dozvole",
+       "listgrants-grant": "Dozvola",
        "listgrants-rights": "Prava",
        "trackingcategories": "Medijaviki kategorije",
        "trackingcategories-summary": "Ova posebna stranica je spisak kategorija koje su deo Medijavikija, one se automatski ažuriraju i njihovi nazivi se mogu menjati uređivanjem sistemskih poruka u imenskom prostoru {{ns:8}}.",
+       "trackingcategories-msg": "Praćenje kategorije",
        "trackingcategories-name": "Ime poruke",
        "trackingcategories-desc": "Koje stranice se nalaze u kategoriji",
+       "restricted-displaytitle-ignored": "Stranice sa zanemarenim naslovima za prikaz",
        "noindex-category-desc": "Stranice koje u sebi imaju magičnu reč <code><nowiki>__NOINDEX__</nowiki></code>.",
        "index-category-desc": "Stranice koje u sebi imaju magičnu reč <code><nowiki>__INDEX__</nowiki></code> i samim tim su indeksirane od strane robota.",
        "broken-file-category-desc": "Stranice koje imaju veze do nepostojećih datoteka.",
        "trackingcategories-nodesc": "Opis nije dostupan.",
        "trackingcategories-disabled": "Kategorija je onemogućena",
        "mailnologin": "Nema adrese za slanje",
-       "mailnologintext": "Morate biti [[Special:UserLogin|prijavljeni]] i imati ispravnu imejl adresu u [[Special:Preferences|podešavanjima]] da biste slali imejlove drugim korisnicima.",
+       "mailnologintext": "Morate biti [[Special:UserLogin|prijavljeni]] i imati ispravan imejl adresu u [[Special:Preferences|podešavanjima]] da biste slali imejlove drugim korisnicima.",
        "emailuser": "Pošalji imejl",
        "emailuser-title-target": "Slanje imejla {{GENDER:$1|korisniku|korisnici}}",
        "emailuser-title-notarget": "Slanje imejla korisniku",
        "mywatchlist": "Spisak nadgledanja",
        "watchlistfor2": "Za $1 $2",
        "nowatchlist": "Vaš spisak nadgledanja je prazan.",
-       "watchlistanontext": "Morate biti $1 da biste gledali i uređivali stavke na vašem spisku nadgledanja.",
+       "watchlistanontext": "Morate biti prijavljeni da biste gledali i uređivali stavke na vašem spisku nadgledanja.",
        "watchnologin": "Niste prijavljeni",
        "addwatch": "Dodaj na spisak nadgledanja",
        "addedwatchtext": "Stranica „[[:$1]]“ i njena stranica za razgovor je dodata na Vaš [[Special:Watchlist|spisak nadgledanja]].",
+       "addedwatchtext-talk": "Stranica „[[:$1]]” i njena pridružena stranica je dodata na Vaš [[Special:Watchlist|spisak nadgledanja]]",
        "addedwatchtext-short": "Stranica „$1“ je dodata na Vaš spisak nadgledanja.",
        "removewatch": "Ukloni sa spiska nadgledanja",
-       "removedwatchtext": "Stranica „[[:$1]]“ i njena stranica za razgovor je uklonjena s vašeg [[Special:Watchlist|spiska nadgledanja]].",
+       "removedwatchtext": "Stranica „[[:$1]]“ i njena stranica za razgovor je uklonjena sa Vašeg [[Special:Watchlist|spiska nadgledanja]].",
        "removedwatchtext-short": "Stranica „$1“ je uklonjena s vašeg spiska nadgledanja.",
        "watch": "Nadgledaj",
        "watchthispage": "Nadgledaj ovu stranicu",
        "notvisiblerev": "Izmena je obrisana",
        "watchlist-details": "Na Vašem spisku nadgledanja {{PLURAL:$1|je $1 stranica|su $1 stranice|je $1 stranica}} (plus stranice za razgovor).",
        "wlheader-enotif": "Obaveštenje imejlom je omogućeno.",
-       "wlheader-showupdated": "Stranice koje su izmenjene otkad ste ih poslednji put posetili su '''podebljane'''.",
+       "wlheader-showupdated": "Stranice koje su izmenjene otkad ste ih poslednji put posetili su <strong>podebljane</strong>.",
        "wlnote": "Ispod {{PLURAL:$1|je poslednja izmena|su poslednje <strong>$1</strong> izmene|je poslednjih <strong>$1</strong> izmena}} u {{PLURAL:$2|prethodnom satu|prethodna <strong>$2</strong> sata|prethodnih <strong>$2</strong> sati}}, zaključno sa $3, $4.",
        "wlshowlast": "Prikaži poslednjih $1 sati, $2 dana",
        "watchlist-hide": "Sakrij",
        "wlshowhidepatr": "patrolirane izmene",
        "wlshowhidemine": "moje izmene",
        "wlshowhidecategorization": "kategorizaciju stranica",
-       "watchlist-options": "Postavke spiska nadgledanja",
-       "watching": "Nadgledanje…",
-       "unwatching": "Uklanjanje sa spiska nadgledanja...",
+       "watchlist-options": "Opcije spiska nadgledanja",
+       "watching": "Nadgledam…",
+       "unwatching": "Prestajem da nadgledam...",
        "watcherrortext": "Došlo je do greške pri promeni postavki vašeg spiska nadgledanja za „$1“.",
        "enotif_reset": "Označi sve stranice kao posećene",
        "enotif_impersonal_salutation": "{{SITENAME}} korisnik",
-       "enotif_subject_deleted": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|obrisao je|obrisala je}} $2",
-       "enotif_subject_created": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|napravio je|napravila je}} $2",
+       "enotif_subject_deleted": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|obrisao je|obrisala je|obrisao je}} $2",
+       "enotif_subject_created": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|napravio je|napravila je|napravio je}} $2",
        "enotif_subject_moved": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|premestio je|premestila je}} $2",
-       "enotif_subject_restored": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|vratio je|vratila je}} $2",
+       "enotif_subject_restored": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|vratio je|vratila je|vratio je}} $2",
        "enotif_subject_changed": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|promenio|promenila}} je $2",
        "enotif_body_intro_deleted": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|obrisao|obrisala}} je $2 dana $PAGEEDITDATE Pogledajte $3.",
        "enotif_body_intro_created": "Stranicu $1 na {{SITENAME}} {{GENDER:$2|napravio|napravila}} je $2 dana $PAGEEDITDATE Trenutna izmena nalazi se na $3.",
        "enotif_lastvisited": "Za sve izmene od vaše poslednje posete, pogledajte $1.",
        "enotif_lastdiff": "Da vidite ovu izmenu, pogledajte $1.",
        "enotif_anon_editor": "anoniman korisnik $1",
-       "enotif_body": "Poštovani $WATCHINGUSERNAME,\n \t\n$PAGEINTRO $NEWPAGE\n\nOpis: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt:\nmejl: $PAGEEDITOR_EMAIL\nviki: $PAGEEDITOR_WIKI\n\nNeće biti drugih obaveštenja u slučaju daljih izmena ukoliko ne posetite ovu stranicu kada ste prijavljeni.\nMožete i da poništite postavke obaveštenja za sve stranice u vašem spisku nadgledanja.\n\nSrdačan pozdrav, {{SITENAME}}\n\n--\nDa biste promenili postavke imejl obaveštenja, posetite\n{{canonicalurl:{{#special:Preferences}}}}\n\nDa biste promenili postavke spiska nadgledanja, posetite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nDa biste uklonili ovu stranicu sa spiska nadgledanja, posetite\n$UNWATCHURL\n\nPodrška i dalja pomoć:\n$HELPPAGE",
+       "enotif_body": "Poštovani $WATCHINGUSERNAME,\n \t\n$PAGEINTRO $NEWPAGE\n\nOpis: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt:\nmejl: $PAGEEDITOR_EMAIL\nviki: $PAGEEDITOR_WIKI\n\nNeće biti drugih obaveštenja u slučaju daljih izmena ukoliko ne posetite ovu stranicu kada ste prijavljeni.\nMožete i da poništite podešavanja obaveštenja za sve stranice u vašem spisku nadgledanja.\n\nSrdačan pozdrav, {{SITENAME}}\n\n--\nDa biste promenili podešavanja imejl obaveštenja, posetite\n{{canonicalurl:{{#special:Preferences}}}}\n\nDa biste promenili podešavanja spiska nadgledanja, posetite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nDa biste uklonili ovu stranicu sa spiska nadgledanja, posetite\n$UNWATCHURL\n\nPodrška i dalja pomoć:\n$HELPPAGE",
+       "enotif_minoredit": "Ovo je manja izmena",
        "created": "napravljena",
        "changed": "izmenjena",
        "deletepage": "Obriši stranicu",
        "confirm": "Potvrdi",
        "excontent": "sadržaj je bio: „$1“",
-       "excontentauthor": "sadržaj je bio: „$1“, a jedini urednik [[Special:Contributions/$2|$2]] ([[User talk:$2|razgovor]])",
+       "excontentauthor": "sadržaj je bio: „$1“, a jedini urednik „[[Special:Contributions/$2|$2]]“ ([[User talk:$2|razgovor]])",
        "exbeforeblank": "sadržaj pre brisanja je bio: „$1“",
        "delete-confirm": "Brisanje stranice „$1“",
        "delete-legend": "Obriši",
        "dellogpage": "Dnevnik brisanja",
        "dellogpagetext": "Ispod je spisak poslednjih brisanja.",
        "deletionlog": "dnevnik brisanja",
-       "logentry-create-create": "$1 {{GENDER:$2|kreirao je|kreirala je}} stranicu $3",
+       "logentry-create-create": "$1 je {{GENDER:$2|napravio|napravila}} stranicu $3",
        "reverted": "Vraćeno na raniju izmenu",
        "deletecomment": "Razlog:",
        "deleteotherreason": "Drugi/dodatni razlog:",
        "rollbacklinkcount": "vrati $1 {{PLURAL:$1|izmenu|izmene|izmena}}",
        "rollbacklinkcount-morethan": "vrati više od $1 {{PLURAL:$1|izmene|izmene|izmena}}",
        "rollbackfailed": "Neuspešno vraćanje",
+       "rollback-missingparam": "Nedostaje potreban parametar na zahtevu.",
+       "rollback-missingrevision": "Ne mogu učitati podatke o izmeni.",
        "cantrollback": "Ne mogu da vratim izmenu.\nPoslednji autor je ujedno i jedini.",
        "alreadyrolled": "Vraćanje poslednje izmene stranice [[:$1]] od strane {{GENDER:$2|korisnika|korisnice|korisnika}} [[User:$2|$2]] ([[User talk:$2|razgovor]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) nije uspelo; neko drugi je u međuvremenu izmenio ili vratio stranicu.\n\nPoslednju izmenu je {{GENDER:$3|napravio|napravila|napravio}} [[User:$3|$3]] ([[User talk:$3|razgovor]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Opis izmene: <em>$1</em>.",
-       "revertpage": "Vraćene izmene [[Special:Contribs/$2|$2]] ([[User talk:$2|razgovor]]) na poslednju izmenu korisnika [[User:$1|$1]]",
-       "revertpage-nouser": "Vraćene su izmene skrivenog korisnika na poslednju izmenu {{GENDER:$1|korisnika|korisnice}} [[User:$1|$1]]",
-       "rollback-success": "Vraćene su izmene {{GENDER:$1|korisnika|korisnice}} $1\nna poslednju izmenu {{GENDER:$2|korisnika|korisnice}} $2.",
+       "revertpage": "Vraćene izmene {{GENDER:$2|korisnika|korisnice}} [[Special:Contribs/$2|$2]] ([[User talk:$2|razgovor]]) na poslednju izmenu {{GENDER:$1|korisnika|korisnice}} [[User:$1|$1]]",
+       "revertpage-nouser": "Izmene skrivenog korisnika su vraćene na poslednju izmenu {{GENDER:$1|korisnika|korisnice}} [[User:$1|$1]]",
+       "rollback-success": "Izmene {{GENDER:$1|korisnika|korisnice}} {{GENDER:$3|$1}} su vraćene na poslednju izmenu {{GENDER:$2|korisnika|korisnice}} {{GENDER:$4|$2}}.",
+       "rollback-success-notify": "Vraćene izmene korisnika $1;\nvraćeno na poslednju izmenu korisnika $2. [$3 Prikaži izmene]",
        "sessionfailure-title": "Sesija je okončana",
-       "sessionfailure": "Izgleda da postoji problem s vašom sesijom;\nova radnja je otkazana da bi se izbegla zloupotreba.\nVratite se na prethodnu stranicu, ponovo je učitajte i pokušajte ponovo.",
-       "changecontentmodel": "Promeni model sadržaja stranice",
+       "sessionfailure": "Izgleda da postoji problem s vašom sesijom;\nova radnja je otkazana da bi se izbegla zloupotreba.\nMolimo, ponovo pošaljite obrazac.",
+       "changecontentmodel": "Promena modela sadržaja stranice",
        "changecontentmodel-legend": "Promeni model sadržaja",
        "changecontentmodel-title-label": "Naslov stranice",
        "changecontentmodel-model-label": "Novi model sadržaja",
        "changecontentmodel-reason-label": "Razlog:",
+       "changecontentmodel-submit": "Promeni",
        "changecontentmodel-success-title": "Model sadržaja je promenjen",
        "changecontentmodel-success-text": "Model sadržaja stranice [[:$1]] je promenjen.",
        "changecontentmodel-cannot-convert": "Model sadržaja stranice [[:$1]] se ne može pretvoriti u vrstu $2.",
        "changecontentmodel-nodirectediting": "Model sadržaja $1 ne podržava izravno uređivanje",
+       "changecontentmodel-emptymodels-title": "Nema dostupnih modela sadržaja",
+       "changecontentmodel-emptymodels-text": "Model sadržaja stranice [[:$1]] se ne može pretvoriti ni u jednu drugu vrstu.",
        "log-name-contentmodel": "Dnevnik promene modela sadržaja",
-       "log-description-contentmodel": "Događaji koji imaju vezu sa modelima sadržaja stranica",
+       "log-description-contentmodel": "Ova stranica prikazuje izmene u modelima sadržaja stranica i stranice koje su napravljene sa modelom sadržaja koji se razlikuje od podrazumevanog.",
+       "logentry-contentmodel-new": "$1 je {{GENDER:$2|napravio|napravila}} stranicu $3 s nestandardnim modelom sadržaja „$5“",
        "logentry-contentmodel-change": "$1 je {{GENDER:$2|promenio|promenila}} model sadržaja stranice $3 iz „$4“ u „$5“",
        "logentry-contentmodel-change-revertlink": "vrati",
        "logentry-contentmodel-change-revert": "vrati",
        "protectlogpage": "Dnevnik zaštite",
        "protectlogtext": "Ispod je spisak zaštićenih stranica.\nPogledajte [[Special:ProtectedPages|spisak zaštićenih stranica]] za više detalja.",
-       "protectedarticle": "je zaštitio „[[$1]]“",
-       "modifiedarticleprotection": "promenjen stepen zaštite za „[[$1]]“",
+       "protectedarticle": "je {{GENDER:|zaštitio|zaštitila}} stranicu „[[$1]]“",
+       "modifiedarticleprotection": "je {{GENDER:|promenio|promenila}} stepen zaštite stranice „[[$1]]“",
        "unprotectedarticle": "je skinuo zaštitu sa stranice „[[$1]]“",
        "movedarticleprotection": "je premestio podešavanja zaštite sa „[[$2]]“ na „[[$1]]“",
+       "protectedarticle-comment": "{{GENDER:$2|Zaštićena}} stranica [[$1]]",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Promenjen}} nivo zaštite [[$1]]",
+       "unprotectedarticle-comment": "{{GENDER:$2|Skinuta}} zaštita sa [[$1]]",
        "protect-title": "Stepen zaštite za „$1“",
        "protect-title-notallowed": "Pregled stepena zaštite za „$1“",
        "prot_1movedto2": "je premestio [[$1]] na [[$2]]",
        "protect-badnamespace-text": "Stranice u ovom imenskom prostoru se ne mogu zaštititi.",
        "protect-norestrictiontypes-text": "Ova stranica se ne može zaštititi jer nema dostupnih vrsta ograničenja.",
        "protect-norestrictiontypes-title": "Nezaštitljiva strana",
-       "protect-legend": "Postavke zaštite",
+       "protect-legend": "Podešavanja zaštite",
        "protectcomment": "Razlog:",
        "protectexpiry": "Ističe:",
        "protect_expiry_invalid": "Vreme isteka je neispravno.",
        "protect_expiry_old": "Vreme isteka je starije od trenutnog vremena.",
-       "protect-unchain-permissions": "Otključaj daljnje postavke zaštite",
+       "protect-unchain-permissions": "Otključaj daljnja podešavanja zaštite",
        "protect-text": "Ovde možete da pogledate i promenite stepen zaštite za stranicu '''$1'''.",
-       "protect-locked-blocked": "Ne možete menjati stepene zaštite dok ste blokirani.\nOvo su trenutne postavke stranice '''$1''':",
-       "protect-locked-dblock": "Stepeni zaštite se ne mogu menjati jer je aktivna baza podataka zaključana.\nOvo su postavke stranice '''$1''':",
-       "protect-locked-access": "Nemate ovlašćenja za menjanje stepena zaštite stranice.\nOvo su trenutne postavke stranice '''$1''':",
+       "protect-locked-blocked": "Ne možete menjati stepene zaštite dok ste blokirani.\nOvo su trenutna podešavanja stranice '''$1''':",
+       "protect-locked-dblock": "Stepeni zaštite se ne mogu menjati jer je aktivna baza podataka zaključana.\nOvo su podešavanja stranice '''$1''':",
+       "protect-locked-access": "Nemate ovlašćenja za menjanje stepena zaštite stranice.\nOvo su trenutna podešavanja stranice '''$1''':",
        "protect-cascadeon": "Ova stranica je trenutno zaštićena jer se nalazi na {{PLURAL:$1|stranici koja ima|stranicama koje imaju}} prenosivu zaštitu.\nMožete da promenite stepen zaštite, ali to neće uticati na prenosivu zaštitu.",
        "protect-default": "Dopušteno svim korisnicima",
        "protect-fallback": "Dozvoljeno samo korisnicima sa dozvolom „$1“",
        "undeletepagetext": "{{PLURAL:$1|Sledeća stranica je obrisana, ali je još u arhivi i može biti vraćena|Sledeće $1 stranice su obrisane, ali su još u arhivi i mogu biti vraćene|Sledećih $1 stranica je obrisano, ali su još u arhivi i mogu biti vraćene}}.\nArhiva se povremeno čisti od ovakvih stranica.",
        "undelete-fieldset-title": "Vraćanje izmena",
        "undeleteextrahelp": "Da biste vratili celu istoriju stranice, ostavite sve kućice neoznačene i kliknite na dugme '''''{{int:undeletebtn}}'''''.\nAko želite da vratite određene izmene, označite ih i kliknite na '''''{{int:undeletebtn}}'''''.",
-       "undeleterevisions": "$1 {{PLURAL:$1|izmena je arhivirana|izmene su arhivirane|izmena je arhivirano}}",
-       "undeletehistory": "Ako vratite stranicu, sve revizije će biti vraćene njenoj istoriji.\nAko je u međuvremenu napravljena nova stranica s istim nazivom, vraćene izmene će se pojaviti u njenoj ranijoj istoriji.",
+       "undeleterevisions": "{{PLURAL:$1|Izmena}} obrisano: $1",
+       "undeletehistory": "Ako vratite stranicu, sve izmene će biti vraćene njenoj istoriji.\nAko je u međuvremenu napravljena nova stranica s istim nazivom, vraćene izmene će se pojaviti u njenoj ranijoj istoriji.",
        "undeleterevdel": "Vraćanje neće biti izvršeno ako je rezultat toga delimično brisanje poslednje izmene.\nU takvim slučajevima morate isključiti ili otkriti najnovije obrisane izmene.",
        "undeletehistorynoadmin": "Ova stranica je obrisana.\nRazlog za brisanje se nalazi ispod, zajedno s detaljima o korisniku koji je izmenio ovu stranicu pre brisanja.\nTekst obrisanih izmena je dostupan samo administratorima.",
        "undelete-revision": "Obrisana izmena stranice $1 (dana $4; $5) od strane {{GENDER:$3|korisnika|korisnice|korisnika}} $3:",
        "undeleterevision-missing": "Neispravna ili nepostojeća izmena.\nMožda ste uneli pogrešnu vezu, ili je izmena vraćena ili uklonjena iz arhive.",
+       "undeleterevision-duplicate-revid": "Ne mogu vratiti {{PLURAL:$1|izmenu|$1 izmene|$1 izmena}} jer se {{PLURAL:$1|njen|njihov}} <code>rev_id</code> već koristi.",
        "undelete-nodiff": "Prethodne izmene nisu pronađene.",
        "undeletebtn": "Vrati",
        "undeletelink": "pogledaj/vrati",
        "undelete-search-title": "Pretraga obrisanih stranica",
        "undelete-search-box": "Pretraži obrisane stranice",
        "undelete-search-prefix": "Prikaži stranice koje počinju sa:",
+       "undelete-search-full": "Prikaži naslove koji sadrže:",
        "undelete-search-submit": "Pretraži",
        "undelete-no-results": "Odgovarajuća stranica u dnevniku brisanja nije pronađena.",
        "undelete-filename-mismatch": "Ne mogu da vratim izmenu datoteke od $1: naziv datoteke se ne poklapa",
        "undelete-show-file-submit": "Da",
        "namespace": "Imenski prostor:",
        "invert": "Obrni izbor",
-       "tooltip-invert": "Označite ovu kućicu da biste sakrili izmene na stranicama u odabranom imenskom prostoru (i povezanim imenskim prostorima, ako je označeno)",
+       "tooltip-invert": "Označite ovu kutijucu da biste sakrili izmene stranica u izabranom imenskom prostoru (i povezanim imenskim prostorima, ako je označeno)",
+       "tooltip-whatlinkshere-invert": "Označite ovu kutijicu za sakrivanje veza sa stranica u izabranom imenskom prostoru.",
        "namespace_association": "Povezani imenski prostor",
-       "tooltip-namespace_association": "Označite ovu kućicu da biste uključili i razgovor ili imenski prostor teme koja je povezana s odabranim imenskim prostorom",
+       "tooltip-namespace_association": "Označite ovu kutijicu da biste uključili i razgovor ili imenski prostor teme koja je povezana sa izabranim imenskim prostorom",
        "blanknamespace": "(glavni)",
        "contributions": "{{GENDER:$1|Korisnički}} doprinosi",
        "contributions-title": "Doprinosi {{GENDER:$1|korisnika|korisnice}} $1",
        "mycontris": "Doprinosi",
        "anoncontribs": "Doprinosi",
        "contribsub2": "Za {{GENDER:$3|$1}} ($2)",
-       "contributions-userdoesnotexist": "Korisnički nalog „$1“ nije registrovan.",
+       "contributions-userdoesnotexist": "Korisnički nalog „$1“ nije otvoren.",
        "nocontribs": "Nema izmena koje odgovaraju navedenim kriterijumima.",
-       "uctop": "(poslednja)",
+       "uctop": "(trenutna)",
        "month": "od meseca (i ranije):",
        "year": "od godine (i ranije):",
        "sp-contributions-newbies": "Prikaži samo doprinose novih korisnika",
        "sp-contributions-newbies-sub": "Za nove korisnike",
        "sp-contributions-newbies-title": "Doprinosi novih korisnika",
        "sp-contributions-blocklog": "dnevnik blokiranja",
+       "sp-contributions-suppresslog": "obrisani {{GENDER:$1|korisnički}} doprinosi",
        "sp-contributions-deleted": "obrisani {{GENDER:$1|doprinosi}}",
        "sp-contributions-uploads": "otpremanja",
        "sp-contributions-logs": "dnevnici",
        "sp-contributions-username": "IP adresa ili korisničko ime:",
        "sp-contributions-toponly": "Samo najnovije izmene",
        "sp-contributions-newonly": "Samo izmene kojima su napravljene nove stranice",
+       "sp-contributions-hideminor": "Sakrij manje izmene",
        "sp-contributions-submit": "Pretraži",
        "whatlinkshere": "Šta vodi ovde",
        "whatlinkshere-title": "Stranice koje su povezane sa „$1”",
        "whatlinkshere-page": "Stranica:",
-       "linkshere": "Sledeće stranice imaju vezu do '''$1''':",
-       "nolinkshere": "Nijedna stranica nije povezana sa: '''$2'''.",
+       "linkshere": "Sledeće stranice imaju vezu do <strong>$1</strong>:",
+       "nolinkshere": "Nijedna stranica nije povezana sa: <strong>$2</strong>.",
        "nolinkshere-ns": "Nijedna stranica ne vodi do '''$2''' u izabranom imenskom prostoru.",
        "isredirect": "preusmerenje",
        "istemplate": "uključivanje",
-       "isimage": "veza ka datoteci",
-       "whatlinkshere-prev": "{{PLURAL:$1|prethodni|prethodnih $1}}",
-       "whatlinkshere-next": "{{PLURAL:$1|sledeći|sledećih $1}}",
+       "isimage": "veza do datoteke",
+       "whatlinkshere-prev": "{{PLURAL:$1|prethodni|prethodna $1|prethodnih $1}}",
+       "whatlinkshere-next": "{{PLURAL:$1|sledeći|sledeća $1|sledećih $1}}",
        "whatlinkshere-links": "← veze",
        "whatlinkshere-hideredirs": "$1 preusmerenja",
        "whatlinkshere-hidetrans": "$1 uključivanja",
        "whatlinkshere-submit": "Idi",
        "autoblockid": "Automatsko blokiranje #$1",
        "block": "Blokiraj korisnika",
-       "unblock": "Deblokiraj korisnika",
-       "blockip": "Blokiraj korisnika",
+       "unblock": "Deblokiranje korisnika",
+       "blockip": "Blokiraj {{GENDER:$1|korisnika|korisnicu}}",
        "blockiptext": "Koristite donji obrazac da biste zabranili pristup za pisanje s određene IP adrese ili korisničkog imena.\nOvo bi trebalo da vršite samo radi sprečavanja vandalizma, u skladu sa [[{{MediaWiki:Policy-url}}|smernicama]].\nIzaberite konkretan razlog ispod (primer: navođenje konkretnih stranica koje su vandalizovane). Možete blokirati opsege IP adresa pomoću [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR] sintakse, najveći dozvoljeni opseg za IPv4 je /$1 odnosno /$2 za IPv6.",
        "ipaddressorusername": "IP adresa ili korisničko ime:",
        "ipbexpiry": "Ističe:",
        "ipb-unblock-addr": "Deblokiraj $1",
        "ipb-unblock": "Deblokiraj korisničko ime ili IP adresu",
        "ipb-blocklist": "Pogledaj postojeća blokiranja",
-       "ipb-blocklist-contribs": "Doprinosi za $1",
+       "ipb-blocklist-contribs": "Doprinosi za {{GENDER:$1|$1}}",
+       "ipb-blocklist-duration-left": "preostalo: $1",
        "unblockip": "Deblokiraj korisnika",
        "unblockiptext": "Koristite obrazac ispod da biste vratili pravo pisanja blokiranoj IP adresi ili korisničkom imenu.",
        "ipusubmit": "Ukloni ovu blokadu",
        "unblocked-id": "Blokiranje $1 je uklonjeno",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] je deblokiran.",
        "blocklist": "Blokirani korisnici",
+       "autoblocklist": "Autoblokovi",
+       "autoblocklist-submit": "Pretraži",
+       "autoblocklist-legend": "Spisak autoblokiranja",
+       "autoblocklist-localblocks": "{{PLURAL:$1|Lokalni autoblok|Lokalni autoblokovi}}",
+       "autoblocklist-total-autoblocks": "Ukupno autoblokova: $1",
+       "autoblocklist-empty": "Spisak autoblokiranja je prazan.",
+       "autoblocklist-otherblocks": "{{PLURAL:$1|Drugi autoblok|Drugi autoblokovi}}",
        "ipblocklist": "Blokirani korisnici",
        "ipblocklist-legend": "Pronalaženje blokiranog korisnika",
        "blocklist-userblocks": "Sakrij blokiranja naloga",
        "emaillink": "pošalji imejl",
        "autoblocker": "Automatski ste blokirani jer delite IP adresu s korisnikom/com [[User:$1|$1]].\nRazlog blokiranja: „$2“",
        "blocklogpage": "Dnevnik blokiranja",
-       "blocklog-showlog": "{{GENDER:$1|Ovaj korisnik je ranije blokiran|Ova korisnica je ranije blokirana|Ovaj korisnik je ranije blokiran}}.\nIstorija blokiranja se nalazi ispod:",
+       "blocklog-showlog": "{{GENDER:$1|Ovaj korisnik je ranije blokiran|Ova korisnica je ranije blokirana}}.\nIstorija blokiranja se nalazi ispod:",
        "blocklog-showsuppresslog": "{{GENDER:$1|Ovaj korisnik je ranije blokiran i sakriven|Ova korisnica je ranije blokirana i sakrivena}}.\nIstorija sakrivanja se nalazi ispod:",
-       "blocklogentry": "je blokirao [[$1]] s rokom isticanja od $2 $3",
-       "reblock-logentry": "{{GENDER:|je promenio|je promenila|je promenio}} podešavanja za blokiranje {{GENDER:$1|korisnika|korisnice|korisnika}} [[$1]] s rokom isteka od $2 ($3)",
+       "blocklogentry": "je blokirao [[$1]] sa vremenom isticanja od $2 $3",
+       "reblock-logentry": "{{GENDER:|je promenio|je promenila}} podešavanja za blokiranje {{GENDER:$1|korisnika|korisnice}} [[$1]] sa vremenom isteka od $2 ($3)",
        "blocklogtext": "Ovo je dnevnik blokiranja i deblokiranja korisnika.\nAutomatski blokirane IP adrese nisu navedene.\nTekuće zabrane i blokiranja možete naći [[Special:BlockList|ovde]].",
        "unblocklogentry": "je deblokirao $1",
        "block-log-flags-anononly": "samo anonimni korisnici",
        "block-log-flags-hiddenname": "korisničko ime je sakriveno",
        "range_block_disabled": "Administratorska mogućnost za blokiranje raspona IP adresa je onemogućena.",
        "ipb_expiry_invalid": "Vreme isteka je neispravno.",
+       "ipb_expiry_old": "Vreme isteka je u prošlosti.",
        "ipb_expiry_temp": "Sakrivene blokade korisnika moraju biti trajne.",
        "ipb_hide_invalid": "Ne mogu da potisnem ovaj nalog; ima više od {{PLURAL:$1|jedne izmene|$1 izmena}}.",
        "ipb_already_blocked": "„$1“ je već blokiran.",
        "ipb_blocked_as_range": "Greška: IP adresa $1 nije direktno blokirana i ne može da se deblokira.\nOna je blokirana kao deo blokade $2, koja može biti deblokirana.",
        "ip_range_invalid": "Neispravan raspon IP adresa.",
        "ip_range_toolarge": "Opsežna blokiranja veća od /$1 nisu dozvoljena.",
+       "ip_range_toolow": "IP-opsezi nisu dozvoljeni.",
        "proxyblocker": "Bloker posrednika",
        "proxyblockreason": "Vaša IP adresa je blokirana jer predstavlja otvoreni posrednik.\nObratite se vašem dobavljaču internet usluga ili tehničku podršku i obavestite ih o ovom ozbiljnom bezbednosnom problemu.",
        "sorbs": "DNSBL",
        "lockdbsuccesstext": "Baza podataka je zaključana.<br />\nSetite se da je [[Special:UnlockDB|otključate]] kada završite s održavanjem.",
        "unlockdbsuccesstext": "Baza je otključana.",
        "lockfilenotwritable": "Datoteka za zaključavanje baze nije otvorena za pisanje.\nDa biste zaključali i otključali bazu, datoteka mora biti dostupna za pisanje od strane mrežnog servera.",
+       "databaselocked": "Baza podataka je već zaključana.",
        "databasenotlocked": "Baza nije zaključana.",
        "lockedbyandtime": "(od $1 dana $2 u $3)",
-       "move-page": "PremeÅ¡tanje â\80\9e$1â\80\9c",
+       "move-page": "PremeÅ¡tanje â\80\9e$1â\80\9d",
        "move-page-legend": "Premeštanje stranice",
        "movepagetext": "Donji obrazac će preimenovati stranicu, premeštajući celu istoriju na novo ime.\nStari naslov postaće preusmerenje na novi.\nMožete ažurirati preusmerenja koja vode do izvornog naslova;\npogledajte [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|pokvarena]] preusmerenja.\nNa vama je odgovornost da veze i dalje idu tamo gde treba.\n\nStranica <strong>neće</strong> biti premeštena ako već postoji stranica s tim imenom (osim ako je prazna, sadrži preusmerenje ili nema istoriju izmena).\nTo znači da možete vratiti stranicu na prethodno ime ako pogrešite, ali ne možete ''prepisati'' postojeću.\n\n<strong>Napomena:</strong>\nOvo može predstavljati drastičnu i neočekivanu izmenu za popularnu stranicu;\ndobro razmislite o posledicama pre nego što nastavite.",
        "movepagetext-noredirectfixer": "Donji obrazac će preimenovati stranicu, premeštajući celu istoriju na novo ime.\nStari naslov postaće preusmerenje na novi.\nPogledajte [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|pokvarena]] preusmerenja.\nNa vama je odgovornost da veze i dalje idu tamo gde treba.\n\nStranica <strong>neće</strong> biti premeštena ako već postoji stranica s tim imenom (osim ako je prazna, sadrži preusmerenje ili nema istoriju izmena).\nTo znači da možete vratiti stranicu na prethodno ime ako pogrešite, ali ne možete ''prepisati'' postojeću.\n\n<strong>Napomena:</strong>\nOvo može predstavljati drastičnu i neočekivanu izmenu za popularnu stranicu;\ndobro razmislite o posledicama pre nego što nastavite.",
        "cant-move-user-page": "Nemate dozvolu za premeštanje osnovnih korisničkih stranica (osim podstranica).",
        "cant-move-to-user-page": "Nemate dozvolu za premeštanje stranice na vašu korisničku stranicu (osim na korisničku podstranicu).",
        "cant-move-category-page": "Nemate dozvolu da premeštate stranice kategorija.",
+       "cant-move-to-category-page": "Nemate dozvolu da premestite stranicu na stranicu kategorije.",
+       "cant-move-subpages": "Nemate dozvolu da premeštate podstranice.",
+       "namespace-nosubpages": "Imeniski prostor „$1“ ne dozvoljava podstranice.",
        "newtitle": "Novi naslov:",
        "move-watch": "Nadgledaj ovu stranicu",
        "movepagebtn": "Premesti stranicu",
        "delete_and_move_text": "Odredišna stranica „[[:$1]]“ već postoji. \nŽelite li da je obrišete da biste oslobodili mesto za premeštanje?",
        "delete_and_move_confirm": "Da, obriši stranicu",
        "delete_and_move_reason": "Obrisano da se oslobodi mesto za premeštanje iz „[[$1]]“",
-       "selfmove": "Izvorni i odredišni naslovi su istovetni;\nne mogu da premestim stranicu preko same sebe.",
+       "selfmove": "Naslov je istovetan;\nne možete premestiti stranicu preko same sebe.",
        "immobile-source-namespace": "Ne mogu premestiti stranice u imenski prostor „$1“.",
        "immobile-target-namespace": "Ne mogu premestiti stranice u imenski prostor „$1“.",
        "immobile-target-namespace-iw": "Međuviki veza nije ispravno odredište za premeštanje stranice.",
        "export-download": "Sačuvaj kao datoteku",
        "export-templates": "Uključi šablone",
        "export-pagelinks": "Uključi povezane stranice do dubine od:",
+       "export-manual": "Ručno dodaj stranice:",
        "allmessages": "Sistemske poruke",
        "allmessagesname": "Naziv",
        "allmessagesdefault": "Podrazumevani tekst",
        "allmessagescurrent": "Trenutni tekst poruke",
-       "allmessagestext": "Ovo je spisak svih sistemskih poruka koje su dostupne u imenskom prostoru „Medijaviki“.\nPosetite [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Medijaviki lokalizaciju] i [https://translatewiki.net Translejtviki] ako želite da pomognete u prevođenju.",
+       "allmessagestext": "Ovo je spisak sistemskih poruka dostupnih u imenskom prostoru „Medijaviki“.\nPosetite [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Medijaviki lokalizaciju] i [https://translatewiki.net translatewiki.net] ako želite da doprinesete opštoj lokalizaciji Medijavikija.",
        "allmessagesnotsupportedDB": "Ova stranica ne može da se koristi jer je '''$wgUseDatabaseMessages''' onemogućen.",
        "allmessages-filter-legend": "Filter",
        "allmessages-filter": "Filtriraj po stanju:",
        "allmessages-language": "Jezik:",
        "allmessages-filter-submit": "Idi",
        "allmessages-filter-translate": "Prevedi",
-       "thumbnail-more": "Povećaj",
+       "thumbnail-more": "Povećajte",
        "filemissing": "Nedostaje datoteka",
        "thumbnail_error": "Greška pri stvaranju minijature: $1",
+       "thumbnail_error_remote": "Poruka o grešci iz $1:\n$2",
        "djvu_page_error": "DjVu stranica je nedostupna",
        "djvu_no_xml": "Ne mogu da preuzmem XML za DjVu datoteku.",
        "thumbnail-temp-create": "Ne mogu da napravim privremenu datoteku minijature",
        "thumbnail-dest-create": "Ne mogu da sačuvam minijaturu u odredištu",
        "thumbnail_invalid_params": "Neispravni parametri za minijaturu",
+       "thumbnail_toobigimagearea": "Datoteka sa veličinama većim od $1",
        "thumbnail_dest_directory": "Ne mogu da napravim odredišnu fasciklu",
        "thumbnail_image-type": "Vrsta slike nije podržana",
-       "thumbnail_gd-library": "Nedovršene postavke grafičke biblioteke: nedostaje funkcija $1",
+       "thumbnail_gd-library": "Nedovršena podešavanja grafičke biblioteke: nedostaje funkcija $1",
+       "thumbnail_image-size-zero": "Izgleda da je veličina datoteke nula.",
        "thumbnail_image-missing": "Datoteka nedostaje: $1",
+       "thumbnail_image-failure-limit": "Bilo je previše skorašnjih neuspešnih pokušaja ($1 ili više) renderovanja ove minijature. Pokušajte ponovo kasnije.",
        "import": "Uvoz stranica",
-       "importinterwiki": "Uvoz iz drugo vikija",
+       "importinterwiki": "Uvoz sa drugog vikija",
        "import-interwiki-text": "Izaberite viki i naslov stranice za uvoz.\nDatumi i imena urednika će biti sačuvani.\nSve radnje pri uvozu s drugih vikija su zabeležene u [[Special:Log/import|dnevniku uvoza]].",
        "import-interwiki-sourcewiki": "Izvorna viki:",
        "import-interwiki-sourcepage": "Izvorna stranica:",
        "import-mapping-namespace": "Uvezi u imenski prostor:",
        "import-mapping-subpage": "Uvezi kao podstranice sledeće stranice:",
        "import-upload-filename": "Naziv datoteke:",
+       "import-upload-username-prefix": "Međuviki prefiks:",
        "import-comment": "Komentar:",
        "importtext": "Izvezite datoteku s izvornog vikija koristeći [[Special:Export|izvoz]].\nSačuvajte je na računar i pošaljite ovde.",
        "importstart": "Uvozim stranice…",
        "imported-log-entries": "{{PLURAL:$1|Uvezena je $1 stavka izveštaja|Uvezene su $1 stavke izveštaja|Uvezeno je $1 stavki izveštaja}}.",
        "importfailed": "Neuspešan uvoz: <nowiki>$1</nowiki>",
        "importunknownsource": "Nepoznata vrsta za uvoz",
-       "importcantopen": "Ne mogu da otvorim datoteku za uvoz",
+       "importnoprefix": "Nije naveden međuviki prefiks",
+       "importcantopen": "Ne mogu da otvorim datoteku za uvoz.",
        "importbadinterwiki": "Neispravna međuviki veza",
        "importsuccess": "Uvoženje je završeno!",
        "importnosources": "Nije određen nijedan izvor za uvoz, tako da je otpremanje istorije onemogućeno.",
        "importuploaderrortemp": "Ne mogu da pošaljem datoteku za uvoz.\nNedostaje privremena fascikla.",
        "import-parse-failure": "Pogrešno raščlanjivanje XML-a.",
        "import-noarticle": "Nema stranice za uvoz!",
-       "import-nonewrevisions": "Izmene nisu uvezene (sve su već bile ili prisutne ili preskočene zbog greški).",
+       "import-nonewrevisions": "Izmene nisu uvezene (sve su već bile ili prisutne ili preskočene zbog grešaka).",
        "xml-error-string": "$1 u redu $2, kolona $3 (bajt $4): $5",
        "import-upload": "Otpremanje XML podataka",
-       "import-token-mismatch": "Gubitak podataka o sesiji.\nPokušajte ponovo.",
+       "import-token-mismatch": "Gubitak podataka o sesiji.\n\nMožda ste odjavljeni. '''Molimo Vas proverite da li ste još uvek prijavljeni i pokušajte ponovo'''.\n\nAko i dalje ne radi, pokušajte se [[Special:UserLogout|odjaviti]] i ponovo prijaviti i proverite da li Vaš veb-prtraživač dozvoljava kolačiće sa ovog sajta.",
        "import-invalid-interwiki": "Ne mogu da uvozim s navedenog vikija.",
        "import-error-edit": "Stranica „$1“ nije uvezena jer vam nije dozvoljeno da je uređujete.",
        "import-error-create": "Stranica „$1“ nije uvezena jer vam nije dozvoljeno da je napravite.",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|izmena uvezena|izmene uvezene|izmena uvezeno}}",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|izmena uvezena|izmene uvezene|izmena uvezeno}} iz $2",
        "javascripttest": "Javaskript test",
+       "javascripttest-pagetext-unknownaction": "Nepoznata radnja „$1“.",
        "javascripttest-qunit-intro": "Pogledajte [$1 dokumentaciju za testiranje] na mediawiki.org.",
        "tooltip-pt-userpage": "{{GENDER:|Vaša}} korisnička stranica",
        "tooltip-pt-anonuserpage": "Korisnička stranica za IP adresu s koje uređujete",
        "tooltip-pt-mytalk": "{{GENDER:|Vaša}} stranica za razgovor",
-       "tooltip-pt-anontalk": "Razgovor o izmenama s ove IP adrese",
+       "tooltip-pt-anontalk": "Razgovor o izmenama sa ove IP adrese",
        "tooltip-pt-preferences": "{{GENDER:|Vaša}} podešavanja",
        "tooltip-pt-watchlist": "Spisak stranica koje nadgledate",
-       "tooltip-pt-mycontris": "Spisak {{GENDER:|vaših}} doprinosa",
+       "tooltip-pt-mycontris": "Spisak {{GENDER:|Vaših}} doprinosa",
        "tooltip-pt-anoncontribs": "Spisak izmena napravljenih sa ove IP adrese",
-       "tooltip-pt-login": "Preporučujemo vam da se prijavite, iako to nije obavezno.",
+       "tooltip-pt-login": "Predlažemo Vam da se prijavite, iako to nije obavezno",
+       "tooltip-pt-login-private": "Morate da se prijavite da biste koristili ovaj Viki",
        "tooltip-pt-logout": "Odjavite se",
-       "tooltip-pt-createaccount": "Ohrabrujemo vas da otvorite nalog i prijavite se ali to nije obavezno",
+       "tooltip-pt-createaccount": "Predlažemo Vam da otvorite nalog i prijavite se, iako to nije obavezno",
        "tooltip-ca-talk": "Razgovor o stranici sa sadržajem",
-       "tooltip-ca-edit": "Uredi ovu stranicu",
+       "tooltip-ca-edit": "Uredite ovu stranicu",
        "tooltip-ca-addsection": "Započnite novi odeljak",
        "tooltip-ca-viewsource": "Ova stranica je zaključana. \nMožete da pogledate njen izvorni kod",
-       "tooltip-ca-history": "Prethodne verzije ove stranice",
+       "tooltip-ca-history": "Prethodne izmene ove stranice",
        "tooltip-ca-protect": "Zaštitite ovu stranicu",
        "tooltip-ca-unprotect": "Promeni zaštitu ove stranice",
        "tooltip-ca-delete": "Obrišite ovu stranicu",
        "tooltip-ca-undelete": "Vrati izmene napravljene na ovoj stranici pre nego što bude obrisana",
        "tooltip-ca-move": "Premesti ovu stranicu",
-       "tooltip-ca-watch": "Dodaj ovu stranicu na spisak nadgledanja",
-       "tooltip-ca-unwatch": "Ukloni ovu stranicu sa spiska nadgledanja",
-       "tooltip-search": "Pretraga",
-       "tooltip-search-go": "Idite na stranicu s ovim imenom, ako postoji",
-       "tooltip-search-fulltext": "Pretražite stranice s ovim tekstom",
+       "tooltip-ca-watch": "Dodajte ovu stranicu na svoj spisak nadgledanja",
+       "tooltip-ca-unwatch": "Uklonite ovu stranicu sa spiska nadgledanja",
+       "tooltip-search": "Pretražite projekat {{SITENAME}}",
+       "tooltip-search-go": "Idite na stranicu s tačno ovim imenom ako postoji",
+       "tooltip-search-fulltext": "Pretražite stranice sa ovim tekstom",
        "tooltip-p-logo": "Posetite glavnu stranu",
        "tooltip-n-mainpage": "Posetite glavnu stranu",
        "tooltip-n-mainpage-description": "Posetite glavnu stranu",
        "tooltip-n-portal": "O projektu, šta možete da radite i gde da pronađete stvari",
-       "tooltip-n-currentevents": "Saznajte više o tekućim događajima",
+       "tooltip-n-currentevents": "Pronađite dodatne informacije o aktuelnostima",
        "tooltip-n-recentchanges": "Spisak skorašnjih izmena na vikiju",
-       "tooltip-n-randompage": "Otvorite slučajnu stranicu",
-       "tooltip-n-help": "Mesto gde možete da se informišete",
-       "tooltip-t-whatlinkshere": "Spisak svih stranica koje vode ovde",
-       "tooltip-t-recentchangeslinked": "Skorašnje izmene na stranicama koje su povezana sa ovom stranicom",
+       "tooltip-n-randompage": "Učitajte slučajnu stranicu",
+       "tooltip-n-help": "Mesto gde možete da naučite nešto",
+       "tooltip-t-whatlinkshere": "Spisak svih viki stranica koje vode ovde",
+       "tooltip-t-recentchangeslinked": "Skorašnje izmene na stranicama koje su povezane sa ovom stranicom",
        "tooltip-feed-rss": "RSS dovod ove stranice",
        "tooltip-feed-atom": "Atom dovod ove stranice",
-       "tooltip-t-contributions": "Spisak doprinosa {{GENDER:$1|ovog korisnika|ove korisnice}}",
+       "tooltip-t-contributions": "Spisak doprinosa {{GENDER:$1|ovog korisnika|ove korisnice|ovog korisnika}}",
        "tooltip-t-emailuser": "Pošaljite imejl {{GENDER:$1|ovom korisniku|ovoj korisnici}}",
        "tooltip-t-info": "Više informacija o ovoj stranici",
-       "tooltip-t-upload": "Otpremi datoteke",
+       "tooltip-t-upload": "Otpremite datoteke",
        "tooltip-t-specialpages": "Spisak svih posebnih stranica",
        "tooltip-t-print": "Verzija ove stranice za štampanje",
-       "tooltip-t-permalink": "Stalna veza ka ovoj izmeni stranice",
+       "tooltip-t-permalink": "Trajna veza ka ovoj izmeni stranice",
        "tooltip-ca-nstab-main": "Pogledajte stranicu sa sadržajem",
        "tooltip-ca-nstab-user": "Pogledajte korisničku stranicu",
-       "tooltip-ca-nstab-media": "Pogledajte multimedijalnu datoteku",
+       "tooltip-ca-nstab-media": "Pogledajte medijsku stranicu",
        "tooltip-ca-nstab-special": "Ovo je posebna stranica. Ne možete je menjati.",
        "tooltip-ca-nstab-project": "Pogledajte stranicu projekta",
-       "tooltip-ca-nstab-image": "Prikaži stranu datoteke",
+       "tooltip-ca-nstab-image": "Pogledajte stranicu datoteke",
        "tooltip-ca-nstab-mediawiki": "Pogledajte sistemsku poruku",
        "tooltip-ca-nstab-template": "Pogledajte šablon",
        "tooltip-ca-nstab-help": "Pogledajte stranicu za pomoć",
-       "tooltip-ca-nstab-category": "Pogledajte stranicu kategorija",
+       "tooltip-ca-nstab-category": "Pogledajte stranicu kategorije",
        "tooltip-minoredit": "Označite ovu izmenu kao manju",
        "tooltip-save": "Sačuvajte svoje izmene",
-       "tooltip-publish": "Objavi svoje izmene",
+       "tooltip-publish": "Objavite svoje izmene",
        "tooltip-preview": "Pregledajte svoje izmene. Koristite ovo dugme pre čuvanja.",
        "tooltip-diff": "Pogledajte koje izmene ste napravili na tekstu",
        "tooltip-compareselectedversions": "Pogledajte razlike između dve izabrane izmene ove stranice.",
        "tooltip-watch": "Dodajte ovu stranicu na svoj spisak nadgledanja",
-       "tooltip-watchlistedit-normal-submit": "Ukloni naslove",
+       "tooltip-watchlistedit-normal-submit": "Uklonite naslove",
        "tooltip-watchlistedit-raw-submit": "Ažuriraj spisak",
        "tooltip-recreate": "Ponovo napravite stranicu iako je obrisana",
        "tooltip-upload": "Započnite otpremanje",
-       "tooltip-rollback": "„Vrati“ vraća izmene poslednjeg korisnika jednim klikom",
-       "tooltip-undo": "Poništava ovu izmenu i otvara obrazac za uređivanje.",
-       "tooltip-preferences-save": "Sačuvaj postavke",
+       "tooltip-rollback": "„Vrati“ vraća izmene poslednjeg doprinosioca ove stranice jednim klikom",
+       "tooltip-undo": "„Poništi” vraća ovu izmenu i otvara obrazac za uređivanje u pretpreglednom modu. Dozvoljava dodavanje razloga u opisu izmene.",
+       "tooltip-preferences-save": "Sačuvaj podešavanja",
        "tooltip-summary": "Unesite kratak opis",
        "interlanguage-link-title": "$1 — $2",
        "interlanguage-link-title-nonlang": "$1 — $2",
        "spam_reverting": "Vraćam na poslednju izmenu koja ne sadrži veze do $1",
        "spam_blanking": "Sve izmene sadrže veze do $1. Čistim",
        "spam_deleting": "Sve izmene sadrže veze do $1. Brišem",
-       "simpleantispam-label": "Anti-spama provera. \n<strong>Ne</strong> popunjavaj ovo unutra!",
-       "pageinfo-title": "Podaci o „$1“",
+       "simpleantispam-label": "Anti-spam provera. \n<strong>Ne</strong> popunjavaj ovo unutra!",
+       "pageinfo-title": "Informacije za „$1“",
        "pageinfo-not-current": "Nažalost, nemoguće je pribaviti ove podatke za starije izmene.",
-       "pageinfo-header-basic": "Osnovni podaci",
+       "pageinfo-header-basic": "Osnovne informacije",
        "pageinfo-header-edits": "Istorija izmena",
        "pageinfo-header-restrictions": "Zaštita stranice",
        "pageinfo-header-properties": "Svojstva stranice",
        "pageinfo-length": "Dužina stranice (u bajtovima)",
        "pageinfo-article-id": "ID stranice",
        "pageinfo-language": "Jezik sadržaja stranice",
-       "pageinfo-content-model": "Model sadržaj stranice",
+       "pageinfo-language-change": "promeni",
+       "pageinfo-content-model": "Model sadržaja stranice",
+       "pageinfo-content-model-change": "promeni",
        "pageinfo-robot-policy": "Indeksiranje od strane robota",
        "pageinfo-robot-index": "Dozvoljeno",
        "pageinfo-robot-noindex": "Nije dozvoljeno",
-       "pageinfo-watchers": "Broj nadgledača stranicе",
+       "pageinfo-watchers": "Broj nadgledača stranice",
        "pageinfo-visiting-watchers": "Broj nadgledača stranice koji su posetili skorašnje izmene",
-       "pageinfo-few-watchers": "Manje od $1 {{PLURAL:$1|pratioca|pratilaca}}",
+       "pageinfo-few-watchers": "Manje od $1 {{PLURAL:$1|nadgledača}}",
        "pageinfo-redirects-name": "Broj preusmerenja na ovu stranicu",
-       "pageinfo-subpages-name": "Podstranice ove stranice",
+       "pageinfo-redirects-value": "$1",
+       "pageinfo-subpages-name": "Broj podstranica ove stranice",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|preusmerenje|preusmerenja|preusmerenja}}; $3 {{PLURAL:$3|nepreusmerenje|nepreusmerenja|nepreusmerenja}})",
        "pageinfo-firstuser": "Autor stranice",
        "pageinfo-firsttime": "Datum stvaranja stranice",
        "pageinfo-recent-edits": "Broj skorašnjih izmena (u poslednjih $1)",
        "pageinfo-recent-authors": "Broj skorašnjih zasebnih autora",
        "pageinfo-magic-words": "{{PLURAL:$1|Magična reč|Magične reči}} ($1)",
-       "pageinfo-hidden-categories": "{{PLURAL:$1|Skrivena kategorija|Skrivene kategorije}} ($1)",
+       "pageinfo-hidden-categories": "{{PLURAL:$1|Sakrivena kategorija|Sakrivene kategorije}} ($1)",
        "pageinfo-templates": "{{PLURAL:$1|Uključeni šablon|Uključeni šabloni}} ($1)",
        "pageinfo-transclusions": "{{PLURAL:$1|Stranica|Stranice}} uključene u ($1)",
-       "pageinfo-toolboxlink": "Podaci o stranici",
+       "pageinfo-toolboxlink": "Informacije o stranici",
        "pageinfo-redirectsto": "Preusmerava na",
        "pageinfo-redirectsto-info": "podaci",
        "pageinfo-contentpage": "Računa se kao stranica sa sadržajem",
        "pageinfo-protect-cascading-yes": "Da",
        "pageinfo-protect-cascading-from": "Stranice sa prenosivom zaštitom od",
        "pageinfo-category-info": "Informacije o kategoriji",
+       "pageinfo-category-total": "Ukupno",
        "pageinfo-category-pages": "Broj stranica",
        "pageinfo-category-subcats": "Broj potkategorija",
        "pageinfo-category-files": "Broj datoteka",
+       "pageinfo-user-id": "ID korisnika",
+       "pageinfo-file-hash": "Hash vrednost",
        "markaspatrolleddiff": "Označi kao patrolirano",
        "markaspatrolledtext": "Označi stranicu kao patroliranu",
        "markaspatrolledtext-file": "Označi ovu verziju datoteke kao patroliranu",
        "markedaspatrolledtext": "Izabrana izmena stranice [[:$1]] označena je kao patrolirana.",
        "rcpatroldisabled": "Patroliranje skorašnjih izmena je onemogućeno",
        "rcpatroldisabledtext": "Patroliranje skorašnjih izmena je onemogućeno.",
-       "markedaspatrollederror": "Ne mogu da označim kao patrolirano",
+       "markedaspatrollederror": "Ne mogu da označim kao patrolirano.",
        "markedaspatrollederrortext": "Morate izabrati izmenu da biste je označili kao patroliranu.",
        "markedaspatrollederror-noautopatrol": "Ne možete da označite svoje izmene kao patrolirane.",
        "markedaspatrollednotify": "Ova izmena na stranici „$1” označena je kao patrolirana.",
        "markedaspatrollederrornotify": "Označavanje ove izmene patroliranom nije uspelo.",
        "patrol-log-page": "Dnevnik patroliranja",
        "patrol-log-header": "Ovo je dnevnik patroliranih izmena.",
-       "log-show-hide-patrol": "$1 dnevnik patroliranja",
-       "log-show-hide-tag": "$1 dnevnik oznaka",
+       "confirm-markpatrolled-button": "U redu",
+       "confirm-markpatrolled-top": "Označiti izmenu $3 stranice $2 patroliranom?",
        "deletedrevision": "Obrisana stara izmena $1.",
        "filedeleteerror-short": "Greška pri brisanju datoteke: $1",
        "filedeleteerror-long": "Došlo je do grešaka pri brisanju datoteke:\n\n$1",
        "filedelete-archive-read-only": "Server ne može da piše po skladišnoj fascikli ($1).",
        "previousdiff": "← Starija izmena",
        "nextdiff": "Novija izmena →",
-       "mediawarning": "<strong>Upozorenje:</strong> ova vrsta datoteke može sadržati štetan kod.\nAko ga pokrenete, Vaš računar može biti ugrožen.",
+       "mediawarning": "<strong>Upozorenje:</strong> ova vrsta datoteke može sadržati štetan kôd.\nAko ga pokrenete, Vaš računar može biti ugrožen.",
        "imagemaxsize": "Ograničenje veličine slike:<br /><em>(na stranicama za opis datoteka)</em>",
        "thumbsize": "Veličina minijature:",
        "widthheight": "$1 × $2",
        "svg-long-desc": "SVG datoteka, nominalno $1 × $2 piksela, veličina: $3",
        "svg-long-desc-animated": "Animirana SVG datoteka, nominalno: $1 × $2 piksela, veličina: $3",
        "svg-long-error": "Neispravna SVG datoteka: $1",
-       "show-big-image": "Puna veličina",
+       "show-big-image": "Izvorna datoteka",
        "show-big-image-preview": "Veličina ovog prikaza: $1.",
        "show-big-image-preview-differ": "Veličina $3 pregleda za ovu $2 datoteku je $1.",
-       "show-big-image-other": "{{PLURAL:$2|Druga rezolucija|Druge rezolucije}}: $1.",
+       "show-big-image-other": "$2 {{PLURAL:$2|druga rezolucija|druge rezolucije|drugih rezolucija}}: $1.",
        "show-big-image-size": "$1 × $2 piksela",
        "file-info-gif-looped": "petlja",
        "file-info-gif-frames": "$1 {{PLURAL:$1|kadar|kadra|kadrova}}",
        "newimages-summary": "Ova posebna stranica prikazuje poslednje otpremljene datoteke.",
        "newimages-legend": "Filter",
        "newimages-label": "Naziv datoteke (ili njen deo):",
+       "newimages-user": "IP adresa ili korisničko ime",
+       "newimages-newbies": "Prikaži samo doprinose novih korisnika",
        "newimages-showbots": "Prikaži datoteke koje su poslali botovi",
        "newimages-hidepatrolled": "Sakrij patrolirana otpremanja",
+       "newimages-mediatype": "Vrsta datoteke:",
        "noimages": "Nema ništa.",
+       "gallery-slideshow-toggle": "minijature",
        "ilsubmit": "Pretraži",
        "bydate": "po datumu",
        "sp-newimages-showfrom": "prikaži nove datoteke počevši od $1, $2",
        "seconds-abbrev": "$1 s",
        "minutes-abbrev": "$1 m",
        "hours-abbrev": "$1 č",
-       "days-abbrev": "$1 d",
+       "days-abbrev": "$1 d.",
        "seconds": "{{PLURAL:$1|$1 sekunda|$1 sekunda|$1 sekundi}}",
        "minutes": "{{PLURAL:$1|$1 minut|$1 minuta|$1 minuta}}",
        "hours": "{{PLURAL:$1|$1 sat|$1 sata|$1 sati}}",
        "variantname-gan": "gan",
        "variantname-sr-ec": "Ćirilica",
        "variantname-sr-el": "Latinica",
-       "variantname-sr": "Ћир./lat.",
+       "variantname-sr": "Ćir./lat.",
        "variantname-kk-kz": "kk-kz",
        "variantname-kk-tr": "kk-tr",
        "variantname-kk-cn": "kk-cn",
        "variantname-shi-latn": "shi-Latn",
        "variantname-shi": "shi",
        "metadata": "Metapodaci",
-       "metadata-help": "Ova datoteka sadrži dodatne podatke koji verovatno dolaze od digitalnog fotoaparata ili skenera.\nAko je prvobitno stanje datoteke promenjeno, moguće je da neki detalji ne opisuju izmenjenu datoteku.",
+       "metadata-help": "Ova datoteka sadrži dodatne podatke, koji verovatno dolaze od digitalnog fotoaparata ili skenera korišćenog za digitalizaciju.\nAko je prvobitno stanje datoteke promenjeno, moguće je da neki detalji ne opisuju izmenjenu datoteku u potpunosti.",
        "metadata-expand": "Prikaži detalje",
        "metadata-collapse": "Sakrij detalje",
        "metadata-fields": "Polja za metapodatke slike navedena u ovoj poruci će biti uključena na stranici za slike kada se skupi tabela metapodataka. Ostala polja će biti sakrivena po podrazumevanim postavkama.\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-keywords": "Ključne reči",
        "exif-worldregioncreated": "Oblast sveta gde je slikana fotografija",
        "exif-countrycreated": "Zemlja gde je slikana fotografija",
-       "exif-countrycodecreated": "Kod zemlje gde je slika napravljena",
+       "exif-countrycodecreated": "Kôd zemlje gde je slika napravljena",
        "exif-provinceorstatecreated": "Pokrajina ili država gde je slikana fotografija",
        "exif-citycreated": "Grad gde je slikana fotografija",
        "exif-sublocationcreated": "Oblast grada gde je slikana fotografija",
        "exif-worldregiondest": "Prikazana oblast sveta",
        "exif-countrydest": "Prikazana zemlja",
-       "exif-countrycodedest": "Kod prikazane zemlje",
+       "exif-countrycodedest": "Kôd prikazane zemlje",
        "exif-provinceorstatedest": "Prikazana pokrajina ili država",
        "exif-citydest": "Prikazani grad",
        "exif-sublocationdest": "Prikazana oblast grada",
        "exif-urgency": "Hitnost",
        "exif-fixtureidentifier": "Naziv rubrike",
        "exif-locationdest": "Prikazana lokacija",
-       "exif-locationdestcode": "Kod prikazanog mesta",
+       "exif-locationdestcode": "Kôd prikazanog mesta",
        "exif-objectcycle": "Doba dana za koji je medij namenjen",
        "exif-contact": "Podaci za kontakt",
        "exif-writer": "Pisac",
        "exif-iimsupplementalcategory": "Dopunske kategorije",
        "exif-datetimeexpires": "Ne koristi nakon",
        "exif-datetimereleased": "Objavljeno",
-       "exif-originaltransmissionref": "Izvorni prenos koda lokacije",
+       "exif-originaltransmissionref": "Izvorni prenos kôda lokacije",
        "exif-identifier": "Naznaka",
        "exif-lens": "Korišćeni objektiv",
        "exif-serialnumber": "Serijski broj kamere",
        "exif-contentwarning": "Upozorenje o sadržaju",
        "exif-giffilecomment": "Komentar na datoteku GIF",
        "exif-intellectualgenre": "Vrsta stavke",
-       "exif-subjectnewscode": "Kod predmeta",
-       "exif-scenecode": "IPTC kod scene",
+       "exif-subjectnewscode": "Kôd predmeta",
+       "exif-scenecode": "IPTC kôd scene",
        "exif-event": "Prikazani događaj",
        "exif-organisationinimage": "Prikazana organizacija",
        "exif-personinimage": "Prikazana osoba",
        "exif-compression-34712": "JPEG2000",
        "exif-copyrighted-true": "Zaštićeno autorskim pravom",
        "exif-copyrighted-false": "Nije definisan",
+       "exif-photometricinterpretation-0": "Crno-belo (bela je 0)",
+       "exif-photometricinterpretation-1": "Crno-belo (crna je 0)",
        "exif-photometricinterpretation-2": "RGB",
+       "exif-photometricinterpretation-3": "Paleta",
        "exif-photometricinterpretation-6": "YCbCr",
        "exif-unknowndate": "Nepoznat datum",
        "exif-orientation-1": "Normalno",
        "monthsall": "sve",
        "confirmemail": "Potvrda imejl adrese",
        "confirmemail_noemail": "Niste uneli ispravnu imejl adresu u [[Special:Preferences|podešavanjima]].",
-       "confirmemail_text": "{{SITENAME}} zahteva da potvrdite imejl adresu pre nego što počnete da koristite mogućnosti imejla.\nKliknite na dugme ispod za slanje poruke na vašu adresu.\nU poruci će se nalaziti veza s potvrdnim kodom;\nunesite je u pregledač da biste potvrdili da je vaša imejl adresa ispravna.",
-       "confirmemail_pending": "Potvrdni kod vam je već poslat. Ako ste upravo otvorili nalog, onda verovatno treba da sačekate nekoliko minuta da pristigne, pre nego što ponovo zatražite novi kod.",
-       "confirmemail_send": "Pošalji potvrdni kod",
+       "confirmemail_text": "{{SITENAME}} zahteva da potvrdite imejl adresu pre nego što počnete da koristite mogućnosti imejla.\nKliknite na dugme ispod za slanje poruke na vašu adresu.\nU poruci će se nalaziti veza s potvrdnim kôdom;\nunesite je u pregledač da biste potvrdili da je vaša imejl adresa ispravna.",
+       "confirmemail_pending": "Potvrdni kôd vam je već poslat. Ako ste upravo otvorili nalog, onda verovatno treba da sačekate nekoliko minuta da pristigne, pre nego što ponovo zatražite novi kôd.",
+       "confirmemail_send": "Pošalji potvrdni kôd",
        "confirmemail_sent": "Potvrdna poruka je poslata.",
-       "confirmemail_oncreate": "Poslat je potvrdni kod na vašu imejl adresu.\nOvaj kod nije potreban za prijavljivanje, ali vam treba da biste uključili mogućnosti imejla na vikiju.",
+       "confirmemail_oncreate": "Poslat je potvrdni kôd na vašu imejl adresu.\nOvaj kôd nije potreban za prijavljivanje, ali vam treba da biste uključili mogućnosti imejla na vikiju.",
        "confirmemail_sendfailed": "{{SITENAME}} ne može da pošalje imejl potvrdu.\nProverite da li je imejl adresa pravilno napisana.\n\nGreška: $1",
        "confirmemail_invalid": "Potvrdni kod je neispravan. Verovatno je istekao.",
        "confirmemail_needlogin": "Morate biti $1 da biste potvrdili imejl adresu.",
        "confirmemail_body_set": "Neko, verovatno vi, sa IP adrese $1,\npromenio je imejl adresu naloga „$2“ u ovu adresu na {{SITENAME}}.\n\nDa bismo potvrdili da ovaj nalog stvarno pripada vama i ponovo aktivirali\nmogućnosti imejla na {{SITENAME}}, otvorite sledeću vezu u pregledaču:\n\n$3\n\nAko nalog *ne* pripada vama, pratite sledeću vezu da otkažete potvrdu imejl adrese:\n\n$5\n\nOvaj potvrdni kod ističe $4.",
        "confirmemail_invalidated": "Potvrda imejl adrese je otkazana",
        "invalidateemail": "Otkazivanje potvrde imejla",
+       "notificationemail_body_changed": "Neko, verovatno Vi je promenio imejl adresu naloga iz $2“ u „$3“ sa IP adrese $1 na sajtu {{SITENAME}}.\n\nAko ovo niste bili Vi, odmah obavestite administratore sajta.",
+       "notificationemail_body_removed": "Neko, verovatno Vi sa IP adrese $1 je uklonio imejl adresu za nalog „$2“ na {{SITENAME}}.\n\n\nAko ovo niste bili Vi, odmah obavestite administratore sajta.",
        "scarytranscludedisabled": "[Međuviki uključivanje šablona je onemogućeno]",
        "scarytranscludefailed": "[Dobavljanje šablona za $1 nije uspelo]",
        "scarytranscludefailed-httpstatus": "[Ne mogu da preuzmem šablon $1: HTTP $2]",
        "confirmrecreate": "{{GENDER:$1|Korisnik|Korisnica}} [[User:$1|$1]] ([[User talk:$1|razgovor]]) je {{GENDER:$1|obrisao|obrisala}} ovu stranicu nakon što ste počeli da je uređujete iz sledećeg razloga:\n: <em>$2</em>\nPotvrdite da stvarno želite da napravite stranicu.",
        "confirmrecreate-noreason": "{{GENDER:$1|Korisnik|Korisnica}} [[User:$1|$1]] ([[User talk:$1|razgovor]]) je {{GENDER:$1|obrisao|obrisala}} ovu stranicu nakon što ste počeli da je uređujete. Potvrdite da stvarno želite da ponovo napravite ovu stranicu.",
        "recreate": "Ponovo napravi",
-       "unit-pixel": "px",
+       "unit-pixel": "p",
+       "confirm-purge-title": "Osveži ovu stranicu",
        "confirm_purge_button": "U redu",
        "confirm-purge-top": "Očistiti privremenu memoriju ove stranice?",
        "confirm-purge-bottom": "Ova radnja čisti privremenu memoriju i prikazuje najnoviju izmenu.",
        "confirm-watch-top": "Dodati ovu stranicu u spisak nadgledanja?",
        "confirm-unwatch-button": "U redu",
        "confirm-unwatch-top": "Ukloniti ovu stranicu sa spiska nadgledanja?",
+       "confirm-rollback-button": "U redu",
+       "confirm-rollback-top": "Vrati izmene na ovoj stranici?",
        "semicolon-separator": ";&#32;",
        "comma-separator": ",&#32;",
        "colon-separator": ":&#32;",
        "autosumm-blank": "Uklonjen celokupan sadržaj stranice",
        "autosumm-replace": "Zamenjen sadržaj stranice sa „$1“",
        "autoredircomment": "Preusmerenje na [[$1]]",
+       "autosumm-removed-redirect": "Uklonjeno preusmerenje ka [[$1]]",
+       "autosumm-changed-redirect-target": "Promenjena odredišna stranica u preusmerenju iz [[$1]] u [[$2]]",
        "autosumm-new": "Nova stranica: $1",
        "autosumm-newblank": "Napravljena prazna stranica",
        "size-bytes": "$1 {{PLURAL:$1|bajt|bajta|bajtova}}",
        "watchlistedit-clear-removed": "{{PLURAL:$1|1 naslov je uklonjen|$1 naslova su uklonjena|$1 naslova je uklonjeno}}:",
        "watchlistedit-too-many": "Ima previše stranica za prikaz ovde.",
        "watchlisttools-clear": "isprazni spisak nadgledanja",
-       "watchlisttools-view": "Prikaži srodne izmene",
+       "watchlisttools-view": "prikaži srodne izmene",
        "watchlisttools-edit": "prikaži i uredi spisak nadgledanja",
        "watchlisttools-raw": "izmeni sirov spisak nadgledanja",
        "iranian-calendar-m1": "Farvardin",
        "hebrew-calendar-m6": "Adar",
        "hebrew-calendar-m6a": "Adar I",
        "hebrew-calendar-m6b": "Adar II",
-       "hebrew-calendar-m7": "Nisane",
+       "hebrew-calendar-m7": "Nisan",
        "hebrew-calendar-m8": "Ijar",
        "hebrew-calendar-m9": "Sivan",
        "hebrew-calendar-m10": "Tamuz",
        "hebrew-calendar-m6-gen": "Adar",
        "hebrew-calendar-m6a-gen": "Adar I",
        "hebrew-calendar-m6b-gen": "Adar II",
-       "hebrew-calendar-m7-gen": "Nisane",
+       "hebrew-calendar-m7-gen": "Nisan",
        "hebrew-calendar-m8-gen": "Ijar",
        "hebrew-calendar-m9-gen": "Sivan",
        "hebrew-calendar-m10-gen": "Tamuz",
        "hebrew-calendar-m12-gen": "Elul",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|razgovor]])",
        "timezone-utc": "UTC",
+       "timezone-local": "Lokalno",
        "duplicate-defaultsort": "<strong>Upozorenje:</strong> Podrazumevani ključ svrstavanja „$2“ menja raniji podrazumevani ključ svrstavanja „$1“.",
        "duplicate-displaytitle": "<strong>Upozorenje:</strong> naslov za prikaz „$2“ zameniće postojeći „$1“.",
        "restricted-displaytitle": "<strong>Upozorenje:</strong> Naslov za prikaz „$1” je ignorisan pošto nije ekvivalentan stvarnom naslovu stranice.",
        "version-specialpages": "Posebne stranice",
        "version-parserhooks": "Kuke raščlanjivača",
        "version-variables": "Promenljive",
+       "version-editors": "Za uređivanje",
        "version-antispam": "Sprečavanje nepoželjnih poruka",
        "version-api": "API",
        "version-other": "Drugo",
        "version-ext-license": "Licenca",
        "version-ext-colheader-name": "Ekstenzija",
        "version-skin-colheader-name": "Tema",
-       "version-ext-colheader-version": "Verzija",
+       "version-ext-colheader-version": "Izdanje",
        "version-ext-colheader-license": "Licenca",
        "version-ext-colheader-description": "Opis",
        "version-ext-colheader-credits": "Autori",
        "version-license-title": "Licenca za $1",
+       "version-license-not-found": "Za ovu ekstenziju nije nađena informacija o licenci.",
+       "version-credits-title": "Zasluge za $1",
+       "version-credits-not-found": "Za ovu ekstenziju nije nađena informacija o zaslugama.",
        "version-poweredby-credits": "Ovaj viki pokreće '''[https://www.mediawiki.org/ Medijaviki]''', autorska prava © 2001-$1 $2.",
        "version-poweredby-others": "ostali",
        "version-poweredby-translators": "translatewiki.net prevodioci",
        "version-credits-summary": "Želeli bismo da zahvalimo sledećim ljudima na njihovom doprinosu [[Special:Version|Medijavikiji]].",
-       "version-license-info": "Medijaviki je slobodan softver možete ga redistribuirati i/ili modifikovati pod uslovima GNU-ove opšte javne licence verzija 2 ili svake sledeće koju objavi Zadužbina za slobodan softver.\n\nMedijaviki se redistribuira u nadi da će biti od koristi, ali BEZ IKAKVE GARANCIJE čak i bez PODRAZUMEVANE GARANCIJE FUNKCIONALNOSTI ili PRIKLADNOSTI ZA ODREĐENEU NAMENU. Pogledajte GNU-ovu opštu javnu licencu za više informacija.\n\nTrebalo bi da ste dobili [{{SERVER}}{{SCRIPTPATH}}/COPYING primerak GNU-ove opšte javne licence] zajedno sa ovim programom. Ako niste, pišite na Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA ili [//www.gnu.org/licenses/old-licenses/gpl-2.0.html pročitajte ovde].",
+       "version-license-info": "Medijaviki je slobodan softver možete ga redistribuirati i/ili modifikovati pod uslovima GNU-ove opšte javne licence verzija 2 ili svake sledeće koju objavi Zadužbina za slobodan softver.\n\nMedijaviki se redistribuira u nadi da će biti od koristi, ali <em>BEZ IKAKVE GARANCIJE</em> čak i bez <strong>PODRAZUMEVANE GARANCIJE FUNKCIONALNOSTI</strong> ili <strong>PRIKLADNOSTI ZA ODREĐENEU NAMENU</strong>. Pogledajte GNU-ovu opštu javnu licencu za više informacija.\n\nTrebalo bi da ste dobili [{{SERVER}}{{SCRIPTPATH}}/COPYING primerak GNU-ove opšte javne licence] zajedno sa ovim programom. Ako niste, pišite na Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA ili [//www.gnu.org/licenses/old-licenses/gpl-2.0.html pročitajte ovde].",
        "version-software": "Instalirani softver",
        "version-software-product": "Proizvod",
-       "version-software-version": "Verzija",
+       "version-software-version": "Izdanje",
        "version-entrypoints": "Adrese ulazne tačke",
        "version-entrypoints-header-entrypoint": "Ulazna tačka",
        "version-entrypoints-header-url": "Adresa",
        "version-libraries-license": "Licenca",
        "version-libraries-description": "Opis",
        "version-libraries-authors": "Autori",
-       "redirect": "Preusmerenje na datoteku, korisnika, stranicu ili izmenu",
+       "redirect": "Preusmerenje na datoteku, korisnika, stranicu, izmenu ili dnevnik (ID)",
+       "redirect-summary": "Ova posebna stranica preusmerava do datoteke (s datim imenom datoteke), stranice (s datim ID-om izmene ili ID-om stranice), korisničke stranice (s datim numeričkim korisničkim ID-om), ili unosa u dnevniku (s datim dnevničkim ID-om). Upotreba: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], or [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "Idi",
        "redirect-lookup": "Tip vrednosti:",
        "redirect-value": "Vrednost:",
        "redirect-user": "Korisnički ID",
        "redirect-page": "ID stranice",
-       "redirect-revision": "Verzija stranice",
+       "redirect-revision": "Izmena stranice",
        "redirect-file": "Naziv datoteke",
-       "redirect-not-exists": "Vrednost nije pronađen",
-       "fileduplicatesearch": "Pretraga duplikata",
+       "redirect-logid": "ID dnevnika",
+       "redirect-not-exists": "Vrednost nije pronađena",
+       "fileduplicatesearch": "Pretraži duplikate",
        "fileduplicatesearch-summary": "Pretraga dupliranih datoteka prema heš vrednosti.",
        "fileduplicatesearch-filename": "Naziv datoteke:",
        "fileduplicatesearch-submit": "Pretraži",
        "specialpages-group-highuse": "Najčešće korišćene stranice",
        "specialpages-group-pages": "Spiskovi stranica",
        "specialpages-group-pagetools": "Alatke",
-       "specialpages-group-wiki": "Podaci i alati",
+       "specialpages-group-wiki": "Podaci i alatke",
        "specialpages-group-redirects": "Preusmeravanje posebnih stranica",
        "specialpages-group-spam": "Alatke protiv nepoželjnih poruka",
-       "specialpages-group-developer": "Programerski alati",
+       "specialpages-group-developer": "Programerske alatke",
        "blankpage": "Prazna stranica",
        "intentionallyblankpage": "Ova stranica je namerno ostavljena praznom.",
        "external_image_whitelist": " #Ostavite ovaj red onakvim kakav jeste<pre>\n#Ispod dodajte odlomke regularnih izraza (samo deo koji se nalazi između //)\n#Oni će biti upoređeni s adresama spoljašnjih slika\n#One koje se poklapaju biće prikazane kao slike, a preostale kao veze do slika\n#Redovi koji počinju s tarabom se smatraju komentarima\n#Svi unosi su osetljivi na mala i velika slova\n\n#Dodajte sve odlomke regularnih izraza iznad ovog reda. Ovaj red ne dirajte</pre>",
        "tags": "Važeće oznake izmena",
        "tag-filter": "Filter za [[Special:Tags|oznake]]:",
        "tag-filter-submit": "Filtriraj",
-       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Oznaka|Oznake}}]]: $2)",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|oznaka|oznake}}]]: $2)",
+       "tag-mw-contentmodelchange": "promena modela sadržaja",
        "tag-mw-contentmodelchange-description": "Izmene koje menjaju model sadržaja stranice",
-       "tag-mw-rollback": "Vraćanje",
+       "tag-mw-new-redirect": "novo preusmerenje",
+       "tag-mw-new-redirect-description": "Izmene kojima je napravljeno novo preusmerenje ili je stranica izmenjena da bude preusmerenje",
+       "tag-mw-removed-redirect": "uklonjeno preusmerenje",
+       "tag-mw-removed-redirect-description": "Izmene koje menjaju postojeće preusmerenje u stranicu bez preusmerenja",
+       "tag-mw-changed-redirect-target": "promenjeno odredište preusmerenja",
+       "tag-mw-changed-redirect-target-description": "Izmene koje menjaju odredište preusmerenja",
+       "tag-mw-blank": "stranica ispražnjena",
+       "tag-mw-blank-description": "Izmene koje brišu čitav sadržaj stranice",
+       "tag-mw-replace": "uklonjena većina teksta",
+       "tag-mw-replace-description": "Izmene koje uklanjaju više od 90% sadržaja stranice",
+       "tag-mw-rollback": "vraćanje",
+       "tag-mw-rollback-description": "Izmene koje vraćaju stranicu na prethodne izmene",
+       "tag-mw-undo": "poništenje",
+       "tag-mw-undo-description": "Izmene koje poništavaju prethodne izmene",
        "tags-title": "Oznake",
        "tags-intro": "Na ovoj stranici je naveden spisak oznaka s kojima program može da označi izmene i njegovo značenje.",
        "tags-tag": "Naziv oznake",
        "tags-edit": "uredi",
        "tags-delete": "obriši",
        "tags-activate": "aktiviraj",
-       "tags-deactivate": "dekativiraj",
+       "tags-deactivate": "deaktiviraj",
        "tags-hitcount": "$1 {{PLURAL:$1|izmena|izmene|izmena}}",
        "tags-manage-no-permission": "Nemate dozvolu da menjate oznake.",
        "tags-create-heading": "Nova oznaka",
        "tags-delete-reason": "Razlog:",
        "tags-delete-submit": "Nepovratno obriši ovu oznaku",
        "tags-delete-not-found": "Oznaka „$1“ ne postoji.",
+       "tags-delete-too-many-uses": "Oznaka „$1” je primenjena na više od $2 {{PLURAL:$2|izmene|izmena}}, što znači da se ne može obrisati.",
+       "tags-delete-no-permission": "Nemate dozvolu da brišete oznake za izmenu.",
        "tags-activate-title": "Aktiviranje oznaka",
        "tags-activate-question": "Aktivirate oznaku „$1“.",
        "tags-activate-reason": "Razlog:",
        "tags-deactivate-reason": "Razlog:",
        "tags-deactivate-not-allowed": "Nije moguće deaktivirati oznaku „$1“.",
        "tags-deactivate-submit": "Dekativiraj",
+       "tags-update-no-permission": "Nemate dozvolu za dodavanje ili uklanjanje oznake izmena iz zasebnih izmena ili unosa u dnevniku.",
+       "tags-update-blocked": "Ne možete dodavati niti uklanjati oznake izmena dok {{GENDER:$1|ste}} blokirani.",
+       "tags-update-add-not-allowed-one": "Nije dozvoljeno da se oznaka „$1” dodaje ručno.",
        "tags-edit-title": "Uredi oznake",
        "tags-edit-manage-link": "Upravljaj oznakama",
        "tags-edit-existing-tags": "Postojeće oznake:",
+       "tags-edit-existing-tags-none": "<em>Nema</em>",
        "tags-edit-new-tags": "Nove oznake:",
+       "tags-edit-add": "Dodaj ove oznake:",
+       "tags-edit-remove": "Ukloni ove oznake:",
+       "tags-edit-remove-all-tags": "(ukloni sve oznake)",
+       "tags-edit-chosen-placeholder": "Izaberi neke oznake",
+       "tags-edit-chosen-no-results": "Odgovarajuće oznake nisu pronađene",
        "tags-edit-reason": "Razlog:",
+       "tags-edit-success": "Izmene su primenjene.",
+       "tags-edit-failure": "Ne mogu da primenim izmene:\n$1",
+       "tags-edit-nooldid-title": "Neispravna odredišna izmena",
+       "tags-edit-none-selected": "Izaberite bar jednu oznaku koju treba dodati ili ukloniti.",
        "comparepages": "Upoređivanje stranica",
        "compare-page1": "Stranica 1",
        "compare-page2": "Stranica 2",
        "compare-invalid-title": "Navedeni naslov je neispravan.",
        "compare-title-not-exists": "Navedeni naslov ne postoji.",
        "compare-revision-not-exists": "Navedena izmena ne postoji.",
-       "diff-form": "'''forma'''",
-       "permanentlink": "Stalna veza",
+       "diff-form": "Razlike",
+       "diff-form-oldid": "ID stare izmene (neobavezno)",
+       "diff-form-revid": "ID izmene ili razlike",
+       "diff-form-submit": "Prikaži razlike",
+       "permanentlink": "Trajna veza",
+       "permanentlink-revid": "ID izmene",
+       "permanentlink-submit": "Idi na izmenu",
        "dberr-problems": "Došlo je do tehničkih problema.",
        "dberr-again": "Sačekajte nekoliko minuta i ponovo učitajte stranicu.",
        "dberr-info": "(Ne mogu pristupiti bazi podataka: $1)",
        "htmlform-int-toolow": "Navedena vrednost je ispod minimuma od $1",
        "htmlform-int-toohigh": "Navedena vrednost je iznad maksimuma od $1",
        "htmlform-required": "Ova vrednost je obavezna.",
-       "htmlform-submit": "Pošalji",
+       "htmlform-submit": "Postavi",
        "htmlform-reset": "Vrati izmene",
        "htmlform-selectorother-other": "Drugo",
        "htmlform-no": "Ne",
        "htmlform-cloner-create": "Dodaj još",
        "htmlform-cloner-delete": "Ukloni",
        "htmlform-cloner-required": "Bar jedna vrednost je potrebna.",
+       "htmlform-date-placeholder": "GGGG-MM-DD",
+       "htmlform-time-placeholder": "ČČ:MM:SS",
+       "htmlform-datetime-placeholder": "GGGG-MM-DD ČČ:MM:SS",
        "htmlform-title-badnamespace": "[[:$1]] nije u imenskom prostoru „{{ns:$2}}“.",
+       "htmlform-title-not-creatable": "Stranica „$1“ se ne može napraviti",
        "htmlform-title-not-exists": "$1 ne postoji.",
        "htmlform-user-not-exists": "<strong>$1</strong> ne postoji.",
        "htmlform-user-not-valid": "<strong>$1</strong> nije ispravno korisničko ime.",
        "logentry-delete-delete": "$1 je {{GENDER:$2|obrisao|obrisala}} stranicu $3",
        "logentry-delete-delete_redir": "$1 je {{GENDER:$2|obrisao|obrisala}} preusmerenje $3 prepisivanjem",
-       "logentry-delete-restore": "$1 je {{GENDER:$2|vratio|vratila}} stranicu $3",
+       "logentry-delete-restore": "$1 je {{GENDER:$2|vratio|vratila}} stranicu $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 je {{GENDER:$2|vratio|vratila}} stranicu $3",
+       "restore-count-revisions": "{{PLURAL:$1|1 izmena|$1 izmene|$1 izmena}}",
+       "restore-count-files": "{{PLURAL:$1|1 datoteka|$1 datoteke|$1 datoteka}}",
        "logentry-delete-event": "$1 je {{GENDER:$2|promenio|promenila}} vidljivost {{PLURAL:$5|1=događaja|$5 događaja}} u dnevniku $3: $4",
        "logentry-delete-revision": "$1 je {{GENDER:$2|promenio|promenila}} vidljivost {{PLURAL:$5|1=jedne izmene|$5 izmene|$5 izmena}} na stranici $3: $4",
        "logentry-delete-event-legacy": "$1 je {{GENDER:$2|promenio|promenila}} vidljivost događaja u dnevniku $3",
        "logentry-delete-revision-legacy": "$1 je {{GENDER:$2|promenio|promenila}} vidljivost izmena na stranici $3",
        "logentry-suppress-delete": "$1 je {{GENDER:$2|potisnuo|potisnula}} stranicu $3",
-       "logentry-suppress-event": "$1 je tajno {{GENDER:$2|promenio|promenila}} vidljivost {{PLURAL:$5|1=događaja|$5 događaja}} u dnevniku $3: $4",
+       "logentry-suppress-event": "$1 je tajno {{GENDER:$2|promenio|promenila}} vidljivost {{PLURAL:$5|događaja|$5 događaja}} u dnevniku $3: $4",
        "logentry-suppress-revision": "$1 je tajno {{GENDER:$2|promenio|promenila}} vidljivost {{PLURAL:$5|izmene|$5 izmena}} na stranici $3: $4",
-       "logentry-suppress-event-legacy": "$1 је tajno {{GENDER:$2|promenio|promenila}} vidljivost događaj u dnevniku $3",
+       "logentry-suppress-event-legacy": "$1 je potajno {{GENDER:$2|promenio|promenila}} vidljivost događaja u dnevniku $3",
        "logentry-suppress-revision-legacy": "$1 je tajno {{GENDER:$2|promenio|promenila}} vidljivost izmena na stranici $3",
        "revdelete-content-hid": "sadržaj je sakriven",
        "revdelete-summary-hid": "opis izmene je sakriven",
        "logentry-import-upload": "$1 je {{GENDER:$2|uvezao|uvezla}} $3 otpremanjem datoteke",
        "logentry-import-upload-details": "$1 je {{GENDER:$2|uvezao|uvezla}} $3 otpremanjem datoteke ($4 {{PLURAL:$4|izmena|izmene|izmena}})",
        "logentry-import-interwiki": "$1 je {{GENDER:$2|uvezao|uvezla}} $3 s drugog vikija",
-       "logentry-import-interwiki-details": "$1 је {{GENDER:$2|увезао|увезла}} $3 из $5 ($4 {{PLURAL:$4|1=измена|измене|измена}})",
+       "logentry-import-interwiki-details": "$1 je {{GENDER:$2|uvezao|uvezla}} $3 iz $5 ($4 {{PLURAL:$4|1=izmena|izmene|izmena}})",
        "logentry-merge-merge": "$1 je {{GENDER:$2|spojio|spojila}} $3 u $4 (sve do izmene $5)",
        "logentry-move-move": "$1 je {{GENDER:$2|premestio|premestila}} stranicu $3 na $4",
        "logentry-move-move-noredirect": "$1 je {{GENDER:$2|premestio|premestila}} stranicu $3 na $4 bez ostavljanja preusmerenja",
        "logentry-move-move_redir": "$1 je {{GENDER:$2|premestio|premestila}} stranicu $3 na $4 preko preusmerenja",
-       "logentry-move-move_redir-noredirect": "$1 je {{GENDER:|premestio|premestila}} stranicu $3 na $4 preko preusmerenja bez ostavljanja preusmerenja",
+       "logentry-move-move_redir-noredirect": "$1 je {{GENDER:$2|premestio|premestila}} stranicu $3 na $4 preko preusmerenja bez ostavljanja preusmerenja",
        "logentry-patrol-patrol": "$1 je {{GENDER:$2|označio|označila}} izmenu $4 stranice $3 kao patroliranu",
        "logentry-patrol-patrol-auto": "$1 je automatski {{GENDER:$2|označio|označila}} izmenu $4 stranice $3 kao patroliranu",
        "logentry-newusers-newusers": "$1 je {{GENDER:$2|otvorio|otvorila}} korisnički nalog",
        "logentry-newusers-create": "$1 je {{GENDER:$2|otvorio|otvorila}} korisnički nalog",
        "logentry-newusers-create2": "$1 je {{GENDER:$2|otvorio|otvorila}} korisnički nalog $3",
-       "logentry-newusers-byemail": "$1 je {{GENDER:$2|otvorio|otvorila}} korisnički nalog $3 i lozinka je poslata na imejl",
+       "logentry-newusers-byemail": "$1 je {{GENDER:$2|napravio|napravila}} korisnički nalog $3 i lozinka je poslata na imejl",
        "logentry-newusers-autocreate": "Korisnički nalog $1 je automatski {{GENDER:$2|otvoren}}",
-       "logentry-protect-move_prot": "$1 je {{GENDER:$2|premestio|premestila}} postavke zaštite sa $4 na $3",
+       "logentry-protect-move_prot": "$1 je {{GENDER:$2|premestio|premestila}} podešavanja zaštite sa $4 na $3",
        "logentry-protect-unprotect": "$1 je {{GENDER:$2|skinuo|skinula}} zaštitu sa stranice $3",
        "logentry-protect-protect": "$1 je {{GENDER:$2|zaštitio|zaštitila}} $3 $4",
        "logentry-protect-protect-cascade": "$1 je {{GENDER:$2|zaštitio|zaštitila}} $3 $4 [prenosiva zaštita]",
        "logentry-protect-modify-cascade": "$1 je {{GENDER:$2|promenio|promenila}} stepen zaštite za $3 $4 [prenosiva zaštita]",
        "logentry-rights-rights": "$1 je {{GENDER:$2|promenio|promenila}} članstvo grupe za {{GENDER:$6|$3}} iz $4 u $5",
        "logentry-rights-rights-legacy": "$1 je {{GENDER:$2|promenio|promenila}} članstvo grupe za $3",
-       "logentry-rights-autopromote": "$1 je automatski {{GENDER:$1|unapređen|unapređena}} iz $4 u $5",
+       "logentry-rights-autopromote": "$1 je automatski {{GENDER:$2|unapređen|unapređena}} iz $4 u $5",
        "logentry-upload-upload": "$1 je {{GENDER:$2|otpremio|otpremila}} $3",
        "logentry-upload-overwrite": "$1 je {{GENDER:$2|otpremio|otpremila}} novu verziju $3",
        "logentry-upload-revert": "$1 je {{GENDER:$2|otpremio|otpremila}} $3",
        "feedback-bugornote": "Ako ste spremni da detaljno opišete tehnički problem, onda [$1 prijavite grešku].\nU suprotnom, poslužite se jednostavnim obrascem ispod. Vaš komentar će stajati na stranici „[$3 $2]“, zajedno s korisničkim imenom i pregledačem koji koristite.",
        "feedback-cancel": "Otkaži",
        "feedback-close": "Urađeno",
-       "feedback-external-bug-report-button": "Prijavi bag",
+       "feedback-external-bug-report-button": "Prijavi grešku",
+       "feedback-dialog-title": "Slanje povratne informacije",
        "feedback-error1": "Greška: neprepoznat rezultat od API-ja",
        "feedback-error2": "Greška: uređivanje nije uspelo",
        "feedback-error3": "Greška: nema odgovora od API-ja",
        "feedback-termsofuse": "Prihvatam da pošaljem povratne informacije u skladu sa uslovima korišćenja.",
        "feedback-thanks": "Hvala! Vaša povratna informacija je postavljena na stranicu „[$2 $1]“.",
        "feedback-thanks-title": "Hvala vam!",
+       "feedback-useragent": "Korisnički agent:",
        "searchsuggest-search": "Pretraga",
        "searchsuggest-containing": "sadrži...",
        "api-error-badtoken": "Unutrašnja greška: neispravan žeton.",
        "api-error-emptypage": "Stvaranje novih praznih stranica nije dozvoljeno.",
        "api-error-publishfailed": "Unutrašnja greška: server nije uspeo da objavi privremenu datoteku.",
        "api-error-stashfailed": "Unutrašnja greška: server ne može da sačuva privremenu datoteku.",
-       "api-error-unknown-warning": "Nepoznato upozorenje: $1",
+       "api-error-unknown-warning": "Nepoznato upozorenje: „$1”.",
        "api-error-unknownerror": "Nepoznata greška: „$1“.",
        "duration-seconds": "$1 {{PLURAL:$1|sekund|sekunda|sekundi}}",
        "duration-minutes": "$1 {{PLURAL:$1|minut|minuta|minuta}}",
        "limitreport-expensivefunctioncount": "Broj „skupih” funkcija analizatora",
        "limitreport-unstrip-depth": "Unstrip dubina rekurzije",
        "limitreport-unstrip-size": "Unstrip veličina nakon proširenja",
+       "limitreport-unstrip-size-value": "$1/$2 {{PLURAL:$2|bajt|bajta|bajtova}}",
        "expandtemplates": "Zamena šablona",
-       "expand_templates_intro": "Ova posebna stranica uzima tekst i menja sve šablone u njemu rekurzivno.\nTakođe menja funkcije parsera kao što je <code><nowiki>{{</nowiki>#language:…}}</code> i promenljive kao što je <code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nZapravo praktično sve što se nalazi između vitičastih zagrada.",
+       "expand_templates_intro": "Ova posebna stranica uzima vikitekst i menja sve šablone u njemu rekurzivno.\nTakođe menja funkcije parsera kao što je <code><nowiki>{{</nowiki>#language:…}}</code> i promenljive kao što je <code><nowiki>{{</nowiki>CURRENTDAY}}</code>. \nZapravo praktično sve što se nalazi između vitičastih zagrada.",
        "expand_templates_title": "Naziv konteksta; za {{STRANICA}} itd.:",
-       "expand_templates_input": "Unos:",
+       "expand_templates_input": "Unos vikiteksta:",
        "expand_templates_output": "Rezultat",
        "expand_templates_xml_output": "XML izlaz",
        "expand_templates_html_output": "Sirov HTML izlaz",
        "expand_templates_generate_xml": "Prikaži XML stablo",
        "expand_templates_generate_rawhtml": "Prikaži sirov HTML",
        "expand_templates_preview": "Pretpregled",
+       "pagelanguage": "Promeni jezik stranice",
        "pagelang-name": "Stranica",
        "pagelang-language": "Jezik",
+       "pagelang-use-default": "Koristi podrazumevani jezik",
        "pagelang-select-lang": "Izaberi jezik",
+       "pagelang-reason": "Razlog",
        "pagelang-submit": "Pošalji",
+       "pagelang-nonexistent-page": "Stranica $1 ne postoji.",
+       "pagelang-unchanged-language": "Stranica $1  je već postavljena na jezik $2.",
+       "pagelang-db-failed": "Baza podataka nije uspela promeniti jezik stranice.",
        "right-pagelang": "menjanje jezika stranice",
        "action-pagelang": "promenu jezika stranice",
+       "log-name-pagelang": "Dnevnik promene jezika",
+       "log-description-pagelang": "Ovo je dnevnik izmena u jezicima stranica.",
        "logentry-pagelang-pagelang": "$1 je {{GENDER:$2|promenio|promenila}} jezik stranice $3 iz $4 u $5.",
+       "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (omogućena)",
        "mediastatistics": "Statistika datoteka",
        "mediastatistics-summary": "Statistike o tipovima poslatih datoteka. Ovde su uračunate samo najnovije verzije datoteka. Stare ili obrisane verzije nisu uračunate.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 bajt|$1 bajta|$1 bajtova}} ($2; $3%)",
+       "mediastatistics-bytespertype": "Ukupna veličina datoteke ovog odeljka: {{PLURAL:$1|$1 bajt|$1 bajta|$1 bajtova}} ($2; $3%).",
+       "mediastatistics-allbytes": "Ukupna veličina svih datoteka: {{PLURAL:$1|$1 bajt|$1 bajta|$1 bajtova}} ($2).",
        "mediastatistics-table-mimetype": "MIME tip",
        "mediastatistics-table-extensions": "Moguće ekstenzije",
        "mediastatistics-table-count": "Broj datoteka",
        "mediastatistics-header-executable": "Izvršne",
        "mediastatistics-header-archive": "Kompresovane",
        "mediastatistics-header-total": "Sve datoteke",
+       "json-warn-trailing-comma": "$1 {{PLURAL:$1|prateća tačka je uklonjena|prateće tačke su uklonjene|pratećih tački je uklonjeno}} iz JSON-a",
+       "json-error-unknown": "Dogodio se problem s JSON-om. Greška: $1",
+       "json-error-depth": "Prekoračena je najveća dubina",
+       "json-error-state-mismatch": "Nevalidan ili pokvareni JSON",
+       "json-error-ctrl-char": "Greška kontrolnog simbola, moguće je da je neispravno enkodiran",
        "json-error-syntax": "Greška u sintaksi",
+       "json-error-utf8": "Malformirani UTF-8 znaci, moguće je da su neispravno enkodirani",
+       "json-error-recursion": "Jedna ili više rekurzivnih referenci u vrednosti koju treba enkodirati.",
+       "json-error-inf-or-nan": "Jedna ili više NAN ili INF vrednosti u vrednosti koju treba enkodirati",
+       "json-error-unsupported-type": "Data je vrednos vrste koja se ne može enkodirati",
        "headline-anchor-title": "Veza do ovog odeljka",
        "special-characters-group-latin": "Latinica",
        "special-characters-group-latinextended": "Proširena latinica",
        "special-characters-group-thai": "Tajlandski",
        "special-characters-group-lao": "Laoski",
        "special-characters-group-khmer": "Kmerski",
+       "special-characters-group-canadianaboriginal": "Kanadski aboridžinski",
+       "special-characters-title-endash": "crtica",
+       "special-characters-title-emdash": "duga crtica",
+       "special-characters-title-minus": "minus",
        "mw-widgets-dateinput-no-date": "Datum nije izabran",
        "mw-widgets-dateinput-placeholder-day": "GGGG-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "GGGG-MM",
+       "mw-widgets-mediasearch-input-placeholder": "Pretražite datoteke",
+       "mw-widgets-mediasearch-noresults": "Nema rezultata.",
        "mw-widgets-titleinput-description-new-page": "stranica još uvek ne postoji",
        "mw-widgets-titleinput-description-redirect": "preusmerava na $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Dodaj kategoriju...",
        "mw-widgets-usersmultiselect-placeholder": "Dodaj još...",
+       "date-range-from": "Od datuma:",
+       "date-range-to": "Do datuma:",
+       "sessionprovider-generic": "$1 sesije",
+       "sessionprovider-mediawiki-session-cookiesessionprovider": "sesije sa kolačićima",
+       "sessionprovider-nocookies": "Kolačići su možda onemogućeni. Uverite se da su kolačići omogućeni i počnite ponovo.",
        "randomrootpage": "Slučajna korenska stranica",
+       "log-action-filter-block": "Tip blokiranja:",
+       "log-action-filter-contentmodel": "Tip promene modela sadržaja:",
+       "log-action-filter-delete": "Tip brisanja:",
+       "log-action-filter-import": "Tip uvoza:",
+       "log-action-filter-managetags": "Tip uređivanja oznaka:",
+       "log-action-filter-move": "Tip premeštanja:",
+       "log-action-filter-newusers": "Tip novog naloga:",
+       "log-action-filter-patrol": "Tip patroliranja:",
+       "log-action-filter-protect": "Tip zaključavanja:",
+       "log-action-filter-rights": "Tip promene korisničkih prava:",
+       "log-action-filter-suppress": "Vrsta skrivanja:",
+       "log-action-filter-upload": "Tip otpremanja:",
        "log-action-filter-all": "Sve",
+       "log-action-filter-block-block": "blokiranje",
+       "log-action-filter-block-reblock": "izmena blokiranja",
+       "log-action-filter-block-unblock": "deblokiranje",
+       "log-action-filter-contentmodel-change": "Izmena modela sadržaja",
+       "log-action-filter-contentmodel-new": "Nova stranica s nestandardnim modelom sadržaja",
+       "log-action-filter-delete-delete": "brisanje stranice",
+       "log-action-filter-delete-delete_redir": "presnimavanje preusmerenja",
+       "log-action-filter-delete-restore": "vraćanje stranice",
+       "log-action-filter-delete-event": "brisanje unosa u dnevnicima",
+       "log-action-filter-delete-revision": "brisanje izmene",
+       "log-action-filter-import-interwiki": "Međuviki uvoz",
+       "log-action-filter-import-upload": "Uvoz postavljanjem XML-a",
+       "log-action-filter-managetags-create": "nova oznaka",
+       "log-action-filter-managetags-delete": "brisanje oznake",
+       "log-action-filter-managetags-activate": "aktiviranje oznake",
+       "log-action-filter-managetags-deactivate": "deaktiviranje oznake",
+       "log-action-filter-move-move": "premeštanje bez presnimavanja preusmerenja",
        "log-action-filter-move-move_redir": "premeštanje sa presnimavanjem preusmerenja",
+       "log-action-filter-newusers-create": "otvorio anoniman korisnik",
+       "log-action-filter-newusers-create2": "otvorio registrovan korisnik",
+       "log-action-filter-newusers-autocreate": "automatski otvoren",
+       "log-action-filter-patrol-patrol": "ručno",
+       "log-action-filter-patrol-autopatrol": "automatsko",
+       "log-action-filter-protect-protect": "zaključavanje",
+       "log-action-filter-protect-modify": "izmena zaključavanja",
+       "log-action-filter-protect-unprotect": "uklanjanje zaključavanja",
        "log-action-filter-protect-move_prot": "premeštanje zaštite",
+       "log-action-filter-rights-rights": "ručno",
+       "log-action-filter-rights-autopromote": "automatski",
+       "log-action-filter-suppress-event": "Skrivanje unosa u dnevniku",
+       "log-action-filter-suppress-revision": "Skrivanje izmene",
+       "log-action-filter-suppress-delete": "Skrivanje stranice",
+       "log-action-filter-suppress-block": "Skrivanje korisnika blokiranjem",
+       "log-action-filter-suppress-reblock": "Skrivanje korisnika ponovnim blokiranjem",
        "log-action-filter-upload-upload": "novo otpremanje",
+       "log-action-filter-upload-overwrite": "promena postojećeg",
+       "authmanager-authn-not-in-progress": "Autentifikacija nije u toku ili je došlo do gubitka podataka o sesiji. Počnite ispočetka.",
+       "authmanager-authn-no-primary": "Ne mogu da proverim pružene akreditive.",
+       "authmanager-authn-no-local-user": "Pruženi akreditivi nisu povezani ni sa jednim korisnikom na ovom vikiju.",
+       "authmanager-authn-no-local-user-link": "Pruženi su ispravni akreditivi, ali nisu povezani ni s jednim korisnikom na ovom vikiju. Prijavite se na neki drugi način ili napravite novi korisnički nalog, što će Vam dati mogućnost da povežete prethodne akreditive na novi nalog.",
+       "authmanager-authn-autocreate-failed": "Ne mogu da automatski napravim lokalni nalog: $1",
+       "authmanager-change-not-supported": "Ne mogu da promenim pružene akreditive jer ih ništa ne bi koristilo.",
+       "authmanager-create-disabled": "Onemogućeno pravljenje naloga.",
+       "authmanager-create-from-login": "Popunite polja da biste napravili nalog.",
+       "authmanager-create-not-in-progress": "Pravljenje naloga nije u toku ili su podaci o sesiji izgubljeni. Počnite ispočetka.",
+       "authmanager-create-no-primary": "Ne mogu da iskoristim pružene akreditive za pravljenje naloga.",
+       "authmanager-link-no-primary": "Ne mogu da iskoristim pružene akreditive za spajanje naloga.",
+       "authmanager-link-not-in-progress": "Spajanje naloga nije u toku ili je došlo do gubitka podataka o sesiji. Počnite ispočetka.",
+       "authmanager-authplugin-setpass-failed-title": "Neuspešna promena lozinke",
+       "authmanager-authplugin-setpass-failed-message": "Dodatak za autentifikaciju je odbio promenu lozinke.",
+       "authmanager-authplugin-create-fail": "Dodatak za autentifikaciju je odbio pravljenje naloga.",
+       "authmanager-authplugin-setpass-denied": "Dodatak za autentifikaciju ne dozvoljava menjanje loziku.",
+       "authmanager-authplugin-setpass-bad-domain": "Neispravan domen.",
+       "authmanager-autocreate-noperm": "Automatsko pravljenje naloga nije dozvoljeno.",
+       "authmanager-userdoesnotexist": "Korisnički nalog „$1“ nije otvoren.",
+       "authmanager-username-help": "Korisničko ime za autentifikaciju.",
+       "authmanager-password-help": "Lozinka za autentifikaciju.",
+       "authmanager-domain-help": "Domen za spoljašnju autentifikaciju.",
+       "authmanager-retype-help": "Ponovite lozinku da bi ste potvrdili.",
        "authmanager-email-label": "Imejl",
        "authmanager-email-help": "Imejl adresa",
-       "changecredentials": "Promjena akreditiva",
+       "authmanager-realname-label": "Pravo ime",
+       "authmanager-realname-help": "Pravo ime korisnika",
+       "authmanager-provider-password": "Autentifikacija lozinkom",
+       "authmanager-provider-password-domain": "Autentifikacija lozinkom i domenom",
+       "authmanager-provider-temporarypassword": "Privremena lozinka",
+       "authprovider-confirmlink-option": "$1 ($2)",
+       "authprovider-confirmlink-request-label": "Računi koji se trebaju povezati",
+       "authprovider-confirmlink-success-line": "$1: Uspešno povezano.",
+       "authprovider-confirmlink-failed": "Ne mogu da povežem nalog u potpunosti: $1",
+       "authprovider-confirmlink-ok-help": "Nastavite nakon prikazivanja poruka za neuspešno povezivanje.",
+       "authprovider-resetpass-skip-label": "Preskoči",
+       "authprovider-resetpass-skip-help": "Preskočite resetovanje lozinke.",
+       "authform-nosession-login": "Autentifikacija je uspela, ali Vaš pregledač ne može da „zapamti” da ste prijavljeni.\n\n$1",
+       "authform-nosession-signup": "Nalog je napravljen, ali Vaš pregledač ne može da „zapamti” da ste prijavljeni.\n\n$1",
+       "authform-newtoken": "Nedostaje žeton. $1",
+       "authform-notoken": "Nedostaje žeton",
+       "authform-wrongtoken": "Pogrešan žeton",
+       "specialpage-securitylevel-not-allowed-title": "Nije dozvoljeno",
+       "specialpage-securitylevel-not-allowed": "Žao nam je, nije Vam dozvoljeno da koristite ovu stranicu jer ne mogu da potvrdim Vaš identitet.",
+       "authpage-cannot-login": "Ne mogu započeti prijavu.",
+       "authpage-cannot-login-continue": "Ne mogu da nastavim prijavljivanje. Vaša sesija je najverovatnije istekla.",
+       "authpage-cannot-create": "Ne mogu započeti stvaranje naloga.",
+       "authpage-cannot-link": "Ne mogu započeti spajanje naloga.",
+       "cannotauth-not-allowed-title": "Pristup je odbijen",
+       "cannotauth-not-allowed": "Nije Vam dozvoljeno da koristite ovu stranicu",
+       "changecredentials": "Promena akreditiva",
+       "changecredentials-submit": "Promeni",
+       "changecredentials-invalidsubpage": "„$1“ nije ispravna vrsta akreditiva.",
+       "changecredentials-success": "Vaši akreditivi su promenjeni.",
        "removecredentials": "Uklanjanje akreditiva",
-       "gotointerwiki-external": "Upravo ćete da napustite projekat {{SITENAME}} da biste na zasebnom veb-sajtu posetili [[$2]].\n\n'''[$1 Produži na $1]'''"
+       "removecredentials-submit": "Uklanjanje akreditiva",
+       "removecredentials-invalidsubpage": "„$1“ nije ispravna vrsta akreditiva.",
+       "removecredentials-success": "Vaši akreditivi su uklonjeni.",
+       "credentialsform-provider": "Vrsta akreditiva:",
+       "credentialsform-account": "Naziv naloga:",
+       "cannotlink-no-provider-title": "Nema naloga za povezivanje",
+       "cannotlink-no-provider": "Nema naloga za povezivanje.",
+       "linkaccounts": "Poveži naloge",
+       "linkaccounts-success-text": "Nalog je povezan.",
+       "linkaccounts-submit": "Poveži naloge",
+       "unlinkaccounts": "Objedini naloge",
+       "unlinkaccounts-success": "Nalog je objedinjen.",
+       "userjsispublic": "Napomena: JavaScript podstranice ne bi trebale sadržavati poverljive informacije budući da su vidljive drugim korisnicima.",
+       "usercssispublic": "Napomena: CSS podstranice ne bi trebale sadržavati poverljive informacije budući da su vidljive drugim korisnicima.",
+       "restrictionsfield-badip": "Neispravna IP adresa ili opseg: $1",
+       "restrictionsfield-label": "Dozvoljeni IP-opsezi:",
+       "edit-error-short": "Greška: $1",
+       "edit-error-long": "Greške:\n\n$1",
+       "revid": "izmena $1",
+       "pageid": "ID stranice: $1",
+       "rawhtml-notallowed": "&lt;html&gt; tagovi ne mogu da se koriste van normalnih stranica.",
+       "gotointerwiki": "Napuštam projekat {{SITENAME}}",
+       "gotointerwiki-invalid": "Odabrani naslov je nevalidan.",
+       "gotointerwiki-external": "Upravo ćete da napustite projekat {{SITENAME}} da biste na zasebnom veb-sajtu posetili [[$2]].\n\n'''[$1 Produži na $1]'''",
+       "undelete-cantedit": "Ne možete povratiti ovu stranicu jer nemate dozvolu da je uređujete.",
+       "undelete-cantcreate": "Ne možete povratiti ovu stranicu jer nema postojeće stranice sa ovim imenom i nemate dozvolu da napravite ovu stranicu.",
+       "pagedata-title": "Podaci stranice",
+       "pagedata-not-acceptable": "Nije pronađen odgovarajući oblik. Podržane MIME-vrste: $1",
+       "pagedata-bad-title": "Nevalidan naslov: $1."
 }
index 682a1b6..83390c7 100644 (file)
        "markedaspatrollederror-noautopatrol": "Et is nit ferlööwed, oaine Beoarbaidengen as kontrollierd tou markierjen.",
        "patrol-log-page": "Kontrol-Logbouk",
        "patrol-log-header": "Dit is dät Kontroll-Logbouk.",
-       "log-show-hide-patrol": "Kontroll-Logbouk $1",
        "deletedrevision": "Oolde Version $1 läsked",
        "filedeleteerror-short": "Failer bie dät Doatäi-Läskjen: $1",
        "filedeleteerror-long": "Bie dät Doatäi-Läskjen wuuden Failere fääststoald:\n\n$1",
index f4f0840..bcf7bc5 100644 (file)
        "markedaspatrollederrornotify": "Nandaan minangka kaawas gagal.",
        "patrol-log-page": "Log patroli",
        "patrol-log-header": "Ieu minangka log pikeun révisi nu geus diroris.",
-       "log-show-hide-patrol": "$1 log rorisan",
-       "log-show-hide-tag": "log tag $1",
        "confirm-markpatrolled-button": "Heug",
        "confirm-markpatrolled-top": "Tandaan révisi $3 ti $2 minangka kaawas?",
        "deletedrevision": "Révisi heubeul nu dihapus $1",
index 9185b78..1b2ccc9 100644 (file)
        "markedaspatrollederrornotify": "Markering som patrullerad misslyckades.",
        "patrol-log-page": "Patrulleringslogg",
        "patrol-log-header": "Detta är en logg över patrullerade sidversioner.",
-       "log-show-hide-patrol": "$1 patrulleringslogg",
-       "log-show-hide-tag": "$1 märkeslogg",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Markera sidversionen $3 av $2 som patrullerad?",
        "deletedrevision": "Raderade gammal sidversion $1",
index d48650d..2b44968 100644 (file)
        "markedaspatrollederror-noautopatrol": "Ńy moš uprawńyń wymaganych do uoznačańo swojich sprawjyń kej „sprawdzůne”.",
        "patrol-log-page": "Dźynńik patrolowańo",
        "patrol-log-header": "Půniżej je dźeńńik patrolowańo zajtůw.",
-       "log-show-hide-patrol": "$1 rejer sprawdzańo",
        "deletedrevision": "Wyćepano popředńy wersyje $1",
        "filedeleteerror-short": "Feler při wyćepywańu plika $1",
        "filedeleteerror-long": "Wystůmpiuy felery při wyćepywańu pliku:\n\n$1",
index ea4f828..f92970e 100644 (file)
        "markedaspatrollederrornotify": "சுற்றுக்காவல் தோல்வியடைந்ததாக குறிக்கப்பட்டது.",
        "patrol-log-page": "சுற்றுக்காவல் பதிகை",
        "patrol-log-header": "இது ரோந்து செய்யப்பட்ட  பரிசீலனைகளுக்கான  குறிப்பேடு.",
-       "log-show-hide-patrol": "$1 ரோந்து குறிப்பேடு",
-       "log-show-hide-tag": "$1 அடையாள பதிவு",
        "confirm-markpatrolled-button": "சரி",
        "deletedrevision": "பழைய திருத்தம் $1 நீக்கப்பட்டது",
        "filedeleteerror-short": "பின்வரும் கோப்பை நீக்குவதில் தவறு: $1",
index c5ecd77..6bfb7e7 100644 (file)
        "markaspatrolleddiff": "Sinbbaq sa wayal gawzyagan mita’",
        "markedaspatrolled": "Sinbbaq sa wayal gawzyagan mita’",
        "patrol-log-page": "Inblaq gmawzyaw mita’ binrwan",
-       "log-show-hide-patrol": "$1 inblaq gmawzyaw mita’ binrwan",
-       "log-show-hide-tag": "$1 bniru’ sa lalu’ na qinlah",
        "confirm-markpatrolled-button": "Wal balay",
        "previousdiff": "← Smural sinr’zyut miru’",
        "nextdiff": "Giqas hazi’ sinr’zyut→",
index 9d131fd..2ef8aba 100644 (file)
        "markedaspatrollednotify": "$1 లో చేసిన ఈ మార్పు పర్యవేక్షణలో ఉన్నట్టుగా గుర్తించబడింది.",
        "patrol-log-page": "నిఘా చిట్టా",
        "patrol-log-header": "ఇది పర్యవేక్షించిన కూర్పుల చిట్టా.",
-       "log-show-hide-patrol": "$1 పర్యవేక్షణ చిట్టా",
-       "log-show-hide-tag": "ట్యాగుల చిట్టాను $1",
        "confirm-markpatrolled-button": "సరే",
        "deletedrevision": "పాత సంచిక $1 తొలగించబడినది.",
        "filedeleteerror-short": "ఫైలు తొలగించడంలో పొరపాటు: $1",
index 6cb3fba..6043bae 100644 (file)
        "markedaspatrollederrornotify": "การทำเครื่องหมายว่าตรวจสอบแล้วล้มเหลว",
        "patrol-log-page": "ปูมการตรวจสอบ",
        "patrol-log-header": "หน้านี้คือปูมรุ่นการแก้ไขที่กำหนดว่าตรวจสอบแล้ว",
-       "log-show-hide-patrol": "$1 ปูมการตรวจสอบ",
-       "log-show-hide-tag": "$1ปูมป้ายระบุ",
        "confirm-markpatrolled-button": "ตกลง",
        "confirm-markpatrolled-top": "ทำเครื่องหมายรุ่น $3 ของ $2 ว่าตรวจสอบแล้วหรือไม่",
        "deletedrevision": "รุ่นเก่าที่ถูกลบ $1",
index c6c93db..eff94a5 100644 (file)
        "markedaspatrollederror-noautopatrol": "Öz üýtgeşmeleriňizi patrullyk edilen diýip bellemekligiňize rugsat berilmeýär.",
        "patrol-log-page": "Patrullyk gündeligi",
        "patrol-log-header": "Bu patrullyk edilen wersiýalaryň gündeligidir.",
-       "log-show-hide-patrol": "Patrullyk gündeligini $1",
        "deletedrevision": "$1 köne wersiýasy öçürildi.",
        "filedeleteerror-short": "Faýl öçürmek säwligi: $1",
        "filedeleteerror-long": "Faýl öçürilýän mahaly säwlikler ýüze çykdy:\n\n$1",
index 7bc2743..7e30056 100644 (file)
        "markedaspatrollederror-noautopatrol": "Wala kang pahintulot para tatakan ang ginawa mong mga pagbabago bilang napatrolya na.",
        "patrol-log-page": "Tala ng Pagpapatrolya",
        "patrol-log-header": "Tala ito ng mga pagbabagong napatrolya na.",
-       "log-show-hide-patrol": "$1 tala ng pagpatrolya",
        "deletedrevision": "Binurang lumang pagbabago $1",
        "filedeleteerror-short": "Kamalian sa pagbubura ng talaksan: $1",
        "filedeleteerror-long": "Nakaranas ng mga kamalian habang binubura ang talaksan:\n\n$1",
index 4b2080c..3f492b3 100644 (file)
        "markedaspatrollederrornotify": "Kontrol edildi olarak işaretleme başarısız oldu.",
        "patrol-log-page": "Devriye günlüğü",
        "patrol-log-header": "Bu gözlenmiş revizyonların günlüğüdür.",
-       "log-show-hide-patrol": "Gözetim günlüğünü $1",
-       "log-show-hide-tag": "Etiket günlüğünü $1",
        "deletedrevision": "$1 sayılı eski sürüm silindi.",
        "filedeleteerror-short": "$1 dosyanın silinmesinde hata oldu",
        "filedeleteerror-long": "Dosyayı silerken hatalarla karşılaşıldı:\n\n$1",
index ba46946..ea93a9f 100644 (file)
        "markedaspatrolledtext": "Сайланган [[:$1]] мәкаләсенең әлеге юрамасы тикшерелгән дип тамгаланды.",
        "patrol-log-page": "Тикшерү көндәлеге",
        "patrol-log-header": "Бу тикшерелгән битләрнең көндәлеге.",
-       "log-show-hide-patrol": "$1 тикшерү көндәлеге",
        "confirm-markpatrolled-button": "Ярый",
        "deletedrevision": "$1 битенең иске юрамасы бетерелде",
        "filedeleteerror-short": "Файлны бетерү хатасы: $1",
index bab7202..cab0be7 100644 (file)
        "markedaspatrolledtext": "Saylanğan [[:$1]] mäqäläseneñ älege yuraması tikşerelgän dip tamğalandı.",
        "patrol-log-page": "Tikşerü köndälege",
        "patrol-log-header": "Bu tikşerelgän bitlärneñ köndälege.",
-       "log-show-hide-patrol": "$1 tikşerü köndälege",
        "deletedrevision": "$1 biteneñ iske yuraması beterelde",
        "filedeleteerror-short": "Faylnı beterü xatası: $1",
        "filedeleteerror-long": "Faylnı beterü waqıtında xatalar çıqtı:\n\n$1",
index cde8f30..15bf314 100644 (file)
        "markedaspatrollederrornotify": "چارلىيالمىغانلىق بەلگىسى قويۇلدى.",
        "patrol-log-page": "چارلاش خاتىرىسى",
        "patrol-log-header": "بۇ چارلانغان تۈزىتىلگەن نەشرى.",
-       "log-show-hide-patrol": "$1 چارلاش خاتىرىسى",
        "deletedrevision": "$1 كونا تۈزىتىلگەن نەشرى ئۆچۈرۈلدى",
        "filedeleteerror-short": "ھۆججەت ئۆچۈرۈش خاتالىقى: $1",
        "filedeleteerror-long": "ھۆججەت ئۆچۈرۈۋاتقاندا خاتالىق كۆرۈلدى:\n\n$1",
index e6fe0f2..6b9decc 100644 (file)
        "markedaspatrollederrornotify": "Не вдалося поставити позначку про патрулювання.",
        "patrol-log-page": "Журнал патрулювання",
        "patrol-log-header": "Це журнал перевірених змін.",
-       "log-show-hide-patrol": "$1 журнал патрулювання",
-       "log-show-hide-tag": "$1 мітку журналу",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Позначити версію $3 сторінки $2 як відпатрульовану?",
        "deletedrevision": "Вилучена стара версія $1",
index 6a1b0d3..be1bc38 100644 (file)
@@ -38,7 +38,8 @@
                        "Sayam Asjad",
                        "Abdulq",
                        "Fitoschido",
-                       "Dcljr"
+                       "Dcljr",
+                       "Bukhari"
                ]
        },
        "tog-underline": "ربط کی خط کشیدگی:",
        "customjsonprotected": "آپ کو اس JSON میں ترمیم کرنے کی اجازت نہیں کیونکہ اس میں کسی دوسرے صارف کی ذاتی ترتیبات موجود ہیں۔",
        "customjsprotected": "آپ کو اس جاوا اسکرپٹ میں ترمیم کرنے کی اجازت نہیں کیونکہ اس میں کسی دوسرے صارف کی ذاتی ترتیبات موجود ہیں۔",
        "mycustomcssprotected": "آپ اس سی ایس ایس (CSS) صفحہ میں ترمیم کرنے کا اختیار نہیں رکھتے۔",
+       "mycustomjsonprotected": "آپ اس صفحہ (جے ایس او این) میں تدوین کرنے کے مجاز نہیں ہیں",
        "mycustomjsprotected": "آپ اس جاوا اسکپرٹ (JavaScript) صفحہ میں ترمیم کرنے کا اختیار نہیں رکھتے۔",
        "myprivateinfoprotected": "آپ ان ذاتی معلوات (private information) میں ترمیم کرنے کا اختیار نہیں رکھتے۔",
        "mypreferencesprotected": "آپ اپنی ان ترجیحات (preferences) میں ترمیم کرنے کا اختیار نہیں رکھتے۔",
        "cannotcreateaccount-title": "کھاتے نہیں بنائے جا سکتے",
        "cannotcreateaccount-text": "اس ویکی پر براہ راست کھاتہ سازی فعال نہیں ہے۔",
        "yourdomainname": "آپکا ڈومین",
-       "password-change-forbidden": "آپ Ø§Ø³ Ù\88Û\8cÚ©Û\8c Ù¾Ø± Ù¾Ø§Ø±Ù\84Ù\81ظ (پاس Ø±Ù\88Ú\88) ØªØ¨Ø¯Û\8cÙ\84 Ù\86Û\81Û\8cÚº Ú©Ø± Ø³Ú©ØªÛ\92",
+       "password-change-forbidden": "آپ Ø§Ø³ Ù\88Û\8cÚ©Û\8c Ù¾Ø± Ù¾Ø§Ø³ Ø±Ù\88Ú\88 ØªØ¨Ø¯Û\8cÙ\84 Ù\86Û\81Û\8cÚº Ú©Ø± Ø³Ú©ØªÛ\92Û\94",
        "externaldberror": "یا تو توثیقی ڈیٹابیس میں خطا واقع ہوئی اور یا آپ کو بیرونی کھاتہ بتاریخ کرنے کی اِجازت نہیں ہے.",
        "login": "داخل ہوں",
        "login-security": "اپنی شناخت کی تصدیق کریں",
        "createacct-benefit-body3": "حالیہ {{PLURAL:$1|مشارکت کنندہ|مشارکت کنندگان}}",
        "badretype": "درج شدہ کلمۂ شناخت اصل سے مطابقت نہیں رکھتا۔",
        "usernameinprogress": "انتظار فرمائیے!<br />\nاس صارف نام سے کھاتہ بننے کا عمل ابھی جاری ہے۔",
-       "userexists": "داخÙ\84 Ú©Ø±Ø¯Û\81 Ø§Ø³Ù\85 ØµØ§Ø±Ù\81 Ù¾Û\81Ù\84Û\92 Ø³Û\92 Ù\85ستعÙ\85Ù\84 Û\81Û\92Û\94\nبراÛ\81Ù\90 Ú©Ø±Ù\85! Ú©Ù\88ئÛ\8c Ø¯Ù\88سرا Ø§Ø³Ù\85 Ù\85Ù\86تخب Ú©Û\8cجئے۔",
+       "userexists": "داخÙ\84 Ú©Ø±Ø¯Û\81 ØµØ§Ø±Ù\81 Ù\86اÙ\85 Ù¾Û\81Ù\84Û\92 Ø³Û\92 Ù\85ستعÙ\85Ù\84 Û\81Û\92Û\94\nبراÛ\81Ù\90 Ù\85Û\81رابÙ\86Û\8c Ú©Ù\88ئÛ\8c Ø¯Ù\88سرا Ù\86اÙ\85 Ù\85Ù\86تخب Ú©Û\8cجÛ\8cے۔",
        "loginerror": "داخلے میں غلطی",
        "createacct-error": "تخلیق کھاتہ میں نقص",
        "createaccounterror": "کھاتہ $1 بنایا نہیں جاسکا",
-       "nocookiesnew": "کھاتۂ صارف بنادیا گیا ہے، لیکن آپ کا داخلہ نہیں ہوا.\nصارفین کے داخلہ کیلئے {{SITENAME}} کوکیز استعمال کرتا ہے.\nآپ کے ہاں کوکیز غیر فعال ہیں.\nبراہِ کرم، انہیں فعال کیجئے، اور پھر اپنے نئے اسمِ صارف اور کلمۂ شناخت کے ساتھ داخل ہوجائیے.",
+       "nocookiesnew": "کھاتۂ صارف بنادیا گیا ہے، لیکن آپ کا داخلہ نہیں ہوا۔\nصارفین کے داخلہ کے لیے {{SITENAME}} کوکیز استعمال کرتا ہے۔\nآپ کے ہاں کوکیز غیر فعال ہیں۔\nبراہِ مہربانی، انہیں فعال کریں، اور پھر اپنے نئے صارف نام اور کلمۂ شناخت (پاسورڈ) کے ساتھ داخل ہو جائیں۔",
        "nocookieslogin": "صارفین کے داخل ہونے کیلئے {{SITENAME}} کوکیز استعمال کرتا ہے.\nآپ کے ہاں کوکیز غیر فعال ہیں.\nانہیں فعال کرنے کے بعد پھر کوشش کیجئے.",
        "nocookiesfornew": "اس صارف نام کا کھاتہ نہیں بن سکا۔ہم اس بات کی وضاحت نہیں کر سکتے (کہ ایسا کیوں ہوا)، براہ مہربانی! آپ\nیقین کر لیں کہ آپ کی کوکیز فعال ہیں، صفحہ تازہ کریں اور پھر کوشش کریں۔",
        "createacct-loginerror": "کھاتہ بن چکا ہے لیکن آپ اس میں خودکار طور پر داخل نہیں ہو سکے۔ براہ کرم [[Special:UserLogin|دستی طور پر داخل ہونے کی کوشش کریں]]۔",
-       "noname": "آپ Ù\86Û\92 ØµØ­Û\8cØ­ Ø§Ø³Ù\85 ØµØ§Ø±Ù\81 Ù\86Û\81Û\8cÚº Ú\86Ù\86ا.",
+       "noname": "آپ Ù\86Û\92 ØµØ­Û\8cØ­ ØµØ§Ø±Ù\81 Ù\86اÙ\85 Ù\86Û\81Û\8cÚº Ú\86Ù\86اÛ\94",
        "loginsuccesstitle": "داخلہ کامیاب",
        "loginsuccess": "'''اب آپ {{SITENAME}} میں بنام \"$1\" داخل ہوچکے ہیں۔'''",
        "nosuchuser": "\"$1\" کے نام سے کوئی صارف موجود نہیں ہے۔\nبراہ کرم ہجوں کو جانچ لیں۔\nنیز اگر آپ چاہیں تو [[Special:CreateAccount|نیا کھاتہ بھی بنا سکتے ہیں]]۔",
        "nosuchusershort": "\"$1\" کے نام سے کوئی صارف موجود نہیں.\nاپنا ہجہ جانچئے.",
-       "nouserspecified": "آپ Ú©Ù\88 Ø§Û\8cÚ© Ø§Ø³Ù\85Ù\90 ØµØ§Ø±Ù\81 Ù\85خصÙ\88ص Ú©Ø±Ù\86ا Û\81Û\92.",
+       "nouserspecified": "آپ Ú©Ù\88 Ø§Û\8cÚ© ØµØ§Ø±Ù\81 Ù\86اÙ\85 Ù\85خصÙ\88ص Ú©Ø±Ù\86ا Û\81Û\92Û\94",
        "login-userblocked": "اِس صارف پر پابندی ہے. داخلِ نوشتہ ہونے کی اجازت نہیں.",
        "wrongpassword": "آپ نے غلط پاس ورڈ یا صارف نام درج کیا ہے۔ براہ مہربانی دوبارہ کوشش کریں۔",
        "wrongpasswordempty": "کلمۂ شناخت ندارد۔ دوبارہ کوشش کریں۔",
-       "passwordtooshort": "آپکا منتخب کردہ پارلفظ مختصر ہے. پارلفظ کم از کم {{PLURAL:$1|1 محرف|$1 محارف}} ہونا چاہئے.",
+       "passwordtooshort": "آپ کا منتخب کردہ پاسورڈ مختصر ہے۔ پاسورڈ کم از کم {{PLURAL:$1|1 حرف|$1 حروف}} پر مشتمل ہونا چاہیے۔",
        "passwordtoolong": "خفیہ رمز (پاس ورڈ) {{PLURAL:$1|1 حرف|$1 حروف}} سے زیادہ طویل نہیں ہو سکتا۔",
        "passwordtoopopular": "متداول پاس ورڈ استعمال نہیں کیا جا سکتا۔ براہ مہربانی آپ کوئی منفرد پاس ورڈ استعمال کریں تاکہ آپ کا کھاتہ محفوظ رہے۔",
-       "password-name-match": "آپکا پارلفظ آپکے اسمِ صارف سے مختلف ہونا چاہئے.",
+       "password-name-match": "آپ کا پاسورڈ آپ کے صارف نام سے مختلف ہونا چاہیے۔",
        "password-login-forbidden": "اس صارف نام یا کلمۂ شناخت (پاسورڈ) کا استعمال ممنوع ہے",
        "mailmypassword": "پاسورڈ تبدیل کریں",
        "passwordremindertitle": "نیا عارضی کلمۂ شناخت برائے {{SITENAME}}",
        "passwordsent": "ایک نیا کلمۂ شناخت \"$1\" کے نام سے بننے والی برقی ڈاک کے پتے کیلیے بھیج دیا گیا ہے۔\nجب وہ موصول ہو جاۓ تو براہ کرم اسکے ذریعے دوبارہ داخل ہوں۔",
        "blocked-mailpassword": "آپ کے آئی پی پتے کی ترمیم کاری پر پابندی لگا دی گئی ہے۔ غلط استعمال سے بچنے کے لیے اس آئی پی پتے سے پاس ورڈ کی بازیابی کی اجازت منسوخ کر دی گئی ہے۔",
        "eauthentsent": "ایک تصدیقی برقی خط نامزد کیے گئے برقی پتہ پر ارسال کردیا گیا ہے۔\nآپ کو موصول ہوئے برقی خط میں ہدایات پر عمل کرکے اس بات کی توثیق کرلیں کہ مذکورہ برقی پتہ آپ کا ہی ہے۔",
-       "throttled-mailpassword": "گزشتÛ\81 {{PLURAL:$1|Ú¯Ú¾Ù\86Ù¹Û\92|$1 Ú¯Ú¾Ù\86Ù¹Ù\88Úº}} Ú©Û\92 Ø¯Ù\88راÙ\86 Ù¾Û\81Ù\84Û\92 Ø³Û\92 Û\81Û\8c Ù¾Ø§Ø±Ù\84Ù\81ظ (پاسÙ\88رÚ\88) Ú©Û\8c ØªØ¨Ø¯Û\8cÙ\84Û\8c Ú©Û\92 Ù\84Û\8cÛ\92 Ø¨Ø±Ù\82Û\8c Ø®Ø· Ø¨Ú¾Û\8cجا Ú¯Ù\8aا Û\81Û\92Û\94\nÙ\86اجائز Ø§Ø³ØªØ¹Ù\85اÙ\84 Ú©Û\92 Ø³Ø¯Ù\91باب Ú©Û\8cÙ\84ئÛ\92Ø\8c {{PLURAL:$1|Ú¯Ú¾Ù\86Ù¹Û\81|$1 Ú¯Ú¾Ù\86Ù¹Ù\88Úº}} Ú©Û\92 Ø¯Ù\88راÙ\86 ØµØ±Ù\81 Ø§Û\8cÚ© Ø¨Ø±Ù\82Û\8c Ø®Ø· Ø¨Ú¾Û\8cجا Ø¬Ø§سکتا ہے۔",
+       "throttled-mailpassword": "گزشتÛ\81 {{PLURAL:$1|Ú¯Ú¾Ù\86Ù¹Û\92|$1 Ú¯Ú¾Ù\86Ù¹Ù\88Úº}} Ú©Û\92 Ø¯Ù\88راÙ\86 Ù¾Û\81Ù\84Û\92 Ø³Û\92 Û\81Û\8c Ù¾Ø§Ø³Ù\88رÚ\88 Ú©Û\8c ØªØ¨Ø¯Û\8cÙ\84Û\8c Ú©Û\92 Ù\84Û\8cÛ\92 Ø¨Ø±Ù\82Û\8c Ø®Ø· Ø¨Ú¾Û\8cجا Ú¯Ù\8aا Û\81Û\92Û\94\nÙ\86اجائز Ø§Ø³ØªØ¹Ù\85اÙ\84 Ú©Û\92 Ø³Ø¯Ù\91باب Ú©Û\92 Ù\84Û\8cÛ\92Ø\8c {{PLURAL:$1|Ú¯Ú¾Ù\86Ù¹Û\81|$1 Ú¯Ú¾Ù\86Ù¹Ù\88Úº}} Ú©Û\92 Ø¯Ù\88راÙ\86 ØµØ±Ù\81 Ø§Û\8cÚ© Ø¨Ø±Ù\82Û\8c Ø®Ø· Ø¨Ú¾Û\8cجا Ø¬Ø§ سکتا ہے۔",
        "mailerror": "مسلہ دوران ترسیل خط:$1",
        "acct_creation_throttle_hit": "آپکی آئی پی کے ذریعے اِس ویکی پر آنے والے صارفین نے پچھلے $2 میں {{PLURAL:$1|1 کھاتہ بنایا ہے|$1 کھاتے بنائے ہیں}} جو اس مدت کے لیے کافی ہیں۔\nلہٰذا آپ کی آئی پی استعمال کرنے والے صارفین اِس وقت مزید کھاتے نہیں بنا سکتے۔",
        "emailauthenticated": "آپ کے برقی ڈاک پتہ کی تصدیق مورخہ $2 بوقت $3 بجے ہوئی۔",
        "accountcreated": "تخلیقِ کھاتہ",
        "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|تبادلۂ خیال]]) کا صارف کھاتہ بن چکا ہے۔",
        "createaccount-title": "کھاتہ سازی برائے {{SITENAME}}",
-       "createaccount-text": "کسی نے {{SITENAME}} ($4) پر \"$2\" کے نام سے اور \"$3\" پارلفظ کے ساتھ آپ کا برقی پتہ استعمال کرتے ہوئے کھاتہ بنایا ہے.\nآپ کو چاہئے کہ ابھی داخلِ نوشتہ ہوکر اپنا پارلفظ تبدیل کردیں.\n\nاگر یہ کھاتہ غلطی سے بنا تھا تو آپ یہ پیغام نظرانداز کرسکتے ہیں.",
+       "createaccount-text": "کسی نے {{SITENAME}} ($4) پر «$2» کے نام سے اور \"$3\" پاسورڈ کے ساتھ آپ کا برقی پتہ استعمال کرتے ہوئے کھاتہ بنایا ہے۔\nآپ کو چاہیے کہ ابھی لاگ ان ہو کر اپنا پاسورڈ تبدیل کر دیں۔\n\nاگر یہ کھاتہ غلطی سے بنا ہے، تو آپ یہ پیغام نظر انداز کر دیں۔",
        "login-throttled": "آپ نے حال ہی میں متعدد مرتبہ لاگ ان ہونے کی کوشش کی ہے۔\nدوبارہ کوشش کرنے سے پہلے $1 انتظار فرمائیے۔",
        "login-abort-generic": "لاگ ان ناکام - منسوخ شد",
        "login-migrated-generic": "آپ کا کھاتہ منتقل کر دیا گیا، اب اس ویکی پر آپ کا صارف نام موجود نہیں۔",
        "user-mail-no-addy": "برقی ڈاک بھیجنے کی کوشش بغیر برقی ڈاک پتہ",
        "user-mail-no-body": "خالی یا بہت ہی مختصر برقی خط بھیجنے کی کوشش",
        "changepassword": "کلمۂ شناخت تبدیل کریں",
-       "resetpass_announce": "آپ ایک برقی ارسال کردہ عارضی رمز (کوڈ) کے ساتھ داخل ہوئے ہیں۔\nداخلِ نوشتہ کے عمل کو مکمل کرنے کیلئے آپ کو یہاں نیا پارلفظ (پاسورڈ) متعین کرنا ہوگا۔",
-       "resetpass_header": "کھاتÛ\81 Ú©Ø§ Ù¾Ø§Ø±Ù\84Ù\81ظ تبدیل کریں",
+       "resetpass_announce": "لاگ ان کے عمل کو مکمل کرنے کے لیے آپ کو نیا پاسورڈ متعین کرنا ہو گا۔",
+       "resetpass_header": "کھاتÛ\81 Ú©Ø§ Ù¾Ø§Ø³Ù\88رÚ\88 تبدیل کریں",
        "oldpassword": "پرانا کلمۂ شناخت:",
        "newpassword": "نیا کلمۂ شناخت",
        "retypenew": "نیا کلمۂ شناخت دوبارہ درج کریں:",
-       "resetpass_submit": "پارÙ\84Ù\81ظ Ø¨Ù\86اؤ Ø§Ù\88ر Ø¯Ø§Ø®Ù\84 Û\81Ù\88جاؤ",
+       "resetpass_submit": "پاسÙ\88رÚ\88 Ø¨Ù\86ائÛ\8cÚº Ø§Ù\88ر Ø¯Ø§Ø®Ù\84 Û\81Ù\88Úº",
        "changepassword-success": "آپ کا پاس ورڈ تبدیل کر دیا گیا!",
        "changepassword-throttled": "آپ نے حال ہی میں متعدد مرتبہ داخل ہونے کی کوشش کی ہے۔\nدوبارہ کوشش کرنے سے پہلے $1 انتظار کریں۔",
        "botpasswords": "روبہ پاس ورڈ",
        "botpasswords-restriction-failed": "روبہ کے پاس ورڈ کی پابندیاں اس لاگ ان سے مانع ہیں۔",
        "botpasswords-invalid-name": "درج کردہ صارف نام میں روبہ کے پاس ورڈ کا فاصل لفظ موجود نہیں ہے (\"$1\")۔",
        "botpasswords-not-exist": "صارف \"$1\" کے پاس \"$2\" کے نام سے روبہ کا پاس ورڈ نہیں ہے۔",
-       "resetpass_forbidden": "پارÙ\84Ù\81ظ ØªØ¨Ø¯Û\8cÙ\84 Ù\86Û\81Û\8cÚº Û\81Ù\88سکتا",
+       "resetpass_forbidden": "پاسÙ\88رÚ\88 ØªØ¨Ø¯Û\8cÙ\84 Ù\86Û\81Û\8cÚº Û\81Ù\88 سکتا",
        "resetpass_forbidden-reason": "پاس ورڈ تبدیل نہیں کیا جا سکتا: $1",
        "resetpass-no-info": "اِس صفحہ تک براہِ راست رسائی کیلئے آپ کو داخلِ نوشتہ ہونا پڑے گا.",
-       "resetpass-submit-loggedin": "پارÙ\84Ù\81ظ Ú©Û\8c ØªØ¨Ø¯Û\8cÙ\84Û\8c",
+       "resetpass-submit-loggedin": "پاسÙ\88رÚ\88 ØªØ¨Ø¯Û\8cÙ\84 Ú©Ø±Û\8cÚº",
        "resetpass-submit-cancel": "منسوخ",
        "resetpass-wrong-oldpass": "عارضی یا موجودہ پاس ورڈ نادرست ہے۔\nشاید آپ نے پہلے ہی اپنا پاس ورڈ تبدیل کر لیا ہے یا نئے عارضی پاس ورڈ کی درخواست کر چکے ہیں۔",
        "resetpass-recycled": "براہ کرم اپنے موجودہ پاس ورڈ سے مختلف پاس ورڈ رکھیں۔",
-       "resetpass-temp-emailed": "آپ Ø¹Ø§Ø±Ø¶Û\8c Ø¨Ø±Ù\82Û\8c Ø®Ø· Ø³Û\92 Ø¨Ú¾Û\8cجÛ\92 Ú¯Ø¦Û\92 Ú©Ù\88Ú\88 Ø³Û\92 Ù\84اگ Ø§Ù\86 Û\81Û\8cÚº\nÙ\85Ú©Ù\85Ù\84 Ø·Ù\88ر Ù¾Ø± Ù\84اگ Ø§Ù\86 Û\81Ù\88Ù\86Û\92 Ú©Û\92 Ù\84Û\8cÛ\92 Ø¢Ù¾ Ú©Ù\88 Ù\86Û\8cا Ù¾Ø§Ø³Ù\88رÚ\88 Ø³Û\8cÙ¹ Ú©Ø±Ù\86ا Ù¾Ú\91Û\92 Ú¯Ø§",
-       "resetpass-temp-password": "عارضÛ\8c Ù¾Ø§Ø±Ù\84Ù\81ظ:",
+       "resetpass-temp-emailed": "آپ Ø§Û\8cÚ© Ø¨Ø±Ù\82Û\8c Ø§Ø±Ø³Ø§Ù\84 Ú©Ø±Ø¯Û\81 Ø¹Ø§Ø±Ø¶Û\8c Ú©Ù\88Ú\88 Ú©Û\92 Ø³Ø§ØªÚ¾ Ø¯Ø§Ø®Ù\84 Û\81Ù\88ئÛ\92 Û\81Û\8cÚºÛ\94\nÙ\84اگ Ø§Ù\86 Ú©Û\92 Ø¹Ù\85Ù\84 Ú©Ù\88 Ù\85Ú©Ù\85Ù\84 Ú©Ø±Ù\86Û\92 Ú©Û\92 Ù\84Û\8cÛ\92 Ø¢Ù¾ Ú©Ù\88 Û\8cÛ\81اں Ù\86Û\8cا Ù¾Ø§Ø³Ù\88رÚ\88 Ù\85تعÛ\8cÙ\86 (سÛ\8cÙ¹) Ú©Ø±Ù\86ا Û\81Ù\88 Ú¯Ø§Û\94",
+       "resetpass-temp-password": "عارضÛ\8c Ù¾Ø§Ø³Ù\88رÚ\88:",
        "resetpass-abort-generic": "کسی توسیع نے پاس ورڈ کی تبدیلی کو منسوخ کر دیا ہے۔",
        "resetpass-expired": "آپ کے پاس ورد کی مدت ختم ہو چکی ہے۔ داخل ہونے کے لیے براہ کرم نیا پاس ورڈ بنائیں۔",
        "resetpass-expired-soft": "آپ کے پاس ورڈ کی مدت ختم ہو چکی ہے، لہذا اسے دوبارہ بنانے کی ضرورت ہے۔\nبراہ کرم نیا پاس ورڈ بنائیں یا اگر مستقبل میں اس کی ترتیب نو مقصود ہو تو «{{int:authprovider-resetpass-skip-label}}» پر کلک کریں۔",
        "passwordreset-text-many": "{{PLURAL:$1|برقی خط کے ذریعہ عارضی پاس ورڈ حاصل کرنے کے لیے کسی ایک خانے کو پُر کریں۔}}",
        "passwordreset-disabled": "اس ویکی پر پاس ورڈ کی ترتیب نو کی سہولت فعال نہیں ہے۔",
        "passwordreset-emaildisabled": "اس ویکی پر برقی خط کی سہولت غیر فعال ہیں۔",
-       "passwordreset-username": "اسÙ\85Ù\90 ØµØ§Ø±Ù\81:",
+       "passwordreset-username": "صارÙ\81 Ù\86اÙ\85:",
        "passwordreset-domain": "ساحہ:",
        "passwordreset-email": "برقی ڈاک پتہ:",
        "passwordreset-emailtitle": "{{SITENAME}} کھاتہ کی تفصیلات",
        "permissionserrorstext": "درج ذیل {{PLURAL:$1|وجہ|وجوہات}} کی بنا پر آپ کو ایسا کرنے کی اجازت نہیں ہے:",
        "permissionserrorstext-withaction": "درج ذیل {{PLURAL:$1|وجہ|وجوہات}} کی بنا پر آپ کو $2  کی اجازت نہیں ہے:",
        "contentmodelediterror": "آپ اس نسخے میں ترمیم نہیں کر سکتے کیونکہ اس کے مواد کا ماڈل ‌‌<code>$1</code> ہے جو اس صفحہ کے مواد کے موجودہ ماڈل <code>$2</code> سے مختلف ہے۔",
-       "recreate-moveddeleted-warn": "''' انتباہ: آپ ایک گزشتہ حذف شدہ صفحہ دوبارہ تخلیق کررہے ہیں. '''\n\nآپ کو اِس بات پر غور کرنا چاہئے کہ آیا اِس صفحہ کی تدوین جاری رکھنا موزوں ہے یا نہیں.\nصفحہ کا نوشتۂ حذف شدگی و منتقلی یہاں سہولت کی خاطر مہیّا کیا جارہا ہے:",
+       "recreate-moveddeleted-warn": "<strong>انتباہ: آپ ایک گزشتہ حذف شدہ صفحہ دوبارہ تخلیق کر رہے ہیں۔</strong>\n\nآپ کو اِس بات پر غور کرنا چاہیے کہ آیا اِس صفحہ کی تدوین جاری رکھنا موزوں ہے یا نہیں۔\nصفحہ کا نوشتۂ حذف شدگی و منتقلی یہاں سہولت کی خاطر مہیّا کیا جا رہا ہے:",
        "moveddeleted-notice": "اس صفحہ کو حذف کر دیا گیا ہے۔\nحوالہ کے لیے ذیل میں اس صفحہ کا نوشتہ حذف شدگی اور نوشتہ منتقلی درج ہے۔",
        "moveddeleted-notice-recent": "معذرت، اس صفحہ کو حال ہی میں حذف کیا گیا ہے (گزشتہ چوبیس گھنٹوں میں)۔\nحوالہ کے لیے ذیل میں اس صفحہ کا نوشتہ حذف اور نوشتہ منتقلی موجود ہے۔",
        "log-fulllog": "پورا نوشتہ دیکھیے",
        "revdelete-hide-image": "فائل کے مشمولات چھپائیں",
        "revdelete-hide-name": "ہدف اور پیرامیٹرز کو چھپائیں",
        "revdelete-hide-comment": "ترمیمی تبصرہ چھپاؤ",
-       "revdelete-hide-user": "ترمیم کار کا اسمِ صارف / آئی.پی پتہ چُھپاؤ",
+       "revdelete-hide-user": "ترمیم کنندہ کا صارف نام/آئی پی پتہ چھپائیں",
        "revdelete-hide-restricted": "منتظمین اور دیگر صارفین سے معلومات کو پوشیدہ کریں",
        "revdelete-radio-same": "(تبدیل مت کرو)",
        "revdelete-radio-set": "پوشیدہ",
        "yournick": "شخصی دستخط:",
        "prefs-help-signature": "تبادلۂ خیال صفحات پر تبصرہ تحریر کرنے کے بعد یہ \"<nowiki>~~~~</nowiki>\" علامتیں درج کرنی چاہئیں، یہ علامتیں از خود آپ کے دستخط اور وقت میں تبدیل ہو جائیں گی۔",
        "badsig": "ناقص خام دستخط.\nHTML tags جانچئے.",
-       "badsiglength": "آپ کا دستخط کافی طویل ہے.\nیہ $1 {{PLURAL:$1|حرف|حروف}} سے زیادہ نہیں ہونا چاہئے.",
+       "badsiglength": "آپ کا دستخط کافی طویل ہے۔\nیہ $1 {{PLURAL:$1|حرف|حروف}} سے زیادہ نہیں ہونا چاہیے۔",
        "yourgender": "جنس:",
        "gender-unknown": "اگر ممکن ہو تو آپ کے تذکرہ کے وقت سافٹ ویئر غیر جانبدار جنسی الفاظ استعمال کرے گا",
        "gender-male": "مرد",
        "prefs-tabs-navigation-hint": "نکتہ: مختلف خانوں میں جانے کے لیے آپ دائیں اور بائیں کی جہت نما کلیدیں استعمال کر سکتے ہیں۔",
        "userrights": "حقوق صارف",
        "userrights-lookup-user": "صارف کا انتخاب کریں",
-       "userrights-user-editname": "کوئی اسم‌صارف داخل کیجئے:",
+       "userrights-user-editname": "صارف نام درج کیجیے:",
        "editusergroup": "حلقہ ہائے صارف دکھائیں",
        "editinguser": "{{GENDER:$1|صارف}} <strong>[[User:$1|$1]]</strong> $2 کے اختیارات میں تبدیلی",
        "viewinguserrights": "{{GENDER:$1|صارف}} <strong>[[User:$1|$1]]</strong> $2 کے اختیارات میں تبدیلی",
        "ipaddressorusername": "آئی پی پتہ یا صارف نام:",
        "ipbexpiry": "وقت اختتام:",
        "ipbreason": "وجہ:",
-       "ipbreason-dropdown": "* عمومی وجوہات پابندی\n** غلط معلومات کا اندراج\n** صفحات سے متن کا مٹانا\n** بیرونی روابط میں بے کار روابط کی فاضل کاری\n** صفحات میں لغو چیزوں کا اندراج\n** بدتمیزی/بداخلاقی\n** متعدد کھاتوں کا استعمال\n** ناقابلِ قبول اسمِ صارف",
+       "ipbreason-dropdown": "* پابندی کی عام وجوہات\n** غلط معلومات کا اندراج\n** صفحات سے متن کا مٹانا\n** بیرونی روابط میں بے کار روابط کی فاضل کاری\n** صفحات میں لغو چیزوں کا اندراج\n** بدتمیزی/بداخلاقی\n** متعدد کھاتوں کا استعمال\n** ناقابلِ قبول صارف نام",
        "ipb-hardblock": "اس آئی پی پتے سے داخل شدہ صارفین کو ترمیم کاری سے باز رکھیں",
        "ipbcreateaccount": "کھاتہ سازی سے باز رکھیں",
        "ipbemailban": "برقی خط بھیجنے سے باز رکھیں",
        "tooltip-recreate": "حذف شدہ صفحہ ہونے کے باوجود اسے دوبارہ تخلیق کریں",
        "tooltip-upload": "اپلوڈ کریں",
        "tooltip-rollback": "پچھلے صارف کی کی گئی اِس صفحے پر استرجع شدہ ترامیم کو ایک کلِک میں واپس کریں",
-       "tooltip-undo": "''استرجع'' اس ترمیم کو پچھلی ترمیم کے جانب واپس کردیگا اور نمائشی انداز میں خانہ ترمیم کھول دے گا۔ آپ مختصراً سبب بیان کرنے کے بھی مجاز ہونگے۔",
+       "tooltip-undo": "«استرجع» اس ترمیم کو پچھلی ترمیم کے جانب واپس کر دے گا اور نمائشی انداز میں خانہ ترمیم کھول دے گا۔ آپ مختصراً سبب بیان کرنے کے بھی مجاز ہوں گے۔",
        "tooltip-preferences-save": "ترجیحات محفوظ کریں",
        "tooltip-summary": "مختصر خلاصہ درج کریں",
        "common.css": "body,\ntextarea {\n    font-family: Amiri;\n}",
        "markedaspatrollederrornotify": "بطور مراجعت نشان زد نہیں کیا جا سکا۔",
        "patrol-log-page": "نوشتہ مراجعت",
        "patrol-log-header": "ذیل میں مراجعت شدہ ترامیم کا نوشتہ ہے۔",
-       "log-show-hide-patrol": "$1 نوشتہ مراجعت",
-       "log-show-hide-tag": "$1 نوشتہ ٹیگ",
        "confirm-markpatrolled-button": "ٹھیک ہے",
        "confirm-markpatrolled-top": "$2 کے نسخہ $3 کو بطور مراجعت شدہ نشان زد کریں؟",
        "deletedrevision": "حذف شدہ پرانی ترمیم $1۔",
index 79664ec..8a52c64 100644 (file)
        "markedaspatrollederrornotify": "Eror durante ła verifega.",
        "patrol-log-page": "Modifiche verificàe",
        "patrol-log-header": "Qua de sèvito xe elencàe le verifiche de le modifiche.",
-       "log-show-hide-patrol": "$1 el registro dei canbiamenti verificài",
        "deletedrevision": "Vecia version scancełà $1",
        "filedeleteerror-short": "Eror ne la scancelazion del file: $1",
        "filedeleteerror-long": "Se gà verificà dei eror nel tentativo de scancelar el file:\n\n$1",
index 22fb275..b55152f 100644 (file)
        "markedaspatrollederror-noautopatrol": "Teile ei sa znamoita ičetoi toižetusid kut patruliruidud.",
        "patrol-log-page": "Patruliruindan aigkirj",
        "patrol-log-header": "Nece om patruliruidud versijoiden aiglehtez.",
-       "log-show-hide-patrol": "$1 patruliruindan aigkirj",
        "deletedrevision": "$1-lehtpolen vanh versii om čutud",
        "filedeleteerror-short": "Failan čudandan petuz: $1",
        "filedeleteerror-long": "Necen failan heitmižen aigan ozaižihe petused:\n\n$1",
index 122c6df..77e9851 100644 (file)
        "markedaspatrollederrornotify": "Đánh dấu tuần tra bị thất bại.",
        "patrol-log-page": "Nhật trình tuần tra",
        "patrol-log-header": "Đây là nhật trình tuần tra phiên bản.",
-       "log-show-hide-patrol": "$1 nhật trình tuần tra",
-       "log-show-hide-tag": "Nhật trình đánh dấu $1",
        "confirm-markpatrolled-button": "OK",
        "confirm-markpatrolled-top": "Đánh dấu tuần tra phiên bản $3 của $2?",
        "deletedrevision": "Đã xóa phiên bản cũ $1",
index 39b4c38..60d1098 100644 (file)
        "markedaspatrollederror-noautopatrol": "No dalol zepön votükamis lönik ola.",
        "patrol-log-page": "Jenotalised zepamas",
        "patrol-log-header": "Is lisedons revids pezepöl.",
-       "log-show-hide-patrol": "Jenotalised Zepamas: $1",
        "deletedrevision": "Fomam büik: $1 pemoükon.",
        "filedeleteerror-short": "Pöl pö moükam ragiva: $1",
        "filedeleteerror-long": "Pöls petuvons dü moükam ragiva:\n\n$1",
index 7f670e1..2d5c8ad 100644 (file)
        "markedaspatrollederror": "Diri nakakamarka komo ginpatrolya na",
        "patrol-log-page": "Talaan han pagpatrolya",
        "patrol-log-header": "Ini in uska talaan hin mga ginpatrolya nga mga rebisyon.",
-       "log-show-hide-patrol": "$1 talaan hin pagpatrolya",
        "deletedrevision": "Ginpara an daan nga rebisyon $1",
        "filedeleteerror-short": "Nagsayop ha pagpara han paypay: $1",
        "filedeleteerror-long": "Mga sayop nga ginengkwentro samtang nagpapara hin paypay:\n\n$1",
index 5f5df18..4d3ec30 100644 (file)
        "markedaspatrollederrornotify": "מארקירן ווי קאנטראלירט דורכגעפאלן.",
        "patrol-log-page": "פאטראלירן לאג-בוך",
        "patrol-log-header": "דאס איז א לאג-בוך פון פאַטראלירטע רעוויזיעס.",
-       "log-show-hide-patrol": "$1 פאַטראלירן לאג-בוך",
-       "log-show-hide-tag": "$1 טאג־לאגבוך",
        "confirm-markpatrolled-button": "יאָ",
        "confirm-markpatrolled-top": "מארקירן $3 פון $2 ווי קאנטראלירט?",
        "deletedrevision": "אויסגעמעקט אלטע ווערסיע $1.",
index 823bfc7..7ad682b 100644 (file)
@@ -9,7 +9,8 @@
                        "Macofe",
                        "Matma Rex",
                        "Wikicology",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "Olaniyan Olushola"
                ]
        },
        "tog-underline": "Ìfàlàsábẹ́ àwọn àjápọ̀:",
        "recentchanges": "Àwọn àtúnṣe tuntun",
        "recentchanges-legend": "Àwọn àṣàyàn fún àtúnṣe tuntun",
        "recentchanges-summary": "Ẹ tẹ̀ lé àwọn àtúnṣe tuntun sí wiki lórí ojúewé yìí.",
+       "recentchanges-noresult": "Kò sì áwọ́n iyipada ni akókò yì ti o ba àwon ìlànà yí mu.",
        "recentchanges-feed-description": "Ẹ tẹ̀ lé àwọn àtúnṣe àìpẹ́ ọjọ́ sí wiki nínú àkótán feed yìí.",
        "recentchanges-label-newpage": "Àtúnṣe yìí dá ojúewé tuntun",
        "recentchanges-label-minor": "Àtùnṣe kékeré nìyí",
        "markedaspatrollederrornotify": "Ìkùnà ìṣàmìsí bíi sísọ́.",
        "patrol-log-page": "Àkọọ́lẹ̀ ìsọ́",
        "patrol-log-header": "Àkọọ́lẹ̀ àwọn àtúnyẹ̀wò sísọ́ nì yí.",
-       "log-show-hide-patrol": "$1 àkọọ́lẹ̀ ìsọ́",
        "confirm-markpatrolled-button": "OK",
        "deletedrevision": "Àtúnyẹ̀wò àtijọ́ píparẹ́ $1",
        "filedeleteerror-short": "Àsìṣe ìparẹ́ fáílì: $1",
index b88ce6d..83c33d3 100644 (file)
        "markedaspatrollederrornotify": "標做睇過失敗。",
        "patrol-log-page": "巡查日誌",
        "patrol-log-header": "呢個係已經巡查過嘅日誌。",
-       "log-show-hide-patrol": "$1巡查紀錄",
        "confirm-markpatrolled-button": "好",
        "deletedrevision": "刪除咗$1嘅舊有修訂",
        "filedeleteerror-short": "刪除檔案出錯: $1",
index 37c3285..601e427 100644 (file)
        "pool-errorunknown": "ⵜⴰⵣⴳⴰⵍⵜ ⵜⴰⵔⵓⵙⵙⵉⵏⵜ",
        "aboutsite": "ⵖⴼ {{SITENAME}}",
        "aboutpage": "Project:ⵖⴼ",
+       "copyright": "ⵜⵓⵎⴰⵢⵜ ⵜⵍⵍⴰ ⴷⴷⵓ ⵜⵓⵔⴰⴳⵜ $1 ⵖⴰⵙ ⵎⴰ ⵉⵜⵜⵡⴰⴱⴷⴰⵔ ⵓⵏⵎⴳⴰⵍⵏⵏⵙ.",
        "copyrightpage": "{{ns:project}}:ⵉⵣⵔⴼⴰⵏ ⵏ ⵓⵙⵏⵖⵍ",
        "currentevents": "ⵜⵉⵎⵙⴰⵔⵉⵏ ⵜⵉⵎⵉⵔⴰⵏⵉⵏ",
        "currentevents-url": "Project:ⵜⵉⵎⵙⴰⵔⵉⵏ ⵜⵉⵎⵉⵔⴰⵏⵉⵏ",
        "createaccount": "ⵔⵥⵎ ⴽⵔⴰ ⵏ ⵓⵎⵉⴹⴰⵏ",
        "userlogin-resetpassword-link": "ⵜⴻⵜⵜⵓⴷ ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵏⵏⵎ/ⴽ?",
        "userlogin-helplink2": "ⵜⵉⵡⵉⵙⵉ ⴳ ⵓⴽⵛⵛⵓⵎ",
+       "createacct-emailrequired": "ⵉⵎⴰⵢⵍ",
        "createacct-emailoptional": "ⵉⵎⴰⵢⵍ (ⴰⵔⵓⵛⵛⵉⵍ)",
        "createacct-email-ph": "ⵙⵙⴽⵛⵎ ⴰⵏⵙⴰ ⵉⵎⴰⵢⵍ ⵏⵏⴽ",
+       "createacct-another-email-ph": "ⵙⵙⴽⵛⵎ ⴰⵏⵙⴰ ⵉⵎⴰⵢⵍ ⵏⵏⴽ",
        "createacct-realname": "ⵉⵙⵎ ⵏ ⵜⵉⴷⵜ (‍ⵎ ⵜⵔⵉⵜ)",
        "createacct-reason": "ⵜⴰⵎⵏⵜⵉⵍⵜ",
        "createacct-submit": "ⵔⵥⵎ ⴰⵎⵉⴹⴰⵏ {{GENDER:|ⵏⵏⴽ|ⵏⵏⵎ}}",
        "accmailtitle": "ⵜⴰⴳⵓⵔⵉ ⵓⵣⵔⴰⵢ ⵜⴻⵜⵜⵡⴰⵣⵏ",
        "newarticle": "(ⴰⵎⴰⵢⵏⵓ)",
        "newarticletext": "ⵜⴹⴼⴰⵔⴷ ⵢⴰⵏ ⵓⵙⵖⵏ ⵖⵔ ⵢⴰⵜ ⵜⴰⵙⵏⴰ ⵏⵏⴰ ⵓⵔ ⵜⴰ ⵉⵍⵍⵉⵏ. \nⴰⴼⴰⴷ ⴰⴷ ⵜⵙⵏⵓⵍⴼⵓⴷ ⵜⴰⵙⵏⴰ, ⵙⵙⵏⵜⵉ ⵜⵉⵔⵔⴰ ⴳ ⵓⴼⵏⵉⵇ ⴳ ⵉⵣⴷⴷⴰⵔ (ⵥⵔ [$1 ⵜⴰⵙⵏⴰ ⵏ ⵜⵡⵉⵙⵉ] ⵉ ⵡⵓⴳⴳⴰⵔ ⵏ ⵉⵏⵖⵎⵉⵙⵏ). \nⵎⴽ ⵜⵍⵍⵉⴷ ⴷⴰ ⵙ ⵓⵣⴳⴰⵍ, ⴰⴽⵍ ⵖⴼ <strong>ⴰⵖⵓⵍ</strong> ⴳ ⵓⵙⴰⵔⴰ ⵏⵏⴽ.",
+       "anontalkpagetext": "----\n<em>ⵜⵍⵍⵉⴷ ⴳ ⵜⴰⵙⵏ ⵏ ⵓⵎⵙⴰⵡⴰⵍ ⵏ ⵢⴰⵏ ⵓⵏⵙⵙⵎⵔⵙ ⵡⴰⵔⵉⵙⵎ ⵏⵏⴰ ⵜⴰ ⵓⵔ ⵉⵙⴽⵉⵔⵏ ⴰⵎⵉⴹⴰⵏ ⵏⵖ ⵏⵏⴰ ⵜ ⵓⵔ ⵉⵙⵙⵎⵔⵉⵙⵏ</em>.\nⴰⵢⴰ ⴰ ⵖⴼ ⵉⴼⵓⴽⴽ ⴰⴷ ⵏⵙⵙⵎⵔⵙ ⵜⴰⵏⵙⴰ ⵏⵏⵙ IP ⴼⴰⴷ ⴰⴷ ⵜ ⵏⵙⵎⴰⴳⵉ.\nⵢⴰⵜ ⵜⴰⵏⵙⴰ IP ⵥⴹⴰⵔⵏ ⴰⴷ ⵜⵜ ⵙⵙⵓⵔⵏ ⵎⵏⵏⴰⵡ ⵏ ⵉⵏⵙⵙⵎⵔⵙⵏ.\nⵎⴽ ⵜⴳⵉⴷ ⵢⴰⵏ ⵓⵏⵙⵙⵎⵔⵙ ⵡⴰⵔⵉⵙⵎ ⴷ ⴽ ⵜⵖⴹⴼⴷ ⵎⴰⵙ ⴽ ⵡⴰⵜⵙⵏ ⴽⵔⴰ ⵏ ⵉⵅⴼⴰⵡⴰⵍⵏ ⵓⵔ ⵙⵉⴽ ⵉⵥⵍⵉⵏ, ⵜⵓⴼⵉⴷ ⴰⴷ  [[Special:CreateAccount|ⵙⴽⵔ ⵢⴰⵏ ⵓⵎⵉⴹⴰⵏ]] ⵏⵖ ⴷ [[Special:UserLogin|ⴽⵛⵎ]] ⴱⴰⵔ ⴰⴷ ⵜⴰⵏⴼⴷ ⵉ ⴽⵔⴰⵢⴳⴰⵜ ⴰⵎⵔⴽⵙ ⴷ ⵉⵎⴷⵔⴰⵡⵏ ⵢⴰⴹⵏ.",
        "noarticletext": "ⵓⵔ ⵉⵍⵍⵉ ⴽⵔⴰ ⵏ ⵓⴹⵔⵉⵙ ⴳ ⵜⴰⵙⵏⴰ ⴰⴷ ⵖⵉⵍⴰ. \nⵜⵣⵎⵔⴷ ⴰⴷ [[Special:Search/{{PAGENAME}}|ⵜⵔⵣⵓⴷ ⵖⴼ ⵓⵣⵡⵍ ⵏⵏⵙ]] ⴳ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵢⴰⴹⵏ, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ⵔⵣⵓ ⵖⴼ logs ⵖⵔⵙ ⵉⵇⵇⵏⴻⵏ],\nⵏⵖ [{{fullurl:{{FULLPAGENAME}}|action=edit}} ⵙⵏⵓⵍⴼⵓ ⵜⴰⵙⵏⴰ]</span>.",
        "noarticletext-nopermission": "ⴷⵖⵉ ⵓⵔ ⵉⵍⵍⵉ ⴰⵡⴷ ⴽⵔⴰ ⵏ ⵓⴹⵔⵉⵚ ⴳ ⵜⴰⵙⵏⴰ ⴰ.\nⵜⵣⵎⵔⴷ ⴰⴷ [[Special:Search/{{PAGENAME}}|ⵜⵔⵣⵓⴷ ⵖⴼ ⵓⵣⵡⵍ ⵏⵏⵙ]] ⴳ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵢⴰⴹⵏⵉⵏ, ⵏⵖ <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ⵔⵣⵓ ⵖⴼ ⵉⵣⵎⵎⴻⵎⵏ ⵉⵣⴷⵉⵏ]</span>, ⵎⴰⵛⴰ ⵓⵔ ⴷⴰⵔⴽ ⵜⵓⵔⴰⴳⵜ ⴰⴷ ⵜⵙⵏⵓⵍⴼⵓⴷ ⵜⴰⵙⵏⴰ ⴰ.",
        "userpage-userdoesnotexist-view": "ⴰⵎⵉⴹⴰⵏ ⵏ ⵓⵎⵙⵙⵎⵔⵙ $1 ⵓⵔ ⵉⵜⵜⵓⵣⵎⵎⴻⵎ.",
        "filehist-revert": "ⵔⴰⵔ ⴷ",
        "filehist-current": "ⴰⵎⵉⵔⴰⵏ",
        "filehist-datetime": "ⴰⵙⴰⴽⵓⴷ/ⴰⴽⵓⴷ",
-       "filehist-thumb": "âµ\9câ´°âµ\9bâµ\8fⵢⴰâµ\8dâµ\9c",
+       "filehist-thumb": "âµ\9cⴰⵡâµ\8dâ´°â´¼âµ\9c âµ\8eⵥⵥâµ\89âµ¢âµ\8f",
        "filehist-thumbtext": "ⵜⴰⵛⵏⵢⴰⵍⵜ ⵏ ⵜⵓⵏⵖⵉⵍⵜ ⴳ $1",
        "filehist-nothumb": "ⵓⵔ ⵉⵍⵍⵉ ⵓⵙⵎⵥⵉⵢ",
        "filehist-user": "ⴰⵙⵎⵔⴰⵙ",
        "filehist-comment": "ⴰⵖⴼⴰⵡⴰⵍ",
        "imagelinks": "ⴰⵙⵎⵔⵙ ⵏ ⵓⴼⴰⵢⵍⵓ",
        "linkstoimage": "{{PLURAL:$1|ⵉⵣⴷⴰⵢⵏ ⵏ ⵜⵙⵏⴰ|$1 ⴰⵣⴷⴰⵢ ⵏ ⵜⵙⵏⴰ}} ⵖⵔ ⵓⴼⴰⵢⵍⵓ ⴰⴷ:",
+       "linkstoimage-more": "ⵓⴳⴳⴰⵔ ⵏ {{PLURAL:$1|ⵢⴰⵜ ⵜⴰⵙⵏⴰ ⴰⵢⴷ ⵉⵙⵙⵎⵔⴰⵙⵏ| $1 ⵏ ⵜⴰⵙⵏⵉⵡⵉⵏ ⴰⵢⴷ ⵉⵙⵙⵎⵔⴰⵙⵏ}} ⴰⴼⴰⵢⵍⵓ ⴰⴷ.\nⵜⵙⴽⴰⵏ ⵜⵍⴳⴰⵎⵜ ⴰⴷ ⵖⴰⵙ {{PLURAL:$1|ⵜⴰⵙⵏⴰ ⵜⴰⵎⵣⵡⴰⵔⵓⵜ  ⵉⵙⵙⵎⵔⴰⵙⵏ $1 ⵜⴰⵙⵏⵉⵡⵉⵏ ⵜⵉⵎⵣⵡⴰⵔⴰ ⵉⵙⵙⵎⵔⴰⵙⵏ}} ⴰⴼⴰⵢⵍⵓ ⴰⴷ.\nⵜⵍⵍⴰ ⵢⴰⵜ [[Special:WhatLinksHere/$2|ⵜⴰⵍⴳⴰⵎⵜ ⵉⵎⴷⵏ]].",
        "nolinkstoimage": "ⵓⵔ ⵍⵍⵉⵏⵜ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵏⵏⴰ ⵉⵇⵇⵏⴻⵏ ⵖⵔ ⵓⴼⴰⵢⵍⵓ ⴰ.",
        "linkstoimage-redirect": "$1 (ⴰⵙⵡⴰⵍⴰ ⵏ ⵓⴼⴰⵢⵍⵓ) $2",
        "sharedupload-desc-here": "ⴰⵙⴷⴰⵡ ⴰⴷ ⵙⴳ $1 ⵉⵥⴹⴰⵔ ⴰ ⵉⵜⵜⵡⴰⵙⵎⵔⵙ ⴳ ⵉⵙⵏⵜⴰⵢⵏ ⵢⴰⴹⵏ.\nⴰⵙⵏⵓⵎⵎⵍ ⵏⵙ ⴳ [$2 ⵜⴰⵙⵏⴰ ⵏⵙ ⵏ ⵓⵙⵏⵓⵎⵎⵍ] ⵜⵡⴰⵙⵎⴰⵍ ⵙⴰⴷⵓ.",
        "speciallogtitlelabel": "ⴰⵙⴰⵖⴷ (ⴰⵣⵡⵍ ⵏⵖ {{ns:user}}:ⵉⵙⵎ ⵏ ⵓⵏⵙⵙⵔⵙ) :",
        "log": "ⵉⵣⵎⵎⴻⵎⵏ",
        "all-logs-page": "ⵜⵉⵎⵙⵙⴽⵜⵉⵜⵉⵏ ⴰⴽⴽ ⵜⵉⵣⴰⵢⵣⵉⵏ",
+       "alllogstext": "ⴰⵙⴽⴰⵏ ⵉⵎⵎⵔⴽⵙⵏ ⵏ ⵜⵎⵙⵙⴽⵜⵉⵜⵉⵏ ⴰⴽⴽ ⵉⵍⵍⴰⵏ ⴳ {{SITENAME}}.\nⵜⵓⴼⵉⴷ ⴰⴷ ⵜⵙⵏⵏⵥⵍⵉⴷ ⴰⵙⴽⴰⵏ ⵙ ⵓⵙⵜⴰⵢ ⵏ ⵡⴰⵏⴰⵡ ⵏ ⵜⵎⵙⵙⴽⵜⵉⵜ, ⵉⵙⵎ ⵏ ⵓⵏⵙⵙⵎⵔⵙ ⵏⵖ ⵜⴰⵙⵏⴰ ⵉⴳⴰ ⵡⴰⴷⴷⴰⴷ (ⵙⵉⵏ ⵉⵎⴳⴳⵓⵔⴰ ⴰⴷ ⵇⵇⵏⴻⵏ ⵖⵔ ⵓⵙⵎⵉⵍ).",
        "logempty": "ⵓⵔ ⵜⵍⵍⵉ ⴰⵡⴷ ⵢⴰⵜ ⵜⵎⵀⵍⵜ ⵉⵎⵙⴰⵙⴰⵏ ⴳ ⵜⵎⵙⵙⴽⵜⵉⵜⵉⵏ.",
        "checkbox-all": "ⵎⴰⵕⵕⴰ",
        "allpages": "ⵜⴰⵙⵏⵉⵡⵉⵏ ⴰⴽⴽ",
        "tooltip-n-currentevents": "ⴰⴼ ⵓⴳⴳⴰⵔ ⵏ ⵉⵏⵖⵎⵉⵙⵏ ⵖⴼ ⵜⵉⵎⵙⴰⵔⵉⵏ ⵜⵉⵎⵉⵔⴰⵏⵉⵏ",
        "tooltip-n-recentchanges": "ⵢⴰⵜ ⵜⵍⴳⴰⵎⵜ ⵏ ⵉⵙⵏⴼⵍⵏ ⵉⵎⴳⴳⵓⵔⴰ ⴳ ⵡⵉⴽⵉ",
        "tooltip-n-randompage": "ⵣⴷⵎ ⵜⴰⵙⵏⴰ ⵜⴰⴷⵀⵎⴰⵙⵜ",
-       "tooltip-n-help": "The place to find out",
+       "tooltip-n-help": "ⴰⴷⵖⴰⵔ ⴳ ⵜⴻⵜⵜⴰⴼⴰⴷ",
        "tooltip-t-whatlinkshere": "ⵓⵎⵓⵖ ⵏ ⵎⴰⵕⵕ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵏ ⵡⵉⴽⵉ ⵉⵣⴷⵉⵏ ⵉ ⴷⴰ",
        "tooltip-t-recentchangeslinked": "ⵉⵙⵏⴼⵍⵏ ⵉⵏⴳⴳⵓⵔⴰ ⴳ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵉⵣⴷⵉⵏ ⵖⵔ ⵜⴰⵙⵏⴰ ⴰ",
        "tooltip-feed-atom": "ⴰⵏⴳⵉ ⵏ ⴰⵜⵓⵎ ⵏ ⵜⴰⵙⵏⴰ ⴰⴷ",
        "tooltip-compareselectedversions": "ⵥⵔ ⴰⵎⵣⴰⵔⴰⵢ ⴳⵔ ⵙⵉⵏ ⵉⵣⵣⵔⴰⵢⵏ ⵉⵜⵜⵓⵙⵜⴰⵢⵏ ⵏ ⵜⴰⵙⵏⴰ ⴰⴷ",
        "tooltip-watch": "ⵔⵏⵓ ⵜⴰⵙⵏⴰ ⴰ ⵉ ⵜⵍⴳⴰⵎⵜ ⵏ ⵓⴹⴼⴼⵓⵔ {{GENDER:|ⵏⵏⴽ|ⵏⵏⵎ}}",
        "tooltip-rollback": "\"ⵔⴰⵔ\" ⵙⵙⵔ ⴰⵙⵏⴼⵍ ⵏⵖ ⵉⵙⵏⴼⴰⵍⵏ ⵏ ⵓⵎⴰⴷⵔⴰⵡ ⴰⵎⴳⴳⴰⵔⵓ ⴳ ⵜⴰⵙⵏⴰ ⴷ ⵙ ⵢⴰⵏ ⵓⴽⵍⵉⴽ",
+       "tooltip-undo": "\"ⵙⵔ\" ⴰⴷ ⵜⵔⴰⵔⴷ ⴰⵙⵏⴼⵍ ⴰ ⵜⵏⵏⵓⵔⵥⵎⴷ ⵜⴰⵍⵖⴰ ⵏ ⵓⵙⵏⴼⵍ ⴳ ⵜⵎⵓⵖⵍⵉ ⵜⴰⵣⵔⴰⵙⴽⴰⵏⵜ. ⵢⴰⵍⵍⴼⵓⵙ ⴰⴷ ⵜⵔⵏⵓⴷ ⴽⵔⴰ ⵏ ⵓⵙⵔⴰⴳ ⴳ ⵓⵙⴳⵣⵍ.",
        "tooltip-summary": "ⴰⵔⴰ ⴽⵔⴰ ⵏ ⵓⵙⴳⵣⵍ ⵎⵥⵥⵉⵢⵏ",
        "simpleantispam-label": "ⵜⵉⵎⵏⵥⵉⵜ ⵎⴳⵍ-ⴳⴰⵔⴰⵙⵎⵔⴰⵔⴰ.\nⴰⴷ <strong>ⵓⵔ</strong> ⵜⵣⵎⵎⴻⵎⴷ ⴰⵎⵢⴰ ⴳ ⵖⵉ!",
        "pageinfo-title": "ⵉⵏⵖⵎⵉⵙⵏ ⵖⴼ $1",
index 30a5434..769fa02 100644 (file)
        "diff-paragraph-moved-toold": "段落已移动。点击跳到旧位置。",
        "difference-missing-revision": "此差异对比的{{PLURAL:$2|$2个版本}}($1){{PLURAL:$2|没有}}找到。\n\n这通常是因为进入了一个已被删除的页面的版本差异对比链接。\n详细信息可以在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中找到。",
        "searchresults": "搜索结果",
+       "search-filter-title-prefix": "只在标题开头为“$1”的页面上搜索",
+       "search-filter-title-prefix-reset": "搜索所有页面",
        "searchresults-title": "“$1”的搜索结果",
        "titlematches": "页面标题匹配",
        "textmatches": "页面内容匹配",
        "speciallogtitlelabel": "目标(标题,或对于用户使用{{ns:user}}:用户名):",
        "log": "日志",
        "logeventslist-submit": "显示",
+       "logeventslist-more-filters": "显示更多日志:",
+       "logeventslist-patrol-log": "巡查日志",
+       "logeventslist-tag-log": "标签日志",
        "all-logs-page": "所有公开日志",
        "alllogstext": "所有{{SITENAME}}公开日志的联合展示。您可以通过选择日志类型、输入用户名(区分大小写)或相关页面(区分大小写)筛选日志条目。",
        "logempty": "在日志中不存在匹配项。",
        "uctop": "(当前)",
        "month": "截止月份:",
        "year": "截止年份:",
+       "date": "起始日期(及更早):",
        "sp-contributions-newbies": "只显示新账户的贡献",
        "sp-contributions-newbies-sub": "新账户的贡献",
        "sp-contributions-newbies-title": "新账户的用户贡献",
        "markedaspatrollederrornotify": "标记为已巡查失败。",
        "patrol-log-page": "巡查日志",
        "patrol-log-header": "这是已巡查版本的日志。",
-       "log-show-hide-patrol": "$1巡查纪录",
-       "log-show-hide-tag": "$1标签日志",
        "confirm-markpatrolled-button": "确定",
        "confirm-markpatrolled-top": "将$2的修订版本$3标记为已巡查么?",
        "deletedrevision": "已删除旧版本$1",
index 9970649..51bb659 100644 (file)
        "diff-paragraph-moved-toold": "段落已被移動。點擊來跳至舊的位置。",
        "difference-missing-revision": "查無此差異 ($1) 中的{{PLURAL:$2|1 次修訂|$2 次修訂}}。\n\n這通常是因為差異的連結過時,頁面已被刪除。\n詳情資訊請參閱 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刪除日誌]。",
        "searchresults": "搜尋結果",
+       "search-filter-title-prefix": "僅搜尋標題開頭為「$1」的頁面",
+       "search-filter-title-prefix-reset": "選擇所有頁面",
        "searchresults-title": "搜尋「$1」的結果",
        "titlematches": "頁面標題符合",
        "textmatches": "頁面內容符合",
        "speciallogtitlelabel": "目標 (標題或以 {{ns:user}}:使用者 表示使用者):",
        "log": "日誌",
        "logeventslist-submit": "顯示",
-       "logeventslist-more-filters": "更多篩選",
+       "logeventslist-more-filters": "顯示額外日誌:",
        "logeventslist-patrol-log": "巡查日誌",
        "logeventslist-tag-log": "標籤日誌",
        "all-logs-page": "所有公開日誌",
        "markedaspatrollederrornotify": "標記為已巡查失敗。",
        "patrol-log-page": "巡查日誌",
        "patrol-log-header": "這是已巡查的修訂版本的日誌。",
-       "log-show-hide-patrol": "$1 巡查日誌",
-       "log-show-hide-tag": "$1 標籤日誌",
        "confirm-markpatrolled-button": "確定",
        "confirm-markpatrolled-top": "標記 $2 的修訂 $3 為已巡查?",
        "deletedrevision": "已刪除舊修訂 $1",
index 131172a..9955e95 100644 (file)
@@ -14,7 +14,8 @@
                        "Justincheng12345",
                        "LNDDYL",
                        "Liuxinyu970226",
-                       "Quest for Truth"
+                       "Quest for Truth",
+                       "Wxyveronica"
                ]
        },
        "tog-watchlisthidebots": "隱藏監視清單中機械人的編輯",
        "october": "十月",
        "november": "十一月",
        "december": "十二月",
+       "jan": "1月",
+       "feb": "2月",
+       "mar": "3月",
+       "apr": "4月",
+       "may": "5月",
+       "jun": "6月",
+       "jul": "7月",
+       "aug": "8月",
+       "sep": "9月",
+       "oct": "10月",
+       "nov": "11月",
+       "dec": "12月",
        "mytalk": "我的討論頁",
+       "navigation": "導覽",
+       "namespaces": "命名空間",
+       "variants": "變體",
+       "navigation-heading": "導覽菜單",
        "tagline": "從 {{SITENAME}}",
+       "help": "說明",
        "search": "搜尋",
+       "searchbutton": "搜尋",
+       "searcharticle": "執行",
        "printableversion": "可打印版",
        "permalink": "靜態連結",
        "print": "打印",
+       "edit": "編輯",
+       "talkpagelinktext": "對話",
        "specialpage": "特殊頁面",
+       "personaltools": "個人工具",
+       "talk": "討論",
+       "views": "檢視",
+       "toolbox": "工具",
        "jumpto": "跳到:",
+       "jumptonavigation": "導覽",
        "jumptosearch": "搜尋",
+       "aboutsite": "關於 {{SITENAME}}",
        "aboutpage": "Project:關於我們",
+       "disclaimers": "免責聲明",
+       "disclaimerpage": "本專案:一般免責聲明",
+       "mainpage": "首頁",
        "privacy": "私隱政策",
        "privacypage": "Project:私隱政策",
+       "retrievedfrom": "取自 \"$1\"",
+       "editsection": "編輯",
+       "editsectionhint": "編輯章節:$1",
+       "site-atom-feed": "$1 Atom摘要",
        "red-link-title": "$1 (頁面不存在)",
        "nstab-user": "用戶頁面",
        "nstab-special": "特殊頁面",
        "nstab-template": "模板",
+       "mainpage-nstab": "首頁",
        "editinginterface": "<strong>警告:</strong>您正在編輯的頁面文字是用來作為軟件介面使用。更改此頁面將會影響其他用戶在此 Wiki 上看到的用戶介面。",
        "yourname": "用戶名稱:",
        "userlogin-yourname": "用戶名稱",
        "nav-login-createaccount": "登入/創造帳戶",
        "wrongpassword": "您輸入的密碼有錯誤,請再試一次。",
+       "pt-login": "登入",
+       "pt-createaccount": "建立賬號",
        "botpasswords": "機械人密碼",
        "botpasswords-summary": "<em>機械人密碼</em>可在不使用帳號的主要登入密碼情況下,允許透過 API 存取使用者帳號。使用機械人密碼登入的使用者權限或會有所限制。\n\n若你並非必須設定此密碼,你便不應使用此功能。任何人都不會索取你的機械人密碼。",
        "botpasswords-disabled": "機械人密碼已停用。",
        "rcshowhidebots": "$1機械人的編輯",
        "rcshowhideliu": "$1 已註冊的用戶",
        "rcshowhideanons": "$1 匿名用戶",
+       "rc-change-size-new": "變更後為$1{{PLURAL:$1|}}",
        "upload": "上載檔案",
        "listfiles_user": "用戶",
        "filehist-user": "用戶",
        "checkbox-select": "選擇: $1",
        "emailusername": "用戶名稱:",
        "wlshowhidebots": "機械人",
+       "blanknamespace": "(主要)",
        "blockip": "封鎖{{GENDER:$1|用戶}}",
        "contribslink": "貢獻",
        "blocklogtext": "這是用戶的封禁與解禁操作的日誌記錄。\n自動封禁的 IP 位址不予包含。\n請參考 [[Special:BlockList|封禁清單]] 以檢視目前的封禁。",
+       "tooltip-pt-login": "我們建議您登入,但這並非必要",
+       "tooltip-pt-createaccount": "我們建議您建立一個賬號并登入,但這並非必要",
        "tooltip-search": "搜尋 {{SITENAME}}",
        "tooltip-search-go": "若是真有其頁,則進入相同名字的頁面",
        "tooltip-search-fulltext": "在此頁面內搜尋此文字",
+       "tooltip-p-logo": "前往首頁",
        "tooltip-n-mainpage": "回到首頁",
        "tooltip-n-mainpage-description": "回到首頁",
+       "tooltip-n-recentchanges": "wiki近期變更清單",
        "tooltip-n-randompage": "跳到一個隨機抽取的頁面",
+       "tooltip-n-help": "尋求說明",
        "tooltip-t-contributions": "此用戶的貢獻清單",
        "tooltip-t-upload": "上載檔案",
+       "tooltip-t-specialpages": "特殊頁面總清單",
        "tooltip-t-print": "這個頁面的可打印版本",
        "tooltip-ca-nstab-user": "檢視用戶頁面",
+       "pageinfo-toolboxlink": "頁面咨詢",
        "newimages-showbots": "顯示機械人上傳的檔案",
        "exif-rowsperstrip": "每帶行數",
        "redirect-user": "用戶 ID",
        "specialpages": "特殊頁面",
        "tags-source-manual": "由使用者與機械人手動套用",
-       "logentry-managetags-activate": "$1{{GENDER:$2|已啟用}}標籤「$4」供使用者與機械人使用"
+       "logentry-managetags-activate": "$1{{GENDER:$2|已啟用}}標籤「$4」供使用者與機械人使用",
+       "searchsuggest-search": "搜尋{{SITENAME}}"
 }
index 5f87e16..039666b 100644 (file)
@@ -56,7 +56,7 @@ wikidata|https://www.wikidata.org/wiki/$1|0|https://www.wikidata.org/w/api.php
 wikif1|http://www.wikif1.org/$1|0|
 wikihow|https://www.wikihow.com/$1|0|https://www.wikihow.com/api.php
 wikinfo|http://wikinfo.co/English/index.php/$1|0|
-wikimedia|https://wikimediafoundation.org/wiki/$1|0|https://wikimediafoundation.org/w/api.php
+wikimedia|https://foundation.wikimedia.org/wiki/$1|0|https://foundation.wikimedia.org/w/api.php
 wikinews|https://en.wikinews.org/wiki/$1|0|https://en.wikinews.org/w/api.php
 wikipedia|https://en.wikipedia.org/wiki/$1|0|https://en.wikipedia.org/w/api.php
 wikiquote|https://en.wikiquote.org/wiki/$1|0|https://en.wikiquote.org/w/api.php
index 9e6072b..68ebedf 100644 (file)
@@ -58,7 +58,7 @@ REPLACE INTO /*$wgDBprefix*/interwiki (iw_prefix,iw_url,iw_local,iw_api) VALUES
 ('wikif1','http://www.wikif1.org/$1',0,''),
 ('wikihow','https://www.wikihow.com/$1',0,'https://www.wikihow.com/api.php'),
 ('wikinfo','http://wikinfo.co/English/index.php/$1',0,''),
-('wikimedia','https://wikimediafoundation.org/wiki/$1',0,'https://wikimediafoundation.org/w/api.php'),
+('wikimedia','https://foundation.wikimedia.org/wiki/$1',0,'https://foundation.wikimedia.org/w/api.php'),
 ('wikinews','https://en.wikinews.org/wiki/$1',0,'https://en.wikinews.org/w/api.php'),
 ('wikipedia','https://en.wikipedia.org/wiki/$1',0,'https://en.wikipedia.org/w/api.php'),
 ('wikiquote','https://en.wikiquote.org/wiki/$1',0,'https://en.wikiquote.org/w/api.php'),
index 390d873..9101fba 100644 (file)
                left: 50%;
                // Make sure the middle of the spinner is centered, rather than its left edge
                margin-left: -3 * @rcfilters-spinner-size / 2;
-
-               opacity: 0.8;
                white-space: nowrap;
 
                & .rcfilters-spinner-bounce,
                &:before,
                &:after {
                        content: '';
-                       display: inline-block;
+                       background-color: @colorGray7;
+                       display: block;
+                       float: left;
                        width: @rcfilters-spinner-size;
                        height: @rcfilters-spinner-size;
-                       background-color: @colorGray12;
                        border-radius: 100%;
-                       .animation( rcfiltersBouncedelay 1.5s ease-in-out -0.16s infinite both );
+                       .animation( rcfiltersBouncedelay 1600ms ease-in-out -160ms infinite both );
                }
 
                &:before {
-                       .animation-delay( -0.33s );
+                       margin-right: 4px;
+                       .animation-delay( -330ms );
                }
 
                &:after {
+                       margin-left: 4px;
                        .animation-delay( 0s );
                }
        }
 
 @-webkit-keyframes rcfiltersBouncedelay {
        0%,
-       80%,
+       50%, // equals 800ms
        100% {
-               -webkit-transform: scale( 0.7 );
-               transform: scale( 0.7 );
+               -webkit-transform: scale( 0.625 );
        }
-       40% {
-               background-color: @colorGray10;
+       20% { // equals 320ms
+               opacity: 0.87;
                -webkit-transform: scale( 1 );
-               transform: scale( 1 );
        }
 }
 
 @-moz-keyframes rcfiltersBouncedelay {
        0%,
-       80%,
+       50%,
        100% {
-               -moz-transform: scale( 0.7 );
-               transform: scale( 0.7 );
+               -moz-transform: scale( 0.625 );
        }
-       40% {
-               background-color: @colorGray10;
-               -moz-transform: scale( 0.7 );
-               transform: scale( 1 );
+       20% {
+               opacity: 0.87;
+               -moz-transform: scale( 1 );
        }
 }
 
 @keyframes rcfiltersBouncedelay {
        0%,
-       80%,
+       50%,
        100% {
-               transform: scale( 0.7 );
+               transform: scale( 0.625 );
        }
-       40% {
-               background-color: @colorGray10;
+       20% { // equals 320ms
+               opacity: 0.87;
                transform: scale( 1 );
        }
 }
index 16b2591..5137c76 100644 (file)
 .toctogglecheckbox:not( :checked ) + .toctitle .toctogglelabel:after {
        content: '@{msg-hidetoc}';
 }
+
+/*
+Cached: https://phabricator.wikimedia.org/T195053#4417392
+Can be cleared at least one week after the above comment
+*/
+.toctogglespan ~ .toctoggle {
+       display: none;
+}
index d9a21ee..b151002 100644 (file)
@@ -1394,7 +1394,7 @@ Non-word characters don't terminate tag names (T19663, T42670, T54022)
 <s.foo> doesn't terminate </s.foo>
 
 <sub-ID#1>
-!! html
+!! html/php
 <p>&lt;blockquote|&gt;a&lt;/blockquote&gt;
 </p><p>&lt;b→&gt; doesn't terminate &lt;/b→&gt;
 </p><p>&lt;bä&gt; doesn't terminate &lt;/bä&gt;
@@ -1457,12 +1457,10 @@ parsoid=wt2html
 </b>
 
 <s.foo>s</s>
-!! html/php+tidy
+!! html+tidy
 <p class="mw-empty-elt">
 </p><p>&lt;s.foo&gt;s
 </p>
-!! html/parsoid
-<p>&lt;s.foo&gt;s</p>
 !! end
 
 ###
@@ -2021,22 +2019,18 @@ a <div>foo</div>
 </p>
 !! end
 
-# Remex wraps empty tag runs with p-tags.
-# Parsoid strips them out during p-wrapping.
 !! test
 No p-wrappable content
+!! options
+parsoid=wt2html,html2html
 !! wikitext
 <span><div>x</div></span>
 <span><s><div>x</div></s></span>
 <small><em></em></small><span><s><div>x</div></s></span>
-!! html/php+tidy
+!! html+tidy
 <span><div>x</div></span>
 <span><s><div>x</div></s></span>
 <p><small><em></em></small></p><span><s><div>x</div></s></span>
-!! html/parsoid
-<span><div>x</div></span>
-<span><s><div>x</div></s></span>
-<small><em></em></small><span><s><div>x</div></s></span>
 !! end
 
 # T177612: Parsoid-only test
@@ -2052,6 +2046,8 @@ x
 
 !! test
 Block tag on one line (<blockquote>)
+!! options
+parsoid=wt2html,html2html
 !! wikitext
 a <blockquote>foo</blockquote>
 
@@ -2083,6 +2079,8 @@ b </p><div>foo</div>
 
 !! test
 Block tag on both lines (<blockquote>)
+!! options
+parsoid=wt2html,html2html
 !! wikitext
 a <blockquote>foo</blockquote>
 
@@ -2122,12 +2120,6 @@ x </p><div>foo</div><p> z
 </p>
 !! end
 
-# The difference between Parsoid & Remex here
-# is because of Parsoid's Tidy-emulation code
-# for p-wrapping. We'll start work to remove this
-# emulation code in Parsoid sooner than later.
-# Remex wraps empty tag runs with p-tags.
-# Parsoid strips them out in a separate pass.
 !! test
 Empty lines between lines with block tags
 !! wikitext
@@ -2349,6 +2341,22 @@ hi
 </p>
 !! end
 
+!! test
+Dangling table row doesn't prevent p-wrapping
+!! options
+parsoid=wt2html,html2html
+!! wikitext
+{|
+| hi
+|-
+|} ho
+!! html/parsoid
+<table>
+<tbody><tr><td>hi</td></tr>
+<tr class="mw-empty-elt"></tr>
+</tbody></table><p> ho</p>
+!! end
+
 ###
 ### Preformatted text
 ###
@@ -2486,6 +2494,8 @@ Bar
 
 !! test
 T17491: <ins>/<del> in blockquote
+!! options
+parsoid=wt2html
 !! wikitext
 <blockquote>
 Foo <del>bar</del> <ins>baz</ins> quux
@@ -2505,6 +2515,8 @@ Foo <del>bar</del> <ins>baz</ins> quux
 
 !! test
 T17491: <ins>/<del> in blockquote (2)
+!! options
+parsoid=wt2html
 !! wikitext
 <blockquote>Foo <del>bar</del> <ins>baz</ins> quux
 </blockquote>
@@ -2838,6 +2850,7 @@ Barack Obama <President> of the United States
 </p>
 !! end
 
+## Remex doesn't account for fostered content.
 !! test
 Handle broken pre-like tags (T66025)
 !! options
@@ -2856,7 +2869,7 @@ parsoid=wt2html
 !! html/parsoid
 <pre typeof="mw:Transclusion mw:Extension/pre" about="#mwt2" data-parsoid='{"stx":"html","a":{"&lt;pre":null},"sa":{"&lt;pre":""},"pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;pre &lt;pre>x&lt;/pre>"}},"i":0}}]}'>x</pre>
 
-<span data-parsoid='{"fostered":true,"autoInsertedEnd":true,"autoInsertedStart":true}'>&lt;pre </span><table data-parsoid='{"stx":"html"}'></table>
+<p data-parsoid='{"fostered":true,"autoInsertedEnd":true,"autoInsertedStart":true}'>&lt;pre </p><table data-parsoid='{"stx":"html"}'></table>
 !! end
 
 !! test
@@ -3518,8 +3531,10 @@ parsoid=wt2html,html2html
 </td></tr></tbody></table>
 !! end
 
-!!test
+!! test
 3a. Indent-Pre and block tags (single-line html)
+!! options
+parsoid=wt2html,html2html
 !! wikitext
  a <p> foo </p>
  b <div> foo </div>
@@ -3531,18 +3546,17 @@ parsoid=wt2html,html2html
  c <blockquote> foo </blockquote>
 <pre><span> foo </span>
 </pre>
-!! html/parsoid
- <p>a </p><p data-parsoid='{"stx":"html"}'> foo </p>
- <p>b </p><div data-parsoid='{"stx":"html"}'> foo </div>
- <p>c </p><blockquote data-parsoid='{"stx":"html"}'> foo </blockquote>
-<pre><span> foo </span>
-</pre>
 !! html/php+tidy
 <p> a </p><p> foo </p><p>
  b </p><div> foo </div><p>
  c </p><blockquote><p> foo </p></blockquote>
 <pre><span> foo </span>
 </pre>
+!! html/parsoid
+<p> a </p><p data-parsoid='{"stx":"html"}'> foo </p><p>
+ b </p><div data-parsoid='{"stx":"html"}'> foo </div><p>
+ c </p><blockquote data-parsoid='{"stx":"html"}'><p> foo </p></blockquote>
+<pre><span data-parsoid='{"stx":"html"}'> foo </span></pre>
 !! end
 
 !! test
@@ -3630,17 +3644,17 @@ foo
 
 !! test
 4. Indent-Pre and extension tags
+!! options
+parsoid=wt2html,html2html
 !! wikitext
  a <tag />
-!! html/php
- a <pre>
-NULL
+!! html/php+tidy
+<p> a </p><pre>NULL
 array (
 )
 </pre>
-
 !! html/parsoid
- a <pre typeof="mw:Extension/tag" about="#mwt2" data-parsoid='{}' data-mw='{"name":"tag","attrs":{},"body":null}'></pre>
+<p> a </p><pre typeof="mw:Extension/tag" about="#mwt2" data-mw='{"name":"tag","attrs":{},"body":null}'></pre>
 !! end
 
 !! test
@@ -6851,7 +6865,7 @@ parsoid=wt2html,html2html
 <p>ho"&gt;ha&lt;/div&gt;
 </p>
 !! html/parsoid
-<span typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"ho\">ha&lt;/div>"}},"i":0}}]}'>ho">ha</span>
+<p about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"ho\">ha&lt;/div>"}},"i":0}}]}'>ho">ha</p>
 !! end
 
 !! test
@@ -7313,10 +7327,11 @@ Wikitext table with html-syntax row
 <td>foo</td></tr></tbody></table>
 !! end
 
+## Remex doesn't account for fostered content.
 !! test
 Fostered content in tables: Plain text
 !! options
-parsoid=wt2html,html2html
+parsoid=wt2html
 !! wikitext
 {|
 |-
@@ -7334,9 +7349,9 @@ a
 a
 <table></table>
 !! html/parsoid
-<span data-parsoid='{"fostered":true,"autoInsertedEnd":true,"autoInsertedStart":true}'>
-a
-</span><table>
+<p data-parsoid='{"fostered":true,"autoInsertedEnd":true,"autoInsertedStart":true}'>
+a</p>
+<table>
 <tbody><tr class="mw-empty-elt" data-parsoid='{"startTagSrc":"|-"}'></tr></tbody></table>
 !! end
 
@@ -10150,6 +10165,8 @@ Unbalanced closing block tags break a list
 
 !! test
 Unbalanced closing non-block tags don't break a list
+!! options
+parsoid=wt2html,html2html
 !! wikitext
 <span>
 *a</span><span>
@@ -10160,12 +10177,9 @@ Unbalanced closing non-block tags don't break a list
 <ul><li>a<span></span></li>
 <li>b</li></ul>
 !! html/parsoid
-<span>
-<ul>
-<li>a<span></span></li>
-<li>b</li>
-</ul>
-</span>
+<p><span data-parsoid='{"stx":"html","autoInsertedEnd":true}'></span></p>
+<ul><li>a<span data-parsoid='{"stx":"html","autoInsertedEnd":true}'></span></li>
+<li>b</li></ul>
 !! end
 
 # Parsoid does some post-dom-building cleanup
@@ -10186,14 +10200,7 @@ parsoid=wt2html,wt2wt,html2html
 !! end
 
 # Output is ugly because of all the misnested tag fixups.
-# Remex is wrapping p-tags around empty elements.
-# Parsoid has special-case handling of this pattern of
-# wrapping lists in formatting tags.
-# FIXME: Should we remove this code from Parsoid? Or add
-# special support in Remex? If the latter, maybe just wait
-# for Parsoid to become the default parser.
-# See T70395.
-!!test
+!! test
 1. List embedded in a formatting tag
 !! wikitext
 <small>
@@ -10204,17 +10211,13 @@ parsoid=wt2html,wt2wt,html2html
 </small></p><small><ul><li>foo</li></ul></small><small></small><p><small></small>
 </p>
 !! html/parsoid
-<small>
-<ul>
-<li>foo</li>
-</ul>
-</small>
-!!end
+<p><small data-parsoid='{"stx":"html","autoInsertedEnd":true}'></small></p><small data-parsoid='{"stx":"html","autoInsertedEnd":true,"autoInsertedStart":true}'>
+<ul><li data-parsoid='{}'>foo</li></ul></small>
+<p><small data-parsoid='{"stx":"html","autoInsertedStart":true}'></small></p>
+!! end
 
-# Output is ugly because of all the misnested tag fixups
-# Remex is wrapping p-tags around empty elements.
-# Parsoid has code that strips useless p-tags.
-!!test
+# Output is ugly because of all the misnested tag fixups.
+!! test
 2. List embedded in a formatting tag in a misnested way
 !! wikitext
 <small>
@@ -10225,13 +10228,10 @@ parsoid=wt2html,wt2wt,html2html
 </small></p><small></small><ul><small><li>a</li>
 </small><li><small>b</small></li></ul>
 !! html/parsoid
-<small></small>
-<ul><small>
-<li>a</li>
-</small>
-<li><small>b</small></li>
-</ul>
-!!end
+<p><small data-parsoid='{"stx":"html","autoInsertedEnd":true}'></small></p><p></p>
+<ul><small data-parsoid='{"stx":"html","autoInsertedEnd":true,"autoInsertedStart":true}'><li>a</li></small>
+<li><small data-parsoid='{"stx":"html","autoInsertedStart":true}'>b</small></li></ul>
+!! end
 
 ###
 ### Magic Words
@@ -12918,10 +12918,7 @@ Templates: Block Tags: 2. Back-to-back template uses
 
 !!end
 
-## This is an edge case relating to paragraph wrapping.
-## Note that Parsoid fails to match Remex because it's using the closing tag
-## as a heuristic to determine if it's in a block, rather than SAX based events.
-## And Parsoid drops empty elements in templates.
+## Parsoid drops empty elements in templates.
 !! test
 Templates: Correctly encapsulate templates producing </p> tag without a corresponding <p> tag
 !! wikitext
@@ -12933,7 +12930,7 @@ b</p>}}
 b</p><p class="mw-empty-elt"></p>
 !! html/parsoid
 <p about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a\nb&lt;/p>"}},"i":0}}]}'>a</p><span about="#mwt1">
-</span><span about="#mwt1">b</span>
+</span><p about="#mwt1">b</p>
 !! end
 
 !!test
@@ -13303,6 +13300,7 @@ parsoid=wt2html,wt2wt
 <link rel="mw:PageProp/Category" href="./Category:Bar1"><link rel="mw:PageProp/Category" href="./Category:Bar2"><table><tbody><tr><td>foo</td></tr></tbody></table>
 !!end
 
+## Remex doesn't account for fostered content.
 !! test
 Templates: Wiki Tables: 1a. Fostering of entire template content
 !! wikitext
 a
 <table><tbody><tr><td></td></tr></tbody></table>
 !! html/parsoid
-<span about="#mwt2" typeof="mw:Transclusion" data-parsoid='{"fostered":true,"autoInsertedEnd":true,"autoInsertedStart":true,"firstWikitextNode":"TABLE","pi":[[{"k":"1"}]]}' data-mw='{"parts":["{|\n",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a"}},"i":0}},"\n|}"]}'>a</span><table about="#mwt2">
+<p about="#mwt2" typeof="mw:Transclusion" data-parsoid='{"fostered":true,"autoInsertedEnd":true,"autoInsertedStart":true,"firstWikitextNode":"TABLE","pi":[[{"k":"1"}]]}' data-mw='{"parts":["{|\n",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a"}},"i":0}},"\n|}"]}'>a</p><table about="#mwt2">
 
 </table>
 !! end
@@ -13355,6 +13353,7 @@ foo
 </table>
 !! end
 
+## Remex doesn't account for fostered content.
 !! test
 Templates: Wiki Tables: 2. Fostering of partial template content
 !! wikitext
 <div>b</div><table>
 <tbody><tr><td></td></tr></tbody></table>
 !! html/parsoid
-<span about="#mwt2" typeof="mw:Transclusion" data-parsoid='{"fostered":true,"autoInsertedEnd":true,"autoInsertedStart":true,"firstWikitextNode":"TABLE","pi":[[{"k":"1"}]]}' data-mw='{"parts":["{|\n",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a\n&lt;div>b&lt;/div>"}},"i":0}},"\n|}"]}'>a</span><div about="#mwt2">b</div><table about="#mwt2">
+<p about="#mwt2" typeof="mw:Transclusion" data-parsoid='{"fostered":true,"autoInsertedEnd":true,"autoInsertedStart":true,"firstWikitextNode":"TABLE","pi":[[{"k":"1"}]]}' data-mw='{"parts":["{|\n",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a\n&lt;div>b&lt;/div>"}},"i":0}},"\n|}"]}'>a</p><div about="#mwt2">b</div><table about="#mwt2">
 
 
 </table>
@@ -13438,20 +13437,20 @@ Templates: Wiki Tables: 6. Templated tags, templated td-tags
 ## a <meta> marker tag for <ref> tags and they are expanded
 ## much later. We are verifying that this <meta> tag usage
 ## doesn't prevent foster parenting.
-!!test
+!! test
 Templates: Wiki Tables: 7. Fosterable <ref>s should get fostered
-!!wikitext
+!! wikitext
 {{PartialTable}}<ref>foo</ref>
 |}
 
 <references />
-!!html/parsoid
-<sup about="#mwt2" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Transclusion  mw:Extension/ref" data-mw='{"parts":[{"template":{"target":{"wt":"PartialTable","href":"./Template:PartialTable"},"params":{},"i":0}},"&lt;ref>foo&lt;/ref>\n|}"]}'><a href="./Main_Page#cite_note-1"><span class="mw-reflink-text">[1]</span></a></sup><table about="#mwt2">
+!! html/parsoid
+<p about="#mwt2" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"PartialTable","href":"./Template:PartialTable"},"params":{},"i":0}},"&lt;ref>foo&lt;/ref>\n|}"]}'><sup about="#mwt3" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="./Main_Page#cite_note-1" style="counter-reset: mw-Ref 1;"><span class="mw-reflink-text">[1]</span></a></sup></p><table about="#mwt2">
 <tbody>
 </tbody></table>
 
-<ol class="mw-references references" typeof="mw:Extension/references" about="#mwt4" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li></ol>
-!!end
+<ol class="mw-references references" typeof="mw:Extension/references" about="#mwt5" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="./Main_Page#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo</span></li></ol>
+!! end
 
 !! test
 Templates: Wiki Tables: 8. Fosterable meta-tags should get fostered
@@ -14579,8 +14578,8 @@ thumbsize=220
 </p>
 !! html/parsoid
 <p>123<figure-inline class="mw-default-size" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a></figure-inline>456</p>
-<p>123</p><figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a></figure><p>456</p>
-<p>123</p><figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a></figure><p>456</p>
+<p>123</p><figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a></figure><p>456
+123</p><figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a></figure><p>456</p>
 !! end
 
 !! test
@@ -16666,7 +16665,7 @@ Section headings with TOC
 Some text
 ===Another headline===
 !! html
-<div id="toc" class="toc"><input type="checkbox" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
+<div id="toc" class="toc"><input type="checkbox" role="button" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Headline_1"><span class="tocnumber">1</span> <span class="toctext">Headline 1</span></a>
 <ul>
@@ -16709,7 +16708,7 @@ __FORCETOC__
 ==Headline 2==
 ==Headline==
 !! html/php
-<div id="toc" class="toc"><input type="checkbox" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
+<div id="toc" class="toc"><input type="checkbox" role="button" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Headline_2"><span class="tocnumber">1</span> <span class="toctext">Headline 2</span></a></li>
 <li class="toclevel-1 tocsection-2"><a href="#Headline"><span class="tocnumber">2</span> <span class="toctext">Headline</span></a></li>
@@ -16743,7 +16742,7 @@ parsoid=wt2html
 =========Level 9 Heading=========
 ==========Level 10 Heading==========
 !! html/php
-<div id="toc" class="toc"><input type="checkbox" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
+<div id="toc" class="toc"><input type="checkbox" role="button" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Level_1_Heading"><span class="tocnumber">1</span> <span class="toctext">Level 1 Heading</span></a>
 <ul>
@@ -16807,7 +16806,7 @@ TOC regression (T11764)
 ==title 2==
 ===title 2.1===
 !! html
-<div id="toc" class="toc"><input type="checkbox" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
+<div id="toc" class="toc"><input type="checkbox" role="button" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#title_1"><span class="tocnumber">1</span> <span class="toctext">title 1</span></a>
 <ul>
@@ -16842,7 +16841,7 @@ TOC for heading containing <span id="..."></span> (T96153)
 __FORCETOC__
 ==<span id="old-anchor"></span>New title==
 !! html/php
-<div id="toc" class="toc"><input type="checkbox" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
+<div id="toc" class="toc"><input type="checkbox" role="button" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#New_title"><span class="tocnumber">1</span> <span class="toctext">New title</span></a></li>
 </ul>
@@ -16864,7 +16863,7 @@ wgMaxTocLevel=3
 ==title 2==
 ===title 2.1===
 !! html
-<div id="toc" class="toc"><input type="checkbox" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
+<div id="toc" class="toc"><input type="checkbox" role="button" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#title_1"><span class="tocnumber">1</span> <span class="toctext">title 1</span></a>
 <ul>
@@ -16900,7 +16899,7 @@ wgMaxTocLevel=3
 ====Section 1.1.1.1====
 ==Section 2==
 !! html
-<div id="toc" class="toc"><input type="checkbox" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
+<div id="toc" class="toc"><input type="checkbox" role="button" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Section_1"><span class="tocnumber">1</span> <span class="toctext">Section 1</span></a>
 <ul>
@@ -16993,7 +16992,7 @@ __TOC__
 ===title 1.1===
 ==title 2==
 !! html
-<div id="toc" class="toc"><input type="checkbox" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
+<div id="toc" class="toc"><input type="checkbox" role="button" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#title_1"><span class="tocnumber">1</span> <span class="toctext">title 1</span></a>
 <ul>
@@ -17069,7 +17068,7 @@ section 5
 !! html/php
 <p>The tooltips shall not show entities to the user (ie. be double escaped)
 </p>
-<div id="toc" class="toc"><input type="checkbox" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
+<div id="toc" class="toc"><input type="checkbox" role="button" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#text_.3E_text"><span class="tocnumber">1</span> <span class="toctext">text &gt; text</span></a></li>
 <li class="toclevel-1 tocsection-2"><a href="#text_.3C_text"><span class="tocnumber">2</span> <span class="toctext">text &lt; text</span></a></li>
@@ -17145,7 +17144,7 @@ section 6
 !! html/php
 <p>Id should not contain + for spaces
 </p>
-<div id="toc" class="toc"><input type="checkbox" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
+<div id="toc" class="toc"><input type="checkbox" role="button" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Space_between_Text"><span class="tocnumber">1</span> <span class="toctext">Space between Text</span></a></li>
 <li class="toclevel-1 tocsection-2"><a href="#Space-Entity_between_Text"><span class="tocnumber">2</span> <span class="toctext">Space-Entity&#32;between&#32;Text</span></a></li>
@@ -17221,7 +17220,7 @@ parsoid=wt2html,wt2wt,html2html
 =''italic'' heading==
 ==''italic'' heading=
 !! html/php
-<div id="toc" class="toc"><input type="checkbox" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
+<div id="toc" class="toc"><input type="checkbox" role="button" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#foo.3D"><span class="tocnumber">1</span> <span class="toctext">foo=</span></a></li>
 <li class="toclevel-1 tocsection-2"><a href="#.3Dfoo"><span class="tocnumber">2</span> <span class="toctext">=foo</span></a></li>
@@ -17256,7 +17255,7 @@ HTML headers vs TOC (T25393)
 ==Header 2.2==
 __NOEDITSECTION__
 !! html/php
-<div id="toc" class="toc"><input type="checkbox" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
+<div id="toc" class="toc"><input type="checkbox" role="button" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
 <ul>
 <li class="toclevel-1"><a href="#Header_1"><span class="tocnumber">1</span> <span class="toctext">Header 1</span></a>
 <ul>
@@ -17730,6 +17729,8 @@ Media link with text
 # Parsoid & Remex fix the p-wrapping since they operate on the DOM.
 !! test
 Media link with nasty text
+!! options
+parsoid=wt2html,html2html
 !! wikitext
 [[Media:Foobar.jpg|Safe Link<div style=display:none>" onmouseover="alert(document.cookie)" onfoo="</div>]]
 !! html/php
@@ -17738,8 +17739,7 @@ Media link with nasty text
 !! html/php+tidy
 <p><a href="http://example.com/images/3/3a/Foobar.jpg" class="internal" title="Foobar.jpg">Safe Link</a></p><a href="http://example.com/images/3/3a/Foobar.jpg" class="internal" title="Foobar.jpg"><div style="display:none">" onmouseover="alert(document.cookie)" onfoo="</div></a>
 !! html/parsoid
-<p><a rel="mw:MediaLink" href="//example.com/images/3/3a/Foobar.jpg" title="Foobar.jpg" data-parsoid='{"autoInsertedEnd":true}'>Safe Link</a></p><div style="display:none" data-parsoid='{"stx":"html"}'><a rel="mw:MediaLink" href="//example.com/images/3/3a/Foobar.jpg" title="Foobar.jpg" data-parsoid='{"autoInsertedEnd":true,"autoInsertedStart":true}'>" onmouseover="alert(document.cookie)" onfoo="</a></div>
-
+<p><a rel="mw:MediaLink" href="//example.com/images/3/3a/Foobar.jpg" title="Foobar.jpg">Safe Link</a></p><a rel="mw:MediaLink" href="//example.com/images/3/3a/Foobar.jpg" title="Foobar.jpg"><div style="display:none" data-parsoid='{"stx":"html"}'>" onmouseover="alert(document.cookie)" onfoo="</div></a>
 !! end
 
 !! test
@@ -18453,6 +18453,8 @@ array (
 
 !! test
 Parser hook: nested tags
+!! options
+parsoid=wt2html
 !! wikitext
 <tag><tag></tag></tag>
 !! html/php
@@ -18462,8 +18464,14 @@ array (
 )
 </pre>&lt;/tag&gt;
 
+!! html/php+tidy
+<pre>'<tag>'
+array (
+)
+</tag></pre><p>&lt;/tag&gt;
+</p>
 !! html/parsoid
-<pre typeof="mw:Extension/tag" data-mw='{"name":"tag","attrs":{},"body":{"extsrc":"&lt;tag>"}}' data-parsoid='{}' about="#mwt2"></pre>&lt;/tag>
+<pre typeof="mw:Extension/tag" about="#mwt2" data-mw='{"name":"tag","attrs":{},"body":{"extsrc":"&lt;tag>"}}'></pre><p>&lt;/tag></p>
 !! end
 
 !! test
@@ -18539,7 +18547,7 @@ array (
 </pre>text
 
 !! html/parsoid
-<pre typeof="mw:Extension/tag" data-mw='{"name":"tag","attrs":{"foo":"bar"},"body":null}' data-parsoid='{}' about="#mwt2"></pre>text
+<pre typeof="mw:Extension/tag" about="#mwt2" data-mw='{"name":"tag","attrs":{"foo":"bar"},"body":null}'></pre><p>text</p>
 !! end
 
 ## </tag> should be output literally since there is no matching tag that begins it
@@ -18671,8 +18679,6 @@ Nested template calls
 ### Sanitizer
 ###
 
-# Remex wraps empty tag runs with p-tags.
-# Parsoid strips them out during p-wrapping.
 !! test
 Sanitizer: Closing of open tags
 !! wikitext
@@ -18680,7 +18686,7 @@ Sanitizer: Closing of open tags
 !! html/php+tidy
 <p><s></s></p><table></table>
 !! html/parsoid
-<s></s><table></table>
+<p><s data-parsoid='{"stx":"html"}'></s></p><table data-parsoid='{"stx":"html"}'></table>
 !! end
 
 !! test
@@ -18698,10 +18704,9 @@ Sanitizer: Closing of closed but not open tags
 parsoid=wt2html
 !! wikitext
 </s>
-!! html/php+tidy
+!! html+tidy
 <p class="mw-empty-elt">
 </p>
-!! html/parsoid
 !! end
 
 !! test
@@ -19182,7 +19187,7 @@ Fuzz testing: Parser14
 http://__TOC__
 !! html/php
 <h2><span class="mw-headline" id="onmouseover.3D">onmouseover=</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: onmouseover=">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-http://<div id="toc" class="toc"><input type="checkbox" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
+http://<div id="toc" class="toc"><input type="checkbox" role="button" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#onmouseover.3D"><span class="tocnumber">1</span> <span class="toctext">onmouseover=</span></a></li>
 </ul>
@@ -19191,7 +19196,7 @@ http://<div id="toc" class="toc"><input type="checkbox" id="toctogglecheckbox" c
 
 !! html/php+tidy
 <h2><span class="mw-headline" id="onmouseover.3D">onmouseover=</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: onmouseover=">edit</a><span class="mw-editsection-bracket">]</span></span></h2><p>
-http://</p><div id="toc" class="toc"><input type="checkbox" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none" /><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
+http://</p><div id="toc" class="toc"><input type="checkbox" role="button" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none" /><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#onmouseover.3D"><span class="tocnumber">1</span> <span class="toctext">onmouseover=</span></a></li>
 </ul>
@@ -19278,7 +19283,8 @@ http://===r:::https://b
 
 !! end
 
-# Known to produce bad XML for now
+## Remex doesn't account for fostered content.
+## Known to produce bad XML for now
 !! test
 Fuzz testing: Parser24
 !! options
@@ -19305,14 +19311,27 @@ MOVE YOUR MOUSE CURSOR OVER THIS TEXT
 </tr>
 </table>
 
-!! html/parsoid
-<p data-parsoid='{"fostered":true,"autoInsertedEnd":true}'>{{{|
-<u class="|" data-parsoid='{"stx":"html","a":{"{{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx--":null},"sa":{"{{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx--":""},"autoInsertedEnd":true}'><meta typeof="mw:Includes/NoInclude" data-parsoid='{"src":"&lt;noinclude>"}'/>}}}} >
-<br style="onmouseover='alert(document.cookie);' " data-parsoid='{"stx":"html","selfClose":true}'/></u></p><p data-parsoid='{"fostered":true,"autoInsertedEnd":true}'><u class="|" data-parsoid='{"stx":"html","a":{"{{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx--":null},"sa":{"{{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx--":""},"autoInsertedEnd":true,"autoInsertedStart":true}'>MOVE YOUR MOUSE CURSOR OVER THIS TEXT</u></p><table data-parsoid='{"autoInsertedEnd":true}'>
+!! html/php+tidy
 
+{{{|
+<u class="&#124;">}}}} &gt;
+<br style="onmouseover=&#39;alert(document.cookie);&#39;" />
 
+MOVE YOUR MOUSE CURSOR OVER THIS TEXT
+</u><table><tbody><tr>
+<td>
+</td>
+</tr>
+</tbody></table><p><u class="&#124;">
+</u></p>
+!! html/parsoid
+<p data-parsoid='{"fostered":true,"autoInsertedEnd":true,"autoInsertedStart":true}'>
+{{{|
+<u class="|" data-parsoid='{"stx":"html","a":{"{{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx--":null},"sa":{"{{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx--":""},"autoInsertedEnd":true}'><meta typeof="mw:Includes/NoInclude" data-parsoid='{"src":"&lt;noinclude>"}'/>}}}} >
+<br style="onmouseover='alert(document.cookie);' " data-parsoid='{"stx":"html","selfClose":true}'/>
 
-<tbody><tr data-parsoid='{"autoInsertedEnd":true,"autoInsertedStart":true}'><td data-parsoid='{"autoInsertedEnd":true}'></td></tr></tbody></table>
+MOVE YOUR MOUSE CURSOR OVER THIS TEXT</u></p>
+<table data-parsoid='{"autoInsertedEnd":true}'><tbody><tr data-parsoid='{"autoInsertedStart":true}'><td></td></tr></tbody></table>
 !! end
 
 # Note: the current result listed for this is not what the original one was,
@@ -19504,6 +19523,10 @@ New wiki paragraph
 <p><b>Bold paragraph
 </p><p>New wiki paragraph</b>
 </p>
+!! html/php+tidy
+<p><b>Bold paragraph
+</b></p><p><b>New wiki paragraph
+</b></p>
 !! html/parsoid
 <p><b>Bold paragraph</b>
 </p><p>New wiki paragraph
@@ -20453,7 +20476,7 @@ parsoid=wt2html
 '''''
 !! html/php
 !! html/parsoid
-<b><i></i></b>
+<p><b><i></i></b></p>
 !! end
 
 # same html as previous, but wikitext adjusted to match parsoid html2wt
@@ -21763,7 +21786,7 @@ Out-of-order TOC heading levels
 =====5=====
 ==2==
 !! html
-<div id="toc" class="toc"><input type="checkbox" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
+<div id="toc" class="toc"><input type="checkbox" role="button" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#2"><span class="tocnumber">1</span> <span class="toctext">2</span></a>
 <ul>
@@ -22807,11 +22830,11 @@ language=zh variant=zh-cn
 <span>ad
 </span></div></span></div></span>
 !! html/parsoid
-<p><span data-parsoid='{"stx":"html","autoInsertedEnd":true}'>a</span></p><div typeof="mw:LanguageVariant" data-mw-variant='{"disabled":{"t":"b&lt;div data-parsoid=&#39;{\"stx\":\"html\",\"autoInsertedEnd\":true,\"dsr\":[10,16,5,0]}&#39;>c&lt;/div>"}}'></div><p>d</p>
+<span data-parsoid='{"stx":"html","autoInsertedEnd":true}'>a<div typeof="mw:LanguageVariant" data-mw-variant='{"disabled":{"t":"b&lt;div data-parsoid=&apos;{\"stx\":\"html\",\"autoInsertedEnd\":true,\"dsr\":[10,16,5,0]}&apos;>c&lt;/div>"}}'></div>d
 
-<p><span data-parsoid='{"stx":"html","autoInsertedEnd":true}'>a</span></p><div typeof="mw:LanguageVariant" data-mw-variant='{"filter":{"l":["zh","zh-hans","zh-hant"],"t":"b&lt;div data-parsoid=&#39;{\"stx\":\"html\",\"autoInsertedEnd\":true,\"dsr\":[50,56,5,0]}&#39;>c&lt;/div>"}}'></div><p>d</p>
+<span data-parsoid='{"stx":"html","autoInsertedEnd":true}'>a<div typeof="mw:LanguageVariant" data-mw-variant='{"filter":{"l":["zh","zh-hans","zh-hant"],"t":"b&lt;div data-parsoid=&apos;{\"stx\":\"html\",\"autoInsertedEnd\":true,\"dsr\":[50,56,5,0]}&apos;>c&lt;/div>"}}'></div>d
 
-<p><span data-parsoid='{"stx":"html","autoInsertedEnd":true}'>a<meta typeof="mw:LanguageVariant" data-mw-variant='{"add":true,"oneway":[{"f":"0","l":"zh-cn","t":"x&lt;span data-parsoid=&#39;{\"stx\":\"html\",\"autoInsertedEnd\":true,\"dsr\":[82,89,6,0]}&#39;>y&lt;/span>"},{"f":"0","l":"zh-tw","t":"b&lt;div data-parsoid=&#39;{\"stx\":\"html\",\"autoInsertedEnd\":true,\"dsr\":[100,106,5,0]}&#39;>c&lt;/div>"}]}'/>d</span></p>
+<p><span data-parsoid='{"stx":"html","autoInsertedEnd":true}'>a<meta typeof="mw:LanguageVariant" data-mw-variant='{"add":true,"oneway":[{"f":"0","l":"zh-cn","t":"x&lt;span data-parsoid=&apos;{\"stx\":\"html\",\"autoInsertedEnd\":true,\"dsr\":[82,89,6,0]}&apos;>y&lt;/span>"},{"f":"0","l":"zh-tw","t":"b&lt;div data-parsoid=&apos;{\"stx\":\"html\",\"autoInsertedEnd\":true,\"dsr\":[100,106,5,0]}&apos;>c&lt;/div>"}]}'/>d</span></p></span></span>
 !! end
 
 !! test
@@ -23095,10 +23118,8 @@ language=zh variant=zh-cn
 <dt>-{zh-cn:AAA</dt></b></dl><p><b>
 </b></p>
 !! html/parsoid
-<dl><dt data-parsoid='{"dsr":[0,11,1,0]}'><b data-parsoid='{"stx":"html","autoInsertedEnd":true}'>foo:bar</b></dt><b data-parsoid='{"stx":"html","autoInsertedEnd":true,"autoInsertedStart":true}'>
-<dt data-parsoid='{"dsr":[12,20,1,0]}'>-{zh-cn</dt>
-<dd data-parsoid='{"stx":"row","dsr":[20,24,1,0]}'>AAA</dd>
-</b></dl>
+<dl><dt data-parsoid='{}'><b data-parsoid='{"stx":"html","autoInsertedEnd":true}'>foo:bar</b></dt><b data-parsoid='{"stx":"html","autoInsertedEnd":true,"autoInsertedStart":true}'>
+<dt data-parsoid='{}'>-{zh-cn</dt><dd data-parsoid='{"stx":"row"}'>AAA</dd></b></dl>
 !! end
 
 !! test
@@ -23463,7 +23484,6 @@ Line two
 !! end
 
 # doBlockLevels screws up this output and Remex cleans up as much as it can.
-# Parsoid seems to do a better job here since its p-wrapper is probably smarter.
 !! test
 Nesting tags, paragraphs on lines which begin with <div>
 !! wikitext
@@ -23474,15 +23494,15 @@ B</strong>
 </strong></p><strong></strong><p><strong>B</strong>
 </p>
 !! html/parsoid
-<div></div>
-<p><strong>A
-B</strong>
-</p>
+<div data-parsoid='{"stx":"html"}'></div><p><strong data-parsoid='{"stx":"html","autoInsertedEnd":true}'>A</strong></p>
+<p><strong data-parsoid='{"stx":"html","autoInsertedStart":true}'>B</strong></p>
 !! end
 
 # T8200: <blockquote> should behave like <div> with respect to line breaks
 !! test
 T8200: paragraphs inside blockquotes (no extra line breaks)
+!! options
+parsoid=wt2html,html2html
 !! wikitext
 <blockquote>Line one
 
@@ -23498,6 +23518,8 @@ Line two</p></blockquote>
 
 !! test
 T8200: paragraphs inside blockquotes (extra line break on open)
+!! options
+parsoid=wt2html,html2html
 !! wikitext
 <blockquote>
 Line one
@@ -23516,9 +23538,10 @@ Line two</blockquote>
 Line two</p></blockquote>
 !! end
 
-# Parsoid's output is broken on this because of Tidy-compatibility cruft
 !! test
 T8200: paragraphs inside blockquotes (extra line break on close)
+!! options
+parsoid=wt2html,html2html
 !! wikitext
 <blockquote>Line one
 
@@ -24433,7 +24456,7 @@ title=[[Main Page]]
 __TOC__
 ==''Lost'' episodes==
 !! html/php
-<div id="toc" class="toc"><input type="checkbox" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
+<div id="toc" class="toc"><input type="checkbox" role="button" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Lost_episodes"><span class="tocnumber">1</span> <span class="toctext"><i>Lost</i> episodes</span></a></li>
 </ul>
@@ -24454,7 +24477,7 @@ title=[[Main Page]]
 __TOC__
 =='''should be bold''' then normal text==
 !! html/php
-<div id="toc" class="toc"><input type="checkbox" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
+<div id="toc" class="toc"><input type="checkbox" role="button" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#should_be_bold_then_normal_text"><span class="tocnumber">1</span> <span class="toctext"><b>should be bold</b> then normal text</span></a></li>
 </ul>
@@ -24475,7 +24498,7 @@ title=[[Main Page]]
 __TOC__
 ==Image [[Image:foobar.jpg]]==
 !! html/php
-<div id="toc" class="toc"><input type="checkbox" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
+<div id="toc" class="toc"><input type="checkbox" role="button" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Image"><span class="tocnumber">1</span> <span class="toctext">Image</span></a></li>
 </ul>
@@ -24496,7 +24519,7 @@ title=[[Main Page]]
 __TOC__
 ==<blockquote>Quote</blockquote>==
 !! html/php
-<div id="toc" class="toc"><input type="checkbox" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
+<div id="toc" class="toc"><input type="checkbox" role="button" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Quote"><span class="tocnumber">1</span> <span class="toctext">Quote</span></a></li>
 </ul>
@@ -24505,7 +24528,7 @@ __TOC__
 <h2><span class="mw-headline" id="Quote"><blockquote>Quote</blockquote></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Quote">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! html/php+tidy
-<div id="toc" class="toc"><input type="checkbox" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none" /><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
+<div id="toc" class="toc"><input type="checkbox" role="button" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none" /><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Quote"><span class="tocnumber">1</span> <span class="toctext">Quote</span></a></li>
 </ul>
@@ -24514,7 +24537,7 @@ __TOC__
 <h2><span class="mw-headline" id="Quote"><blockquote><p>Quote</p></blockquote></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Quote">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 !! html/parsoid
 <meta property="mw:PageProp/toc" data-parsoid='{}'/>
-<h2 id="Quote" data-parsoid='{}'><blockquote>Quote</blockquote></h2>
+<h2 id="Quote" data-parsoid='{}'><blockquote><p>Quote</p></blockquote></h2>
 !! end
 
 !! test
@@ -24529,7 +24552,7 @@ __TOC__
 <small>Hanc marginis exiguitas non caperet.</small>
 QED
 !! html/php
-<div id="toc" class="toc"><input type="checkbox" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
+<div id="toc" class="toc"><input type="checkbox" role="button" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Proof:_2_&lt;_3"><span class="tocnumber">1</span> <span class="toctext">Proof: 2 &lt; 3</span></a></li>
 </ul>
@@ -24554,7 +24577,7 @@ __TOC__
 
 ==<i>Foo</i> <blockquote>Bar</blockquote>==
 !! html/php
-<div id="toc" class="toc"><input type="checkbox" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
+<div id="toc" class="toc"><input type="checkbox" role="button" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Foo_Bar"><span class="tocnumber">1</span> <span class="toctext"><i>Foo</i> <b>Bar</b></span></a></li>
 <li class="toclevel-1 tocsection-2"><a href="#Foo_Bar_2"><span class="tocnumber">2</span> <span class="toctext"><i>Foo</i> Bar</span></a></li>
@@ -24565,7 +24588,7 @@ __TOC__
 <h2><span class="mw-headline" id="Foo_Bar_2"><i>Foo</i> <blockquote>Bar</blockquote></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo Bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! html/php+tidy
-<div id="toc" class="toc"><input type="checkbox" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none" /><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
+<div id="toc" class="toc"><input type="checkbox" role="button" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none" /><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Foo_Bar"><span class="tocnumber">1</span> <span class="toctext"><i>Foo</i> <b>Bar</b></span></a></li>
 <li class="toclevel-1 tocsection-2"><a href="#Foo_Bar_2"><span class="tocnumber">2</span> <span class="toctext"><i>Foo</i> Bar</span></a></li>
@@ -24578,7 +24601,7 @@ __TOC__
 <meta property="mw:PageProp/toc" data-parsoid='{}'/>
 <h2 id="Foo_Bar" data-parsoid='{}'><i data-parsoid='{"stx":"html"}'>Foo</i> <b data-parsoid='{"stx":"html"}'>Bar</b></h2>
 
-<h2 id="Foo_Bar_2" data-parsoid='{}'><i data-parsoid='{"stx":"html"}'>Foo</i> <blockquote>Bar</blockquote></h2>
+<h2 id="Foo_Bar_2" data-parsoid='{}'><i data-parsoid='{"stx":"html"}'>Foo</i> <blockquote><p>Bar</p></blockquote></h2>
 !! end
 
 # Don't expect Parsoid to roundtrip this until the php parser comes closer to
@@ -24593,7 +24616,7 @@ __TOC__
 
 ==<sup class="a > b">Evilbye</sup>==
 !! html/php
-<div id="toc" class="toc"><input type="checkbox" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
+<div id="toc" class="toc"><input type="checkbox" role="button" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Hello"><span class="tocnumber">1</span> <span class="toctext"><sup>Hello</sup></span></a></li>
 <li class="toclevel-1 tocsection-2"><a href="#b.22.3EEvilbye"><span class="tocnumber">2</span> <span class="toctext"><sup> b"&gt;Evilbye</sup></span></a></li>
@@ -24624,7 +24647,7 @@ __TOC__
 
 ==<span dir="ltr" style="font-style: italic">Attributes after dir on these span tags must be deleted from the TOC</span>==
 !! html/php
-<div id="toc" class="toc"><input type="checkbox" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
+<div id="toc" class="toc"><input type="checkbox" role="button" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#C.2B.2B"><span class="tocnumber">1</span> <span class="toctext"><span dir="ltr">C++</span></span></a></li>
 <li class="toclevel-1 tocsection-2"><a href="#.D7.96.D7.91.D7.A0.D7.92.21"><span class="tocnumber">2</span> <span class="toctext"><span dir="rtl">זבנג!</span></span></a></li>
@@ -24655,7 +24678,7 @@ T74884: bdi element in ToC
 __TOC__
 ==<bdi>test</bdi>==
 !! html/php
-<div id="toc" class="toc"><input type="checkbox" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
+<div id="toc" class="toc"><input type="checkbox" role="button" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#test"><span class="tocnumber">1</span> <span class="toctext"><bdi>test</bdi></span></a></li>
 </ul>
@@ -24674,7 +24697,7 @@ T35715: s/strike element in ToC
 __TOC__
 ==<s>test</s> test <strike>test</strike>==
 !! html/php
-<div id="toc" class="toc"><input type="checkbox" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
+<div id="toc" class="toc"><input type="checkbox" role="button" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#test_test_test"><span class="tocnumber">1</span> <span class="toctext"><s>test</s> test <strike>test</strike></span></a></li>
 </ul>
@@ -24687,13 +24710,34 @@ __TOC__
 <h2 id="test_test_test" data-parsoid='{}'><s>test</s> test <strike>test</strike></h2>
 !! end
 
+!! test
+T198618: style element in ToC
+!! options
+styletag=1
+!! wikitext
+__TOC__
+==<style>.foo {}</style>Style<style>.bar {}</style>==
+!! html/php
+<div id="toc" class="toc"><input type="checkbox" role="button" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
+<ul>
+<li class="toclevel-1 tocsection-1"><a href="#Style"><span class="tocnumber">1</span> <span class="toctext">Style</span></a></li>
+</ul>
+</div>
+
+<h2><span class="mw-headline" id="Style"><style>.foo {}</style>Style<style>.bar {}</style></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Style">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+
+!! html/parsoid
+<meta property="mw:PageProp/toc" data-parsoid='{}'/>
+<h2 id="Style" data-parsoid='{}'><style>.foo {}</style>Style<style>.bar {}</style></h2>
+!! end
+
 !! test
 Empty <p> tag in TOC, removed by Sanitizer (T92892)
 !! wikitext
 __TOC__
 ==x==
 !! html/php
-<div id="toc" class="toc"><input type="checkbox" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
+<div id="toc" class="toc"><input type="checkbox" role="button" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#x"><span class="tocnumber">1</span> <span class="toctext">x</span></a></li>
 </ul>
@@ -25028,13 +25072,13 @@ parsoid=wt2html,wt2wt
 #### Parsoid-specific functionality tests
 #### -----------------------------------------------------------------
 
-# T65642/T68749: Formatting elt fixup around images is cleaned up.
+# T65642/T68749: Formatting elt fixup around images.
 # We know wt2wt will fail, but we expect selser to pass.
 # Due to the nature of our testing, wt2wt and selser tests will enter the
 # blacklist and we'll catch selser regressions based on changes to the
 # blacklist entries for selser tests.
 !! test
-1. Bad treebuilder fixup of formatting elt is cleaned up
+1. Treebuilder fixup of formatting elt
 !! options
 parsoid=wt2html,wt2wt
 !! wikitext
@@ -25044,50 +25088,63 @@ parsoid=wt2html,wt2wt
 [[Image:Foobar.jpg|right|Test]]
 </small>
 |}
+!! html/php+tidy
+<table>
+<tbody><tr>
+<td>
+<p><small>
+</small></p><small>
+<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Test"><img alt="Test" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
+</small><p><small></small>
+</p>
+</td></tr></tbody></table>
 !! html/parsoid
 <table>
 <tbody><tr><td>
-<small>
-<figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a><figcaption>Test</figcaption></figure>
-</small>
-</td></tr>
+<p><small data-parsoid='{"stx":"html","autoInsertedEnd":true}'></small></p><small data-parsoid='{"stx":"html","autoInsertedEnd":true,"autoInsertedStart":true}'>
+<figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941"/></a><figcaption>Test</figcaption></figure></small>
+<p><small data-parsoid='{"stx":"html","autoInsertedStart":true}'></small></p></td></tr>
 </tbody></table>
 !! end
 
 !! test
-2. Bad treebuilder fixup of formatting elt is cleaned up
+2. Treebuilder fixup of formatting elt
 !! options
 parsoid=wt2html,wt2wt
 !! wikitext
 '''foo[[File:Foobar.jpg|thumb|caption]]bar'''
 
 <small>[[Image:Foobar.jpg|right|300px]]</small>
+!! html/php+tidy
+<p><b>foo</b></p><b><div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>caption</div></div></div></b><p><b>bar</b>
+</p><small><div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg" width="300" height="34" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/450px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/600px-Foobar.jpg 2x" /></a></div></small>
 !! html/parsoid
+<p><b>foo</b></p><b><figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>caption</figcaption></figure></b><p><b>bar</b></p>
 
-<p><b>foo</b></p>
-<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption><b>caption</b></figcaption></figure>
-<p><b>bar</b></p>
 <small><figure class="mw-halign-right" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="34" width="300"/></a></figure></small>
 !! end
 
 !! test
-3. Bad treebuilder fixup of formatting elt is cleaned up
+3. Treebuilder fixup of formatting elt
 !! options
 parsoid=wt2html,wt2wt
 !! wikitext
 <small>'''foo[[File:Foobar.jpg|thumb|caption]]bar'''</small>
+!! html/php+tidy
+<p><small><b>foo</b></small></p><small><b><div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>caption</div></div></div></b></small><p><small><b>bar</b></small>
+</p>
 !! html/parsoid
-<p><small><b>foo</b></small></p>
-<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption><small><b>caption</b></small></figcaption></figure>
-<p><small><b>bar</b></small></p>
+<p><small><b>foo</b></small></p><small><b><figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>caption</figcaption></figure></b></small><p><small><b>bar</b></small></p>
 !! end
 
 !! test
-4. Bad treebuilder fixup of formatting elt is cleaned up: formatting tags around captionless images are ignored
+4. Treebuilder fixup of formatting elt: formatting tags around captionless images
 !! options
 parsoid=wt2html,wt2wt
 !! wikitext
 '''<small>[[Image:Foobar.jpg|right|300px]]</small>'''
+!! html/php+tidy
+<b><small><div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg" width="300" height="34" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/450px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/600px-Foobar.jpg 2x" /></a></div></small></b>
 !! html/parsoid
 <b><small><figure class="mw-halign-right" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="34" width="300"/></a></figure></small></b>
 !! end
@@ -27433,16 +27490,17 @@ Encapsulate protected attributes from wt
 ## Currently the p-wrapper is fragile in how it adds / removes transformations.
 ## Having nested or stray pre tags results in the attempt to add duplicates,
 ## causing an assertion fail. This test tries to prevent that situation.
-!!test
+!! test
 Ensure ParagraphWrapper can deal with stray closing pre tags
-!!options
+!! options
 parsoid=wt2html
 !! wikitext
 plain text</pre>
 !! html/parsoid
-plain text
-!!end
+<p>plain text</p>
+!! end
 
+## Remex doesn't account for fostered content.
 !! test
 1. Ensure fostered text content is wrapped in element nodes
 !! options
@@ -27452,9 +27510,10 @@ parsoid=wt2html
 !! html/php+tidy
 hi<table></table>ho<table></table>
 !! html/parsoid
-<span data-parsoid='{"fostered":true,"autoInsertedEnd":true,"autoInsertedStart":true}'>hi</span><table data-parsoid='{"stx":"html"}'></table><span data-parsoid='{"fostered":true,"autoInsertedEnd":true,"autoInsertedStart":true}'>ho</span><table data-parsoid='{"stx":"html"}'></table>
+<p data-parsoid='{"fostered":true,"autoInsertedEnd":true,"autoInsertedStart":true}'>hi</p><table data-parsoid='{"stx":"html"}'></table><p data-parsoid='{"fostered":true,"autoInsertedEnd":true,"autoInsertedStart":true}'>ho</p><table data-parsoid='{"stx":"html"}'></table>
 !! end
 
+## Remex doesn't account for fostered content.
 !! test
 2. Ensure fostered text content is wrapped in element nodes (traps regressions around fostered marker on the element getting lost)
 !! options
@@ -27470,12 +27529,13 @@ parsoid=wt2html,wt2wt
 <tbody><tr><td> a
 </td></tr></tbody></table>
 !! html/parsoid
-<span data-parsoid='{"fostered":true,"autoInsertedEnd":true,"autoInsertedStart":true}'> || ||
-</span><table data-parsoid='{"stx":"html"}'>
+<p data-parsoid='{"fostered":true,"autoInsertedEnd":true,"autoInsertedStart":true}'> || ||</p>
+<table data-parsoid='{"stx":"html"}'>
 <tbody><tr data-parsoid='{"stx":"html","autoInsertedEnd":true}'><td data-parsoid='{"stx":"html","autoInsertedEnd":true}'> a
 </td></tr></tbody></table>
 !! end
 
+## Remex doesn't account for fostered content.
 !! test
 Encapsulation properly handles null DSR information from foster box
 !! options
@@ -27483,9 +27543,10 @@ parsoid=wt2html,wt2wt
 !! wikitext
 {{echo|<table>foo<tr><td>bar</td></tr></table>}}
 !! html/parsoid
-<span typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;<table>foo<tr><td>bar</td></tr></table>&quot;}},&quot;i&quot;:0}}]}">foo</span><table><tbody><tr><td>bar</td></tr></tbody></table>
+<p about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;table>foo&lt;tr>&lt;td>bar&lt;/td>&lt;/tr>&lt;/table>"}},"i":0}}]}'>foo</p><table about="#mwt1" data-parsoid='{"stx":"html"}'><tbody><tr><td>bar</td></tr></tbody></table>
 !! end
 
+## Remex doesn't account for fostered content.
 !! test
 1. Encapsulate foster-parented transclusion content
 !! options
@@ -27495,7 +27556,7 @@ parsoid=wt2wt,wt2html
 !! html/php+tidy
 foo<table><tbody><tr><td>bar</td></tr></tbody></table>
 !! html/parsoid
-<span about="#mwt2" typeof="mw:Transclusion" data-parsoid='{"fostered":true,"autoInsertedEnd":true,"autoInsertedStart":true,"firstWikitextNode":"TABLE_html","pi":[[{"k":"1"}]]}' data-mw='{"parts":["&lt;table>",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo&lt;tr>&lt;td>bar&lt;/td>&lt;/tr>"}},"i":0}},"&lt;/table>"]}'>foo</span><table about="#mwt2" data-parsoid='{"stx":"html}'><tbody><tr><td>bar</td></tr></tbody></table>
+<p about="#mwt2" typeof="mw:Transclusion" data-parsoid='{"fostered":true,"autoInsertedEnd":true,"autoInsertedStart":true,"firstWikitextNode":"TABLE_html","pi":[[{"k":"1"}]]}' data-mw='{"parts":["&lt;table>",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo&lt;tr>&lt;td>bar&lt;/td>&lt;/tr>"}},"i":0}},"&lt;/table>"]}'>foo</p><table about="#mwt2" data-parsoid='{"stx":"html"}'><tbody><tr><td>bar</td></tr></tbody></table>
 !! end
 
 !! test
@@ -27553,6 +27614,7 @@ parsoid=wt2wt,wt2html
 </table>
 !! end
 
+## Remex doesn't account for fostered content.
 !! test
 5. Encapsulate foster-parented transclusion content
 !!options
@@ -27562,9 +27624,10 @@ parsoid=wt2wt,wt2html
 !! html/php+tidy
 foo<table><tbody><tr><td><div><p>foo</p></div></td></tr></tbody></table>
 !! html/parsoid
-<span about="#mwt2" typeof="mw:Transclusion" data-parsoid='{"fostered":true,"autoInsertedEnd":true,"autoInsertedStart":true,"firstWikitextNode":"TABLE_html","pi":[[{"k":"1"}]]}' data-mw='{"parts":["&lt;table>&lt;tr>&lt;td>&lt;div>&lt;p>",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo&lt;/p>&lt;/div>&lt;/td>foo"}},"i":0}},"&lt;/tr>&lt;/table>"]}'>foo</span><table about="#mwt2" data-parsoid='{"stx":"html"}'><tbody><tr><td><div><p>foo</p></div></td></tr></tbody></table>
+<p about="#mwt2" typeof="mw:Transclusion" data-parsoid='{"fostered":true,"autoInsertedEnd":true,"autoInsertedStart":true,"firstWikitextNode":"TABLE_html","pi":[[{"k":"1"}]]}' data-mw='{"parts":["&lt;table>&lt;tr>&lt;td>&lt;div>&lt;p>",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo&lt;/p>&lt;/div>&lt;/td>foo"}},"i":0}},"&lt;/tr>&lt;/table>"]}'>foo</p><table about="#mwt2" data-parsoid='{"stx":"html"}'><tbody><tr><td><div><p>foo</p></div></td></tr></tbody></table>
 !! end
 
+## Remex doesn't account for fostered content.
 !! test
 6. Encapsulate foster-parented transclusion content
 !! options
@@ -27574,7 +27637,7 @@ parsoid=wt2wt,wt2html
 !! html/php+tidy
 foo<table><tbody><tr><td><div><p>foo</p></div></td></tr></tbody></table><p>ok</p>
 !! html/parsoid
-<span about="#mwt2" typeof="mw:Transclusion" data-parsoid='{"fostered":true,"autoInsertedEnd":true,"autoInsertedStart":true,"firstWikitextNode":"TABLE_html","pi":[[{"k":"1"}]]}' data-mw='{"parts":["&lt;table>&lt;tr>&lt;td>&lt;div>&lt;p>",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo&lt;/p>&lt;/div>&lt;/td>foo&lt;/tr>&lt;/table>"}},"i":0}}]}'>foo</span><table about="#mwt2" data-parsoid='{"stx":"html"}'><tbody><tr><td><div><p>foo</p></div></td></tr></tbody></table><p data-parsoid='{"stx":"html"}'>ok</p>
+<p about="#mwt2" typeof="mw:Transclusion" data-parsoid='{"fostered":true,"autoInsertedEnd":true,"autoInsertedStart":true,"firstWikitextNode":"TABLE_html","pi":[[{"k":"1"}]]}' data-mw='{"parts":["&lt;table>&lt;tr>&lt;td>&lt;div>&lt;p>",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo&lt;/p>&lt;/div>&lt;/td>foo&lt;/tr>&lt;/table>"}},"i":0}}]}'>foo</p><table about="#mwt2" data-parsoid='{"stx":"html"}'><tbody><tr><td><div><p>foo</p></div></td></tr></tbody></table><p data-parsoid='{"stx":"html"}'>ok</p>
 !! end
 
 !! test
@@ -27594,6 +27657,7 @@ parsoid=wt2wt,wt2html
 </table>
 !! end
 
+## Remex doesn't account for fostered content.
 # Note that the wt is broken on purpose: the = should be {{=}} if you
 # don't want it to be a template parameter key.
 !! test
@@ -27616,12 +27680,13 @@ parsoid=wt2wt,wt2html
 </td></tr></tbody></table>
 !! html/parsoid
 <p about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a\n"}},"i":0}}]}'>a</p><span about="#mwt1">
-</span><span about="#mwt3" typeof="mw:Transclusion" data-parsoid='{"fostered":true,"autoInsertedEnd":true,"autoInsertedStart":true,"firstWikitextNode":"TABLE","pi":[[{"k":"style","named":true}]]}' data-mw='{"parts":["{|",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"style":{"wt":"&apos;color:red&apos;"}},"i":0}},"\n|-\n|b\n|}"]}'>{{{1}}}</span><table about="#mwt3">
+</span><p about="#mwt3" typeof="mw:Transclusion" data-parsoid='{"fostered":true,"autoInsertedEnd":true,"autoInsertedStart":true,"firstWikitextNode":"TABLE","pi":[[{"k":"style","named":true}]]}' data-mw='{"parts":["{|",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"style":{"wt":"&apos;color:red&apos;"}},"i":0}},"\n|-\n|b\n|}"]}'>{{{1}}}</p><table about="#mwt3">
 <tbody><tr>
 <td>b
 </td></tr></tbody></table>
 !! end
 
+## Remex doesn't account for fostered content.
 !! test
 9. Encapsulate foster-parented transclusion content
 !!options
@@ -27632,7 +27697,7 @@ parsoid=wt2wt,wt2html
 hi<table></table><p>hello
 </p>
 !! html/parsoid
-<span about="#mwt2" typeof="mw:Transclusion" data-parsoid='{"fostered":true,"autoInsertedEnd":true,"autoInsertedStart":true,"firstWikitextNode":"TABLE_html","pi":[[{"k":"1"}]]}' data-mw='{"parts":["&lt;table>",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"hi&lt;/table>hello"}},"i":0}}]}'>hi</span><table about="#mwt2"></table><p about="#mwt2">hello</p>
+<p about="#mwt2" typeof="mw:Transclusion" data-parsoid='{"fostered":true,"autoInsertedEnd":true,"autoInsertedStart":true,"firstWikitextNode":"TABLE_html","pi":[[{"k":"1"}]]}' data-mw='{"parts":["&lt;table>",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"hi&lt;/table>hello"}},"i":0}}]}'>hi</p><table about="#mwt2"></table><p about="#mwt2">hello</p>
 !! end
 
 !! test
@@ -30615,7 +30680,7 @@ wgFragmentMode=[ 'html5', 'legacy' ]
 [[#啤酒]] [[#%E5%95%A4%E9%85%92]]
 
 !! html/php
-<div id="toc" class="toc"><input type="checkbox" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
+<div id="toc" class="toc"><input type="checkbox" role="button" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Foo_bar"><span class="tocnumber">1</span> <span class="toctext">Foo bar</span></a></li>
 <li class="toclevel-1 tocsection-2"><a href="#foo_Bar_2"><span class="tocnumber">2</span> <span class="toctext">foo Bar</span></a></li>
@@ -30681,7 +30746,7 @@ wgFragmentMode=[ 'legacy', 'html5' ]
 [[#啤酒]] [[#%E5%95%A4%E9%85%92]]
 
 !! html/php
-<div id="toc" class="toc"><input type="checkbox" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
+<div id="toc" class="toc"><input type="checkbox" role="button" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Foo_bar"><span class="tocnumber">1</span> <span class="toctext">Foo bar</span></a></li>
 <li class="toclevel-1 tocsection-2"><a href="#foo_Bar_2"><span class="tocnumber">2</span> <span class="toctext">foo Bar</span></a></li>
@@ -30729,7 +30794,7 @@ wgFragmentMode=[ 'html5' ]
 [[#啤酒]] [[#%E5%95%A4%E9%85%92]]
 
 !! html/php
-<div id="toc" class="toc"><input type="checkbox" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
+<div id="toc" class="toc"><input type="checkbox" role="button" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none"/><div class="toctitle" lang="en" dir="ltr"><h2>Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Foo_bar"><span class="tocnumber">1</span> <span class="toctext">Foo bar</span></a></li>
 <li class="toclevel-1 tocsection-2"><a href="#foo_Bar_2"><span class="tocnumber">2</span> <span class="toctext">foo Bar</span></a></li>
@@ -31377,7 +31442,7 @@ __NOTOC__
 </tbody></table>
 <dl><dd><table>
   <tbody><tr><td><!--c1--><!--c2-->Table Cell 1<!--c3--><!--c4--></td><td>Table Cell 2<!--c5--></td></tr>
-  </tbody></table><p> foo   </p><!--c1--></dd></dl>
+  </tbody></table> foo<!--c1--></dd></dl>
 !! end
 
 # Looks like <caption> is not accepted in HTML
diff --git a/tests/phpunit/data/registration/duplicate_keys.json b/tests/phpunit/data/registration/duplicate_keys.json
new file mode 100644 (file)
index 0000000..40f2f7e
--- /dev/null
@@ -0,0 +1,4 @@
+{
+       "name": "FooBar",
+       "name": "Test"
+}
index 1011a37..bc930be 100644 (file)
@@ -5,8 +5,9 @@
  * @covers ::wfArrayFilter
  * @covers ::wfArrayFilterByKey
  */
-class WfArrayFilterTest extends \PHPUnit\Framework\TestCase {
+class WfArrayFilterTest extends MediaWikiTestCase {
        public function testWfArrayFilter() {
+               $this->hideDeprecated( 'wfArrayFilter' );
                $arr = [ 'a' => 1, 'b' => 2, 'c' => 3 ];
                $filtered = wfArrayFilter( $arr, function ( $val, $key ) {
                        return $key !== 'b';
@@ -27,6 +28,7 @@ class WfArrayFilterTest extends \PHPUnit\Framework\TestCase {
        }
 
        public function testWfArrayFilterByKey() {
+               $this->hideDeprecated( 'wfArrayFilterByKey' );
                $arr = [ 'a' => 1, 'b' => 2, 'c' => 3 ];
                $filtered = wfArrayFilterByKey( $arr, function ( $key ) {
                        return $key !== 'b';
index 093cb07..7763aff 100644 (file)
@@ -364,6 +364,7 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
                        'ExternalStoreFactory' => [ 'ExternalStoreFactory', ExternalStoreFactory::class ],
                        'PreferencesFactory' => [ 'PreferencesFactory', PreferencesFactory::class ],
                        'ActorMigration' => [ 'ActorMigration', ActorMigration::class ],
+                       'ConfigRepository' => [ 'ConfigRepository', \MediaWiki\Config\ConfigRepository::class ],
                ];
        }
 
index 9583921..07c307e 100644 (file)
@@ -123,7 +123,13 @@ class WebRequestTest extends MediaWikiTestCase {
                ];
        }
 
-       protected function mockWebRequest( $data = [] ) {
+       /**
+        * @param array $data Request data
+        * @param array $config
+        *  - float 'requestTime': Mock value for `$_SERVER['REQUEST_TIME_FLOAT']`.
+        * @return WebRequest
+        */
+       protected function mockWebRequest( array $data = [], array $config = [] ) {
                // Cannot use PHPUnit getMockBuilder() as it does not support
                // overriding protected properties afterwards
                $reflection = new ReflectionClass( WebRequest::class );
@@ -133,9 +139,11 @@ class WebRequestTest extends MediaWikiTestCase {
                $prop->setAccessible( true );
                $prop->setValue( $req, $data );
 
-               $prop = $reflection->getProperty( 'requestTime' );
-               $prop->setAccessible( true );
-               $prop->setValue( $req, microtime( true ) );
+               if ( isset( $config['requestTime'] ) ) {
+                       $prop = $reflection->getProperty( 'requestTime' );
+                       $prop->setAccessible( true );
+                       $prop->setValue( $req, $config['requestTime'] );
+               }
 
                return $req;
        }
@@ -144,9 +152,11 @@ class WebRequestTest extends MediaWikiTestCase {
         * @covers WebRequest::getElapsedTime
         */
        public function testGetElapsedTime() {
-               $req = $this->mockWebRequest();
-               $this->assertGreaterThanOrEqual( 0.0, $req->getElapsedTime() );
-               $this->assertEquals( 0.0, $req->getElapsedTime(), '', /*delta*/ 0.2 );
+               $now = microtime( true ) - 10.0;
+               $req = $this->mockWebRequest( [], [ 'requestTime' => $now ] );
+               $this->assertGreaterThanOrEqual( 10.0, $req->getElapsedTime() );
+               // Catch common errors, but don't fail on slow hardware or VMs (T199764).
+               $this->assertEquals( 10.0, $req->getElapsedTime(), '', 60.0 );
        }
 
        /**
index fbc1bed..29c7dae 100644 (file)
@@ -40,6 +40,10 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                $this->mUserMock->expects( $this->any() )
                        ->method( 'getInstanceForUpdate' )->will( $this->returnValue( $this->mUserMock ) );
 
+               // Needs to return something
+               $this->mUserMock->method( 'getOptions' )
+                       ->willReturn( [] );
+
                // Create a new context
                $this->mContext = new DerivativeContext( new RequestContext() );
                $this->mContext->getContext()->setTitle( Title::newFromText( 'Test' ) );
index 79f7b96..a06ef62 100644 (file)
@@ -158,10 +158,12 @@ class MapCacheLRUTest extends PHPUnit\Framework\TestCase {
                $now += 29;
                $this->assertTrue( $cache->has( 'd', 30 ) );
                $this->assertEquals( 'xxx', $cache->get( 'd' ) );
+               $this->assertEquals( 'xxx', $cache->get( 'd', 30 ) );
 
                $now += 1.5;
                $this->assertFalse( $cache->has( 'd', 30 ) );
                $this->assertEquals( 'xxx', $cache->get( 'd' ) );
+               $this->assertNull( $cache->get( 'd', 30 ) );
        }
 
        /**
@@ -180,14 +182,17 @@ class MapCacheLRUTest extends PHPUnit\Framework\TestCase {
                $cache->setField( 'PMs', 'Margaret Thatcher', 'Tory' );
                $this->assertTrue( $cache->hasField( 'PMs', 'Tony Blair', 30 ) );
                $this->assertEquals( 'Labour', $cache->getField( 'PMs', 'Tony Blair' ) );
+               $this->assertTrue( $cache->hasField( 'PMs', 'Tony Blair', 30 ) );
 
                $now += 29;
                $this->assertTrue( $cache->hasField( 'PMs', 'Tony Blair', 30 ) );
                $this->assertEquals( 'Labour', $cache->getField( 'PMs', 'Tony Blair' ) );
+               $this->assertEquals( 'Labour', $cache->getField( 'PMs', 'Tony Blair', 30 ) );
 
                $now += 1.5;
                $this->assertFalse( $cache->hasField( 'PMs', 'Tony Blair', 30 ) );
                $this->assertEquals( 'Labour', $cache->getField( 'PMs', 'Tony Blair' ) );
+               $this->assertNull( $cache->getField( 'PMs', 'Tony Blair', 30 ) );
 
                $this->assertEquals(
                        [ 'Tony Blair' => 'Labour', 'Margaret Thatcher' => 'Tory' ],
index b6709a0..f0f55fb 100644 (file)
@@ -68,8 +68,11 @@ class BagOStuffTest extends MediaWikiTestCase {
         * @covers BagOStuff::mergeViaCas
         */
        public function testMerge() {
+               $calls = 0;
                $key = $this->cache->makeKey( self::TEST_KEY );
-               $callback = function ( BagOStuff $cache, $key, $oldVal ) {
+               $callback = function ( BagOStuff $cache, $key, $oldVal ) use ( &$calls ) {
+                       ++$calls;
+
                        return ( $oldVal === false ) ? 'merged' : $oldVal . 'merged';
                };
 
@@ -82,6 +85,12 @@ class BagOStuffTest extends MediaWikiTestCase {
                $merged = $this->cache->merge( $key, $callback, 5 );
                $this->assertTrue( $merged );
                $this->assertEquals( 'mergedmerged', $this->cache->get( $key ) );
+
+               $calls = 0;
+               $this->cache->lock( $key );
+               $this->assertFalse( $this->cache->merge( $key, $callback, 1 ), 'Non-blocking merge' );
+               $this->cache->unlock( $key );
+               $this->assertEquals( 0, $calls );
        }
 
        /**
@@ -305,4 +314,21 @@ class BagOStuffTest extends MediaWikiTestCase {
 
                DeferredUpdates::doUpdates();
        }
+
+       /**
+        * @covers BagOStuff::lock()
+        * @covers BagOStuff::unlock()
+        */
+       public function testLocking() {
+               $key = 'test';
+               $this->assertTrue( $this->cache->lock( $key ) );
+               $this->assertFalse( $this->cache->lock( $key ) );
+               $this->assertTrue( $this->cache->unlock( $key ) );
+
+               $key2 = 'test2';
+               $this->assertTrue( $this->cache->lock( $key2, 5, 5, 'rclass' ) );
+               $this->assertTrue( $this->cache->lock( $key2, 5, 5, 'rclass' ) );
+               $this->assertTrue( $this->cache->unlock( $key2 ) );
+               $this->assertTrue( $this->cache->unlock( $key2 ) );
+       }
 }
index 9a8608f..296691d 100644 (file)
@@ -164,8 +164,9 @@ class DefaultPreferencesFactoryTest extends MediaWikiTestCase {
                        }
                );
 
+               /** @var DefaultPreferencesFactory $factory */
                $factory = TestingAccessWrapper::newFromObject( $this->getPreferencesFactory() );
-               $factory->saveFormData( $newOptions, $form );
+               $factory->saveFormData( $newOptions, $form, [] );
        }
 
        /**
diff --git a/tests/phpunit/includes/preferences/FiltersTest.php b/tests/phpunit/includes/preferences/FiltersTest.php
new file mode 100644 (file)
index 0000000..42cbc2c
--- /dev/null
@@ -0,0 +1,141 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+use MediaWiki\Preferences\IntvalFilter;
+use MediaWiki\Preferences\MultiUsernameFilter;
+use MediaWiki\Preferences\TimezoneFilter;
+
+/**
+ * @group Preferences
+ */
+class FiltersTest extends MediaWikiTestCase {
+       /**
+        * @covers MediaWiki\Preferences\IntvalFilter::filterFromForm()
+        * @covers MediaWiki\Preferences\IntvalFilter::filterForForm()
+        */
+       public function testIntvalFilter() {
+               $filter = new IntvalFilter();
+               self::assertSame( 0, $filter->filterFromForm( '0' ) );
+               self::assertSame( 3, $filter->filterFromForm( '3' ) );
+               self::assertSame( '123', $filter->filterForForm( '123' ) );
+       }
+
+       /**
+        * @covers       MediaWiki\Preferences\TimezoneFilter::filterFromForm()
+        * @dataProvider provideTimezoneFilter
+        *
+        * @param string $input
+        * @param string $expected
+        */
+       public function testTimezoneFilter( $input, $expected ) {
+               $filter = new TimezoneFilter();
+               $result = $filter->filterFromForm( $input );
+               self::assertEquals( $expected, $result );
+       }
+
+       public function provideTimezoneFilter() {
+               return [
+                       [ 'ZoneInfo', 'Offset|0' ],
+                       [ 'ZoneInfo|bogus', 'Offset|0' ],
+                       [ 'System', 'System' ],
+                       [ '2:30', 'Offset|150' ],
+               ];
+       }
+
+       /**
+        * @covers MediaWiki\Preferences\MultiUsernameFilter::filterFromForm()
+        * @dataProvider provideMultiUsernameFilterFrom
+        *
+        * @param string $input
+        * @param string|null $expected
+        */
+       public function testMultiUsernameFilterFrom( $input, $expected ) {
+               $filter = $this->makeMultiUsernameFilter();
+               $result = $filter->filterFromForm( $input );
+               self::assertSame( $expected, $result );
+       }
+
+       public function provideMultiUsernameFilterFrom() {
+               return [
+                       [ '', null ],
+                       [ "\n\n\n", null ],
+                       [ 'Foo', '1' ],
+                       [ "\n\n\nFoo\nBar\n", "1\n2" ],
+                       [ "Baz\nInvalid\nFoo", "3\n1" ],
+                       [ "Invalid", null ],
+                       [ "Invalid\n\n\nInvalid\n", null ],
+               ];
+       }
+
+       /**
+        * @covers MediaWiki\Preferences\MultiUsernameFilter::filterForForm()
+        * @dataProvider provideMultiUsernameFilterFor
+        *
+        * @param string $input
+        * @param string $expected
+        */
+       public function testMultiUsernameFilterFor( $input, $expected ) {
+               $filter = $this->makeMultiUsernameFilter();
+               $result = $filter->filterForForm( $input );
+               self::assertSame( $expected, $result );
+       }
+
+       public function provideMultiUsernameFilterFor() {
+               return [
+                       [ '', '' ],
+                       [ "\n", '' ],
+                       [ '1', 'Foo' ],
+                       [ "\n1\n\n2\666\n", "Foo\nBar" ],
+                       [ "666\n667", '' ],
+               ];
+       }
+
+       private function makeMultiUsernameFilter() {
+               $userMapping = [
+                       'Foo' => 1,
+                       'Bar' => 2,
+                       'Baz' => 3,
+               ];
+               $flipped = array_flip( $userMapping );
+               $idLookup = self::getMockBuilder( CentralIdLookup::class )
+                       ->disableOriginalConstructor()
+                       ->setMethods( [ 'centralIdsFromNames', 'namesFromCentralIds' ] )
+                       ->getMockForAbstractClass();
+
+               $idLookup->method( 'centralIdsFromNames' )
+                       ->will( self::returnCallback( function ( $names ) use ( $userMapping ) {
+                               $ids = [];
+                               foreach ( $names as $name ) {
+                                       $ids[] = $userMapping[$name] ?? null;
+                               }
+                               return array_filter( $ids, 'is_numeric' );
+                       } ) );
+               $idLookup->method( 'namesFromCentralIds' )
+                       ->will( self::returnCallback( function ( $ids ) use ( $flipped ) {
+                               $names = [];
+                               foreach ( $ids as $id ) {
+                                       $names[] = $flipped[$id] ?? null;
+                               }
+                               return array_filter( $names, 'is_string' );
+                       } ) );
+
+               return new MultiUsernameFilter( $idLookup );
+       }
+}
index 355f4ef..46c697f 100644 (file)
@@ -52,6 +52,10 @@ class ExtensionJsonValidatorTest extends MediaWikiTestCase {
                                'notjson.txt',
                                'notjson.txt is not valid JSON'
                        ],
+                       [
+                               'duplicate_keys.json',
+                               'Duplicate key: name'
+                       ],
                        [
                                'no_manifest_version.json',
                                'no_manifest_version.json does not have manifest_version set.'
index 35d4ea0..b668a9a 100644 (file)
@@ -17,8 +17,7 @@ class VersionCheckerTest extends PHPUnit\Framework\TestCase {
                        'FakeExtension' => [
                                'MediaWiki' => $constraint,
                        ],
-               ] )
-               );
+               ] ) );
        }
 
        public static function provideCheck() {
@@ -50,8 +49,7 @@ class VersionCheckerTest extends PHPUnit\Framework\TestCase {
         */
        public function testType( $given, $expected ) {
                $checker = new VersionChecker( '1.0.0' );
-               $checker
-                       ->setLoadedExtensionsAndSkins( [
+               $checker->setLoadedExtensionsAndSkins( [
                                'FakeDependency' => [
                                        'version' => '1.0.0',
                                ],
@@ -59,8 +57,7 @@ class VersionCheckerTest extends PHPUnit\Framework\TestCase {
                        ] );
                $this->assertEquals( $expected, $checker->checkArray( [
                        'FakeExtension' => $given,
-               ] )
-               );
+               ] ) );
        }
 
        public static function provideType() {
@@ -69,22 +66,22 @@ class VersionCheckerTest extends PHPUnit\Framework\TestCase {
                        [
                                [
                                        'extensions' => [
-                                               'FakeDependency' => '1.0.0'
-                                       ]
+                                               'FakeDependency' => '1.0.0',
+                                       ],
                                ],
-                               []
+                               [],
                        ],
                        [
                                [
-                                       'MediaWiki' => '1.0.0'
+                                       'MediaWiki' => '1.0.0',
                                ],
-                               []
+                               [],
                        ],
                        [
                                [
                                        'extensions' => [
-                                               'NoVersionGiven' => '*'
-                                       ]
+                                               'NoVersionGiven' => '*',
+                                       ],
                                ],
                                [],
                        ],
@@ -92,39 +89,59 @@ class VersionCheckerTest extends PHPUnit\Framework\TestCase {
                                [
                                        'extensions' => [
                                                'NoVersionGiven' => '1.0',
-                                       ]
+                                       ],
+                               ],
+                               [
+                                       [
+                                               'incompatible' => 'FakeExtension',
+                                               'type' => 'incompatible-extensions',
+                                               'msg' => 'NoVersionGiven does not expose its version, but FakeExtension requires: 1.0.',
+                                       ],
                                ],
-                               [ [
-                                       'incompatible' => 'FakeExtension',
-                                       'type' => 'incompatible-extensions',
-                                       'msg' => 'NoVersionGiven does not expose its version, but FakeExtension requires: 1.0.'
-                               ] ],
                        ],
                        [
                                [
                                        'extensions' => [
                                                'Missing' => '*',
-                                       ]
+                                       ],
+                               ],
+                               [
+                                       [
+                                               'missing' => 'Missing',
+                                               'type' => 'missing-extensions',
+                                               'msg' => 'FakeExtension requires Missing to be installed.',
+                                       ],
                                ],
-                               [ [
-                                       'missing' => 'Missing',
-                                       'type' => 'missing-extensions',
-                                       'msg' => 'FakeExtension requires Missing to be installed.',
-                               ] ],
                        ],
                        [
                                [
                                        'extensions' => [
                                                'FakeDependency' => '2.0.0',
-                                       ]
-                               ],
-                               [ [
-                                       'incompatible' => 'FakeExtension',
-                                       'type' => 'incompatible-extensions',
-                                       // phpcs:ignore Generic.Files.LineLength.TooLong
-                                       'msg' => 'FakeExtension is not compatible with the current installed version of FakeDependency (1.0.0), it requires: 2.0.0.'
-                               ] ],
-                       ]
+                                       ],
+                               ],
+                               [
+                                       [
+                                               'incompatible' => 'FakeExtension',
+                                               'type' => 'incompatible-extensions',
+                                               // phpcs:ignore Generic.Files.LineLength.TooLong
+                                               'msg' => 'FakeExtension is not compatible with the current installed version of FakeDependency (1.0.0), it requires: 2.0.0.',
+                                       ],
+                               ],
+                       ],
+                       [
+                               [
+                                       'skins' => [
+                                               'FakeSkin' => '*',
+                                       ],
+                               ],
+                               [
+                                       [
+                                               'missing' => 'FakeSkin',
+                                               'type' => 'missing-skins',
+                                               'msg' => 'FakeExtension requires FakeSkin to be installed.',
+                                       ],
+                               ],
+                       ],
                ];
        }
 
@@ -134,29 +151,26 @@ class VersionCheckerTest extends PHPUnit\Framework\TestCase {
         */
        public function testInvalidConstraint() {
                $checker = new VersionChecker( '1.0.0' );
-               $checker
-                       ->setLoadedExtensionsAndSkins( [
+               $checker->setLoadedExtensionsAndSkins( [
                                'FakeDependency' => [
                                        'version' => 'not really valid',
                                ],
                        ] );
-               $this->assertEquals(
-                       [ [
+               $this->assertEquals( [
+                       [
                                'type' => 'invalid-version',
-                               'msg' => "FakeDependency does not have a valid version string."
-                       ] ],
-                       $checker->checkArray( [
-                               'FakeExtension' => [
-                                       'extensions' => [
-                                               'FakeDependency' => '1.24.3',
-                                       ],
+                               'msg' => "FakeDependency does not have a valid version string.",
+                       ],
+               ], $checker->checkArray( [
+                       'FakeExtension' => [
+                               'extensions' => [
+                                       'FakeDependency' => '1.24.3',
                                ],
-                       ] )
-               );
+                       ],
+               ] ) );
 
                $checker = new VersionChecker( '1.0.0' );
-               $checker
-                       ->setLoadedExtensionsAndSkins( [
+               $checker->setLoadedExtensionsAndSkins( [
                                'FakeDependency' => [
                                        'version' => '1.24.3',
                                ],
@@ -166,7 +180,28 @@ class VersionCheckerTest extends PHPUnit\Framework\TestCase {
                $checker->checkArray( [
                        'FakeExtension' => [
                                'FakeDependency' => 'not really valid',
-                       ]
+                       ],
                ] );
        }
+
+       /**
+        * T197478
+        */
+       public function testInvalidDependency() {
+               $checker = new VersionChecker( '1.0.0' );
+               $this->setExpectedException( UnexpectedValueException::class,
+                       'Dependency type skin unknown in FakeExtension' );
+               $this->assertEquals( [
+                       [
+                               'type' => 'invalid-version',
+                               'msg' => 'FakeDependency does not have a valid version string.',
+                       ],
+               ], $checker->checkArray( [
+                       'FakeExtension' => [
+                               'skin' => [
+                                       'FakeSkin' => '*',
+                               ],
+                       ],
+               ] ) );
+       }
 }
index 5884d19..c1f5cf8 100644 (file)
@@ -340,4 +340,120 @@ class SearchEngineTest extends MediaWikiLangTestCase {
                        EDIT_NEW | EDIT_SUPPRESS_RC
                );
        }
+
+       public function provideDataForParseNamespacePrefix() {
+               return [
+                       'noop' => [
+                               [
+                                       'query' => 'foo',
+                               ],
+                               false
+                       ],
+                       'empty' => [
+                               [
+                                       'query' => '',
+                               ],
+                               false,
+                       ],
+                       'namespace prefix' => [
+                               [
+                                       'query' => 'help:test',
+                               ],
+                               [ 'test', [ NS_HELP ] ],
+                       ],
+                       'accented namespace prefix with hook' => [
+                               [
+                                       'query' => 'hélp:test',
+                                       'withHook' => true,
+                               ],
+                               [ 'test', [ NS_HELP ] ],
+                       ],
+                       'accented namespace prefix without hook' => [
+                               [
+                                       'query' => 'hélp:test',
+                                       'withHook' => false,
+                               ],
+                               false,
+                       ],
+                       'all with all keyword allowed' => [
+                               [
+                                       'query' => 'all:test',
+                                       'withAll' => true,
+                               ],
+                               [ 'test', null ],
+                       ],
+                       'all with all keyword disallowed' => [
+                               [
+                                       'query' => 'all:test',
+                                       'withAll' => false,
+                               ],
+                               false
+                       ],
+                       'ns only' => [
+                               [
+                                       'query' => 'help:',
+                               ],
+                               [ '', [ NS_HELP ] ]
+                       ],
+                       'all only' => [
+                               [
+                                       'query' => 'all:',
+                                       'withAll' => true,
+                               ],
+                               [ '', null ]
+                       ],
+                       'all wins over namespace when first' => [
+                               [
+                                       'query' => 'all:help:test',
+                                       'withAll' => true,
+                               ],
+                               [ 'help:test', null ]
+                       ],
+                       'ns wins over all when first' => [
+                               [
+                                       'query' => 'help:all:test',
+                                       'withAll' => true,
+                               ],
+                               [ 'all:test', [ NS_HELP ] ]
+                       ],
+               ];
+       }
+
+       /**
+        * @dataProvider provideDataForParseNamespacePrefix
+        * @param array $params
+        * @param  array|false $expected
+        * @throws FatalError
+        * @throws MWException
+        */
+       public function testParseNamespacePrefix( array $params, $expected ) {
+               $this->setTemporaryHook( 'PrefixSearchExtractNamespace', function ( &$namespaces, &$query ) {
+                       if ( strpos( $query, 'hélp:' ) === 0 ) {
+                               $namespaces = [ NS_HELP ];
+                               $query = substr( $query, strlen( 'hélp:' ) );
+                       }
+                       return false;
+               } );
+               $testSet = [];
+               if ( isset( $params['withAll'] ) && isset( $params['withHook'] ) ) {
+                       $testSet[] = $params;
+               } elseif ( isset( $params['withAll'] ) ) {
+                       $testSet[] = $params + [ 'withHook' => true ];
+                       $testSet[] = $params + [ 'withHook' => false ];
+               } elseif ( isset( $params['withHook'] ) ) {
+                       $testSet[] = $params + [ 'withAll' => true ];
+                       $testSet[] = $params + [ 'withAll' => false ];
+               } else {
+                       $testSet[] = $params + [ 'withAll' => true, 'withHook' => true ];
+                       $testSet[] = $params + [ 'withAll' => true, 'withHook' => false ];
+                       $testSet[] = $params + [ 'withAll' => false, 'withHook' => false ];
+                       $testSet[] = $params + [ 'withAll' => true, 'withHook' => false ];
+               }
+
+               foreach ( $testSet as $test ) {
+                       $actual = SearchEngine::parseNamespacePrefixes( $test['query'],
+                               $test['withAll'], $test['withHook'] );
+                       $this->assertEquals( $expected, $actual, 'with params: ' . print_r( $test, true ) );
+               }
+       }
 }
index bdfbb62..cd6cd3b 100644 (file)
@@ -43,6 +43,10 @@ class SpecialPreferencesTest extends MediaWikiTestCase {
                        ]
                        ) );
 
+               # Needs to return something
+               $user->method( 'getOptions' )
+                       ->willReturn( [] );
+
                # Forge a request to call the special page
                $context = new RequestContext();
                $context->setRequest( new FauxRequest() );
index ac8a5dc..13d16df 100644 (file)
@@ -27,11 +27,12 @@ class MockCompletionSearchEngine extends SearchEngine {
         */
        public static function addMockResults( $query, array $result ) {
                // Leading : ensures we don't treat another : as a namespace separator
-               $normalized = Title::newFromText( ":$query" )->getText();
+               $normalized = mb_strtolower( Title::newFromText( ":$query" )->getText() );
                self::$results[$normalized] = $result;
        }
 
        public function completionSearchBackend( $search ) {
+               $search = mb_strtolower( $search );
                if ( !isset( self::$results[$search] ) ) {
                        return SearchSuggestionSet::emptySuggestionSet();
                }