Merge "Add interwiki support to LinkTarget and TitleValue"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 27 Apr 2016 16:19:08 +0000 (16:19 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 27 Apr 2016 16:19:08 +0000 (16:19 +0000)
180 files changed:
Gemfile
Gemfile.lock
RELEASE-NOTES-1.27
Rakefile
autoload.php
composer.json
docs/extension.schema.json
includes/DefaultSettings.php
includes/DummyLinker.php [new file with mode: 0644]
includes/EventRelayerGroup.php
includes/Linker.php
includes/MediaWiki.php
includes/MediaWikiServices.php
includes/ServiceWiring.php
includes/Setup.php
includes/SiteStats.php
includes/Status.php
includes/WatchedItemStore.php
includes/api/ApiOpenSearch.php
includes/api/ApiQueryPrefixSearch.php
includes/api/ApiQuerySearch.php
includes/api/i18n/es.json
includes/api/i18n/fi.json
includes/api/i18n/hsn.json [new file with mode: 0644]
includes/api/i18n/it.json
includes/api/i18n/ur.json [new file with mode: 0644]
includes/cache/LinkCache.php
includes/cache/MessageCache.php
includes/context/ContextSource.php
includes/context/DerivativeContext.php
includes/context/IContextSource.php
includes/context/RequestContext.php
includes/db/DatabaseMssql.php
includes/debug/MWDebug.php
includes/deferred/CdnCacheUpdate.php
includes/deferred/SearchUpdate.php
includes/diff/DairikiDiff.php
includes/diff/DifferenceEngine.php
includes/diff/TableDiffFormatter.php
includes/externalstore/ExternalStoreDB.php
includes/filebackend/FileBackendMultiWrite.php
includes/htmlform/HTMLCheckField.php
includes/htmlform/HTMLForm.php
includes/htmlform/HTMLFormField.php
includes/htmlform/HTMLFormFieldCloner.php
includes/htmlform/OOUIHTMLForm.php
includes/htmlform/VFormHTMLForm.php
includes/installer/i18n/hsn.json [new file with mode: 0644]
includes/installer/i18n/mai.json
includes/installer/i18n/nl.json
includes/installer/i18n/pt-br.json
includes/interwiki/Interwiki.php
includes/jobqueue/JobQueueGroup.php
includes/jobqueue/JobQueueRedis.php
includes/libs/StatusValue.php
includes/libs/eventrelayer/EventRelayer.php
includes/libs/eventrelayer/EventRelayerKafka.php [new file with mode: 0644]
includes/libs/objectcache/BagOStuff.php
includes/libs/objectcache/MultiWriteBagOStuff.php
includes/libs/objectcache/WANObjectCache.php
includes/logging/RightsLogFormatter.php
includes/objectcache/ObjectCache.php
includes/parser/Parser.php
includes/parser/ParserCache.php
includes/registration/ExtensionProcessor.php
includes/revisiondelete/RevDelList.php
includes/search/SearchEngine.php
includes/search/SearchEngineConfig.php [new file with mode: 0644]
includes/search/SearchEngineFactory.php [new file with mode: 0644]
includes/search/SearchNearMatchResultSet.php
includes/search/SearchNearMatcher.php [new file with mode: 0644]
includes/search/SearchResult.php
includes/session/SessionBackend.php
includes/session/SessionManager.php
includes/skins/Skin.php
includes/skins/SkinFactory.php
includes/specialpage/SpecialPage.php
includes/specials/SpecialExport.php
includes/specials/SpecialFileDuplicateSearch.php
includes/specials/SpecialSearch.php
includes/specials/SpecialUpload.php
includes/specials/SpecialUserlogin.php
includes/specials/pagers/ImageListPager.php
includes/user/User.php
languages/data/Names.php
languages/i18n/ar.json
languages/i18n/ast.json
languages/i18n/azb.json
languages/i18n/ba.json
languages/i18n/be-tarask.json
languages/i18n/bg.json
languages/i18n/bgn.json
languages/i18n/ca.json
languages/i18n/ce.json
languages/i18n/cs.json
languages/i18n/cy.json
languages/i18n/da.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/es.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/gl.json
languages/i18n/gu.json
languages/i18n/he.json
languages/i18n/hy.json
languages/i18n/inh.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/jv.json
languages/i18n/lb.json
languages/i18n/lt.json
languages/i18n/lzh.json
languages/i18n/mai.json
languages/i18n/mt.json
languages/i18n/nan.json
languages/i18n/nap.json
languages/i18n/nl.json
languages/i18n/pl.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/ru.json
languages/i18n/sa.json
languages/i18n/sl.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/sv.json
languages/i18n/ta.json
languages/i18n/tcy.json
languages/i18n/tr.json
languages/i18n/tt-cyrl.json
languages/i18n/uk.json
languages/i18n/ur.json
languages/i18n/war.json
languages/i18n/wuu.json
languages/i18n/yi.json
languages/i18n/zh-hans.json
languages/messages/MessagesCs.php
maintenance/updateCollation.php
resources/lib/oojs-ui/oojs-ui-apex.js
resources/lib/oojs-ui/oojs-ui-core-apex.css
resources/lib/oojs-ui/oojs-ui-core-mediawiki.css
resources/lib/oojs-ui/oojs-ui-core.js
resources/lib/oojs-ui/oojs-ui-mediawiki.js
resources/lib/oojs-ui/oojs-ui-toolbars-apex.css
resources/lib/oojs-ui/oojs-ui-toolbars-mediawiki.css
resources/lib/oojs-ui/oojs-ui-toolbars.js
resources/lib/oojs-ui/oojs-ui-widgets-apex.css
resources/lib/oojs-ui/oojs-ui-widgets-mediawiki.css
resources/lib/oojs-ui/oojs-ui-widgets.js
resources/lib/oojs-ui/oojs-ui-windows-apex.css
resources/lib/oojs-ui/oojs-ui-windows-mediawiki.css
resources/lib/oojs-ui/oojs-ui-windows.js
resources/lib/oojs-ui/themes/apex/icons-media.json
resources/lib/oojs-ui/themes/apex/images/icons/fullScreen.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/fullScreen.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/icons-media.json
resources/lib/oojs-ui/themes/mediawiki/images/icons/fullScreen-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/fullScreen-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/fullScreen.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/fullScreen.svg [new file with mode: 0644]
resources/src/mediawiki.legacy/commonPrint.css
resources/src/mediawiki.legacy/shared.css
resources/src/mediawiki.special/mediawiki.special.upload.js
resources/src/mediawiki/ForeignApi.js
resources/src/mediawiki/api.js
resources/src/mediawiki/api/upload.js
tests/browser/ci.yml [new file with mode: 0644]
tests/phpunit/includes/MediaWikiServicesTest.php
tests/phpunit/includes/WatchedItemIntegrationTest.php
tests/phpunit/includes/deferred/SearchUpdateTest.php
tests/phpunit/includes/interwiki/InterwikiTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/objectcache/BagOStuffTest.php
tests/phpunit/includes/search/SearchEnginePrefixTest.php
tests/phpunit/includes/session/SessionManagerTest.php
tests/phpunit/includes/specials/SpecialSearchTest.php

diff --git a/Gemfile b/Gemfile
index 636d4ee..fa3a025 100644 (file)
--- a/Gemfile
+++ b/Gemfile
@@ -1,4 +1,5 @@
 source 'https://rubygems.org'
 
-gem 'mediawiki_selenium', '~> 1.6.5'
+gem 'mediawiki_selenium', '~> 1.7'
+gem 'rake', '~> 11.1', '>= 11.1.1'
 gem 'rubocop', '~> 0.32.1', require: false
index 8684be9..2bbabd1 100644 (file)
@@ -17,9 +17,9 @@ GEM
       faker (>= 1.1.2)
       yml_reader (>= 0.6)
     diff-lcs (1.2.5)
-    domain_name (0.5.20160128)
+    domain_name (0.5.20160310)
       unf (>= 0.0.5, < 1.0.0)
-    faker (1.6.1)
+    faker (1.6.3)
       i18n (~> 0.5)
     faraday (0.9.2)
       multipart-post (>= 1.2, < 3)
@@ -29,7 +29,7 @@ GEM
     ffi (1.9.10)
     gherkin (2.12.2)
       multi_json (~> 1.3)
-    headless (2.2.0)
+    headless (2.2.3)
     http-cookie (1.0.2)
       domain_name (~> 0.5)
     i18n (0.7.0)
@@ -37,7 +37,7 @@ GEM
     mediawiki_api (0.5.0)
       faraday (~> 0.9, >= 0.9.0)
       faraday-cookie_jar (~> 0.0, >= 0.0.6)
-    mediawiki_selenium (1.6.5)
+    mediawiki_selenium (1.7.0)
       cucumber (~> 1.3, >= 1.3.20)
       headless (~> 2.0, >= 2.1.0)
       json (~> 1.8, >= 1.8.1)
@@ -48,8 +48,8 @@ GEM
       rspec-expectations (~> 2.14, >= 2.14.4)
       syntax (~> 1.2, >= 1.2.0)
       thor (~> 0.19, >= 0.19.1)
-    mime-types (2.99)
-    multi_json (1.11.2)
+    mime-types (2.99.1)
+    multi_json (1.11.3)
     multi_test (0.1.2)
     multipart-post (2.0.0)
     netrc (0.11.0)
@@ -63,6 +63,7 @@ GEM
       ast (>= 1.1, < 3.0)
     powerpack (0.1.1)
     rainbow (2.0.0)
+    rake (11.1.1)
     rest-client (1.8.0)
       http-cookie (>= 1.0.2, < 2.0)
       mime-types (>= 1.16, < 3.0)
@@ -77,25 +78,28 @@ GEM
       rainbow (>= 1.99.1, < 3.0)
       ruby-progressbar (~> 1.4)
     ruby-progressbar (1.7.5)
-    rubyzip (1.1.7)
-    selenium-webdriver (2.50.0)
+    rubyzip (1.2.0)
+    selenium-webdriver (2.53.0)
       childprocess (~> 0.5)
-      multi_json (~> 1.0)
       rubyzip (~> 1.0)
       websocket (~> 1.0)
     syntax (1.2.0)
     thor (0.19.1)
     unf (0.1.4)
       unf_ext
-    unf_ext (0.0.7.1)
+    unf_ext (0.0.7.2)
     watir-webdriver (0.9.1)
       selenium-webdriver (>= 2.46.2)
-    websocket (1.2.2)
+    websocket (1.2.3)
     yml_reader (0.7)
 
 PLATFORMS
   ruby
 
 DEPENDENCIES
-  mediawiki_selenium (~> 1.6.5)
+  mediawiki_selenium (~> 1.7)
+  rake (~> 11.1, >= 11.1.1)
   rubocop (~> 0.32.1)
+
+BUNDLED WITH
+   1.10.6
index 72d4b38..be15bde 100644 (file)
@@ -414,6 +414,59 @@ changes to languages because of Phabricator reports.
 * UserMailer::send() no longer accepts $replyto as the 5th argument and $contentType
   as the 6th. These must be passed in the options array now.
 * Title::newFromRedirectRecurse() was removed (deprecated in 1.21).
+* Skin::accesskey was removed (deprecated since 1.21).
+* Skin::blockLink was removed (deprecated since 1.21).
+* Skin::buildRollbackLink was removed (deprecated since 1.21).
+* Skin::emailLink was removed (deprecated since 1.21).
+* Skin::formatComment was removed (deprecated since 1.21).
+* Skin::formatHiddenCategories was removed (deprecated since 1.21).
+* Skin::formatLinksInComment was removed (deprecated since 1.21).
+* Skin::formatRevisionSize was removed (deprecated since 1.21).
+* Skin::formatSize was removed (deprecated since 1.21).
+* Skin::formatTemplates was removed (deprecated since 1.21).
+* Skin::generateTOC was removed (deprecated since 1.21).
+* Skin::getInternalLinkAttributes was removed (deprecated since 1.21).
+* Skin::getInternalLinkAttributesObj was removed (deprecated since 1.21).
+* Skin::getInterwikiLinkAttributes was removed (deprecated since 1.21).
+* Skin::getInvalidTitleDescription was removed (deprecated since 1.21).
+* Skin::getLinkColour was removed (deprecated since 1.21).
+* Skin::getRevDeleteLink was removed (deprecated since 1.21).
+* Skin::getRollbackEditCount was removed (deprecated since 1.21).
+* Skin::makeBrokenImageLinkObj was removed (deprecated since 1.21).
+* Skin::makeCommentLink was removed (deprecated since 1.21).
+* Skin::makeExternalImage was removed (deprecated since 1.21).
+* Skin::makeExternalLink was removed (deprecated since 1.21).
+* Skin::makeHeadline was removed (deprecated since 1.21).
+* Skin::makeImageLink was removed (deprecated since 1.21).
+* Skin::makeMediaLinkFile was removed (deprecated since 1.21).
+* Skin::makeMediaLinkObj was removed (deprecated since 1.21).
+* Skin::makeSelfLinkObj was removed (deprecated since 1.21).
+* Skin::makeThumbLink2 was removed (deprecated since 1.21).
+* Skin::makeThumbLinkObj was removed (deprecated since 1.21).
+* Skin::normaliseSpecialPage was removed (deprecated since 1.21).
+* Skin::normalizeSubpageLink was removed (deprecated since 1.21).
+* Skin::processResponsiveImages was removed (deprecated since 1.21).
+* Skin::revComment was removed (deprecated since 1.21).
+* Skin::revDeleteLink was removed (deprecated since 1.21).
+* Skin::revDeleteLinkDisabled was removed (deprecated since 1.21).
+* Skin::revUserLink was removed (deprecated since 1.21).
+* Skin::revUserTools was removed (deprecated since 1.21).
+* Skin::specialLink was removed (deprecated since 1.21).
+* Skin::splitTrail was removed (deprecated since 1.21).
+* Skin::titleAttrib was removed (deprecated since 1.21).
+* Skin::tocIndent was removed (deprecated since 1.21).
+* Skin::tocLine was removed (deprecated since 1.21).
+* Skin::tocLineEnd was removed (deprecated since 1.21).
+* Skin::tocList was removed (deprecated since 1.21).
+* Skin::tocUnindent was removed (deprecated since 1.21).
+* Skin::tooltip was removed (deprecated since 1.21).
+* Skin::tooltipAndAccesskeyAttribs was removed (deprecated since 1.21).
+* Skin::userTalkLink was removed (deprecated since 1.21).
+* Skin::userToolLinksRedContribs was removed (deprecated since 1.21).
+* wikidiff3 is now the default and only PHP diff engine. It provides improved diff
+  performance on complex changes. $wgExternalDiffEngine = 'wikidiff3' therefore
+  makes no difference now. Users are still recommended to use wikidiff2 if possible,
+  though.
 
 == Compatibility ==
 
index 6eef121..59f5480 100644 (file)
--- a/Rakefile
+++ b/Rakefile
@@ -8,6 +8,9 @@ RuboCop::RakeTask.new(:rubocop) do |task|
   task.options = ['-c', '.rubocop.yml']
 end
 
+require 'mediawiki_selenium/rake_task'
+MediawikiSelenium::RakeTask.new(site_tag: false)
+
 task default: [:test]
 
 desc 'Run all build/tests commands (CI entry point)'
index 946503c..f802ddd 100644 (file)
@@ -357,7 +357,7 @@ $wgAutoloadLocalClasses = [
        'DoubleRedirectJob' => __DIR__ . '/includes/jobqueue/jobs/DoubleRedirectJob.php',
        'DoubleRedirectsPage' => __DIR__ . '/includes/specials/SpecialDoubleRedirects.php',
        'DoubleReplacer' => __DIR__ . '/includes/libs/replacers/DoubleReplacer.php',
-       'DummyLinker' => __DIR__ . '/includes/Linker.php',
+       'DummyLinker' => __DIR__ . '/includes/DummyLinker.php',
        'DummyTermColorer' => __DIR__ . '/maintenance/term/MWTerm.php',
        'Dump7ZipOutput' => __DIR__ . '/includes/export/Dump7ZipOutput.php',
        'DumpBZip2Output' => __DIR__ . '/includes/export/DumpBZip2Output.php',
@@ -397,6 +397,7 @@ $wgAutoloadLocalClasses = [
        'ErrorPageError' => __DIR__ . '/includes/exception/ErrorPageError.php',
        'EventRelayer' => __DIR__ . '/includes/libs/eventrelayer/EventRelayer.php',
        'EventRelayerGroup' => __DIR__ . '/includes/EventRelayerGroup.php',
+       'EventRelayerKafka' => __DIR__ . '/includes/libs/eventrelayer/EventRelayerKafka.php',
        'EventRelayerNull' => __DIR__ . '/includes/libs/eventrelayer/EventRelayerNull.php',
        'Exif' => __DIR__ . '/includes/media/Exif.php',
        'ExifBitmapHandler' => __DIR__ . '/includes/media/ExifBitmap.php',
@@ -1134,12 +1135,15 @@ $wgAutoloadLocalClasses = [
        'SearchDatabase' => __DIR__ . '/includes/search/SearchDatabase.php',
        'SearchDump' => __DIR__ . '/maintenance/dumpIterator.php',
        'SearchEngine' => __DIR__ . '/includes/search/SearchEngine.php',
+       'SearchEngineConfig' => __DIR__ . '/includes/search/SearchEngineConfig.php',
        'SearchEngineDummy' => __DIR__ . '/includes/search/SearchEngine.php',
+       'SearchEngineFactory' => __DIR__ . '/includes/search/SearchEngineFactory.php',
        'SearchExactMatchRescorer' => __DIR__ . '/includes/search/SearchExactMatchRescorer.php',
        'SearchHighlighter' => __DIR__ . '/includes/search/SearchHighlighter.php',
        'SearchMssql' => __DIR__ . '/includes/search/SearchMssql.php',
        'SearchMySQL' => __DIR__ . '/includes/search/SearchMySQL.php',
        'SearchNearMatchResultSet' => __DIR__ . '/includes/search/SearchNearMatchResultSet.php',
+       'SearchNearMatcher' => __DIR__ . '/includes/search/SearchNearMatcher.php',
        'SearchOracle' => __DIR__ . '/includes/search/SearchOracle.php',
        'SearchPostgres' => __DIR__ . '/includes/search/SearchPostgres.php',
        'SearchResult' => __DIR__ . '/includes/search/SearchResult.php',
index 3bea9ea..4fb107e 100644 (file)
@@ -25,7 +25,7 @@
                "ext-xml": "*",
                "liuggio/statsd-php-client": "1.0.18",
                "mediawiki/at-ease": "1.1.0",
-               "oojs/oojs-ui": "0.16.6",
+               "oojs/oojs-ui": "0.17.0",
                "oyejorge/less.php": "1.7.0.10",
                "php": ">=5.5.9",
                "psr/log": "1.0.0",
index 370e18e..3c2c057 100644 (file)
                                                                },
                                                                "skipFunction": {
                                                                        "type": "string",
-                                                                       "description": "Modules that provide fallback functionality can provide a \"skip function\". This function, if provided, will be passed along to the module registry on the client. When this module is loaded (either directly or as a dependency of another module), then this function is executed first. If the function returns true, the module will instantly be considered \"ready\" without requesting the associated module resources. The value returned here must be valid javascript for execution in a private function. It must not contain the \"function () {\" and \"}\" wrapper though."
+                                                                       "description": "Path to a file containing a JavaScript \"skip function\", if desired."
                                                                },
                                                                "scripts": {
                                                                        "type": ["string", "array"],
                },
                "TrackingCategories": {
                        "type": "array",
-                       "description": "Tracking category message keys"
+                       "description": "Tracking category message keys",
+                       "items": {
+                               "type": "string"
+                       }
                },
                "DefaultUserOptions": {
                        "type": "object",
                },
                "HiddenPrefs": {
                        "type": "array",
-                       "description": "Preferences users cannot set"
+                       "description": "Preferences users cannot set",
+                       "items": {
+                               "type": "string"
+                       }
                },
                "GroupPermissions": {
                        "type": "object",
-                       "description": "Default permissions to give to user groups"
+                       "description": "Default permissions to give to user groups",
+                       "patternProperties": {
+                               "^[a-z]+$": {
+                                       "type": "object",
+                                       "patternProperties": {
+                                               "^[a-z]+$": {
+                                                       "type": "boolean"
+                                               }
+                                       }
+                               }
+                       }
                },
                "RevokePermissions": {
                        "type": "object",
-                       "description": "Default permissions to revoke from user groups"
+                       "description": "Default permissions to revoke from user groups",
+                       "patternProperties": {
+                               "^[a-z]+$": {
+                                       "type": "object",
+                                       "patternProperties": {
+                                               "^[a-z]+$": {
+                                                       "type": "boolean"
+                                               }
+                                       }
+                               }
+                       }
                },
                "ImplicitGroups": {
                        "type": "array",
                },
                "AvailableRights": {
                        "type": "array",
-                       "description": "User rights added by the extension"
+                       "description": "User rights added by the extension",
+                       "items": {
+                               "type": "string"
+                       }
                },
                "ContentHandlers": {
                        "type": "object",
-                       "description": "Mapping of model ID to class name"
+                       "description": "Mapping of model ID to class name",
+                       "patternProperties": {
+                               "^[A-Za-z]+$": {
+                                       "type": "string"
+                               }
+                       }
                },
                "RateLimits": {
                        "type": "object",
                                "array",
                                "string"
                        ],
-                       "description": "Function to call after setup has finished"
+                       "description": "Function to call after setup has finished",
+                       "items": {
+                               "type": "string"
+                       }
                },
                "ExtensionMessagesFiles": {
                        "type": "object",
                "FilterLogTypes": {
                        "type": "object"
                },
+               "ActionFilteredLogs": {
+                       "type": "object",
+                       "description": "List of log types which can be filtered by log actions",
+                       "patternProperties": {
+                               "^[a-z-]+$": {
+                                       "type": "object",
+                                       "patternProperties": {
+                                               "^[a-z-]+$": {
+                                                       "type": "array",
+                                                       "items": {
+                                                               "type": "string"
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               },
                "LogNames": {
                        "type": "object"
                },
index 10e6adb..13f7c4e 100644 (file)
@@ -2169,7 +2169,7 @@ $wgLanguageConverterCacheType = CACHE_ANYTHING;
  * given, giving a callable function which will generate a suitable cache object.
  */
 $wgObjectCaches = [
-       CACHE_NONE => [ 'class' => 'EmptyBagOStuff' ],
+       CACHE_NONE => [ 'class' => 'EmptyBagOStuff', 'reportDupes' => false ],
        CACHE_DB => [ 'class' => 'SqlBagOStuff', 'loggroup' => 'SQLBagOStuff' ],
 
        CACHE_ANYTHING => [ 'factory' => 'ObjectCache::newAnything' ],
@@ -2189,12 +2189,12 @@ $wgObjectCaches = [
                'loggroup'  => 'SQLBagOStuff'
        ],
 
-       'apc' => [ 'class' => 'APCBagOStuff' ],
-       'xcache' => [ 'class' => 'XCacheBagOStuff' ],
-       'wincache' => [ 'class' => 'WinCacheBagOStuff' ],
+       'apc' => [ 'class' => 'APCBagOStuff', 'reportDupes' => false ],
+       'xcache' => [ 'class' => 'XCacheBagOStuff', 'reportDupes' => false ],
+       'wincache' => [ 'class' => 'WinCacheBagOStuff', 'reportDupes' => false ],
        'memcached-php' => [ 'class' => 'MemcachedPhpBagOStuff', 'loggroup' => 'memcached' ],
        'memcached-pecl' => [ 'class' => 'MemcachedPeclBagOStuff', 'loggroup' => 'memcached' ],
-       'hash' => [ 'class' => 'HashBagOStuff' ],
+       'hash' => [ 'class' => 'HashBagOStuff', 'reportDupes' => false ],
 ];
 
 /**
@@ -2223,27 +2223,24 @@ $wgMainWANCache = false;
  *
  * The format is an associative array where the key is a cache identifier, and
  * the value is an associative array of parameters. The "cacheId" parameter is
- * a cache identifier from $wgObjectCaches. The "relayerConfig" parameter is an
- * array used to construct an EventRelayer object. The "pool" parameter is a
- * string that is used as a PubSub channel prefix. The "loggroup" parameter
- * controls where log events are sent.
+ * a cache identifier from $wgObjectCaches. The "channels" parameter is a map of
+ * actions ('purge') to PubSub channels defined in $wgEventRelayerConfig.
+ * The "loggroup" parameter controls where log events are sent.
  *
  * @since 1.26
  */
 $wgWANObjectCaches = [
        CACHE_NONE => [
-               'class'         => 'WANObjectCache',
-               'cacheId'       => CACHE_NONE,
-               'pool'          => 'mediawiki-main-none',
-               'relayerConfig' => [ 'class' => 'EventRelayerNull' ]
+               'class'    => 'WANObjectCache',
+               'cacheId'  => CACHE_NONE,
+               'channels' => []
        ]
        /* Example of a simple single data-center cache:
-       'memcached-php' => array(
-               'class'         => 'WANObjectCache',
-               'cacheId'       => 'memcached-php',
-               'pool'          => 'mediawiki-main-memcached',
-               'relayerConfig' => array( 'class' => 'EventRelayerNull' )
-       )
+       'memcached-php' => [
+               'class'    => 'WANObjectCache',
+               'cacheId'  => 'memcached-php',
+               'channels' => [ 'purge' => 'wancache-main-memcached-purge' ]
+       ]
        */
 ];
 
@@ -2589,6 +2586,13 @@ $wgCdnMaxageLagged = 30;
  */
 $wgCdnReboundPurgeDelay = 0;
 
+/**
+ * Cache timeout for the CDN when a response is known to be wrong or incomplete (due to load)
+ * @see $wgSquidMaxage
+ * @since 1.27
+ */
+$wgCdnMaxageSubstitute = 60;
+
 /**
  * Default maximum age for raw CSS/JS accesses
  *
@@ -5896,7 +5900,7 @@ $wgStatsdServer = false;
 /**
  * Prefix for metric names sent to $wgStatsdServer.
  *
- * @see RequestContext::getStats
+ * @see MediaWikiServices::getStatsdDataFactory
  * @see BufferingStatsdDataFactory
  * @since 1.25
  */
@@ -7808,9 +7812,9 @@ $wgUpdateRowsPerQuery = 100;
 
 /**
  * Name of the external diff engine to use. Supported values:
- * * false: default PHP implementation, DairikiDiff
+ * * false: default PHP implementation
  * * 'wikidiff2': Wikimedia's fast difference engine implemented as a PHP/HHVM module
- * * 'wikidiff3': newer PHP-based difference engine
+ * * 'wikidiff' and 'wikidiff3' are treated as false for backwards compatibility
  * * any other string is treated as a path to external diff executable
  */
 $wgExternalDiffEngine = false;
@@ -8053,7 +8057,7 @@ $wgPopularPasswordFile = __DIR__ . '/../serialized/commonpasswords.cdb';
 $wgMaxUserDBWriteDuration = false;
 
 /**
- * Mapping of event channels to EventRelayer configuration.
+ * Mapping of event channels (or channel categories) to EventRelayer configuration.
  *
  * By setting up a PubSub system (like Kafka) and enabling a corresponding EventRelayer class
  * that uses it, MediaWiki can broadcast events to all subscribers. Certain features like WAN
@@ -8061,7 +8065,13 @@ $wgMaxUserDBWriteDuration = false;
  * subscribe to the channel and take actions based on the events. For example, a local daemon
  * can run on each CDN cache node and perfom local purges based on the URL purge channel events.
  *
- * The 'default' channel is for all channels without an explicit entry here.
+ * Some extensions may want to use "channel categories" so that different channels can also share
+ * the same custom relayer instance (e.g. when it's likely to be overriden). They can use
+ * EventRelayerGroup::getRelayer() based on the category but call notify() on various different
+ * actual channels. One reason for this would be that some system have very different performance
+ * vs durability needs, so one system (e.g. Kafka) may not be suitable for all uses.
+ *
+ * The 'default' key is for all channels (or channel categories) without an explicit entry here.
  *
  * @since 1.27
  */
diff --git a/includes/DummyLinker.php b/includes/DummyLinker.php
new file mode 100644 (file)
index 0000000..45535ce
--- /dev/null
@@ -0,0 +1,517 @@
+<?php
+
+/**
+ * @since 1.18
+ */
+class DummyLinker {
+
+       /**
+        * @deprecated since 1.27
+        */
+       public function getInterwikiLinkAttributes( $title, $unused = null, $class = 'external' ) {
+               wfDeprecated( __METHOD__, '1.27' );
+               return Linker::getInterwikiLinkAttributes(
+                       $title,
+                       $unused,
+                       $class
+               );
+       }
+
+       /**
+        * @deprecated since 1.27
+        */
+       public function getInternalLinkAttributes( $title, $unused = null, $class = '' ) {
+               wfDeprecated( __METHOD__, '1.27' );
+               return Linker::getInternalLinkAttributes(
+                       $title,
+                       $unused,
+                       $class
+               );
+       }
+
+       /**
+        * @deprecated since 1.27
+        */
+       public function getInternalLinkAttributesObj(
+               $nt,
+               $unused = null,
+               $class = '',
+               $title = false
+       ) {
+               wfDeprecated( __METHOD__, '1.27' );
+               return Linker::getInternalLinkAttributesObj(
+                       $nt,
+                       $unused,
+                       $class,
+                       $title
+               );
+       }
+
+       public function getLinkColour( $t, $threshold ) {
+               return Linker::getLinkColour( $t, $threshold );
+       }
+
+       public function link(
+               $target,
+               $html = null,
+               $customAttribs = [ ],
+               $query = [ ],
+               $options = [ ]
+       ) {
+               return Linker::link(
+                       $target,
+                       $html,
+                       $customAttribs,
+                       $query,
+                       $options
+               );
+       }
+
+       public function linkKnown(
+               $target,
+               $html = null,
+               $customAttribs = [ ],
+               $query = [ ],
+               $options = [ 'known', 'noclasses' ]
+       ) {
+               return Linker::linkKnown(
+                       $target,
+                       $html,
+                       $customAttribs,
+                       $query,
+                       $options
+               );
+       }
+
+       public function makeSelfLinkObj(
+               $nt,
+               $html = '',
+               $query = '',
+               $trail = '',
+               $prefix = ''
+       ) {
+               return Linker::makeSelfLinkObj(
+                       $nt,
+                       $html,
+                       $query,
+                       $trail,
+                       $prefix
+               );
+       }
+
+       public function getInvalidTitleDescription(
+               IContextSource $context,
+               $namespace,
+               $title
+       ) {
+               return Linker::getInvalidTitleDescription(
+                       $context,
+                       $namespace,
+                       $title
+               );
+       }
+
+       public function normaliseSpecialPage( Title $title ) {
+               return Linker::normaliseSpecialPage( $title );
+       }
+
+       public function makeExternalImage( $url, $alt = '' ) {
+               return Linker::makeExternalImage( $url, $alt );
+       }
+
+       public function makeImageLink(
+               Parser $parser,
+               Title $title,
+               $file,
+               $frameParams = [ ],
+               $handlerParams = [ ],
+               $time = false,
+               $query = "",
+               $widthOption = null
+       ) {
+               return Linker::makeImageLink(
+                       $parser,
+                       $title,
+                       $file,
+                       $frameParams,
+                       $handlerParams,
+                       $time,
+                       $query,
+                       $widthOption
+               );
+       }
+
+       public function makeThumbLinkObj(
+               Title $title,
+               $file,
+               $label = '',
+               $alt,
+               $align = 'right',
+               $params = [ ],
+               $framed = false,
+               $manualthumb = ""
+       ) {
+               return Linker::makeThumbLinkObj(
+                       $title,
+                       $file,
+                       $label,
+                       $alt,
+                       $align,
+                       $params,
+                       $framed,
+                       $manualthumb
+               );
+       }
+
+       public function makeThumbLink2(
+               Title $title,
+               $file,
+               $frameParams = [ ],
+               $handlerParams = [ ],
+               $time = false,
+               $query = ""
+       ) {
+               return Linker::makeThumbLink2(
+                       $title,
+                       $file,
+                       $frameParams,
+                       $handlerParams,
+                       $time,
+                       $query
+               );
+       }
+
+       public function processResponsiveImages( $file, $thumb, $hp ) {
+               Linker::processResponsiveImages(
+                       $file,
+                       $thumb,
+                       $hp
+               );
+       }
+
+       public function makeBrokenImageLinkObj(
+               $title,
+               $label = '',
+               $query = '',
+               $unused1 = '',
+               $unused2 = '',
+               $time = false
+       ) {
+               return Linker::makeBrokenImageLinkObj(
+                       $title,
+                       $label,
+                       $query,
+                       $unused1,
+                       $unused2,
+                       $time
+               );
+       }
+
+       public function makeMediaLinkObj( $title, $html = '', $time = false ) {
+               return Linker::makeMediaLinkObj(
+                       $title,
+                       $html,
+                       $time
+               );
+       }
+
+       public function makeMediaLinkFile( Title $title, $file, $html = '' ) {
+               return Linker::makeMediaLinkFile(
+                       $title,
+                       $file,
+                       $html
+               );
+       }
+
+       public function specialLink( $name, $key = '' ) {
+               return Linker::specialLink( $name, $key );
+       }
+
+       public function makeExternalLink(
+               $url,
+               $text,
+               $escape = true,
+               $linktype = '',
+               $attribs = [ ],
+               $title = null
+       ) {
+               return Linker::makeExternalLink(
+                       $url,
+                       $text,
+                       $escape,
+                       $linktype,
+                       $attribs,
+                       $title
+               );
+       }
+
+       public function userLink( $userId, $userName, $altUserName = false ) {
+               return Linker::userLink(
+                       $userId,
+                       $userName,
+                       $altUserName
+               );
+       }
+
+       public function userToolLinks(
+               $userId,
+               $userText,
+               $redContribsWhenNoEdits = false,
+               $flags = 0,
+               $edits = null
+       ) {
+               return Linker::userToolLinks(
+                       $userId,
+                       $userText,
+                       $redContribsWhenNoEdits,
+                       $flags,
+                       $edits
+               );
+       }
+
+       public function userToolLinksRedContribs( $userId, $userText, $edits = null ) {
+               return Linker::userToolLinksRedContribs(
+                       $userId,
+                       $userText,
+                       $edits
+               );
+       }
+
+       public function userTalkLink( $userId, $userText ) {
+               return Linker::userTalkLink( $userId, $userText );
+       }
+
+       public function blockLink( $userId, $userText ) {
+               return Linker::blockLink( $userId, $userText );
+       }
+
+       public function emailLink( $userId, $userText ) {
+               return Linker::emailLink( $userId, $userText );
+       }
+
+       public function revUserLink( $rev, $isPublic = false ) {
+               return Linker::revUserLink( $rev, $isPublic );
+       }
+
+       public function revUserTools( $rev, $isPublic = false ) {
+               return Linker::revUserTools( $rev, $isPublic );
+       }
+
+       public function formatComment(
+               $comment,
+               $title = null,
+               $local = false,
+               $wikiId = null
+       ) {
+               return Linker::formatComment(
+                       $comment,
+                       $title,
+                       $local,
+                       $wikiId
+               );
+       }
+
+       public function formatLinksInComment(
+               $comment,
+               $title = null,
+               $local = false,
+               $wikiId = null
+       ) {
+               return Linker::formatLinksInComment(
+                       $comment,
+                       $title,
+                       $local,
+                       $wikiId
+               );
+       }
+
+       public function makeCommentLink(
+               Title $title,
+               $text,
+               $wikiId = null,
+               $options = [ ]
+       ) {
+               return Linker::makeCommentLink(
+                       $title,
+                       $text,
+                       $wikiId,
+                       $options
+               );
+       }
+
+       public function normalizeSubpageLink( $contextTitle, $target, &$text ) {
+               return Linker::normalizeSubpageLink(
+                       $contextTitle,
+                       $target,
+                       $text
+               );
+       }
+
+       public function commentBlock(
+               $comment,
+               $title = null,
+               $local = false,
+               $wikiId = null
+       ) {
+               return Linker::commentBlock(
+                       $comment,
+                       $title,
+                       $local,
+                       $wikiId
+               );
+       }
+
+       public function revComment( Revision $rev, $local = false, $isPublic = false ) {
+               return Linker::revComment( $rev, $local, $isPublic );
+       }
+
+       public function formatRevisionSize( $size ) {
+               return Linker::formatRevisionSize( $size );
+       }
+
+       public function tocIndent() {
+               return Linker::tocIndent();
+       }
+
+       public function tocUnindent( $level ) {
+               return Linker::tocUnindent( $level );
+       }
+
+       public function tocLine( $anchor, $tocline, $tocnumber, $level, $sectionIndex = false ) {
+               return Linker::tocLine(
+                       $anchor,
+                       $tocline,
+                       $tocnumber,
+                       $level,
+                       $sectionIndex
+               );
+       }
+
+       public function tocLineEnd() {
+               return Linker::tocLineEnd();
+       }
+
+       public function tocList( $toc, $lang = false ) {
+               return Linker::tocList( $toc, $lang );
+       }
+
+       public function generateTOC( $tree, $lang = false ) {
+               return Linker::generateTOC( $tree, $lang );
+       }
+
+       public function makeHeadline(
+               $level,
+               $attribs,
+               $anchor,
+               $html,
+               $link,
+               $legacyAnchor = false
+       ) {
+               return Linker::makeHeadline(
+                       $level,
+                       $attribs,
+                       $anchor,
+                       $html,
+                       $link,
+                       $legacyAnchor
+               );
+       }
+
+       public function splitTrail( $trail ) {
+               return Linker::splitTrail( $trail );
+       }
+
+       public function generateRollback(
+               $rev,
+               IContextSource $context = null,
+               $options = [ 'verify' ]
+       ) {
+               return Linker::generateRollback(
+                       $rev,
+                       $context,
+                       $options
+               );
+       }
+
+       public function getRollbackEditCount( $rev, $verify ) {
+               return Linker::getRollbackEditCount( $rev, $verify );
+       }
+
+       public function buildRollbackLink(
+               $rev,
+               IContextSource $context = null,
+               $editCount = false
+       ) {
+               return Linker::buildRollbackLink(
+                       $rev,
+                       $context,
+                       $editCount
+               );
+       }
+
+       public function formatTemplates(
+               $templates,
+               $preview = false,
+               $section = false,
+               $more = null
+       ) {
+               return Linker::formatTemplates(
+                       $templates,
+                       $preview,
+                       $section,
+                       $more
+               );
+       }
+
+       public function formatHiddenCategories( $hiddencats ) {
+               return Linker::formatHiddenCategories( $hiddencats );
+       }
+
+       public function formatSize( $size ) {
+               return Linker::formatSize( $size );
+       }
+
+       public function titleAttrib( $name, $options = null, array $msgParams = [ ] ) {
+               return Linker::titleAttrib(
+                       $name,
+                       $options,
+                       $msgParams
+               );
+       }
+
+       public function accesskey( $name ) {
+               return Linker::accesskey( $name );
+       }
+
+       public function getRevDeleteLink( User $user, Revision $rev, Title $title ) {
+               return Linker::getRevDeleteLink(
+                       $user,
+                       $rev,
+                       $title
+               );
+       }
+
+       public function revDeleteLink( $query = [ ], $restricted = false, $delete = true ) {
+               return Linker::revDeleteLink(
+                       $query,
+                       $restricted,
+                       $delete
+               );
+       }
+
+       public function revDeleteLinkDisabled( $delete = true ) {
+               return Linker::revDeleteLinkDisabled( $delete );
+       }
+
+       public function tooltipAndAccesskeyAttribs( $name, array $msgParams = [ ] ) {
+               return Linker::tooltipAndAccesskeyAttribs(
+                       $name,
+                       $msgParams
+               );
+       }
+
+       public function tooltip( $name, $options = null ) {
+               return Linker::tooltip( $name, $options );
+       }
+
+}
index 9dfac79..9360693 100644 (file)
@@ -1,4 +1,6 @@
 <?php
+use MediaWiki\MediaWikiServices;
+
 /**
  * Factory class for spawning EventRelayer objects using configuration
  *
@@ -12,25 +14,19 @@ class EventRelayerGroup {
        /** @var EventRelayer[] */
        protected $relayers = [];
 
-       /** @var EventRelayerGroup */
-       protected static $instance = null;
-
        /**
-        * @param Config $config
+        * @param array[] $config Channel configuration
         */
-       protected function __construct( Config $config ) {
-               $this->configByChannel = $config->get( 'EventRelayerConfig' );
+       public function __construct( array $config ) {
+               $this->configByChannel = $config;
        }
 
        /**
+        * @deprecated since 1.27 Use MediaWikiServices::getInstance()->getEventRelayerGroup()
         * @return EventRelayerGroup
         */
        public static function singleton() {
-               if ( !self::$instance ) {
-                       self::$instance = new self( RequestContext::getMain()->getConfig() );
-               }
-
-               return self::$instance;
+               return MediaWikiServices::getInstance()->getEventRelayerGroup();
        }
 
        /**
index b2bc220..071f95e 100644 (file)
@@ -2361,20 +2361,3 @@ class Linker {
 
 }
 
-/**
- * @since 1.18
- */
-class DummyLinker {
-
-       /**
-        * Use PHP's magic __call handler to transform instance calls to a dummy instance
-        * into static calls to the new Linker for backwards compatibility.
-        *
-        * @param string $fname Name of called method
-        * @param array $args Arguments to the method
-        * @return mixed
-        */
-       public function __call( $fname, $args ) {
-               return call_user_func_array( [ 'Linker', $fname ], $args );
-       }
-}
index ad02e68..3dd7420 100644 (file)
@@ -585,6 +585,13 @@ class MediaWiki {
                        $request->response()->header( "X-Database-Lagged: true" );
                        wfDebugLog( 'replication', "Lagged DB used; CDN cache TTL limited to $maxAge seconds" );
                }
+
+               // Avoid long-term cache pollution due to message cache rebuild timeouts (T133069)
+               if ( MessageCache::singleton()->isDisabled() ) {
+                       $maxAge = $config->get( 'CdnMaxageSubstitute' );
+                       $context->getOutput()->lowerCdnMaxage( $maxAge );
+                       $request->response()->header( "X-Response-Substitute: true" );
+               }
        }
 
        /**
index 7b1def9..4b6ddd4 100644 (file)
@@ -2,14 +2,20 @@
 namespace MediaWiki;
 
 use ConfigFactory;
+use EventRelayerGroup;
 use GlobalVarConfig;
 use Config;
 use Hooks;
 use LBFactory;
+use Liuggio\StatsdClient\Factory\StatsdDataFactory;
 use LoadBalancer;
 use MediaWiki\Services\ServiceContainer;
+use SearchEngine;
+use SearchEngineConfig;
+use SearchEngineFactory;
 use SiteLookup;
 use SiteStore;
+use SkinFactory;
 
 /**
  * Service locator for MediaWiki core services.
@@ -144,6 +150,49 @@ class MediaWikiServices extends ServiceContainer {
                return $this->getService( 'SiteStore' );
        }
 
+       /**
+        * @return StatsdDataFactory
+        */
+       public function getStatsdDataFactory() {
+               return $this->getService( 'StatsdDataFactory' );
+       }
+
+       /**
+        * @return EventRelayerGroup
+        */
+       public function getEventRelayerGroup() {
+               return $this->getService( 'EventRelayerGroup' );
+       }
+
+       /**
+        * @return SearchEngine
+        */
+       public function newSearchEngine() {
+               // New engine object every time, since they keep state
+               return $this->getService( 'SearchEngineFactory' )->create();
+       }
+
+       /**
+        * @return SearchEngineFactory
+        */
+       public function getSearchEngineFactory() {
+               return $this->getService( 'SearchEngineFactory' );
+       }
+
+       /**
+        * @return SearchEngineConfig
+        */
+       public function getSearchEngineConfig() {
+               return $this->getService( 'SearchEngineConfig' );
+       }
+
+       /**
+        * @return SkinFactory
+        */
+       public function getSkinFactory() {
+               return $this->getService( 'SkinFactory' );
+       }
+
        ///////////////////////////////////////////////////////////////////////////
        // NOTE: When adding a service getter here, don't forget to add a test
        // case for it in MediaWikiServicesTest::provideGetters() and in
index d8709b9..d53396f 100644 (file)
@@ -72,6 +72,31 @@ return [
                return $services->getConfigFactory()->makeConfig( 'main' );
        },
 
+       'StatsdDataFactory' => function( MediaWikiServices $services ) {
+               return new BufferingStatsdDataFactory(
+                       rtrim( $services->getMainConfig()->get( 'StatsdMetricPrefix' ), '.' )
+               );
+       },
+
+       'EventRelayerGroup' => function( MediaWikiServices $services ) {
+               return new EventRelayerGroup( $services->getMainConfig()->get( 'EventRelayerConfig' ) );
+       },
+
+       'SearchEngineFactory' => function( MediaWikiServices $services ) {
+               // Create search engine
+               return new SearchEngineFactory( $services->getService( 'SearchEngineConfig' ) );
+       },
+
+       'SearchEngineConfig' => function( MediaWikiServices $services ) {
+               // Create a search engine config from main config.
+               $config = $services->getService( 'MainConfig' );
+               return new SearchEngineConfig( $config );
+       },
+
+       'SkinFactory' => function( MediaWikiServices $services ) {
+               return new SkinFactory();
+       },
+
        ///////////////////////////////////////////////////////////////////////////
        // NOTE: When adding a service here, don't forget to add a getter function
        // in the MediaWikiServices class. The convenience getter should just call
index cddb436..9898b84 100644 (file)
@@ -618,10 +618,9 @@ if ( $wgMainWANCache === false ) {
        // Sites using multiple datacenters can configure a relayer.
        $wgMainWANCache = 'mediawiki-main-default';
        $wgWANObjectCaches[$wgMainWANCache] = [
-               'class'         => 'WANObjectCache',
-               'cacheId'       => $wgMainCacheType,
-               'pool'          => 'mediawiki-main-default',
-               'relayerConfig' => [ 'class' => 'EventRelayerNull' ]
+               'class'    => 'WANObjectCache',
+               'cacheId'  => $wgMainCacheType,
+               'channels' => [ 'purge' => 'wancache-main-default-purge' ]
        ];
 }
 
index acd5262..215378b 100644 (file)
@@ -202,8 +202,11 @@ class SiteStats {
         */
        static function jobs() {
                if ( !isset( self::$jobs ) ) {
-                       $dbr = wfGetDB( DB_SLAVE );
-                       self::$jobs = array_sum( JobQueueGroup::singleton()->getQueueSizes() );
+                       try{
+                               self::$jobs = array_sum( JobQueueGroup::singleton()->getQueueSizes() );
+                       } catch ( JobQueueError $e ) {
+                               self::$jobs = 0;
+                       }
                        /**
                         * Zero rows still do single row read for row that doesn't exist,
                         * but people are annoyed by that
index cc7abc8..3d2c887 100644 (file)
@@ -420,8 +420,11 @@ class Status {
         * Returns a list of status messages of the given type, with message and
         * params left untouched, like a sane version of getStatusArray
         *
-        * @param string $type
+        * Each entry is a map of:
+        *   - message: string message key or MessageSpecifier
+        *   - params: array list of parameters
         *
+        * @param string $type
         * @return array
         */
        public function getErrorsByType( $type ) {
index 2180b2d..fcf6d3b 100644 (file)
@@ -621,7 +621,7 @@ class WatchedItemStore implements StatsdAwareInterface {
                $this->reuseConnection( $dbr );
 
                foreach ( $res as $row ) {
-                       $timestamps[(int)$row->wl_namespace][$row->wl_title] = $row->wl_notificationtimestamp;
+                       $timestamps[$row->wl_namespace][$row->wl_title] = $row->wl_notificationtimestamp;
                }
 
                return $timestamps;
index effa520..058e0a3 100644 (file)
@@ -24,6 +24,8 @@
  * @file
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @ingroup API
  */
@@ -123,8 +125,7 @@ class ApiOpenSearch extends ApiBase {
         * @param array &$results Put results here. Keys have to be integers.
         */
        protected function search( $search, $limit, $namespaces, $resolveRedir, &$results ) {
-
-               $searchEngine = SearchEngine::create();
+               $searchEngine = MediaWikiServices::getInstance()->newSearchEngine();
                $searchEngine->setLimitOffset( $limit );
                $searchEngine->setNamespaces( $namespaces );
                $titles = $searchEngine->extractTitles( $searchEngine->completionSearchWithVariants( $search ) );
@@ -350,24 +351,25 @@ class ApiOpenSearch extends ApiBase {
         * @throws MWException
         */
        public static function getOpenSearchTemplate( $type ) {
-               global $wgOpenSearchTemplate, $wgCanonicalServer;
+               $config = MediaWikiServices::getInstance()->getSearchEngineConfig();
+               $template = $config->getConfig()->get( 'OpenSearchTemplate' );
 
-               if ( $wgOpenSearchTemplate && $type === 'application/x-suggestions+json' ) {
-                       return $wgOpenSearchTemplate;
+               if ( $template && $type === 'application/x-suggestions+json' ) {
+                       return $template;
                }
 
-               $ns = implode( '|', SearchEngine::defaultNamespaces() );
+               $ns = implode( '|', $config->defaultNamespaces() );
                if ( !$ns ) {
                        $ns = '0';
                }
 
                switch ( $type ) {
                        case 'application/x-suggestions+json':
-                               return $wgCanonicalServer . wfScript( 'api' )
+                               return $config->getConfig()->get( 'CanonicalServer' ) . wfScript( 'api' )
                                        . '?action=opensearch&search={searchTerms}&namespace=' . $ns;
 
                        case 'application/x-suggestions+xml':
-                               return $wgCanonicalServer . wfScript( 'api' )
+                               return $config->getConfig()->get( 'CanonicalServer' ) . wfScript( 'api' )
                                        . '?action=opensearch&format=xml&search={searchTerms}&namespace=' . $ns;
 
                        default:
index d04796c..5c50273 100644 (file)
@@ -1,4 +1,6 @@
 <?php
+use MediaWiki\MediaWikiServices;
+
 /**
  * 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
@@ -45,7 +47,7 @@ class ApiQueryPrefixSearch extends ApiQueryGeneratorBase {
                $namespaces = $params['namespace'];
                $offset = $params['offset'];
 
-               $searchEngine = SearchEngine::create();
+               $searchEngine = MediaWikiServices::getInstance()->newSearchEngine();
                $searchEngine->setLimitOffset( $limit + 1, $offset );
                $searchEngine->setNamespaces( $namespaces );
                $titles = $searchEngine->extractTitles( $searchEngine->completionSearchWithVariants( $search ) );
index 3955cc5..f57d3a3 100644 (file)
@@ -24,6 +24,8 @@
  * @file
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Query module to perform full text search within wiki titles and content
  *
@@ -78,8 +80,9 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                }
 
                // Create search engine instance and set options
-               $search = isset( $params['backend'] ) && $params['backend'] != self::BACKEND_NULL_PARAM ?
-                       SearchEngine::create( $params['backend'] ) : SearchEngine::create();
+               $type = isset( $params['backend'] ) && $params['backend'] != self::BACKEND_NULL_PARAM ?
+                       $params['backend'] : null;
+               $search = MediaWikiServices::getInstance()->getSearchEngineFactory()->create( $type );
                $search->setLimitOffset( $limit + 1, $params['offset'] );
                $search->setNamespaces( $params['namespace'] );
                $search->setFeatureData( 'rewrite', (bool)$params['enablerewrites'] );
@@ -95,7 +98,8 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                } elseif ( $what == 'nearmatch' ) {
                        // near matches must receive the user input as provided, otherwise
                        // the near matches within namespaces are lost.
-                       $matches = SearchEngine::getNearMatchResultSet( $params['search'] );
+                       $matches = $search->getNearMatcher( $this->getConfig() )
+                               ->getNearMatchResultSet( $params['search'] );
                } else {
                        // We default to title searches; this is a terrible legacy
                        // of the way we initially set up the MySQL fulltext-based
@@ -358,13 +362,14 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                        'enablerewrites' => false,
                ];
 
-               $alternatives = SearchEngine::getSearchTypes();
+               $searchConfig = MediaWikiServices::getInstance()->getSearchEngineConfig();
+               $alternatives = $searchConfig->getSearchTypes();
                if ( count( $alternatives ) > 1 ) {
                        if ( $alternatives[0] === null ) {
                                $alternatives[0] = self::BACKEND_NULL_PARAM;
                        }
                        $params['backend'] = [
-                               ApiBase::PARAM_DFLT => $this->getConfig()->get( 'SearchType' ),
+                               ApiBase::PARAM_DFLT => $searchConfig->getSearchType(),
                                ApiBase::PARAM_TYPE => $alternatives,
                        ];
                }
index c4479a4..284c23c 100644 (file)
@@ -17,7 +17,8 @@
                        "Eloy",
                        "AlvaroMolina",
                        "Ciencia Al Poder",
-                       "Lemondoge"
+                       "Lemondoge",
+                       "Mgpena"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentación]]\n* [[mw:API:FAQ|Preguntas frecuentes]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista de correos]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API de anuncios]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Errores y peticiones]\n</div>\n<strong>Estado:</strong> Todas las características que se muestran en esta página debería funcionar, pero la API aún está en desarrollo activo y puede cambiar en cualquier momento. Suscríbete a [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la lista de correo de mediawiki-api-announce] para estar al día de las actualizaciones.\n\n<strong>Solicitudes erróneas:</strong> Cuando se envían solicitudes erróneas a la API, se envía un encabezado HTTP con la clave \"MediaWiki-API-Error\" y ambos valores, del encabezado y el código de error, se establecerán en el mismo valor. Para más información, véase [[mw:API:Errors_and_warnings|API: Errores y advertencias]].\n\n<strong>Pruebas:</strong> para facilitar las pruebas de solicitudes a la API, consulta [[Special:ApiSandbox]].",
@@ -79,6 +80,7 @@
        "apihelp-delete-param-reason": "Motivo de la eliminación. Si no se especifica, se generará uno automáticamente.",
        "apihelp-delete-param-tags": "Cambio de etiquetas para aplicar a la entrada en la eliminación del registro.",
        "apihelp-delete-param-watch": "Añadir esta página a la lista de seguimiento del usuario actual.",
+       "apihelp-delete-param-watchlist": "Incondicionalmente agregar o remover la página de la lista de seguimiento del usuario actual, usar las preferencias o no cambiar el seguimiento.",
        "apihelp-delete-param-unwatch": "Quitar la página de la lista de seguimiento del usuario actual.",
        "apihelp-delete-example-simple": "Borrar <kbd>Main Page</kbd>.",
        "apihelp-delete-example-reason": "Eliminar <kbd>Main Page</kbd> con el motivo <kbd>Preparing for move</kbd>.",
        "apihelp-expandtemplates-param-text": "Sintaxis wiki que se convertirá.",
        "apihelp-expandtemplates-param-revid": "Revisión de ID, para <nowiki>{{REVISIONID}}</nowiki> y variables similares.",
        "apihelp-expandtemplates-paramvalue-prop-wikitext": "El wikitexto expandido.",
+       "apihelp-expandtemplates-paramvalue-prop-categories": "Cualesquiera categorías presentes en la entrada que no están representadas en salida de wikitexto.",
        "apihelp-expandtemplates-paramvalue-prop-properties": "Propiedades de página definidas por palabras mágicas en el wikitexto.",
        "apihelp-expandtemplates-paramvalue-prop-ttl": "El tiempo máximo tras el cual deberían invalidarse los resultados en caché.",
        "apihelp-expandtemplates-paramvalue-prop-jsconfigvars": "Da las variables de configuración JavaScript específicas para la página.",
index 4ea465c..b2398af 100644 (file)
@@ -6,7 +6,8 @@
                        "Pitke",
                        "Stryn",
                        "Jaakkoh",
-                       "01miki10"
+                       "01miki10",
+                       "Silvonen"
                ]
        },
        "apihelp-main-param-action": "Mikä toiminto suoritetaan.",
@@ -30,6 +31,8 @@
        "apihelp-createaccount-param-name": "Käyttäjätunnus.",
        "apihelp-createaccount-param-email": "Käyttäjän sähköpostiosoite (valinnainen).",
        "apihelp-createaccount-param-realname": "Käyttäjän oikea nimi (valinnainen).",
+       "apihelp-createaccount-example-pass": "Luo käyttäjä <kbd>testuser</kbd> salasanalla <kbd>test123</kbd>.",
+       "apihelp-createaccount-example-mail": "Luo käyttäjä <kbd>testmailuset</kbd> ja lähetä sähköpostilla satunnaisesti luotu salasana.",
        "apihelp-delete-description": "Poista sivu.",
        "apihelp-delete-param-watch": "Lisää sivu nykyisen käyttäjän tarkkailulistalle.",
        "apihelp-delete-param-unwatch": "Poista sivu nykyisen käyttäjän tarkkailulistalta.",
        "apihelp-edit-param-unwatch": "Poista sivu nykyisen käyttäjän tarkkailulistalta.",
        "apihelp-edit-example-edit": "Muokkaa sivua.",
        "apihelp-emailuser-description": "Lähetä sähköpostia käyttäjälle.",
+       "apihelp-emailuser-param-target": "Käyttäjä, jolle lähetetään sähköpostia.",
        "apihelp-emailuser-param-subject": "Otsikko.",
+       "apihelp-emailuser-param-text": "Sähköpostin sisältö.",
        "apihelp-emailuser-param-ccme": "Lähetä kopio tästä viestistä minulle.",
        "apihelp-emailuser-example-email": "Lähetä käyttäjälle <kbd>WikiSysop</kbd> sähköposti, jossa lukee <kbd>Content</kbd>.",
+       "apihelp-expandtemplates-description": "Laajentaa kaikki wikitekstin mallineet.",
        "apihelp-expandtemplates-param-title": "Sivun otsikko.",
+       "apihelp-expandtemplates-param-text": "Muunnettava wikiteksti.",
+       "apihelp-expandtemplates-paramvalue-prop-wikitext": "Laajennettu wikiteksti.",
        "apihelp-feedcontributions-param-year": "Alkaen vuodesta (ja aiemmin).",
        "apihelp-feedcontributions-param-month": "Alkaen kuukaudesta (ja aiemmin).",
        "apihelp-feedcontributions-param-tagfilter": "Suodata muokkaukset, joissa on nämä merkkaukset.",
        "apihelp-feedcontributions-param-newonly": "Näytä vain muokkaukset, joilla on luotu sivu.",
        "apihelp-feedrecentchanges-param-limit": "Kerralla näytettävien tulosten enimmäismäärä.",
        "apihelp-feedrecentchanges-param-hideminor": "Piilota pienet muutokset.",
+       "apihelp-feedrecentchanges-param-hidebots": "Piilota bottien tekemät muutokset.",
        "apihelp-feedrecentchanges-param-hideanons": "Piilota kirjautumattomien käyttäjien tekemät muutokset.",
        "apihelp-feedrecentchanges-param-hideliu": "Piilota rekisteröityneiden käyttäjien tekemät muutokset.",
+       "apihelp-feedrecentchanges-param-hidepatrolled": "Piilota tarkastetut muutokset.",
+       "apihelp-feedrecentchanges-param-hidemyself": "Piilota nykyisen käyttäjän tekemät muutokset.",
+       "apihelp-feedrecentchanges-param-tagfilter": "Suodata merkkauksen mukaan.",
        "apihelp-feedrecentchanges-example-simple": "Näytä tuoreet muutokset.",
        "apihelp-filerevert-param-filename": "Kohteen nimi ilman File:-etuliitettä.",
        "apihelp-filerevert-param-comment": "Tallennuksen kommentti.",
        "apihelp-imagerotate-description": "Käännä kuva tai kuvia.",
+       "apihelp-imagerotate-example-simple": "Käännä kuvaa <kbd>File:Example.png</kbd> <kbd>90</kbd> astetta.",
+       "apihelp-imagerotate-example-generator": "Käännä kaikkia kuvia luokassa <kbd>Category:Flip</kbd> <kbd>180</kbd> astetta.",
+       "apihelp-login-param-name": "Käyttäjänimi.",
+       "apihelp-login-param-password": "Salasana.",
        "apihelp-login-example-login": "Kirjaudu sisään.",
        "apihelp-logout-description": "Kirjaudu ulos ja tyhjennä istunnon tiedot.",
        "apihelp-logout-example-logout": "Kirjaa nykyinen käyttäjä ulos.",
@@ -76,6 +92,7 @@
        "apihelp-move-param-noredirect": "Älä luo ohjausta.",
        "apihelp-move-param-watch": "Lisää sivu ja ohjaus nykyisen käyttäjän tarkkailulistalle.",
        "apihelp-move-param-unwatch": "Poista sivu ja ohjaus nykyisen käyttäjän tarkkailulistalta.",
+       "apihelp-query+alllinks-paramvalue-prop-title": "Lisää linkin otsikon.",
        "apihelp-query+linkshere-param-show": "Näytä vain kohteet, jotka täyttävät nämä kriteerit:\n;redirect:Näytä vain uudelleenohjaukset.\n;!redirect:Näytä vain ei-uudelleenohjaukset",
        "apihelp-tag-example-rev": "Lisää tunniste <kbd>vandalism</kbd> versioon 123 antamatta perustelua.",
        "apihelp-upload-param-stash": "Mikäli valittu, palvelin säilöö tiedoston väliaikaisesti tallentamisen sijaan."
diff --git a/includes/api/i18n/hsn.json b/includes/api/i18n/hsn.json
new file mode 100644 (file)
index 0000000..a646923
--- /dev/null
@@ -0,0 +1,9 @@
+{
+       "@metadata": {
+               "authors": [
+                       "SolidBlock"
+               ]
+       },
+       "apihelp-main-param-action": "要搞得操作。",
+       "apihelp-main-param-format": "出的格式。"
+}
index d26b996..fb319dd 100644 (file)
@@ -11,7 +11,8 @@
                        "Sannita",
                        "Macofe",
                        "Nemo bis",
-                       "JackLantern"
+                       "JackLantern",
+                       "Urielejh"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentazione]] (in inglese)\n* [[mw:API:FAQ|FAQ]] (in inglese)\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailing list]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annunci sull'API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bug & richieste]\n</div>\n<strong>Stato:</strong> tutte le funzioni e caratteristiche mostrate su questa pagina dovrebbero funzionare, ma le API sono ancora in fase attiva di sviluppo, e potrebbero cambiare in qualsiasi momento. Iscriviti alla [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la mailing list sugli annunci delle API MediaWiki] per essere informato sugli aggiornamenti.\n\n<strong>Istruzioni sbagliate:</strong> quando vengono impartite alle API delle istruzioni sbagliate, un'intestazione HTTP verrà inviata col messaggio \"MediaWiki-API-Error\" e, sia il valore dell'intestazione, sia il codice d'errore, verranno impostati con lo stesso valore. Per maggiori informazioni leggi [[mw:API:Errors_and_warnings|API:Errori ed avvertimenti]] (in inglese).\n\n<strong>Test:</strong> per testare facilmente le richieste API, vedi [[Special:ApiSandbox]].",
        "apihelp-expandtemplates-param-text": "Wikitesto da convertire.",
        "apihelp-expandtemplates-param-prop": "Quale informazione ottenere.\n\nNota che se non è selezionato alcun valore, il risultato conterrà il codice wiki, ma l'output sarà in un formato obsoleto.",
        "apihelp-expandtemplates-paramvalue-prop-wikitext": "Il wikitext espanso.",
+       "apihelp-expandtemplates-paramvalue-prop-properties": "Proprietà della pagina definite dalle parole magiche estese nel wikitesto.",
        "apihelp-expandtemplates-paramvalue-prop-volatile": "Se l'output sia volatile e non debba essere riutilizzato altrove all'interno della pagina.",
+       "apihelp-expandtemplates-paramvalue-prop-ttl": "Il tempo massimo dopo il quale le memorizzazioni temporanee (cache) del risultato dovrebbero essere invalidate.",
        "apihelp-feedcontributions-param-feedformat": "Il formato del feed.",
        "apihelp-feedcontributions-param-year": "Dall'anno (e precedenti).",
        "apihelp-feedcontributions-param-month": "Dal mese (e precedenti).",
        "apihelp-feedrecentchanges-param-namespace": "Namespace a cui limitare i risultati.",
        "apihelp-feedrecentchanges-param-associated": "Includi namespace associato (discussione o principale)",
        "apihelp-feedrecentchanges-param-limit": "Numero massimo di risultati da restituire.",
+       "apihelp-feedrecentchanges-param-from": "Mostra i cambiamenti da allora.",
        "apihelp-feedrecentchanges-param-hideminor": "Nascondi le modifiche minori.",
        "apihelp-feedrecentchanges-param-hidebots": "Nascondi le modifiche apportate da bot.",
        "apihelp-feedrecentchanges-param-hideanons": "Nascondi le modifiche fatte da utenti anonimi.",
        "apihelp-login-example-gettoken": "Recupera un token di login.",
        "apihelp-login-example-login": "Entra.",
        "apihelp-logout-description": "Esci e cancella i dati della sessione.",
+       "apihelp-logout-example-logout": "Disconnetti l'utente attuale.",
        "apihelp-mergehistory-description": "Unisce cronologie pagine.",
        "apihelp-mergehistory-param-from": "Il titolo della pagina da cui cronologia sarà unita. Non può essere usato insieme a <var>$1fromid</var>.",
        "apihelp-mergehistory-param-fromid": "L'ID della pagina da cui cronologia sarà unita. Non può essere usato insieme a <var>$1from</var>.",
        "apihelp-query+allpages-param-prefix": "Ricerca per tutti i titoli delle pagine che iniziano con questo valore.",
        "apihelp-query+allpages-param-namespace": "Il namespace da elencare.",
        "apihelp-query+allpages-param-filterredir": "Quali pagine elencare.",
+       "apihelp-query+allpages-param-prtype": "Limita alle sole pagine protette.",
        "apihelp-query+allpages-param-limit": "Quante pagine totali restituire.",
        "apihelp-query+allpages-param-dir": "La direzione in cui elencare.",
        "apihelp-query+allredirects-param-from": "Il titolo del reindirizzamento da cui iniziare l'elenco.",
        "apihelp-query+blocks-paramvalue-prop-by": "Aggiunge il nome utente dell'utente che ha effettuato il blocco.",
        "apihelp-query+blocks-paramvalue-prop-byid": "Aggiunge l'ID utente dell'utente che ha effettuato il blocco.",
        "apihelp-query+blocks-example-simple": "Elenca i blocchi.",
+       "apihelp-query+categories-description": "Elenca tutte le categorie a cui appartengono le pagine.",
+       "apihelp-query+categories-param-prop": "Quali proprietà aggiuntive ottenere per ogni categoria.",
        "apihelp-query+categories-param-show": "Quale tipo di categorie mostrare.",
        "apihelp-query+categories-param-limit": "Quante categorie restituire.",
        "apihelp-query+categories-param-dir": "La direzione in cui elencare.",
        "apihelp-query+imageusage-param-namespace": "Il namespace da elencare.",
        "apihelp-query+imageusage-param-dir": "La direzione in cui elencare.",
        "apihelp-query+imageusage-param-redirect": "Se la pagina collegata è un redirect, trova tutte le pagine che puntano al redirect. Il limite massimo è dimezzato.",
+       "apihelp-query+info-description": "Ottieni informazioni base sulla pagina.",
+       "apihelp-query+info-param-prop": "Quali proprietà aggiuntive ottenere:",
        "apihelp-query+info-paramvalue-prop-visitingwatchers": "Il numero di osservatori di ogni pagina che hanno visitato le ultime modifiche alla pagina, se consentito.",
        "apihelp-query+iwbacklinks-param-prefix": "Prefisso per l'interwiki.",
        "apihelp-query+iwbacklinks-param-limit": "Quante pagine totali restituire.",
        "apihelp-query+langbacklinks-paramvalue-prop-lltitle": "Aggiunge il titolo del collegamento linguistico.",
        "apihelp-query+langbacklinks-param-dir": "La direzione in cui elencare.",
        "apihelp-query+langlinks-paramvalue-prop-url": "Aggiunge l'URL completo.",
+       "apihelp-query+langlinks-paramvalue-prop-autonym": "Aggiunge il nome nativo della lingua.",
        "apihelp-query+langlinks-param-dir": "La direzione in cui elencare.",
        "apihelp-query+links-param-namespace": "Mostra collegamenti solo in questi namespace.",
        "apihelp-query+links-param-limit": "Quanti collegamenti restituire.",
        "apihelp-query+revisions-param-tag": "Elenca solo le versioni etichettate con questa etichetta.",
        "apihelp-query+revisions+base-paramvalue-prop-ids": "L'ID della versione.",
        "apihelp-query+revisions+base-paramvalue-prop-timestamp": "Il timestamp della versione.",
+       "apihelp-query+revisions+base-paramvalue-prop-user": "Utente che ha effettuato la versione.",
+       "apihelp-query+revisions+base-paramvalue-prop-userid": "ID utente dell'autore della versione.",
        "apihelp-query+revisions+base-paramvalue-prop-content": "Testo della versione.",
        "apihelp-query+revisions+base-paramvalue-prop-tags": "Etichette della versione.",
+       "apihelp-query+search-description": "Eseguire una ricerca di testo completa.",
        "apihelp-query+search-param-what": "Quale tipo di ricerca effettuare.",
        "apihelp-query+search-param-info": "Quali metadati restituire.",
        "apihelp-query+search-param-prop": "Quali proprietà restituire.",
        "apihelp-query+search-paramvalue-prop-sectiontitle": "Aggiunge il titolo della sezione corrispondente.",
        "apihelp-query+search-param-limit": "Quante pagine totali restituire.",
        "apihelp-query+siteinfo-param-prop": "Quali informazioni ottenere:",
+       "apihelp-query+siteinfo-paramvalue-prop-statistics": "Restituisce le statistiche del sito.",
        "apihelp-query+siteinfo-paramvalue-prop-libraries": "Restituisci librerie installate sul wiki.",
        "apihelp-query+siteinfo-paramvalue-prop-extensions": "Restituisci estensioni installate sul wiki.",
        "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Restituisce informazioni sui tipi di restrizione (protezione) disponibili.",
+       "apihelp-query+siteinfo-example-simple": "Recupera informazioni sul sito.",
        "apihelp-query+tags-param-prop": "Quali proprietà ottenere:",
        "apihelp-query+templates-param-limit": "Quanti template restituire.",
        "apihelp-query+templates-param-dir": "La direzione in cui elencare.",
        "apihelp-query+watchlist-param-prop": "Quali proprietà aggiuntive ottenere:",
        "apihelp-query+watchlist-paramvalue-prop-ids": "Aggiunge l'ID versione e l'ID pagina.",
        "apihelp-query+watchlist-paramvalue-prop-title": "Aggiungi il titolo della pagina.",
+       "apihelp-query+watchlist-paramvalue-type-new": "Creazioni pagina.",
        "apihelp-query+watchlistraw-param-namespace": "Elenca solo le pagine nei namespace indicati.",
+       "apihelp-query+watchlistraw-param-limit": "Numero totale di risultati da restituire per ogni richiesta.",
+       "apihelp-query+watchlistraw-param-prop": "Quali proprietà aggiuntive ottenere:",
+       "apihelp-query+watchlistraw-paramvalue-prop-changed": "Aggiunge data e ora dell'ultima notifica all'utente riguardo la modifica.",
        "apihelp-query+watchlistraw-param-fromtitle": "Il titolo (con prefisso namespace) da cui iniziare l'elenco.",
        "apihelp-query+watchlistraw-param-totitle": "Il titolo (con prefisso namespace) al quale interrompere l'elenco.",
        "apihelp-query+watchlistraw-example-simple": "Elenca le pagine fra gli osservati speciali dell'utente attuale.",
        "apihelp-query+watchlistraw-example-generator": "Recupera le informazioni sulle pagine fra gli osservati speciali dell'utente attuale.",
+       "apihelp-revisiondelete-description": "Cancella e ripristina le versioni.",
+       "apihelp-revisiondelete-param-type": "Tipo di cancellazione della versione effettuata.",
+       "apihelp-revisiondelete-param-hide": "Cosa nascondere per ogni versione.",
+       "apihelp-revisiondelete-param-show": "Cosa mostrare per ogni versione.",
+       "apihelp-revisiondelete-param-reason": "Motivo per l'eliminazione o il ripristino.",
+       "apihelp-stashedit-param-title": "Titolo della pagina revisionata.",
        "apihelp-stashedit-param-sectiontitle": "Il titolo per una nuova sezione.",
        "apihelp-stashedit-param-text": "Contenuto della pagina.",
        "apihelp-stashedit-param-contentmodel": "Modello di contenuto dei nuovi contenuti.",
+       "apihelp-tag-param-reason": "Motivo per la modifica.",
        "apihelp-tokens-param-type": "Tipi di token da richiedere.",
        "apihelp-tokens-example-edit": "Recupera un token di modifica (il predefinito).",
        "apihelp-unblock-description": "Sblocca un utente",
+       "apihelp-unblock-param-reason": "Motivo dello sblocco.",
        "apihelp-unblock-param-tags": "Modifica etichette da applicare all'elemento del registro dei blocchi.",
        "apihelp-undelete-param-title": "Titolo della pagina da ripristinare.",
+       "apihelp-undelete-param-reason": "Motivo per il ripristino.",
        "apihelp-undelete-param-tags": "Modifica etichette da applicare all'elemento del registro delle cancellazioni.",
+       "apihelp-upload-param-watch": "Osserva la pagina.",
        "apihelp-upload-param-file": "Contenuto del file.",
        "apihelp-upload-example-url": "Carica da un URL.",
        "apihelp-userrights-param-user": "Nome utente.",
diff --git a/includes/api/i18n/ur.json b/includes/api/i18n/ur.json
new file mode 100644 (file)
index 0000000..c0f1bcf
--- /dev/null
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Obaid Raza"
+               ]
+       },
+       "apihelp-delete-example-simple": "حذف <kbd>صفحۂ اول</kbd>."
+}
index 8a79bd8..276e818 100644 (file)
@@ -195,8 +195,11 @@ class LinkCache {
                }
        }
 
+       /**
+        * @param string $title prefixed dbkey
+        */
        public function clearBadLink( $title ) {
-               $this->mBadLinks->clear( [ $title ] );
+               $this->mBadLinks->delete( $title );
        }
 
        /**
index 0e566ea..62fab5f 100644 (file)
@@ -51,7 +51,7 @@ class MessageCache {
        protected $mCache;
 
        /**
-        * Should  mean that database cannot be used, but check
+        * Should mean that database cannot be used, but check
         * @var bool $mDisable
         */
        protected $mDisable;
@@ -355,6 +355,7 @@ class MessageCache {
                        $where[] = 'loading FAILED - cache is disabled';
                        $this->mDisable = true;
                        $this->mCache = false;
+                       wfDebugLog( 'MessageCacheError', __METHOD__ . ": Failed to load $code\n" );
                        # This used to throw an exception, but that led to nasty side effects like
                        # the whole wiki being instantly down if the memcached server died
                } else {
@@ -1113,6 +1114,22 @@ class MessageCache {
                $this->mDisable = false;
        }
 
+       /**
+        * Whether DB/cache usage is disabled for determining messages
+        *
+        * If so, this typically indicates either:
+        *   - a) load() failed to find a cached copy nor query the DB
+        *   - b) we are in a special context or error mode that cannot use the DB
+        * If the DB is ignored, any derived HTML output or cached objects may be wrong.
+        * To avoid long-term cache pollution, TTLs can be adjusted accordingly.
+        *
+        * @return bool
+        * @since 1.27
+        */
+       public function isDisabled() {
+               return $this->mDisable;
+       }
+
        /**
         * Clear all stored messages. Mainly used after a mass rebuild.
         */
index 911ecdd..b617871 100644 (file)
@@ -18,6 +18,8 @@
  * @author Happy-melon
  * @file
  */
+use Liuggio\StatsdClient\Factory\StatsdDataFactory;
+use MediaWiki\MediaWikiServices;
 
 /**
  * The simplest way of implementing IContextSource is to hold a RequestContext as a
@@ -165,8 +167,10 @@ abstract class ContextSource implements IContextSource {
        /**
         * Get the Stats object
         *
+        * @deprecated since 1.27 use a StatsdDataFactory from MediaWikiServices (preferably injected)
+        *
         * @since 1.25
-        * @return BufferingStatsdDataFactory
+        * @return StatsdDataFactory
         */
        public function getStats() {
                return $this->getContext()->getStats();
index 1b881e4..e77a058 100644 (file)
@@ -18,6 +18,8 @@
  * @author Daniel Friesen
  * @file
  */
+use Liuggio\StatsdClient\Factory\StatsdDataFactory;
+use MediaWiki\MediaWikiServices;
 
 /**
  * An IContextSource implementation which will inherit context from another source
@@ -67,11 +69,6 @@ class DerivativeContext extends ContextSource implements MutableContext {
         */
        private $config;
 
-       /**
-        * @var Stats
-        */
-       private $stats;
-
        /**
         * @var Timing
         */
@@ -110,14 +107,12 @@ class DerivativeContext extends ContextSource implements MutableContext {
        /**
         * Get the stats object
         *
-        * @return BufferingStatsdDataFactory
+        * @deprecated since 1.27 use a StatsdDataFactory from MediaWikiServices (preferably injected)
+        *
+        * @return StatsdDataFactory
         */
        public function getStats() {
-               if ( !is_null( $this->stats ) ) {
-                       return $this->stats;
-               } else {
-                       return $this->getContext()->getStats();
-               }
+               return MediaWikiServices::getInstance()->getStatsdDataFactory();
        }
 
        /**
index 750389d..ccefc72 100644 (file)
@@ -21,6 +21,8 @@
  * @file
  */
 
+use Liuggio\StatsdClient\Factory\StatsdDataFactory;
+
 /**
  * Interface for objects which can provide a MediaWiki context on request
  *
@@ -126,8 +128,10 @@ interface IContextSource {
        /**
         * Get the stats object
         *
+        * @deprecated since 1.27 use a StatsdDataFactory from MediaWikiServices (preferably injected)
+        *
         * @since 1.25
-        * @return BufferingStatsdDataFactory
+        * @return StatsdDataFactory
         */
        public function getStats();
 
index c8b8108..c87798e 100644 (file)
@@ -22,7 +22,9 @@
  * @file
  */
 
+use Liuggio\StatsdClient\Factory\StatsdDataFactory;
 use MediaWiki\Logger\LoggerFactory;
+use MediaWiki\MediaWikiServices;
 
 /**
  * Group all the pieces relevant to the context of a request into one instance
@@ -63,11 +65,6 @@ class RequestContext implements IContextSource, MutableContext {
         */
        private $skin;
 
-       /**
-        * @var \Liuggio\StatsdClient\Factory\StatsdDataFactory
-        */
-       private $stats;
-
        /**
         * @var Timing
         */
@@ -138,14 +135,12 @@ class RequestContext implements IContextSource, MutableContext {
        /**
         * Get the Stats object
         *
-        * @return BufferingStatsdDataFactory
+        * @deprecated since 1.27 use a StatsdDataFactory from MediaWikiServices (preferably injected)
+        *
+        * @return StatsdDataFactory
         */
        public function getStats() {
-               if ( $this->stats === null ) {
-                       $prefix = rtrim( $this->getConfig()->get( 'StatsdMetricPrefix' ), '.' );
-                       $this->stats = new BufferingStatsdDataFactory( $prefix );
-               }
-               return $this->stats;
+               return MediaWikiServices::getInstance()->getStatsdDataFactory();
        }
 
        /**
index ce34537..5c46c1a 100644 (file)
@@ -1131,6 +1131,35 @@ class DatabaseMssql extends Database {
                return strlen( $name ) && $name[0] == '[' && substr( $name, -1, 1 ) == ']';
        }
 
+       /**
+        * MS SQL supports more pattern operators than other databases (ex: [,],^)
+        *
+        * @param string $s
+        * @return string
+        */
+       protected function escapeLikeInternal( $s ) {
+               return addcslashes( $s, '\%_[]^' );
+       }
+
+       /**
+        * MS SQL requires specifying the escape character used in a LIKE query
+        * or using Square brackets to surround characters that are to be escaped
+        * http://msdn.microsoft.com/en-us/library/ms179859.aspx
+        * Here we take the Specify-Escape-Character approach since it's less
+        * invasive, renders a query that is closer to other DB's and better at
+        * handling square bracket escaping
+        *
+        * @return string Fully built LIKE statement
+        */
+       public function buildLike() {
+               $params = func_get_args();
+               if ( count( $params ) > 0 && is_array( $params[0] ) ) {
+                       $params = $params[0];
+               }
+
+               return parent::buildLike( $params ) . " ESCAPE '\' ";
+       }
+
        /**
         * @param string $db
         * @return bool
index 81770d5..13d25a8 100644 (file)
@@ -368,6 +368,9 @@ class MWDebug {
                        $sql
                );
 
+               // last check for invalid utf8
+               $sql = UtfNormal\Validator::cleanUp( $sql );
+
                self::$query[] = [
                        'sql' => $sql,
                        'function' => $function,
index 32f6adc..65ff9f3 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use Wikimedia\Assert\Assert;
+use MediaWiki\MediaWikiServices;
 
 /**
  * Handles purging appropriate CDN URLs given a title (or titles)
@@ -109,7 +110,8 @@ class CdnCacheUpdate implements DeferrableUpdate, MergeableUpdate {
                wfDebugLog( 'squid', __METHOD__ . ': ' . implode( ' ', $urlArr ) );
 
                // Reliably broadcast the purge to all edge nodes
-               $relayer = EventRelayerGroup::singleton()->getRelayer( 'cdn-url-purges' );
+               $relayer = MediaWikiServices::getInstance()->getEventRelayerGroup()
+                                       ->getRelayer( 'cdn-url-purges' );
                $relayer->notify(
                        'cdn-url-purges',
                        [
index 2abf028..62c8b00 100644 (file)
@@ -23,6 +23,8 @@
  * @ingroup Search
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Database independant search index updater
  *
@@ -75,14 +77,15 @@ class SearchUpdate implements DeferrableUpdate {
         * Perform actual update for the entry
         */
        public function doUpdate() {
-               global $wgDisableSearchUpdate;
+               $config = MediaWikiServices::getInstance()->getSearchEngineConfig();
 
-               if ( $wgDisableSearchUpdate || !$this->id ) {
+               if ( $config->getConfig()->get( 'DisableSearchUpdate' ) || !$this->id ) {
                        return;
                }
 
-               foreach ( SearchEngine::getSearchTypes() as $type ) {
-                       $search = SearchEngine::create( $type );
+               $seFactory = MediaWikiServices::getInstance()->getSearchEngineFactory();
+               foreach ( $config->getSearchTypes() as $type ) {
+                       $search = $seFactory->create( $type );
                        if ( !$search->supports( 'search-update' ) ) {
                                continue;
                        }
@@ -99,7 +102,7 @@ class SearchUpdate implements DeferrableUpdate {
 
                        $text = $search->getTextFromContent( $this->title, $this->content );
                        if ( !$search->textAlreadyUpdatedForIndex() ) {
-                               $text = self::updateText( $text );
+                               $text = $this->updateText( $text, $search );
                        }
 
                        # Perform the actual update
@@ -113,14 +116,16 @@ class SearchUpdate implements DeferrableUpdate {
         * If you're using a real search engine, you'll probably want to override
         * this behavior and do something nicer with the original wikitext.
         * @param string $text
+        * @param SearchEngine $se Search engine
         * @return string
         */
-       public static function updateText( $text ) {
+       public function updateText( $text, SearchEngine $se = null ) {
                global $wgContLang;
 
                # Language-specific strip/conversion
                $text = $wgContLang->normalizeForSearch( $text );
-               $lc = SearchEngine::legalSearchChars() . '&#;';
+               $se = $se ?: MediaWikiServices::getInstance()->newSearchEngine();
+               $lc = $se->legalSearchChars() . '&#;';
 
                $text = preg_replace( "/<\\/?\\s*[A-Za-z][^>]*?>/",
                        ' ', $wgContLang->lc( " " . $text . " " ) ); # Strip HTML markup
index 6272e7e..e5e082f 100644 (file)
@@ -292,290 +292,10 @@ class DiffEngine {
         * @param string[] $to_lines
         */
        private function diffLocal( $from_lines, $to_lines ) {
-               global $wgExternalDiffEngine;
-
-               if ( $wgExternalDiffEngine == 'wikidiff3' ) {
-                       // wikidiff3
-                       $wikidiff3 = new WikiDiff3();
-                       $wikidiff3->diff( $from_lines, $to_lines );
-                       $this->xchanged = $wikidiff3->removed;
-                       $this->ychanged = $wikidiff3->added;
-                       unset( $wikidiff3 );
-               } else {
-                       // old diff
-                       $n_from = count( $from_lines );
-                       $n_to = count( $to_lines );
-                       $this->xchanged = $this->ychanged = [];
-                       $this->xv = $this->yv = [];
-                       $this->xind = $this->yind = [];
-                       $this->seq = [];
-                       $this->in_seq = [];
-                       $this->lcs = 0;
-
-                       // Skip leading common lines.
-                       for ( $skip = 0; $skip < $n_from && $skip < $n_to; $skip++ ) {
-                               if ( $from_lines[$skip] !== $to_lines[$skip] ) {
-                                       break;
-                               }
-                               $this->xchanged[$skip] = $this->ychanged[$skip] = false;
-                       }
-                       // Skip trailing common lines.
-                       $xi = $n_from;
-                       $yi = $n_to;
-                       for ( $endskip = 0; --$xi > $skip && --$yi > $skip; $endskip++ ) {
-                               if ( $from_lines[$xi] !== $to_lines[$yi] ) {
-                                       break;
-                               }
-                               $this->xchanged[$xi] = $this->ychanged[$yi] = false;
-                       }
-
-                       // Ignore lines which do not exist in both files.
-                       for ( $xi = $skip; $xi < $n_from - $endskip; $xi++ ) {
-                               $xhash[$this->lineHash( $from_lines[$xi] )] = 1;
-                       }
-
-                       for ( $yi = $skip; $yi < $n_to - $endskip; $yi++ ) {
-                               $line = $to_lines[$yi];
-                               $this->ychanged[$yi] = empty( $xhash[$this->lineHash( $line )] );
-                               if ( $this->ychanged[$yi] ) {
-                                       continue;
-                               }
-                               $yhash[$this->lineHash( $line )] = 1;
-                               $this->yv[] = $line;
-                               $this->yind[] = $yi;
-                       }
-                       for ( $xi = $skip; $xi < $n_from - $endskip; $xi++ ) {
-                               $line = $from_lines[$xi];
-                               $this->xchanged[$xi] = empty( $yhash[$this->lineHash( $line )] );
-                               if ( $this->xchanged[$xi] ) {
-                                       continue;
-                               }
-                               $this->xv[] = $line;
-                               $this->xind[] = $xi;
-                       }
-
-                       // Find the LCS.
-                       $this->compareSeq( 0, count( $this->xv ), 0, count( $this->yv ) );
-               }
-       }
-
-       /**
-        * Returns the whole line if it's small enough, or the MD5 hash otherwise
-        *
-        * @param string $line
-        *
-        * @return string
-        */
-       private function lineHash( $line ) {
-               if ( strlen( $line ) > self::MAX_XREF_LENGTH ) {
-                       return md5( $line );
-               } else {
-                       return $line;
-               }
-       }
-
-       /**
-        * Divide the Largest Common Subsequence (LCS) of the sequences
-        * [XOFF, XLIM) and [YOFF, YLIM) into NCHUNKS approximately equally
-        * sized segments.
-        *
-        * Returns (LCS, PTS). LCS is the length of the LCS. PTS is an
-        * array of NCHUNKS+1 (X, Y) indexes giving the diving points between
-        * sub sequences.  The first sub-sequence is contained in [X0, X1),
-        * [Y0, Y1), the second in [X1, X2), [Y1, Y2) and so on.  Note
-        * that (X0, Y0) == (XOFF, YOFF) and
-        * (X[NCHUNKS], Y[NCHUNKS]) == (XLIM, YLIM).
-        *
-        * This function assumes that the first lines of the specified portions
-        * of the two files do not match, and likewise that the last lines do not
-        * match.  The caller must trim matching lines from the beginning and end
-        * of the portions it is going to specify.
-        *
-        * @param int $xoff
-        * @param int $xlim
-        * @param int $yoff
-        * @param int $ylim
-        * @param int $nchunks
-        *
-        * @return array List of two elements, integer and array[].
-        */
-       private function diag( $xoff, $xlim, $yoff, $ylim, $nchunks ) {
-               $flip = false;
-
-               if ( $xlim - $xoff > $ylim - $yoff ) {
-                       // Things seems faster (I'm not sure I understand why)
-                       // when the shortest sequence in X.
-                       $flip = true;
-                       list( $xoff, $xlim, $yoff, $ylim ) = [ $yoff, $ylim, $xoff, $xlim ];
-               }
-
-               if ( $flip ) {
-                       for ( $i = $ylim - 1; $i >= $yoff; $i-- ) {
-                               $ymatches[$this->xv[$i]][] = $i;
-                       }
-               } else {
-                       for ( $i = $ylim - 1; $i >= $yoff; $i-- ) {
-                               $ymatches[$this->yv[$i]][] = $i;
-                       }
-               }
-
-               $this->lcs = 0;
-               $this->seq[0] = $yoff - 1;
-               $this->in_seq = [];
-               $ymids[0] = [];
-
-               $numer = $xlim - $xoff + $nchunks - 1;
-               $x = $xoff;
-               for ( $chunk = 0; $chunk < $nchunks; $chunk++ ) {
-                       if ( $chunk > 0 ) {
-                               for ( $i = 0; $i <= $this->lcs; $i++ ) {
-                                       $ymids[$i][$chunk - 1] = $this->seq[$i];
-                               }
-                       }
-
-                       $x1 = $xoff + (int)( ( $numer + ( $xlim - $xoff ) * $chunk ) / $nchunks );
-                       // @codingStandardsIgnoreStart Ignore Squiz.WhiteSpace.SemicolonSpacing.Incorrect
-                       for ( ; $x < $x1; $x++ ) {
-                               // @codingStandardsIgnoreEnd
-                               $line = $flip ? $this->yv[$x] : $this->xv[$x];
-                               if ( empty( $ymatches[$line] ) ) {
-                                       continue;
-                               }
-
-                               $k = 0;
-                               $matches = $ymatches[$line];
-                               reset( $matches );
-                               while ( list( , $y ) = each( $matches ) ) {
-                                       if ( empty( $this->in_seq[$y] ) ) {
-                                               $k = $this->lcsPos( $y );
-                                               assert( $k > 0 );
-                                               $ymids[$k] = $ymids[$k - 1];
-                                               break;
-                                       }
-                               }
-
-                               while ( list( , $y ) = each( $matches ) ) {
-                                       if ( $y > $this->seq[$k - 1] ) {
-                                               assert( $y < $this->seq[$k] );
-                                               // Optimization: this is a common case:
-                                               // next match is just replacing previous match.
-                                               $this->in_seq[$this->seq[$k]] = false;
-                                               $this->seq[$k] = $y;
-                                               $this->in_seq[$y] = 1;
-                                       } elseif ( empty( $this->in_seq[$y] ) ) {
-                                               $k = $this->lcsPos( $y );
-                                               assert( $k > 0 );
-                                               $ymids[$k] = $ymids[$k - 1];
-                                       }
-                               }
-                       }
-               }
-
-               $seps[] = $flip ? [ $yoff, $xoff ] : [ $xoff, $yoff ];
-               $ymid = $ymids[$this->lcs];
-               for ( $n = 0; $n < $nchunks - 1; $n++ ) {
-                       $x1 = $xoff + (int)( ( $numer + ( $xlim - $xoff ) * $n ) / $nchunks );
-                       $y1 = $ymid[$n] + 1;
-                       $seps[] = $flip ? [ $y1, $x1 ] : [ $x1, $y1 ];
-               }
-               $seps[] = $flip ? [ $ylim, $xlim ] : [ $xlim, $ylim ];
-
-               return [ $this->lcs, $seps ];
-       }
-
-       /**
-        * @param int $ypos
-        *
-        * @return int
-        */
-       private function lcsPos( $ypos ) {
-               $end = $this->lcs;
-               if ( $end == 0 || $ypos > $this->seq[$end] ) {
-                       $this->seq[++$this->lcs] = $ypos;
-                       $this->in_seq[$ypos] = 1;
-
-                       return $this->lcs;
-               }
-
-               $beg = 1;
-               while ( $beg < $end ) {
-                       $mid = (int)( ( $beg + $end ) / 2 );
-                       if ( $ypos > $this->seq[$mid] ) {
-                               $beg = $mid + 1;
-                       } else {
-                               $end = $mid;
-                       }
-               }
-
-               assert( $ypos != $this->seq[$end] );
-
-               $this->in_seq[$this->seq[$end]] = false;
-               $this->seq[$end] = $ypos;
-               $this->in_seq[$ypos] = 1;
-
-               return $end;
-       }
-
-       /**
-        * Find LCS of two sequences.
-        *
-        * The results are recorded in the vectors $this->{x,y}changed[], by
-        * storing a 1 in the element for each line that is an insertion
-        * or deletion (ie. is not in the LCS).
-        *
-        * The subsequence of file 0 is [XOFF, XLIM) and likewise for file 1.
-        *
-        * Note that XLIM, YLIM are exclusive bounds.
-        * All line numbers are origin-0 and discarded lines are not counted.
-        *
-        * @param int $xoff
-        * @param int $xlim
-        * @param int $yoff
-        * @param int $ylim
-        */
-       private function compareSeq( $xoff, $xlim, $yoff, $ylim ) {
-               // Slide down the bottom initial diagonal.
-               while ( $xoff < $xlim && $yoff < $ylim && $this->xv[$xoff] == $this->yv[$yoff] ) {
-                       ++$xoff;
-                       ++$yoff;
-               }
-
-               // Slide up the top initial diagonal.
-               while ( $xlim > $xoff && $ylim > $yoff
-                       && $this->xv[$xlim - 1] == $this->yv[$ylim - 1]
-               ) {
-                       --$xlim;
-                       --$ylim;
-               }
-
-               if ( $xoff == $xlim || $yoff == $ylim ) {
-                       $lcs = 0;
-               } else {
-                       // This is ad hoc but seems to work well.
-                       // $nchunks = sqrt(min($xlim - $xoff, $ylim - $yoff) / 2.5);
-                       // $nchunks = max(2,min(8,(int)$nchunks));
-                       $nchunks = min( 7, $xlim - $xoff, $ylim - $yoff ) + 1;
-                       list( $lcs, $seps ) = $this->diag( $xoff, $xlim, $yoff, $ylim, $nchunks );
-               }
-
-               if ( $lcs == 0 ) {
-                       // X and Y sequences have no common subsequence:
-                       // mark all changed.
-                       while ( $yoff < $ylim ) {
-                               $this->ychanged[$this->yind[$yoff++]] = 1;
-                       }
-                       while ( $xoff < $xlim ) {
-                               $this->xchanged[$this->xind[$xoff++]] = 1;
-                       }
-               } else {
-                       // Use the partitions to split this problem into subproblems.
-                       reset( $seps );
-                       $pt1 = $seps[0];
-                       while ( $pt2 = next( $seps ) ) {
-                               $this->compareSeq( $pt1[0], $pt2[0], $pt1[1], $pt2[1] );
-                               $pt1 = $pt2;
-                       }
-               }
+               $wikidiff3 = new WikiDiff3();
+               $wikidiff3->diff( $from_lines, $to_lines );
+               $this->xchanged = $wikidiff3->removed;
+               $this->ychanged = $wikidiff3->added;
        }
 
        /**
index 1508cf1..e2345ca 100644 (file)
@@ -870,8 +870,8 @@ class DifferenceEngine extends ContextSource {
                $otext = str_replace( "\r\n", "\n", $otext );
                $ntext = str_replace( "\r\n", "\n", $ntext );
 
-               if ( $wgExternalDiffEngine == 'wikidiff' ) {
-                       wfDeprecated( 'wikidiff support', '1.27' );
+               if ( $wgExternalDiffEngine == 'wikidiff' || $wgExternalDiffEngine == 'wikidiff3' ) {
+                       wfDeprecated( "\$wgExternalDiffEngine = '{$wgExternalDiffEngine}'", '1.27' );
                        $wgExternalDiffEngine = false;
                }
 
@@ -884,7 +884,7 @@ class DifferenceEngine extends ContextSource {
 
                                return $text;
                        }
-               } elseif ( $wgExternalDiffEngine != 'wikidiff3' && $wgExternalDiffEngine !== false ) {
+               } elseif ( $wgExternalDiffEngine !== false ) {
                        # Diff via the shell
                        $tmpDir = wfTempDir();
                        $tempName1 = tempnam( $tmpDir, 'diff_' );
index f1826ed..bcae746 100644 (file)
@@ -204,16 +204,13 @@ class TableDiffFormatter extends DiffFormatter {
                # Notice that WordLevelDiff returns HTML-escaped output.
                # Hence, we will be calling addedLine/deletedLine without HTML-escaping.
 
-               $line = array_shift( $del );
-               while ( $line ) {
-                       $aline = array_shift( $add );
-                       $this->writeOutput( '<tr>' . $this->deletedLine( $line ) .
-                               $this->addedLine( $aline ) . "</tr>\n" );
-                       $line = array_shift( $del );
-               }
-               foreach ( $add as $line ) { # If any leftovers
-                       $this->writeOutput( '<tr>' . $this->emptyLine() .
-                               $this->addedLine( $line ) . "</tr>\n" );
+               $ndel = count( $del );
+               $nadd = count( $add );
+               $n = max( $ndel, $nadd );
+               for ( $i = 0; $i < $n; $i++ ) {
+                       $delLine = $i < $ndel ? $this->deletedLine( $del[$i] ) : $this->emptyLine();
+                       $addLine = $i < $nadd ? $this->addedLine( $add[$i] ) : $this->emptyLine();
+                       $this->writeOutput( "<tr>{$delLine}{$addLine}</tr>\n" );
                }
        }
 
index a75ed27..b454577 100644 (file)
@@ -33,6 +33,8 @@ class ExternalStoreDB extends ExternalStoreMedium {
         * The provided URL is in the form of DB://cluster/id
         * or DB://cluster/id/itemid for concatened storage.
         *
+        * @param string $url
+        * @return string|bool False if missing
         * @see ExternalStoreMedium::fetchFromURL()
         */
        public function fetchFromURL( $url ) {
@@ -83,11 +85,8 @@ class ExternalStoreDB extends ExternalStoreMedium {
                return $ret;
        }
 
-       /**
-        * @see ExternalStoreMedium::store()
-        */
-       public function store( $cluster, $data ) {
-               $dbw = $this->getMaster( $cluster );
+       public function store( $location, $data ) {
+               $dbw = $this->getMaster( $location );
                $id = $dbw->nextSequenceValue( 'blob_blob_id_seq' );
                $dbw->insert( $this->getTable( $dbw ),
                        [ 'blob_id' => $id, 'blob_text' => $data ],
@@ -97,7 +96,7 @@ class ExternalStoreDB extends ExternalStoreMedium {
                        throw new MWException( __METHOD__ . ': no insert ID' );
                }
 
-               return "DB://$cluster/$id";
+               return "DB://$location/$id";
        }
 
        /**
@@ -175,7 +174,7 @@ class ExternalStoreDB extends ExternalStoreMedium {
         * @param string $cluster
         * @param string $id
         * @param string $itemID
-        * @return mixed
+        * @return HistoryBlob|bool Returns false if missing
         * @private
         */
        function fetchBlob( $cluster, $id, $itemID ) {
index 0d7bf66..c432025 100644 (file)
@@ -241,6 +241,12 @@ class FileBackendMultiWrite extends FileBackend {
                        return $status; // skip checks
                }
 
+               // Preload all of the stat info in as few round trips as possible...
+               foreach ( $this->backends as $backend ) {
+                       $realPaths = $this->substPaths( $paths, $backend );
+                       $backend->preloadFileStat( [ 'srcs' => $realPaths, 'latest' => true ] );
+               }
+
                $mBackend = $this->backends[$this->masterIndex];
                foreach ( $paths as $path ) {
                        $params = [ 'src' => $path, 'latest' => true ];
index a59b15e..4a6b804 100644 (file)
@@ -111,7 +111,7 @@ class HTMLCheckField extends HTMLFormField {
        /**
         * @param WebRequest $request
         *
-        * @return string
+        * @return bool
         */
        function loadDataFromRequest( $request ) {
                $invert = isset( $this->mParams['invert'] ) && $this->mParams['invert'];
@@ -125,7 +125,7 @@ class HTMLCheckField extends HTMLFormField {
                                ? !$request->getBool( $this->mName )
                                : $request->getBool( $this->mName );
                } else {
-                       return $this->getDefault();
+                       return (bool)$this->getDefault();
                }
        }
 }
index 2b6a0aa..8f8caf2 100644 (file)
@@ -1146,10 +1146,12 @@ class HTMLForm extends ContextSource {
                        }
                }
 
-               $html = Html::rawElement( 'span',
-                       [ 'class' => 'mw-htmlform-submit-buttons' ], "\n$buttons" ) . "\n";
+               if ( !$buttons ) {
+                       return '';
+               }
 
-               return $html;
+               return Html::rawElement( 'span',
+                       [ 'class' => 'mw-htmlform-submit-buttons' ], "\n$buttons" ) . "\n";
        }
 
        /**
@@ -1491,7 +1493,7 @@ class HTMLForm extends ContextSource {
 
                foreach ( $fields as $key => $value ) {
                        if ( $value instanceof HTMLFormField ) {
-                               $v = isset( $this->mFieldData[$key] )
+                               $v = array_key_exists( $key, $this->mFieldData )
                                        ? $this->mFieldData[$key]
                                        : $value->getDefault();
 
index d5f4cc0..d14fa90 100644 (file)
@@ -117,8 +117,8 @@ abstract class HTMLFormField {
                        $tmp = $m[1];
                }
                if ( substr( $tmp, 0, 2 ) == 'wp' &&
-                       !isset( $alldata[$tmp] ) &&
-                       isset( $alldata[substr( $tmp, 2 )] )
+                       !array_key_exists( $tmp, $alldata ) &&
+                       array_key_exists( substr( $tmp, 2 ), $alldata )
                ) {
                        // Adjust for name mangling.
                        $tmp = substr( $tmp, 2 );
@@ -139,7 +139,7 @@ abstract class HTMLFormField {
                        $data = $alldata;
                        while ( $keys ) {
                                $key = array_shift( $keys );
-                               if ( !is_array( $data ) || !isset( $data[$key] ) ) {
+                               if ( !is_array( $data ) || !array_key_exists( $key, $data ) ) {
                                        continue 2;
                                }
                                $data = $data[$key];
index 7359092..3f80884 100644 (file)
@@ -271,7 +271,7 @@ class HTMLFormFieldCloner extends HTMLFormField {
 
                $fields = $this->createFieldsForKey( $key );
                foreach ( $fields as $fieldname => $field ) {
-                       $v = isset( $values[$fieldname] )
+                       $v = array_key_exists( $fieldname, $values )
                                ? $values[$fieldname]
                                : $field->getDefault();
 
index 4f8365e..278d453 100644 (file)
@@ -121,10 +121,12 @@ class OOUIHTMLForm extends HTMLForm {
                        ] + $attrs );
                }
 
-               $html = Html::rawElement( 'div',
-                       [ 'class' => 'mw-htmlform-submit-buttons' ], "\n$buttons" ) . "\n";
+               if ( !$buttons ) {
+                       return '';
+               }
 
-               return $html;
+               return Html::rawElement( 'div',
+                       [ 'class' => 'mw-htmlform-submit-buttons' ], "\n$buttons" ) . "\n";
        }
 
        protected function wrapFieldSetSection( $legend, $section, $attributes ) {
index c446615..f3cba48 100644 (file)
@@ -137,9 +137,11 @@ class VFormHTMLForm extends HTMLForm {
                        $buttons .= Html::element( 'input', $attrs ) . "\n";
                }
 
-               $html = Html::rawElement( 'div',
-                       [ 'class' => 'mw-htmlform-submit-buttons' ], "\n$buttons" ) . "\n";
+               if ( !$buttons ) {
+                       return '';
+               }
 
-               return $html;
+               return Html::rawElement( 'div',
+                       [ 'class' => 'mw-htmlform-submit-buttons' ], "\n$buttons" ) . "\n";
        }
 }
diff --git a/includes/installer/i18n/hsn.json b/includes/installer/i18n/hsn.json
new file mode 100644 (file)
index 0000000..cebc979
--- /dev/null
@@ -0,0 +1,35 @@
+{
+       "@metadata": {
+               "authors": [
+                       "SolidBlock"
+               ]
+       },
+       "config-desc": "MediaWiki安装程序",
+       "config-title": "MediaWiki $1配置",
+       "config-information": "信息",
+       "config-localsettings-upgrade": "发现哒<code>LocalSettings.php</code>文件。要提升啯杂配置,就于啯杂框框中输入<code>$wgUpgradeKey</code>的值。您可以在<code>LocalSettings.php</code>中寻它。",
+       "config-localsettings-cli-upgrade": "查噶<code>LocalSettings.php</code>文件。要升级啯杂配置,请直接走<code>update.php</code>。",
+       "config-localsettings-key": "升级密钥:",
+       "config-localsettings-badkey": "啯杂密钥是错的。",
+       "config-session-error": "搞会话碰哒鬼:$1",
+       "config-your-language": "您使用的语言:",
+       "config-wiki-language": "Wiki语言:",
+       "config-back": "← 后退",
+       "config-continue": "行克 →",
+       "config-page-language": "语言",
+       "config-page-welcome": "欢迎使用MediaWiki!",
+       "config-page-name": "名字",
+       "config-page-options": "选项",
+       "config-page-install": "装下克",
+       "config-page-complete": "搞好哒!",
+       "config-page-readme": "自述",
+       "config-page-copying": "复制",
+       "config-page-upgradedoc": "升级",
+       "config-page-existingwiki": "现成的wiki",
+       "config-help-restart": "要不要哈消嘎输入且存好的东西,并且重新开始装?",
+       "config-restart": "嗯,重搞",
+       "config-env-good": "环境检查哈好哒。你可以安装MediaWiki哒。",
+       "config-env-bad": "环境检查好哒,可惜你搞不了MediaWiki。",
+       "config-env-php": "PHP $1装哒。",
+       "config-env-hhvm": "HHVM $1装哒。"
+}
index e3f800e..9d5865c 100644 (file)
@@ -34,6 +34,6 @@
        "config-env-good": "पर्यावरण क जाँच कएल गेल अछि।\nआहाँ मीडियाविकि स्थापित कर सकै चिए।",
        "config-env-bad": "पर्यावरण क जाँच कएल गेल अछि।\nआहाँ मीडियाविकि स्थापित नै कर सकै चिए।",
        "config-env-php": "PHP $1 स्थापित कएल ग्याल अछि।",
-       "mainpagetext": "'''मेडियाविकी नीक जकाँ प्रस्थापित भेल।'''",
+       "mainpagetext": "<strong>मेडियाविकी नीक जकाँ प्रस्थापित भेल।</strong>",
        "mainpagedocfooter": "सम्पर्क करू [//meta.wikimedia.org/wiki/Help:Contents User's Guide] विकि तंत्रांशक प्रयोगक जानकारी लेल।\n\n==प्रारम्भ कोना करी==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
 }
index 9286446..992107f 100644 (file)
        "config-help-tooltip": "klik om uit te vouwen",
        "config-nofile": "Het bestand \"$1\" is niet gevonden. Is het verwijderd?",
        "config-extension-link": "Weet u dat u [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions uitbreidingen] kunt gebruiken voor uw wiki?\n\nU kunt [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category uitbreidingen op categorie] bekijken of ga naar de [//www.mediawiki.org/wiki/Extension_Matrix uitbreidingenmatrix] om de volledige lijst met uitbreidingen te bekijken.",
-       "mainpagetext": "'''De installatie van MediaWiki is geslaagd.'''",
+       "mainpagetext": "<strong>De installatie van MediaWiki is geslaagd.</strong>",
        "mainpagedocfooter": "Raadpleeg de [//meta.wikimedia.org/wiki/Special:MyLanguage/Help:Contents handleiding] voor informatie over het gebruik van de wikisoftware.\n\n== Meer hulp over MediaWiki ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lijst met instellingen]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Veelgestelde vragen (FAQ)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglijst voor aankondigingen van nieuwe versies]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Maak MediaWiki beschikbaar in uw taal]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Leer hoe u spam kunt voorkomen op uw wiki]"
 }
index 677908b..f1e4d4c 100644 (file)
@@ -87,7 +87,7 @@
        "config-mod-security": "<strong>Aviso:</strong> Seu servidor web tem [http://modsecurity.org/ mod_security] habilitado. Se configurado incorretamente, pode causar problemas para o MediaWiki ou outro software que permite aos usuários postar conteúdo arbitrário.\nConsulte a [http://modsecurity.org/documentation/ documentação do mod_security] ou entre em contato com o suporte do seu host se você encontrar erros aleatórios.",
        "config-diff3-bad": "O GNU diff3 não foi encontrado.",
        "config-git": "Foi encontrado o software de controle de versão Git: <code>$1</code>.",
-       "config-git-bad": "Não foi encontrado o software de controle de versão Git.",
+       "config-git-bad": "O software de controle de versão Git não foi encontrado.",
        "config-imagemagick": "ImageMagick encontrado: <code>$1</code> .\nRedimensionamento de imagem será ativado se você permitir uploads.",
        "config-gd": "Encontrada biblioteca gráfica GD embutida\nO redimensionamento de imagens será habilitado se você permitir uploads.",
        "config-no-scaling": "Não foi possível encontrar biblioteca GD ou ImageMagick. \nO redimensionamento de imagens será desabilitado.",
index 9a5a3ff..f68651b 100644 (file)
@@ -60,8 +60,8 @@ class Interwiki {
                $this->mURL = $url;
                $this->mAPI = $api;
                $this->mWikiID = $wikiId;
-               $this->mLocal = $local;
-               $this->mTrans = $trans;
+               $this->mLocal = (bool)$local;
+               $this->mTrans = (bool)$trans;
        }
 
        /**
@@ -115,7 +115,16 @@ class Interwiki {
        }
 
        /**
-        * Purge the cache for an interwiki prefix
+        * Resets locally cached Interwiki objects. This is intended for use during testing only.
+        * This does not invalidate entries in the persistent cache, as invalidateCache() does.
+        * @since 1.27
+        */
+       public static function resetLocalCache() {
+               static::$smCache = [];
+       }
+
+       /**
+        * Purge the cache (local and persistent) for an interwiki prefix.
         * @param string $prefix
         * @since 1.26
         */
@@ -123,6 +132,7 @@ class Interwiki {
                $cache = ObjectCache::getMainWANInstance();
                $key = wfMemcKey( 'interwiki', $prefix );
                $cache->delete( $key );
+               unset( static::$smCache[$prefix] );
        }
 
        /**
@@ -141,7 +151,7 @@ class Interwiki {
                        // Split values
                        list( $local, $url ) = explode( ' ', $value, 2 );
                        $s->mURL = $url;
-                       $s->mLocal = (int)$local;
+                       $s->mLocal = (bool)$local;
                } else {
                        $s = false;
                }
@@ -262,8 +272,8 @@ class Interwiki {
                if ( isset( $mc['iw_url'] ) ) {
                        $iw = new Interwiki();
                        $iw->mURL = $mc['iw_url'];
-                       $iw->mLocal = isset( $mc['iw_local'] ) ? $mc['iw_local'] : 0;
-                       $iw->mTrans = isset( $mc['iw_trans'] ) ? $mc['iw_trans'] : 0;
+                       $iw->mLocal = isset( $mc['iw_local'] ) ? (bool)$mc['iw_local'] : false;
+                       $iw->mTrans = isset( $mc['iw_trans'] ) ? (bool)$mc['iw_trans'] : false;
                        $iw->mAPI = isset( $mc['iw_api'] ) ? $mc['iw_api'] : '';
                        $iw->mWikiID = isset( $mc['iw_wikiid'] ) ? $mc['iw_wikiid'] : '';
 
@@ -453,7 +463,7 @@ class Interwiki {
        public function getName() {
                $msg = wfMessage( 'interwiki-name-' . $this->mPrefix )->inContentLanguage();
 
-               return !$msg->exists() ? '' : $msg;
+               return !$msg->exists() ? '' : $msg->text();
        }
 
        /**
@@ -464,7 +474,7 @@ class Interwiki {
        public function getDescription() {
                $msg = wfMessage( 'interwiki-desc-' . $this->mPrefix )->inContentLanguage();
 
-               return !$msg->exists() ? '' : $msg;
+               return !$msg->exists() ? '' : $msg->text();
        }
 
        /**
index 982a3a0..2dd0615 100644 (file)
@@ -175,8 +175,13 @@ class JobQueueGroup {
         */
        public static function pushLazyJobs() {
                foreach ( self::$instances as $group ) {
-                       $group->push( $group->bufferedJobs );
-                       $group->bufferedJobs = [];
+                       try {
+                               $group->push( $group->bufferedJobs );
+                               $group->bufferedJobs = [];
+                       } catch ( Exception $e ) {
+                               // Get in as many jobs as possible and let other post-send updates happen
+                               MWExceptionHandler::logException( $e );
+                       }
                }
        }
 
index d4a5334..a356e84 100644 (file)
@@ -72,11 +72,6 @@ class JobQueueRedis extends JobQueue {
        /** @var string Compression method to use */
        protected $compression;
 
-       const MAX_AGE_PRUNE = 604800; // integer; seconds a job can live once claimed (7 days)
-
-       /** @var string Key to prefix the queue keys with (used for testing) */
-       protected $key;
-
        /**
         * @param array $params Possible keys:
         *   - redisConfig : An array of parameters to RedisConnectionPool::__construct().
@@ -393,12 +388,17 @@ LUA;
                        static $script =
 <<<LUA
                        local kClaimed, kAttempts, kData = unpack(KEYS)
-                       local uuid = unpack(ARGV)
+                       local id = unpack(ARGV)
                        -- Unmark the job as claimed
-                       redis.call('zRem',kClaimed,uuid)
-                       redis.call('hDel',kAttempts,uuid)
+                       local removed = redis.call('zRem',kClaimed,id)
+                       -- Check if the job was recycled
+                       if removed == 0 then
+                               return 0
+                       end
+                       -- Delete the retry data
+                       redis.call('hDel',kAttempts,id)
                        -- Delete the job data itself
-                       return redis.call('hDel',kData,uuid)
+                       return redis.call('hDel',kData,id)
 LUA;
                        $res = $conn->luaEval( $script,
                                [
index 10d4c71..1d23f9d 100644 (file)
@@ -197,7 +197,9 @@ class StatusValue {
        /**
         * Returns a list of status messages of the given type
         *
-        * Each entry is a map of (message:string or MessageSpecifier,params:array))
+        * Each entry is a map of:
+        *   - message: string message key or MessageSpecifier
+        *   - params: array list of parameters
         *
         * @param string $type
         * @return array
index b61cae7..b0cd413 100644 (file)
  * @file
  * @author Aaron Schulz
  */
+use Psr\Log\LoggerInterface;
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\NullLogger;
 
 /**
  * Base class for reliable event relays
  */
-abstract class EventRelayer {
+abstract class EventRelayer implements LoggerAwareInterface {
+       /** @var LoggerInterface */
+       protected $logger;
+
        /**
         * @param array $params
         */
        public function __construct( array $params ) {
+               $this->logger = new NullLogger();
        }
 
        /**
@@ -47,6 +54,10 @@ abstract class EventRelayer {
                return $this->doNotify( $channel, $events );
        }
 
+       public function setLogger( LoggerInterface $logger ) {
+               $this->logger = $logger;
+       }
+
        /**
         * @param string $channel
         * @param array $events List of event data maps
diff --git a/includes/libs/eventrelayer/EventRelayerKafka.php b/includes/libs/eventrelayer/EventRelayerKafka.php
new file mode 100644 (file)
index 0000000..999eb43
--- /dev/null
@@ -0,0 +1,62 @@
+<?php
+use Kafka\Produce;
+
+/**
+ * Event relayer for Apache Kafka.
+ * Configuring for WANCache:
+ * 'relayerConfig' => [ 'class' => 'EventRelayerKafka', 'KafkaEventHost' => 'localhost:9092' ],
+ */
+class EventRelayerKafka extends EventRelayer {
+       /**
+        * Configuration.
+        *
+        * @var Config
+        */
+       protected $config;
+
+       /**
+        * Kafka producer.
+        *
+        * @var Produce
+        */
+       protected $producer;
+
+       /**
+        * Create Kafka producer.
+        *
+        * @param array $params
+        */
+       public function __construct( array $params ) {
+               parent::__construct( $params );
+
+               $this->config = new HashConfig( $params );
+               if ( !$this->config->has( 'KafkaEventHost' ) ) {
+                       throw new InvalidArgumentException( "KafkaEventHost must be configured" );
+               }
+       }
+
+       /**
+        * Get the producer object from kafka-php.
+        * @return Produce
+        */
+       protected function getKafkaProducer() {
+               if ( !$this->producer ) {
+                       $this->producer = Produce::getInstance(
+                               null, null, $this->config->get( 'KafkaEventHost' ) );
+               }
+               return $this->producer;
+       }
+
+       protected function doNotify( $channel, array $events ) {
+               $jsonEvents = array_map( 'json_encode', $events );
+               try {
+                       $producer = $this->getKafkaProducer();
+                       $producer->setMessages( $channel, 0, $jsonEvents );
+                       $producer->send();
+               } catch ( \Kafka\Exception $e ) {
+                       $this->logger->warning( "Sending events failed: $e" );
+                       return false;
+               }
+               return true;
+       }
+}
index 1aed280..8e3c0a5 100644 (file)
@@ -55,9 +55,21 @@ abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface {
        /** @var LoggerInterface */
        protected $logger;
 
+       /** @var callback|null */
+       protected $asyncHandler;
+
        /** @var bool */
        private $debugMode = false;
 
+       /** @var array */
+       private $duplicateKeyLookups = [];
+
+       /** @var bool */
+       private $reportDupes = false;
+
+       /** @var bool */
+       private $dupeTrackScheduled = false;
+
        /** Possible values for getLastError() */
        const ERR_NONE = 0; // no error
        const ERR_NO_RESPONSE = 1; // no response
@@ -71,6 +83,16 @@ abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface {
        const WRITE_SYNC = 1; // synchronously write to all locations for replicated stores
        const WRITE_CACHE_ONLY = 2; // Only change state of the in-memory cache
 
+       /**
+        * $params include:
+        *   - logger: Psr\Log\LoggerInterface instance
+        *   - keyspace: Default keyspace for $this->makeKey()
+        *   - asyncHandler: Callable to use for scheduling tasks after the web request ends.
+        *      In CLI mode, it should run the task immediately.
+        *   - reportDupes: Whether to emit warning log messages for all keys that were
+        *      requested more than once (requires an asyncHandler).
+        * @param array $params
+        */
        public function __construct( array $params = [] ) {
                if ( isset( $params['logger'] ) ) {
                        $this->setLogger( $params['logger'] );
@@ -81,6 +103,14 @@ abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface {
                if ( isset( $params['keyspace'] ) ) {
                        $this->keyspace = $params['keyspace'];
                }
+
+               $this->asyncHandler = isset( $params['asyncHandler'] )
+                       ? $params['asyncHandler']
+                       : null;
+
+               if ( !empty( $params['reportDupes'] ) && is_callable( $this->asyncHandler ) ) {
+                       $this->reportDupes = true;
+               }
        }
 
        /**
@@ -144,9 +174,44 @@ abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface {
                // B/C for ( $key, &$casToken = null, $flags = 0 )
                $flags = is_int( $oldFlags ) ? $oldFlags : $flags;
 
+               $this->trackDuplicateKeys( $key );
+
                return $this->doGet( $key, $flags );
        }
 
+       /**
+        * Track the number of times that a given key has been used.
+        * @param string $key
+        */
+       private function trackDuplicateKeys( $key ) {
+               if ( !$this->reportDupes ) {
+                       return;
+               }
+
+               if ( !isset( $this->duplicateKeyLookups[$key] ) ) {
+                       // Track that we have seen this key. This N-1 counting style allows
+                       // easy filtering with array_filter() later.
+                       $this->duplicateKeyLookups[$key] = 0;
+               } else {
+                       $this->duplicateKeyLookups[$key] += 1;
+
+                       if ( $this->dupeTrackScheduled === false ) {
+                               $this->dupeTrackScheduled = true;
+                               // Schedule a callback that logs keys processed more than once by get().
+                               call_user_func( $this->asyncHandler, function () {
+                                       $dups = array_filter( $this->duplicateKeyLookups );
+                                       foreach ( $dups as $key => $count ) {
+                                               $this->logger->warning(
+                                                       'Duplicate get(): "{key}" fetched {count} times',
+                                                       // Count is N-1 of the actual lookup count
+                                                       [ 'key' => $key, 'count' => $count + 1, ]
+                                               );
+                                       }
+                               } );
+                       }
+               }
+       }
+
        /**
         * @param string $key
         * @param integer $flags Bitfield of BagOStuff::READ_* constants [optional]
index 3e88cb1..fe61470 100644 (file)
@@ -33,8 +33,6 @@ class MultiWriteBagOStuff extends BagOStuff {
        protected $caches;
        /** @var bool Use async secondary writes */
        protected $asyncWrites = false;
-       /** @var callback|null */
-       protected $asyncHandler;
 
        /** Idiom for "write to all backends" */
        const ALL = INF;
@@ -58,8 +56,6 @@ class MultiWriteBagOStuff extends BagOStuff {
         *      safe to use for modules when cached values: are immutable,
         *      invalidation uses logical TTLs, invalidation uses etag/timestamp
         *      validation against the DB, or merge() is used to handle races.
-        *   - asyncHandler: callable that takes a callback and runs it after the
-        *      current web request ends. In CLI mode, it should run it immediately.
         * @param array $params
         * @throws InvalidArgumentException
         */
@@ -88,9 +84,6 @@ class MultiWriteBagOStuff extends BagOStuff {
                        }
                }
 
-               $this->asyncHandler = isset( $params['asyncHandler'] )
-                       ? $params['asyncHandler']
-                       : null;
                $this->asyncWrites = (
                        isset( $params['replication'] ) &&
                        $params['replication'] === 'async' &&
index b212e97..18cc10e 100644 (file)
@@ -69,10 +69,10 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
        protected $cache;
        /** @var HashBagOStuff Script instance PHP cache */
        protected $procCache;
-       /** @var string Cache pool name */
-       protected $pool;
+       /** @var string Purge channel name */
+       protected $purgeChannel;
        /** @var EventRelayer Bus that handles purge broadcasts */
-       protected $relayer;
+       protected $purgeRelayer;
        /** @var LoggerInterface */
        protected $logger;
 
@@ -134,18 +134,24 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
 
        const MAX_PC_KEYS = 1000; // max keys to keep in process cache
 
+       const DEFAULT_PURGE_CHANNEL = 'wancache-purge';
+
        /**
         * @param array $params
-        *   - cache   : BagOStuff object
-        *   - pool    : pool name
-        *   - relayer : EventRelayer object
-        *   - logger  : LoggerInterface object
+        *   - cache    : BagOStuff object for a persistent cache
+        *   - channels : Map of (action => channel string). Actions include "purge".
+        *   - relayers : Map of (action => EventRelayer object). Actions include "purge".
+        *   - logger   : LoggerInterface object
         */
        public function __construct( array $params ) {
                $this->cache = $params['cache'];
-               $this->pool = $params['pool'];
-               $this->relayer = $params['relayer'];
                $this->procCache = new HashBagOStuff( [ 'maxKeys' => self::MAX_PC_KEYS ] );
+               $this->purgeChannel = isset( $params['channels']['purge'] )
+                       ? $params['channels']['purge']
+                       : self::DEFAULT_PURGE_CHANNEL;
+               $this->purgeRelayer = isset( $params['relayers']['purge'] )
+                       ? $params['relayers']['purge']
+                       : new EventRelayerNull( [] );
                $this->setLogger( isset( $params['logger'] ) ? $params['logger'] : new NullLogger() );
        }
 
@@ -669,12 +675,12 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
         *
         *             return CatConfig::newFromRow( $dbr->selectRow( ... ) );
         *         },
-        *         array(
+        *         [
         *             // Calling touchCheckKey() on this key invalidates the cache
-        *             'checkKeys' => array( $cache->makeKey( 'site-cat-config' ) ),
+        *             'checkKeys' => [ $cache->makeKey( 'site-cat-config' ) ],
         *             // Try to only let one datacenter thread manage cache updates at a time
         *             'lockTSE' => 30
-        *         )
+        *         ]
         *     );
         * @endcode
         *
@@ -694,15 +700,15 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
         *
         *             return CatState::newFromResults( $dbr->select( ... ) );
         *         },
-        *         array(
+        *         [
         *              // The "check" keys that represent things the value depends on;
         *              // Calling touchCheckKey() on any of them invalidates the cache
-        *             'checkKeys' => array(
+        *             'checkKeys' => [
         *                 $cache->makeKey( 'sustenance-bowls', $cat->getRoomId() ),
         *                 $cache->makeKey( 'people-present', $cat->getHouseId() ),
         *                 $cache->makeKey( 'cat-laws', $cat->getCityId() ),
-        *             )
-        *         )
+        *             ]
+        *         ]
         *     );
         * @endcode
         *
@@ -720,7 +726,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
         *             $setOpts += Database::getCacheSetOptions( $dbr );
         *
         *             // Start off with the last cached list
-        *             $list = $oldValue ?: array();
+        *             $list = $oldValue ?: [];
         *             // Fetch the last 100 relevant rows in descending order;
         *             // only fetch rows newer than $list[0] to reduce scanning
         *             $rows = iterator_to_array( $dbr->select( ... ) );
@@ -728,7 +734,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
         *             return array_slice( array_merge( $new, $list ), 0, 100 );
         *        },
         *        // Try to only let one datacenter thread manage cache updates at a time
-        *        array( 'lockTSE' => 30 )
+        *        [ 'lockTSE' => 30 ]
         *     );
         * @endcode
         *
@@ -946,7 +952,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                        'sbt' => true, // substitute $UNIXTIME$ with actual microtime
                ] );
 
-               $ok = $this->relayer->notify( "{$this->pool}:purge", $event );
+               $ok = $this->purgeRelayer->notify( $this->purgeChannel, $event );
                if ( !$ok ) {
                        $this->lastRelayError = self::ERR_RELAY;
                }
@@ -966,7 +972,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                        'key' => $key,
                ] );
 
-               $ok = $this->relayer->notify( "{$this->pool}:purge", $event );
+               $ok = $this->purgeRelayer->notify( $this->purgeChannel, $event );
                if ( !$ok ) {
                        $this->lastRelayError = self::ERR_RELAY;
                }
index 1fd4b7f..be73c86 100644 (file)
@@ -97,13 +97,15 @@ class RightsLogFormatter extends LogFormatter {
                        $params[3] = $this->msg( 'rightsnone' )->text();
                }
                if ( count( $newGroups ) ) {
-                       // Array_values is used here because of bug 42211
+                       // Array_values is used here because of T44211
                        // see use of array_unique in UserrightsPage::doSaveUserGroups on $newGroups.
                        $params[4] = $lang->listToText( array_values( $newGroups ) );
                } else {
                        $params[4] = $this->msg( 'rightsnone' )->text();
                }
 
+               $params[5] = $userName;
+
                return $params;
        }
 
index 6d26419..24846e6 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use MediaWiki\Logger\LoggerFactory;
+use MediaWiki\MediaWikiServices;
 
 /**
  * Functions to get cache objects
@@ -174,11 +175,13 @@ class ObjectCache {
                } elseif ( isset( $params['class'] ) ) {
                        $class = $params['class'];
                        // Automatically set the 'async' update handler
-                       if ( $class === 'MultiWriteBagOStuff' ) {
-                               $params['asyncHandler'] = isset( $params['asyncHandler'] )
-                                       ? $params['asyncHandler']
-                                       : 'DeferredUpdates::addCallableUpdate';
-                       }
+                       $params['asyncHandler'] = isset( $params['asyncHandler'] )
+                               ? $params['asyncHandler']
+                               : 'DeferredUpdates::addCallableUpdate';
+                       // Enable reportDupes by default
+                       $params['reportDupes'] = isset( $params['reportDupes'] )
+                               ? $params['reportDupes']
+                               : true;
                        // Do b/c logic for MemcachedBagOStuff
                        if ( is_subclass_of( $class, 'MemcachedBagOStuff' ) ) {
                                if ( !isset( $params['servers'] ) ) {
@@ -296,8 +299,11 @@ class ObjectCache {
                }
 
                $params = $wgWANObjectCaches[$id];
-               $class = $params['relayerConfig']['class'];
-               $params['relayer'] = new $class( $params['relayerConfig'] );
+               foreach ( $params['channels'] as $action => $channel ) {
+                       $params['relayers'][$action] = MediaWikiServices::getInstance()->getEventRelayerGroup()
+                               ->getRelayer( $channel );
+                       $params['channels'][$action] = $channel;
+               }
                $params['cache'] = self::newFromId( $params['cacheId'] );
                if ( isset( $params['loggroup'] ) ) {
                        $params['logger'] = LoggerFactory::getInstance( $params['loggroup'] );
index 8209ea9..a1d62e5 100644 (file)
@@ -739,8 +739,7 @@ class Parser {
 
                if ( $t->hasFragment() ) {
                        # Strip the fragment to avoid various odd effects
-                       $this->mTitle = clone $t;
-                       $this->mTitle->setFragment( '' );
+                       $this->mTitle = $t->createFragmentTarget( '' );
                } else {
                        $this->mTitle = $t;
                }
index 916cfc2..731d4a0 100644 (file)
@@ -146,14 +146,17 @@ class ParserCache {
                        if ( !$useOutdated && $optionsKey->expired( $article->getTouched() ) ) {
                                wfIncrStats( "pcache.miss.expired" );
                                $cacheTime = $optionsKey->getCacheTime();
-                               wfDebug( "Parser options key expired, touched " . $article->getTouched()
+                               wfDebugLog( "ParserCache",
+                                       "Parser options key expired, touched " . $article->getTouched()
                                        . ", epoch $wgCacheEpoch, cached $cacheTime\n" );
                                return false;
                        } elseif ( $optionsKey->isDifferentRevision( $article->getLatest() ) ) {
                                wfIncrStats( "pcache.miss.revid" );
                                $revId = $article->getLatest();
                                $cachedRevId = $optionsKey->getCacheRevisionId();
-                               wfDebug( "ParserOutput key is for an old revision, latest $revId, cached $cachedRevId\n" );
+                               wfDebugLog( "ParserCache",
+                                       "ParserOutput key is for an old revision, latest $revId, cached $cachedRevId\n"
+                               );
                                return false;
                        }
 
@@ -222,14 +225,15 @@ class ParserCache {
                if ( !$useOutdated && $value->expired( $touched ) ) {
                        wfIncrStats( "pcache.miss.expired" );
                        $cacheTime = $value->getCacheTime();
-                       wfDebug( "ParserOutput key expired, touched $touched, "
+                       wfDebugLog( "ParserCache",
+                               "ParserOutput key expired, touched $touched, "
                                . "epoch $wgCacheEpoch, cached $cacheTime\n" );
                        $value = false;
                } elseif ( $value->isDifferentRevision( $article->getLatest() ) ) {
                        wfIncrStats( "pcache.miss.revid" );
                        $revId = $article->getLatest();
                        $cachedRevId = $value->getCacheRevisionId();
-                       wfDebug(
+                       wfDebugLog( "ParserCache",
                                "ParserOutput key is for an old revision, latest $revId, cached $cachedRevId\n"
                        );
                        $value = false;
@@ -237,7 +241,7 @@ class ParserCache {
                        Hooks::run( 'RejectParserCacheValue', [ $value, $wikiPage, $popts ] ) === false
                ) {
                        wfIncrStats( 'pcache.miss.rejected' );
-                       wfDebug(
+                       wfDebugLog( "ParserCache",
                                "ParserOutput key valid, but rejected by RejectParserCacheValue hook handler.\n"
                        );
                        $value = false;
index 7c60aa5..f977124 100644 (file)
@@ -34,6 +34,7 @@ class ExtensionProcessor implements Processor {
                'LogTypes',
                'LogRestrictions',
                'FilterLogTypes',
+               'ActionFilteredLogs',
                'LogNames',
                'LogHeaders',
                'LogActions',
index 26e4b17..b555592 100644 (file)
@@ -103,7 +103,7 @@ abstract class RevDelList extends RevisionListBase {
         * @return Status
         * @since 1.23 Added 'perItemStatus' param
         */
-       public function setVisibility( $params ) {
+       public function setVisibility( array $params ) {
                $bitPars = $params['value'];
                $comment = $params['comment'];
                $perItemStatus = isset( $params['perItemStatus'] ) ? $params['perItemStatus'] : false;
index b263fb3..3d2057c 100644 (file)
  * @defgroup Search Search
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Contain a class for special pages
  * @ingroup Search
  */
-class SearchEngine {
+abstract class SearchEngine {
        /** @var string */
        public $prefix = '';
 
@@ -124,155 +126,55 @@ class SearchEngine {
         * @param string $term
         * @return string
         */
-       function transformSearchTerm( $term ) {
+       public function transformSearchTerm( $term ) {
                return $term;
        }
 
+       /**
+        * Get service class to finding near matches.
+        * @param Config $config Configuration to use for the matcher.
+        * @return SearchNearMatcher
+        */
+       public function getNearMatcher( Config $config ) {
+               return new SearchNearMatcher( $config );
+       }
+
+       /**
+        * Get near matcher for default SearchEngine.
+        * @return SearchNearMatcher
+        */
+       protected static function defaultNearMatcher() {
+               $config = MediaWikiServices::getInstance()->getMainConfig();
+               return MediaWikiServices::getInstance()->newSearchEngine()->getNearMatcher( $config );
+       }
+
        /**
         * If an exact title match can be found, or a very slightly close match,
         * return the title. If no match, returns NULL.
-        *
+        * @deprecated since 1.27; Use SearchEngine::getNearMatcher()
         * @param string $searchterm
         * @return Title
         */
        public static function getNearMatch( $searchterm ) {
-               $title = self::getNearMatchInternal( $searchterm );
-
-               Hooks::run( 'SearchGetNearMatchComplete', [ $searchterm, &$title ] );
-               return $title;
+               return static::defaultNearMatcher()->getNearMatch( $searchterm );
        }
 
        /**
         * Do a near match (see SearchEngine::getNearMatch) and wrap it into a
         * SearchResultSet.
-        *
+        * @deprecated since 1.27; Use SearchEngine::getNearMatcher()
         * @param string $searchterm
         * @return SearchResultSet
         */
        public static function getNearMatchResultSet( $searchterm ) {
-               return new SearchNearMatchResultSet( self::getNearMatch( $searchterm ) );
+               return static::defaultNearMatcher()->getNearMatchResultSet( $searchterm );
        }
 
        /**
-        * Really find the title match.
-        * @param string $searchterm
-        * @return null|Title
+        * Get chars legal for search.
+        * NOTE: usage as static is deprecated and preserved only as BC measure
+        * @return string
         */
-       private static function getNearMatchInternal( $searchterm ) {
-               global $wgContLang, $wgEnableSearchContributorsByIP;
-
-               $allSearchTerms = [ $searchterm ];
-
-               if ( $wgContLang->hasVariants() ) {
-                       $allSearchTerms = array_unique( array_merge(
-                               $allSearchTerms,
-                               $wgContLang->autoConvertToAllVariants( $searchterm )
-                       ) );
-               }
-
-               $titleResult = null;
-               if ( !Hooks::run( 'SearchGetNearMatchBefore', [ $allSearchTerms, &$titleResult ] ) ) {
-                       return $titleResult;
-               }
-
-               foreach ( $allSearchTerms as $term ) {
-
-                       # Exact match? No need to look further.
-                       $title = Title::newFromText( $term );
-                       if ( is_null( $title ) ) {
-                               return null;
-                       }
-
-                       # Try files if searching in the Media: namespace
-                       if ( $title->getNamespace() == NS_MEDIA ) {
-                               $title = Title::makeTitle( NS_FILE, $title->getText() );
-                       }
-
-                       if ( $title->isSpecialPage() || $title->isExternal() || $title->exists() ) {
-                               return $title;
-                       }
-
-                       # See if it still otherwise has content is some sane sense
-                       $page = WikiPage::factory( $title );
-                       if ( $page->hasViewableContent() ) {
-                               return $title;
-                       }
-
-                       if ( !Hooks::run( 'SearchAfterNoDirectMatch', [ $term, &$title ] ) ) {
-                               return $title;
-                       }
-
-                       # Now try all lower case (i.e. first letter capitalized)
-                       $title = Title::newFromText( $wgContLang->lc( $term ) );
-                       if ( $title && $title->exists() ) {
-                               return $title;
-                       }
-
-                       # Now try capitalized string
-                       $title = Title::newFromText( $wgContLang->ucwords( $term ) );
-                       if ( $title && $title->exists() ) {
-                               return $title;
-                       }
-
-                       # Now try all upper case
-                       $title = Title::newFromText( $wgContLang->uc( $term ) );
-                       if ( $title && $title->exists() ) {
-                               return $title;
-                       }
-
-                       # Now try Word-Caps-Breaking-At-Word-Breaks, for hyphenated names etc
-                       $title = Title::newFromText( $wgContLang->ucwordbreaks( $term ) );
-                       if ( $title && $title->exists() ) {
-                               return $title;
-                       }
-
-                       // Give hooks a chance at better match variants
-                       $title = null;
-                       if ( !Hooks::run( 'SearchGetNearMatch', [ $term, &$title ] ) ) {
-                               return $title;
-                       }
-               }
-
-               $title = Title::newFromText( $searchterm );
-
-               # Entering an IP address goes to the contributions page
-               if ( $wgEnableSearchContributorsByIP ) {
-                       if ( ( $title->getNamespace() == NS_USER && User::isIP( $title->getText() ) )
-                               || User::isIP( trim( $searchterm ) ) ) {
-                               return SpecialPage::getTitleFor( 'Contributions', $title->getDBkey() );
-                       }
-               }
-
-               # Entering a user goes to the user page whether it's there or not
-               if ( $title->getNamespace() == NS_USER ) {
-                       return $title;
-               }
-
-               # Go to images that exist even if there's no local page.
-               # There may have been a funny upload, or it may be on a shared
-               # file repository such as Wikimedia Commons.
-               if ( $title->getNamespace() == NS_FILE ) {
-                       $image = wfFindFile( $title );
-                       if ( $image ) {
-                               return $title;
-                       }
-               }
-
-               # MediaWiki namespace? Page may be "implied" if not customized.
-               # Just return it, with caps forced as the message system likes it.
-               if ( $title->getNamespace() == NS_MEDIAWIKI ) {
-                       return Title::makeTitle( NS_MEDIAWIKI, $wgContLang->ucfirst( $title->getText() ) );
-               }
-
-               # Quoted term? Try without the quotes...
-               $matches = [];
-               if ( preg_match( '/^"([^"]+)"$/', $searchterm, $matches ) ) {
-                       return SearchEngine::getNearMatch( $matches[1] );
-               }
-
-               return null;
-       }
-
        public static function legalSearchChars() {
                return "A-Za-z_'.0-9\\x80-\\xFF\\-";
        }
@@ -390,44 +292,8 @@ class SearchEngine {
                return $parsed;
        }
 
-       /**
-        * Make a list of searchable namespaces and their canonical names.
-        * @return array
-        */
-       public static function searchableNamespaces() {
-               global $wgContLang;
-               $arr = [];
-               foreach ( $wgContLang->getNamespaces() as $ns => $name ) {
-                       if ( $ns >= NS_MAIN ) {
-                               $arr[$ns] = $name;
-                       }
-               }
-
-               Hooks::run( 'SearchableNamespaces', [ &$arr ] );
-               return $arr;
-       }
-
-       /**
-        * Extract default namespaces to search from the given user's
-        * settings, returning a list of index numbers.
-        *
-        * @param user $user
-        * @return array
-        */
-       public static function userNamespaces( $user ) {
-               $arr = [];
-               foreach ( SearchEngine::searchableNamespaces() as $ns => $name ) {
-                       if ( $user->getOption( 'searchNs' . $ns ) ) {
-                               $arr[] = $ns;
-                       }
-               }
-
-               return $arr;
-       }
-
        /**
         * Find snippet highlight settings for all users
-        *
         * @return array Contextlines, contextchars
         */
        public static function userHighlightPrefs() {
@@ -436,77 +302,6 @@ class SearchEngine {
                return [ $contextlines, $contextchars ];
        }
 
-       /**
-        * An array of namespaces indexes to be searched by default
-        *
-        * @return array
-        */
-       public static function defaultNamespaces() {
-               global $wgNamespacesToBeSearchedDefault;
-
-               return array_keys( $wgNamespacesToBeSearchedDefault, true );
-       }
-
-       /**
-        * Get a list of namespace names useful for showing in tooltips
-        * and preferences
-        *
-        * @param array $namespaces
-        * @return array
-        */
-       public static function namespacesAsText( $namespaces ) {
-               global $wgContLang;
-
-               $formatted = array_map( [ $wgContLang, 'getFormattedNsText' ], $namespaces );
-               foreach ( $formatted as $key => $ns ) {
-                       if ( empty( $ns ) ) {
-                               $formatted[$key] = wfMessage( 'blanknamespace' )->text();
-                       }
-               }
-               return $formatted;
-       }
-
-       /**
-        * Load up the appropriate search engine class for the currently
-        * active database backend, and return a configured instance.
-        *
-        * @param string $type Type of search backend, if not the default
-        * @return SearchEngine
-        */
-       public static function create( $type = null ) {
-               global $wgSearchType;
-               $dbr = null;
-
-               $alternatives = self::getSearchTypes();
-
-               if ( $type && in_array( $type, $alternatives ) ) {
-                       $class = $type;
-               } elseif ( $wgSearchType !== null ) {
-                       $class = $wgSearchType;
-               } else {
-                       $dbr = wfGetDB( DB_SLAVE );
-                       $class = $dbr->getSearchEngine();
-               }
-
-               $search = new $class( $dbr );
-               return $search;
-       }
-
-       /**
-        * Return the search engines we support. If only $wgSearchType
-        * is set, it'll be an array of just that one item.
-        *
-        * @return array
-        */
-       public static function getSearchTypes() {
-               global $wgSearchType, $wgSearchTypeAlternatives;
-
-               $alternatives = $wgSearchTypeAlternatives ?: [];
-               array_unshift( $alternatives, $wgSearchType );
-
-               return $alternatives;
-       }
-
        /**
         * Create or update the search index record for the given page.
         * Title and text should be pre-processed.
@@ -774,6 +569,67 @@ class SearchEngine {
                return $backend->defaultSearchBackend( $this->namespaces, $search, $this->limit, $this->offset );
        }
 
+       /**
+        * Make a list of searchable namespaces and their canonical names.
+        * @deprecated since 1.27; use SearchEngineConfig::searchableNamespaces()
+        * @return array
+        */
+       public static function searchableNamespaces() {
+               return MediaWikiServices::getInstance()->getSearchEngineConfig()->searchableNamespaces();
+       }
+
+       /**
+        * Extract default namespaces to search from the given user's
+        * settings, returning a list of index numbers.
+        * @deprecated since 1.27; use SearchEngineConfig::userNamespaces()
+        * @param user $user
+        * @return array
+        */
+       public static function userNamespaces( $user ) {
+               return MediaWikiServices::getInstance()->getSearchEngineConfig()->userNamespaces( $user );
+       }
+
+       /**
+        * An array of namespaces indexes to be searched by default
+        * @deprecated since 1.27; use SearchEngineConfig::defaultNamespaces()
+        * @return array
+        */
+       public static function defaultNamespaces() {
+               return MediaWikiServices::getInstance()->getSearchEngineConfig()->defaultNamespaces();
+       }
+
+       /**
+        * Get a list of namespace names useful for showing in tooltips
+        * and preferences
+        * @deprecated since 1.27; use SearchEngineConfig::namespacesAsText()
+        * @param array $namespaces
+        * @return array
+        */
+       public static function namespacesAsText( $namespaces ) {
+               return MediaWikiServices::getInstance()->getSearchEngineConfig()->namespacesAsText();
+       }
+
+       /**
+        * Load up the appropriate search engine class for the currently
+        * active database backend, and return a configured instance.
+        * @deprecated since 1.27; Use SearchEngineFactory::create
+        * @param string $type Type of search backend, if not the default
+        * @return SearchEngine
+        */
+       public static function create( $type = null ) {
+               return MediaWikiServices::getInstance()->getSearchEngineFactory()->create( $type );
+       }
+
+       /**
+        * Return the search engines we support. If only $wgSearchType
+        * is set, it'll be an array of just that one item.
+        * @deprecated since 1.27; use SearchEngineConfig::getSearchTypes()
+        * @return array
+        */
+       public static function getSearchTypes() {
+               return MediaWikiServices::getInstance()->getSearchEngineConfig()->getSearchTypes();
+       }
+
 }
 
 /**
diff --git a/includes/search/SearchEngineConfig.php b/includes/search/SearchEngineConfig.php
new file mode 100644 (file)
index 0000000..3d996ba
--- /dev/null
@@ -0,0 +1,110 @@
+<?php
+
+/**
+ * Configuration handling class for SearchEngine.
+ * Provides added service over plain configuration.
+ *
+ * @since 1.27
+ */
+class SearchEngineConfig {
+
+       /**
+        * Config object from which the settings will be derived.
+        * @var Config
+        */
+       private $config;
+
+       public function __construct( Config $config ) {
+               $this->config = $config;
+       }
+
+       /**
+        * Retrieve original config.
+        * @return Config
+        */
+       public function getConfig() {
+               return $this->config;
+       }
+
+       /**
+        * Make a list of searchable namespaces and their canonical names.
+        * @return array Namespace ID => name
+        */
+       public function searchableNamespaces() {
+               $arr = [];
+               foreach ( $this->config->get( 'ContLang' )->getNamespaces() as $ns => $name ) {
+                       if ( $ns >= NS_MAIN ) {
+                               $arr[$ns] = $name;
+                       }
+               }
+
+               Hooks::run( 'SearchableNamespaces', [ &$arr ] );
+               return $arr;
+       }
+
+       /**
+        * Extract default namespaces to search from the given user's
+        * settings, returning a list of index numbers.
+        *
+        * @param user $user
+        * @return int[]
+        */
+       public function userNamespaces( $user ) {
+               $arr = [];
+               foreach ( $this->searchableNamespaces() as $ns => $name ) {
+                       if ( $user->getOption( 'searchNs' . $ns ) ) {
+                               $arr[] = $ns;
+                       }
+               }
+
+               return $arr;
+       }
+
+       /**
+        * An array of namespaces indexes to be searched by default
+        *
+        * @return int[] Namespace IDs
+        */
+       public function defaultNamespaces() {
+               return array_keys( $this->config->get( 'NamespacesToBeSearchedDefault' ), true );
+       }
+
+       /**
+        * Return the search engines we support. If only $wgSearchType
+        * is set, it'll be an array of just that one item.
+        *
+        * @return array
+        */
+       public function getSearchTypes() {
+               $alternatives = $this->config->get( 'SearchTypeAlternatives' ) ?: [];
+               array_unshift( $alternatives, $this->config->get( 'SearchType' ) );
+
+               return $alternatives;
+       }
+
+       /**
+        * Return the search engine configured in $wgSearchType, etc.
+        *
+        * @return string|null
+        */
+       public function getSearchType() {
+               return $this->config->get( 'SearchType' );
+       }
+
+       /**
+        * Get a list of namespace names useful for showing in tooltips
+        * and preferences.
+        *
+        * @param int[] $namespaces
+        * @return string[] List of names
+        */
+       public function namespacesAsText( $namespaces ) {
+               $formatted = array_map( [ $this->config->get( 'ContLang' ), 'getFormattedNsText' ], $namespaces );
+               foreach ( $formatted as $key => $ns ) {
+                       if ( empty( $ns ) ) {
+                               $formatted[$key] = wfMessage( 'blanknamespace' )->text();
+                       }
+               }
+               return $formatted;
+       }
+}
diff --git a/includes/search/SearchEngineFactory.php b/includes/search/SearchEngineFactory.php
new file mode 100644 (file)
index 0000000..67f500c
--- /dev/null
@@ -0,0 +1,42 @@
+<?php
+
+/**
+ * Factory class for SearchEngine.
+ * Allows to create engine of the specific type.
+ */
+class SearchEngineFactory {
+
+       /**
+        * Configuration for SearchEngine classes.
+        * @var SearchEngineConfig
+        */
+       private $config;
+
+       public function __construct( SearchEngineConfig $config ) {
+               $this->config = $config;
+       }
+
+       /**
+        * Create SearchEngine of the given type.
+        * @param string $type
+        * @return SearchEngine
+        */
+       public function create( $type = null ) {
+               $dbr = null;
+
+               $configType = $this->config->getSearchType();
+               $alternatives = $this->config->getSearchTypes();
+
+               if ( $type && in_array( $type, $alternatives ) ) {
+                       $class = $type;
+               } elseif ( $configType !== null ) {
+                       $class = $configType;
+               } else {
+                       $dbr = wfGetDB( DB_SLAVE );
+                       $class = $dbr->getSearchEngine();
+               }
+
+               $search = new $class( $dbr );
+               return $search;
+       }
+}
index 510726b..6d66707 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * A SearchResultSet wrapper for SearchEngine::getNearMatch
+ * A SearchResultSet wrapper for SearchNearMatcher
  */
 class SearchNearMatchResultSet extends SearchResultSet {
        private $fetched = false;
diff --git a/includes/search/SearchNearMatcher.php b/includes/search/SearchNearMatcher.php
new file mode 100644 (file)
index 0000000..bb7cd57
--- /dev/null
@@ -0,0 +1,163 @@
+<?php
+
+/**
+ * Implementation of near match title search.
+ * TODO: split into service/implementation.
+ */
+class SearchNearMatcher {
+       /**
+        * Configuration object.
+        * @param Config $config
+        */
+       protected $config;
+
+       public function __construct( Config $config ) {
+
+               $this->config = $config;
+       }
+
+       /**
+        * If an exact title match can be found, or a very slightly close match,
+        * return the title. If no match, returns NULL.
+        *
+        * @param string $searchterm
+        * @return Title
+        */
+       public function getNearMatch( $searchterm ) {
+               $title = $this->getNearMatchInternal( $searchterm );
+
+               Hooks::run( 'SearchGetNearMatchComplete', [ $searchterm, &$title ] );
+               return $title;
+       }
+
+       /**
+        * Do a near match (see SearchEngine::getNearMatch) and wrap it into a
+        * SearchResultSet.
+        *
+        * @param string $searchterm
+        * @return SearchResultSet
+        */
+       public function getNearMatchResultSet( $searchterm ) {
+               return new SearchNearMatchResultSet( $this->getNearMatch( $searchterm ) );
+       }
+
+       /**
+        * Really find the title match.
+        * @param string $searchterm
+        * @return null|Title
+        */
+       protected function getNearMatchInternal( $searchterm ) {
+               $lang = $this->config->get( 'ContLang' );
+
+               $allSearchTerms = [ $searchterm ];
+
+               if ( $lang->hasVariants() ) {
+                       $allSearchTerms = array_unique( array_merge(
+                               $allSearchTerms,
+                               $lang->autoConvertToAllVariants( $searchterm )
+                       ) );
+               }
+
+               $titleResult = null;
+               if ( !Hooks::run( 'SearchGetNearMatchBefore', [ $allSearchTerms, &$titleResult ] ) ) {
+                       return $titleResult;
+               }
+
+               foreach ( $allSearchTerms as $term ) {
+
+                       # Exact match? No need to look further.
+                       $title = Title::newFromText( $term );
+                       if ( is_null( $title ) ) {
+                               return null;
+                       }
+
+                       # Try files if searching in the Media: namespace
+                       if ( $title->getNamespace() == NS_MEDIA ) {
+                               $title = Title::makeTitle( NS_FILE, $title->getText() );
+                       }
+
+                       if ( $title->isSpecialPage() || $title->isExternal() || $title->exists() ) {
+                               return $title;
+                       }
+
+                       # See if it still otherwise has content is some sane sense
+                       $page = WikiPage::factory( $title );
+                       if ( $page->hasViewableContent() ) {
+                               return $title;
+                       }
+
+                       if ( !Hooks::run( 'SearchAfterNoDirectMatch', [ $term, &$title ] ) ) {
+                               return $title;
+                       }
+
+                       # Now try all lower case (i.e. first letter capitalized)
+                       $title = Title::newFromText( $lang->lc( $term ) );
+                       if ( $title && $title->exists() ) {
+                               return $title;
+                       }
+
+                       # Now try capitalized string
+                       $title = Title::newFromText( $lang->ucwords( $term ) );
+                       if ( $title && $title->exists() ) {
+                               return $title;
+                       }
+
+                       # Now try all upper case
+                       $title = Title::newFromText( $lang->uc( $term ) );
+                       if ( $title && $title->exists() ) {
+                               return $title;
+                       }
+
+                       # Now try Word-Caps-Breaking-At-Word-Breaks, for hyphenated names etc
+                       $title = Title::newFromText( $lang->ucwordbreaks( $term ) );
+                       if ( $title && $title->exists() ) {
+                               return $title;
+                       }
+
+                       // Give hooks a chance at better match variants
+                       $title = null;
+                       if ( !Hooks::run( 'SearchGetNearMatch', [ $term, &$title ] ) ) {
+                               return $title;
+                       }
+               }
+
+               $title = Title::newFromText( $searchterm );
+
+               # Entering an IP address goes to the contributions page
+               if ( $this->config->get( 'EnableSearchContributorsByIP' ) ) {
+                       if ( ( $title->getNamespace() == NS_USER && User::isIP( $title->getText() ) )
+                               || User::isIP( trim( $searchterm ) ) ) {
+                               return SpecialPage::getTitleFor( 'Contributions', $title->getDBkey() );
+                       }
+               }
+
+               # Entering a user goes to the user page whether it's there or not
+               if ( $title->getNamespace() == NS_USER ) {
+                       return $title;
+               }
+
+               # Go to images that exist even if there's no local page.
+               # There may have been a funny upload, or it may be on a shared
+               # file repository such as Wikimedia Commons.
+               if ( $title->getNamespace() == NS_FILE ) {
+                       $image = wfFindFile( $title );
+                       if ( $image ) {
+                               return $title;
+                       }
+               }
+
+               # MediaWiki namespace? Page may be "implied" if not customized.
+               # Just return it, with caps forced as the message system likes it.
+               if ( $title->getNamespace() == NS_MEDIAWIKI ) {
+                       return Title::makeTitle( NS_MEDIAWIKI, $lang->ucfirst( $title->getText() ) );
+               }
+
+               # Quoted term? Try without the quotes...
+               $matches = [];
+               if ( preg_match( '/^"([^"]+)"$/', $searchterm, $matches ) ) {
+                       return self::getNearMatch( $matches[1] );
+               }
+
+               return null;
+       }
+}
index 6c406e7..21effbb 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Search
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @todo FIXME: This class is horribly factored. It would probably be better to
  * have a useful base class to which you pass some standard information, then
@@ -49,6 +51,11 @@ class SearchResult {
         */
        protected $mText;
 
+       /**
+        * @var SearchEngine
+        */
+       protected $searchEngine;
+
        /**
         * Return a new SearchResult and initializes it with a title.
         *
@@ -56,7 +63,7 @@ class SearchResult {
         * @return SearchResult
         */
        public static function newFromTitle( $title ) {
-               $result = new self();
+               $result = new static();
                $result->initFromTitle( $title );
                return $result;
        }
@@ -78,6 +85,7 @@ class SearchResult {
                                $this->mImage = wfFindFile( $this->mTitle );
                        }
                }
+               $this->searchEngine = MediaWikiServices::getInstance()->newSearchEngine();
        }
 
        /**
@@ -119,8 +127,8 @@ class SearchResult {
        protected function initText() {
                if ( !isset( $this->mText ) ) {
                        if ( $this->mRevision != null ) {
-                               $this->mText = SearchEngine::create()
-                                       ->getTextFromContent( $this->mTitle, $this->mRevision->getContent() );
+                               $this->mText = $this->searchEngine->getTextFromContent(
+                                               $this->mTitle, $this->mRevision->getContent() );
                        } else { // TODO: can we fetch raw wikitext for commons images?
                                $this->mText = '';
                        }
@@ -136,7 +144,7 @@ class SearchResult {
                $this->initText();
 
                // TODO: make highliter take a content object. Make ContentHandler a factory for SearchHighliter.
-               list( $contextlines, $contextchars ) = SearchEngine::userHighlightPrefs();
+               list( $contextlines, $contextchars ) = $this->searchEngine->userHighlightPrefs();
 
                $h = new SearchHighlighter();
                if ( count( $terms ) > 0 ) {
index 2626aa8..264e1ae 100644 (file)
@@ -94,6 +94,8 @@ final class SessionBackend {
        private $usePhpSessionHandling = true;
        private $checkPHPSessionRecursionGuard = false;
 
+       private $shutdown = false;
+
        /**
         * @param SessionId $id Session ID object
         * @param SessionInfo $info Session info to populate from
@@ -181,12 +183,21 @@ final class SessionBackend {
         */
        public function deregisterSession( $index ) {
                unset( $this->requests[$index] );
-               if ( !count( $this->requests ) ) {
+               if ( !$this->shutdown && !count( $this->requests ) ) {
                        $this->save( true );
                        $this->provider->getManager()->deregisterSessionBackend( $this );
                }
        }
 
+       /**
+        * Shut down a session
+        * @private For use by \MediaWiki\Session\SessionManager::shutdown() only
+        */
+       public function shutdown() {
+               $this->save( true );
+               $this->shutdown = true;
+       }
+
        /**
         * Returns the session ID.
         * @return string
index 29cd69a..a364045 100644 (file)
@@ -626,7 +626,7 @@ final class SessionManager implements SessionManagerInterface {
                        }
                        // @codeCoverageIgnoreEnd
                        foreach ( $this->allSessionBackends as $backend ) {
-                               $backend->save( true );
+                               $backend->shutdown();
                        }
                }
        }
index 5b50cd8..97fffda 100644 (file)
@@ -1200,7 +1200,9 @@ abstract class Skin extends ContextSource {
                        $cache = ObjectCache::getMainWANInstance();
                        $sidebar = $cache->getWithSetCallback(
                                $cache->makeKey( 'sidebar', $this->getLanguage()->getCode() ),
-                               $wgSidebarCacheExpiry,
+                               MessageCache::singleton()->isDisabled()
+                                       ? $cache::TTL_UNCACHEABLE // bug T133069
+                                       : $wgSidebarCacheExpiry,
                                $callback,
                                [ 'lockTSE' => 30 ]
                        );
@@ -1562,224 +1564,55 @@ abstract class Skin extends ContextSource {
        }
 
        /** @deprecated in 1.21 */
-       public function accesskey() {
-               return call_user_func_array( [ 'Linker', 'accesskey' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function blockLink() {
-               return call_user_func_array( [ 'Linker', 'blockLink' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function buildRollbackLink() {
-               return call_user_func_array( [ 'Linker', 'buildRollbackLink' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function commentBlock() {
-               return call_user_func_array( [ 'Linker', 'commentBlock' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function emailLink() {
-               return call_user_func_array( [ 'Linker', 'emailLink' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function formatComment() {
-               return call_user_func_array( [ 'Linker', 'formatComment' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function formatHiddenCategories() {
-               return call_user_func_array( [ 'Linker', 'formatHiddenCategories' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function formatLinksInComment() {
-               return call_user_func_array( [ 'Linker', 'formatLinksInComment' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function formatRevisionSize() {
-               return call_user_func_array( [ 'Linker', 'formatRevisionSize' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function formatSize() {
-               return call_user_func_array( [ 'Linker', 'formatSize' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function formatTemplates() {
-               return call_user_func_array( [ 'Linker', 'formatTemplates' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function generateRollback() {
-               return call_user_func_array( [ 'Linker', 'generateRollback' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function generateTOC() {
-               return call_user_func_array( [ 'Linker', 'generateTOC' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function getInternalLinkAttributes() {
-               return call_user_func_array( [ 'Linker', 'getInternalLinkAttributes' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function getInternalLinkAttributesObj() {
-               return call_user_func_array( [ 'Linker', 'getInternalLinkAttributesObj' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function getInterwikiLinkAttributes() {
-               return call_user_func_array( [ 'Linker', 'getInterwikiLinkAttributes' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function getInvalidTitleDescription() {
-               return call_user_func_array( [ 'Linker', 'getInvalidTitleDescription' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function getLinkColour() {
-               return call_user_func_array( [ 'Linker', 'getLinkColour' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function getRevDeleteLink() {
-               return call_user_func_array( [ 'Linker', 'getRevDeleteLink' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function getRollbackEditCount() {
-               return call_user_func_array( [ 'Linker', 'getRollbackEditCount' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function link() {
-               return call_user_func_array( [ 'Linker', 'link' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function linkKnown() {
-               return call_user_func_array( [ 'Linker', 'linkKnown' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function makeBrokenImageLinkObj() {
-               return call_user_func_array( [ 'Linker', 'makeBrokenImageLinkObj' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function makeCommentLink() {
-               return call_user_func_array( [ 'Linker', 'makeCommentLink' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function makeExternalImage() {
-               return call_user_func_array( [ 'Linker', 'makeExternalImage' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function makeExternalLink() {
-               return call_user_func_array( [ 'Linker', 'makeExternalLink' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function makeHeadline() {
-               return call_user_func_array( [ 'Linker', 'makeHeadline' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function makeImageLink() {
-               return call_user_func_array( [ 'Linker', 'makeImageLink' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function makeMediaLinkFile() {
-               return call_user_func_array( [ 'Linker', 'makeMediaLinkFile' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function makeMediaLinkObj() {
-               return call_user_func_array( [ 'Linker', 'makeMediaLinkObj' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function makeSelfLinkObj() {
-               return call_user_func_array( [ 'Linker', 'makeSelfLinkObj' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function makeThumbLink2() {
-               return call_user_func_array( [ 'Linker', 'makeThumbLink2' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function makeThumbLinkObj() {
-               return call_user_func_array( [ 'Linker', 'makeThumbLinkObj' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function normaliseSpecialPage() {
-               return call_user_func_array( [ 'Linker', 'normaliseSpecialPage' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function normalizeSubpageLink() {
-               return call_user_func_array( [ 'Linker', 'normalizeSubpageLink' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function processResponsiveImages() {
-               return call_user_func_array( [ 'Linker', 'processResponsiveImages' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function revComment() {
-               return call_user_func_array( [ 'Linker', 'revComment' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function revDeleteLink() {
-               return call_user_func_array( [ 'Linker', 'revDeleteLink' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function revDeleteLinkDisabled() {
-               return call_user_func_array( [ 'Linker', 'revDeleteLinkDisabled' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function revUserLink() {
-               return call_user_func_array( [ 'Linker', 'revUserLink' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function revUserTools() {
-               return call_user_func_array( [ 'Linker', 'revUserTools' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function specialLink() {
-               return call_user_func_array( [ 'Linker', 'specialLink' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function splitTrail() {
-               return call_user_func_array( [ 'Linker', 'splitTrail' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function titleAttrib() {
-               return call_user_func_array( [ 'Linker', 'titleAttrib' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function tocIndent() {
-               return call_user_func_array( [ 'Linker', 'tocIndent' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function tocLine() {
-               return call_user_func_array( [ 'Linker', 'tocLine' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function tocLineEnd() {
-               return call_user_func_array( [ 'Linker', 'tocLineEnd' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function tocList() {
-               return call_user_func_array( [ 'Linker', 'tocList' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function tocUnindent() {
-               return call_user_func_array( [ 'Linker', 'tocUnindent' ], func_get_args() );
-       }
-       /** @deprecated in 1.21 */
-       public function tooltip() {
-               return call_user_func_array( [ 'Linker', 'tooltip' ], func_get_args() );
+       public function commentBlock( $comment, $title = null, $local = false, $wikiId = null ) {
+               wfDeprecated( __METHOD__, '1.21' );
+               return Linker::commentBlock( $comment, $title, $local, $wikiId );
        }
+
        /** @deprecated in 1.21 */
-       public function tooltipAndAccesskeyAttribs() {
-               return call_user_func_array( [ 'Linker', 'tooltipAndAccesskeyAttribs' ], func_get_args() );
+       public function generateRollback(
+               $rev,
+               IContextSource $context = null,
+               $options = [ 'verify' ]
+       ) {
+               wfDeprecated( __METHOD__, '1.21' );
+               return Linker::generateRollback( $rev, $context, $options );
        }
+
        /** @deprecated in 1.21 */
-       public function userLink() {
-               return call_user_func_array( [ 'Linker', 'userLink' ], func_get_args() );
+       public function link( $target, $html = null, $customAttribs = [], $query = [], $options = [] ) {
+               wfDeprecated( __METHOD__, '1.21' );
+               return Linker::link( $target, $html, $customAttribs, $query, $options );
        }
+
        /** @deprecated in 1.21 */
-       public function userTalkLink() {
-               return call_user_func_array( [ 'Linker', 'userTalkLink' ], func_get_args() );
+       public function linkKnown(
+               $target,
+               $html = null,
+               $customAttribs = [ ],
+               $query = [ ],
+               $options = [ 'known', 'noclasses' ]
+       ) {
+               wfDeprecated( __METHOD__, '1.21' );
+               return Linker::linkKnown( $target, $html, $customAttribs, $query, $options );
        }
+
        /** @deprecated in 1.21 */
-       public function userToolLinks() {
-               return call_user_func_array( [ 'Linker', 'userToolLinks' ], func_get_args() );
+       public function userLink( $userId, $userName, $altUserName = false ) {
+               wfDeprecated( __METHOD__, '1.21' );
+               return Linker::userLink( $userId, $userName, $altUserName );
        }
+
        /** @deprecated in 1.21 */
-       public function userToolLinksRedContribs() {
-               return call_user_func_array( [ 'Linker', 'userToolLinksRedContribs' ], func_get_args() );
+       public function userToolLinks(
+               $userId,
+               $userText,
+               $redContribsWhenNoEdits = false,
+               $flags = 0,
+               $edits = null
+       ) {
+               wfDeprecated( __METHOD__, '1.21' );
+               return Linker::userToolLinks( $userId, $userText, $redContribsWhenNoEdits, $flags, $edits );
        }
 
 }
index 366862d..cc993aa 100644 (file)
@@ -21,6 +21,8 @@
  * @file
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Factory class to create Skin objects
  *
@@ -42,16 +44,11 @@ class SkinFactory {
        private $displayNames = [];
 
        /**
-        * @var SkinFactory
+        * @deprecated in 1.27
+        * @return SkinFactory
         */
-       private static $self;
-
        public static function getDefaultInstance() {
-               if ( !self::$self ) {
-                       self::$self = new self;
-               }
-
-               return self::$self;
+               return MediaWikiServices::getInstance()->getSkinFactory();
        }
 
        /**
index fb153fc..6ca7a13 100644 (file)
@@ -1,4 +1,6 @@
 <?php
+use MediaWiki\MediaWikiServices;
+
 /**
  * Parent class for all special pages.
  *
@@ -59,6 +61,9 @@ class SpecialPage {
        /**
         * Get a localised Title object for a specified special page name
         *
+        * @since 1.9
+        * @since 1.21 $fragment parameter added
+        *
         * @param string $name
         * @param string|bool $subpage Subpage string, or false to not use a subpage
         * @param string $fragment The link fragment (after the "#")
@@ -342,7 +347,7 @@ class SpecialPage {
                        return [];
                }
 
-               $searchEngine = SearchEngine::create();
+               $searchEngine = MediaWikiServices::getInstance()->newSearchEngine();
                $searchEngine->setLimitOffset( $limit, $offset );
                $searchEngine->setNamespaces( [] );
                $result = $searchEngine->defaultPrefixSearch( $search );
index ede367e..3e66ab0 100644 (file)
@@ -168,6 +168,7 @@ class SpecialExport extends SpecialPage {
                        // This should provide safer streaming for pages with history
                        wfResetOutputBuffers();
                        $request->response()->header( "Content-type: application/xml; charset=utf-8" );
+                       $request->response()->header( "X-Robots-Tag: noindex,nofollow" );
 
                        if ( $request->getCheck( 'wpDownload' ) ) {
                                // Provide a sane filename suggestion
index bb82d03..6de127d 100644 (file)
@@ -1,4 +1,6 @@
 <?php
+use MediaWiki\MediaWikiServices;
+
 /**
  * Implements Special:FileDuplicateSearch
  *
@@ -244,7 +246,7 @@ class FileDuplicateSearchPage extends QueryPage {
                        // No prefix suggestion outside of file namespace
                        return [];
                }
-               $searchEngine = SearchEngine::create();
+               $searchEngine = MediaWikiServices::getInstance()->newSearchEngine();
                $searchEngine->setLimitOffset( $limit, $offset );
                // Autocomplete subpage the same as a normal search, but just for files
                $searchEngine->setNamespaces( [ NS_FILE ] );
index 45ef679..b01a45f 100644 (file)
@@ -23,6 +23,8 @@
  * @ingroup SpecialPage
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * implements Special:Search - Run text & title search and display the output
  * @ingroup SpecialPage
@@ -79,10 +81,17 @@ class SpecialSearch extends SpecialPage {
         */
        protected $customCaptions;
 
+       /**
+        * Search engine configurations.
+        * @var SearchEngineConfig
+        */
+       protected $searchConfig;
+
        const NAMESPACES_CURRENT = 'sense';
 
        public function __construct() {
                parent::__construct( 'Search' );
+               $this->searchConfig = MediaWikiServices::getInstance()->getSearchEngineConfig();
        }
 
        /**
@@ -150,7 +159,7 @@ class SpecialSearch extends SpecialPage {
                $nslist = $this->powerSearch( $request );
                if ( !count( $nslist ) ) {
                        # Fallback to user preference
-                       $nslist = SearchEngine::userNamespaces( $user );
+                       $nslist = $this->searchConfig->userNamespaces( $user );
                }
 
                $profile = null;
@@ -202,7 +211,8 @@ class SpecialSearch extends SpecialPage {
                        return;
                }
                # If there's an exact or very near match, jump right there.
-               $title = SearchEngine::getNearMatch( $term );
+               $title = $this->getSearchEngine()
+                       ->getNearMatcher( $this->getConfig() )->getNearMatch( $term );
 
                if ( !is_null( $title ) &&
                        Hooks::run( 'SpecialSearchGoResult', [ $term, $title, &$url ] )
@@ -376,6 +386,7 @@ class SpecialSearch extends SpecialPage {
                if ( $textMatches && !$textStatus ) {
                        // output appropriate heading
                        if ( $numTextMatches > 0 && $numTitleMatches > 0 ) {
+                               $out->addHTML( '<div class="visualClear"></div>' );
                                // if no title matches the heading is redundant
                                $out->wrapWikiMsg( "==$1==\n", 'textmatches' );
                        }
@@ -619,7 +630,7 @@ class SpecialSearch extends SpecialPage {
         */
        protected function powerSearch( &$request ) {
                $arr = [];
-               foreach ( SearchEngine::searchableNamespaces() as $ns => $name ) {
+               foreach ( $this->searchConfig->searchableNamespaces() as $ns => $name ) {
                        if ( $request->getCheck( 'ns' . $ns ) ) {
                                $arr[] = $ns;
                        }
@@ -1020,7 +1031,7 @@ class SpecialSearch extends SpecialPage {
 
                // Groups namespaces into rows according to subject
                $rows = [];
-               foreach ( SearchEngine::searchableNamespaces() as $namespace => $name ) {
+               foreach ( $this->searchConfig->searchableNamespaces() as $namespace => $name ) {
                        $subject = MWNamespace::getSubject( $namespace );
                        if ( !array_key_exists( $subject, $rows ) ) {
                                $rows[$subject] = "";
@@ -1103,15 +1114,15 @@ class SpecialSearch extends SpecialPage {
         */
        protected function getSearchProfiles() {
                // Builds list of Search Types (profiles)
-               $nsAllSet = array_keys( SearchEngine::searchableNamespaces() );
-
+               $nsAllSet = array_keys( $this->searchConfig->searchableNamespaces() );
+               $defaultNs = $this->searchConfig->defaultNamespaces();
                $profiles = [
                        'default' => [
                                'message' => 'searchprofile-articles',
                                'tooltip' => 'searchprofile-articles-tooltip',
-                               'namespaces' => SearchEngine::defaultNamespaces(),
-                               'namespace-messages' => SearchEngine::namespacesAsText(
-                                       SearchEngine::defaultNamespaces()
+                               'namespaces' => $defaultNs,
+                               'namespace-messages' => $this->searchConfig->namespacesAsText(
+                                       $defaultNs
                                ),
                        ],
                        'images' => [
@@ -1327,7 +1338,8 @@ class SpecialSearch extends SpecialPage {
        public function getSearchEngine() {
                if ( $this->searchEngine === null ) {
                        $this->searchEngine = $this->searchEngineType ?
-                               SearchEngine::create( $this->searchEngineType ) : SearchEngine::create();
+                               MediaWikiServices::getInstance()->getSearchEngineFactory()->create( $this->searchEngineType ) :
+                               MediaWikiServices::getInstance()->newSearchEngine();
                }
 
                return $this->searchEngine;
index 82e07fd..75308aa 100644 (file)
@@ -180,6 +180,11 @@ class SpecialUpload extends SpecialPage {
                        throw new UserBlockedError( $user->getBlock() );
                }
 
+               // Global blocks
+               if ( $user->isBlockedGlobally() ) {
+                       throw new UserBlockedError( $user->getGlobalBlock() );
+               }
+
                # Check whether we actually want to allow changing stuff
                $this->checkReadOnly();
 
index 9901d36..a77c79e 100644 (file)
@@ -1059,7 +1059,6 @@ class LoginForm extends SpecialPage {
        function processLogin() {
                global $wgLang, $wgSecureLogin, $wgInvalidPasswordReset;
 
-               $cache = ObjectCache::getLocalClusterInstance();
                $authRes = $this->authenticateUserData();
                switch ( $authRes ) {
                        case self::SUCCESS:
index 45fe5c4..40706fa 100644 (file)
@@ -490,7 +490,7 @@ class ImageListPager extends TablePager {
                        case 'img_description':
                                return Linker::formatComment( $value );
                        case 'count':
-                               return intval( $value ) + 1;
+                               return $this->getLanguage()->formatNum( intval( $value ) + 1 );
                        case 'top':
                                // Messages: listfiles-latestversion-yes, listfiles-latestversion-no
                                return $this->msg( 'listfiles-latestversion-' . $value );
index c1e096b..7c32c3b 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  */
 
+use MediaWiki\MediaWikiServices;
 use MediaWiki\Session\SessionManager;
 use MediaWiki\Session\Token;
 
@@ -275,8 +276,8 @@ class User implements IDBAccessObject {
        protected $mImplicitGroups;
        /** @var array */
        protected $mFormerGroups;
-       /** @var bool */
-       protected $mBlockedGlobally;
+       /** @var Block */
+       protected $mGlobalBlock;
        /** @var bool */
        protected $mLocked;
        /** @var bool */
@@ -1534,7 +1535,8 @@ class User implements IDBAccessObject {
                foreach ( LanguageConverter::$languagesWithVariants as $langCode ) {
                        $defOpt[$langCode == $wgContLang->getCode() ? 'variant' : "variant-$langCode"] = $langCode;
                }
-               foreach ( SearchEngine::searchableNamespaces() as $nsnum => $nsname ) {
+               $namespaces = MediaWikiServices::getInstance()->getSearchEngineConfig()->searchableNamespaces();
+               foreach ( $namespaces as $nsnum => $nsname ) {
                        $defOpt['searchNs' . $nsnum] = !empty( $wgNamespacesToBeSearchedDefault[$nsnum] );
                }
                $defOpt['skin'] = Skin::normalizeKey( $wgDefaultSkin );
@@ -1992,8 +1994,22 @@ class User implements IDBAccessObject {
         * @return bool True if blocked, false otherwise
         */
        public function isBlockedGlobally( $ip = '' ) {
-               if ( $this->mBlockedGlobally !== null ) {
-                       return $this->mBlockedGlobally;
+               return $this->getGlobalBlock( $ip ) instanceof Block;
+       }
+
+       /**
+        * Check if user is blocked on all wikis.
+        * Do not use for actual edit permission checks!
+        * This is intended for quick UI checks.
+        *
+        * @param string $ip IP address, uses current client if none given
+        * @return Block|null Block object if blocked, null otherwise
+        * @throws FatalError
+        * @throws MWException
+        */
+       public function getGlobalBlock( $ip = '' ) {
+               if ( $this->mGlobalBlock !== null ) {
+                       return $this->mGlobalBlock ?: null;
                }
                // User is already an IP?
                if ( IP::isIPAddress( $this->getName() ) ) {
@@ -2002,9 +2018,17 @@ class User implements IDBAccessObject {
                        $ip = $this->getRequest()->getIP();
                }
                $blocked = false;
-               Hooks::run( 'UserIsBlockedGlobally', [ &$this, $ip, &$blocked ] );
-               $this->mBlockedGlobally = (bool)$blocked;
-               return $this->mBlockedGlobally;
+               $block = null;
+               Hooks::run( 'UserIsBlockedGlobally', [ &$this, $ip, &$blocked, &$block ] );
+
+               if ( $blocked && $block === null ) {
+                       // back-compat: UserIsBlockedGlobally didn't have $block param first
+                       $block = new Block;
+                       $block->setTarget( $ip );
+               }
+
+               $this->mGlobalBlock = $blocked ? $block : false;
+               return $this->mGlobalBlock ?: null;
        }
 
        /**
index 6c49aa4..a7de1f9 100644 (file)
@@ -46,423 +46,423 @@ namespace MediaWiki\Languages\Data;
  */
 class Names {
        public static $names = [
-               'aa' => 'Qafár af',    # Afar
-               'ab' => 'Аҧсшәа', # Abkhaz
-               'ace' => 'Acèh',       # Aceh
-               'ady' => 'адыгабзэ',    # Adyghe
-               'ady-cyrl' => 'адыгабзэ',       # Adyghe
-               'aeb' => 'تونسي/Tûnsî',  # Tunisian Arabic (multiple scripts - defaults to Arabic)
-               'aeb-arab' => 'تونسي',     # Tunisian Arabic (Arabic Script)
-               'aeb-latn' => 'Tûnsî',        # Tunisian Arabic (Latin Script)
-               'af' => 'Afrikaans',    # Afrikaans
-               'ak' => 'Akan',         # Akan
-               'aln' => 'Gegë',       # Gheg Albanian
-               'als' => 'Alemannisch', # Alemannic -- not a valid code, for compatibility. See gsw.
-               'am' => 'አማርኛ', # Amharic
-               'an' => 'aragonés',    # Aragonese
-               'ang' => 'Ænglisc',    # Old English, bug 23283
-               'anp' => 'अङ्गिका',       # Angika
-               'ar' => 'العربية',       # Arabic
-               'arc' => 'ܐܪܡܝܐ',  # Aramaic
-               'arn' => 'mapudungun',  # Mapuche, Mapudungu, Araucanian (Araucano)
+               'aa' => 'Qafár af', # Afar
+               'ab' => 'Аҧсшәа', # Abkhaz
+               'ace' => 'Acèh', # Aceh
+               'ady' => 'адыгабзэ', # Adyghe
+               'ady-cyrl' => 'адыгабзэ', # Adyghe
+               'aeb' => 'تونسي/Tûnsî', # Tunisian Arabic (multiple scripts - defaults to Arabic)
+               'aeb-arab' => 'تونسي', # Tunisian Arabic (Arabic Script)
+               'aeb-latn' => 'Tûnsî', # Tunisian Arabic (Latin Script)
+               'af' => 'Afrikaans', # Afrikaans
+               'ak' => 'Akan', # Akan
+               'aln' => 'Gegë', # Gheg Albanian
+               'als' => 'Alemannisch', # Alemannic -- not a valid code, for compatibility. See gsw.
+               'am' => 'አማርኛ', # Amharic
+               'an' => 'aragonés', # Aragonese
+               'ang' => 'Ænglisc', # Old English, bug 23283
+               'anp' => 'अङ्गिका', # Angika
+               'ar' => 'العربية', # Arabic
+               'arc' => 'ܐܪܡܝܐ', # Aramaic
+               'arn' => 'mapudungun', # Mapuche, Mapudungu, Araucanian (Araucano)
                'arq' => 'جازايرية', # Algerian Spoken Arabic
-               'ary' => 'Maġribi',    # Moroccan Spoken Arabic
-               'arz' => 'مصرى',    # Egyptian Spoken Arabic
-               'as' => 'অসমীয়া',        # Assamese
-               'ase' => 'American sign language',      # American sign language
-               'ast' => 'asturianu',   # Asturian
-               'av' => 'авар',     # Avar
+               'ary' => 'Maġribi', # Moroccan Spoken Arabic
+               'arz' => 'مصرى', # Egyptian Spoken Arabic
+               'as' => 'অসমীয়া', # Assamese
+               'ase' => 'American sign language', # American sign language
+               'ast' => 'asturianu', # Asturian
+               'av' => 'авар', # Avar
                'avk' => 'Kotava', # Kotava
-               'awa' => 'अवधी',        # Awadhi
-               'ay' => 'Aymar aru',    # Aymara
-               'az' => 'azərbaycanca',        # Azerbaijani
-               'azb' => 'تۆرکجه',        # South Azerbaijani
-               'ba' => 'башҡортса',   # Bashkir
-               'bar' => 'Boarisch',    # Bavarian (Austro-Bavarian and South Tyrolean)
+               'awa' => 'अवधी', # Awadhi
+               'ay' => 'Aymar aru', # Aymara
+               'az' => 'azərbaycanca', # Azerbaijani
+               'azb' => 'تۆرکجه', # South Azerbaijani
+               'ba' => 'башҡортса', # Bashkir
+               'bar' => 'Boarisch', # Bavarian (Austro-Bavarian and South Tyrolean)
                'bat-smg' => 'žemaitėška', # Samogitian (deprecated code, 'sgs' in ISO 693-3 since 2010-06-30 )
                'bbc' => 'Batak Toba', # Batak Toba (falls back to bbc-latn)
                'bbc-latn' => 'Batak Toba', # Batak Toba
                'bcc' => 'جهلسری بلوچی', # Southern Balochi
                'bcl' => 'Bikol Central', # Bikol: Central Bicolano language
-               'be' => 'беларуская', #  Belarusian normative
-               'be-tarask' => "беларуская (тарашкевіца)\xE2\x80\x8E",     # Belarusian in Taraskievica orthography
-               'be-x-old' => "беларуская (тарашкевіца)\xE2\x80\x8E",      # (be-tarask compat)
-               'bg' => 'български',   # Bulgarian
+               'be' => 'беларуская', # Belarusian normative
+               'be-tarask' => "беларуская (тарашкевіца)\xE2\x80\x8E", # Belarusian in Taraskievica orthography
+               'be-x-old' => "беларуская (тарашкевіца)\xE2\x80\x8E", # (be-tarask compat)
+               'bg' => 'български', # Bulgarian
                'bgn' => 'روچ کپتین بلوچی', # Western Balochi
-               'bh' => 'भोजपुरी',        # Bihari macro language. Falls back to Bhojpuri (bho)
-               'bho' => 'भोजपुरी',       # Bhojpuri
-               'bi' => 'Bislama',              # Bislama
-               'bjn' => 'Bahasa Banjar',       # Banjarese
-               'bm' => 'bamanankan',   # Bambara
-               'bn' => 'বাংলা',      # Bengali
-               'bo' => 'བོད་ཡིག',        # Tibetan
-               'bpy' => 'বিষ্ণুপ্রিয়া মণিপুরী',       # Bishnupriya Manipuri
-               'bqi' => 'بختیاری',      # Bakthiari
-               'br' => 'brezhoneg',    # Breton
-               'brh' => 'Bráhuí',    # Brahui
-               'bs' => 'bosanski',             # Bosnian
-               'bto' => 'Iriga Bicolano',      # Rinconada Bikol
-               'bug' => 'ᨅᨔ ᨕᨘᨁᨗ', # Buginese
-               'bxr' => 'буряад',        # Buryat (Russia)
-               'ca' => 'català',      # Catalan
-               'cbk-zam' => 'Chavacano de Zamboanga',  # Zamboanga Chavacano
-               'cdo' => 'Mìng-dĕ̤ng-ngṳ̄',       # Min Dong
-               'ce' => 'нохчийн',       # Chechen
-               'ceb' => 'Cebuano',     # Cebuano
-               'ch' => 'Chamoru',              # Chamorro
-               'cho' => 'Choctaw',             # Choctaw
+               'bh' => 'भोजपुरी', # Bihari macro language. Falls back to Bhojpuri (bho)
+               'bho' => 'भोजपुरी', # Bhojpuri
+               'bi' => 'Bislama', # Bislama
+               'bjn' => 'Bahasa Banjar', # Banjarese
+               'bm' => 'bamanankan', # Bambara
+               'bn' => 'বাংলা', # Bengali
+               'bo' => 'བོད་ཡིག', # Tibetan
+               'bpy' => 'বিষ্ণুপ্রিয়া মণিপুরী', # Bishnupriya Manipuri
+               'bqi' => 'بختیاری', # Bakthiari
+               'br' => 'brezhoneg', # Breton
+               'brh' => 'Bráhuí', # Brahui
+               'bs' => 'bosanski', # Bosnian
+               'bto' => 'Iriga Bicolano', # Rinconada Bikol
+               'bug' => 'ᨅᨔ ᨕᨘᨁᨗ', # Buginese
+               'bxr' => 'буряад', # Buryat (Russia)
+               'ca' => 'català', # Catalan
+               'cbk-zam' => 'Chavacano de Zamboanga', # Zamboanga Chavacano
+               'cdo' => 'Mìng-dĕ̤ng-ngṳ̄', # Min Dong
+               'ce' => 'нохчийн', # Chechen
+               'ceb' => 'Cebuano', # Cebuano
+               'ch' => 'Chamoru', # Chamorro
+               'cho' => 'Choctaw', # Choctaw
                'chr' => 'ᏣᎳᎩ', # Cherokee
-               'chy' => 'Tsetsêhestâhese',   # Cheyenne
-               'ckb' => 'کوردیی ناوەندی', # Central Kurdish
-               'co' => 'corsu',                # Corsican
+               'chy' => 'Tsetsêhestâhese', # Cheyenne
+               'ckb' => 'کوردیی ناوەندی', # Central Kurdish
+               'co' => 'corsu', # Corsican
                'cps' => 'Capiceño', # Capiznon
-               'cr' => 'Nēhiyawēwin / ᓀᐦᐃᔭᐍᐏᐣ',                # Cree
-               'crh' => 'qırımtatarca',   # Crimean Tatar (multiple scripts - defaults to Latin)
-               'crh-latn' => "qırımtatarca (Latin)\xE2\x80\x8E",       # Crimean Tatar (Latin)
-               'crh-cyrl' => "къырымтатарджа (Кирилл)\xE2\x80\x8E",       # Crimean Tatar (Cyrillic)
-               'cs' => 'čeština',    # Czech
-               'csb' => 'kaszëbsczi', # Cassubian
-               'cu' => 'словѣньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ',        # Old Church Slavonic (ancient language)
-               'cv' => 'Чӑвашла',       # Chuvash
-               'cy' => 'Cymraeg',              # Welsh
-               'da' => 'dansk',                # Danish
-               'de' => 'Deutsch',              # German ("Du")
-               'de-at' => 'Österreichisches Deutsch',         # Austrian German
-               'de-ch' => 'Schweizer Hochdeutsch',             # Swiss Standard German
-               'de-formal' => "Deutsch (Sie-Form)\xE2\x80\x8E",                # German - formal address ("Sie")
-               'diq' => 'Zazaki',              # Zazaki
+               'cr' => 'Nēhiyawēwin / ᓀᐦᐃᔭᐍᐏᐣ', # Cree
+               'crh' => 'qırımtatarca', # Crimean Tatar (multiple scripts - defaults to Latin)
+               'crh-latn' => "qırımtatarca (Latin)\xE2\x80\x8E", # Crimean Tatar (Latin)
+               'crh-cyrl' => "къырымтатарджа (Кирилл)\xE2\x80\x8E", # Crimean Tatar (Cyrillic)
+               'cs' => 'čeština', # Czech
+               'csb' => 'kaszëbsczi', # Cassubian
+               'cu' => 'словѣньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ', # Old Church Slavonic (ancient language)
+               'cv' => 'Чӑвашла', # Chuvash
+               'cy' => 'Cymraeg', # Welsh
+               'da' => 'dansk', # Danish
+               'de' => 'Deutsch', # German ("Du")
+               'de-at' => 'Österreichisches Deutsch', # Austrian German
+               'de-ch' => 'Schweizer Hochdeutsch', # Swiss Standard German
+               'de-formal' => "Deutsch (Sie-Form)\xE2\x80\x8E", # German - formal address ("Sie")
+               'diq' => 'Zazaki', # Zazaki
                'dsb' => 'dolnoserbski', # Lower Sorbian
                'dtp' => 'Dusun Bundu-liwan', # Central Dusun
                'dty' => 'डोटेली', # Doteli
-               'dv' => 'ދިވެހިބަސް',         # Dhivehi
-               'dz' => 'ཇོང་ཁ',              # Dzongkha (Bhutan)
-               'ee' => 'eʋegbe',      # Éwé
-               'egl' => 'Emiliàn',    # Emilian
-               'el' => 'Ελληνικά',     # Greek
-               'eml' => 'emiliàn e rumagnòl',        # Emiliano-Romagnolo / Sammarinese
-               'en' => 'English',              # English
-               'en-ca' => 'Canadian English',  # Canadian English
-               'en-gb' => 'British English',   # British English
-               'eo' => 'Esperanto',    # Esperanto
-               'es' => 'español',     # Spanish
-               'et' => 'eesti',                # Estonian
-               'eu' => 'euskara',              # Basque
+               'dv' => 'ދިވެހިބަސް', # Dhivehi
+               'dz' => 'ཇོང་ཁ', # Dzongkha (Bhutan)
+               'ee' => 'eʋegbe', # Éwé
+               'egl' => 'Emiliàn', # Emilian
+               'el' => 'Ελληνικά', # Greek
+               'eml' => 'emiliàn e rumagnòl', # Emiliano-Romagnolo / Sammarinese
+               'en' => 'English', # English
+               'en-ca' => 'Canadian English', # Canadian English
+               'en-gb' => 'British English', # British English
+               'eo' => 'Esperanto', # Esperanto
+               'es' => 'español', # Spanish
+               'et' => 'eesti', # Estonian
+               'eu' => 'euskara', # Basque
                'ext' => 'estremeñu', # Extremaduran
-               'fa' => 'فارسی',   # Persian
-               'ff' => 'Fulfulde',             # Fulfulde, Maasina
-               'fi' => 'suomi',                # Finnish
+               'fa' => 'فارسی', # Persian
+               'ff' => 'Fulfulde', # Fulfulde, Maasina
+               'fi' => 'suomi', # Finnish
                'fit' => 'meänkieli', # Tornedalen Finnish
-               'fiu-vro' => 'Võro',    # Võro (deprecated code, 'vro' in ISO 639-3 since 2009-01-16)
-               'fj' => 'Na Vosa Vakaviti',     # Fijian
-               'fo' => 'føroyskt',    # Faroese
-               'fr' => 'français',    # French
+               'fiu-vro' => 'Võro', # Võro (deprecated code, 'vro' in ISO 639-3 since 2009-01-16)
+               'fj' => 'Na Vosa Vakaviti', # Fijian
+               'fo' => 'føroyskt', # Faroese
+               'fr' => 'français', # French
                'frc' => 'français cadien', # Cajun French
-               'frp' => 'arpetan',     # Franco-Provençal/Arpitan
-               'frr' => 'Nordfriisk',  # North Frisian
-               'fur' => 'furlan',              # Friulian
-               'fy' => 'Frysk',                # Frisian
-               'ga' => 'Gaeilge',              # Irish
-               'gag' => 'Gagauz',              # Gagauz
-               'gan' => '贛語',              # Gan (multiple scripts - defaults to Traditional)
-               'gan-hans' => "赣语(简体)\xE2\x80\x8E", # Gan (Simplified Han)
-               'gan-hant' => "贛語(繁體)\xE2\x80\x8E", # Gan (Traditional Han)
-               'gd' => 'Gàidhlig',    # Scots Gaelic
-               'gl' => 'galego',               # Galician
-               'glk' => 'گیلکی',  # Gilaki
-               'gn' => 'Avañe\'ẽ',  # Guaraní, Paraguayan
-               'gom' => 'गोंयची कोंकणी / Gõychi Konknni',     # Goan Konkani
-               'gom-deva' => 'गोंयची कोंकणी',  # Goan Konkani (Devanagari script)
-               'gom-latn' => 'Gõychi Konknni',        # Goan Konkani (Latin script)
-               'got' => '𐌲𐌿𐍄𐌹𐍃𐌺',    # Gothic
+               'frp' => 'arpetan', # Franco-Provençal/Arpitan
+               'frr' => 'Nordfriisk', # North Frisian
+               'fur' => 'furlan', # Friulian
+               'fy' => 'Frysk', # Frisian
+               'ga' => 'Gaeilge', # Irish
+               'gag' => 'Gagauz', # Gagauz
+               'gan' => '贛語', # Gan (multiple scripts - defaults to Traditional)
+               'gan-hans' => "赣语(简体)\xE2\x80\x8E", # Gan (Simplified Han)
+               'gan-hant' => "贛語(繁體)\xE2\x80\x8E", # Gan (Traditional Han)
+               'gd' => 'Gàidhlig', # Scots Gaelic
+               'gl' => 'galego', # Galician
+               'glk' => 'گیلکی', # Gilaki
+               'gn' => 'Avañe\'ẽ', # Guaraní, Paraguayan
+               'gom' => 'गोंयची कोंकणी / Gõychi Konknni', # Goan Konkani
+               'gom-deva' => 'गोंयची कोंकणी', # Goan Konkani (Devanagari script)
+               'gom-latn' => 'Gõychi Konknni', # Goan Konkani (Latin script)
+               'got' => '𐌲𐌿𐍄𐌹𐍃𐌺', # Gothic
                'grc' => 'Ἀρχαία ἑλληνικὴ', # Ancient Greek
-               'gsw' => 'Alemannisch', # Alemannic
-               'gu' => 'ગુજરાતી',        # Gujarati
-               'gv' => 'Gaelg',                # Manx
-               'ha' => 'Hausa',        # Hausa
-               'hak' => '客家語/Hak-kâ-ngî',      # Hakka
-               'haw' => 'Hawaiʻi',            # Hawaiian
-               'he' => 'עברית',   # Hebrew
-               'hi' => 'हिन्दी',   # Hindi
-               'hif' => 'Fiji Hindi',  # Fijian Hindi (multiple scripts - defaults to Latin)
-               'hif-latn' => 'Fiji Hindi',     # Fiji Hindi (latin)
-               'hil' => 'Ilonggo',     # Hiligaynon
-               'ho' => 'Hiri Motu',    # Hiri Motu
-               'hr' => 'hrvatski',             # Croatian
+               'gsw' => 'Alemannisch', # Alemannic
+               'gu' => 'ગુજરાતી', # Gujarati
+               'gv' => 'Gaelg', # Manx
+               'ha' => 'Hausa', # Hausa
+               'hak' => '客家語/Hak-kâ-ngî', # Hakka
+               'haw' => 'Hawaiʻi', # Hawaiian
+               'he' => 'עברית', # Hebrew
+               'hi' => 'हिन्दी', # Hindi
+               'hif' => 'Fiji Hindi', # Fijian Hindi (multiple scripts - defaults to Latin)
+               'hif-latn' => 'Fiji Hindi', # Fiji Hindi (latin)
+               'hil' => 'Ilonggo', # Hiligaynon
+               'ho' => 'Hiri Motu', # Hiri Motu
+               'hr' => 'hrvatski', # Croatian
                'hrx' => 'Hunsrik', # Riograndenser Hunsrückisch
-               'hsb' => 'hornjoserbsce',       # Upper Sorbian
-               'ht' => 'Kreyòl ayisyen',              # Haitian Creole French
-               'hu' => 'magyar',               # Hungarian
-               'hy' => 'Հայերեն',       # Armenian
-               'hz' => 'Otsiherero',   # Herero
-               'ia' => 'interlingua',  # Interlingua (IALA)
-               'id' => 'Bahasa Indonesia',     # Indonesian
-               'ie' => 'Interlingue',  # Interlingue (Occidental)
-               'ig' => 'Igbo',                 # Igbo
-               'ii' => 'ꆇꉙ',       # Sichuan Yi
-               'ik' => 'Iñupiak',     # Inupiak (Inupiatun, Northwest Alaska / Inupiatun, North Alaskan)
-               'ike-cans' => 'ᐃᓄᒃᑎᑐᑦ',     # Inuktitut, Eastern Canadian (Unified Canadian Aboriginal Syllabics)
-               'ike-latn' => 'inuktitut',      # Inuktitut, Eastern Canadian (Latin script)
-               'ilo' => 'Ilokano',     # Ilokano
-               'inh' => 'ГӀалгӀай',    # Ingush
-               'io' => 'Ido',                  # Ido
-               'is' => 'íslenska',    # Icelandic
-               'it' => 'italiano',             # Italian
-               'iu' => 'ᐃᓄᒃᑎᑐᑦ/inuktitut', # Inuktitut (macro language, see ike/ikt, falls back to ike-cans)
-               'ja' => '日本語',    # Japanese
-               'jam' => 'Patois',      # Jamaican Creole English
-               'jbo' => 'la .lojban.',         # Lojban
-               'jut' => 'jysk',        # Jutish / Jutlandic
-               'jv' => 'Basa Jawa',    # Javanese
-               'ka' => 'ქართული',        # Georgian
-               'kaa' => 'Qaraqalpaqsha',       # Karakalpak
-               'kab' => 'Taqbaylit',   # Kabyle
-               'kbd' => 'Адыгэбзэ',    # Kabardian
-               'kbd-cyrl' => 'Адыгэбзэ',       # Kabardian (Cyrillic)
-               'kg' => 'Kongo',        # Kongo, (FIXME!) should probaly be KiKongo or KiKoongo
-               'khw' => 'کھوار',  # Khowar
-               'ki' => 'Gĩkũyũ',    # Gikuyu
-               'kiu' => 'Kırmancki',  # Kirmanjki
-               'kj' => 'Kwanyama',     # Kwanyama
-               'kk' => 'қазақша',       # Kazakh (multiple scripts - defaults to Cyrillic)
-               'kk-arab' => "قازاقشا (تٴوتە)\xE2\x80\x8F", # Kazakh Arabic
-               'kk-cyrl' => "қазақша (кирил)\xE2\x80\x8E", # Kazakh Cyrillic
-               'kk-latn' => "qazaqşa (latın)\xE2\x80\x8E",   # Kazakh Latin
-               'kk-cn' => "قازاقشا (جۇنگو)\xE2\x80\x8F",   # Kazakh (China)
-               'kk-kz' => "қазақша (Қазақстан)\xE2\x80\x8E",   # Kazakh (Kazakhstan)
-               'kk-tr' => "qazaqşa (Türkïya)\xE2\x80\x8E",  # Kazakh (Turkey)
-               'kl' => 'kalaallisut',  # Inuktitut, Greenlandic/Greenlandic/Kalaallisut (kal)
-               'km' => 'ភាសាខ្មែរ',  # Khmer, Central
-               'kn' => 'ಕನ್ನಡ',      # Kannada
-               'ko' => '한국어',    # Korean
-               'ko-kp' => '한국어 (조선)',        # Korean (DPRK)
+               'hsb' => 'hornjoserbsce', # Upper Sorbian
+               'ht' => 'Kreyòl ayisyen', # Haitian Creole French
+               'hu' => 'magyar', # Hungarian
+               'hy' => 'Հայերեն', # Armenian
+               'hz' => 'Otsiherero', # Herero
+               'ia' => 'interlingua', # Interlingua (IALA)
+               'id' => 'Bahasa Indonesia', # Indonesian
+               'ie' => 'Interlingue', # Interlingue (Occidental)
+               'ig' => 'Igbo', # Igbo
+               'ii' => 'ꆇꉙ', # Sichuan Yi
+               'ik' => 'Iñupiak', # Inupiak (Inupiatun, Northwest Alaska / Inupiatun, North Alaskan)
+               'ike-cans' => 'ᐃᓄᒃᑎᑐᑦ', # Inuktitut, Eastern Canadian (Unified Canadian Aboriginal Syllabics)
+               'ike-latn' => 'inuktitut', # Inuktitut, Eastern Canadian (Latin script)
+               'ilo' => 'Ilokano', # Ilokano
+               'inh' => 'ГӀалгӀай', # Ingush
+               'io' => 'Ido', # Ido
+               'is' => 'íslenska', # Icelandic
+               'it' => 'italiano', # Italian
+               'iu' => 'ᐃᓄᒃᑎᑐᑦ/inuktitut', # Inuktitut (macro language, see ike/ikt, falls back to ike-cans)
+               'ja' => '日本語', # Japanese
+               'jam' => 'Patois', # Jamaican Creole English
+               'jbo' => 'la .lojban.', # Lojban
+               'jut' => 'jysk', # Jutish / Jutlandic
+               'jv' => 'Basa Jawa', # Javanese
+               'ka' => 'ქართული', # Georgian
+               'kaa' => 'Qaraqalpaqsha', # Karakalpak
+               'kab' => 'Taqbaylit', # Kabyle
+               'kbd' => 'Адыгэбзэ', # Kabardian
+               'kbd-cyrl' => 'Адыгэбзэ', # Kabardian (Cyrillic)
+               'kg' => 'Kongo', # Kongo, (FIXME!) should probaly be KiKongo or KiKoongo
+               'khw' => 'کھوار', # Khowar
+               'ki' => 'Gĩkũyũ', # Gikuyu
+               'kiu' => 'Kırmancki', # Kirmanjki
+               'kj' => 'Kwanyama', # Kwanyama
+               'kk' => 'қазақша', # Kazakh (multiple scripts - defaults to Cyrillic)
+               'kk-arab' => "قازاقشا (تٴوتە)\xE2\x80\x8F", # Kazakh Arabic
+               'kk-cyrl' => "қазақша (кирил)\xE2\x80\x8E", # Kazakh Cyrillic
+               'kk-latn' => "qazaqşa (latın)\xE2\x80\x8E", # Kazakh Latin
+               'kk-cn' => "قازاقشا (جۇنگو)\xE2\x80\x8F", # Kazakh (China)
+               'kk-kz' => "қазақша (Қазақстан)\xE2\x80\x8E", # Kazakh (Kazakhstan)
+               'kk-tr' => "qazaqşa (Türkïya)\xE2\x80\x8E", # Kazakh (Turkey)
+               'kl' => 'kalaallisut', # Inuktitut, Greenlandic/Greenlandic/Kalaallisut (kal)
+               'km' => 'ភាសាខ្មែរ', # Khmer, Central
+               'kn' => 'ಕನ್ನಡ', # Kannada
+               'ko' => '한국어', # Korean
+               'ko-kp' => '한국어 (조선)', # Korean (DPRK)
                'koi' => 'Перем Коми', # Komi-Permyak
-               'kr' => 'Kanuri',               # Kanuri, Central
+               'kr' => 'Kanuri', # Kanuri, Central
                'krc' => 'къарачай-малкъар', # Karachay-Balkar
                'kri' => 'Krio', # Krio
                'krj' => 'Kinaray-a', # Kinaray-a
-               'ks' => 'कॉशुर / کٲشُر', # Kashmiri (multiple scripts - defaults to Perso-Arabic)
-               'ks-arab' => 'کٲشُر',      # Kashmiri (Perso-Arabic script)
-               'ks-deva' => 'कॉशुर', # Kashmiri (Devanagari script)
-               'ksh' => 'Ripoarisch',  # Ripuarian
-               'ku' => 'Kurdî',       # Kurdish (multiple scripts - defaults to Latin)
-               'ku-latn' => "Kurdî (latînî)\xE2\x80\x8E",   # Northern Kurdish (Latin script)
-               'ku-arab' => "كوردي (عەرەبی)\xE2\x80\x8F",   # Northern Kurdish (Arabic script) (falls back to ckb)
-               'kv' => 'коми',     # Komi-Zyrian (Cyrillic is common script but also written in Latin script)
-               'kw' => 'kernowek',             # Cornish
-               'ky' => 'Кыргызча',     # Kirghiz
-               'la' => 'Latina',               # Latin
-               'lad' => 'Ladino',      # Ladino
-               'lb' => 'Lëtzebuergesch',      # Luxemburguish
-               'lbe' => 'лакку',  # Lak
-               'lez' => 'лезги',  # Lezgi
-               'lfn' => 'Lingua Franca Nova',  # Lingua Franca Nova
-               'lg' => 'Luganda',              # Ganda
-               'li' => 'Limburgs',     # Limburgian
-               'lij' => 'Ligure',      # Ligurian
-               'liv' => 'Līvõ kēļ',        # Livonian
-               'lki' => 'لەکی‎', # Laki
-               'lmo' => 'lumbaart',    # Lombard
-               'ln' => 'lingála',             # Lingala
-               'lo' => 'ລາວ',    # Laotian
-               'lrc' => 'لۊری شومالی',       # Northern Luri
+               'ks' => 'कॉशुर / کٲشُر', # Kashmiri (multiple scripts - defaults to Perso-Arabic)
+               'ks-arab' => 'کٲشُر', # Kashmiri (Perso-Arabic script)
+               'ks-deva' => 'कॉशुर', # Kashmiri (Devanagari script)
+               'ksh' => 'Ripoarisch', # Ripuarian
+               'ku' => 'Kurdî', # Kurdish (multiple scripts - defaults to Latin)
+               'ku-latn' => "Kurdî (latînî)\xE2\x80\x8E", # Northern Kurdish (Latin script)
+               'ku-arab' => "كوردي (عەرەبی)\xE2\x80\x8F", # Northern Kurdish (Arabic script) (falls back to ckb)
+               'kv' => 'коми', # Komi-Zyrian (Cyrillic is common script but also written in Latin script)
+               'kw' => 'kernowek', # Cornish
+               'ky' => 'Кыргызча', # Kirghiz
+               'la' => 'Latina', # Latin
+               'lad' => 'Ladino', # Ladino
+               'lb' => 'Lëtzebuergesch', # Luxemburguish
+               'lbe' => 'лакку', # Lak
+               'lez' => 'лезги', # Lezgi
+               'lfn' => 'Lingua Franca Nova', # Lingua Franca Nova
+               'lg' => 'Luganda', # Ganda
+               'li' => 'Limburgs', # Limburgian
+               'lij' => 'Ligure', # Ligurian
+               'liv' => 'Līvõ kēļ', # Livonian
+               'lki' => 'لەکی‎', # Laki
+               'lmo' => 'lumbaart', # Lombard
+               'ln' => 'lingála', # Lingala
+               'lo' => 'ລາວ', # Laotian
+               'lrc' => 'لۊری شومالی', # Northern Luri
                'loz' => 'Silozi', # Lozi
-               'lt' => 'lietuvių',    # Lithuanian
-               'ltg' => 'latgaļu',    # Latgalian
+               'lt' => 'lietuvių', # Lithuanian
+               'ltg' => 'latgaļu', # Latgalian
                'lus' => 'Mizo ţawng', # Mizo/Lushai
                'luz' => 'لئری دوٙمینی', # Southern Luri
-               'lv' => 'latviešu',    # Latvian
-               'lzh' => '文言',      # Literary Chinese, bug 8217
-               'lzz' => 'Lazuri',      # Laz
+               'lv' => 'latviešu', # Latvian
+               'lzh' => '文言', # Literary Chinese, bug 8217
+               'lzz' => 'Lazuri', # Laz
                'mai' => 'मैथिली', # Maithili
                'map-bms' => 'Basa Banyumasan', # Banyumasan
-               'mdf' => 'мокшень',              # Moksha
-               'mg' => 'Malagasy',             # Malagasy
-               'mh' => 'Ebon',                 # Marshallese
-               'mhr' => 'олык марий', # Eastern Mari
-               'mi' => 'Māori',       # Maori
-               'min' => 'Baso Minangkabau',    # Minangkabau
-               'mk' => 'македонски', # Macedonian
-               'ml' => 'മലയാളം',   # Malayalam
-               'mn' => 'монгол', # Halh Mongolian (Cyrillic) (ISO 639-3: khk)
-               'mo' => 'молдовеняскэ',     # Moldovan, deprecated
-               'mr' => 'मराठी',      # Marathi
-               'mrj' => 'кырык мары', # Hill Mari
-               'ms' => 'Bahasa Melayu',        # Malay
-               'mt' => 'Malti',        # Maltese
-               'mus' => 'Mvskoke',     # Muskogee/Creek
-               'mwl' => 'Mirandés',   # Mirandese
-               'my' => 'မြန်မာဘာသာ',               # Burmese
-               'myv' => 'эрзянь',        # Erzya
-               'mzn' => 'مازِرونی',            # Mazanderani
-               'na' => 'Dorerin Naoero',               # Nauruan
-               'nah' => 'Nāhuatl',            # Nahuatl (not in ISO 639-3)
+               'mdf' => 'мокшень', # Moksha
+               'mg' => 'Malagasy', # Malagasy
+               'mh' => 'Ebon', # Marshallese
+               'mhr' => 'олык марий', # Eastern Mari
+               'mi' => 'Māori', # Maori
+               'min' => 'Baso Minangkabau', # Minangkabau
+               'mk' => 'македонски', # Macedonian
+               'ml' => 'മലയാളം', # Malayalam
+               'mn' => 'монгол', # Halh Mongolian (Cyrillic) (ISO 639-3: khk)
+               'mo' => 'молдовеняскэ', # Moldovan, deprecated
+               'mr' => 'मराठी', # Marathi
+               'mrj' => 'кырык мары', # Hill Mari
+               'ms' => 'Bahasa Melayu', # Malay
+               'mt' => 'Malti', # Maltese
+               'mus' => 'Mvskoke', # Muskogee/Creek
+               'mwl' => 'Mirandés', # Mirandese
+               'my' => 'မြန်မာဘာသာ', # Burmese
+               'myv' => 'эрзянь', # Erzya
+               'mzn' => 'مازِرونی', # Mazanderani
+               'na' => 'Dorerin Naoero', # Nauruan
+               'nah' => 'Nāhuatl', # Nahuatl (not in ISO 639-3)
                'nan' => 'Bân-lâm-gú', # Min-nan, bug 8217
-               'nap' => 'Napulitano',  # Neapolitan, bug 43793
-               'nb' => "norsk bokmål",                # Norwegian (Bokmal)
-               'nds' => 'Plattdüütsch',      # Low German ''or'' Low Saxon
-               'nds-nl' => 'Nedersaksies',     # aka Nedersaksisch: Dutch Low Saxon
-               'ne' => 'नेपाली',   # Nepali
-               'new' => 'नेपाल भाषा',                # Newar / Nepal Bhasha
-               'ng' => 'Oshiwambo',            # Ndonga
-               'niu' => 'Niuē',       # Niuean
-               'nl' => 'Nederlands',   # Dutch
-               'nl-informal' => "Nederlands (informeel)\xE2\x80\x8E",  # Dutch (informal address ("je"))
-               'nn' => "norsk nynorsk",        # Norwegian (Nynorsk)
-               'no' => "norsk bokmål",                # Norwegian (falls back to nb).
-               'nov' => 'Novial',              # Novial
-               'nrm' => 'Nouormand',   # Norman
-               'nso' => 'Sesotho sa Leboa',    # Northern Sotho
-               'nv' => 'Diné bizaad', # Navajo
-               'ny' => 'Chi-Chewa',    # Chichewa
-               'oc' => 'occitan',              # Occitan
-               'olo' => 'Livvinкarjala',              # Livvi-Karelian
-               'om' => 'Oromoo',               # Oromo
-               'or' => 'ଓଡ଼ିଆ',              # Oriya
+               'nap' => 'Napulitano', # Neapolitan, bug 43793
+               'nb' => 'norsk bokmål', # Norwegian (Bokmal)
+               'nds' => 'Plattdüütsch', # Low German ''or'' Low Saxon
+               'nds-nl' => 'Nedersaksies', # aka Nedersaksisch: Dutch Low Saxon
+               'ne' => 'नेपाली', # Nepali
+               'new' => 'नेपाल भाषा', # Newar / Nepal Bhasha
+               'ng' => 'Oshiwambo', # Ndonga
+               'niu' => 'Niuē', # Niuean
+               'nl' => 'Nederlands', # Dutch
+               'nl-informal' => "Nederlands (informeel)\xE2\x80\x8E", # Dutch (informal address ("je"))
+               'nn' => 'norsk nynorsk', # Norwegian (Nynorsk)
+               'no' => 'norsk bokmål', # Norwegian (falls back to nb).
+               'nov' => 'Novial', # Novial
+               'nrm' => 'Nouormand', # Norman
+               'nso' => 'Sesotho sa Leboa', # Northern Sotho
+               'nv' => 'Diné bizaad', # Navajo
+               'ny' => 'Chi-Chewa', # Chichewa
+               'oc' => 'occitan', # Occitan
+               'olo' => 'Livvinкarjala', # Livvi-Karelian
+               'om' => 'Oromoo', # Oromo
+               'or' => 'ଓଡ଼ିଆ', # Oriya
                'os' => 'Ирон', # Ossetic, bug 29091
                'pa' => 'ਪੰਜਾਬੀ', # Eastern Punjabi (Gurmukhi script) (pan)
-               'pag' => 'Pangasinan',  # Pangasinan
-               'pam' => 'Kapampangan',   # Pampanga
-               'pap' => 'Papiamentu',  # Papiamentu
-               'pcd' => 'Picard',      # Picard
-               'pdc' => 'Deitsch',     # Pennsylvania German
-               'pdt' => 'Plautdietsch',        # Plautdietsch/Mennonite Low German
-               'pfl' => 'Pälzisch',   # Palatinate German
-               'pi' => 'पालि', # Pali
+               'pag' => 'Pangasinan', # Pangasinan
+               'pam' => 'Kapampangan', # Pampanga
+               'pap' => 'Papiamentu', # Papiamentu
+               'pcd' => 'Picard', # Picard
+               'pdc' => 'Deitsch', # Pennsylvania German
+               'pdt' => 'Plautdietsch', # Plautdietsch/Mennonite Low German
+               'pfl' => 'Pälzisch', # Palatinate German
+               'pi' => 'पालि', # Pali
                'pih' => 'Norfuk / Pitkern', # Norfuk/Pitcairn/Norfolk
-               'pl' => 'polski',               # Polish
-               'pms' => 'Piemontèis', # Piedmontese
-               'pnb' => 'پنجابی',        # Western Punjabi
-               'pnt' => 'Ποντιακά',    # Pontic/Pontic Greek
-               'prg' => 'Prūsiskan',  # Prussian
-               'ps' => 'پښتو',     # Pashto
-               'pt' => 'português',   # Portuguese
-               'pt-br' => 'português do Brasil',      # Brazilian Portuguese
-               'qu' => 'Runa Simi',    # Southern Quechua
-               'qug' => 'Runa shimi',  # Kichwa/Northern Quechua (temporarily used until Kichwa has its own)
-               'rgn' => 'Rumagnôl',   # Romagnol
-               'rif' => 'Tarifit',     # Tarifit
-               'rm' => 'rumantsch',    # Raeto-Romance
-               'rmy' => 'Romani',      # Vlax Romany
-               'rn' => 'Kirundi',              # Rundi/Kirundi/Urundi
-               'ro' => 'română',     # Romanian
+               'pl' => 'polski', # Polish
+               'pms' => 'Piemontèis', # Piedmontese
+               'pnb' => 'پنجابی', # Western Punjabi
+               'pnt' => 'Ποντιακά', # Pontic/Pontic Greek
+               'prg' => 'Prūsiskan', # Prussian
+               'ps' => 'پښتو', # Pashto
+               'pt' => 'português', # Portuguese
+               'pt-br' => 'português do Brasil', # Brazilian Portuguese
+               'qu' => 'Runa Simi', # Southern Quechua
+               'qug' => 'Runa shimi', # Kichwa/Northern Quechua (temporarily used until Kichwa has its own)
+               'rgn' => 'Rumagnôl', # Romagnol
+               'rif' => 'Tarifit', # Tarifit
+               'rm' => 'rumantsch', # Raeto-Romance
+               'rmy' => 'Romani', # Vlax Romany
+               'rn' => 'Kirundi', # Rundi/Kirundi/Urundi
+               'ro' => 'română', # Romanian
                'roa-rup' => 'armãneashti', # Aromanian (deprecated code, 'rup' exists in ISO 693-3)
-               'roa-tara' => 'tarandíne',     # Tarantino
-               'ru' => 'русский',       # Russian
-               'rue' => 'русиньскый',        # Rusyn
+               'roa-tara' => 'tarandíne', # Tarantino
+               'ru' => 'русский', # Russian
+               'rue' => 'русиньскый', # Rusyn
                'rup' => 'armãneashti', # Aromanian
-               'ruq' => 'Vlăheşte',  # Megleno-Romanian (multiple scripts - defaults to Latin)
-               'ruq-cyrl' => 'Влахесте',       # Megleno-Romanian (Cyrillic script)
-               # 'ruq-grek' => 'Βλαεστε',       # Megleno-Romanian (Greek script)
-               'ruq-latn' => 'Vlăheşte',     # Megleno-Romanian (Latin script)
-               'rw' => 'Kinyarwanda',  # Kinyarwanda, should possibly be Kinyarwandi
-               'sa' => 'संस्कृतम्',  # Sanskrit
+               'ruq' => 'Vlăheşte', # Megleno-Romanian (multiple scripts - defaults to Latin)
+               'ruq-cyrl' => 'Влахесте', # Megleno-Romanian (Cyrillic script)
+               # 'ruq-grek' => 'Βλαεστε', # Megleno-Romanian (Greek script)
+               'ruq-latn' => 'Vlăheşte', # Megleno-Romanian (Latin script)
+               'rw' => 'Kinyarwanda', # Kinyarwanda, should possibly be Kinyarwandi
+               'sa' => 'संस्कृतम्', # Sanskrit
                'sah' => 'саха тыла', # Sakha
-               'sat' => 'Santali',     # Santali
-               'sc' => 'sardu',                # Sardinian
-               'scn' => 'sicilianu',   # Sicilian
-               'sco' => 'Scots',       # Scots
-               'sd' => 'سنڌي',     # Sindhi
-               'sdc' => 'Sassaresu',   # Sassarese
-               'sdh' => 'کوردی خوارگ',       # Southern Kurdish
-               'se' => 'sámegiella',  # Northern Sami
-               'sei' => 'Cmique Itom', # Seri
-               'ses' => 'Koyraboro Senni',     # Koyraboro Senni
-               'sg' => 'Sängö',              # Sango/Sangho
+               'sat' => 'Santali', # Santali
+               'sc' => 'sardu', # Sardinian
+               'scn' => 'sicilianu', # Sicilian
+               'sco' => 'Scots', # Scots
+               'sd' => 'سنڌي', # Sindhi
+               'sdc' => 'Sassaresu', # Sassarese
+               'sdh' => 'کوردی خوارگ', # Southern Kurdish
+               'se' => 'sámegiella', # Northern Sami
+               'sei' => 'Cmique Itom', # Seri
+               'ses' => 'Koyraboro Senni', # Koyraboro Senni
+               'sg' => 'Sängö', # Sango/Sangho
                'sgs' => 'žemaitėška', # Samogitian
                'sh' => 'srpskohrvatski / српскохрватски', # Serbocroatian
-               'shi' => 'Tašlḥiyt/ⵜⴰⵛⵍⵃⵉⵜ',    # Tachelhit (multiple scripts - defaults to Latin)
-               'shi-tfng' => 'ⵜⴰⵛⵍⵃⵉⵜ',    # Tachelhit (Tifinagh script)
-               'shi-latn' => 'Tašlḥiyt',    # Tachelhit (Latin script)
-               'si' => 'සිංහල',      # Sinhalese
-               'simple' => 'Simple English',   # Simple English
-               'sk' => 'slovenčina',  # Slovak
-               'sl' => 'slovenščina',        # Slovenian
-               'sli' => 'Schläsch',   # Lower Selisian
-               'sm' => 'Gagana Samoa', # Samoan
-               'sma' => 'Åarjelsaemien',      # Southern Sami
-               'sn' => 'chiShona',             # Shona
-               'so' => 'Soomaaliga',   # Somali
-               'sq' => 'shqip',                # Albanian
-               'sr' => 'српски / srpski',        # Serbian (multiple scripts - defaults to Cyrillic)
-               'sr-ec' => "српски (ћирилица)\xE2\x80\x8E",       # Serbian Cyrillic ekavian
-               'sr-el' => "srpski (latinica)\xE2\x80\x8E",     # Serbian Latin ekavian
-               'srn' => 'Sranantongo',         # Sranan Tongo
-               'ss' => 'SiSwati',              # Swati
-               'st' => 'Sesotho',              # Southern Sotho
-               'stq' => 'Seeltersk',           # Saterland Frisian
-               'su' => 'Basa Sunda',   # Sundanese
-               'sv' => 'svenska',              # Swedish
-               'sw' => 'Kiswahili',    # Swahili
-               'szl' => 'ślůnski',   # Silesian
-               'ta' => 'தமிழ்',      # Tamil
+               'shi' => 'Tašlḥiyt/ⵜⴰⵛⵍⵃⵉⵜ', # Tachelhit (multiple scripts - defaults to Latin)
+               'shi-tfng' => 'ⵜⴰⵛⵍⵃⵉⵜ', # Tachelhit (Tifinagh script)
+               'shi-latn' => 'Tašlḥiyt', # Tachelhit (Latin script)
+               'si' => 'සිංහල', # Sinhalese
+               'simple' => 'Simple English', # Simple English
+               'sk' => 'slovenčina', # Slovak
+               'sl' => 'slovenščina', # Slovenian
+               'sli' => 'Schläsch', # Lower Selisian
+               'sm' => 'Gagana Samoa', # Samoan
+               'sma' => 'Åarjelsaemien', # Southern Sami
+               'sn' => 'chiShona', # Shona
+               'so' => 'Soomaaliga', # Somali
+               'sq' => 'shqip', # Albanian
+               'sr' => 'српски / srpski', # Serbian (multiple scripts - defaults to Cyrillic)
+               'sr-ec' => "српски (ћирилица)\xE2\x80\x8E", # Serbian Cyrillic ekavian
+               'sr-el' => "srpski (latinica)\xE2\x80\x8E", # Serbian Latin ekavian
+               'srn' => 'Sranantongo', # Sranan Tongo
+               'ss' => 'SiSwati', # Swati
+               'st' => 'Sesotho', # Southern Sotho
+               'stq' => 'Seeltersk', # Saterland Frisian
+               'su' => 'Basa Sunda', # Sundanese
+               'sv' => 'svenska', # Swedish
+               'sw' => 'Kiswahili', # Swahili
+               'szl' => 'ślůnski', # Silesian
+               'ta' => 'தமிழ்', # Tamil
                'tcy' => 'ತುಳು', # Tulu
-               'te' => 'తెలుగు',   # Telugu
-               'tet' => 'tetun',       # Tetun
-               'tg' => 'тоҷикӣ', # Tajiki (falls back to tg-cyrl)
-               'tg-cyrl' => 'тоҷикӣ',    # Tajiki (Cyrllic script) (default)
-               'tg-latn' => 'tojikī', # Tajiki (Latin script)
-               'th' => 'ไทย',    # Thai
-               'ti' => 'ትግርኛ',         # Tigrinya
-               'tk' => 'Türkmençe',  # Turkmen
-               'tl' => 'Tagalog',              # Tagalog
-               'tly' => 'толышә зывон',     # Talysh
-               'tn' => 'Setswana',             # Setswana
-               'to' => 'lea faka-Tonga',               # Tonga (Tonga Islands)
-               'tokipona' => 'Toki Pona',      # Toki Pona
-               'tpi' => 'Tok Pisin',   # Tok Pisin
-               'tr' => 'Türkçe',     # Turkish
+               'te' => 'తెలుగు', # Telugu
+               'tet' => 'tetun', # Tetun
+               'tg' => 'тоҷикӣ', # Tajiki (falls back to tg-cyrl)
+               'tg-cyrl' => 'тоҷикӣ', # Tajiki (Cyrllic script) (default)
+               'tg-latn' => 'tojikī', # Tajiki (Latin script)
+               'th' => 'ไทย', # Thai
+               'ti' => 'ትግርኛ', # Tigrinya
+               'tk' => 'Türkmençe', # Turkmen
+               'tl' => 'Tagalog', # Tagalog
+               'tly' => 'толышә зывон', # Talysh
+               'tn' => 'Setswana', # Setswana
+               'to' => 'lea faka-Tonga', # Tonga (Tonga Islands)
+               'tokipona' => 'Toki Pona', # Toki Pona
+               'tpi' => 'Tok Pisin', # Tok Pisin
+               'tr' => 'Türkçe', # Turkish
                'tru' => 'Ṫuroyo', # Turoyo
-               'ts' => 'Xitsonga',             # Tsonga
-               'tt' => 'татарча/tatarça',      # Tatar (multiple scripts - defaults to Cyrillic)
-               'tt-cyrl' => 'татарча',  # Tatar (Cyrillic script) (default)
-               'tt-latn' => 'tatarça',        # Tatar (Latin script)
-               'tum' => 'chiTumbuka',  # Tumbuka
-               'tw' => 'Twi',                  # Twi, (FIXME!)
-               'ty' => 'reo tahiti',   # Tahitian
-               'tyv' => 'тыва дыл',     # Tyvan
-               'tzm' => 'ⵜⴰⵎⴰⵣⵉⵖⵜ',    # Tamazight
-               'udm' => 'удмурт',        # Udmurt
-               'ug' => 'ئۇيغۇرچە / Uyghurche', # Uyghur (multiple scripts - defaults to Arabic)
+               'ts' => 'Xitsonga', # Tsonga
+               'tt' => 'татарча/tatarça', # Tatar (multiple scripts - defaults to Cyrillic)
+               'tt-cyrl' => 'татарча', # Tatar (Cyrillic script) (default)
+               'tt-latn' => 'tatarça', # Tatar (Latin script)
+               'tum' => 'chiTumbuka', # Tumbuka
+               'tw' => 'Twi', # Twi, (FIXME!)
+               'ty' => 'reo tahiti', # Tahitian
+               'tyv' => 'тыва дыл', # Tyvan
+               'tzm' => 'ⵜⴰⵎⴰⵣⵉⵖⵜ', # Tamazight
+               'udm' => 'удмурт', # Udmurt
+               'ug' => 'ئۇيغۇرچە / Uyghurche', # Uyghur (multiple scripts - defaults to Arabic)
                'ug-arab' => 'ئۇيغۇرچە', # Uyghur (Arabic script) (default)
                'ug-latn' => 'Uyghurche', # Uyghur (Latin script)
-               'uk' => 'українська', # Ukrainian
-               'ur' => 'اردو',     # Urdu
-               'uz' => "oʻzbekcha/ўзбекча",    # Uzbek (multiple scripts - defaults to Latin)
-               'uz-cyrl' => "ўзбекча",  # Uzbek Cyrillic
-               'uz-latn' => "oʻzbekcha",      # Uzbek Latin (default)
-               've' => 'Tshivenda',            # Venda
-               'vec' => 'vèneto',     # Venetian
-               'vep' => 'vepsän kel’',      # Veps
-               'vi' => 'Tiếng Việt',       # Vietnamese
+               'uk' => 'українська', # Ukrainian
+               'ur' => 'اردو', # Urdu
+               'uz' => 'oʻzbekcha/ўзбекча', # Uzbek (multiple scripts - defaults to Latin)
+               'uz-cyrl' => 'ўзбекча', # Uzbek Cyrillic
+               'uz-latn' => 'oʻzbekcha', # Uzbek Latin (default)
+               've' => 'Tshivenda', # Venda
+               'vec' => 'vèneto', # Venetian
+               'vep' => 'vepsän kel’', # Veps
+               'vi' => 'Tiếng Việt', # Vietnamese
                'vls' => 'West-Vlams', # West Flemish
                'vmf' => 'Mainfränkisch', # Upper Franconian, Main-Franconian
-               'vo' => 'Volapük',     # Volapük
-               'vot' => 'Vaďďa',     # Vod/Votian
-               'vro' => 'Võro',    # Võro
-               'wa' => 'walon',                # Walloon
+               'vo' => 'Volapük', # Volapük
+               'vot' => 'Vaďďa', # Vod/Votian
+               'vro' => 'Võro', # Võro
+               'wa' => 'walon', # Walloon
                'war' => 'Winaray', # Waray-Waray
-               'wo' => 'Wolof',                # Wolof
-               'wuu' => '吴语',              # Wu Chinese
-               'xal' => 'хальмг',                # Kalmyk-Oirat
-               'xh' => 'isiXhosa',             # Xhosan
-               'xmf' => 'მარგალური', # Mingrelian
-               'yi' => 'ייִדיש', # Yiddish
-               'yo' => 'Yorùbá',     # Yoruba
-               'yue' => '粵語',      # Cantonese
-               'za' => 'Vahcuengh',    # Zhuang
-               'zea' => 'Zeêuws',     # Zeeuws/Zeaws
-               'zh' => '中文',                                               # (Zhōng Wén) - Chinese
-               'zh-classical' => '文言',                     # Classical Chinese/Literary Chinese -- (see bug 8217)
-               'zh-cn' => "中文(中国大陆)\xE2\x80\x8E",      # Chinese (PRC)
-               'zh-hans' => "中文(简体)\xE2\x80\x8E",  # Mandarin Chinese (Simplified Chinese script) (cmn-hans)
-               'zh-hant' => "中文(繁體)\xE2\x80\x8E",  # Mandarin Chinese (Traditional Chinese script) (cmn-hant)
-               'zh-hk' => "中文(香港)\xE2\x80\x8E",    # Chinese (Hong Kong)
-               'zh-min-nan' => 'Bân-lâm-gú',                                # Min-nan -- (see bug 8217)
-               'zh-mo' => "中文(澳門)\xE2\x80\x8E",    # Chinese (Macau)
-               'zh-my' => "中文(马来西亚)\xE2\x80\x8E",      # Chinese (Malaysia)
-               'zh-sg' => "中文(新加坡)\xE2\x80\x8E", # Chinese (Singapore)
-               'zh-tw' => "中文(台灣)\xE2\x80\x8E",    # Chinese (Taiwan)
-               'zh-yue' => '粵語',                                   # Cantonese -- (see bug 8217)
-               'zu' => 'isiZulu'               # Zulu
+               'wo' => 'Wolof', # Wolof
+               'wuu' => '吴语', # Wu Chinese
+               'xal' => 'хальмг', # Kalmyk-Oirat
+               'xh' => 'isiXhosa', # Xhosan
+               'xmf' => 'მარგალური', # Mingrelian
+               'yi' => 'ייִדיש', # Yiddish
+               'yo' => 'Yorùbá', # Yoruba
+               'yue' => '粵語', # Cantonese
+               'za' => 'Vahcuengh', # Zhuang
+               'zea' => 'Zeêuws', # Zeeuws/Zeaws
+               'zh' => '中文', # (Zhōng Wén) - Chinese
+               'zh-classical' => '文言', # Classical Chinese/Literary Chinese -- (see bug 8217)
+               'zh-cn' => "中文(中国大陆)\xE2\x80\x8E", # Chinese (PRC)
+               'zh-hans' => "中文(简体)\xE2\x80\x8E", # Mandarin Chinese (Simplified Chinese script) (cmn-hans)
+               'zh-hant' => "中文(繁體)\xE2\x80\x8E", # Mandarin Chinese (Traditional Chinese script) (cmn-hant)
+               'zh-hk' => "中文(香港)\xE2\x80\x8E", # Chinese (Hong Kong)
+               'zh-min-nan' => 'Bân-lâm-gú', # Min-nan -- (see bug 8217)
+               'zh-mo' => "中文(澳門)\xE2\x80\x8E", # Chinese (Macau)
+               'zh-my' => "中文(马来西亚)\xE2\x80\x8E", # Chinese (Malaysia)
+               'zh-sg' => "中文(新加坡)\xE2\x80\x8E", # Chinese (Singapore)
+               'zh-tw' => "中文(台灣)\xE2\x80\x8E", # Chinese (Taiwan)
+               'zh-yue' => '粵語', # Cantonese -- (see bug 8217)
+               'zu' => 'isiZulu' # Zulu
        ];
 }
index c3f3afc..882a694 100644 (file)
@@ -77,6 +77,7 @@
        "tog-watchdefault": "أضف الصفحات والملفات التي أعدلها إلى قائمة مراقبتي",
        "tog-watchmoves": "أضف الصفحات والملفات التي أنقلها إلى قائمة مراقبتي",
        "tog-watchdeletion": "أضف الصفحات والملفات التي أحذفها إلى قائمة مراقبتي",
+       "tog-watchuploads": "أضف الملفات الجديدة التي رفعتها إلى قائمة مراقبتي",
        "tog-watchrollback": "أضف إلى قائمة مراقبتي الصفحات التي كنت أجريت فيها استرجاعات",
        "tog-minordefault": "أشِّر كل التعديلات على أنها طفيفة مبدئيا",
        "tog-previewontop": "أظهر معاينة النص فوق صندوق التحرير",
        "title-invalid-utf8": "عنوان الصفحة المطلوب يحتوي سلسلة محارف UTF-8 غير صالحة.",
        "title-invalid-interwiki": "عنوان الصفحة المطلوب يتضمن وصلة لحلقة لغة وهو ما لا يمكن استخدامه في العناوين.",
        "title-invalid-talk-namespace": "عنوان الصفحة المطلوبة يشير إلى صفحة نقاش غير موجودة.",
-       "title-invalid-characters": "عنوان الصفحة المطلوب يتضمن محارف غير صالحة: \"$1\"",
+       "title-invalid-characters": "عنوان الصفحة المطلوب يتضمن رموزًا غير صالحة: \"$1\"",
        "title-invalid-leading-colon": "عنوان الصفحة المطلوب يتضمن فاصلة غير صالحة في بدايته.",
        "perfcached": "البيانات التالية مخبأة و قد لا تكون محدثة. {{PLURAL:$1||نتيجة واحدة|نتيجتان|$1 نتائج|$1 نتيجة}} على الأكثر {{PLURAL:$1||مخبّأة|مخبّأتان|مخبّأة}}.",
        "perfcachedts": "البيانات التالية مخزنة، وكان آخر تحديث لها في $1. العدد الأقصى للنتائج المخزنة هو {{PLURAL:$4||نتيجة واحدة|نتيجتان|$4 نتائج|$4 نتيجة}}.",
index 07317f0..c5f50c6 100644 (file)
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|protexó}} a $3 $4 [en cascada]",
        "logentry-protect-modify": "$1 {{GENDER:$2|camudó}} el nivel de protección de $3 $4",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|camudó}} el nivel de protección de $3 $4 [en cascada]",
-       "logentry-rights-rights": "$1 {{GENDER:$2|camudó}} la pertenencia a grupos de {{GENDER:$3|$3}} dende $4 a $5",
+       "logentry-rights-rights": "$1 {{GENDER:$2|camudó}} la pertenencia a grupos de {{GENDER:$6|$3}} dende $4 a $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|camudó}} la pertenencia a grupos de $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|promocionó}} automáticamente de $4 a $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|xubió}} $3",
index ab8571a..0a74b0a 100644 (file)
        "resetpass_forbidden": "رمزلر دَییشیلمز",
        "resetpass-no-info": "بو صحیفه‌نی دوغرو گؤردوگونوز اوچون سیستمه گیرمه‌لیسینیز.",
        "resetpass-submit-loggedin": "رمزی دَییشدیر",
-       "resetpass-submit-cancel": "Ù\84غÙ\88 Ø§Ø¦Øª",
+       "resetpass-submit-cancel": "Ù\88ازگئÚ\86",
        "resetpass-wrong-oldpass": "یانلیش گئچیجی یا ایندیکی رمز.\nاولا بیلر سیز باشاریلیق‌لا رمزینیزی دَییشمیسینیز یوخسا یئنی گئچرلی رمز ایسته‌میسینیز.",
        "resetpass-recycled": "لوطفا گیریش رمزینیزی ایندیکی اولمایان بیر ایری گیریش رمزینه دَییشین",
        "resetpass-temp-emailed": "سیز بیر کدلانمیش موقت ایمیل له گیریش ائدیب سیز.\nگیریشینیزه سون وئرمک اوچون یئنی دن بیر گیریش رمزی وئرمه لی سیز:",
        "feedback-bugcheck": "گؤزل! فقط لوطفاً باخین او [$1 تانینمیش خطالار]دان اولماسین.",
        "feedback-bugnew": "یوخلادیم. یئنی بیر خطا گؤندر",
        "feedback-bugornote": "بیر تکنیکی خطانی شرح وئرمگه آماده اولساز، لوطفاً [$1 بیر باگ بیلدیرین].\nاو اولماسا، بو آشاغیداکی ساده فورم‌دان ایستیفاده ائده بیلرسینیز. سیزین باخیشینیز، ایستیفاده‌چی آدینیزلا، «[$3 $2]» صحیفه‌سینه آرتیریلاجاق‌دیر.",
-       "feedback-cancel": "Ù\84غÙ\88 Ø§Ø¦Øª",
+       "feedback-cancel": "Ù\88ازگئÚ\86",
        "feedback-close": "اولدو",
        "feedback-error-title": "خطا",
        "feedback-error1": "خطا: API-دان تانینمامیش نتیجه",
index 9c4fdb0..e96e941 100644 (file)
        "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) ҡарарға",
        "searchmenu-exists": "'''Был вики-проектта «[[:$1]]» бите бар'''",
        "searchmenu-new": "{{PLURAL:$2|}}<strong>Был википроектта \"[[:$1]]\" бите булдырырға.</strong>",
-       "searchprofile-articles": "ЭÑ\81Ñ\82Ó\99лек Ð±Ð¸Ñ\82Ñ\82Ó\99Ñ\80е",
+       "searchprofile-articles": "Төп Ð±Ð¸Ñ\82Ñ\82Ó\99Ñ\80",
        "searchprofile-images": "Мультимедиа",
        "searchprofile-everything": "Барыһы",
        "searchprofile-advanced": "Киңәйтелгән",
        "grant-blockusers": "Иҫәп яҙмаларын блоклау һәм блоклауҙы асыу",
        "grant-createaccount": "Иҫәп яҙмаһын булдырырға",
        "grant-createeditmovepage": "Биттәрҙе булдырыу,мөхәррирләү һәм исемен үҙгәртеү",
-       "grant-delete": "Журналдағы биттәрҙе юйыу,төҙәтеү",
+       "grant-delete": "Журналдағы биттәрҙе юйыу, төҙәтеү",
        "grant-editinterface": "MediaWiki исеме арауығында төҙәтеү һәм ҡулланыусы CSS/JavaScript",
        "grant-editmycssjs": "CSS/JavaScript ҡулланыусы кодын төҙәтеү",
        "grant-editmyoptions": "Һеҙҙең ҡулланыусы көйләүҙәрен мөхәррирләү",
        "ipaddressorusername": "Ҡатнашыусының IP-адресы йәки исеме:",
        "ipbexpiry": "Тамамлана:",
        "ipbreason": "Сәбәп:",
-       "ipbreason-dropdown": "*Ғәҙәттәге бикләү сәбәптәре \n** Ялған мәғлүмәт өҫтәү\n** Биттәрҙең эстәлеген юйыу\n** Тышҡы сайттарға һылтанмалар спамлау\n** Биттәргә мәғәнәһеҙ яҙмалар (ҡый) өҫтәү \n** Ҡатнашыусыларға янау (эҙәрлекләү)\n** Бер нисә иҫәп яҙмаларын артығы менән булдырыу\n** Килешһеҙ иҫәп яҙмаһы",
+       "ipbreason-dropdown": "*Ғәҙәттәге бикләү сәбәптәре \n** Ялған мәғлүмәт өҫтәү\n** Биттәрҙең эстәлеген юйыу\n** Тышҡы сайттарға спам-һылтанмалар \n** Биттәргә мәғәнәһеҙ яҙмалар өҫтәү \n** Ҡатнашыусыларға янау (эҙәрлекләү)\n** Бер нисә иҫәп яҙмаһын булдырыу\n** Килешһеҙ иҫәп яҙмаһы",
        "ipb-hardblock": "Был IP-адрестан танылған ҡулланыусыларға мөхәррирләүҙе тыйырға",
        "ipbcreateaccount": "Яңы иҫәп яҙыуҙарын булдырыуҙы тыйыу",
        "ipbemailban": "Электрон почтаға хат ебәреүҙе тыйыу",
index e5056f2..92b5b38 100644 (file)
        "recentchangeslinked-page": "Назва старонкі:",
        "recentchangeslinked-to": "Замест гэтага паказваць зьмены на старонках, што спасылаюцца на гэтую старонку",
        "recentchanges-page-added-to-category": "[[:$1]] дададзеная да катэгорыі",
-       "recentchanges-page-added-to-category-bundled": "[[:$1]] і яшчэ [[Special:WhatLinksHere/$1|{{PLURAL:$2|$2 старонка была дададзеная|$2 старонкі былі дададзеныя|$2 старонак былі дададзеныя}}]] да катэгорыі",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] дададзеная да катэгорыі, [[Special:WhatLinksHere/$1|гэтая старонка ўключаная ў іншыя старонкі]]",
        "recentchanges-page-removed-from-category": "[[:$1]] выдаленая з катэгорыі",
-       "recentchanges-page-removed-from-category-bundled": "[[:$1]] і яшчэ [[Special:WhatLinksHere/$1|$2 {{PLURAL:$2|старонка была выдаленая|старонкі былі выдаленыя|старонак былі выдаленыя}}]] з катэгорыі",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] выдаленая з катэгорыі, [[Special:WhatLinksHere/$1|гэтая старонка ўключаная ў іншыя старонкі]]",
        "autochange-username": "Аўтаматычная зьмена MediaWiki",
        "upload": "Загрузіць файл",
        "uploadbtn": "Загрузіць файл",
        "apisandbox-dynamic-parameters-add-placeholder": "Назва парамэтру",
        "apisandbox-dynamic-error-exists": "Парамэтар з назвай «$1» ужо існуе.",
        "apisandbox-deprecated-parameters": "Састарэлыя парамэтры",
+       "apisandbox-submit-invalid-fields-title": "Некаторыя палі няслушныя",
+       "apisandbox-submit-invalid-fields-message": "Калі ласка, выпраўце пазначаныя палі і паспрабуйце яшчэ раз.",
        "apisandbox-results": "Вынікі",
+       "apisandbox-sending-request": "Адпраўка API-запыту…",
+       "apisandbox-loading-results": "Атрымліваем API-вынікі…",
+       "apisandbox-results-error": "Адбылася памылка пры загрузцы адказу на API-запыт: $1.",
        "apisandbox-request-url-label": "URL-адрас запыту:",
        "apisandbox-request-time": "Час запыту: {{PLURAL:$1|$1 мс}}",
        "booksources": "Крыніцы кніг",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|абараніў|абараніла}} $3 $4 [каскадна]",
        "logentry-protect-modify": "$1 {{GENDER:$2|зьмяніў узровень|зьмяніла ўзровень}} абароны для $3 $4",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|зьмяніў узровень|зьмяніла ўзровень}} абароны для $3 $4 [каскадна]",
-       "logentry-rights-rights": "$1 {{GENDER:$2|зьмяніў|зьмяніла}} прыналежнасьць {{GENDER:$3|$3}} да групы з $4 на $5",
+       "logentry-rights-rights": "$1 {{GENDER:$2|зьмяніў|зьмяніла}} прыналежнасьць {{GENDER:$6|$3}} да групы з $4 на $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$1|зьмяніў|зьмяніла}} прыналежнасьць $3 да групаў",
        "logentry-rights-autopromote": "$1 {{GENDER:$1|быў аўтаматычна пераведзены|была аўтаматычна пераведзеная}} з групы $4 ў $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|загрузіў|загрузіла}} $3",
index f14a77b..b6c5cf0 100644 (file)
        "filerevert-badversion": "Не съществува предишна локална версия на файла със зададения времеви отпечатък.",
        "filedelete": "Изтриване на $1",
        "filedelete-legend": "Изтриване на файл",
-       "filedelete-intro": "На път сте да изтриете '''[[Media:$1|$1]]''' заедно с цялата му редакционна история.",
+       "filedelete-intro": "На път сте да изтриете файла '''[[Media:$1|$1]]''' заедно с цялата му редакционна история.",
        "filedelete-intro-old": "Изтривате версията на '''[[Media:$1|$1]]''' към [$4 $3, $2].",
        "filedelete-comment": "Причина:",
        "filedelete-submit": "Изтриване",
        "delete-legend": "Изтриване",
        "historywarning": "<strong>Внимание:</strong> Страницата, която възнамерявате да изтриете, има история с приблизително $1 {{PLURAL:$1|редакция|редакции}}:",
        "historyaction-submit": "Показване",
-       "confirmdeletetext": "Ð\9dа Ð¿Ñ\8aÑ\82 Ñ\81Ñ\82е Ð±ÐµÐ·Ð²Ñ\8aзвÑ\80аÑ\82но Ð´Ð° Ð¸Ð·Ñ\82Ñ\80иеÑ\82е Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¸Ð»Ð¸ Ñ\84айл, Ð·Ð°ÐµÐ´Ð½Ð¾ Ñ\81 Ñ\86Ñ\8fлаÑ\82а Ð¿Ñ\80илежаÑ\89а Ñ\80едакÑ\86ионна Ð¸Ñ\81Ñ\82оÑ\80иÑ\8f, Ð¾Ñ\82 Ð±Ð°Ð·Ð°Ñ\82а Ð¾Ñ\82 Ð´Ð°Ð½Ð½Ð¸.\nПотвърдете, че искате това, разбирате последствията и правите това в съответствие с [[{{MediaWiki:Policy-url}}|линията на поведение]].",
+       "confirmdeletetext": "Ð\9dа Ð¿Ñ\8aÑ\82 Ñ\81Ñ\82е Ð´Ð° Ð¸Ð·Ñ\82Ñ\80иеÑ\82е Ñ\81Ñ\82Ñ\80аниÑ\86а Ð·Ð°ÐµÐ´Ð½Ð¾ Ñ\81 Ñ\86Ñ\8fлаÑ\82а Ñ\9d Ñ\80едакÑ\86ионна Ð¸Ñ\81Ñ\82оÑ\80иÑ\8f.\nПотвърдете, че искате това, разбирате последствията и правите това в съответствие с [[{{MediaWiki:Policy-url}}|линията на поведение]].",
        "actioncomplete": "Действието беше изпълнено",
        "actionfailed": "Действието не сполучи",
        "deletedtext": "Страницата „$1“ беше изтрита. Вижте $2 за запис на последните изтривания.",
index a54966c..2863646 100644 (file)
        "broken-file-category": "تاکدیمان گو خرابین لینکان بی فایلا",
        "about": "بی باره ها",
        "article": "محتوائین تاکدیم",
-       "newwindow": "(نوکین دَروازگی تا پاچ بیئت)",
+       "newwindow": "(نوکین دروازگئ تا پاچ بکنێت)",
        "cancel": "کنسیل",
        "moredotdotdot": "گیشتیر...",
        "morenotlisted": "ای لڑ\t لیست کامل نه اینت.",
        "wrongpassword": "ای پاسورد یا چیهر گالا که داخل کورته ایت صحیح نه اینت.\nمهربانی بکنیت، پدا امتحان بکینت.",
        "wrongpasswordempty": "ای پاسورد یا چیهر گالا که داخل کورته ایت ، خالی اینت.\nمهربانی پدا کوشش بکنیت.",
        "passwordtooshort": "پاسورد باید کم شه کم {{PLURAL:$1|۱ حرف|$1 حرف}} داشته بیئت.",
-       "passwordtoolong": "پاسورد نه باید گیشتیر شه {{PLURAL:$1|۱ حرف|$1 حرفا}}  داشته بیئت.",
+       "passwordtoolong": "پاسوردئ حروف نه‌باید شه {{PLURAL:$1|۱ کلمه|$1 کلمه}}‌ئا گیشتیر به‌ینت.",
        "password-name-match": "شمی چیهرگال یا پاسورد باید شه شمی کار زورکی ئین ناما فرق داشته بیئت.",
        "password-login-forbidden": "استفاده شه ای کار زوروکی ناما و شه ای چیهرگالا اجازه نه اینت.",
        "mailmypassword": "پاک کورتین پاسوردئ",
        "sitejspreview": "'''شه هوشا مه بَریت که شما فقط جاوااسکریپت ئی دیم دیست ئا گیندیت.'''\n'''ای جاوااسکریپت تا انون ذخیره نه بوته!'''",
        "updated": "(نوک بوته ئین)",
        "note": "'''نکته:'''",
-       "previewnote": "'''بئ Ù\87Ù\88Ø´ Ø¦Ø§ Ø¯Ø§Ø´ØªÙ\87 Ø¨Û\8cئت Ú©Ù\87 Ø§Û\8c Ù¾Ù\87 Ù\82ت Ø¯Û\8cÙ\85 Ø§Û\8cÙ\86ت.'''\nØ´Ù\85Û\8c ØªØºÛ\8cرات ØªØ§ Ø§Ù\86Ù\88Ù\86 Ø²Ù\87 Ø®Û\8cرÙ\87 Ù\86Ù\87 بوته انت!",
-       "continue-editing": "شوتین بی ایڈ\tیٹ\tی نیمگا",
+       "previewnote": "'''Ø´Ù\88Ù\85Û\8c Ù\87Ù\88شا Ø¨Û\8cت Ú©Ù\87 Ø§Û\8c Ù\81Ù\82Ø· Ø¯Û\8cÙ\85â\80\8cدÛ\8cست Ø§Û\8cÙ\86ت.'''\nÙ\88 Ø´Ù\88Ù\85Û\8c ØªØºÛ\8cر Ù\88 Ù¹Ú¯Ù\84 ØªØ§ Ø§Ù\86Ù\88Ù\86 Ø°Ø®Û\8cرÙ\87 Ù\86Ù\87â\80\8cبوته انت!",
+       "continue-editing": "شوتین په ایڈیٹ کورتینئ بخشا",
        "editing": "به $1 ئی دستکاری کورتینێ حالا",
        "creating": "$1 جۆڑ ئه بيت",
        "editingsection": "به $1 ئی دستکاری کورتینێ حالا (چونڑ)",
        "difference-title": "$1: نخسه ئانی مانجینا فرق",
        "difference-title-multipage": "$1 و $2:تاکدیمانئ مانجینی فرق",
        "difference-multipage": "(تاکدیمانی مانجینا فرق)",
-       "lineno": "$1‌ئین سطر:",
+       "lineno": "$1‌ین سطر:",
        "compareselectedversions": "انتخاب بوته ئین نخسه ئانی مقایسه",
        "showhideselectedversions": "انتخاب بوته ئین نخسه ئانی پدیداری تغیر",
        "editundo": "خنثی‌ کورتین",
        "shown-title": "نشان داتین $1 ئی {{PLURAL:$1|نتیجه|نتیجه}} بی هر تاکدیمی تا",
        "viewprevnext": "نشان داتین ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''تاکدیمئ گو «[[:$1]]» ئی ئنوانا بی ای ویکی تا وجود داریت .'''",
-       "searchmenu-new": "<strong> «[[:$1]]» ئی تاکدیما بی ای ویکی تا جوڑ بکنیت!</strong> {{PLURAL:$2|0=همچنان آ تاکدیما کی گو وتئ گشتینا ودئ کورته ایت، بگیندیت.|و همچنان وتئ گشتینئ ودئ بوته ئین نتیجه ئانا بگیندیت.}}",
+       "searchmenu-new": "<strong> «[[:$1]]» ئی تاکدیما بِه ای ویکی‌ئی تا جۆڑ بکنێت!</strong> {{PLURAL:$2|0=همیرنگ آ دیمان که گو وتي گشتینا ودي کورته‌ایت، بگیندێت .|و هم وتي گشتینئ نتیجه‌ئانه که ودي بوته انت، بگیندێت.}}",
        "searchprofile-articles": "تاکدیمانی محتوا",
        "searchprofile-images": "چینکه رسانه ئی",
        "searchprofile-everything": "موچی چیز",
        "search-showingresults": "{{PLURAL:$4|نتیجه ئان <strong>$1</strong> شه <strong>$3</strong>|نتیجه ئان <strong>$1 - $2</strong> شه <strong>$3</strong>}}",
        "search-nonefound": "نتیجه په چیزی که شما لوٹیته‌تیت به‌دست نه یات.",
        "powersearch-legend": "پیشرفته ئین گشتین",
-       "powersearch-ns": "گشتین بی نامئ فضائان:",
+       "powersearch-ns": "گشتین بِه نامئ فضا ئاني تا:",
        "powersearch-togglelabel": "چیک کورتین:",
        "powersearch-toggleall": "موچ",
        "powersearch-togglenone": "هیچ‌گوجام",
-       "powersearch-remember": "اتنخاب په دیگرین گشتین ئان بی خاتیر داشته بئیت",
+       "powersearch-remember": "انتخاب په دیگه گشتین‌ئاني خاتیرا شه شومی هوشا مه‌روت",
        "search-external": "خارجی ئین گشتین",
        "searchdisabled": "گشتین بی {{SITENAME}} ئی تا فعال نه اینت.\nموقتاً توانیت شه Google ئی گردگ ئا استفاده کنیت.\nتوجه کنیت که بدست آته ئین نتایج شه گردگا بی آ ممکینین طریقه ئا مه بیئنت.",
        "search-error": "یک خطایی بی گردگئ وختا رخ داته : $1",
        "sp-contributions-toponly": "فقط آخیرین نخسه ئانی  ایڈیٹ نشان داته بئنت",
        "sp-contributions-newonly": "فقط نشان داتین آ ایڈیٹانی که دیمی جۆڑ کورتینی هستنت",
        "sp-contributions-submit": "گشتین",
-       "whatlinkshere": "لینک بئ ای تاکدیما",
+       "whatlinkshere": "لینک په ای تاکدیما",
        "whatlinkshere-title": "تاکدیمان که گو  «$1» لینک دارنت",
        "whatlinkshere-page": "تاکدیم:",
        "linkshere": "جهلگین دیم بئ  '''[[:$1]]''' ئا لینک داریت:",
        "ipbemailban": "دیمگیری شه ایمیلی دیم داتینا",
        "ipbsubmit": "ای کار زوروک بسته بیئت",
        "ipbother": "دیگه وخت:",
-       "ipboptions": "Û² Ø³Ø§Ø¦Øª:2 hours,Û± Ø±Ù\88Ú\86:1 day,Û³ Ø±Ù\88Ú\86:3 days,Û± Ù\87پتگ:1 week,Û² Ù\87پتگ:2 weeks,Û± Ù\85اÙ\87:1 month,Û³ Ù\85اÙ\87:3 months,Û¶ Ù\85اÙ\87:6 months,Û± Ø³Ø§Ù\84:1 year,بÛ\8câ\80\8cپاÛ\8cاÙ\86:infinite",
+       "ipboptions": "Û² Ø³Ø§Ø¹Øª:2 hours,Û± Ø±Ù\88Ú\86:1 day,Û³ Ø±Ù\88Ú\86:3 days,Û± Ù\87پتÙ\87â\80\8cÚ¯:1 week,Û² Ù\87پتÙ\87â\80\8cÚ¯:2 weeks,Û± Ù\85اÙ\87:1 month,Û³ Ù\85اÙ\87:3 months,Û¶ Ù\85اÙ\87:6 months,Û± Ø³Ø§Ù\84:1 year,ابدÙ\8a:infinite",
        "ipbhidename": "چیهرداتین کار زوروکئ ناما شه ایڈیٹان و لیستا",
        "ipbwatchuser": "ای کار زوروکئ ، کارزوروکین و حبر وگپ ئی دیمانی دیستین",
        "ipb-disableusertalk": "دیمگیری کورتین شه ایڈیٹ کورتین ئا گپ و حبر ئی تاکدیمئ شه کار زوروکئ جیندئ نیمگا وختی که آ بلاک اینت",
index 754af74..44634f2 100644 (file)
@@ -72,6 +72,7 @@
        "tog-watchdefault": "Afegeix les pàgines que vagi editant a la llista de seguiment",
        "tog-watchmoves": "Afegeix les pàgines que reanomeni a la llista de seguiment",
        "tog-watchdeletion": "Afegeix les pàgines que elimini a la llista de seguiment",
+       "tog-watchuploads": "Afegeix els nous fitxers que pengi a la meva llista de seguiment",
        "tog-watchrollback": "Afegeix les pàgines on he realitzat una reversió a la llista de seguiment",
        "tog-minordefault": "Marca totes les contribucions com a edicions menors per defecte",
        "tog-previewontop": "Mostra una previsualització abans del quadre d'edició",
        "mypreferencesprotected": "No tens permís per editar les teves preferències.",
        "ns-specialprotected": "No es poden modificar les pàgines especials.",
        "titleprotected": "La creació d'aquesta pàgina està protegida per [[User:$1|$1]].\nEls seus motius han estat: <em>$2</em>.",
-       "filereadonlyerror": "No s'ha pogut modificar el fitxer «$1» perquè el repositori de fitxers \"$2\" està en mode només de lectura.\nL'administrador que l'ha bloquejat ha donat aquesta explicació: \"$3\".",
+       "filereadonlyerror": "No s'ha pogut modificar el fitxer «$1» perquè el repositori de fitxers «$2» està en mode només de lectura.\nL'administrador de sistema que l'ha bloquejat ha donat aquesta explicació: «$3».",
        "invalidtitle-knownnamespace": "El títol amb l'espai de noms «$2» i text «$3» no és vàlid",
        "invalidtitle-unknownnamespace": "Títol no vàlid amb espai de noms desconegut de número «$1» i text «$2»",
        "exception-nologin": "No has iniciat sessió",
        "noemail": "No hi ha cap adreça electrònica registrada de l'usuari «$1».",
        "noemailcreate": "Heu d’indicar una adreça electrònica vàlida.",
        "passwordsent": "S'ha enviat una nova contrasenya a l'adreça electrònica registrada per «$1».\nInicieu una sessió després que la rebeu.",
-       "blocked-mailpassword": "S'ha blocat la vostra adreça IP. Se us ha desactivat la funció de recuperació de contrasenya per a prevenir abusos.",
+       "blocked-mailpassword": "S'ha blocat la vostra adreça IP per a edicions. Per a prevenir abusos, s'ha desactivat la funció de recuperació de contrasenya des d'aquesta adreça IP.",
        "eauthentsent": "S'ha enviat un correu electrònic a la direcció especificada. Abans no s'enviï cap altre correu electrònic a aquesta adreça, cal verificar que és realment vostra. Per tant, cal que seguiu les instruccions presents en el correu electrònic que se us ha enviat.",
        "throttled-mailpassword": "Ja se us ha enviat un correu electrònic de reinicialització de contrasenya en {{PLURAL:$1|l'última hora|les últimes $1 hores}}.\nPer a prevenir abusos, només s'envia un correu electrònic de reinicialització de contrasenya cada {{PLURAL:$1|hora|$1 hores}}.",
        "mailerror": "S'ha produït un error en enviar el missatge: $1",
        "botpasswords-insert-failed": "No s'ha pogut afegir el nom del bot «$1». Ja hi estava afegit?",
        "botpasswords-update-failed": "No s'ha pogut actualitzar el nom del bot «$1». Hi estava suprimit?",
        "botpasswords-created-title": "S'ha creat la contrasenya del bot",
+       "botpasswords-created-body": "S'ha creat la contrasenya per al bot «$1» de l'usuari «$2».",
+       "botpasswords-updated-title": "Contrasenya de bot actualitzada",
        "resetpass_forbidden": "No poden canviar-se les contrasenyes",
        "resetpass-no-info": "Heu d'estar registrats en un compte per a poder accedir directament a aquesta pàgina.",
        "resetpass-submit-loggedin": "Canvia la contrasenya",
        "previewnote": "'''Recorda que això és només una previsualització.'''\nEls vostres canvis encara no s'han desat!",
        "continue-editing": "Aneu a l'àrea d'edició",
        "previewconflict": "Aquesta previsualització reflecteix, a l'àrea\nd'edició superior, el text tal com apareixerà si trieu desar-lo.",
-       "session_fail_preview": "'''No s'ha pogut processar la vostra modificació a causa d'una pèrdua de dades de la sessió.\nSi us plau, proveu-ho una altra vegada. Si continués sense funcionar, proveu de [[Special:UserLogout|finalitzar la sessió]] i torneu a iniciar-ne una.'''",
-       "session_fail_preview_html": "'''Ho sentim, no s'han pogut processar les vostres modificacions a causa d'una pèrdua de dades de la sessió.'''\n\n''Com que el projecte {{SITENAME}} té habilitat l'ús de codi HTML cru, s'ha amagat la previsualització com a prevenció contra atacs mitjançant codis JavaScript.''\n\n'''Si es tracta d'una contribució legítima, si us plau, intenteu-ho una altra vegada. Si continua havent-hi problemes, [[Special:UserLogout|finalitzeu la sessió]] i torneu a iniciar-ne una.'''",
+       "session_fail_preview": "Disculpes! No s'ha pogut processar la vostra modificació a causa d'una pèrdua de dades de la sessió.\n\nPot ser que s'hagi tancat la sessió. <strong>Comproveu si teniu la sessió iniciada i proveu-ho una altra vegada</strong>.\nSi continués sense funcionar, proveu de [[Special:UserLogout|finalitzar la sessió]] i torneu a iniciar-ne una. Comproveu que el vostre navegador permeti les galetes d'aquest lloc.",
+       "session_fail_preview_html": "Ho sentim, no s'han pogut processar les vostres modificacions a causa d'una pèrdua de dades de la sessió.\n\n<em>Com que el projecte {{SITENAME}} té habilitat l'ús de codi HTML cru, s'ha amagat la previsualització com a prevenció contra atacs mitjançant codis JavaScript.</em>\n\n<strong>Si es tracta d'una contribució legítima, si us plau, intenteu-ho una altra vegada.</strong> Si continua havent-hi problemes, [[Special:UserLogout|finalitzeu la sessió]] i torneu a iniciar-ne una. Comproveu que el vostre navegador permeti galetes d'aquest lloc.",
        "token_suffix_mismatch": "'''S'ha rebutjat la vostra modificació perquè el vostre client ha fet malbé els caràcters de puntuació en el testimoni d'edició. S'ha rebutjat la modificació per a evitar la corrupció del text de la pàgina. Açò passa a vegades quan s'utilitza un servei web de servidor intermediari anònim amb problemes.'''",
        "edit_form_incomplete": "'''Certes parts del formulari de modificació no han arribat al servidor, verifiqueu que les vostres modificacions estan intactes i proveu-ho de nou.'''",
        "editing": "Edició de la pàgina «$1»",
        "revdelete-submit": "Aplica a {{PLURAL:$1|la revisió seleccionada|les revisions seleccionades}}",
        "revdelete-success": "La visibilitat d'aquesta revisió s'ha actualitzat.",
        "revdelete-failure": "'''La visibilitat de la revisió no ha pogut actualitzar-se:'''\n$1",
-       "logdelete-success": "'''S'ha establert correctament la visibilitat d'aquest element.'''",
+       "logdelete-success": "S'ha establert la visibilitat del registre.",
        "logdelete-failure": "'''No s'ha pogut establir la visibilitat del registre:'''\n$1",
        "revdel-restore": "Canvia'n la visibilitat",
        "pagehist": "Historial",
        "recentchangeslinked-page": "Nom de la pàgina:",
        "recentchangeslinked-to": "Mostra els canvis de les pàgines enllaçades amb la pàgina donada",
        "recentchanges-page-added-to-category": "[[:$1]] afegida a la categoria",
-       "recentchanges-page-added-to-category-bundled": "[[:$1]] i [[Special:WhatLinksHere/$1|{{PLURAL:$2|una pàgina|$2 pàgines}}]] més afegides a la categoria",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] afegida a la categoria, [[Special:WhatLinksHere/$1|aquesta pàgina està inclosa en d'altres]]",
        "recentchanges-page-removed-from-category": "[[:$1]] treta de la categoria",
-       "recentchanges-page-removed-from-category-bundled": "[[:$1]] i {{PLURAL:$2|una pàgina|$2 pàgines}} més tretes de la categoria",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] treta de la categoria, [[Special:WhatLinksHere/$1|aquesta pàgina està inclosa en d'altres]]",
        "autochange-username": "Canvi automàtic del MediaWiki",
        "upload": "Carregueu un fitxer",
        "uploadbtn": "Carrega un fitxer",
        "uploaded-script-svg": "S’ha trobat l’element programable «$1» al fitxer SVG carregat.",
        "uploaded-hostile-svg": "S’ha trobat codi CSS no segur a l’element d’estil del fitxer SVG carregat.",
        "uploaded-event-handler-on-svg": "No es permet establir els atributs de gestió d’esdeveniments <code>$1=\"$2\"</code> en fitxers SVG.",
-       "uploaded-href-unsafe-target-svg": "S’ha trobat un element «href» amb un objectiu no segur <code>&lt;$1 $2=\"$3\"&gt;</code> al fitxer SVG carregat.",
+       "uploaded-href-unsafe-target-svg": "S’ha trobat un element «href» amb dades no segures: destinació URI <code>&lt;$1 $2=\"$3\"&gt;</code> en el fitxer SVG carregat.",
        "uploaded-animate-svg": "S'ha trobat l'etiqueta «animate» que pot estar canviant l'href mitjançant l'atribut <code>&lt;$1 $2=\"$3\"&gt;</code> en el fitxer SVG carregat.",
        "uploadscriptednamespace": "Aquest fitxer SVG conté un espai de noms \"$1\" no autoritzat",
        "uploadinvalidxml": "No s'ha pogut analitzar l'XML del fitxer carregat.",
        "upload-dialog-button-upload": "Carrega",
        "upload-form-label-infoform-title": "Detalls",
        "upload-form-label-infoform-name": "Nom",
+       "upload-form-label-infoform-name-tooltip": "Un únic títol descriptiu pel fitxer, que servirà com a nom del fitxer. Podeu utilitzar llenguatge senzill amb espais. No hi inclogueu l'extensió del fitxer.",
        "upload-form-label-infoform-description": "Descripció",
        "upload-form-label-usage-title": "Ús",
        "upload-form-label-usage-filename": "Nom del fitxer",
        "backend-fail-read": "No s'ha pogut llegir el fitxer $1.",
        "backend-fail-create": "No s'ha pogut crear el fitxer $1.",
        "backend-fail-maxsize": "No s'ha pogut escriure el fitxer $1 perquè és més gran que {{PLURAL:$2|un byte|$2 bytes}}.",
-       "backend-fail-readonly": "El rerefons d'emmagatzemament «$1» actualment només és de lectura. Es va donar el motiu: «$2»",
+       "backend-fail-readonly": "El suport d'emmagatzemament «$1» actualment només és de lectura. S'ha donat el motiu: <em>$2</em>",
        "backend-fail-synced": "El fitxer «$1» es troba en un estat inconsistent amb els rerefons d'emmagatzemament interns.",
        "backend-fail-connect": "No s'ha pogut connectar al fitxer de rerefons d'emmagatzemament «$1».",
        "backend-fail-internal": "S'ha produït un error desconegut en el fitxer de rerefons d'emmagatzemament «$1».",
        "uploadstash-badtoken": "No s'ha pogut realitzar l'acció, possiblement perquè han caducat la vostra identificació. Intenteu-ho de nou.",
        "uploadstash-errclear": "S'estan netejant els fitxers que han fallat.",
        "uploadstash-refresh": "Actualitza la llista de fitxers",
+       "uploadstash-thumbnail": "mostra una miniatura",
        "invalid-chunk-offset": "El desplaçament del fragment no és vàlid",
        "img-auth-accessdenied": "Accés denegat",
        "img-auth-nopathinfo": "Hi manca PATH_INFO.\nEl servidor no està configurat per passar aquesta informació.\nPot estar basat en CGI i no ser compatible amb img_auth.\nConsulteu https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization",
        "delete-toobig": "Aquesta pàgina té un historial d'edicions molt gran, amb més de $1 {{PLURAL:$1|canvi|canvis}}. L'eliminació d'aquestes pàgines està restringida per a prevenir que hi pugui haver un desajustament seriós de la base de dades de tot el projecte {{SITENAME}} per accident.",
        "delete-warning-toobig": "Aquesta pàgina té un historial d'edicions molt gran, amb més de $1 {{PLURAL:$1|canvi|canvis}}. Eliminar-la podria suposar un seriós desajustament de la base de dades de tot el projecte {{SITENAME}}; aneu amb compte abans dur a terme l'acció.",
        "deleteprotected": "No podeu eliminar la pàgina perquè ha estat protegida.",
-       "deleting-backlinks-warning": "'''Avís:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Altres pàgines]] enllacen o transclouen de la pàgina que esteu a punt de suprimir.",
+       "deleting-backlinks-warning": "<strong>Atenció:</strong>\n[[Special:WhatLinksHere/{{FULLPAGENAME}}|Altres pàgines]] enllacen aquí o inclouen la pàgina que esteu a punt de suprimir.",
        "rollback": "Reverteix edicions",
        "rollbacklink": "Reverteix",
        "rollbacklinkcount": "reverteix $1 {{PLURAL:$1|edició|edicions}}",
        "watchlistedit-raw-done": "S'ha actualitzat la vostra llista de seguiment.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 títol s'ha|$1 títols s'han}} afegit:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 títol s'ha|$1 títols s'han}} eliminat:",
-       "watchlistedit-clear-title": "S'ha netejat la llista de seguiment",
+       "watchlistedit-clear-title": "Neteja de la llista de seguiment",
        "watchlistedit-clear-legend": "Neteja la llista de seguiment",
        "watchlistedit-clear-explain": "Se suprimiran tots els títols de la vostra llista de seguiment",
        "watchlistedit-clear-titles": "Títols:",
index e0543f0..e00c4a5 100644 (file)
        "logentry-newusers-create2": "$1 {{GENDER:$2|кхоьллина}} декъашхочун дӀаяздапр $3",
        "logentry-newusers-byemail": "$1 {{GENDER:$2|кхоьллина}} декъашхочун дӀаяздар $3 пароль электронан поште яхьийтина",
        "logentry-newusers-autocreate": "Автоматически кхоьллина {{GENDER:$2|декъашхочун}} $1 дӀаяздар",
+       "logentry-protect-move_prot": "{{GENDER:$2|Декъашхо}} $1 $4 агӀона тӀера ларъяр $3 агӀона тӀе даьккхина",
        "logentry-protect-unprotect": "$1 — $3 тӀера ларъяр {{GENDER:$2|дӀадаьккхина}}",
        "logentry-protect-protect": "$1 {{GENDER:$2|ларйина}} $3 $4",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|ларйина}} $3 $4 [каскадан]",
index 1a205ff..1fa3148 100644 (file)
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|zamknul|zamknula}} stránku $3 $4 [kaskádovým zámkem]",
        "logentry-protect-modify": "$1 {{GENDER:$2|změnil|změnila}} úroveň ochrany stránky $3 $4",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|změnil|změnila}} úroveň ochrany stránky $3 $4 [kaskádový zámek]",
-       "logentry-rights-rights": "$1 {{GENDER:$2|změnil|změnila}} členství {{GENDER:$3|uživatele|uživatelky}} $3 ve skupinách z $4 na $5",
+       "logentry-rights-rights": "$1 {{GENDER:$2|změnil|změnila}} členství {{GENDER:$6|uživatele|uživatelky}} $3 ve skupinách z $4 na $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|změnil|změnila}} členství $3 ve skupinách",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|byl automaticky povýšen|byla automaticky povýšena}} z $4 na $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|načetl|načetla}} $3",
index 2b45b47..454c0b1 100644 (file)
@@ -16,7 +16,8 @@
                        "Macofe",
                        "Matma Rex",
                        "Diafol",
-                       "Nemo bis"
+                       "Nemo bis",
+                       "Dafyddt"
                ]
        },
        "tog-underline": "Tanlinellu cysylltiadau:",
        "specialloguserlabel": "Gwneuthurwr:",
        "speciallogtitlelabel": "Targed (teitl neu {{ns:user}}:username ar gyfer y defnyddiwr):",
        "log": "Logiau",
+       "logeventslist-submit": "Dangos",
        "all-logs-page": "Pob lòg cyhoeddus",
        "alllogstext": "Mae pob cofnod yn holl logiau {{SITENAME}} wedi cael eu rhestru yma.\nGallwch weld chwiliad mwy penodol trwy ddewis y math o lòg, enw'r defnyddiwr, neu'r dudalen benodedig.\nSylwer bod llythrennau mawr neu fach o bwys i'r chwiliad.",
        "logempty": "Does dim eitemau yn cyfateb yn y lòg.",
        "cachedspecial-viewing-cached-ts": "Rydych yn edrych ar fersiwn o'r dudalen a roddwyd ar gadw mewn celc. Gall fod yn wahanol i'r fersiwn cyfoes.",
        "cachedspecial-refresh-now": "Gweld y diwygiad diweddaraf.",
        "categories": "Categorïau",
+       "categories-submit": "Dangos",
        "categoriespagetext": "Mae'r {{PLURAL:$1|categori|categori|categorïau|categorïau|categorïau|categorïau}} isod yn cynnwys tudalennau neu ffeiliau amlgyfrwng.\nNi ddangosir [[Special:UnusedCategories|categorïau gwag]] yma.\nGweler hefyd [[Special:WantedCategories|categorïau sydd eu hangen]].",
        "categoriesfrom": "Dangos categorïau gan ddechrau gyda:",
        "deletedcontributions": "Cyfraniadau defnyddiwr i dudalennau dilëedig",
        "wlheader-showupdated": "Mae tudalennau sydd wedi newid ers i chi eu gweld ddiwethaf wedi'u '''hamlygu'''.",
        "wlnote": "Isod, {{PLURAL:$1|yw'r golygiad diweddaraf |yw'r golygiadau diweddaraf <strong>$1</strong> changes}} yn y {{PLURAL:$2|hour|<strong>$2</strong> awr}}, fel ag y mae ar $3, $4.",
        "wlshowlast": "Dangoser newidiadau'r $1 awr ddiwethaf neu'r $2 {{PLURAL:$2|diwrnod|diwrnod|ddiwrnod|diwrnod|diwrnod|diwrnod}} diwethaf neu'r newidiadau.",
+       "watchlist-hide": "Cuddio",
+       "watchlist-submit": "Dangos",
        "wlshowtime": "Dangos y diwethaf:",
        "wlshowhideminor": "golygiadau bychan",
        "wlshowhidebots": "botiau",
        "delete-confirm": "Dileu \"$1\"",
        "delete-legend": "Dileu",
        "historywarning": "<strong>Rhybudd:</strong> bu tua $1 {{PLURAL:$1|golygiad|golygiad|olygiad|golygiad|golygiad|o olygiadau}} yn hanes y dudalen rydych ar fin ei dileu:",
+       "historyaction-submit": "Dangos",
        "confirmdeletetext": "Rydych chi ar fin dileu tudalen neu ddelwedd, ynghŷd â'i hanes, o'r data-bas, a hynny'n barhaol.\nOs gwelwch yn dda, cadarnhewch eich bod chi wir yn bwriadu gwneud hyn, eich bod yn deall y canlyniadau, ac yn ei wneud yn ôl [[{{MediaWiki:Policy-url}}|polisïau {{SITENAME}}]].",
        "actioncomplete": "Wedi cwblhau'r weithred",
        "actionfailed": "Methodd y weithred",
index 77e9418..2a80b92 100644 (file)
        "botpasswords-label-delete": "Slet",
        "botpasswords-label-resetpassword": "Nulstil adgangskode",
        "botpasswords-label-grants": "Tilgængelige bevillinger:",
+       "botpasswords-label-restrictions": "Begrænsninger for brug:",
        "resetpass_forbidden": "Adgangskoder kan ikke ændres",
        "resetpass-no-info": "Du skal være logget på for at komme direkte til denne side.",
        "resetpass-submit-loggedin": "Skift adgangskode",
        "mergehistory-empty": "Der findes ingen sammenflettelige udgaver",
        "mergehistory-done": "$3 {{PLURAL:$3|version|versioner}} af $1 blev flettet sammen med [[:$2]].",
        "mergehistory-fail": "Sammenfletningen kunne ikke gennemføres. Vær venlig at kontrollere sidenavne og tidsafgrænsning.",
+       "mergehistory-fail-bad-timestamp": "Tidsangivelsen er ugyldig.",
        "mergehistory-fail-toobig": "Ude af stand til at flette historiken sammen, fordi flere end grænsen på $1 {{PLURAL:$1|version|versioner}} ville blive flyttet.",
        "mergehistory-no-source": "Kildesiden $1 findes ikke.",
        "mergehistory-no-destination": "Destinationssiden $1 findes ikke.",
        "userrights": "Håndtering af brugerrettigheder",
        "userrights-lookup-user": "Administrér brugergrupper",
        "userrights-user-editname": "Skriv et brugernavn:",
-       "editusergroup": "Redigér brugergrupper",
+       "editusergroup": "Redigér {{GENDER:$1|brugergrupper}}",
        "editinguser": "Ændrer brugerrettigheder for {{GENDER:$1|brugeren}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Redigér brugergrupper",
-       "saveusergroups": "Gem brugergrupper",
+       "saveusergroups": "Gem {{GENDER:$1|brugergrupper}}",
        "userrights-groupsmember": "Medlem af:",
        "userrights-groupsmember-auto": "Implicit medlem af:",
        "userrights-groups-help": "Du kan ændre denne brugers gruppemedlemsskaber:\n* Et markeret afkrydsningsfelt betyder at brugeren er medlen af den pågældende gruppe.\n* Et umarkeret felt betyder at brugeren ikke er medlem af gruppen.\n* En * betyder at du ikke kan fravælge gruppen, når den først er tilføjet og omvendt.",
        "upload-dialog-button-done": "Færdig",
        "upload-dialog-button-save": "Gem",
        "upload-dialog-button-upload": "Læg op",
+       "upload-form-label-infoform-title": "Detaljer",
        "upload-form-label-infoform-name": "Navn",
        "upload-form-label-infoform-description": "Beskrivelse",
        "upload-form-label-usage-filename": "Filnavn",
        "mostrevisions": "Sider med de fleste ændringer",
        "prefixindex": "Alle sider der begynder med",
        "prefixindex-namespace": "Alle sider (i navnerummet $1) der begynder med",
+       "prefixindex-submit": "Vis",
        "prefixindex-strip": "Strip præfiks i listen",
        "shortpages": "Korte sider",
        "longpages": "Lange sider",
        "usereditcount": "{{PLURAL:$1|én redigering|$1 redigeringer}}",
        "usercreated": "{{GENDER:$3|Oprettet}} den $1 $2",
        "newpages": "Nyeste sider",
+       "newpages-submit": "Vis",
        "newpages-username": "Brugernavn:",
        "ancientpages": "Ældste sider",
        "move": "Flyt",
        "apisandbox-intro": "Brug denne side til at eksperimentere med '''MediaWiki web service API'''.\nVi henviser til [//www.mediawiki.org/wiki/API:Main_page dokumentationen af API] for yderligere oplysninger om brug af API.  Eksempel: [//www.mediawiki.org/wiki/API#A_simple_example få indholdet af en forside]. Vælg en handling at se flere eksempler.\n\nBemærk, at selv om dette er en sandkasse, vil handlinger du udfører på denne side redigere wikien.",
        "apisandbox-submit": "Lav forespørgsel",
        "apisandbox-reset": "Ryd",
-       "apisandbox-examples": "Eksempel",
-       "apisandbox-results": "Resultat",
+       "apisandbox-examples": "Eksempler",
+       "apisandbox-results": "Resultater",
        "apisandbox-request-url-label": "Forespurgt URL:",
-       "apisandbox-request-time": "Forespørgselstid: $1",
+       "apisandbox-request-time": "Forespørgselstid: {{PLURAL:$1|$1 ms}}",
        "booksources": "Bogkilder",
        "booksources-search-legend": "Søgning efter bøger",
        "booksources-search": "Søg",
        "rollback-success": "Ændringerne fra $1 er fjernet,\nog den seneste version af $2 er gendannet.",
        "sessionfailure-title": "Sessionsfejl",
        "sessionfailure": "Der lader til at være et problem med din loginsession; denne handling blev annulleret som en sikkerhedsforanstaltning mod kapring af sessionen. Tryk på \"tilbage\"-knappen og genindlæs den side du kom fra, og prøv dernæst igen.",
+       "changecontentmodel-title-label": "Sidetitel",
+       "changecontentmodel-reason-label": "Begrundelse:",
        "protectlogpage": "Skrivebeskyttelseslog",
        "protectlogtext": "Herunder er en liste over ændringer til sidebeskyttelser.\nSe [[Special:ProtectedPages|listen over beskyttede sider]] for listen over sidebeskyttelser, der er i kraft i øjeblikket.",
        "protectedarticle": "[[$1]] beskyttet",
        "movenotallowedfile": "Du har ikke tilladelse til at flytte filer.",
        "cant-move-user-page": "Du har ikke tilladelse til at flytte brugersider (bortset fra undersider).",
        "cant-move-to-user-page": "Du har ikke tilladelse til at flytte brugersider (bortset fra til brugerundersider).",
-       "newtitle": "Til ny titel",
+       "newtitle": "Ny titel:",
        "move-watch": "Overvåg siden",
        "movepagebtn": "Flyt side",
        "pagemovedsub": "Flytning gennemført",
        "version-libraries": "Installerede biblioteker",
        "version-libraries-library": "Bibliotek",
        "version-libraries-version": "Version",
+       "version-libraries-license": "Licens",
+       "version-libraries-description": "Beskrivelse",
+       "version-libraries-authors": "Forfattere",
        "redirect": "Omdirigering pga. fil, bruger-, side- eller udgave-ID",
        "redirect-summary": "Denne specialside omdirigerer til en fil (hvis filnavnet er angivet), en side (hvis udgave ID'et eller side ID'et er angivet) eller en brugerside (hvis et numerisk brugernummer er angivet). Eksempler på brug: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]],[[{{#Special:Redirect}}/revision/328429]] eller [[{{#Special:Redirect}}/user/101]].",
        "redirect-submit": "Vis",
        "tags-activate-submit": "Aktiver",
        "tags-deactivate-reason": "Årsag:",
        "tags-deactivate-submit": "Deaktiver",
-       "tags-edit-existing-tags-none": "\"Ingen\"",
+       "tags-edit-existing-tags-none": "<em>Ingen</em>",
        "tags-edit-reason": "Årsag:",
        "comparepages": "Sammenlign sider",
        "compare-page1": "Side 1",
        "feedback-subject": "Emne:",
        "feedback-submit": "Send",
        "feedback-thanks": "Tak! Dine tilbagemeldinger er blevet noteret på siden \"[$2 $1]\".",
+       "feedback-thanks-title": "Tak!",
        "searchsuggest-search": "Søg",
        "searchsuggest-containing": "indeholder...",
        "api-error-badaccess-groups": "Du har ikke tilladelse til at overføre filer til denne wiki.",
        "limitreport-ppvisitednodes": "Antal nodebesøg for preprocessor",
        "limitreport-ppgeneratednodes": "Antal noder genereret af preprocessor",
        "limitreport-postexpandincludesize": "Inkluderet størrelse efter udvidelse",
+       "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|byte|bytes}}",
        "limitreport-templateargumentsize": "Skabelon argumentstørrelse",
+       "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|byte|bytes}}",
        "limitreport-expansiondepth": "Største udvidelsesdybde",
        "limitreport-expensivefunctioncount": "Antal dyre parserfunktioner",
        "expandtemplates": "Udfold skabeloner",
        "pagelang-select-lang": "Vælg sprog",
        "right-pagelang": "Ændre sidesproget",
        "mediastatistics": "Mediestatistik",
+       "mediastatistics-table-mimetype": "MIME-type",
+       "mediastatistics-table-extensions": "Mulige filendelser",
        "mediastatistics-table-count": "Antal filer",
        "mediastatistics-table-totalbytes": "Samlet størrelse",
        "mediastatistics-header-unknown": "Ukendt",
        "mediastatistics-header-text": "Tekstformat",
        "mediastatistics-header-executable": "Kørbare filer",
        "mediastatistics-header-archive": "Komprimerede formater",
+       "mediastatistics-header-total": "Alle filer",
        "json-error-state-mismatch": "Ugyldig eller fejlbehæftet JSON",
        "json-error-syntax": "Syntaksfejl",
        "special-characters-group-latin": "Latin",
index 0b1a874..5d81418 100644 (file)
        "hidden-category-category": "Versteckte Kategorien",
        "category-subcat-count": "{{PLURAL:$2|Diese Kategorie enthält folgende Unterkategorie:|{{PLURAL:$1|Folgende Unterkategorie ist eine von insgesamt $2 Unterkategorien in dieser Kategorie:|Es werden $1 von insgesamt $2 Unterkategorien in dieser Kategorie angezeigt:}}}}",
        "category-subcat-count-limited": "Diese Kategorie enthält folgende {{PLURAL:$1|Unterkategorie|$1 Unterkategorien}}:",
-       "category-article-count": "{{PLURAL:$2|Diese Kategorie enthält folgende Seite:|{{PLURAL:$1|Folgende Seite ist eine von insgesamt $2 Seiten in dieser Kategorie:|Es werden $1 von insgesamt $2 Seiten in dieser Kategorie angezeigt:}}}}",
+       "category-article-count": "{{PLURAL:$2|Diese Kategorie enthält folgende Seite:|{{PLURAL:$1|Folgende Seite ist eine von insgesamt $2 Seiten in dieser Kategorie:|Es werden $1 von insgesamt $2 Seiten in dieser Kategorie angezeigt.}}}}",
        "category-article-count-limited": "Folgende {{PLURAL:$1|Seite ist|$1 Seiten sind}} in dieser Kategorie enthalten:",
        "category-file-count": "{{PLURAL:$2|Diese Kategorie enthält folgende Datei:|{{PLURAL:$1|Folgende Datei ist eine von insgesamt $2 Dateien in dieser Kategorie:|Es werden $1 von insgesamt $2 Dateien in dieser Kategorie angezeigt:}}}}",
        "category-file-count-limited": "Folgende {{PLURAL:$1|Datei ist|$1 Dateien sind}} in dieser Kategorie enthalten:",
        "userpage-userdoesnotexist": "Das Benutzerkonto „<nowiki>$1</nowiki>“ ist nicht vorhanden. Bitte prüfe, ob du diese Seite wirklich erstellen/bearbeiten willst.",
        "userpage-userdoesnotexist-view": "Das Benutzerkonto „$1“ ist nicht vorhanden.",
        "blocked-notice-logextract": "{{GENDER:$1|Dieser Benutzer|Diese Benutzerin}} ist zurzeit gesperrt.\nZur Information folgt ein aktueller Auszug aus dem Benutzersperr-Logbuch:",
-       "clearyourcache": "'''Hinweis:''' Leere nach dem Speichern den Browser-Cache, um die Änderungen sehen zu können.\n* '''Firefox/Safari:''' ''Umschalttaste'' drücken und gleichzeitig ''Aktualisieren'' anklicken oder entweder ''Strg+F5'' oder ''Strg+R'' (''⌘+R'' auf dem Mac) drücken\n* '''Google Chrome:''' ''Umschalttaste+Strg+R'' (''⌘+Umschalttaste+R'' auf dem Mac) drücken\n* '''Internet Explorer:''' ''Strg+F5'' drücken oder ''Strg'' drücken und gleichzeitig ''Aktualisieren'' anklicken\n* '''Opera:''' ''Extras → Internetspuren löschen … → Individuelle Auswahl → Den kompletten Cache löschen''",
+       "clearyourcache": "<strong>Hinweis:</strong> Leere nach dem Speichern den Browser-Cache, um die Änderungen sehen zu können.\n* <strong>Firefox/Safari:</strong> <em>Umschalttaste</em> drücken und gleichzeitig <em>Aktualisieren</em> anklicken oder entweder <em>Strg+F5</em> oder <em>Strg+R</em> (<em>⌘+R</em> auf dem Mac) drücken\n* <strong>Google Chrome:</strong> <em>Umschalttaste+Strg+R</em> (<em>⌘+Umschalttaste+R</em> auf dem Mac) drücken\n* <strong>Internet Explorer:</strong> <em>Strg+F5</em> drücken oder <em>Strg</em> drücken und gleichzeitig <em>Aktualisieren</em> anklicken\n* <strong>Opera:</strong> Gehe zu <em>Menü → Einstellungen</em> (<em>Opera → Einstellungen</em> auf dem Mac) und dann auf <em>Datenschutz & Sicherheit → Browserdaten löschen → Gespeicherte Bilder und Dateien</em>.",
        "usercssyoucanpreview": "'''Tipp:''' Benutze den „{{int:showpreview}}“-Button, um dein neues CSS vor dem Speichern zu testen.",
        "userjsyoucanpreview": "'''Tipp:''' Benutze den „{{int:showpreview}}“-Button, um dein neues JavaScript vor dem Speichern zu testen.",
        "usercsspreview": "'''Beachte, dass du nur eine Vorschau deines Benutzer-CSS betrachtest.'''\n'''Es wurde noch nicht gespeichert!'''",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|schützte}} die Seite $3 $4 [kaskadierend]",
        "logentry-protect-modify": "$1 {{GENDER:$2|änderte}} den Schutzstatus der Seite $3 $4",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|änderte}} den Schutzstatus der Seite $3 $4 [kaskadierend]",
-       "logentry-rights-rights": "$1 {{GENDER:$2|änderte}} die Gruppenzugehörigkeit für {{GENDER:$3|$3}} von $4 zu $5",
+       "logentry-rights-rights": "$1 {{GENDER:$2|änderte}} die Gruppenzugehörigkeit für {{GENDER:$6|$3}} von $4 zu $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|änderte}} die Gruppenzugehörigkeit für $3",
        "logentry-rights-autopromote": "$1 wurde automatisch von $4 zu $5 {{GENDER:$2|zugeordnet}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|lud}} $3 hoch",
index 9aac75d..8f1b6fe 100644 (file)
        "wrongpassword": "Parola ğeleta. Rêna / fına bıcerrebne .",
        "wrongpasswordempty": "Parola tola, venga. tekrar bınuse.",
        "passwordtooshort": "Paroley gani tewr senık be {{PLURAL:$1|1 karakter|$1 karakteran}} derg bê.",
+       "passwordtoolong": "Dergeya parolay en cêrek ra do {{PLURAL:$1|1 karakter|$1 karakter}} bo",
        "password-name-match": "Parola u nameyê şıma gani zeypê (seypê) nêbo.",
        "password-login-forbidden": "Nameyê nê karberi û gurenayışê parola biyo qedeğen.",
        "mailmypassword": "Parola reset ke",
        "undo-summary-username-hidden": "Rewizyona veri $1'i hewada",
        "cantcreateaccounttitle": "Nêşenay hesab rakerê",
        "cantcreateaccount-text": "Hesabvıraştışê na IP adrese ('''$1''') terefê [[User:$3|$3]] kılit biyo.\n\nSebebo ke terefê $3 ra diyao ''$2''",
-       "viewpagelogs": "Heqa na pele de qeydan bıvêne",
+       "viewpagelogs": "Heqdê na perer qeydan bıvin",
        "nohistory": "Verê vurnayışanê na pele çıniyo.",
        "currentrev": "Çımraviyarnayışo rocane",
        "currentrev-asof": "Revizyonanê peniyan, tarixê $1",
        "rcshowhidebots": "Botan $1",
        "rcshowhidebots-show": "Bımocne",
        "rcshowhidebots-hide": "Bınımne",
-       "rcshowhideliu": "Karberanê qeydbiyayeyan $1",
+       "rcshowhideliu": "Karberanê qeydınan $1",
        "rcshowhideliu-show": "Bımocne",
        "rcshowhideliu-hide": "Bınımne",
        "rcshowhideanons": "Karberanê bênameyan $1",
        "rcshowhidemine": "Vurnayışanê mı $1",
        "rcshowhidemine-show": "Bımocne",
        "rcshowhidemine-hide": "Bınımne",
+       "rcshowhidecategorization": "kategorizasyona perer $1",
        "rcshowhidecategorization-show": "Bımocne",
        "rcshowhidecategorization-hide": "Bınımne",
        "rclinks": "Peyniya $2 rocan de $1 vurnayışan bımocne <br />$3",
        "wlshowhideanons": "karberê anonimi",
        "wlshowhidepatr": "vurnayışê pawıteyi",
        "wlshowhidemine": "vurnayışê mı",
+       "wlshowhidecategorization": "Kategorizasyona perer",
        "watchlist-options": "Tercihê liste da seyri",
        "watching": "Seyr ke...",
        "unwatching": "Seyr meke...",
        "changecontentmodel-title-label": "Sernameyê pele",
        "changecontentmodel-model-label": "Modelê zerrekiyo newe",
        "changecontentmodel-reason-label": "Sebeb:",
+       "log-name-contentmodel": "Qeydé vurnayışan de modela zerreki",
        "protectlogpage": "Qeydê staryayan",
        "protectlogtext": "Şıma vurnayişê gırewtışê/wedarnayışê pawıtişi vinenê.\nQey malumato ziyede [[Special:ProtectedPages|Peleyê ke star biye]] bewni rê êna .",
        "protectedarticle": "\"[[$1]]\" kılit biyo",
        "undelete": "Peleyê ke besterneyayê enê bımocnê",
        "undeletepage": "bıewn revizyonê peli yê hewn a şiyayeyan u tepiya biyar",
        "undeletepagetitle": "'''pelo [[:$1|$1]] cêrın, wayirê revizyonê hewn a şiyayeyan o'''.",
-       "viewdeletedpage": "bıewn pelê hewn a şiyayeyani",
+       "viewdeletedpage": "Bıewni perandê besternayan",
        "undeletepagetext": "{{PLURAL:$1|pelo|$1 pelo}} cerın hewn a şiyo labele hema zi arşiv de yo u tepiya geriyeno.\nArşiv daimi pak beno.",
        "undelete-fieldset-title": "revizyonan tepiya bar ker",
        "undeleteextrahelp": "Qey ardışê pel u verê pelani tuşê '''tepiya biya!'''yi bıtıknê. qey ciya ciya ardışê verê pelani zi qutiye tesdiqi nişane kerê u tuşê '''tepiya biya!'''yi bıtıknê '''''{{int:undeletebtn}}'''''.. qey hewn a kerdışê qutiya tesdiqan u qey sıfır kerdışê cayê sebebani zi tuşê '''agêr caverd/aça ker'''i bıtıknê '''''{{int:undeletebtn}}'''''..",
        "import-options-wrong": "{{PLURAL:$2|Weçenego|Weçenego}} xerpiyaye: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "Sernuştey ena pela reçey cı raverde niyo.",
        "import-rootpage-nosubpage": "Qan de bınnaman reçe de \"$1\" re mısade nedano.",
-       "importlogpage": "Defterê seyırio idxal",
+       "importlogpage": "Qeydé raverdayışi",
        "importlogpagetext": "wiki yo ke nişane biyo tera kırıştışê zerredayişi nêbeno.",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|çımraviyarnayış|çımraviyarnayışi}}",
        "import-logentry-interwiki-detail": "$2 ra $1 {{PLURAL:$1|çımraviyarnayış|çımraviyarnayışi}}",
        "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",
        "deletedrevision": "Veriyono kihan $1 wederna",
        "filedeleteerror-short": "Wedarnayişê dosya de ğelati esto: $1",
        "filedeleteerror-long": "Eka dosya wedarnayişi de ğeleti biyê:\n\n$1",
        "logentry-rights-rights-legacy": "$1 qandê $3 rê ezayiya grube {{GENDER:$2|vuriye}}",
        "logentry-rights-autopromote": "$1 otomatikmen $4 ra $5 {{GENDER:$2|terfi bi}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|bar kerd}} $3",
+       "log-name-managetags": "Qeydé idareyê etiketi",
+       "log-name-tag": "Qeydé etiketi",
        "rightsnone": "(çıniyo)",
        "revdelete-summary": "kılmvatışê vuriyayişi",
        "feedback-adding": "Pela rê peyxeberdar defêno...",
index f2cdbe2..d76825c 100644 (file)
        "minoredit": "This is a minor edit",
        "watchthis": "Watch this page",
        "savearticle": "Save page",
+       "publishpage": "Publish page",
        "preview": "Preview",
        "showpreview": "Show preview",
        "showdiff": "Show changes",
        "userpage-userdoesnotexist": "User account \"$1\" is not registered.\nPlease check if you want to create/edit this page.",
        "userpage-userdoesnotexist-view": "User account \"$1\" is not registered.",
        "blocked-notice-logextract": "This user is currently blocked.\nThe latest block log entry is provided below for reference:",
-       "clearyourcache": "<strong>Note:</strong> After saving, you may have to bypass your browser's cache to see the changes.\n* <strong>Firefox / Safari:</strong> Hold <em>Shift</em> while clicking <em>Reload</em>, or press either <em>Ctrl-F5</em> or <em>Ctrl-R</em> (<em>⌘-R</em> on a Mac)\n* <strong>Google Chrome:</strong> Press <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> on a Mac)\n* <strong>Internet Explorer:</strong> Hold <em>Ctrl</em> while clicking <em>Refresh</em>, or press <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Clear the cache in <em>Tools → Preferences</em>",
+       "clearyourcache": "<strong>Note:</strong> After saving, you may have to bypass your browser's cache to see the changes.\n* <strong>Firefox / Safari:</strong> Hold <em>Shift</em> while clicking <em>Reload</em>, or press either <em>Ctrl-F5</em> or <em>Ctrl-R</em> (<em>⌘-R</em> on a Mac)\n* <strong>Google Chrome:</strong> Press <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> on a Mac)\n* <strong>Internet Explorer:</strong> Hold <em>Ctrl</em> while clicking <em>Refresh</em>, or press <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Go to <em>Menu → Settings</em> (<em>Opera → Preferences</em> on a Mac) and then to <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
        "usercssyoucanpreview": "<strong>Tip:</strong> Use the \"{{int:showpreview}}\" button to test your new CSS before saving.",
        "userjsyoucanpreview": "<strong>Tip:</strong> Use the \"{{int:showpreview}}\" button to test your new JavaScript before saving.",
        "usercsspreview": "<strong>Remember that you are only previewing your user CSS.\nIt has not yet been saved!</strong>",
        "accesskey-ca-nstab-category": "c",
        "accesskey-minoredit": "i",
        "accesskey-save": "s",
+       "accesskey-publish": "s",
        "accesskey-preview": "p",
        "accesskey-diff": "v",
        "accesskey-compareselectedversions": "v",
        "tooltip-ca-nstab-category": "View the category page",
        "tooltip-minoredit": "Mark this as a minor edit",
        "tooltip-save": "Save your changes",
+       "tooltip-publish": "Publish your changes",
        "tooltip-preview": "Preview your changes. Please use this before saving.",
        "tooltip-diff": "Show which changes you made to the text",
        "tooltip-compareselectedversions": "See the differences between the two selected revisions of this page",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|protected}} $3 $4 [cascading]",
        "logentry-protect-modify": "$1 {{GENDER:$2|changed}} protection level for $3 $4",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|changed}} protection level for $3 $4 [cascading]",
-       "logentry-rights-rights": "$1 {{GENDER:$2|changed}} group membership for {{GENDER:$3|$3}} from $4 to $5",
+       "logentry-rights-rights": "$1 {{GENDER:$2|changed}} group membership for {{GENDER:$6|$3}} from $4 to $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|changed}} group membership for $3",
        "logentry-rights-autopromote": "$1 was automatically {{GENDER:$2|promoted}} from $4 to $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|uploaded}} $3",
index 46d2669..eba4a99 100644 (file)
@@ -45,7 +45,8 @@
                        "Matma Rex",
                        "Xð",
                        "Robin van der Vliet",
-                       "Zciric"
+                       "Zciric",
+                       "Psychoslave"
                ]
        },
        "tog-underline": "Substreki ligilojn",
@@ -63,6 +64,7 @@
        "tog-watchdefault": "Aldoni al mia atentaro paĝojn kaj dosierojn redaktitajn de mi",
        "tog-watchmoves": "Aldoni paĝojn kaj dosierojn, kiujn mi movas, al mia atentaro",
        "tog-watchdeletion": "Aldoni paĝojn kaj dosierojn, kiujn mi forigas, al mia atentaro",
+       "tog-watchuploads": "Aldonu novajn dosierojn ke mi alŝutas al mia atentaro",
        "tog-watchrollback": "Aldoni paĝojn, kie mi amasmalfaris, al mia atentaro.",
        "tog-minordefault": "Marki defaŭlte ĉiujn redaktojn kiel etajn",
        "tog-previewontop": "Montri antaŭrigardon antaŭ redaktilo",
@@ -80,6 +82,7 @@
        "tog-watchlisthidebots": "Kaŝi robotajn redaktojn de la atentaro",
        "tog-watchlisthideminor": "Kaŝi malgrandajn redaktojn de la atentaro",
        "tog-watchlisthideliu": "Kaŝi redaktojn de ensalutitaj uzantoj de la atentaro",
+       "tog-watchlistreloadautomatically": "Reŝarĝi la atentaron aŭtomate ĉiam filtro estas ŝanĝita (Necesi Ĝavoskripton)",
        "tog-watchlisthideanons": "Kaŝi redaktojn de anonimuloj de la atentaro",
        "tog-watchlisthidepatrolled": "Kaŝi patrolitajn redaktojn de la atentaro",
        "tog-watchlisthidecategorization": "Kaŝu enkategoriigon de paĝoj",
        "talkpagelinktext": "diskuto",
        "specialpage": "Speciala Paĝo",
        "personaltools": "Personaj iloj",
-       "articlepage": "Rigardi artikolon",
+       "articlepage": "Vidi paĝenhavon",
        "talk": "Diskuto",
        "views": "Vidoj",
        "toolbox": "Iloj",
-       "userpage": "Rigardi personan paĝon",
+       "userpage": "Vidi uzantan paĝon",
        "projectpage": "Rigardi projektopaĝon",
        "imagepage": "Vidi dosieropaĝon",
        "mediawikipage": "Vidi mesaĝopaĝon",
        "databaseerror-query": "Mendo: $1",
        "databaseerror-function": "Funkcio: $1",
        "databaseerror-error": "Eraro: $1",
+       "transaction-duration-limit-exceeded": "Por eviti krei egan atendotempon de replikado, tiu transakcio estis ĉesigita pro la skribdaŭro ($1) superigis la limon da $2 {{plural:$2|sekondo|sekondoj}}.",
        "laggedslavemode": "Avertu: la paĝo eble ne enhavas lastatempajn ĝisdatigojn.",
        "readonly": "Datumbazo ŝlosita, nurlega",
        "enterlockreason": "Bonvolu klarigi, kial oni ŝlosas la datumbazon, kaj\nla estimatan tempon de malŝlosado.",
        "perfcached": "La sekvantaj informoj venas el kaŝmemoro kaj eble ne estas ĝisdataj. Maksimumo de {{PLURAL:$1|unu rezulto estas disponebla|$1 rezultoj estas disponeblaj}} en la kaŝmemoro.",
        "perfcachedts": "La jenaj datumoj estas el kaŝmemoro kaj estis laste ĝisdatigitaj $1. Maksimumo de {{PLURAL:$4|unu rezulto estas disponebla|$4 rezultoj estas disponeblaj}} en la kaŝmemoro.",
        "querypage-no-updates": "Ĝisdatigoj por ĉi tiu paĝo estas nune neebligitaj.\nDatumoj ĉi tie ne estos nune refreŝigitaj.",
-       "viewsource": "Rigardi vikitekston",
+       "viewsource": "Vidi vikitekston",
        "viewsource-title": "Vidi fonton por $1",
        "actionthrottled": "Agado limigita",
        "actionthrottledtext": "Por kontraŭi misuzon, vi estas limigita farante ĉi tiun agon tro pluroble en mallonga tempdaŭro, kaj vi transpasis ĉi tiun limon. Bonvolu refaru post kelkaj minutoj.",
        "protectedpagetext": "Tiu ĉi paĝo estas ŝlosita por malebligi redaktadon.",
-       "viewsourcetext": "Vi povas rigardi kaj kopii la fonton de la paĝo.",
+       "viewsourcetext": "Vi povas vidi kaj kopii la fonton de la paĝo.",
        "viewyourtext": "Vi povas vidi kaj kopii la fonton de <strong>viaj redaktoj</strong> al ĉi tiu paĝo.",
        "protectedinterface": "Ĉi tiu paĝo provizas interfacan tekston por la programaro, kaj estas ŝlosita por malebligi misuzon.\nPor aldoni aŭ ŝanĝi tradukojn por ĉiuj vikioj, bonvolu uzi [//translatewiki.net/ translatewiki.net], la projekton por provizi tradukojn por MediaWiki.",
        "editinginterface": "<strong>Atentu:</strong> Vi redaktas paĝon, kiu provizas interfacan tekston por la programaro.\nŜanĝoj de ĉi tiu teksto ŝanĝos aspekton de la interfaco por aliaj uzantoj de ĉi tiu vikio.\nPor aldoni aŭ ŝanĝi tradukojn por ĉiuj vikioj, bonvolu uzi [//translatewiki.net/ translatewiki.net], la projekton por provizi tradukojn por MediaWiki.",
        "noemail": "Retpoŝtadreso ne estas registrita por uzanto \"$1\".",
        "noemailcreate": "Vi devas provizi validan retadreson",
        "passwordsent": "Oni sendis novan pasvorton al la retpoŝtadreso\nregistrita por \"$1\".\nBonvolu ensaluti denove ricevinte ĝin.",
-       "blocked-mailpassword": "Via IP-adreso estas forbarita de redaktado, kaj tial\nne rajtas uzi la pasvorto-rekovran funkcion por malebligi misuzon.",
+       "blocked-mailpassword": "Via IP-adreso estas forbarita de redaktado. Por preventi fiuzojn, la pasvorto-restaŭron estas malpermesita per tiu IP-adreso.",
        "eauthentsent": "Konfirma retmesaĝo estis sendita al la nomita retadreso. Antaŭ ol iu ajn alia mesaĝo estos sendita al la konto, vi devos sekvi la instrukciojn en la mesaĝo por konfirmi ke la konto ja estas via.",
        "throttled-mailpassword": "Retpoŝto kun reŝargita pasvorto estis jam sendita ene de la {{PLURAL:$1|lasta horo|lastaj $1 horoj}}.\nPor preventi misuzon, nur unu reŝargita pasvorto estos sendita dum {{PLURAL:$1|horo|$1 horoj}}.",
        "mailerror": "Okazis eraro sendante retpoŝtaĵon: $1",
        "newpassword": "Nova pasvorto",
        "retypenew": "Retajpi novan pasvorton",
        "resetpass_submit": "Fari pasvorton kaj ensaluti",
-       "changepassword-success": "Via pasvorto estis sukcese ŝanĝita!",
+       "changepassword-success": "Via pasvorto estis ŝanĝita!",
        "changepassword-throttled": "Vi tro ofte provis ensaluti al ĉi tiu konto.\nBonvolu atendi $1 antaŭ ol reprovi.",
        "botpasswords": "Robotaj pasvortoj",
        "botpasswords-summary": "<em>Robotaj pasvortoj</em> ebligas aliron al uzanto-konto per API sen uzado de ĉefaj ensalutaj datumoj de la konto. La uzanto-rajtoj disponeblaj dum ensaluto per robota pasvorto povas esti limigitaj.\n\nSe vi ne scias, kial vi devus fari tion, vi probable maldevus fari tion. Neniu devus peti vin generi pasvorton tie ĉi kaj transdoni ĝin al li.",
        "botpasswords-label-cancel": "Nuligi",
        "botpasswords-label-delete": "Forigi",
        "botpasswords-label-resetpassword": "Rekomencigi la pasvorton",
+       "botpasswords-label-grants": "Uzeblaj permesdonoj:",
+       "botpasswords-help-grants": "Ĉiu permesdono provizas aliron al listitaj uzantaj permisoj, kiujn uzantkonto jam havas. Vidu la [[Special:ListGrants|tabelon de permisdonoj]] por pli da informo.",
        "botpasswords-label-restrictions": "Limigoj de uzado:",
+       "botpasswords-label-grants-column": "Permisdonita",
        "botpasswords-bad-appid": "La robota nomo \"$1\" estas malvalida.",
        "botpasswords-insert-failed": "Aldono de la robota nomo \"$1\" ne sukcesis. Ĉu ĝi jam estis aldonita?",
        "botpasswords-update-failed": "Ĝisdatigo de la robota nomo \"$1\" ne sukcesis. Ĉu ĝi estis forigita?",
        "botpasswords-updated-body": "La robota pasvorto por robota nomo \"$1\" de la uzanto \"$2\" estis ĝisdatigita.",
        "botpasswords-deleted-title": "Robota pasvorto forigita",
        "botpasswords-deleted-body": "La robota pasvorto por robota nomo \"$1\" de la uzanto \"$2\" estis forigita.",
+       "botpasswords-newpassword": "La nova pasvorto por ensaluti kun <strong>$1</strong> estas <strong>$2</strong>. <em>Bonvolu registri tiun por referenconto.",
+       "botpasswords-no-provider": "Robotopasvortensalutoprovizilo (''BotPasswordsSessionProvider'') maldisponeblas.",
+       "botpasswords-restriction-failed": "Limigoj pri robota pasvorto maleblas tiun uzantonomon.",
+       "botpasswords-invalid-name": "La difinita uzantnomo malenhavas la robotopasvortan disigilon (\"$1\").",
+       "botpasswords-not-exist": "Uzanto \"$1\" ne havas robotopasvorton, kiu nomiĝas \"$2\".",
        "resetpass_forbidden": "Pasvortoj ne estas ŝanĝeblaj",
        "resetpass-no-info": "Vi devas ensaluti por atingi ĉi tiun paĝon rekte.",
        "resetpass-submit-loggedin": "Ŝanĝi pasvorton",
        "passwordreset-emailtext-user": "Uzanto $1 de {{SITENAME}} petis restarigo de via pasvorto por {{SITENAME}}\n($4). La {{PLURAL:$3|jena uzanto-konto estas asociita|jenaj uzanto-kontoj estas asociitaj}} kun ĉi tiu retpoŝtadreso:\n\n$2\n\nĈi {{PLURAL:$3|tiu provizora pasvorto|tiuj provizoraj pasvortoj}} findatiĝos {{PLURAL:$5|unu tagon|$5 tagojn}}.\nVi devas ensaluti kaj elekti novan pasvorton nun. Se iu alia petis ĉi tion,\naŭ se vi memoris vian originalan pasvorton, kaj vi ne plu volas ŝanĝi\nĝin, vi povas ignori ĉi tiun mesaĝon kaj uzi vian malnovan pasvorton.",
        "passwordreset-emailelement": "Salutnomo: \n$1\n\nProvizora pasvorto: \n$2",
        "passwordreset-emailsentemail": "Se tiu ĉu retpoŝta adreso estas kunligita kun via konto, tiam al ĉi tiu adreso estos sendita retpoŝto por renovigi pasvorton.",
+       "passwordreset-emailsentusername": "Se estas retpoŝta adreso, kiu estas asocigita kun tiu uzantnomo, tiam sendos retpôstan mesaĝon pri reasigno de pasvorto.",
        "passwordreset-emailsent-capture": "Retpoŝto kun renovigita pasvorto estis sendita, kiu estas montrata malsupre.",
        "passwordreset-emailerror-capture": "Retpoŝto kun renovigita pasvorto estis generita, montrata sube, sed sendado al la {{GENDER:$2|uzanto}} malsukcesis: $1",
        "changeemail": "Ŝanĝi aŭ forigi retpoŝtadreson",
        "nosuchsectiontext": "Vi provis redakti sekcion, kiu ne ekzistas.\nĜi eble estis movita aŭ forigita dum vi rigardis la paĝon.",
        "loginreqtitle": "Nepre ensaluti",
        "loginreqlink": "ensaluti",
-       "loginreqpagetext": "Vi devas $1 por rigardi aliajn paĝojn.",
+       "loginreqpagetext": "Bonvolu $1 por vidi aliajn paĝojn.",
        "accmailtitle": "La pasvorto estas sendita.",
        "accmailtext": "Hazarde generita pasvorto por [[User talk:$1|$1]] estis sendita al $2.\n\nLa pasvorto por ĉi tiu nova konto povas esti ŝanĝita en la paĝo ''[[Special:ChangePassword|ŝanĝi pasvorton]]'' dum ensalutado.",
        "newarticle": "(Nova)",
        "copyrightwarning2": "Bonvolu noti ke ĉiuj kontribuoj al {{SITENAME}} povas esti reredaktitaj, ŝanĝitaj aŭ forigitaj de aliaj kontribuantoj. Se vi ne deziras, ke viaj verkoj estu senkompate reredaktitaj, ne publikigu ilin ĉi tie.<br />\nVi ankaŭ promesu al ni ke vi verkis tion mem aŭ kopiis el publika domajno aŭ simila libera fonto (vidu $1 por detaloj).\n'''NE PROPONU KOPIRAJTITAJN VERKOJN SEN PERMESO!'''",
        "editpage-cannot-use-custom-model": "La enhavomodelo de ĉi tiu paĝo ne povas esti ŝanĝata.",
        "longpageerror": "'''Eraro: La teksto, kiun vi prezentis, longas {{PLURAL:$1|$1 kilobajton|$1 kilobajtojn}}, kio estas pli longa ol la maksimumo de {{PLURAL:$2|$2 kilobajto|$2 kilobajtoj}}.'''\nĜi ne povas esti konservita.",
-       "readonlywarning": "'''AVERTO: La datumbazo estas ŝlosita por teknika laboro, do vi ne povas konservi viajn redaktojn ĉi-momente.\nVi eble volus elkopii kaj englui la tekston al tekstdosiero por konservi ĝin por posta uzo.'''\n\nLa administranto kiu ŝlosis ĝin donis ĉi tiun eksplikaĵon: $1",
+       "readonlywarning": "'''AVERTO: La datumbazo estas ŝlosita por teknika laboro, do vi ne povas konservi viajn redaktojn ĉi-momente.'''\nVi eble volus elkopii kaj alglui vian tekston al tekstdosiero kaj konservi ĝin por posta uzo.\n\nLa administranto kiu ŝlosis ĝin donis ĉi tiun eksplikaĵon: $1",
        "protectedpagewarning": "'''Averto: Ĉi tiu paĝo estas ŝlosita kontraŭ redaktado krom de administrantoj.'''\nJen la lasta protokolero provizita por via referenco:",
        "semiprotectedpagewarning": "'''Notu:''' Ĉi tiu paĝo estas ŝlosita tiel ke nur ensalutintaj uzantoj povas redakti ĝin.\nJen la lasta protokolero por via referenco:",
        "cascadeprotectedwarning": "<strong>Averto:</strong> Ĉi tiu paĝo estas ŝlosita, tiel ke nur uzantoj kun administrantaj privilegioj povas redakti ĝin, ĉar ĝi estas inkludita en la {{PLURAL:$1|sekvan kaskade protektitan paĝon|sekvajn kaskade protektitajn paĝojn}}:",
        "permissionserrors": "Eraro pri permeso",
        "permissionserrorstext": "Vi ne rajtas fari tion pro la {{PLURAL:$1|sekva kialo|sekvaj kialoj}}:",
        "permissionserrorstext-withaction": "Vi ne rajtas $2, pro la {{PLURAL:$1|jena kialo|jenaj kialoj}}:",
-       "contentmodelediterror": "Vi ne povas prilabori ĉi tiun version, ĉar ĝia enhavomodelo <code>$1</code> kaj la aktuala enhavomodelo de la paĝo estas <code>$2</code>.",
+       "contentmodelediterror": "Vi ne povas prilabori ĉi tiun reviziaĵo, ĉar ĝia enhavoŝablono estas <code>$1</code>, kiu malsamas la aktualan enhavoŝablonon de la paĝo <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Averto: Vi rekreas paĝon, kiu estis antaŭe forigita.'''\n\nVi konsideru, ĉu konvenas daŭre redakti ĉi tiun paĝon.\nJen la protokolo de forigoj kaj alinomigado por via oportuno:",
        "moveddeleted-notice": "Ĉi tiu paĝo estis forigita.\nPliaj detaloj estas en protokolo pri forigado kaj alinomado de tiu ĉi paĝo.",
+       "moveddeleted-notice-recent": "Pardonon, tiu paĝo freŝdate estis forigita (en la dauro de la lasta 24 horoj).\nLa forigo kaj la movprotokolo pri la paĝo estas provizitaj sube por referenco.",
        "log-fulllog": "Vidi kompletan protokolon",
        "edit-hook-aborted": "Redakto estis ĉesigita per etendaĵo de la Vikia softvaro.\nĜi ne donis eksplikon.",
        "edit-gone-missing": "Ne eblis ĝisdatigi la paĝon.\nVerŝajne ĝi estis forigita.",
        "content-model-css": "CSS",
        "content-json-empty-object": "Malplena objeto",
        "content-json-empty-array": "Malplena tabelo",
+       "duplicate-args-warning": "'''Averto:''' [[:$1]] vokas je [[:$2]] kun pli ol unu valoro por la parametro \"$3\". Nur la lasta liverita valoro estas uzonta.",
        "duplicate-args-category": "Paĝoj kun pluroblaj argumentoj en ŝablonvokoj",
        "duplicate-args-category-desc": "La paĝo enhavas uzon de ŝablono kun pluroble uzitaj argumentoj, kiel ekzemple <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> aŭ <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Averto: Ĉi tiu paĝo enhavas tro da multekostaj sintaksaj funkcio-vokoj.\n\nĜi havu malpli ol $2 {{PLURAL:$2|vokon|vokojn}}, sed nun estas $1 {{PLURAL:$1|voko|vokoj}}.",
        "cantcreateaccounttitle": "Ne eblas krei konton",
        "cantcreateaccount-text": "Konto-kreado de ĉi tiu IP-adreso ('''$1''') estis forbarita de [[User:$3|$3]].\n\nLa kialo donata de $3 estas ''$2''.",
        "cantcreateaccount-range-text": "La kreado de kontoj de IP-adresoj en la intervalo <strong>$1</strong>, kiu inkludas vian IP-adreson (<strong>$4</strong>), estis blokita de [[User:$3|$3]].\n\nLa donita kialo de $3 estas <em>$2</em>",
-       "viewpagelogs": "Rigardi la protokolojn por tiu ĉi paĝo",
+       "viewpagelogs": "Vidi la protokolojn por tiu ĉi paĝo",
        "nohistory": "Ne ekzistas historio de redaktoj por ĉi tiu paĝo.",
        "currentrev": "Aktuala versio",
        "currentrev-asof": "Nuna versio ekde $1",
        "revdelete-unsuppress": "Forigi limigojn al restarigitaj versioj",
        "revdelete-log": "Kialo:",
        "revdelete-submit": "Apliki al {{PLURAL:$1|elektita revizio|elektitaj revizioj}}",
-       "revdelete-success": "'''Revizia videbleco estas sukcese ĝisdatigita.'''",
+       "revdelete-success": "'''Revizivideblecon ĝisdatigis.'''",
        "revdelete-failure": "'''Videblecon de revizio ne eblis ĝisdatigi:'''\n$1",
-       "logdelete-success": "'''Videbleco de evento sukcese farita.'''",
+       "logdelete-success": "'''Protokolovideblecon ensignitan.'''",
        "logdelete-failure": "'''Protokola videbleco ne estis akordebla:'''\n$1",
        "revdel-restore": "Ŝanĝi videblecon",
        "pagehist": "Paĝa historio",
        "mergehistory-fail-bad-timestamp": "Tempomarko estas malvalida.",
        "mergehistory-fail-invalid-source": "Fonta paĝo estas malvalida.",
        "mergehistory-fail-invalid-dest": "Cela paĝo estas malvalida.",
+       "mergehistory-fail-no-change": "Historio-kunfandado kunfandis neniun revizion. Bonvolu rekontroli la paĝon kaj la tempo-parametrojn.",
+       "mergehistory-fail-permission": "Nesufiĉa permesoj por kunfadi historion.",
+       "mergehistory-fail-self-merge": "Fonta kaj cela paĝoj samas.",
+       "mergehistory-fail-timestamps-overlap": "Fonta revizio surkunigas aŭ postokuras la celan revizion.",
        "mergehistory-fail-toobig": "Ne eblas kunigi historiojn ĉar pli ol sojlo de $1 {{PLURAL:$1|revizio|revizioj}} estus {{PLURAL:$1|movita|movitaj}}.",
        "mergehistory-no-source": "Fontpaĝo $1 ne ekzistas.",
        "mergehistory-no-destination": "Celpaĝo $1 ne ekzistas.",
        "lineno": "Linio $1:",
        "compareselectedversions": "Kompari la elektitajn versiojn",
        "showhideselectedversions": "Montri/kaŝi elektitajn versiojn",
-       "editundo": "malfari",
+       "editundo": "Redaktomalfaru",
        "diff-empty": "(Neniu diferenco)",
        "diff-multi-sameuser": "({{PLURAL:$1|Unu meza versio|$1 mezaj versioj}} de la sama uzanto ne montriĝas)",
        "diff-multi-otherusers": "({{PLURAL:$1|Unu meza versio|$1 mezaj versioj}} de {{PLURAL:$2|alia uzanto|$2 uzantoj}} ne montriĝas)",
        "search-category": "(kategorio $1)",
        "search-file-match": "(kongruas kun dosiera enhavo)",
        "search-suggest": "Ĉu vi intenciis: $1",
+       "search-rewritten": "Montru rezultojn por $1. Serĉita anstataŭ $2.",
        "search-interwiki-caption": "Kunprojektoj",
        "search-interwiki-default": "Rezultoj de $1:",
        "search-interwiki-more": "(plu)",
        "showingresultsinrange": "Malsupre montriĝas {{PLURAL:$1|<strong>1</strong> rezulto|<strong>$1</strong> rezultoj}} en la intervalo #<strong>$2</strong> ĝis #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Rezulto <strong>$1</strong> el <strong>$3</strong>|Rezultoj <strong>$1 - $2</strong> el <strong>$3</strong>}}",
        "search-nonefound": "La serĉomendo rezultis kun neniuj trafoj.",
+       "search-nonefound-thiswiki": "Neniu rezulto kongruis la peton tra tiu retejo.",
        "powersearch-legend": "Progresa serĉo",
        "powersearch-ns": "Serĉi en nomspacoj:",
        "powersearch-togglelabel": "Elekti:",
        "prefs-help-recentchangescount": "Ĉi tiu inkluzivas lastajn ŝanĝojn, paĝajn historiojn, kaj protokolojn.",
        "prefs-help-watchlist-token2": "Tio estas la sekreta ŝlosilo al la retfluo de via atentaro.\nĈiu, kiu konas ĝin, povas legi vian atentaron. Do, ne kunhavigu ĝin.\nSe vi devas, [[Special:ResetTokens|vi povas rekomencigi ĝin]].",
        "savedprefs": "Viaj preferoj estas konservitaj.",
+       "savedrights": "La uzanto-rajtojn de {{GENDER:$1|$1}} konservigis.",
        "timezonelegend": "Horzono:",
        "localtime": "Loka tempo:",
        "timezoneuseserverdefault": "Uzi defaŭlton de servilo ($1)",
        "userrights": "Prizorgi rajtojn de uzantoj",
        "userrights-lookup-user": "Administri grupojn de uzantoj",
        "userrights-user-editname": "Entajpu salutnomon:",
-       "editusergroup": "Redakti grupojn de uzantoj",
+       "editusergroup": "Redakti grupojn de {{GENDER:$1|uzanto}}",
        "editinguser": "Ŝanĝado de uzanto-rajtoj de la {{GENDER:$1|uzanto|uzantino}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Redakti grupojn de uzantoj",
-       "saveusergroups": "Konservi grupojn de uzantoj",
+       "saveusergroups": "Konservi grupojn de {{GENDER:$1|viruzuloj|uzulinoj|uzantoj}}",
        "userrights-groupsmember": "Membro de:",
        "userrights-groupsmember-auto": "Implica membro de:",
        "userrights-groups-help": "Vi povas modifi la grupojn kiun ĉi uzanto enestas.\n* Markita markbutono signifas ke la uzanto estas en tiu grupo.\n* Nemarkita markbutono signifas ke la uzanto ne estas in tiu grupo.\n* Steleto (*) signifas ke vi ne povas forigi la grupon post vi aldonis ĝin, aŭ male.",
        "userrights-changeable-col": "Grupoj kiujn vi povas ŝanĝi",
        "userrights-unchangeable-col": "Grupoj kiujn vi ne povas ŝanĝi",
        "userrights-conflict": "Konflikto ĉe la ŝanĝo de uzantorajtoj! Bonvolu kontroli kaj konfirmi viajn ŝanĝojn.",
-       "userrights-removed-self": "Vi sukcese nuligis viajn proprajn rajtojn. Do vi ne plu rajtas aliri ĉi tiun paĝon.",
+       "userrights-removed-self": "Vi nuligis viajn proprajn rajtojn, do vi ne plu rajtas aliri ĉi tiun paĝon.",
        "group": "Grupo:",
        "group-user": "Uzantoj",
        "group-autoconfirmed": "Aŭtomate konfirmitaj uzantoj",
        "group-bot": "Robotoj",
        "group-sysop": "Administrantoj",
        "group-bureaucrat": "Burokratoj",
-       "group-suppress": "Superrigardoj",
+       "group-suppress": "Foriganaro",
        "group-all": "(ĉiuj)",
        "group-user-member": "{{GENDER:$1|uzanto|uzantino}}",
        "group-autoconfirmed-member": "{{GENDER:$1|aŭtomate konfirmita uzanto|aŭtomate konfirmita uzantino}}",
        "grouppage-bot": "{{ns:project}}:Robotoj",
        "grouppage-sysop": "{{ns:project}}:Administrantoj",
        "grouppage-bureaucrat": "{{ns:project}}:Burokratoj",
-       "grouppage-suppress": "{{ns:project}}:Superrigardo",
+       "grouppage-suppress": "{{ns:project}}:Forigi",
        "right-read": "Legi paĝojn",
        "right-edit": "Redakti paĝojn",
        "right-createpage": "Kreu paĝojn (kiuj ne estas diskuto-paĝoj)",
        "right-createtalk": "Krei diskuto-paĝojn",
        "right-createaccount": "Krei novajn uzanto-kontojn",
+       "right-autocreateaccount": "Aŭtomate ensaluti eksteruzantan konton",
        "right-minoredit": "Marki redaktojn kiel etajn",
        "right-move": "Movi paĝojn",
        "right-move-subpages": "Alinomigi paĝojn kun ĝiaj subpaĝoj",
        "right-bigdelete": "Forigi paĝojn kun grandaj historioj",
        "right-deletelogentry": "Forigi kaj malforigi specifajn enmetojn en la registro.",
        "right-deleterevision": "Forigi kaj malforigi specifajn versiojn de paĝoj",
-       "right-deletedhistory": "Rigardi listanojn de forigitaj historioj, sen ties asociaj tekstoj",
+       "right-deletedhistory": "Vidi forigitajn historieroj, sen ties asociaj tekstoj",
        "right-deletedtext": "Rigardi forigitan tekston kaj ŝanĝojn inter forigitaj revizioj.",
        "right-browsearchive": "Serĉi forigitajn paĝojn",
        "right-undelete": "Restarigi paĝon",
        "right-edituserjs": "Redaktu JS-dosierojn de aliaj uzantoj",
        "right-editmyusercss": "Redakti viajn proprajn CSS-dosierojn",
        "right-editmyuserjs": "Redakti viajn proprajn JavaScript-dosierojn",
-       "right-viewmywatchlist": "Rigardi vian atentaron",
+       "right-viewmywatchlist": "Vidi vian propran atentaron",
        "right-editmywatchlist": "Redakti vian propran atentaron. Notu, ke kelkaj agoj ankoraŭ ebligas aldoni paĝojn sen ĉi tiu rajto.",
        "right-viewmyprivateinfo": "Vidi viajn proprajn privatajn informojn (ekz. retpoŝtan adreson, veran nomon)",
        "right-editmyprivateinfo": "Redakti viajn proprajn privatajn informojn (ekz. retpoŝtan adreson, veran nomon)",
        "right-importupload": "Importi paĝojn de dosiera alŝuto",
        "right-patrol": "Marki redaktojn kiel patrolitajn",
        "right-autopatrol": "Fari redaktojn aŭtomate markitajn kiel patrolitajn",
-       "right-patrolmarks": "Rigardi patrolmarkojn de lastaj ŝanĝoj",
+       "right-patrolmarks": "Vidi patrolmarkojn de lastaj ŝanĝoj",
        "right-unwatchedpages": "Vidi la liston de nepriatentitaj paĝoj",
        "right-mergehistory": "Kunfandigi la historiojn de paĝoj",
        "right-userrights": "Redakti ĉiujn uzanto-rajtojn",
        "right-managechangetags": "Kreado kaj forigado de [[Special:Tags|etikedoj]] de datumbazo",
        "right-applychangetags": "Aldoni [[Special:Tags|etikedojn]] al propraj ŝanĝoj",
        "right-changetags": "Aldoni kaj forigi arbitrajn [[Special:Tags|etikedojn]] ĉe unuopaj revizioj kaj protokoleroj",
+       "grant-generic": "\"$1\" rajtaro",
+       "grant-group-page-interaction": "Interagi paĝojn",
+       "grant-group-file-interaction": "Interagi aŭdvidaĵajn dosierojn",
+       "grant-group-watchlist-interaction": "Interagi vian atentaron",
        "grant-group-email": "Sendi retpoŝton",
+       "grant-group-high-volume": "Efektivigi ampleksege aktivecon",
+       "grant-group-customization": "Personecigoj kaj preferoj",
+       "grant-group-administration": "Efektivigi administrajn agojn",
+       "grant-group-other": "Diversaj aktivecoj",
+       "grant-blockusers": "Bloki kaj malbloki uzantojn",
        "grant-createaccount": "Krei kontojn",
+       "grant-createeditmovepage": "Krei, redakti kaj alinomi paĝojn",
+       "grant-delete": "Forigi paĝojn, reviziaĵojn kaj protokolerojn",
+       "grant-editinterface": "Redakti la MediaVikian nomspacon kaj la CSS/Ĝavoskripto de uzanto",
+       "grant-editmycssjs": "Redakti vian uzantan CSS/Ĝavoskripton",
+       "grant-editmyoptions": "Redakti vian uzantan preferojn",
+       "grant-editmywatchlist": "Redakti vian atentaron",
+       "grant-editpage": "Redakti ekzistantajn paĝojn",
+       "grant-editprotected": "Redakti protektitajn paĝojn",
+       "grant-highvolume": "Ampleksegaj redaktado",
+       "grant-oversight": "Kaŝi uzantojn kaj forigi reviziaĵojn",
+       "grant-patrol": "Patroli ŝanĝojn al pâgoj",
+       "grant-protect": "Protekti kaj malprotekti paĝojn",
+       "grant-rollback": "Malvalidi ŝanĝojn al paĝoj",
+       "grant-sendemail": "Retpoŝti al aliaj uzantoj",
+       "grant-uploadeditmovefile": "Alŝuti, anstataŭigi kaj alinomi dosierojn",
+       "grant-uploadfile": "Alŝuti novajn dosierojn",
+       "grant-basic": "Bazaj rajtoj",
+       "grant-viewdeleted": "Vidi forigitajn dosierojn kaj paĝojn",
+       "grant-viewmywatchlist": "Rigardi vian atentaron",
        "newuserlogpage": "Protokolo de uzanto-kreado",
        "newuserlogpagetext": "Jen protokolo de lastaj kreadoj de uzantoj.",
        "rightslog": "Protokolo de uzanto-rajtoj",
        "action-createpage": "krei paĝojn",
        "action-createtalk": "krei diskuto-paĝojn",
        "action-createaccount": "krei ĉi tiun uzanto-konton",
-       "action-history": "rigardi historion de tiu ĉi paĝo",
+       "action-autocreateaccount": "Aŭtomate krei tiun eksteruzantan konton",
+       "action-history": "vidi historion de tiu ĉi paĝo",
        "action-minoredit": "marki ĉi tiun redakton eta",
        "action-move": "movi ĉi tiun paĝon",
        "action-move-subpages": "movi ĉi tiun paĝon, kaj ties subpaĝojn",
        "rcshowhidemine": "$1 miajn redaktojn",
        "rcshowhidemine-show": "Montri",
        "rcshowhidemine-hide": "Kaŝi",
+       "rcshowhidecategorization": "$1 paĝokategoriadon",
        "rcshowhidecategorization-show": "Montri",
        "rcshowhidecategorization-hide": "Kaŝi",
        "rclinks": "Montri $1 lastajn ŝanĝojn dum la $2 lastaj tagoj.<br />$3",
        "recentchangeslinked-summary": "Jen listo de ŝanĝoj faritaj lastatempe al paĝoj ligitaj el specifa paĝo (aŭ al membroj de specifa kategorio).\nPaĝoj en [[Special:Watchlist|via atentaro]] estas '''grasaj'''.",
        "recentchangeslinked-page": "Nomo de paĝo:",
        "recentchangeslinked-to": "Montru ŝanĝojn al paĝoj ligitaj al la specifa paĝo anstataŭe.",
+       "recentchanges-page-added-to-category": "[[:$1]] kategorialdonita",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] kategorialdonita, [[Special:WhatLinksHere/$1|tiu paĝo estas inkluzivita ene de aliaj paĝoj]]",
+       "recentchanges-page-removed-from-category": "[[:$1]] kategoriforigita",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] kategoriforigita, [[Special:WhatLinksHere/$1|tiu paĝo estas inkluzivita ene de aliaj paĝoj]]",
+       "autochange-username": "Aŭtomata ŝanĝo de Mediavikio",
        "upload": "Alŝuti dosieron",
        "uploadbtn": "Alŝuti dosieron",
        "reuploaddesc": "Reveni al la alŝuta formularo.",
        "uploaddisabledtext": "Alŝutado de dosieroj estas malebligita.",
        "php-uploaddisabledtext": "Dosiera alŝutado estas malŝalta en PHP. Bonvolu kontroli la preferon file_uploads.",
        "uploadscripted": "HTML-aĵo aŭ skriptokodaĵo troviĝas en tiu ĉi tiu dosiero, kiun TTT-foliumilo eble interpretus erare.",
+       "upload-scripted-pi-callback": "Malalŝuteblas dosieron, kiu enhavas instrukcion de XML-stilfolia traktado",
+       "uploaded-script-svg": "Trovis skriptelbero \"$1\" en la alŝutita SVGa dosiero.",
+       "uploaded-hostile-svg": "Trovis malsekura CSS en la stilero de alŝutita SVGa dosiero.",
+       "uploaded-event-handler-on-svg": "Ensigni eventotraktilajn atributojn <code>$1=\"$2\"</code> estas malpermisita en SVGaj dosieroj.",
+       "uploaded-href-attribute-svg": "Atributoj je \"href\" en SVGaj dosieroj nur povas ligi al \"http://\" aŭ \"https://\" celoj, trovis  <code>&lt;$1 $2=\"$3\"&gt;</code>.",
+       "uploaded-href-unsafe-target-svg": "Trovis je \"href\" ligita al malsekuraj datenoj: URIa celo <code>&lt;$1 $2=\"$3\"&gt;</code> en la alŝuta SVGa dosiero.",
+       "uploaded-animate-svg": "Trovis markon je \"animate\", kiu povus ŝanĝi la atributon je \"href\", per uzi la atributon je \"from\" <code>&lt;$1 $2=\"$3\"&gt;</code> en la alŝuta SVGa dosiero.",
+       "uploaded-setting-event-handler-svg": "Ensigni eventotraktilajn atributojn estas blokita, trovis <code>&lt;$1 $2=\"$3\"&gt;</code> en la alŝuta SVGa dosiero.",
+       "uploaded-setting-href-svg": "Uzi la markon je \"set\" por aldoni atributon je \"href\" al ujero estas blokita.",
        "uploadscriptednamespace": "Ĉi tiu SVG-dosiero enhavas nevalidan nomspacon \"$1\"",
        "uploadinvalidxml": "Ne eblas interpreti la XML-sintakson en la alŝutita dosiero",
        "uploadvirus": "Viruso troviĝas en la dosiero! Detaloj: $1",
        "uploadstash-badtoken": "Malsukcesis tiu ago, eble pro tio ke viaj ensalutiloj senvalidiĝis. Reprovu.",
        "uploadstash-errclear": "Sensukcesis la forigo de la dosieroj.",
        "uploadstash-refresh": "Aktualigi la dosierliston.",
+       "uploadstash-thumbnail": "Vidi bildetigon",
        "invalid-chunk-offset": "Malvalida deŝovo de dosierpeco",
        "img-auth-accessdenied": "Atingo malpermisita",
        "img-auth-nopathinfo": "Mankas PATH_INFO (informo pri dosiervojo).\nVia servilo ne estas konfigurita por sendi ĉi tiun informon.\nEble ĝi estas CGI-bazita kaj ne subtenas img_auth.\nVidu https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization (angle).",
        "listfiles-latestversion-no": "Ne",
        "file-anchor-link": "Dosiero",
        "filehist": "Dosiera historio",
-       "filehist-help": "Klaku daton/tempon por rigardi la dosieron kiel ĝin ŝajnitan tiame.",
+       "filehist-help": "Klaku daton/tempon por vidi la dosieron kiel ĝin ŝajnitan tiame.",
        "filehist-deleteall": "forigi ĉiujn",
        "filehist-deleteone": "forigi",
        "filehist-revert": "restarigi",
        "linkstoimage": "La {{PLURAL:$1|jena paĝo|jenaj paĝoj}} ligas al ĉi tiu dosiero:",
        "linkstoimage-more": "Pli ol $1 {{PLURAL:$1|paĝo|paĝoj}} ligas ĉi tiun dosieron.\nLa jena listo montras la {{PLURAL:$1|unua paĝligilo|unuaj $1 paĝligiloj}} al nur ĉi tiu dosiero.\n[[Special:WhatLinksHere/$2|Plena listo]] estas atingebla.",
        "nolinkstoimage": "Neniu paĝo ligas al ĉi tiu dosiero.",
-       "morelinkstoimage": "Rigardi [[Special:WhatLinksHere/$1|pliajn ligilojn]] al ĉi tiu dosiero.",
+       "morelinkstoimage": "Vidi [[Special:WhatLinksHere/$1|pliajn ligilojn]] al ĉi tiu dosiero.",
        "linkstoimage-redirect": "$1 (alidirektilo al dosiero) $2",
        "duplicatesoffile": "La {{PLURAL:$1|jena dosiero estas duplikato|jenaj dosieroj estas duplikatoj}} de ĉi tiu dosiero ([[Special:FileDuplicateSearch/$2|pluaj detaloj]]):",
        "sharedupload": "Ĉi tiu dosiero estas de $1 kaj estas uzebla de aliaj projektoj.",
        "nopagetext": "La cela paĝo kiun vi enigis ne ekzistas.",
        "pager-newer-n": "{{PLURAL:$1|pli nova 1|pli novaj $1}}",
        "pager-older-n": "{{PLURAL:$1|pli malnova 1|pli malnovaj $1}}",
-       "suppress": "Superrigardo",
+       "suppress": "Forigu",
        "querypage-disabled": "Tiu ĉi speciala paĝo estas malfunkciigita pro rendimentaj kialoj.",
        "apihelp": "Helpo pri API",
        "apihelp-no-such-module": "Modulo \"$1\" ne estis trovita.",
        "listgrouprights-namespaceprotection-header": "Nomspacaj restriktoj",
        "listgrouprights-namespaceprotection-namespace": "Nomspaco",
        "listgrouprights-namespaceprotection-restrictedto": "Rajtoj, kiuj permesas al uzanto redakti",
+       "listgrants": "Rajdonaro",
        "trackingcategories": "Kategorioj por kontrolado",
        "trackingcategories-summary": "Ĉi tiu paĝo listigas kategoriojn por kontrolado, aŭtomate farita de la Mediavikia programaro. Ties nomoj estas ŝanĝebla, ŝanĝante la paran sistemmesaĝon en la nomspaco {{ns:8}}.",
        "trackingcategories-msg": "Kategorio pri kontrolado",
        "deleteprotected": "Vi ne povas forigi ĉi tiun paĝon ĉar ĝi estis protektita.",
        "deleting-backlinks-warning": "'''Atentigo:'''\n[[Special:WhatLinksHere/{{FULLPAGENAME}}|Aliaj paĝoj]] ligas al aŭ transkludas tiun ĉi forigotan paĝon.",
        "rollback": "Restarigi antaŭan redakton",
-       "rollbacklink": "malfari",
+       "rollbacklink": "malvalidi",
        "rollbacklinkcount": "nuligi $1 {{PLURAL:$1|redakton|redaktojn}}",
        "rollbacklinkcount-morethan": "nuligi pli ol $1 {{PLURAL:$1|redakton|redaktojn}}",
        "rollbackfailed": "Malfaro malsukcesis",
        "tooltip-watchlistedit-raw-submit": "Ĝisdatigi atentaron",
        "tooltip-recreate": "Rekrei la paĝon malgraŭ ĝi estis forigita",
        "tooltip-upload": "Ekalŝuti",
-       "tooltip-rollback": "\"Restarigi antaŭan\" restarigas redakto(j)n al ĉi tiu paĝo de la lasta kontribuanto per unu klako.",
+       "tooltip-rollback": "\"Malvalidi\" malfaras redakto(j)n al ĉi tiu paĝo de la lasta kontribuanto per unu klako.",
        "tooltip-undo": "\"Malfari\" malfaris ĉi tiun redakton kaj malfermas la redakto-paĝon en antaŭvida reĝimo. Permesas aldoni kialon en la resumo.",
        "tooltip-preferences-save": "Konservi preferojn",
        "tooltip-summary": "Enigu mallongan resumon",
        "mw-widgets-dateinput-placeholder-day": "JJJJ-MM-TT",
        "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
        "api-error-blacklisted": "Bonvolu elekti alian, priskriban titolon.",
-       "randomrootpage": "Hazarda radika paĝo"
+       "randomrootpage": "Hazarda radika paĝo",
+       "log-action-filter-all": "Ĉia",
+       "log-action-filter-protect-unprotect": "Malprotektado",
+       "log-action-filter-upload-upload": "Novalŝuta",
+       "log-action-filter-upload-overwrite": "Realŝuta"
 }
index 789bc54..210f886 100644 (file)
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|protegió}} a $3 $4 [en cascada]",
        "logentry-protect-modify": "$1 {{GENDER:$2|cambió}} el nivel de protección de $3 $4",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|cambió}} el nivel de protección de $3 $4 [en cascada]",
-       "logentry-rights-rights": "$1 {{GENDER:$2|modificó}} los grupos a los que pertenece {{GENDER:$3|$3}}: de $4 a $5",
+       "logentry-rights-rights": "$1 {{GENDER:$2|modificó}} los grupos a los que pertenece {{GENDER:$6|$3}}: de $4 a $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|modificó}} los grupos a los que pertenece $3",
        "logentry-rights-autopromote": "$1 ha sido {{GENDER:$2|promocionado|promocionada}} automáticamente de $4 a $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|subió}} $3",
index 4868e64..eac16c4 100644 (file)
        "noemail": "هیچ آدرس ایمیلی برای کاربر «$1» ثبت نشده است.",
        "noemailcreate": "شما باید یک آدرس ایمیل درست فراهم کنید",
        "passwordsent": "گذرواژه‌ای جدید به آدرس ایمیل ثبت شده برای «$1» ارسال شد.\nلطفاً پس از دریافت آن، دوباره به سیستم وارد شوید.",
-       "blocked-mailpassword": "نشانی آی‌پی شما از ویرایش بازداشته شده‌است و از این رو به منظور جلوگیری از سوءاستفاده اجازهٔ بهره‌گیری از قابلیت بازیابی گذرواژه را ندارد.",
+       "blocked-mailpassword": "نشانی آی‌پی شما از ویرایش بازداشته شده‌است. به منظور جلوگیری از سوءاستفاده اجازهٔ بهره‌گیری از قابلیت بازیابی گذرواژه از این آی‌پی را ندارد.",
        "eauthentsent": "یک ایمیل تأیید برای آدرس ایمیل به نشانی مورد نظر ارسال شد.\nقبل از اینکه ایمیل دیگری قابل ارسال به این آدرس باشد، باید دستورهایی که در آن ایمیل آمده است را جهت تأیید این مساله که این آدرس متعلق به شماست، اجرا کنید.",
        "throttled-mailpassword": "یک ایمیل بازنشانی گذرواژه در $1 {{PLURAL:$1|ساعت|ساعت}} گذشته فرستاده شده است.\nبرای جلوگیری از سوءاستفاده، هر $1 {{PLURAL:$1|ساعت|ساعت}} تنها یک ایمیل بازنشانی گذرواژه فرستاده می‌شود.",
        "mailerror": "خطا در ارسال ایمیل: $1",
        "watchlistedit-raw-done": "فهرست پی‌گیری‌های شما به روز شد.",
        "watchlistedit-raw-added": "$1 عنوان به فهرست پی‌گیری‌ها اضافه {{PLURAL:$1|شد|شدند}}:",
        "watchlistedit-raw-removed": "$1 عنوان حذف {{PLURAL:$1|شد|شدند}}:",
-       "watchlistedit-clear-title": "Ù\81Ù\87رست Ù¾Û\8cÚ¯Û\8cرÛ\8c Ù¾Ø§Ú©Ø³Ø§Ø²Û\8câ\80\8cشدÙ\87",
+       "watchlistedit-clear-title": "پاکسازÛ\8c Ù\81Ù\87رست Ù¾Û\8cÚ¯Û\8cرÛ\8c",
        "watchlistedit-clear-legend": "پاکسازی فهرست پیگیری",
        "watchlistedit-clear-explain": "همه عناوین از فهرست پیگیریهای شما حذف خواهد شد",
        "watchlistedit-clear-titles": "عنوان‌ها:",
index 2ceee0c..db908f1 100644 (file)
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|suojasi}} kohteen $3 $4 [tarttuvasti]",
        "logentry-protect-modify": "$1 {{GENDER:$2|muutti}} suojauksen tasoa kohteessa $3 $4",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|muutti}} suojauksen tasoa kohteessa $3 $4 [tarttuvasti]",
-       "logentry-rights-rights": "$1 {{GENDER:$2|muutti}} käyttäjän {{GENDER:$3|$3}} oikeudet ryhmistä $4 ryhmiin $5",
+       "logentry-rights-rights": "$1 {{GENDER:$2|muutti}} käyttäjän {{GENDER:$6|$3}} oikeudet ryhmistä $4 ryhmiin $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|muutti}} käyttäjän $3 jäsenyyttä ryhmässä",
        "logentry-rights-autopromote": "Käyttäjän $1 oikeudet {{GENDER:$2|muuttuivat}} automaattisesti ryhmistä $4 ryhmiin $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|tallensi}} tiedoston $3",
        "log-action-filter-block-reblock": "Estoasetusten muuttaminen",
        "log-action-filter-block-unblock": "Eston poistaminen",
        "log-action-filter-contentmodel-change": "Sisältömallin muuttaminen",
+       "log-action-filter-contentmodel-new": "Luotu sivu, jossa on poikkeava Sisältömalli",
        "log-action-filter-delete-delete": "Sivun poistaminen",
        "log-action-filter-delete-restore": "Sivun palauttaminen",
        "log-action-filter-delete-event": "Lokimerkinnän poistaminen",
index 2325bee..17f6213 100644 (file)
        "tog-watchdeletion": "Ajouter à ma liste de suivi les pages et les fichiers que je supprime",
        "tog-watchuploads": "Ajouter les nouveaux fichiers que j’importe à ma liste de suivi",
        "tog-watchrollback": "Ajouter à ma liste de suivi les pages sur lesquelles j’ai effectué une révocation",
-       "tog-minordefault": "Marquer mes modifications comme étant mineures par défaut",
+       "tog-minordefault": "Marquer toutes les modifications comme étant mineures par défaut",
        "tog-previewontop": "Afficher la prévisualisation avant la zone d’édition",
        "tog-previewonfirst": "Afficher la prévisualisation lors de la première modification",
        "tog-enotifwatchlistpages": "M’avertir par courriel lorsqu’une page ou un fichier de ma liste de suivi est modifié",
        "nocookiesfornew": "Le compte utilisateur n’a pas été créé, car nous n’avons pas pu identifier son origine.\nVérifiez que vous avez activé les cookies, rechargez la page et essayez à nouveau.",
        "noname": "Vous n’avez pas saisi un nom d’utilisateur valide.",
        "loginsuccesstitle": "Connecté",
-       "loginsuccess": "Vous êtes maintenant connecté{{GENDER:$1||e|(e)}} à {{SITENAME}} en tant que « $1 ».",
+       "loginsuccess": "<strong>Vous êtes maintenant connecté{{GENDER:$1||e|(e)}} à {{SITENAME}} en tant que « $1 ».</strong>",
        "nosuchuser": "L'utilisateur « $1 » n’existe pas.\nLes noms d’utilisateurs sont sensibles à la casse.\nVérifiez l’orthographe, ou [[Special:UserLogin/signup|créez un nouveau compte]].",
        "nosuchusershort": "Il n’y a pas de contributeur avec le nom « $1 ».\nVeuillez vérifier l’orthographe.",
        "nouserspecified": "Vous devez saisir un nom d’utilisateur.",
        "userpage-userdoesnotexist": "Le compte utilisateur « <nowiki>$1</nowiki> » n'est pas enregistré. Veuillez vérifier que vous voulez créer cette page.",
        "userpage-userdoesnotexist-view": "Le compte utilisateur « $1 » n'est pas enregistré.",
        "blocked-notice-logextract": "Cet utilisateur est actuellement bloqué.\nLa dernière entrée du journal des blocages est indiquée ci-dessous à titre d’information :",
-       "clearyourcache": "'''Note :''' après avoir enregistré vos modifications, il se peut que vous deviez forcer le rechargement complet du cache de votre navigateur pour voir les changements.\n* '''Firefox / Safari :''' Maintenez la touche ''Maj'' (''Shift'') en cliquant sur le bouton ''Actualiser'' ou pressez ''Ctrl-F5'' ou ''Ctrl-R'' (''⌘-R'' sur un Mac) ;\n* '''Google Chrome :''' Appuyez sur ''Ctrl-Maj-R'' (''⌘-Shift-R'' sur un Mac) ;\n* '''Internet Explorer :''' Maintenez la touche ''Ctrl'' en cliquant sur le bouton ''Actualiser'' ou pressez ''Ctrl-F5'' ;\n* '''Opera :''' Videz le cache dans ''Outils → Préférences''.",
+       "clearyourcache": "<strong>Note :</strong> après avoir enregistré vos modifications, il se peut que vous deviez forcer le rechargement complet du cache de votre navigateur pour voir les changements.\n* <strong>Firefox / Safari :</strong> Maintenez la touche <em>Maj</em> (<em>Shift</em>) en cliquant sur le bouton <em>Actualiser</em> ou pressez <em>Ctrl-F5</em> ou <em>Ctrl-R</em> (<em>⌘-R</em> sur un Mac) ;\n* <strong>Google Chrome :</strong> Appuyez sur <em>Ctrl-Maj-R</em> (<em>⌘-Shift-R</em> sur un Mac) ;\n* <strong>Internet Explorer :</strong> Maintenez la touche <em>Ctrl</em> en cliquant sur le bouton <em>Actualiser</em> ou pressez <em>Ctrl-F5</em> ;\n* <strong>Opera :<strong> Allez dans <em>Menu → Settings</em> (<em>Opera → Préférences</em> sur un Mac) et ensuite à <em>Confidentialité & sécurité → Effacer les données d'exploration  → Images et fichiers en cache</em>.",
        "usercssyoucanpreview": "'''Astuce :''' utilisez le bouton « {{int:showpreview}} » pour tester votre nouvelle feuille CSS avant de l'enregistrer.",
        "userjsyoucanpreview": "'''Astuce :''' utilisez le bouton « {{int:showpreview}} » pour tester votre nouvelle feuille JavaScript avant de l'enregistrer.",
        "usercsspreview": "'''Rappelez-vous que vous n'êtes qu'en train de prévisualiser votre propre feuille CSS.'''\n'''Elle n'a pas encore été enregistrée !'''",
        "anonusers": "{{PLURAL:$2|l'utilisateur anonyme|les utilisateurs anonymes}} $1 de {{SITENAME}}",
        "creditspage": "Crédits de la page",
        "nocredits": "Il n'y a pas d'informations d'attribution disponibles pour cette page.",
-       "spamprotectiontitle": "Filtre de protection anti-pollution",
-       "spamprotectiontext": "La page que vous avez voulu sauvegarder a été bloquée par le filtre anti-pollution. Ceci est probablement dû à l'introduction d'un lien vers un site externe apparaissant sur la liste noire.",
-       "spamprotectionmatch": "La chaîne de caractères « '''$1''' » a déclenché le détecteur de pollution.",
+       "spamprotectiontitle": "Filtre de protection anti-pollupostage",
+       "spamprotectiontext": "La page que vous avez voulu sauvegarder a été bloquée par le filtre anti-spam. Ceci est probablement dû à l'introduction d'un lien vers un site externe apparaissant sur la liste noire.",
+       "spamprotectionmatch": "Le texte suivant a déclenché notre filtre de protection anti-pollupostage : $1",
        "spambot_username": "Nettoyage de pourriels par MediaWiki",
        "spam_reverting": "Rétablissement de la dernière version ne contenant pas de lien vers $1",
        "spam_blanking": "Toutes les versions contenant des liens vers $1 sont blanchies",
        "specialpages-group-pagetools": "Outils pour les pages",
        "specialpages-group-wiki": "Données et outils",
        "specialpages-group-redirects": "Pages spéciales redirigées",
-       "specialpages-group-spam": "Outils anti-pourriel",
+       "specialpages-group-spam": "Outils anti-spam",
        "specialpages-group-developer": "Outils du développeur",
        "blankpage": "Page vide",
        "intentionallyblankpage": "Cette page est laissée intentionnellement (presque) vide.",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|a protégé}} $3 $4 [protection en cascade]",
        "logentry-protect-modify": "$1 {{GENDER:$2|a modifié}} le niveau de protection de $3 $4",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|a modifié}} le niveau de protection de $3 $4 [protection en cascade]",
-       "logentry-rights-rights": "$1 a modifié l’appartenance au groupe pour $3 de $4 à $5",
+       "logentry-rights-rights": "$1 a modifié l’appartenance au groupe pour {{GENDER:$6|$3}} de $4 à $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|a modifié}} l'appartenance au groupe pour $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|a été promu}} automatiquement de $4 à $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|a téléchargé}} $3",
index 4cf6c83..9f794d4 100644 (file)
        "userpage-userdoesnotexist": "A conta de usuario \"$1\" non está rexistrada.\nComprobe se desexa crear/editar esta páxina.",
        "userpage-userdoesnotexist-view": "A conta de usuario \"$1\" non está rexistrada.",
        "blocked-notice-logextract": "Este usuario está bloqueado.\nVelaquí está a última entrada do rexistro de bloqueos, por se quere consultala:",
-       "clearyourcache": "'''Nota:''' Despois de gardar, cómpre limpar a memoria caché do seu navegador para ver os cambios.\n* '''Firefox/Safari:''' Prema ''Maiúsculas'' á vez que en ''Recargar'', ou prema en ''Ctrl-F5'' ou ''Ctrl-R'' (''⌘-R'' nos Mac)\n* '''Google Chrome:''' Prema en ''Ctrl-Maiús-R'' (''⌘-Maiús-R'' nos Mac)\n* '''Internet Explorer:''' Prema ''Ctrl'' ao tempo que fai clic en ''Refrescar'', ou prema en ''Ctrl-F5''\n* '''Opera:''' Limpe a súa memoria caché en ''Ferramentas → Preferencias''",
+       "clearyourcache": "<strong>Nota:</strong> Despois de gardar, cómpre limpar a memoria caché do seu navegador para ver os cambios.\n* <strong>Firefox/Safari:</strong> Prema <em>Maiúsculas</em> á vez que en <em>Recargar</em>, ou prema en <em>Ctrl-F5</em> ou <em>Ctrl-R</em> (<em>⌘-R</em> nos Mac)\n* <strong>Google Chrome:</strong> Prema en <em>Ctrl-Maiús-R</em> (<em>⌘-Maiús-R</em> nos Mac)\n* <strong>Internet Explorer:</strong> Prema <em>Ctrl</em> ao tempo que fai clic en <em>Refrescar</em>, ou prema en <em>Ctrl-F5</em>\n* <strong>Opera:<strong> Vaia a  <em>Menú → Configuración</em> (<em>Opera → Preferencias</em> nun Mac) e logo a <em>Privacidade & seguridade → Limpar datos de navegación → Ficheiros e imaxes na caché</em>.",
        "usercssyoucanpreview": "'''Nota:''' Use o botón \"{{int:showpreview}}\" para verificar o novo CSS antes de gardalo.",
        "userjsyoucanpreview": "<strong>Nota:</strong> Use o botón \"{{int:showpreview}}\" para verificar o novo JavaScript antes de gardalo.",
        "usercsspreview": "'''Lembre que só está vendo a vista previa do seu CSS de usuario.'''\n'''Este aínda non foi gardado!'''",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|protexeu}} a $3 $4 [en cascada]",
        "logentry-protect-modify": "$1 {{GENDER:$2|cambiou}} o nivel de protección de $3 $4",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|cambiou}} o nivel de protección de $3 $4 [en cascada]",
-       "logentry-rights-rights": "$1 {{GENDER:$2|cambiou}} o grupo ao que pertence {{GENDER:$3|$3}} de $4 a $5",
+       "logentry-rights-rights": "$1 {{GENDER:$2|cambiou}} o grupo ao que pertence {{GENDER:$6|$3}} de $4 a $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|cambiou}} o grupo ao que pertence $3",
        "logentry-rights-autopromote": "$1 foi {{GENDER:$2|promovido|promovida}} automaticamente de $4 a $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|cargou}} \"$3\"",
index 85f17a5..c478e9d 100644 (file)
@@ -28,7 +28,8 @@
                        "NehalDaveND",
                        "Nisargjhaveri",
                        "Matma Rex",
-                       "Bhatakati aatma"
+                       "Bhatakati aatma",
+                       "YmKavishwar"
                ]
        },
        "tog-underline": "કડીઓની નીચે લીટી (અંડરલાઇન):",
        "accmailtitle": "ગુપ્તસંજ્ઞા મોકલવામાં આવી છે.",
        "accmailtext": "[[User talk:$1|$1]] માટે રચેલ ગુપ્તસંજ્ઞા $2 ને મોકલાવી દેવાઇ છે. આ નવા ખાતાનીગુપ્તસંજ્ઞા પ્રવેશ કર્યા બાદ ''[[Special:ChangePassword|ગુપ્તસંજ્ઞા બદલો]]'' વાપરીને બદલી શકાશે.",
        "newarticle": "(નવીન)",
-       "newarticletext": "આપ જે કડીને અનુસરીને અહીં પહોંચ્યા છો તે પાનું અસ્તિત્વમાં નથી.\n<br />નવું પાનું બનાવવા માટે નીચે આપેલા ખાનામાં લખવાનું શરૂ કરો (વધુ માહિતિ માટે [$1 મદદ] જુઓ).\n<br />જો આપ ભુલમાં અહીં આવી ગયા હોવ તો, આપનાં બ્રાઉઝર નાં '''બેક''' બટન પર ક્લિક કરીને પાછા વળો.",
+       "newarticletext": "<div style=\"background: #F9F9F9; margin-top: 1em; padding: 1em; border: 1px solid #ccc; border-right: 2px solid #ccc; border-bottom: 2px solid #ccc\"><center>'''આ વિકિ પ્રકલ્પ પર આ પ્રકારનો લેખ હાલમાં નથી'''</center>\n----\n* [[Image:Searchtool.svg|25px|alt=|link=]] '''[[{{ns:special}}:Search/{{PAGENAME}}|“{{PAGENAME}}”]]''' માટે શોધો.\n* [[Image:Nuvola apps fonts.png|25px|alt=|link=]] જે લેખોનું શીર્ષક આ પ્રત્યય સાથે શરુ થાય છે તેનો  [[{{ns:special}}:Prefixindex/{{FULLPAGENAME}}|ઉપસર્ગ]] જૂઓ.\n* [[Image:Nuvola apps ksig.png|25px|alt=|link=]] <span class=\"plainlinks\">'''[{{SERVER}}{{localurl:{{NAMESPACE}}:{{PAGENAME}}|action=edit}} આ શીર્ષકનું નવું પૃષ્ઠ બનાવો.]'''</span> \n* [[Image:WP-TranslationProject TwoFlags.svg|25px|alt=|link=]] ''વૈશ્વિક લેખ યોજના'' દ્વારા આ લેખને [//vs.aka-online.de/cgi-bin/globalwpsearch.pl?search={{PAGENAMEE}} અન્ય ભાષાઓમાં શોધો.]\n<div style=\"margin: 1em 2em 1em 3em; font-size: 90%;\">\nયોગદાનકર્તાઓ માટે:\n* જો આપ હાલમાં આ લેખ બનાવી રહ્યા છો તો પોતાના બ્રાઉઝરની <span class=\"plainlinks\">[{{SERVER}}{{localurl:{{NAMESPACE}}:{{PAGENAME}}|action=purge}} કૈશ ખાલી]</span> કરો, અથવા થોડી વધુ રાહ જૂઓ, પછી કામ આગળ વધારો.\n* કદાચ આ પાનું દૂર કરાયું છે, આ જોવા માટે કૃપા કરીને <span class=\"plainlinks\">[{{fullurl:Special:Log|type=delete&page={{FULLPAGENAMEE}}}} આ પાનાનો વિલોપન ઇતિહાસ]</span> જૂઓ.\n* આપ આ લેખ બનાવવા માગો છો તો ક્રુપા કરીને નીચે આપેલા ખાનામાં લખવાનું શરુ કરો.\n* જો આપ ભૂલમાં અહીં આવી ગયા છો તો આપના બ્રાઉઝરના બૅક બટન પર ક્લિક કરીને પરત ફરો.</div></div>",
        "anontalkpagetext": "----\n<em>આ એક અજ્ઞાત સભ્યનું ચર્ચા પાનું છે જેમણે ક્યાં તો પોતાનું ખાતું ખોલ્યું નથી અથવા તો તેને વાપરતા નથી.</em>\nઆથી તેમને ઓળખવા માટે અમારે સાંખ્યિક IP સરનામાની મદદ લેવી પડી છે.\nઆવું IP સરનામું ઘણાં અન્ય સભ્યો પણ વાપરતા હોઇ શકે.\nજો તમે અજ્ઞાત સભ્ય હોવ અને માનતા હોવ કે અસંધિત ટિપ્પણીઓ તમારી તરફ વાળવામાં આવી છે, તો કૃપયા  [[Special:UserLogin/signup|create an account]] અથવા [[Special:UserLogin|log in]]નો ઉપયોગ કરશો જેથી તમને કોઈ અજ્ઞાત સભ્ય સમજવાની ભૂલ ભવિષ્યમાં ટાળી શકાય.",
        "noarticletext": "આ પાનામાં હાલમાં કોઇ માહિતિ નથી.\nતમે  [[Special:Search/{{PAGENAME}}|આ શબ્દ]] ધરાવતાં અન્ય લેખો શોધી શકો છો, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} સંલગ્ન માહિતિ પત્રકોમાં શોધી શકો છો],\nઅથવા  [{{fullurl:{{FULLPAGENAME}}|action=edit}} આ પાનામાં ફેરફાર કરી] માહિતિ ઉમેરવાનું શરૂ કરી શકો છો</span>.",
        "noarticletext-nopermission": "આ પાનામાં હાલમાં કોઇ માહિતિ નથી.\nતમે  [[Special:Search/{{PAGENAME}}|આ શબ્દ]] ધરાવતાં અન્ય લેખો શોધી શકો છો, અથવા <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} સંલગ્ન માહિતિ પત્રકોમાં શોધી શકો છો], પરંતુ તમને આ પાનું બનાવવાની મંજૂરી નથી.",
index 32ed7fc..ef46c80 100644 (file)
@@ -33,7 +33,8 @@
                        "Eraab",
                        "Geagea",
                        "פוילישער",
-                       "DatGuy"
+                       "DatGuy",
+                       "IKhitron"
                ]
        },
        "tog-underline": "סימון קישורים בקו תחתי:",
        "article": "דף תוכן",
        "newwindow": "(נפתח בחלון חדש)",
        "cancel": "ביטול",
-       "moredotdotdot": "עוד",
+       "moredotdotdot": "עוד...",
        "morenotlisted": "רשימה זו אינה מלאה.",
        "mypage": "דף משתמש",
        "mytalk": "שיחה",
        "hr_tip": "קו אופקי (השתדלו להימנע משימוש בקו)",
        "summary": "תקציר:",
        "subject": "נושא:",
-       "minoredit": "×\96×\94×\95 ×©×\99× ×\95×\99 ×\9eשנ×\99",
+       "minoredit": "×\96×\95×\94×\99 ×¢×¨×\99×\9b×\94 ×\9eשנ×\99ת",
        "watchthis": "מעקב אחרי דף זה",
        "savearticle": "שמירה",
        "preview": "תצוגה מקדימה",
        "accmailtitle": "הסיסמה נשלחה",
        "accmailtext": "סיסמה אקראית עבור [[User talk:$1|$1]] נשלחה אל $2. ניתן לשנותה בדף '''[[Special:ChangePassword|שינוי הסיסמה]]''' לאחר הכניסה.",
        "newarticle": "(חדש)",
-       "newarticletext": "×\94×\92עת×\9d ×\9c×\93×£ ×©×¢×\93×\99×\99×\9f ×\90×\99× × ×\95 ×§×\99×\99×\9d.\n×\9b×\93×\99 ×\9c×\99צ×\95ר ×\90ת ×\94×\93×£ ×\94×\96×\94, ×\94ת×\97×\99×\9c×\95 ×\9c×\94ק×\9c×\99×\93 ×\91ת×\99×\91ת ×\94×\98קס×\98 למטה (ראו את [$1 דף העזרה] למידע נוסף).\nאם הגעתם לכאן בטעות, לחצו על כפתור ה<strong>חזרה</strong> (Back) בדפדפן שלכם.",
+       "newarticletext": "×\94×\92עת×\9d ×\9c×\93×£ ×©×¢×\93×\99×\99×\9f ×\90×\99× ×\95 ×§×\99×\99×\9d.\n×\9b×\93×\99 ×\9c×\99צ×\95ר ×\90ת ×\94×\93×£ ×\94×\96×\94, ×\94ת×\97×\99×\9c×\95 ×\9c×\94ק×\9c×\99×\93 ×\91ת×\99×\91ת ×\94×\98קס×\98 ×©למטה (ראו את [$1 דף העזרה] למידע נוסף).\nאם הגעתם לכאן בטעות, לחצו על כפתור ה<strong>חזרה</strong> (Back) בדפדפן שלכם.",
        "anontalkpagetext": "----\n<em>זהו דף שיחה של משתמש אנונימי שעדיין לא יצר חשבון במערכת, או שהוא לא משתמש בו.</em>\nלכן עלינו להשתמש בכתובת ה־IP המספרית כדי לזהותו.\nייתכן שכתובת IP זו תהיה משותפת למספר משתמשים.\nאם אתם משתמשים אנונימיים ומרגישים שקיבלתם הודעות בלתי רלוונטיות, אנא [[Special:UserLogin/signup|צרו חשבון]] או [[Special:UserLogin|היכנסו לחשבון]] כדי להימנע מבלבול עתידי עם משתמשים אנונימיים נוספים.",
-       "noarticletext": "×\90×\99×\9f ×\9bר×\92×¢ ×\98קס×\98 ×\91×\93×£ ×\94×\96×\94.\n×\91×\90פשר×\95ת×\9b×\9d [[Special:Search/{{PAGENAME}}|לחפש את כותרת הדף]] בדפים אחרים,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} לחפש את הדף ביומנים],\nאו [{{fullurl:{{FULLPAGENAME}}|action=edit}} ליצור את הדף]</span>.",
-       "noarticletext-nopermission": "×\90×\99×\9f ×\9bר×\92×¢ ×\98קס×\98 ×\91×\93×£ ×\94×\96×\94.\n×\91×\90פשר×\95ת×\9b×\9d [[Special:Search/{{PAGENAME}}|×\9c×\97פש ×\90ת ×\9b×\95תרת ×\94×\93×£]] ×\91×\93פ×\99×\9d ×\90×\97ר×\99×\9d,\n×\90×\95 <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ×\9c×\97פש ×\90ת ×\94×\93×£ ×\91×\99×\95×\9e× ×\99×\9d]</span>,\n×\90×\9a ×\90×\99× ×\9b×\9d ×\9e×\95רש×\99×\9d ליצור את הדף.",
+       "noarticletext": "×\90×\99×\9f ×\9bר×\92×¢ ×\98קס×\98 ×\91×\93×£ ×\94×\96×\94.\n×\91×\90פשר×\95ת×\9a [[Special:Search/{{PAGENAME}}|לחפש את כותרת הדף]] בדפים אחרים,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} לחפש את הדף ביומנים],\nאו [{{fullurl:{{FULLPAGENAME}}|action=edit}} ליצור את הדף]</span>.",
+       "noarticletext-nopermission": "×\90×\99×\9f ×\9bר×\92×¢ ×\98קס×\98 ×\91×\93×£ ×\94×\96×\94.\n×\91×\90פשר×\95ת×\9a [[Special:Search/{{PAGENAME}}|×\9c×\97פש ×\90ת ×\9b×\95תרת ×\94×\93×£]] ×\91×\93פ×\99×\9d ×\90×\97ר×\99×\9d ×\90×\95 <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ×\9c×\97פש ×\90ת ×\94×\93×£ ×\91×\99×\95×\9e× ×\99×\9d]</span>, ×\90×\9a ×\90×\99×\9f ×\9c×\9a ×\94רש×\90×\94 ליצור את הדף.",
        "missing-revision": "גרסה #$1 של הדף \"{{FULLPAGENAME}}\" אינה קיימת.\n\nזה נגרם בדרך כלל על־ידי לחיצה על קישור ישן לגרסה קודמת של דף שנמחק.\nאפשר למצוא פרטים ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].",
        "userpage-userdoesnotexist": "חשבון המשתמש \"$1\" אינו רשום.\nאנא בִּדקו אם ברצונכם ליצור/לערוך את הדף הזה.",
        "userpage-userdoesnotexist-view": "חשבון המשתמש \"$1\" אינו רשום.",
        "mergehistory-no-destination": "דף היעד $1 אינו קיים.",
        "mergehistory-invalid-source": "דף המקור חייב להיות בעל כותרת תקינה.",
        "mergehistory-invalid-destination": "דף היעד חייב להיות בעל כותרת תקינה.",
-       "mergehistory-autocomment": "×\9e×\99×\96×\92 ×\90ת [[:$1]] לתוך [[:$2]]",
-       "mergehistory-comment": "×\9e×\99×\96×\92 ×\90ת [[:$1]] לתוך [[:$2]]: $3",
+       "mergehistory-autocomment": "×\94×\93×£ [[:$1]] ×\9e×\95×\96×\92 לתוך [[:$2]]",
+       "mergehistory-comment": "×\94×\93×£ [[:$1]] ×\9e×\95×\96×\92 לתוך [[:$2]]: $3",
        "mergehistory-same-destination": "דפי המקור והיעד זהים",
        "mergehistory-reason": "סיבה:",
        "mergelog": "יומן מיזוגים",
        "powersearch-ns": "חיפוש על־פי מרחבי שם:",
        "powersearch-togglelabel": "בחירה:",
        "powersearch-toggleall": "הכול",
-       "powersearch-togglenone": "אף אחד",
+       "powersearch-togglenone": "×\90×£ ×\9c×\90 ×\90×\97×\93",
        "powersearch-remember": "שמירת הבחירה עבור חיפושים עתידיים",
        "search-external": "חיפוש חיצוני",
        "searchdisabled": "חיפוש ב{{grammar:תחילית|{{SITENAME}}}} אינו מופעל כעת.\nבינתיים אפשר לחפש באמצעות גוגל.\nשימו לב שייתכן שהמידע של {{SITENAME}} שם אינו מעודכן.",
        "recentchanges-submit": "הצגה",
        "rcnotefrom": "להלן {{PLURAL:$5|השינוי שבוצע|השינויים שבוצעו}} החל מ‏‏֫־<b>$2</b> (עד <b>$1</b> מוצגים).",
        "rclistfrom": "הצגת שינויים חדשים החל מ־$2, $3",
-       "rcshowhideminor": "$1 ×©×\99× ×\95×\99×\99×\9d ×\9eשנ×\99×\99×\9d",
+       "rcshowhideminor": "$1 ×¢×¨×\99×\9b×\95ת ×\9eשנ×\99×\95ת",
        "rcshowhideminor-show": "הצגת",
        "rcshowhideminor-hide": "הסתרת",
        "rcshowhidebots": "$1 בוטים",
        "brokenredirects-delete": "מחיקה",
        "withoutinterwiki": "דפים ללא קישורי שפה",
        "withoutinterwiki-summary": "הדפים הבאים אינם מקשרים לגרסאות שלהם בשפות אחרות:",
-       "withoutinterwiki-legend": "×\94×\93פ×\99×\9d ×\94×\9eת×\97×\99×\9c×\99×\9d ×\91â\80¦",
+       "withoutinterwiki-legend": "ת×\97×\99×\9c×\99ת",
        "withoutinterwiki-submit": "הצגה",
        "fewestrevisions": "הדפים בעלי מספר העריכות הנמוך ביותר",
        "nbytes": "{{PLURAL:$1|בית אחד|$1 בתים}}",
        "mostimages": "הקבצים המקושרים ביותר",
        "mostinterwikis": "הדפים עם המספר הרב ביותר של קישורי בינוויקי",
        "mostrevisions": "הדפים עם מספר העריכות הגבוה ביותר",
-       "prefixindex": "רש×\99×\9eת ×\94×\93פ×\99×\9d ×\94×\9eת×\97×\99×\9c×\99×\9d ×\91â\80¦",
-       "prefixindex-namespace": "רש×\99×\9eת ×\94×\93פ×\99×\9d ×\94×\9eת×\97×\99×\9c×\99×\9d ×\91â\80¦ (במרחב השם $1)",
+       "prefixindex": "×\9b×\9c ×\93פ×\99×\9d ×¢×\9d ×\94ת×\97×\99×\9c×\99ת",
+       "prefixindex-namespace": "×\9b×\9c ×\93פ×\99×\9d ×¢×\9d ×\94ת×\97×\99×\9c×\99ת (במרחב השם $1)",
        "prefixindex-submit": "הצגה",
        "prefixindex-strip": "הסתרת התחילית ברשימה",
        "shortpages": "דפים קצרים",
        "logentry-contentmodel-change-revert": "שחזור",
        "protectlogpage": "יומן הגנות",
        "protectlogtext": "להלן רשימה של שינויי ההגנה על דפים.\nראו גם את [[Special:ProtectedPages|רשימת הדפים המוגנים]] הנוכחית.",
-       "protectedarticle": "×\94פע×\99×\9c הגנה על הדף \"[[$1]]\"",
-       "modifiedarticleprotection": "ש×\99× ×\94 ×\90ת ×¨×\9eת ×\94×\94×\92× ×\94 ×©×\9c ×\94×\93×£ \"[[$1]]\"",
-       "unprotectedarticle": "×\94ס×\99ר ×\90ת ×\94×\94×\92× ×\94 ×\9e×\94×\93×£ \"[[$1]]\"",
-       "movedarticleprotection": "×\94×¢×\91×\99ר ×\90ת ×\94×\92×\93ר×\95ת ×\94×\94×\92× ×\94 ×\9e\"[[$2]]\" ×\9c\"[[$1]]\"",
+       "protectedarticle": "×\94×\95פע×\9c×\94 הגנה על הדף \"[[$1]]\"",
+       "modifiedarticleprotection": "ר×\9eת ×\94×\94×\92× ×\94 ×©×\9c ×\94×\93×£ \"[[$1]]\" ×©×\95נת×\94",
+       "unprotectedarticle": "×\94×\94×\92× ×\94 ×¢×\9c ×\94×\93×£ \"[[$1]]\" ×\94×\95סר×\94",
+       "movedarticleprotection": "×\94×\92×\93ר×\95ת ×\94×\94×\92× ×\94 ×©×\9c ×\94×\93×£ \"[[$2]]\" ×\94×\95×¢×\91ר×\95 ×\9c×\93×£ \"[[$1]]\"",
        "protect-title": "שינוי רמת ההגנה של הדף \"$1\"",
        "protect-title-notallowed": "הצגת רמת ההגנה של הדף \"$1\"",
        "prot_1movedto2": "[[$1]] הועבר לשם [[$2]]",
        "undeletedrevisions-files": "{{PLURAL:$1|גרסה אחת|$1 גרסאות}} ו{{PLURAL:$2|קובץ אחד|־$2 קבצים}} שוחזרו",
        "undeletedfiles": "{{PLURAL:$1|שוחזר קובץ אחד|שוחזרו $1 קבצים}}",
        "cannotundelete": "השחזור נכשל:\n$1",
-       "undeletedpage": "'''הדף $1 שוחזר בהצלחה.'''\n\nראו את [[Special:Log/delete|יומן המחיקות]] לרשימה של מחיקות ושחזורים אחרונים.",
+       "undeletedpage": "<strong>הדף $1 שוחזר</strong>\n\nראו את [[Special:Log/delete|יומן המחיקות]] לרשימה של המחיקות והשחזורים שבוצעו לאחרונה.",
        "undelete-header": "ראו את [[Special:Log/delete|יומן המחיקות]] לדפים שנמחקו לאחרונה.",
        "undelete-search-title": "חיפוש דפים שנמחקו",
        "undelete-search-box": "חיפוש דפים שנמחקו",
        "ipbother": "זמן אחר:",
        "ipboptions": "שעתיים:2 hours,יום:1 day,שלושה ימים:3 days,שבוע:1 week,שבועיים:2 weeks,חודש:1 month,שלושה חודשים:3 months,שישה חודשים:6 months,שנה:1 year,זמן בלתי מוגבל:infinite",
        "ipbhidename": "הסתרת שם המשתמש מהעריכות ומהרשימות",
-       "ipbwatchuser": "מעקב אחר דף המשתמש ודף השיחה של משתמש זה",
+       "ipbwatchuser": "מעקב אחרי דף המשתמש ודף השיחה של משתמש זה",
        "ipb-disableusertalk": "ביטול האפשרות של המשתמש לערוך את דף השיחה של עצמו בעת החסימה",
        "ipb-change-block": "חסימת המשתמש מחדש עם הגדרות אלה",
        "ipb-confirm": "אישור החסימה",
        "import-upload-filename": "שם הקובץ:",
        "import-comment": "הערה:",
        "importtext": "נא לייצא את הקובץ מאתר המקור באמצעות ב[[Special:Export|כלי הייצוא]].\nשמרו אותו למחשב שלכם והעלו אותו לכאן.",
-       "importstart": "×\9e×\99×\99×\91×\90 ×\93פ×\99×\9dâ\80¦",
-       "import-revision-count": "&rlm;{{PLURAL:$1|גרסה אחת|$1 גרסאות}}",
+       "importstart": "×\99×\99×\91×\95×\90 ×\93פ×\99×\9d...",
+       "import-revision-count": "{{PLURAL:$1|גרסה אחת|$1 גרסאות}}",
        "importnopages": "אין דפים לייבוא.",
        "imported-log-entries": "{{PLURAL:$1|יובאה פעולת יומן אחת|יובאו $1 פעולות יומן}}.",
        "importfailed": "הייבוא נכשל: <nowiki>$1</nowiki>",
        "tooltip-preview": "תצוגה מקדימה של השינויים שלך. נא להשתמש באפשרות זו לפני השמירה.",
        "tooltip-diff": "צפייה בשינויים שערכתם בטקסט",
        "tooltip-compareselectedversions": "צפייה בהשוואת שתי גרסאות של דף זה",
-       "tooltip-watch": "הוספת דף זה לרשימת המעקב",
+       "tooltip-watch": "הוספת דף זה לרשימת המעקב שלך",
        "tooltip-watchlistedit-normal-submit": "הסרת הדפים",
        "tooltip-watchlistedit-raw-submit": "עדכון רשימת המעקב",
        "tooltip-recreate": "יצירת הדף מחדש למרות שהוא נמחק",
        "notificationemail_body_removed": "מישהו, כנראה אתם (מכתובת ה־IP הזאת: $1),\nהסיר את כתובת הדואר האלקטרוני של החשבון \"$2\" ב{{grammar:תחילית|{{SITENAME}}}}.\n\nאם לא אתם עשיתם זאת, אנא צרו קשר מיידי עם מפעיל מערכת באתר.",
        "scarytranscludedisabled": "[הכללת דפים בין אתרים מבוטלת]",
        "scarytranscludefailed": "[אחזור התבנית נכשל עבור $1]",
-       "scarytranscludefailed-httpstatus": "[אחזור התבנית נכשל עבור $1&rlm;: HTTP $2]",
+       "scarytranscludefailed-httpstatus": "[אחזור התבנית נכשל עבור $1: מצב HTTP $2]",
        "scarytranscludetoolong": "[כתובת ה־URL ארוכה מדי]",
        "deletedwhileediting": "<strong>אזהרה:</strong> דף זה נמחק לאחר שהתחלת לערוך!",
        "confirmrecreate": "ה{{GENDER:$1|משתמש|משתמשת}} [[User:$1|$1]] ([[User talk:$1|שיחה]]) {{GENDER:$1|מחק|מחקה}} את הדף הזה לאחר שהתחלת לערוך אותו, מהסיבה הבאה:\n: <em>$2</em>\nיש לאשר שאכן ברצונך ליצור מחדש את הדף.",
        "htmlform-user-not-valid": "<strong>$1</strong> אינו שם משתמש תקין.",
        "sqlite-has-fts": "$1 עם תמיכה בחיפוש בטקסט מלא",
        "sqlite-no-fts": "$1 ללא תמיכה בחיפוש בטקסט מלא",
-       "logentry-delete-delete": "$1 {{GENDER:$2|מחק|מחקה}} את הדף $3&rlm;",
-       "logentry-delete-restore": "$1 {{GENDER:$2|שחזר|שחזרה}} את הדף $3&rlm;",
+       "logentry-delete-delete": "$1 {{GENDER:$2|מחק|מחקה}} את הדף $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|שחזר|שחזרה}} את הדף $3",
        "logentry-delete-event": "$1 {{GENDER:$2|שינה|שינתה}} את מצב התצוגה של {{PLURAL:$5|פעולת יומן|$5 פעולות יומן}} של $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|שינה|שינתה}} את מצב התצוגה של {{PLURAL:$5|גרסה|$5 גרסאות}} בדף $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|שינה|שינתה}} את מצב התצוגה של פעולות יומן של $3",
        "logentry-import-interwiki": "$1 {{GENDER:$2|ייבא|ייבאה}} את $3 מאתר ויקי אחר",
        "logentry-import-interwiki-details": "$1 {{GENDER:$2|ייבא|ייבאה}} את $3 מ־$5&rlm; ({{PLURAL:$4|גרסה אחת|$4 גרסאות}})&rlm;",
        "logentry-merge-merge": "$1 {{GENDER:$2|מיזג|מיזגה}} את $3 לתוך $4 (גרסאות עד $5)",
-       "logentry-move-move": "$1 {{GENDER:$2|העביר|העבירה}} את הדף $3 ל{{GRAMMAR:תחילית|$4}}&rlm;",
-       "logentry-move-move-noredirect": "$1 {{GENDER:$2|העביר|העבירה}} את הדף $3 ל{{GRAMMAR:תחילית|$4}} בלי להשאיר הפניה",
-       "logentry-move-move_redir": "$1 {{GENDER:$2|העביר|העבירה}} את הדף $3 ל{{GRAMMAR:תחילית|$4}} תוך דריסת הפניה",
-       "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|העביר|העבירה}} את הדף $3 ל{{GRAMMAR:תחילית|$4}} תוך דריסת הפניה ובלי להשאיר הפניה",
+       "logentry-move-move": "$1 {{GENDER:$2|העביר|העבירה}} את הדף $3 לשם $4",
+       "logentry-move-move-noredirect": "$1 {{GENDER:$2|העביר|העבירה}} את הדף $3 לשם $4 בלי להשאיר הפניה",
+       "logentry-move-move_redir": "$1 {{GENDER:$2|העביר|העבירה}} את הדף $3 לשם $4 תוך דריסת הפניה",
+       "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|העביר|העבירה}} את הדף $3 לשם $4 תוך דריסת הפניה ובלי להשאיר הפניה",
        "logentry-patrol-patrol": "$1 {{GENDER:$2|סימן|סימנה}} את הגרסה $4 בדף $3 כבדוקה",
        "logentry-patrol-patrol-auto": "$1 {{GENDER:$2|סימן|סימנה}} אוטומטית את הגרסה $4 בדף $3 כבדוקה",
        "logentry-newusers-newusers": "חשבון המשתמש $1 {{GENDER:$2|נוצר}}",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|הפעיל|הפעילה}} הגנה על הדף $3 $4 [מדורג]",
        "logentry-protect-modify": "$1 {{GENDER:$2|שינה|שינתה}} את רמת ההגנה של הדף $3 $4",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|שינה|שינתה}} את רמת ההגנה של הדף $3 $4 [מדורג]",
-       "logentry-rights-rights": "$1 {{GENDER:$2|שינה|שינתה}} את ההרשאות של {{GENDER:$3|$3}} מ{{GRAMMAR:תחילית|$4}} ל{{GRAMMAR:תחילית|$5}}&rlm;",
+       "logentry-rights-rights": "$1 {{GENDER:$2|שינה|שינתה}} את ההרשאות של {{GENDER:$6|$3}} מ{{GRAMMAR:תחילית|$4}} ל{{GRAMMAR:תחילית|$5}}",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|שינה|שינתה}} את ההרשאות של $3&rlm;",
        "logentry-rights-autopromote": "$1 קודם אוטומטית מ{{GRAMMAR:תחילית|$4}} ל{{GRAMMAR:תחילית|$5}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|העלה|העלתה}} את $3",
        "log-description-tag": "הדף הזה מראה מתי משתמשים הוסיפו [[Special:Tags|תגיות]] לגרסאות או רשומות יומן מסוימות או הסירו אותן. היומן אינו מציג פעולות תיוג שבוצעו כחלק מעריכה, מחיקה או פעולה דומה.",
        "logentry-tag-update-add-revision": "$1 {{GENDER:$2|הוסיף|הוסיפה}} את {{PLURAL:$7|התגית|התגיות}} $6 לגרסה $4 של הדף $3",
        "logentry-tag-update-add-logentry": "$1 {{GENDER:$2|הוסיף|הוסיפה}} את {{PLURAL:$7|התגית|התגיות}} $6 לרשומת היומן $5 של הדף $3",
-       "logentry-tag-update-remove-revision": "$1 {{GENDER:$2|×\94ס×\99ר|×\94ס×\99ר×\94}} ×\90ת {{PLURAL:$9|×\94ת×\92×\99ת|×\94ת×\92×\99×\95ת}} $8 ×\9e×\94×\92רס×\94 $4 ×©×\9c ×\94×\93×£ $3",
+       "logentry-tag-update-remove-revision": "$1 {{GENDER:$2|הסיר|הסירה}} את {{PLURAL:$9|התגית|התגיות}} $8 מגרסה $4 של הדף $3",
        "logentry-tag-update-remove-logentry": "$1 {{GENDER:$2|הסיר|הסירה}} את {{PLURAL:$9|התגית|התגיות}} $8 מרשומת היומן $5 של הדף $3",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|עדכן|עדכנה}} את התגיות בגרסה $4 של הדף $3 ({{PLURAL:$7|הוסיף|הוסיפה}} את $6; {{PLURAL:$9|הסיר|הסירה}} את $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|עדכן|עדכנה}} את התגיות ברשומת היומן $5 של הדף $3 ({{PLURAL:$7|הוסיף|הוסיפה}} את $6; {{PLURAL:$9|הסיר|הסירה}} את $8)",
index 39436f8..ed8b068 100644 (file)
        "recentchanges": "Վերջին փոփոխություններ",
        "recentchanges-legend": "Վերջին փոփոխությունների նախընտրություններ",
        "recentchanges-summary": "Հետևեք վիքիում կատարված վերջին փոփոխություններին այս էջում։",
+       "recentchanges-noresult": "Տրված ժամանակահատվածում այս կարգավորումներով փոփոխություն չի եղել։",
        "recentchanges-feed-description": "Հետևեք վիքիում կատարված վերջին փոփոխություններին այս սնուցման մեջ։",
        "recentchanges-label-newpage": "Այս խմբագրմամբ ստեղծվել է նոր էջ",
        "recentchanges-label-minor": "Սա չնչին խմբագրում է",
        "version-poweredby-credits": "Այս վիքին աշխատում է '''[https://www.mediawiki.org/ MediaWiki]'''֊ով, copyright © 2001-$1 $2։",
        "fileduplicatesearch": "Փնտրել կրկնօրինակ պատկերներ",
        "fileduplicatesearch-summary": "Փնտրել կրկնօրինակ պատկերներ՝ հեշ արժեքների հիման վրա",
-       "fileduplicatesearch-legend": "Փնտրել կրկնօրինակներ",
        "fileduplicatesearch-filename": "Նիշքի անուն․",
        "fileduplicatesearch-submit": "Որոնել",
        "fileduplicatesearch-info": "$1 × $2 փիքսել<br />Նիշքի չափը՝ $3<br />MIME-տիպը՝ $4",
index faa6b5a..5e2b5fa 100644 (file)
        "category-subcat-count-limited": "Укх катагa чу {{PLURAL:$1|1=$1 к|алкатаг|$1 к|алкатагаш}}.",
        "category-article-count": "{{PLURAL:$2|Укх катага цхьа оаг|ув мара чулоацац.|{{PLURAL:$1|1=$1 оаг|ув хьахекха я|$1 оаг|oнаш хьахекха я}} укх катага $2 йолачарeх.}}",
        "category-article-count-limited": "Укх катага чу {{PLURAL:$1|1=$1 оаг|ув|$1 оаг|oнаш}}.",
-       "category-file-count": "{{PLURAL:$2|Укх катагори чу цаI мара файл дац.|{{PLURAL:$1|1=$1 файл хьахьокхаш я|$1 файл хьахьокхаш я}} укх категори $2 долачарeх.}}",
+       "category-file-count": "{{PLURAL:$2|Укх катагори чу цаI мара файл яц.|{{PLURAL:$1|1=$1 файл хьахьокхаш я|$1 файл хьахьокхаш я}} укх категори $2 долачарeх.}}",
        "category-file-count-limited": "Укх катага чу {{PLURAL:$1|1=$1 лурдар|$1 лурдараш}}.",
        "listingcontinuesabbrev": "д|ахо",
        "index-category": "Д|ахьожама оаг|онаш",
        "loginlanguagelabel": "Мотт: $1",
        "pt-login": "Чувала/яла",
        "pt-createaccount": "Учёта яздар кхолла",
+       "pt-userlogout": "Аравала/яла",
        "changepassword": "КъайладIоaгIа дIахувцар",
        "oldpassword": "Къаьна къайладIоагӀа:",
        "newpassword": "Керда къайладIоагӀа:",
        "post-expand-template-inclusion-category": "Чулоаца чIабала мегаш дола дустам дукхалена тӀехьайоала оагӀувнаш",
        "post-expand-template-argument-warning": "Зем бе! Ер оагӀув цаӀ куцкепа |аьлдош мара чулоацац, юхадастара сел доккха дустам йолаш.\nЦу тайпара |аьлдешаш ӀокӀаладаькха да.",
        "post-expand-template-argument-category": "Куцкепий теркамза |аьлдешаш чулоаца оагӀувнаш",
-       "viewpagelogs": "Укх оагӀува тептараш хьокха",
+       "viewpagelogs": "Укх оагӀон тептараш хьокха",
        "currentrev-asof": "тӀеххьара верси $1",
        "revisionasof": "Верси $1",
        "revision-info": "$1; $2 хувцам",
        "prevpage": "($1) хьалхара оагIув",
        "allpagesfrom": "Цу тайпара ювлаж йола оагIувнаш белгал е:",
        "allpagesto": "Укх оагIувнаш тIа бIарга дита:",
-       "allarticles": "Еррига оагIувнаш",
+       "allarticles": "Еррига оагIонаш",
        "allpagessubmit": "Кхоачашде",
        "categories": "Категореш",
        "linksearch": "Т|ера|инкаш лахар",
        "mycontris": "Са къахьегам",
        "contribsub2": "{{GENDER:$3|$1}} ($2) баь болх",
        "uctop": "(xIанзара)",
-       "month": "ЦÑ\85Ñ\8cан бетт (кхы хьалхагIа)",
-       "year": "ЦÑ\85Ñ\8cан Ñ\88еÑ\80а (кхы хьалхагIа):",
+       "month": "УкÑ\85 бетт (кхы хьалхагIа)",
+       "year": "УкÑ\85 Ñ\88еÑ\80 (кхы хьалхагIа):",
        "sp-contributions-newbies": "Керда даязья йоазоначера мара баь бола къахьегам ма хьокха",
        "sp-contributions-blocklog": "чIегаш",
        "sp-contributions-uploads": "чуяьккхамаш",
        "movepage-moved": "'''\"$1\" оагув \"$2\" хьийца я'''",
        "articleexists": "Изза мо цIи йола оагIув, йолаш я е оаш тила цIи мегаш яц.\nДехар да, кхыйола цIи хьаржа.",
        "movetalk": "МаIан чулоаца дувцама оагIувни цIи хувца",
-       "movelogpage": "Ð¥Ñ\83вÑ\86ама тептар",
+       "movelogpage": "ЦIи Ñ\85Ñ\83вÑ\86аÑ\80а тептар",
        "movereason": "Бахьан",
        "revertmove": "юхаяьккха",
        "export": "ОагIувий эхфортам",
        "tooltip-ca-history": "Укх оагIон даь хувцамаш тIа дола тептар",
        "tooltip-ca-protect": "Eр оагIув лорае",
        "tooltip-ca-delete": "Ер оагIув дIаяькха",
-       "tooltip-ca-move": "Укх оагIува цIи хувца",
+       "tooltip-ca-move": "Укх оагIон цIи хувца",
        "tooltip-ca-watch": "Ер оагIув хьай теркам беча каьхата тIа тIаяьккха",
        "tooltip-ca-unwatch": "Ер оагIув теркам беча каьхата тIара дIаяькха",
        "tooltip-search": "Хьалáха {{grammar:prepositional|{{SITENAME}}}} чу",
index 84399c0..f15b240 100644 (file)
@@ -95,7 +95,8 @@
                        "Wim b",
                        "V6rg",
                        "JackLantern",
-                       "Mpiva"
+                       "Mpiva",
+                       "Urielejh"
                ]
        },
        "tog-underline": "Sottolinea i collegamenti:",
        "tog-watchlisthidebots": "Nascondi le modifiche dei bot negli osservati speciali",
        "tog-watchlisthideminor": "Nascondi le modifiche minori negli osservati speciali",
        "tog-watchlisthideliu": "Nascondi le modifiche degli utenti registrati negli osservati speciali",
-       "tog-watchlistreloadautomatically": "Ricarica automaticamente l'elenco degli osservati speciali ogni volta che si modifica una filtro (richiede JavaScript)",
+       "tog-watchlistreloadautomatically": "Ricarica automaticamente l'elenco degli osservati speciali ogni volta che si modifica un filtro (richiede JavaScript)",
        "tog-watchlisthideanons": "Nascondi le modifiche degli utenti anonimi negli osservati speciali",
        "tog-watchlisthidepatrolled": "Nascondi le modifiche verificate negli osservati speciali",
        "tog-watchlisthidecategorization": "Nascondi la categorizzazione delle pagine",
        "protect_change": "cambia",
        "protectthispage": "Proteggi questa pagina",
        "unprotect": "Cambia la protezione",
-       "unprotectthispage": "Cambia la protezione a questa pagina",
+       "unprotectthispage": "Modifica la protezione di questa pagina",
        "newpage": "Nuova pagina",
        "talkpage": "Pagina di discussione",
        "talkpagelinktext": "Discussione",
        "userpage-userdoesnotexist": "L'account \"$1\" non corrisponde a un utente registrato.\nVerificare che si intenda davvero creare o modificare questa pagina.",
        "userpage-userdoesnotexist-view": "L'utenza \"$1\" non è registrata.",
        "blocked-notice-logextract": "Questo utente è attualmente bloccato.\nL'ultimo elemento del registro dei blocchi è riportato di seguito per informazione:",
-       "clearyourcache": "<strong>Nota:</strong> dopo aver salvato, potrebbe essere necessario pulire la cache del proprio browser per vedere i cambiamenti. \n*<strong>Firefox / Safari:</strong> tenere premuto il tasto delle maiuscole <em>Shift</em> e fare clic su <em>Ricarica</em>, oppure premere <em>Ctrl-F5</em> o <em>Ctrl-R</em> (<em>⌘-R</em> su Mac)\n*<strong>Google Chrome:</strong> premere <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> su un Mac)\n*<strong>Internet Explorer:</strong> tenere premuto il tasto <em>Ctrl</em> e fare clic su <em>Aggiorna</em>, oppure premere <em>Ctrl-F5</em>\n*<strong>Opera:</strong> svuotare completamente la cache dal menu <em>Strumenti → Preferenze</em>",
+       "clearyourcache": "<strong>Nota:</strong> dopo aver salvato, potrebbe essere necessario pulire la cache del proprio browser per vedere i cambiamenti. \n*<strong>Firefox / Safari:</strong> tenere premuto il tasto delle maiuscole <em>Shift</em> e fare clic su <em>Ricarica</em>, oppure premere <em>Ctrl-F5</em> o <em>Ctrl-R</em> (<em>⌘-R</em> su Mac)\n*<strong>Google Chrome:</strong> premere <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> su un Mac)\n*<strong>Internet Explorer:</strong> tenere premuto il tasto <em>Ctrl</em> e fare clic su <em>Aggiorna</em>, oppure premere <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Vai nel <em>Menu → Impostazioni</em> (<em>Opera → Preferenze</em> su un Mac) e poi in <em>Privacy & sicurezza → Pulisci dati del browser → Immagini e file nella cache</em>.",
        "usercssyoucanpreview": "'''Suggerimento:''' usa il pulsante 'Visualizza anteprima' per provare il tuo nuovo CSS prima di salvarlo.",
        "userjsyoucanpreview": "'''Suggerimento:''' usa il pulsante 'Visualizza anteprima' per provare il tuo nuovo JavaScript prima di salvarlo.",
        "usercsspreview": "'''Questa è solo un'anteprima del proprio CSS personale. Le modifiche non sono ancora state salvate!'''",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|ha protetto}} $3 $4 [ricorsiva]",
        "logentry-protect-modify": "$1 {{GENDER:$2|ha modificato}} il livello di protezione per $3 $4",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|ha modificato}} il livello di protezione per $3 $4 [ricorsiva]",
-       "logentry-rights-rights": "$1 {{GENDER:$2|ha modificato}} l'appartenenza di {{GENDER:$3|$3}} dal gruppo $4 al gruppo $5",
+       "logentry-rights-rights": "$1 {{GENDER:$2|ha modificato}} l'appartenenza di {{GENDER:$6|$3}} dal gruppo $4 al gruppo $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|ha modificato}} l'appartenenza a gruppi di $3",
        "logentry-rights-autopromote": "$1 è {{GENDER:$2|stato promosso|stata promossa|stato/a promosso/a}} automaticamente da $4 a $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|ha caricato}} $3",
        "api-error-unknownerror": "Errore sconosciuto: \"$1\".",
        "api-error-uploaddisabled": "Il caricamento è disabilitato su questa wiki.",
        "api-error-verification-error": "Questo file potrebbe essere danneggiato, o avere l'estensione sbagliata.",
+       "api-error-was-deleted": "Un file con lo stesso nome è stato precedentemente caricato e successivamente eliminato.",
        "duration-seconds": "$1 {{PLURAL:$1|secondo|secondi}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuto|minuti}}",
        "duration-hours": "$1 {{PLURAL:$1|ora|ore}}",
index 20682ca..1546fb8 100644 (file)
@@ -87,6 +87,7 @@
        "tog-watchdefault": "自分が編集したページやファイルをウォッチリストに追加",
        "tog-watchmoves": "自分が移動したページやファイルをウォッチリストに追加",
        "tog-watchdeletion": "自分が削除したページやファイルをウォッチリストに追加",
+       "tog-watchuploads": "自分が新しくアップロードしたファイルをウォッチリストに追加",
        "tog-watchrollback": "自分が巻き戻したページをウォッチリストに追加",
        "tog-minordefault": "編集をすべて既定で細部の編集とする",
        "tog-previewontop": "プレビューを編集ボックスの前に配置",
        "confirmemail_body_set": "誰か (おそらくあなた) が IP アドレス $1 から\n{{SITENAME}} のアカウント「$2」のメールアドレスをこのアドレスに設定しました。\n\nこのアカウントが本当にあなたのものであれば、以下のリンクをブラウザーで開いて、\n{{SITENAME}} のメール機能を有効にしてください。\n\n$3\n\nあなたのアカウントではない場合は、\n以下のリンクをブラウザーで開いて、メールアドレスの確認をキャンセルしてください:\n\n$5\n\nこの確認コードは $4 に期限切れになります。",
        "confirmemail_invalidated": "メールアドレスの確認が中止されました",
        "invalidateemail": "メールアドレスの確認中止",
+       "notificationemail_body_changed": "誰か (おそらくあなた) が、IP アドレス $1 から、\n{{SITENAME}} のアカウント「$2」のメールアドレスを \"$3\" に変更しました。\n\n変更した覚えがない場合、サイトの管理者に直ちに連絡してください。",
        "scarytranscludedisabled": "[ウィキ間の参照読み込みは無効になっています]",
        "scarytranscludefailed": "[$1に対してテンプレートの取得に失敗しました]",
        "scarytranscludefailed-httpstatus": "[$1に対してテンプレートの取得に失敗しました: HTTP $2]",
        "logentry-protect-protect-cascade": "$1 が $3 を {{GENDER:$2|保護}}しました $4 [カスケード]",
        "logentry-protect-modify": "$1 が $3 の保護レベルを{{GENDER:$2|変更}}しました $4",
        "logentry-protect-modify-cascade": "$1 が $3 の保護レベルを{{GENDER:$2|変更}}しました $4 [カスケード]",
-       "logentry-rights-rights": "$1 が {{GENDER:$3|$3}} の所属グループを $4 から $5 に{{GENDER:$2|変更しました}}",
+       "logentry-rights-rights": "$1 が {{GENDER:$6|$3}} の所属グループを $4 から $5 に{{GENDER:$2|変更しました}}",
        "logentry-rights-rights-legacy": "$1 が $3 の所属グループを{{GENDER:$2|変更しました}}",
        "logentry-rights-autopromote": "$1 が $4 から $5 に自動的に{{GENDER:$2|昇格しました}}",
        "logentry-upload-upload": "$1 が $3 を {{GENDER:$2|アップロードしました}}",
        "sessionprovider-generic": "$1 セッション",
        "randomrootpage": "おまかせルートページ",
        "log-action-filter-block": "ブロックの種類",
+       "log-action-filter-move": "移動の種類:",
+       "log-action-filter-newusers": "アカウント作成の種類:",
        "log-action-filter-protect": "保護の種類:",
        "log-action-filter-upload": "アップロードの種類",
        "log-action-filter-all": "すべて",
        "log-action-filter-block-unblock": "ブロック解除",
        "log-action-filter-delete-delete": "ページの削除",
        "log-action-filter-delete-restore": "ページの復帰",
+       "log-action-filter-move-move": "転送を上書きしない移動",
+       "log-action-filter-move-move_redir": "転送を上書きする移動",
+       "log-action-filter-newusers-create": "匿名利用者による作成",
+       "log-action-filter-newusers-create2": "登録利用者による作成",
+       "log-action-filter-newusers-autocreate": "自動的な作成",
        "log-action-filter-protect-protect": "保護",
        "log-action-filter-protect-modify": "保護の設定変更",
        "log-action-filter-protect-unprotect": "保護解除",
index 0659075..7982dbb 100644 (file)
        "category-empty": "''Kategori iki saiki ora ngandhut artikel utawa média.''",
        "hidden-categories": "{{PLURAL:$1|Kategori kadhelikaké|Kategori kadhelikaké}}",
        "hidden-category-category": "Kategori kadhelikan",
-       "category-subcat-count": "{{PLURAL:$2|Kategori iki namung nduwé subkategori ing ngisor ikit.|Dituduhaké {{PLURAL:$1|subkategori|$1 subkategori}} sing kalebu ing kategori iki saka total $2.}}",
+       "category-subcat-count": "{{PLURAL:$2|Kategori iki mung ngandhut subkategori ngisor iki.|Kategori iki ngandhut {{PLURAL:$1|subkategori|$1 subkategori}} ngisor iki saka gunggung $2 subkategori.}}",
        "category-subcat-count-limited": "Kategori iki ora duwé {{PLURAL:$1|subkategori|$1 subkategori}} ''berikut''.",
-       "category-article-count": "{{PLURAL:$2|Kategori iki namung ndarbèni kaca iki.|Dituduhaké {{PLURAL:$1|kaca|$1 kaca-kaca}} sing kalebu ing kategori iki saka gunggungé $2.}}",
+       "category-article-count": "{{PLURAL:$2|Kategori iki mung ngandhut kaca ngisor iki.|{{PLURAL:$1|Kaca|$1 kaca}} ngisor iki ana ing kategori iki saka gunggung $2 kaca.}}",
        "category-article-count-limited": "Kategori iki ngandhut {{PLURAL:$1|kaca|$1 kaca-kaca}} sing kapacak ing ngisor iki.",
        "category-file-count": "{{PLURAL:$2|Kategori iki mung isi barkas iki.|{{PLURAL:$1|Barkas|$1 barkas}} iki ana sajeroning kategori iki saka $2 gunggungé.}}",
        "category-file-count-limited": "Kategori iki ndarbèni {{PLURAL:$1|berkas|$1 berkas-berkas}} sing kapacak ing ngisor iki.",
        "link_tip": "Pranala njero",
        "extlink_sample": "http://www.example.com sesirahing pranala",
        "extlink_tip": "Pranala jaba (élinga ater-ater http://)",
-       "headline_sample": "Tèks judhul",
-       "headline_tip": "Subbagian tingkat 1",
+       "headline_sample": "Tulisan sesirah",
+       "headline_tip": "Sesirah tataran 2",
        "nowiki_sample": "Tèks iki ora bakal diformat",
        "nowiki_tip": "Aja nganggo format wiki",
        "image_sample": "Conto.jpg",
        "image_tip": "Mènèhi gambar/berkas",
        "media_sample": "Conto.ogg",
        "media_tip": "Pranala barkas",
-       "sig_tip": "Tapak asta panjenengan mawa tandha wektu",
+       "sig_tip": "Tandha tangan sampéyan mawa tandha wayah",
        "hr_tip": "Garis horisontal",
        "summary": "Tingkesan:",
        "subject": "Subyek/judhul:",
        "nextn": "{{PLURAL:$1|$1}} sabanjuré",
        "prevn-title": "$1 {{PLURAL:$1|asil|asil}} sadurungé",
        "nextn-title": "$1 {{PLURAL:$1|asil|asil}} sabanjuré",
-       "shown-title": "Tampilaké $1 {{PLURAL:$1|asil|asil}} saben kaca",
+       "shown-title": "Tuduhaké $1 {{PLURAL:$1|kasil|kasil}} saben kaca",
        "viewprevnext": "Deleng ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''Ana kaca kanthi jeneng \"[[$1]]\" ing wiki iki'''",
        "searchmenu-new": "<strong>Gawéa kaca \"[[:$1]]\" nyang wiki iki!</strong> {{PLURAL:$2|0=|Uga delenga kaca sing katemu sarana panggolèking sampéyan.|Uga delenga kasiling panggolèk.}}",
        "searchprofile-articles": "Kaca isi",
-       "searchprofile-images": "Multimedia",
+       "searchprofile-images": "Sarwasarana",
        "searchprofile-everything": "Samubarang",
-       "searchprofile-advanced": "Tataran luwih dhuwur/maju",
+       "searchprofile-advanced": "Lungidan",
        "searchprofile-articles-tooltip": "Golèkan ing $1",
        "searchprofile-images-tooltip": "Golèk barkas",
-       "searchprofile-everything-tooltip": "Panggolèkan kabèh isi (klebu kaca-kaca wicara)",
-       "searchprofile-advanced-tooltip": "Panggolèkan ing bilik jeneng biasa (''custom'')",
+       "searchprofile-everything-tooltip": "Golèk kabèh isi (kalebu kaca guneman)",
+       "searchprofile-advanced-tooltip": "Golèk ing lowah jeneng tinamtu",
        "search-result-size": "$1 ({{PLURAL:$2|1 tembung|$2 tembung}})",
        "search-result-category-size": "{{PLURAL:$1|1 anggota|$1 anggota}} ({{PLURAL:$2|1 subkatégori|$2 subkatégori}}, {{PLURAL:$3|1 berkas|$3 berkas}})",
        "search-redirect": "(pangalihan $1)",
        "recentchanges-label-minor": "Iki besutan cilik",
        "recentchanges-label-bot": "Besutan iki diayahi bot",
        "recentchanges-label-unpatrolled": "Besutan iki durung kapatroli",
-       "recentchanges-label-plusminus": "Agengipun kaca sampun dipunowahi samekaten.",
-       "recentchanges-legend-heading": "<strong>Katrangan:</strong>",
-       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (dhelengen uga: [[Special:NewPages|daftar kaca anyar]])",
+       "recentchanges-label-plusminus": "Ukuraning kaca diowah kanthi cacahing bèt samangkéné",
+       "recentchanges-legend-heading": "<strong>Legendha:</strong>",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (uga deleng [[Special:NewPages|pratélaning kaca-kaca anyar]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Ing ngisor iki owah-owahan wiwit <strong>$2</strong> (kapacak nganti <strong>$1</strong> owah-owahan).",
        "rclistfrom": "Tuduhaké owah-owahan anyar kawit $2, $3",
        "rcshowhidemine": "$1 besutanku",
        "rcshowhidemine-show": "Tuduhaké",
        "rcshowhidemine-hide": "Dhelikaké",
-       "rclinks": "Tuduhna owah-owahan pungkasan $1 ing $2 dina pungkasan iki.<br />$3",
+       "rclinks": "Tuduhaké $1 owahan kawit $2 dina kapungkur.<br />$3",
        "diff": "béd",
        "hist": "saj",
        "hide": "Dhelikaké",
        "recentchangeslinked": "Owahan magepokan",
        "recentchangeslinked-feed": "Pangowahan sing terkait",
        "recentchangeslinked-toolbox": "Owahan magepokan",
-       "recentchangeslinked-title": "Owah-owahan sing ana gandhèngané karo \"$1\"",
-       "recentchangeslinked-summary": "Kaca astaméwa (kaca kusus) iki mènèhi daftar owah-owahan pungkasan ing kaca-kaca sing kagandhèng (utawa anggota sawijining kateogri). Kaca sing [[Special:Watchlist|panjenengan awasi]] ditandhani '''kandel'''.",
+       "recentchangeslinked-title": "Owah-owahan sing magepokan \"$1\"",
+       "recentchangeslinked-summary": "Iki pratélan owah-owahan anyar kaca-kaca sing nggayut kaca tinamtu (utawa péranganing kategori tinamtu).\nKaca-kaca sing ana ing [[Special:Watchlist|pawawanganing sampéyan]] ya iku sing <strong>kandhel</strong>.",
        "recentchangeslinked-page": "Jeneng kaca:",
        "recentchangeslinked-to": "Nuduhaké owah-owahan menyang kaca sing disambung menyang kaca-kaca iki",
        "upload": "Unggah barkas",
        "listfiles-latestversion-no": "Ora",
        "file-anchor-link": "Barkas",
        "filehist": "Babading barkas",
-       "filehist-help": "Klik ing tanggal/wektu kanggo deleng berkas iki ing wektu iku.",
+       "filehist-help": "Klik tanggal/wayah saprelu ndeleng barkasé kaya sing muncul rikala iku.",
        "filehist-deleteall": "busaken kabèh",
        "filehist-deleteone": "busaken iki",
        "filehist-revert": "balèkna",
        "filehist-current": "saiki",
        "filehist-datetime": "Surya/Tabuh",
-       "filehist-thumb": "Miniatur (''thumbnail'')",
-       "filehist-thumbtext": "Miniatur kanggo versi ing $1",
+       "filehist-thumb": "Gambar cilik",
+       "filehist-thumbtext": "Gambar cilik kanggo owahan $1",
        "filehist-nothumb": "Ora ana miniatur",
        "filehist-user": "Panganggo",
-       "filehist-dimensions": "Ukuran",
+       "filehist-dimensions": "Alang ujur",
        "filehist-filesize": "Gedhené berkas",
        "filehist-comment": "Tanggapan",
        "imagelinks": "Panganggoan berkas",
-       "linkstoimage": "Kaca-kaca sing kapacak iki duwé {{PLURAL:$1|pranala|$1 pranala}} menyang berkas iki:",
+       "linkstoimage": "{{PLURAL:$1|Kaca|$1 kaca}} ngisor iki nggayut barkas iki:",
        "linkstoimage-more": "Luwih saka $1 {{PLURAL:$1|kaca|kaca-kaca}} nduwèni pranala menyang berkas iki.\nDhaftar ing ngisor nuduhaké {{PLURAL:$1|kaca pisanan kanthi pranala langsung|$1 kaca kanthi pranala langsung}} menyang berkas iki.\n[[Special:WhatLinksHere/$2|dhaftar pepak]] uga ana.",
        "nolinkstoimage": "Ora ana kaca sing nyambung menyang berkas iki.",
        "morelinkstoimage": "Ndeleng [[Special:WhatLinksHere/$1|luwih akèh pranala]] menyang berkas iki.",
        "duplicatesoffile": "{{PLURAL:$1|berkas ing ngisor arupa duplikat|$1 berkas ing ngisor arupa duplikat}} saka berkas iki ([[Special:FileDuplicateSearch/$2|luwih rinci]]):",
        "sharedupload": "Berkas iki saka $1 lan bisa digunakaké déning proyèk liya.",
        "sharedupload-desc-there": "Berkas iki asal saka $1 lan bisa dipigunakaké déning proyèk liya.\nMangga pirsani [$2 kaca dhèskripsi berkas] kanggo informasi sabanjuré.",
-       "sharedupload-desc-here": "Berkas iki asal saka $1 lan bisa dipigunakaké déning proyèk liya.\nDhèskripsi saka [$2 kaca dhèskripsiné] kapacak ing ngisor iki.",
+       "sharedupload-desc-here": "Barkas iki saka $1 lan kena kanggo proyèk liya.\nPanyandraning [$2 kaca panyandra barkas]é kapacak ing ngisor.",
        "sharedupload-desc-edit": "Berkas iki saka $1 lan mungkin dianggo nèng proyèk liya.\nMungkin Sampéyan pingin nyunting katrangan nèng [$2 kaca katrangan berkasé] nèng kono.",
        "sharedupload-desc-create": "Berkas iki saka $1 lan mungkin dianggo nèng proyèk liya.\nMungkin Sampéyan pingin nyunting katrangan nèng [$2 kaca katrangan berkasé] nèng kono.",
        "filepage-nofile": "Ora ana berkas nganggo jeneng iki.",
        "uploadnewversion-linktext": "Unggahna vèrsi sing luwih anyar tinimbang gambar iki",
        "shared-repo-from": "saka $1",
        "shared-repo": "sawijining panyimpenan kanggo bebarengan",
-       "upload-disallowed-here": "Anda tidak bisa menimpa berkas ini.",
+       "upload-disallowed-here": "Sampéyan ora kena ngeblegi barkas iki.",
        "filerevert": "Balèkna $1",
        "filerevert-legend": "Balèkna berkas",
        "filerevert-intro": "Panjenengan mbalèkaké '''[[Media:$1|$1]]''' menyang [vèrsi $4 ing $3, $2].",
        "undelete-show-file-confirm": "Apa panjenengan yakin arep mirsani révisi berkas \"<nowiki>$1</nowiki>\" sing wis kabusak ing $2 jam $3?",
        "undelete-show-file-submit": "Ya",
        "namespace": "Lowah aran:",
-       "invert": "Balèkna pilihan",
+       "invert": "Balèkaké pilihan",
        "tooltip-invert": "Centhang kothak iki kanggo ndhelikaké owahan saka kaca-kaca nèng njero bilik jeneng kapilih (lan bilik jeneng kakait yèn dicenthang)",
        "namespace_association": "Bilik jeneng kakait",
        "tooltip-namespace_association": "Centhang kothak iki kanggo nglebokaké uga bilik jeneng gumenan utawa subyèk sing kakait karo bilik jeneng kapilih",
        "tooltip-watchlistedit-raw-submit": "Anyari daptar pangawasan",
        "tooltip-recreate": "Gawéa kaca iki manèh senadyan tau dibusak",
        "tooltip-upload": "Miwiti pangunggahan",
-       "tooltip-rollback": "Mbalèkaké suntingan-suntingan ing kaca iki menyang kontributor pungkasan nganggo sak klik.",
+       "tooltip-rollback": "Balèkaké besutan-besutan kaca iki déning sing pungkasan nyumbang sarana saklikan.",
        "tooltip-undo": "Mbalèkaké révisi iki lan mbukak kothak panyuntingan jroning mode pratayang. Wènèhi kasempatan kanggo ngisi alesan ing kothak ringkesan.",
        "tooltip-preferences-save": "Simpen préperensi",
        "tooltip-summary": "Isi tingkesan cendhak",
        "thumbsize": "Ukuran gambar cilik (thumbnail):",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|kaca|kaca}}",
        "file-info": "ukuran berkas: $1, tipe MIME: $2",
-       "file-info-size": "$1 × $2 piksel, ukuran berkas: $3, tipe MIME: $4",
+       "file-info-size": "$1 × $2 piksel, ukuran barkas: $3, jinis MIME: $4",
        "file-info-size-pages": "$1 × $2 piksel, gedhéné berkas: $3, jinisé MIME: $4, $5 {{PLURAL:$5|kaca|kaca}}",
        "file-nohires": "Ora ana résolusi sing luwih dhuwur.",
        "svg-long-desc": "Berkas SVG, nominal $1 × $2 piksel, gedhené berkas: $3",
        "metadata-help": "Berkas iki ngandhut informasi tambahan sing mbokmenawa ditambahaké déning kamera digital utawa ''scanner'' sing dipigunakaké kanggo nggawé utawa olèhé digitalisasi berkas. Yèn berkas iki wis dimodifikasi, detail sing ana mbokmenawa ora sacara kebak nuduhaké informasi saka gambar sing wis dimodifikasi iki.",
        "metadata-expand": "Tuduhna detail tambahan",
        "metadata-collapse": "Delikna detail tambahan",
-       "metadata-fields": "Entri lapangan-lapangan metadata sing kapacak iki bakal dituduhaké ing kaca informasi gambar yèn tabèl metadata didhelikaké. Entri liyané minangka baku bakal didhelikaké.\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",
+       "metadata-fields": "Babagan-babagan métadhata gambar sing katulis ing nawala iki bakal kapacak nyang jebèran kaca gambar nalika métadhata dinebaké.\nLiyané bakal kadhelikaké kanthi baku.\n* panggawé\n* gagrag\n* tanggalwayahasli\n* wayahpaparan\n* angkaf\n* bijibanteriso\n* dawafocal\n* artis\n* hakcipta\n* pratélangambar\n* latitudgps\n* longitudgps\n* altitudgps",
        "exif-imagewidth": "Jembar",
        "exif-imagelength": "Dhuwur",
        "exif-bitspersample": "Bit per komponèn",
        "intentionallyblankpage": "Kaca iki disengajakaké kosong",
        "external_image_whitelist": " #Umbarna larikan iki apa anané<pre>\n#Pigunakaké fragmèn èksprèsi regular (mung bagéyan ing antara //) ing ngisor\n#Fragmèn ini bakal dicocogaké karo URL saka gambar-gambar èksternal\n#Fragmèn sing cocog bakal ditampilaké minangka gambar, yèn ora mung pranala menyang gambar waé sing ditampilaké\n#Larikan sing diwiwiti nganggo # dianggep minangka komentar\n#Iki ora mbédakaké aksara gedhé/cilik\n#Dèlèhna kabèh fragmèn èksprèsi regular sadhuwuré larikan iki. Umbarna larikan iki apa anané</pre>",
        "tags": "Tag pangowahan sing absah",
-       "tag-filter": "Filter [[Special:Tags|Tag]]:",
+       "tag-filter": "Panyaringan [[Special:Tags|tandha]]:",
        "tag-filter-submit": "Penyaring",
-       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|Tag}}]]: $2)",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tenger|Tenger}}]]: $2)",
        "tags-title": "Tag",
        "tags-intro": "Kaca iki ndhaptar tag sing bisa ditandhani déning piranti alus tumrap sawijining suntingan lan maknané.",
        "tags-tag": "Jeneng tag",
index 4040aa4..9e1c92a 100644 (file)
        "watchlistedit-raw-done": "Är Iwwerwaachungslëscht gouf aktualiséiert.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 Säit gouf|$1 Säite goufen}} derbäigesat:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 Säit gouf|$1 Säite goufen}} erausgeholl:",
-       "watchlistedit-clear-title": "Eidelgemaachten Iwwerwaachungslëscht",
+       "watchlistedit-clear-title": "Iwwerwaachungslëscht eidelmaachen",
        "watchlistedit-clear-legend": "Iwwerwaachungslëscht eidelmaachen",
        "watchlistedit-clear-explain": "All D'Säite gi vun Ärer Iwwerwaachungslëscht erofgeholl",
        "watchlistedit-clear-titles": "Säiten:",
        "logentry-newusers-autocreate": "De Benotzerkont $1 gouf automatesch {{GENDER:$2|ugeluecht}}",
        "logentry-protect-protect": "$1 {{GENDER:$2|huet}} d'Säit $3 $4 gespaart",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|huet}} d'Säit $3 $4 gespaart [Kaskadespär]",
-       "logentry-rights-rights": "$1 {{GENDER:$2|huet}} d'Gruppen zou deenen {{GENDER:$3|d'|de}} $3 gehéiert vu(n) $4 op $5 geännert",
+       "logentry-rights-rights": "$1 {{GENDER:$2|huet}} d'Gruppen zou deenen {{GENDER:$6|d'|de}} $3 gehéiert vu(n) $4 op $5 geännert",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|huet}} d'Gruppen zou deenen de Benotzer $3 gehéiert geännert",
        "logentry-rights-autopromote": "De Benotzer $1 {{GENDER:$2|krut}} d'Benotzerrechter automatesch vu(n) $4 op $5 geännert",
        "logentry-upload-upload": "$1 huet $3 {{GENDER:$2|eropgelueden}}",
        "log-action-filter-protect-modify": "Spär-pÄnnerung",
        "log-action-filter-protect-move_prot": "Geréckelt Spär",
        "log-action-filter-rights-rights": "Manuell Ännerung",
+       "log-action-filter-rights-autopromote": "Automatesch Ännerung",
        "log-action-filter-upload-upload": "Neien Upload",
        "log-action-filter-upload-overwrite": "Nees eroplueden"
 }
index 3daa2d9..6220352 100644 (file)
        "watchlistedit-raw-done": "Jūsų stebimųjų sąrašas buvo atnaujintas.",
        "watchlistedit-raw-added": "$1 {{PLURAL:$1|puslapis buvo pridėtas|puslapiai buvo pridėti|puslapių buvo pridėta}}:",
        "watchlistedit-raw-removed": "$1 {{PLURAL:$1|puslapis buvo pašalintas|puslapiai buvo pašalinti|puslapių buvo pašalinta}}:",
-       "watchlistedit-clear-title": "Išvalytas stebimųjų sąrašas",
+       "watchlistedit-clear-title": "Išvalyti stebimųjų sąrašą",
        "watchlistedit-clear-legend": "Išvalyti stebimųjų sąrašą",
        "watchlistedit-clear-explain": "Visi pavadinimai bus pašalinti iš jūsų stebimųjų sąrašo",
        "watchlistedit-clear-titles": "Pavadinimai:",
index f1a6561..1272972 100644 (file)
@@ -20,7 +20,8 @@
                        "Nemo bis",
                        "飞舞回堂前",
                        "Macofe",
-                       "Bowleerin"
+                       "Bowleerin",
+                       "SolidBlock"
                ]
        },
        "tog-underline": "鏈墊線:",
        "view-foreign": "觀於$1",
        "edit": "纂",
        "create": "立",
+       "create-local": "增地言",
        "editthispage": "纂",
        "create-this-page": "立",
        "delete": "刪",
        "preview": "草覽",
        "showpreview": "示覽",
        "showdiff": "示異",
-       "anoneditwarning": "'''警示:'''子未登簿,IP將誌。",
+       "anoneditwarning": "'''警示:'''子未登簿,若確纂,IP將誌。茍[$1 登]或[$2 開戶口],是纂欲存以子名,及他效。",
        "anonpreviewwarning": "''子未登簿,IP將誌。''",
        "missingsummary": "'''醒示:'''子未概之,復「{{int:savearticle}}」則文倍焉。",
        "missingcommenttext": "請贊之",
        "categories": "類",
        "categoriespagetext": "大典{{PLURAL:$1|類中}}有頁或媒。\n[[Special:UnusedCategories|未類]]無示之。\n閱[[Special:WantedCategories|需類]]也。",
        "categoriesfrom": "示此項起之類:",
-       "special-categories-sort-count": "排數",
-       "special-categories-sort-abc": "排字",
        "deletedcontributions": "已刪之積",
        "deletedcontributions-title": "所棄之事",
        "sp-deletedcontributions-contribs": "積",
        "importlogpagetext": "秩入匯自他山之審。",
        "import-logentry-upload-detail": "有審$1",
        "import-logentry-interwiki-detail": "$1審自$2",
-       "tooltip-pt-userpage": "述平生、紹身家、銘字號",
+       "tooltip-pt-userpage": "{{GENDER:|君自}}卷",
        "tooltip-pt-anonuserpage": "君IP之舍",
-       "tooltip-pt-mytalk": "與眾論、往魚雁、湧文滔",
+       "tooltip-pt-mytalk": "{{GENDER:|君之}}議室",
        "tooltip-pt-anontalk": "此IP所修之議",
-       "tooltip-pt-preferences": "更符驛、排版式、投所好",
+       "tooltip-pt-preferences": "{{GENDER:|君之}}好",
        "tooltip-pt-watchlist": "收矚目、治眼線、賞萌茂",
-       "tooltip-pt-mycontris": "刻勛功、追作續、慰苦勞",
+       "tooltip-pt-mycontris": "{{GENDER:|君之}}勛表",
        "tooltip-pt-login": "設書齋、錄功績、廣放哨",
        "tooltip-pt-logout": "凡事盡,乘雲飄",
        "tooltip-pt-createaccount": "勸君增簿以登,然非必須之舉",
        "spambot_username": "MediaWiki清濫",
        "spam_reverting": "還新審之無鏈$1者。",
        "spam_blanking": "審皆鏈$1,遂令白頁。",
+       "simpleantispam-label": "反亂查。\n'''勿'''是文入!",
        "pageinfo-header-restrictions": "頁錮",
        "pageinfo-robot-index": "可",
        "pageinfo-robot-noindex": "不可",
        "file-nohires": "無以更晰。",
        "svg-long-desc": "SVG檔,貌有像素$1矩$2,幅$3",
        "show-big-image": "全幅",
+       "show-big-image-size": "$1×$2微格",
        "file-info-gif-looped": "循",
        "file-info-gif-frames": "$1幀",
        "file-info-png-looped": "循",
        "exif-model": "型號",
        "exif-artist": "作者",
        "exif-exifversion": "Exif版本",
+       "exif-colorspace": "色間",
        "exif-datetimeoriginal": "數據生成之日期時辰",
        "exif-datetimedigitized": "數位化之日期時辰",
        "exif-exposuretime": "曝光",
        "exif-contrast": "對比",
        "exif-saturation": "飽和度",
        "exif-sharpness": "清晰度",
+       "exif-orientation-1": "常",
        "exif-meteringmode-255": "其他",
        "exif-flash-fired-0": "閃無火",
        "exif-flash-fired-1": "閃開火",
        "version-software-version": "版",
        "fileduplicatesearch": "擇重檔",
        "fileduplicatesearch-summary": "以重檔之切去查重也。",
-       "fileduplicatesearch-legend": "尋重",
        "fileduplicatesearch-filename": "名:",
        "fileduplicatesearch-submit": "尋",
        "fileduplicatesearch-info": "像素$1矩$2<br />大小:$3<br />MIME類型:$4",
        "intentionallyblankpage": "此頁為白也,試速之用",
        "external_image_whitelist": " #同留<pre>\n#下(中之//)乃正表式\n#乃外(連)圖配之\n#配乃成像,非配則成連\n#有 # 之為注\n#無為大小之異也\n\n#入正表式。同留</pre>",
        "tag-filter": "[[Special:Tags|標]] 之濾:",
+       "tag-list-wrapper": "([[Special:Tags|簽]]: $2)",
        "tags-title": "標",
        "tags-tag": "標名",
        "tags-source-header": "源",
index 7ba9c6b..180f350 100644 (file)
        "december-date": "दिसम्बर $1",
        "period-am": "पूर्वाह्न",
        "period-pm": "अपराह्न",
-       "pagecategories": "{{PLURAL:$1|शà¥\8dरà¥\87णà¥\80|à¤\95à¤\8fà¤\9fा à¤¶à¥\8dरà¥\87णà¥\80}}",
+       "pagecategories": "{{PLURAL:$1|शà¥\8dरà¥\87णà¥\80|शà¥\8dरà¥\87णà¥\80सभ}}",
        "category_header": "श्रेणी \"$1\" मे पन्ना सभ",
        "subcategories": "उपश्रेणी",
        "category-media-header": "श्रेणी \"$1\" मे मीडिया",
        "index-category": "क्रम कएल पन्ना सभ",
        "noindex-category": "क्रम नै कएल पन्नासभ",
        "broken-file-category": "पन्नासभ जाइमे फाइल लिङ्कसभ टूटल हुअए",
-       "about": "क विषयमे",
+       "about": "क विषयमे",
        "article": "सामग्री लेख",
        "newwindow": "(नव खिडकीसँ खुजैछ)",
        "cancel": "समाप्त",
        "anontalk": "वार्ता",
        "navigation": "सञ्चार",
        "and": "&#32;आर",
-       "qbfind": "ताà¤\95à¥\82",
-       "qbbrowse": "à¤\97वà¥\87षण à¤\95रà¥\82",
-       "qbedit": "समà¥\8dपादन à¤\95रà¥\82",
+       "qbfind": "ताà¤\95à¥\80",
+       "qbbrowse": "à¤\97वà¥\87षण à¤\95रà¥\80",
+       "qbedit": "समà¥\8dपादन à¤\95रà¥\80",
        "qbpageoptions": "ई पृष्ठ",
        "qbmyoptions": "हमर पृष्ठसभ",
        "faq": "त्वरित प्रश्नोत्तरी",
        "variants": "प्रकारसभ",
        "navigation-heading": "दिक्चालन सूची",
        "errorpagetitle": "गलती",
-       "returnto": "$1 à¤ªà¤° à¤\86à¤\89।",
+       "returnto": "$1 à¤ªà¤° à¤\86बà¥\80।",
        "tagline": "मैथिली {{SITENAME}}सँ",
        "help": "मदति",
        "search": "ताकी",
        "delete": "मेटाबी",
        "deletethispage": "ई पन्ना मेटाबी",
        "undeletethispage": "ई पृष्ठके पुनर्स्थापित करी।",
-       "undelete_short": "{{PLURAL:$1|à¤\8fà¤\95 à¤¹à¤\9fाà¤\8fल à¤\97à¤\8fल|$1 à¤¹टाएल गएल}} परिवर्तन आपस आनी",
-       "viewdeleted_short": "देखी {{PLURAL:$1|एकटा मेटाएल सम्पादन|$1 मेटाएल सम्पादन सभ}}",
+       "undelete_short": "{{PLURAL:$1|à¤\8fà¤\95 à¤®à¥\87à¤\9fाà¤\8fल à¤\97à¤\8fल|$1 à¤®à¥\87टाएल गएल}} परिवर्तन आपस आनी",
+       "viewdeleted_short": "देखी {{PLURAL:$1|एकटा मेटाएल सम्पादन|$1 मेटाएल सम्पादन}}",
        "protect": "सुरक्षित करी",
        "protect_change": "बदली",
        "protectthispage": "ई पन्नाक सुरक्षित करी",
        "categorypage": "श्रेणी पन्ना देखी",
        "viewtalkpage": "गपशप देखी",
        "otherlanguages": "अन्य भाषासभमे",
-       "redirectedfrom": "($1 सँ पुनर्निर्देशित)",
+       "redirectedfrom": "($1सँ पुनर्निर्देशित)",
        "redirectpagesub": "पृष्ठ पुनर्निर्देशित करी",
        "redirectto": "क अनुप्रेषित:",
        "lastmodifiedat": "ई पृष्ठक पहिनुका बदलाव $1 के $2 बजे भएल छल।",
        "pool-errorunknown": "अज्ञात भ्रम",
        "pool-servererror": "पुल काउन्टर सेवा उपलब्ध नै अछि ($1)।",
        "poolcounter-usage-error": "उपयोग त्रुटि: $1",
-       "aboutsite": "विषयमे {{SITENAME}}",
+       "aboutsite": "{{SITENAME}}क बारेमे",
        "aboutpage": "Project:विवरण",
        "copyright": "$1क अन्तर्गत विषय सूची उपलब्ध अछि",
        "copyrightpage": "{{ns:project}}:सर्वाधिकार",
        "databaseerror-text": "डाटाबेस अनुरोध त्रुटि भेल अछि।\nसंभवतः सफ्टवेयरमे गड़बड़ी अछि।",
        "databaseerror-textcl": "डाटाबेस अनुरोध त्रुटि भेल अछि।",
        "databaseerror-query": "अनुरोध: $1",
-       "databaseerror-function": "फà¤\82क्सन: $1",
+       "databaseerror-function": "फà¤\99à¥\8dक्सन: $1",
        "databaseerror-error": "त्रुटि: $1",
        "laggedslavemode": "'''चेतौनी:''' पन्नापर सम्भव जे अद्यतन परिवर्तन नै हुअए।",
        "readonly": "दत्तनिधि प्रतिबन्धित",
        "missing-article": "दत्तनिधि पृष्ठक वांछित पाठ्य नै ताकि सकल, माने \"$1\" $2\nएकर कारण कोनो पुरान फाइल चेन्हासी वा ऐतिहासिक लिंकक पाछाँ जाएब अछि, जे मेटा देल गेल छै।\nजौं ई तकर कारण नै अछि,  तखन अहाँकेँ तंत्रांशमे कोनो दोष भेटल अछि।\nएकर खबरि पहुँचाउ [[Special:ListUsers/sysop|administrator]], केँ, अपन सार्वत्रिक विभव संकेत सूचित करैत।",
        "missingarticle-rev": "(संशोधन#: $1)",
        "missingarticle-diff": "(फाइल-अन्तर प्रणाली: $1, $2)",
-       "readonly_lag": "दतà¥\8dताà¤\82शनिधि à¤¸à¥\8dवà¤\9aालित à¤°à¥\82पà¥\87ँ प्रतिबन्धित कएल गेल अछि जा परजीवी दतांशनिधि वितरक मूलक समक्ष नै आबि जाए।",
+       "readonly_lag": "दतà¥\8dताà¤\82शनिधि à¤¸à¥\8dवà¤\9aालित à¤°à¥\82पसँ प्रतिबन्धित कएल गेल अछि जा परजीवी दतांशनिधि वितरक मूलक समक्ष नै आबि जाए।",
        "nonwrite-api-promise-error": "'Promise-Non-Write-API-Action'क एचटिटिपी शीर्षकद्वारा भेजल गएल पर एपिआईमे लेखन मोड्युल अछि।",
        "internalerror": "आन्तरिक भ्रम",
        "internalerror_info": "आन्तरिक भ्रम: $1",
        "cannotdelete": "पन्ना व संचिका \"$1\" मेटाएल नै जा सकल।",
        "cannotdelete-title": "पन्ना \"$1\" नै मेटा सकल",
        "delete-hook-aborted": "सम्पादन नोकसीसँ खतम भेल।\nई कोनो कारण नै देलक।",
-       "no-null-revision": "\"$1\" पृष्ठ के लेल बिना परिवर्तन नब अवतरण बनाबए में असफल।",
+       "no-null-revision": "\"$1\" पृष्ठक लेल बिना परिवर्तन नब अवतरण बनाबैमे असफल।",
        "badtitle": "खराप शीर्षक",
        "badtitletext": "आग्रह कएल पन्नाक शीर्षक गलत, खाली, वा गलत सम्बन्धित अन्तर-न्हाषा अन्तर विकी शीर्षक छी। ई एक वा बेशी कलाकार युक्त भऽ सकैए जे शीर्षकमे प्रयुक्त नै कएल जा सकैए।",
        "title-invalid-empty": "निवेदित पृष्ठक शीर्षक खाली अछि या मात्र नामस्थान राखने अछि।",
-       "title-invalid-utf8": "निवà¥\87दित à¤ªà¥\83षà¥\8dठà¤\95 à¤¶à¥\80रà¥\8dषà¤\95 à¤\85वà¥\88ध à¤¯à¥\82०à¤\9fà¥\80०एफ-८ सँ सिलसिला राखैत अछि।",
-       "title-invalid-interwiki": "निवेदित पृष्ठ के शीर्षक एक अन्तर-विकी जडी राखैत अछि जे शीर्षक में प्रयोग नै कैर सकएत छि।",
+       "title-invalid-utf8": "निवà¥\87दित à¤ªà¥\83षà¥\8dठà¤\95 à¤¶à¥\80रà¥\8dषà¤\95 à¤\85वà¥\88ध à¤¯à¥\81à¤\9fिएफ-८ सँ सिलसिला राखैत अछि।",
+       "title-invalid-interwiki": "निवेदित पृष्ठक शीर्षक एक अन्तर-विकी जडी राखैत अछि जे शीर्षकमे प्रयोग नै करि सकएत अछि।",
        "title-invalid-talk-namespace": "निवेदित पृष्ठक शीर्षक एक वार्ता पृष्ठ सँ सन्दर्भित अछि जे मौजूद नै अछि।",
        "title-invalid-characters": "निवेदित पृष्ठक शीर्षक अवैध क्यारेक्टर: \"$1\" राखैत अछि।",
        "title-invalid-relative": "शीर्षक एक सन्दर्भित मार्ग राखैत अछि। सन्दर्भित पन्ना के शीर्षक (./, ../)अवैध अछि, कियाकी ई अधिकांश रूप पहुँच से बाहर छि जे हुनका उपयोगकर्ता के ब्रौज़र से प्रयोग में लाबई के प्रयास करल जाएत अछि ।",
-       "title-invalid-magic-tilde": "निवेदित पन्ना के शीर्षक अवैध जादूई टिल्ड सिलसिला राखएत अछि (<nowiki>~~~</nowiki>)।",
-       "title-invalid-too-long": "माँग कएल गेल पन्ना कें शीर्षक बहुत नम्हर अछि । एकरा यू०टी०एफ़० कोडिंग मे $1 {{PLURAL:$1|बाइट|बाइट्स}} से बढ़का नए होना चाही आर एकरा यू०टी०एफ़०-८ एनकोडिंग में होना चाही ।",
-       "title-invalid-leading-colon": "निवेदित पन्ना के शीर्षक प्रारंभ में अवैध कोलन रखएत अछि।",
+       "title-invalid-magic-tilde": "निवेदित पन्नाक शीर्षक अवैध जादुई टिल्ड सिलसिला राखएत अछि (<nowiki>~~~</nowiki>)।",
+       "title-invalid-too-long": "माँग कएल गेल पन्नाक शीर्षक बहुत नम्हर अछि। एकरा युटिएफ कोडिङमे $1 {{PLURAL:$1|बाइट|बाइट्स}} से पैग नै होना चाही आर एकरा युटिएफ-८ एनकोडिङमे होना चाही।",
+       "title-invalid-leading-colon": "निवेदित पन्नाक शीर्षक प्रारम्भमे अवैध कोलन रखएत अछि।",
        "perfcached": "ई दत्तांश उपस्मृतिक आधारपर अछि आ भऽ सकैए जे अद्यतन नै हुअए। अधिकतम {{PLURAL:$1|एकटा परिणाम|$1 परिणाम सभ}} क्याचेमे उपलब्ध अछि ।",
        "perfcachedts": "ई दत्तांश उपस्मृतिमे अछि, आ एकर अन्तिम परिवर्धन भेल अछि $1 केँ। A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
        "querypage-no-updates": "ऐ पन्नाक नवीनीकरण अखन बन्न अछि।\nएतुक्का दत्तांश अखन नवीकरण नै कएल जाएत।",
        "actionthrottled": "कार्य समाप्त करि देल गएल",
        "actionthrottledtext": "अनपेक्षित सन्देश रोक लेल, अहाँक ई क्रियाक कम्मे कालमे सीमासँ बेसीबेर करबासँ रोकल गेल अछि, अहाँ ओ सीमाक पार कऽ गेल छी।\nकृपया किछ काल बाद फेरसँ प्रयास करी।",
        "protectedpagetext": "ई पन्ना सम्पादन रोकबा लेल संरक्षित अछि।",
-       "viewsourcetext": "à¤\85हाà¤\81 à¤\87 पृष्ठक जडिक देख आ अनुकृत कऽ सकै छी:",
+       "viewsourcetext": "à¤\85हाà¤\81 à¤\88 पृष्ठक जडिक देख आ अनुकृत कऽ सकै छी:",
        "viewyourtext": "अहाँ ई पृष्ठमे '''अपन सम्पादन'''क देख आ एतए उतारि सकै छी:",
        "protectedinterface": "ई पन्ना तंत्रांश लेल मध्यस्थ पाठक व्यवस्था करैत अछि, आ अपशब्द रोकबाक ब्योंत करैत अछि।",
        "editinginterface": "'''चेतौनी''' अहाँ एकटा एहेन पन्नाक सम्पादन कऽ रहल छी जे तंत्रांशक मध्यस्थ पन्नाकेँ पाठ देबा लेल प्रयोग भऽ रहल अछि।\nऐ पन्नामे परिवर्तन दोसर प्रयोक्ता लेल प्रयोक्ता मध्यस्थक रूपमे परिवर्तन करत।\nअनुवाद लेल [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net] जाउ, मीडियाविकी स्थानीयकरण परियोजना पर।",
        "mycustomjsprotected": "अहके लेल इ जावास्क्रिप्ट पन्नाके सम्पादित करवाक अधिकार नै अछि।",
        "myprivateinfoprotected": "अहाके अपन व्यक्तिगत जानकारी बदलैक अनुमति नै अछि।",
        "mypreferencesprotected": "अहाके अपन प्राथमिकता बदलैक अनुमति नै अछि।",
-       "ns-specialprotected": "विशेष पन्ना सभकेँ सम्पादित नै कएल जा सकैए।",
-       "titleprotected": "à¤\90 à¤¶à¥\80रà¥\8dषà¤\95à¤\95 à¤¨à¤¿à¤°à¥\8dमाण à¤ªà¥\8dरतिबनà¥\8dधित à¤\85à¤\9bि [[User:$1|$1]] à¤¦à¥\8dवारा।\nà¤\95ारण à¤\8fतऽ à¤¦à¥\87ल अछि <em>$2</em>।",
-       "filereadonlyerror": "\"$1\" à¤«à¤¾à¤\87लà¤\95à¥\87 à¤¬à¤¦à¤²à¥\88लà¥\87ल à¤\85à¤\95à¥\8dषम à¤\95ियाà¤\95 à¤­à¤£à¥\8dडार \"$2\" à¤\87 समय 'मात्र पाठनक लेल' अछि।\n\nजे प्रबन्धक ई प्रबन्ध लगोनै अछि ओ निम्न विवरण प्रदान कएने अछि: \"$3\"।",
+       "ns-specialprotected": "विशेष पन्ना सभक सम्पादित नै कएल जा सकैए।",
+       "titleprotected": "à¤\88 à¤¶à¥\80रà¥\8dषà¤\95à¤\95 à¤¨à¤¿à¤°à¥\8dमाण à¤ªà¥\8dरतिबनà¥\8dधित à¤\85à¤\9bि [[User:$1|$1]] à¤¦à¥\8dवारा।\nà¤\8fà¤\95र à¤²à¥\87ल à¤¨à¤¿à¤®à¥\8dन à¤\95ारण à¤¦à¥\87ल à¤\97à¤\8fल अछि <em>$2</em>।",
+       "filereadonlyerror": "\"$1\" à¤«à¤¾à¤\87लà¤\95à¥\87 à¤¬à¤¦à¤²à¥\88लà¥\87ल à¤\85à¤\95à¥\8dषम à¤\95ियाà¤\95 à¤­à¤£à¥\8dडार \"$2\" à¤\88 समय 'मात्र पाठनक लेल' अछि।\n\nजे प्रबन्धक ई प्रबन्ध लगोनै अछि ओ निम्न विवरण प्रदान कएने अछि: \"$3\"।",
        "invalidtitle-knownnamespace": "\"$2\" नामस्थान आर \"$3\" नाम बला गलत शीर्षक",
        "invalidtitle-unknownnamespace": "अज्ञात नामस्थान संख्या $1 आर नाम \"$2\" वाला गलत शीर्षक",
        "exception-nologin": "सम्प्रवेशित नै",
-       "exception-nologin-text": "à¤\87 à¤ªà¤¨à¥\8dना à¤µà¤¾ à¤\95ाà¤\9cà¤\95à¥\87 à¤¸à¤\95à¥\8dषम à¤\95रवाà¤\95 à¤²à¥\87ल à¤\95à¥\83पया à¤ªà¥\8dरवà¥\87श à¤\95रà¥\81।",
-       "exception-nologin-text-manual": "à¤\87 à¤ªà¤¨à¥\8dना à¤µà¤¾ à¤\95ाà¤\9cà¤\95à¥\87 à¤¸à¤\95à¥\8dषम à¤\95रवाà¤\95 à¤²à¥\87ल à¤\95à¥\83पया $1 à¤\95रà¥\81।",
-       "virus-badscanner": "खराप विन्यास: अज्ञात विषविधि बिम्बक: ''$1''",
+       "exception-nologin-text": "à¤\88 à¤ªà¤¨à¥\8dना à¤µà¤¾ à¤\95ाà¤\9c à¤¸à¤\95à¥\8dषम à¤\95रवाà¤\95 à¤²à¥\87ल à¤\95à¥\83पया à¤ªà¥\8dरवà¥\87श à¤\95रà¥\80।",
+       "exception-nologin-text-manual": "à¤\88 à¤ªà¤¨à¥\8dना à¤µà¤¾ à¤\95ाà¤\9c à¤¸à¤\95à¥\8dषम à¤\95रवाà¤\95 à¤²à¥\87ल à¤\95à¥\83पया $1 à¤\95रà¥\80।",
+       "virus-badscanner": "खराप विन्यास: अज्ञात विषविधि बिम्बक: <em>$1</em>",
        "virus-scanfailed": "बिम्ब विफल (विध्यादेश $1)",
        "virus-unknownscanner": "अज्ञात विषविधि निरोधक",
        "logouttext": "'''अहाँ निष्क्रमण कऽ गेल छी।'''\n\nअहाँ {{अन्तर्जाल}} प्रयोग अनाम भऽ कऽ सकै छी, वा अहाँ <span class='plainlinks'>[$1 log in again]</span> वएह आकि कोनो आन प्रयोक्ताक रूपमे सेहू प्रयोक कऽ सकै छी।\nई मोन राखू जे किछु पन्ना एना देखा पड़ि सकैए जेना अहाँ अखनो सम्प्रवेशित होइ, जावत अहाँ अपन गवेषकक उपस्मृति मेटा नै दै छी।",
        "cannotlogoutnow-title": "अखन प्रस्थान नै भऽ रहल अछि",
        "cannotlogoutnow-text": "$1 क उपयोग समय प्रस्थान नै कएल जा सकएत अछि।",
-       "welcomeuser": "à¤\85हाà¤\95à¥\87 स्वागत अछि, $1!",
+       "welcomeuser": "à¤\85हाà¤\81à¤\95 स्वागत अछि, $1!",
        "welcomecreation-msg": "अहाँक खाता बनाएल गेल अछि।\nअपन [[Special:Preferences|{{SITENAME}} पसन्द]] बदलै लेल नै बिसरब।",
        "yourname": "प्रयोक्ता:",
        "userlogin-yourname": "प्रयोक्ता:",
        "userlogin-yourname-ph": "अपन प्रयोगकर्तानाम लिखी",
        "createacct-another-username-ph": "प्रयोगकर्तानाम प्रदान करी",
-       "yourpassword": "à¤\95à¥\82टशब्द:",
-       "userlogin-yourpassword": "à¤\95à¥\82टशब्द",
-       "userlogin-yourpassword-ph": "à¤\85पन à¤\95à¥\82टशब्द लिखी",
-       "createacct-yourpassword-ph": "à¤\95à¥\82टशब्द दर्ज करी",
-       "yourpasswordagain": "à¤\95à¥\82टशब्द फेरसँ टाइप करी:",
-       "createacct-yourpasswordagain": "à¤\95à¥\82à¤\9fशबà¥\8dदà¤\95 जाँच करी",
-       "createacct-yourpasswordagain-ph": "à¤\95à¥\82टशब्द पुनः लिखी",
+       "yourpassword": "à¤\95à¥\81टशब्द:",
+       "userlogin-yourpassword": "à¤\95à¥\81टशब्द",
+       "userlogin-yourpassword-ph": "à¤\85पन à¤\95à¥\81टशब्द लिखी",
+       "createacct-yourpassword-ph": "à¤\95à¥\81टशब्द दर्ज करी",
+       "yourpasswordagain": "à¤\95à¥\81टशब्द फेरसँ टाइप करी:",
+       "createacct-yourpasswordagain": "à¤\95à¥\81à¤\9fशबà¥\8dद जाँच करी",
+       "createacct-yourpasswordagain-ph": "à¤\95à¥\81टशब्द पुनः लिखी",
        "remembermypassword": "ई ब्राउजर पर हमर सम्प्रवेश याद राखी (अधिकतम $1 {{PLURAL:$1|दिन|दिनधरि}}क लेल)",
        "userlogin-remembermypassword": "हमरा सम्प्रवेशित राखी",
        "userlogin-signwithsecure": "सुरक्षित कनेक्शनक प्रयोग करी",
        "cannotloginnow-title": "अखन प्रवेश नै भऽ रहल अछि",
        "cannotloginnow-text": "$1 क उपयोग समय प्रवेश नै कएल जा सकएत अछि।",
        "yourdomainname": "अहाँक डोमेन (प्रभावक्षेत्र):",
-       "password-change-forbidden": "à¤\85हाà¤\81 à¤\88 à¤µà¤¿à¤\95िमà¥\87 à¤\95à¥\82टशब्द नै बदल सकैत छी।",
+       "password-change-forbidden": "à¤\85हाà¤\81 à¤\88 à¤µà¤¿à¤\95िमà¥\87 à¤\95à¥\81टशब्द नै बदल सकैत छी।",
        "externaldberror": "या त प्रमाणिकरण डेटाबेसमे त्रुटि भएल अछि या फेर अहाँक अपन बाह्य खाता अपडेट करैक अनुमति नै अछि।",
        "login": "सम्प्रवेश",
        "nav-login-createaccount": "सम्प्रवेश / खाता खोली",
        "noemail": "प्रयोक्ता \"$1\" लेल कोनो ई-पत्र संकेत दर्ज नै अछि।",
        "noemailcreate": "अहाँकेँ एकटा मान्य ई-पत्र संकेत देबऽ पड़त।",
        "passwordsent": "एकटा नव कूटशब्द \"$1\" लेल पंजीकृत ई-पत्र संकेतपर पठाएल गेल अछि।\nजखन अहाँकेँ ई भेटैए तँ फेरसँ सम्प्रवेश करू।",
-       "blocked-mailpassword": "à¤\85हाà¤\81à¤\95 à¤\85निà¤\95à¥\87त à¤¸à¤®à¥\8dपादन à¤²à¥\87ल à¤ªà¥\8dरतिबनà¥\8dधित à¤\85à¤\9bि, à¤\86 à¤¦à¥\81रà¥\81पयà¥\8bà¤\97 à¤°à¥\8bà¤\95बा à¤²à¥\87ल à¤\95à¥\82à¤\9fशबà¥\8dद à¤ªà¥\8dरतà¥\8dयाहरण à¤¸à¥\87वा à¤\90 लेल उपलब्ध नै अछि।",
+       "blocked-mailpassword": "à¤\85हाà¤\81à¤\95 à¤\85निà¤\95à¥\87त à¤¸à¤®à¥\8dपादन à¤²à¥\87ल à¤ªà¥\8dरतिबनà¥\8dधित à¤\85à¤\9bि, à¤\86 à¤¦à¥\81रà¥\81पयà¥\8bà¤\97 à¤°à¥\8bà¤\95बा à¤²à¥\87ल à¤\95à¥\81à¤\9fशबà¥\8dद à¤ªà¥\8dरतà¥\8dयाहरण à¤¸à¥\87वा à¤\88 लेल उपलब्ध नै अछि।",
        "eauthentsent": "एकटा पावती ई-पत्र निर्धारित ई-पत्र संकेतपर पठा देल गेल अछि।\nऐ खातापर कोनो दोसर ई-पत्र पठाएल जएबासँ पहिने, अहाँकेँ ऐ ई-पत्रक निर्देशक पालन करए पड़त, जइसँ ई पुष्ट भऽ सकए जे ई खाता वास्तवमे अहींक अछि।",
        "throttled-mailpassword": "एकटा कूटशब्द स्मारक पहिनहिये पठाएल गेल अछि, {{PLURAL:$1|घण्टा|$1 घण्टा}}क भीतर।\nदुरुपयोग रोकबा लेल, मात्र एकटा कूटशब्द {{PLURAL:$1|घण्टा|$1 घण्टा}}मे पठाएल जाएत।",
        "mailerror": "ई-पत्र पठेबामे त्रुटी: $1",
        "login-abort-generic": "अहाँक सम्प्रवेश सफल नै भेल- रोकल गएल",
        "login-migrated-generic": "अहाँके खाता माइग्रेट कएल गेल अछि, आर अहाँके प्रयोक्ता नाम आब ई विकिमे नै अछि।",
        "loginlanguagelabel": "भाषा : $1",
-       "suspicious-userlogout": "à¤\85हाà¤\81à¤\95 à¤¨à¤¿à¤·à¥\8dà¤\95à¥\8dरमणà¤\95 à¤\85नà¥\81रà¥\8bध à¤¨à¥\88 à¤®à¤¾à¤¨à¤² à¤\97à¥\87ल à¤\95ारण à¤\88 à¤²à¤¾à¤\97ल à¤\9cà¥\87 à¤\88 à¤ªà¥\81रान à¤\97वà¥\87षà¤\95à¤\95 à¤²à¤¾à¤\97ि à¤µà¤¾ à¤¦à¥\8bसराà¤\87त à¤\89पसà¥\8dमà¥\83ति à¤¦à¥\8dवारा à¤ªà¤ à¤¾à¤\93ल à¤\97à¥\87ल à¤\9bल।",
-       "createacct-another-realname-tip": "मूल नाम वैकल्पिक अछि।\nजँ अहाँ एकरा देबा लेल प्रयोग करै छी, ई अहाँकेँ काजक श्रेय देबा लेल एकर प्रयोग कएल जाएत।",
+       "suspicious-userlogout": "अहाँक निष्क्रमणक अनुरोध नै मानल गेल कारण ई लागल जे ई पुरान गवेषकक लागि वा दोसराइत उपस्मृतद्वारा पठाओल गेल छल।",
+       "createacct-another-realname-tip": "मूल नाम वैकल्पिक अछि।\nजँ अहाँ एकरा देबा लेल प्रयोग करै छी, ई अहाँक काजक श्रेय देबा लेल एकर प्रयोग कएल जाएत।",
        "pt-login": "सम्प्रवेश",
        "pt-login-button": "सम्प्रवेश",
        "pt-createaccount": "खाता खोलल जाए",
        "passwordreset-emailsentemail": "एकटा ई-पत्र मोन पाड़बा लेल पठाओल गेल अछि।",
        "passwordreset-emailsent-capture": "एकटा स्मरण ई-पत्र पठाएल गेल अछि, जे नीचाँ देखाएल अछि।",
        "passwordreset-emailerror-capture": "एकटा स्मरण ई-पत्र बनाएल गेल अछि, जे नीचाँ देखाएल अछि, मुदा प्र्योक्ताकेँ एकरा पठेबाक प्रयास विफल भेल: $1",
-       "changeemail": "à¤\88-पतà¥\8dर à¤¸à¤\82à¤\95à¥\87त à¤¬à¤¦à¤²à¥\82",
-       "changeemail-header": "à¤\88-पतà¥\8dर à¤ªà¤¤à¤¾ à¤\96ाता à¤¬à¤¦à¤²à¥\82",
+       "changeemail": "à¤\88-मà¥\87ल à¤ªà¤¤à¤¾ à¤ªà¤°à¤¿à¤µà¤°à¥\8dतित à¤\95रà¥\80",
+       "changeemail-header": "à¤\85पन à¤\88मà¥\87ल à¤ªà¤¤à¤¾ à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¹à¥\87तà¥\81 à¤\8fà¤\95रा à¤ªà¥\81रा à¤\95रà¥\80। à¤¯à¤¦à¤¿ à¤\85हाà¤\81 à¤\85पन à¤µà¤°à¥\8dतमान à¤\88मà¥\87ल à¤ªà¤¤à¤¾ à¤¹à¤\9fाबà¥\88लà¥\87ल à¤\9aाहà¥\88त à¤\9bà¥\80, à¤¤à¤\81 à¤\8fà¤\95रा à¤\96ालà¥\80 à¤\9bà¥\8bडि à¤¦à¥\80 à¤\86 à¤\8fà¤\95रा à¤­à¥\87à¤\9cà¥\80।",
        "changeemail-no-info": "अहाँकेँ ऐ पन्नाकेँ सोझे देखबाले सम्प्रवेशित हुअए पड़त।",
        "changeemail-oldemail": "अखुनका ई-पत्र संकेत:",
        "changeemail-newemail": "नव ई-पत्र संकेत:",
        "sig_tip": "अहाँक हस्ताक्षर समयक मोहरक संग",
        "hr_tip": "अक्षांशीय पंक्ति (अल्प उपयोग)",
        "summary": "सारांश:",
-       "subject": "विषय/मुख्यपंक्ति:",
+       "subject": "विषय:",
        "minoredit": "अल्प संपादन",
        "watchthis": "एहि पृष्ठकेँ देखू",
        "savearticle": "पन्नाक रक्षण करू",
        "missingcommenttext": "कृपा कऽ अपन विचार नीचाँ प्रविष्ट करू।",
        "missingcommentheader": "'''स्मरण:''' अहाँ कोनो विषय/ शीर्षक ऐ टिप्पणीक लेल नै देने छी।\nजँ अहाँ फेरसँ क्लिक करब \"{{int:savearticle}}\" , अहाँक सम्पादन बिना एकर संरक्षित भऽ जाएत।",
        "summary-preview": "सारांश पूर्वावलोकन",
-       "subject-preview": "विषय/ शीर्षक पूर्वावलोकन",
+       "subject-preview": "विषयक झलक:",
        "previewerrortext": "आहाँकें परिवर्तन के पूर्वावलोकन करई कें समय एक त्रुटि एल ।",
        "blockedtitle": "प्रयोक्ता प्रतिबन्धित अछि।",
        "blockedtext": "''' अहाँक प्रयोक्तानाम वा अनिकेत प्रतिबन्धित कऽ देल गेल अछि।'''\n\nई प्रतिबन्ध $1 द्वारा कएल गेल।\nएकर कारण अछि ''$2'' ।\n\n* प्रतिबन्धक प्रारम्भ: $8\n* प्रतिबन्धक समाप्ति: $6\n* आसन्न प्रतिबन्धसँ प्रभावित: $7\n\nअहाँ $1 सँ सम्पर्क कऽ सकै छी वा दोसर [[{{MediaWiki:Grouppage-sysop}}|संचालक]] सँ प्रतिबन्धक विषयमे सम्पर्क कऽ सकै छी।\nअहाँ ’ऐ प्रयोक्ताकेँ ई-पत्र दिअ’ सुविधाक प्रयोग नै कऽ सकै छी यावत एकटा मान्य ई-पत्र संकेतक विवरण अहाँक  [[Special:Preferences|खाता विकल्प]] मे नै देल अछि आ अहाँकेँ एकर प्रयोग करबासँ रोकि नै देल गेल हो।\nअहाँक वर्तमान अनिकेत अछि $3, आ प्रतिबन्ध संख्या अछि # $5 ।\nऐ सभ विवरणक उल्लेख अहाँ अपन कोनो कएल जाइबला प्रश्नमे करू।",
        "newarticle": "(नव)",
        "newarticletext": "अहाँ एहेन पन्नाक लिंकक अनुसरण कऽ आएल छी जे पन्ना अखन बनले नै अछि।\nपन्ना बनेबाक लेल नीचाँक बक्शामे टाइप केनाइ शुरू करू (देखू [$1  सहायता पन्ना] विषेष जानकारी लेल)।",
        "anontalkpagetext": "----'' ई एकटा अनाम प्रयोक्ताक लेल वार्ता पन्ना छी जे अखन धरि अपन खाता नै खोलने छथि, वा जे एकर प्रयोग नै करै छथि।\nहमरा सभकेँ तइ लेल अंकीय अनिकेतक प्रयोग हुनका देखार करबा लेल करऽ पड़ि रहल अछि।\nऐ तरहक अनिकेत अनेक प्रयोक्ता द्वारा साझी कएल जा सकैत अछि।\nजँ अहाँ अनाम प्रयोक्ता छी आ बुझै छी जे बिना मतलबक टिप्पणी अहाँ दिस देल जा रहल अछि, तँ कृपा कऽ [[Special:UserLogin/signup|एकटा खाता खोलू]] वा [[Special:UserLogin|सम्प्रवेश]] जइसँ भविष्यमे आन अनाम प्रयोक्तासँ अहाँकेँ दिक्कत नै हो।''",
-       "noarticletext": "à¤\85à¤\96न à¤\90 à¤ªà¤¨à¥\8dनापर à¤\95à¥\8bनà¥\8b à¤ªà¤¾à¤  à¤¨à¥\88 à¤\85à¤\9bि।\nà¤\85हाà¤\81 [[Special:Search/{{PAGENAME}}|à¤\90 à¤ªà¤¨à¥\8dनाà¤\95 à¤¶à¥\80रà¥\8dषà¤\95à¥\87à¤\81 à¤¤à¤¾à¤\95à¥\82]] à¤\86न à¤ªà¤¨à¥\8dनापर,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} à¤¸à¤®à¥\8dबनà¥\8dधà¥\80 à¤µà¥\83तà¥\8dतलà¥\87à¤\96 à¤¤à¤¾à¤\95à¥\82],\nà¤\86à¤\95ि [{{fullurl:{{FULLPAGENAME}}|action=edit}} à¤\90 à¤ªà¤¨à¥\8dनाà¤\95à¥\87à¤\81 à¤¸à¤®à¥\8dपादित à¤\95रà¥\82]</span>.",
+       "noarticletext": "à¤\85à¤\96न à¤\88 à¤ªà¤¨à¥\8dनापर à¤\95à¥\8bनà¥\8b à¤ªà¤¾à¤  à¤¨à¥\88 à¤\85à¤\9bि।\nà¤\85हाà¤\81 [[Special:Search/{{PAGENAME}}|à¤\88 à¤ªà¤¨à¥\8dनाà¤\95 à¤¶à¥\80रà¥\8dषà¤\95 à¤¤à¤¾à¤\95à¥\80]] à¤\86न à¤ªà¤¨à¥\8dनापर,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} à¤¸à¤®à¥\8dबनà¥\8dधà¥\80 à¤µà¥\83तà¥\8dतलà¥\87à¤\96 à¤¤à¤¾à¤\95à¥\80],\nà¤\86à¤\95ि [{{fullurl:{{FULLPAGENAME}}|action=edit}} à¤\88 à¤ªà¤¨à¥\8dनाà¤\95 à¤¨à¤¿à¤°à¥\8dमाण à¤\95रà¥\80]</span>।",
        "noarticletext-nopermission": "अखन ऐ पन्नापर कोनो पाठ नै अछि।\nअहाँ [[Special:Search/{{PAGENAME}}|ऐ पन्ना शीर्षक लेल ताकू]]",
        "missing-revision": "\"{{FULLPAGENAME}}\" पन्ना के अवतरण #$1 मौजूद नई अछि ।\n\nओन त ई एक हट्याल गेल पन्ना के पुराना कडी पे क्लिक करबाक कारण से होएत अछि।\nअधिक जानकारी के लेल आहाँ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} हटाबै के लॉग] देख सकै अछि।",
        "userpage-userdoesnotexist": "प्रयोक्ता खाता \"<nowiki>$1</nowiki>\" पंजीकृत नै अछि।\nनिश्चय करू जे की अहाँ ई पन्ना बनेबाक/ सम्पादित करबाक इच्छुक छी।",
        "recentchanges-feed-description": "ऐ सूचना-तंत्रांशमे विकीमे भेल सभसँ लगक परिवर्तन ताकू",
        "recentchanges-label-newpage": "ई सम्पादन एकटा नव पन्नाक निर्माण केलक।",
        "recentchanges-label-minor": "ई एकटा लघु सम्पादन छी",
-       "recentchanges-label-bot": "à¤\88 à¤¸à¤®à¥\8dपादन à¤¯à¤¾à¤\82त्रिक छल।",
+       "recentchanges-label-bot": "à¤\88 à¤¸à¤®à¥\8dपादन à¤¯à¤¾à¤¨à¥\8dत्रिक छल।",
        "recentchanges-label-unpatrolled": "ऐ सम्पादनक पुनरीक्षण अखन धरि नै कएल गेल अछि।",
        "recentchanges-label-plusminus": "पन्नाके आकार इ बाइट संख्यासे बदलल गेल",
        "recentchanges-legend-heading": "<strong>कुञ्जी:</strong>",
        "tooltip-ca-edit": "ई पन्नाक सम्पादित करी",
        "tooltip-ca-addsection": "नव खण्ड शुरू करू",
        "tooltip-ca-viewsource": "ऐ पन्नापर वरदहस्त छै।\nअहाँ एकर जड़ि देख सकै छी।",
-       "tooltip-ca-history": "à¤\88 à¤ªà¥\83षà¥\8dठà¤\95 à¤ªà¤¹à¤¿à¤²à¥\81à¤\95ा à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनसभ",
+       "tooltip-ca-history": "à¤\88 à¤ªà¥\83षà¥\8dठà¤\95 à¤ªà¥\81रान à¤\85वतरण",
        "tooltip-ca-protect": "ऐ पन्नाकेँ बचाउ",
        "tooltip-ca-unprotect": "ऐ पन्नाक रक्षा कवच बदलू",
        "tooltip-ca-delete": "ऐ पन्नाकेँ मेटाउ",
        "tooltip-ca-move": "ऐ पृष्ठकेँ हटाउ",
        "tooltip-ca-watch": "ई पन्नाकेँ अपन साकांक्षसूचीमे राखी",
        "tooltip-ca-unwatch": "ऐ पन्नाकेँ हमर साकांक्ष सूचीसँ हटाउ",
-       "tooltip-search": "ताकी {{SITENAME}}",
+       "tooltip-search": "{{SITENAME}}मे ताकी",
        "tooltip-search-go": "पृष्ठपर पहुँची जौं एनमेन पृष्ठ रहए",
        "tooltip-search-fulltext": "ई पाठक लेल पृष्ठसभमे ताकी",
        "tooltip-p-logo": "सम्मुख पन्ना देखी",
-       "tooltip-n-mainpage": "मुख्य पृष्ठकेँ देखी",
+       "tooltip-n-mainpage": "मुख्य पृष्ठ देखी",
        "tooltip-n-mainpage-description": "मुख्य पन्नापर जाए",
        "tooltip-n-portal": "परियोजनाक विषयमे,अहाँ की कए सकैत छी, वस्तु प्राप्ति स्थल",
        "tooltip-n-currentevents": "लगक घटनाक विषयमे आधार सूचना प्राप्त करी।",
        "tooltip-feed-rss": "ऐ पन्ना लेल आर.एस.एस. सूचना",
        "tooltip-feed-atom": "ऐ पन्ना लेल अणु समदिया",
        "tooltip-t-contributions": "ई {{GENDER:$1|प्रयोक्ताक}} योगदानक सूची देखी",
-       "tooltip-t-emailuser": "à¤\90 à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dताà¤\95à¥\87à¤\81 à¤\88-पतà¥\8dर à¤ªà¤ à¤¾à¤\89",
+       "tooltip-t-emailuser": "à¤\88 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताà¤\95 à¤\88-पतà¥\8dर à¤ªà¤ à¤¾à¤¬à¥\80",
        "tooltip-t-info": "ई पृष्ठ के सम्बन्धमें आर बैंसी जानकारी",
-       "tooltip-t-upload": "à¤\9aितà¥\8dर à¤\86à¤\95ि à¤®à¥\80डिया à¤«à¤¾à¤\87लà¤\95à¥\87à¤\81 अपलोड करी",
+       "tooltip-t-upload": "à¤\9aितà¥\8dर à¤\86à¤\95ि à¤®à¤¿à¤¡à¤¿à¤¯à¤¾ à¤«à¤¾à¤\87ल अपलोड करी",
        "tooltip-t-specialpages": "सभटा विशेष पन्नाक सूची",
        "tooltip-t-print": "ई पृष्ठक छपैबला रूप",
-       "tooltip-t-permalink": "पनà¥\8dनाà¤\95 à¤\90 à¤¸à¤\82वरà¥\8dधनक स्थायी लिङ्क",
-       "tooltip-ca-nstab-main": "विषय à¤¸à¥\82à¤\9aà¥\80बला à¤ªà¤¨à¥\8dना देखी",
+       "tooltip-t-permalink": "पà¥\83षà¥\8dठà¤\95 à¤\88 à¤¸à¤\82सà¥\8dà¤\95रणक स्थायी लिङ्क",
+       "tooltip-ca-nstab-main": "सामà¤\97à¥\8dरà¥\80 à¤µà¤¾à¤²à¤¾ à¤ªà¥\83षà¥\8dठ देखी",
        "tooltip-ca-nstab-user": "प्रयोक्ता पन्नाकेँ देखू",
        "tooltip-ca-nstab-media": "मीडिया पृष्ठ देखू",
        "tooltip-ca-nstab-special": "ई एकटा विशिष्ट पन्ना छी, आ अहाँ एकरा सम्पादित नै कऽ सकै छी",
        "tooltip-watchlistedit-raw-submit": "साकांक्षसूची उद्दतन करू",
        "tooltip-recreate": "पन्ना फेरसँ बनाउ तखनो जँ ई मेटा देल गेल हुअए",
        "tooltip-upload": "उपारोपण करू",
-       "tooltip-rollback": "\"पà¥\8dरतà¥\8dयावरà¥\8dतन\" à¤\90 à¤ªà¤¨à¥\8dनाà¤\95 à¤\85नà¥\8dतिम à¤¯à¥\8bà¤\97दान à¤\95रà¥\88बलाà¤\95 à¤¸à¤®à¥\8dपादन (समà¥\8dपादनसभ)à¤\95à¥\87à¤\81 à¤\8fà¤\95 à¤\95à¥\8dलिà¤\95मà¥\87 à¤ªà¥\81रान à¤\9cà¤\97हपर à¤²à¤½ à¤\9cाà¤\8f",
+       "tooltip-rollback": "\"पà¥\8dरतà¥\8dयावरà¥\8dतन\" à¤\88 à¤ªà¤¨à¥\8dनाà¤\95 à¤\85नà¥\8dतिम à¤¯à¥\8bà¤\97दान à¤\95रà¥\88बलाà¤\95 à¤¸à¤®à¥\8dपादन (समà¥\8dपादनसभ)à¤\95 à¤\8fà¤\95 à¤\95à¥\8dलिà¤\95मà¥\87 à¤ªà¥\81रान à¤\9cà¤\97हपर à¤²à¤½ à¤\9cाà¤\8f।",
        "tooltip-undo": "\"फेरसँ वएह\" सम्पादनकेँ पूर्वस्थितिमे लऽ जाइए आ पूर्वावलोकन अवस्थामे सम्पादन फॉर्म खोलैए। ई सारांशमे कारण जोड़बाक विकल्प दैत अछि।",
        "tooltip-preferences-save": "मोनपसंद के सुरक्षित करू",
        "tooltip-summary": "छोट संक्षेप दिअ",
        "lastmodifiedatby": "ई पन्ना अंतिम बेर संवर्धित भेल $2, $1 द्वारा $3।",
        "othercontribs": "$1 के काजुक तरहे",
        "others": "दोसर, आन",
-       "siteusers": "{{अन्तर्जाल}} {{PLURAL:$2|प्रयोक्ता|प्रयोक्ता सभ}} $1",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1|प्रयोगकर्ता}}|प्रयोगकर्ता}} $1",
        "anonusers": "{{अन्तर्जाल}} अज्ञात {{PLURAL:$2|प्रयोक्ता|प्रयोक्ता सभ}} $1",
        "creditspage": "पन्नाक श्रेय",
        "nocredits": "अहि पन्नाक लेल क्रेडिट ज़ानकारी नहि अछि",
        "scarytranscludefailed-httpstatus": "[$1 के लेल आकृति नै आइन पेलौ, त्रुटि: HTTP $2]",
        "scarytranscludetoolong": "यूआरएल बड़ पैग अछि",
        "deletedwhileediting": "'''Warning''': अहां जखन सें संपादन शुरू केने छी, ओकर बाद से ई पृष्ठ के मिटा देल गेल अछि.",
-       "confirmrecreate": "पà¥\8dरयà¥\8bà¤\95à¥\8dता [[User:$1|$1]] ([[User talk:$1|वारà¥\8dता]]) à¤\85हाà¤\81à¤\95 à¤\95ारण à¤¸à¤¹à¤¿à¤¤ à¤¸à¤®à¥\8dपादनà¤\95 à¤¬à¤¾à¤¦ à¤\90 à¤ªà¤¨à¥\8dनाà¤\95à¥\87à¤\81 à¤®à¥\87à¤\9fा à¤¦à¥\87लà¤\95:\n: ''$2''\nà¤\95à¥\83पा à¤\95ऽ à¤\85हाà¤\81 à¤¸à¥\81निशà¥\8dà¤\9aित à¤\95रà¥\82 à¤\9cà¥\87 à¤\85हाà¤\81 à¤\90 à¤ªà¤¨à¥\8dनाà¤\95à¥\87à¤\81 फेरसँ बनबऽ चाहै छी।",
+       "confirmrecreate": "पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता [[User:$1|$1]] ([[User talk:$1|वारà¥\8dता]]) à¤\85हाà¤\81à¤\95 à¤\95ारण à¤¸à¤¹à¤¿à¤¤ à¤¸à¤®à¥\8dपादनà¤\95 à¤¬à¤¾à¤¦ à¤\88 à¤ªà¤¨à¥\8dनाà¤\95à¥\87 à¤®à¥\87à¤\9fाà¤\8f à¤¦à¥\87लà¤\95:\n: ''$2''\nà¤\95à¥\83पा à¤\95ऽ à¤\85हाà¤\81 à¤¸à¥\81निशà¥\8dà¤\9aित à¤\95रà¥\80 à¤\9cà¥\87 à¤\85हाà¤\81 à¤\88 à¤ªà¤¨à¥\8dनाà¤\95 फेरसँ बनबऽ चाहै छी।",
        "confirmrecreate-noreason": "प्रयोक्ता [[User:$1|$1]] ([[User talk:$1|वार्ता]]) अहाँक सम्पादनक बाद ऐ पन्नाकेँ मेटा देलक| कृपा कऽ अहाँ सुनिश्चित करू जे अहाँ ऐ पन्नाकेँ फेरसँ बनबऽ चाहै छी।",
        "recreate": "फेर सें बनाऊ",
        "confirm_purge_button": "ठीक अछि",
        "compare-revision-not-exists": "जे संशोधन अहाँ कहलौं से अछिये नै।",
        "dberr-problems": "दुखी छी! ई जालस्थल तकनीकी समस्या अनुभव कऽ अछि।",
        "dberr-again": "किछु काल बाट ताकू आ फेरसँ भारित करू।",
-       "dberr-info": "(दत्तनिधि वितरकके सम्पर्क नै कऽ सकल: $1)",
-       "dberr-info-hidden": "(दत्तनिधि वितरकके सम्पर्क नै कऽ सकल: $1)",
+       "dberr-info": "(दत्तनिधि वितरकके सम्पर्क नै कऽ सकल: $1)",
+       "dberr-info-hidden": "(दत्तनिधि वितरकके सम्पर्क नै कऽ सकल: $1)",
        "dberr-usegoogle": "ऐ बीचमे अहाँ गूगलसँ खोज कऽ सकै छी।",
        "dberr-outofdate": "मोन राखू जे हमर सामिग्रीक ओकर सूची पुरान भऽ सकैए।",
        "dberr-cachederror": "ई आग्रह कएल पन्नाक उपस्मृति संरक्षित द्वितीयक अछि, आ भऽ सकैए जे अद्यतन नै हुअए।",
index ed8281a..2993d36 100644 (file)
@@ -11,7 +11,8 @@
                        "CharlieTheCabbie",
                        "Leli Forte",
                        "Macofe",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "MTSap"
                ]
        },
        "tog-underline": "Ħoloq sottolinjati:",
        "tooltip-ca-delete": "Ħassar din il-paġna",
        "tooltip-ca-undelete": "Irkupra l-modifiki magħmula f'din il-paġna qabel ma ġiet imħassra",
        "tooltip-ca-move": "Mexxi din il-paġna",
-       "tooltip-ca-watch": "Żid din il-paġna mal-lista ta' osservazzjoni tiegħek",
+       "tooltip-ca-watch": "Żid dil-paġna mal-lista ta' dawk li qed isssegwi",
        "tooltip-ca-unwatch": "Neħħi din il-paġna mill-osservazzjonijiet speċjali tiegħek",
        "tooltip-search": "Fittex fis-sit: {{SITENAME}}",
        "tooltip-search-go": "Mur fil-paġna b'dan it-titlu eżatt, jekk teżisti",
        "metadata-help": "Dan il-fajl fih aktar informazzjoni, aktarx ġie miżjud minn kamera diġitali jew skanner li ġew użati sabiex joħolquh jew biex jagħmluh diġitali.\nJekk il-fajl ġie modifikat mill-istat oriġinali, xi dettalji jistgħu ma jikkorispondux mal-verżjoni kurrenti.",
        "metadata-expand": "Uri d-dettalji",
        "metadata-collapse": "Aħbi d-dettalji",
-       "metadata-fields": "Il-metadati tal-istampa mniżżla f'dan il-messaġġ se jiġu inklużi fuq il-paġna tal-sitampa meta t-tabella tal-metadata tkun magħluqa.\nOħrajn jiġu moħbija kif inhu definit oriġinarjament.\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",
+       "metadata-fields": "Il-lista f'dal-messaġġ tal-metadati tal-istampa  se tiġi inkluża fil-paġna tal-istampa meta t-tabella tal-metadata tingħalaq.\nOħrajn jiġu moħbija skont kif inhu predefinit.\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-imagewidth": "Wisa'",
        "exif-imagelength": "Għoli",
        "exif-bitspersample": "Bits għal kull komponent",
index 01c2df0..1bd4a2b 100644 (file)
@@ -25,6 +25,8 @@
        "tog-watchdefault": "Kā goá pian-chi̍p kòe ê ia̍h kah tóng-àn ka-ji̍p kàm-sī-toaⁿ lāi-té",
        "tog-watchmoves": "Kā goá soá ê ia̍h kah tóng-àn ka-ji̍p kàm-sī-toaⁿ",
        "tog-watchdeletion": "Kā goá thâi tiāu ê ia̍h kah tóng-àn ka-ji̍p kàm-sī-toaⁿ",
+       "tog-watchuploads": "Chiong góa ap-ló͘ ê tóng-àn ka-ji̍p kam-sī-toaⁿ",
+       "tog-watchrollback": "Chiong góa í-keng ká--tńg-khì ê ia̍h-bīn ka-ji̍p góa-ê kam-sī-toaⁿ",
        "tog-minordefault": "Chiām-tēng bī-lâi ê siu-kái lóng sī sió siu-kái",
        "tog-previewontop": "Sûn-khoàⁿ ê lōe-iông tī pian-chi̍p keh-á thâu-chêng",
        "tog-previewonfirst": "Thâu-pái pian-chi̍p seng khoàⁿ-māi",
@@ -41,6 +43,7 @@
        "tog-watchlisthidebots": "Kàm-sī-toaⁿ bián hián-sī ki-khì pian-chi̍p",
        "tog-watchlisthideminor": "Kàm-sī-toaⁿ bián hián-sī sió siu-kái",
        "tog-watchlisthideliu": "Kàm-sī-toaⁿ bián hián-sī iōng-chiá ū teng-ji̍p ê pian-chi̍p",
+       "tog-watchlistreloadautomatically": "Tong kè-lū-khì kái-tōng sî chū-tōng têng-khui kam-sī-toaⁿ (su-iàu JavaScript)",
        "tog-watchlisthideanons": "Kàm-sī-toaⁿ bián hián-sī bû-bêng-sī ê pian-chi̍p",
        "tog-watchlisthidepatrolled": "Kàm-sī-toaⁿ bián hián-sī khoàⁿ-koè--ê pian-chi̍p",
        "tog-watchlisthidecategorization": "Kā ia̍h ê lūi-pia̍t chhàng--khì-lâi",
        "databaseerror-query": "揣:$1",
        "databaseerror-function": "功能:$1",
        "databaseerror-error": "chhò-gō͘",
+       "transaction-duration-limit-exceeded": "Ūi tio̍h mài sán-seng koân liōng ê têng-hok iân-sî, pún kài choán-sàng in-ūi sia-ji̍p sî-kan ($1) chhiau-kòe {{PLURAL:$2|bió-cheng}} ê chè-hān, í-keng hong hòng-khì.\nNā chún lí sī beh chi̍t kái kái-tōng kúi--a-ê hāng-bo̍k, chhì ēng chē pái sió chhau-chok khòaⁿ-māi.",
        "laggedslavemode": "'''提醒:'''頁內容可能毋是上新的。",
        "readonly": "Chu-liāu-khò· só tiâu leh",
        "enterlockreason": "Phah beh hong-só ê lí-iû, pau-koah ko͘-kè siáⁿ-mi̍h sî-chūn ē kái-tû hong-só.",
-       "readonlytext": "Chu-liāu-khò· hiān-chú-sî só tiâu leh, bô khai-hòng hō· lâng siu-kái. Che tāi-khài sī in-ūi teh pān î-siu khang-khòe, oân-sêng liáu-āu èng-tong tō ē hôe-ho̍k chèng-siông. Hū-chek ê hêng-chèng jîn-oân lâu chit-ê soat-bêng: $1",
+       "readonlytext": "Chu-liāu-khò͘ hiān-chú-sî só tiâu leh, bô khai-hòng hō͘ lâng siu-kái. Che tāi-khài sī in-ūi teh pān chéng-pī khang-khòe, goân-sêng liáu-āu èng-tong tō ē hôe-ho̍k chèng-siông. \n\nHū-chek ê hêng-chèng jîn-oân lâu chit-ê soat-bêng: $1",
        "missing-article": "Chu-liāu-khò͘ chhoē bô ia̍h ê luē-iông, ia̍h ê miâ \"$1\" $2 .\n\nChe it-poaⁿ sī in-ūi koè-sî ê cheng-chha ia̍h sī le̍k-sú liân-kiat ê ia̍h í-keng hông thâi tiàu.\n\nNā m̄-sī hit chióng chêng-hêng, lí khó-lêng tú tio̍h nńg-thé ê chhò-ngō͘. Chhiáⁿ pò hō͘ chi̍t ūi [[Special:ListUsers/sysop|koán-lí-goân]], ūi liân-kiat hiâ khì lâu thong-ti .",
        "missingarticle-rev": "(修訂版本#:$1)",
        "missingarticle-diff": "(精差:$1,$2)",
        "readonly_lag": "佇附屬的資料庫更新到主要資料庫資料的時陣,資料庫會自動鎖定。",
+       "nonwrite-api-promise-error": "Tī leh HTTP header ê 'Promise-Non-Write-API-Action' í-keng sàng--chhut-khì m̄-koh chit-ê iau-kiû sī sàng kòe 1-ê API siá-ji̍p module.",
        "internalerror": "Loē-pō͘ ê chhò-ngō͘",
        "internalerror_info": "Loē-pō͘ ê chhò-ngō͘: $1",
+       "internalerror-fatal-exception": "\"$1\" lūi ê tì-miā lē-gōa",
        "filecopyerror": "Bô-hoat-tō· kā tóng-àn \"$1\" khó·-pih khì \"$2\".",
        "filerenameerror": "Bô-hoat-tō· kā tóng-àn \"$1\" kái-miâ chò \"$2\".",
        "filedeleteerror": "Bô-hoat-tō· kā tóng-àn \"$1\" thâi tiāu",
        "directorycreateerror": "Bô-hoat-tō͘ khui bo̍k-lo̍k \"$1\".",
+       "directoryreadonlyerror": "Bo̍k-lio̍k \"$1\" sī taⁿ ē-tàng tha̍k--ê.",
+       "directorynotreadableerror": "Bo̍k-lio̍k \"$1\" sī bē-tàng tha̍k--ê",
        "filenotfound": "Chhōe bô tóng-àn \"$1\".",
        "unexpected": "Koài-koài ê pió-tat: \"$1\"=\"$2\"。",
        "formerror": "Chhò-gō·: bô-hoat-tō· kā pió sàng chhut khì.",
        "no-null-revision": "袂當予\"$1\"產生一个空的修訂本。",
        "badtitle": "M̄-chiâⁿ piau-tê",
        "badtitletext": "Iau-kiû ê piau-tê sī bô-hāu ê, khang ê, a̍h-sī liân-kiat chhò-gō· ê inter-language/inter-wiki piau-tê.",
+       "title-invalid-empty": "Só͘ iau-kiû ê ia̍h-bīn tê-bo̍k sī khang--ê he̍k-chiá kaⁿ-taⁿ hâm liáu miâ-khong-kan.",
+       "title-invalid-utf8": "Só͘ iau-kiû ê ia̍h-bīn tê-bo̍k hâm liáu bô chiàⁿ-khak ê 1 lia̍t UTF-8 ê jī.",
+       "title-invalid-interwiki": "Só͘ iau-kiû ê ia̍h-bīn tê-bo̍k pau-hâm liáu 1-ê bē-tàng ēng ùi tê-bo̍k ê interwiki liân-kiat.",
        "perfcached": "Ē-kha ê chu-liāu tùi lâi--ê, só·-í bô it-tēng sī siōng sin ê. Tī khoài-chhûn-khu siōng chē ē-tàng khǹg{{PLURAL:$1| pit|$1 pit}} chu-liāu.",
        "perfcachedts": "Ē-kha ê chu-liāu tùi lâi--ê, tī $1 keng-sin--koè. Tī khoài-chûn-khu siōng chē ē-tàng khǹg {{PLURAL:$4|pit|$4 pit}} chu-liāu.",
        "querypage-no-updates": "Chit-má bē-sái kái chit ia̍h.\nChia ê chu-liāu bē-tàng sui tiông-sin chéng-lí.",
        "headline_sample": "Thâu-tiâu bûn-jī",
        "headline_tip": "Tē-2-chân (level 2) ê phiau-tê",
        "nowiki_sample": "Chia siá bô keh-sek ê bûn-jī",
+       "nowiki_tip": "Mài chhap wiki keh-sek",
        "image_sample": "Iann-siong-e-le.jpg",
        "image_tip": "Giap tī lāi-bīn ê iáⁿ-siōng",
        "media_tip": "Tóng-àn liân-kiat",
        "sig_tip": "Lí ê chhiam-miâ kap sî-kan ìn-á",
+       "hr_tip": "Thán-pîⁿ-chōa (hàn leh ēng)",
        "summary": "Khài-iàu:",
        "subject": "Tê-bo̍k/piau-tê:",
        "minoredit": "Che sī sió siu-kái",
        "tooltip-minoredit": "記這是一个小改",
        "tooltip-save": "Pó-chhûn lí chò ê kái-piàn",
        "tooltip-preview": "Chhiáⁿ tī pó-chûn chìn-chêng,  sian khoàⁿ lí chò ê kái-piàn !",
+       "tooltip-diff": "Hián-sī lí tùi bûn-pún só͘ chò ê kái-tōng",
        "tooltip-watch": "共這頁加入去你的監視單",
        "tooltip-rollback": "Ji̍h \"Hoê-choán\" ē-sái thè tńg-khì téng-chi̍t-ê kái ê lâng ê ia̍h.",
        "tooltip-preferences-save": "保存設定",
        "siteuser": "{{SITENAME}} iōng-chiá $1",
        "othercontribs": "Kin-kù $1 ê kòng-hiàn.",
        "siteusers": "{{SITENAME}} iōng-chiá $1",
+       "simpleantispam-label": "Khòng spam kiám-cha.\n<strong>Mài</strong> thiām chit ūi!",
        "pageinfo-toolboxlink": "Ia̍h ê chu-sìn",
        "markaspatrolleddiff": "Phiau-sī sûn--kòe",
        "markedaspatrolledtext": "Í-keng phiau-sī chit ê siu-tēng-pún ū lâng sûn--kòe.",
index c0886a6..dbd48f3 100644 (file)
@@ -31,6 +31,7 @@
        "tog-watchdefault": "Azzecca 'e paggene e li files cagnàte a l'elenco 'e cuntrollo",
        "tog-watchmoves": "Azzecca 'e paggene e li files spustate a l'elenco 'e cuntrollo",
        "tog-watchdeletion": "Azzecca 'e paggene e li files scancellate a l'elenco 'e cuntrollo",
+       "tog-watchuploads": "Azzecca 'e file nuove ca sto a carrecà dint'a lista 'e paggene cuntrullate",
        "tog-watchrollback": "Azzecca 'e paggene addò aggio fatto nu rollback ('o torna arreto) a l'elenco 'e cuntrollo",
        "tog-minordefault": "Indica ogne cagnamento comme piccerillo (predefinito)",
        "tog-previewontop": "Vide previsióne primma d' 'a casella 'e modifica",
        "recentchangeslinked-page": "Nomme d' 'a paggena",
        "recentchangeslinked-to": "Mmusta sulamente 'e cagnamiente a 'e paggene cullegate a chilla specificata",
        "recentchanges-page-added-to-category": "[[:$1]] azzeccato â categurìa",
-       "recentchanges-page-added-to-category-bundled": "[[:$1]] e [[Special:WhatLinksHere/$1|{{PLURAL:$2|na paggena|$2 paggene}}]] azzeccate â categurìa",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] azzeccata â categurìa,  [[Special:WhatLinksHere/$1|sta paggena azzeccat' a 'e categurìe]]",
        "recentchanges-page-removed-from-category": "[[:$1]] luvato d' 'a categurìa",
-       "recentchanges-page-removed-from-category-bundled": "[[:$1]] e [[Special:WhatLinksHere/$1|{{PLURAL:$2|na paggena|$2 paggena}}]] luvate d' 'a categurìa",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]]  luvate 'e categurìa, [[Special:WhatLinksHere/$1|sta paggena è azzeccata dint'a n'ati paggene]]",
        "autochange-username": "Cagnamiento automateco MediaWiki",
        "upload": "Carreca file",
        "uploadbtn": "Carreca file",
        "confirmemail_body_set": "Coccheruno, può darse ca site vuje, 'a l'indirizzo IP $1,\nha mpustato nu cunto utente \"$2\" cu st'indirizzo e-mail ncopp'a {{SITENAME}}.\n\nPe' putè cunfermà ca stu cunto è stato overo criato e vuje e ve putè apiccià 'a funziona e-mail 'e {{SITENAME}}, arapite stu cullegamento dint' 'o navigatóre web d' 'o vuosto:\n\n$3\n\nSi vuje *NUN* avite riggistrato 'o cunto utente, secutate stu cullegamento pe' ve scancellà st'indirizzo e-mail utente:\n\n$5\n\nStu codece 'e cunferma murarrà 'o $4.",
        "confirmemail_invalidated": "Cunferma 'e l'indirizze e-mail scangelleta",
        "invalidateemail": "Scancella 'a cunferma 'e l'e-mail",
+       "notificationemail_subject_changed": "L'indirizzo email riggistrato ncopp'a {{SITENAME}} è stato cagnato",
+       "notificationemail_subject_removed": "L'indirizzo email riggistrato dint'a {{SITENAME}} è stato luvato",
+       "notificationemail_body_changed": "Coccheruno, probbabilmente vuje, 'a ll'indirizzo IP $1,\nave cagnato l'indirizze e-mail d' 'o cunto \"$2\" a \"$3\" ncopp'a {{SITENAME}}.\n\nSi nun eravate vuje, pe' piacere tuzzuliate mò mò n'ammenistratore.",
+       "notificationemail_body_removed": "Coccheruno, probbabilmente vuje, 'a ll'indirizzo IP $1,\nave luvato l'indirizze e-mail d' 'o cunto \"$2\" ncopp'a {{SITENAME}}.\n\nSi nun eravate vuje, pe' piacere tuzzuliate mò mò n'ammenistratore.",
        "scarytranscludedisabled": "['A funziona cullegamiento nfra site wiki è stata stutata]",
        "scarytranscludefailed": "[L'analisi d' 'o template s'è scassato pe' $1]",
        "scarytranscludefailed-httpstatus": "[L'analisi d' 'o template s'è scassato pe' $1: HTTP $2]",
        "watchlistedit-raw-done": "L'elenco 'e paggene cuntrullate è stato agghiurnato.",
        "watchlistedit-raw-added": "{{PLURAL:$1|nu titolo è|$1 titule so'}} stat'azzeccate:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|nu titolo è stato luvato|$1 titule so' state luvate}}:",
-       "watchlistedit-clear-title": "Elenco 'e cuntrollo pulezzato",
+       "watchlistedit-clear-title": "Pulezza 'a lista 'e cuntrollo",
        "watchlistedit-clear-legend": "Pulezza l'elenco 'e paggene cuntrullate",
        "watchlistedit-clear-explain": "Tutte sti titule se luvarranno 'a l'elenco 'e paggene cuntrullate vuosto",
        "watchlistedit-clear-titles": "Titule:",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|pruteggette}} $3 $4 [cascading]",
        "logentry-protect-modify": "$1 {{GENDER:$2|cagnaje}} 'o livello 'e prutezione pe' $3 $4",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|cagnaje}} 'o livello 'e prutezione pe' $3 $4 [cascading]",
-       "logentry-rights-rights": "$1 {{GENDER:$2|cagnaje}} 'e gruppo pe' {{GENDER:$3|$3}} 'a $4 a $5",
+       "logentry-rights-rights": "$1 {{GENDER:$2|cagnaje}} 'e gruppo pe' {{GENDER:$6|$3}} 'a $4 a $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|cagnaje}} 'e gruppo pe' $3",
        "logentry-rights-autopromote": "$1 è {{GENDER:$2|stato promosso|stata promossa}} automatecamente 'a $4 a $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|ave carrecato}} $3",
        "sessionprovider-nocookies": "'E cookie ponno stà stutate. Vedite si 'e cookie stann'appicciate e accumminciate n'ata vota.",
        "randomrootpage": "Paggena 'e rareca a ccaso",
        "log-action-filter-block": "Tipo 'e blocco:",
+       "log-action-filter-contentmodel": "Tipo 'e cagnamiento 'e mudell'e cuntenute (contentmodel)",
        "log-action-filter-delete": "Tipo 'e scancellazione:",
+       "log-action-filter-import": "Tipo 'e import:",
+       "log-action-filter-managetags": "Tipo 'e aziona 'e gistinone 'etichette:",
+       "log-action-filter-move": "Tipo 'e spostamento:",
+       "log-action-filter-newusers": "Tipo e' criazione utenza:",
        "log-action-filter-patrol": "Tipo 'e verifica:",
        "log-action-filter-protect": "Tipo 'e protezione:",
+       "log-action-filter-rights": "Tipo 'e cagnamiento 'e deritte",
+       "log-action-filter-suppress": "Tipo 'e suppressione",
        "log-action-filter-upload": "Tipo 'e carreca:",
        "log-action-filter-all": "Tutte",
        "log-action-filter-block-block": "Blocco",
        "log-action-filter-block-reblock": "Modifica blocco",
        "log-action-filter-block-unblock": "Sblocca",
+       "log-action-filter-contentmodel-change": "Cagnamiento 'e mudello 'e cuntenute (Contentmodel)",
+       "log-action-filter-contentmodel-new": "Criazione 'e na paggena 'e mudello 'e cuntenute nun standard",
        "log-action-filter-delete-delete": "Scancellazione 'e paggena",
        "log-action-filter-delete-restore": "Arrepigliament' 'e paggena",
        "log-action-filter-delete-event": "Scancellazione d' 'o reggistro",
        "log-action-filter-delete-revision": "Scancellazione d' 'a verziona",
+       "log-action-filter-import-interwiki": "Mpurtaziona transwiki",
+       "log-action-filter-import-upload": "Mpurtazione 'e XML carrecato",
+       "log-action-filter-managetags-create": "Criazione 'etichetta",
+       "log-action-filter-managetags-delete": "Scancellazione 'etichetta",
+       "log-action-filter-managetags-activate": "Appiccia 'etichetta",
+       "log-action-filter-managetags-deactivate": "Stuta etichetta",
+       "log-action-filter-move-move": "Móve senza sovrascrivere 'e redirect",
+       "log-action-filter-move-move_redir": "Móve senza sovrascrivere 'e redirect",
+       "log-action-filter-newusers-create": "Criazione 'a n'utente anonimo",
+       "log-action-filter-newusers-create2": "Criazione 'a n'utente riggistrato",
+       "log-action-filter-newusers-autocreate": "Criazione automatica",
+       "log-action-filter-newusers-byemail": "Criazione cu na password mannata via email",
        "log-action-filter-patrol-patrol": "Verifica manuale",
        "log-action-filter-patrol-autopatrol": "Verifica automatica",
        "log-action-filter-protect-protect": "Prutezione",
        "log-action-filter-protect-modify": "Cagna prutezione",
        "log-action-filter-protect-unprotect": "Sprutezione",
+       "log-action-filter-protect-move_prot": "Prutezione spustata",
+       "log-action-filter-rights-rights": "Cagnamento manuale",
+       "log-action-filter-rights-autopromote": "Cagnamento automatico",
+       "log-action-filter-suppress-event": "Scancellazione 'e riggistro",
+       "log-action-filter-suppress-revision": "Scancellazione 'e verziona",
+       "log-action-filter-suppress-delete": "Scancellazione 'e paggena",
+       "log-action-filter-suppress-block": "Scancellazione 'utente 'a blocco",
+       "log-action-filter-suppress-reblock": "Scancellazione utente 'a re-blocco",
        "log-action-filter-upload-upload": "Carreca nova",
        "log-action-filter-upload-overwrite": "Recarreca"
 }
index 15f8e89..52df77c 100644 (file)
        "logentry-protect-protect-cascade": "$1 heeft $3 {{GENDER:$2|beveiligd}} $4 [cascade]",
        "logentry-protect-modify": "$1 heeft het beveiligingsniveau van $3 {{GENDER:$2|aangepast}} $4",
        "logentry-protect-modify-cascade": "$1 heeft het beveiligingsniveau van $3 {{GENDER:$2|aangepast}} $4 [cascade]",
-       "logentry-rights-rights": "$1 {{GENDER:$2|heeft}} groepslidmaatschap voor $3 gewijzigd van $4 naar $5",
+       "logentry-rights-rights": "$1 {{GENDER:$2|heeft}} groepslidmaatschap voor {{GENDER:$6|$3}} gewijzigd van $4 naar $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|heeft}} het groepslidmaatschap gewijzigd voor $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|is}} automatisch gepromoveerd van $4 naar $5",
        "logentry-upload-upload": "$1 heeft $3 {{GENDER:$2|geüpload}}",
index 9815492..77a6e8b 100644 (file)
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|zabezpieczył|zabezpieczyła|zabezpieczył(a)}} $3 $4 [kaskadowo]",
        "logentry-protect-modify": "$1 {{GENDER:$2|zmienił|zmieniła|zmienił(a)}} poziom zabezpieczenia dla $3 $4",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|zmienił|zmieniła|zmienił(a)}} poziom zabezpieczenia dla $3 $4 [kaskadowo]",
-       "logentry-rights-rights": "$1 {{GENDER:$2|zmienił|zmieniła|zmienił(a)}} przynależność {{GENDER:$3|$3}} do grupy z $4 do $5",
+       "logentry-rights-rights": "$1 {{GENDER:$2|zmienił|zmieniła|zmienił(a)}} przynależność {{GENDER:$6|$3}} do grupy z $4 do $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|zmienił|zmieniła}} przynależność $3 do grup",
        "logentry-rights-autopromote": "$1 automatycznie {{GENDER:$2|zmienił|zmieniła}} przynależność ($4 → $5)",
        "logentry-upload-upload": "$1 {{GENDER:$2|przesłał|przesłała}} $3",
index 6000918..2ceb7e5 100644 (file)
        "tog-watchdefault": "Adicionar as páginas e arquivos que eu editar à minha lista de páginas vigiadas",
        "tog-watchmoves": "Adicionar as páginas e arquivos que eu mover à minha lista de páginas vigiadas",
        "tog-watchdeletion": "Adicionar as páginas e arquivos que eu eliminar à minha lista de páginas vigiadas",
+       "tog-watchuploads": "Adicionar arquivos que envio para minha lista de vigiados",
        "tog-watchrollback": "Adicionar páginas onde fiz uma reversão às minhas páginas vigiadas",
        "tog-minordefault": "Marcar todas as edições como menores por padrão",
        "tog-previewontop": "Mostrar previsão antes da caixa de edição",
        "noemail": "Não há um endereço de e-mail associado ao usuário \"$1\".",
        "noemailcreate": "Você precisa fornecer um endereço de e-mail válido",
        "passwordsent": "Uma nova senha está sendo enviada para o endereço de e-mail registrado para \"$1\".\nPor favor, reconecte-se ao recebê-lo.",
-       "blocked-mailpassword": "O seu endereço de IP foi bloqueado de editar e, portanto, não será possível utilizar o lembrete de senha (para serem evitados envios abusivos a outras pessoas).",
+       "blocked-mailpassword": "O seu endereço de IP foi bloqueado para editar. Para evitar abusos, não é permitido o uso de recuperação de senha a partir deste endereço IP.",
        "eauthentsent": "Uma mensagem de confirmação foi enviada para o endereço de e-mail fornecido.\nAntes de qualquer outro e-mail ser enviado para a sua conta, você precisará seguir as instruções da mensagem, de modo a confirmar que a conta é mesmo sua.",
        "throttled-mailpassword": "Um lembrete de senha já foi enviado {{PLURAL:$1|na última hora|nas últimas $1 horas}}.\nPara prevenir abusos, apenas um lembrete poderá ser enviado a cada {{PLURAL:$1|hora|$1 horas}}.",
        "mailerror": "Erro a enviar o email: $1",
        "recentchangeslinked-page": "Nome da página:",
        "recentchangeslinked-to": "Inversamente, mostrar mudanças nas páginas que contêm ligações para esta",
        "recentchanges-page-added-to-category": "[[:$1]]adicionada à categoria",
-       "recentchanges-page-added-to-category-bundled": "[[:$1]] e [[Special:WhatLinksHere/$1|{{PLURAL:$2|uma página|$2 páginas}}]] adicionadas à categoria",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] adicionado à categoria, [[Special:WhatLinksHere/$1|esta página é incluída em outras páginas]]",
        "recentchanges-page-removed-from-category": "[[:$1]] removida da categoria",
-       "recentchanges-page-removed-from-category-bundled": "[[:$1]] e [[Special:WhatLinksHere/$1|{{PLURAL:$2|uma página|$2 páginas}}]] removidas da categoria",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] removido da categoria, [[Special:WhatLinksHere/$1|esta página é incluída em outras páginas]]",
        "autochange-username": "Alteração automática do MediaWiki",
        "upload": "Enviar arquivo",
        "uploadbtn": "Enviar arquivo",
        "backend-fail-read": "Não foi possível ler o arquivo $1.",
        "backend-fail-create": "Não foi possível criar ou alterar o arquivo $1.",
        "backend-fail-maxsize": "Não foi possível criar ou alterar o arquivo $1 por ele ser maior que {{PLURAL:$2|1 byte|$2 bytes}}.",
-       "backend-fail-readonly": "O servidor de armazenamento \"$1\" está atualmente no modo \"somente leitura\". A razão dada foi: \"$2\"",
+       "backend-fail-readonly": "A armazenagem de \"$1\" está atualmente somente leitura. O motivo é: <em>$2</em>",
        "backend-fail-synced": "O arquivo \"$1\" está em um estado inconsistente dentro do sistema de armazenamento interno",
        "backend-fail-connect": "Não foi possível se conectar com o servidor de armazenamento \"$1\".",
        "backend-fail-internal": "Ocorreu um erro desconhecido no servidor de armazenamento \"$1\".",
        "uploadstash-summary": "Esta página dá acesso aos arquivos enviados (ou que estão no processo de envio) mas que ainda não foram publicados no wiki. Estes arquivos não são visíveis para ninguém, exceto para o usuário que os enviou.",
        "uploadstash-clear": "Apagar os arquivos escondidos",
        "uploadstash-nofiles": "Você não tem nenhum arquivo escondido.",
-       "uploadstash-badtoken": "Não foi possível executar essa operação, talvez porque as suas credenciais de edição expiraram. Tente novamente.",
-       "uploadstash-errclear": "Não foi possível apagar os arquivos.",
+       "uploadstash-badtoken": "A realização daquela ação falhou, talvez porque suas credenciais de edição expiraram. Por favor, tente novamente.",
+       "uploadstash-errclear": "A limpeza dos arquivos falhou.",
        "uploadstash-refresh": "Atualizar a lista de arquivos",
        "uploadstash-thumbnail": "ver miniatura",
        "invalid-chunk-offset": "Deslocamento de fragmento inválido",
        "apihelp-no-such-module": "Modulo \"$1\" não foram achados.",
        "apisandbox": "Caixa de areia da API",
        "apisandbox-api-disabled": "A API está desabilitada neste site.",
-       "apisandbox-intro": "Use esta página para realizar testes com o '''serviço web de API do MediaWiki'''.\nConsulte a [//www.mediawiki.org/wiki/API:Main_page a documentação API] para obter mais detalhes de uso da API.  Exemplo: [//www.mediawiki.org/wiki/API#A_simple_example obter o conteúdo de uma Página principal].  Selecione uma ação para mais exemplos.\n\nNote que, embora esta seja uma área de testes, as operações que executar nesta página podem modificar a wiki.",
+       "apisandbox-intro": "Use esta página para realizar testes com o '''serviço web de API do MediaWiki'''.\nConsulte a [//www.mediawiki.org/wiki/API:Main_page a documentação API] para obter mais detalhes de uso da API.  Exemplo: [//www.mediawiki.org/wiki/API#A_simple_example obter o conteúdo de uma Página principal].  Selecione uma ação para mais exemplos.\n\nNote que, embora esta seja uma área de testes, as ações que executar nesta página podem modificar a wiki.",
        "apisandbox-submit": "Fazer requisição",
        "apisandbox-reset": "Limpar",
-       "apisandbox-examples": "Exemplo",
-       "apisandbox-results": "Resultado",
+       "apisandbox-retry": "Tentar novamente",
+       "apisandbox-loading": "Carregando informação para o módulo API \"$1\"...",
+       "apisandbox-helpurls": "Links de ajuda",
+       "apisandbox-examples": "Exemplos",
+       "apisandbox-dynamic-parameters": "Parâmetros adicionais",
+       "apisandbox-dynamic-parameters-add-label": "Parâmetro adicional",
+       "apisandbox-dynamic-parameters-add-placeholder": "Nome do parâmetro",
+       "apisandbox-deprecated-parameters": "Parâmetros obsoletos",
+       "apisandbox-submit-invalid-fields-title": "Alguns campos são inválidos",
+       "apisandbox-results": "Resultados",
        "apisandbox-request-url-label": "URL solicitante:",
-       "apisandbox-request-time": "Tempo do pedido: $1",
+       "apisandbox-request-time": "Tempo do pedido: {{PLURAL:$1|$1 ms}}",
        "booksources": "Fontes bibliográficas",
        "booksources-search-legend": "Pesquisar referências bibliográficas",
        "booksources-search": "Pesquisar",
        "delete-toobig": "Esta página possui um longo histórico de edições, com mais de $1 {{PLURAL:$1|edição|edições}}.\nA eliminação de tais páginas foi restrita, a fim de se evitarem problemas acidentais em {{SITENAME}}.",
        "delete-warning-toobig": "Esta página possui um longo histórico de edições, com mais de $1 {{PLURAL:$1|edição|edições}}.\nEliminá-la poderá causar problemas na base de dados de {{SITENAME}};\nprossiga com cuidado.",
        "deleteprotected": "Não é possível eliminar esta página porque foi protegida.",
-       "deleting-backlinks-warning": "'''Cuidado:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Outras páginas]] se ligam ou redirecionam para a página que você está prestes a deletar.",
+       "deleting-backlinks-warning": "'''Cuidado:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Other pages]] ligam ou redirecionam para a página que você está prestes a excluir.",
        "rollback": "Reverter edições",
        "rollbacklink": "reverter",
        "rollbacklinkcount": "reverter $1 {{PLURAL:$1|edição|edições}}",
        "protect-locked-blocked": "Você não poderá alterar os níveis de proteção enquanto estiver bloqueado. Esta é a configuração atual para a página '''$1''':",
        "protect-locked-dblock": "Não é possível alterar os níveis de proteção, uma vez que a base de dados se encontra trancada.\nEsta é a configuração atual para a página '''$1''':",
        "protect-locked-access": "Sua conta não possui permissões para alterar os níveis de proteção de uma página.\nEsta é a configuração atual para a página '''$1''':",
-       "protect-cascadeon": "Esta página encontra-se protegida, uma vez que se encontra incluída {{PLURAL:$1|na página listada a seguir, protegida|nas páginas listadas a seguir, protegidas}} com a \"proteção progressiva\" ativada. Você poderá alterar o nível de proteção desta página, mas isso não afetará a \"proteção progressiva\".",
+       "protect-cascadeon": "Esta página está protegida porque é transclusa da seguinte {{PLURAL:$1|página, que possui|páginas, que possuem}} a proteção em cascata ativas.\nAs mudanças no nível de proteção desta página não afetam a proteção em cascata.",
        "protect-default": "Permitir todos os usuários",
        "protect-fallback": "Permitir apenas os usuários com privilégio de \"$1\"",
        "protect-level-autoconfirmed": "Permitir apenas usuários auto-confirmados",
        "tags-edit-revision-legend": "Adicionar ou remover etiquetas {{PLURAL:$1|desta revisão|de todas as $1 revisões}}",
        "tags-edit-logentry-legend": "Adicionar ou remover etiquetas {{PLURAL:$1|desta entrada de registro|de todas as $1 entradas de registro}}",
        "tags-edit-existing-tags": "Etiquetas existentes:",
-       "tags-edit-existing-tags-none": "''Nenhuma''",
+       "tags-edit-existing-tags-none": "<em>Nenhuma</em>",
        "tags-edit-new-tags": "Novas etiquetas:",
        "tags-edit-add": "Adicionar estas etiquetas:",
        "tags-edit-remove": "Remover estas etiquetas:",
        "tags-edit-reason": "Motivo:",
        "tags-edit-revision-submit": "Aplicar alterações para {{PLURAL:$1|esta revisão|$1 revisões}}",
        "tags-edit-logentry-submit": "Aplicar alterações para {{PLURAL:$1|esta entrada de registro|$1 entradas de registro}}",
-       "tags-edit-success": "As alterações foram aplicadas com sucesso.",
+       "tags-edit-success": "As alterações foram aplicadas.",
        "tags-edit-failure": "As alterações não puderam ser aplicadas:\n$1",
        "tags-edit-nooldid-title": "Revisão inválida",
        "tags-edit-nooldid-text": "Você não especificou nenhuma revisão para executar esta função, ou a revisão especificada não existe.",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|protegeu}} $3 $4 [em cascata]",
        "logentry-protect-modify": "$1 {{GENDER:$2|alterou}} o nível de proteção para $3 $4",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|alterou}} o nível de proteção para $3 $4 [em cascata]",
-       "logentry-rights-rights": "$1 alterou os grupos de usuário de $3 de $4 para $5",
+       "logentry-rights-rights": "$1 {{GENDER:$2|mudou}} membros do grupo para {{GENDER:$6|$3}} de $4 para $5",
        "logentry-rights-rights-legacy": "$1 alterou os grupos de $3",
        "logentry-rights-autopromote": "$1 foi promovido automaticamente de $4 para $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|carregou}} $3",
        "api-error-badaccess-groups": "Você não tem permissão para enviar arquivos para este wiki.",
        "api-error-badtoken": "Erro interno: token inválido.",
        "api-error-copyuploaddisabled": "O upload por URL está desativado neste servidor.",
-       "api-error-duplicate": "Já {{PLURAL:$1|há outro arquivo|existem outros arquivos}} com o mesmo conteúdo",
+       "api-error-duplicate": "Já {{PLURAL:$1|há outro arquivo|existem outros arquivos}} no site com o mesmo conteúdo",
        "api-error-duplicate-archive": "Já {{PLURAL:$1|existiu outro arquivo|existiram outros arquivos}} neste site com o mesmo conteúdo que, no entanto, {{PLURAL:$1|foi removido|foram removidos}}.",
        "api-error-empty-file": "O arquivo que você enviou está vazio.",
        "api-error-emptypage": "Não é permitido criar páginas novas vazias.",
index 66a5bb5..51f26c1 100644 (file)
@@ -69,7 +69,8 @@
                        "Önni",
                        "Diniscoelho",
                        "Josep Maria Roca Peña",
-                       "Luan"
+                       "Luan",
+                       "Gato Preto"
                ]
        },
        "tog-underline": "Sublinhar ligações:",
index ee3bd1e..5c49430 100644 (file)
                        "Aursani",
                        "Robin van der Vliet",
                        "Conquistador",
-                       "Frigory"
+                       "Frigory",
+                       "Psychoslave"
                ]
        },
        "sidebar": "{{notranslate}}",
        "botpasswords-label-cancel": "Button label for a button to cancel the creation or edit of a bot password.\n{{Identical|Cancel}}",
        "botpasswords-label-delete": "Button label for the button to delete a bot password.\n{{Identical|Delete}}",
        "botpasswords-label-resetpassword": "Label for the checkbox to reset the actual password for the current bot password.",
-       "botpasswords-label-grants": "Label for the checkmatrix for selecting grants allowed when the bot password is used.",
+       "botpasswords-label-grants": "Label for the checkmatrix for selecting grants allowed when the bot password is used.\n\ngrant: Vidu http://komputeko.net/index_en.php?vorto=grant sed \"konced/i\" egale funkcius.",
        "botpasswords-help-grants": "Help text for the grant selection checkmatrix.",
        "botpasswords-label-restrictions": "Label for the textarea field in which JSON defining access restrictions (e.g. which IP address ranges are allowed) is entered.",
        "botpasswords-label-grants-column": "Label for the checkbox column on the checkmatrix for selecting grants allowed when the bot password is used.",
        "minoredit": "Text above Save page button in editor\n\nSee also:\n* {{msg-mw|Minoredit}}\n* {{msg-mw|Accesskey-minoredit}}\n* {{msg-mw|Tooltip-minoredit}}",
        "watchthis": "Text of checkbox above {{msg-mw|Showpreview}} button in editor.\n\nSee also:\n* {{msg-mw|Watchthis}}\n* {{msg-mw|Accesskey-watch}}\n* {{msg-mw|Tooltip-watch}}\n{{Identical|Watch this page}}",
        "savearticle": "Text on the Save page button. See also {{msg-mw|showpreview}} and {{msg-mw|showdiff}} for the other buttons.\n\nSee also:\n* {{msg-mw|Savearticle}}\n* {{msg-mw|Accesskey-save}}\n* {{msg-mw|Tooltip-save}}\n{{Identical|Save page}}",
+       "publishpage": "Text on the button to save the changes to the page. It should be an action which is short and makes clear that the effect is immediate and public.\n\nSee also {{msg-mw|showpreview}} and {{msg-mw|showdiff}} for the other buttons.\n\nNote: This i18n is being introduced in advance of usage to provide extra time for translators.\n\nSee also:\n* {{msg-mw|Accesskey-publish}}\n* {{msg-mw|Tooltip-publish}}\n{{Identical|Publish page}}",
        "preview": "The title of the Preview page shown after clicking the \"Show preview\" button in the edit page. Since this is a heading, it should probably be translated as a noun and not as a verb.\n\n{{Identical|Preview}}",
        "showpreview": "The text of the button to preview the page you are editing. See also {{msg-mw|showdiff}} and {{msg-mw|savearticle}} for the other buttons.\n\nSee also:\n* {{msg-mw|Showpreview}}\n* {{msg-mw|Accesskey-preview}}\n* {{msg-mw|Tooltip-preview}}\n{{Identical|Show preview}}",
        "showdiff": "Button below the edit page. See also {{msg-mw|Showpreview}} and {{msg-mw|Savearticle}} for the other buttons.\n\nSee also:\n* {{msg-mw|Showdiff}}\n* {{msg-mw|Accesskey-diff}}\n* {{msg-mw|Tooltip-diff}}\n{{Identical|Show change}}",
        "userpage-userdoesnotexist": "Error message displayed when trying to edit or create a page or a subpage that belongs to a user who is not registered on the wiki.\n\nParameters:\n* $1 - a username\n{{identical|userdoesnotexist}}",
        "userpage-userdoesnotexist-view": "Shown in user pages of non-existing users. See for example [{{canonicalurl:User:Foo}} User:Foo].\n\nParameters:\n* $1 - a username\n{{identical|userdoesnotexist}}",
        "blocked-notice-logextract": "{{gender}}\nParameters:\n* $1 - (Optional) the name of the blocked user. Can be used for GENDER.",
-       "clearyourcache": "Text at the top of .js/.css pages",
+       "clearyourcache": "Text at the top of .js/.css pages.\n\nWhen translating browser function names, check how they are translated in the localized versions of these web browsers in your language. If a browser is not translated to it, use English or another language in which browsers are most commonly used by the speakers of your language.",
        "usercssyoucanpreview": "Text displayed on every CSS page.\n\nSee also:\n* {{msg-mw|Userjsyoucanpreview}}\n* {{msg-mw|Showpreview}}",
        "userjsyoucanpreview": "Text displayed on every JavaScript page.\n\nSee also:\n* {{msg-mw|Usercssyoucanpreview}}\n* {{msg-mw|Showpreview}}",
        "usercsspreview": "Text displayed on preview of every user .css subpage.\n\nSee also:\n* {{msg-mw|Sitecsspreview}}",
        "accesskey-ca-nstab-category": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Nstab-category}}\n* {{msg-mw|Accesskey-ca-nstab-category}}\n* {{msg-mw|Tooltip-ca-nstab-category}}",
        "accesskey-minoredit": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Minoredit}}\n* {{msg-mw|Accesskey-minoredit}}\n* {{msg-mw|Tooltip-minoredit}}",
        "accesskey-save": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Savearticle}}\n* {{msg-mw|Accesskey-save}}\n* {{msg-mw|Tooltip-save}}",
+       "accesskey-publish": "{{doc-accesskey}}\n\nNote: This i18n is being introduced in advance of usage to provide extra time for translators.\nSee also:\n* {{msg-mw|publishpage}}\n* {{msg-mw|Tooltip-publish}}",
        "accesskey-preview": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Showpreview}}\n* {{msg-mw|Accesskey-preview}}\n* {{msg-mw|Tooltip-preview}}",
        "accesskey-diff": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Showdiff}}\n* {{msg-mw|Accesskey-diff}}\n* {{msg-mw|Tooltip-diff}}",
        "accesskey-compareselectedversions": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Compareselectedversions}}\n* {{msg-mw|Accesskey-compareselectedversions}}\n* {{msg-mw|Tooltip-compareselectedversions}}",
        "tooltip-ca-nstab-category": "Tooltip shown when hovering over the {{msg-mw|Nstab-category}} tab.\n\nSee also:\n* {{msg-mw|Nstab-category}}\n* {{msg-mw|Accesskey-ca-nstab-category}}\n* {{msg-mw|Tooltip-ca-nstab-category}}",
        "tooltip-minoredit": "Tooltip shown when hovering over the \"{{msg-mw|Minoredit}}\" link below the edit form.\n\nSee also:\n* {{msg-mw|Minoredit}}\n* {{msg-mw|Accesskey-minoredit}}\n* {{msg-mw|Tooltip-minoredit}}",
        "tooltip-save": "This is the text that appears when you hover the mouse over {{msg-mw|Savearticle}} button on the edit page.\n\nSee also:\n* {{msg-mw|Savearticle}}\n* {{msg-mw|Accesskey-save}}\n* {{msg-mw|Tooltip-save}}",
+       "tooltip-publish": "This is the text that appears when you hover the mouse over {{msg-mw|publishpage}} button on the edit page.\n\nNote: This i18n is being introduced in advance of usage to provide extra time for translators.\n\nSee also:\n* {{msg-mw|publishpage}}\n* {{msg-mw|Accesskey-publish}}\n{{Identical|Publish page}}",
        "tooltip-preview": "Tooltip shown when hovering over {{msg-mw|Showpreview}} button.\n\nIf the length of the translated message is over 60 characters (including spaces) then the end of the message will be cut off when using Firefox 2.0.0.7 browser, Linux operating system and the Monobook skin.\n\nSee also:\n* {{msg-mw|Showpreview}}\n* {{msg-mw|Accesskey-preview}}\n* {{msg-mw|Tooltip-preview}}",
        "tooltip-diff": "This is the text (tooltip) that appears when you hover the mouse over {{msg-mw|Showdiff}} button on the edit page.\n\nSee also:\n* {{msg-mw|Showdiff}}\n* {{msg-mw|Accesskey-diff}}\n* {{msg-mw|Tooltip-diff}}",
        "tooltip-compareselectedversions": "Tooltip of {{msg-mw|Compareselectedversions}} (which is used as button in history pages).\n\nSee also:\n* {{msg-mw|Compareselectedversions}}\n* {{msg-mw|Accesskey-compareselectedversions}}\n* {{msg-mw|Tooltip-compareselectedversions}}",
        "logentry-protect-protect-cascade": "{{Logentry|[[Special:Log/protect]]}}\n\n* $4 - protect expiry (formatted with {{msg-mw|protect-summary-desc}}, multiple possible)\nFor word \"cascading\" see {{msg-mw|protect-summary-cascade}}",
        "logentry-protect-modify": "{{Logentry|[[Special:Log/protect]]}}\n\n* $4 - protect expiry (formatted with {{msg-mw|protect-summary-desc}}, multiple possible)",
        "logentry-protect-modify-cascade": "{{Logentry|[[Special:Log/protect]]}}\n\n* $4 - protect expiry (formatted with {{msg-mw|protect-summary-desc}}, multiple possible)\nFor word \"cascading\" see {{msg-mw|protect-summary-cascade}}",
-       "logentry-rights-rights": "* $1 - username\n* $2 - (see below)\n* $3 - username, also used for GENDER support\n* $4 - list of user groups or {{msg-mw|Rightsnone}}\n* $5 - list of user groups or {{msg-mw|Rightsnone}}\n----\n{{Logentry|[[Special:Log/rights]]}}",
+       "logentry-rights-rights": "* $1 - (see below)\n* $2 - (see below)\n* $3 - target user, like $1\n* $4 - list of user groups or {{msg-mw|Rightsnone}}\n* $5 - list of user groups or {{msg-mw|Rightsnone}}\n* $6 - target user, can be used with GENDER\n----\n{{Logentry|[[Special:Log/rights]]}}",
        "logentry-rights-rights-legacy": "* $1 - username\n* $2 - (see below)\n* $3 - username\n----\n{{Logentry|[[Special:Log/rights]]}}",
-       "logentry-rights-autopromote": "* $1 - username\n* $2 - (see below)\n* $3 - (see below)\n* $4 - comma separated list of old user groups or {{msg-mw|Rightsnone}}\n* $5 - comma separated list of new user groups\n----\n{{Logentry|[[Special:Log/rights]]}}",
+       "logentry-rights-autopromote": "* $1 - username\n* $2 - (see below)\n* $3 - (see below) - unused\n* $4 - comma separated list of old user groups or {{msg-mw|Rightsnone}}\n* $5 - comma separated list of new user groups\n* $6 - target user, can be used with GENDER for $3 - unused\n----\n{{Logentry|[[Special:Log/rights]]}}",
        "logentry-upload-upload": "{{Logentry|[[Special:Log/upload]]}}",
        "logentry-upload-overwrite": "{{Logentry|[[Special:Log/upload]]}}",
        "logentry-upload-revert": "{{Logentry|[[Special:Log/upload]]}}",
index f9316f9..bda02c8 100644 (file)
        "confirmemail_invalidated": "Подтверждение адреса электронной почты отменено.",
        "invalidateemail": "Отмена подтверждения адреса электронной почты",
        "notificationemail_subject_changed": "{{SITENAME}} зарегистрированный адрес электронной почты был изменен",
+       "notificationemail_subject_removed": "{{SITENAME}} зарегистрированный адрес электронной почты был удален",
+       "notificationemail_body_changed": "Кто-то, вероятно, вы, с IP-адреса $1,\nизменил адрес электронной почты учетной записи \"$2\" на \"$3\" на {{SITENAME}}.\n\nЕсли это были не вы, обратитесь к администратору сайта немедленно.",
+       "notificationemail_body_removed": "Кто-то, вероятно вы, с IP-адреса $1,\nудалил адрес электронной почты учетной записи \"$2\" на {{SITENAME}}.\n\nЕсли это были не вы, обратитесь к администратору сайта немедленно.",
        "scarytranscludedisabled": "[Интервики-включение отключено]",
        "scarytranscludefailed": "[Ошибка обращения к шаблону $1]",
        "scarytranscludefailed-httpstatus": "[Не удалось загрузить шаблон для $1: HTTP $2]",
        "logentry-protect-protect-cascade": "$1 защитил{{GENDER:$2||а}} $3 $4 [каскадно]",
        "logentry-protect-modify": "$1 изменил{{GENDER:$2||а}} уровень защиты $3 $4",
        "logentry-protect-modify-cascade": "$1 изменил{{GENDER:$2||а}} уровень защиты $3 $4 [каскадно]",
-       "logentry-rights-rights": "$1 {{GENDER:$2|изменил|изменила}} членство в группах для {{GENDER:$3|$3}} с $4 на $5",
+       "logentry-rights-rights": "$1 {{GENDER:$2|изменил|изменила}} членство в группах для {{GENDER:$6|$3}} с $4 на $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|изменил|изменила}} членство в группах для $3",
        "logentry-rights-autopromote": "$1 был{{GENDER:$2||а}} автоматически переведен{{GENDER:$2||а}} из $4 в $5",
        "logentry-upload-upload": "$1 загрузил{{GENDER:$2||а}} $3",
        "sessionprovider-nocookies": "Могут быть отключены куки. Убедитесь, что у вас включены куки и начните заново.",
        "randomrootpage": "Случайная корневая страница",
        "log-action-filter-block": "Тип блокировки:",
+       "log-action-filter-contentmodel": "Тип модификации contentmodel:",
        "log-action-filter-delete": "Тип удаления:",
        "log-action-filter-import": "Тип импорта:",
        "log-action-filter-managetags": "Тип тега управленческих действий:",
        "log-action-filter-block-reblock": "Изменение блокировки",
        "log-action-filter-block-unblock": "Разблокировка",
        "log-action-filter-contentmodel-change": "Изменение модели содержимого",
+       "log-action-filter-contentmodel-new": "Создание страницы с нестандартной моделью Contentmodel",
        "log-action-filter-delete-delete": "Удаления страницы",
        "log-action-filter-delete-restore": "Восстановление страницы",
        "log-action-filter-delete-event": "Удаление журнала",
        "log-action-filter-delete-revision": "Удаление версии",
+       "log-action-filter-import-interwiki": "Трансвики импорт",
+       "log-action-filter-import-upload": "Импорт через загрузку XML",
+       "log-action-filter-managetags-create": "Создание тегов",
+       "log-action-filter-managetags-delete": "Удаление тегов",
+       "log-action-filter-managetags-activate": "Активация тегов",
        "log-action-filter-managetags-deactivate": "Отключение тега",
        "log-action-filter-move-move": "Двигаться без перезаписи переадресаций",
        "log-action-filter-move-move_redir": "Переместить с заменой переадресаций",
        "log-action-filter-newusers-create": "Создание анонимным участником",
        "log-action-filter-newusers-create2": "Создание зарегистрированным участником",
        "log-action-filter-newusers-autocreate": "Автоматическое создание",
+       "log-action-filter-newusers-byemail": "Создание с паролем, присланным по электронной почте",
        "log-action-filter-patrol-patrol": "Ручное патрулирование",
        "log-action-filter-patrol-autopatrol": "Автоматическое патрулирование",
        "log-action-filter-protect-protect": "Защита",
        "log-action-filter-protect-modify": "Изменение защиты",
        "log-action-filter-protect-unprotect": "Снятие защиты",
+       "log-action-filter-protect-move_prot": "Перенос защиты",
        "log-action-filter-rights-rights": "Ручное изменение",
        "log-action-filter-rights-autopromote": "Автоматическое изменение",
+       "log-action-filter-suppress-event": "Сокрытие журнала",
        "log-action-filter-suppress-revision": "Сокрытие версии",
        "log-action-filter-suppress-delete": "Сокрытие страницы",
+       "log-action-filter-suppress-block": "Сокрытие пользователя через блокировки",
+       "log-action-filter-suppress-reblock": "Сокрытие пользователя через повторное блокирование",
        "log-action-filter-upload-upload": "Новая загрузка",
        "log-action-filter-upload-overwrite": "Повторно загрузить"
 }
index 52c19c7..6bd7f31 100644 (file)
        "export-addnstext": "नामस्थानात् पुटानि योजयतु ।",
        "export-addns": "संयोजयति",
        "export-download": "सञ्चिका इव रक्षतु ।",
-       "export-templates": "पà¥\8dराà¤\95à¥\83तà¥\80à¤\83 à¤\85नरà¥\8dभावयतà¥\81 à¥¤",
+       "export-templates": "फलà¤\95ानि à¤\86यातà¤\82 à¤\95रà¥\8bतà¥\81",
        "export-pagelinks": "...इत्यस्य गाहाय अनुबद्धपुटानि अन्तरभावयतु ।",
        "allmessages": "व्यवस्था सन्देशाः",
        "allmessagesname": "नाम",
        "thumbnail_gd-library": "अपूर्णं जि.जि.ग्रन्थालयानुन्यासः : विनष्टः कार्यकलापः $1",
        "thumbnail_image-missing": "सञ्चिका विनष्टा इति भाति : $1",
        "thumbnail_image-failure-limit": "एतत् थम्बलाईन् सिद्धं कर्तुं सद्यः जाताः बहवः असफलाः प्रयासाः सन्ति ($1 उत अधिकाः) । कृपया पुनः प्रयतताम् ।",
-       "import": "पà¥\83षà¥\8dठानाà¤\82 à¤¨à¤¿à¤°à¥\8dयातं करोतु",
+       "import": "पà¥\83षà¥\8dठमà¥\8d à¤\86यातं करोतु",
        "importinterwiki": "अन्यस्मात् विकि-जालस्थानात् पृष्ठानि आयातं करोतु",
        "import-interwiki-text": "आयातं कर्तुम् कञ्चन विकि-प्रकल्पं, किञ्चित् पृष्ठं च चिनोतु ।\nसंस्करणस्य दिनाङ्कं, सम्पादकस्य नाम यथा स्थाने भविष्यति ।\nअन्यस्मात् विकि-प्रकल्पात् आयातकृताः सर्वाः संरक्षिताऽऽवल्यः [[Special:Log/import|आयातसंरक्षिताऽऽल्यां]] भविष्यन्ति ।",
        "import-interwiki-sourcewiki": "स्रोत-विकि :",
        "import-interwiki-sourcepage": "स्रोतपृष्ठम् :",
-       "import-interwiki-history": "à¤\8fततà¥\8dपà¥\81à¤\9fारà¥\8dथà¤\82 à¤¸à¤°à¥\8dवà¥\87तिहासानà¥\8d à¤ªà¥\81नरावà¥\83तà¥\8dतà¥\80à¤\83 à¤\9a à¤ªà¥\8dरà¤\95à¥\83तà¥\80à¤\83 à¤\95रà¥\8bतà¥\81 à¥¤",
-       "import-interwiki-templates": "पà¥\8dराà¤\95à¥\83तà¥\80à¤\83 à¤\85नरà¥\8dभावयतà¥\81 à¥¤",
+       "import-interwiki-history": "à¤\8fतसà¥\8dय à¤ªà¥\83षà¥\8dठसà¥\8dय à¤¸à¤°à¥\8dवमà¥\8d à¤\87तिहासमà¥\8d à¤\86यतà¤\82 à¤\95रà¥\8bतà¥\81",
+       "import-interwiki-templates": "सरà¥\8dवà¥\88à¤\83 à¤\89पफलà¤\95à¥\88à¤\83 à¤¸à¤¹ (फलà¤\95à¥\87 à¤ªà¥\8dरयà¥\81à¤\95à¥\8dतानि) à¤\86यातà¤\82 à¤\95रà¥\8bतà¥\81",
        "import-interwiki-submit": "आयातं करोतु ।",
        "import-mapping-default": "मूलस्थितिम् आयातं करोतु",
        "import-mapping-namespace": "नामाकाशे आयातं करोतु :",
        "import-upload-filename": "सञ्चिकानाम",
        "import-comment": "टिप्पणी :",
        "importtext": "[[Special:Export|export utility]] एतेनानुबन्धेन स्रोतविकितः सञ्चिकानां निर्यातं करोतु । भवदीयसङ्गणके सुरक्ष्य अत्र उत्तारयतु ।",
-       "importstart": "पà¥\81à¤\9fानामà¥\8d à¤\86यातà¤\83....",
+       "importstart": "à¤\86यातà¤\95ारà¥\8dयà¤\82 à¤ªà¥\8dरà¤\9aलति...",
        "import-revision-count": "$1 {{PLURAL:$1|पुनरावृत्तिः}}",
        "importnopages": "आयातं कर्तुं पुटानि न सन्ति ।",
        "imported-log-entries": "आयातकृतम्$1{{PLURAL:$1|log entry|प्रवेशसूचिकाः}}.",
index 531eb67..5f98270 100644 (file)
        "userpage-userdoesnotexist": "Uporabniški račun »<nowiki>$1</nowiki>« ni registriran.\nProsimo preverite, ali res želite ustvariti/urediti to stran.",
        "userpage-userdoesnotexist-view": "Uporabniški račun »$1« ni registriran.",
        "blocked-notice-logextract": "Ta uporabnik je trenutno blokiran.\nNajnovejši vnos v dnevniku blokad je prikazan spodaj:",
-       "clearyourcache": "'''Opomba:''' Da bodo spremembe prišle do veljave, po shranitvi izpraznite predpomnilnik svojega brskalnika.\n* '''Firefox/Safari:''' Držite ''Shift'' in kliknite ''Ponovno naloži'' (''Reload'') ali pritisnite ''Ctrl-Shift-R'' ali ''Ctrl-R'' (''⌘-R'' na sistemu Mac)\n* '''Internet Explorer:''' Držite ''Ctrl-F5'' in kliknite ''Osveži'' (''Refresh'') ali pritisnite ''Ctrl-F5''\n* '''Google Chrome:''' Pritisnite ''Ctrl-Shift-R'' (''⌘-Shift-R'' na sistemu Mac)\n* '''Opera:''' Počistite predpomnilnik v ''Tools → Preferences''",
+       "clearyourcache": "<strong>Opomba:</strong> Da bodo spremembe prišle do veljave, po shranitvi izpraznite predpomnilnik svojega brskalnika.\n* <strong>Firefox/Safari:</strong> Držite <em>Shift</em> in kliknite <em>Ponovno naloži</em> (<em>Reload</em>) ali pritisnite <em>Ctrl-Shift-R</em> ali <em>Ctrl-R</em> (<em>⌘-R</em> na sistemu Mac)\n* <strong>Internet Explorer:</strong> Držite <em>Ctrl-F5</em> in kliknite <em>Osveži</em> (<em>Refresh</em>) ali pritisnite <em>Ctrl-F5</em>\n* <strong>Google Chrome:</strong> Pritisnite <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> na sistemu Mac)\n* <strong>Opera:</strong> Pojdite v <em>Meni → Nastavitve</em> (<em>Opera → Nastavitve</em> na sistemu Mac) in nato na <em>Zasebnost in varnost → Počisti podatke o brskanju → Predpomnjene slike in datoteke</em>.",
        "usercssyoucanpreview": "'''Nasvet:''' Za preizkušanje svojega novega CSS pred shranjevanjem uporabite gumb »{{int:showpreview}}«.",
        "userjsyoucanpreview": "'''Nasvet:''' Za preizkušanje svojega novega JavaScripta pred shranjevanjem uporabite gumb »{{int:showpreview}}«.",
        "usercsspreview": "'''Svoj uporabniški CSS le predogledujete.'''\n'''Ni še bil shranjen!'''",
        "logentry-protect-protect-cascade": "$1 je {{GENDER:$2|zaščitil|zaščitila|zaščitil(-a)}} $3 $4 [kaskadno]",
        "logentry-protect-modify": "$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} stopnjo zaščite $3 $4",
        "logentry-protect-modify-cascade": "$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} stopnjo zaščite $3 $4 [kaskadno]",
-       "logentry-rights-rights": "$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} uporabniške pravice {{GENDER:$3|uporabnika|uporabnice}} $3 z $4 na $5",
+       "logentry-rights-rights": "$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} uporabniške pravice {{GENDER:$6|uporabnika|uporabnice}} $3 z $4 na $5",
        "logentry-rights-rights-legacy": "$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} uporabniške pravice uporabnika $3",
        "logentry-rights-autopromote": "$1 je {{GENDER:$2|bil samodejno povišan|bila samodejno povišana|bil(-a) samodejno povišan(-a)}} z $4 na $5",
        "logentry-upload-upload": "$1 je {{GENDER:$2|naložil|naložila|naložil(-a)}} $3",
index 49d865a..3d08fa1 100644 (file)
        "logentry-protect-protect-cascade": "$1 је {{GENDER:$2|заштитио|заштитила}} $3 $4 [преносива заштита]",
        "logentry-protect-modify": "$1 је {{GENDER:$2|променио|променила}} степен заштите за $3 $4",
        "logentry-protect-modify-cascade": "$1 је {{GENDER:$2|променио|променила}} степен заштите за $3 $4 [преносива заштита]",
-       "logentry-rights-rights": "$1 је {{GENDER:$2|променио|променила}} чланство групе за {{GENDER:$3|$3}} из $4 у $5",
+       "logentry-rights-rights": "$1 је {{GENDER:$2|променио|променила}} чланство групе за {{GENDER:$6|$3}} из $4 у $5",
        "logentry-rights-rights-legacy": "$1 је {{GENDER:$2|променио|променила}} чланство групе за $3",
        "logentry-rights-autopromote": "$1 је аутоматски {{GENDER:$2|унапређен|унапређена}} из $4 у $5",
        "logentry-upload-upload": "$1 је {{GENDER:$2|послао|послала}} $3",
index aa2c828..696e8f4 100644 (file)
        "logentry-protect-protect-cascade": "$1 je {{GENDER:$2|zaštitio|zaštitila}} $3 $4 [prenosiva zaštita]",
        "logentry-protect-modify": "$1 je {{GENDER:$2|promenio|promenila}} stepen zaštite za $3 $4",
        "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:$3|$3}} iz $4 u $5",
+       "logentry-rights-rights": "$1 je {{GENDER:$2|promenio|promenila}} članstvo grupe za {{GENDER:$6|$3}} iz $4 u $5",
        "logentry-rights-rights-legacy": "$1 je {{GENDER:$2|promenio|promenila}} čalnstvo grupe za $3",
        "logentry-rights-autopromote": "$1 je automatski {{GENDER:$1|unapređen|unapređena}} iz $4 u $5",
        "logentry-upload-upload": "$1 je {{GENDER:$2|poslao|poslala}} $3",
index 48b4500..56419fa 100644 (file)
@@ -87,6 +87,7 @@
        "tog-watchdefault": "Lägg till sidor och filer jag redigerar i min bevakningslista",
        "tog-watchmoves": "Lägg till sidor och filer jag flyttar i min bevakningslista",
        "tog-watchdeletion": "Lägg till sidor och filer jag raderar i min bevakningslista",
+       "tog-watchuploads": "Lägg till nya filer jag laddar upp i min bevakningslista",
        "tog-watchrollback": "Lägg till sidor där jag har utfört en tillbakarullning till min bevakningslista",
        "tog-minordefault": "Markera automatiskt ändringar som mindre",
        "tog-previewontop": "Visa förhandsgranskningen ovanför redigeringsrutan",
        "recentchangeslinked-page": "Sidnamn:",
        "recentchangeslinked-to": "Visa ändringar på sidor med länkar till den givna sidan istället",
        "recentchanges-page-added-to-category": "[[:$1]] lades till i kategorin",
-       "recentchanges-page-added-to-category-bundled": "[[:$1]] och [[Special:WhatLinksHere/$1|{{PLURAL:$2|en sida|$2 sidor}}]] lades till i kategorin",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] lades till i kategorin, [[Special:WhatLinksHere/$1|denna sida inkluderas i andra sidor]]",
        "recentchanges-page-removed-from-category": "[[:$1]] togs bort från kategorin",
-       "recentchanges-page-removed-from-category-bundled": "[[:$1]] och [[Special:WhatLinksHere/$1|{{PLURAL:$2|en sida|$2 sidor}}]] togs bort från kategorin",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] togs bort från kategorin, [[Special:WhatLinksHere/$1|denna sida inkluderas i andra sidor]]",
        "autochange-username": "Automatisk MediaWiki-ändring",
        "upload": "Ladda upp fil",
        "uploadbtn": "Ladda upp fil",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|skyddade}} $3 $4 [kaskaderande]",
        "logentry-protect-modify": "$1 {{GENDER:$2|ändrade}} skyddsnivån för $3 $4",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|ändrade}} skyddsnivån för $3 $4 [kaskaderande]",
-       "logentry-rights-rights": "$1 {{GENDER:$2|ändrade}} gruppmedlemskapet för {{GENDER:$3|$3}} från $4 till $5",
+       "logentry-rights-rights": "$1 {{GENDER:$2|ändrade}} gruppmedlemskapet för {{GENDER:$6|$3}} från $4 till $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|ändrade}} gruppmedlemskapet för $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|befordrades}} automatiskt från $4 till $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|laddade upp}} $3",
        "feedback-bugnew": "Jag kontrollerade. Rapportera ett nytt fel",
        "feedback-bugornote": "Om du har möjlighet att ge en detaljerad teknisk beskrivning av felet kan du lämna en [$1 buggrapport]. \nAnvänd annars formuläret nedan. Din kommentar kommer att läggas till på sidan \"[$3 $2]\", tillsammans med ditt användarnamn.",
        "feedback-cancel": "Avbryt",
-       "feedback-close": "Färdig",
+       "feedback-close": "Fixat",
        "feedback-external-bug-report-button": "Registrera en teknisk uppgift",
        "feedback-dialog-title": "Skicka återkoppling",
        "feedback-dialog-intro": "Du kan använda det enkla formuläret nedan för att skicka in din återkoppling. Din kommentar kommer att läggas till på sidan \"$1\" tillsammans med ditt användarnamn.",
        "log-action-filter-delete-restore": "Återställde sida",
        "log-action-filter-delete-event": "Radering av logg",
        "log-action-filter-delete-revision": "Radering av sidversion",
-       "log-action-filter-move-move": "Flyttning utan att skriva över omdirigeringar",
-       "log-action-filter-move-move_redir": "Flyttning med att skriva över omdirigeringar",
+       "log-action-filter-import-upload": "Importera med XML-uppladdning",
+       "log-action-filter-managetags-create": "Märke skapad",
+       "log-action-filter-managetags-delete": "Märke raderad",
+       "log-action-filter-managetags-activate": "Märke aktiverad",
+       "log-action-filter-managetags-deactivate": "Märke inaktiverad",
+       "log-action-filter-move-move": "Flyttning utan överskrivning av omdirigeringar",
+       "log-action-filter-move-move_redir": "Flyttning med överskrivning av omdirigeringar",
        "log-action-filter-newusers-create": "Skapade av anonyma användare",
        "log-action-filter-newusers-create2": "Skapade av registrerade användare",
        "log-action-filter-newusers-autocreate": "Skapades automatiskt",
index ddb6571..01370ca 100644 (file)
        "sessionprovider-mediawiki-session-cookiesessionprovider": "குக்கீயை அடிபடையாக்கக் கொண்ட பகுதிகள்",
        "sessionprovider-nocookies": "குக்கீசு செயலற்று இருக்கலாம். உங்களது குக்கீசு செயலில் உள்ளது என உறுதிப்படுத்திவிட்டு மீண்டும் முயல்க.",
        "randomrootpage": "தற்போக்கு வேர்ப் பக்கம்",
-       "log-action-filter-protect": "பாதுகாப்பு வகை"
+       "log-action-filter-protect": "பாதுகாப்பு வகை:"
 }
index 11736b1..60e4246 100644 (file)
@@ -8,7 +8,8 @@
                        "Vishwanatha Badikana",
                        "Bharathesha Alasandemajalu",
                        "Soundarya shetty s",
-                       "రహ్మానుద్దీన్"
+                       "రహ్మానుద్దీన్",
+                       "BHARATHESHA ALASANDEMAJALU"
                ]
        },
        "tog-underline": "ಲಿಂಕ್’ಲೆದ ತಿರ್ತ್ ಗೆರೆ(ಅಂಡರ್ ಲೈನ್) ಪಾಡ್’ಲೆ",
@@ -26,6 +27,7 @@
        "tog-watchdefault": "ಯಾನ್ ಸಂಪೊಲಿಪುನ ಪುಟೊಲೆನ್ ವೀಕ್ಷಣಾಪಟ್ಟಿಗ್ ಸೇರ್ಪಾಲೆ",
        "tog-watchmoves": "ಯಾನ್ ಸ್ತಲಾಂತರಿಸುನ ಪುಟೊಲೆನ್ ಎನ್ನ ವೀಕ್ಷಣಾಪಟ್ಟಿಗ್ ಸೇರ್ಪಾಲೆ",
        "tog-watchdeletion": "ಯಾನ್ ದೆತ್ತ್‌ ಪಾಡುನ ಪುಟೊಲೆನ್ ಎನ್ನ ವೀಕ್ಷಣಾಪಟ್ಟಿಗ್ ಸೇರ್ಪಾಲೆ",
+       "tog-watchuploads": "ಎನ್ನ ಅಪ್ಲೋಡ್ ಪಟ್ಟಿಗ್  ಪೊಸ ಕಡತೊಲೆನ್ ಸೇರಲ",
        "tog-watchrollback": "ಯಾನ್ ಪಿರ ದೆತೊನುನ ಪುಟೊಲೆನ್ ಎನ್ನ ಗುಮನೊಗು ಸೇರಲೆ",
        "tog-minordefault": "ಪೂರಾ ಸಂಪಾದನೆನ್ಲಾ ಎಲ್ಯ ಪಂಡ್’ದ್ ಗುರ್ತ ಮಲ್ಪುಲೆ",
        "tog-previewontop": "ಮುನ್ನೋಟನ್ ಸಂಪಾದನೆ ಅಂಕಣದ ಮಿತ್ತ್ ತೊಜ್ಪಾಲೆ",
        "october-date": "ಅಕ್ಟೋಬರ $1",
        "november-date": "ನವಂಬರ $1",
        "december-date": "ದಸಂಬರ $1",
+       "period-am": "ಕಾಂಡೆ",
+       "period-pm": "ಬೈಯ್ಯ",
        "pagecategories": "{{PLURAL:$1|ವರ್ಗೊ|ವರ್ಗೊಲು}}",
        "category_header": "\"$1\" ವರ್ಗಡುಪ್ಪುನಂಚಿನ ಲೇಕನೊಲು",
        "subcategories": "ಉಪ ವರ್ಗೊಲು",
        "morenotlisted": "ಈ ಪಟ್ಟಿ ಪೂರ್ತಿ ಆತ್‍ಜಿ.",
        "mypage": "ಎನ್ನ ಪುಟೊ",
        "mytalk": "ಎನ್ನ ಚರ್ಚೆ",
-       "anontalk": "à²\88 à²\90.ಪಿ à²\97à³\8d à²ªà²¾à²¤à³\86ರà³\8dâ\80\99ಲೆ",
+       "anontalk": "ಪಾತà³\86ರà³\8dಲೆ",
        "navigation": "ಸಂಚಾರೊ",
        "and": "&#32;ಬೊಕ್ಕ",
        "qbfind": "ನಾಡ್’ಲೆ",
        "viewyourtext": "ಈರ್ ಈ ಪುಟೊದ ಮೂಲನ್ ತೂವೊಲಿ ಬೊಕ್ಕ ನಕಲ್ ಮಲ್ಪೊಲಿ <strong>ಈರೆನ ಸಂಪದನೆ</strong>",
        "protectedinterface": "ಈ ಪುಟೊ ತಂತ್ರಾಂಸೊ ಉಪಯೋಗೊ ಮಲ್ಪುನ ಪಟ್ಯೊನ್ ಒದಗಿಸಾಪುಂಡ್. ದುರುಪಯೋಗ ಅವಂದಿಲೆಕ್ಕ ಇದೆನ್ ರಕ್ಷಣೆ ಮಲ್ಪುಲೆ.\nಮಾತ ವಿಕಿಲೆಗ್ ಬಾಸಾಂತರೊನು ಕೂಡಯೆರೆ ಅಂಚನೆ ಬದಲ್ಪೆರೆ, [//translatewiki.net/ translatewiki.net], the MediaWiki localisation ಯೋಜನೆನ್ ಉಪಯೊಗಿಸಲೆ\nಕನ್ನಡ",
        "ns-specialprotected": "ವಿಶೇಷ ಪುಟ‘ಕ್‘ಲೆನ್ ಸಂಪಾದನೆ ಮಲ್ಪರೆ ಆಪುಜಿ",
+       "exception-nologin": "ಲಾಗಿನ್ ಆತ್‘ಜ್ಜರ್",
        "logouttext": "<strong>ಈರ್ ಇತ್ತೆ ಲಾಗ್ ಔಟ್ ಆತರ್</strong>\nಗಮನಿಸಲೆ ಈರೆನ ಬ್ರೌಸರ್‍ದ cacheನ್ ದೆತ್ತ ಪಾಡುನೆಟ ಮುಟ್ಟೊ ಕೆಲವು ಪುಟೊಲು ಈರ್ ನಾನಲ ಲಾಗ್ ಇನ್ ಆದಿಪ್ಪುಂಚ ತೋಜುಂಡು.",
        "welcomeuser": "ಎದ್ಖೊನುವೊ,$1!",
        "welcomecreation-msg": "ಈರೆನ ಕಾತೆನ್ ದೆತ್ತ್‌ದಾತ್ಂಡ್.  ಈರೆನ [[Special:Preferences|{{SITENAME}} ಆಯ್ಕೆನ್]]ಬದಲ್ಪೆರೆ ಮರಪೊಡ್ಚಿ.",
        "remembermypassword": "ಈ ಗಣಕಯಂತ್ರೊಡು ಎನ್ನ ಲಾಗಿನ್ ನೆಂಪು ದೀಡೊನ್ಲೆ(ಹೆಚ್ಚ್ $1 {{PLURAL:$1|ದಿನೊತ|ದಿನೊಕ್ಕುಲೆ}}ಮುಟ್ಟೊ)",
        "userlogin-remembermypassword": "ಎನನ್ ಲಾಗಿನ್ ಆತೇ ದೀಡ್ಲೆ",
        "userlogin-signwithsecure": "ರಕ್ಷಣೆದ ಕನೆಕ್ಷನ್ ಉಪಯೋಗಿಸಲೆ.",
+       "cannotloginnow-title": "ಇತ್ತೆ ಉಲಾಯಿ ಪೋಯರ್ ಸಾದ್ಯೊ ಇದ್ದಿ",
        "yourdomainname": "ಈರೆನ ಕಾರ್ಯಕ್ಷೇತ್ರ",
        "password-change-forbidden": "ಈರ್ ಈ ವಿಕಿಡ್ ಪ್ರರವೇಸ ಪದೊನು ಬದಲ್ಪೆರೆ ಸಾದ್ಯೊ ಇದ್ದಿ.",
        "login": "ಲಾಗಿನ್ ಆಲೆ",
        "createacct-emailoptional": "ಮಿಂಚಂಚೆ ವಿಲಾಸೊ(ಐಚ್ಛಿಕೊ)",
        "createacct-email-ph": "ಇರೆನ ಮಿಂಚಂಚೆ ವಿಲಾಸೊನ್ ನಮೂದಿಸಲೆ.",
        "createacct-another-email-ph": "ಇ-ಅಂಚೆ ವಿಳಾಸೊನು ಬದಲಾವಣೆ ಮಲ್ಪುಲೆ",
-       "createaccountmail": "ಇ ಮೈಲ್ ಮೂಲಕ",
+       "createaccountmail": "(ರಾಂಡಮ್) ತಾತ್ಕಾಲಿಕವಾದ್ ಯಾದೃಚ್ಛಿಕ ಪಾಸ್ವರ್ಡ್ ಆಯ್ಕೆ ಮಾಲ್ಪುಲೆ ಬುಕ್ಕೊ ಇಮೇಲ್ ವಿಳಾಸೊನು ಸೂಚಿಸದ್ : ಕಡಪುಡುಲೆ",
        "createacct-realname": "ನಿಜವಾಯಿನ ಪುದರ್(ಐಚ್ಛಿಕೊ)",
        "createaccountreason": "ಕಾರಣ",
        "createacct-reason": "ಕಾರಣೊ",
        "nocookieslogin": "{{SITENAME}} ಲಾಗ್ ಇನ್ ಮಲ್ಪರ ಕುಕೀಸ್ ಉಪಯೋಗ ಮಲ್ಪುಂಡ್.\nಈರೆನ ಗಣಕಯಂತ್ರಡು ಕುಕೀಸ್ ನಿಷಿದ್ದ ವಾತ್ಂಡ್.\nದಯದೀದ್ ಈ ನಿಷಿದ್ಧನ್ ದೆತ್ತ್‘ದ್, ಕುಡೊರ ಪ್ರಯತ್ನ ಮಲ್ಪುಲೆ.",
        "nocookiesfornew": "ಮೂಲನ್  ನಿರ್ಧರಿಸಾವರ ಆವೊಂದಿಜ್ಜಿ  ಐಡ್‘ದಾವರ  ಈರೆನ ಖಾತೆ ಸೃಷ್ಟಿ ಆತ್‘ಜ್ಜಿ.  .\nದಯದೀದ್ ಕುಕೀಸ್ ನಿಷಿದ್ಧನ್ ದೆತ್ತ್‘ದ್, ಈ ಪುಟನ್ ಪಿರ ದಿಂಜಾದ್ (load)ಪ್ರಯತ್ನಿಸಾಲೆ.",
        "noname": "ಈರ್ ಸರಿಯಾಯಿನ ಬಳಕೆದಾರ ಪುದರ್ ಕೊರ್ತಿಜ್ಜರ್.",
-       "loginsuccesstitle": "ಲಾಗ್ ಇನ್ ಯಶಸ್ವಿಯಾತ್ಂಡ್",
+       "loginsuccesstitle": "ಲಾಗ್ ಇನ್ ಯಶಸ್ವಿಯಾತ್ಂಡ್",
        "loginsuccess": "ಲಾಗ್ ಇನ್ ಯಶಸ್ವಿಯಾತ್‘ಂಡ್\". {{SITENAME}}  \"$1\".'''",
        "nosuchuser": "!!\"$1\"ಪುದರ್‘ದ ವಾ ಸದಸ್ಯೆರ್‘ಲಾ ಇಜ್ಜೆರ್, ಅಕ್ಷರ ಸರಿಯಾದ ತೂಲೆ ಅಥವಾ  [[Special:UserLogin/signup|ಪೊಸ ಸದಸ್ಯತ್ವ  ಖಾತೆನ್ ಸೃಷ್ಟಿ ಮಲ್ಪುಲೆ]].",
        "nosuchusershort": "!!\"$1\"ಪುದರ್‘ದ ವಾ ಸದಸ್ಯೆರ್‘ಲಾ ಇಜ್ಜೆರ್, ಅಕ್ಷರ ಸರಿಯಾದ ತೂಲೆ.",
        "mailerror": "ಅಂಚೆ ಕಡಪುಡುನೆಡ್ ದೋಸೊ: $1",
        "noemailprefs": "ಈ ಸೌಲಭ್ಯೊಲ್ ಕೆಲಸ ಮಲ್ಪರೆ ಒಂಜಿ ಇ-ಅಂಚೆ ವಿಳಾಸೊನ್ ನಮೂದು ಮಲ್ಪುಲೆ.",
        "emailconfirmlink": "ಇರೆನ ಇ-ಅಂಚೆ ವಿಳಾಸೊನ್ ದೃಡೀಕರಣ ಮಲ್ಪುಲೆ.",
+       "emaildisabled": "ಈ ಜಾಲತಾಣಡ್‍ದ್ ಮಿಂಚಂಚೆ ಕಡಪುಡರ ಆಪುಜ್ಜಿ",
        "accountcreated": "ಖಾತೆ ಸೃಷ್ಟಿಯಾತ್‘ಂಡ್.",
-       "login-abort-generic": "à²\87ರà³\86ನ à²²à²¾à²\97à³\8d à²\87ನà³\8d à²µà²¿à²«à²² à²µà²¾à²¤à³\8dâ\80\98ಂಡ್",
+       "login-abort-generic": "à²\87ರà³\86ನ à²²à²¾à²\97à³\8d à²\87ನà³\8d à²ªà³\88ಲà³\8d à²\86ತà³\8dಂಡ್",
        "loginlanguagelabel": "ಬಾಸೆ: $1",
        "pt-login": "ಲಾಗ್ ಇನ್",
        "pt-login-button": "ಲಾಗಿನ್ ಆಲೆ",
        "newpassword": "ಪೊಸ ಪ್ರವೇಶಪದ",
        "retypenew": "ಪ್ರವೇಶಪದ ಪಿರ ಟೈಪ್ ಮಲ್ಪುಲೆ",
        "resetpass_submit": "ಪ್ರವೇಶಪದ ನಿಶ್ಚಯ ಮಲ್ತ್‘ದ್ ಲಾಗ್ ಇನ್ ಆಲೆ",
+       "changepassword-success": "ಈರೆನ ಪಾಸ್‍ವರ್ಡ್ ಬದಲಾತ್‍ಂಡ್",
+       "botpasswords": "ಬಾಟ್ ಪಾಸ್‍ವರ್ಡ್",
+       "botpasswords-disabled": "ಬಾಟ್ ಪಾಸ್‍ವರ್ಡ್‍ಲೆನ್ ನಿಸ್ಕ್ರೀಯೊ ಮಲ್ತಾತ್ಂಡ್",
+       "botpasswords-existing": "ಅಸ್ತಿತ್ವೊಡು ಇದ್ಯಾಂದಿನ ಬಾಟ್ ಪಾಸ್‍ವರ್ಡ್",
+       "botpasswords-label-appid": "ಬಾಟ್ ಪುದರ್",
+       "botpasswords-label-create": "ಸ್ರಿಸ್ಟಿಸಲೆ",
+       "botpasswords-label-update": "ಮಿತ್ತ್ ಏರಲೆ",
+       "botpasswords-label-cancel": "ವಜಾ ಮಲ್ಪುಲೆ",
+       "botpasswords-label-delete": "ದೆಪ್ಪುಲೆ",
+       "botpasswords-label-resetpassword": "ಪ್ರವೇಸೊ ಪದೊನ್ ಪಿರ ಸ್ತಾಪನೆ ಮಲ್ಪುಲೆ",
+       "botpasswords-label-grants": "ಅನ್ವಯೊ ಆಪುನ ಅನುದಾನೊ",
+       "botpasswords-label-grants-column": "ಅನುದಾನೊ",
+       "botpasswords-created-title": "ಬಾಟ್ ಪಾಸ್‍ವರ್ಡ್‌ನ್ ಸ್ರಿಸ್ಟಿಸದಾತ್ಂಡ್",
+       "botpasswords-updated-title": "ಬಾಟ್ ಪಾಸ್‍ವರ್ಡ್‌ನ್ ಮಿತ್ತ್ ಏರ್ಪದಾತ್ಂಡ್",
+       "botpasswords-deleted-title": "ಬಾಟ್ ಪಾಸ್‍ವರ್ಡ್‌ ದೆತ್ತ್‌ದಾತ್ಂಡ್",
        "resetpass-submit-loggedin": "ಪ್ರವೇಶಪದೊನ್ ಬದಲಾವಣೆ ಮಲ್ಪುಲೆ",
        "resetpass-submit-cancel": "ವಜಾ ಮಲ್ಪುಲೆ",
        "resetpass-temp-password": "ತಾತ್ಕಾಲಿಕ ಪ್ರವೇಶಪದ:",
        "passwordreset": "ಪ್ರವೇಸೊ ಪದೊನ್ ಪಿರ ಸ್ತಾಪನೆ ಮಲ್ಪುಲೆ",
        "passwordreset-username": "ಸದಸ್ಯೆರ್ನ ಪುದರ್:",
+       "passwordreset-domain": "ಕ್ಷೇತ್ರೊ:",
        "passwordreset-email": "ಇ-ಅಂಚೆ ವಿಳಾಸೊ",
+       "changeemail-newemail": "ಪೊಸ ಇ-ಅಂಚೆ ವಿಳಾಸೊ:",
+       "changeemail-none": "ಒವ್ವುಲಾ ಇಜ್ಜಿ",
        "changeemail-submit": "ಇ-ಅಂಚೆ ವಿಳಾಸ ಬದಲಾವಣೆ ಮಲ್ಪುಲೆ",
+       "resettokens": "ಸಂಕೇತೊಲೆನ್ ಜತೆಸೇರಲೆ",
        "resettokens-tokens": "ಸಂಕೇತೊಲು:",
        "resettokens-token-label": "$1(ಇತ್ತೆದ ಮೌಲ್ಯೊ:$2)",
        "bold_sample": "ದಪ್ಪೊ ಅಕ್ಷರೊ",
        "subject-preview": "ವಿಷಯ/ಮುಖ್ಯಾ೦ಶದ ಮುನ್ನೋಟ:",
        "blockedtitle": "ಈ ಸದಸ್ಯೆರೆನ್ ತಡೆ ಮಲ್ತ್ ದ್೦ಡ್.",
        "blockednoreason": "ವಾ ಕಾರಣೊಲಾ ಕೊರ್ತ್‍ಜಿ",
+       "nosuchsectiontitle": "ಈ ಪುದರ್‍ದ ವಾ ವಿಭಾಗಲಾ ಇಜ್ಜಿ",
+       "loginreqtitle": "ಲಾಗಿನ್ ಆವೊಡು",
        "loginreqlink": "ಲಾಗಿನ್ ಆಲೆ",
        "accmailtitle": "ಪ್ರವೇಶಪದ ಕಡಪುಡ್‘ದುಂಡು",
        "newarticle": "(ಪೊಸತ್)",
        "newarticletext": "ನನಲ ಅಸ್ಥಿತ್ವಡ್ ಉಪ್ಪಂದಿನ ಪುಟೊಗು ಈರ್ ಬೈದರ್.\nಈ ಪುಟೊನು ಸ್ರಿಸ್ಟಿ ಮಲ್ಪೆರೆ ತಿರ್ತ್‍ದ ಚೌಕೊಡು ಬರೆಯೆರೆ ಸುರು ಮಲ್ಪುಲೆ.\n(ಜಾಸ್ತಿ ಮಾಹಿತಿಗ್ [$1 ಸಹಾಯ ಪುಟೊನು] ತೂಲೆ).\nಈ ಪುಟೊಕು ಈರ್ ತಪ್ಪಾದ್ ಬತ್ತಿತ್ತ್ಂಡ ಇರೆನ ಬ್ರೌಸರ್‍ದ '''back''' ಬಟನ್’ನ್ ಒತ್ತ್’ಲೆ.",
-       "noarticletext": "à²\88 à²ªà³\81à²\9fà³\8aಡà³\8d à²¸à²¦à³\8dಯà²\97à³\8d à²\92ವà³\8dವà³\87 à²¬à²°à²µà³\81ಲಾ à²\87ದà³\8dದಿ, à²\88ರà³\8d à²¬à³\87ತà³\86 à²ªà³\81à²\9fà³\8aಡà³\8d [[Special:Search/{{PAGENAME}}|à²\88 à²²à³\87à²\95ನà³\8aನà³\81 à²¨à²¾à²¡à³\8aಲಿ]] <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} à²¸à²\82ಬà²\82ದà³\8a à²\87ತà³\8dತಿನ à²¦à²¾à²\95ಲà³\86ನà³\8d à²¨à²¾à²¡à³\8dâ\80\8dಲà³\86], à²\85ತà³\8dತà³\8dಂಡ  [{{fullurl:{{FULLPAGENAME}}|action=edit}} ಈ ಪುಟೊನು ಸಂಪೊಲಿಪೊಲಿ]</span>.",
+       "noarticletext": "à²\88 à²ªà³\81à²\9fà³\8aಡà³\8d à²¸à²¦à³\8dಯà²\97à³\8d à²\92ವà³\8dವà³\87 à²¬à²°à²µà³\81ಲಾ à²\87à²\9cà³\8dà²\9cಿ, à²\88ರà³\8d à²¬à³\87ತà³\86 à²ªà³\81à²\9fà³\8aಡà³\8d [[Special:Search/{{PAGENAME}}|à²\88 à²²à³\87à²\95ನà³\8aನà³\81 à²¨à²¾à²¡à³\8aಲಿ]] <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} à²¸à²\82ಬà²\82ದà³\8a à²\87ತà³\8dತಿನ à²¦à²¾à²\95ಲà³\86ನà³\8d à²¨à²¾à²¡à³\8dâ\80\8dಲà³\86], à²\85ತà³\8dತಾಂಡ  [{{fullurl:{{FULLPAGENAME}}|action=edit}} ಈ ಪುಟೊನು ಸಂಪೊಲಿಪೊಲಿ]</span>.",
        "noarticletext-nopermission": "ಈ ಪುಟೊಡ್ ಸದ್ಯಗ್ ಒವ್ವೇ ಬರವುಲಾ ಇಜ್ಜಿ, ಈರ್ ಬೇತೆ ಪುಟೊಡ್ [[Special:Search/{{PAGENAME}}|ಈ ಲೇಕನೊನು ನಾಡೊಲಿ]] <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ಸಂಬಂದೊ ಇತ್ತ್‌ನ ಲಾಗ್‌ನ್ ನಾಡ್‍ಲೆ], ಅತ್ತ್ಂಡ  [{{fullurl:{{FULLPAGENAME}}|action=edit}} ಈ ಪುಟೊನು ಸಂಪೊಲಿಪೊಲಿ]</span>.",
        "userpage-userdoesnotexist": "ಬಳಕೆದಾರ ಖಾತೆ \"<nowiki>$1</nowiki>\" ದಾಖಲಾತ್‘ಜ್ಜಿ. ಈರ್ ಉಂದುವೇ ಪುಟನ್ ಸಂಪಾದನೆ ಮಲ್ಪರ ಉಂಡಾಂದ್ ಖಾತ್ರಿ ಮಲ್ತೊನಿ.",
        "previewnote": "'''ಉಂದು ಕೇವಲ ಮುನ್ನೋಟ; ಪುಟೊನು ನನಲ ಒರಿಪಾದಿಜಿ ಪನ್ಪುನೇನ್ ಮರಪೊರ್ಚಿ!'''",
        "exif-orientation-1": "ಸಾದಾರನೊ",
        "namespacesall": "ಮಾತ",
        "monthsall": "ಮಾತ",
+       "watchlistedit-clear-title": "ತುಯಿನೇನ್ ಮಾಜಾಲೇ",
        "watchlisttools-view": "ಪ್ರಸ್ತುತ ಬದಲಾವಣೆಲ್ ತೋಜಾಲೆ",
        "watchlisttools-edit": "ವೀಕ್ಷಣಾಪಟ್ಟಿನ್ ತೂಲೆ ಬೊಕ್ಕ ಎಡಿಟ್ ಮಲ್ಪುಲೆ",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ಪಾತೆರ್ಲೆ]])",
index 9bc092e..e29e5e5 100644 (file)
        "prefs-help-signature": "Tartışma sayfalarındaki yorumlar \"<nowiki>~~~~</nowiki>\" ile imzalanmalıdır, bu imzanıza ve zaman damgasına dönüştürülür.",
        "badsig": "Geçersiz ham imza; HTML etiketlerini kontrol edin.",
        "badsiglength": "İmzanız çok uzun.\n$1 {{PLURAL:$1|karakterin|karakterin}} altında olmalı.",
-       "yourgender": "Cinsel kimlik?",
+       "yourgender": "Cinsiyet?",
        "gender-unknown": "Açıklamak istemiyorum",
        "gender-male": "Erkek",
        "gender-female": "Kadın",
        "rcshowhidemine": "Benim değişikliklerimi $1",
        "rcshowhidemine-show": "göster",
        "rcshowhidemine-hide": "gizle",
-       "rcshowhidecategorization": "$1 sayfa kategorizasyonu",
+       "rcshowhidecategorization": "sayfa kategorizasyonunu $1",
        "rcshowhidecategorization-show": "Göster",
        "rcshowhidecategorization-hide": "Gizle",
        "rclinks": "Son $2 günde yapılan son $1 değişikliği göster;<br /> $3",
index 3bf57f7..96f7c0b 100644 (file)
        "badretype": "Кертелгән серсүзләр бер үк түгел.",
        "userexists": "Кертелгән исем кулланыла.\nЗинһар, башка исем сайлагыз.",
        "loginerror": "Керү хатасы",
+       "createacct-error": "Хисап язмазын булдыруда хата китте",
        "createaccounterror": "Хисап язмасын төзеп булмый: $1",
        "nocookiesnew": "Кулланучы теркәлгән, ләкин үз хисап язмасы белән кермәгән. {{SITENAME}} кулланучыны тану өчен «cookies» куллана. Сездә «cookies» тыелган. Зинһар, башта аларны рөхсәт итегез, аннан исем һәм серсүз белән керегез.",
        "nocookieslogin": "{{SITENAME}} кулланучыны тану өчен «cookies» куллана. Сез аларны сүндергәнсез. Зинһар, аларны кабызып, яңадан керегез.",
        "botpasswords-label-restrictions": "Куллану чикләүләре:",
        "botpasswords-label-grants-column": "Рөхсәт",
        "botpasswords-bad-appid": "Атамасы «$1» булган бот исеме ярамый.",
+       "botpasswords-created-title": "Бот серсүзе булдырылды",
        "resetpass_forbidden": "Серсүз үзгәртелә алмый",
        "resetpass-no-info": "Бу битне карау өчен сез системага үз хисап язмагыз ярдәмендә керергә тиеш.",
        "resetpass-submit-loggedin": "Серсүзне үзгәртү",
index 9e1f36c..a0c8837 100644 (file)
        "confirmemail_body_set": "Хтось (можливо ви) з IP-адреси $1\nназначив цю електронну скриньку для облікового запису „$2“ в проекті {{SITENAME}}.\n\nАби підтвердити, що цей обліковий запис справді належить вам, і дозволити надсилання листів\nз сайту {{SITENAME}}, відкрийте наступне посилання у веб-оглядачі:\n\n$3\n\nЯкщо даний обліковий запис *не* належить вам, перейдіть за наступним посиланням\nі відмініть цим підтвердження електронної адреси:\n\n$5\n\nКод підтвердження дійсний до $4.",
        "confirmemail_invalidated": "Підтвердження адреси електронної пошти скасоване",
        "invalidateemail": "Скасувати підтвердження адреси електронної пошти",
+       "notificationemail_subject_changed": "Електронну адресу, зареєстровану для сайту {{SITENAME}}, було змінено",
+       "notificationemail_subject_removed": "Електронну адресу, зареєстровану для сайту {{SITENAME}}, було вилучено",
+       "notificationemail_body_changed": "Хтось, ймовірно Ви, з IP-адреси $1,\nзмінив електронну адресу облікового запису «$2» на «$3» на сайті {{SITENAME}}.\n\nЯкщо це були не Ви, негайно зв'яжіться з адміністратором сайту.",
+       "notificationemail_body_removed": "Хтось, ймовірно Ви, з IP-адреси $1,\nвилучив електронну адресу облікового запису «$2» на сайті {{SITENAME}}.\n\nЯкщо це були не Ви, негайно зв'яжіться з адміністратором сайту.",
        "scarytranscludedisabled": "[«Interwiki transcluding» вимкнено]",
        "scarytranscludefailed": "[Помилка звертання до шаблону $1]",
        "scarytranscludefailed-httpstatus": "[Не вдалось завантажити шаблон для $1: HTTP $2]",
        "watchlistedit-raw-done": "Ваш список спостереження збережений.",
        "watchlistedit-raw-added": "{{PLURAL:$1|$1 заголовок був доданий|$1 заголовки були додані|$1 заголовків були додані}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|$1 заголовок був вилучений|$1 заголовки були вилучені|$1 заголовків були вилучені}}:",
-       "watchlistedit-clear-title": "Ð\9eÑ\87иÑ\89еннÑ\8f Ñ\81пиÑ\81кÑ\83 спостереження",
+       "watchlistedit-clear-title": "Ð\9eÑ\87иÑ\81Ñ\82иÑ\82и Ñ\81пиÑ\81ок спостереження",
        "watchlistedit-clear-legend": "Очистити список спостереження",
        "watchlistedit-clear-explain": "Усі сторінки буде вилучено з Вашого списку спостереження",
        "watchlistedit-clear-titles": "Сторінки:",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|захистив|захистила}} $3 $4 [каскадно]",
        "logentry-protect-modify": "$1 {{GENDER:$2|змінив|змінила}} налаштування захисту $3 $4",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|змінив|змінила}} налаштування захисту $3 $4 [каскадно]",
-       "logentry-rights-rights": "$1 {{GENDER:$2|змінив|змінила}} членство в групах для {{GENDER:$3|$3}} із $4 на $5",
+       "logentry-rights-rights": "$1 {{GENDER:$2|змінив|змінила}} членство в групах для {{GENDER:$6|$3}} із $4 на $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|змінив|змінила}} членство в групах для $3",
        "logentry-rights-autopromote": "$1 було автоматично переведено із $4 в $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|завантажив|завантажила}} $3",
index abceeb0..aae60f7 100644 (file)
        "exif-iimcategory": "زمرہ",
        "exif-orientation-1": "عام",
        "exif-meteringmode-0": "نامعلوم",
+       "exif-dc-contributor": "ترمیم کنندگان",
        "namespacesall": "تمام",
        "monthsall": "تمام",
        "deletedwhileediting": "انتباہ: آپ کے ترمیم شروع کرنے کے بعد یہ صفحہ حذف کیا جا چکا ہے!",
index 28dc0d8..b4e8ba2 100644 (file)
@@ -28,6 +28,7 @@
        "tog-watchdefault": "Igdugang in mga pakli ngan mga paypay nga akon ginliwat ngadto han akon angay timan-an",
        "tog-watchmoves": "Igdugang in mga pakli nga mga paypay nga akon ginpamalhin ngadto han akon angay timan-an",
        "tog-watchdeletion": "Igdugang in mga pakli ngan mga paypay nga akon ginpamara ngadto han akon angay timan-an",
+       "tog-watchuploads": "Dugngi an mga file nga akon gin-upload ha akon watchlist",
        "tog-watchrollback": "Igdugang an mga pakli ha akon watchlist an ak mga gin-rollback",
        "tog-minordefault": "Tigamni an ngatanan nga mga pagliwat nga gudti hin default",
        "tog-previewontop": "Igpakita in prevista o pan-ugsa-nga-lantaw ugsa hiton pagliwat nga kahon",
@@ -45,6 +46,7 @@
        "tog-watchlisthidebots": "Tago-a an ginliwat hin bot tikang han angay timan-an",
        "tog-watchlisthideminor": "Tago-a an mga gagmay nga pagliwat tikang han angay timan-an",
        "tog-watchlisthideliu": "Igatag an mga ginliwat han naka log-in nga mga gumaramit tikang ha gintitiman-an",
+       "tog-watchlistreloadautomatically": "Igreload automatic an akon watchlist kada pagbabag-o han filter (kinahanglan hin JavaScript)",
        "tog-watchlisthideanons": "Igtago an mga ginliwat han mga waray nagpakilala nga nagamit tikang ha gintitiman-an",
        "tog-watchlisthidepatrolled": "Igatag an mga pinatrolya nga mga pagliwat tikang ha angay timan-an",
        "tog-watchlisthidecategorization": "Igtago an kategorisasyon han mga pakli",
        "cachedspecial-refresh-now": "Igkita an pinakaurhi.",
        "categories": "Mga kaarangay",
        "categoriesfrom": "Igpakita in mga kaarangay nga natikang ha:",
-       "special-categories-sort-count": "igtalaan ha pag-ihap",
-       "special-categories-sort-abc": "igtalaan ha abakadahan",
        "deletedcontributions": "Mga ginpara nga mga ámot hin nágámit",
        "deletedcontributions-title": "Ginpara nga mga amot han nagamit",
        "sp-deletedcontributions-contribs": "mga amot",
        "version-entrypoints-header-entrypoint": "Surudlan",
        "version-entrypoints-header-url": "URL",
        "fileduplicatesearch": "Pamiling hin nadoble nga mga paypay",
-       "fileduplicatesearch-legend": "Pamiling hin nadoble",
        "fileduplicatesearch-filename": "Ngaran han paypay:",
        "fileduplicatesearch-submit": "Pamilnga",
        "fileduplicatesearch-noresults": "Waray nabilngan nga paypay nga an ngaran in \"$1\".",
index 87f978b..f8a8300 100644 (file)
        "tog-editondblclick": "双击编辑页面",
        "tog-editsectiononrightclick": "右击段落标题编辑段落",
        "tog-watchcreations": "拿我建个页面搭我传个文件加到我个关注表里去",
-       "tog-watchdefault": "拿我编个页面搭文件加到我个关注表里去",
-       "tog-watchmoves": "畀我移个页搭文件加进我个监控列表里去",
+       "tog-watchdefault": "拿我编辑个页搭文件加进我个关注表里",
+       "tog-watchmoves": "拿我移动个页搭文件加进我个关注表里",
        "tog-watchdeletion": "畀我刪脫個頁搭文件加進我個關注表裏",
+       "tog-watchuploads": "拿我上传个新文件加进我个关注表里",
        "tog-watchrollback": "拿我执行过回退个页面加到我个关注表里去",
        "tog-minordefault": "默认拿所有编辑标记成细编辑",
        "tog-previewontop": "来拉编辑框上头显示预览",
        "cancel": "取消",
        "moredotdotdot": "還多...",
        "morenotlisted": "箇張表還朆完成。",
-       "mypage": "我个页面",
-       "mytalk": "我个讨论",
+       "mypage": "页面",
+       "mytalk": "讲张",
        "anontalk": "讲张",
        "navigation": "导航",
-       "and": "&#32;搭",
+       "and": "搭仔",
        "qbfind": "尋",
        "qbbrowse": "浏览",
        "qbedit": "编辑",
        "qbpageoptions": "箇頁",
-       "qbmyoptions": "我",
+       "qbmyoptions": "我个页面",
        "faq": "FAQ",
        "faqpage": "Project:FAQ",
        "actions": "动作",
        "view-foreign": "登$1上看",
        "edit": "编辑",
        "edit-local": "编辑本地说明",
-       "create": "建",
+       "create": "å\88\9b建",
        "create-local": "添加本地说明",
        "editthispage": "编辑该只页面",
        "create-this-page": "建箇頁",
        "delete": "删除",
        "deletethispage": "刪箇頁",
-       "undeletethispage": "弗删箇页",
-       "undelete_short": "復原消脫個$1個編寫",
-       "viewdeleted_short": "望̺$1个删脱编写",
+       "undeletethispage": "还原箇页",
+       "undelete_short": "还原{{PLURAL:$1|一趟编辑|$1趟编辑}}",
+       "viewdeleted_short": "望{{PLURAL:$1|一只删脱个编辑|$1只删脱个编辑}}",
        "protect": "保",
        "protect_change": "改",
        "protectthispage": "保护该个页面",
        "nocookieslogin": "本站利用Cookies进行用户登录,侬个Cookies像煞关拉许,请开开来再登录。",
        "nocookiesfornew": "用户账号朆建起,我里确认弗了渠个原因。\n你要准定cookies是开勒里个,刷新箇页试试凑相。",
        "noname": "用户名无效。",
-       "loginsuccesstitle": "登录成功",
-       "loginsuccess": "'''侬现在以 \"$1\" 个身份登录到{{SITENAME}}。 '''",
+       "loginsuccesstitle": "登录",
+       "loginsuccess": "<strong>侬现在以“$1”个身份登录到{{SITENAME}}。</strong>",
        "nosuchuser": "寻弗着用户“$1”。用户名是大小写敏感外加区分繁简体个。请检查拼写,或者[[Special:UserLogin/signup|开只新账户]]。",
        "nosuchusershort": "无没叫“$1”个用户。请检查侬个输入。",
        "nouserspecified": "侬必须选个用户名。",
        "newpassword": "新密码:",
        "retypenew": "再打一遍新密码:",
        "resetpass_submit": "设置密码再登录",
-       "changepassword-success": "密碼改好哉!\n能界登錄當中...",
+       "changepassword-success": "侬个密码改好哉!",
        "changepassword-throttled": "侬试登录忒多次哉。等$1再试试看。",
        "botpasswords": "机器人密码",
        "botpasswords-label-appid": "机器人名字:",
        "resetpass-no-info": "侬必须登录著才好直接进入箇只页面。",
        "resetpass-submit-loggedin": "更改密码",
        "resetpass-submit-cancel": "取消",
-       "resetpass-wrong-oldpass": "无效个临时或者现有密码。\n侬ä½\9cå\85´å·²ç»\8fæ\88\90å\8a\9fæ\8b¿å¯\86ç \81æ\94¹è\84±ï¼\8cæ\88\96è\80\85å·²ç»\8f请æ±\82ä¸\80个æ\96°ä¸ªä¸´æ\97¶å¯\86ç \81ã\80\82",
+       "resetpass-wrong-oldpass": "无效个临时或者现有密码。侬ä½\9cå\85´å·²ç»\8fæ\8b¿å¯\86ç \81æ\94¹è\84±ï¼\8cæ\88\96è\80\85请æ±\82ç\9d\80ä¸\80å\8fªæ\96°ä¸ªä¸´æ\97¶å¯\86ç \81ã\80\82",
        "resetpass-recycled": "请重置一只搭侬当前密码弗一样个密码。",
        "resetpass-temp-password": "临时密码:",
        "resetpass-abort-generic": "密码更改已经畀扩展程序中止。",
        "continue-editing": "到编辑区去",
        "previewconflict": "箇个预览显示了上头文字编辑区里向个内容。渠会得垃拉侬保存之后出现。",
        "session_fail_preview": "'''弗好意思!由于会话数据落失,我伲弗好处理侬个编辑。'''请重试。如果再次失败,请尝试[[Special:UserLogout|登出]]之后重新登录。",
-       "session_fail_preview_html": "'''弗好意思!我伲弗好处理侬垃拉进程数据落失辰光个编辑。'''\n\n''由于{{SITENAME}}允许使用原始个 HTML,为著防范 JavaScript 攻击,预览已畀隐藏。''\n\n'''如果这是一次合法的编辑,请重新进行尝试。'''如果还不行,请 [[Special:UserLogout|退出]]并重新登录。",
+       "session_fail_preview_html": "弗好意思!因为会话数据落失,我伲弗好处理侬个编辑。\n\n<em>由于{{SITENAME}}允许使用原始个HTML,为著防范JavaScript攻击,预览已经囥脱。</em>\n\n<strong>如果箇是一趟合法个编辑,请再试一遍。</strong>如果仍旧弗来事,请[[Special:UserLogout|登出]]著再重新登录,并确保侬个浏览器允许本站个cookie。",
        "token_suffix_mismatch": "<strong>由于侬用户端里向个编辑令牌毁损仔一些标点符号字元,为防止编辑个文字损坏,侬个编辑已经畀回头。</strong>箇种情况通常出现垃拉使用含有交关bug、以网络为主个匿名代理服务个辰光。",
        "editing": "来里编写$1",
        "creating": "创建“$1”",
        "viewpagelogs": "望箇页日志",
        "nohistory": "该只页面呒拨编辑历史。",
        "currentrev": "最后版本",
-       "currentrev-asof": "$1个最新修订版",
+       "currentrev-asof": "$1个最新修订版",
        "revisionasof": "垃拉$1所作出个修订版",
        "revision-info": "{{GENDER:$6|$2}}$1个版本$7",
        "previousrevision": "←旧点个版本",
        "revdelete-submit": "应用于拣中个{{PLURAL:$1|修订}}",
        "revdelete-success": "'''修订个可见性已经成功更新。'''",
        "revdelete-failure": "版本个可见性无法更新:$1",
-       "logdelete-success": "'''事件个可见性已经成功设置。'''",
+       "logdelete-success": "日志个可见性设置好哉。",
        "logdelete-failure": "'''事件个可见性无法设置:'''\n$1",
        "revdel-restore": "改变可见性",
        "pagehist": "页面历史",
        "searchprofile-advanced-tooltip": "垃拉自定义名字空间里向搜索",
        "search-result-size": "$1($2个字)",
        "search-result-category-size": "$1个成员($2个儿分类,$3个文件)",
-       "search-redirect": "(转戳到 $1)",
+       "search-redirect": "(重定向 $1)",
        "search-section": "(段落 $1)",
        "search-category": "(分类$1)",
        "search-file-match": "(匹配文件内容)",
        "speciallogtitlelabel": "目标(标题,或针对用户使用{{ns:user}}:用户名):",
        "log": "记录",
        "alllogstext": "所有{{SITENAME}}公开日志个联合展示。侬可以选择日志类型、用户名(区分大小写)或者相关页面(区分大小写)来缩小搜寻范围。",
+       "checkbox-all": "侪选",
+       "checkbox-none": "侪弗选",
        "allpages": "全部页面",
        "nextpage": "下一页($1)",
        "prevpage": "上一页($1)",
index ef1552c..97278ac 100644 (file)
        "noemail": "ס'איז נישט רעקארדירט קיין ע-פאסט אַדרעס פֿאַר באַניצער  \"$1\".",
        "noemailcreate": "איר דאַרפֿט פֿאַרזארגן א גילטיגן ע-פאסט אַדרעס",
        "passwordsent": "א ניי פאסווארט איז געשיקט געווארן צום ע-פאסט אדרעס רעגיסטרירט פאר \"$1\".\nביטע ווידער אריינלאגירן נאך דעם וואס איר באקומט עס.",
-       "blocked-mailpassword": "אייער איי פי אדרעס איז בלאקירט צו רעדאקטירן, דערוועגן זענט איר נישט ערלויבט צו באניצן מיטן פאסווארט ווידעראויפלעבונג פֿונקציע כדי צו פארמיידן סיסטעם קרומבאניץ.",
+       "blocked-mailpassword": "אייער IP-אַדרעס איז בלאָקירט פון רעדאַקטירן. כדי צו פאַרהיטן מיסברויך, ס׳איז ניט דערלויבט צו ניצן די פּאַראָל ווידעראויפשטעלונג פונקציע.",
        "eauthentsent": "א באשטעטיגונג ע-בריוו איז געשיקט געווארן צו דעם באשטימטן ע-פאסט אדרעס. איידער סיי וועלכע אנדערע ע-פאסט וועט ווערן געשיקט צו דער קאנטע, וועט איר דארפן פאלגן די אנווייזונגען אין דער מעלדונג כדי צו זיין זיכער אז די קאנטע איז טאקע אייערס.",
        "throttled-mailpassword": "מ'האט שוין געשיקט א בליצבריוו צוריקצושטעלן דאס פאסווארט, אין {{PLURAL:$1|דער לעצטער שעה|די לעצטע $1 שעה'ן}}. כדי צו פארמײַדן שלעכט באניצן, נאר איין פאסווארט צוריקשטעלן בליצבריוו וועט געשיקט ווערן אין {{PLURAL:$1|א שעה |$1 שעה'ן}}.",
        "mailerror": "פעלער ביים שיקן פּאָסט: $1",
        "recentchangeslinked-page": "בלאַט נאָמען:",
        "recentchangeslinked-to": "צייג ענדערונגען צו בלעטער פארבינדן צו דעם בלאט אנשטאט",
        "recentchanges-page-added-to-category": "[[:$1]] צוגעלייגט צו קאטעגאריע",
-       "recentchanges-page-added-to-category-bundled": "[[:$1]] ×\90×\95×\9f [[Special:WhatLinksHere/$1|{{PLURAL:$2]]|×\90×\99×\99×\9f ×\91×\9c×\90×\98|$2 ×\91×\9c×¢×\98ער}} ×¦×\95×\92×¢×\9c×\99×\99×\92×\98 ×¦×\95 ×§×\90×\98×¢×\92×\90ר×\99×¢",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] ×¦×\95×\92×¢×\9c×\99×\99×\92×\98 ×¦×\95 ×§×\90Ö·×\98×¢×\92×\90ָר×\99×¢, [[Special:WhatLinksHere/$1|×\93ער ×\93×\90Ö¸×\96×\99קער ×\91×\9c×\90Ö·×\98 ×\90×\99×\96 ×\90×\99×\99× ×\92עש×\9c×\90ָס×\9f ×\90×\99×\9f ×\90Ö·× ×\93ערע ×\91×\9c×¢×\98ער]]",
        "recentchanges-page-removed-from-category": "[[:$1]] אראפגענומען פון קאטעגאריע",
-       "recentchanges-page-removed-from-category-bundled": "[[:$1]] און {{PLURAL:$2|איין בלאט|$2 בלעטער}} אראפגענומען פון קאטעגאריע",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] אַראָפּגענומען פון קאַטעגאָריע, [[Special:WhatLinksHere/$1|דער דאָזיקער בלאַט איז איינגעשלאָסן אין אַנדערע בלעטער]]",
        "autochange-username": "מעדיעוויקי אויטאמאטישער טויש",
        "upload": "אַרױפֿלאָדן בילדער/טעקעס",
        "uploadbtn": "אַרױפֿלאָדן טעקע",
        "watchlistedit-raw-done": "אייער אויפֿפאַסונג ליסטע איז געווארן דערהײַנטיקט",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 טיטל איז|$1 טיטלען זענען}} געווען צוגעלייגט:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 טיטל איז|$1 טיטלען זענען}} געווען אַראָפגענומען:",
-       "watchlistedit-clear-title": "×\90פ×\92ער×\90×\9e×\98 ×\93×\99 ×\90×\95×\99פפ×\90ס×\9f ליסטע",
+       "watchlistedit-clear-title": "×\90×\95×\99פר×\90Ö·×\9e×¢×\9f ×\93×\99 ×\90×\95×\99פפּ×\90ַס×\9fÖ¾ליסטע",
        "watchlistedit-clear-legend": "ליידיקן די אויפפאסן ליסטע",
        "watchlistedit-clear-explain": "אלע בלעטער וועט מען אראפנעמען פון אײַער אויפפאסונג־ליסטע",
        "watchlistedit-clear-titles": "טיטלען:",
        "logentry-newusers-create2": "באניצער קאנטע $1 איז {{GENDER:$2|געשאפן געווארן}} דורך $3",
        "logentry-newusers-byemail": "באניצער קאנטע $3 איז {{GENDER:$2|געשאפן געווארן}} דורך $1 און דאס פאסווארט איז געשיקט געווארט דורך ע־פאסט",
        "logentry-newusers-autocreate": "באַניצער קאנטע $1 {{GENDER:$2|געשאפן}} אויטאמאטיש",
-       "logentry-rights-rights": "$1 האט {{GENDER:$2|געביטן}} גרופע מיטגלידערשאַפֿט פֿאַר $3 פֿון $4 אויף $5",
+       "logentry-rights-rights": "$1 האָט {{GENDER:$2|געביטן}} גרופּע מיטגלידערשאַפט פאַר $3 פון $4 אויף $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|האט געביטן}} גרופע מיטגלידערשאפט פאר $3",
        "logentry-rights-autopromote": "$1 אויטאמאטיש  {{GENDER:$2|פראמאווירט}} פון $4 צו $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|האט ארויפגעלאדן}} $3",
index 89972ed..299d974 100644 (file)
        "history-feed-item-nocomment": "$2 $1",
        "history-feed-empty": "所请求的页面不存在。它可能已被删除或重命名。\n尝试[[Special:Search|搜索本站]]获得相关的新建页面。",
        "history-edit-tags": "编辑选定修订版本的标签",
-       "rev-deleted-comment": "(编辑摘要被除)",
+       "rev-deleted-comment": "(编辑摘要被除)",
        "rev-deleted-user": "(用户名被删除)",
        "rev-deleted-event": "(日志详情已移除)",
        "rev-deleted-user-contribs": "[用户名或IP地址被删除 - 编辑在贡献中隐藏]",
        "search-result-size": "$1($2个字)",
        "search-result-category-size": "$1个成员($2个子分类,$3个文件)",
        "search-redirect": "(重定向自“$1”)",
-       "search-section": "(“$1”段落)",
+       "search-section": "(“$1”章节)",
        "search-category": "(分类$1)",
        "search-file-match": "(匹配文件内容)",
        "search-suggest": "您是不是要找:$1",
        "rc_categories": "分类限制(用“|”分隔):",
        "rc_categories_any": "任何选择的",
        "rc-change-size-new": "更改后有$1字节",
-       "newsectionsummary": "/* $1 */ 新段落",
+       "newsectionsummary": "/* $1 */ 新章节",
        "rc-enhanced-expand": "显示细节",
        "rc-enhanced-hide": "隐藏细节",
        "rc-old-title": "最初创建为“$1”",
        "logentry-protect-protect-cascade": "$1{{GENDER:$2|保护了}}$3 $4[级联]",
        "logentry-protect-modify": "$1{{GENDER:$2|更改了}}$3的保护等级$4",
        "logentry-protect-modify-cascade": "$1{{GENDER:$2|更改了}}$3的保护等级$4[级联]",
-       "logentry-rights-rights": "$1已将{{GENDER:$3|$3}}的用户组从$4{{GENDER:$2|更改}}至$5",
+       "logentry-rights-rights": "$1已将{{GENDER:$6|$3}}的用户组从$4{{GENDER:$2|更改}}至$5",
        "logentry-rights-rights-legacy": "$1更改$3的用户组",
        "logentry-rights-autopromote": "$1被自动地{{GENDER:$2|提升}}自$4至$5",
        "logentry-upload-upload": "$1{{GENDER:$2|上传}}$3",
        "log-name-managetags": "标签管理日志",
        "log-description-managetags": "此页面列出有关[[Special:Tags|标签]]的管理任务。该日志仅包含管理员手工进行的操作;wiki软件可能创建或删除标签而未在此日志中留下记录。",
        "logentry-managetags-create": "$1{{GENDER:$2|创建了}}标签“$4”",
-       "logentry-managetags-delete": "$1 {{GENDER:$2|删除了}}“$4”标签(已从$5个{{PLURAL:$5|修订版本和/或日志条目}}中移除)",
+       "logentry-managetags-delete": "$1{{GENDER:$2|删除了}}标签“$4”(已从$5个{{PLURAL:$5|修订版本或日志项|修订版本和/或日志项}}中移除)",
        "logentry-managetags-activate": "$1 {{GENDER:$2|激活了}}“$4”标签供用户和机器人使用",
        "logentry-managetags-deactivate": "$1 {{GENDER:$2|停用了}}“$4”标签供用户和机器人使用",
        "log-name-tag": "标签日志",
index 548b78c..ee04481 100644 (file)
@@ -111,6 +111,7 @@ $specialPageAliases = [
        'Specialpages'              => [ 'Speciální_stránky', 'Specialni_stranky' ],
        'Statistics'                => [ 'Statistika', 'Statistiky' ],
        'Tags'                      => [ 'Značky', 'Znacky' ],
+       'TrackingCategories'        => [ 'Sledovací_kategorie', 'Sledovaci_kategorie' ],
        'Unblock'                   => [ 'Odblokování', 'Odblokovani' ],
        'Uncategorizedcategories'   => [ 'Nekategorizované_kategorie', 'Nekategorizovane_kategorie' ],
        'Uncategorizedimages'       => [ 'Nekategorizované_soubory', 'Nekategorizovane_soubory' ],
index 186feb2..6d9a616 100644 (file)
@@ -51,7 +51,7 @@ TEXT
                );
 
                $this->addOption( 'force', 'Run on all rows, even if the collation is ' .
-                       'supposed to be up-to-date.' );
+                       'supposed to be up-to-date.', false, false, 'f' );
                $this->addOption( 'previous-collation', 'Set the previous value of ' .
                        '$wgCategoryCollation here to speed up this script, especially if your ' .
                        'categorylinks table is large. This will only update rows with that ' .
index 14508b6..62613b8 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.16.6
+ * OOjs UI v0.17.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-04-19T21:57:49Z
+ * Date: 2016-04-26T21:34:01Z
  */
 ( function ( OO ) {
 
index 1a241cb..c928838 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.16.6
+ * OOjs UI v0.17.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-04-19T21:57:53Z
+ * Date: 2016-04-26T21:34:05Z
  */
 .oo-ui-element-hidden {
        display: none !important;
 .oo-ui-optionWidget.oo-ui-widget-enabled {
        cursor: pointer;
 }
+.oo-ui-optionWidget.oo-ui-widget-disabled {
+       cursor: default;
+}
 .oo-ui-optionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
        display: block;
        white-space: nowrap;
index c47ce7f..72e4db8 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.16.6
+ * OOjs UI v0.17.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-04-19T21:57:53Z
+ * Date: 2016-04-26T21:34:05Z
  */
 .oo-ui-element-hidden {
        display: none !important;
 .oo-ui-optionWidget.oo-ui-widget-enabled {
        cursor: pointer;
 }
+.oo-ui-optionWidget.oo-ui-widget-disabled {
+       cursor: default;
+}
 .oo-ui-optionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
        display: block;
        white-space: nowrap;
index 64c6be6..7128e7a 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.16.6
+ * OOjs UI v0.17.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-04-19T21:57:49Z
+ * Date: 2016-04-26T21:34:01Z
  */
 ( function ( OO ) {
 
index 19e8b17..33f1e0f 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.16.6
+ * OOjs UI v0.17.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-04-19T21:57:49Z
+ * Date: 2016-04-26T21:34:01Z
  */
 ( function ( OO ) {
 
index 6fda4be..c4eff7c 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.16.6
+ * OOjs UI v0.17.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-04-19T21:57:53Z
+ * Date: 2016-04-26T21:34:05Z
  */
 .oo-ui-popupTool .oo-ui-popupWidget-popup,
 .oo-ui-popupTool .oo-ui-popupWidget-anchor {
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/apex/images/icons/check.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/apex/images/icons/check.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/apex/images/icons/check.png");
+       background-size: contain;
+       background-position: center center;
+       background-repeat: no-repeat;
 }
 .oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
        background-color: #e1f3ff;
index 6d4bbed..4194cdf 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.16.6
+ * OOjs UI v0.17.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-04-19T21:57:53Z
+ * Date: 2016-04-26T21:34:05Z
  */
 .oo-ui-popupTool .oo-ui-popupWidget-popup,
 .oo-ui-popupTool .oo-ui-popupWidget-anchor {
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/check.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/check.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/check.png");
+       background-size: contain;
+       background-position: center center;
+       background-repeat: no-repeat;
 }
 .oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
        background-color: #eeeeee;
index f0cb8af..2817324 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.16.6
+ * OOjs UI v0.17.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-04-19T21:57:49Z
+ * Date: 2016-04-26T21:34:01Z
  */
 ( function ( OO ) {
 
index 7c575e0..8851558 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.16.6
+ * OOjs UI v0.17.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-04-19T21:57:53Z
+ * Date: 2016-04-26T21:34:05Z
  */
 .oo-ui-draggableElement-handle,
 .oo-ui-draggableElement-handle.oo-ui-widget {
        right: 0;
        text-overflow: ellipsis;
 }
-.oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label > .oo-ui-selectFileWidget-fileName {
-       float: left;
-}
-.oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label > .oo-ui-selectFileWidget-fileType {
+.oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-fileType {
        float: right;
 }
 .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator,
 .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-clearButton {
        position: absolute;
 }
-.oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-clearButton {
+.oo-ui-selectFileWidget .oo-ui-selectFileWidget-clearButton {
        z-index: 2;
 }
 .oo-ui-selectFileWidget-dropTarget {
 .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label {
        position: relative;
 }
-.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label > .oo-ui-selectFileWidget-fileName,
-.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label > .oo-ui-selectFileWidget-fileType {
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-fileName {
+       display: block;
+       padding-right: 2.375em;
+       overflow: hidden;
+       text-overflow: ellipsis;
+}
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-fileType {
        display: block;
        float: none;
 }
        font-size: 1.1em;
        padding: 0.75em;
 }
+.oo-ui-outlineOptionWidget .oo-ui-iconElement-icon {
+       font-size: 90.90909%;
+}
 .oo-ui-outlineOptionWidget.oo-ui-indicatorElement .oo-ui-labelElement-label {
        padding-right: 1.5em;
 }
 .oo-ui-outlineOptionWidget.oo-ui-flaggedElement-important {
        font-weight: bold;
 }
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-placeholder {
-       font-style: italic;
-}
 .oo-ui-outlineOptionWidget.oo-ui-flaggedElement-empty .oo-ui-iconElement-icon {
        opacity: 0.5;
 }
index 7dfbf1b..2cd8473 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.16.6
+ * OOjs UI v0.17.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-04-19T21:57:53Z
+ * Date: 2016-04-26T21:34:05Z
  */
 .oo-ui-draggableElement-handle,
 .oo-ui-draggableElement-handle.oo-ui-widget {
        right: 0;
        text-overflow: ellipsis;
 }
-.oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label > .oo-ui-selectFileWidget-fileName {
-       float: left;
-}
-.oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label > .oo-ui-selectFileWidget-fileType {
+.oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-fileType {
        float: right;
 }
 .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator,
 .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-clearButton {
        position: absolute;
 }
-.oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-clearButton {
+.oo-ui-selectFileWidget .oo-ui-selectFileWidget-clearButton {
        z-index: 2;
 }
 .oo-ui-selectFileWidget-dropTarget {
 .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label {
        position: relative;
 }
-.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label > .oo-ui-selectFileWidget-fileName,
-.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label > .oo-ui-selectFileWidget-fileType {
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-fileName {
+       display: block;
+       padding-right: 2.375em;
+       overflow: hidden;
+       text-overflow: ellipsis;
+}
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-fileType {
        display: block;
        float: none;
 }
        margin-left: 0.5em;
 }
 .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label {
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+       display: block;
        line-height: 2.3em;
        margin: 0;
        overflow: hidden;
        white-space: nowrap;
-       -webkit-box-sizing: border-box;
-          -moz-box-sizing: border-box;
-               box-sizing: border-box;
        text-overflow: ellipsis;
-       left: 0.5em;
-       right: 0.5em;
+       left: 0;
+       right: 0;
+       padding-left: 0.5em;
 }
 .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label > .oo-ui-selectFileWidget-fileType {
        color: #888888;
        height: 2.3em;
 }
 .oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-info {
+       background-color: #f3f3f3;
        color: #cccccc;
        text-shadow: 0 1px 1px #ffffff;
        border-color: #dddddd;
-       background-color: #f3f3f3;
+       cursor: default;
 }
 .oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon,
 .oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator {
 }
 .oo-ui-selectFileWidget.oo-ui-indicatorElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
        right: 4.4625em;
+       padding-left: 0;
 }
 .oo-ui-selectFileWidget.oo-ui-indicatorElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-clearButton {
        right: 2.0875em;
 .oo-ui-selectFileWidget-empty.oo-ui-indicatorElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label,
 .oo-ui-selectFileWidget-notsupported.oo-ui-indicatorElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
        right: 2em;
+       padding-left: 0;
 }
 .oo-ui-selectFileWidget-supported.oo-ui-widget-enabled.oo-ui-selectFileWidget-canDrop .oo-ui-selectFileWidget-dropTarget {
        background-color: #ebf2ff;
        font-size: 1.1em;
        padding: 0.75em;
 }
+.oo-ui-outlineOptionWidget .oo-ui-iconElement-icon {
+       font-size: 90.90909%;
+}
 .oo-ui-outlineOptionWidget.oo-ui-indicatorElement .oo-ui-labelElement-label {
        padding-right: 1.5em;
 }
 .oo-ui-outlineOptionWidget.oo-ui-flaggedElement-important {
        font-weight: bold;
 }
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-placeholder {
-       font-style: italic;
-}
 .oo-ui-outlineOptionWidget.oo-ui-flaggedElement-empty .oo-ui-iconElement-icon {
        opacity: 0.5;
 }
index a084d1a..895cea4 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.16.6
+ * OOjs UI v0.17.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-04-19T21:57:49Z
+ * Date: 2016-04-26T21:34:01Z
  */
 ( function ( OO ) {
 
index 1629301..b1a3c3b 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.16.6
+ * OOjs UI v0.17.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-04-19T21:57:53Z
+ * Date: 2016-04-26T21:34:05Z
  */
 .oo-ui-actionWidget.oo-ui-pendingElement-pending {
        background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
index 1e46581..d323fec 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.16.6
+ * OOjs UI v0.17.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-04-19T21:57:53Z
+ * Date: 2016-04-26T21:34:05Z
  */
 .oo-ui-window {
        background: transparent;
index aa8f8d9..7f33fad 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.16.6
+ * OOjs UI v0.17.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-04-19T21:57:49Z
+ * Date: 2016-04-26T21:34:01Z
  */
 ( function ( OO ) {
 
index e1ad562..703911b 100644 (file)
@@ -2,6 +2,7 @@
        "prefix": "oo-ui-icon",
        "intro": "@import '../../../../src/styles/common';",
        "images": {
+               "fullScreen": { "file": "images/icons/fullScreen.svg" },
                "image": { "file": "images/icons/image.svg" },
                "imageGallery": { "file": {
                        "ltr": "images/icons/imageGallery-ltr.svg",
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/fullScreen.png b/resources/lib/oojs-ui/themes/apex/images/icons/fullScreen.png
new file mode 100644 (file)
index 0000000..ced1035
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/fullScreen.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/fullScreen.svg b/resources/lib/oojs-ui/themes/apex/images/icons/fullScreen.svg
new file mode 100644 (file)
index 0000000..06b709b
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24">
+    <path id="arrow" d="M6 6v4l1.28-1.28 2 2 1.423-1.44-2-2L10 6z"/>
+    <use transform="rotate(90 12 12)" xlink:href="#arrow"/>
+    <use transform="rotate(180 12 12)" xlink:href="#arrow"/>
+    <use transform="rotate(-90 12 12)" xlink:href="#arrow"/>
+</svg>
index 809bc6a..56da53c 100644 (file)
@@ -9,6 +9,7 @@
                }
        },
        "images": {
+               "fullScreen": { "file": "images/icons/fullScreen.svg" },
                "image": { "file": {
                        "ltr": "images/icons/image-ltr.svg",
                        "rtl": "images/icons/image-rtl.svg"
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/fullScreen-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/fullScreen-invert.png
new file mode 100644 (file)
index 0000000..b7a3cb5
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/fullScreen-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/fullScreen-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/fullScreen-invert.svg
new file mode 100644 (file)
index 0000000..e7aec3d
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #ffffff }</style>
+    <path id="arrow" d="M6 6v4l1.28-1.28 2 2 1.423-1.44-2-2L10 6z"/>
+    <use transform="rotate(90 12 12)" xlink:href="#arrow"/>
+    <use transform="rotate(180 12 12)" xlink:href="#arrow"/>
+    <use transform="rotate(-90 12 12)" xlink:href="#arrow"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/fullScreen.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/fullScreen.png
new file mode 100644 (file)
index 0000000..ced1035
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/fullScreen.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/fullScreen.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/fullScreen.svg
new file mode 100644 (file)
index 0000000..06b709b
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24">
+    <path id="arrow" d="M6 6v4l1.28-1.28 2 2 1.423-1.44-2-2L10 6z"/>
+    <use transform="rotate(90 12 12)" xlink:href="#arrow"/>
+    <use transform="rotate(180 12 12)" xlink:href="#arrow"/>
+    <use transform="rotate(-90 12 12)" xlink:href="#arrow"/>
+</svg>
index 3e6ee56..975ec2a 100644 (file)
@@ -1,13 +1,11 @@
 /**
- * MediaWiki Print style sheet for CSS2-capable browsers.
- * Copyright Gabriel Wicke, http://www.aulinx.de/
+ * MediaWiki print style sheet
+ * Largely based on work by Gabriel Wicke
  *
- * Derived from the plone (http://plone.org/) styles
+ * Originally derived from Plone (https://plone.org/) styles
  * Copyright Alexander Limi
  */
 
-/* Thanks to A List Apart (http://alistapart.com/) for useful extras */
-
 /**
  * Hide all the elements irrelevant for printing
  */
@@ -18,73 +16,83 @@ div.top,
 div#column-one,
 .mw-editsection,
 .mw-editsection-like,
-div#f-poweredbyico,
-div#f-copyrightico,
-li#about,
-li#disclaimer,
-li#mobileview,
-li#privacy,
 #footer-places,
 .mw-hidden-catlinks,
 .usermessage,
 .patrollink,
 .ns-0 .mw-redirectedfrom,
+div.magnify,
 #mw-navigation,
-#siteNotice {
+#siteNotice,
+/* Deprecated, changed in core */
+div#f-poweredbyico,
+div#f-copyrightico,
+li#about,
+li#disclaimer,
+li#mobileview,
+li#privacy {
        display: none;
 }
 
-/**
- * Pagination
- */
-.wikitable, .thumb, img {
-       page-break-inside: avoid;
-}
-
-h2, h3, h4, h5, h6 {
-       page-break-after: avoid;
-}
-
-p {
-       widows: 3;
-       orphans: 3;
-}
-
 /**
  * Generic HTML elements
  */
 body {
-       background: white;
-       color: black;
+       background: #fff;
+       color: #000;
        margin: 0;
        padding: 0;
 }
 
-ul {
-       list-style-type: square;
-}
-
-h1, h2, h3, h4, h5, h6 {
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
        font-weight: bold;
+       /* Pagination */
+       page-break-after: avoid;
 }
 
 dt {
        font-weight: bold;
 }
 
+ul {
+       list-style-type: square;
+}
+
 p {
        margin: 1em 0;
        line-height: 1.2em;
+       /* Pagination */
+       orphans: 3;
+       widows: 3;
 }
 
-pre, .mw-code {
-       border: 1pt dashed black;
-       white-space: pre;
+pre,
+.mw-code {
+       background: #fff;
+       color: #000;
+       border: 1pt dashed #000;
+       padding: 1em 0;
        font-size: 8pt;
+       white-space: pre;
+       word-wrap: break-word;
        overflow: auto;
-       padding: 1em 0;
-       background: white;
-       color: black;
+}
+
+img,
+.wikitable,
+.thumb {
+       /* Pagination */
+       page-break-inside: avoid;
+}
+
+img {
+       border: 0;
+       vertical-align: middle;
 }
 
 /**
@@ -96,12 +104,12 @@ pre, .mw-code {
 }
 
 .mw-body {
-       background: white;
-       border: none !important;
+       background: #fff;
+       color: #000;
+       border: 0 !important;
        padding: 0 !important;
        margin: 0 !important;
        direction: ltr;
-       color: black;
 }
 
 #column-content {
@@ -114,8 +122,8 @@ pre, .mw-code {
 }
 
 #toc {
-       border: 1px solid #aaaaaa;
        background-color: #f9f9f9;
+       border: 1pt solid #aaa;
        padding: 5px;
        display: table;
 }
@@ -145,18 +153,13 @@ pre, .mw-code {
 }
 
 #footer {
-       background: white;
-       color: black;
+       background: #fff;
+       color: #000;
        margin-top: 1em;
-       border-top: 1px solid #AAA;
+       border-top: 1pt solid #aaa;
        direction: ltr;
 }
 
-img {
-       border: none;
-       vertical-align: middle;
-}
-
 /**
  * Links
  */
@@ -168,13 +171,14 @@ a {
 /* Expand URLs for printing */
 .mw-body a.external.text:after,
 .mw-body a.external.autonumber:after {
-       content: " (" attr(href) ")";
+       content: " (" attr( href ) ")";
+       word-wrap: break-word;
 }
 
 /* Expand protocol-relative URLs for printing */
 .mw-body a.external.text[href^='//']:after,
 .mw-body a.external.autonumber[href^='//']:after {
-       content: " (https:" attr(href) ")";
+       content: " (https:" attr( href ) ")";
 }
 
 /* MSIE/Win doesn't understand 'inherit' */
@@ -182,7 +186,7 @@ a,
 a.external,
 a.new,
 a.stub {
-       color: black !important;
+       color: #000 !important;
        text-decoration: none !important;
 }
 
@@ -230,23 +234,23 @@ div.center {
  * Thumbnails
  */
 div.thumb {
-       border: none;
+       background-color: transparent;
+       border: 0;
        width: auto;
        margin-top: 0.5em;
        margin-bottom: 0.8em;
-       background-color: transparent;
 }
 
 div.thumbinner {
-       border: 1px solid #cccccc;
+       background-color: #fff;
+       border: 1pt solid #ccc;
        padding: 3px !important;
-       background-color: White;
        font-size: 94%;
        text-align: center;
 }
 
 html .thumbimage {
-       border: 1px solid #cccccc;
+       border: 1pt solid #ccc;
 }
 
 html .thumbcaption {
@@ -259,10 +263,6 @@ html .thumbcaption {
        word-wrap: break-word;
 }
 
-div.magnify {
-       display: none;
-}
-
 /* @noflip */
 div.tright {
        float: right;
@@ -278,7 +278,7 @@ div.tleft {
 }
 
 img.thumbborder {
-       border: 1px solid #dddddd;
+       border: 1pt solid #ddd;
 }
 
 /**
@@ -287,25 +287,28 @@ img.thumbborder {
  */
 table.wikitable,
 table.mw_metadata {
+       background: #fff;
        margin: 1em 0;
-       border: 1px #aaa solid;
-       background: white;
+       border: 1pt solid #aaa;
        border-collapse: collapse;
 }
 
-table.wikitable > tr > th, table.wikitable > tr > td,
-table.wikitable > * > tr > th, table.wikitable > * > tr > td,
-.mw_metadata th, .mw_metadata td {
-       border: 1px #aaa solid;
+table.wikitable > tr > th,
+table.wikitable > tr > td,
+table.wikitable > * > tr > th,
+table.wikitable > * > tr > td,
+.mw_metadata th,
+.mw_metadata td {
+       border: 1pt solid #aaa;
        padding: 0.2em;
 }
 
 table.wikitable > tr > th,
 table.wikitable > * > tr > th,
 .mw_metadata th {
-       text-align: center;
-       background: white;
+       background: #fff;
        font-weight: bold;
+       text-align: center;
 }
 
 table.wikitable > caption,
@@ -315,7 +318,7 @@ table.wikitable > caption,
 
 table.listing,
 table.listing td {
-       border: 1pt solid black;
+       border: 1pt solid #000;
        border-collapse: collapse;
 }
 
@@ -328,26 +331,23 @@ a.sortheader {
  */
 .catlinks ul {
        display: inline;
-       margin: 0;
        padding: 0;
-       list-style: none;
-       list-style-type: none;
-       list-style-image: none;
+       list-style: none none;
 }
 
 .catlinks li {
        display: inline-block;
        line-height: 1.15em;
        padding: 0 .4em;
-       border-left: 1px solid #AAA;
+       border-left: 1pt solid #aaa;
        margin: 0.1em 0;
 }
 
 .catlinks li:first-child {
        padding-left: .2em;
-       border-left: none;
+       border-left: 0;
 }
 
 .printfooter {
-       padding: 1em 0 1em 0;
+       padding: 1em 0;
 }
index daebac1..4c618d4 100644 (file)
@@ -119,6 +119,9 @@ abbr[title],
 /* Comment portions of RC entries */
 span.comment {
        font-style: italic;
+       unicode-bidi: -moz-isolate;
+       unicode-bidi: -webkit-isolate;
+       unicode-bidi: isolate;
 }
 
 /**
index 49af809..9836403 100644 (file)
@@ -80,8 +80,9 @@
                                } else if ( page.invalidreason ) {
                                        resultOut = mw.html.escape( page.invalidreason );
                                }
-                               $spinnerDestCheck.remove();
                                uploadWarning.processResult( resultOut, uploadWarning.nameToCheck );
+                       } ).always( function () {
+                               $spinnerDestCheck.remove();
                        } );
                },
 
                                prop: 'text',
                                pst: true
                        } ).done( function ( result ) {
-                               $spinnerLicense.remove();
                                uploadLicense.processResult( result, license );
+                       } ).always( function () {
+                               $spinnerLicense.remove();
                        } );
                },
 
index b8cc059..899daa5 100644 (file)
@@ -94,7 +94,9 @@
                        url = ( ajaxOptions && ajaxOptions.url ) || this.defaults.ajax.url;
                        origin = ( parameters && parameters.origin ) || this.defaults.parameters.origin;
                        url += ( url.indexOf( '?' ) !== -1 ? '&' : '?' ) +
-                               'origin=' + encodeURIComponent( origin );
+                               // Depending on server configuration, MediaWiki may forbid periods in URLs, due to an IE 6
+                               // XSS bug. So let's escape them here. See WebRequest::checkUrlExtension() and T30235.
+                               'origin=' + encodeURIComponent( origin ).replace( /\./g, '%2E' );
                        newAjaxOptions = $.extend( {}, ajaxOptions, { url: url } );
                } else {
                        newAjaxOptions = ajaxOptions;
index b4ff40a..1f21fc6 100644 (file)
                                // Prevent jQuery from overriding the Content-Type header
                                ajaxOptions.contentType = false;
                        } else {
-                               // Some deployed MediaWiki >= 1.17 forbid periods in URLs, due to an IE XSS bug
-                               // So let's escape them here. See bug #28235
                                // This works because jQuery accepts data as a query string or as an Object
-                               ajaxOptions.data = $.param( parameters ).replace( /\./g, '%2E' );
-
+                               ajaxOptions.data = $.param( parameters );
                                // If we extracted a token parameter, add it back in.
                                if ( token ) {
                                        ajaxOptions.data += '&token=' + encodeURIComponent( token );
                                }
 
+                               // Depending on server configuration, MediaWiki may forbid periods in URLs, due to an IE 6
+                               // XSS bug. So let's escape them here. See WebRequest::checkUrlExtension() and T30235.
+                               ajaxOptions.data = ajaxOptions.data.replace( /\./g, '%2E' );
+
                                if ( ajaxOptions.contentType === 'multipart/form-data' ) {
                                        // We were asked to emulate but can't, so drop the Content-Type header, otherwise
                                        // it'll be wrong and the server will fail to decode the POST body
index 3c8b3f6..c2da10e 100644 (file)
                        }
 
                        function finishUpload( moreData ) {
-                               api.uploadFromStash( filekey, $.extend( data, moreData ) );
+                               return api.uploadFromStash( filekey, $.extend( data, moreData ) );
                        }
 
                        return this.upload( file, { stash: true, filename: data.filename } ).then(
diff --git a/tests/browser/ci.yml b/tests/browser/ci.yml
new file mode 100644 (file)
index 0000000..8c9865e
--- /dev/null
@@ -0,0 +1,8 @@
+BROWSER:
+  - firefox
+
+MEDIAWIKI_ENVIRONMENT:
+  - beta
+
+PLATFORM:
+  - Linux
index 127f869..f5c215b 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+use Liuggio\StatsdClient\Factory\StatsdDataFactory;
 use MediaWiki\MediaWikiServices;
 
 /**
@@ -23,6 +24,12 @@ class MediaWikiServicesTest extends PHPUnit_Framework_TestCase {
                        'MainConfig' => [ 'getMainConfig', Config::class ],
                        'SiteStore' => [ 'getSiteStore', SiteStore::class ],
                        'SiteLookup' => [ 'getSiteLookup', SiteLookup::class ],
+                       'StatsdDataFactory' => [ 'getStatsdDataFactory', StatsdDataFactory::class ],
+                       'EventRelayerGroup' => [ 'getEventRelayerGroup', EventRelayerGroup::class ],
+                       'SearchEngine' => [ 'newSearchEngine', SearchEngine::class ],
+                       'SearchEngineFactory' => [ 'getSearchEngineFactory', SearchEngineFactory::class ],
+                       'SearchEngineConfig' => [ 'getSearchEngineConfig', SearchEngineConfig::class ],
+                       'SkinFactory' => [ 'getSkinFactory', SkinFactory::class ],
                ];
        }
 
@@ -46,6 +53,11 @@ class MediaWikiServicesTest extends PHPUnit_Framework_TestCase {
                        'MainConfig' => [ 'MainConfig', Config::class ],
                        'SiteStore' => [ 'SiteStore', SiteStore::class ],
                        'SiteLookup' => [ 'SiteLookup', SiteLookup::class ],
+                       'StatsdDataFactory' => [ 'StatsdDataFactory', StatsdDataFactory::class ],
+                       'EventRelayerGroup' => [ 'EventRelayerGroup', EventRelayerGroup::class ],
+                       'SearchEngineFactory' => [ 'SearchEngineFactory', SearchEngineFactory::class ],
+                       'SearchEngineConfig' => [ 'SearchEngineConfig', SearchEngineConfig::class ],
+                       'SkinFactory' => [ 'SkinFactory', SkinFactory::class ],
                ];
        }
 
index 20fcedb..e536205 100644 (file)
@@ -105,7 +105,7 @@ class WatchedItemIntegrationTest extends MediaWikiTestCase {
                        WatchedItem::fromUserTitle( $user, $title )->getNotificationTimestamp()
                );
                $user->mRights = [];
-               $this->assertFalse( WatchedItem::fromUserTitle( $user, $title )->isWatched() );
+               $this->assertFalse( WatchedItem::fromUserTitle( $user, $title )->getNotificationTimestamp() );
        }
 
        public function testRemoveWatch_falseOnNotAllowed() {
@@ -120,4 +120,14 @@ class WatchedItemIntegrationTest extends MediaWikiTestCase {
                $this->assertTrue( WatchedItem::fromUserTitle( $user, $title )->removeWatch() );
        }
 
+       public function testGetNotificationTimestamp_falseOnNotWatched() {
+               $user = $this->getUser();
+               $title = Title::newFromText( 'WatchedItemIntegrationTestPage' );
+
+               WatchedItem::fromUserTitle( $user, $title )->removeWatch();
+               $this->assertFalse( WatchedItem::fromUserTitle( $user, $title )->isWatched() );
+
+               $this->assertFalse( WatchedItem::fromUserTitle( $user, $title )->getNotificationTimestamp() );
+       }
+
 }
index 90438a0..602a175 100644 (file)
@@ -20,13 +20,19 @@ class MockSearch extends SearchEngine {
  */
 class SearchUpdateTest extends MediaWikiTestCase {
 
+       /**
+        * @var SearchUpdate
+        */
+       private $su;
+
        protected function setUp() {
                parent::setUp();
                $this->setMwGlobals( 'wgSearchType', 'MockSearch' );
+               $this->su = new SearchUpdate( 0, "" );
        }
 
        public function updateText( $text ) {
-               return trim( SearchUpdate::updateText( $text ) );
+               return trim( $this->su->updateText( $text ) );
        }
 
        /**
diff --git a/tests/phpunit/includes/interwiki/InterwikiTest.php b/tests/phpunit/includes/interwiki/InterwikiTest.php
new file mode 100644 (file)
index 0000000..411d6a3
--- /dev/null
@@ -0,0 +1,254 @@
+<?php
+/**
+ * @covers Interwiki
+ *
+ * @group MediaWiki
+ * @group Database
+ */
+class InterwikiTest extends MediaWikiTestCase {
+
+       public function testConstructor() {
+               $interwiki = new Interwiki(
+                       'xyz',
+                       'http://xyz.acme.test/wiki/$1',
+                       'http://xyz.acme.test/w/api.php',
+                       'xyzwiki',
+                       1,
+                       0
+               );
+
+               $this->setContentLang( 'qqx' );
+
+               $this->assertSame( '(interwiki-name-xyz)', $interwiki->getName() );
+               $this->assertSame( '(interwiki-desc-xyz)', $interwiki->getDescription() );
+               $this->assertSame( 'http://xyz.acme.test/w/api.php', $interwiki->getAPI() );
+               $this->assertSame( 'http://xyz.acme.test/wiki/$1', $interwiki->getURL() );
+               $this->assertSame( 'xyzwiki', $interwiki->getWikiID() );
+               $this->assertTrue( $interwiki->isLocal() );
+               $this->assertFalse( $interwiki->isTranscludable() );
+       }
+
+       public function testGetUrl() {
+               $interwiki = new Interwiki(
+                       'xyz',
+                       'http://xyz.acme.test/wiki/$1'
+               );
+
+               $this->assertSame( 'http://xyz.acme.test/wiki/$1', $interwiki->getURL() );
+               $this->assertSame( 'http://xyz.acme.test/wiki/Foo%26Bar', $interwiki->getURL( 'Foo&Bar' ) );
+       }
+
+       //// tests for static data access methods below ///////////////////////////////////////////////
+
+       private function populateDB( $iwrows ) {
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->delete( 'interwiki', '*', __METHOD__ );
+               $dbw->insert( 'interwiki', array_values( $iwrows ), __METHOD__ );
+               $this->tablesUsed[] = 'interwiki';
+       }
+
+       public function testDatabaseStorage() {
+               // NOTE: database setup is expensive, so we only do
+               //  it once and run all the tests in one go.
+               $dewiki = [
+                       'iw_prefix' => 'de',
+                       'iw_url' => 'http://de.wikipedia.org/wiki/',
+                       'iw_api' => 'http://de.wikipedia.org/w/api.php',
+                       'iw_wikiid' => 'dewiki',
+                       'iw_local' => 1,
+                       'iw_trans' => 0
+               ];
+
+               $zzwiki = [
+                       'iw_prefix' => 'zz',
+                       'iw_url' => 'http://zzwiki.org/wiki/',
+                       'iw_api' => 'http://zzwiki.org/w/api.php',
+                       'iw_wikiid' => 'zzwiki',
+                       'iw_local' => 0,
+                       'iw_trans' => 0
+               ];
+
+               $this->populateDB( [ $dewiki, $zzwiki ] );
+
+               Interwiki::resetLocalCache();
+               $this->setMwGlobals( 'wgInterwikiCache', false );
+
+               $this->assertEquals(
+                       [ $dewiki, $zzwiki ],
+                       Interwiki::getAllPrefixes(),
+                       'getAllPrefixes()'
+               );
+               $this->assertEquals(
+                       [ $dewiki ],
+                       Interwiki::getAllPrefixes( true ),
+                       'getAllPrefixes()'
+               );
+               $this->assertEquals(
+                       [ $zzwiki ],
+                       Interwiki::getAllPrefixes( false ),
+                       'getAllPrefixes()'
+               );
+
+               $this->assertTrue( Interwiki::isValidInterwiki( 'de' ), 'known prefix is valid' );
+               $this->assertFalse( Interwiki::isValidInterwiki( 'xyz' ), 'unknown prefix is valid' );
+
+               $this->assertNull( Interwiki::fetch( null ), 'no prefix' );
+               $this->assertFalse( Interwiki::fetch( 'xyz' ), 'unknown prefix' );
+
+               $interwiki = Interwiki::fetch( 'de' );
+               $this->assertInstanceOf( 'Interwiki', $interwiki );
+               $this->assertSame( $interwiki, Interwiki::fetch( 'de' ), 'in-process caching' );
+
+               $this->assertSame( 'http://de.wikipedia.org/wiki/', $interwiki->getURL(), 'getURL' );
+               $this->assertSame( 'http://de.wikipedia.org/w/api.php', $interwiki->getAPI(), 'getAPI' );
+               $this->assertSame( 'dewiki', $interwiki->getWikiID(), 'getWikiID' );
+               $this->assertSame( true, $interwiki->isLocal(), 'isLocal' );
+               $this->assertSame( false, $interwiki->isTranscludable(), 'isTranscludable' );
+
+               Interwiki::invalidateCache( 'de' );
+               $this->assertNotSame( $interwiki, Interwiki::fetch( 'de' ), 'invalidate cache' );
+       }
+
+       /**
+        * @param string $thisSite
+        * @param string[] $local
+        * @param string[] $global
+        *
+        * @return string[]
+        */
+       private function populateHash( $thisSite, $local, $global ) {
+               $hash = [];
+               $hash[ '__sites:' . wfWikiID() ] = $thisSite;
+
+               $globals = [];
+               $locals = [];
+
+               foreach ( $local as $row ) {
+                       $prefix = $row['iw_prefix'];
+                       $data = $row['iw_local'] . ' ' . $row['iw_url'];
+                       $locals[] = $prefix;
+                       $hash[ "_{$thisSite}:{$prefix}" ] = $data;
+               }
+
+               foreach ( $global as $row ) {
+                       $prefix = $row['iw_prefix'];
+                       $data = $row['iw_local'] . ' ' . $row['iw_url'];
+                       $globals[] = $prefix;
+                       $hash[ "__global:{$prefix}" ] = $data;
+               }
+
+               $hash[ '__list:__global' ] = implode( ' ', $globals );
+               $hash[ '__list:_' . $thisSite ] = implode( ' ', $locals );
+
+               return $hash;
+       }
+
+       private function populateCDB( $thisSite, $local, $global ) {
+               $cdbFile = tempnam( wfTempDir(), 'MW-ClassicInterwikiLookupTest-' ) . '.cdb';
+               $cdb = CdbWriter::open( $cdbFile );
+
+               $hash = $this->populateHash( $thisSite, $local, $global );
+
+               foreach ( $hash as $key => $value ) {
+                       $cdb->set( $key, $value );
+               }
+
+               $cdb->close();
+               return $cdbFile;
+       }
+
+       public function testCDBStorage() {
+               // NOTE: CDB setup is expensive, so we only do
+               //  it once and run all the tests in one go.
+
+               $dewiki = [
+                       'iw_prefix' => 'de',
+                       'iw_url' => 'http://de.wikipedia.org/wiki/',
+                       'iw_local' => 1
+               ];
+
+               $zzwiki = [
+                       'iw_prefix' => 'zz',
+                       'iw_url' => 'http://zzwiki.org/wiki/',
+                       'iw_local' => 0
+               ];
+
+               $cdbFile = $this->populateCDB(
+                       'en',
+                       [ $dewiki ],
+                       [ $zzwiki ]
+               );
+
+               Interwiki::resetLocalCache();
+               $this->setMwGlobals( 'wgInterwikiCache', $cdbFile );
+
+               $this->assertEquals(
+                       [ $dewiki, $zzwiki ],
+                       Interwiki::getAllPrefixes(),
+                       'getAllPrefixes()'
+               );
+
+               $this->assertTrue( Interwiki::isValidInterwiki( 'de' ), 'known prefix is valid' );
+               $this->assertTrue( Interwiki::isValidInterwiki( 'zz' ), 'known prefix is valid' );
+
+               $interwiki = Interwiki::fetch( 'de' );
+               $this->assertInstanceOf( 'Interwiki', $interwiki );
+
+               $this->assertSame( 'http://de.wikipedia.org/wiki/', $interwiki->getURL(), 'getURL' );
+               $this->assertSame( true, $interwiki->isLocal(), 'isLocal' );
+
+               $interwiki = Interwiki::fetch( 'zz' );
+               $this->assertInstanceOf( 'Interwiki', $interwiki );
+
+               $this->assertSame( 'http://zzwiki.org/wiki/', $interwiki->getURL(), 'getURL' );
+               $this->assertSame( false, $interwiki->isLocal(), 'isLocal' );
+
+               // cleanup temp file
+               unlink( $cdbFile );
+       }
+
+       public function testArrayStorage() {
+               $dewiki = [
+                       'iw_prefix' => 'de',
+                       'iw_url' => 'http://de.wikipedia.org/wiki/',
+                       'iw_local' => 1
+               ];
+
+               $zzwiki = [
+                       'iw_prefix' => 'zz',
+                       'iw_url' => 'http://zzwiki.org/wiki/',
+                       'iw_local' => 0
+               ];
+
+               $cdbData = $this->populateHash(
+                       'en',
+                       [ $dewiki ],
+                       [ $zzwiki ]
+               );
+
+               Interwiki::resetLocalCache();
+               $this->setMwGlobals( 'wgInterwikiCache', $cdbData );
+
+               $this->assertEquals(
+                       [ $dewiki, $zzwiki ],
+                       Interwiki::getAllPrefixes(),
+                       'getAllPrefixes()'
+               );
+
+               $this->assertTrue( Interwiki::isValidInterwiki( 'de' ), 'known prefix is valid' );
+               $this->assertTrue( Interwiki::isValidInterwiki( 'zz' ), 'known prefix is valid' );
+
+               $interwiki = Interwiki::fetch( 'de' );
+               $this->assertInstanceOf( 'Interwiki', $interwiki );
+
+               $this->assertSame( 'http://de.wikipedia.org/wiki/', $interwiki->getURL(), 'getURL' );
+               $this->assertSame( true, $interwiki->isLocal(), 'isLocal' );
+
+               $interwiki = Interwiki::fetch( 'zz' );
+               $this->assertInstanceOf( 'Interwiki', $interwiki );
+
+               $this->assertSame( 'http://zzwiki.org/wiki/', $interwiki->getURL(), 'getURL' );
+               $this->assertSame( false, $interwiki->isLocal(), 'isLocal' );
+       }
+
+}
index 96e200d..a8beb91 100644 (file)
@@ -252,4 +252,29 @@ class BagOStuffTest extends MediaWikiTestCase {
                $this->assertType( 'ScopedCallback', $value1, 'First reentrant call returned lock' );
                $this->assertType( 'ScopedCallback', $value1, 'Second reentrant call returned lock' );
        }
+
+       /**
+        * @covers BagOStuff::__construct
+        * @covers BagOStuff::trackDuplicateKeys
+        */
+       public function testReportDupes() {
+               $logger = $this->getMock( 'Psr\Log\NullLogger' );
+               $logger->expects( $this->once() )
+                       ->method( 'warning' )
+                       ->with( 'Duplicate get(): "{key}" fetched {count} times', [
+                               'key' => 'foo',
+                               'count' => 2,
+                       ] );
+
+               $cache = new HashBagOStuff( [
+                       'reportDupes' => true,
+                       'asyncHandler' => 'DeferredUpdates::addCallableUpdate',
+                       'logger' => $logger,
+               ] );
+               $cache->get( 'foo' );
+               $cache->get( 'bar' );
+               $cache->get( 'foo' );
+
+               DeferredUpdates::doUpdates();
+       }
 }
index 6a3f95b..9ed5244 100644 (file)
@@ -1,4 +1,6 @@
 <?php
+use MediaWiki\MediaWikiServices;
+
 /**
  * @group Search
  * @group Database
@@ -46,7 +48,7 @@ class SearchEnginePrefixTest extends MediaWikiLangTestCase {
 
                // Avoid special pages from extensions interferring with the tests
                $this->setMwGlobals( 'wgSpecialPages', [] );
-               $this->search = SearchEngine::create();
+               $this->search = MediaWikiServices::getInstance()->newSearchEngine();
                $this->search->setNamespaces( [] );
        }
 
index 6218f0a..d04d7ec 100644 (file)
@@ -751,8 +751,8 @@ class SessionManagerTest extends MediaWikiTestCase {
                $manager = \TestingAccessWrapper::newFromObject( $this->getManager() );
                $manager->setLogger( new \Psr\Log\NullLogger() );
 
-               $mock = $this->getMock( 'stdClass', [ 'save' ] );
-               $mock->expects( $this->once() )->method( 'save' );
+               $mock = $this->getMock( 'stdClass', [ 'shutdown' ] );
+               $mock->expects( $this->once() )->method( 'shutdown' );
 
                $manager->allSessionBackends = [ $mock ];
                $manager->shutdown();
index a4e4df1..4ea9686 100644 (file)
@@ -1,4 +1,6 @@
 <?php
+use MediaWiki\MediaWikiServices;
+
 /**
  * Test class for SpecialSearch class
  * Copyright © 2012, Antoine Musso
@@ -6,7 +8,6 @@
  * @author Antoine Musso
  * @group Database
  */
-
 class SpecialSearchTest extends MediaWikiTestCase {
 
        /**
@@ -57,7 +58,7 @@ class SpecialSearchTest extends MediaWikiTestCase {
        }
 
        public static function provideSearchOptionsTests() {
-               $defaultNS = SearchEngine::defaultNamespaces();
+               $defaultNS = MediaWikiServices::getInstance()->getSearchEngineConfig()->defaultNamespaces();
                $EMPTY_REQUEST = [];
                $NO_USER_PREF = null;