Merge "Standardise preview warning box when using ?action=edit"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Tue, 17 Sep 2019 02:06:54 +0000 (02:06 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Tue, 17 Sep 2019 02:06:54 +0000 (02:06 +0000)
388 files changed:
.phan/config.php
.travis.yml
CODE_OF_CONDUCT.md
INSTALL
RELEASE-NOTES-1.34
composer.json
docs/hooks.txt
includes/DefaultSettings.php
includes/EditPage.php
includes/FeedUtils.php
includes/GlobalFunctions.php
includes/Linker.php
includes/OutputPage.php
includes/PHPVersionCheck.php
includes/ProtectionForm.php
includes/Revision/RevisionRecord.php
includes/Revision/RevisionStoreFactory.php
includes/ServiceWiring.php
includes/Status.php
includes/Storage/DerivedPageDataUpdater.php
includes/Storage/SqlBlobStore.php
includes/StreamFile.php
includes/Title.php
includes/WebRequest.php
includes/actions/Action.php
includes/actions/HistoryAction.php
includes/actions/InfoAction.php
includes/actions/RawAction.php
includes/actions/RollbackAction.php
includes/actions/SpecialPageAction.php
includes/api/ApiComparePages.php
includes/api/ApiEditPage.php
includes/api/ApiFormatXmlRsd.php
includes/api/ApiHelpParamValueMessage.php
includes/api/ApiImageRotate.php
includes/api/ApiParse.php
includes/api/ApiQueryBacklinks.php
includes/api/ApiQueryDeletedrevs.php
includes/api/ApiQueryQueryPage.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiResetPassword.php
includes/api/ApiRevisionDelete.php
includes/api/ApiSetNotificationTimestamp.php
includes/api/i18n/ar.json
includes/api/i18n/fr.json
includes/api/i18n/he.json
includes/api/i18n/it.json
includes/api/i18n/ko.json
includes/api/i18n/mk.json
includes/api/i18n/pl.json
includes/api/i18n/pt-br.json
includes/api/i18n/qqq.json
includes/block/BlockManager.php
includes/changes/CategoryMembershipChange.php
includes/changes/ChangesFeed.php
includes/changes/ChangesList.php
includes/changes/EnhancedChangesList.php
includes/changes/RCCacheEntryFactory.php
includes/changetags/ChangeTagsLogItem.php
includes/clientpool/SquidPurgeClient.php
includes/collation/CustomUppercaseCollation.php
includes/content/ContentHandler.php
includes/debug/logger/ConsoleLogger.php
includes/deferred/CdnCacheUpdate.php
includes/deferred/HTMLCacheUpdate.php
includes/deferred/LinksUpdate.php
includes/deferred/SearchUpdate.php
includes/diff/DifferenceEngine.php
includes/export/DumpMultiWriter.php
includes/export/WikiExporter.php
includes/filerepo/FileRepo.php
includes/filerepo/file/ArchivedFile.php
includes/filerepo/file/File.php
includes/filerepo/file/LocalFileDeleteBatch.php
includes/filerepo/file/LocalFileMoveBatch.php
includes/gallery/ImageGalleryBase.php
includes/historyblob/ConcatenatedGzipHistoryBlob.php
includes/historyblob/HistoryBlobCurStub.php
includes/historyblob/HistoryBlobStub.php
includes/htmlform/HTMLFormField.php
includes/htmlform/fields/HTMLSelectAndOtherField.php
includes/http/MWCallbackStream.php
includes/import/ImportStreamSource.php
includes/import/ImportStringSource.php
includes/import/WikiImporter.php
includes/installer/InstallDocFormatter.php
includes/installer/LocalSettingsGenerator.php
includes/installer/MysqlUpdater.php
includes/installer/PostgresInstaller.php
includes/installer/i18n/be-tarask.json
includes/installer/i18n/io.json
includes/libs/MemoizedCallable.php
includes/libs/composer/ComposerInstalled.php
includes/libs/composer/ComposerJson.php
includes/libs/composer/ComposerLock.php
includes/libs/filebackend/FSFileBackend.php
includes/libs/filebackend/FileBackendStore.php
includes/libs/filebackend/SwiftFileBackend.php
includes/libs/filebackend/fileophandle/SwiftFileOpHandle.php
includes/libs/lockmanager/QuorumLockManager.php
includes/libs/mime/XmlTypeCheck.php
includes/libs/objectcache/MultiWriteBagOStuff.php
includes/libs/objectcache/ReplicatedBagOStuff.php
includes/libs/rdbms/lbfactory/LBFactoryMulti.php
includes/libs/redis/RedisConnectionPool.php
includes/logging/BlockLogFormatter.php
includes/logging/ContentModelLogFormatter.php
includes/logging/DeleteLogFormatter.php
includes/logging/LogEventsList.php
includes/logging/LogFormatter.php
includes/logging/LogPager.php
includes/logging/MergeLogFormatter.php
includes/logging/MoveLogFormatter.php
includes/logging/ProtectLogFormatter.php
includes/mail/EmailNotification.php
includes/mail/UserMailer.php
includes/media/DjVuHandler.php
includes/media/DjVuImage.php
includes/media/JpegMetadataExtractor.php
includes/objectcache/ObjectCache.php
includes/page/Article.php
includes/page/ImageHistoryList.php
includes/page/ImagePage.php
includes/page/PageArchive.php
includes/page/WikiFilePage.php
includes/page/WikiPage.php
includes/parser/CoreParserFunctions.php
includes/preferences/DefaultPreferencesFactory.php
includes/profiler/SectionProfiler.php
includes/resourceloader/DerivativeResourceLoaderContext.php
includes/resourceloader/MessageBlobStore.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderCircularDependencyError.php
includes/resourceloader/ResourceLoaderClientHtml.php
includes/resourceloader/ResourceLoaderContext.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/resourceloader/ResourceLoaderFilePath.php
includes/resourceloader/ResourceLoaderForeignApiModule.php
includes/resourceloader/ResourceLoaderImage.php
includes/resourceloader/ResourceLoaderImageModule.php
includes/resourceloader/ResourceLoaderLanguageDataModule.php
includes/resourceloader/ResourceLoaderLessVarFileModule.php
includes/resourceloader/ResourceLoaderModule.php
includes/resourceloader/ResourceLoaderOOUIFileModule.php
includes/resourceloader/ResourceLoaderOOUIIconPackModule.php
includes/resourceloader/ResourceLoaderOOUIModule.php
includes/resourceloader/ResourceLoaderSiteModule.php
includes/resourceloader/ResourceLoaderSiteStylesModule.php
includes/resourceloader/ResourceLoaderSkinModule.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/resourceloader/ResourceLoaderUserDefaultsModule.php
includes/resourceloader/ResourceLoaderUserModule.php
includes/resourceloader/ResourceLoaderUserOptionsModule.php
includes/resourceloader/ResourceLoaderUserStylesModule.php
includes/resourceloader/ResourceLoaderUserTokensModule.php
includes/resourceloader/ResourceLoaderWikiModule.php
includes/revisiondelete/RevDelArchivedFileItem.php
includes/revisiondelete/RevDelFileItem.php
includes/revisiondelete/RevDelList.php
includes/revisiondelete/RevDelLogItem.php
includes/revisiondelete/RevDelLogList.php
includes/revisiondelete/RevDelRevisionItem.php
includes/revisiondelete/RevDelRevisionList.php
includes/revisiondelete/RevisionDeleteUser.php
includes/revisiondelete/RevisionDeleter.php
includes/revisionlist/RevisionItem.php
includes/site/MediaWikiSite.php
includes/site/Site.php
includes/skins/BaseTemplate.php
includes/skins/SkinTemplate.php
includes/specialpage/ChangesListSpecialPage.php
includes/specialpage/LoginSignupSpecialPage.php
includes/specialpage/SpecialPage.php
includes/specialpage/SpecialPageFactory.php
includes/specials/SpecialApiSandbox.php
includes/specials/SpecialAutoblockList.php
includes/specials/SpecialBlock.php
includes/specials/SpecialBlockList.php
includes/specials/SpecialBrokenRedirects.php
includes/specials/SpecialChangeContentModel.php
includes/specials/SpecialChangeEmail.php
includes/specials/SpecialConfirmEmail.php
includes/specials/SpecialContributions.php
includes/specials/SpecialCreateAccount.php
includes/specials/SpecialDoubleRedirects.php
includes/specials/SpecialEditTags.php
includes/specials/SpecialEmailUser.php
includes/specials/SpecialExpandTemplates.php
includes/specials/SpecialExport.php
includes/specials/SpecialImport.php
includes/specials/SpecialLog.php
includes/specials/SpecialMergeHistory.php
includes/specials/SpecialMovepage.php
includes/specials/SpecialPagesWithProp.php
includes/specials/SpecialPasswordReset.php
includes/specials/SpecialPreferences.php
includes/specials/SpecialRecentChanges.php
includes/specials/SpecialRecentChangesLinked.php
includes/specials/SpecialRevisionDelete.php
includes/specials/SpecialRunJobs.php
includes/specials/SpecialTags.php
includes/specials/SpecialUnblock.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialUpload.php
includes/specials/SpecialUserrights.php
includes/specials/SpecialWatchlist.php
includes/specials/SpecialWhatLinksHere.php
includes/specials/forms/PreferencesFormOOUI.php
includes/specials/forms/UploadForm.php
includes/specials/pagers/ActiveUsersPager.php
includes/specials/pagers/BlockListPager.php
includes/specials/pagers/ContribsPager.php
includes/specials/pagers/DeletedContribsPager.php
includes/specials/pagers/ProtectedPagesPager.php
includes/specials/pagers/UsersPager.php
includes/title/MediaWikiTitleCodec.php
includes/upload/UploadBase.php
includes/upload/UploadFromUrl.php
includes/user/LocalIdLookup.php
includes/user/PasswordReset.php
includes/user/User.php
includes/user/UserNamePrefixSearch.php
includes/utils/AvroValidator.php
includes/watcheditem/WatchedItemQueryService.php
jsduck.json
languages/LanguageConverter.php
languages/data/Names.php
languages/data/ZhConversion.php
languages/i18n/ar.json
languages/i18n/awa.json
languages/i18n/ban.json
languages/i18n/be-tarask.json
languages/i18n/be.json
languages/i18n/bg.json
languages/i18n/bn.json
languages/i18n/cs.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/dty.json
languages/i18n/en.json
languages/i18n/exif/nb.json
languages/i18n/exif/nds-nl.json
languages/i18n/exif/sr-ec.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/gl.json
languages/i18n/gom-deva.json
languages/i18n/gom-latn.json
languages/i18n/gv.json
languages/i18n/he.json
languages/i18n/hu.json
languages/i18n/io.json
languages/i18n/ja.json
languages/i18n/jv.json
languages/i18n/ka.json
languages/i18n/kiu.json
languages/i18n/lv.json
languages/i18n/min.json
languages/i18n/mk.json
languages/i18n/my.json
languages/i18n/nb.json
languages/i18n/nds-nl.json
languages/i18n/ne.json
languages/i18n/nl.json
languages/i18n/nqo.json
languages/i18n/pl.json
languages/i18n/pt-br.json
languages/i18n/ro.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/sh.json
languages/i18n/sl.json
languages/i18n/sv.json
languages/i18n/szl.json
languages/i18n/tt-cyrl.json
languages/i18n/uk.json
languages/i18n/zgh.json
languages/i18n/zh-hant.json
languages/i18n/zh-hk.json
maintenance/Doxyfile
maintenance/archives/upgradeLogging.php
maintenance/cleanupSpam.php
maintenance/findDeprecated.php
maintenance/getText.php
maintenance/language/zhtable/simp2trad.manual
maintenance/language/zhtable/simp2trad_noconvert.manual
maintenance/language/zhtable/toCN.manual
maintenance/language/zhtable/toHK.manual
maintenance/language/zhtable/toSimp.manual
maintenance/language/zhtable/toTW.manual
maintenance/language/zhtable/toTrad.manual
maintenance/language/zhtable/trad2simp.manual
maintenance/language/zhtable/tradphrases.manual
maintenance/language/zhtable/tradphrases_exclude.manual
maintenance/mwdocgen.php
maintenance/populateRevisionLength.php
maintenance/preprocessDump.php
maintenance/refreshLinks.php
maintenance/userDupes.inc
resources/Resources.php
resources/lib/foreign-resources.yaml
resources/lib/ooui/History.md
resources/lib/ooui/i18n/fr.json
resources/lib/ooui/i18n/pl.json
resources/lib/ooui/oojs-ui-apex.js
resources/lib/ooui/oojs-ui-core-apex.css
resources/lib/ooui/oojs-ui-core-wikimediaui.css
resources/lib/ooui/oojs-ui-core.js
resources/lib/ooui/oojs-ui-toolbars-apex.css
resources/lib/ooui/oojs-ui-toolbars-wikimediaui.css
resources/lib/ooui/oojs-ui-toolbars.js
resources/lib/ooui/oojs-ui-widgets-apex.css
resources/lib/ooui/oojs-ui-widgets-wikimediaui.css
resources/lib/ooui/oojs-ui-widgets.js
resources/lib/ooui/oojs-ui-wikimediaui.js
resources/lib/ooui/oojs-ui-windows-apex.css
resources/lib/ooui/oojs-ui-windows-wikimediaui.css
resources/lib/ooui/oojs-ui-windows.js
resources/lib/ooui/themes/apex/icons-editing-advanced.json
resources/lib/ooui/themes/apex/icons-user.json
resources/lib/ooui/themes/wikimediaui/icons-editing-advanced.json
resources/lib/ooui/themes/wikimediaui/icons-user.json
resources/lib/ooui/themes/wikimediaui/images/icons/beaker-invert.png [deleted file]
resources/lib/ooui/themes/wikimediaui/images/icons/beaker-invert.svg [deleted file]
resources/lib/ooui/themes/wikimediaui/images/icons/beaker-progressive.png [deleted file]
resources/lib/ooui/themes/wikimediaui/images/icons/beaker-progressive.svg [deleted file]
resources/lib/ooui/themes/wikimediaui/images/icons/beaker.png [deleted file]
resources/lib/ooui/themes/wikimediaui/images/icons/beaker.svg [deleted file]
resources/lib/ooui/themes/wikimediaui/images/icons/labFlask-invert.png [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/labFlask-invert.svg [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/labFlask-progressive.png [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/labFlask-progressive.svg [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/labFlask.png [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/labFlask.svg [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/userAvatarOutline-invert.svg
resources/lib/ooui/themes/wikimediaui/images/icons/userAvatarOutline-progressive.svg
resources/lib/ooui/themes/wikimediaui/images/icons/userAvatarOutline.svg
resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr-invert.png [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr-invert.svg [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr-progressive.png [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr-progressive.svg [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr.png [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr.svg [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl-invert.png [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl-invert.svg [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl-progressive.png [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl-progressive.svg [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl.png [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl.svg [new file with mode: 0644]
resources/src/jquery.color/jquery.color.js [new file with mode: 0644]
resources/src/jquery.color/jquery.colorUtil.js [new file with mode: 0644]
resources/src/jquery/jquery.checkboxShiftClick.js [deleted file]
resources/src/jquery/jquery.color.js [deleted file]
resources/src/jquery/jquery.colorUtil.js [deleted file]
resources/src/mediawiki.ForeignApi.core.js
resources/src/mediawiki.htmlform.checker.js
resources/src/mediawiki.page.ready.js [deleted file]
resources/src/mediawiki.page.ready/.eslintrc.json [new file with mode: 0644]
resources/src/mediawiki.page.ready/checkboxShift.js [new file with mode: 0644]
resources/src/mediawiki.page.ready/ready.js [new file with mode: 0644]
resources/src/mediawiki.util/util.js
tests/phpunit/MediaWikiIntegrationTestCase.php
tests/phpunit/data/media/jpeg-xmp-nullchar.jpg [new file with mode: 0644]
tests/phpunit/includes/MediaWikiServicesTest.php
tests/phpunit/includes/Revision/RenderedRevisionTest.php
tests/phpunit/includes/Revision/RevisionStoreFactoryTest.php
tests/phpunit/includes/RevisionTest.php
tests/phpunit/includes/TitleTest.php
tests/phpunit/includes/api/ApiQuerySiteinfoTest.php
tests/phpunit/includes/api/ApiRevisionDeleteTest.php
tests/phpunit/includes/block/BlockManagerTest.php
tests/phpunit/includes/deferred/LinksUpdateTest.php
tests/phpunit/includes/filebackend/FileBackendTest.php
tests/phpunit/includes/filebackend/SwiftFileBackendTest.php
tests/phpunit/includes/media/JpegMetadataExtractorTest.php
tests/phpunit/includes/preferences/DefaultPreferencesFactoryTest.php
tests/phpunit/includes/specials/SpecialBlankPageTest.php
tests/phpunit/includes/user/LocalIdLookupTest.php
tests/phpunit/includes/user/PasswordResetTest.php
tests/phpunit/includes/user/UserGroupMembershipTest.php
tests/phpunit/includes/user/UserTest.php
tests/phpunit/maintenance/MWDoxygenFilterTest.php
tests/phpunit/maintenance/fetchTextTest.php
tests/qunit/QUnitTestResources.php
tests/qunit/suites/resources/mediawiki.api/mediawiki.ForeignApi.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js
tests/selenium/wdio-mediawiki/Api.js
thumb.php

index fc775fe..56a8ccb 100644 (file)
@@ -104,8 +104,6 @@ $cfg['suppress_issue_types'] = array_merge( $cfg['suppress_issue_types'], [
 
        // approximate error count: 45
        "PhanTypeMismatchArgument",
-       // approximate error count: 693
-       "PhanUndeclaredProperty",
 ] );
 
 // This helps a lot in discovering bad code, but unfortunately it will always fail for
@@ -113,6 +111,10 @@ $cfg['suppress_issue_types'] = array_merge( $cfg['suppress_issue_types'], [
 // @todo Enable when the issue above is resolved and we update our config!
 $cfg['redundant_condition_detection'] = false;
 
+// Do not use aliases in core.
+// Use the correct name, because we don't need backward compatibility
+$cfg['enable_class_alias_support'] = false;
+
 $cfg['ignore_undeclared_variables_in_global_scope'] = true;
 // @todo It'd be great if we could just make phan read these from DefaultSettings, to avoid
 // duplicating the types.
index d5607f1..8dbc5f2 100644 (file)
@@ -26,8 +26,6 @@ matrix:
   include:
     - php: 7.3
     - php: 7.2
-    - php: 7.1
-    - php: 7
 
 services:
   - mysql
index 498acf7..3d9f26a 100644 (file)
@@ -1 +1,4 @@
+Code of Conduct
+===============
+
 The development of this software is covered by a [Code of Conduct](https://www.mediawiki.org/wiki/Special:MyLanguage/Code_of_Conduct).
diff --git a/INSTALL b/INSTALL
index 07dd9c3..0359166 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -7,7 +7,7 @@ Starting with MediaWiki 1.2.0, it's possible to install and configure the wiki
 
 Required software as of MediaWiki 1.34.0:
 
-* Web server with PHP 7.0.13 or higher, plus the following extesnsions:
+* Web server with PHP 7.2.0 or higher, plus the following extesnsions:
 ** ctype
 ** dom
 ** fileinfo
index 09195e1..c4bbd4a 100644 (file)
@@ -302,6 +302,9 @@ because of Phabricator reports.
   Use the mediawiki.String module instead.
 * mw.language.specialCharacters, deprecated in 1.33, has been removed.
   Use require( 'mediawiki.language.specialCharacters' ) instead.
+* The jquery.colorUtil module was removed. Use jquery.color instead.
+* The jquery.checkboxShiftClick module was removed. The functionality
+  is provided by mediawiki.page.ready instead (T232688).
 * EditPage::submit(), deprecated in 1.29, has been removed. Use $this->edit()
   directly.
 * HTMLForm::getErrors(), deprecated in 1.28, has been removed. Use
@@ -428,6 +431,9 @@ because of Phabricator reports.
   * Revision::selectTextFields()
   * Revision::selectPageFields()
   * Revision::selectUserFields()
+* User::setNewpassword(), deprecated in 1.27 has been removed.
+* The ObjectCache::getMainWANInstance and ObjectCache::getMainStashInstance
+  functions, deprecated since 1.28, have been removed.
 
 === Deprecations in 1.34 ===
 * The MWNamespace class is deprecated. Use NamespaceInfo.
@@ -563,13 +569,16 @@ because of Phabricator reports.
 * The GetBlockedStatus hook is deprecated. Use GetUserBlock instead, to add or
   remove a block.
 * $wgContentHandlerUseDB is deprecated and should always be true.
+* StreamFile::send404Message() and StreamFile::parseRange() are now deprecated.
+  Use HTTPFileStreamer::send404Message() and HTTPFileStreamer::parseRange()
+  respectively instead.
 
 === Other changes in 1.34 ===
 * …
 
 == Compatibility ==
-MediaWiki 1.34 requires PHP 7.0.13 or later. Although HHVM 3.18.5 or later is
-supported, it is generally advised to use PHP 7.0.13 or later for long term
+MediaWiki 1.34 requires PHP 7.2.0 or later. Although HHVM 3.18.5 or later is
+supported, it is generally advised to use PHP 7.2.0 or later for long term
 support. It also requires the following PHP extensions:
 
 * ctype
index c1f9037..5785873 100644 (file)
@@ -28,7 +28,7 @@
                "ext-xml": "*",
                "guzzlehttp/guzzle": "6.3.3",
                "liuggio/statsd-php-client": "1.0.18",
-               "oojs/oojs-ui": "0.34.0",
+               "oojs/oojs-ui": "0.34.1",
                "pear/mail": "1.4.1",
                "pear/mail_mime": "1.10.2",
                "pear/net_smtp": "1.8.1",
index 43bfd8d..55ba06e 100644 (file)
@@ -2921,7 +2921,7 @@ result augmentors.
 Note that lists should be in the format name => object and the names in both
   lists should be distinct.
 
-'SecondaryDataUpdates': DEPRECATED! Use RevisionDataUpdates or override
+'SecondaryDataUpdates': DEPRECATED since 1.32! Use RevisionDataUpdates or override
 ContentHandler::getSecondaryDataUpdates instead.
 Allows modification of the list of DataUpdates to perform when page content is modified.
 $title: Title of the page that is being edited.
@@ -3969,7 +3969,7 @@ dumps. One, and only one hook should set this, and return false.
 &$opts: Options to use for the query
 &$join: Join conditions
 
-'WikiPageDeletionUpdates': DEPRECATED! Use PageDeletionDataUpdates or
+'WikiPageDeletionUpdates': DEPRECATED since 1.32! Use PageDeletionDataUpdates or
 override ContentHandler::getDeletionDataUpdates instead.
 Manipulates the list of DeferrableUpdates to be applied when a page is deleted.
 $page: the WikiPage
index 47fd073..6b04070 100644 (file)
@@ -2733,16 +2733,17 @@ $wgExtensionInfoMTime = false;
  * although they are sometimes still referred to as Squid settings for
  * historical reasons.
  *
- * Achieving a high hit ratio with an HTTP proxy requires special
- * configuration. See https://www.mediawiki.org/wiki/Manual:Squid_caching for
- * more details.
+ * Achieving a high hit ratio with an HTTP proxy requires special configuration.
+ * See https://www.mediawiki.org/wiki/Manual:Performance_tuning#Page_view_caching
+ * for more details.
  *
  * @{
  */
 
 /**
  * Enable/disable CDN.
- * See https://www.mediawiki.org/wiki/Manual:Squid_caching
+ *
+ * See https://www.mediawiki.org/wiki/Manual:Performance_tuning#Page_view_caching
  *
  * @since 1.34 Renamed from $wgUseSquid.
  */
index fc9c577..d047f6e 100644 (file)
@@ -25,7 +25,7 @@ use MediaWiki\EditPage\TextboxBuilder;
 use MediaWiki\EditPage\TextConflictHelper;
 use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\ScopedCallback;
 
 /**
@@ -2742,7 +2742,7 @@ ERROR;
         * content.
         *
         * @param Content|null|bool|string $content
-        * @return string The editable text form of the content.
+        * @return string|false|null The editable text form of the content.
         *
         * @throws MWException If $content is not an instance of TextContent and
         *   $this->allowNonTextContent is not true.
index 8efae4f..bfd1e2a 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Feed
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Helper functions for feeds
index 38daab5..3b4e657 100644 (file)
@@ -1816,10 +1816,11 @@ function mimeTypeMatch( $type, $avail ) {
  *
  * @param array $cprefs Client's acceptable type list
  * @param array $sprefs Server's offered types
- * @return string
+ * @return string|null
  *
  * @todo FIXME: Doesn't handle params like 'text/plain; charset=UTF-8'
  * XXX: generalize to negotiate other stuff
+ * @todo The function appears unused. Is it worth to keep?
  */
 function wfNegotiateType( $cprefs, $sprefs ) {
        $combine = [];
index 1a5058d..324b1f5 100644 (file)
@@ -21,7 +21,7 @@
  */
 use MediaWiki\Linker\LinkTarget;
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Some internal bits split of from Skin.php. These functions are used
index 7f005fb..c9b4193 100644 (file)
@@ -332,7 +332,7 @@ class OutputPage extends ContextSource {
         * a OutputPage tied to that context.
         * @param IContextSource $context
         */
-       function __construct( IContextSource $context ) {
+       public function __construct( IContextSource $context ) {
                $this->setContext( $context );
        }
 
@@ -385,8 +385,8 @@ class OutputPage extends ContextSource {
         * @param string $name Name of the meta tag
         * @param string $val Value of the meta tag
         */
-       function addMeta( $name, $val ) {
-               array_push( $this->mMetatags, [ $name, $val ] );
+       public function addMeta( $name, $val ) {
+               $this->mMetatags[] = [ $name, $val ];
        }
 
        /**
@@ -406,8 +406,8 @@ class OutputPage extends ContextSource {
         *
         * @param array $linkarr Associative array of attributes.
         */
-       function addLink( array $linkarr ) {
-               array_push( $this->mLinktags, $linkarr );
+       public function addLink( array $linkarr ) {
+               $this->mLinktags[] = $linkarr;
        }
 
        /**
@@ -425,7 +425,7 @@ class OutputPage extends ContextSource {
         * in preference to addLink(), to avoid duplicate link tags.
         * @param string $url
         */
-       function setCanonicalUrl( $url ) {
+       public function setCanonicalUrl( $url ) {
                $this->mCanonicalUrl = $url;
        }
 
@@ -447,7 +447,7 @@ class OutputPage extends ContextSource {
         *
         * @param string $script Raw HTML
         */
-       function addScript( $script ) {
+       public function addScript( $script ) {
                $this->mScripts .= $script;
        }
 
@@ -621,7 +621,7 @@ class OutputPage extends ContextSource {
         *
         * @return array
         */
-       function getHeadItemsArray() {
+       public function getHeadItemsArray() {
                return $this->mHeadItems;
        }
 
@@ -1598,6 +1598,7 @@ class OutputPage extends ContextSource {
         * @param ParserOptions|null $options Either the ParserOption to use or null to only get the
         *   current ParserOption object. This parameter is deprecated since 1.31.
         * @return ParserOptions
+        * @suppress PhanUndeclaredProperty For isBogus
         */
        public function parserOptions( $options = null ) {
                if ( $options !== null ) {
@@ -1954,7 +1955,7 @@ class OutputPage extends ContextSource {
         * @param ParserOutput $parserOutput
         * @param array $poOptions Options to ParserOutput::getText()
         */
-       function addParserOutput( ParserOutput $parserOutput, $poOptions = [] ) {
+       public function addParserOutput( ParserOutput $parserOutput, $poOptions = [] ) {
                $this->addParserOutputMetadata( $parserOutput );
                $this->addParserOutputText( $parserOutput, $poOptions );
        }
@@ -2188,7 +2189,7 @@ class OutputPage extends ContextSource {
         *
         * @return array
         */
-       function getCacheVaryCookies() {
+       public function getCacheVaryCookies() {
                if ( self::$cacheVaryCookies === null ) {
                        $config = $this->getConfig();
                        self::$cacheVaryCookies = array_values( array_unique( array_merge(
@@ -2209,7 +2210,7 @@ class OutputPage extends ContextSource {
         *
         * @return bool
         */
-       function haveCacheVaryCookies() {
+       public function haveCacheVaryCookies() {
                $request = $this->getRequest();
                foreach ( $this->getCacheVaryCookies() as $cookieName ) {
                        if ( $request->getCookie( $cookieName, '', '' ) !== '' ) {
@@ -2822,7 +2823,7 @@ class OutputPage extends ContextSource {
        /**
         * Add a "return to" link pointing to a specified title
         *
-        * @param Title $title Title to link
+        * @param LinkTarget $title Title to link
         * @param array $query Query string parameters
         * @param string|null $text Text of the link (input is not escaped)
         * @param array $options Options array to pass to Linker
index bf138c4..e726729 100644 (file)
@@ -108,8 +108,8 @@ class PHPVersionCheck {
                        'implementation' => 'PHP',
                        'version' => PHP_VERSION,
                        'vendor' => 'the PHP Group',
-                       'upstreamSupported' => '5.6.0',
-                       'minSupported' => '7.0.13',
+                       'upstreamSupported' => '7.1.0',
+                       'minSupported' => '7.2.0',
                        'upgradeURL' => 'https://www.php.net/downloads.php',
                );
        }
index 8b5d995..a1be271 100644 (file)
@@ -58,6 +58,18 @@ class ProtectionForm {
        /** @var array Map of action to the expiry time of the existing protection */
        protected $mExistingExpiry = [];
 
+       /** @var Article */
+       protected $mArticle;
+
+       /** @var Title */
+       protected $mTitle;
+
+       /** @var bool */
+       protected $disabled;
+
+       /** @var array */
+       protected $disabledAttrib;
+
        /** @var IContextSource */
        private $mContext;
 
@@ -78,7 +90,7 @@ class ProtectionForm {
                if ( wfReadOnly() ) {
                        $this->mPermErrors[] = [ 'readonlytext', wfReadOnlyReason() ];
                }
-               $this->disabled = $this->mPermErrors != [];
+               $this->disabled = $this->mPermErrors !== [];
                $this->disabledAttrib = $this->disabled
                        ? [ 'disabled' => 'disabled' ]
                        : [];
index ff9ac57..759180a 100644 (file)
@@ -531,8 +531,6 @@ abstract class RevisionRecord {
                                $text = $title->getPrefixedText();
                                wfDebug( "Checking for $permissionlist on $text due to $field match on $bitfield\n" );
 
-                               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
-
                                foreach ( $permissions as $perm ) {
                                        if ( $permissionManager->userCan( $perm, $user, $title ) ) {
                                                return true;
index acecee1..1de4d7f 100644 (file)
@@ -27,7 +27,7 @@ namespace MediaWiki\Revision;
 
 use ActorMigration;
 use CommentStore;
-use MediaWiki\Logger\Spi as LoggerSpi;
+use Psr\Log\LoggerInterface;
 use MediaWiki\Storage\BlobStoreFactory;
 use MediaWiki\Storage\NameTableStoreFactory;
 use WANObjectCache;
@@ -54,8 +54,8 @@ class RevisionStoreFactory {
        private $dbLoadBalancerFactory;
        /** @var WANObjectCache */
        private $cache;
-       /** @var LoggerSpi */
-       private $loggerProvider;
+       /** @var LoggerInterface */
+       private $logger;
 
        /** @var CommentStore */
        private $commentStore;
@@ -84,7 +84,7 @@ class RevisionStoreFactory {
         * @param CommentStore $commentStore
         * @param ActorMigration $actorMigration
         * @param int $migrationStage
-        * @param LoggerSpi $loggerProvider
+        * @param LoggerInterface $logger
         * @param bool $contentHandlerUseDB see {@link $wgContentHandlerUseDB}. Must be the same
         *        for all wikis in the cluster. Will go away after MCR migration.
         */
@@ -97,7 +97,7 @@ class RevisionStoreFactory {
                CommentStore $commentStore,
                ActorMigration $actorMigration,
                $migrationStage,
-               LoggerSpi $loggerProvider,
+               LoggerInterface $logger,
                $contentHandlerUseDB
        ) {
                Assert::parameterType( 'integer', $migrationStage, '$migrationStage' );
@@ -109,7 +109,7 @@ class RevisionStoreFactory {
                $this->commentStore = $commentStore;
                $this->actorMigration = $actorMigration;
                $this->mcrMigrationStage = $migrationStage;
-               $this->loggerProvider = $loggerProvider;
+               $this->logger = $logger;
                $this->contentHandlerUseDB = $contentHandlerUseDB;
        }
 
@@ -118,7 +118,7 @@ class RevisionStoreFactory {
         *
         * @param bool|string $dbDomain DB domain of the relevant wiki or false for the current one
         *
-        * @return RevisionStore for the given wikiId with all necessary services and a logger
+        * @return RevisionStore for the given wikiId with all necessary services
         */
        public function getRevisionStore( $dbDomain = false ) {
                Assert::parameterType( 'string|boolean', $dbDomain, '$dbDomain' );
@@ -137,7 +137,7 @@ class RevisionStoreFactory {
                        $dbDomain
                );
 
-               $store->setLogger( $this->loggerProvider->getLogger( 'RevisionStore' ) );
+               $store->setLogger( $this->logger );
                $store->setContentHandlerUseDB( $this->contentHandlerUseDB );
 
                return $store;
index 0b0aaf5..4cd3d85 100644 (file)
@@ -107,14 +107,12 @@ return [
        },
 
        'BlockManager' => function ( MediaWikiServices $services ) : BlockManager {
-               $context = RequestContext::getMain();
                return new BlockManager(
                        new ServiceOptions(
                                BlockManager::$constructorOptions, $services->getMainConfig()
                        ),
-                       $context->getUser(),
-                       $context->getRequest(),
-                       $services->getPermissionManager()
+                       $services->getPermissionManager(),
+                       LoggerFactory::getInstance( 'BlockManager' )
                );
        },
 
@@ -545,7 +543,8 @@ return [
                        $services->getContentLanguage(),
                        AuthManager::singleton(),
                        $services->getLinkRendererFactory()->create(),
-                       $services->getNamespaceInfo()
+                       $services->getNamespaceInfo(),
+                       $services->getPermissionManager()
                );
                $factory->setLogger( LoggerFactory::getInstance( 'preferences' ) );
 
@@ -634,7 +633,7 @@ return [
                        $services->getCommentStore(),
                        $services->getActorMigration(),
                        $config->get( 'MultiContentRevisionSchemaMigrationStage' ),
-                       LoggerFactory::getProvider(),
+                       LoggerFactory::getInstance( 'RevisionStore' ),
                        $config->get( 'ContentHandlerUseDB' )
                );
 
index 76b905e..932fd2a 100644 (file)
@@ -115,6 +115,7 @@ class Status extends StatusValue {
         * ]
         *
         * @return Status[]
+        * @suppress PhanUndeclaredProperty Status vs StatusValue
         */
        public function splitByErrorType() {
                list( $errorsOnlyStatus, $warningsOnlyStatus ) = parent::splitByErrorType();
index 4903cf0..b2c003a 100644 (file)
@@ -1531,7 +1531,9 @@ class DerivedPageDataUpdater implements IDBAccessObject, LoggerAwareInterface {
                if ( $this->options['changed']
                        && $title->getNamespace() == NS_USER_TALK
                        && $shortTitle != $legacyUser->getTitleKey()
-                       && !( $this->revision->isMinor() && $legacyUser->isAllowed( 'nominornewtalk' ) )
+                       && !( $this->revision->isMinor() && MediaWikiServices::getInstance()
+                                       ->getPermissionManager()
+                                       ->userHasRight( $legacyUser, 'nominornewtalk' ) )
                ) {
                        $recipient = User::newFromName( $shortTitle, false );
                        if ( !$recipient ) {
index 8c011df..bcbc9e8 100644 (file)
@@ -103,10 +103,10 @@ class SqlBlobStore implements IDBAccessObject, BlobStore {
         * @param ExternalStoreAccess $extStoreAccess Access layer for external storage
         * @param WANObjectCache $cache A cache manager for caching blobs. This can be the local
         *        wiki's default instance even if $dbDomain refers to a different wiki, since
-        *        makeGlobalKey() is used to constructed a key that allows cached blobs from the
-        *        same database to be re-used between wikis. For example, enwiki and frwiki will
-        *        use the same cache keys for blobs from the wikidatawiki database, regardless of
-        *        the cache's default key space.
+        *        makeGlobalKey() is used to construct a key that allows cached blobs from the
+        *        same database to be re-used between wikis. For example, wiki A and wiki B will
+        *        use the same cache keys for blobs fetched from wiki C, regardless of the
+        *        wiki-specific default key space.
         * @param bool|string $dbDomain The ID of the target wiki database. Use false for the local wiki.
         */
        public function __construct(
@@ -449,16 +449,15 @@ class SqlBlobStore implements IDBAccessObject, BlobStore {
         * Get a cache key for a given Blob address.
         *
         * The cache key is constructed in a way that allows cached blobs from the same database
-        * to be re-used between wikis. For example, enwiki and frwiki will use the same cache keys
-        * for blobs from the wikidatawiki database.
+        * to be re-used between wikis. For example, wiki A and wiki B will use the same cache keys
+        * for blobs fetched from wiki C.
         *
         * @param string $blobAddress
         * @return string
         */
        private function getCacheKey( $blobAddress ) {
                return $this->cache->makeGlobalKey(
-                       'BlobStore',
-                       'address',
+                       'SqlBlobStore-blob',
                        $this->dbLoadBalancer->resolveDomainID( $this->dbDomain ),
                        $blobAddress
                );
index 2ad42e5..c9b2c33 100644 (file)
  */
 class StreamFile {
        // Do not send any HTTP headers unless requested by caller (e.g. body only)
+       /** @deprecated since 1.34 */
        const STREAM_HEADLESS = HTTPFileStreamer::STREAM_HEADLESS;
        // Do not try to tear down any PHP output buffers
+       /** @deprecated since 1.34 */
        const STREAM_ALLOW_OB = HTTPFileStreamer::STREAM_ALLOW_OB;
 
        /**
@@ -66,8 +68,10 @@ class StreamFile {
         * @param string $fname Full name and path of the file to stream
         * @param int $flags Bitfield of STREAM_* constants
         * @since 1.24
+        * @deprecated since 1.34, use HTTPFileStreamer::send404Message() instead
         */
        public static function send404Message( $fname, $flags = 0 ) {
+               wfDeprecated( __METHOD__, '1.34' );
                HTTPFileStreamer::send404Message( $fname, $flags );
        }
 
@@ -78,8 +82,10 @@ class StreamFile {
         * @param int $size File size
         * @return array|string Returns error string on failure (start, end, length)
         * @since 1.24
+        * @deprecated since 1.34, use HTTPFileStreamer::parseRange() instead
         */
        public static function parseRange( $range, $size ) {
+               wfDeprecated( __METHOD__, '1.34' );
                return HTTPFileStreamer::parseRange( $range, $size );
        }
 
@@ -105,7 +111,6 @@ class StreamFile {
                                case 'png':
                                        return 'image/png';
                                case 'jpg':
-                                       return 'image/jpeg';
                                case 'jpeg':
                                        return 'image/jpeg';
                        }
index 1e93c44..0f5c384 100644 (file)
@@ -23,7 +23,7 @@
  */
 
 use MediaWiki\Permissions\PermissionManager;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\Assert\Assert;
 use Wikimedia\Rdbms\Database;
 use Wikimedia\Rdbms\IDatabase;
@@ -1059,7 +1059,7 @@ class Title implements LinkTarget, IDBAccessObject {
                        $this->lazyFillContentModel( $this->loadFieldFromDB( 'page_content_model', $flags ) );
                } elseif (
                        ( !$this->mContentModel || $flags & self::GAID_FOR_UPDATE ) &&
-                       $this->getArticleId( $flags )
+                       $this->getArticleID( $flags )
                ) {
                        $linkCache = MediaWikiServices::getInstance()->getLinkCache();
                        $linkCache->addLinkObj( $this ); # in case we already had an article ID
@@ -1561,14 +1561,32 @@ class Title implements LinkTarget, IDBAccessObject {
         * Get a Title object associated with the talk page of this article
         *
         * @deprecated since 1.34, use getTalkPageIfDefined() or NamespaceInfo::getTalkPage()
-        *             with NamespaceInfo::canHaveTalkPage().
+        *             with NamespaceInfo::canHaveTalkPage(). Note that the new method will
+        *             throw if asked for the talk page of a section-only link, or of an interwiki
+        *             link.
         * @return Title The object for the talk page
         * @throws MWException if $target doesn't have talk pages, e.g. because it's in NS_SPECIAL
         *         or because it's a relative link, or an interwiki link.
         */
        public function getTalkPage() {
-               return self::castFromLinkTarget(
-                       MediaWikiServices::getInstance()->getNamespaceInfo()->getTalkPage( $this ) );
+               // NOTE: The equivalent code in NamespaceInfo is less lenient about producing invalid titles.
+               //       Instead of failing on invalid titles, let's just log the issue for now.
+               //       See the discussion on T227817.
+
+               // Is this the same title?
+               $talkNS = MediaWikiServices::getInstance()->getNamespaceInfo()->getTalk( $this->mNamespace );
+               if ( $this->mNamespace == $talkNS ) {
+                       return $this;
+               }
+
+               $title = self::makeTitle( $talkNS, $this->mDbkeyform );
+
+               $this->warnIfPageCannotExist( $title, __METHOD__ );
+
+               return $title;
+               // TODO: replace the above with the code below:
+               // return self::castFromLinkTarget(
+               // MediaWikiServices::getInstance()->getNamespaceInfo()->getTalkPage( $this ) );
        }
 
        /**
@@ -1596,8 +1614,51 @@ class Title implements LinkTarget, IDBAccessObject {
         * @return Title The object for the subject page
         */
        public function getSubjectPage() {
-               return self::castFromLinkTarget(
-                       MediaWikiServices::getInstance()->getNamespaceInfo()->getSubjectPage( $this ) );
+               // Is this the same title?
+               $subjectNS = MediaWikiServices::getInstance()->getNamespaceInfo()
+                       ->getSubject( $this->mNamespace );
+               if ( $this->mNamespace == $subjectNS ) {
+                       return $this;
+               }
+               // NOTE: The equivalent code in NamespaceInfo is less lenient about producing invalid titles.
+               //       Instead of failing on invalid titles, let's just log the issue for now.
+               //       See the discussion on T227817.
+               $title = self::makeTitle( $subjectNS, $this->mDbkeyform );
+
+               $this->warnIfPageCannotExist( $title, __METHOD__ );
+
+               return $title;
+               // TODO: replace the above with the code below:
+               // return self::castFromLinkTarget(
+               // MediaWikiServices::getInstance()->getNamespaceInfo()->getSubjectPage( $this ) );
+       }
+
+       /**
+        * @param Title $title
+        * @param string $method
+        *
+        * @return bool whether a warning was issued
+        */
+       private function warnIfPageCannotExist( Title $title, $method ) {
+               if ( $this->getText() == '' ) {
+                       wfLogWarning(
+                               $method . ': called on empty title ' . $this->getFullText() . ', returning '
+                               . $title->getFullText()
+                       );
+
+                       return true;
+               }
+
+               if ( $this->getInterwiki() !== '' ) {
+                       wfLogWarning(
+                               $method . ': called on interwiki title ' . $this->getFullText() . ', returning '
+                               . $title->getFullText()
+                       );
+
+                       return true;
+               }
+
+               return false;
        }
 
        /**
@@ -1610,8 +1671,23 @@ class Title implements LinkTarget, IDBAccessObject {
         * @return Title
         */
        public function getOtherPage() {
-               return self::castFromLinkTarget(
-                       MediaWikiServices::getInstance()->getNamespaceInfo()->getAssociatedPage( $this ) );
+               // NOTE: Depend on the methods in this class instead of their equivalent in NamespaceInfo,
+               //       until their semantics has become exactly the same.
+               //       See the discussion on T227817.
+               if ( $this->isSpecialPage() ) {
+                       throw new MWException( 'Special pages cannot have other pages' );
+               }
+               if ( $this->isTalkPage() ) {
+                       return $this->getSubjectPage();
+               } else {
+                       if ( !$this->canHaveTalkPage() ) {
+                               throw new MWException( "{$this->getPrefixedText()} does not have an other page" );
+                       }
+                       return $this->getTalkPage();
+               }
+               // TODO: replace the above with the code below:
+               // return self::castFromLinkTarget(
+               // MediaWikiServices::getInstance()->getNamespaceInfo()->getAssociatedPage( $this ) );
        }
 
        /**
@@ -4270,12 +4346,21 @@ class Title implements LinkTarget, IDBAccessObject {
         * on the number of links. Typically called on create and delete.
         */
        public function touchLinks() {
-               DeferredUpdates::addUpdate( new HTMLCacheUpdate( $this, 'pagelinks', 'page-touch' ) );
+               $jobs = [];
+               $jobs[] = HTMLCacheUpdateJob::newForBacklinks(
+                       $this,
+                       'pagelinks',
+                       [ 'causeAction' => 'page-touch' ]
+               );
                if ( $this->mNamespace == NS_CATEGORY ) {
-                       DeferredUpdates::addUpdate(
-                               new HTMLCacheUpdate( $this, 'categorylinks', 'category-touch' )
+                       $jobs[] = HTMLCacheUpdateJob::newForBacklinks(
+                               $this,
+                               'categorylinks',
+                               [ 'causeAction' => 'category-touch' ]
                        );
                }
+
+               JobQueueGroup::singleton()->lazyPush( $jobs );
        }
 
        /**
index a48d032..c94e8d4 100644 (file)
@@ -547,7 +547,7 @@ class WebRequest {
         *
         * @param string $name
         * @param array|null $default Option default (or null)
-        * @return array Array of ints
+        * @return int[]|null
         */
        public function getIntArray( $name, $default = null ) {
                $val = $this->getArray( $name, $default );
index f892c5e..4be2f7d 100644 (file)
@@ -22,7 +22,7 @@
 use MediaWiki\MediaWikiServices;
 
 /**
- * @defgroup Actions Action done on pages
+ * @defgroup Actions Actions
  */
 
 /**
index db874f2..6a61045 100644 (file)
@@ -433,27 +433,30 @@ class HistoryAction extends FormlessAction {
         * @return FeedItem
         */
        function feedItem( $row ) {
-               $rev = new Revision( $row, 0, $this->getTitle() );
-
+               $revisionStore = MediaWikiServices::getInstance()->getRevisionStore();
+               $rev = $revisionStore->newRevisionFromRow( $row, 0, $this->getTitle() );
+               $prevRev = $revisionStore->getPreviousRevision( $rev );
+               $revComment = $rev->getComment() === null ? null : $rev->getComment()->text;
                $text = FeedUtils::formatDiffRow(
                        $this->getTitle(),
-                       $this->getTitle()->getPreviousRevisionID( $rev->getId() ),
+                       $prevRev ? $prevRev->getId() : false,
                        $rev->getId(),
                        $rev->getTimestamp(),
-                       $rev->getComment()
+                       $revComment
                );
-               if ( $rev->getComment() == '' ) {
+               $revUserText = $rev->getUser() ? $rev->getUser()->getName() : '';
+               if ( $revComment == '' ) {
                        $contLang = MediaWikiServices::getInstance()->getContentLanguage();
                        $title = $this->msg( 'history-feed-item-nocomment',
-                               $rev->getUserText(),
+                               $revUserText,
                                $contLang->timeanddate( $rev->getTimestamp() ),
                                $contLang->date( $rev->getTimestamp() ),
                                $contLang->time( $rev->getTimestamp() )
                        )->inContentLanguage()->text();
                } else {
-                       $title = $rev->getUserText() .
+                       $title = $revUserText .
                                $this->msg( 'colon-separator' )->inContentLanguage()->text() .
-                               FeedItem::stripComment( $rev->getComment() );
+                               FeedItem::stripComment( $revComment );
                }
 
                return new FeedItem(
@@ -461,7 +464,7 @@ class HistoryAction extends FormlessAction {
                        $text,
                        $this->getTitle()->getFullURL( 'diff=' . $rev->getId() . '&oldid=prev' ),
                        $rev->getTimestamp(),
-                       $rev->getUserText(),
+                       $revUserText,
                        $this->getTitle()->getTalkPage()->getFullURL()
                );
        }
index 207721e..0360fe4 100644 (file)
@@ -23,7 +23,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\Rdbms\Database;
 
 /**
@@ -280,11 +280,10 @@ class InfoAction extends FormlessAction {
                // Language in which the page content is (supposed to be) written
                $pageLang = $title->getPageLanguage()->getCode();
 
-               $permissionManager = $services->getPermissionManager();
-
                $pageLangHtml = $pageLang . ' - ' .
                        Language::fetchLanguageName( $pageLang, $lang->getCode() );
                // Link to Special:PageLanguage with pre-filled page title if user has permissions
+               $permissionManager = $services->getPermissionManager();
                if ( $config->get( 'PageLanguageUseDB' )
                        && $permissionManager->userCan( 'pagelang', $user, $title )
                ) {
@@ -344,8 +343,7 @@ class InfoAction extends FormlessAction {
                ];
 
                $unwatchedPageThreshold = $config->get( 'UnwatchedPageThreshold' );
-               if (
-                       $services->getPermissionManager()->userHasRight( $user, 'unwatchedpages' ) ||
+               if ( $permissionManager->userHasRight( $user, 'unwatchedpages' ) ||
                        ( $unwatchedPageThreshold !== false &&
                                $pageCounts['watchers'] >= $unwatchedPageThreshold )
                ) {
@@ -360,7 +358,7 @@ class InfoAction extends FormlessAction {
                        ) {
                                $minToDisclose = $config->get( 'UnwatchedPageSecret' );
                                if ( $pageCounts['visitingWatchers'] > $minToDisclose ||
-                                       $services->getPermissionManager()->userHasRight( $user, 'unwatchedpages' ) ) {
+                                       $permissionManager->userHasRight( $user, 'unwatchedpages' ) ) {
                                        $pageInfo['header-basic'][] = [
                                                $this->msg( 'pageinfo-visiting-watchers' ),
                                                $lang->formatNum( $pageCounts['visitingWatchers'] )
index 8fd4e0a..0586e09 100644 (file)
@@ -238,23 +238,31 @@ class RawAction extends FormlessAction {
         */
        public function getOldId() {
                $oldid = $this->getRequest()->getInt( 'oldid' );
+               $rl = MediaWikiServices::getInstance()->getRevisionLookup();
                switch ( $this->getRequest()->getText( 'direction' ) ) {
                        case 'next':
                                # output next revision, or nothing if there isn't one
-                               $nextid = 0;
+                               $nextRev = null;
                                if ( $oldid ) {
-                                       $nextid = $this->getTitle()->getNextRevisionID( $oldid );
+                                       $oldRev = $rl->getRevisionById( $oldid );
+                                       if ( $oldRev ) {
+                                               $nextRev = $rl->getNextRevision( $oldRev );
+                                       }
                                }
-                               $oldid = $nextid ?: -1;
+                               $oldid = $nextRev ? $nextRev->getId() : -1;
                                break;
                        case 'prev':
                                # output previous revision, or nothing if there isn't one
+                               $prevRev = null;
                                if ( !$oldid ) {
                                        # get the current revision so we can get the penultimate one
                                        $oldid = $this->page->getLatest();
                                }
-                               $previd = $this->getTitle()->getPreviousRevisionID( $oldid );
-                               $oldid = $previd ?: -1;
+                               $oldRev = $rl->getRevisionById( $oldid );
+                               if ( $oldRev ) {
+                                       $prevRev = $rl->getPreviousRevision( $oldRev );
+                               }
+                               $oldid = $prevRev ? $prevRev->getId() : -1;
                                break;
                        case 'cur':
                                $oldid = 0;
index 519da61..1c9e63b 100644 (file)
@@ -20,7 +20,7 @@
  * @ingroup Actions
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * User interface for the rollback action
index 8a231cb..56be456 100644 (file)
@@ -35,6 +35,9 @@ class SpecialPageAction extends FormlessAction {
                'editchangetags' => 'EditTags',
        ];
 
+       /**
+        * @inheritDoc
+        */
        public function getName() {
                $request = $this->getRequest();
                $actionName = $request->getVal( 'action', 'view' );
index 05eb438..6e788d5 100644 (file)
@@ -26,6 +26,9 @@ use MediaWiki\Revision\RevisionArchiveRecord;
 use MediaWiki\Revision\RevisionStore;
 use MediaWiki\Revision\SlotRecord;
 
+/**
+ * @ingroup API
+ */
 class ApiComparePages extends ApiBase {
 
        /** @var RevisionStore */
@@ -249,6 +252,7 @@ class ApiComparePages extends ApiBase {
                        );
                        if ( $row ) {
                                $rev = $this->revisionStore->newRevisionFromArchiveRow( $row );
+                               // @phan-suppress-next-line PhanUndeclaredProperty
                                $rev->isArchive = true;
                        }
                }
@@ -617,6 +621,7 @@ class ApiComparePages extends ApiBase {
                                }
                        }
 
+                       // @phan-suppress-next-line PhanUndeclaredProperty
                        if ( !empty( $rev->isArchive ) ) {
                                $this->getMain()->setCacheMode( 'private' );
                                $vals["{$prefix}archive"] = true;
index fdf9cf1..1936407 100644 (file)
@@ -20,7 +20,8 @@
  * @file
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\MediaWikiServices;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * A module that allows for editing and creating pages.
@@ -239,11 +240,15 @@ class ApiEditPage extends ApiBase {
                        $params['text'] = $newContent->serialize( $contentFormat );
                        // If no summary was given and we only undid one rev,
                        // use an autosummary
-                       if ( is_null( $params['summary'] ) &&
-                               $titleObj->getNextRevisionID( $undoafterRev->getId() ) == $params['undo']
-                       ) {
-                               $params['summary'] = wfMessage( 'undo-summary' )
-                                       ->params( $params['undo'], $undoRev->getUserText() )->inContentLanguage()->text();
+
+                       if ( is_null( $params['summary'] ) ) {
+                               $nextRev = MediaWikiServices::getInstance()->getRevisionLookup()
+                                       ->getNextRevision( $undoafterRev->getRevisionRecord() );
+                               if ( $nextRev && $nextRev->getId() == $params['undo'] ) {
+                                       $params['summary'] = wfMessage( 'undo-summary' )
+                                               ->params( $params['undo'], $undoRev->getUserText() )
+                                               ->inContentLanguage()->text();
+                               }
                        }
                }
 
index 6b892fa..3052b89 100644 (file)
@@ -21,6 +21,9 @@
  * @file
  */
 
+/**
+ * @ingroup API
+ */
 class ApiFormatXmlRsd extends ApiFormatXml {
        public function __construct( ApiMain $main, $format ) {
                parent::__construct( $main, $format );
index 7aebf90..0272dcd 100644 (file)
@@ -28,6 +28,7 @@
  * 'APIGetParamDescriptionMessages' hook simple.
  *
  * @since 1.25
+ * @ingroup API
  */
 class ApiHelpParamValueMessage extends Message {
 
index 1f8b012..8a0e8c9 100644 (file)
@@ -1,7 +1,4 @@
 <?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
@@ -21,6 +18,11 @@ use MediaWiki\MediaWikiServices;
  * @file
  */
 
+use MediaWiki\MediaWikiServices;
+
+/**
+ * @ingroup API
+ */
 class ApiImageRotate extends ApiBase {
        private $mPageSet = null;
 
index 40edafa..2e7db78 100644 (file)
@@ -21,7 +21,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * @ingroup API
index d21f111..a6b15e9 100644 (file)
@@ -41,6 +41,9 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
        private $redirect;
        private $bl_ns, $bl_from, $bl_from_ns, $bl_table, $bl_code, $bl_title, $bl_fields, $hasNS;
 
+       /** @var string */
+       private $helpUrl;
+
        /**
         * Maps ns and title to pageid
         *
index eb787d1..b8caeb9 100644 (file)
@@ -22,7 +22,7 @@
 
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Storage\NameTableAccessException;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Query module to enumerate all deleted revisions.
index 26c17c5..12e908f 100644 (file)
@@ -61,7 +61,7 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
         * @param string $name
         * @return QueryPage
         */
-       private function getSpecialPage( $name ) {
+       private function getSpecialPage( $name ) : QueryPage {
                $qp = $this->specialPageFactory->getPage( $name );
                if ( !$qp ) {
                        self::dieDebug(
index 7e4a891..47212b3 100644 (file)
@@ -279,6 +279,8 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        protected function appendNamespaces( $property ) {
+               $nsProtection = $this->getConfig()->get( 'NamespaceProtection' );
+
                $data = [
                        ApiResult::META_TYPE => 'assoc',
                ];
@@ -303,6 +305,17 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                        $data[$ns]['content'] = $nsInfo->isContent( $ns );
                        $data[$ns]['nonincludable'] = $nsInfo->isNonincludable( $ns );
 
+                       if ( isset( $nsProtection[$ns] ) ) {
+                               if ( is_array( $nsProtection[$ns] ) ) {
+                                       $specificNs = implode( "|", array_filter( $nsProtection[$ns] ) );
+                               } elseif ( $nsProtection[$ns] !== '' ) {
+                                       $specificNs = $nsProtection[$ns];
+                               }
+                               if ( isset( $specificNs ) && $specificNs !== '' ) {
+                                       $data[$ns]['namespaceprotection'] = $specificNs;
+                               }
+                       }
+
                        $contentmodel = $nsInfo->getNamespaceContentModel( $ns );
                        if ( $contentmodel ) {
                                $data[$ns]['defaultcontentmodel'] = $contentmodel;
index 7783826..6b1c217 100644 (file)
@@ -21,6 +21,7 @@
  */
 
 use MediaWiki\Auth\AuthManager;
+use MediaWiki\MediaWikiServices;
 
 /**
  * Reset password, with AuthManager
@@ -63,7 +64,11 @@ class ApiResetPassword extends ApiBase {
 
                $this->requireOnlyOneParameter( $params, 'user', 'email' );
 
-               $passwordReset = new PasswordReset( $this->getConfig(), AuthManager::singleton() );
+               $passwordReset = new PasswordReset(
+                       $this->getConfig(),
+                       AuthManager::singleton(),
+                       MediaWikiServices::getInstance()->getPermissionManager()
+               );
 
                $status = $passwordReset->isAllowed( $this->getUser() );
                if ( !$status->isOK() ) {
index 1ee91c2..60b24f0 100644 (file)
@@ -38,12 +38,6 @@ class ApiRevisionDelete extends ApiBase {
                $user = $this->getUser();
                $this->checkUserRightsAny( RevisionDeleter::getRestriction( $params['type'] ) );
 
-               // @TODO Use PermissionManager::isBlockedFrom() instead.
-               $block = $user->getBlock();
-               if ( $block ) {
-                       $this->dieBlocked( $block );
-               }
-
                if ( !$params['ids'] ) {
                        $this->dieWithError( [ 'apierror-paramempty', 'ids' ], 'paramempty_ids' );
                }
@@ -97,6 +91,10 @@ class ApiRevisionDelete extends ApiBase {
                        $this->dieWithError( [ 'apierror-revdel-needtarget' ], 'needtarget' );
                }
 
+               if ( $this->getPermissionManager()->isBlockedFrom( $user, $targetObj ) ) {
+                       $this->dieBlocked( $user->getBlock() );
+               }
+
                $list = RevisionDeleter::createList(
                        $params['type'], $this->getContext(), $targetObj, $params['ids']
                );
index 7e9f56d..3f6f14c 100644 (file)
@@ -93,13 +93,14 @@ class ApiSetNotificationTimestamp extends ApiBase {
                        $titles = $pageSet->getGoodTitles();
                        $title = reset( $titles );
                        if ( $title ) {
-                               $revid = $title->getNextRevisionID( $params['newerthanrevid'], Title::READ_LATEST );
-                               if ( $revid ) {
-                                       $timestamp = $dbw->timestamp(
-                                               MediaWikiServices::getInstance()->getRevisionStore()->getTimestampFromId( $title, $revid )
-                                       );
-                               } else {
-                                       $timestamp = null;
+                               $timestamp = null;
+                               $rl = MediaWikiServices::getInstance()->getRevisionLookup();
+                               $currRev = $rl->getRevisionById( $params['newerthanrevid'], Title::READ_LATEST );
+                               if ( $currRev ) {
+                                       $nextRev = $rl->getNextRevision( $currRev, Title::READ_LATEST );
+                                       if ( $nextRev ) {
+                                               $timestamp = $dbw->timestamp( $nextRev->getTimestamp() );
+                                       }
                                }
                        }
                }
index 09d9c46..58d2dee 100644 (file)
        "apierror-cantoverwrite-sharedfile": "الملف الهدف موجود في مستودع مشترك وليست لديك صلاحية لتجاوزه.",
        "apierror-cantsend": "لم تقم بتسجيل الدخول أو ليس لديك عنوان بريد إلكتروني مؤكد أو غير مسموح لك بإرسال بريد إلكتروني إلى مستخدمين آخرين; لذلك لا يمكنك إرسال بريد إلكتروني.",
        "apierror-cantundelete": "تعذر الاسترجاع: قد لا تكون المراجعات المطلوبة موجودة، أو ربما تم الاسترجاع بالفعل.",
-       "apierror-cantview-deleted-description": "ليست لديك صلايبة لعرض أوصاف الملفات المحذوفة.",
-       "apierror-cantview-deleted-metadata": "ليست لديك صلايبة لعرض البيانات الوصفية للملفات المحذوفة.",
+       "apierror-cantview-deleted-comment": "ليست لديك صلاحية لعرض التعليقات المحذوفة.",
+       "apierror-cantview-deleted-description": "ليست لديك صلاحية لعرض أوصاف الملفات المحذوفة.",
+       "apierror-cantview-deleted-metadata": "ليست لديك صلاحية لعرض البيانات الوصفية للملفات المحذوفة.",
+       "apierror-cantview-deleted-revision-content": "ليست لديك صلاحية لعرض محتوى المراجعات المحذوفة.",
        "apierror-changeauth-norequest": "فشل في إنشاء طلب التغيير.",
        "apierror-chunk-too-small": "الحد الأدنى لحجم القطعة هو $1 {{PLURAL:$1|بايت}} للقطع غير النهائية.",
        "apierror-cidrtoobroad": "لا يُقبَل مدى $1 CIDR أكبر من /$2.",
index 7c5d2b5..12ece4c 100644 (file)
                        "Lucas Werkmeister (WMDE)"
                ]
        },
-       "apihelp-main-extended-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Documentation]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Liste de diffusion]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annonces de l’API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bogues et demandes]\n</div>\n<strong>État :</strong> L’API MediaWiki est une interface stable et mature qui est supportée et améliorée de façon active. Bien que nous essayions de l’éviter, nous pouvons avoir parfois besoin de faire des modifications impactantes ; inscrivez-vous à [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la liste de diffusion mediawiki-api-announce] pour être informé des mises à jour.\n\n<strong>Requêtes erronées :</strong> Si des requêtes erronées sont envoyées à l’API, un entête HTTP sera renvoyé avec la clé « MediaWiki-API-Error ». La valeur de cet entête et le code d’erreur renvoyé prendront la même valeur. Pour plus d’information, voyez [[mw:Special:MyLanguage/API:Errors_and_warnings|API:Errors and warnings]].\n\n<p class=\"mw-apisandbox-link\"><strong>Test :</strong> Pour faciliter le test des requêtes à l’API, voyez [[Special:ApiSandbox]].</p>",
+       "apihelp-main-extended-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Documentation]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Liste de diffusion]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annonces de l’API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bogues et demandes]\n</div>\n<strong>État :</strong> l’API de MediaWiki est une interface stable et mature qui est supportée et améliorée de façon active. Bien que nous essayions de l’éviter, nous pouvons avoir parfois besoin de faire des modifications impactantes ; inscrivez-vous à [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la liste de diffusion ''mediawiki-api-announce''] pour être informé des mises à jour.\n\n<strong>Requêtes erronées :</strong> si des requêtes erronées sont envoyées à l’API, un entête HTTP sera renvoyé avec la clé « MediaWiki-API-Error ». La valeur de cet entête et le code d’erreur renvoyé prendront la même valeur. Pour plus d’information, voyez [[mw:Special:MyLanguage/API:Errors_and_warnings|API:Errors and warnings]].\n\n<p class=\"mw-apisandbox-link\"><strong>Test :</strong> Pour faciliter le test des requêtes à l’API, voyez [[Special:ApiSandbox]].</p>",
        "apihelp-main-param-action": "Quelle action effectuer.",
        "apihelp-main-param-format": "Le format de sortie.",
-       "apihelp-main-param-maxlag": "La latence maximale peut être utilisée quand MediaWiki est installé sur un cluster de base de données répliqué. Pour éviter des actions provoquant un supplément de latence de réplication de site, ce paramètre peut faire attendre le client jusqu’à ce que la latence de réplication soit inférieure à une valeur spécifiée. En cas de latence excessive, le code d’erreur <samp>maxlag</samp> est renvoyé avec un message tel que <samp>Attente de $host : $lag secondes de délai</samp>.<br />Voyez [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Manuel: paramètre Maxlag]] pour plus d’information.",
+       "apihelp-main-param-maxlag": "La latence maximale peut être utilisée quand MediaWiki est installé sur une grappe de réplication de base de données. Pour éviter des actions provoquant un supplément de latence de réplication de site, ce paramètre peut faire attendre le client jusqu’à ce que la latence de réplication soit inférieure à une valeur spécifiée. En cas de latence excessive, le code d’erreur <samp>maxlag</samp> est renvoyé avec un message tel que <samp>Attente de $host : $lag secondes de délai</samp>.<br />Voyez [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Manuel : paramètre Maxlag]] pour plus d’informations.",
        "apihelp-main-param-smaxage": "Fixer l’entête HTTP de contrôle de cache <code>s-maxage</code> à ce nombre de secondes. Les erreurs ne sont jamais mises en cache.",
        "apihelp-main-param-maxage": "Fixer l’entête HTTP de contrôle de cache <code>max-age</code> à ce nombre de secondes. Les erreurs ne sont jamais mises en cache.",
-       "apihelp-main-param-assert": "Vérifier si l’utilisateur est connecté si la valeur est <kbd>user</kbd>, ou s’il a le droit d’un utilisateur robot si la valeur est <kbd>bot</kbd>.",
+       "apihelp-main-param-assert": "Vérifier que l’utilisateur est connecté lorsque la valeur est <kbd>user</kbd> ou qu’il a le droit d’un utilisateur robot lorsque la valeur est <kbd>bot</kbd>.",
        "apihelp-main-param-assertuser": "Vérifier que l’utilisateur actuel est l’utilisateur nommé.",
        "apihelp-main-param-requestid": "Toute valeur fournie ici sera incluse dans la réponse. Peut être utilisé pour distinguer des demandes.",
        "apihelp-main-param-servedby": "Inclure le nom d’hôte qui a renvoyé la requête dans les résultats.",
        "apierror-cantoverwrite-sharedfile": "Le fichier cible existe dans un dépôt partagé et vous n’avez pas le droit de l’écraser.",
        "apierror-cantsend": "Vous n’êtes pas connecté, vous n’avez pas d’adresse de courriel confirmée, ou vous n’êtes pas autorisé à envoyer des courriels aux autres utilisateurs, donc vous ne pouvez envoyer de courriel.",
        "apierror-cantundelete": "Impossible d’annuler : les révisions demandées peuvent ne plus exister, ou avoir déjà été annulées.",
+       "apierror-cantview-deleted-comment": "Vous n’avez pas la permission de visualiser les commentaires supprimés.",
        "apierror-cantview-deleted-description": "Vous n’avez pas le droit d’afficher les descriptions des fichiers supprimés.",
        "apierror-cantview-deleted-metadata": "Vous n’avez pas le droit d’afficher les métadonnées des fichiers supprimés.",
+       "apierror-cantview-deleted-revision-content": "Vous n’avez pas la permission de visualiser le contenu des révisions supprimées.",
        "apierror-changeauth-norequest": "Échec à la création de la requête de modification.",
        "apierror-chunk-too-small": "La taille minimale d’un segment est de $1 {{PLURAL:$1|octet|octets}} pour les segments hors le dernier.",
        "apierror-cidrtoobroad": "Les plages CIDR $1 plus large que /$2 ne sont pas acceptées.",
index e2c5fe7..e7cf3d4 100644 (file)
        "apihelp-query-param-indexpageids": "לכלול פסקת pageids נוספת עם רשימת כל מזהי הדף שהוחזרו.",
        "apihelp-query-param-export": "יצוא הגרסאות הנוכחיות של כל הדפים הנתונים המחוללים.",
        "apihelp-query-param-exportnowrap": "להחזיר את ה־XML של היצוא בלי לעטוף אותו בתוצאת XML (אותו תסדיר כמו [[Special:Export]]). אפשר להשתמש בזה רק עם $1export.",
+       "apihelp-query-param-exportschema": "להשתמש בגרסה הנתונה של תסדיר היטל XML בעת היצוא. יכול לשמש רק עם <var>$1export</var>.",
        "apihelp-query-param-iwurl": "האם לקבל את ה־URL המלא אם הכותרת היא קישור בינוויקי.",
        "apihelp-query-param-rawcontinue": "להחזיר נתוני <samp>query-continue</samp> גולמיים להמשך.",
        "apihelp-query-example-revisions": "אחזור [[Special:ApiHelp/query+siteinfo|site info]] ו־[[Special:ApiHelp/query+revisions|revisions]] של <kbd>Main Page</kbd>.",
        "apihelp-query+langlinks-param-inlanguagecode": "קוד שפה בשביל שמות שפות מתורגמות.",
        "apihelp-query+langlinks-example-simple": "קבלת קישורים בין־לשוניים מהדף <kbd>Main Page</kbd>.",
        "apihelp-query+languageinfo-summary": "מחזירה מידע על שפות זמינות.",
+       "apihelp-query+languageinfo-extended-description": "אפשר להחיל [[mw:API:Query#Continuing queries|המשך]] אם אחזור המידע לוקח יותר מדי זמן בשביל בקשה אחת.",
        "apihelp-query+languageinfo-param-prop": "איזה מידע לקבל עבור כל שפה.",
+       "apihelp-query+languageinfo-paramvalue-prop-code": "קוד השפה. (הקוד הזה ייחודי למדיה־ויקי, אם כי יש חפיפה עם תקנים אחרים.)",
+       "apihelp-query+languageinfo-paramvalue-prop-bcp47": "קוד שפת לפי BCP-47.",
        "apihelp-query+languageinfo-paramvalue-prop-dir": "כיוון הכתיבה של השפה (<code>ltr</code> או <code>rtl</code>).",
+       "apihelp-query+languageinfo-paramvalue-prop-autonym": "השם העצמי של השפה, כלומר השם באותה השפה.",
+       "apihelp-query+languageinfo-paramvalue-prop-name": "השם בשפה בשפה שצוינה בפרמטר <var>uselang</var>, עם שפת גיבוי כשזה נחוץ.",
+       "apihelp-query+languageinfo-paramvalue-prop-fallbacks": "קודי השפה של שפות הגיבוי שמוגדרים עבור השפה הזאת. הגיבוי המשתמע הסופי ל־\"en\" אינו כלול (אבל שפות אחדות יכולות להיות מגובות ב־\"en\" במפורש).",
+       "apihelp-query+languageinfo-paramvalue-prop-variants": "קודי השפה של ההגוונים שהשפה הזאת תומכת בהם.",
+       "apihelp-query+languageinfo-param-code": "קודי השפה של השפות שאמורות להיות מוחזרות, או <code>*</code> כדי לקבל את כל השפות.",
        "apihelp-query+languageinfo-example-simple": "קבלת קודי שפה של כל השפות הנתמכות.",
+       "apihelp-query+languageinfo-example-autonym-name-de": "קבלת השמות העצמיים והשמות הגרמניים של כל השפות הנתמכות.",
+       "apihelp-query+languageinfo-example-fallbacks-variants-oc": "קבלת שפות הגיבוי וההגוונים של אוקסיטנית.",
+       "apihelp-query+languageinfo-example-bcp47-dir": "קבלת קודי שפה ב־BCP-47 וכיוון עבור כל השפות הנתמכות.",
        "apihelp-query+links-summary": "החזרת כל הקישורים מהדפים שצוינו.",
        "apihelp-query+links-param-namespace": "להציג קישורים רק במרחבי השם האלה.",
        "apihelp-query+links-param-limit": "כמה קישורים להחזיר.",
        "api-help-param-templated-var-first": "יש להחליף את הטקסט <var>&#x7B;$1&#x7D;</var> (בשם הפרמטר) עם הערכים של הפרמטר <var>$2</var>",
        "api-help-param-templated-var": "<var>&#x7B;$1&#x7D;</var> עם הערכים של הפרמטר <var>$2</var>",
        "api-help-datatypes-header": "סוגי נתונים",
-       "api-help-datatypes": "קלט למדיה־ויקי צריך להיות בקידוד UTF-8 מנורמל ב־NFC. מדיה־ויקי יכולה לנסות להמיר קלט אחר, אבל זה עלול לגרום לפעולות מסוימות (כגון [[Special:ApiHelp/edit|עריכות]] עם בדיקות MD5) להיכשל.\n\nחלק מסוגי הפרמטרים בבקשות API דורשים הסבר נוסף:\n;בוליאני (boolean)\n:פרמטרים בוליאניים עובדים כמו תיבות סימון של HTML: אם הפרמטר צוין, בלי קשר לערך שלו, הוא אמת (true). בשביל ערך שקר (false), יש להשמיט את הפרמטר לגמרי.\n;חותם־זמן (timestamp)\n:אפשר לכתוב חותמי־זמן במספר תסדירים. תאריך ושעה לפי ISO 8601 הוא הדבר המומלת. כל הזמנים מצוינים ב־ UTC, לא תהיה השפעה לשום אזור זמן שיצוין.\n:* תאריך ושעה לפי ISO 8601‏, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd> (לא חובה לכתוב פיסוק ו־<kbd>Z</kbd>)\n:* תאריך ושעה לפי ISO 8601 עם חלקי שנייה (שלא תהיה להם שום השפעה), <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>.<var>00001</var>Z</kbd> (לא חובה לכתוב קווים מפרידים, נקודתיים ו־<kbd>Z</kbd>)\n:* תסדיר MediaWiki‏, <kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* תסדיר מספרי כללי, <kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd> (לאזור זמן אופציונלי של <kbd>GMT</kbd>‏, <kbd dir=\"ltr\">+<var>##</var></kbd>, או <kbd dir=\"ltr\">-<var>##</var></kbd> אין השפעה)\n:* תסדיר EXIF‏, <kbd><var>2001</var>:<var>01</var>:<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* תסדיר RFC 2822 (אפשר להשמיט את אזור הזמן), <kbd><var>Mon</var>, <var>15</var> <var>Jan</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* תסדיר RFC 850 (אפשר להשמיט את אזור הזמן), <kbd><var>Monday</var>, <var>15</var>-<var>Jan</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* תסדיר C ctime‏, <kbd><var>Mon</var> <var>Jan</var> <var>15</var> <var>14</var>:<var>56</var>:<var>00</var> <var>2001</var></kbd>\n:* שניות מאז 1970-01-01T00:00:00Z בתור מספר שלך בין 1 ל־13 (לא כולל <kbd>0</kbd>)\n:* המחרוזת <kbd>now</kbd>\n;מפריד ערכים מרובים חלופי\n:פרמטרים שלוקחים ערכים מרובים בדרך־כלל נשלחים עם הערכים מופרדים באמצעות תו מקל, למשל <kbd>param=value1|value2</kbd> או <kbd>param=value1%7Cvalue2</kbd>. אם הערך צריך להכיל את תו המקל, יש להשתמש ב־U+001F (מפריד יחידות) בתור המפריד ''וגם'' להוסיף לתחילת הערך U+001F, למשל <kbd>param=%1Fvalue1%1Fvalue2</kbd>.",
+       "api-help-datatypes": "קלט למדיה־ויקי צריך להיות בקידוד UTF-8 מנורמל ב־NFC. מדיה־ויקי יכולה לנסות להמיר קלט אחר, אבל זה עלול לגרום לפעולות מסוימות (כגון [[Special:ApiHelp/edit|עריכות]] עם בדיקות MD5) להיכשל.\n\nחלק מסוגי הפרמטרים בבקשות API דורשים הסבר נוסף:\n;בוליאני (boolean)\n:פרמטרים בוליאניים עובדים כמו תיבות סימון של HTML: אם הפרמטר צוין, בלי קשר לערך שלו, הוא אמת (true). בשביל ערך שקר (false), יש להשמיט את הפרמטר לגמרי.\n;חותם־זמן (timestamp)\n:אפשר לכתוב חותמי־זמן במספר תסדירים, ר' את [[mw:Special:MyLanguage/Timestamp|תיעוד תסדירי הקלט של ספריית Timestamp באתר mediawiki.org]] לפרטים. תאריך ושעה לפי ISO 8601 הוא הדבר המומלץ: <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd>. בנוסף, המחרוזת <kbd>now</kbd> יכולה לשמש לציון חום־הזמן הנוכחי.\n;מפריד ערכים מרובים חלופי\n:פרמטרים שלוקחים ערכים מרובים בדרך־כלל נשלחים עם הערכים מופרדים באמצעות תו מקל, למשל <kbd>param=value1|value2</kbd> או <kbd>param=value1%7Cvalue2</kbd>. אם הערך צריך להכיל את תו המקל, יש להשתמש ב־U+001F (מפריד יחידות) בתור המפריד ''וגם'' להוסיף לתחילת הערך U+001F, למשל <kbd>param=%1Fvalue1%1Fvalue2</kbd>.",
        "api-help-templatedparams-header": "פרמטרים בתבניות",
        "api-help-templatedparams": "התכונה \"פרמטרים בתבניות\" תומכת במקרים שבהם מודול של API זקוק לערך כלשהו עבור ערכים של פרמטרים אחרים. למשל, אם היה מודול API לבקשת פרי, ייתכן שהוא היה זקוק לפרמטר בשם <var>פירות</var> על־מנת לציין מהם הפירות המבוקשים, ולפרמטר בתבנית בשם <var>{פרי}-כמות</var> על־מנת לציין את הכמות של כל פרי עבור הבקשה. לשם כך, לקוח API שמעוניין לקבל תפוח אחד, 5 בננות ו־20 תותים יכול היה ליצור בקשה בסגנון <kbd>פירות=תפוחים|בננות|תותים&תפוחים-כמות=1&בננות-כמות=5&תותים-כמות=20</kbd>.",
        "api-help-param-type-limit": "סוג: מספר שלם או <kbd>max</kbd>",
        "apierror-cantoverwrite-sharedfile": "קובץ היעד קיים במאגר משותף ואין לך הרשאה לעקוף אותו.",
        "apierror-cantsend": "לא נכנסת לחשבון, אין לך חשבון דואר אלקטרוני מאושר, או שאסור לך לשלוח דואר אלקטרוני למשתמשים אחרים, ולכן אין לך אפשרות לשלוח דואר אלקטרוני.",
        "apierror-cantundelete": "לא היה אפשר לשחזר ממחיקה: אולי הגרסאות המבוקשות אינן קיימות, ואולי הן כבר נמחקו.",
+       "apierror-cantview-deleted-comment": "אין לך הרשאה לצפות בהערות מחוקות.",
+       "apierror-cantview-deleted-description": "אין לך הרשאה לצפות בתיאורים של קבצים מחוקים.",
+       "apierror-cantview-deleted-metadata": "אין לך הרשאה לצפות במטא־נתונים של קבצים מחוקים.",
+       "apierror-cantview-deleted-revision-content": "אין לך הרשאה לצפות בתוכן של גרסאות מחוקות.",
        "apierror-changeauth-norequest": "יצירת בקשת השינוי נכשלה.",
        "apierror-chunk-too-small": "גודל הפלח המזערי הוא {{PLURAL:$1|בית אחד|$1 בתים}} בשביל פלחים לא סופיים.",
        "apierror-cidrtoobroad": "טווחי CIDR של $1 שרחבים יותר מ־/$2 אינם קבילים.",
        "apiwarn-deprecation-missingparam": "מכיוון שלא צוין <var>$1</var>, ישמש תסדיר ישן לפלט. התסדיר הזה מוכרז בתור מיושן, ובעתיד ישמש רק התסדיר החדש.",
        "apiwarn-deprecation-parameter": "הפרמטר <var>$1</var> מיושן.",
        "apiwarn-deprecation-parse-headitems": "<kbd>prop=headitems</kbd> מיושן מאז מדיה־ויקי 1.28. יש להשתמש ב־<kbd>prop=headhtml</kbd> בעת יצירת מסמכי HTML חדשים, או ב־<kbd>prop=modules|jsconfigvars</kbd> בעת עדכון מסמך בצד הלקוח.",
+       "apiwarn-deprecation-post-without-content-type": "בקשת POST נעשתה ללא כותר <code>Content-Type</code>. זה לא עובד באופן מהימן.",
        "apiwarn-deprecation-purge-get": "שימוש ב־<kbd>action=purge</kbd> דרך GET מיושן. יש להשתמש ב־POST במקום זה.",
        "apiwarn-deprecation-withreplacement": "<kbd>$1</kbd> מיושן. יש להשתמש ב־<kbd>$2</kbd> במקום זה.",
        "apiwarn-difftohidden": "לא היה אפשר לעשות השוואה עם גרסה $1: התוכן מוסתר.",
index e29c34a..9d5d349 100644 (file)
        "api-help-authmanagerhelper-continue": "Questa richiesta è una continuazione dopo una precedente risposta <samp>UI</samp> o <samp>REDIRECT</samp>. È necessario fornirlo, oppure fornire <var>$1returnurl</var>.",
        "api-help-authmanagerhelper-additional-params": "Questo modulo accetta parametri aggiuntivi a seconda delle richieste di autenticazione disponibili. Utilizza <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> con <kbd>amirequestsfor=$1</kbd> (o una precedente risposta da questo modulo, se applicabile) per determinare le richieste disponibili e i campi usati da queste.",
        "apierror-bad-badfilecontexttitle": "Titolo non valido nel parametro <var>$1badfilecontexttitle</var>.",
+       "apierror-cantview-deleted-description": "Non si dispone dei permessi necessari per vedere le descrizioni dei file cancellati.",
+       "apierror-cantview-deleted-metadata": "Non si dispone dei permessi necessari per vedere i metadati dei file cancellati.",
+       "apierror-cantview-deleted-revision-content": "Non si dispone dei permessi necessari per vedere il contenuto delle versioni cancellate.",
        "apierror-compare-notext": "Il parametro <var>$1</var> non può essere usato senza <var>$2</var>.",
        "apierror-invalidoldimage": "Il parametro <var>oldimage</var> ha un formato non valido.",
        "apierror-invaliduserid": "L'ID utente <var>$1</var> non è valido.",
index c029636..6124066 100644 (file)
        "apierror-cantimport-upload": "업로드된 페이지를 가져올 권한이 없습니다.",
        "apierror-cantimport": "페이지를 가져올 권한이 없습니다.",
        "apierror-cantsend": "로그인하지 않았거나 인증된 이메일 주소가 없거나 다른 사용자로 이메일을 보낼 권한이 없기 때문에 이메일을 보낼 수 없습니다.",
+       "apierror-cantview-deleted-description": "삭제된 파일의 설명을 볼 권한이 없습니다.",
+       "apierror-cantview-deleted-metadata": "삭제된 파일의 메타데이터를 볼 권한이 없습니다.",
        "apierror-compare-maintextrequired": "<var>$1slots</var>에 <kbd>main</kbd>이 포함되어 있다면 <var>$1text-main</var> 변수는 필수입니다. (메인 슬롯을 삭제할 수 없습니다)",
        "apierror-compare-notext": "<var>$1</var> 변수는 <var>$2</var> 없이 사용할 수 없습니다.",
        "apierror-emptynewsection": "비어있는 새 문단을 만들 수 없습니다.",
index 59553e9..59eb62c 100644 (file)
        "apierror-cantchangecontentmodel": "Немате дозвола за менување содржинскиот модел на страница.",
        "apierror-cantimport-upload": "Немате дозвола да увезувате подигнати страници.",
        "apierror-cantimport": "Немате дозвола за увезуваање страници.",
+       "apierror-cantview-deleted-comment": "Немате дозвола за прегледување на избришаните коментари.",
+       "apierror-cantview-deleted-description": "Немате дозвола за прегледување описи на избришаните податотеки.",
+       "apierror-cantview-deleted-metadata": "Немате дозвола за прегледување метаподатоци на избришаните податотеки.",
+       "apierror-cantview-deleted-revision-content": "Немате дозвола за прегледување содржина на избришаните преработки.",
        "apierror-copyuploadbaddomain": "Подигањето преку URL не е дозволено од овој домен.",
        "apierror-copyuploadbadurl": "Подигањето не е дозволено од оваа URL-адреса.",
        "apierror-emptynewsection": "Создавањето на нови празни поднаслови не е дозволено.",
index d8ff539..65a0913 100644 (file)
        "apierror-cantimport": "Nie masz uprawnień do importowania stron.",
        "apierror-cantsend": "Nie jesteś zalogowany, nie masz potwierdzonego adresu e-mail, albo nie masz prawa wysyłać e-maili do innych użytkowników, więc nie możesz wysłać wiadomości e-mail.",
        "apierror-cantundelete": "Nie można przywrócić: dana wersja nie istnieje albo została już przywrócona.",
+       "apierror-cantview-deleted-comment": "Nie masz uprawnień do podglądu usuniętych komentarzy.",
        "apierror-cantview-deleted-description": "Nie masz uprawnień do podglądu opisów usuniętych plików.",
        "apierror-cantview-deleted-metadata": "Nie masz uprawnień do podglądu metadanych usuniętych plików.",
+       "apierror-cantview-deleted-revision-content": "Nie masz uprawnień do podglądu treści usuniętych wersji.",
        "apierror-exceptioncaught": "[$1] Stwierdzono wyjątek: $2",
        "apierror-filedoesnotexist": "Plik nie istnieje.",
        "apierror-import-unknownerror": "Nieznany błąd podczas importowania: $1.",
index 6e2c1f1..77f927d 100644 (file)
        "apierror-cantoverwrite-sharedfile": "O arquivo de destino existe em um repositório compartilhado e você não tem permissão para substituí-lo.",
        "apierror-cantsend": "Você não está logado, não possui um endereço de e-mail confirmado ou não tem permissão para enviar e-mails para outros usuários, por isso não pode enviar e-mails.",
        "apierror-cantundelete": "Não foi possível recuperar arquivos: as revisões solicitadas podem não existir ou talvez já tenham sido eliminadas.",
+       "apierror-cantview-deleted-comment": "Você não tem permissão para visualizar comentários excluídos.",
+       "apierror-cantview-deleted-description": "Você não tem permissão para visualizar descrições de arquivos excluídos.",
+       "apierror-cantview-deleted-metadata": "Você não tem permissão para visualizar os metadados dos arquivos excluídos.",
+       "apierror-cantview-deleted-revision-content": "Você não tem permissão para visualizar o conteúdo das revisões excluídas.",
        "apierror-changeauth-norequest": "Falha ao criar pedido de mudança.",
        "apierror-chunk-too-small": "O tamanho mínimo do bloco é $1 {{PLURAL:$1|byte|bytes}} para os pedaços não finais.",
        "apierror-cidrtoobroad": "Os intervalos CIDR $1 maiores que /$2 não são aceitos.",
index b648443..25e7522 100644 (file)
        "apihelp-block-param-userid": "{{doc-apihelp-param|block|userid}}",
        "apihelp-block-param-expiry": "{{doc-apihelp-param|block|expiry}}\n{{doc-important|Do not translate \"5 months\", \"2 weeks\", \"infinite\", \"indefinite\" or \"never\"!}}",
        "apihelp-block-param-reason": "{{doc-apihelp-param|block|reason}}",
-       "apihelp-block-param-anononly": "{{doc-apihelp-param|block|anononly}}\n* See also {{msg-mw|ipb-hardblock}}",
+       "apihelp-block-param-anononly": "{{doc-apihelp-param|block|anononly}}\n\n* See also {{msg-mw|ipb-hardblock}}",
        "apihelp-block-param-nocreate": "{{doc-apihelp-param|block|nocreate}}\n* See also {{msg-mw|ipbcreateaccount}}",
        "apihelp-block-param-autoblock": "{{doc-singularthey}}\n{{doc-apihelp-param|block|autoblock}}\n* See also {{msg-mw|ipbenableautoblock}}",
-       "apihelp-block-param-noemail": "{{doc-apihelp-param|block|noemail}}\n* See also {{msg-mw|ipbemailban}}",
+       "apihelp-block-param-noemail": "{{doc-apihelp-param|block|noemail}}\n\n* See also {{msg-mw|ipbemailban}}",
        "apihelp-block-param-hidename": "{{doc-apihelp-param|block|hidename}}",
        "apihelp-block-param-allowusertalk": "{{doc-apihelp-param|block|allowusertalk}}\n* See also {{msg-mw|ipb-disableusertalk}}",
        "apihelp-block-param-reblock": "{{doc-apihelp-param|block|reblock}}",
index e27ebac..4c2f27e 100644 (file)
@@ -29,6 +29,7 @@ use MediaWiki\Config\ServiceOptions;
 use MediaWiki\Permissions\PermissionManager;
 use MediaWiki\User\UserIdentity;
 use MWCryptHash;
+use Psr\Log\LoggerInterface;
 use User;
 use WebRequest;
 use WebResponse;
@@ -41,16 +42,12 @@ use Wikimedia\IPSet;
  * @since 1.34 Refactored from User and Block.
  */
 class BlockManager {
-       // TODO: This should be UserIdentity instead of User
-       /** @var User */
-       private $currentUser;
-
-       /** @var WebRequest */
-       private $currentRequest;
-
        /** @var PermissionManager */
        private $permissionManager;
 
+       /** @var ServiceOptions */
+       private $options;
+
        /**
         * TODO Make this a const when HHVM support is dropped (T192166)
         *
@@ -69,23 +66,23 @@ class BlockManager {
                'SoftBlockRanges',
        ];
 
+       /** @var LoggerInterface */
+       private $logger;
+
        /**
         * @param ServiceOptions $options
-        * @param User $currentUser
-        * @param WebRequest $currentRequest
         * @param PermissionManager $permissionManager
+        * @param LoggerInterface $logger
         */
        public function __construct(
                ServiceOptions $options,
-               User $currentUser,
-               WebRequest $currentRequest,
-               PermissionManager $permissionManager
+               PermissionManager $permissionManager,
+               LoggerInterface $logger
        ) {
                $options->assertRequiredOptions( self::$constructorOptions );
                $this->options = $options;
-               $this->currentUser = $currentUser;
-               $this->currentRequest = $currentRequest;
                $this->permissionManager = $permissionManager;
+               $this->logger = $logger;
        }
 
        /**
@@ -93,51 +90,116 @@ class BlockManager {
         * return a composite block that combines the strictest features of the applicable
         * blocks.
         *
-        * TODO: $user should be UserIdentity instead of User
+        * Different blocks may be sought, depending on the user and their permissions. The
+        * user may be:
+        * (1) The global user (and can be affected by IP blocks). The global request object
+        * is needed for checking the IP address, the XFF header and the cookies.
+        * (2) The global user (and exempt from IP blocks). The global request object is
+        * needed for checking the cookies.
+        * (3) Another user (not the global user). No request object is available or needed;
+        * just look for a block against the user account.
+        *
+        * Cases #1 and #2 check whether the global user is blocked in practice; the block
+        * may due to their user account being blocked or to an IP address block or cookie
+        * block (or multiple of these). Case #3 simply checks whether a user's account is
+        * blocked, and does not determine whether the person using that account is affected
+        * in practice by any IP address or cookie blocks.
         *
         * @internal This should only be called by User::getBlockedStatus
         * @param User $user
+        * @param WebRequest|null $request The global request object if the user is the
+        *  global user (cases #1 and #2), otherwise null (case #3). The IP address and
+        *  information from the request header are needed to find some types of blocks.
         * @param bool $fromReplica Whether to check the replica DB first.
         *  To improve performance, non-critical checks are done against replica DBs.
         *  Check when actually saving should be done against master.
         * @return AbstractBlock|null The most relevant block, or null if there is no block.
         */
-       public function getUserBlock( User $user, $fromReplica ) {
-               $isAnon = $user->getId() === 0;
+       public function getUserBlock( User $user, $request, $fromReplica ) {
                $fromMaster = !$fromReplica;
+               $ip = null;
 
-               // TODO: If $user is the current user, we should use the current request. Otherwise,
-               // we should not look for XFF or cookie blocks.
-               $request = $user->getRequest();
+               // If this is the global user, they may be affected by IP blocks (case #1),
+               // or they may be exempt (case #2). If affected, look for additional blocks
+               // against the IP address.
+               $checkIpBlocks = $request &&
+                       !$this->permissionManager->userHasRight( $user, 'ipblock-exempt' );
 
-               # We only need to worry about passing the IP address to the block generator if the
-               # user is not immune to autoblocks/hardblocks, and they are the current user so we
-               # know which IP address they're actually coming from
-               $ip = null;
-               $sessionUser = $this->currentUser;
-               // the session user is set up towards the end of Setup.php. Until then,
-               // assume it's a logged-out user.
-               $globalUserName = $sessionUser->isSafeToLoad()
-                       ? $sessionUser->getName()
-                       : IP::sanitizeIP( $this->currentRequest->getIP() );
-               if ( $user->getName() === $globalUserName &&
-                        !$this->permissionManager->userHasRight( $user, 'ipblock-exempt' ) ) {
-                       $ip = $this->currentRequest->getIP();
+               if ( $request && $checkIpBlocks ) {
+
+                       // Case #1: checking the global user, including IP blocks
+                       $ip = $request->getIP();
+                       // TODO: remove dependency on DatabaseBlock (T221075)
+                       $blocks = DatabaseBlock::newListFromTarget( $user, $ip, $fromMaster );
+                       $this->getAdditionalIpBlocks( $blocks, $request, !$user->isRegistered(), $fromMaster );
+                       $this->getCookieBlock( $blocks, $user, $request );
+
+               } elseif ( $request ) {
+
+                       // Case #2: checking the global user, but they are exempt from IP blocks
+                       // TODO: remove dependency on DatabaseBlock (T221075)
+                       $blocks = DatabaseBlock::newListFromTarget( $user, null, $fromMaster );
+                       $this->getCookieBlock( $blocks, $user, $request );
+
+               } else {
+
+                       // Case #3: checking whether a user's account is blocked
+                       // TODO: remove dependency on DatabaseBlock (T221075)
+                       $blocks = DatabaseBlock::newListFromTarget( $user, null, $fromMaster );
+
+               }
+
+               // Filter out any duplicated blocks, e.g. from the cookie
+               $blocks = $this->getUniqueBlocks( $blocks );
+
+               $block = null;
+               if ( count( $blocks ) > 0 ) {
+                       if ( count( $blocks ) === 1 ) {
+                               $block = $blocks[ 0 ];
+                       } else {
+                               $block = new CompositeBlock( [
+                                       'address' => $ip,
+                                       'byText' => 'MediaWiki default',
+                                       'reason' => wfMessage( 'blockedtext-composite-reason' )->plain(),
+                                       'originalBlocks' => $blocks,
+                               ] );
+                       }
                }
 
-               // User/IP blocking
-               // After this, $blocks is an array of blocks or an empty array
-               // TODO: remove dependency on DatabaseBlock
-               $blocks = DatabaseBlock::newListFromTarget( $user, $ip, $fromMaster );
+               Hooks::run( 'GetUserBlock', [ clone $user, $ip, &$block ] );
+
+               return $block;
+       }
 
-               // Cookie blocking
+       /**
+        * Get the cookie block, if there is one.
+        *
+        * @param AbstractBlock[] &$blocks
+        * @param UserIdentity $user
+        * @param WebRequest $request
+        * @return void
+        */
+       private function getCookieBlock( &$blocks, UserIdentity $user, WebRequest $request ) {
                $cookieBlock = $this->getBlockFromCookieValue( $user, $request );
-               if ( $cookieBlock instanceof AbstractBlock ) {
+               if ( $cookieBlock instanceof DatabaseBlock ) {
                        $blocks[] = $cookieBlock;
                }
+       }
+
+       /**
+        * Check for any additional blocks against the IP address or any IPs in the XFF header.
+        *
+        * @param AbstractBlock[] &$blocks Blocks found so far
+        * @param WebRequest $request
+        * @param bool $isAnon The user is logged out
+        * @param bool $fromMaster
+        * @return void
+        */
+       private function getAdditionalIpBlocks( &$blocks, WebRequest $request, $isAnon, $fromMaster ) {
+               $ip = $request->getIP();
 
                // Proxy blocking
-               if ( $ip !== null && !in_array( $ip, $this->options->get( 'ProxyWhitelist' ) ) ) {
+               if ( !in_array( $ip, $this->options->get( 'ProxyWhitelist' ) ) ) {
                        // Local list
                        if ( $this->isLocallyBlockedProxy( $ip ) ) {
                                $blocks[] = new SystemBlock( [
@@ -156,24 +218,8 @@ class BlockManager {
                        }
                }
 
-               // (T25343) Apply IP blocks to the contents of XFF headers, if enabled
-               if ( $this->options->get( 'ApplyIpBlocksToXff' )
-                       && $ip !== null
-                       && !in_array( $ip, $this->options->get( 'ProxyWhitelist' ) )
-               ) {
-                       $xff = $request->getHeader( 'X-Forwarded-For' );
-                       $xff = array_map( 'trim', explode( ',', $xff ) );
-                       $xff = array_diff( $xff, [ $ip ] );
-                       // TODO: remove dependency on DatabaseBlock
-                       $xffblocks = DatabaseBlock::getBlocksForIPList( $xff, $isAnon, $fromMaster );
-                       $blocks = array_merge( $blocks, $xffblocks );
-               }
-
                // Soft blocking
-               if ( $ip !== null
-                       && $isAnon
-                       && IP::isInRanges( $ip, $this->options->get( 'SoftBlockRanges' ) )
-               ) {
+               if ( $isAnon && IP::isInRanges( $ip, $this->options->get( 'SoftBlockRanges' ) ) ) {
                        $blocks[] = new SystemBlock( [
                                'address' => $ip,
                                'byText' => 'MediaWiki default',
@@ -183,26 +229,17 @@ class BlockManager {
                        ] );
                }
 
-               // Filter out any duplicated blocks, e.g. from the cookie
-               $blocks = $this->getUniqueBlocks( $blocks );
-
-               $block = null;
-               if ( count( $blocks ) > 0 ) {
-                       if ( count( $blocks ) === 1 ) {
-                               $block = $blocks[ 0 ];
-                       } else {
-                               $block = new CompositeBlock( [
-                                       'address' => $ip,
-                                       'byText' => 'MediaWiki default',
-                                       'reason' => wfMessage( 'blockedtext-composite-reason' )->plain(),
-                                       'originalBlocks' => $blocks,
-                               ] );
-                       }
+               // (T25343) Apply IP blocks to the contents of XFF headers, if enabled
+               if ( $this->options->get( 'ApplyIpBlocksToXff' )
+                       && !in_array( $ip, $this->options->get( 'ProxyWhitelist' ) )
+               ) {
+                       $xff = $request->getHeader( 'X-Forwarded-For' );
+                       $xff = array_map( 'trim', explode( ',', $xff ) );
+                       $xff = array_diff( $xff, [ $ip ] );
+                       // TODO: remove dependency on DatabaseBlock (T221075)
+                       $xffblocks = DatabaseBlock::getBlocksForIPList( $xff, $isAnon, $fromMaster );
+                       $blocks = array_merge( $blocks, $xffblocks );
                }
-
-               Hooks::run( 'GetUserBlock', [ clone $user, $ip, &$block ] );
-
-               return $block;
        }
 
        /**
@@ -255,7 +292,7 @@ class BlockManager {
 
                $blockCookieId = $this->getIdFromCookieValue( $cookieValue );
                if ( !is_null( $blockCookieId ) ) {
-                       // TODO: remove dependency on DatabaseBlock
+                       // TODO: remove dependency on DatabaseBlock (T221075)
                        $block = DatabaseBlock::newFromID( $blockCookieId );
                        if (
                                $block instanceof DatabaseBlock &&
@@ -368,15 +405,14 @@ class BlockManager {
                                $ipList = $this->checkHost( $hostname );
 
                                if ( $ipList ) {
-                                       wfDebugLog(
-                                               'dnsblacklist',
+                                       $this->logger->info(
                                                "Hostname $hostname is {$ipList[0]}, it's a proxy says $basename!"
                                        );
                                        $found = true;
                                        break;
                                }
 
-                               wfDebugLog( 'dnsblacklist', "Requested $hostname, not found in $basename." );
+                               $this->logger->debug( "Requested $hostname, not found in $basename." );
                        }
                }
 
index 2ef9c9f..5a7f45e 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\MediaWikiServices;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Helper class for category membership changes
@@ -273,11 +274,15 @@ class CategoryMembershipChange {
         * @return null|string
         */
        private function getPreviousRevisionTimestamp() {
-               $previousRev = Revision::newFromId(
-                               $this->pageTitle->getPreviousRevisionID( $this->pageTitle->getLatestRevID() )
-                       );
-
-               return $previousRev ? $previousRev->getTimestamp() : null;
+               $rl = MediaWikiServices::getInstance()->getRevisionLookup();
+               $latestRev = $rl->getRevisionByTitle( $this->pageTitle );
+               if ( $latestRev ) {
+                       $previousRev = $rl->getPreviousRevision( $latestRev );
+                       if ( $previousRev ) {
+                               return $previousRev->getTimestamp();
+                       }
+               }
+               return null;
        }
 
 }
index 79092ee..e60cc09 100644 (file)
@@ -21,7 +21,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Feed to Special:RecentChanges and Special:RecentChangesLinked.
index a48e191..fbcbc35 100644 (file)
@@ -23,7 +23,7 @@
  */
 use MediaWiki\Linker\LinkRenderer;
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\Rdbms\IResultWrapper;
 
 class ChangesList extends ContextSource {
index e461762..d2c4dd4 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Generates a list of changes using an Enhanced system (uses javascript).
index d448eae..83720d3 100644 (file)
@@ -20,7 +20,7 @@
  * @file
  */
 use MediaWiki\Linker\LinkRenderer;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 class RCCacheEntryFactory {
 
@@ -56,7 +56,6 @@ class RCCacheEntryFactory {
         */
        public function newFromRecentChange( RecentChange $baseRC, $watched ) {
                $user = $this->context->getUser();
-               $counter = $baseRC->counter;
 
                $cacheEntry = RCCacheEntry::newFromParent( $baseRC );
 
@@ -73,8 +72,8 @@ class RCCacheEntryFactory {
                // called too many times (50% of CPU time on RecentChanges!).
                $showDiffLinks = $this->showDiffLinks( $cacheEntry, $user );
 
-               $cacheEntry->difflink = $this->buildDiffLink( $cacheEntry, $showDiffLinks, $counter );
-               $cacheEntry->curlink = $this->buildCurLink( $cacheEntry, $showDiffLinks, $counter );
+               $cacheEntry->difflink = $this->buildDiffLink( $cacheEntry, $showDiffLinks );
+               $cacheEntry->curlink = $this->buildCurLink( $cacheEntry, $showDiffLinks );
                $cacheEntry->lastlink = $this->buildLastLink( $cacheEntry, $showDiffLinks );
 
                // Make user links
@@ -109,11 +108,11 @@ class RCCacheEntryFactory {
        }
 
        /**
-        * @param RecentChange $cacheEntry
+        * @param RCCacheEntry $cacheEntry
         *
         * @return string
         */
-       private function buildCLink( RecentChange $cacheEntry ) {
+       private function buildCLink( RCCacheEntry $cacheEntry ) {
                $type = $cacheEntry->mAttribs['rc_type'];
 
                // New unpatrolled pages
@@ -182,11 +181,10 @@ class RCCacheEntryFactory {
        /**
         * @param RecentChange $cacheEntry
         * @param bool $showDiffLinks
-        * @param int $counter
         *
         * @return string
         */
-       private function buildCurLink( RecentChange $cacheEntry, $showDiffLinks, $counter ) {
+       private function buildCurLink( RecentChange $cacheEntry, $showDiffLinks ) {
                $queryParams = $this->buildCurQueryParams( $cacheEntry );
                $curMessage = $this->getMessage( 'cur' );
                $logTypes = [ RC_LOG ];
@@ -217,11 +215,10 @@ class RCCacheEntryFactory {
        /**
         * @param RecentChange $cacheEntry
         * @param bool $showDiffLinks
-        * @param int $counter
         *
         * @return string
         */
-       private function buildDiffLink( RecentChange $cacheEntry, $showDiffLinks, $counter ) {
+       private function buildDiffLink( RecentChange $cacheEntry, $showDiffLinks ) {
                $queryParams = $this->buildDiffQueryParams( $cacheEntry );
                $diffMessage = $this->getMessage( 'diff' );
                $logTypes = [ RC_NEW, RC_LOG ];
index 1827aab..ce82b71 100644 (file)
@@ -20,7 +20,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Item class for a logging table row with its associated change tags.
index 6b5482c..dffe6e1 100644 (file)
@@ -191,11 +191,11 @@ class SquidPurgeClient {
        /**
         * Queue a purge operation
         *
-        * @param string $url
+        * @param string $url Fully expanded URL (with host and protocol)
         */
        public function queuePurge( $url ) {
                global $wgSquidPurgeUseHostHeader;
-               $url = CdnCacheUpdate::expand( str_replace( "\n", '', $url ) );
+               $url = str_replace( "\n", '', $url ); // sanity
                $request = [];
                if ( $wgSquidPurgeUseHostHeader ) {
                        $url = wfParseUrl( $url );
index 170d5c2..8f4f058 100644 (file)
@@ -45,6 +45,9 @@ class CustomUppercaseCollation extends NumericUppercaseCollation {
        /** @var array $puaSubset List of private use area codes */
        private $puaSubset;
 
+       /** @var array */
+       private $firstLetters;
+
        /**
         * @note This assumes $alphabet does not contain U+F3000-U+F3FFF
         *
index 9fbb72c..533f639 100644 (file)
@@ -26,7 +26,7 @@
  * @author Daniel Kinzler
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\Assert\Assert;
 use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\MediaWikiServices;
index a48faf1..56fc0b3 100644 (file)
@@ -10,6 +10,9 @@ use Psr\Log\AbstractLogger;
  * goal.
  */
 class ConsoleLogger extends AbstractLogger {
+       /** @var string */
+       private $channel;
+
        /**
         * @param string $channel
         */
index ddffaa3..b983e97 100644 (file)
@@ -24,12 +24,12 @@ use Wikimedia\Assert\Assert;
 use MediaWiki\MediaWikiServices;
 
 /**
- * Handles purging appropriate CDN URLs given a title (or titles)
+ * Handles purging the appropriate CDN objects given a list of URLs or Title instances
  * @ingroup Cache
  */
 class CdnCacheUpdate implements DeferrableUpdate, MergeableUpdate {
        /** @var string[] Collection of URLs to purge */
-       protected $urls = [];
+       private $urls = [];
 
        /**
         * @param string[] $urlArr Collection of URLs to purge
@@ -99,10 +99,9 @@ class CdnCacheUpdate implements DeferrableUpdate, MergeableUpdate {
                wfDebugLog( 'squid', __METHOD__ . ': ' . implode( ' ', $urlArr ) );
 
                // Reliably broadcast the purge to all edge nodes
-               $relayer = MediaWikiServices::getInstance()->getEventRelayerGroup()
-                                       ->getRelayer( 'cdn-url-purges' );
                $ts = microtime( true );
-               $relayer->notifyMulti(
+               $relayerGroup = MediaWikiServices::getInstance()->getEventRelayerGroup();
+               $relayerGroup->getRelayer( 'cdn-url-purges' )->notifyMulti(
                        'cdn-url-purges',
                        array_map(
                                function ( $url ) use ( $ts ) {
@@ -138,7 +137,7 @@ class CdnCacheUpdate implements DeferrableUpdate, MergeableUpdate {
                                foreach ( $chunks as $chunk ) {
                                        $client = new SquidPurgeClient( $server );
                                        foreach ( $chunk as $url ) {
-                                               $client->queuePurge( $url );
+                                               $client->queuePurge( self::expand( $url ) );
                                        }
                                        $pool->addClient( $client );
                                }
@@ -255,7 +254,7 @@ class CdnCacheUpdate implements DeferrableUpdate, MergeableUpdate {
         * @param string $url
         * @return string
         */
-       public static function expand( $url ) {
+       private static function expand( $url ) {
                return wfExpandUrl( $url, PROTO_INTERNAL );
        }
 
index 29846bf..9e45241 100644 (file)
  */
 
 /**
- * Class to invalidate the HTML cache of all the pages linking to a given title.
+ * Class to invalidate the HTML/file cache of all the pages linking to a given title
  *
  * @ingroup Cache
  */
 class HTMLCacheUpdate extends DataUpdate {
        /** @var Title */
-       public $mTitle;
-
+       private $title;
        /** @var string */
-       public $mTable;
+       private $table;
 
        /**
         * @param Title $titleTo
@@ -42,16 +41,16 @@ class HTMLCacheUpdate extends DataUpdate {
        function __construct(
                Title $titleTo, $table, $causeAction = 'unknown', $causeAgent = 'unknown'
        ) {
-               $this->mTitle = $titleTo;
-               $this->mTable = $table;
+               $this->title = $titleTo;
+               $this->table = $table;
                $this->causeAction = $causeAction;
                $this->causeAgent = $causeAgent;
        }
 
        public function doUpdate() {
                $job = HTMLCacheUpdateJob::newForBacklinks(
-                       $this->mTitle,
-                       $this->mTable,
+                       $this->title,
+                       $this->table,
                        [ 'causeAction' => $this->getCauseAction(), 'causeAgent' => $this->getCauseAgent() ]
                );
 
index 8345ee6..2bfdc0e 100644 (file)
@@ -1066,6 +1066,7 @@ class LinksUpdate extends DataUpdate {
        private function invalidateProperties( $changed ) {
                global $wgPagePropLinkInvalidations;
 
+               $jobs = [];
                foreach ( $changed as $name => $value ) {
                        if ( isset( $wgPagePropLinkInvalidations[$name] ) ) {
                                $inv = $wgPagePropLinkInvalidations[$name];
@@ -1073,12 +1074,16 @@ class LinksUpdate extends DataUpdate {
                                        $inv = [ $inv ];
                                }
                                foreach ( $inv as $table ) {
-                                       DeferredUpdates::addUpdate(
-                                               new HTMLCacheUpdate( $this->mTitle, $table, 'page-props' )
+                                       $jobs[] = HTMLCacheUpdateJob::newForBacklinks(
+                                               $this->mTitle,
+                                               $table,
+                                               [ 'causeAction' => 'page-props' ]
                                        );
                                }
                        }
                }
+
+               JobQueueGroup::singleton()->lazyPush( $jobs );
        }
 
        /**
@@ -1192,4 +1197,14 @@ class LinksUpdate extends DataUpdate {
 
                return $this->db;
        }
+
+       /**
+        * Whether or not this LinksUpdate will also update pages which transclude the
+        * current page or otherwise depend on it.
+        *
+        * @return bool
+        */
+       public function isRecursive() {
+               return $this->mRecursive;
+       }
 }
index a508746..84f6fc0 100644 (file)
@@ -50,7 +50,7 @@ class SearchUpdate implements DeferrableUpdate {
         */
        public function __construct( $id, $title, $c = null ) {
                if ( is_string( $title ) ) {
-                       wfDeprecated( __METHOD__ . " with a string for the title", 1.34 );
+                       wfDeprecated( __METHOD__ . " with a string for the title", '1.34' );
                        $this->title = Title::newFromText( $title );
                        if ( $this->title === null ) {
                                throw new InvalidArgumentException( "Cannot construct the title: $title" );
@@ -62,10 +62,10 @@ class SearchUpdate implements DeferrableUpdate {
                $this->id = $id;
                // is_string() check is back-compat for ApprovedRevs
                if ( is_string( $c ) ) {
-                       wfDeprecated( __METHOD__ . " with a string for the content", 1.34 );
+                       wfDeprecated( __METHOD__ . " with a string for the content", '1.34' );
                        $c = new TextContent( $c );
                } elseif ( is_bool( $c ) ) {
-                       wfDeprecated( __METHOD__ . " with a boolean for the content", 1.34 );
+                       wfDeprecated( __METHOD__ . " with a boolean for the content", '1.34' );
                        $c = null;
                }
                $this->content = $c;
index 8a5caa2..7e4e53e 100644 (file)
@@ -1713,14 +1713,29 @@ class DifferenceEngine extends ContextSource {
         *     false signifies that there is no previous/next revision ($old is the oldest/newest one).
         */
        public function mapDiffPrevNext( $old, $new ) {
+               $rl = MediaWikiServices::getInstance()->getRevisionLookup();
                if ( $new === 'prev' ) {
                        // Show diff between revision $old and the previous one. Get previous one from DB.
                        $newid = intval( $old );
-                       $oldid = $this->getTitle()->getPreviousRevisionID( $newid );
+                       $oldid = false;
+                       $newRev = $rl->getRevisionById( $newid );
+                       if ( $newRev ) {
+                               $oldRev = $rl->getPreviousRevision( $newRev );
+                               if ( $oldRev ) {
+                                       $oldid = $oldRev->getId();
+                               }
+                       }
                } elseif ( $new === 'next' ) {
                        // Show diff between revision $old and the next one. Get next one from DB.
                        $oldid = intval( $old );
-                       $newid = $this->getTitle()->getNextRevisionID( $oldid );
+                       $newid = false;
+                       $oldRev = $rl->getRevisionById( $oldid );
+                       if ( $oldRev ) {
+                               $newRev = $rl->getNextRevision( $oldRev );
+                               if ( $newRev ) {
+                                       $newid = $newRev->getId();
+                               }
+                       }
                } else {
                        $oldid = intval( $old );
                        $newid = intval( $new );
index 92118fe..2f5b3dc 100644 (file)
  * @ingroup Dump
  */
 class DumpMultiWriter {
+       /** @var array */
+       private $sinks;
+       /** @var int */
+       private $count;
 
        /**
         * @param array $sinks
index ec0b344..fd200d1 100644 (file)
@@ -28,8 +28,9 @@
  */
 
 use MediaWiki\MediaWikiServices as MediaWikiServicesAlias;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\Rdbms\IResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * @ingroup SpecialPage Dump
@@ -67,7 +68,7 @@ class WikiExporter {
        /** @var XmlDumpWriter */
        private $writer;
 
-       /** @var Database */
+       /** @var IDatabase */
        protected $db;
 
        /** @var array|int */
@@ -86,7 +87,7 @@ class WikiExporter {
        }
 
        /**
-        * @param Database $db
+        * @param IDatabase $db
         * @param int|array $history One of WikiExporter::FULL, WikiExporter::CURRENT,
         *   WikiExporter::RANGE or WikiExporter::STABLE, or an associative array:
         *   - offset: non-inclusive offset at which to start the query
@@ -303,29 +304,36 @@ class WikiExporter {
                if ( $cond ) {
                        $where[] = $cond;
                }
-               # Get logging table name for logging.* clause
-               $logging = $this->db->tableName( 'logging' );
-
                $result = null; // Assuring $result is not undefined, if exception occurs early
 
                $commentQuery = CommentStore::getStore()->getJoin( 'log_comment' );
                $actorQuery = ActorMigration::newMigration()->getJoin( 'log_user' );
 
+               $tables = array_merge(
+                       [ 'logging' ], $commentQuery['tables'], $actorQuery['tables'], [ 'user' ]
+               );
+               $fields = [
+                       'log_id', 'log_type', 'log_action', 'log_timestamp', 'log_namespace',
+                       'log_title', 'log_params', 'log_deleted', 'user_name'
+               ] + $commentQuery['fields'] + $actorQuery['fields'];
+               $options = [
+                       'ORDER BY' => 'log_id',
+                       'USE INDEX' => [ 'logging' => 'PRIMARY' ],
+                       'LIMIT' => self::BATCH_SIZE,
+               ];
+               $joins = [
+                       'user' => [ 'JOIN', 'user_id = ' . $actorQuery['fields']['log_user'] ]
+               ] + $commentQuery['joins'] + $actorQuery['joins'];
+
                $lastLogId = 0;
                while ( true ) {
                        $result = $this->db->select(
-                               array_merge( [ 'logging' ], $commentQuery['tables'], $actorQuery['tables'], [ 'user' ] ),
-                               [ "{$logging}.*", 'user_name' ] + $commentQuery['fields'] + $actorQuery['fields'],
+                               $tables,
+                               $fields,
                                array_merge( $where, [ 'log_id > ' . intval( $lastLogId ) ] ),
                                __METHOD__,
-                               [
-                                       'ORDER BY' => 'log_id',
-                                       'USE INDEX' => [ 'logging' => 'PRIMARY' ],
-                                       'LIMIT' => self::BATCH_SIZE,
-                               ],
-                               [
-                                       'user' => [ 'JOIN', 'user_id = ' . $actorQuery['fields']['log_user'] ]
-                               ] + $commentQuery['joins'] + $actorQuery['joins']
+                               $options,
+                               $joins
                        );
 
                        if ( !$result->numRows() ) {
index 42e78ff..ff8f056 100644 (file)
@@ -142,6 +142,12 @@ class FileRepo {
        /** @var WANObjectCache */
        protected $wanCache;
 
+       /**
+        * @var string
+        * @protected Use $this->getName(). Public for back-compat only
+        */
+       public $name;
+
        /**
         * @param array|null $info
         * @throws MWException
index 17fa146..b4fd176 100644 (file)
@@ -94,6 +94,9 @@ class ArchivedFile {
        /** @var Title */
        protected $title; # image title
 
+       /** @var bool */
+       private $exists;
+
        /**
         * @throws MWException
         * @param Title $title
index 0d5776b..60d4e29 100644 (file)
@@ -1467,13 +1467,15 @@ abstract class File implements IDBAccessObject {
                // Delete thumbnails and refresh file metadata cache
                $this->purgeCache();
                $this->purgeDescription();
-
                // Purge cache of all pages using this file
                $title = $this->getTitle();
                if ( $title ) {
-                       DeferredUpdates::addUpdate(
-                               new HTMLCacheUpdate( $title, 'imagelinks', 'file-purge' )
+                       $job = HTMLCacheUpdateJob::newForBacklinks(
+                               $title,
+                               'imagelinks',
+                               [ 'causeAction' => 'file-purge' ]
                        );
+                       JobQueueGroup::singleton()->lazyPush( $job );
                }
        }
 
index 85988f6..f363beb 100644 (file)
@@ -22,7 +22,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Helper class for file deletion
index 21980b9..0cdc2d5 100644 (file)
@@ -46,6 +46,24 @@ class LocalFileMoveBatch {
        /** @var IDatabase */
        protected $db;
 
+       /** @var string */
+       protected $oldHash;
+
+       /** @var string */
+       protected $newHash;
+
+       /** @var string */
+       protected $oldName;
+
+       /** @var string */
+       protected $newName;
+
+       /** @var string */
+       protected $oldRel;
+
+       /** @var string */
+       protected $newRel;
+
        /**
         * @param File $file
         * @param Title $target
index c6d8ddf..4781a48 100644 (file)
@@ -88,6 +88,15 @@ abstract class ImageGalleryBase extends ContextSource {
        /** @var array */
        protected $mAttribs = [];
 
+       /** @var int */
+       protected $mPerRow;
+
+       /** @var int */
+       protected $mWidths;
+
+       /** @var int */
+       protected $mHeights;
+
        /** @var array */
        private static $modeMapping;
 
index 6e760fa..a5d7145 100644 (file)
@@ -149,6 +149,5 @@ if ( false ) {
        // autoload entries for the lowercase variants of these classes (T166759).
        // The code below is never executed, but it is picked up by the AutoloadGenerator
        // parser, which scans for class_alias() calls.
-       // @phan-suppress-next-line PhanRedefineClassAlias
        class_alias( ConcatenatedGzipHistoryBlob::class, 'concatenatedgziphistoryblob' );
 }
index cd2a935..8858c8d 100644 (file)
@@ -69,6 +69,5 @@ if ( false ) {
        // autoload entries for the lowercase variants of these classes (T166759).
        // The code below is never executed, but it is picked up by the AutoloadGenerator
        // parser, which scans for class_alias() calls.
-       // @phan-suppress-next-line PhanRedefineClassAlias
        class_alias( HistoryBlobCurStub::class, 'historyblobcurstub' );
 }
index c92e1b5..9a4df1f 100644 (file)
@@ -149,6 +149,5 @@ if ( false ) {
        // autoload entries for the lowercase variants of these classes (T166759).
        // The code below is never executed, but it is picked up by the AutoloadGenerator
        // parser, which scans for class_alias() calls.
-       // @phan-suppress-next-line PhanRedefineClassAlias
        class_alias( HistoryBlobStub::class, 'historyblobstub' );
 }
index 048abbb..b55b652 100644 (file)
@@ -657,6 +657,7 @@ abstract class HTMLFormField {
         * @param OOUI\Widget $inputField
         * @param array $config
         * @return OOUI\FieldLayout|OOUI\ActionFieldLayout
+        * @suppress PhanUndeclaredProperty Only some subclasses declare mClassWithButton
         */
        protected function getFieldLayoutOOUI( $inputField, $config ) {
                if ( isset( $this->mClassWithButton ) ) {
index 354432b..05ab0bb 100644 (file)
@@ -11,6 +11,9 @@
  * @todo FIXME: If made 'required', only the text field should be compulsory.
  */
 class HTMLSelectAndOtherField extends HTMLSelectField {
+       /** @var string[] */
+       private $mFlatOptions;
+
        public function __construct( $params ) {
                if ( array_key_exists( 'other', $params ) ) {
                        // Do nothing
index a4120a3..13ab9b7 100644 (file)
@@ -29,6 +29,7 @@ use GuzzleHttp\Psr7\StreamDecoratorTrait;
  *
  * @private for use by GuzzleHttpRequest only
  * @since 1.33
+ * @property StreamInterface $stream Defined in StreamDecoratorTrait via @property, not read by phan
  */
 class MWCallbackStream implements StreamInterface {
        use StreamDecoratorTrait;
index 2f8f5dd..81e414e 100644 (file)
@@ -30,6 +30,9 @@ use MediaWiki\MediaWikiServices;
  * @ingroup SpecialPage
  */
 class ImportStreamSource implements ImportSource {
+       /** @var resource */
+       private $mHandle;
+
        /**
         * @param resource $handle
         */
index fdd1f77..b75ea1a 100644 (file)
  * @ingroup SpecialPage
  */
 class ImportStringSource implements ImportSource {
+       /** @var string */
+       private $mString;
+
+       /** @var bool */
+       private $mRead;
+
        /**
         * @param string $string
         */
index 0d1cc68..6eba4f3 100644 (file)
@@ -33,7 +33,8 @@ use MediaWiki\MediaWikiServices;
  * @ingroup SpecialPage
  */
 class WikiImporter {
-       private $reader = null;
+       /** @var XMLReader */
+       private $reader;
        private $foreignNamespaces = null;
        private $mLogItemCallback, $mUploadCallback, $mRevisionCallback, $mPageCallback;
        private $mSiteInfoCallback, $mPageOutCallback;
index 08cfd86..eb96e05 100644 (file)
@@ -21,6 +21,9 @@
  */
 
 class InstallDocFormatter {
+       /** @var string */
+       private $text;
+
        public static function format( $text ) {
                $obj = new self( $text );
 
index a2179c6..6921361 100644 (file)
@@ -30,6 +30,7 @@
 class LocalSettingsGenerator {
 
        protected $extensions = [];
+       protected $skins = [];
        protected $values = [];
        protected $groupPermissions = [];
        protected $dbSettings = '';
index 64c017b..ea88411 100644 (file)
@@ -29,7 +29,7 @@ use MediaWiki\MediaWikiServices;
  *
  * @ingroup Deployment
  * @since 1.17
- * @property DatabaseMysqlBase $db
+ * @property Wikimedia\Rdbms\DatabaseMysqlBase $db
  */
 class MysqlUpdater extends DatabaseUpdater {
        protected function getCoreUpdateList() {
index 9a3d4a3..e9b0c56 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use Wikimedia\Rdbms\Database;
+use Wikimedia\Rdbms\DatabasePostgres;
 use Wikimedia\Rdbms\DBQueryError;
 use Wikimedia\Rdbms\DBConnectionError;
 
index 168c937..dfea0a5 100644 (file)
@@ -7,7 +7,8 @@
                        "Zedlik",
                        "아라",
                        "Red Winged Duck",
-                       "Macofe"
+                       "Macofe",
+                       "Renessaince"
                ]
        },
        "config-desc": "Праграма ўсталяваньня MediaWiki",
@@ -85,7 +86,7 @@
        "config-uploads-not-safe": "'''Папярэджаньне:''' дырэкторыя для загрузак па змоўчваньні <code>$1</code> уразьлівая да выкананьня адвольнага коду.\nХоць MediaWiki і правярае ўсе файлы перад захаваньнем, вельмі рэкамэндуецца [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security закрыць гэтую ўразьлівасьць] перад уключэньнем магчымасьці загрузкі файлаў.",
        "config-no-cli-uploads-check": "'''Папярэджаньне:''' Вашая дырэкторыя для загрузак па змоўчваньні (<code>$1</code>), не правераная на ўразьлівасьць да выкананьня адвольных скрыптоў падчас усталяваньня CLI.\n.",
        "config-brokenlibxml": "У Вашай сыстэме ўсталяваныя PHP і libxml2 зь несумяшчальнымі вэрсіямі, што можа прывесьці да пашкоджаньня зьвестак MediaWiki і іншых вэб-дастасаваньняў.\nАбнавіце libxml2 да вэрсіі 2.7.3 ці больш позьняй ([https://bugs.php.net/bug.php?id=45996 паведамленьне пра памылку на сайце PHP]).\nУсталяваньне перарванае.",
-       "config-suhosin-max-value-length": "Suhosin усталяваны і абмяжоўвае <code>даўжыню</code> парамэтру GET да $1 {{PLURAL:$1|1=байта|байтаў}}.\nResourceLoader, складнік MediaWiki, будзе абходзіць гэтае абмежаваньне, што адаб’ецца на прадукцыйнасьці.\nКалі магчыма, варта ўсталяваць у <code>php.ini</code> значэньне <code>suhosin.get.max_value_length</code> роўным 1024 ці больш, а таксама вызначыць тое ж значэньне для <code>$wgResourceLoaderMaxQueryLength</code> у <code>LocalSettings.php</code>.",
+       "config-suhosin-max-value-length": "Suhosin усталяваны і абмяжоўвае <code>даўжыню</code> парамэтру GET да $1 {{PLURAL:$1|1=байта|байтаў}}.\nMediaWiki патрабуе, каб <code>suhosin.get.max_value_length</code> складаў прынамсі $2. Адключыце гэтую наладу ці павялічце гэтае значэньня да $3 ў <code>php.ini</code>.",
        "config-using-32bit": "<strong>Папярэджаньне:</strong> падобна, што вашая сыстэма выкарыстоўвае 32-бітавыя цэлыя лікі. Гэта [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:32-bit не рэкамэндуецца].",
        "config-db-type": "Тып базы зьвестак:",
        "config-db-host": "Хост базы зьвестак:",
index 74d8895..3ce3fe2 100644 (file)
@@ -12,6 +12,7 @@
        "config-localsettings-upgrade": "L'arkivo <code>LocalSettings.php</code> trovesis.\nPor plubonigar l'instaluro, voluntez informar la valoro dil  <code>$wgUpgradeKey</code> en l'infra buxo.\nVu trovos ol en <code>LocalSettings.php</code>.",
        "config-session-error": "Eroro dum komenco di seciono: $1",
        "config-session-expired": "Vua sesiono probable finis.\nSesioni programesis por durar $1\nVu povas augmentar to per modifiko di <code>session.gc_maxlifetime</code> en php.ini.\nRikomencez l'instalo-procedo.",
+       "config-no-session": "La dati pri vua sesiono desaparis!\nVerifikez vua arkivo php.ini e certigez su pri <code>session.save_path</code> indikas la korekta libro di adresaro.",
        "config-your-language": "Vua idiomo:",
        "config-your-language-help": "Selektez l'idiomo por uzar dum l'instalo-procedo.",
        "config-wiki-language": "Wiki linguo:",
        "config-help-restart": "Ka vu deziras efacar omna dati qui vu sparis, e rikomencar la procedi pri instalo?",
        "config-restart": "Yes, rikomencez ol",
        "config-welcome-section-copyright": "=== Autoroyuro e termini ===\n\n$1\n\nCa informatikoprogramo esas libera; vu povas ridistributar ol e/o modifikar ol segun la termini de la Generala Licenco Publika GNU, quale stipulata da Free Software Foundation; segun lua versiono 2 o sequanta.\n\nNi expektas ke ca programo esas utila, kande ni distributas ol. <strong>Tamen, ni ne povas grantar ke ol fakte esos utila</strong>. Ni anke ne povas afirmar ke ol esos <strong>vendebla</strong> o <strong>ke ol esos utila por specifika intenco</strong>.\nLektez la Generala Licenco Publika GNU por plusa detali.\n\nKune ica programo vu certe recevis [$2  kopiuro di la Generala Licenco Publika GNU]. Se vu ne recevis ol, voluntez skribar a la fonduro Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, o [https://www.gnu.org/copyleft/gpl.html lektez ol che l'interreto].",
+       "config-sidebar-readme": "Lektez me",
+       "config-sidebar-relnotes": "Informi pri la versiono",
+       "config-sidebar-license": "Kopiuro",
+       "config-sidebar-upgrade": "Nova versiono",
        "config-env-good": "Omno verifikesis.\nVu povas intalar MediaWiki.",
        "config-env-bad": "Omno verifikesis.\nVu NE POVAS intalar MediaWiki.",
        "config-env-php": "PHP $1 instalesis.",
        "config-env-hhvm": "HHVM $1 instalesis.",
+       "config-unicode-using-intl": "Uzanta [https://php.net/manual/en/book.intl.php PHP intl extension] por normaligo Unicode.",
        "config-unicode-pure-php-warning": "<strong>Atencez:</strong> La [https://php.net/manual/en/book.intl.php prolonguro PHP intl] ne esas disponebla por traktar skribo-normaligo \"Unicode\". Vice, uzesas la plu lenta laborado en pura PHP.\nSe vu administras pagini multe vizitata, vu mustas lektar la [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations skribo-normaligo Unicode].",
+       "config-unicode-update-warning": "<strong>Atencez:</strong> La versiono di ''Unicode normalization wrapper'' instalata en vua komputero uzas obsoleta versiono di la biblioteko del [http://site.icu-project.org/ projeto ICU].\nVu mustas instalar [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations la nova versiono] se vu deziras uzar Unicode.",
        "config-memory-raised": "Parametro <code>memory_limit</code> esas $1, modifikata a $2.",
        "config-memory-bad": "<strong>Atences:</strong> la limito por PHP <code>memory_limit</code> esas $1.\nTo probable esas nesuficanta.\nL'instalo-procedo povas faliar!",
        "config-apc": "[https://www.php.net/apc APC] instalesis",
        "config-apcu": "[https://www.php.net/apcu APCu] instalesis",
        "config-wincache": "[https://www.iis.net/downloads/microsoft/wincache-extension WinCache] instalesis",
+       "config-no-uri": "<strong>Eroro:</strong> Ne esis posibla identifikar l'existanta URI.\nInstalo interruptata.",
+       "config-no-cli-uri": "<strong>Avizo:</strong> Nula <code>--scriptpath</code> informata. Uzanta la preexistanta: <code>$1</code>.",
+       "config-using-server": "Uzanta ret-adreso (URL) dil servero \"<nowiki>$1</nowiki>\".",
        "config-using-uri": "Ret-adreso (URL) dil servero \"<nowiki>$1$2</nowiki>\".",
+       "config-db-type": "Tipo di datumaro:",
+       "config-db-host": "Loko dil datumaro:",
        "config-db-wiki-settings": "Identifikez ca wiki",
        "config-db-name": "Nomo dil datumaro (sen strekteti):",
        "config-db-install-account": "Konto dil uzero por instalo",
        "config-db-username": "Uzero-nomo dil datumaro:",
        "config-db-password": "Pasovorto dil datumaro:",
        "config-invalid-db-type": "Nevalida tipo di datumaro.",
+       "config-missing-db-name": "Vu mustas informar valoro por \"{{int:config-db-name}}\".",
+       "config-missing-db-host": "Vu mustas informar valoro por \"{{int:config-db-host}}\".",
+       "config-sqlite-readonly": "L'arkivo <code>$1</code> esas nur lektebla.",
+       "config-sqlite-cant-create-db": "Ne povis krear l'arkivo di datumaro <code>$1</code>.",
        "config-ns-generic": "Projeto",
        "config-ns-site-name": "Sama kam la wiki-nomo: $1",
        "config-ns-other": "Altra (definez precise)",
index 5e7485c..f511229 100644 (file)
@@ -48,6 +48,9 @@ class MemoizedCallable {
        /** @var string Unique name of callable; used for cache keys. */
        private $callableName;
 
+       /** @var int */
+       private $ttl;
+
        /**
         * @throws InvalidArgumentException if $callable is not a callable.
         * @param callable $callable Function or method to memoize.
index 54d43d3..b036f05 100644 (file)
@@ -7,6 +7,10 @@
  * @since 1.27
  */
 class ComposerInstalled {
+       /**
+        * @var array[]
+        */
+       private $contents;
 
        /**
         * @param string $location
@@ -18,7 +22,7 @@ class ComposerInstalled {
        /**
         * Dependencies currently installed according to installed.json
         *
-        * @return array
+        * @return array[]
         */
        public function getInstalledDependencies() {
                $deps = [];
index 62231a8..f92759b 100644 (file)
@@ -7,6 +7,10 @@
  * @since 1.25
  */
 class ComposerJson {
+       /**
+        * @var array[]
+        */
+       private $contents;
 
        /**
         * @param string $location
@@ -18,7 +22,7 @@ class ComposerJson {
        /**
         * Dependencies as specified by composer.json
         *
-        * @return array
+        * @return string[]
         */
        public function getRequiredDependencies() {
                $deps = [];
index c5b5f00..7f6b875 100644 (file)
@@ -7,6 +7,10 @@
  * @since 1.25
  */
 class ComposerLock {
+       /**
+        * @var array[]
+        */
+       private $contents;
 
        /**
         * @param string $location
@@ -18,7 +22,7 @@ class ComposerLock {
        /**
         * Dependencies currently installed according to composer.lock
         *
-        * @return array
+        * @return array[]
         */
        public function getInstalledDependencies() {
                $deps = [];
index 9ed7ae3..26f3d3a 100644 (file)
@@ -73,7 +73,7 @@ class FSFileBackend extends FileBackendStore {
        /** @var string Required OS username to own files */
        protected $fileOwner;
 
-       /** @var bool Whether the OS is Windows (otherwise assumed Unix-like)*/
+       /** @var bool Whether the OS is Windows (otherwise assumed Unix-like) */
        protected $isWindows;
        /** @var string OS username running this script */
        protected $currentUser;
index 5caf250..d7d428e 100644 (file)
@@ -1396,12 +1396,12 @@ abstract class FileBackendStore extends FileBackend {
                        }
                }
 
-               $res = $this->doExecuteOpHandlesInternal( $fileOpHandles );
+               $statuses = $this->doExecuteOpHandlesInternal( $fileOpHandles );
                foreach ( $fileOpHandles as $fileOpHandle ) {
                        $fileOpHandle->closeResources();
                }
 
-               return $res;
+               return $statuses;
        }
 
        /**
index edea75f..820634c 100644 (file)
@@ -172,64 +172,33 @@ class SwiftFileBackend extends FileBackendStore {
        }
 
        /**
-        * Sanitize and filter the custom headers from a $params array.
-        * Only allows certain "standard" Content- and X-Content- headers.
+        * Filter/normalize a header map to only include mutable "content-"/"x-content-" headers
         *
-        * @param array $params
-        * @return array Sanitized value of 'headers' field in $params
-        */
-       protected function sanitizeHdrsStrict( array $params ) {
-               if ( !isset( $params['headers'] ) ) {
-                       return [];
-               }
-
-               $headers = $this->getCustomHeaders( $params['headers'] );
-               unset( $headers[ 'content-type' ] );
-
-               return $headers;
-       }
-
-       /**
-        * Sanitize and filter the custom headers from a $params array.
-        * Only allows certain "standard" Content- and X-Content- headers.
+        * Mutable headers can be changed via HTTP POST even if the file content is the same
         *
-        * When POSTing data, libcurl adds Content-Type: application/x-www-form-urlencoded
-        * if Content-Type is not set, which overwrites the stored Content-Type header
-        * in Swift - therefore for POSTing data do not strip the Content-Type header (the
-        * previously-stored header that has been already read back from swift is sent)
-        *
-        * @param array $params
-        * @return array Sanitized value of 'headers' field in $params
+        * @see https://docs.openstack.org/api-ref/object-store
+        * @param string[] $headers Map of (header => value) for a swift object
+        * @return string[] Map of (header => value) for Content-* headers mutable via POST
         */
-       protected function sanitizeHdrs( array $params ) {
-               return isset( $params['headers'] )
-                       ? $this->getCustomHeaders( $params['headers'] )
-                       : [];
-       }
-
-       /**
-        * @param array $rawHeaders
-        * @return array Custom non-metadata HTTP headers
-        */
-       protected function getCustomHeaders( array $rawHeaders ) {
-               $headers = [];
-
+       protected function extractMutableContentHeaders( array $headers ) {
+               $contentHeaders = [];
                // Normalize casing, and strip out illegal headers
-               foreach ( $rawHeaders as $name => $value ) {
+               foreach ( $headers as $name => $value ) {
                        $name = strtolower( $name );
-                       if ( preg_match( '/^content-length$/', $name ) ) {
-                               continue; // blacklisted
-                       } elseif ( preg_match( '/^(x-)?content-/', $name ) ) {
-                               $headers[$name] = $value; // allowed
-                       } elseif ( preg_match( '/^content-(disposition)/', $name ) ) {
-                               $headers[$name] = $value; // allowed
+                       if ( !preg_match( '/^(x-)?content-(?!length$)/', $name ) ) {
+                               // Only allow content-* and x-content-* headers (but not content-length)
+                               continue;
+                       } elseif ( $name === 'content-type' && !strlen( $value ) ) {
+                               // This header can be set to a value but not unset for sanity
+                               continue;
                        }
+                       $contentHeaders[$name] = $value;
                }
                // By default, Swift has annoyingly low maximum header value limits
-               if ( isset( $headers['content-disposition'] ) ) {
+               if ( isset( $contentHeaders['content-disposition'] ) ) {
                        $disposition = '';
                        // @note: assume FileBackend::makeContentDisposition() already used
-                       foreach ( explode( ';', $headers['content-disposition'] ) as $part ) {
+                       foreach ( explode( ';', $contentHeaders['content-disposition'] ) as $part ) {
                                $part = trim( $part );
                                $new = ( $disposition === '' ) ? $part : "{$disposition};{$part}";
                                if ( strlen( $new ) <= 255 ) {
@@ -238,36 +207,40 @@ class SwiftFileBackend extends FileBackendStore {
                                        break; // too long; sigh
                                }
                        }
-                       $headers['content-disposition'] = $disposition;
+                       $contentHeaders['content-disposition'] = $disposition;
                }
 
-               return $headers;
+               return $contentHeaders;
        }
 
        /**
-        * @param array $rawHeaders
-        * @return array Custom metadata headers
+        * @see https://docs.openstack.org/api-ref/object-store
+        * @param string[] $headers Map of (header => value) for a swift object
+        * @return string[] Map of (metadata header name => metadata value)
         */
-       protected function getMetadataHeaders( array $rawHeaders ) {
-               $headers = [];
-               foreach ( $rawHeaders as $name => $value ) {
+       protected function extractMetadataHeaders( array $headers ) {
+               $metadataHeaders = [];
+               foreach ( $headers as $name => $value ) {
                        $name = strtolower( $name );
                        if ( strpos( $name, 'x-object-meta-' ) === 0 ) {
-                               $headers[$name] = $value;
+                               $metadataHeaders[$name] = $value;
                        }
                }
 
-               return $headers;
+               return $metadataHeaders;
        }
 
        /**
-        * @param array $rawHeaders
-        * @return array Custom metadata headers with prefix removed
+        * @see https://docs.openstack.org/api-ref/object-store
+        * @param string[] $headers Map of (header => value) for a swift object
+        * @return string[] Map of (metadata key name => metadata value)
         */
-       protected function getMetadata( array $rawHeaders ) {
+       protected function getMetadataFromHeaders( array $headers ) {
+               $prefixLen = strlen( 'x-object-meta-' );
+
                $metadata = [];
-               foreach ( $this->getMetadataHeaders( $rawHeaders ) as $name => $value ) {
-                       $metadata[substr( $name, strlen( 'x-object-meta-' ) )] = $value;
+               foreach ( $this->extractMetadataHeaders( $headers ) as $name => $value ) {
+                       $metadata[substr( $name, $prefixLen )] = $value;
                }
 
                return $metadata;
@@ -283,19 +256,24 @@ class SwiftFileBackend extends FileBackendStore {
                        return $status;
                }
 
-               $sha1Hash = Wikimedia\base_convert( sha1( $params['content'] ), 16, 36, 31 );
-               $contentType = $params['headers']['content-type']
+               // Headers that are not strictly a function of the file content
+               $mutableHeaders = $this->extractMutableContentHeaders( $params['headers'] ?? [] );
+               // Make sure that the "content-type" header is set to something sensible
+               $mutableHeaders['content-type'] = $mutableHeaders['content-type']
                        ?? $this->getContentType( $params['dst'], $params['content'], null );
 
                $reqs = [ [
                        'method' => 'PUT',
                        'url' => [ $dstCont, $dstRel ],
-                       'headers' => [
-                               'content-length' => strlen( $params['content'] ),
-                               'etag' => md5( $params['content'] ),
-                               'content-type' => $contentType,
-                               'x-object-meta-sha1base36' => $sha1Hash
-                       ] + $this->sanitizeHdrsStrict( $params ),
+                       'headers' => array_merge(
+                               $mutableHeaders,
+                               [
+                                       'content-length' => strlen( $params['content'] ),
+                                       'etag' => md5( $params['content'] ),
+                                       'x-object-meta-sha1base36' =>
+                                               Wikimedia\base_convert( sha1( $params['content'] ), 16, 36, 31 )
+                               ]
+                       ),
                        'body' => $params['content']
                ] ];
 
@@ -309,6 +287,8 @@ class SwiftFileBackend extends FileBackendStore {
                        } else {
                                $this->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
                        }
+
+                       return SwiftFileOpHandle::CONTINUE_IF_OK;
                };
 
                $opHandle = new SwiftFileOpHandle( $this, $handler, $reqs );
@@ -332,16 +312,13 @@ class SwiftFileBackend extends FileBackendStore {
                }
 
                AtEase::suppressWarnings();
-               $sha1Hash = sha1_file( $params['src'] );
+               $sha1Base16 = sha1_file( $params['src'] );
                AtEase::restoreWarnings();
-               if ( $sha1Hash === false ) { // source doesn't exist?
+               if ( $sha1Base16 === false ) { // source doesn't exist?
                        $status->fatal( 'backend-fail-store', $params['src'], $params['dst'] );
 
                        return $status;
                }
-               $sha1Hash = Wikimedia\base_convert( $sha1Hash, 16, 36, 31 );
-               $contentType = $params['headers']['content-type']
-                       ?? $this->getContentType( $params['dst'], null, $params['src'] );
 
                $handle = fopen( $params['src'], 'rb' );
                if ( $handle === false ) { // source doesn't exist?
@@ -350,15 +327,23 @@ class SwiftFileBackend extends FileBackendStore {
                        return $status;
                }
 
+               // Headers that are not strictly a function of the file content
+               $mutableHeaders = $this->extractMutableContentHeaders( $params['headers'] ?? [] );
+               // Make sure that the "content-type" header is set to something sensible
+               $mutableHeaders['content-type'] = $mutableHeaders['content-type']
+                       ?? $this->getContentType( $params['dst'], null, $params['src'] );
+
                $reqs = [ [
                        'method' => 'PUT',
                        'url' => [ $dstCont, $dstRel ],
-                       'headers' => [
-                               'content-length' => filesize( $params['src'] ),
-                               'etag' => md5_file( $params['src'] ),
-                               'content-type' => $contentType,
-                               'x-object-meta-sha1base36' => $sha1Hash
-                       ] + $this->sanitizeHdrsStrict( $params ),
+                       'headers' => array_merge(
+                               $mutableHeaders,
+                               [
+                                       'content-length' => fstat( $handle )['size'],
+                                       'etag' => md5_file( $params['src'] ),
+                                       'x-object-meta-sha1base36' => Wikimedia\base_convert( $sha1Base16, 16, 36, 31 )
+                               ]
+                       ),
                        'body' => $handle // resource
                ] ];
 
@@ -372,6 +357,8 @@ class SwiftFileBackend extends FileBackendStore {
                        } else {
                                $this->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
                        }
+
+                       return SwiftFileOpHandle::CONTINUE_IF_OK;
                };
 
                $opHandle = new SwiftFileOpHandle( $this, $handler, $reqs );
@@ -406,10 +393,13 @@ class SwiftFileBackend extends FileBackendStore {
                $reqs = [ [
                        'method' => 'PUT',
                        'url' => [ $dstCont, $dstRel ],
-                       'headers' => [
-                               'x-copy-from' => '/' . rawurlencode( $srcCont ) .
-                                       '/' . str_replace( "%2F", "/", rawurlencode( $srcRel ) )
-                       ] + $this->sanitizeHdrsStrict( $params ), // extra headers merged into object
+                       'headers' => array_merge(
+                               $this->extractMutableContentHeaders( $params['headers'] ?? [] ),
+                               [
+                                       'x-copy-from' => '/' . rawurlencode( $srcCont ) . '/' .
+                                               str_replace( "%2F", "/", rawurlencode( $srcRel ) )
+                               ]
+                       )
                ] ];
 
                $method = __METHOD__;
@@ -418,10 +408,14 @@ class SwiftFileBackend extends FileBackendStore {
                        if ( $rcode === 201 ) {
                                // good
                        } elseif ( $rcode === 404 ) {
-                               $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
+                               if ( empty( $params['ignoreMissingSource'] ) ) {
+                                       $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
+                               }
                        } else {
                                $this->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
                        }
+
+                       return SwiftFileOpHandle::CONTINUE_IF_OK;
                };
 
                $opHandle = new SwiftFileOpHandle( $this, $handler, $reqs );
@@ -451,16 +445,17 @@ class SwiftFileBackend extends FileBackendStore {
                        return $status;
                }
 
-               $reqs = [
-                       [
-                               'method' => 'PUT',
-                               'url' => [ $dstCont, $dstRel ],
-                               'headers' => [
-                                       'x-copy-from' => '/' . rawurlencode( $srcCont ) .
-                                               '/' . str_replace( "%2F", "/", rawurlencode( $srcRel ) )
-                               ] + $this->sanitizeHdrsStrict( $params ) // extra headers merged into object
-                       ]
-               ];
+               $reqs = [ [
+                       'method' => 'PUT',
+                       'url' => [ $dstCont, $dstRel ],
+                       'headers' => array_merge(
+                               $this->extractMutableContentHeaders( $params['headers'] ?? [] ),
+                               [
+                                       'x-copy-from' => '/' . rawurlencode( $srcCont ) . '/' .
+                                               str_replace( "%2F", "/", rawurlencode( $srcRel ) )
+                               ]
+                       )
+               ] ];
                if ( "{$srcCont}/{$srcRel}" !== "{$dstCont}/{$dstRel}" ) {
                        $reqs[] = [
                                'method' => 'DELETE',
@@ -477,10 +472,17 @@ class SwiftFileBackend extends FileBackendStore {
                        } elseif ( $request['method'] === 'DELETE' && $rcode === 204 ) {
                                // good
                        } elseif ( $rcode === 404 ) {
-                               $status->fatal( 'backend-fail-move', $params['src'], $params['dst'] );
+                               if ( empty( $params['ignoreMissingSource'] ) ) {
+                                       $status->fatal( 'backend-fail-move', $params['src'], $params['dst'] );
+                               } else {
+                                       // Leave Status as OK but skip the DELETE request
+                                       return SwiftFileOpHandle::CONTINUE_NO;
+                               }
                        } else {
                                $this->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
                        }
+
+                       return SwiftFileOpHandle::CONTINUE_IF_OK;
                };
 
                $opHandle = new SwiftFileOpHandle( $this, $handler, $reqs );
@@ -521,6 +523,8 @@ class SwiftFileBackend extends FileBackendStore {
                        } else {
                                $this->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
                        }
+
+                       return SwiftFileOpHandle::CONTINUE_IF_OK;
                };
 
                $opHandle = new SwiftFileOpHandle( $this, $handler, $reqs );
@@ -554,17 +558,20 @@ class SwiftFileBackend extends FileBackendStore {
                        return $status;
                }
 
-               // POST clears prior headers, so we need to merge the changes in to the old ones
-               $metaHdrs = [];
+               // Swift object POST clears any prior headers, so merge the new and old headers here.
+               // Also, during, POST, libcurl adds "Content-Type: application/x-www-form-urlencoded"
+               // if "Content-Type" is not set, which would clobber the header value for the object.
+               $oldMetadataHeaders = [];
                foreach ( $stat['xattr']['metadata'] as $name => $value ) {
-                       $metaHdrs["x-object-meta-$name"] = $value;
+                       $oldMetadataHeaders["x-object-meta-$name"] = $value;
                }
-               $customHdrs = $this->sanitizeHdrs( $params ) + $stat['xattr']['headers'];
+               $newContentHeaders = $this->extractMutableContentHeaders( $params['headers'] ?? [] );
+               $oldContentHeaders = $stat['xattr']['headers'];
 
                $reqs = [ [
                        'method' => 'POST',
                        'url' => [ $srcCont, $srcRel ],
-                       'headers' => $metaHdrs + $customHdrs
+                       'headers' => $oldMetadataHeaders + $newContentHeaders + $oldContentHeaders
                ] ];
 
                $method = __METHOD__;
@@ -743,9 +750,9 @@ class SwiftFileBackend extends FileBackendStore {
                }
 
                // Find prior custom HTTP headers
-               $postHeaders = $this->getCustomHeaders( $objHdrs );
+               $postHeaders = $this->extractMutableContentHeaders( $objHdrs );
                // Find prior metadata headers
-               $postHeaders += $this->getMetadataHeaders( $objHdrs );
+               $postHeaders += $this->extractMetadataHeaders( $objHdrs );
 
                $status = $this->newStatus();
                /** @noinspection PhpUnusedLocalVariableInspection */
@@ -1083,11 +1090,11 @@ class SwiftFileBackend extends FileBackendStore {
        protected function doStreamFile( array $params ) {
                $status = $this->newStatus();
 
-               $flags = !empty( $params['headless'] ) ? StreamFile::STREAM_HEADLESS : 0;
+               $flags = !empty( $params['headless'] ) ? HTTPFileStreamer::STREAM_HEADLESS : 0;
 
                list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $params['src'] );
                if ( $srcRel === null ) {
-                       StreamFile::send404Message( $params['src'], $flags );
+                       HTTPFileStreamer::send404Message( $params['src'], $flags );
                        $status->fatal( 'backend-fail-invalidpath', $params['src'] );
 
                        return $status;
@@ -1095,7 +1102,7 @@ class SwiftFileBackend extends FileBackendStore {
 
                $auth = $this->getAuthentication();
                if ( !$auth || !is_array( $this->getContainerStat( $srcCont ) ) ) {
-                       StreamFile::send404Message( $params['src'], $flags );
+                       HTTPFileStreamer::send404Message( $params['src'], $flags );
                        $status->fatal( 'backend-fail-stream', $params['src'] );
 
                        return $status;
@@ -1104,7 +1111,7 @@ class SwiftFileBackend extends FileBackendStore {
                // If "headers" is set, we only want to send them if the file is there.
                // Do not bother checking if the file exists if headers are not set though.
                if ( $params['headers'] && !$this->fileExists( $params ) ) {
-                       StreamFile::send404Message( $params['src'], $flags );
+                       HTTPFileStreamer::send404Message( $params['src'], $flags );
                        $status->fatal( 'backend-fail-stream', $params['src'] );
 
                        return $status;
@@ -1293,11 +1300,6 @@ class SwiftFileBackend extends FileBackendStore {
                return $hdrs;
        }
 
-       /**
-        * @param FileBackendStoreOpHandle[] $fileOpHandles
-        *
-        * @return StatusValue[]
-        */
        protected function doExecuteOpHandlesInternal( array $fileOpHandles ) {
                /** @var SwiftFileOpHandle[] $fileOpHandles */
                '@phan-var SwiftFileOpHandle[] $fileOpHandles';
@@ -1334,13 +1336,18 @@ class SwiftFileBackend extends FileBackendStore {
                for ( $stage = 0; $stage < $reqCount; ++$stage ) {
                        $httpReqs = $this->http->runMulti( $httpReqsByStage[$stage] );
                        foreach ( $httpReqs as $index => $httpReq ) {
+                               /** @var SwiftFileOpHandle $fileOpHandle */
+                               $fileOpHandle = $fileOpHandles[$index];
                                // Run the callback for each request of this operation
-                               $callback = $fileOpHandles[$index]->callback;
-                               $callback( $httpReq, $statuses[$index] );
-                               // On failure, abort all remaining requests for this operation
-                               // (e.g. abort the DELETE request if the COPY request fails for a move)
-                               if ( !$statuses[$index]->isOK() ) {
-                                       $stages = count( $fileOpHandles[$index]->httpOp );
+                               $status = $statuses[$index];
+                               ( $fileOpHandle->callback )( $httpReq, $status );
+                               // On failure, abort all remaining requests for this operation. This is used
+                               // in "move" operations to abort the DELETE request if the PUT request fails.
+                               if (
+                                       !$status->isOK() ||
+                                       $fileOpHandle->state === $fileOpHandle::CONTINUE_NO
+                               ) {
+                                       $stages = count( $fileOpHandle->httpOp );
                                        for ( $s = ( $stage + 1 ); $s < $stages; ++$s ) {
                                                unset( $httpReqsByStage[$s][$index] );
                                        }
@@ -1670,9 +1677,9 @@ class SwiftFileBackend extends FileBackendStore {
         */
        protected function getStatFromHeaders( array $rhdrs ) {
                // Fetch all of the custom metadata headers
-               $metadata = $this->getMetadata( $rhdrs );
+               $metadata = $this->getMetadataFromHeaders( $rhdrs );
                // Fetch all of the custom raw HTTP headers
-               $headers = $this->sanitizeHdrs( [ 'headers' => $rhdrs ] );
+               $headers = $this->extractMutableContentHeaders( $rhdrs );
 
                return [
                        // Convert various random Swift dates to TS_MW
index 1119867..70ed46a 100644 (file)
  * @see FileBackendStoreOpHandle
  */
 class SwiftFileOpHandle extends FileBackendStoreOpHandle {
-       /** @var array List of Requests for MultiHttpClient */
+       /** @var array[] List of HTTP request maps for MultiHttpClient */
        public $httpOp;
-       /** @var Closure */
+       /** @var Closure Function to run after each HTTP request finishes */
        public $callback;
 
+       /** @var int Class CONTINUE_* constant */
+       public $state = self::CONTINUE_IF_OK;
+
+       /** @var int Continue with the next requests stages if no errors occured */
+       const CONTINUE_IF_OK = 0;
+       /** @var int Cancel the next requests stages */
+       const CONTINUE_NO = 1;
+
        /**
+        * Construct a handle to be use with SwiftFileOpHandle::doExecuteOpHandlesInternal()
+        *
+        * The callback returns a class CONTINUE_* constant and takes the following parameters:
+        *   - An HTTP request map array with 'response' filled
+        *   - A StatusValue instance to be updated as needed
+        *
         * @param SwiftFileBackend $backend
-        * @param Closure $callback Function that takes (HTTP request array, status)
+        * @param Closure $callback
         * @param array $httpOp MultiHttpClient op
         */
        public function __construct( SwiftFileBackend $backend, Closure $callback, array $httpOp ) {
index 6478a61..83dcc6b 100644 (file)
@@ -152,7 +152,7 @@ abstract class QuorumLockManager extends LockManager {
         * This is all or nothing; if any key is already pledged then this totally fails.
         *
         * @param int $bucket
-        * @param callable $callback Pledge method taking a server name and yeilding a StatusValue
+        * @param callable $callback Pledge method taking a server name and yielding a StatusValue
         * @return StatusValue
         */
        final protected function collectPledgeQuorum( $bucket, callable $callback ) {
@@ -194,7 +194,7 @@ abstract class QuorumLockManager extends LockManager {
         * Attempt to release pledges with the peers for a bucket
         *
         * @param int $bucket
-        * @param callable $callback Pledge method taking a server name and yeilding a StatusValue
+        * @param callable $callback Pledge method taking a server name and yielding a StatusValue
         * @return StatusValue
         */
        final protected function releasePledges( $bucket, callable $callback ) {
index 9d66326..16cd5ca 100644 (file)
@@ -68,6 +68,9 @@ class XmlTypeCheck {
         */
        protected $stackDepth = 0;
 
+       /** @var callable|null */
+       protected $filterCallback;
+
        /**
         * @var array Additional parsing options
         */
index 51f7316..77a7883 100644 (file)
@@ -46,7 +46,7 @@ class MultiWriteBagOStuff extends BagOStuff {
        /**
         * $params include:
         *   - caches: A numbered array of either ObjectFactory::getObjectFromSpec
-        *      arrays yeilding BagOStuff objects or direct BagOStuff objects.
+        *      arrays yielding BagOStuff objects or direct BagOStuff objects.
         *      If using the former, the 'args' field *must* be set.
         *      The first cache is the primary one, being the first to
         *      be read in the fallback chain. Writes happen to all stores
index ff87829..9f953e1 100644 (file)
@@ -47,9 +47,9 @@ class ReplicatedBagOStuff extends BagOStuff {
 
        /**
         * Constructor. Parameters are:
-        *   - writeFactory: ObjectFactory::getObjectFromSpec array yeilding BagOStuff.
+        *   - writeFactory: ObjectFactory::getObjectFromSpec array yielding BagOStuff.
         *      This object will be used for writes (e.g. the master DB).
-        *   - readFactory: ObjectFactory::getObjectFromSpec array yeilding BagOStuff.
+        *   - readFactory: ObjectFactory::getObjectFromSpec array yielding BagOStuff.
         *      This object will be used for reads (e.g. a replica DB).
         *   - sessionConsistencyWindow: Seconds to read from the master source for a key
         *      after writing to it. [Default: ReplicatedBagOStuff::MAX_WRITE_DELAY]
index 77b029f..5d33e69 100644 (file)
@@ -60,7 +60,7 @@ class LBFactoryMulti extends LBFactory {
        private $masterTemplateOverrides = [];
        /** @var array[] Map of (host => server config map overrides) for main and external servers */
        private $templateOverridesByServer = [];
-       /**  @var string[]|bool[] A map of section name to read-only message */
+       /** @var string[]|bool[] A map of section name to read-only message */
        private $readOnlyBySection = [];
 
        /** @var string An ILoadMonitor class */
@@ -85,7 +85,7 @@ class LBFactoryMulti extends LBFactory {
         * data can be before the load balancer tries to avoid using it. The map can have 'is static'
         * set to disable blocking  replication sync checks (intended for archive servers with
         * unchanging data).
-
+        *
         * @see LBFactory::__construct()
         * @param array $conf Additional parameters include:
         *   - hostsByName                 Optional (hostname => IP address) map.
index eb645cc..343e35c 100644 (file)
@@ -90,6 +90,10 @@ class RedisConnectionPool implements LoggerAwareInterface {
                if ( !isset( $options['serializer'] ) || $options['serializer'] === 'php' ) {
                        $this->serializer = Redis::SERIALIZER_PHP;
                } elseif ( $options['serializer'] === 'igbinary' ) {
+                       if ( !defined( 'Redis::SERIALIZER_IGBINARY' ) ) {
+                               throw new InvalidArgumentException(
+                                       __CLASS__ . ': configured serializer "igbinary" not available' );
+                       }
                        $this->serializer = Redis::SERIALIZER_IGBINARY;
                } elseif ( $options['serializer'] === 'none' ) {
                        $this->serializer = Redis::SERIALIZER_NONE;
index d27643c..d49e3c5 100644 (file)
@@ -22,6 +22,8 @@
  * @since 1.25
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * This class formats block log entries.
  *
@@ -138,7 +140,9 @@ class BlockLogFormatter extends LogFormatter {
                $linkRenderer = $this->getLinkRenderer();
                if ( $this->entry->isDeleted( LogPage::DELETED_ACTION ) // Action is hidden
                        || !( $subtype === 'block' || $subtype === 'reblock' )
-                       || !$this->context->getUser()->isAllowed( 'block' )
+                       || !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $this->context->getUser(), 'block' )
                ) {
                        return '';
                }
index e05357c..23c582c 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
+
 class ContentModelLogFormatter extends LogFormatter {
        protected function getMessageParameters() {
                $lang = $this->context->getLanguage();
@@ -12,7 +14,9 @@ class ContentModelLogFormatter extends LogFormatter {
        public function getActionLinks() {
                if ( $this->entry->isDeleted( LogPage::DELETED_ACTION ) // Action is hidden
                        || $this->entry->getSubtype() !== 'change'
-                       || !$this->context->getUser()->isAllowed( 'editcontentmodel' )
+                       || !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $this->context->getUser(), 'editcontentmodel' )
                ) {
                        return '';
                }
index 3bc19ff..565a65f 100644 (file)
@@ -23,7 +23,8 @@
  * @since 1.22
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\MediaWikiServices;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * This class formats delete log entries.
@@ -31,6 +32,12 @@ use MediaWiki\Storage\RevisionRecord;
  * @since 1.19
  */
 class DeleteLogFormatter extends LogFormatter {
+       /** @var array|null */
+       private $parsedParametersDeleteLog;
+
+       /**
+        * @inheritDoc
+        */
        protected function getMessageKey() {
                $key = parent::getMessageKey();
                if ( in_array( $this->entry->getSubtype(), [ 'event', 'revision' ] ) ) {
@@ -50,8 +57,11 @@ class DeleteLogFormatter extends LogFormatter {
                return $key;
        }
 
+       /**
+        * @inheritDoc
+        */
        protected function getMessageParameters() {
-               if ( isset( $this->parsedParametersDeleteLog ) ) {
+               if ( $this->parsedParametersDeleteLog !== null ) {
                        return $this->parsedParametersDeleteLog;
                }
 
@@ -136,7 +146,8 @@ class DeleteLogFormatter extends LogFormatter {
        public function getActionLinks() {
                $user = $this->context->getUser();
                $linkRenderer = $this->getLinkRenderer();
-               if ( !$user->isAllowed( 'deletedhistory' )
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+               if ( !$permissionManager->userHasRight( $user, 'deletedhistory' )
                        || $this->entry->isDeleted( LogPage::DELETED_ACTION )
                ) {
                        return '';
@@ -145,7 +156,7 @@ class DeleteLogFormatter extends LogFormatter {
                switch ( $this->entry->getSubtype() ) {
                        case 'delete': // Show undelete link
                        case 'delete_redir':
-                               if ( $user->isAllowed( 'undelete' ) ) {
+                               if ( $permissionManager->userHasRight( $user, 'undelete' ) ) {
                                        $message = 'undeletelink';
                                } else {
                                        $message = 'undeleteviewlink';
index 6791503..2e7f065 100644 (file)
@@ -233,7 +233,10 @@ class LogEventsList extends ContextSource {
                foreach ( LogPage::validTypes() as $type ) {
                        $page = new LogPage( $type );
                        $restriction = $page->getRestriction();
-                       if ( $this->getUser()->isAllowed( $restriction ) ) {
+                       if ( MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $this->getUser(), $restriction )
+                       ) {
                                $typesByName[$type] = $page->getName()->text();
                        }
                }
@@ -450,11 +453,12 @@ class LogEventsList extends ContextSource {
                }
 
                $del = '';
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
                // Don't show useless checkbox to people who cannot hide log entries
-               if ( $user->isAllowed( 'deletedhistory' ) ) {
-                       $canHide = $user->isAllowed( 'deletelogentry' );
-                       $canViewSuppressedOnly = $user->isAllowed( 'viewsuppressed' ) &&
-                               !$user->isAllowed( 'suppressrevision' );
+               if ( $permissionManager->userHasRight( $user, 'deletedhistory' ) ) {
+                       $canHide = $permissionManager->userHasRight( $user, 'deletelogentry' );
+                       $canViewSuppressedOnly = $permissionManager->userHasRight( $user, 'viewsuppressed' ) &&
+                               !$permissionManager->userHasRight( $user, 'suppressrevision' );
                        $entryIsSuppressed = self::isDeleted( $row, LogPage::DELETED_RESTRICTED );
                        $canViewThisSuppressedEntry = $canViewSuppressedOnly && $entryIsSuppressed;
                        if ( $row->log_deleted || $canHide ) {
@@ -508,7 +512,9 @@ class LogEventsList extends ContextSource {
                                in_array( $row->log_action, $action ) : $row->log_action == $action;
                        if ( $match && $right ) {
                                global $wgUser;
-                               $match = $wgUser->isAllowed( $right );
+                               $match = MediaWikiServices::getInstance()
+                                       ->getPermissionManager()
+                                       ->userHasRight( $wgUser, $right );
                        }
                }
 
@@ -572,7 +578,10 @@ class LogEventsList extends ContextSource {
                        $user = $wgUser;
                }
                $logRestrictions = MediaWikiServices::getInstance()->getMainConfig()->get( 'LogRestrictions' );
-               if ( isset( $logRestrictions[$type] ) && !$user->isAllowed( $logRestrictions[$type] ) ) {
+               if ( isset( $logRestrictions[$type] ) && !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $user, $logRestrictions[$type] )
+               ) {
                        return false;
                }
                return true;
@@ -783,7 +792,10 @@ class LogEventsList extends ContextSource {
 
                // Don't show private logs to unprivileged users
                foreach ( $wgLogRestrictions as $logType => $right ) {
-                       if ( $audience == 'public' || !$user->isAllowed( $right ) ) {
+                       if ( $audience == 'public' || !MediaWikiServices::getInstance()
+                                       ->getPermissionManager()
+                                       ->userHasRight( $user, $right )
+                       ) {
                                $hiddenLogs[] = $logType;
                        }
                }
index 9e63ffe..b4a6825 100644 (file)
@@ -163,7 +163,9 @@ class LogFormatter {
                $logRestrictions = $this->context->getConfig()->get( 'LogRestrictions' );
                $type = $this->entry->getType();
                return !isset( $logRestrictions[$type] )
-                       || $this->context->getUser()->isAllowed( $logRestrictions[$type] );
+                       || MediaWikiServices::getInstance()
+                                  ->getPermissionManager()
+                                  ->userHasRight( $this->context->getUser(), $logRestrictions[$type] );
        }
 
        /**
index 3871047..5e9fdb8 100644 (file)
@@ -53,6 +53,12 @@ class LogPager extends ReverseChronologicalPager {
        /** @var bool */
        private $actionRestrictionsEnforced = false;
 
+       /** @var array */
+       private $mConds;
+
+       /** @var string */
+       private $mTagFilter;
+
        /** @var LogEventsList */
        public $mLogEventsList;
 
@@ -146,7 +152,9 @@ class LogPager extends ReverseChronologicalPager {
                $needReindex = false;
                foreach ( $types as $type ) {
                        if ( isset( $wgLogRestrictions[$type] )
-                               && !$user->isAllowed( $wgLogRestrictions[$type] )
+                               && !MediaWikiServices::getInstance()
+                                       ->getPermissionManager()
+                                       ->userHasRight( $user, $wgLogRestrictions[$type] )
                        ) {
                                $needReindex = true;
                                $types = array_diff( $types, [ $type ] );
@@ -462,12 +470,10 @@ class LogPager extends ReverseChronologicalPager {
                }
                $this->actionRestrictionsEnforced = true;
                $user = $this->getUser();
-               if ( !$user->isAllowed( 'deletedhistory' ) ) {
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+               if ( !$permissionManager->userHasRight( $user, 'deletedhistory' ) ) {
                        $this->mConds[] = $this->mDb->bitAnd( 'log_deleted', LogPage::DELETED_ACTION ) . ' = 0';
-               } elseif ( !MediaWikiServices::getInstance()
-                       ->getPermissionManager()
-                       ->userHasAnyRight( $user, 'suppressrevision', 'viewsuppressed' )
-               ) {
+               } elseif ( !$permissionManager->userHasAnyRight( $user, 'suppressrevision', 'viewsuppressed' ) ) {
                        $this->mConds[] = $this->mDb->bitAnd( 'log_deleted', LogPage::SUPPRESSED_ACTION ) .
                                ' != ' . LogPage::SUPPRESSED_USER;
                }
@@ -483,12 +489,10 @@ class LogPager extends ReverseChronologicalPager {
                }
                $this->performerRestrictionsEnforced = true;
                $user = $this->getUser();
-               if ( !$user->isAllowed( 'deletedhistory' ) ) {
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+               if ( !$permissionManager->userHasRight( $user, 'deletedhistory' ) ) {
                        $this->mConds[] = $this->mDb->bitAnd( 'log_deleted', LogPage::DELETED_USER ) . ' = 0';
-               } elseif ( !MediaWikiServices::getInstance()
-                       ->getPermissionManager()
-                       ->userHasAnyRight( $user, 'suppressrevision', 'viewsuppressed' )
-               ) {
+               } elseif ( !$permissionManager->userHasAnyRight( $user, 'suppressrevision', 'viewsuppressed' ) ) {
                        $this->mConds[] = $this->mDb->bitAnd( 'log_deleted', LogPage::SUPPRESSED_USER ) .
                                ' != ' . LogPage::SUPPRESSED_ACTION;
                }
index 7a6fb9d..925c976 100644 (file)
@@ -22,6 +22,8 @@
  * @since 1.25
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * This class formats merge log entries.
  *
@@ -47,7 +49,9 @@ class MergeLogFormatter extends LogFormatter {
 
        public function getActionLinks() {
                if ( $this->entry->isDeleted( LogPage::DELETED_ACTION ) // Action is hidden
-                       || !$this->context->getUser()->isAllowed( 'mergehistory' )
+                       || !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $this->context->getUser(), 'mergehistory' )
                ) {
                        return '';
                }
index 637a8e7..6797f98 100644 (file)
@@ -23,6 +23,8 @@
  * @since 1.22
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * This class formats move log entries.
  *
@@ -60,7 +62,9 @@ class MoveLogFormatter extends LogFormatter {
        public function getActionLinks() {
                if ( $this->entry->isDeleted( LogPage::DELETED_ACTION ) // Action is hidden
                        || $this->entry->getSubtype() !== 'move'
-                       || !$this->context->getUser()->isAllowed( 'move' )
+                       || !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $this->context->getUser(), 'move' )
                ) {
                        return '';
                }
index ba02457..6e3b26b 100644 (file)
@@ -101,7 +101,10 @@ class ProtectLogFormatter extends LogFormatter {
                ];
 
                // Show change protection link
-               if ( $this->context->getUser()->isAllowed( 'protect' ) ) {
+               if ( !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $this->context->getUser(), 'protect' )
+               ) {
                        $links[] = $linkRenderer->makeKnownLink(
                                $title,
                                $this->msg( 'protect_change' )->text(),
index cba68ef..4d176fb 100644 (file)
@@ -129,7 +129,10 @@ class EmailNotification {
                if ( $watchers === [] && !count( $wgUsersNotifiedOnAllChanges ) ) {
                        $sendEmail = false;
                        // Only send notification for non minor edits, unless $wgEnotifMinorEdits
-                       if ( !$minorEdit || ( $wgEnotifMinorEdits && !$editor->isAllowed( 'nominornewtalk' ) ) ) {
+                       if ( !$minorEdit || ( $wgEnotifMinorEdits && !MediaWikiServices::getInstance()
+                                               ->getPermissionManager()
+                                               ->userHasRight( $editor, 'nominornewtalk' ) )
+                       ) {
                                $isUserTalkPage = ( $title->getNamespace() == NS_USER_TALK );
                                if ( $wgEnotifUserTalk
                                        && $isUserTalkPage
@@ -214,7 +217,10 @@ class EmailNotification {
 
                $userTalkId = false;
 
-               if ( !$minorEdit || ( $wgEnotifMinorEdits && !$editor->isAllowed( 'nominornewtalk' ) ) ) {
+               if ( !$minorEdit || ( $wgEnotifMinorEdits && !MediaWikiServices::getInstance()
+                                  ->getPermissionManager()
+                                  ->userHasRight( $editor, 'nominornewtalk' ) )
+               ) {
                        if ( $wgEnotifUserTalk
                                && $isUserTalkPage
                                && $this->canSendUserTalkEmail( $editor, $title, $minorEdit )
index 47fa16f..0783068 100644 (file)
@@ -34,8 +34,8 @@ class UserMailer {
         * Send mail using a PEAR mailer
         *
         * @param Mail_smtp $mailer
-        * @param string $dest
-        * @param string $headers
+        * @param string[]|string $dest
+        * @param array $headers
         * @param string $body
         *
         * @return Status
@@ -382,6 +382,8 @@ class UserMailer {
                                throw new MWException( 'PEAR mail package is not installed' );
                        }
 
+                       $recips = array_map( 'strval', $to );
+
                        Wikimedia\suppressWarnings();
 
                        // Create the mail object using the Mail::factory method
@@ -397,13 +399,13 @@ class UserMailer {
                        $headers['Subject'] = self::quotedPrintable( $subject );
 
                        // When sending only to one recipient, shows it its email using To:
-                       if ( count( $to ) == 1 ) {
-                               $headers['To'] = $to[0]->toString();
+                       if ( count( $recips ) == 1 ) {
+                               $headers['To'] = $recips[0];
                        }
 
                        // Split jobs since SMTP servers tends to limit the maximum
                        // number of possible recipients.
-                       $chunks = array_chunk( $to, $wgEnotifMaxRecips );
+                       $chunks = array_chunk( $recips, $wgEnotifMaxRecips );
                        foreach ( $chunks as $chunk ) {
                                $status = self::sendWithPear( $mail_object, $chunk, $headers, $body );
                                // FIXME : some chunks might be sent while others are not!
index 3b904e8..d54dd6b 100644 (file)
@@ -240,6 +240,7 @@ class DjVuHandler extends ImageHandler {
         * @param File|FSFile $image
         * @param string $path
         * @return DjVuImage
+        * @suppress PhanUndeclaredProperty Custom property
         */
        function getDjVuImage( $image, $path ) {
                if ( !$image ) {
@@ -290,6 +291,7 @@ class DjVuHandler extends ImageHandler {
         * @param File $image
         * @param bool $gettext DOCUMENT (Default: false)
         * @return bool|SimpleXMLElement
+        * @suppress PhanUndeclaredProperty Custom property
         */
        public function getMetaTree( $image, $gettext = false ) {
                if ( $gettext && isset( $image->djvuTextTree ) ) {
index 92fad52..50b13a4 100644 (file)
@@ -42,6 +42,9 @@ class DjVuImage {
         */
        const DJVUTXT_MEMORY_LIMIT = 300000;
 
+       /** @var string */
+       private $mFilename;
+
        /**
         * @param string $filename The DjVu file name.
         */
index 8a26f60..dffb1f9 100644 (file)
@@ -122,14 +122,17 @@ class JpegMetadataExtractor {
                                $temp = self::jpegExtractMarker( $fh );
                                // check what type of app segment this is.
                                if ( substr( $temp, 0, 29 ) === "http://ns.adobe.com/xap/1.0/\x00" && $showXMP ) {
-                                       $segments["XMP"] = substr( $temp, 29 );
+                                       // use trim to remove trailing \0 chars
+                                       $segments["XMP"] = trim( substr( $temp, 29 ) );
                                } elseif ( substr( $temp, 0, 35 ) === "http://ns.adobe.com/xmp/extension/\x00" && $showXMP ) {
-                                       $segments["XMP_ext"][] = substr( $temp, 35 );
+                                       // use trim to remove trailing \0 chars
+                                       $segments["XMP_ext"][] = trim( substr( $temp, 35 ) );
                                } elseif ( substr( $temp, 0, 29 ) === "XMP\x00://ns.adobe.com/xap/1.0/\x00" && $showXMP ) {
                                        // Some images (especially flickr images) seem to have this.
                                        // I really have no idea what the deal is with them, but
                                        // whatever...
-                                       $segments["XMP"] = substr( $temp, 29 );
+                                       // use trim to remove trailing \0 chars
+                                       $segments["XMP"] = trim( substr( $temp, 29 ) );
                                        wfDebug( __METHOD__ . ' Found XMP section with wrong app identifier '
                                                . "Using anyways.\n" );
                                } elseif ( substr( $temp, 0, 6 ) === "Exif\0\0" ) {
index 5e99ac9..e49feae 100644 (file)
@@ -43,11 +43,6 @@ use MediaWiki\MediaWikiServices;
  *
  * Primary entry points:
  *
- * - ObjectCache::getMainWANInstance()
- *   Purpose: Memory cache.
- *   Stored in the local data-center's main cache (keyspace different from local-cluster cache).
- *   Delete events are broadcasted to other DCs main cache. See WANObjectCache for details.
- *
  * - ObjectCache::getLocalServerInstance( $fallbackType )
  *   Purpose: Memory cache for very hot keys.
  *   Stored only on the individual web server (typically APC or APCu for web requests,
@@ -60,13 +55,6 @@ use MediaWiki\MediaWikiServices;
  *   Stored centrally within the local data-center. Not replicated to other DCs.
  *   Configured by $wgMainCacheType.
  *
- * - ObjectCache::getMainStashInstance()
- *   Purpose: Ephemeral global storage.
- *   Stored centrally within the primary data-center.
- *   Changes are applied there first and replicated to other DCs (best-effort).
- *   To retrieve the latest value (e.g. not from a replica DB), use BagOStuff::READ_LATEST.
- *   This store may be subject to LRU style evictions.
- *
  * - ObjectCache::getInstance( $cacheType )
  *   Purpose: Special cases (like tiered memory/disk caches).
  *   Get a specific cache type by key in $wgObjectCaches.
@@ -351,30 +339,6 @@ class ObjectCache {
                return self::getInstance( $wgMainCacheType );
        }
 
-       /**
-        * Get the main WAN cache object.
-        *
-        * @since 1.26
-        * @return WANObjectCache
-        * @deprecated Since 1.28 Use MediaWikiServices::getInstance()->getMainWANObjectCache()
-        */
-       public static function getMainWANInstance() {
-               wfDeprecated( __METHOD__, '1.28' );
-               return MediaWikiServices::getInstance()->getMainWANObjectCache();
-       }
-
-       /**
-        * Get the cache object for the main stash.
-        *
-        * @return BagOStuff
-        * @since 1.26
-        * @deprecated Since 1.28 Use MediaWikiServices::getInstance()->getMainObjectStash()
-        */
-       public static function getMainStashInstance() {
-               wfDeprecated( __METHOD__, '1.28' );
-               return MediaWikiServices::getInstance()->getMainObjectStash();
-       }
-
        /**
         * Clear all the cached instances.
         */
index 1c2e782..6aeb038 100644 (file)
@@ -363,8 +363,16 @@ class Article implements Page {
                        }
                }
 
+               $rl = MediaWikiServices::getInstance()->getRevisionLookup();
+               $oldRev = $this->mRevision ? $this->mRevision->getRevisionRecord() : null;
                if ( $request->getVal( 'direction' ) == 'next' ) {
-                       $nextid = $this->getTitle()->getNextRevisionID( $oldid );
+                       $nextid = 0;
+                       if ( $oldRev ) {
+                               $nextRev = $rl->getNextRevision( $oldRev );
+                               if ( $nextRev ) {
+                                       $nextid = $nextRev->getId();
+                               }
+                       }
                        if ( $nextid ) {
                                $oldid = $nextid;
                                $this->mRevision = null;
@@ -372,7 +380,13 @@ class Article implements Page {
                                $this->mRedirectUrl = $this->getTitle()->getFullURL( 'redirect=no' );
                        }
                } elseif ( $request->getVal( 'direction' ) == 'prev' ) {
-                       $previd = $this->getTitle()->getPreviousRevisionID( $oldid );
+                       $previd = 0;
+                       if ( $oldRev ) {
+                               $prevRev = $rl->getPreviousRevision( $oldRev );
+                               if ( $prevRev ) {
+                                       $previd = $prevRev->getId();
+                               }
+                       }
                        if ( $previd ) {
                                $oldid = $previd;
                                $this->mRevision = null;
@@ -1310,7 +1324,10 @@ class Article implements Page {
                }
 
                $outputPage->preventClickjacking();
-               if ( $user->isAllowed( 'writeapi' ) ) {
+               if ( MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $user, 'writeapi' )
+               ) {
                        $outputPage->addModules( 'mediawiki.page.patrol.ajax' );
                }
 
@@ -1596,8 +1613,9 @@ class Article implements Page {
                                        'oldid' => $oldid
                                ] + $extraParams
                        );
-               $prev = $this->getTitle()->getPreviousRevisionID( $oldid );
-               $prevlink = $prev
+               $rl = MediaWikiServices::getInstance()->getRevisionLookup();
+               $prevExist = (bool)$rl->getPreviousRevision( $revision->getRevisionRecord() );
+               $prevlink = $prevExist
                        ? Linker::linkKnown(
                                $this->getTitle(),
                                $context->msg( 'previousrevision' )->escaped(),
@@ -1608,7 +1626,7 @@ class Article implements Page {
                                ] + $extraParams
                        )
                        : $context->msg( 'previousrevision' )->escaped();
-               $prevdiff = $prev
+               $prevdiff = $prevExist
                        ? Linker::linkKnown(
                                $this->getTitle(),
                                $context->msg( 'diff' )->escaped(),
@@ -1827,7 +1845,10 @@ class Article implements Page {
                        [ 'delete', $this->getTitle()->getPrefixedText() ] )
                ) {
                        # Flag to hide all contents of the archived revisions
-                       $suppress = $request->getCheck( 'wpSuppress' ) && $user->isAllowed( 'suppressrevision' );
+
+                       $suppress = $request->getCheck( 'wpSuppress' ) && MediaWikiServices::getInstance()
+                                       ->getPermissionManager()
+                                       ->userHasRight( $user, 'suppressrevision' );
 
                        $this->doDelete( $reason, $suppress );
 
@@ -1986,8 +2007,8 @@ class Article implements Page {
                                ]
                        );
                }
-
-               if ( $user->isAllowed( 'suppressrevision' ) ) {
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+               if ( $permissionManager->userHasRight( $user, 'suppressrevision' ) ) {
                        $fields[] = new OOUI\FieldLayout(
                                new OOUI\CheckboxInputWidget( [
                                        'name' => 'wpSuppress',
@@ -2045,7 +2066,7 @@ class Article implements Page {
                        ] )
                );
 
-               if ( $user->isAllowed( 'editinterface' ) ) {
+               if ( $permissionManager->userHasRight( $user, 'editinterface' ) ) {
                        $link = Linker::linkKnown(
                                $ctx->msg( 'deletereason-dropdown' )->inContentLanguage()->getTitle(),
                                wfMessage( 'delete-edit-reasonlist' )->escaped(),
index 9edaccc..cf2497f 100644 (file)
@@ -130,11 +130,10 @@ class ImageHistoryList extends ContextSource {
                $row = $selected = '';
 
                // Deletion link
-               if ( $local && ( $pm->userHasAnyRight( $user, 'delete', 'deletedhistory' ) )
-               ) {
+               if ( $local && ( $pm->userHasAnyRight( $user, 'delete', 'deletedhistory' ) ) ) {
                        $row .= '<td>';
                        # Link to remove from history
-                       if ( $user->isAllowed( 'delete' ) ) {
+                       if ( $pm->userHasRight( $user, 'delete' ) ) {
                                $q = [ 'action' => 'delete' ];
                                if ( !$iscur ) {
                                        $q['oldimage'] = $img;
@@ -146,9 +145,10 @@ class ImageHistoryList extends ContextSource {
                                );
                        }
                        # Link to hide content. Don't show useless link to people who cannot hide revisions.
-                       $canHide = $user->isAllowed( 'deleterevision' );
-                       if ( $canHide || ( $user->isAllowed( 'deletedhistory' ) && $file->getVisibility() ) ) {
-                               if ( $user->isAllowed( 'delete' ) ) {
+                       $canHide = $pm->userHasRight( $user, 'deleterevision' );
+                       if ( $canHide || ( $pm->userHasRight( $user, 'deletedhistory' )
+                                       && $file->getVisibility() ) ) {
+                               if ( $pm->userHasRight( $user, 'delete' ) ) {
                                        $row .= '<br />';
                                }
                                // If file is top revision or locked from this user, don't link
index 653e443..bb15532 100644 (file)
@@ -603,7 +603,10 @@ EOT
                                );
                        }
 
-                       if ( $wgEnableUploads && $user->isAllowed( 'upload' ) ) {
+                       if ( $wgEnableUploads && MediaWikiServices::getInstance()
+                                       ->getPermissionManager()
+                                       ->userHasRight( $user, 'upload' )
+                       ) {
                                // Only show an upload link if the user can upload
                                $uploadTitle = SpecialPage::getTitleFor( 'Upload' );
                                $nofile = [
index 40c63d2..8b2ff6b 100644 (file)
@@ -756,10 +756,14 @@ class PageArchive {
 
                        Hooks::run( 'ArticleUndelete',
                                [ &$this->title, $created, $comment, $oldPageId, $restoredPages ] );
+
                        if ( $this->title->getNamespace() == NS_FILE ) {
-                               DeferredUpdates::addUpdate(
-                                       new HTMLCacheUpdate( $this->title, 'imagelinks', 'file-restore' )
+                               $job = HTMLCacheUpdateJob::newForBacklinks(
+                                       $this->title,
+                                       'imagelinks',
+                                       [ 'causeAction' => 'file-restore' ]
                                );
+                               JobQueueGroup::singleton()->lazyPush( $job );
                        }
                }
 
index acd506b..fd9f7b2 100644 (file)
@@ -176,9 +176,12 @@ class WikiFilePage extends WikiPage {
 
                if ( $this->mFile->exists() ) {
                        wfDebug( 'ImagePage::doPurge purging ' . $this->mFile->getName() . "\n" );
-                       DeferredUpdates::addUpdate(
-                               new HTMLCacheUpdate( $this->mTitle, 'imagelinks', 'file-purge' )
+                       $job = HTMLCacheUpdateJob::newForBacklinks(
+                               $this->mTitle,
+                               'imagelinks',
+                               [ 'causeAction' => 'file-purge' ]
                        );
+                       JobQueueGroup::singleton()->lazyPush( $job );
                } else {
                        wfDebug( 'ImagePage::doPurge no image for '
                                . $this->mFile->getName() . "; limiting purge to cache only\n" );
index bad75da..c8566ac 100644 (file)
@@ -1896,7 +1896,8 @@ class WikiPage implements Page, IDBAccessObject {
                // TODO: this check is here for backwards-compatibility with 1.31 behavior.
                // Checking the minoredit right should be done in the same place the 'bot' right is
                // checked for the EDIT_FORCE_BOT flag, which is currently in EditPage::attemptSave.
-               if ( ( $flags & EDIT_MINOR ) && !$user->isAllowed( 'minoredit' ) ) {
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+               if ( ( $flags & EDIT_MINOR ) && !$permissionManager->userHasRight( $user, 'minoredit' ) ) {
                        $flags = ( $flags & ~EDIT_MINOR );
                }
 
@@ -1916,7 +1917,6 @@ class WikiPage implements Page, IDBAccessObject {
                // TODO: this logic should not be in the storage layer, it's here for compatibility
                // with 1.31 behavior. Applying the 'autopatrol' right should be done in the same
                // place the 'bot' right is handled, which is currently in EditPage::attemptSave.
-               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
 
                if ( $needsPatrol && $permissionManager->userCan(
                        'autopatrol', $user, $this->getTitle()
@@ -3249,14 +3249,12 @@ class WikiPage implements Page, IDBAccessObject {
                // Save
                $flags = EDIT_UPDATE | EDIT_INTERNAL;
 
-               if ( $guser->isAllowed( 'minoredit' ) ) {
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+               if ( $permissionManager->userHasRight( $guser, 'minoredit' ) ) {
                        $flags |= EDIT_MINOR;
                }
 
-               if ( $bot && ( MediaWikiServices::getInstance()
-                               ->getPermissionManager()
-                               ->userHasAnyRight( $guser, 'markbotedits', 'bot' ) )
-               ) {
+               if ( $bot && ( $permissionManager->userHasAnyRight( $guser, 'markbotedits', 'bot' ) ) ) {
                        $flags |= EDIT_FORCE_BOT;
                }
 
@@ -3291,7 +3289,6 @@ class WikiPage implements Page, IDBAccessObject {
                // TODO: this logic should not be in the storage layer, it's here for compatibility
                // with 1.31 behavior. Applying the 'autopatrol' right should be done in the same
                // place the 'bot' right is handled, which is currently in EditPage::attemptSave.
-               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
 
                if ( $wgUseRCPatrol && $permissionManager->userCan(
                        'autopatrol', $guser, $this->getTitle()
@@ -3308,7 +3305,7 @@ class WikiPage implements Page, IDBAccessObject {
                // Set patrolling and bot flag on the edits, which gets rollbacked.
                // This is done even on edit failure to have patrolling in that case (T64157).
                $set = [];
-               if ( $bot && $guser->isAllowed( 'markbotedits' ) ) {
+               if ( $bot && $permissionManager->userHasRight( $guser, 'markbotedits' ) ) {
                        // Mark all reverted edits as bot
                        $set['rc_bot'] = 1;
                }
@@ -3407,9 +3404,12 @@ class WikiPage implements Page, IDBAccessObject {
                MediaWikiServices::getInstance()->getLinkCache()->invalidateTitle( $title );
 
                // Invalidate caches of articles which include this page
-               DeferredUpdates::addUpdate(
-                       new HTMLCacheUpdate( $title, 'templatelinks', 'page-create' )
+               $job = HTMLCacheUpdateJob::newForBacklinks(
+                       $title,
+                       'templatelinks',
+                       [ 'causeAction' => 'page-create' ]
                );
+               JobQueueGroup::singleton()->lazyPush( $job );
 
                if ( $title->getNamespace() == NS_CATEGORY ) {
                        // Load the Category object, which will schedule a job to create
@@ -3451,9 +3451,12 @@ class WikiPage implements Page, IDBAccessObject {
 
                // Images
                if ( $title->getNamespace() == NS_FILE ) {
-                       DeferredUpdates::addUpdate(
-                               new HTMLCacheUpdate( $title, 'imagelinks', 'page-delete' )
+                       $job = HTMLCacheUpdateJob::newForBacklinks(
+                               $title,
+                               'imagelinks',
+                               [ 'causeAction' => 'page-delete' ]
                        );
+                       JobQueueGroup::singleton()->lazyPush( $job );
                }
 
                // User talk pages
@@ -3485,20 +3488,24 @@ class WikiPage implements Page, IDBAccessObject {
                $slotsChanged = null
        ) {
                // TODO: move this into a PageEventEmitter service
-
-               if ( $slotsChanged === null || in_array( SlotRecord::MAIN,  $slotsChanged ) ) {
+               $jobs = [];
+               if ( $slotsChanged === null || in_array( SlotRecord::MAIN, $slotsChanged ) ) {
                        // Invalidate caches of articles which include this page.
                        // Only for the main slot, because only the main slot is transcluded.
                        // TODO: MCR: not true for TemplateStyles! [SlotHandler]
-                       DeferredUpdates::addUpdate(
-                               new HTMLCacheUpdate( $title, 'templatelinks', 'page-edit' )
+                       $jobs[] = HTMLCacheUpdateJob::newForBacklinks(
+                               $title,
+                               'templatelinks',
+                               [ 'causeAction' => 'page-edit' ]
                        );
                }
-
                // Invalidate the caches of all pages which redirect here
-               DeferredUpdates::addUpdate(
-                       new HTMLCacheUpdate( $title, 'redirect', 'page-edit' )
+               $jobs[] = HTMLCacheUpdateJob::newForBacklinks(
+                       $title,
+                       'redirect',
+                       [ 'causeAction' => 'page-edit' ]
                );
+               JobQueueGroup::singleton()->lazyPush( $jobs );
 
                MediaWikiServices::getInstance()->getLinkCache()->invalidateTitle( $title );
 
index e1f4f38..b803241 100644 (file)
@@ -1121,7 +1121,7 @@ class CoreParserFunctions {
         * @param Parser $parser
         * @param Title $title
         * @param string $vary ParserOuput vary-* flag
-        * @return Revision
+        * @return Revision|null
         * @since 1.23
         */
        private static function getCachedRevisionObject( $parser, $title, $vary ) {
index 66c2bc3..56db812 100644 (file)
@@ -20,7 +20,6 @@
 
 namespace MediaWiki\Preferences;
 
-use Config;
 use DateTime;
 use DateTimeZone;
 use Exception;
@@ -37,6 +36,7 @@ use MediaWiki\Auth\PasswordAuthenticationRequest;
 use MediaWiki\Config\ServiceOptions;
 use MediaWiki\Linker\LinkRenderer;
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Permissions\PermissionManager;
 use MessageLocalizer;
 use MWException;
 use MWTimestamp;
@@ -77,6 +77,9 @@ class DefaultPreferencesFactory implements PreferencesFactory {
        /** @var NamespaceInfo */
        protected $nsInfo;
 
+       /** @var PermissionManager */
+       protected $permissionManager;
+
        /**
         * TODO Make this a const when we drop HHVM support (T192166)
         *
@@ -114,35 +117,34 @@ class DefaultPreferencesFactory implements PreferencesFactory {
        /**
         * Do not call this directly.  Get it from MediaWikiServices.
         *
-        * @param ServiceOptions|Config $options Config accepted for backwards compatibility
+        * @param ServiceOptions $options
         * @param Language $contLang
         * @param AuthManager $authManager
         * @param LinkRenderer $linkRenderer
-        * @param NamespaceInfo|null $nsInfo
+        * @param NamespaceInfo $nsInfo
+        * @param PermissionManager|null $permissionManager
         */
        public function __construct(
-               $options,
+               ServiceOptions $options,
                Language $contLang,
                AuthManager $authManager,
                LinkRenderer $linkRenderer,
-               NamespaceInfo $nsInfo = null
+               NamespaceInfo $nsInfo,
+               PermissionManager $permissionManager = null
        ) {
-               if ( $options instanceof Config ) {
-                       wfDeprecated( __METHOD__ . ' with Config parameter', '1.34' );
-                       $options = new ServiceOptions( self::$constructorOptions, $options );
-               }
-
                $options->assertRequiredOptions( self::$constructorOptions );
 
-               if ( !$nsInfo ) {
-                       wfDeprecated( __METHOD__ . ' with no NamespaceInfo argument', '1.34' );
-                       $nsInfo = MediaWikiServices::getInstance()->getNamespaceInfo();
+               if ( !$permissionManager ) {
+                       // TODO: this is actually hard-deprecated, left for jenkins to pass
+                       // together with GlobalPreferences extension. Will be removed in a followup.
+                       $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
                }
                $this->options = $options;
                $this->contLang = $contLang;
                $this->authManager = $authManager;
                $this->linkRenderer = $linkRenderer;
                $this->nsInfo = $nsInfo;
+               $this->permissionManager = $permissionManager;
                $this->logger = new NullLogger();
        }
 
@@ -209,7 +211,7 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                # # Make sure that form fields have their parent set. See T43337.
                $dummyForm = new HTMLForm( [], $context );
 
-               $disable = !$user->isAllowed( 'editmyoptions' );
+               $disable = !$this->permissionManager->userHasRight( $user, 'editmyoptions' );
 
                $defaultOptions = User::getDefaultOptions();
                $userOptions = $user->getOptions();
@@ -390,8 +392,8 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                        ];
                }
 
-               $canViewPrivateInfo = $user->isAllowed( 'viewmyprivateinfo' );
-               $canEditPrivateInfo = $user->isAllowed( 'editmyprivateinfo' );
+               $canViewPrivateInfo = $this->permissionManager->userHasRight( $user, 'viewmyprivateinfo' );
+               $canEditPrivateInfo = $this->permissionManager->userHasRight( $user, 'editmyprivateinfo' );
 
                // Actually changeable stuff
                $defaultPreferences['realname'] = [
@@ -631,7 +633,9 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                                ];
                        }
 
-                       if ( $this->options->get( 'EnableUserEmail' ) && $user->isAllowed( 'sendemail' ) ) {
+                       if ( $this->options->get( 'EnableUserEmail' ) &&
+                               $this->permissionManager->userHasRight( $user, 'sendemail' )
+                       ) {
                                $defaultPreferences['disablemail'] = [
                                        'id' => 'wpAllowEmail',
                                        'type' => 'toggle',
@@ -921,7 +925,7 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                        'label-message' => 'tog-numberheadings',
                ];
 
-               if ( $user->isAllowed( 'rollback' ) ) {
+               if ( $this->permissionManager->userHasRight( $user, 'rollback' ) ) {
                        $defaultPreferences['showrollbackconfirmation'] = [
                                'type' => 'toggle',
                                'section' => 'rendering/advancedrendering',
@@ -961,7 +965,7 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                        ];
                }
 
-               if ( $user->isAllowed( 'minoredit' ) ) {
+               if ( $this->permissionManager->userHasRight( $user, 'minoredit' ) ) {
                        $defaultPreferences['minordefault'] = [
                                'type' => 'toggle',
                                'section' => 'editing/editor',
@@ -1107,7 +1111,7 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                $watchlistdaysMax = ceil( $this->options->get( 'RCMaxAge' ) / ( 3600 * 24 ) );
 
                # # Watchlist #####################################
-               if ( $user->isAllowed( 'editmywatchlist' ) ) {
+               if ( $this->permissionManager->userHasRight( $user, 'editmywatchlist' ) ) {
                        $editWatchlistLinks = '';
                        $editWatchlistModes = [
                                'edit' => [ 'subpage' => false, 'flags' => [] ],
@@ -1221,20 +1225,20 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                ];
 
                // Kinda hacky
-               if ( $user->isAllowed( 'createpage' ) || $user->isAllowed( 'createtalk' ) ) {
+               if ( $this->permissionManager->userHasAnyRight( $user, 'createpage', 'createtalk' ) ) {
                        $watchTypes['read'] = 'watchcreations';
                }
 
-               if ( $user->isAllowed( 'rollback' ) ) {
+               if ( $this->permissionManager->userHasRight( $user, 'rollback' ) ) {
                        $watchTypes['rollback'] = 'watchrollback';
                }
 
-               if ( $user->isAllowed( 'upload' ) ) {
+               if ( $this->permissionManager->userHasRight( $user, 'upload' ) ) {
                        $watchTypes['upload'] = 'watchuploads';
                }
 
                foreach ( $watchTypes as $action => $pref ) {
-                       if ( $user->isAllowed( $action ) ) {
+                       if ( $this->permissionManager->userHasRight( $user, $action ) ) {
                                // Messages:
                                // tog-watchdefault, tog-watchmoves, tog-watchdeletion, tog-watchcreations, tog-watchuploads
                                // tog-watchrollback
@@ -1606,7 +1610,9 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                $hiddenPrefs = $this->options->get( 'HiddenPrefs' );
                $result = true;
 
-               if ( !$user->isAllowedAny( 'editmyprivateinfo', 'editmyoptions' ) ) {
+               if ( !$this->permissionManager
+                               ->userHasAnyRight( $user, 'editmyprivateinfo', 'editmyoptions' )
+               ) {
                        return Status::newFatal( 'mypreferencesprotected' );
                }
 
@@ -1617,14 +1623,14 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                // (not really "private", but still shouldn't be edited without permission)
 
                if ( !in_array( 'realname', $hiddenPrefs )
-                       && $user->isAllowed( 'editmyprivateinfo' )
+                       && $this->permissionManager->userHasRight( $user, 'editmyprivateinfo' )
                        && array_key_exists( 'realname', $formData )
                ) {
                        $realName = $formData['realname'];
                        $user->setRealName( $realName );
                }
 
-               if ( $user->isAllowed( 'editmyoptions' ) ) {
+               if ( $this->permissionManager->userHasRight( $user, 'editmyoptions' ) ) {
                        $oldUserOptions = $user->getOptions();
 
                        foreach ( $this->getSaveBlacklist() as $b ) {
index c27ab4f..92e276d 100644 (file)
@@ -96,9 +96,15 @@ class SectionProfiler {
        public function getFunctionStats() {
                $this->collateData();
 
-               $totalCpu = max( $this->end['cpu'] - $this->start['cpu'], 0 );
-               $totalReal = max( $this->end['real'] - $this->start['real'], 0 );
-               $totalMem = max( $this->end['memory'] - $this->start['memory'], 0 );
+               if ( is_array( $this->start ) ) {
+                       $totalCpu = max( $this->end['cpu'] - $this->start['cpu'], 0 );
+                       $totalReal = max( $this->end['real'] - $this->start['real'], 0 );
+                       $totalMem = max( $this->end['memory'] - $this->start['memory'], 0 );
+               } else {
+                       $totalCpu = 0;
+                       $totalReal = 0;
+                       $totalMem = 0;
+               }
 
                $profile = [];
                foreach ( $this->collated as $fname => $data ) {
index d84a92a..0a1d5f7 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Derivative context for ResourceLoader modules.
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  */
 
 /**
+ * A mutable version of ResourceLoaderContext.
+ *
  * Allows changing specific properties of a context object,
- * without changing the main one. Inspired by DerivativeContext.
+ * without changing the main one. Inspired by MediaWiki's DerivativeContext.
  *
+ * @ingroup ResourceLoader
  * @since 1.24
  */
 class DerivativeResourceLoaderContext extends ResourceLoaderContext {
index d0f6729..b4f0b7c 100644 (file)
@@ -27,10 +27,13 @@ use Psr\Log\NullLogger;
 use Wikimedia\Rdbms\Database;
 
 /**
- * This class generates message blobs for use by ResourceLoader modules.
+ * This class generates message blobs for use by ResourceLoader.
  *
- * A message blob is a JSON object containing the interface messages for a certain module in
- * a certain language.
+ * A message blob is a JSON object containing the interface messages for a
+ * certain module in a certain language.
+ *
+ * @ingroup ResourceLoader
+ * @since 1.17
  */
 class MessageBlobStore implements LoggerAwareInterface {
 
index 4a23eae..d959ff6 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Base class for resource loading system.
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
@@ -30,13 +28,21 @@ use Wikimedia\Rdbms\DBConnectionError;
 use Wikimedia\WrappedString;
 
 /**
- * Dynamic JavaScript and CSS resource loading system.
+ * @defgroup ResourceLoader ResourceLoader
  *
- * Most of the documentation is on the MediaWiki documentation wiki starting at:
- *    https://www.mediawiki.org/wiki/ResourceLoader
+ * For higher level documentation, see <https://www.mediawiki.org/wiki/ResourceLoader/Architecture>.
+ */
+
+/**
+ * ResourceLoader is a loading system for JavaScript and CSS resources.
+ *
+ * For higher level documentation, see <https://www.mediawiki.org/wiki/ResourceLoader/Architecture>.
+ *
+ * @ingroup ResourceLoader
+ * @since 1.17
  */
 class ResourceLoader implements LoggerAwareInterface {
-       /** @var Config $config */
+       /** @var Config */
        protected $config;
        /** @var MessageBlobStore */
        protected $blobStore;
@@ -812,9 +818,9 @@ class ResourceLoader implements LoggerAwareInterface {
                        $errorText = implode( "\n\n", $this->errors );
                        $errorResponse = self::makeComment( $errorText );
                        if ( $context->shouldIncludeScripts() ) {
-                               $errorResponse .= 'if (window.console && console.error) {'
-                                       . Xml::encodeJsCall( 'console.error', [ $errorText ] )
-                                       . "}\n";
+                               $errorResponse .= 'if (window.console && console.error) { console.error('
+                                       . self::encodeJsonForScript( $errorText )
+                                       . "); }\n";
                        }
 
                        // Prepend error info to the response
@@ -1323,7 +1329,7 @@ MESSAGE;
         * @internal
         * @since 1.32
         * @param mixed $data
-        * @return string JSON
+        * @return string|false JSON string, false on error
         */
        public static function encodeJsonForScript( $data ) {
                // Keep output as small as possible by disabling needless escape modes
@@ -1544,20 +1550,16 @@ MESSAGE;
         * @throws Exception
         */
        public static function makeConfigSetScript( array $configuration ) {
-               $js = Xml::encodeJsCall(
-                       'mw.config.set',
-                       [ $configuration ],
-                       self::inDebugMode()
-               );
-               if ( $js === false ) {
+               $json = self::encodeJsonForScript( $configuration );
+               if ( $json === false ) {
                        $e = new Exception(
                                'JSON serialization of config data failed. ' .
                                'This usually means the config data is not valid UTF-8.'
                        );
                        MWExceptionHandler::logException( $e );
-                       $js = Xml::encodeJsCall( 'mw.log.error', [ $e->__toString() ] );
+                       return 'mw.log.error(' . self::encodeJsonForScript( $e->__toString() ) . ');';
                }
-               return $js;
+               return "mw.config.set($json);";
        }
 
        /**
index 7cd53fe..5a62861 100644 (file)
@@ -1,6 +1,5 @@
 <?php
 /**
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
@@ -20,6 +19,7 @@
  */
 
 /**
+ * @ingroup ResourceLoader
  * @internal For use by ResourceLoaderStartUpModule only
  */
 class ResourceLoaderCircularDependencyError extends Exception {
index 151b5fd..bf03e49 100644 (file)
@@ -24,6 +24,7 @@ use Wikimedia\WrappedStringList;
 /**
  * Load and configure a ResourceLoader client on an HTML page.
  *
+ * @ingroup ResourceLoader
  * @since 1.28
  */
 class ResourceLoaderClientHtml {
@@ -478,7 +479,7 @@ JAVASCRIPT;
                                                        ] );
                                                } else {
                                                        $chunk = ResourceLoader::makeInlineScript(
-                                                               Xml::encodeJsCall( 'mw.loader.load', [ $url ] ),
+                                                               'mw.loader.load(' . ResourceLoader::encodeJsonForScript( $url ) . ');',
                                                                $nonce
                                                        );
                                                }
index 95b8ff0..3db0c01 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Context for ResourceLoader modules.
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
@@ -26,8 +24,11 @@ use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\MediaWikiServices;
 
 /**
- * Object passed around to modules which contains information about the state
- * of a specific loader request.
+ * Context object that contains information about the state of a specific
+ * ResourceLoader web request. Passed around to ResourceLoaderModule methods.
+ *
+ * @ingroup ResourceLoader
+ * @since 1.17
  */
 class ResourceLoaderContext implements MessageLocalizer {
        const DEFAULT_LANG = 'qqx';
index f2d0856..23a9a14 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * ResourceLoader module based on local JavaScript/CSS files.
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  */
 
 /**
- * ResourceLoader module based on local JavaScript/CSS files.
+ * Module based on local JavaScript/CSS files.
  *
  * The following public methods can query the database:
  *
  * - getDefinitionSummary / … / ResourceLoaderModule::getFileDependencies.
  * - getVersionHash / getDefinitionSummary / … / ResourceLoaderModule::getFileDependencies.
  * - getStyles / ResourceLoaderModule::saveFileDependencies.
+ *
+ * @ingroup ResourceLoader
+ * @since 1.17
  */
 class ResourceLoaderFileModule extends ResourceLoaderModule {
 
index dff9a39..c70081b 100644 (file)
@@ -1,8 +1,5 @@
 <?php
 /**
- * An object to represent a path to a JavaScript/CSS file, along with a remote
- * and local base path, for use with ResourceLoaderFileModule.
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
@@ -24,6 +21,9 @@
 /**
  * An object to represent a path to a JavaScript/CSS file, along with a remote
  * and local base path, for use with ResourceLoaderFileModule.
+ *
+ * @ingroup ResourceLoader
+ * @since 1.17
  */
 class ResourceLoaderFilePath {
 
index 4d215d6..152a1f7 100644 (file)
@@ -1,8 +1,5 @@
 <?php
 /**
- * ResourceLoader module for mediawiki.ForeignApi that has dynamically
- * generated dependencies, via a hook usable by extensions.
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  */
 
 /**
- * ResourceLoader module for mediawiki.ForeignApi and its generated data
+ * Module for mediawiki.ForeignApi that has dynamically
+ * generated dependencies, via a hook usable by extensions.
+ *
+ * @ingroup ResourceLoader
+ * @internal
  */
 class ResourceLoaderForeignApiModule extends ResourceLoaderFileModule {
        public function getDependencies( ResourceLoaderContext $context = null ) {
index 6497543..2b0f5ed 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Class encapsulating an image used in a ResourceLoaderImageModule.
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
@@ -25,6 +23,7 @@ use MediaWiki\Shell\Shell;
 /**
  * Class encapsulating an image used in a ResourceLoaderImageModule.
  *
+ * @ingroup ResourceLoader
  * @since 1.25
  */
 class ResourceLoaderImage {
@@ -337,6 +336,7 @@ class ResourceLoaderImage {
                // Reattach all direct children of the `<svg>` root node to the `<g>` wrapper
                while ( $root->firstChild ) {
                        $node = $root->firstChild;
+                       // @phan-suppress-next-line PhanUndeclaredProperty False positive
                        if ( !$titleNode && $node->nodeType === XML_ELEMENT_NODE && $node->tagName === 'title' ) {
                                // Remember the first encountered `<title>` node
                                $titleNode = $node;
index 902fa91..0585cfd 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * ResourceLoader module for generated and embedded images.
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
@@ -22,8 +20,9 @@
  */
 
 /**
- * ResourceLoader module for generated and embedded images.
+ * Module for generated and embedded images.
  *
+ * @ingroup ResourceLoader
  * @since 1.25
  */
 class ResourceLoaderImageModule extends ResourceLoaderModule {
index 7a7ab89..ffc9b3d 100644 (file)
  */
 
 /**
- * ResourceLoader module for populating language specific data, such as grammar forms.
+ * Module for populating language specific data, such as grammar forms.
+ *
+ * @ingroup ResourceLoader
+ * @internal
  */
 class ResourceLoaderLanguageDataModule extends ResourceLoaderFileModule {
 
@@ -52,16 +55,11 @@ class ResourceLoaderLanguageDataModule extends ResourceLoaderFileModule {
         * @return string JavaScript code
         */
        public function getScript( ResourceLoaderContext $context ) {
-               $fileScript = parent::getScript( $context );
-               $langDataScript = Xml::encodeJsCall(
-                       'mw.language.setData',
-                       [
-                               $context->getLanguage(),
-                               $this->getData( $context )
-                       ],
-                       ResourceLoader::inDebugMode()
-               );
-               return $fileScript . $langDataScript;
+               return parent::getScript( $context )
+                       . 'mw.language.setData('
+                       . ResourceLoader::encodeJsonForScript( $context->getLanguage() ) . ','
+                       . ResourceLoader::encodeJsonForScript( $this->getData( $context ) )
+                       . ');';
        }
 
        /**
index 0269ec3..49501ff 100644 (file)
@@ -1,7 +1,28 @@
 <?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
 
 /**
- * Subclass with context specific LESS variables
+ * Module augmented with context-specific LESS variables.
+ *
+ * @ingroup ResourceLoader
+ * @since 1.32
  */
 class ResourceLoaderLessVarFileModule extends ResourceLoaderFileModule {
        protected $lessVariables = [];
index ed2d09c..c9fd267 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Abstraction for ResourceLoader modules.
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
@@ -32,6 +30,9 @@ use Wikimedia\ScopedCallback;
 
 /**
  * Abstraction for ResourceLoader modules, with name registration and maxage functionality.
+ *
+ * @ingroup ResourceLoader
+ * @since 1.17
  */
 abstract class ResourceLoaderModule implements LoggerAwareInterface {
        /** @var Config */
index 7d39a58..e1a2711 100644 (file)
  */
 
 /**
- * ResourceLoaderFileModule which magically loads the right skinScripts and skinStyles for every
+ * Module which magically loads the right skinScripts and skinStyles for every
  * skin, using the specified OOUI theme for each.
  *
- * @since 1.30
+ * @ingroup ResourceLoader
+ * @internal
  */
 class ResourceLoaderOOUIFileModule extends ResourceLoaderFileModule {
        use ResourceLoaderOOUIModule;
index c860362..11c59a0 100644 (file)
@@ -21,6 +21,7 @@
 /**
  * Allows loading arbitrary sets of OOUI icons.
  *
+ * @ingroup ResourceLoader
  * @since 1.34
  */
 class ResourceLoaderOOUIIconPackModule extends ResourceLoaderOOUIImageModule {
index fdcc213..007bbd1 100644 (file)
@@ -21,7 +21,8 @@
 /**
  * Convenience methods for dealing with OOUI themes and their relations to MW skins.
  *
- * @since 1.30
+ * @ingroup ResourceLoader
+ * @internal
  */
 trait ResourceLoaderOOUIModule {
        protected static $knownScriptsModules = [ 'core' ];
index 236112e..0ae8371 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * ResourceLoader module for site customizations.
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  */
 
 /**
- * Module for site customizations
+ * Module for site customizations.
+ *
+ * @ingroup ResourceLoader
+ * @internal
  */
 class ResourceLoaderSiteModule extends ResourceLoaderWikiModule {
 
index 79922bf..be4e31d 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * ResourceLoader module for site style customizations.
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  */
 
 /**
- * Module for site style customizations
+ * Module for site style customizations.
+ *
+ * @ingroup ResourceLoader
+ * @internal
  */
 class ResourceLoaderSiteStylesModule extends ResourceLoaderWikiModule {
 
index 0f33666..e7ab951 100644 (file)
  */
 
 /**
- * ResourceLoader module for skin stylesheets.
+ * Module for skin stylesheets.
+ *
+ * @ingroup ResourceLoader
+ * @internal
  */
 class ResourceLoaderSkinModule extends ResourceLoaderFileModule {
        /**
index 9f583a5..78775fb 100644 (file)
@@ -38,6 +38,9 @@ use MediaWiki\MediaWikiServices;
  * - safemode: Only register modules that have ORIGIN_CORE as their origin.
  *   This effectively disables ORIGIN_USER modules. (T185303)
  *   See also: OutputPage::disallowUserJs()
+ *
+ * @ingroup ResourceLoader
+ * @internal
  */
 class ResourceLoaderStartUpModule extends ResourceLoaderModule {
        protected $targets = [ 'desktop', 'mobile' ];
index b9dc098..9610cce 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * ResourceLoader module for default user preferences.
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
@@ -23,6 +21,9 @@
 
 /**
  * Module for default user preferences.
+ *
+ * @ingroup ResourceLoader
+ * @internal
  */
 class ResourceLoaderUserDefaultsModule extends ResourceLoaderModule {
 
@@ -40,10 +41,8 @@ class ResourceLoaderUserDefaultsModule extends ResourceLoaderModule {
         * @return string JavaScript code
         */
        public function getScript( ResourceLoaderContext $context ) {
-               return Xml::encodeJsCall(
-                       'mw.user.options.set',
-                       [ User::getDefaultOptions() ],
-                       ResourceLoader::inDebugMode()
-               );
+               return 'mw.user.options.set('
+                       . ResourceLoader::encodeJsonForScript( User::getDefaultOptions() )
+                       . ');';
        }
 }
index 026cea1..4794231 100644 (file)
  */
 
 /**
- * Module for user customizations scripts
+ * Module for user customizations scripts.
+ *
+ * @ingroup ResourceLoader
+ * @internal
  */
 class ResourceLoaderUserModule extends ResourceLoaderWikiModule {
 
index 0d40ad7..866d98b 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * ResourceLoader module for user preference customizations.
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  */
 
 /**
- * Module for user preference customizations
+ * Module for user preferences.
+ *
+ * @ingroup ResourceLoader
+ * @internal
  */
 class ResourceLoaderUserOptionsModule extends ResourceLoaderModule {
 
@@ -52,11 +53,12 @@ class ResourceLoaderUserOptionsModule extends ResourceLoaderModule {
         */
        public function getScript( ResourceLoaderContext $context ) {
                // Use FILTER_NOMIN annotation to prevent needless minification and caching (T84960).
-               return ResourceLoader::FILTER_NOMIN . Xml::encodeJsCall(
-                       'mw.user.options.set',
-                       [ $context->getUserObj()->getOptions( User::GETOPTIONS_EXCLUDE_DEFAULTS ) ],
-                       ResourceLoader::inDebugMode()
-               );
+               return ResourceLoader::FILTER_NOMIN
+                       . 'mw.user.options.set('
+                       . ResourceLoader::encodeJsonForScript(
+                               $context->getUserObj()->getOptions( User::GETOPTIONS_EXCLUDE_DEFAULTS )
+                       )
+                       . ');';
        }
 
        /**
index 69e8a97..fe949aa 100644 (file)
  */
 
 /**
- * Module for user customizations styles
+ * Module for user customizations styles.
+ *
+ * @ingroup ResourceLoader
+ * @internal
  */
 class ResourceLoaderUserStylesModule extends ResourceLoaderWikiModule {
 
index ae4fb67..45edd6e 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * ResourceLoader module for user tokens.
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
- * @author Krinkle
  */
 
 /**
- * Module for user tokens
+ * Module for user authorization tokens.
+ *
+ * @ingroup ResourceLoader
+ * @internal
  */
 class ResourceLoaderUserTokensModule extends ResourceLoaderModule {
 
@@ -53,11 +53,10 @@ class ResourceLoaderUserTokensModule extends ResourceLoaderModule {
         */
        public function getScript( ResourceLoaderContext $context ) {
                // Use FILTER_NOMIN annotation to prevent needless minification and caching (T84960).
-               return ResourceLoader::FILTER_NOMIN . Xml::encodeJsCall(
-                       'mw.user.tokens.set',
-                       [ $this->contextUserTokens( $context ) ],
-                       ResourceLoader::inDebugMode()
-               );
+               return ResourceLoader::FILTER_NOMIN
+                       . 'mw.user.tokens.set('
+                       . ResourceLoader::encodeJsonForScript( $this->contextUserTokens( $context ) )
+                       . ');';
        }
 
        /**
index a2501c4..37501d4 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Abstraction for ResourceLoader modules that pull from wiki pages.
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
@@ -23,7 +21,7 @@
  */
 
 use MediaWiki\Linker\LinkTarget;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\Assert\Assert;
 use Wikimedia\Rdbms\Database;
 use Wikimedia\Rdbms\IDatabase;
@@ -48,6 +46,9 @@ use MediaWiki\MediaWikiServices;
  *   - getDB()
  *   - isKnownEmpty()
  *   - getTitleInfo()
+ *
+ * @ingroup ResourceLoader
+ * @since 1.17
  */
 class ResourceLoaderWikiModule extends ResourceLoaderModule {
 
index 5b03ad0..ab5d954 100644 (file)
@@ -19,7 +19,7 @@
  * @ingroup RevisionDelete
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Item class for a filearchive table row
index 8c080ba..33ce11b 100644 (file)
@@ -19,7 +19,7 @@
  * @ingroup RevisionDelete
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Item class for an oldimage table row
index f4ea54f..746ca27 100644 (file)
@@ -20,7 +20,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Abstract base class for a list of deletable items. The list class
index edb86da..829eefa 100644 (file)
@@ -19,7 +19,7 @@
  * @ingroup RevisionDelete
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Item class for a logging table row
index fcdcb9a..adb3974 100644 (file)
@@ -19,7 +19,7 @@
  * @ingroup RevisionDelete
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\Rdbms\IDatabase;
 
 /**
index f61d378..604ab2c 100644 (file)
@@ -19,7 +19,7 @@
  * @ingroup RevisionDelete
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Item class for a live revision table row
index 0705503..011386e 100644 (file)
@@ -19,7 +19,7 @@
  * @ingroup RevisionDelete
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\Rdbms\FakeResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
 
index 9a9ab19..00e77e1 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup RevisionDelete
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\Rdbms\IDatabase;
 
 /**
index 3ab96cb..6361a7a 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup RevisionDelete
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * General controller for RevDel, used by both SpecialRevisiondelete and
index bf90c06..85c01c8 100644 (file)
@@ -20,7 +20,7 @@
  * @file
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Item class for a live revision table row
index 14c9a73..3e2a9a2 100644 (file)
@@ -176,7 +176,7 @@ class MediaWikiSite extends Site {
         *
         * @param string|bool $pageName Page name or false (default: false)
         *
-        * @return string
+        * @return string|bool|null
         */
        public function getPageUrl( $pageName = false ) {
                $url = $this->getLinkPath();
index bcf8b32..10711a6 100644 (file)
@@ -365,7 +365,7 @@ class Site implements Serializable {
         *
         * @param bool|string $pageName
         *
-        * @return string|bool
+        * @return string|bool|null
         */
        public function getPageUrl( $pageName = false ) {
                $url = $this->getLinkPath();
index cd63796..403f5b2 100644 (file)
@@ -48,7 +48,7 @@ abstract class BaseTemplate extends QuickTemplate {
         * @deprecated since 1.33 Use ->msg() or ->getMsg() instead.
         */
        function msgWiki( $str ) {
-               // TODO: Add wfDeprecated( __METHOD__, '1.33' ) after 1.33 got released
+               wfDeprecated( __METHOD__, '1.33' ); // Hard-deprecated in 1.34
                echo $this->getMsg( $str )->parseAsBlock();
        }
 
index 70df73b..327061c 100644 (file)
@@ -595,7 +595,7 @@ class SkinTemplate extends Skin {
                # $this->getTitle() will just give Special:Badtitle, which is
                # not especially useful as a returnto parameter. Use the title
                # from the request instead, if there was one.
-               if ( $this->getUser()->isAllowed( 'read' ) ) {
+               if ( $permissionManager->userHasRight( $this->getUser(), 'read' ) ) {
                        $page = $this->getTitle();
                } else {
                        $page = Title::newFromText( $request->getVal( 'title', '' ) );
@@ -636,7 +636,7 @@ class SkinTemplate extends Skin {
                                'active' => ( $href == $pageurl )
                        ];
 
-                       if ( $this->getUser()->isAllowed( 'viewmywatchlist' ) ) {
+                       if ( $permissionManager->userHasRight( $this->getUser(), 'viewmywatchlist' ) ) {
                                $href = self::makeSpecialUrl( 'Watchlist' );
                                $personal_urls['watchlist'] = [
                                        'text' => $this->msg( 'mywatchlist' )->text(),
@@ -689,9 +689,8 @@ class SkinTemplate extends Skin {
                                $useCombinedLoginLink = false;
                        }
 
-                       $loginlink = $this->getUser()->isAllowed( 'createaccount' ) && $useCombinedLoginLink
-                               ? 'nav-login-createaccount'
-                               : 'pt-login';
+                       $loginlink = $permissionManager->userHasRight( $this->getUser(), 'createaccount' )
+                                                && $useCombinedLoginLink ? 'nav-login-createaccount' : 'pt-login';
 
                        $login_url = [
                                'text' => $this->msg( $loginlink )->text(),
@@ -727,7 +726,7 @@ class SkinTemplate extends Skin {
 
                        if (
                                $authManager->canCreateAccounts()
-                               && $this->getUser()->isAllowed( 'createaccount' )
+                               && $permissionManager->userHasRight( $this->getUser(), 'createaccount' )
                                && !$useCombinedLoginLink
                        ) {
                                $personal_urls['createaccount'] = $createaccount_url;
@@ -1074,8 +1073,7 @@ class SkinTemplate extends Skin {
 
                                if ( $permissionManager->quickUserCan( 'protect', $user, $title ) &&
                                         $title->getRestrictionTypes() &&
-                                        $permissionManager->getNamespaceRestrictionLevels( $title->getNamespace(),
-                                                $user ) !== [ '' ]
+                                        $permissionManager->getNamespaceRestrictionLevels( $title->getNamespace(), $user ) !== [ '' ]
                                ) {
                                        $mode = $title->isProtected() ? 'unprotect' : 'protect';
                                        $content_navigation['actions'][$mode] = [
@@ -1345,7 +1343,10 @@ class SkinTemplate extends Skin {
                                'href' => self::makeSpecialUrlSubpage( 'Log', $rootUser )
                        ];
 
-                       if ( $this->getUser()->isAllowed( 'block' ) ) {
+                       if ( MediawikiServices::getInstance()
+                                       ->getPermissionManager()
+                                       ->userHasRight( $this->getUser(), 'block' )
+                       ) {
                                $nav_urls['blockip'] = [
                                        'text' => $this->msg( 'blockip', $rootUser )->text(),
                                        'href' => self::makeSpecialUrlSubpage( 'Block', $rootUser )
index 0954c45..bf5734a 100644 (file)
@@ -884,87 +884,85 @@ abstract class ChangesListSpecialPage extends SpecialPage {
        }
 
        /**
-        * Get (cheap to compute) information about change tags.
+        * Get information about change tags, without parsing messages, for getRcFiltersConfigSummary().
+        *
+        * Message contents are the raw values (->plain()), because parsing messages is expensive.
+        * Even though we're not parsing messages, building a data structure with the contents of
+        * hundreds of i18n messages is still not cheap (see T223260#5370610), so the result of this
+        * function is cached in WANCache for 24 hours.
         *
         * Returns an array of associative arrays with information about each tag:
         * - name: Tag name (string)
         * - labelMsg: Short description message (Message object)
+        * - label: Short description message (raw message contents)
         * - descriptionMsg: Long description message (Message object)
+        * - description: Long description message (raw message contents)
         * - cssClass: CSS class to use for RC entries with this tag
         * - hits: Number of RC entries that have this tag
         *
         * @param ResourceLoaderContext $context
         * @return array[] Information about each tag
         */
-       protected static function getChangeTagInfo( ResourceLoaderContext $context ) {
-               $explicitlyDefinedTags = array_fill_keys( ChangeTags::listExplicitlyDefinedTags(), 0 );
-               $softwareActivatedTags = array_fill_keys( ChangeTags::listSoftwareActivatedTags(), 0 );
-
-               $tagStats = ChangeTags::tagUsageStatistics();
-               $tagHitCounts = array_merge( $explicitlyDefinedTags, $softwareActivatedTags, $tagStats );
-
-               $result = [];
-               foreach ( $tagHitCounts as $tagName => $hits ) {
-                       if (
-                               (
-                                       // Only get active tags
-                                       isset( $explicitlyDefinedTags[ $tagName ] ) ||
-                                       isset( $softwareActivatedTags[ $tagName ] )
-                               ) &&
-                               // Only get tags with more than 0 hits
-                               $hits > 0
-                       ) {
-                               $labelMsg = ChangeTags::tagShortDescriptionMessage( $tagName, $context );
-                               if ( $labelMsg === false ) {
-                                       // Tag is hidden, skip it
-                                       continue;
-                               }
-                               $result[] = [
-                                       'name' => $tagName,
-                                       // 'label' and 'description' filled in by getChangeTagList()
-                                       'labelMsg' => $labelMsg,
-                                       'descriptionMsg' => ChangeTags::tagLongDescriptionMessage( $tagName, $context ),
-                                       'cssClass' => Sanitizer::escapeClass( 'mw-tag-' . $tagName ),
-                                       'hits' => $hits,
-                               ];
-                       }
-               }
-               return $result;
-       }
-
-       /**
-        * Get information about change tags for use in getRcFiltersConfigSummary().
-        *
-        * This expands labelMsg and descriptionMsg to the raw values of each message, which captures
-        * changes in the messages but avoids the expensive step of parsing them.
-        *
-        * @param ResourceLoaderContext $context
-        * @return array[] Result of getChangeTagInfo(), with messages expanded to raw contents
-        */
        protected static function getChangeTagListSummary( ResourceLoaderContext $context ) {
-               $tags = self::getChangeTagInfo( $context );
-               foreach ( $tags as &$tagInfo ) {
-                       $tagInfo['labelMsg'] = $tagInfo['labelMsg']->plain();
-                       if ( $tagInfo['descriptionMsg'] ) {
-                               $tagInfo['descriptionMsg'] = $tagInfo['descriptionMsg']->plain();
+               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
+               return $cache->getWithSetCallback(
+                       $cache->makeKey( 'ChangesListSpecialPage-changeTagListSummary', $context->getLanguage() ),
+                       WANObjectCache::TTL_DAY,
+                       function ( $oldValue, &$ttl, array &$setOpts ) use ( $context ) {
+                               $explicitlyDefinedTags = array_fill_keys( ChangeTags::listExplicitlyDefinedTags(), 0 );
+                               $softwareActivatedTags = array_fill_keys( ChangeTags::listSoftwareActivatedTags(), 0 );
+
+                               $tagStats = ChangeTags::tagUsageStatistics();
+                               $tagHitCounts = array_merge( $explicitlyDefinedTags, $softwareActivatedTags, $tagStats );
+
+                               $result = [];
+                               foreach ( $tagHitCounts as $tagName => $hits ) {
+                                       if (
+                                               (
+                                                       // Only get active tags
+                                                       isset( $explicitlyDefinedTags[ $tagName ] ) ||
+                                                       isset( $softwareActivatedTags[ $tagName ] )
+                                               ) &&
+                                               // Only get tags with more than 0 hits
+                                               $hits > 0
+                                       ) {
+                                               $labelMsg = ChangeTags::tagShortDescriptionMessage( $tagName, $context );
+                                               if ( $labelMsg === false ) {
+                                                       // Tag is hidden, skip it
+                                                       continue;
+                                               }
+                                               $descriptionMsg = ChangeTags::tagLongDescriptionMessage( $tagName, $context );
+                                               $result[] = [
+                                                       'name' => $tagName,
+                                                       'labelMsg' => $labelMsg,
+                                                       'label' => $labelMsg->plain(),
+                                                       'descriptionMsg' => $descriptionMsg,
+                                                       'description' => $descriptionMsg ? $descriptionMsg->plain() : '',
+                                                       'cssClass' => Sanitizer::escapeClass( 'mw-tag-' . $tagName ),
+                                                       'hits' => $hits,
+                                               ];
+                                       }
+                               }
+                               return $result;
                        }
-               }
-               return $tags;
+               );
        }
 
        /**
         * Get information about change tags to export to JS via getRcFiltersConfigVars().
         *
-        * This removes labelMsg and descriptionMsg, and adds label and description, which are parsed,
-        * stripped and (in the case of description) truncated versions of these messages. Message
+        * This manipulates the label and description of each tag, which are parsed, stripped
+        * and (in the case of description) truncated versions of these messages. Message
         * parsing is expensive, so to detect whether the tag list has changed, use
         * getChangeTagListSummary() instead.
         *
+        * The result of this function is cached in WANCache for 24 hours.
+        *
         * @param ResourceLoaderContext $context
-        * @return array[] Result of getChangeTagInfo(), with messages parsed, stripped and truncated
+        * @return array[] Same as getChangeTagListSummary(), with messages parsed, stripped and truncated
         */
        protected static function getChangeTagList( ResourceLoaderContext $context ) {
-               $tags = self::getChangeTagInfo( $context );
+               $tags = self::getChangeTagListSummary( $context );
                $language = Language::factory( $context->getLanguage() );
                foreach ( $tags as &$tagInfo ) {
                        $tagInfo['label'] = Sanitizer::stripAllTags( $tagInfo['labelMsg']->parse() );
index e5a28d9..94be852 100644 (file)
@@ -975,7 +975,11 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                        }
                }
                if ( !$this->isSignup() && $this->showExtraInformation() ) {
-                       $passwordReset = new PasswordReset( $this->getConfig(), AuthManager::singleton() );
+                       $passwordReset = new PasswordReset(
+                               $this->getConfig(),
+                               AuthManager::singleton(),
+                               MediaWikiServices::getInstance()->getPermissionManager()
+                       );
                        if ( $passwordReset->isAllowed( $this->getUser() )->isGood() ) {
                                $fieldDefinitions['passwordReset'] = [
                                        'type' => 'info',
@@ -1072,7 +1076,10 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
        private function showCreateAccountLink() {
                if ( $this->isSignup() ) {
                        return true;
-               } elseif ( $this->getUser()->isAllowed( 'createaccount' ) ) {
+               } elseif ( MediaWikiServices::getInstance()
+                                       ->getPermissionManager()
+                                       ->userHasRight( $this->getUser(), 'createaccount' )
+               ) {
                        return true;
                } else {
                        return false;
index 7d33035..ba8e318 100644 (file)
@@ -292,7 +292,9 @@ class SpecialPage implements MessageLocalizer {
         * @return bool Does the user have permission to view the page?
         */
        public function userCanExecute( User $user ) {
-               return $user->isAllowed( $this->mRestriction );
+               return MediaWikiServices::getInstance()
+                       ->getPermissionManager()
+                       ->userHasRight( $user, $this->mRestriction );
        }
 
        /**
index 5ac5f82..b83be91 100644 (file)
@@ -209,7 +209,12 @@ class SpecialPageFactory {
                'NewSection' => \SpecialNewSection::class,
                'PermanentLink' => \SpecialPermanentLink::class,
                'Redirect' => \SpecialRedirect::class,
-               'Revisiondelete' => \SpecialRevisionDelete::class,
+               'Revisiondelete' => [
+                       'class' => \SpecialRevisionDelete::class,
+                       'services' => [
+                               'PermissionManager',
+                       ],
+               ],
                'RunJobs' => \SpecialRunJobs::class,
                'Specialpages' => \SpecialSpecialpages::class,
                'PageData' => \SpecialPageData::class,
index 9e49684..f4a33c8 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @ingroup SpecialPage
  * @since 1.27
@@ -35,7 +37,10 @@ class SpecialApiSandbox extends SpecialPage {
                $out = $this->getOutput();
                $this->addHelpLink( 'Help:ApiSandbox' );
 
-               $out->addJsConfigVars( 'apihighlimits', $this->getUser()->isAllowed( 'apihighlimits' ) );
+               $out->addJsConfigVars( 'apihighlimits', MediaWikiServices::getInstance()
+                       ->getPermissionManager()
+                       ->userHasRight( $this->getUser(), 'apihighlimits' )
+               );
                $out->addModuleStyles( [
                        'mediawiki.special',
                        'mediawiki.hlist',
index 34c3371..3f98e93 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * A special page that lists autoblocks
  *
@@ -81,7 +83,10 @@ class SpecialAutoblockList extends SpecialPage {
                        'ipb_parent_block_id IS NOT NULL'
                ];
                # Is the user allowed to see hidden blocks?
-               if ( !$this->getUser()->isAllowed( 'hideuser' ) ) {
+               if ( !MediaWikiServices::getInstance()
+                       ->getPermissionManager()
+                       ->userHasRight( $this->getUser(), 'hideuser' )
+               ) {
                        $conds['ipb_deleted'] = 0;
                }
 
index 07214af..1b0db73 100644 (file)
@@ -25,6 +25,7 @@ use MediaWiki\Block\DatabaseBlock;
 use MediaWiki\Block\Restriction\PageRestriction;
 use MediaWiki\Block\Restriction\NamespaceRestriction;
 use MediaWiki\MediaWikiServices;
+use MediaWiki\User\UserIdentity;
 
 /**
  * A special page that allows users with 'block' right to block users from
@@ -269,7 +270,10 @@ class SpecialBlock extends FormSpecialPage {
                ];
 
                # Allow some users to hide name from block log, blocklist and listusers
-               if ( $user->isAllowed( 'hideuser' ) ) {
+               if ( MediaWikiServices::getInstance()
+                       ->getPermissionManager()
+                       ->userHasRight( $user, 'hideuser' )
+               ) {
                        $a['HideUser'] = [
                                'type' => 'check',
                                'label-message' => 'ipbhidename',
@@ -363,7 +367,10 @@ class SpecialBlock extends FormSpecialPage {
 
                        // If the username was hidden (ipb_deleted == 1), don't show the reason
                        // unless this user also has rights to hideuser: T37839
-                       if ( !$block->getHideName() || $this->getUser()->isAllowed( 'hideuser' ) ) {
+                       if ( !$block->getHideName() || MediaWikiServices::getInstance()
+                                       ->getPermissionManager()
+                                       ->userHasRight( $this->getUser(), 'hideuser' )
+                       ) {
                                $fields['Reason']['default'] = $block->getReason();
                        } else {
                                $fields['Reason']['default'] = '';
@@ -545,7 +552,8 @@ class SpecialBlock extends FormSpecialPage {
                $user = $this->getUser();
 
                # Link to edit the block dropdown reasons, if applicable
-               if ( $user->isAllowed( 'editinterface' ) ) {
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+               if ( $permissionManager->userHasRight( $user, 'editinterface' ) ) {
                        $links[] = $linkRenderer->makeKnownLink(
                                $this->msg( 'ipbreason-dropdown' )->inContentLanguage()->getTitle(),
                                $this->msg( 'ipb-edit-dropdown' )->text(),
@@ -579,7 +587,7 @@ class SpecialBlock extends FormSpecialPage {
                        $text .= $out;
 
                        # Add suppression block entries if allowed
-                       if ( $user->isAllowed( 'suppressionlog' ) ) {
+                       if ( $permissionManager->userHasRight( $user, 'suppressionlog' ) ) {
                                LogEventsList::showLogExtract(
                                        $out,
                                        'suppress',
@@ -828,7 +836,10 @@ class SpecialBlock extends FormSpecialPage {
                }
 
                if ( $data['HideUser'] ) {
-                       if ( !$performer->isAllowed( 'hideuser' ) ) {
+                       if ( !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $performer, 'hideuser' )
+                       ) {
                                # this codepath is unreachable except by a malicious user spoofing forms,
                                # or by race conditions (user has hideuser and block rights, loads block form,
                                # and loses hideuser rights before submission); so need to fail completely
@@ -938,7 +949,10 @@ class SpecialBlock extends FormSpecialPage {
                                }
                                # If the name was hidden and the blocking user cannot hide
                                # names, then don't allow any block changes...
-                               if ( $currentBlock->getHideName() && !$performer->isAllowed( 'hideuser' ) ) {
+                               if ( $currentBlock->getHideName() && !MediaWikiServices::getInstance()
+                                               ->getPermissionManager()
+                                               ->userHasRight( $performer, 'hideuser' )
+                               ) {
                                        return [ 'cant-see-hidden-user' ];
                                }
 
@@ -1106,13 +1120,15 @@ class SpecialBlock extends FormSpecialPage {
 
        /**
         * Can we do an email block?
-        * @param User $user The sysop wanting to make a block
+        * @param UserIdentity $user The sysop wanting to make a block
         * @return bool
         */
-       public static function canBlockEmail( $user ) {
+       public static function canBlockEmail( UserIdentity $user ) {
                global $wgEnableUserEmail, $wgSysopEmailBans;
 
-               return ( $wgEnableUserEmail && $wgSysopEmailBans && $user->isAllowed( 'blockemail' ) );
+               return ( $wgEnableUserEmail && $wgSysopEmailBans && MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $user, 'blockemail' ) );
        }
 
        /**
@@ -1138,7 +1154,10 @@ class SpecialBlock extends FormSpecialPage {
                if ( $performer->getBlock() ) {
                        if ( $target instanceof User && $target->getId() == $performer->getId() ) {
                                # User is trying to unblock themselves
-                               if ( $performer->isAllowed( 'unblockself' ) ) {
+                               if ( MediaWikiServices::getInstance()
+                                       ->getPermissionManager()
+                                       ->userHasRight( $performer, 'unblockself' )
+                               ) {
                                        return true;
                                        # User blocked themselves and is now trying to reverse it
                                } elseif ( $performer->blockedBy() === $performer->getName() ) {
index 6385359..4ba9b65 100644 (file)
@@ -22,6 +22,8 @@
  */
 
 use MediaWiki\Block\DatabaseBlock;
+use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * A special page that lists existing blocks
@@ -139,7 +141,10 @@ class SpecialBlockList extends SpecialPage {
                $conds = [];
                $db = $this->getDB();
                # Is the user allowed to see hidden blocks?
-               if ( !$this->getUser()->isAllowed( 'hideuser' ) ) {
+               if ( !MediaWikiServices::getInstance()
+                       ->getPermissionManager()
+                       ->userHasRight( $this->getUser(), 'hideuser' )
+               ) {
                        $conds['ipb_deleted'] = 0;
                }
 
index 9431cef..392b4e9 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup SpecialPage
  */
 
+use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
 
@@ -114,6 +115,8 @@ class SpecialBrokenRedirects extends QueryPage {
                }
 
                $linkRenderer = $this->getLinkRenderer();
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+
                // $toObj may very easily be false if the $result list is cached
                if ( !is_object( $toObj ) ) {
                        return '<del>' . $linkRenderer->makeLink( $fromObj ) . '</del>';
@@ -129,7 +132,7 @@ class SpecialBrokenRedirects extends QueryPage {
                // if the page is editable, add an edit link
                if (
                        // check user permissions
-                       $this->getUser()->isAllowed( 'edit' ) &&
+                       $permissionManager->userHasRight( $this->getUser(), 'edit' ) &&
                        // check, if the content model is editable through action=edit
                        ContentHandler::getForTitle( $fromObj )->supportsDirectEditing()
                ) {
@@ -145,7 +148,7 @@ class SpecialBrokenRedirects extends QueryPage {
 
                $out = $from . $this->msg( 'word-separator' )->escaped();
 
-               if ( $this->getUser()->isAllowed( 'delete' ) ) {
+               if ( $permissionManager->userHasRight( $this->getUser(), 'delete' ) ) {
                        $links[] = $linkRenderer->makeKnownLink(
                                $fromObj,
                                $this->msg( 'brokenredirects-delete' )->text(),
index 01f7e56..46fa17e 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
+
 class SpecialChangeContentModel extends FormSpecialPage {
 
        public function __construct() {
@@ -226,7 +228,10 @@ class SpecialChangeContentModel extends FormSpecialPage {
 
                $flags = $this->oldRevision ? EDIT_UPDATE : EDIT_NEW;
                $flags |= EDIT_INTERNAL;
-               if ( $user->isAllowed( 'bot' ) ) {
+               if ( MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $user, 'bot' )
+               ) {
                        $flags |= EDIT_FORCE_BOT;
                }
 
index c95aa1b..7331cd7 100644 (file)
@@ -23,6 +23,7 @@
 
 use MediaWiki\Auth\AuthManager;
 use MediaWiki\Logger\LoggerFactory;
+use MediaWiki\MediaWikiServices;
 
 /**
  * Let users change their email address.
@@ -74,7 +75,10 @@ class SpecialChangeEmail extends FormSpecialPage {
 
                // This could also let someone check the current email address, so
                // require both permissions.
-               if ( !$this->getUser()->isAllowed( 'viewmyprivateinfo' ) ) {
+               if ( !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $this->getUser(), 'viewmyprivateinfo' )
+               ) {
                        throw new PermissionsError( 'viewmyprivateinfo' );
                }
 
index f86a133..2c42cd3 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Special page allows users to request email confirmation message, and handles
  * processing of the confirmation code when the link in the email is followed
@@ -57,7 +59,10 @@ class SpecialConfirmEmail extends UnlistedSpecialPage {
 
                // This could also let someone check the current email address, so
                // require both permissions.
-               if ( !$this->getUser()->isAllowed( 'viewmyprivateinfo' ) ) {
+               if ( !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $this->getUser(), 'viewmyprivateinfo' )
+               ) {
                        throw new PermissionsError( 'viewmyprivateinfo' );
                }
 
index 40c0edf..e8b85fa 100644 (file)
@@ -126,7 +126,10 @@ class SpecialContributions extends IncludableSpecialPage {
 
                // Allows reverts to have the bot flag in recent changes. It is just here to
                // be passed in the form at the top of the page
-               if ( $user->isAllowed( 'markbotedits' ) && $request->getBool( 'bot' ) ) {
+               if ( MediaWikiServices::getInstance()
+                                ->getPermissionManager()
+                                ->userHasRight( $user, 'markbotedits' ) && $request->getBool( 'bot' )
+               ) {
                        $this->opts['bot'] = '1';
                }
 
@@ -373,7 +376,9 @@ class SpecialContributions extends IncludableSpecialPage {
                        );
                }
 
-               if ( $sp->getUser()->isAllowed( 'block' ) ) { # Block / Change block / Unblock links
+               # Block / Change block / Unblock links
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+               if ( $permissionManager->userHasRight( $sp->getUser(), 'block' ) ) {
                        if ( $target->getBlock() && $target->getBlock()->getType() != DatabaseBlock::TYPE_AUTO ) {
                                $tools['block'] = $linkRenderer->makeKnownLink( # Change block link
                                        SpecialPage::getTitleFor( 'Block', $username ),
@@ -400,7 +405,7 @@ class SpecialContributions extends IncludableSpecialPage {
                );
 
                # Suppression log link (T61120)
-               if ( $sp->getUser()->isAllowed( 'suppressionlog' ) ) {
+               if ( $permissionManager->userHasRight( $sp->getUser(), 'suppressionlog' ) ) {
                        $tools['log-suppression'] = $linkRenderer->makeKnownLink(
                                SpecialPage::getTitleFor( 'Log', 'suppress' ),
                                $sp->msg( 'sp-contributions-suppresslog', $username )->text(),
@@ -412,7 +417,7 @@ class SpecialContributions extends IncludableSpecialPage {
                # Don't show some links for IP ranges
                if ( !$isRange ) {
                        # Uploads: hide if IPs cannot upload (T220674)
-                       if ( !$isIP || $target->isAllowed( 'upload' ) ) {
+                       if ( !$isIP || $permissionManager->userHasRight( $target, 'upload' ) ) {
                                $tools['uploads'] = $linkRenderer->makeKnownLink(
                                        SpecialPage::getTitleFor( 'Listfiles', $username ),
                                        $sp->msg( 'sp-contributions-uploads' )->text()
@@ -428,7 +433,7 @@ class SpecialContributions extends IncludableSpecialPage {
 
                        # Add link to deleted user contributions for priviledged users
                        # Todo: T183457
-                       if ( $sp->getUser()->isAllowed( 'deletedhistory' ) ) {
+                       if ( $permissionManager->userHasRight( $sp->getUser(), 'deletedhistory' ) ) {
                                $tools['deletedcontribs'] = $linkRenderer->makeKnownLink(
                                        SpecialPage::getTitleFor( 'DeletedContributions', $username ),
                                        $sp->msg( 'sp-contributions-deleted', $username )->text()
@@ -628,7 +633,10 @@ class SpecialContributions extends IncludableSpecialPage {
 
                $filters = [];
 
-               if ( $this->getUser()->isAllowed( 'deletedhistory' ) ) {
+               if ( MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $this->getUser(), 'deletedhistory' )
+               ) {
                        $filters[] = Html::rawElement(
                                'span',
                                [ 'class' => 'mw-input-with-label' ],
index cc2fc80..637025c 100644 (file)
@@ -57,7 +57,9 @@ class SpecialCreateAccount extends LoginSignupSpecialPage {
        }
 
        public function userCanExecute( User $user ) {
-               return $user->isAllowed( 'createaccount' );
+               return MediaWikiServices::getInstance()
+                       ->getPermissionManager()
+                       ->userHasRight( $user, 'createaccount' );
        }
 
        public function checkPermissions() {
index cccca50..540ac5a 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup SpecialPage
  */
 
+use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
 
@@ -155,7 +156,9 @@ class SpecialDoubleRedirects extends QueryPage {
                // if the page is editable, add an edit link
                if (
                        // check user permissions
-                       $this->getUser()->isAllowed( 'edit' ) &&
+                       MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $this->getUser(), 'edit' ) &&
                        // check, if the content model is editable through action=edit
                        ContentHandler::getForTitle( $titleA )->supportsDirectEditing()
                ) {
index 1dd1969..48357aa 100644 (file)
@@ -129,7 +129,7 @@ class SpecialEditTags extends UnlistedSpecialPage {
                        $this->ids
                );
 
-               $this->isAllowed = $user->isAllowed( 'changetags' );
+               $this->isAllowed = $this->permissionManager->userHasRight( $user, 'changetags' );
 
                $this->reason = $request->getVal( 'wpReason' );
                // We need a target page!
index b42cdea..c8b92bd 100644 (file)
@@ -253,7 +253,10 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                        return 'mailnologin';
                }
 
-               if ( !$user->isAllowed( 'sendemail' ) ) {
+               if ( !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $user, 'sendemail' )
+               ) {
                        return 'badaccess';
                }
 
index ef1b3d8..72e881f 100644 (file)
@@ -273,7 +273,10 @@ class SpecialExpandTemplates extends SpecialPage {
                        // allowed and a valid edit token is not provided (T73111). However, MediaWiki
                        // does not currently provide logged-out users with CSRF protection; in that case,
                        // do not show the preview unless anonymous editing is allowed.
-                       if ( $user->isAnon() && !$user->isAllowed( 'edit' ) ) {
+                       if ( $user->isAnon() && !MediaWikiServices::getInstance()
+                                       ->getPermissionManager()
+                                       ->userHasRight( $user, 'edit' )
+                       ) {
                                $error = [ 'expand_templates_preview_fail_html_anon' ];
                        } elseif ( !$user->matchEditToken( $request->getVal( 'wpEditToken' ), '', $request ) ) {
                                $error = [ 'expand_templates_preview_fail_html' ];
@@ -282,7 +285,7 @@ class SpecialExpandTemplates extends SpecialPage {
                        }
 
                        if ( $error ) {
-                               $out->wrapWikiMsg( "<div class='previewnote'>\n$1\n</div>", $error );
+                               $out->wrapWikiMsg( "<div class='previewnote errorbox'>\n$1\n</div>", $error );
                                return;
                        }
                }
index 5a63581..e680d24 100644 (file)
@@ -327,7 +327,9 @@ class SpecialExport extends SpecialPage {
         * @return bool
         */
        private function userCanOverrideExportDepth() {
-               return $this->getUser()->isAllowed( 'override-export-depth' );
+               return MediaWikiServices::getInstance()
+                       ->getPermissionManager()
+                       ->userHasRight( $this->getUser(), 'override-export-depth' );
        }
 
        /**
index f21c206..cfefa47 100644 (file)
@@ -135,18 +135,19 @@ class SpecialImport extends SpecialPage {
                }
 
                $user = $this->getUser();
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
                if ( !$user->matchEditToken( $request->getVal( 'editToken' ) ) ) {
                        $source = Status::newFatal( 'import-token-mismatch' );
                } elseif ( $this->sourceName === 'upload' ) {
                        $isUpload = true;
                        $this->usernamePrefix = $this->fullInterwikiPrefix = $request->getVal( 'usernamePrefix' );
-                       if ( $user->isAllowed( 'importupload' ) ) {
+                       if ( $permissionManager->userHasRight( $user, 'importupload' ) ) {
                                $source = ImportStreamSource::newFromUpload( "xmlimport" );
                        } else {
                                throw new PermissionsError( 'importupload' );
                        }
                } elseif ( $this->sourceName === 'interwiki' ) {
-                       if ( !$user->isAllowed( 'import' ) ) {
+                       if ( !$permissionManager->userHasRight( $user, 'import' ) ) {
                                throw new PermissionsError( 'import' );
                        }
                        $this->interwiki = $this->fullInterwikiPrefix = $request->getVal( 'interwiki' );
@@ -325,10 +326,11 @@ class SpecialImport extends SpecialPage {
        private function showForm() {
                $action = $this->getPageTitle()->getLocalURL( [ 'action' => 'submit' ] );
                $user = $this->getUser();
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
                $out = $this->getOutput();
                $this->addHelpLink( 'https://meta.wikimedia.org/wiki/Special:MyLanguage/Help:Import', true );
 
-               if ( $user->isAllowed( 'importupload' ) ) {
+               if ( $permissionManager->userHasRight( $user, 'importupload' ) ) {
                        $mappingSelection = $this->getMappingFormPart( 'upload' );
                        $out->addHTML(
                                Xml::fieldset( $this->msg( 'import-upload' )->text() ) .
@@ -401,7 +403,7 @@ class SpecialImport extends SpecialPage {
                        $out->addWikiMsg( 'importnosources' );
                }
 
-               if ( $user->isAllowed( 'import' ) && !empty( $this->importSources ) ) {
+               if ( $permissionManager->userHasRight( $user, 'import' ) && !empty( $this->importSources ) ) {
                        # Show input field for import depth only if $wgExportMaxLinkDepth > 0
                        $importDepth = '';
                        if ( $this->getConfig()->get( 'ExportMaxLinkDepth' ) > 0 ) {
index ac8baa1..7c85814 100644 (file)
@@ -94,7 +94,9 @@ class SpecialLog extends SpecialPage {
                if ( !LogPage::isLogType( $type ) ) {
                        $opts->setValue( 'type', '' );
                } elseif ( isset( $logRestrictions[$type] )
-                       && !$this->getUser()->isAllowed( $logRestrictions[$type] )
+                       && !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $this->getUser(), $logRestrictions[$type] )
                ) {
                        throw new PermissionsError( $logRestrictions[$type] );
                }
index 5b77d5a..1babf8c 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup SpecialPage
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Special page allowing users with the appropriate permissions to
index 6da362d..0767faf 100644 (file)
@@ -209,7 +209,9 @@ class MovePageForm extends UnlistedSpecialPage {
                }
 
                if ( count( $err ) == 1 && isset( $err[0][0] ) && $err[0][0] == 'file-exists-sharedrepo'
-                       && $user->isAllowed( 'reupload-shared' )
+                       && MediaWikiServices::getInstance()
+                                ->getPermissionManager()
+                                ->userHasRight( $user, 'reupload-shared' )
                ) {
                        $out->wrapWikiMsg(
                                "<div class='warningbox'>\n$1\n</div>\n",
@@ -374,7 +376,10 @@ class MovePageForm extends UnlistedSpecialPage {
                        );
                }
 
-               if ( $user->isAllowed( 'suppressredirect' ) ) {
+               if ( MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $user, 'suppressredirect' )
+               ) {
                        if ( $handlerSupportsRedirects ) {
                                $isChecked = $this->leaveRedirect;
                                $isDisabled = false;
@@ -520,6 +525,7 @@ class MovePageForm extends UnlistedSpecialPage {
 
        function doSubmit() {
                $user = $this->getUser();
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
 
                if ( $user->pingLimiter( 'move' ) ) {
                        throw new ThrottledError;
@@ -540,7 +546,7 @@ class MovePageForm extends UnlistedSpecialPage {
                # Show a warning if the target file exists on a shared repo
                $repoGroup = $services->getRepoGroup();
                if ( $nt->getNamespace() == NS_FILE
-                       && !( $this->moveOverShared && $user->isAllowed( 'reupload-shared' ) )
+                       && !( $this->moveOverShared && $permissionManager->userHasRight( $user, 'reupload-shared' ) )
                        && !$repoGroup->getLocalRepo()->findFile( $nt )
                        && $repoGroup->findFile( $nt )
                ) {
@@ -551,7 +557,7 @@ class MovePageForm extends UnlistedSpecialPage {
 
                # Delete to make way if requested
                if ( $this->deleteAndMove ) {
-                       $permErrors = $nt->getUserPermissionsErrors( 'delete', $user );
+                       $permErrors = $permissionManager->getPermissionErrors( 'delete', $user, $nt );
                        if ( count( $permErrors ) ) {
                                # Only show the first error
                                $this->showForm( $permErrors, true );
@@ -592,7 +598,7 @@ class MovePageForm extends UnlistedSpecialPage {
 
                if ( !$handler->supportsRedirects() ) {
                        $createRedirect = false;
-               } elseif ( $user->isAllowed( 'suppressredirect' ) ) {
+               } elseif ( $permissionManager->userHasRight( $user, 'suppressredirect' ) ) {
                        $createRedirect = $this->leaveRedirect;
                } else {
                        $createRedirect = true;
@@ -607,7 +613,6 @@ class MovePageForm extends UnlistedSpecialPage {
                        $this->moveTalk = false;
                }
                if ( $this->moveSubpages ) {
-                       $permissionManager = $services->getPermissionManager();
                        $this->moveSubpages = $permissionManager->userCan( 'move-subpages', $user, $ot );
                }
 
index 3c009c3..527b910 100644 (file)
@@ -39,6 +39,11 @@ class SpecialPagesWithProp extends QueryPage {
         */
        private $existingPropNames = null;
 
+       /**
+        * @var string|null
+        */
+       private $ns;
+
        /**
         * @var bool
         */
@@ -78,6 +83,13 @@ class SpecialPagesWithProp extends QueryPage {
                                'label-message' => 'pageswithprop-prop',
                                'required' => true,
                        ],
+                       'namespace' => [
+                               'type' => 'namespaceselect',
+                               'name' => 'namespace',
+                               'label-message' => 'namespace',
+                               'all' => null,
+                               'default' => null,
+                       ],
                        'reverse' => [
                                'type' => 'check',
                                'name' => 'reverse',
@@ -108,6 +120,7 @@ class SpecialPagesWithProp extends QueryPage {
 
        public function onSubmit( $data, $form ) {
                $this->propName = $data['propname'];
+               $this->ns = $data['namespace'];
                parent::execute( $data['propname'] );
        }
 
@@ -134,7 +147,7 @@ class SpecialPagesWithProp extends QueryPage {
        }
 
        public function getQueryInfo() {
-               return [
+               $query = [
                        'tables' => [ 'page_props', 'page' ],
                        'fields' => [
                                'page_id' => 'pp_page',
@@ -153,6 +166,12 @@ class SpecialPagesWithProp extends QueryPage {
                        ],
                        'options' => []
                ];
+
+               if ( $this->ns && isset( $this->ns ) ) {
+                       $query['conds']['page_namespace'] = $this->ns;
+               }
+
+               return $query;
        }
 
        function getOrderFields() {
index 3524d79..2ef96ad 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use MediaWiki\Auth\AuthManager;
+use MediaWiki\MediaWikiServices;
 
 /**
  * Special page for requesting a password reset email.
@@ -52,7 +53,11 @@ class SpecialPasswordReset extends FormSpecialPage {
 
        private function getPasswordReset() {
                if ( $this->passwordReset === null ) {
-                       $this->passwordReset = new PasswordReset( $this->getConfig(), AuthManager::singleton() );
+                       $this->passwordReset = new PasswordReset(
+                               $this->getConfig(),
+                               AuthManager::singleton(),
+                               MediaWikiServices::getInstance()->getPermissionManager()
+                       );
                }
                return $this->passwordReset;
        }
index 0bc9147..d541ead 100644 (file)
@@ -115,7 +115,10 @@ class SpecialPreferences extends SpecialPage {
        }
 
        protected function showResetForm() {
-               if ( !$this->getUser()->isAllowed( 'editmyoptions' ) ) {
+               if ( !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $this->getUser(), 'editmyoptions' )
+               ) {
                        throw new PermissionsError( 'editmyoptions' );
                }
 
@@ -134,7 +137,10 @@ class SpecialPreferences extends SpecialPage {
        }
 
        public function submitReset( $formData ) {
-               if ( !$this->getUser()->isAllowed( 'editmyoptions' ) ) {
+               if ( !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $this->getUser(), 'editmyoptions' )
+               ) {
                        throw new PermissionsError( 'editmyoptions' );
                }
 
index 0bfe185..4683fe6 100644 (file)
@@ -185,7 +185,9 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                if (
                        !$this->including() &&
                        $this->getUser()->isLoggedIn() &&
-                       $this->getUser()->isAllowed( 'viewmywatchlist' )
+                       MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $this->getUser(), 'viewmywatchlist' )
                ) {
                        $this->registerFiltersFromDefinitions( [ $this->watchlistFilterGroupDefinition ] );
                        $watchlistGroup = $this->getFilterGroup( 'watchlist' );
@@ -279,7 +281,10 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                $join_conds = array_merge( $join_conds, $rcQuery['joins'] );
 
                // JOIN on watchlist for users
-               if ( $user->isLoggedIn() && $user->isAllowed( 'viewmywatchlist' ) ) {
+               if ( $user->isLoggedIn() && MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $user, 'viewmywatchlist' )
+               ) {
                        $tables[] = 'watchlist';
                        $fields[] = 'wl_user';
                        $fields[] = 'wl_notificationtimestamp';
index 26f3665..0921ada 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * This is to display changes made to all articles linked in an article.
  *
@@ -91,7 +93,10 @@ class SpecialRecentChangesLinked extends SpecialRecentChanges {
 
                // left join with watchlist table to highlight watched rows
                $uid = $this->getUser()->getId();
-               if ( $uid && $this->getUser()->isAllowed( 'viewmywatchlist' ) ) {
+               if ( $uid && MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $this->getUser(), 'viewmywatchlist' )
+               ) {
                        $tables[] = 'watchlist';
                        $select[] = 'wl_user';
                        $join_conds['watchlist'] = [ 'LEFT JOIN', [
index 7444225..67177b7 100644 (file)
@@ -21,7 +21,9 @@
  * @ingroup SpecialPage
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\MediaWikiServices;
+use MediaWiki\Revision\RevisionRecord;
+use MediaWiki\Permissions\PermissionManager;
 
 /**
  * Special page allowing users with the appropriate permissions to view
@@ -66,6 +68,9 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
        /** @var string */
        private $otherReason;
 
+       /** @var PermissionManager */
+       private $permissionManager;
+
        /**
         * UI labels for each type.
         */
@@ -107,8 +112,15 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                ],
        ];
 
-       public function __construct() {
+       /**
+        * @inheritDoc
+        *
+        * @param PermissionManager $permissionManager
+        */
+       public function __construct( PermissionManager $permissionManager ) {
                parent::__construct( 'Revisiondelete', 'deleterevision' );
+
+               $this->permissionManager = $permissionManager;
        }
 
        public function doesWrites() {
@@ -124,13 +136,6 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                $output = $this->getOutput();
                $user = $this->getUser();
 
-               // Check blocks
-               // @TODO Use PermissionManager::isBlockedFrom() instead.
-               $block = $user->getBlock();
-               if ( $block ) {
-                       throw new UserBlockedError( $block );
-               }
-
                $this->setHeaders();
                $this->outputHeader();
                $request = $this->getRequest();
@@ -180,12 +185,19 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        return;
                }
 
+               // Check blocks
+               if ( $this->permissionManager->isBlockedFrom( $user, $this->targetObj ) ) {
+                       throw new UserBlockedError( $user->getBlock() );
+               }
+
                $this->typeLabels = self::$UILabels[$this->typeName];
                $list = $this->getList();
                $list->reset();
-               $this->mIsAllowed = $user->isAllowed( RevisionDeleter::getRestriction( $this->typeName ) );
-               $canViewSuppressedOnly = $this->getUser()->isAllowed( 'viewsuppressed' ) &&
-                       !$this->getUser()->isAllowed( 'suppressrevision' );
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+               $this->mIsAllowed = $permissionManager->userHasRight( $user,
+                       RevisionDeleter::getRestriction( $this->typeName ) );
+               $canViewSuppressedOnly = $permissionManager->userHasRight( $user, 'viewsuppressed' ) &&
+                       !$permissionManager->userHasRight( $user, 'suppressrevision' );
                $pageIsSuppressed = $list->areAnySuppressed();
                $this->mIsAllowed = $this->mIsAllowed && !( $canViewSuppressedOnly && $pageIsSuppressed );
 
@@ -202,7 +214,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        [ 'revdelete-hide-comment', 'wpHideComment', RevisionRecord::DELETED_COMMENT ],
                        [ 'revdelete-hide-user', 'wpHideUser', RevisionRecord::DELETED_USER ]
                ];
-               if ( $user->isAllowed( 'suppressrevision' ) ) {
+               if ( $permissionManager->userHasRight( $user, 'suppressrevision' ) ) {
                        $this->checks[] = [ 'revdelete-hide-restricted',
                                'wpHideRestricted', RevisionRecord::DELETED_RESTRICTED ];
                }
@@ -214,7 +226,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        $this->showForm();
                }
 
-               if ( $user->isAllowed( 'deletedhistory' ) ) {
+               if ( $permissionManager->userHasRight( $user, 'deletedhistory' ) ) {
                        $qc = $this->getLogQueryCond();
                        # Show relevant lines from the deletion log
                        $deleteLogPage = new LogPage( 'delete' );
@@ -228,7 +240,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        );
                }
                # Show relevant lines from the suppression log
-               if ( $user->isAllowed( 'suppressionlog' ) ) {
+               if ( $permissionManager->userHasRight( $user, 'suppressionlog' ) ) {
                        $suppressLogPage = new LogPage( 'suppress' );
                        $output->addHTML( "<h2>" . $suppressLogPage->getName()->escaped() . "</h2>\n" );
                        LogEventsList::showLogExtract(
@@ -267,7 +279,10 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                                        [ 'action' => 'history' ]
                                );
                                # Link to deleted edits
-                               if ( $this->getUser()->isAllowed( 'undelete' ) ) {
+                               if ( MediaWikiServices::getInstance()
+                                               ->getPermissionManager()
+                                               ->userHasRight( $this->getUser(), 'undelete' )
+                               ) {
                                        $undelete = SpecialPage::getTitleFor( 'Undelete' );
                                        $links[] = $linkRenderer->makeKnownLink(
                                                $undelete,
@@ -471,7 +486,10 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                                Xml::closeElement( 'fieldset' ) . "\n" .
                                Xml::closeElement( 'form' ) . "\n";
                        // Show link to edit the dropdown reasons
-                       if ( $this->getUser()->isAllowed( 'editinterface' ) ) {
+                       if ( MediaWikiServices::getInstance()
+                                       ->getPermissionManager()
+                                       ->userHasRight( $this->getUser(), 'editinterface' )
+                       ) {
                                $link = $this->getLinkRenderer()->makeKnownLink(
                                        $this->msg( 'revdelete-reason-dropdown' )->inContentLanguage()->getTitle(),
                                        $this->msg( 'revdelete-edit-reasonlist' )->text(),
@@ -497,7 +515,10 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        'revdelete-text-others'
                );
 
-               if ( $this->getUser()->isAllowed( 'suppressrevision' ) ) {
+               if ( MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $this->getUser(), 'suppressrevision' )
+               ) {
                        $this->getOutput()->addWikiMsg( 'revdelete-suppress-text' );
                }
 
@@ -602,7 +623,9 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                }
                # Can the user set this field?
                if ( $bitParams[RevisionRecord::DELETED_RESTRICTED] == 1
-                       && !$this->getUser()->isAllowed( 'suppressrevision' )
+                       && !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $this->getUser(), 'suppressrevision' )
                ) {
                        throw new PermissionsError( 'suppressrevision' );
                }
index 375694b..530c580 100644 (file)
@@ -52,7 +52,8 @@ class SpecialRunJobs extends UnlistedSpecialPage {
                }
 
                // Validate request parameters
-               $optional = [ 'maxjobs' => 0, 'maxtime' => 30, 'type' => false, 'async' => true ];
+               $optional = [ 'maxjobs' => 0, 'maxtime' => 30, 'type' => false,
+                       'async' => true, 'stats' => false ];
                $required = array_flip( [ 'title', 'tasks', 'signature', 'sigexpiry' ] );
                $params = array_intersect_key( $this->getRequest()->getValues(), $required + $optional );
                $missing = array_diff_key( $required, $params );
@@ -95,14 +96,20 @@ class SpecialRunJobs extends UnlistedSpecialPage {
                                DeferredUpdates::POSTSEND
                        );
                } else {
-                       $this->doRun( $params );
-                       print "Done\n";
+                       $stats = $this->doRun( $params );
+
+                       if ( $params['stats'] ) {
+                               $this->getRequest()->response()->header( 'Content-Type: application/json' );
+                               print FormatJson::encode( $stats );
+                       } else {
+                               print "Done\n";
+                       }
                }
        }
 
        protected function doRun( array $params ) {
                $runner = new JobRunner( LoggerFactory::getInstance( 'runJobs' ) );
-               $runner->run( [
+               return $runner->run( [
                        'type'     => $params['type'],
                        'maxJobs'  => $params['maxjobs'] ?: 1,
                        'maxTime'  => $params['maxtime'] ?: 30
index 9a95249..34665dd 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * A special page that lists tags for edits
  *
@@ -77,9 +79,10 @@ class SpecialTags extends SpecialPage {
                $out->wrapWikiMsg( "<div class='mw-tags-intro'>\n$1\n</div>", 'tags-intro' );
 
                $user = $this->getUser();
-               $userCanManage = $user->isAllowed( 'managechangetags' );
-               $userCanDelete = $user->isAllowed( 'deletechangetags' );
-               $userCanEditInterface = $user->isAllowed( 'editinterface' );
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+               $userCanManage = $permissionManager->userHasRight( $user, 'managechangetags' );
+               $userCanDelete = $permissionManager->userHasRight( $user, 'deletechangetags' );
+               $userCanEditInterface = $permissionManager->userHasRight( $user, 'editinterface' );
 
                // Show form to create a tag
                if ( $userCanManage ) {
@@ -329,7 +332,9 @@ class SpecialTags extends SpecialPage {
 
        protected function showDeleteTagForm( $tag ) {
                $user = $this->getUser();
-               if ( !$user->isAllowed( 'deletechangetags' ) ) {
+               if ( !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $user, 'deletechangetags' ) ) {
                        throw new PermissionsError( 'deletechangetags' );
                }
 
@@ -376,6 +381,7 @@ class SpecialTags extends SpecialPage {
 
                $form = HTMLForm::factory( 'ooui', $fields, $this->getContext() );
                $form->setAction( $this->getPageTitle( 'delete' )->getLocalURL() );
+               // @phan-suppress-next-line PhanUndeclaredProperty
                $form->tagAction = 'delete'; // custom property on HTMLForm object
                $form->setSubmitCallback( [ $this, 'processTagForm' ] );
                $form->setSubmitTextMsg( 'tags-delete-submit' );
@@ -388,7 +394,9 @@ class SpecialTags extends SpecialPage {
                $actionStr = $activate ? 'activate' : 'deactivate';
 
                $user = $this->getUser();
-               if ( !$user->isAllowed( 'managechangetags' ) ) {
+               if ( !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $user, 'managechangetags' ) ) {
                        throw new PermissionsError( 'managechangetags' );
                }
 
@@ -426,6 +434,7 @@ class SpecialTags extends SpecialPage {
 
                $form = HTMLForm::factory( 'ooui', $fields, $this->getContext() );
                $form->setAction( $this->getPageTitle( $actionStr )->getLocalURL() );
+               // @phan-suppress-next-line PhanUndeclaredProperty
                $form->tagAction = $actionStr;
                $form->setSubmitCallback( [ $this, 'processTagForm' ] );
                // tags-activate-submit, tags-deactivate-submit
@@ -434,6 +443,12 @@ class SpecialTags extends SpecialPage {
                $form->show();
        }
 
+       /**
+        * @param array $data
+        * @param HTMLForm $form
+        * @return bool
+        * @suppress PhanUndeclaredProperty $form->tagAction
+        */
        public function processTagForm( array $data, HTMLForm $form ) {
                $context = $form->getContext();
                $out = $context->getOutput();
index 9b8022b..931b179 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use MediaWiki\Block\DatabaseBlock;
+use MediaWiki\MediaWikiServices;
 
 /**
  * A special page for unblocking users
@@ -208,7 +209,10 @@ class SpecialUnblock extends SpecialPage {
 
                # If the name was hidden and the blocking user cannot hide
                # names, then don't allow any block removals...
-               if ( !$performer->isAllowed( 'hideuser' ) && $block->getHideName() ) {
+               if ( !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $performer, 'hideuser' ) && $block->getHideName()
+               ) {
                        return [ 'unblock-hideuser' ];
                }
 
index fe629db..d3d3bd7 100644 (file)
@@ -102,7 +102,9 @@ class SpecialUndelete extends SpecialPage {
                $this->mDiff = $request->getCheck( 'diff' );
                $this->mDiffOnly = $request->getBool( 'diffonly', $this->getUser()->getOption( 'diffonly' ) );
                $this->mComment = $request->getText( 'wpComment' );
-               $this->mUnsuppress = $request->getVal( 'wpUnsuppress' ) && $user->isAllowed( 'suppressrevision' );
+               $this->mUnsuppress = $request->getVal( 'wpUnsuppress' ) && MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $user, 'suppressrevision' );
                $this->mToken = $request->getVal( 'token' );
 
                $block = $user->getBlock();
@@ -153,7 +155,7 @@ class SpecialUndelete extends SpecialPage {
                if ( $this->mTargetObj !== null ) {
                        return $permissionManager->userCan( $permission, $user, $this->mTargetObj );
                } else {
-                       return $user->isAllowed( $permission );
+                       return $permissionManager->userHasRight( $user, $permission );
                }
        }
 
@@ -179,7 +181,10 @@ class SpecialUndelete extends SpecialPage {
                        $out->addWikiMsg( 'undelete-header' );
 
                        # Not all users can just browse every deleted page from the list
-                       if ( $user->isAllowed( 'browsearchive' ) ) {
+                       if ( MediaWikiServices::getInstance()
+                                       ->getPermissionManager()
+                                       ->userHasRight( $user, 'browsearchive' )
+                       ) {
                                $this->showSearchForm();
                        }
 
@@ -774,7 +779,8 @@ class SpecialUndelete extends SpecialPage {
                LogEventsList::showLogExtract( $out, 'delete', $this->mTargetObj );
                # Show relevant lines from the suppression log:
                $suppressLogPage = new LogPage( 'suppress' );
-               if ( $this->getUser()->isAllowed( 'suppressionlog' ) ) {
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+               if ( $permissionManager->userHasRight( $this->getUser(), 'suppressionlog' ) ) {
                        $out->addHTML( Xml::element( 'h2', null, $suppressLogPage->getName()->text() ) . "\n" );
                        LogEventsList::showLogExtract( $out, 'suppress', $this->mTargetObj );
                }
@@ -826,7 +832,7 @@ class SpecialUndelete extends SpecialPage {
                                ] )
                        );
 
-                       if ( $this->getUser()->isAllowed( 'suppressrevision' ) ) {
+                       if ( $permissionManager->userHasRight( $this->getUser(), 'suppressrevision' ) ) {
                                $fields[] = new OOUI\FieldLayout(
                                        new OOUI\CheckboxInputWidget( [
                                                'name' => 'wpUnsuppress',
@@ -866,7 +872,7 @@ class SpecialUndelete extends SpecialPage {
                if ( $haveRevisions ) {
                        # Show the page's stored (deleted) history
 
-                       if ( $this->getUser()->isAllowed( 'deleterevision' ) ) {
+                       if ( $permissionManager->userHasRight( $this->getUser(), 'deleterevision' ) ) {
                                $history .= Html::element(
                                        'button',
                                        [
index 81c9d56..e7c2e42 100644 (file)
@@ -311,16 +311,18 @@ class SpecialUpload extends SpecialPage {
        protected function showViewDeletedLinks() {
                $title = Title::makeTitleSafe( NS_FILE, $this->mDesiredDestName );
                $user = $this->getUser();
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
                // Show a subtitle link to deleted revisions (to sysops et al only)
                if ( $title instanceof Title ) {
                        $count = $title->isDeleted();
-                       if ( $count > 0 && $user->isAllowed( 'deletedhistory' ) ) {
+                       if ( $count > 0 && $permissionManager->userHasRight( $user, 'deletedhistory' ) ) {
                                $restorelink = $this->getLinkRenderer()->makeKnownLink(
                                        SpecialPage::getTitleFor( 'Undelete', $title->getPrefixedText() ),
                                        $this->msg( 'restorelink' )->numParams( $count )->text()
                                );
-                               $link = $this->msg( $user->isAllowed( 'delete' ) ? 'thisisdeleted' : 'viewdeleted' )
-                                       ->rawParams( $restorelink )->parseAsBlock();
+                               $link = $this->msg(
+                                       $permissionManager->userHasRight( $user, 'delete' ) ? 'thisisdeleted' : 'viewdeleted'
+                               )->rawParams( $restorelink )->parseAsBlock();
                                $this->getOutput()->addHTML(
                                        Html::rawElement(
                                                'div',
index 5747f67..585699d 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Special page to allow managing user group membership
  *
@@ -161,7 +163,10 @@ class UserrightsPage extends SpecialPage {
                         * (e.g. they don't have the userrights permission), then don't
                         * allow them to change any user rights.
                         */
-                       if ( !$user->isAllowed( 'userrights' ) ) {
+                       if ( !MediaWikiServices::getInstance()
+                                       ->getPermissionManager()
+                                       ->userHasRight( $user, 'userrights' )
+                       ) {
                                $block = $user->getBlock();
                                if ( $block && $block->isSitewide() ) {
                                        throw new UserBlockedError( $block );
@@ -515,7 +520,10 @@ class UserrightsPage extends SpecialPage {
                        if ( WikiMap::isCurrentWikiId( $dbDomain ) ) {
                                $dbDomain = '';
                        } else {
-                               if ( $writing && !$this->getUser()->isAllowed( 'userrights-interwiki' ) ) {
+                               if ( $writing && !MediaWikiServices::getInstance()
+                                               ->getPermissionManager()
+                                               ->userHasRight( $this->getUser(), 'userrights-interwiki' )
+                               ) {
                                        return Status::newFatal( 'userrights-no-interwiki' );
                                }
                                if ( !UserRightsProxy::validDatabase( $dbDomain ) ) {
index 3d56330..84b3331 100644 (file)
@@ -381,12 +381,10 @@ class SpecialWatchlist extends ChangesListSpecialPage {
 
                // Log entries with DELETED_ACTION must not show up unless the user has
                // the necessary rights.
-               if ( !$user->isAllowed( 'deletedhistory' ) ) {
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+               if ( !$permissionManager->userHasRight( $user, 'deletedhistory' ) ) {
                        $bitmask = LogPage::DELETED_ACTION;
-               } elseif ( !MediaWikiServices::getInstance()
-                       ->getPermissionManager()
-                       ->userHasAnyRight( $user, 'suppressrevision', 'viewsuppressed' )
-               ) {
+               } elseif ( !$permissionManager->userHasAnyRight( $user, 'suppressrevision', 'viewsuppressed' ) ) {
                        $bitmask = LogPage::DELETED_ACTION | LogPage::DELETED_RESTRICTED;
                } else {
                        $bitmask = 0;
index 2840086..5fe3605 100644 (file)
@@ -21,6 +21,7 @@
  * @todo Use some variant of Pager or something; the pagination here is lousy.
  */
 
+use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\IDatabase;
 
 /**
@@ -416,7 +417,9 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                // if the page is editable, add an edit link
                if (
                        // check user permissions
-                       $this->getUser()->isAllowed( 'edit' ) &&
+                       MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $this->getUser(), 'edit' ) &&
                        // check, if the content model is editable through action=edit
                        ContentHandler::getForTitle( $target )->supportsDirectEditing()
                ) {
index ea23973..445f0c3 100644 (file)
@@ -73,16 +73,18 @@ class PreferencesFormOOUI extends OOUIHTMLForm {
         * @return string
         */
        function getButtons() {
-               if ( !MediaWikiServices::getInstance()
-                       ->getPermissionManager()
-                       ->userHasAnyRight( $this->getModifiedUser(), 'editmyprivateinfo', 'editmyoptions' )
-               ) {
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+               if ( !$permissionManager->userHasAnyRight(
+                       $this->getModifiedUser(),
+                       'editmyprivateinfo',
+                       'editmyoptions'
+               ) ) {
                        return '';
                }
 
                $html = parent::getButtons();
 
-               if ( $this->getModifiedUser()->isAllowed( 'editmyoptions' ) ) {
+               if ( $permissionManager->userHasRight( $this->getModifiedUser(), 'editmyoptions' ) ) {
                        $t = $this->getTitle()->getSubpage( 'reset' );
 
                        $html .= new OOUI\ButtonWidget( [
@@ -109,6 +111,8 @@ class PreferencesFormOOUI extends OOUIHTMLForm {
        function filterDataForSubmit( $data ) {
                foreach ( $this->mFlatFields as $fieldname => $field ) {
                        if ( $field instanceof HTMLNestedFilterable ) {
+                               // @phan-suppress-next-next-line PhanUndeclaredProperty All HTMLForm fields have mParams,
+                               // but the instanceof confuses phan, which doesn't support intersections
                                $info = $field->mParams;
                                $prefix = $info['prefix'] ?? $fieldname;
                                foreach ( $field->filterDataForSubmit( $data[$fieldname] ) as $key => $value ) {
index 1e5f816..0b4e058 100644 (file)
@@ -76,7 +76,10 @@ class UploadForm extends HTMLForm {
                parent::__construct( $descriptor, $context, 'upload' );
 
                # Add a link to edit MediaWiki:Licenses
-               if ( $this->getUser()->isAllowed( 'editinterface' ) ) {
+               if ( MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $this->getUser(), 'editinterface' )
+               ) {
                        $this->getOutput()->addModuleStyles( 'mediawiki.special' );
                        $licensesLink = $linkRenderer->makeKnownLink(
                                $this->msg( 'licenses' )->inContentLanguage()->getTitle(),
index 0abe842..c9c3b07 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup Pager
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * This class is used to get a list of active users. The ones with specials
  * rights (sysop, bureaucrat, developer) will have them displayed
@@ -124,7 +126,10 @@ class ActiveUsersPager extends UsersPager {
                        ] ];
                        $conds['ug2.ug_user'] = null;
                }
-               if ( !$this->getUser()->isAllowed( 'hideuser' ) ) {
+               if ( !MediaWikiServices::getInstance()
+                                 ->getPermissionManager()
+                                 ->userHasRight( $this->getUser(), 'hideuser' )
+               ) {
                        $conds[] = 'NOT EXISTS (' . $dbr->selectSQLText(
                                        'ipblocks', '1', [ 'ipb_user=user_id', 'ipb_deleted' => 1 ]
                                ) . ')';
index 4441a33..718da6d 100644 (file)
@@ -137,7 +137,10 @@ class BlockListPager extends TablePager {
                                        $value,
                                        /* User preference timezone */true
                                ) );
-                               if ( $this->getUser()->isAllowed( 'block' ) ) {
+                               if ( MediaWikiServices::getInstance()
+                                               ->getPermissionManager()
+                                               ->userHasRight( $this->getUser(), 'block' )
+                               ) {
                                        $links = [];
                                        if ( $row->ipb_auto ) {
                                                $links[] = $linkRenderer->makeKnownLink(
@@ -358,7 +361,10 @@ class BlockListPager extends TablePager {
                $info['conds'][] = 'ipb_expiry > ' . $db->addQuotes( $db->timestamp() );
 
                # Is the user allowed to see hidden blocks?
-               if ( !$this->getUser()->isAllowed( 'hideuser' ) ) {
+               if ( !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $this->getUser(), 'hideuser' )
+               ) {
                        $info['conds']['ipb_deleted'] = 0;
                }
 
index d76dfb8..95749ba 100644 (file)
@@ -25,7 +25,7 @@
  */
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Linker\LinkRenderer;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\FakeResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
@@ -269,6 +269,7 @@ class ContribsPager extends RangeChronologicalPager {
                        'options' => [],
                        'join_conds' => $revQuery['joins'],
                ];
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
 
                // WARNING: Keep this in sync with getTargetTable()!
                $user = User::newFromName( $this->target, false );
@@ -313,14 +314,11 @@ class ContribsPager extends RangeChronologicalPager {
                $queryInfo['conds'] = array_merge( $queryInfo['conds'], $this->getNamespaceCond() );
 
                // Paranoia: avoid brute force searches (T19342)
-               if ( !$user->isAllowed( 'deletedhistory' ) ) {
+               if ( !$permissionManager->userHasRight( $user, 'deletedhistory' ) ) {
                        $queryInfo['conds'][] = $this->mDb->bitAnd(
                                'rev_deleted', RevisionRecord::DELETED_USER
                                ) . ' = 0';
-               } elseif ( !MediaWikiServices::getInstance()
-                       ->getPermissionManager()
-                       ->userHasAnyRight( $user, 'suppressrevision', 'viewsuppressed' )
-               ) {
+               } elseif ( !$permissionManager->userHasAnyRight( $user, 'suppressrevision', 'viewsuppressed' ) ) {
                        $queryInfo['conds'][] = $this->mDb->bitAnd(
                                'rev_deleted', RevisionRecord::SUPPRESSED_USER
                                ) . ' != ' . RevisionRecord::SUPPRESSED_USER;
index cd6294d..0ff54fd 100644 (file)
@@ -24,7 +24,7 @@
  */
 use MediaWiki\Linker\LinkRenderer;
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\Rdbms\IDatabase;
 use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\FakeResultWrapper;
@@ -90,13 +90,11 @@ class DeletedContribsPager extends IndexPager {
                ];
                $conds = array_merge( $userCond, $this->getNamespaceCond() );
                $user = $this->getUser();
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
                // Paranoia: avoid brute force searches (T19792)
-               if ( !$user->isAllowed( 'deletedhistory' ) ) {
+               if ( !$permissionManager->userHasRight( $user, 'deletedhistory' ) ) {
                        $conds[] = $this->mDb->bitAnd( 'ar_deleted', RevisionRecord::DELETED_USER ) . ' = 0';
-               } elseif ( !MediaWikiServices::getInstance()
-                       ->getPermissionManager()
-                       ->userHasAnyRight( $user, 'suppressrevision', 'viewsuppressed' )
-               ) {
+               } elseif ( !$permissionManager->userHasAnyRight( $user, 'suppressrevision', 'viewsuppressed' ) ) {
                        $conds[] = $this->mDb->bitAnd( 'ar_deleted', RevisionRecord::SUPPRESSED_USER ) .
                                ' != ' . RevisionRecord::SUPPRESSED_USER;
                }
@@ -325,8 +323,9 @@ class DeletedContribsPager extends IndexPager {
                );
 
                $user = $this->getUser();
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
 
-               if ( $user->isAllowed( 'deletedtext' ) ) {
+               if ( $permissionManager->userHasRight( $user, 'deletedtext' ) ) {
                        $last = $linkRenderer->makeKnownLink(
                                $undelete,
                                $this->messages['diff'],
@@ -344,7 +343,9 @@ class DeletedContribsPager extends IndexPager {
                $comment = Linker::revComment( $rev );
                $date = $this->getLanguage()->userTimeAndDate( $rev->getTimestamp(), $user );
 
-               if ( !$user->isAllowed( 'undelete' ) || !$rev->userCan( RevisionRecord::DELETED_TEXT, $user ) ) {
+               if ( !$permissionManager->userHasRight( $user, 'undelete' ) ||
+                        !$rev->userCan( RevisionRecord::DELETED_TEXT, $user )
+               ) {
                        $link = htmlspecialchars( $date ); // unusable link
                } else {
                        $link = $linkRenderer->makeKnownLink(
index 747dea2..bb5592c 100644 (file)
@@ -20,6 +20,7 @@
  */
 
 use MediaWiki\Linker\LinkRenderer;
+use MediaWiki\MediaWikiServices;
 
 class ProtectedPagesPager extends TablePager {
 
@@ -159,7 +160,10 @@ class ProtectedPagesPager extends TablePager {
                                $formatted = htmlspecialchars( $this->getLanguage()->formatExpiry(
                                        $value, /* User preference timezone */true ) );
                                $title = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
-                               if ( $this->getUser()->isAllowed( 'protect' ) && $title ) {
+                               if ( $title && MediaWikiServices::getInstance()
+                                                ->getPermissionManager()
+                                                ->userHasRight( $this->getUser(), 'protect' )
+                               ) {
                                        $changeProtection = $linkRenderer->makeKnownLink(
                                                $title,
                                                $this->msg( 'protect_change' )->text(),
index ba078e9..ee0ac00 100644 (file)
@@ -23,6 +23,8 @@
  * @ingroup Pager
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * This class is used to get a list of user. The ones with specials
  * rights (sysop, bureaucrat, developer) will have them displayed
@@ -123,7 +125,10 @@ class UsersPager extends AlphabeticPager {
                $conds = [];
 
                // Don't show hidden names
-               if ( !$this->getUser()->isAllowed( 'hideuser' ) ) {
+               if ( !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $this->getUser(), 'hideuser' )
+               ) {
                        $conds[] = 'ipb_deleted IS NULL OR ipb_deleted = 0';
                }
 
index 3bd66d4..3ebb443 100644 (file)
@@ -237,6 +237,7 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
         * @param LinkTarget $title
         *
         * @return string
+        * @suppress PhanUndeclaredProperty
         */
        public function getPrefixedText( LinkTarget $title ) {
                if ( !isset( $title->prefixedText ) ) {
index 3368e29..d7dfffa 100644 (file)
  * @file
  * @ingroup Upload
  */
+
+use MediaWiki\MediaWikiServices;
 use MediaWiki\Shell\Shell;
+use MediaWiki\User\UserIdentity;
 
 /**
  * @defgroup Upload Upload related
@@ -145,12 +148,13 @@ abstract class UploadBase {
         * identifying the missing permission.
         * Can be overridden by subclasses.
         *
-        * @param User $user
+        * @param UserIdentity $user
         * @return bool|string
         */
-       public static function isAllowed( $user ) {
+       public static function isAllowed( UserIdentity $user ) {
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
                foreach ( [ 'upload', 'edit' ] as $permission ) {
-                       if ( !$user->isAllowed( $permission ) ) {
+                       if ( !$permissionManager->userHasRight( $user, $permission ) ) {
                                return $permission;
                        }
                }
@@ -1954,7 +1958,10 @@ abstract class UploadBase {
                 * wfFindFile finds a file, it exists in a shared repository.
                 */
                $file = wfFindFile( $this->getTitle(), [ 'latest' => true ] );
-               if ( $file && !$user->isAllowed( 'reupload-shared' ) ) {
+               if ( $file && !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $user, 'reupload-shared' )
+               ) {
                        return [ 'fileexists-shared-forbidden', $file->getName() ];
                }
 
@@ -1969,9 +1976,10 @@ abstract class UploadBase {
         * @return bool
         */
        public static function userCanReUpload( User $user, File $img ) {
-               if ( $user->isAllowed( 'reupload' ) ) {
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+               if ( $permissionManager->userHasRight( $user, 'reupload' ) ) {
                        return true; // non-conditional
-               } elseif ( !$user->isAllowed( 'reupload-own' ) ) {
+               } elseif ( !$permissionManager->userHasRight( $user, 'reupload-own' ) ) {
                        return false;
                }
 
index b92fcc5..b87810d 100644 (file)
@@ -1,7 +1,4 @@
 <?php
-
-use MediaWiki\MediaWikiServices;
-
 /**
  * Backend for uploading files from a HTTP resource.
  *
@@ -24,6 +21,9 @@ use MediaWiki\MediaWikiServices;
  * @ingroup Upload
  */
 
+use MediaWiki\MediaWikiServices;
+use MediaWiki\User\UserIdentity;
+
 /**
  * Implements uploading from a HTTP resource.
  *
@@ -43,12 +43,15 @@ class UploadFromUrl extends UploadBase {
         * user is not allowed, return the name of the user right as a string. If
         * the user is allowed, have the parent do further permissions checking.
         *
-        * @param User $user
+        * @param UserIdentity $user
         *
         * @return bool|string
         */
-       public static function isAllowed( $user ) {
-               if ( !$user->isAllowed( 'upload_by_url' ) ) {
+       public static function isAllowed( UserIdentity $user ) {
+               if ( !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $user, 'upload_by_url' )
+               ) {
                        return 'upload_by_url';
                }
 
@@ -167,7 +170,9 @@ class UploadFromUrl extends UploadBase {
                $url = $request->getVal( 'wpUploadFileURL' );
 
                return !empty( $url )
-                       && $wgUser->isAllowed( 'upload_by_url' );
+                       && MediaWikiServices::getInstance()
+                                  ->getPermissionManager()
+                                  ->userHasRight( $wgUser, 'upload_by_url' );
        }
 
        /**
index ca3db5b..4c9099e 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * A CentralIdLookup provider that just uses local IDs. Useful if the wiki
  * isn't part of a cluster or you're using shared user tables.
@@ -69,7 +71,10 @@ class LocalIdLookup extends CentralIdLookup {
                        'user_id' => array_map( 'intval', array_keys( $idToName ) ),
                ];
                $join = [];
-               if ( $audience && !$audience->isAllowed( 'hideuser' ) ) {
+               if ( $audience && !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $audience, 'hideuser' )
+               ) {
                        $tables[] = 'ipblocks';
                        $join['ipblocks'] = [ 'LEFT JOIN', 'ipb_user=user_id' ];
                        $fields[] = 'ipb_deleted';
@@ -100,7 +105,10 @@ class LocalIdLookup extends CentralIdLookup {
                        'user_name' => array_map( 'strval', array_keys( $nameToId ) ),
                ];
                $join = [];
-               if ( $audience && !$audience->isAllowed( 'hideuser' ) ) {
+               if ( $audience && !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $audience, 'hideuser' )
+               ) {
                        $tables[] = 'ipblocks';
                        $join['ipblocks'] = [ 'LEFT JOIN', 'ipb_user=user_id' ];
                        $where[] = 'ipb_deleted = 0 OR ipb_deleted IS NULL';
index fd8eb3f..38707de 100644 (file)
@@ -22,6 +22,7 @@
 
 use MediaWiki\Auth\AuthManager;
 use MediaWiki\Auth\TemporaryPasswordAuthenticationRequest;
+use MediaWiki\Permissions\PermissionManager;
 use Psr\Log\LoggerAwareInterface;
 use Psr\Log\LoggerInterface;
 use MediaWiki\Logger\LoggerFactory;
@@ -40,6 +41,9 @@ class PasswordReset implements LoggerAwareInterface {
        /** @var AuthManager */
        protected $authManager;
 
+       /** @var PermissionManager */
+       private $permissionManager;
+
        /** @var LoggerInterface */
        protected $logger;
 
@@ -50,9 +54,14 @@ class PasswordReset implements LoggerAwareInterface {
         */
        private $permissionCache;
 
-       public function __construct( Config $config, AuthManager $authManager ) {
+       public function __construct(
+               Config $config,
+               AuthManager $authManager,
+               PermissionManager $permissionManager
+       ) {
                $this->config = $config;
                $this->authManager = $authManager;
+               $this->permissionManager = $permissionManager;
                $this->permissionCache = new MapCacheLRU( 1 );
                $this->logger = LoggerFactory::getInstance( 'authentication' );
        }
@@ -93,7 +102,7 @@ class PasswordReset implements LoggerAwareInterface {
                        } elseif ( !$this->config->get( 'EnableEmail' ) ) {
                                // Maybe email features have been disabled
                                $status = StatusValue::newFatal( 'passwordreset-emaildisabled' );
-                       } elseif ( !$user->isAllowed( 'editmyprivateinfo' ) ) {
+                       } elseif ( !$this->permissionManager->userHasRight( $user, 'editmyprivateinfo' ) ) {
                                // Maybe not all users have permission to change private data
                                $status = StatusValue::newFatal( 'badaccess' );
                        } elseif ( $this->isBlocked( $user ) ) {
index 4445e1d..fc96fe1 100644 (file)
@@ -1718,9 +1718,31 @@ class User implements IDBAccessObject, UserIdentity {
                // overwriting mBlockedby, surely?
                $this->load();
 
+               // TODO: Block checking shouldn't really be done from the User object. Block
+               // checking can involve checking for IP blocks, cookie blocks, and/or XFF blocks,
+               // which need more knowledge of the request context than the User should have.
+               // Since we do currently check blocks from the User, we have to do the following
+               // here:
+               // - Check if this is the user associated with the main request
+               // - If so, pass the relevant request information to the block manager
+               $request = null;
+
+               // The session user is set up towards the end of Setup.php. Until then,
+               // assume it's a logged-out user.
+               $sessionUser = RequestContext::getMain()->getUser();
+               $globalUserName = $sessionUser->isSafeToLoad()
+                       ? $sessionUser->getName()
+                       : IP::sanitizeIP( $sessionUser->getRequest()->getIP() );
+
+               if ( $this->getName() === $globalUserName ) {
+                       // This is the global user, so we need to pass the request
+                       $request = $this->getRequest();
+               }
+
                // @phan-suppress-next-line PhanAccessMethodInternal It's the only allowed use
                $block = MediaWikiServices::getInstance()->getBlockManager()->getUserBlock(
                        $this,
+                       $request,
                        $fromReplica
                );
 
@@ -2772,18 +2794,6 @@ class User implements IDBAccessObject, UserIdentity {
                }
        }
 
-       /**
-        * Set the password for a password reminder or new account email
-        *
-        * @deprecated Removed in 1.27. Use PasswordReset instead.
-        * @param string $str New password to set or null to set an invalid
-        *  password hash meaning that the user will not be able to use it
-        * @param bool $throttle If true, reset the throttle timestamp to the present
-        */
-       public function setNewpassword( $str, $throttle = true ) {
-               throw new BadMethodCallException( __METHOD__ . ' has been removed in 1.27' );
-       }
-
        /**
         * Get the user's e-mail address
         * @return string User's email address
@@ -3716,11 +3726,17 @@ class User implements IDBAccessObject, UserIdentity {
                                $this->setNewtalk( false );
 
                                // If there is a new, unseen, revision, use its timestamp
-                               $nextid = $oldid
-                                       ? $title->getNextRevisionID( $oldid, Title::READ_LATEST )
-                                       : null;
-                               if ( $nextid ) {
-                                       $this->setNewtalk( true, Revision::newFromId( $nextid ) );
+                               if ( $oldid ) {
+                                       $rl = MediaWikiServices::getInstance()->getRevisionLookup();
+                                       $oldRev = $rl->getRevisionById( $oldid, Title::READ_LATEST );
+                                       if ( $oldRev ) {
+                                               $newRev = $rl->getNextRevision( $oldRev );
+                                               if ( $newRev ) {
+                                                       // TODO: actually no need to wrap in a revision,
+                                                       // setNewtalk really only needs a RevRecord
+                                                       $this->setNewtalk( true, new Revision( $newRev ) );
+                                               }
+                                       }
                                }
                        } );
                }
@@ -4298,13 +4314,13 @@ class User implements IDBAccessObject, UserIdentity {
                                'password' => $password,
                        ]
                );
-               $res = AuthManager::singleton()->beginAuthentication( $reqs, 'null:' );
+               $res = $manager->beginAuthentication( $reqs, 'null:' );
                switch ( $res->status ) {
                        case AuthenticationResponse::PASS:
                                return true;
                        case AuthenticationResponse::FAIL:
                                // Hope it's not a PreAuthenticationProvider that failed...
-                               \MediaWiki\Logger\LoggerFactory::getInstance( 'authentication' )
+                               LoggerFactory::getInstance( 'authentication' )
                                        ->info( __METHOD__ . ': Authentication failed: ' . $res->message->plain() );
                                return false;
                        default:
index c185bab..b3489a2 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Handles searching prefixes of user names
  *
@@ -46,7 +48,10 @@ class UserNamePrefixSearch {
                $joinConds = [];
 
                // Filter out hidden user names
-               if ( $audience === 'public' || !$audience->isAllowed( 'hideuser' ) ) {
+               if ( $audience === 'public' || !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $audience, 'hideuser' )
+               ) {
                        $tables[] = 'ipblocks';
                        $cond['ipb_deleted'] = [ 0, null ];
                        $joinConds['ipblocks'] = [ 'LEFT JOIN', 'user_id=ipb_user' ];
index f3a8810..77ea3d9 100644 (file)
@@ -34,7 +34,7 @@ class AvroValidator {
         * @return string|string[] An error or list of errors in the
         *  provided $datum. When no errors exist the empty array is
         *  returned.
-        * @suppress PhanUndeclaredMethod
+        * @suppress PhanUndeclaredMethod,PhanUndeclaredProperty
         */
        public static function getErrors( AvroSchema $schema, $datum ) {
                switch ( $schema->type ) {
index df5ea70..13f2b52 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 use MediaWiki\Linker\LinkTarget;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use MediaWiki\User\UserIdentity;
 use Wikimedia\Assert\Assert;
 use Wikimedia\Rdbms\IDatabase;
index 6ba7796..e675889 100644 (file)
@@ -12,7 +12,7 @@
        "--exclude": [
                "resources/src/jquery.tablesorter",
                "resources/src/jquery.tipsy",
-               "resources/src/jquery/jquery.color.js",
+               "resources/src/jquery.color/jquery.color.js",
                "resources/src/jquery/jquery.highlightText.js",
                "resources/src/jquery/jquery.mw-jump.js",
                "resources/src/mediawiki.base/legacy.wikibits.js",
index 9886425..f42bb88 100644 (file)
@@ -21,7 +21,7 @@
 use MediaWiki\MediaWikiServices;
 
 use MediaWiki\Logger\LoggerFactory;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Base class for language conversion.
index 353127d..783a211 100644 (file)
@@ -80,7 +80,7 @@ class Names {
                'az' => 'azərbaycanca', # Azerbaijani
                'azb' => 'تۆرکجه', # South Azerbaijani
                'ba' => 'башҡортса', # Bashkir
-               'ban' => 'Basa Bali', # Balinese
+               'ban' => 'Bali', # Balinese
                'bar' => 'Boarisch', # Bavarian (Austro-Bavarian and South Tyrolean)
                'bat-smg' => 'žemaitėška', # Samogitian (deprecated code, 'sgs' in ISO 639-3 since 2010-06-30 )
                'bbc' => 'Batak Toba', # Batak Toba (falls back to bbc-latn)
index 0a15530..8fe3be3 100644 (file)
@@ -2982,7 +2982,7 @@ public static $zh2Hant = [
 '𫄨' => '絺',
 '𫄷' => '繶',
 '𫄸' => '纁',
-'ð«\87­' => 'è\94¿',
+'ð«\87­' => 'è\92\8d',
 '𫌀' => '襀',
 '𫌨' => '覼',
 '𫍙' => '訑',
@@ -3707,6 +3707,8 @@ public static $zh2Hant = [
 '于少保' => '于少保',
 '于山国' => '于山國',
 '于山國' => '于山國',
+'于山岛' => '于山島',
+'于山島' => '于山島',
 '于帅' => '于帥',
 '于帥' => '于帥',
 '于幼军' => '于幼軍',
@@ -3724,7 +3726,6 @@ public static $zh2Hant = [
 '于志寧' => '于志寧',
 '于忠肃集' => '于忠肅集',
 '于忠肅集' => '于忠肅集',
-'于思' => '于思',
 '于慎行' => '于慎行',
 '于慧' => '于慧',
 '于成龍' => '于成龍',
@@ -3817,6 +3818,7 @@ public static $zh2Hant = [
 '于都县' => '于都縣',
 '于都縣' => '于都縣',
 '于里察' => '于里察',
+'于闐' => '于闐',
 '于阗' => '于闐',
 '于双戈' => '于雙戈',
 '于雙戈' => '于雙戈',
@@ -4114,6 +4116,7 @@ public static $zh2Hant = [
 '党進' => '党進',
 '党項' => '党項',
 '党项' => '党項',
+'入侵并' => '入侵並',
 '内脏' => '內臟',
 '内制' => '內製',
 '内面包' => '內面包',
@@ -4470,6 +4473,8 @@ public static $zh2Hant = [
 '叮叮当当' => '叮叮噹噹',
 '叮当' => '叮噹',
 '可紧可松' => '可緊可鬆',
+'可能干預' => '可能干預',
+'可能干预' => '可能干預',
 '可自制' => '可自制',
 '可鉴' => '可鑑',
 '台子女' => '台子女',
@@ -4802,7 +4807,7 @@ public static $zh2Hant = [
 '大型钟面' => '大型鐘面',
 '大多只' => '大多只',
 '大伙' => '大夥',
-'大干' => '大幹',
+'大干一' => '大幹一',
 '大批涌到' => '大批湧到',
 '大折儿' => '大摺兒',
 '大明历' => '大明曆',
@@ -5527,6 +5532,8 @@ public static $zh2Hant = [
 '恶直丑正' => '惡直醜正',
 '恶斗' => '惡鬥',
 '惴栗' => '惴慄',
+'意大利面临' => '意大利面臨',
+'意大利面臨' => '意大利面臨',
 '意大利面' => '意大利麵',
 '愛河里花子' => '愛河里花子',
 '爱河里花子' => '愛河里花子',
@@ -5991,6 +5998,8 @@ public static $zh2Hant = [
 '方向' => '方向',
 '方法里' => '方法裡',
 '于吉林' => '於吉林',
+'于格林' => '於格林',
+'于越南' => '於越南',
 '于震中' => '於震中',
 '于震前' => '於震前',
 '于震后' => '於震後',
@@ -6474,6 +6483,8 @@ public static $zh2Hant = [
 '浅淀' => '淺澱',
 '清心寡欲' => '清心寡欲',
 '渠冲' => '渠衝',
+'温岚' => '温嵐',
+'温嵐' => '温嵐',
 '测不准' => '測不準',
 '港制' => '港製',
 '游离' => '游離',
@@ -6699,6 +6710,7 @@ public static $zh2Hant = [
 '版本里' => '版本裡',
 '牙签' => '牙籤',
 '牛只' => '牛隻',
+'牢里' => '牢裡',
 '物欲' => '物慾',
 '抵牾' => '牴牾',
 '抵触' => '牴觸',
@@ -7028,7 +7040,6 @@ public static $zh2Hant = [
 '称赞' => '稱讚',
 '稻谷' => '稻穀',
 '稽征' => '稽徵',
-'谷人' => '穀人',
 '谷保家商' => '穀保家商',
 '谷仓' => '穀倉',
 '谷圭' => '穀圭',
@@ -7656,6 +7667,7 @@ public static $zh2Hant = [
 '药签' => '藥籤',
 '药面儿' => '藥麵兒',
 '苏昆' => '蘇崑',
+'𬞟' => '蘋',
 '苹婆' => '蘋婆',
 '苹果' => '蘋果',
 '苹果干' => '蘋果乾',
@@ -7751,6 +7763,7 @@ public static $zh2Hant = [
 '袋表' => '袋錶',
 '袖里' => '袖裡',
 '被废后' => '被廢後',
+'被卷回' => '被捲回',
 '被系上' => '被繫上',
 '被里' => '被裡',
 '被夸' => '被誇',
@@ -9319,6 +9332,7 @@ public static $zh2Hant = [
 '鹰雕' => '鹰鵰',
 '鹰鵰' => '鹰鵰',
 '咸、甜' => '鹹、甜',
+'咸吃' => '鹹吃',
 '咸味' => '鹹味',
 '咸嘴淡舌' => '鹹嘴淡舌',
 '咸土' => '鹹土',
@@ -11458,6 +11472,7 @@ public static $zh2Hans = [
 '葦' => '苇',
 '葯' => '药',
 '葷' => '荤',
+'蒍' => '𫇭',
 '蒓' => '莼',
 '蒔' => '莳',
 '蒞' => '莅',
@@ -13699,6 +13714,7 @@ public static $zh2Hans = [
 '孫乾' => '孙乾',
 '宏碁' => '宏碁',
 '官陞' => '官升',
+'尋陞' => '寻升',
 '將軍抽俥' => '将军抽俥',
 '將軍抽車' => '将军抽車',
 '爾冬陞' => '尔冬升',
@@ -14152,7 +14168,10 @@ public static $zh2TW = [
 '克罗地亚' => '克羅埃西亞',
 '克羅地亞' => '克羅埃西亞',
 '克里斯托弗' => '克里斯多福',
+'全角' => '全形',
 '万维网' => '全球資訊網',
+'全角度' => '全角度',
+'全角色' => '全角色',
 '八杆' => '八桿',
 '公共交通' => '公共運輸',
 '六杆' => '六桿',
@@ -14259,6 +14278,7 @@ public static $zh2TW = [
 '塞维利亚' => '塞維亞',
 '西維爾' => '塞維亞',
 '塞黑' => '塞蒙',
+'多美和普林西比' => '多美普林西比',
 '塔希提' => '大溪地',
 '共和联邦' => '大英國協',
 '英联邦' => '大英國協',
@@ -14330,6 +14350,7 @@ public static $zh2TW = [
 '希拉里' => '希拉蕊',
 '希特拉' => '希特勒',
 '残疾人奥林匹克' => '帕拉林匹克',
+'殘疾人奧林匹克' => '帕拉林匹克',
 '残奥会' => '帕運會',
 '殘奧會' => '帕運會',
 '巴尔米拉环礁' => '帕邁拉環礁',
@@ -14413,6 +14434,7 @@ public static $zh2TW = [
 '施罗德' => '施洛德',
 '旱烟' => '旱菸',
 '旱煙' => '旱菸',
+'比勒陀利' => '普利托利',
 '普利策' => '普利茲',
 '普利策奖' => '普立茲獎',
 '芯片' => '晶片',
@@ -14429,6 +14451,8 @@ public static $zh2TW = [
 '马恩岛' => '曼島',
 '木杆' => '木桿',
 '尾班車' => '末班車',
+'萨格勒布' => '札格瑞布',
+'薩格勒布' => '札格瑞布',
 '列奥纳多' => '李奧納多',
 '杜塞尔多夫' => '杜塞道夫',
 '杜塞爾多夫' => '杜塞道夫',
@@ -14496,6 +14520,8 @@ public static $zh2TW = [
 '海洛英' => '海洛因',
 '侯賽因' => '海珊',
 '侯赛因' => '海珊',
+'温得和克' => '溫荷克',
+'溫得和克' => '溫荷克',
 '鼠标' => '滑鼠',
 '汉诺威' => '漢諾瓦',
 '漢诺威' => '漢諾瓦',
@@ -14607,13 +14633,12 @@ public static $zh2TW = [
 '卢浮宫' => '羅浮宮',
 '樂行童軍' => '羅浮童軍',
 '意大利' => '義大利',
+'意大利面' => '義大利麵',
 '昂山素姬' => '翁山蘇姬',
 '昂山素季' => '翁山蘇姬',
 '圣基茨和尼维斯' => '聖克里斯多福及尼維斯',
 '聖吉斯納域斯' => '聖克里斯多福及尼維斯',
 '聖佐治' => '聖喬治',
-'圣多美和普林西比' => '聖多美普林西比',
-'聖多美和普林西比' => '聖多美普林西比',
 '圣文森特和格林纳丁斯' => '聖文森及格瑞那丁',
 '聖文森特和格林納丁斯' => '聖文森及格瑞那丁',
 '圣赫勒拿' => '聖赫倫那',
@@ -14836,6 +14861,8 @@ public static $zh2TW = [
 '亚拉巴马' => '阿拉巴馬',
 '阿联酋' => '阿聯',
 '阿聯酋' => '阿聯',
+'亚的斯亚贝巴' => '阿迪斯阿貝巴',
+'亞的斯亞貝巴' => '阿迪斯阿貝巴',
 '罗纳德·里根' => '隆納·雷根',
 '私隱' => '隱私',
 '耶加達' => '雅加達',
@@ -14958,6 +14985,7 @@ public static $zh2HK = [
 '因特网' => '互聯網',
 '網際網路' => '互聯網',
 '井里' => '井裏',
+'阿迪斯阿貝巴' => '亞的斯亞貝巴',
 '亮著' => '亮着',
 '亮著《' => '亮著《',
 '亮著作' => '亮著作',
@@ -15340,6 +15368,9 @@ public static $zh2HK = [
 '柯林頓' => '克林頓',
 '克羅埃西亞' => '克羅地亞',
 '奈洛比' => '內羅畢',
+'全角' => '全形',
+'全角度' => '全角度',
+'全角色' => '全角色',
 '公布' => '公佈',
 '公寓里' => '公寓裏',
 '冒著' => '冒着',
@@ -16406,7 +16437,7 @@ public static $zh2HK = [
 '格瑞那達' => '格林納達',
 '格莱美奖' => '格林美獎',
 '葛萊美獎' => '格林美獎',
-'格鲁吉亚' => '格魯吉亞',
+'喬治亞字母' => '格魯吉亞字母',
 '框里' => '框裏',
 '台式电脑' => '桌上型電腦',
 '台球' => '桌球',
@@ -16462,6 +16493,7 @@ public static $zh2HK = [
 '殺著錄' => '殺著錄',
 '壳里' => '殼裏',
 '殿里' => '殿裏',
+'普利托利亞' => '比勒陀利亞',
 '茅利塔尼亞' => '毛里塔尼亞',
 '模里西斯' => '毛里裘斯',
 '毛里求斯' => '毛里裘斯',
@@ -16587,6 +16619,7 @@ public static $zh2HK = [
 '溢著者' => '溢著者',
 '溢著述' => '溢著述',
 '溢著錄' => '溢著錄',
+'溫荷克' => '溫得和克',
 '演著' => '演着',
 '演著作' => '演著作',
 '演著名' => '演著名',
@@ -16657,6 +16690,7 @@ public static $zh2HK = [
 '版图里' => '版圖裏',
 '版本里' => '版本裏',
 '版权信息' => '版權資訊',
+'牢里' => '牢裏',
 '千里達及托巴哥' => '特立尼達和多巴哥',
 '牽著' => '牽着',
 '牽著作' => '牽著作',
@@ -17123,6 +17157,7 @@ public static $zh2HK = [
 '聖克里斯多福及尼維斯' => '聖吉斯納域斯',
 '聖多美普林西比' => '聖多美和普林西比',
 '聖文森及格瑞那丁' => '聖文森特和格林納丁斯',
+'聖文森國' => '聖文森特和格林納丁斯',
 '聖露西亞' => '聖盧西亞',
 '聖馬利諾' => '聖馬力諾',
 '聽不著' => '聽不着',
@@ -17243,6 +17278,7 @@ public static $zh2HK = [
 '肖邦' => '蕭邦',
 '薛丁格' => '薛定諤',
 '塞拉耶佛' => '薩拉熱窩',
+'札格瑞布' => '薩格勒布',
 '萨达姆' => '薩達姆',
 '藉著' => '藉着',
 '藏著' => '藏着',
@@ -18106,6 +18142,7 @@ public static $zh2CN = [
 '網際網絡' => '互联网',
 '網際網路' => '互联网',
 '亞歷山卓' => '亚历山大',
+'阿迪斯阿貝巴' => '亚的斯亚贝巴',
 '雅穆索戈' => '亚穆苏克罗',
 '交帳' => '交账',
 '亮著' => '亮着',
@@ -18636,6 +18673,7 @@ public static $zh2CN = [
 '聖吉斯納域斯' => '圣基茨和尼维斯',
 '聖多美普林西比' => '圣多美和普林西比',
 '聖文森及格瑞那丁' => '圣文森特和格林纳丁斯',
+'聖文森國' => '圣文森特和格林纳丁斯',
 '聖馬利諾' => '圣马力诺',
 '蓋亞那' => '圭亚那',
 '坐著' => '坐着',
@@ -19413,6 +19451,7 @@ public static $zh2CN = [
 '格瑞那達' => '格林纳达',
 '格林美獎' => '格莱美奖',
 '葛萊美獎' => '格莱美奖',
+'喬治亞字母' => '格鲁吉亚字母',
 '森巴舞' => '桑巴舞',
 '梅赫西迪' => '梅赛德斯',
 '夢著' => '梦着',
@@ -19437,6 +19476,7 @@ public static $zh2CN = [
 '帕運會' => '残奥会',
 '帕拉林匹克' => '残疾人奥林匹克',
 '庇里牛斯' => '比利牛斯',
+'普利托利亞' => '比勒陀利亚',
 '披索' => '比索',
 '畢卡索' => '毕加索',
 '茅利塔尼亞' => '毛里塔尼亚',
@@ -19524,6 +19564,7 @@ public static $zh2CN = [
 '混帳' => '混账',
 '清澈' => '清澈',
 '清帳' => '清账',
+'溫荷克' => '温得和克',
 '渴著' => '渴着',
 '渴著書' => '渴著书',
 '渴著作' => '渴著作',
@@ -20108,6 +20149,7 @@ public static $zh2CN = [
 '獲著述' => '获著述',
 '菁寮' => '菁寮',
 '塞拉耶佛' => '萨拉热窝',
+'札格瑞布' => '萨格勒布',
 '落著' => '落着',
 '落著書' => '落著书',
 '落著作' => '落著作',
index fc8e5f7..7d93d5b 100644 (file)
        "tog-useeditwarning": "حذّرني عندما أغادر تحرير صفحة فيها تغييرات لم أحفظها",
        "tog-prefershttps": "استخدم دائما اتصالا آمنا عند تسجيل الدخول",
        "tog-showrollbackconfirmation": "إظهار رسالة تأكيد عند النقر على رابط الاسترجاع",
+       "tog-requireemail": "تتطلب البريد الإلكتروني لإعادة تعيين كلمة المرور",
        "underline-always": "دائما",
        "underline-never": "أبدا",
        "underline-default": "وفق المظهر أو المتصفح",
        "prefs-help-email": "تحديد عنوان البريد الإلكتروني اختياري، ولكنه يلزم لإعادة تعيين كلمة المرور في حال نسيت كلمة المرور الخاصة بك.",
        "prefs-help-email-others": "يمكنك أيضا أن تسمح للآخرين الاتصال بك عن طريق وصلة في صفحة المستخدم أو نقاش المستخدم الخاصة بك. لا يكشف بريدك الإلكتروني عندما يراسلك أحد بهذه الطريقة، ولكن إذا قمت بالرد سيرى بريدك الإلكتروني.",
        "prefs-help-email-required": "عنوان البريد الإلكتروني مطلوب.",
+       "prefs-help-requireemail": "إذا تم تحديده، فسوف يرسل رسائل البريد الإلكتروني الخاصة بإعادة تعيين كلمة المرور فقط إذا كان الشخص الذي قام بإعادة الضبط قد قدم اسم المستخدم والبريد الإلكتروني لهذا الحساب.",
        "prefs-info": "المعلومات الأساسية",
        "prefs-i18n": "الترجمة",
        "prefs-signature": "التوقيع",
        "ipblocklist-legend": "إيجاد مستخدم ممنوع",
        "blocklist-userblocks": "أخفِ منع الحسابات",
        "blocklist-tempblocks": "أخفِ المنع المؤقت",
+       "blocklist-indefblocks": "إخفاء عمليات المنع غير المحددة",
        "blocklist-addressblocks": "أخفِ منع عنوان أيبي واحد",
        "blocklist-type": "النوع:",
        "blocklist-type-opt-all": "الكل",
index bdbe4b0..fd973af 100644 (file)
        "nocreate-loggedin": "आप कय नँवा पन्ना बनावे कय अनुमति नाई है ।",
        "sectioneditnotsupported-title": "अनुभाग सम्पादन समर्थित नाई है",
        "sectioneditnotsupported-text": "इ पन्ना पे अनुभाग सम्पादन समर्थित नाई है",
+       "modeleditnotsupported-title": "संपादन सपोर्ट नही करत",
+       "modeleditnotsupported-text": "सामग्री मॉडल $1 के बरे संपादन सपोर्ट नही अहै",
        "permissionserrors": "अनुमति त्रुटि",
        "permissionserrorstext": "निचे दिहा {{PLURAL:$1|कारण|कारणन्}} कय नाते आप कय ऐसन करे कय अनुमति नाइ है:",
        "permissionserrorstext-withaction": "आप कय $2 कय अनुमति नाई है,निचे दिहा {{PLURAL:$1|कारण|कारणन्}} कय नाते से:",
        "sessionfailure": "ऐसा प्रतीत होता है कि आपके लॉगिन सत्र के साथ कोई समस्या है।\nसत्र अपहरण से बचाने के लिए सावधानी के तौर पर आपका यह क्रियाकलाप रद्द कर दिया गया है।\nकृपया पीछे जाएँ और पृष्ठ को पुनः लोड करें, तब दुबारा कोशिश करें।",
        "changecontentmodel": "पन्ने का सामग्री प्रारूप बदलें",
        "changecontentmodel-legend": "पृष्ठ सामग्री का नमूना",
-       "changecontentmodel-title-label": "पृष्ठ शीर्षक",
+       "changecontentmodel-title-label": "पृष्ठ शीर्षक:",
        "changecontentmodel-current-label": "Current content model:",
-       "changecontentmodel-model-label": "नयि à¤¸à¤¾à¤®à¤\97à¥\8dरà¥\80 à¤\95ा à¤¨à¤®à¥\82ना",
+       "changecontentmodel-model-label": "नयि à¤¸à¤¾à¤®à¤\97à¥\8dरà¥\80 à¤\95य à¤¨à¤®à¥\82ना:",
        "changecontentmodel-reason-label": "कारण:",
        "changecontentmodel-submit": "बदला",
        "changecontentmodel-success-title": "सामगरि का नामुने मे बदलाव हुुुाा हेेे",
index 37e5947..b142bb5 100644 (file)
                        "Joseagush",
                        "Wandering ant",
                        "Kadek Ayu Sulastri",
-                       "Luh Gede Krismayanti"
+                       "Luh Gede Krismayanti",
+                       "Amire80"
                ]
        },
        "tog-underline": "Garis ring beten pranala:",
-       "tog-hideminor": "engkebang suntingan ring gentosan sane pinih anyar",
-       "tog-hidepatrolled": "engkebang suntingan mapatrol ring gentosan sane pinih anyar",
+       "tog-hideminor": "Engkebang uahan alit saking uahan sané mangkin",
+       "tog-hidepatrolled": "Engkebang uahan sané kapatroli saking uahan sané mangkin",
        "tog-newpageshidepatrolled": "engkebang lembar mapatrol saking saking kepahan lembar anyar",
        "tog-hidecategorization": "Engkebang kacané",
        "tog-extendwatchlist": "kembangang kepahan pangiwasan antuk nampilang samian panguwahan, nenten sane anyar kewanten",
@@ -30,6 +31,8 @@
        "tog-watchdefault": "imbuhin lembar panyuntingansane sunting titiang ring kepahan pangiwasan",
        "tog-watchmoves": "imbuhang lembar sane kakisidang titiang ring kepahan pangiwasan",
        "tog-watchdeletion": "imbuhin lembar sane kaapus ring kepahan pangiwasan",
+       "tog-watchuploads": "Tambehin berkas anyar sané unggah tiang ka pupulan pantaun\nTambahkan berkas baru yang saya unggah ke daftar pantauan",
+       "tog-watchrollback": "Tambehin kaca sané sampun uliang tiang ka tengah pupulan pantauan tiangé",
        "tog-minordefault": "pingetin samian suntingan dados suntingan alit sane ajeg",
        "tog-previewontop": "tampilang pratayang sadurung kotak sunting lan nenten sadurungnyane",
        "tog-previewonfirst": "tampilang pratayang ring suntingan kapertama",
@@ -46,6 +49,8 @@
        "tog-watchlisthidebots": "engkebang panguwahan bot ring kepahan pangiwasan",
        "tog-watchlisthideminor": "engkebang panguwahan alit ring kepahan pangiwasan",
        "tog-watchlisthideliu": "engkebang suntingan penganggen malebu log ring kepahan pangiwasan",
+       "tog-watchlistreloadautomatically": "Ulangin pupulan pantauan manut otomatis ritatkala silih tunggil penyaringan kauah (JavaScript kaperluang)",
+       "tog-watchlistunwatchlinks": "Tambehin pacihna pantau/usap pantauan ka kaca sané kapantau tur kauah (JavaScript kaperluang anggén nganti tetujon puniki)",
        "tog-watchlisthideanons": "engkebangsuntingan penganggen tan maadan ring kepahan pangiwasan",
        "tog-watchlisthidepatrolled": "engkebang panguwahan mapatrol kepahan pangiwasan",
        "tog-watchlisthidecategorization": "Engkebang katégorisasi kacané",
@@ -55,6 +60,8 @@
        "tog-norollbackdiff": "Sampunang tampilang binanne sesampun ngewaliang",
        "tog-useeditwarning": "elingang titiang yening ngalahin lembar panyuntingan sadurung nyimpen pagentosan",
        "tog-prefershttps": "Setata nganggen sambungan sane aman rikala malebu log",
+       "tog-showrollbackconfirmation": "Sinahang konfirmasi ritatkala ngklik pranala sané kauliang\nTampilkan konfirmasi ketika mengeklik pranala pengembalian",
+       "tog-requireemail": "Kaperluang sewala anggén ngawé malih kruna sandi",
        "underline-always": "Setata",
        "underline-never": "Nénten naénin",
        "underline-default": "kulit utawi penjelajah paaban",
@@ -73,7 +80,7 @@
        "mon": "Som",
        "tue": "Ang",
        "wed": "Bud",
-       "thu": "Wrs",
+       "thu": "Wra",
        "fri": "Suk",
        "sat": "San",
        "january": "Januari",
        "may": "Méi",
        "jun": "Jun",
        "jul": "Jul",
-       "aug": "Ags",
+       "aug": "Agu",
        "sep": "Sép",
        "oct": "Okt",
        "nov": "Nop",
        "dec": "Dés",
-       "january-date": "Januari $1",
-       "february-date": "Februari $1",
-       "march-date": "Maret $1",
-       "april-date": "April $1",
-       "may-date": "Mei $1",
-       "june-date": "Juni $1",
-       "july-date": "Juli $1",
-       "august-date": "Agustus $1",
-       "september-date": "September $1",
-       "october-date": "Oktober $1",
-       "november-date": "November $1",
-       "december-date": "Desember $1",
+       "january-date": "$1 Januari",
+       "february-date": "$1 Pébruari",
+       "march-date": "$1 Maret",
+       "april-date": "$1 April",
+       "may-date": "$1 Méi",
+       "june-date": "$1 Juni",
+       "july-date": "$1 Juli",
+       "august-date": "$1 Agustus",
+       "september-date": "$1 Séptémber",
+       "october-date": "$1 Oktober",
+       "november-date": "$1 Nopémber",
+       "december-date": "$1 Désémber",
        "period-am": "AM",
        "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|Kategori}}",
        "category_header": "Kaca ring ketegori \"$1\"",
        "subcategories": "Subkategori",
        "category-media-header": "Média ring kategori \"$1\"",
-       "category-empty": "\"mangkin, nenten madaging lembar utawi pekakas ring golongan puniki\"",
-       "hidden-categories": "{{plural:$1|punduhan sane kaengkebang| punduhan sane kaengkebang}}",
-       "hidden-category-category": "Kategori mengkeb",
-       "category-subcat-count": "{{PLURAL:$2| golongan puniki madue {{PLURAL:$1|$1 subkategori}} puniki, saking genepan $2.}}",
-       "category-article-count": "{{PLURAL:$2|golongan puniki madue{{PLURAL:$1|$1 lembar}}, saking total $2.}}",
+       "category-empty": "<em>Kategori puniki mangkin nénten madaging kaca utawi média.</em>",
+       "hidden-categories": "{{plural:$1|Kategori sané kaengkebang}}",
+       "hidden-category-category": "Kategori sané kaengkebang",
+       "category-subcat-count": "{{PLURAL:$2|Kategori iki wantah madué subkategori ring sor puniki|Kategori iki madué {{PLURAL:$1|subkategori|$1 subkategori}} ring sor puniki, saking $2 akéhnyané.}}",
+       "category-subcat-count-limited": "Kelompok puniki madué {{PLURAL:$1|$1 kategori alit}} sakadi punika.",
+       "category-article-count": "{{PLURAL:$2|Kategori puniki wantah madué kaca ring sor puniki.|{{PLURAL:$1|Kaca|$1 kaca}} ring sor puniki wénten ring kategori puniki, saking $2 akéhnyané.}}",
+       "category-article-count-limited": "Kelompok puniki madué {{PLURAL:$1|$1 kaca}} sakadi punika.",
        "category-file-count": "{{PLURAL:$2|golongan puniki madue{{PLURAL:$1|$1 lembar}}, saking total $2.}}",
+       "category-file-count-limited": "Kelompok puniki madué {{PLURAL:$1|$1 berkas}} sakadi punika.",
        "listingcontinuesabbrev": "lant.",
        "index-category": "Lembar sane maindeks",
        "noindex-category": "Lembar sane nenten maindeks",
        "broken-file-category": "Suratan sane ngelah pranala usak",
+       "categoryviewer-pagedlinks": "($1) ($2)",
+       "category-header-numerals": "$1–$2",
        "about": "Indik",
        "article": "Kaca daging",
-       "newwindow": "(bukak ring jendela anyar)",
+       "newwindow": "(métbét ring jendéla anyar)",
        "cancel": "Wangdé",
        "moredotdotdot": "Lianan...",
+       "morenotlisted": "Bacakan puniki asané nénten lengkap.",
        "mypage": "Kaca",
        "mytalk": "Pabligbagan",
        "anontalk": "Pabligbagan",
        "and": "&#32;miwah",
        "faq": "FAQ (pitaken sane jagi katakonang)",
        "actions": "Parilaksana",
-       "namespaces": "Genah wastan",
+       "namespaces": "Genah aran",
        "variants": "Varian",
        "navigation-heading": "Menu navigasi",
        "errorpagetitle": "Kaiwangan",
        "help": "Wantuan",
        "help-mediawiki": "Pitulung MediaWiki",
        "search": "Rereh",
+       "search-ignored-headings": "# <pre>\n# Murda sané jagi nénten karunguang olih pangrereh.\n# Suratan puniki jagi kalaksanayang sasampun kaca taler murda puniki kaindeks.\n# Ragané prasida ngmaksayang pangindeksan mawali kaca puniki antuk nglaksanayang suratan kosong (''null edit'')\n# Sintaksisnyané sakadi puniki:\n#   * Makasami saking watek \"#\" ka bait untat inggih punika silih tunggil pabligbagan.\n#   * Tiap bait ten-kosong inggih punika murda sané patut sané jagi nénten karunguang.\nReferensi\nPranala luar\nCingak taler\n #</pre>",
        "searchbutton": "Rereh",
        "go": "Lanturang",
        "searcharticle": "Rereh",
        "history": "Babad kaca",
        "history_short": "Babad",
        "history_small": "babad",
+       "updatedmarker": "kamutakhiran sekat pengunjung tiang sané kaping untat",
        "printableversion": "Vérsi cétak",
        "permalink": "Pranala ajeg",
        "print": "Citak",
        "view": "Cingak",
        "view-foreign": "Cingak ring $1",
        "edit": "Uah",
-       "create": "Karyanin",
-       "create-local": "Icénin daging sané marupa paparan lokal",
+       "edit-local": "Tambeh déskripsi lokal",
+       "create": "Kardi",
+       "create-local": "Tambeh déskripsi lokal",
        "delete": "Usap",
+       "undelete_short": "Wangdeang usap {{PLURAL:$1|$1 suratan}}",
        "viewdeleted_short": "Cingak {{PLURAL:$1|siki uahan sané kausapin|$1 uahan sané kausapin}}",
        "protect": "Saib",
        "protect_change": "uah",
        "personaltools": "Pekakas praragan",
        "talk": "Pabligbagan",
        "views": "Pakantenan",
-       "toolbox": "Pekakas",
+       "toolbox": "Piranti",
+       "tool-link-userrights": "Uah{{GENDER:$1|pangangge}}",
+       "tool-link-userrights-readonly": "Cingak kelompok {{GENDER:$1|pangangge}}",
        "tool-link-emailuser": "Kirim surel ring {{GENDER:$1|pengguna}} puniki",
        "imagepage": "Cingak kaca berkas",
-       "mediawikipage": "Cingak kaca séwalapatra",
+       "mediawikipage": "Cingak kaca séwala",
        "templatepage": "Cingak kaca cétakan",
        "viewhelppage": "Cingak kaca wantuan",
        "categorypage": "Cingak kaca kategori",
        "redirectedfrom": "(Kagingsirang saking $1)",
        "redirectpagesub": "Kaca gingsiran",
        "redirectto": "Magingsir ring:",
-       "lastmodifiedat": "Kaca puniki kaping untat kauah rikala  $2, $1",
+       "lastmodifiedat": "Kaca puniki kaping untat kauah ri tatkala  $2, $1",
+       "viewcount": "Kaca puniki sampun diaksés ping {{PLURAL:$1|$1 kali}}.<br />",
        "protectedpage": "Kaca sané kasaibin",
        "jumpto": "Lanturang ka:",
        "jumptonavigation": "navigasi",
        "jumptosearch": "rereh",
+       "view-pool-error": "Ampura, server kari sibuk mangkin.\nAkéh pisan panganggé sané mautsaha nyingakin kaca puniki.\nAntosang jebos sadurung ragané jagi ngeaksés kaca puniki. \nMaaf, server sedang sibuk pada saat ini.\nTerlalu banyak pengguna berusaha melihat halaman ini.\nTunggu sebentar sebelum Anda mencoba lagi mengakses halaman ini.\n\n$1",
+       "generic-pool-error": "Ampura, server kari sibuk mangkin.\nKaliwat akéh panganggé sané mautsaha nyingakin sumber puniki.\nAntosang jebos sadurung ragané jagi ngaksés kaca puniki malih.",
+       "pool-timeout": "Liwat galah ngantosang kunci",
+       "pool-queuefull": "Pupulan antrian sampun penuh",
        "pool-errorunknown": "Iwang sané durung kauningin",
+       "pool-servererror": "Layanan pangitung pool punika nénten kasayagayang ($1).",
+       "poolcounter-usage-error": "Pikobet panganggean: $1",
        "aboutsite": "Indik {{SITENAME}}",
        "aboutpage": "Project:Indik",
+       "copyright": "Daging kasayagayang ring sor $1 ri tatkala nénten wénten uahan.",
        "copyrightpage": "{{ns:project}}:Hak cipta",
        "currentevents": "Kawéntenané mangkin",
        "currentevents-url": "Project:Kawéntenané mangkin",
        "helppage-top-gethelp": "Wantuan",
        "mainpage": "Kaca Utama",
        "mainpage-description": "Kaca utama",
+       "policy-url": "Project:Kapatutan",
        "portal": "Kori sekaa",
        "portal-url": "Project:Kori sekaa",
        "privacy": "Awig-awig indik data praragan",
        "privacypage": "Project:Awig-awig indik data praragan",
+       "badaccess": "Pikobet lugra",
+       "badaccess-group0": "Ragané nénten kadurusang antuk nglaksanayang parilaksana sakadi sané kapinta.\nAnda tidak diizinkan untuk melakukan tindakan yang Anda minta.",
+       "badaccess-groups": "Parilaksana sané kapinta kawatesin antuk pangangge ring tengah {{PLURAL:$2|kelompok}}: $1.",
+       "versionrequired": "Kaperluang MediaWiki manut $1",
+       "versionrequiredtext": "MediaWiki versi $1 kaperluang antuk nglaksanayang kaca puniki. Cingak [[Special:Version|kaca versi]]",
        "ok": "OK",
        "retrievedfrom": "Kapolihang saking \"$1\"",
-       "youhavenewmessages": "{{PLURAL:$3|Jero madué}} $1 ($2)",
-       "youhavenewmessagesfromusers": "{{PLURAL:$4|Ida dané madué}} $1 saking {{PLURAL:$3|$3 sang anganggé lianan}} ($2).",
+       "youhavenewmessages": "{{PLURAL:$3|Ragané madué}} $1 ($2)",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Ragané madué}} $1 saking {{PLURAL:$3|$3 sang anganggé lianan}} ($2).",
        "youhavenewmessagesmanyusers": "Jero madué $1 saking akéh sang anganggé ($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|séwalapatra anyar abesik|999=séwalapatra anyar}}",
+       "newmessageslinkplural": "{{PLURAL:$1|séwala anyar abesik|999=séwala anyar}}",
        "newmessagesdifflinkplural": "$1 {{PLURAL:$1|uahan}}",
-       "youhavenewmessagesmulti": "Ida dané madué séwalapatra anyar ring $1",
+       "youhavenewmessagesmulti": "Ragané madué séwala anyar ring $1",
        "editsection": "uah",
        "editold": "uah",
        "viewsourceold": "cingak wit",
        "toc": "Daging",
        "showtoc": "sinahang",
        "hidetoc": "engkebang",
+       "collapsible-collapse": "Alitin malih",
        "collapsible-expand": "buka",
        "confirmable-confirm": "{{GENDER:$1|Jero}} yakin?",
        "confirmable-yes": "Inggih",
        "confirmable-no": "Nénten",
+       "thisisdeleted": "Cingak utawi uliang $1?",
        "viewdeleted": "Cingak $1?",
        "restorelink": "{{PLURAL:$1|siki uahan sané kausapin|$1 uahan sané kausapin}}",
        "feedlinks": "Asupan:",
        "feed-invalid": "Tipe permintaan asupan tusing beneh.",
+       "feed-unavailable": "Umpan sindikasi nénten kasayagayang",
+       "site-rss-feed": "Umpan RSS $1",
        "site-atom-feed": "$1 \"atom feed\"",
+       "page-rss-feed": "Umpan RSS \"$1\"",
        "page-atom-feed": "$1 \"atom feed\"",
        "red-link-title": "$1 (kaca nénten wénten)",
+       "sort-descending": "Urutang ka betén",
+       "sort-ascending": "Urutang menék",
        "nstab-main": "Kaca",
        "nstab-user": "Kaca sang anganggé",
+       "nstab-media": "Kaca media",
        "nstab-special": "Kaca kusus",
        "nstab-project": "Kaca proyék",
        "nstab-image": "Depukan",
-       "nstab-mediawiki": "Séwalapatra",
+       "nstab-mediawiki": "Séwala",
        "nstab-template": "Cétakan",
        "nstab-help": "Kaca wantuan",
        "nstab-category": "Kategori",
        "mainpage-nstab": "Kaca utama",
+       "nosuchaction": "Nénten wénten parilaksana sakadi punika",
+       "nosuchactiontext": "Parilaksana sané kapinta olih URL punika nénten valid. Ragané asané iwang ngetik URL, utawi ngikutin silih tunggil pranala sané ten patut. Unduk puniki taler asané kaindikasian silih tunggil bug ring perangkat lunak sané kaanggén olih {{SITENAME}}.",
        "nosuchspecialpage": "Nénten wénten kaca kusus sakadi punika",
        "nospecialpagetext": "<strong>Ida nagih kaca pinih luwih sane nenten patut.</strong>\n\nWacakan kaca pinih luwih dados kacingak ring [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Kaiwangan",
        "databaseerror": "Database kaluputan",
-       "databaseerror-query": "Kueri: $1",
+       "databaseerror-text": "Silih tunggil galat kueri basis data sampun kalaksanayang.\nIndik puniki asané kaindikasian wénten pikobet ring perangkat lunaknyané.",
+       "databaseerror-textcl": "Silih tunggil galat kueri basis data sampun kajadian.",
+       "databaseerror-query": "Kuéri: $1",
        "databaseerror-function": "Pungsi: $1",
        "databaseerror-error": "Pelih: $1",
+       "transaction-duration-limit-exceeded": "Mangde nénten katunda saduran sané tegeh, kiriman puniki kawangdeang mawanin galah nyurat ($1) ngliwatin wates $2 ring limit dauh.\nYéning ragané jagi nguah akéh ring galah sané masikian, ngiring laksanayang ring karya sané alitan.",
+       "laggedslavemode": "Pangeling: Kaca asané nénten kadagingin uahan pinih anyar.",
+       "readonly": "Basis data kakunci",
+       "enterlockreason": "Asukan napi sané ngawinan penguncian, rumasuk kirang langkung ring galah napu kunci jagi kabuka",
+       "readonlytext": "Basis data kantun kakunci ring masukan miwah uahan sané anyar, asané pamecikan basis data, sasampun keadaan jagi normal sakadi sadurungnyané. \n\nPrajuru sané nglaksanayang panguncian ngemaang daging sakadi punika: $1",
        "missing-article": "data utama nenten prasida nemu tulisan saking lembar sane sepatutne wenten, inggih punika  $1, $2\n\nindike puniki biasane keranayang olih pranala kaon nuju pabenahan sane dumun lembar sane sampun kaicalang\n\nyening nenten puniki sane ngranayang, ida dane minab sampun manggihin kaiwangang ring sajeroning piranti lunak.\nDurus sadokang indik puniki rin silih sinunggil anak \n\n[[Special:ListUsers/sysop|Pengurus]], antuk ngetik alamat URL sane katuju",
        "missingarticle-rev": "(pabenahan#:$1)",
+       "missingarticle-diff": "(Malianan: $1, $2)",
+       "readonly_lag": "Basis data sampun kakunci otomatis sakantun basis data sekunder nglaksanayang sinkronisasi antuk basis data sané utama",
+       "nonwrite-api-promise-error": "Manggala HTTP 'Promise-Non-Write-API-Action' sampun kakirim nanging paminta kabuat mantuké modul manyurat API.",
+       "internalerror": "Pikobet saking tengah",
+       "internalerror_info": "Pikobet saking tengah: $1",
+       "internalerror-fatal-exception": "Sajabaning fatal ngetik \"$1\"",
+       "filecopyerror": "Nénten mrasidayang nyadur berkas \"$1\" ka \"$2\".",
+       "filerenameerror": "Nénten prasida nguah wastan berkas \"$1\" manados \"$2\".",
+       "filedeleteerror": "Nénten prasida ngusap berkas \"$1\".",
+       "directorycreateerror": "Nénten prasida ngaé direktori \"$1\".",
+       "directoryreadonlyerror": "Direktori \"$1\" wantah-baca.",
+       "directorynotreadableerror": "Direktori \"$1\" nénten prasida kabaca.",
+       "filenotfound": "Nénten prasida ngusap berkas \"$1\".",
+       "unexpected": "Nilai di sisin jangkauan: \"$1\"=\"$2\".",
+       "formerror": "Pikobet: Nénten prasida ngirim blanko.",
+       "badarticleerror": "Parilaksana puniki nénten prasida ring kaca puniki.",
+       "cannotdelete": "Kaca utawi berkas \"$1\" nénten prasida kausap.\nAsané sampun kausap olih jadma lianan.",
+       "cannotdelete-title": "Nénten prasida ngusap kaca \"$1\"",
+       "delete-scheduled": "Kaca $1 karencanayang mangda kausap. Mangda trepti.",
+       "delete-hook-aborted": "Pangusapan kawangdeang olih kait parser.\nNénten wénten panlatarang.",
+       "no-null-revision": "Nénten prasida makarya revisi null anyar anggén kaca \"$1\"",
        "badtitle": "murda sane nenten manut",
        "badtitletext": "Judul halaman sane katagih nenten patut, kosong, atau judul antarbahasa atau antarwiki yang salah sambung.\n\nmurda lembar sane kaarsa nenten sida kaedengang, kosong, utawi murda murda antarbasa utawi antarwiki sane iwang",
+       "title-invalid-empty": "Murda kaca sané kapinta nénten madaging napi-napi utawi madaging wantah wasta saking silih tunggil genah aran\nJudul halaman yang diminta kosong atau berisi hanya nama sebuah ruang nama.",
+       "title-invalid-utf8": "Murda kaca sané kapinta madué paiketan UTF-8 sané nénten resmi.",
+       "title-invalid-interwiki": "Murda madué pranala pantaraningwiki sané nénten prasida kaanggén ring murda.",
+       "title-invalid-talk-namespace": "Murda situs sané kapinta nuju ka kaca pablibagan sané nénten prasida kasayagayang.",
+       "title-invalid-characters": "Murda kaca sané kapinta madué watek sané ten resmi:\"$1\".",
+       "title-invalid-relative": "Murda madué alamat relatif. Murda kaca relatif (./, ../) nénten resmi, mawinan prasida ngawinan wangde ritatkala kapindatangan olih prajuru panganggé.",
+       "title-invalid-magic-tilde": "Murda kaca madué paiketan tilda sané nénten resmi (<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "Murda kaca sané kapinta kalintang dawa. Punika patut kasimbolang sareng $1 {{PLURAL:$1|byte|bytes}} ring simbol UTF-8.",
+       "title-invalid-leading-colon": "Murda kaca sané kapinta kakawitin antuk tanda petik kalih sané nénten resmi.",
+       "perfcached": "Data sakadi puniki kaambil saking pasinggahan miwah asané nénten data sané mutakhir. {{PLURAL:$1|Hasil}} sakwéhnyané wénten ring pasinggahan.",
+       "perfcachedts": "Data sakadi puniki kaambil saking pasinggahan miwah pinih untat kaanyarin ring $1. {{PLURAL:$4|Hasil}} sakwéhnyané wénten ring pasinggahan.",
+       "querypage-no-updates": "Pamutakhiran saking kaca puniki kantun kamatiang. Data sané wénten driki mangkin nénten jagi kamuat malih.",
        "viewsource": "Cingak wit",
        "viewsource-title": "Cingak wit saking $1",
-       "viewsourcetext": "Jero dados nyingakin miwah nurun wit kaca puniki.",
+       "actionthrottled": "Parilaksana kawatesin",
+       "actionthrottledtext": "Ragané kawatesin antuk nglaksanayang parilaksana puniki kalintang akéh ring galah sané nampek, miwah ragané sampun ngliwatin wates sané kadurusang. Ngiring ulang malih ring akudang menit malih.",
+       "protectedpagetext": "Kaca puniki sampun kakunci antuk ngahalangin pauahan utawi parilaksana lianan.",
+       "viewsourcetext": "Ragané dados nyingakin miwah nurun wit saking kaca puniki.",
+       "viewyourtext": "Ragané prasida nyingakin utawi nyadur sumber saking '''uahan Ragané''' ka kaca puniki.",
+       "protectedinterface": "Kaca puniki ngamuat teks pantaraningrai antuk perangkat lunak ring wiki puniki, miwah kalindungin ring parilaksana sané nénten patut. Antuk nambehin utawi nguah terjemahan ring makasami wiki, mangda nganggé [https://translatewiki.net/ translatewiki.net], pakarya pelokalan MediaWiki.",
+       "editinginterface": "<strong>Panginget:</strong> Ragané nguah silih tunggil kaca sané kaangén nyayagayang teks pantaraningrai antuk perangkat lunak.\nUahan ring kaca puniki jagi ngawinang mal ring pantaraningrai panganggé majeng panganggé lianan ring wiki puniki.",
+       "translateinterface": "Antuk nambehin utawi nguah terjemahan makasami wiki, mangda anggén   [https://translatewiki.net/ translatewiki.net], pakarya pelokalan MediaWiki.",
+       "cascadeprotected": "Kaca puniki sampun kajaga saking uwahan mawinan kasarengi ring {{PLURAL:$1|kaca|kaca-kaca}} sakadi punika sané sampun kajaga malarapan opsi \"madérét\":\n$2",
+       "namespaceprotected": "Ragané ten madué kawenangan ngakses antuk nguah kaca ring genah aran '''$1'''.",
+       "customcssprotected": "Ragané nénten madué izin antuk nguah kaca CSS puniki, mawinan madaging tatacara praragan panganggé.",
+       "customjsonprotected": "Ragané nénten madué izin antuk nguah kaca JSON puniki mawinan madaging tatacara praragan panganggé.",
+       "customjsprotected": "Ragané nénten madué izin antuk nguah kaca JavaScrip puniki, mawinan madaging tatacara praragan panganggé lianan.",
+       "sitecssprotected": "Ragané nénten madué izin antuk nguah kaca CSS puniki mawinan parilaksana sakadi punika asané prasida mabuat ring makasami pamiarsa.",
+       "sitejsonprotected": "Ragané nénten madué izin antuk nguah kaca JSON puniki mawinan parilaksana sakadi punika prasida mabuat ring makasami pamiarsa.",
+       "sitejsprotected": "Ragané nénten madué izin antuk nguah kaca JavaScript puniki mawinan parilaksana sakadi punika asané prasida mabuat ring makasami pamiarsa.",
+       "mycustomcssprotected": "Ragané nénten madué izin antuk nguah kaca CSS puniki.",
+       "mycustomjsonprotected": "Ragané nénten madué izin antuk nguah kaca JSON puniki.",
+       "mycustomjsprotected": "Ragané nénten madué izin antuk nguah kaca JavaScript puniki.",
+       "myprivateinfoprotected": "Ragané nénten madué izin antuk nguah informasi praragan ragané.",
+       "mypreferencesprotected": "Ragané nénten madué izin antuk nguah kaca JavaScript puniki.",
+       "ns-specialprotected": "Kaca ring genah aran {{ns:special}} nénten prasida kauah.",
+       "titleprotected": "Murda puniki kajaga saking pabuat saking [[User:$1|$1]].\nNapi ngawinan asapunika wantah kaicénin sakadi <em>$2</em>.",
+       "filereadonlyerror": "Nénten prasida memodifikasi berkas \"$1\" mawinan berkas repositori \"$2\" inggih punika mode baca-manten.\n\nPrajuru sané ngunci madué napi sané ngawinan asapunika: \"$3\".",
+       "invalidtitle": "Murda nénten resmi",
+       "invalidtitle-knownnamespace": "Murda sané nénten resmi antuk genah aran \"$2\" miwah teks \"$3\"",
+       "invalidtitle-unknownnamespace": "Judul sané nénten resmi antuk nomor genah aran nénten kauningin $1 miwah teks \"$2\"",
+       "exception-nologin": "Durung manjing log",
        "yourname": "Peséngan sang anganggé:",
        "userlogin-yourname": "Peséngan sang anganggé",
-       "userlogin-yourname-ph": "Dagingin peséngan sang anganggé jero",
+       "userlogin-yourname-ph": "Dagingin peséngan sang anganggé ragané",
        "yourpassword": "Kruna sandi:",
        "userlogin-yourpassword": "Kruna sandi",
-       "userlogin-yourpassword-ph": "Dagingin kruna sandi jero",
+       "userlogin-yourpassword-ph": "Dagingin kruna sandi ragané",
        "createacct-yourpassword-ph": "Dagingin kruna sandi",
        "yourpasswordagain": "jumunin kruna sandi",
        "createacct-yourpasswordagain": "Mastiang kruna kunci",
        "notloggedin": "Durung manjing log",
        "userlogin-noaccount": "Durung madué akun?",
        "userlogin-joinproject": "Nyarengin {{SITENAME}}",
-       "createaccount": "Karyanin akun",
+       "createaccount": "Kardi akun",
        "userlogin-resetpassword-link": "Engsap ring kruna kunci?",
        "userlogin-helplink2": "Wantuan indik manjing log",
-       "createacct-emailoptional": "Alamat email (becikang kadagingin)",
-       "createacct-email-ph": "Dagingin alamat email jero",
-       "createacct-submit": "Karyanin akun jero",
-       "createacct-benefit-heading": "{{SITENAME}} kakaryanin olih anak sakadi jero.",
+       "createacct-emailoptional": "Alamat séwala éléktronik (opsional)",
+       "createacct-email-ph": "Dagingin alamat séwala éléktronik ragané",
+       "createacct-submit": "Kardi akun ragané",
+       "createacct-benefit-heading": "{{SITENAME}} kakaryanin antuk anak sakadi ragané.",
        "createacct-benefit-body1": "{{PLURAL:$1|uahan}}",
        "createacct-benefit-body2": "{{PLURAL:$1|kaca}}",
        "createacct-benefit-body3": "{{PLURAL:$1|sang anuut}} sané mangkin",
        "loginlanguagelabel": "Basa: $1",
        "pt-login": "Manjing log",
        "pt-login-button": "Manjing log",
-       "pt-createaccount": "Ngaryanin akun",
+       "pt-createaccount": "Kardi akun",
        "pt-userlogout": "Medal log",
        "botpasswords-label-create": "Ngae",
        "botpasswords-label-cancel": "Wangdé",
        "botpasswords-label-resetpassword": "Nyumu kruna sandi",
        "resetpass-submit-cancel": "Wangdé",
        "passwordreset": "Nyumu kruna sandi",
-       "bold_sample": "teks puniki mesurat tebel",
-       "bold_tip": "teks puniki mesurat tebel",
+       "bold_sample": "Suratan tebel",
+       "bold_tip": "téks puniki mesurat tebel",
        "italic_sample": "teks puniki masurat sendeh",
        "italic_tip": "teks puniki masurat sendeh",
        "link_sample": "murda pranala",
        "link_tip": "pranala tengah",
        "extlink_sample": "http://www.example.com murda pranala",
        "extlink_tip": "pranala sisi (sampunang lali kakawitin http://)",
-       "headline_sample": "teks murda",
+       "headline_sample": "téks murda",
        "headline_tip": "subgolongan undag 2",
        "nowiki_sample": "lebuang teks sane nenten jagi keformat ring driki",
        "nowiki_tip": "campahang format wiki",
        "image_tip": "cantumin pupulan",
        "media_tip": "Pranala depukan",
-       "sig_tip": "tanda tangan ida dane sareng tanda waktu",
+       "sig_tip": "tanda tangan ida dané sareng tanda waktu",
        "hr_tip": "garis horizontal",
        "summary": "Ringkesan:",
        "minoredit": "Puniki uahan alit",
-       "watchthis": "tinjo lembar puniki",
+       "watchthis": "Awasin kaca puniki",
        "savearticle": "Raksa kaca",
        "publishpage": "Terbitang kaca",
+       "publishchanges": "Wedah uahan",
        "savearticle-start": "Raksa kaca...",
        "publishpage-start": "Terbitang kaca…",
-       "preview": "tayangan sadurungnyane",
-       "showpreview": "Sinahang preview",
+       "publishchanges-start": "Wedah uahan...",
+       "preview": "Pracingak",
+       "showpreview": "Édengang pracingak",
        "showdiff": "Cingak uahan",
        "anoneditwarning": "<strong>Pingetan:</strong> Ida dané nénten kacatet ngranjing. Alamat IP ida dané jagi kacatet ring sejarah (indik sané dumunan) ring lembar puniki. Yening ida dane <strong>[$1 log in]</strong> utawi <strong>[$2 create an account]</strong>, your edits will be attributed to your username, along with other benefits.",
+       "blockedtext": "<strong>Peséngan penganggé utawi genah IP ragané kablokir .</strong>\n\nBlokir puniki kalaksanayang olih $1.\nKablokir krana <em>$2</em>.\n\n* Kablokir saking: $8\n* Blokir kadaluwarsa ring: $6\n* Tetujon ngablokir: $7\n\nRagané dados ngubungin $1 utawi [[{{MediaWiki:Grouppage-sysop}}|prajuru]] antuk mabligbagin.\nRagané nénten dados nganggén fitur puniki \"{{int:emailuser}}\" sajabaning ragané sampun ngranjingang email sané patut ring [[Special:Preferences|pustaka]] tur ragané nénten kablokir antuk nganggén\nGenah IP ragané sané pinih anyar inggih punika $3, tur ID pamblokiran inggih punika #$5.\nTulung genahang silih sinunggil utawi kalih pidarta ring pitakén sané kakaryanin.",
        "loginreqlink": "manjing log",
        "newarticle": "(Anyar)",
        "newarticletext": "ida dane ngiring pranala nuju lembar sane durung wenten. yening jagi ngaryanang lembar punika, ketik daging lembar ring kotak sane wenten ring beten puniki. (cingak [$1 lembar wantuan] anggen wacana salanturnyane). yening ida dane nenten nyelapang neked ring lembar puniki, klik tombol \"back\" ring \"penjelajah web\" ida dane.",
-       "noarticletext": "mangkin nenten wenten teks ring lembar puniki. ida dane prasida [[Special:Search/{{PAGENAME}}|ngrereh murda nganggen lembar puniki]] ring lembar-lembar sane lianan, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ngrereh log sane mapaiketan], utawi [{{fullurl:{{FULLPAGENAME}}|action=edit}} nguwah lembar puniki]</span>.",
-       "noarticletext-nopermission": "mangkin nenten wenten teks ring lembar puniki. ida dane prasida [[Special:Search/{{PAGENAME}}|ngarereh murda anggen lembar puniki]] ring lembar-lembar sane lianan, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ngarereh log sane mapaiketan], utawi [{{fullurl:{{FULLPAGENAME}}|action=edit}} ngubah lembar puniki]</span>.",
+       "anontalkpagetext": "<em>Niki inggih punika kaca pabligbagan sang penganggé sané nénten nguningayang wasta utawi nénten nganggén wasta.</em> Nika mawinan penganggé punika patut nganggén genah IP sané mawentuk angka antuk manyihnayang.\nGenah IP punika prasida kaanggén sareng-sareng olih makudang-kudang panganggé sané lianan. \nYéning Ragané sang penganggé sané nénten mawasta tur marasa ngamolihang pidarta sané nénten patut, ngiring \n[[Special:CreateAccount|ngaryanin akun]] utawi [[Special:UserLogin|sang penganggé ngranjing log]] antuk ngelidin kabingungan saking sang penganggé sané lianan ring galah sané lianan.",
+       "noarticletext": "Mangkin nénten wénten suratan ring kaca puniki.\nRagané prasida [[Special:Search/{{PAGENAME}}|ngrereh murda kaca puniki]] ring kaca lianan,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ngrereh log sané mapaiketan],\nutawi [{{fullurl:{{FULLPAGENAME}}|action=edit}} ngardi kaca puniki]</span>.",
+       "noarticletext-nopermission": "Mangkin nénten wénten suratan ring kaca puniki.\nRagané prasida [[Special:Search/{{PAGENAME}}|ngrereh murda kaca puniki]] ring kaca lianan,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ngrereh log sané mapaiketan]</span>, nanging ragané tan kalugra ngardi kaca puniki.",
        "userpage-userdoesnotexist-view": "Akun sang anganggé \"$1\" nénten madaptar.",
-       "previewnote": "\"elingang yening puniki wantah sane lintang.\" Panguwahan ida dane durung kasimpen!",
-       "continue-editing": "Magingsir ka genah ngauwah",
+       "clearyourcache": "<strong>Catetan:</strong>Sesampun karaksayang, Ragané patut ngentasin tembolok peramban wéb antuk nyingakin uahan.\n* <strong>Firefox/Safari:</strong> Tahan <em>Shift</em> ritatkala ngaklik <em>Reload</em>, utawi teken <em>Ctrl-F5</em> utawi <em>Ctrl-R</em> (<em>⌘-R</em> ring Mac)\n* <strong>Google Chrome:</strong> Teken <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> ring Mac)\n* <strong>Internet Explorer:</strong> Teken <em>Ctrl</em> ritatkala ngaklik <em>Refresh</em>, utawi teken <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Ngranjing ka <em>Ménu → Pengaturan </em> (<em>Opera → Pustaka</em> ring Mac) Salanturnyané ka <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
+       "previewnote": "<strong>Éling yéning puniki wantah pracingak.</strong>\nUahan ragané durung karaksa!",
+       "continue-editing": "Magingsir ka genah panguah",
        "editing": "Nguahin $1",
        "creating": "Makarya $1",
        "editingsection": "Nguahin $1 (pahan)",
        "editingcomment": "Nguahin $1 (pahan anyar)",
        "templatesused": "{{PLURAL:$1|Citakan}} sané kaanggén ring kaca puniki:",
+       "templatesusedpreview": "{{PLURAL:$1|Citakan}} sané kaanggén ring pracingak puniki:",
        "template-protected": "(kasaibin)",
        "template-semiprotected": "(semi-kasaibin)",
        "hiddencategories": "lembar niki inggih punika krama saking {{PLURAL:$1|1 golongan sane mengkeb|$1 golongan sane mengkeb}}",
-       "permissionserrors": "Kaiwangan ritatkala ngranjing",
-       "permissionserrorstext-withaction": "ida dané nénten madué kuasa ngranjing anggén $2, riantukan {{PLURAL:$1|alasan}} ring sor puniki:",
+       "permissionserrors": "Pikobet lugra",
+       "permissionserrorstext-withaction": "Ragané tan kalugra $2, antukan {{PLURAL:$1|larapan}} ring sor puniki:",
        "recreate-moveddeleted-warn": "\"pingetan\" ida dane ngawe malih lembar sane naenin maapus.'''\n\nmangda kayunin malih napike pantes lanturang suntingan ida dane. puniki log pengapusan lan pangisidan saking lembar puniki:",
        "moveddeleted-notice": "Kaca puniki sampun kausapin.\nAnggen pewarah, proteksi, lan pengisidan log saking lembar puniki cingakin pustaka beten.",
        "postedit-confirmation-created": "Kacanyané sampun kakaryanin.",
        "postedit-confirmation-saved": "Uahan jero sampun maraksa.",
+       "postedit-confirmation-published": "Uahan ragané sampun kawedar.",
        "content-model-wikitext": "sesuratan wiki",
        "post-expand-template-inclusion-warning": "pinget: ukuran templat sane keanggen kalangkung ageng. wenten templat sane kacampahang",
        "post-expand-template-inclusion-category": "lembar sane maukuran templat sane nglangkungin wates",
        "post-expand-template-argument-warning": "\"peminget\" lembar puniki madaging kiranglangkungnyane siki argumen templat anggen ukuran ekspansi sane kaliwat ageng. argumen-argumen punika sampun kacampahang.",
        "post-expand-template-argument-category": "lembar sane medaging argumen templat sane kacampahang",
+       "undo-failure": "Uwahan puniki nénten prasida kabalikang krana wénten konflik panguwahan antara.",
        "viewpagelogs": "Cingak log saking kaca puniki",
-       "currentrev-asof": "pabecikan sane anyar ring pinanggal$1",
+       "currentrev-asof": "Révisi sané pinih anyar ring $1",
        "revisionasof": "Uahan ri tatkala $1",
-       "revision-info": "Panguwahan per $1 olih {{GENDER:$6|$2}}$7",
+       "revision-info": "Révisi ri tatkala $1 antuk {{GENDER:$6|$2}}$7",
        "previousrevision": "← Uahan sadurungnyané",
        "nextrevision": "Uahan salanturnyané →",
        "currentrevisionlink": "Uahan sané mangkin",
        "cur": "mgkn",
        "last": "sdrg",
        "histlegend": "pilih kalih tombol radio lantur pecik tombol \"bandingang\" anggen ngebandingang indik lianan. klik siki tanggal anggen nyingak indik lianan lembar ring pinanggal punika.<br />(skr)= binanne saking indik lianan sane mangkin, (untat) = binanne saking indik lianan sane dumunan, '''k''' = panguwahan alit, '''b''' = panguwahan bot, → = panguwahan kepahan, ← = reringkesan otomatis",
-       "history-fieldset-title": "Nyaringin révisi",
+       "history-fieldset-title": "Saring révisi",
        "history-show-deleted": "wantah sane kaapus",
-       "histfirst": "pinih suwe",
+       "histfirst": "pinih sué",
        "histlast": "pinih anyar",
        "history-feed-title": "Babad uahan",
        "history-feed-description": "Babad uahan kaca puniki ring wiki",
        "mergelog": "Gabung log",
        "revertmerge": "tansida nyarengin",
        "history-title": "Babad uahan saking \"$1\"",
-       "difference-title": "$1: sane malianan ring revisi",
+       "difference-title": "Bina pantaraning révisi \"$1\"",
        "lineno": "Carik $1:",
        "compareselectedversions": "bandingang penguwahan sane kapilih",
-       "editundo": "nguliang",
-       "diff-empty": "(Nénten wénten sané malianan)",
+       "editundo": "ulihang",
+       "diff-empty": "(Nénten mabina)",
        "diff-multi-sameuser": "({{PLURAL:$1|$1 revisi pantaraning}} olih pangawi sane pateh nenten kacumawisang)",
        "diff-multi-otherusers": "({{PLURAL:$1|Siki pamecikan pantaraning|$1 pamecikan pantaraning}} olih {{PLURAL:$2|siki pangangge lianan|$2 panggange}} nenten katampilan)",
-       "searchresults": "asil pangrereh",
-       "searchresults-title": "Asil pangrereh anggén \"$1\"",
+       "searchresults": "Asil pangrereh",
+       "searchresults-title": "Asil pangrereh indik \"$1\"",
        "prevn": "{{PLURAL:$1|$1}} sadurungnyané",
        "nextn": "{{PLURAL:$1|$1}} salanturnyané",
        "prev-page": "kaca sadurungnyané",
-       "prevn-title": "$1 {{PLURAL:$1|asil}} sadurunge",
-       "nextn-title": "$1 {{PLURAL:$1|asil}} selanturnyane",
+       "prevn-title": "$1 {{PLURAL:$1|asil}} sadurungnyané",
+       "nextn-title": "$1 {{PLURAL:$1|asil}} salanturnyané",
        "shown-title": "Sinahang $1 {{PLURAL:$1|asil}} per kaca",
        "viewprevnext": "Cingak ($1 {{int:pipe-separator}}$2)($3)",
        "searchmenu-exists": "wenten lembar sane mamurda \"[[:$1]]\" ring wiki puniki. {{PLURAL:$2|0=| cingakin taler asil rerehan lianan sane kapolihang}}",
-       "searchmenu-new": "<strong> ngawi lembar \"[[:$1]] ring wiki puniki </ strong>! {{{{PLURAL:$2|}}| 0 = | cingak teler lembar sane kapolihang ring pangreregan | cingak taler asil pangrerehan sane kapolihang}}",
+       "searchmenu-new": "<strong>Kardi kaca \"[[:$1]]\" ring wiki puniki!</strong> {{PLURAL:$2|0=|Taler cingak kaca sané temunin ragané.|Taler cingak asil pangrereh.}}",
        "searchprofile-articles": "Kaca daging",
-       "searchprofile-images": "multimedia",
+       "searchprofile-images": "Multimédia",
        "searchprofile-everything": "Samian",
-       "searchprofile-advanced": "lanturane",
+       "searchprofile-advanced": "Lanturan",
        "searchprofile-articles-tooltip": "Rereh ring $1",
        "searchprofile-images-tooltip": "Rereh depukan",
-       "searchprofile-everything-tooltip": "pangrereh ring samian isi (taler lembar wecana)",
-       "searchprofile-advanced-tooltip": "Rereh ring genah wastan sané kapilih",
+       "searchprofile-everything-tooltip": "Rereh ring samian daging (rumasuk kaca pabligbagan)",
+       "searchprofile-advanced-tooltip": "Rereh ring genah aran sané kapilih",
        "search-result-size": "$1 ({{PLURAL:$2|1 kruna|$2 kruna}})",
        "search-result-category-size": "{{PLURAL:$1|1 krama|$1 krama}}({{PLURAL:$2|1  subgolongan|$2 subgolongan}}, {{PLURAL:$3|1 pupulan|$3 pupulan}})",
        "search-redirect": "(gingsiran saking $1)",
        "search-section": "(pahan $1)",
        "search-file-match": "(anut ring daging depukan)",
-       "search-suggest": "minab sane kearsaang $1",
+       "search-suggest": "Minab sané aptiang ragané: $1",
        "searchrelated": "paiketan",
        "searchall": "samian",
-       "search-showingresults": "{{PLURAL:$4|Asil <strong>$1</strong> of <strong>$3</strong>|Asil-asil <strong>$1 – $2</strong> saking <strong>$3</strong>}}",
-       "search-nonefound": "nenten wenten asil sane caklek ring arsa",
+       "search-showingresults": "{{PLURAL:$4|Asil <strong>$1</strong> saking <strong>$3</strong>|Asil <strong>$1 – $2</strong> saking <strong>$3</strong>}}",
+       "search-nonefound": "Nénten wénten asil sané cocok sareng kuéri.",
        "powersearch-ns": "Rereh ring genah wastan:",
-       "mypreferences": "Preferensi",
+       "mypreferences": "Préferénsi",
        "prefs-user-pages": "Kaca sang anganggé",
        "saveprefs": "Raksa",
        "prefs-editing": "Nguahin",
        "grouppage-bot": "{{ns:project}}:Bot",
        "grouppage-sysop": "{{ns:project}}:Prajuru",
        "right-edit": "Uah kaca",
-       "right-writeapi": "nganggén API sasuratan",
+       "right-writeapi": "Anggé API sasuratan",
        "right-delete": "Usap kaca",
        "right-editprotected": "Uah kaca sané kasaibin \"{{int:protect-level-sysop}}\"",
        "grant-createeditmovepage": "Karyanin, uah, miwah gingsirang kaca",
        "grant-editprotected": "Uah kaca sané kasaibin",
+       "grant-rollback": "Waliang uahan ring kaca",
        "newuserlogpage": "Log makarya sang anganggé",
+       "rightslog": "Log panguwahan hak ngaksés",
        "action-read": "wacén kaca puniki",
-       "action-edit": "uah kaca puniki",
-       "action-createpage": "karyanin kaca puniki",
-       "action-createaccount": "karyanin akun sang anganggé puniki",
+       "action-edit": "nguah kaca puniki",
+       "action-createpage": "ngardi kaca puniki",
+       "action-createaccount": "kardi akun sang anganggé puniki",
+       "action-move": "ngingsirang kaca puniki",
        "action-delete": "usap kaca puniki",
        "action-deletedhistory": "cingak babad kaca sané kausapin",
        "action-browsearchive": "rereh kaca sané kausapin",
-       "action-editprotected": "uah kaca sané kasaibin \"{{int:protect-level-sysop}}\"",
+       "action-rollback": "ngwaliang kanti gelis uahan saking sang anganggé pinih untat sané nguah sinalih tunggil kaca",
+       "action-autopatrol": "nyihnain uahan ragané yéning sampun kapratroli",
+       "action-sendemail": "ngirim séwala éléktronik",
+       "action-editprotected": "nguah kaca sané kasaibin \"{{int:protect-level-sysop}}\"",
        "action-editsemiprotected": "uah kaca sané kasaibin \"{{int:protect-level-autoconfirmed}}\"",
        "nchanges": "$1 {{PLURAL:$1|uahan}}",
        "enhancedrc-history": "babad",
        "recentchanges-summary": "Track uahan sané mangkin ring wikiné indik kaca puniki.",
        "recentchanges-noresult": "Nénten wénten uahan ring galahnyané puniki sané anut sareng praciri puniki.",
        "recentchanges-feed-description": "molihang pagentosan anyar ring wiki ring \"umpan\" puniki",
-       "recentchanges-label-newpage": "Uahan puniki makarya kaca anyar",
+       "recentchanges-label-newpage": "Uahan puniki ngardi kaca anyar",
        "recentchanges-label-minor": "Punika uahan alit",
        "recentchanges-label-bot": "Uahan puniki kalaksanayang antuk bot",
        "recentchanges-label-unpatrolled": "Uahan puniki durung kapatroli",
        "recentchanges-label-plusminus": "Agengnyané kacané kauahin antuk akéhnyané bita puniki",
-       "recentchanges-legend-heading": "<strong>Legenda:</strong>",
+       "recentchanges-legend-heading": "<strong>Legénda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (taler cingak [[Special:NewPages|bacakan kaca anyar]])",
        "recentchanges-submit": "Sinahang",
        "rcfilters-activefilters-show": "Sinahang",
        "rcfilters-filter-major-label": "Uahan tan alit",
        "rcfilters-filter-pageedits-label": "Uahan kaca",
        "rcnotefrom": "Ring beten puniki inggih punika {{PLURAL:$5|panguwahan}} saking <strong>$3, $4</strong> (kaedengang ngantos <strong>$1</strong> panguwahan).",
-       "rclistfrom": "edengang  penguwahan sane anyar wit saking $3 $2",
+       "rclistfrom": "Édéngang uahan anyar saking $2, $3",
        "rcshowhideminor": "$1 uahan alit",
        "rcshowhideminor-show": "Sinahang",
        "rcshowhideminor-hide": "Engkebang",
        "rcshowhidemine-show": "Sinahang",
        "rcshowhidemine-hide": "Engkebang",
        "rcshowhidecategorization-show": "Sinahang",
-       "rclinks": "Edengang untat $1 gentosan anyar $2 dina kaping untat",
+       "rclinks": "Sinahang $1 uahan sané untat ring $2 dina sané lintang",
        "diff": "bina",
        "hist": "bbd",
        "hide": "Engkebang",
        "newpageletter": "A",
        "boteditletter": "b",
        "rc-change-size-new": "$1 {{PLURAL:$1|bita}} sasampun kauah",
-       "rc-enhanced-expand": "edengang rerincian",
-       "rc-enhanced-hide": "engkebang rerincian",
-       "rc-old-title": "witnyané kakaryanin pinaka \"$1\"",
+       "rc-enhanced-expand": "Sinahang rerincian",
+       "rc-enhanced-hide": "Engkebang rerincian",
+       "rc-old-title": "witnyané kakardi pinaka \"$1\"",
        "recentchangeslinked": "Uahan mapaiketan",
        "recentchangeslinked-toolbox": "Uahan mapaiketan",
        "recentchangeslinked-title": "Uahan sané mapaiketan $1",
-       "recentchangeslinked-summary": "lembar kautamayang puniki ngicenin kepahan penguwahan kaping untat ring lembar-lembar sana mapaiket. Lembar sane [[Special:Watchlist|ida dane iwasin]] mapinget antuk sesuratan tebel",
+       "recentchangeslinked-summary": "Dagingin aran kaca antuk nyingakin uahan ring kaca-kaca sané kasambung kaca punika. (Antuk nyingakin kapahan kategori, dagingin {{ns:category}}:Aran kategori). Uahan kaca-kaca ring [[Special:Watchlist|Pangawasan ragané]] kasurat <strong>tebel</strong>.",
        "recentchangeslinked-page": "Peséngan kaca:",
        "recentchangeslinked-to": "Sinahang uahan saking kaca-kaca sané linked kaca puniki",
        "upload": "Unggahang depukan",
        "upload-dialog-button-cancel": "Wangdé",
        "upload-dialog-button-save": "Raksa",
        "backend-fail-delete": "Tan prasida ngusapin berkas \"$1\".",
+       "uploadstash-summary": "Kaca puniki nyayagayang aksés ring berkas sané sampun kaunggah utawi sané jagi kaunggah, nanging durung kawedar ring wikiné. Berkas-berkas punika nénten sinah ring samian anak sajabaning anak sané ngunggahang.",
        "license": "kepahan lugra",
        "license-header": "Lisénsi",
        "listfiles-delete": "usap",
        "listfiles": "Bacakan depukan",
        "file-anchor-link": "Depukan",
        "filehist": "Babad berkas",
-       "filehist-help": "klik ring pinanggal/galah anggen nyingakin pupulan niki rikala punika",
+       "filehist-help": "Klik ring tanggal/galah anggén nyingakin berkas puniki ri tatkala galah punika.",
        "filehist-deleteall": "usap samian",
-       "filehist-revert": "buwungang",
-       "filehist-current": "sané mangkin",
+       "filehist-revert": "wangdéang",
+       "filehist-current": "mangkin",
        "filehist-datetime": "Tanggal/Galah",
        "filehist-thumb": "Miniatur",
        "filehist-thumbtext": "miniatur anggen versi ring $1",
        "filehist-nothumb": "Tusing ade miniatur",
        "filehist-user": "Sang anganggé",
-       "filehist-dimensions": "ukuran",
-       "filehist-comment": "tureksa",
+       "filehist-dimensions": "Diménsi",
+       "filehist-comment": "Pasaur",
        "imagelinks": "Panganggén depukan",
        "linkstoimage": "{{PLURAL:$1|Kaca|$1 kaca}} ring sor puniki nganggén depukan puniki:",
+       "linkstoimage-more": "Langkungan saking $1 {{PLURAL:$1|kaca|kaca-kaca}} nganggén berkas puniki.\nPupulan puniki nyinahang {{PLURAL:$1|kaca kapertama nganggén pranala langsung|$1 kaca sané nganggén pranala langsung}} ka berkasé puniki\nA [[Special:WhatLinksHere/$2|pupulan sané jangkep]] taler kasayagayang.",
        "nolinkstoimage": "Nénten wénten kaca sané nganggén berkas puniki.",
        "linkstoimage-redirect": "$1 (gingsiran berkas) $2",
        "sharedupload-desc-here": "Depukan puniki mawit saking $1 lan minab kaanggén olih proyék-proyék sané lianan. Déskripsinnyané ring [$2 kaca déskripsi depukannyané] kaarahin ring ungkur puniki.",
-       "filepage-nofile": "Nentén wénten berkas sané mamurda sakadi punika",
+       "filepage-nofile": "Nentén wénten berkas sané maaran sakadi punika.",
        "shared-repo-name-wikimediacommons": "Wikimedia Commons",
-       "upload-disallowed-here": "Jero nénten dados numpuk depukan puniki.",
+       "upload-disallowed-here": "Ragané nénten dados numpuk depukan puniki.",
        "filedelete": "Usap $1",
        "filedelete-submit": "Usap",
        "filedelete-success": "<strong>$1</strong> sampun kausapin.",
        "booksources-search-legend": "Rereh wit buku",
        "booksources-search": "Rereh",
        "specialloguserlabel": "Panggange",
+       "speciallogtitlelabel": "Tetujon (Murda utawi {{ns:user}}:sang panganggé antuk penganggé)",
        "log": "Log",
        "logeventslist-submit": "Sinahang",
        "all-logs-page": "Makasami log publik",
+       "alllogstext": "Pupulan tampilan log makasami sané kasayagayang ring {{SITENAME}}.\nRagané dados ngalaksanayang watesan tampilan nganggén ngamilih soroh log, sang anganggé (sénsitif kapitalisasi), utawi murdan kaca (taler sénsitif kapitalisasi).",
        "logempty": "Nenten katemonin entri log sane patut",
        "allpages": "Makasami kaca",
        "allarticles": "Makasami kaca",
        "allinnamespace": "Makasami kaca (genah wastan $1)",
        "allpagessubmit": "Lanturang",
        "allpages-bad-ns": "{{SITENAME}} nénten madué genah wastan \"$1\".",
-       "allpages-hide-redirects": "Ngengkebang pagingsirian",
-       "categories": "Golongan",
+       "allpages-hide-redirects": "Engkebang kaca gingsirian",
+       "categories": "Kategori",
        "categories-submit": "Sinahang",
        "deletedcontributions": "Pituut sang anganggé sané kausapin",
        "linksearch-ns": "Genah wastan:",
        "linksearch-line": "$1 masambung saking $2",
        "listusers-submit": "Sinahang",
-       "listgrouprights-members": "kepahan krama",
-       "emailuser": "email sane nganggo niki",
-       "emailmessage": "Séwalapatra:",
-       "usermessage-editor": "Séwalapatra sistem",
-       "watchlist": "kepahan peninjoan",
-       "mywatchlist": "kepahan peninjoan",
+       "listgrouprights-members": "(bacakan krama)",
+       "emailuser": "Kirim séwala éléktronik ring sang anganggé puniki",
+       "emailmessage": "Séwala:",
+       "usermessage-editor": "Séwala sistem",
+       "watchlist": "Pangawasan",
+       "mywatchlist": "Pangawasan",
        "watchlistfor2": "Anggén $1 $2",
-       "watch": "cingak",
+       "watch": "Awasin",
        "unwatch": "tan sida maninjo",
-       "watchlist-details": "{{PLURAL:$1|$1 kaca}} wénten ring bacakan pantauan ida dané (rumasuk kaca pabligbagan).",
+       "watchlist-details": "{{PLURAL:$1|$1 kaca}} wénten ring Pangawasan ragané (rumasuk kaca pabligbagan).",
+       "wlheader-showupdated": "Kaca-kaca puniki sampun kauwah saking kunjungan ragané sané pinih untat, kasinahang sareng <strong>tebel</strong>.",
+       "wlnote": "Ring sor puniki {{PLURAL:$1|uahan sané pinih untat| <strong>$1</strong> uahan}} pinih untat {{PLURAL:$2|jam|<strong>$2</strong> jam}},ngantos $3, $4.",
        "watchlist-submit": "Sinahang",
        "wlshowhideminor": "uahan alit",
-       "watchlist-options": "milih kepahan peninjo",
+       "watchlist-options": "Opsi pangawasan",
        "enotif_reset": "Cihnayang makasami kaca sané sampun karauhin",
        "enotif_subject_deleted": "Kaca {{SITENAME}} $1 sampun {{GENDER:$2|kausap}} $2",
        "enotif_body_intro_deleted": "Kaca{{SITENAME}} $1 sampun {{GENDER:$2|kausapin}} ring $PAGEEDITDATE olih $2, cingak $3.",
        "historyaction-submit": "Sinahang uahan",
        "actioncomplete": "pelaksanan sampun wusan",
        "actionfailed": "pelaksana luput",
-       "dellogpage": "log pangapus",
+       "dellogpage": "Log pangusap",
+       "rollback-confirmation-yes": "Waliang",
        "rollback-confirmation-no": "Wangdé",
-       "rollbacklink": "mabalik",
-       "rollbacklinkcount": "balikang $1 {{PLURAL:$1|suratan}}",
+       "rollbacklink": "waliang",
+       "rollbacklinkcount": "waliang $1 {{PLURAL:$1|uahan}}",
        "changecontentmodel-title-label": "Murda kaca",
        "protectlogpage": "Log saiban",
        "protectedarticle": "nyaib \"[[$1]]\"",
+       "modifiedarticleprotection": "nguwah tingkatan panyambi antuk  \"[[$1]]\"",
        "protect-default": "Lugra makasami sang anganggé",
+       "protect-level-sysop": "Wantah prajuru sané kalugra",
        "restriction-edit": "Uah",
        "restriction-move": "Gingsirang",
        "undelete": "Cingak kaca sané kausapin",
        "undeleterevisions": "$1 {{PLURAL:$1|uahan}} kausapin",
-       "undeletelink": "cingak/uliang",
+       "undeletelink": "cingak/waliang",
        "undeleteviewlink": "cingak",
        "undelete-search-title": "Rereh kaca sané kausapin",
-       "namespace": "Genah wastan:",
-       "invert": "uliang pilihan",
-       "tooltip-invert": "Centang kotak puniki mangdané ngengkebang lembar sané kauwah ring genah wastan sané kapilih (miwah genah wastan sané mapaiketan yéning kacentang)",
-       "namespace_association": "Genah wasta sané mapaiketan",
-       "tooltip-namespace_association": "Céntang kotak puniki anggén nagingin genah wasta pabligbagan utawi subjék sané mapaiketan sareng genah wasta sané kapilih",
+       "namespace": "Genah aran:",
+       "invert": "Waliang pilihan",
+       "tooltip-invert": "Céntang kotak puniki mangda ngengkebang uahan kaca ring genah aran sané kapilih (miwah genah aran sané mapaiketan yéning kacéntang)",
+       "namespace_association": "Genah aran sané mapaiketan",
+       "tooltip-namespace_association": "Céntang kotak puniki mangda marengang genah aran pabligbagan utawi subyék sané mapaiketan genah aran sané kapilih",
        "blanknamespace": "(Utama)",
        "contributions": "Pituut {{GENDER:$1|sang anganggé}}",
        "contributions-title": "Pituut sang anganggé $1",
        "mycontris": "Pituut",
        "anoncontribs": "Pituut",
-       "contribsub2": "antuk {{GENDER:$3|$1}} ($2)",
+       "contribsub2": "Antuk {{GENDER:$3|$1}} ($2)",
+       "nocontribs": "Nénten wénten uwahan sané patut sareng cihna punika.",
        "uctop": "sane mangkin",
        "month": "Saking sasih (miwah sadurungnyané)",
        "year": "Saking warsa (miwah sadurungnyané):",
-       "sp-contributions-blocklog": "log pemblokiran",
+       "sp-contributions-blocklog": "log pangempet",
        "sp-contributions-deleted": "pituut {{GENDER:$1|sang anganggé}} sané kausapin",
        "sp-contributions-uploads": "unggahan",
        "sp-contributions-logs": "log",
        "sp-contributions-talk": "pabligbagan",
        "sp-contributions-search": "Rereh pituut",
        "sp-contributions-username": "Alamat IP wiadin peséngan sang anganggé:",
-       "sp-contributions-toponly": "tampilang wantah panguwahan sane anyar",
-       "sp-contributions-newonly": "Tampilang wantah panguwahan sane anyar",
+       "sp-contributions-toponly": "Wantah édéngang uahan sané pinih anyar",
+       "sp-contributions-newonly": "Wantah édéngang uahan sané ngardi kaca",
        "sp-contributions-submit": "Rereh",
        "whatlinkshere": "Pranala iriki",
-       "whatlinkshere-title": "lembar-lembar sane maduwe pranala kaping \"$1\"",
+       "whatlinkshere-title": "Kaca sané kasambung ring \"$1\"",
        "whatlinkshere-page": "Kaca:",
-       "linkshere": "lembar puniki maduwe pranala ke '''$2'''",
+       "linkshere": "Kaca-kaca ring sor puniki kasambung ring <strong>$2</strong>:",
        "nolinkshere": "Nénten wénten kaca sané madué pranala ring <strong>$2</strong>.",
        "isredirect": "Kaca gingsiran",
        "istemplate": "sareng kasurat",
-       "isimage": "pranala pupulan-pupulan",
-       "whatlinkshere-prev": "{{PLURAL:$1|sadurungnyane|$1 sadurungnyane}}",
-       "whatlinkshere-next": "{{PLURAL:$1|selanturnyane}}",
+       "isimage": "pranala berkas",
+       "whatlinkshere-prev": "{{PLURAL:$1|sadurungnyané|$1 sadurungnyané}}",
+       "whatlinkshere-next": "{{PLURAL:$1|salanturnyané|$1 salanturnyané}}",
        "whatlinkshere-links": "← pranala",
-       "whatlinkshere-hideredirs": "$1 pangalihan",
+       "whatlinkshere-hideredirs": "$1 kaca gingsiran",
        "whatlinkshere-hidetrans": "$1 transklusi",
        "whatlinkshere-hidelinks": "$1 pranala",
        "whatlinkshere-hideimages": "$1 pranala berkas",
-       "whatlinkshere-filters": "Panyaring",
+       "whatlinkshere-filters": "Panyaringan",
        "ipboptions": "2 jam:2 hours,1 dina:1 day,3 dina:3 days,1 minggu:1 week,2 minggu:2 weeks,1 sasih:1 month,3 sasih:3 months,6 sasih:6 months,1 taun:1 year,tanpa wates:infinite",
        "ipb-pages-label": "Kaca",
        "ipb-namespaces-label": "Genah wastan",
        "block-prevent-edit": "Nguahin",
-       "ipblocklist": "ngempetin sane nganggo",
+       "ipblocklist": "Sang anganggé sané kaempetin",
        "infiniteblock": "Nénten kawates",
        "blocklist-nousertalk": "tan prasida nguahin kaca pabligbagan praragan",
        "blocklist-editing-page": "kaca",
        "blocklist-editing-ns": "genah wastan",
-       "blocklink": "ngempetin",
+       "blocklink": "empet",
        "unblocklink": "ngicalang kaempetan",
-       "change-blocklink": "gentosin empetin",
+       "change-blocklink": "uah pangempet",
        "contribslink": "pituut",
-       "blocklogpage": "log pemblokiran",
+       "blocklogpage": "Log pangempet",
        "blocklogentry": "mlokir [[$1]] anggen pangwates galah $2$3",
+       "reblock-logentry": "nguwah blokiran aturan antuk [[$1]] sareng galah kadaluwarsa $2 $3",
        "block-log-flags-nocreate": "ngawe akun kaicalang",
+       "proxyblocker": "Sané ngablokir proxy",
        "movelogpage": "Log gingsiran",
-       "revertmove": "buwungang",
+       "revertmove": "wangdéang",
        "export": "ekspor lembar",
        "export-download": "Raksa pinaka berkas",
-       "allmessages": "Séwalapatra sistem",
+       "allmessages": "Séwala sistem",
        "allmessagesname": "pesengan",
        "allmessagesdefault": "teks lingga",
        "thumbnail-more": "Ngedénang",
        "thumbnail_error": "luput ngaryanin bentuk cenik $1",
        "import-interwiki-sourcepage": "Kaca wit:",
        "importlogpage": "Log impor",
-       "tooltip-pt-userpage": "Kaca {{GENDER:|sang anganggé jero}}",
-       "tooltip-pt-mytalk": "Kaca pabligbagan {{GENDER:|jero}}",
-       "tooltip-pt-preferences": "Preferensi {{GENDER:|jero}}",
-       "tooltip-pt-watchlist": "kepahan-kepahan lembar sane katinjo titiang",
-       "tooltip-pt-mycontris": "Bacakan pituut {{GENDER:|jero}}",
-       "tooltip-pt-login": "Jero kaaptiang mangda manjing log; yadiastun nénten wajib",
+       "tooltip-pt-userpage": "Kaca {{GENDER:|sang anganggé ragané}}",
+       "tooltip-pt-mytalk": "Kaca pabligbagan {{GENDER:|ragané}}",
+       "tooltip-pt-preferences": "Préferénsi {{GENDER:|ragané}}",
+       "tooltip-pt-watchlist": "Bacakan kaca sané uahannyané awasin ragané",
+       "tooltip-pt-mycontris": "Bacakan pituut {{GENDER:|ragané}}",
+       "tooltip-pt-login": "Ragané kaaptiang mangda manjing log; yadiastun nénten wajib",
        "tooltip-pt-logout": "Medal log",
-       "tooltip-pt-createaccount": "Jero kaaptiang mangda makarya akun miwah manjing log; yadiastun nénten wajib",
+       "tooltip-pt-createaccount": "Ragané kaaptiang mangda ngardi akun miwah manjing log; yadiastun nénten wajib",
        "tooltip-ca-talk": "Pabligbagan indik kaca daging",
        "tooltip-ca-edit": "Uah kaca puniki",
-       "tooltip-ca-addsection": "nyumunin kepahan anyar",
-       "tooltip-ca-viewsource": "Kaca puniki kasaibin.\nJero wantah prasida nyingakin witnyané",
+       "tooltip-ca-addsection": "Wiwit bagian anyar",
+       "tooltip-ca-viewsource": "Kaca puniki kasaibin.\nRagané wantah prasida nyingakin witnyané",
        "tooltip-ca-history": "Uahan sadurungnyané saking kaca puniki",
        "tooltip-ca-protect": "Saib kaca puniki",
        "tooltip-ca-unprotect": "Uah saiban kaca puniki",
        "tooltip-ca-delete": "Usap kaca puniki",
        "tooltip-ca-move": "Gingsirang kaca puniki",
-       "tooltip-ca-watch": "Imbuhin kaca puniki ring bacakan pantauan ida dané",
-       "tooltip-ca-unwatch": "apus lembar niki ring daftar paninjoan ida dane",
+       "tooltip-ca-watch": "Tambeh kaca puniki ring pangawasan ragané",
+       "tooltip-ca-unwatch": "Usap kaca puniki saking pangawasan ragané",
        "tooltip-search": "Rereh ring {{SITENAME}}",
        "tooltip-search-go": "Rereh kaca sané mapeséngan pateh sakadi puniki yéning wénten",
        "tooltip-search-fulltext": "Rereh kaca sané madaging sesuratan puniki",
        "tooltip-n-randompage": "Cihnayang kaca ulah-aluh",
        "tooltip-n-help": "Genah ngrereh wantuan",
        "tooltip-t-whatlinkshere": "Bacakan makasami kaca ring wiki sané nuju iriki",
-       "tooltip-t-recentchangeslinked": "Uahan sané mangkin saking kaca-kaca sané linked ring kaca puniki",
+       "tooltip-t-recentchangeslinked": "Uahan sané mangkin saking kaca-kaca sané kasambung ring kaca puniki",
        "tooltip-feed-atom": "\"atom feed\" anggen lembar puniki",
        "tooltip-t-contributions": "Bacakan pituut olih {{GENDER:$1|sang anganggé puniki}}",
        "tooltip-t-emailuser": "Ngirim surel majeng ring {{GENDER:$1|penganggo puniki}}",
        "tooltip-t-upload": "Unggahang depukan",
        "tooltip-t-specialpages": "Bacakan makasami kaca kusus",
        "tooltip-t-print": "Vérsi cétak kaca puniki",
-       "tooltip-t-permalink": "Pranala ajeg anggén révisinnyané kacané puniki",
+       "tooltip-t-permalink": "Pranala ajeg anggén révisin kacané puniki",
        "tooltip-ca-nstab-main": "Cingak kaca daging",
        "tooltip-ca-nstab-user": "Cingak kaca sang anganggé",
-       "tooltip-ca-nstab-special": "Puniki kaca kusus tur nénten prasida kauwah",
+       "tooltip-ca-nstab-special": "Puniki kaca kusus tur nénten prasida kauah",
        "tooltip-ca-nstab-project": "Cingak kaca proyek",
        "tooltip-ca-nstab-image": "Cingak kaca depukannyané",
-       "tooltip-ca-nstab-mediawiki": "Cingak séwalapatra sistem",
+       "tooltip-ca-nstab-mediawiki": "Cingak séwala sistem",
        "tooltip-ca-nstab-template": "Cingak citakan",
        "tooltip-ca-nstab-help": "Cingak kaca wantuan",
        "tooltip-ca-nstab-category": "Cingak kaca kategori",
        "tooltip-minoredit": "pingetin puniki dados panguwahan kidik",
-       "tooltip-save": "Raksa uahan jero",
-       "tooltip-preview": "Pagentosan sane dumun duwen ida dane, mangda anggen niki sadurung jagi nyimpen!",
-       "tooltip-diff": "Sinahang uahan sané karyanin jero ring sesuratannyané",
-       "tooltip-compareselectedversions": "cingak binane makekalih kepahan lembar sane kasudi",
-       "tooltip-watch": "imbuhin lembar niki ring daftar paninjoan ida dane",
-       "tooltip-rollback": "\"nguliang\" muwungan jagi ngabecikang ring lembar puniki nuju haturan sane untat ngangge apisan klik",
-       "tooltip-undo": "\"nguliang\" ngabuwungin jagi ngabecikang niki lan ngagah kotak mecikang ngangge mode pratayang. dasar ipun prasida kaimbuhin ring kotak pamicutet",
+       "tooltip-save": "Raksa uahan ragané",
+       "tooltip-publish": "Wedar uahan ragané",
+       "tooltip-preview": "Pracingak uahan ragané. Rarisang nganggén pracingak puniki sadurung ngraksa.",
+       "tooltip-diff": "Édéngang uahan sané karyanin ragané ring suratannyané",
+       "tooltip-compareselectedversions": "Cingak bina pantaraning kalih révisi kaca puniki sané kapilih",
+       "tooltip-watch": "Tambeh kaca puniki ring pangawasan ragané",
+       "tooltip-rollback": "\"Waliang\" wantah ngwangdéang uahan kontributor sané pinih untat ring kaca puniki antuk klik apisan",
+       "tooltip-undo": "\"Ulihang\" wantah ngwangdéang uahan puniki miwah membuka formulir uahannyané ring mode pracingak. Larapan prasida katambehin ring ringkesannyané.",
        "tooltip-summary": "Dagingin ringkesan",
-       "simpleantispam-label": "Pamariksa anti-spam.\nPuniki <strong>wenten</strong> kaisi!",
+       "simpleantispam-label": "Panuréksa anti-spam.\n<strong>Sampunang</strong> nagingin puniki!",
        "pageinfo-title": "Pidarta indik \"$1\"",
        "pageinfo-header-basic": "Pidarta kaca",
        "pageinfo-header-edits": "Babad uahan",
        "pageinfo-header-restrictions": "Saiban kaca",
-       "pageinfo-header-properties": "Properti suratan",
-       "pageinfo-display-title": "Edengang judul",
+       "pageinfo-header-properties": "Properti kaca",
+       "pageinfo-display-title": "Murda tampilan",
+       "pageinfo-default-sort": "Kunci urut sané baku",
        "pageinfo-length": "Dawannyané kaca (ring bita)",
        "pageinfo-namespace": "Genah wastan",
        "pageinfo-article-id": "ID kaca",
        "pageinfo-language": "Basa ring daging kaca",
        "pageinfo-content-model": "Modél antuk daging kaca",
+       "pageinfo-robot-policy": "Kaindéksang antuk robot",
        "pageinfo-robot-index": "Kalugra",
        "pageinfo-robot-noindex": "Tan kalugra",
-       "pageinfo-watchers": "Akéh nomér sané negdeg kaca",
-       "pageinfo-few-watchers": "Kirang saking $1 {{PLURAL:$1|tamiu}}",
+       "pageinfo-watchers": "Akéh sané ngawasin kaca",
+       "pageinfo-few-watchers": "Kirang saking $1 {{PLURAL:$1|sané ngawasin}}",
        "pageinfo-redirects-name": "Akéh nomer sané magingsir ka kaca puniki",
        "pageinfo-subpages-name": "Kapahan kaca saking kaca puniki",
+       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|kaalihang}}; $3 {{PLURAL:$3|nénten-kaalihang}})",
        "pageinfo-firstuser": "Sang makarya kaca",
-       "pageinfo-firsttime": "Galah ritatkala ngripta kaca",
-       "pageinfo-lastuser": "Panguwah sané pinih anyar",
+       "pageinfo-firsttime": "Tanggal ngardi kaca",
+       "pageinfo-lastuser": "Sang nguah pinih untat",
        "pageinfo-lasttime": "Galah antuk uahan sané pinih anyar",
-       "pageinfo-edits": "Akéh nomer sané kauwah",
+       "pageinfo-edits": "Akéh uahan",
        "pageinfo-authors": "Akéh nomer makasami antuk panyurat sané lianan",
        "pageinfo-recent-edits": "Akéh nomer sané kauwah (ring $1 sané sampun lintang)",
        "pageinfo-recent-authors": "Akéh nomer antuk panyurat sané lianan",
+       "pageinfo-magic-words": "{{PLURAL:$1Kruna}} sakti ($1)",
+       "pageinfo-hidden-categories": "{{PLURAL:$1|Kategori}} sané kaengkebang ($1)",
+       "pageinfo-templates": "Katranslusi {{PLURAL:$1|template|templates}} ($1)",
        "pageinfo-toolboxlink": "Pidarta kaca",
        "pageinfo-contentpage": "Kapeték dados kaca daging",
        "pageinfo-contentpage-yes": "Inggih",
+       "patrol-log-page": "Log patroli",
        "previousdiff": "← Uahan sadurungnyané",
        "nextdiff": "Uahan sané pinih anyar →",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|kaca}}",
        "svg-long-desc": "Berkas SVG, jimbarnyané $1 × $2 piksel, agengnyané berkas: $3",
        "show-big-image": "Depukan sujati",
        "show-big-image-preview": "Agengnyané pratuduh puniki: $1.",
-       "show-big-image-other": "{{PLURAL:$2|Resolusi}} iianan: $1.",
+       "show-big-image-other": "{{PLURAL:$2|Résolusi}} lianan: $1.",
        "show-big-image-size": "$1 × $2 piksel",
        "sunday-at": "Redite jam $1",
        "bad_image_list": "bentukne sekadi puniki:\n\nwantah kepahan daftar ( baris sane kakawitin anggen tanda *) sane kaitung pranala kapertama ring baris mangda pranala ring berkas sane kaon.\nPranala-Pranala sane selanturnyane ring baris sane pateh kamanahang antuk pinangging, inggih punika lembar sane prasida ngedengang berkas punika.",
        "metadata": "Métadata",
-       "metadata-help": "pupulan puniki madaging wacana imbuhan minab sane kaimbuhin olih kamera digital utawi scanner sane kaanggen antuk ngawi atawi \"mendigitalisasi\" pupulan. Yening pupulan niki sampun taen kautak-atik, rerincine sane wenten minab nenten samian nyiriang wacan saking gambar sane sampun kautak-atik niki.",
-       "metadata-fields": "Widang métadata gambar sané kacantumang ring séwalapatra puniki jagi kalebuang ring tampilan kaca gambar ri tatkala tabél métadata kacenikang.\nSané lianan jagi kasenetang.\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-help": "Berkas puniki madaging pidarta tambehan, minab katambehin saking kaméra digital utawi pemindai sané kaanggén ngardi utawi nigitalisasi.\nYéning berkasnyané sampun kamodifikasi saking kawéntenan witnyané, rincian saking witnyané minab nénten samian pateh malih saking berkas sané kamodifikasi.",
+       "metadata-fields": "Widang métadata gambar ring séwala puniki jagi kalebuang ring tampilan kaca gambar ri tatkala tabél métadata kacenikang.\nSané lianan jagi kasenetang.\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",
        "namespacesall": "samian",
        "monthsall": "samian",
        "confirmemail_invalidated": "Konfirmasi alamat email kawangdéang",
        "table_pager_prev": "Kaca sadurungnyané",
        "watchlisttools-clear": "Ngicalang pupulan sané sampun karauhin",
        "watchlisttools-view": "Cingak uahan sane relevan",
-       "watchlisttools-edit": "Cingak miwah uah bacakan pantauan",
-       "watchlisttools-raw": "Uah kepahan paninjo mentah",
+       "watchlisttools-edit": "Cingak miwah uah pangawasan",
+       "watchlisttools-raw": "Uah pangawasan matah",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|pabligbagan]])",
        "duplicate-defaultsort": "pingetan: sereg pangurutan lingga \"$2\" nyampahang sereg pangurutan lingga sadurunge \"$1\"",
        "version-specialpages": "Kaca kusus",
        "redirect-user": "ID sang anganggé",
        "redirect-page": "ID kaca",
        "redirect-revision": "Uahan kaca",
-       "redirect-file": "Wastan berkas",
+       "redirect-file": "Aran berkas",
        "specialpages": "Kaca kusus",
        "external_image_whitelist": "#banggiang baris niki sapunapi kawentenanne<pre>\n#anggen fragmen akspresi reguler (wantah kepahan ring kekelaih//) ring sor puniki\n#fragmen-fragmen puniki jagi kaadungang sareng URL saking gambar-gambar eksternal (sane kasambungang langsung)\n#fragmen sane adung jagi katampilang dados gambar, sisanne wantah dados pranala kewanten\n#baris sane kakawitin antuk # jagi kadadosang baris komentar\n#niki nenten ngabinayang aksara ageng lan alit\n#genahang samian fragmen ekspresi reguler ring sor baris puniki. banggiang baris niki sapunapi kawentennane</pre>",
-       "tag-filter": "filter [[Special:Tags|tag]]:",
-       "tag-list-wrapper": "[[Special:Tags|{{PLURAL:$1|Tag}}]]: $2",
+       "tag-filter": "Panyaring [[Special:Tags|cihna]]:",
+       "tag-list-wrapper": "[[Special:Tags|{{PLURAL:$1|Cihna}}]]: $2",
+       "tag-mw-rollback": "Waliang",
+       "tag-mw-rollback-description": "Uahan sané ngwaliang uahan sadurungnyané nganggén pranala waliang",
        "tags-active-yes": "Inggih",
        "tags-active-no": "Nénten",
        "tags-edit": "uah",
        "tags-delete-title": "Usap tag",
        "compare-page2": "Kaca 2",
        "logentry-delete-delete": "$1 {{GENDER:$2|ngusapin}} kaca $3",
-       "logentry-delete-restore": "$1 {{GENDER:$2|ngwalikan}} kaca $3 ($4)",
+       "logentry-delete-restore": "$1 {{GENDER:$2|ngwaliang}} kaca $3 ($4)",
        "logentry-delete-revision": "$1 {{GENDER:$2|mauah}} kaca utama {{PLURAL:$5|$5  pamecikan}} ring kaca $3: $4",
-       "revdelete-content-hid": "dagingnyané kaengkebang",
-       "logentry-move-move": "$1 {{GENDER:$2|ngingsirang}} kaca $3 ring $4",
-       "logentry-move-move-noredirect": "$1 {{GENDER:$2|maglisiran}} kaca $3 ka $4 tur nenten ngawe pengalihan",
-       "logentry-move-move_redir": "$1 {{GENDER:$2|maglisiran}} kaca $3 ka $4 tur nenten ngawe pengalihan",
-       "logentry-newusers-create": "Akun sang anganggé $1 {{GENDER:$2|kakaryanin}}",
-       "logentry-newusers-autocreate": "Akun sang anganggé $1 {{GENDER:$2|kakaryanin}} otomatis",
+       "revdelete-content-hid": "daging kaengkebang",
+       "logentry-move-move": "$1 {{GENDER:$2|ngingsirang}} kaca $3 ka $4",
+       "logentry-move-move-noredirect": "$1 {{GENDER:$2|ngingsirang}} kaca $3 ka $4 tur nenten ngawe pengalihan",
+       "logentry-move-move_redir": "$1 {{GENDER:$2|ngingsirang}} kaca $3 ka $4 tur nenten ngawe pengalihan",
+       "logentry-patrol-patrol-auto": "$1 otomatis {{GENDER:$2|kacihnayang}} sampun kabecikang $4 saking kaca $3 kaawasin",
+       "logentry-newusers-create": "Akun sang anganggé $1 {{GENDER:$2|kakardi}}",
+       "logentry-newusers-autocreate": "Akun sang anganggé $1 {{GENDER:$2|kakardi}} otomatis",
        "logentry-protect-protect": "$1 {{GENDER:$2|nyaibin}} $3 $4",
        "logentry-upload-upload": "$1 {{GENDER:$2|ngunggahang}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|ngunggahang}} vèrsi anyar saking $3",
        "feedback-cancel": "Wangdé",
-       "feedback-message": "Séwalapatra:",
+       "feedback-message": "Séwala:",
        "searchsuggest-search": "Rereh ring {{SITENAME}}",
        "duration-days": "$1 {{PLURAL:$1|rahina}}",
        "pagelanguage": "Uah basa ring kaca",
index 19585c8..dcb06ae 100644 (file)
        "specialmute-success": "Вашыя налады заглушэньня былі абноўленыя. Глядзіце ўсіх заглушаных удзельнікаў на старонцы [[Special:Preferences|вашых наладаў]].",
        "specialmute-submit": "Пацьвердзіць",
        "specialmute-label-mute-email": "Заглушыць лісты электроннай пошты ад гэтага ўдзельніка",
-       "specialmute-header": "Калі ласка, абярыце вашыя налады заглушэньня для <b>{{BIDI:[[User:$1]]}}</b>.",
+       "specialmute-header": "Калі ласка, абярыце вашыя налады заглушэньня для {{GENDER:$1|ўдзельніка|ўдзельніцы}} <b>{{BIDI:[[User:$1|$1]]}}</b>.",
        "specialmute-error-invalid-user": "Запытанае імя ўдзельніка ня можа быць знойдзенае.",
-       "specialmute-email-footer": "Для кіраваньня наладамі электроннай пошты для {{BIDI:$2}}, калі ласка, наведайце <$1>.",
+       "specialmute-email-footer": "Для кіраваньня наладамі электроннай пошты {{GENDER:$1|ўдзельніка|ўдзельніцы}} {{BIDI:$2}}, калі ласка, наведайце <$1>.",
        "specialmute-login-required": "Калі ласка, увайдзіце, каб зьмяніць вашыя налады заглушэньня.",
        "mute-preferences": "Налады заглушэньня",
        "revid": "вэрсія $1",
index c356041..3132c1b 100644 (file)
        "search-interwiki-more": "(яшчэ)",
        "search-interwiki-more-results": "больш вынікаў",
        "search-relatedarticle": "Дачыняюцца*",
+       "search-invalid-sort-order": "Парадак сартавання ў $1 не распазнаны, будзе ўжыта сартаванне па змоўчанні. Правільныя запыты на сартаванне: $2",
        "searchrelated": "маюць дачыненне",
        "searchall": "усе",
        "showingresults": "Ніжэй паказаны да {{PLURAL:$1|'''$1''' выніку|'''$1''' вынікаў}}, пачынаючы з нумару '''$2'''.",
        "exbeforeblank": "змесціва перад ачысткаю было: '$1'",
        "delete-confirm": "Выдаліць \"$1\"",
        "delete-legend": "Выдаліць",
-       "historywarning": "<strong>Увага:</strong> Ð¡Ñ\82аÑ\80онка, Ñ\8fкÑ\83Ñ\8e Ð²Ñ\8b Ñ\85оÑ\87аÑ\86е Ð²Ñ\8bдалÑ\96Ñ\86Ñ\8c, Ð¼Ð°Ðµ Ð³Ñ\96Ñ\81Ñ\82оÑ\80Ñ\8bÑ\8e Ð· Ð¿Ñ\80Ñ\8bблÑ\96зна $1 {{PLURAL:$1|пÑ\80аÑ\9eкÑ\83|пÑ\80аÑ\9eкÑ\96|пÑ\80авак}}:",
+       "historywarning": "<strong>Увага:</strong> Ð¡Ñ\82аÑ\80онка, Ñ\8fкÑ\83Ñ\8e Ð²Ñ\8b Ñ\85оÑ\87аÑ\86е Ð²Ñ\8bдалÑ\96Ñ\86Ñ\8c, Ð¼Ð°Ðµ Ð³Ñ\96Ñ\81Ñ\82оÑ\80Ñ\8bÑ\8e Ð¿Ñ\80авак Ð· $1 {{PLURAL:$1|веÑ\80Ñ\81Ñ\96Ñ\8fй|веÑ\80Ñ\81Ñ\96Ñ\8fмÑ\96|веÑ\80Ñ\81Ñ\96Ñ\8fмÑ\96}}:",
        "historyaction-submit": "Паказаць",
        "confirmdeletetext": "Вы збіраецеся выдаліць старонку разам з усёй яе гісторыяй правак.\nПацвердзіце свой намер зрабіць гэта, сваё разуменне наступстваў, і што Вы робіце гэта ў адпаведнасці з [[{{MediaWiki:Policy-url}}|асноўнымі правіламі праекта]].",
        "actioncomplete": "Завершана аперацыя",
        "newimages-hidepatrolled": "Без паказу ўхваленых ўкладанняў",
        "newimages-mediatype": "Тып медиафайла:",
        "noimages": "Тут нічога няма.",
-       "gallery-slideshow-toggle": "Ð\9fеÑ\80еклÑ\8eÑ\87иÑ\82ь мініяцюры",
+       "gallery-slideshow-toggle": "Ð\9fеÑ\80аклÑ\8eÑ\87Ñ\8bÑ\86ь мініяцюры",
        "ilsubmit": "Знайсці",
        "bydate": "п. датаў",
        "sp-newimages-showfrom": "Паказаць новыя файлы, пачынаючы з $2, $1",
index 485c9fe..ed8ae16 100644 (file)
        "nocreate-loggedin": "Нямате необходимите права да създавате нови страници.",
        "sectioneditnotsupported-title": "Не се поддържа редактиране на раздели",
        "sectioneditnotsupported-text": "Не се поддържа редактиране на раздели на тази страница.",
+       "modeleditnotsupported-title": "Редактирането не се поддържа",
+       "modeleditnotsupported-text": "Редактирането не се поддържа за модел на съдържанието $1.",
        "permissionserrors": "Грешка при правата на достъп",
        "permissionserrorstext": "Нямате правата да извършите това действие по {{PLURAL:$1|следната причина|следните причини}}:",
        "permissionserrorstext-withaction": "Нямате разрешение за $2 поради {{PLURAL:$1|следната причина|следните причини}}:",
        "rcfilters-clear-all-filters": "Изчистване на всички филтри",
        "rcfilters-show-new-changes": "Преглед на промените направени след $1",
        "rcfilters-search-placeholder": "Филтриране на промените (използвайте менюто или търсете по име на филтър)",
+       "rcfilters-search-placeholder-mobile": "Филтри",
        "rcfilters-invalid-filter": "Невалиден филтър",
        "rcfilters-empty-filter": "Няма активни филтри. Показани са всички редакции.",
        "rcfilters-filterlist-title": "Филтри",
        "changecontentmodel": "Промяна на модела на съдържанието на страница",
        "changecontentmodel-legend": "Промяна на модела на съдържанието",
        "changecontentmodel-title-label": "Заглавие на страницата:",
+       "changecontentmodel-current-label": "Текущ модел на съдържанието:",
        "changecontentmodel-model-label": "Нов модел на съдържанието:",
        "changecontentmodel-reason-label": "Причина:",
        "changecontentmodel-submit": "Променяне",
        "mycontris": "Приноси",
        "anoncontribs": "Приноси",
        "contribsub2": "За {{GENDER:$3|$1}} ($2)",
+       "contributions-subtitle": "За {{GENDER:$3|$1}}",
        "contributions-userdoesnotexist": "Няма регистрирана потребителска сметка за „$1“.",
        "negative-namespace-not-supported": "Именни пространства с негативни стойности не се поддържат.",
        "nocontribs": "Не са намерени промени, отговарящи на критерия.",
        "permanentlink": "Постоянна препратка",
        "permanentlink-revid": "ID на редакцията",
        "permanentlink-submit": "Към редакцията",
+       "newsection": "Нов раздел",
+       "newsection-page": "Целева страница",
        "dberr-problems": "Съжаляваме! Сайтът изпитва технически затруднения.",
        "dberr-again": "Изчакайте няколко минути и опитайте да презаредите.",
        "dberr-info": "(Няма достъп до базата от данни: $1)",
        "dberr-info-hidden": "(Няма връзка със сървъра на базата данни)",
-       "htmlform-invalid-input": "Има проблеми с част от въведения от вас вход",
+       "htmlform-invalid-input": "Има проблеми с част от въведения от вас текст",
        "htmlform-select-badoption": "Посочената от вас стойност не е валидна алтернатива.",
        "htmlform-int-invalid": "Въведената от вас стойност не е цяло число.",
        "htmlform-float-invalid": "Посочената стойност не е число.",
        "htmlform-int-toolow": "Посочената от вас стойност е под минимално допустимата $1.",
        "htmlform-int-toohigh": "Посочената от вас стойност надхвърля максимално допустимата $1.",
-       "htmlform-required": "Тази стойност се изисква",
+       "htmlform-required": "Тази стойност е задължителна.",
        "htmlform-submit": "Изпращане",
        "htmlform-reset": "Отказване на промените",
        "htmlform-selectorother-other": "Друга",
index 224e4ae..c5274a3 100644 (file)
@@ -87,6 +87,7 @@
        "tog-useeditwarning": "কোনো সম্পাদনা পাতা ত্যাগের সময় পরিবর্তনগুলি সংরক্ষিত না হয়ে থাকলে আমাকে সাবধান করা হোক",
        "tog-prefershttps": "অ্যাকাউন্টে প্রবেশ করার সময় সবসময় নিরাপদ সংযোগ ব্যবহার করুন",
        "tog-showrollbackconfirmation": "একটি রোলব্যাক লিঙ্ক ক্লিক করার সময় একটি নিশ্চিতকরণ বার্তা দেখান",
+       "tog-requireemail": "পাসওয়ার্ড পুনঃস্থাপন করার জন্য ইমেল প্রয়োজন",
        "underline-always": "সব সময়",
        "underline-never": "কখনো নয়",
        "underline-default": "আবরণ বা ব্রাউজারে যেমনভাবে নির্দিষ্ট করা আছে",
        "undo-norev": "সম্পাদনাটি বাতিল করা যাচ্ছেনা কারণ এটি আর নেই বা মুছে ফেলা হয়েছে।",
        "undo-nochange": "সম্পাদনাটি পূর্বেই বাতিল করা হয়েছে।",
        "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|আলাপ]])-এর সম্পাদিত $1 নম্বর সংশোধনটি বাতিল করা হয়েছে",
+       "undo-summary-anon": "[[Special:Contributions/$2|$2]]-এর সম্পাদিত $1 নম্বর সংশোধনটি বাতিল করা হয়েছে",
        "undo-summary-username-hidden": "একজন লুকানো ব্যবহারকারীর করা $1 নং সংশোধনটি বাতিল করা হয়েছে",
        "cantcreateaccount-text": "[[User:$3|$3]] এই আইপি ঠিকানা('''$1''') থেকে অ্যাকাউন্ট সৃষ্টিতে বাধা দিয়েছেন।\n\n$3-এর দেয়া কারণ হল ''$2''",
        "cantcreateaccount-range-text": "[[User:$3|$3]] কর্তৃক আইপি ঠিকানার ব্যাপ্তি <strong>$1</strong>-এর মধ্যে অ্যাকাউন্ট তৈরি করা অবরুদ্ধ করা হয়েছে। যাতে আপনার আইপি ঠিকানাও (<strong>$4</strong>) রয়েছে। \n\n$3 কর্তৃক <em>$2</em> কারণ দেখানো হয়েছে।",
index e8c22b4..7975de7 100644 (file)
@@ -92,6 +92,7 @@
        "tog-useeditwarning": "Upozornit, když budu opouštět editaci bez uložení změn",
        "tog-prefershttps": "Po přihlášení vždy používat zabezpečené připojení",
        "tog-showrollbackconfirmation": "Při kliknutí na odkaz pro vrácení editace zobrazit žádost o potvrzení",
+       "tog-requireemail": "Pro obnovu hesla vyžadovat e-mail",
        "underline-always": "Vždy",
        "underline-never": "Nikdy",
        "underline-default": "Podle nastavení prohlížeče nebo vzhledu",
        "ipblocklist-legend": "Hledat zablokovaného uživatele",
        "blocklist-userblocks": "Skrýt zablokované účty",
        "blocklist-tempblocks": "Skrýt dočasná zablokování",
+       "blocklist-indefblocks": "Skrýt zablokování do odvolání",
        "blocklist-addressblocks": "Skrýt blokování jedné IP adresy",
        "blocklist-type": "Typ:",
        "blocklist-type-opt-all": "Vše",
index 08aaa49..d82e2c7 100644 (file)
        "tog-useeditwarning": "Warnen, sofern eine zur Bearbeitung geöffnete Seite verlassen wird, die nicht gespeicherte Änderungen enthält",
        "tog-prefershttps": "Immer eine sichere Verbindung benutzen, solange ich angemeldet bin",
        "tog-showrollbackconfirmation": "Bei Klick auf „kommentarlos zurücksetzen“ eine Sicherheitsabfrage anzeigen",
+       "tog-requireemail": "E-Mail-Adresse zum Zurücksetzen des Passworts erforderlich",
        "underline-always": "immer",
        "underline-never": "nie",
        "underline-default": "abhängig von der Benutzeroberfläche oder Browsereinstellung",
        "nocreate-loggedin": "Du hast nicht die erforderliche Berechtigung, um neue Seiten erstellen zu können.",
        "sectioneditnotsupported-title": "Die Bearbeitung von Abschnitten wird nicht unterstützt",
        "sectioneditnotsupported-text": "Die Bearbeitung von Abschnitten wird auf dieser Bearbeitungsseite nicht unterstützt.",
+       "modeleditnotsupported-title": "Bearbeiten nicht möglich",
+       "modeleditnotsupported-text": "Das Bearbeiten wird für Seiten des Inhaltsmodells $1 nicht unterstützt.",
        "permissionserrors": "Berechtigungsfehler",
        "permissionserrorstext": "Du bist nicht berechtigt, die Aktion auszuführen. {{PLURAL:$1|Grund|Gründe}}:",
        "permissionserrorstext-withaction": "Du bist aus {{PLURAL:$1|dem folgenden Grund|den folgenden Gründen}} nicht berechtigt, $2:",
        "content-model-css": "CSS",
        "content-json-empty-object": "Leeres Objekt",
        "content-json-empty-array": "Leeres Array",
+       "unsupported-content-model": "<strong>Warnung:</strong> Das Inhaltsmodell $1 wird auf diesem Wiki nicht unterstützt.",
+       "unsupported-content-diff": "Versionsvergleiche werden für Seiten des Inhaltsmodells $1 nicht unterstützt.",
+       "unsupported-content-diff2": "Versionsvergleiche zwischen den Inhaltsmodellen $1 und $2 werden auf diesem Wiki nicht unterstützt.",
        "deprecated-self-close-category": "Seiten, die ungültige selbstschließende HTML-Tags verwenden",
        "deprecated-self-close-category-desc": "Die Seite enthält ungültige selbstschließende HTML-Tags wie <code>&lt;b/></code> oder <code>&lt;span/></code>. Das Verhalten dieser Tags wird bald geändert, um mit der HTML5-Spezifikation konsistent zu sein, so dass ihre Verwendung im Wikitext veraltet ist.",
        "duplicate-args-warning": "<strong>Warnung:</strong> [[:$1]] ruft [[:$2]] mit mehr als einem Wert für den Parameter „$3“ auf. Nur der letzte angegebene Wert wird verwendet.",
        "undo-norev": "Die Bearbeitung konnte nicht rückgängig gemacht werden, da sie nicht vorhanden ist oder gelöscht wurde.",
        "undo-nochange": "Anscheinend wurde diese Bearbeitung bereits rückgängig gemacht.",
        "undo-summary": "Änderung $1 von [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskussion]]) rückgängig gemacht.",
+       "undo-summary-anon": "Änderung $1 von [[Special:Contributions/$2|$2]] rückgängig gemacht",
        "undo-summary-username-hidden": "Änderung $1 eines versteckten Benutzers rückgängig gemacht.",
        "cantcreateaccount-text": "Die Erstellung eines Benutzerkontos von der IP-Adresse '''($1)''' aus wurde durch [[User:$3|$3]] gesperrt.\n\nGrund der Sperre: ''$2''",
        "cantcreateaccount-range-text": "Das Erstellen von Benutzerkonten von IP-Adressen im Bereich <strong>$1</strong>, der deine IP-Adresse (<strong>$4</strong>) enthält, wurde von [[User:$3|$3]] gesperrt.\n\nDer angegebene Grund von $3 lautet: <em>$2</em>",
        "prefs-help-email": "Die Angabe einer E-Mail-Adresse ist optional, ermöglicht aber die Zusendung eines Ersatzpasswortes, sofern du dein Passwort vergessen hast.",
        "prefs-help-email-others": "Mit anderen Benutzern kannst du auch über die Benutzerdiskussionsseiten Kontakt aufnehmen, ohne dass du deine Identität offenlegen musst.",
        "prefs-help-email-required": "Es wird eine gültige E-Mail-Adresse benötigt.",
+       "prefs-help-requireemail": "Wird diese Option ausgewählt, werden nur dann E-Mails zum Zurücksetzen des Passworts versandt, wenn die Person beim Zurücksetzen den Benutzernamen und die E-Mail-Adresse dieses Kontos angegeben hat.",
        "prefs-info": "Basisinformationen",
        "prefs-i18n": "Sprache",
        "prefs-signature": "Signatur",
        "rcfilters-filter-showlinkedto-label": "Änderungen auf Seiten anzeigen, die verlinken auf",
        "rcfilters-filter-showlinkedto-option-label": "<strong>Seiten</strong>, die <strong>auf</strong> die ausgewählte Seite <strong>verlinken</strong>",
        "rcfilters-target-page-placeholder": "Einen Seitennamen (oder eine Kategorie) eingeben",
+       "rcfilters-allcontents-label": "Alle Inhaltsseiten",
+       "rcfilters-alldiscussions-label": "Alle Diskussionsseiten",
        "rcnotefrom": "Angezeigt {{PLURAL:$5|wird die Änderung|werden die Änderungen}} seit <strong>$3, $4</strong> (max. <strong>$1</strong> Einträge).",
        "rclistfromreset": "Datumsauswahl zurücksetzen",
        "rclistfrom": "Nur Änderungen seit $3, $2 Uhr zeigen.",
        "backend-fail-contenttype": "Der Inhaltstyp, der im Pfad „$1“ zu speichernden Datei, konnte nicht bestimmt werden.",
        "backend-fail-batchsize": "Der Datenbank wurde eine Stapelverarbeitungsdatei mit {{PLURAL:$1|einem Verarbeitungsschritt|$1 Verarbeitungsschritten}} übermittelt. Die zulässige Obergrenze liegt indes bei {{PLURAL:$2|einem Verarbeitungsschritt|$2 Verarbeitungsschritten}}.",
        "backend-fail-usable": "Die Datei „$1“ konnte entweder aufgrund eines nicht vorhandenen Verzeichnisses oder wegen unzureichender Berechtigungen weder abgerufen noch gespeichert werden.",
+       "backend-fail-stat": "Konnte den Status der Datei $1 nicht auslesen.",
+       "backend-fail-hash": "Konnte den kryptographischen Hash der Datei $1 nicht ermitteln.",
        "filejournal-fail-dbconnect": "Es konnte keine Verbindung zur Journaldatenbank des Datenbanksystems „$1“ hergestellt werden.",
        "filejournal-fail-dbquery": "Die Journaldatenbank des Datenbanksystems „$1“ konnte nicht aktualisiert werden.",
        "lockmanager-notlocked": "„$1“ konnte nicht entsperrt werden, da keine Sperrung besteht.",
        "alreadyrolled": "Das Zurücksetzen der Änderungen von [[User:$2|$2]] ([[User talk:$2|Diskussion]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) an [[:$1]] ist gescheitert, da bereits ein anderer Benutzer die Seite geändert hat.\n\nDie letzte Änderung stammt von [[User:$3|$3]] ([[User talk:$3|Diskussion]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Die Änderungszusammenfassung lautet: <em>$1</em>.",
        "revertpage": "Änderungen von [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskussion]]) wurden auf die letzte Version von [[User:$1|$1]] zurückgesetzt",
+       "revertpage-anon": "Änderungen von [[Special:Contributions/$2|$2]] wurden auf die letzte Version von [[User:$1|$1]] zurückgesetzt",
        "revertpage-nouser": "Änderungen von einem versteckten Benutzer rückgängig gemacht und letzte Version von {{GENDER:$1|[[User:$1|$1]]}} wiederhergestellt",
        "rollback-success": "Die Änderungen von {{GENDER:$3|$1}} wurden rückgängig gemacht und die letzte Version von {{GENDER:$4|$2}} wurde wiederhergestellt.",
        "sessionfailure-title": "Sitzungsfehler",
        "sessionfailure": "Es gab ein Problem bei der Übertragung deiner Benutzerdaten.\nDiese Aktion wurde daher sicherheitshalber abgebrochen, um eine falsche Zuordnung deiner Änderungen zu einem anderen Benutzer zu verhindern.\nBitte sende das Formular erneut ab.",
        "changecontentmodel": "Inhaltsmodell einer Seite ändern",
        "changecontentmodel-legend": "Inhaltsmodell ändern",
-       "changecontentmodel-title-label": "Seitentitel",
+       "changecontentmodel-title-label": "Seitentitel:",
        "changecontentmodel-current-label": "Aktuelles Inhaltsmodell:",
-       "changecontentmodel-model-label": "Neues Inhaltsmodell",
+       "changecontentmodel-model-label": "Neues Inhaltsmodell:",
        "changecontentmodel-reason-label": "Grund:",
        "changecontentmodel-submit": "Ändern",
        "changecontentmodel-success-title": "Das Inhaltsmodell wurde geändert",
        "ipblocklist-legend": "Suche nach einem gesperrten Benutzer",
        "blocklist-userblocks": "Benutzersperren ausblenden",
        "blocklist-tempblocks": "Befristete Sperren ausblenden",
+       "blocklist-indefblocks": "Unbefristete Sperren ausblenden",
        "blocklist-addressblocks": "Sperren einzelner IP-Adressen ausblenden",
        "blocklist-type": "Typ:",
        "blocklist-type-opt-all": "Alle",
        "block-log-flags-angry-autoblock": "erweiterter Autoblock aktiviert",
        "block-log-flags-hiddenname": "Benutzername versteckt",
        "range_block_disabled": "Die Möglichkeit, ganze Adressräume zu sperren, ist nicht aktiviert.",
+       "ipb-prevent-user-talk-edit": "Das Bearbeiten der eigenen Diskussionsseite muss bei einer partiellen Sperre erlaubt bleiben, es sei denn, diese enthält Beschränkungen zum Benutzerdiskussions-Namensraum.",
        "ipb_expiry_invalid": "Die eingegebene Dauer ist ungültig.",
        "ipb_expiry_old": "Der Zeitpunkt des Ablaufs liegt in der Vergangenheit.",
        "ipb_expiry_temp": "Benutzernamens-Sperren mit der Verstecken-Option müssen permanent sein.",
        "move-page-legend": "Seite verschieben",
        "movepagetext": "Mit untenstehendem Formular kannst du eine Seite umbenennen, indem du sie mitsamt allen Versionen auf einen neuen Titel verschiebst.\nDer alte Titel wird danach zum neuen weiterleiten.\nDu kannst Weiterleitungen, die auf den Originaltitel verlinken, automatisch korrigieren lassen.\nStelle sicher, dass du im Anschluss alle [[Special:DoubleRedirects|doppelten]] oder [[Special:BrokenRedirects|defekten Weiterleitungen]] überprüfst.\nDu bist dafür verantwortlich, dass Links weiterhin auf das korrekte Ziel verweisen.\n\nDie Seite wird <strong>nicht</strong> verschoben, sofern es bereits eine Seite mit dem vorgesehenen Titel gibt, es sei denn, letztere ist eine Weiterleitung ohne Versionsgeschichte.\nDies bedeutet, dass du die Umbenennung rückgängig machen kannst, sofern du einen Fehler gemacht hast. Du kannst hingegen keine existierende Seite überschreiben.\n\n<strong>Hinweis:</strong>\nDie Verschiebung kann weitreichende und unerwartete Folgen für häufig besuchte Seiten haben.\nDu solltest daher die Konsequenzen verstanden haben, bevor du jetzt fortfährst.",
        "movepagetext-noredirectfixer": "Mit untenstehendem Formular kannst du eine Seite umbenennen, indem du sie mitsamt allen Versionen auf einen neuen Titel verschiebst.\nDer alte Titel wird danach zum neuen weiterleiten.\nStelle sicher, dass du im Anschluss alle [[Special:DoubleRedirects|doppelten]] oder [[Special:BrokenRedirects|defekten Weiterleitungen]] überprüfst.\nDu bist dafür verantwortlich, dass Links weiterhin auf das korrekte Ziel verweisen.\n\nDie Seite wird <strong>nicht</strong> verschoben, sofern es bereits eine Seite mit dem vorgesehenen Titel gibt, es sei denn, diese ist eine Weiterleitung ohne Versionsgeschichte.\nDies bedeutet, dass du die Umbenennung rückgängig machen kannst, sofern du einen Fehler gemacht hast. Du kannst hingegen keine existierende Seite überschreiben.\n\n<strong>Hinweis:</strong>\nDie Verschiebung kann weitreichende und unerwartete Folgen für häufig besuchte Seiten haben.\nDu solltest daher die Konsequenzen verstanden haben, bevor du jetzt fortfährst.",
+       "movepagetext-noredirectsupport": "Mit untenstehendem Formular kannst du eine Seite umbenennen, indem du sie mitsamt allen Versionen auf einen neuen Titel verschiebst. Du bist dafür verantwortlich, dass Links weiterhin auf das korrekte Ziel verweisen. \n\nDie Seite wird <strong>nicht</strong> verschoben, sofern es bereits eine Seite mit dem vorgesehenen Titel gibt. Dies bedeutet, dass du die Umbenennung rückgängig machen kannst, sofern du einen Fehler gemacht hast. Du kannst hingegen keine existierende Seite überschreiben.\n\n<strong>Hinweis:</strong> Die Verschiebung kann weitreichende und unerwartete Folgen für häufig besuchte Seiten haben. Du solltest daher die Konsequenzen verstanden haben, bevor du jetzt fortfährst.",
        "movepagetalktext": "Falls du dieses Kästchen aktivierst, wird die dazugehörige Diskussionsseite automatisch auf den neuen Titel verschoben, sofern nicht bereits eine nicht-leere Diskussionsseite dort vorhanden ist.\n\nIn diesem Fall musst du die Seite manuell verschieben oder zusammenführen, falls erforderlich.",
        "moveuserpage-warning": "<strong>Warnung:</strong> Du bist dabei, eine Benutzerseite zu verschieben. Bitte bedenke, dass dadurch nur die Benutzerseite verschoben, <em>nicht</em> aber der Benutzer umbenannt wird.",
        "movecategorypage-warning": "<strong>Warnung:</strong> Du bist gerade dabei, eine Kategorieseite zu verschieben. Bitte sei dir bewusst, dass nur die Seite verschoben wird. Alle der alten Kategorie zugeordneten Seiten werden <em>nicht</em> neu kategorisiert.",
        "lastmodifiedatby": "Diese Seite wurde zuletzt am $1 um $2 Uhr von $3 bearbeitet.",
        "othercontribs": "Basierend auf der Arbeit von $1.",
        "others": "anderen",
-       "siteusers": "{{SITENAME}}-{{PLURAL:$2|{{GENDER:$1|Benutzer|Benutzerin}}|Benutzer}} $1",
-       "anonusers": "{{PLURAL:$2|unangemeldetem|unangemeldeten}} {{SITENAME}}-{{PLURAL:$2|Benutzer|Benutzern}} $1",
+       "siteusers": "{{PLURAL:$2|{{GENDER:$1|Benutzer|Benutzerin}}|Benutzer}} $1",
+       "anonusers": "{{PLURAL:$2|unangemeldetem|unangemeldeten}} {{PLURAL:$2|Benutzer|Benutzern}} $1",
        "creditspage": "Seitenzuschreibung",
        "nocredits": "Für diese Seite sind keine Zuschreibungen vorhanden.",
        "spamprotectiontitle": "Spamschutzfilter",
        "linkaccounts": "Benutzerkonten verknüpfen",
        "linkaccounts-success-text": "Das Benutzerkonto wurde verknüpft.",
        "linkaccounts-submit": "Benutzerkonten verknüpfen",
+       "cannotunlink-no-provider-title": "Es gibt keine verbundenen Konten, die getrennt werden könnten.",
+       "cannotunlink-no-provider": "Es gibt keine verbundenen Konten, die getrennt werden könnten.",
        "unlinkaccounts": "Benutzerkonten trennen",
        "unlinkaccounts-success": "Das Benutzerkonto wurde getrennt.",
        "authenticationdatachange-ignored": "Die Änderung der Authentifizierungsdaten wurde nicht bearbeitet. Vielleicht wurde kein Anbieter konfiguriert?",
        "specialmute-label-mute-email": "E-Mails von diesem Benutzer stummschalten",
        "specialmute-header": "Bitte wähle deine Stummschaltungseinstellungen für Benutzer <b>{{BIDI:[[User:$1|$1]]}}</b>.",
        "specialmute-error-invalid-user": "Der gesuchte Benutzername konnte nicht gefunden werden.",
+       "specialmute-error-no-options": "Stummschaltungs-Funktionen sind nicht verfügbar. Gründe dafür könnten sein: du hast deine E-Mail-Adresse nicht bestätigt oder ein Administrator hat die E-Mail-Funktionen deaktiviert oder eine E-Mail-Blacklist in diesem Wiki eingerichtet.",
        "specialmute-email-footer": "Um deine E-Mail Einstellungen für Benutzer {{BIDI:$2}} zu verwalten besuche bitte <$1>.",
        "specialmute-login-required": "Bitte melde dich an um deine Stummschaltungseinstellungen zu ändern.",
+       "mute-preferences": "Stummschaltungs-Einstellungen",
        "revid": "Version $1",
        "pageid": "Seitenkennung $1",
        "interfaceadmin-info": "$1\n\nBerechtigungen für das Bearbeiten von wikiweiten CSS/JS/JSON-Dateien wurden kürzlich vom Recht <code>editinterface</code> getrennt. Falls du nicht verstehst, warum du diesen Fehler erhältst, siehe [[mw:MediaWiki_1.32/interface-admin]].",
        "passwordpolicies-policy-passwordnotinlargeblacklist": "Das Passwort kann nicht in der Liste der 100.000 am häufigsten verwendeten Passwörter sein.",
        "passwordpolicies-policyflag-forcechange": "muss bei der Anmeldung geändert werden",
        "passwordpolicies-policyflag-suggestchangeonlogin": "Änderung bei der Anmeldung vorschlagen",
+       "mycustomjsredirectprotected": "Du hast keine Berechtigung, diese JavaScript-Seite zu bearbeiten, da sie eine Weiterleitung, die nicht in deinen Benutzernamensraum zeigt, enthält.",
        "easydeflate-invaliddeflate": "Der angegebene Inhalt ist nicht ordnungsgemäß komprimiert",
        "unprotected-js": "Aus Sicherheitsgründen kann JavaScript-Code nicht mehr von ungeschützten Seiten geladen werden. Erstelle die JavaScript-Seite bitte ausschließlich im Namensraum „MediaWiki“ oder als Benutzerunterseite.",
        "userlogout-continue": "Möchtest du dich abmelden?"
index b64046b..5b83833 100644 (file)
@@ -78,6 +78,7 @@
        "tog-norollbackdiff": "Peyser ardışi ra dıme ferqi measne",
        "tog-useeditwarning": "Wexto ke mı yew pela nizami be vurnayışanê nêqeydbiyayeyan caverdê, hay be mı ser de",
        "tog-prefershttps": "Ronışten akerden de tım greyo itimadın bıkarne",
+       "tog-requireemail": "Parolay reset kerdışi rê email lazıma",
        "underline-always": "Tım",
        "underline-never": "Qet",
        "underline-default": "Cild ya zi cı geyrayoğo hesebiyaye",
@@ -86,8 +87,8 @@
        "editfont-sansserif": "Fontê Sans-serifi",
        "editfont-serif": "Font (çêşıdê nuştey) Serif",
        "sunday": "Bazar",
-       "monday": "Bahdêbazari",
-       "tuesday": "Telete",
+       "monday": "Dışeme",
+       "tuesday": "Sêşeme",
        "wednesday": "Çarşeme",
        "thursday": "Pancşeme",
        "friday": "Êne",
        "fri": "Yen",
        "sat": "Şem",
        "january": "Çele",
-       "february": "Gucige",
+       "february": "Sıbate",
        "march": "Adar",
        "april": "Nisan",
-       "may_long": "Gulan",
+       "may_long": "Gulane",
        "june": "Heziran",
        "july": "Temuz",
        "august": "Tebaxe",
        "september": "Keşkelun",
-       "october": "Cıtmeng",
-       "november": "Kelverdan",
-       "december": "Gağan",
+       "october": "Tışrino Verên",
+       "november": "Tışrino Peyên",
+       "december": "Kanun",
        "january-gen": "Çele",
-       "february-gen": "Şıbat",
+       "february-gen": "Sıbate",
        "march-gen": "Mert",
        "april-gen": "Nisane",
        "may-gen": "Gulane",
        "july-gen": "Temuz",
        "august-gen": "Tebaxe",
        "september-gen": "Keşkelun",
-       "october-gen": "Cıtmeng",
-       "november-gen": "Kelverdan",
-       "december-gen": "Gağan",
+       "october-gen": "Tışrino Verên",
+       "november-gen": "Tışrino Peyên",
+       "december-gen": "Kanun",
        "jan": "Çel",
-       "feb": "Şbt",
+       "feb": "Sbt",
        "mar": "Adr",
        "apr": "Nsn",
        "may": "Gul",
        "nov": "Tşp",
        "dec": "Gğn",
        "january-date": "$1 Çele",
-       "february-date": "$1 Şıbat",
+       "february-date": "$1 Sıbate",
        "march-date": "$1 Adar",
        "april-date": "$1 Nisan",
-       "may-date": "$1 Gulan",
+       "may-date": "$1 Gulane",
        "june-date": "$1 Heziran",
        "july-date": "$1 Temuze",
        "august-date": "$1 Tebaxe",
        "september-date": "$1 Keşkelun",
        "october-date": "$1 Cıtmeng",
        "november-date": "$1 Kelverdan",
-       "december-date": "$1 Gağan",
+       "december-date": "$1 Kanun",
        "period-am": "VD",
        "period-pm": "BD",
-       "pagecategories": "{{PLURAL:$1|Kategori|Kategoriy}}",
+       "pagecategories": "{{PLURAL:$1|Kategoriye|Kategoriyi}}",
        "category_header": "Perrê kategoriya \"$1\"'i",
        "subcategories": "Kategoriyê bınêni",
        "category-media-header": "Dosye yê ke kategoriya \"$1\" dı",
        "category-file-count": "{{PLURAL:$2|Na kategori tenya dosya ya cêri muhtewa kena.|Na kategori de $2 ra pêro piya {{PLURAL:$1|1 dosya est a|$1 dosyey est ê}}.}}",
        "category-file-count-limited": "{{PLURAL:$1|Dosye|$1 Dosyey}} na kategori de yê.",
        "listingcontinuesabbrev": "dewam...",
-       "index-category": "Perrê rêzıni",
+       "index-category": "Pelê rêzıni",
        "noindex-category": "Perrê bêrêzıni",
        "broken-file-category": "Perri be linkanê dosya çewte",
        "categoryviewer-pagedlinks": "($1) ($2)",
        "about": "Heqa",
        "article": "Pela zerreki",
        "newwindow": "(pençerey newey de beno a)",
-       "cancel": "İbtal",
+       "cancel": "Bıtexelne",
        "moredotdotdot": "Vêşi...",
        "morenotlisted": "Na lista qay kemi ya.",
-       "mypage": "Perr",
-       "mytalk": "Vaten",
-       "anontalk": "Vaten",
+       "mypage": "Pele",
+       "mytalk": "Werênayış",
+       "anontalk": "Werênayış",
        "navigation": "Pusula",
        "and": "&#32;u",
        "faq": "PVP",
        "printableversion": "Versiyono nustenaye",
        "permalink": "Gıreyo daimi",
        "print": "Bınustenê",
-       "view": "Bıvin",
+       "view": "Bıvêne",
        "view-foreign": "$1 de bıvin",
-       "edit": "Bıvurn",
+       "edit": "Bıvurne",
        "edit-local": "Şınasnayışê lokali bıvurne",
        "create": "Vıraz",
        "create-local": "Şınasnayışê lokali cı ke",
-       "delete": "Bestern",
+       "delete": "Bestere",
        "undelete_short": "{{PLURAL:$1|nê vırnayışi|$1 vırnayışa}} peyser bıyarê",
        "viewdeleted_short": "{{PLURAL:$1|Jew vurnayış esternayi|$1 Vurnayışanê esternayan}} bımotne",
        "protect": "Bışevekne",
        "protect_change": "bıvırne",
        "unprotect": "Starnayışi bıvurne",
        "newpage": "Perra newi",
-       "talkpagelinktext": "vaten",
+       "talkpagelinktext": "werênayış",
        "specialpage": "Pela xısusiye",
        "personaltools": "Hacetê şexsiy",
        "talk": "Vaten",
        "edithelp": "Peştdariya vurnayışi",
        "helppage-top-gethelp": "Peşti",
        "mainpage": "Perra Seri",
-       "mainpage-description": "Pera seri",
+       "mainpage-description": "Pela seri",
        "policy-url": "Project:Terzê hereketi",
        "portal": "Portalê cemati",
        "portal-url": "Project:Portalê cemati",
        "collapsible-collapse": "Teng ke",
        "collapsible-expand": "Hera kerê",
        "confirmable-confirm": "{{GENDER:$1|Şıma}} bêgumanê?",
-       "confirmable-yes": "E",
+       "confirmable-yes": "Eya",
        "confirmable-no": "Nê",
        "thisisdeleted": "Bıvêne ya zi $1 peyser biya?",
        "viewdeleted": "$1 bıvin?",
        "restorelink": "{{PLURAL:$1|jew vurnayış besteriya|$1 vurnayışi besteriyaye}}",
-       "feedlinks": "Resnayış:",
+       "feedlinks": "Weyiyekerdış:",
        "feed-invalid": "Qeydey cıresnayışê  beğşi nêvêreno.",
        "feed-unavailable": "Cıresnayışê şebekey çıniyê",
        "site-rss-feed": "$1 Cıresnayışê RSSi",
        "red-link-title": "$1 (pele çıniya)",
        "sort-descending": "Rêzkerdışo kêmbiyaye",
        "sort-ascending": "Rêzkerdışo zêdiyaye",
-       "nstab-main": "Perr",
+       "nstab-main": "Pele",
        "nstab-user": "Pera karberi",
        "nstab-media": "Pela medya",
-       "nstab-special": "Perra bağse",
+       "nstab-special": "Pela xısusiye",
        "nstab-project": "Perra procey",
        "nstab-image": "Dosya",
        "nstab-mediawiki": "Mesac",
        "badarticleerror": "Kar  ke şıma kenê, qebul nêbi.",
        "cannotdelete": "Pel  \"$1\" o ke şıma nişane kerd hewn a neşı.\nBelka yewna ten kerdo hewn a.",
        "cannotdelete-title": "Şıma nêşenê pela \"$1\" besterê",
-       "delete-hook-aborted": "Esterıtışi terefê çengeli ra ibtal bi.\nQet tesrih beyan nêbi.",
+       "delete-hook-aborted": "Esterıtışi terefê çengeli ra nêtexeliya.\nQet tesrih beyan nêbi.",
        "no-null-revision": "Qandé \"$1\" zew rewizyono newe névıraziya.",
        "badtitle": "Sernameyo xırabın",
        "badtitletext": "Sernameyê pela ke şıma waşt, nêvêrd, vengo ya zi zıwano miyanêno ğelet gırêdaye ya zi sernameyê wiki.\nBeno ke, tede yew ya zi zêdê işareti estê ke sernameyan de nêxebetiyenê.",
        "virus-scanfailed": "cıgerayiş tamam nêbı (kod $1)",
        "virus-unknownscanner": "antiviruso ke nêzanyeno:",
        "logouttext": "'''Henda şıma hesab ra veciyay.'''\n\nDiqat kerê ke tayê perri şenê hewna zey şıma kewtê ra cı bıasê, heta şıma ver-virê şanekerê (browserê) xo besterê.",
+       "logging-out-notify": "Şıma yê abıriyenê, reca kem bıpawê",
        "logout-failed": "Enewke ronıştışo nêracneyêno:$1",
        "cannotlogoutnow-title": "Enewke ronıştışo nêracneyêno",
        "cannotlogoutnow-text": "Gurenayışê $1i de veciyayış mımkın niyo.",
        "botpasswords-label-appid": "Nameyê boti:",
        "botpasswords-label-create": "Vıraze",
        "botpasswords-label-update": "Rocane ke",
-       "botpasswords-label-cancel": "İbtal",
-       "botpasswords-label-delete": "Bestern",
+       "botpasswords-label-cancel": "Bıtexelne",
+       "botpasswords-label-delete": "Bestere",
        "botpasswords-label-resetpassword": "Parola raçarne",
        "botpasswords-label-grants": "İmtıyazê ravêrdeyi:",
        "botpasswords-label-grants-column": "Dayen",
        "resetpass_forbidden-reason": "Parola nêvuriyena: $1",
        "resetpass-no-info": "şıma gani hesab akere u hona bıeşke bırese cı",
        "resetpass-submit-loggedin": "Parola bıvurne",
-       "resetpass-submit-cancel": "İbtal",
+       "resetpass-submit-cancel": "Bıtexelne",
        "resetpass-wrong-oldpass": "parolayo parola maqbul niyo.\nşıma ya parolaye xo vurnayo ya zi parolayo muwaqqat waşto.",
        "resetpass-recycled": "Parolaya şımaya newiye, wa paroloya şımaya verêne ra ciya bo.",
        "resetpass-temp-emailed": "E postaya rışyayê yubkoda şıma ronıştış akerdo.  Ronıştışi xo temammkerdışi rê yu parolaya newi lazım a",
        "rcfilters-watchlist-preference-label": "Mabeynrıyê non-JavaScript'i bıkarne",
        "rcfilters-filter-showlinkedfrom-label": "Gıreyê pelan ra vurnayışan bıvêne",
        "rcfilters-target-page-placeholder": "Yew nameyê pele (ya zi kategoriye) cı kerê",
+       "rcfilters-allcontents-label": "Zerrek pêro",
+       "rcfilters-alldiscussions-label": "Werênayışi pero",
        "rcnotefrom": "Cêr de <strong>$2</strong> ra nata {{PLURAL:$5|vurnayışiyê}} asenê (tewr vêşi <strong>$1</strong> asenê) <strong>$3, $4</strong>",
        "rclistfromreset": "Weçinayışê tarixi ragoze",
        "rclistfrom": "$3 sehat $2 ra tepiya vurnayışanê neweyan bımotne",
        "checkbox-all": "Pêro",
        "checkbox-none": "Çıniyo",
        "checkbox-invert": "Dimlaşt ke",
-       "allpages": "Perri pêro",
+       "allpages": "Peli pêro",
        "nextpage": "Pela bahdoyêne ($1)",
        "prevpage": "Pela veri ($1)",
        "allpagesfrom": "Herfa kı pa liste bo:",
        "sessionfailure": "cıkewtışê hesabê şıma de yew problem aseno;\nno kar semedê dızdiyê hesabi ibtal biyo.\nkerem kerê \"tepiya\" şiyerê u pel o ke şıma tera ameyî u o pel newe ra bar kerê , newe ra tesel/cereb kerê.",
        "changecontentmodel": "Modelê zerrekê pele bıvurne",
        "changecontentmodel-legend": "Modelê zerreki bıvurne",
-       "changecontentmodel-title-label": "Sernameyê pele",
+       "changecontentmodel-title-label": "Sernameyê pele:",
        "changecontentmodel-current-label": "Mewcud zerrekê modeli:",
-       "changecontentmodel-model-label": "Modelê zerrekiyo newe",
+       "changecontentmodel-model-label": "Modelê zerrekiyo newe:",
        "changecontentmodel-reason-label": "Sebeb:",
        "changecontentmodel-submit": "Bıvırne",
        "changecontentmodel-success-title": "Modelê zerreki vurriya",
        "undelete-search-title": "Bıgeyre pelanê eserıtiyan",
        "undelete-search-box": "bıgêr pelê hewn a biyayeyani",
        "undelete-search-prefix": "pel ê ke pê ney destpêkenî, ramocın",
+       "undelete-search-full": "Zerreki ra serniya pele bımocne",
        "undelete-search-submit": "Cı geyre",
        "undelete-no-results": "Zerre arşîvê esterayîşî de peleyan match nibiyê.",
        "undelete-filename-mismatch": "Vurnayîşê ke pê wextê puli ye $1î nieşkenî biyare: nameyê dosyayî match nibeno",
        "sp-contributions-deleted": "iştırakê {{GENDER:$1|karberi}} esterdi",
        "sp-contributions-uploads": "Barkerdışi",
        "sp-contributions-logs": "qeydi",
-       "sp-contributions-talk": "vaten",
+       "sp-contributions-talk": "werênayış",
        "sp-contributions-userrights": "idareyê heqanê {{GENDER:$1|karberan}}",
        "sp-contributions-blocked-notice": "Eno karber/ena karbere emanet blokekerdeyo/blokekerdiya.\nCıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:",
        "sp-contributions-blocked-notice-anon": "Eno adresê IPi bloke biyo.\nCıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:",
        "sp-contributions-newonly": "Tenya vurnayışanê pelevıraştışi bımocne",
        "sp-contributions-hideminor": "Vurriyayışanê werdiyan bınımne",
        "sp-contributions-submit": "Cı geyre",
-       "whatlinkshere": "Gırey na perer",
+       "whatlinkshere": "Çı tiyayi rê gıre beno",
        "whatlinkshere-title": "Wesiqe da \"$1\" rê gıre dayen perri",
        "whatlinkshere-page": "Pele:",
        "linkshere": "Pera <strong>$2</strong> rê gıre dayen perri",
        "ipb-confirm": "Bloke kerdışi tesdik ke",
        "ipb-sitewide": "Site hemi de",
        "ipb-partial": "Qısmi",
+       "ipb-partial-help": "Peli ya zi namey cayanê spesifikan",
        "ipb-pages-label": "Peli",
        "ipb-namespaces-label": "Heruna nameyan",
        "badipaddress": "Adresê IPî raşt niyo",
        "ipb-blocklist": "Blokî ke hama estê ey bivîne",
        "ipb-blocklist-contribs": "İştirakê {{GENDER:$1|$1}}`i",
        "ipb-blocklist-duration-left": "$1 vet",
+       "block-actions": "Hereketê bloqey :",
        "block-expiry": "Qedyayış:",
+       "block-options": "Weçinıtış dekerê:",
        "block-prevent-edit": "Vurnayış",
        "block-reason": "Sebeb:",
        "block-target": "Nameyê karberi ya zi adresa eposteyi",
        "unblocked": "[[User:$1|$1]] blok biyo",
        "unblocked-range": "Blokey $1'i wederya",
        "unblocked-id": "Blokê $1î wedariyayo",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] bloqe wedarnayo.",
        "blocklist": "Karberê kılitbiyayey",
        "autoblocklist": "Blokeyê otomatiki",
        "autoblocklist-submit": "Cı geyre",
        "autoblocklist-legend": "Lista blokanê otomatikan",
        "autoblocklist-localblocks": "{{PLURAL:$1|otoblokoyo lokal|otoblokeyê lokali}}",
+       "autoblocklist-total-autoblocks": "Amardışê pêroyê autobloqey:$1",
        "autoblocklist-otherblocks": "{{PLURAL:$1|otobloqeyo bin|otobloqeyê bini}}",
        "ipblocklist": "Karberê kılitbiyayey",
        "ipblocklist-legend": "Karberê kılit biyayey bıvin",
        "javascripttest-qunit-intro": "Mediawiki.org dı [dokumanê $1] bıvinê.",
        "tooltip-pt-userpage": "Pela {{GENDER:|şımaya karberi}}",
        "tooltip-pt-anonuserpage": "pelê karberê IPyi",
-       "tooltip-pt-mytalk": "Pera {{GENDER:|şıma}}ya vaten",
+       "tooltip-pt-mytalk": "Pera {{GENDER:|şıma}}y vateni",
        "tooltip-pt-anontalk": "'''Ena adresa IP ra vurnayışa sero qal bıqerê'''",
        "tooltip-pt-preferences": "Tercihê {{GENDER:|şıma}}",
        "tooltip-pt-watchlist": "Listey peranê ke to gırotê seyr kerdış",
        "watchlistedit-clear-legend": "Lista serykerdışê pak kerê",
        "watchlistedit-clear-explain": "Listeya serykerdış da şıma dı sernamey pêro besteryay",
        "watchlistedit-clear-titles": "Sernamey:",
+       "watchlistedit-clear-done": "Lista seyrkerdişê şıma biya pak",
        "watchlisttools-clear": "Lista serykerdışê xo pak kı",
        "watchlisttools-view": "Vurnayışanê elaqedaran bıvêne",
        "watchlisttools-edit": "Lista seyrkerdışi bıvêne û bıvurne",
        "permanentlink": "Gıreyo daimi",
        "permanentlink-revid": "Revizyonê IDyi",
        "permanentlink-submit": "Şo revizyoni",
+       "newsection": "Leteyo newe",
+       "newsection-page": "Etiketê pele",
+       "newsection-submit": "Ravêr pele",
        "dberr-problems": "Mayê muxulêm! Ena sita dı newke xırabiya teknik esta.",
        "dberr-again": "Dı-rê deqiqeyi vınde û heni bar ke.",
        "dberr-info": "(Erzmelumati ra xızmetkari nêreseno: $1)",
index 9ea6ec5..28fee08 100644 (file)
@@ -37,7 +37,7 @@
        "tog-shownumberswatching": "निगरानी गरिरहेका प्रयोगकर्ताहरूको संख्या धेखाउन्या",
        "tog-oldsig": "तमरो अहिलको हस्ताक्षर:",
        "tog-fancysig": "मेरा दस्तखतलाई विकि पाठको रुपमी लिने (स्वत लिङ्क बिना)",
-       "tog-uselivepreview": "पà¥\8dरतà¥\8dयà¤\95à¥\8dष à¤ªà¥\88लà¥\8dलà¥\80à¤\95à¥\8bरà¥\81प à¤ªà¥\8dरयà¥\8bà¤\97 à¤\97र",
+       "tog-uselivepreview": "पà¥\83षà¥\8dठ à¤ªà¥\81नरà¥\8dभरण à¤¨à¤\85रà¥\87à¤\87 à¤ªà¥\82रà¥\8dवावलà¥\8bà¤\95न à¤§à¥\87à¤\95ाà¤\83",
        "tog-forceeditsummary": "खाली सम्पादन शीर्षक प्रविष्टि गरेपछा मलाई सोधन्या",
        "tog-watchlisthideown": "मेरा सम्पादनहरू निगनारी सूचीबठेई लुकाऊन्या",
        "tog-watchlisthidebots": "बोट सम्पादनहरू ध्यान सूचीबठेई लुकाउन्या",
@@ -53,6 +53,7 @@
        "tog-norollbackdiff": "पैलास्थितिमी फर्काएपछा भिन्नता हटाउन्या",
        "tog-useeditwarning": "सम्पादनहरू सङ्ग्रह नगरिएका अवस्थामी अर्को पानामी जान खोज्या चेतावनी धेखाउन्या",
        "tog-prefershttps": "प्रवेश गरन्ज्या जबलै सुरक्षित जडानको प्रयोग गर्न्या",
+       "tog-requireemail": "पासवर्ड पुनःचयन खिलाइ इमेल चायीन्छ",
        "underline-always": "जबलै",
        "underline-never": "कभैई नाई",
        "underline-default": "खोल और ब्राउजर निर्धारित",
        "index-category": "क्रमाङ्कित पानाहरू",
        "noindex-category": "अनुक्रमित नअरियाऽ पन्नाअन",
        "broken-file-category": "टुटेको फाइल लिङ्कहरूसितको पाना",
+       "categoryviewer-pagedlinks": "($1) ($2)",
+       "category-header-numerals": "$1–$2",
        "about": "बारेमी",
        "article": "सामाग्री पानो",
        "newwindow": "(नौलो विन्डोमी खुलन्छ)",
        "returnto": "$1 मी फर्क।",
        "tagline": "{{SITENAME}} बठेइ",
        "help": "मद्दत",
+       "help-mediawiki": "मिडियाविकि का बारेमी मद्दत",
        "search": "खोजी",
        "search-ignored-headings": " #<!-- leave this line exactly as it is --> <pre>\n# Headings that will be ignored by search.\n# Changes to this take effect as soon as the page with the heading is indexed.\n# You can force page reindexing by doing a null edit.\n# The syntax is as follows:\n#   * Everything from a \"#\" character to the end of the line is a comment.\n#   * Every non-blank line is the exact title to ignore, case and everything.\nReferences\nExternal links\nSee also\n #</pre> <!-- leave this line exactly as it is -->",
        "searchbutton": "खोज:",
        "redirectto": "पठाएको पाना:",
        "lastmodifiedat": "यै पन्नालाई छाड्डीबार $1मी $2 बजे सम्पादन गरियाऽ थ्यो।",
        "viewcount": "यो पाना हेरियाको थियो {{PLURAL:$1|एकपटक|$1 पटक}}",
-       "protectedpage": "सà¥\81रà¤\95à¥\8dषित à¤\97रà¥\8dयाà¤\95ा à¤ªà¤¾à¤¨à¤¾à¤¹à¤°à¥\82",
+       "protectedpage": "सà¥\81रà¤\95à¥\8dषित à¤\97रियाà¤\95ा à¤ªà¤¨à¥\8dनाà¤\85न",
        "jumpto": "यैमी फट्टाक:",
        "jumptonavigation": "भ्रमण गरऽ",
        "jumptosearch": "खोजऽ",
        "view-pool-error": "माफ गर्या , अहिल सर्भरहरूमी कामको भार भौत रह्या छ।\nभौत भौत प्रयोगकर्ताहरू यै पाना हेद्या प्रयास गरी रह्या छन्।\nकृपया यो पाना पुन: हेर्नु अगाडि थोक्कै पख ।\n\n$1",
        "generic-pool-error": "माफ गर्या , अहिल सर्भरहरूमी कामको भार भौत रह्या छ।\nभौत भौत प्रयोगकर्ताहरू यै पाना हेद्या प्रयास गरी रह्या छन् ।\nकृपया यो पाना पुन: हेर्नु अगाडि थोक्कै पख ।",
-       "pool-timeout": "समय à¤¸à¤\95ियà¥\8b à¤¬à¤¨à¥\8dद à¤\97रà¥\8dनà¥\87 à¤ªà¥\8dरतà¥\80à¤\95à¥\8dषामी",
-       "pool-queuefull": "पà¥\8dरतà¥\80क्षा पङ्क्ति भरियो",
+       "pool-timeout": "बनà¥\8dद à¤\97दà¥\8dदाà¤\87 à¤¸à¤®à¤¯à¤¸à¥\80मा à¤¸à¤\95à¥\80नà¥\8dया à¤ªà¥\8dरतिà¤\95à¥\8dषा मी",
+       "pool-queuefull": "पà¥\8dरतिक्षा पङ्क्ति भरियो",
        "pool-errorunknown": "अज्ञात गल्ती",
        "pool-servererror": "पुल काउन्टर सेवा उपलब्ध नाइथिन् ($1)।",
        "poolcounter-usage-error": "प्रयोग गल्ती:$1",
        "versionrequired": "MediaWiki संस्करण $1 चाईन्या",
        "versionrequiredtext": "ये पाना प्रयोग गर्नका लागि MediaWiki $1 संस्करण चाहिन्छ ।\nहेर  [[Special:Version|version page]]",
        "ok": "भयो",
+       "pagetitle": "$1 - {{SITENAME}}",
+       "pagetitle-view-mainpage": "{{SITENAME}}",
+       "backlinksubtitle": "← $1",
        "retrievedfrom": " \"$1\" बठे निकालियाऽ",
        "youhavenewmessages": "{{PLURAL:$3|तम सित छन}} $1 ($2)।",
        "youhavenewmessagesfromusers": "{{PLURAL:$3|अर्खा प्रयोगकर्ता|$3 प्रयोगकर्ताअन}} ($2) मी है {{PLURAL:$4|तम सित}} $1 छन।",
        "site-atom-feed": "$1 एटम फीड",
        "page-rss-feed": "\"$1\" आरएसएस फिड",
        "page-atom-feed": "\"$1\" एटम फिड",
+       "feed-rss": "आरएसएस",
        "red-link-title": "$1 (पन्ना उपलब्ध नाइँथिन)",
        "sort-descending": "अवरोहण क्रममी मिलाउन्या",
        "sort-ascending": "आरोहण क्रममी मिलाउन्या",
        "badarticleerror": "यो कार्य यै पनामी गर्न नाईंमिल्लो।",
        "cannotdelete": "\"$1\" पाना वा फाइल मेट्ट सकिएन।\nयो पैल्लीबठे मेटियाको हुनु पडन्छ।",
        "cannotdelete-title": "पाना  \"$1\" लाई मेट्टू सकिएन",
+       "delete-scheduled": "$1 पन्ना मेटौनाइ खिलाइ समय निर्धारित अरीरैछ।\nकृपया धीरज राखः।",
        "delete-hook-aborted": "हुकले सम्पादनकार्य बन्द गरिदियो ।\nकोइ कारण दिइएन ।",
        "no-null-revision": "$1 पाना लागि खालि पुनरावलोकन सिर्जना गर्न सकिएन",
        "badtitle": "गलत शीर्षक",
        "ns-specialprotected": "विशेष पृष्ठहरू सम्पादन अद्दु नाइँ सकिनो।",
        "titleprotected": "[[User:$1|$1]]द्वारा ये शीर्षक निर्माणहुनबठे जोगाइया छ।\nकारण <em>$2</em> हो ।",
        "filereadonlyerror": "\"$1\" फाइललाई परिवर्तन अद्दु नाइँ सकिनो क्याईकि फाइल भण्डार \"$2\" केवल पड्ड्या स्थिति (read-only mode)मी छ।\n\nयेलाई सुरक्षित अद्द्या प्रवन्धकले यो कारण दीराइछ: ''$3''।",
+       "invalidtitle": "अमान्य शीर्षक",
        "invalidtitle-knownnamespace": "\"$2\" नाउँबार रे \"$3\" पाठ भया: अमान्य शीर्षक",
        "invalidtitle-unknownnamespace": "अपछ्याणो नाउँबार अङ्क $1 रे पाठ \"$2\" भया: अमान्य शीर्षक",
        "exception-nologin": "प्रवेश (लग ईन) नगरिएको",
        "virus-scanfailed": "जँचाई असफल(कोड $1)",
        "virus-unknownscanner": "थानभया एन्टीभाइरस:",
        "logouttext": "<strong>तमी अहिल बाहिर निस्क्याका  छौ।</strong>\n\nयाद राख्या तमीले ब्राउजरको क्याच खालि नगर्यासम्म कुनै पानाहरूमी तमी अझैं प्रवेश गरिरख्याको धेकाउन सक्छ।",
+       "logging-out-notify": "तम लगआउट हुन्नाछः, पख्याः हाँ।",
+       "logout-failed": "अइल लगआउट नाइहोइसकियो: $1",
        "cannotlogoutnow-title": "अईल भाईर निकल्ल नाइँ पाईनो",
        "cannotlogoutnow-text": "भाईर निकल्ल असंभव छ जब प्रयोग $1",
        "welcomeuser": "$1स्वागत छ!",
        "mailmypassword": "पासवर्ड पूर्वनिर्धारित गर",
        "passwordremindertitle": "{{SITENAME}}का लागि नयाँ अस्थायी पासवर्ड",
        "passwordremindertext": "कसैले (सायद तमी, IP ठेगाना $1 बाट), {{SITENAME}}($4) को लागि नौलो पासवर्ड अनुरोध गर्या छ । प्रयोगकर्ता \"$2\" को लागि नौलो अस्थायी पासवर्ड \"$3\"तयार पारिया छ । यदि यो तमरो इच्छामी भयाको भया अहिले तमीले लगइन गरीबर नौलो पासवर्ड छान्नु पड्ड्या हुन्छ ।\nतमरो अस्थायी पासवर्ड  {{PLURAL:$5|एक दिन|$5 दिनहरू पछि}} अमान्य हुन्याछ ।\n\nयदि कोही अरुले नै अनुरोध गर्याको हो भण्या , या तमीले आफ्नो पासवर्ड सम्झ्यौ भण्या, अथवा\nत्यैलाई परिवर्तन गर्न चाहन्नौ भण्या, तमीले यो सन्देसको वेवास्ता गद्दसक्द्याहौ र पुरानै पासवर्ड प्रयोग गरिरहन सक्द्याहौ ।",
+       "noemailcreate": "तम ले मान्य इमेल ठिगाना दिन आवश्यक छ।",
        "blocked-mailpassword": "तमरा IP ठेगानालाई सम्पादन गद्द बठे रोक लाइराइछ। दुरुपयोग रोक्दाइ, तमरा IP ठेगाना बठेइ प्रवेसशब्द पुनर्लाभ प्रक्रिया प्रयोग अद्द्या अनुमति आथिन।",
        "mailerror": " चिठी :$1 पठाउँदा गल्ती भयो",
        "noemailprefs": "निम्न सुविधाहरू राम्डरी काम गद्दको लागि तमरो रोजाईमी आफ्नो ई-मेल ठेगाना खुलाओ ।",
        "anoneditwarning": "<strong>चेतावनी:</strong> तमले प्रवेश अरेको नाइथिन । तमरो आइपि ठेगाना पाना सम्पादन इतिहासमि दर्ता गरिन्या छ र यो सब्बैले हेद्द सक्कान । यदि तमलाईँ <strong>[$1 लगईन]</strong> वा <strong>[$2 नयाँ खाता बनाउन्या] गर्याभण्या तमबठे गरियाको सम्पादन तमरो प्रयोगकर्तानाममि जोडिन्याछ ।",
        "missingsummary": "'''यादगर्या :''' तमीले सम्पादन सारांश दियाका छैनौ ।\nयदि तमीले \"$1\"  थिच्यौ भण्या , सारांश बिना नै सङ्ग्रहित गरिन्या छ ।",
        "selfredirect": "<strong>चेतावनी:</strong> तम यै पानालाई आफुमी पुनः निर्देशित गद्द लाग्याछौ ।\nहुनसक्छ तम अनुप्रेषितको लागि गलत लक्ष्य निर्दिष्ट गद्द लाग्याछौ, वा गलत पानाको सम्पादन गद्द लाग्याछौ ।\nतम पुनः एकपल्ट \"$1\" क्लिक गद्दाछौ, पुनः निर्देशित तसै लै बनाइन्याछ।",
-       "missingcommenttext": "à¤\95à¥\83पया à¤¤à¤²à¤¤à¤¿à¤° à¤\9fिपà¥\8dपणà¥\80 à¤°à¤¾à¤\96 ।",
+       "missingcommenttext": "à¤\95à¥\83पया à¤\9fिपà¥\8dपणà¥\80 à¤°à¤¾à¤\96à¤\83।",
        "missingcommentheader": "'''याद गर :''' तमले टिप्पणीमी विषय /शीर्ष पंक्ति  दियाका छैनौ ।\nतमले फेरि \"$1\"  थिच्यौ भण्या , तमरो सम्पादन यसै रुपमी संग्रहित हुन्याछ ।",
        "summary-preview": "सम्पादन सारांशोः पूर्वालोकन:",
        "subject-preview": "विषयोः पूर्वरुप:",
        "page_first": "पैल्लो",
        "page_last": "छाड्डीबारको",
        "histlegend": "अन्तर चयन:संशोधनहरूको तुलनाको लागि रेडियो बाकसमी क्लिक गरिबर इण्टर गर अथवा तल दियाको बटनमी थिच <br />\nलिजेंड: (चालू): '''({{int:cur}})''' = अवतरणको बीचमी अन्तर, '''({{int:last}})''' = पैल्लीका अवतरणको बीचमी अन्तर, '''{{int:minoreditletter}}''' = नानो परिवर्तन।",
-       "history-fieldset-title": "सà¤\82शà¥\8bधनà¤\85न à¤\96िलाà¤\87 à¤\96à¥\8bà¤\9cऽ",
+       "history-fieldset-title": "सà¤\82शà¥\8bधनà¤\85न à¤\9bानà¤\83",
        "history-show-deleted": "संशोधन मेटियाको मात्तरै",
        "histfirst": "सबहै पुरानो",
        "histlast": "नयाँ",
        "historysize": "({{PLURAL:$1|१ अक्षर|$1 अक्षरहरू}})",
-       "historyempty": "(खाली)",
+       "historyempty": "खालि",
        "history-feed-title": "पुनरावलोकन इतिहास",
        "history-feed-description": "विकीमा यो पानको पुनरावलोकन इतिहास",
        "history-feed-item-nocomment": "$1  $2मी",
        "rev-deleted-user": "(प्रयोगकर्ता नाम हटाइयो)",
        "rev-deleted-event": "(लग विवरण हटाइयो)",
        "rev-suppressed-text-unhide": "यै पानाको पुनरावलोकन '''दमन''' गरियाको छ ।\nविस्तृत जानकारी [{{fullurl:{{#Special:Log}}/delete|पानो={{FULLPAGENAMEE}}}} दमन लग] पाउन सकिन्छ ।\nयदि तम अगाडि बढ्ड चाहन्छौ भण्या पनि तमीले  [$1 यि संशोधनहरू हेद्द] पाउन्या हौ ।",
-       "rev-delundel": "दधà¥\87à¤\96ाà¤\89नà¥\87/लà¥\81à¤\95ाà¤\89नà¥\8dया",
+       "rev-delundel": "दà¥\83शà¥\8dयता à¤¬à¤¦à¥\87लà¤\83",
        "rev-showdeleted": "धेकाउन्या",
        "revisiondelete": "पुनरावलोकनअन मेट्याऽ/मेट्याऽ रद्द अद्द्या",
        "revdelete-nooldid-title": "अमान्य पुनरावलोकन लक्ष",
        "prefs-editwatchlist-clear": "तमरो अवलोकनसूची मेटा",
        "prefs-watchlist-days": "ध्यान सूचीमी धेकाउने दिनहरू:",
        "prefs-watchlist-days-max": "बर्ती है बर्ती $1 {{PLURAL:$1|दिन|दिनअन}}",
-       "prefs-watchlist-edits": "à¤\89à¤\9aà¥\8dà¤\9aतम à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¸à¤\82à¤\96à¥\8dया à¤¬à¤¢à¤¾à¤\87à¤\8fà¤\95à¥\8b à¤¨à¤¿à¤\97रानà¥\80 à¤¸à¥\82à¤\9aà¥\80मà¥\80  à¤§à¤\95ाà¤\89नà¤\95ा à¤²à¤¾à¤\97ि :",
+       "prefs-watchlist-edits": "à¤\85वलà¥\8bà¤\95नसà¥\82à¤\9aà¥\80 à¤®à¥\80 à¤§à¥\87à¤\95à¥\8cना à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनà¤\85न à¤\95à¥\8b à¤\89à¤\9aà¥\8dà¤\9aतम à¤¸à¤\82à¤\96à¥\8dया:",
        "prefs-watchlist-edits-max": "सबै है ज्यादा संख्या : १०००",
        "prefs-watchlist-token": "अवलोकन सूची टोकन:",
        "prefs-misc": "साधारण",
        "timezoneregion-europe": "युरोप",
        "timezoneregion-indian": "हिन्द महासागर",
        "timezoneregion-pacific": "प्राशान्त महासागर",
-       "allowemail": "à¤\94र à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताबठà¥\87 à¤ªà¥\8cनà¥\8dया à¤\88मà¥\87ल à¤¸à¤\95à¥\8dषम à¤\97र।",
+       "allowemail": "à¤\94र à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताà¤\85न à¤²à¤¾à¤\87 à¤®à¥\81à¤\87 à¤²à¤¾à¤\87 à¤\88मà¥\87ल à¤ªà¤ à¥\8cनà¥\87à¤\87 à¤\85नà¥\81मति à¤¦à¤¿à¤¯",
        "prefs-searchoptions": "खोज",
        "prefs-namespaces": "नामठौर:",
        "default": "पूर्वनिर्धारित",
        "prefs-files": "फाइलहरू",
        "prefs-custom-css": "अनुकुलित CSS",
        "prefs-custom-js": "अनुकुल जाभास्क्रिप्ट",
-       "prefs-common-config": "साà¤\9dा CSS/à¤\9cाभा à¤¸à¥\8dà¤\95à¥\8dरिपà¥\8dà¤\9f à¤¸à¤¬à¥\88 à¤\95ि à¤²à¥\87à¤\96ा:",
+       "prefs-common-config": "सबà¥\88 à¤\96à¥\8bलà¤\85न à¤\96िलाà¤\87 à¤¸à¤¾à¤\9dा à¤¸à¥\80à¤\8fसà¤\8fस/à¤\9cà¥\87सन/à¤\9cावासà¥\8dà¤\95à¥\8dरिपà¥\8dà¤\9f:",
        "prefs-reset-intro": "तम ये पृष्ठलाई आफनो अभिरुचीहरू साइट पूर्वावस्थामी फर्काउनत फर्काउन प्रयोग गद्दु सकन्छौ । तै पाछा ये लाई रद्द गद्दु सकन्छौ ।",
        "prefs-emailconfirm-label": "इ-मेल एकिन प्रक्रिया:",
        "youremail": "ईमेल",
        "grouppage-bureaucrat": "{{ns:project}}:प्रशासकअन",
        "grouppage-suppress": "{{ns:project}}:लुकौन्या",
        "right-read": "पृष्ठहरू पढ",
-       "right-edit": "पà¥\83षà¥\8dठहरà¥\82 à¤¸à¤®à¥\8dपादन à¤\97र",
+       "right-edit": "पनà¥\8dनाà¤\85न à¤¸à¤®à¥\8dपादन à¤\97रà¤\83",
        "right-createpage": "पृष्ठ निर्माण गर(छलफल पृष्ठहरू बाहेक)",
        "right-createtalk": "छलफल पृष्ठ सृजना गर",
        "right-createaccount": "नयाँ प्रयोगकर्ता खाता सृजना गर।",
        "right-reupload-own": "आफैले अपलोड  गरया रई आया फाइल अधिलेखन गर्न्या",
        "right-reupload-shared": "साझा मिडिया भण्डारमी स्थानियरुपमी फाइलहरू अधिक्रमण गर्न्या",
        "right-upload_by_url": "URL बठे फाइल उर्ध्वभरण गर्ने",
-       "right-purge": "साà¤\87à¤\9fà¤\95à¥\8b à¤\95à¥\8dयाश( cache) à¤¨à¤¿à¤¶à¥\8dà¤\9aित à¤¨à¤\97रिà¤\95नà¥\88 à¤ªà¤°à¥\8dà¤\9c(Purge) à¤\97रà¥\8dनà¥\87",
+       "right-purge": "यà¥\87à¤\87 à¤ªà¤¨à¥\8dना à¤\95à¥\8b à¤¸à¤¾à¤\87à¤\9f à¤\95à¥\8dयाश(cache) à¤ªà¤°à¥\8dà¤\9c(Purge) à¤\97रà¤\83",
        "right-writeapi": "लेखन API प्रयोग गद्य्या",
        "right-delete": "पृष्ठहरू मेट्ने",
        "right-bigdelete": "लामो इतिहास भयाका पानाहरू मेट्ट्या",
        "right-userrights-interwiki": "अन्य विकिहरूमी प्रयोगकर्ताहरूको अधिकार सम्पादन गद्या",
        "right-override-export-depth": "गहिराइ ५ सम्म लिंक गरियाका पानाहरू सहित निर्यात गद्या",
        "right-sendemail": "अन्य प्रयोगकर्तानलाई इमेल पठाउन्या",
-       "grant-editmycssjs": "तमरो प्रयोगकर्ता CSS/JavaScript सम्पादन गरऽ",
-       "grant-editmyoptions": "तमरा à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤\85भिरà¥\81à¤\9aà¥\80à¤\87नलाà¤\88 à¤¸à¤®à¥\8dपादन à¤\97रऽ",
+       "grant-editmycssjs": "तमरो प्रयोगकर्ता CSS/JSON/JavaScript सम्पादन गरः",
+       "grant-editmyoptions": "तमरा à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤\85भिरà¥\81à¤\9aिà¤\87न à¤°à¥\87 à¤\9cà¥\87सन(JSON) à¤®à¤¿à¤²à¤¾à¤¨ à¤¸à¤®à¥\8dपादन à¤\97रà¤\83",
        "grant-editmywatchlist": "तमरो अवलोकनसूची सम्पादन गर",
        "grant-editpage": "भैरया पृष्ठहरू सम्पादन गर",
        "grant-editprotected": "सुरक्षित पृष्ठ सम्पादन",
        "recentchanges-legend-heading": "<strong>आदर्श वाक्य:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|नौला पानाको सूची]] यैलाई लै हेरिदिय)",
        "rcfilters-savedqueries-rename": "पुनर्नामकरण",
-       "rcfilters-savedqueries-remove": "हà¤\9fाऽ",
+       "rcfilters-savedqueries-remove": "मà¥\87à¤\9fà¤\83",
        "rcfilters-savedqueries-new-name-label": "नाउँ",
        "rcfilters-savedqueries-cancel-label": "रद्द",
        "rcfilters-filter-editsbyself-label": "तम हताँ अरियाऽ फेरबदेलाअन",
        "rcfilters-filter-editsbyother-label": "अउर हताँ अरियाऽ फेरबदेलाअन",
        "rcfilters-filter-editsbyother-description": "तमरा आफ्फुनाइ बाहेक अउर सप्पै फेरबदेलाअन।",
        "rcfilters-filtergroup-lastrevision": "छाड्डीबारोः संशोधन",
-       "rcfilters-filter-lastrevision-label": "à¤\9bाडà¥\8dडà¥\80बारà¥\8bà¤\83 संशोधन",
+       "rcfilters-filter-lastrevision-label": "सबहà¥\88 à¤¨à¥\8cलà¥\8b संशोधन",
        "rclistfrom": "$3 $2 देखिका नयाँ परिवर्तनहरू देखाउन्या",
        "rcshowhideminor": "$1 सानतिनो सम्पादन",
        "rcshowhideminor-show": "धेकाइदिय",
        "filehist-comment": "टिप्पणी",
        "imagelinks": "फाइल उपयोग",
        "linkstoimage": "यै चित्रमी निम्न{{PLURAL:$1|पाना जोडिनान{{PLURAL:$1|}}|$1 पानाहरू जोडिनान्}}:",
-       "nolinkstoimage": "यà¥\8b à¤\9aितà¥\8dरसित à¤²à¤¿à¤\82à¤\95भयाà¤\95ि à¤\95à¥\8bà¤\87 à¤ªà¤¾à¤¨à¤¾ à¤¨à¤¾à¤\87थà¥\80",
+       "nolinkstoimage": "यà¥\87à¤\87 à¤«à¤¾à¤\87ल à¤ªà¥\8dरयà¥\8bà¤\97 à¤­à¤¯à¤¾à¤\83 à¤\95à¥\8bà¤\87 à¤²à¥\88 à¤ªà¤¨à¥\8dना à¤¨à¤¾à¤\87थिन।",
        "morelinkstoimage": "यै फाइलको [[Special:WhatLinksHere/$1|थप लिंकहरू]] हेर ।",
        "sharedupload-desc-here": "यो फाइल $1 बठे हो र और  परियोजनाहरू बठे पन प्रयोग गद्द सकिन्याछ । \nताखाइ यैको [$2 फ़ाइल विवरण पानो]मि रयाका विवरण तल्तिर दियाको छ।",
        "filepage-nofile": "येइ नाउँ को कोइ लै फाइल नाइथिन।",
        "tooltip-rollback": "\"पूर्वरुप\" ले यो पानाक्क सम्पादन(हरू) खारेज अरिबरे पानालाई एक क्लिकमि पाछाडीको सम्पादनमि पुगाइदिन्छ ।",
        "tooltip-undo": "\"रद्द\"ले पछिल्लो सम्पादन खारेज गरिबरे पूर्वावलोकनमा धेकाउछ ।\nयैले सारांशमा कारण राख्ख दिन्याछ।",
        "tooltip-summary": "नानो सारांश हालिदिय",
-       "siteusers": "{{SITENAME}} {{PLURAL:$2|प्रयोगकर्ता|प्रयोगकर्ताहरू}} $1",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1|प्रयोगकर्ता}}|प्रयोगकर्ताअन}} $1",
        "anonusers": "{{SITENAME}} का नाम नभयाका {{PLURAL:$2| प्रयोगकर्ता|प्रयोगकर्ताहरू}} $1",
        "simpleantispam-label": "ऐन्टी-स्प्याम जाँच।\nयैलाई <strong>नाइँ</strong> भद्य्या!",
        "pageinfo-title": "\"$1\" खिलाइ जानकारी",
        "imgmultipagenext": "अर्खो पन्ना →",
        "imgmultigo": "जाऽ!",
        "imgmultigoto": "$1 पन्ना मैं जाऽ",
-       "size-bytes": "$1 अक्षरहरू",
+       "size-bytes": "$1 {{PLURAL:$1|बाइट|बाइटअन}}",
        "size-kilobytes": "$1 किलोबाइट",
        "size-megabytes": "$1 मेगाबाइट",
        "size-gigabytes": "$1 गिगाबाइट",
index 82826c5..f5af2c5 100644 (file)
        "createaccountmail": "Use a temporary random password and send it to the specified email address",
        "createaccountmail-help": "Can be used to create account for another person without learning the password.",
        "createacct-realname": "Real name (optional)",
-       "createacct-reason": "Reason",
+       "createacct-reason": "Reason (publicly logged)",
        "createacct-reason-ph": "Why you are creating another account",
        "createacct-reason-help": "Message shown in the account creation log",
        "createacct-imgcaptcha-help": "",
index d2c74f5..ae53416 100644 (file)
        "exif-scenetype-1": "Direktefotografert bilde",
        "exif-customrendered-0": "Normal prosess",
        "exif-customrendered-1": "Tilpasset prosess",
+       "exif-customrendered-2": "HDR (ingen original lagret)",
+       "exif-customrendered-3": "HDR (original lagret)",
+       "exif-customrendered-4": "Original (for HDR)",
+       "exif-customrendered-6": "Panorama",
+       "exif-customrendered-7": "Portrett-HDR",
+       "exif-customrendered-8": "Portrett",
        "exif-exposuremode-0": "Automatisk eksponering",
        "exif-exposuremode-1": "Manuell eksponering",
        "exif-exposuremode-2": "Automatisk alternativeksponering",
index 3eea40f..23871cd 100644 (file)
                        "Servien"
                ]
        },
-       "exif-imagewidth": "Wiedte",
-       "exif-imagelength": "Heugte",
+       "exif-imagewidth": "Wydde",
+       "exif-imagelength": "Höygde",
        "exif-bitspersample": "Bits per komponent",
-       "exif-compression": "Kompressiemethode",
-       "exif-photometricinterpretation": "Beeldpuntsamenstelling",
-       "exif-orientation": "Oriëntasie",
-       "exif-samplesperpixel": "Antal compenenten",
-       "exif-planarconfiguration": "Gegevensstructuur",
+       "exif-compression": "Kompressymetode",
+       "exif-photometricinterpretation": "Bealdpuntsamenstelling",
+       "exif-orientation": "Orientaty",
+       "exif-samplesperpixel": "Antal kompenenten",
+       "exif-planarconfiguration": "Gegeavensstruktuur",
        "exif-ycbcrsubsampling": "Subsamplingsverhouwige van Y tot C",
-       "exif-ycbcrpositioning": "Y- en C-posisionering",
-       "exif-xresolution": "Horizontale resolusie",
-       "exif-yresolution": "Verticale resolusie",
-       "exif-stripoffsets": "Lokasie aofbeeldingsgegevens",
-       "exif-rowsperstrip": "Riejen per strip",
-       "exif-stripbytecounts": "Bytes per ekomprimeerden strip",
-       "exif-jpeginterchangeformat": "Aofstaand tot JPEG SOI",
-       "exif-jpeginterchangeformatlength": "Bytes van JPEG-gegevens",
+       "exif-ycbcrpositioning": "Y- en C-positionering",
+       "exif-xresolution": "Horizontale resoluty",
+       "exif-yresolution": "Vertikale resoluty",
+       "exif-stripoffsets": "Lokaty afbealdingsgegeavens",
+       "exif-rowsperstrip": "Rygen per strip",
+       "exif-stripbytecounts": "Bytes per komprimeerde strip",
+       "exif-jpeginterchangeformat": "Afstand tot JPEG SOI",
+       "exif-jpeginterchangeformatlength": "Bytes van JPEG-gegeavens",
        "exif-whitepoint": "Witpuntchromaticiteit",
-       "exif-primarychromaticities": "Chromasiteit van primaere kleuren",
-       "exif-ycbcrcoefficients": "Transformasiematrixkoëfficiënten veur de kleurruumte",
-       "exif-referenceblackwhite": "Referensieweerden veur zwart/wit",
-       "exif-datetime": "Tiedstip van digitalisasie",
-       "exif-imagedescription": "Aofbeeldingnaam",
+       "exif-primarychromaticities": "Chromaciteit van primäre klören",
+       "exif-ycbcrcoefficients": "Transformatymatrixkoefficienten vöär de klöörruumde",
+       "exif-referenceblackwhite": "Referensywaerden vöär swart/wit",
+       "exif-datetime": "Tydstip van digitalisaty",
+       "exif-imagedescription": "Afbealdingname",
        "exif-make": "Kameramark",
        "exif-model": "Kameramodel",
-       "exif-software": "Programmatuur die gebruukt wörden",
-       "exif-artist": "Eschreven deur",
-       "exif-copyright": "Auteursrechtenhouwer",
-       "exif-exifversion": "Exif-versie",
-       "exif-flashpixversion": "Ondersteunden Flashpix-versie",
-       "exif-colorspace": "Kleurruumte",
-       "exif-componentsconfiguration": "Betekenisse van elk compenent",
-       "exif-compressedbitsperpixel": "Beeldkompressiemethode",
-       "exif-pixelxdimension": "Aofbeeldingsbreedte",
-       "exif-pixelydimension": "Aofbeeldingsheugte",
-       "exif-usercomment": "Opmarkingen",
-       "exif-relatedsoundfile": "Biebeheurend geluudsbestaand",
-       "exif-datetimeoriginal": "Tiedstip van datagenerasie",
-       "exif-datetimedigitized": "Tiedstip van digitalisasie",
-       "exif-subsectime": "Subseconden tiedstip bestaandswieziging",
-       "exif-subsectimeoriginal": "Subseconden tiedstip datagenerasie",
-       "exif-subsectimedigitized": "Subseconden tiedstip digitalisasie",
-       "exif-exposuretime": "Belochtingstied",
+       "exif-software": "Programmatuur dee bruked wördt",
+       "exif-artist": "Autöör",
+       "exif-copyright": "Autöörsrechtenholder",
+       "exif-exifversion": "Exif-versy",
+       "exif-flashpixversion": "Understöände Flashpix-versy",
+       "exif-colorspace": "Klöörruumde",
+       "exif-componentsconfiguration": "Beteykenisse van elk kompenent",
+       "exif-compressedbitsperpixel": "Bealdkompressymetode",
+       "exif-pixelxdimension": "Afbealdingsbreydde",
+       "exif-pixelydimension": "Afbealdingshöygde",
+       "exif-usercomment": "Upmarkingen",
+       "exif-relatedsoundfile": "Bybehöyrend gelüüdsbestand",
+       "exif-datetimeoriginal": "Tydstip van datageneraty",
+       "exif-datetimedigitized": "Tydstip van digitalisaty",
+       "exif-subsectime": "Subsekonden tydstip bestandswysiging",
+       "exif-subsectimeoriginal": "Subsekonden tydstip datageneraty",
+       "exif-subsectimedigitized": "Subsekonden tydstip digitalisaty",
+       "exif-exposuretime": "Belichtingstyd",
        "exif-exposuretime-format": "$1 sek ($2)",
        "exif-fnumber": "F-getal",
-       "exif-exposureprogram": "Belochtingsprogramma",
-       "exif-spectralsensitivity": "Spektrale geveuligheid",
-       "exif-isospeedratings": "ISO-weerde.",
+       "exif-exposureprogram": "Belichtingsprogramma",
+       "exif-spectralsensitivity": "Spektrale gevöligheid",
+       "exif-isospeedratings": "ISO-waerde",
        "exif-shutterspeedvalue": "Slutersnelheid in APEX",
        "exif-aperturevalue": "Diafragma in APEX",
        "exif-brightnessvalue": "Helderheid in APEX",
-       "exif-exposurebiasvalue": "Belochtingscompensasie",
-       "exif-maxaperturevalue": "Maximale diafragmaweerde van de lenze",
-       "exif-subjectdistance": "Aofstaand tot onderwarp",
-       "exif-meteringmode": "Methode lochmeting",
-       "exif-lightsource": "Lochbron",
+       "exif-exposurebiasvalue": "Belichtingskompensaty",
+       "exif-maxaperturevalue": "Maksimale diafragma-oapening",
+       "exif-subjectdistance": "Afstand tot underwarp",
+       "exif-meteringmode": "Metode lichtmeating",
+       "exif-lightsource": "Lichtbron",
        "exif-flash": "Flitser",
-       "exif-focallength": "Braandpuntofstand",
-       "exif-subjectarea": "Objektruumte",
-       "exif-flashenergy": "Flitserstarkte",
-       "exif-focalplanexresolution": "X-resolusie van CDD",
-       "exif-focalplaneyresolution": "Y-resolusie van CCD",
-       "exif-focalplaneresolutionunit": "Eenheid CCD-resolusie",
-       "exif-subjectlocation": "Objeklokasie",
-       "exif-exposureindex": "Belochtingsindex",
-       "exif-sensingmethod": "Meetmethode",
-       "exif-filesource": "Bestaandsnaam op de hardeschieve",
-       "exif-scenetype": "Scènetype",
-       "exif-customrendered": "An-epassen beeldbewarking",
-       "exif-exposuremode": "Belochtingsinstelling",
+       "exif-focallength": "Brandpuntafstand",
+       "exif-subjectarea": "Objektruumde",
+       "exif-flashenergy": "Flitserstarkde",
+       "exif-focalplanexresolution": "Sensorresoluty horizontaal",
+       "exif-focalplaneyresolution": "Sensorresoluty vertikaal",
+       "exif-focalplaneresolutionunit": "Eynheid CCD-resoluty",
+       "exif-subjectlocation": "Objektlokaty",
+       "exif-exposureindex": "Belichtingsindeks",
+       "exif-sensingmethod": "Meatmetode",
+       "exif-filesource": "Bestandsbron",
+       "exif-scenetype": "Scenetype",
+       "exif-customrendered": "Anpasde bealdverwarking",
+       "exif-exposuremode": "Belichtingsinstelling",
        "exif-whitebalance": "Witbalans",
-       "exif-digitalzoomratio": "Digitale zoomfactor",
-       "exif-focallengthin35mmfilm": "Braandpuntaofstaand (35mm-equivalent)",
-       "exif-scenecapturetype": "Soort opname",
-       "exif-gaincontrol": "Piekbeheersing",
+       "exif-digitalzoomratio": "Digitale zoomfaktor",
+       "exif-focallengthin35mmfilm": "Brandpuntafstand (35mm-ekwivalent)",
+       "exif-scenecapturetype": "Soort upnåme",
+       "exif-gaincontrol": "Pykbeheyrsing",
        "exif-contrast": "Kontrast",
-       "exif-saturation": "Verzaojiging",
-       "exif-sharpness": "Scharpte",
-       "exif-devicesettingdescription": "Umschrieving apperaotinstellingen",
-       "exif-subjectdistancerange": "Aofstaandskategorie",
-       "exif-imageuniqueid": "Unieke ID-aofbeelding",
-       "exif-gpsversionid": "GPS-versienummer",
-       "exif-gpslatituderef": "Noorder- of zujerbreedte",
-       "exif-gpslatitude": "Breedte",
-       "exif-gpslongituderef": "Ooster- of westerlengte",
-       "exif-gpslongitude": "Lengtegraod",
-       "exif-gpsaltituderef": "Heugtereferensie",
-       "exif-gpsaltitude": "Heugte",
-       "exif-gpstimestamp": "GPS-tied (atoomklokke)",
-       "exif-gpssatellites": "Satellieten die gebruuk bin veur de meting",
-       "exif-gpsstatus": "Ontvangerstaotus",
-       "exif-gpsmeasuremode": "Meetmodus",
-       "exif-gpsdop": "Meetpresisie",
-       "exif-gpsspeedref": "Snelheidseenheid",
-       "exif-gpsspeed": "Snelheid van GPS-ontvanger",
-       "exif-gpstrackref": "Referensie veur bewegingsrichting",
-       "exif-gpstrack": "Bewegingsrichting",
-       "exif-gpsimgdirectionref": "Referensie veur aofbeeldingsrichting",
-       "exif-gpsimgdirection": "Aofbeeldingsrichtige",
-       "exif-gpsmapdatum": "Geodetiese onderzeuksgegevens die gebruukt bin",
-       "exif-gpsdestlatituderef": "Referensie veur breedtegraod tot bestemming",
-       "exif-gpsdestlatitude": "Breedtegraod bestemming",
-       "exif-gpsdestlongituderef": "Referensie veur lengtegraod bestemming",
-       "exif-gpsdestlongitude": "Lengtegraod bestemming",
-       "exif-gpsdestbearingref": "Referensie veur richting naor bestemming",
-       "exif-gpsdestbearing": "Richting naor bestemming",
-       "exif-gpsdestdistanceref": "Referensie veur aofstaand tot bestemming",
-       "exif-gpsdestdistance": "Aofstaand tot bestemming",
-       "exif-gpsprocessingmethod": "Naam van de GPS-verwarkingsmethode",
-       "exif-gpsareainformation": "Naam van t GPS-gebied",
-       "exif-gpsdatestamp": "GPS-daotum",
-       "exif-gpsdifferential": "Differensiële GPS-korreksie",
-       "exif-jpegfilecomment": "Opmarking bie JPEG-bestaand",
+       "exif-saturation": "Versådiging",
+       "exif-sharpness": "Skarpde",
+       "exif-devicesettingdescription": "Ümskryving apparaatinstellingen",
+       "exif-subjectdistancerange": "Bereik objektafstand",
+       "exif-imageuniqueid": "Unike ID-afbealding",
+       "exif-gpsversionid": "GPS-versynummer",
+       "exif-gpslatituderef": "Noorder- of süderbreydde",
+       "exif-gpslatitude": "Breydde",
+       "exif-gpslongituderef": "Ouster- of westerlängde",
+       "exif-gpslongitude": "Längdegråd",
+       "exif-gpsaltituderef": "Höygdereferensy",
+       "exif-gpsaltitude": "Höygde",
+       "exif-gpstimestamp": "GPS-tyd (atoomklokke)",
+       "exif-gpssatellites": "Satelliten dee bruked binnet vöär de meating",
+       "exif-gpsstatus": "Untvangerståtus",
+       "exif-gpsmeasuremode": "Meatmodus",
+       "exif-gpsdop": "Meatprecisy",
+       "exif-gpsspeedref": "Snelheid eynheid",
+       "exif-gpsspeed": "Snelheid van GPS-untvanger",
+       "exif-gpstrackref": "Referensy vöär beweagingsrichting",
+       "exif-gpstrack": "Beweagingsrichting",
+       "exif-gpsimgdirectionref": "Referensy vöär afbealdingsrichting",
+       "exif-gpsimgdirection": "Afbealdingsrichting",
+       "exif-gpsmapdatum": "Geodetiske undersööksgegeavens dee bruked binnet",
+       "exif-gpsdestlatituderef": "Referensy vöär breyddegråd tot bestemming",
+       "exif-gpsdestlatitude": "Breyddegråd bestemming",
+       "exif-gpsdestlongituderef": "Referensy vöär längdegråd bestemming",
+       "exif-gpsdestlongitude": "Längdegråd bestemming",
+       "exif-gpsdestbearingref": "Referensy vöär richting nå bestemming",
+       "exif-gpsdestbearing": "Richting nå bestemming",
+       "exif-gpsdestdistanceref": "Referensy vöär afstand tot bestemming",
+       "exif-gpsdestdistance": "Afstand tot bestemming",
+       "exif-gpsprocessingmethod": "Name van de GPS-verwarkingsmetode",
+       "exif-gpsareainformation": "Name van et GPS-gebeed",
+       "exif-gpsdatestamp": "GPS-dåtum",
+       "exif-gpsdifferential": "Differentiele GPS-korrekty",
+       "exif-jpegfilecomment": "Upmarking by JPEG-bestand",
        "exif-keywords": "Trefwoorden",
-       "exif-worldregioncreated": "Regio in de wereld waor de aofbeelding emaakt is",
-       "exif-countrycreated": "Laand waor de aofbeelding emaakt is",
-       "exif-countrycodecreated": "Kode veur t laand waor de aofbeelding emaakt is",
-       "exif-provinceorstatecreated": "Provinsie of staot waor de aofbeelding emaakt is",
-       "exif-citycreated": "Plaotse waor de aofbeelding emaakt is",
-       "exif-sublocationcreated": "Wiek van de plaotse waor de aofbeelding emaakt is",
-       "exif-worldregiondest": "Weeregeven wereldregio",
-       "exif-countrydest": "Weeregeven laand",
-       "exif-countrycodedest": "Kode veur t weeregeven laand",
-       "exif-provinceorstatedest": "Weeregeven provinsie of staot",
-       "exif-citydest": "Weeregeven plaotse",
-       "exif-sublocationdest": "Weeregeven wiek in plaotse",
-       "exif-objectname": "Korte naam",
-       "exif-specialinstructions": "Spesiale instruksies",
-       "exif-headline": "Kopjen",
-       "exif-credit": "Krediet/leverancier",
+       "exif-worldregioncreated": "Regio in de wearld wår de afbealding maked is",
+       "exif-countrycreated": "Land wår de afbealding maked is",
+       "exif-countrycodecreated": "Kode vöär et land wår de afbealding maked is",
+       "exif-provinceorstatecreated": "Provinsy of ståt wår de afbealding maked is",
+       "exif-citycreated": "Plaatse wår de afbealding maked is",
+       "exif-sublocationcreated": "Wyk van de plaatse wår de afbealding maked is",
+       "exif-worldregiondest": "Weadergeaven wearldregio",
+       "exif-countrydest": "Weadergeaven land",
+       "exif-countrycodedest": "Kode vöär et weadergeaven land",
+       "exif-provinceorstatedest": "Weadergeaven provinsy of ståt",
+       "exif-citydest": "Weadergeaven plaatse",
+       "exif-sublocationdest": "Weadergeaven wyk in plaatse",
+       "exif-objectname": "Korte name",
+       "exif-specialinstructions": "Speciale instruktys",
+       "exif-headline": "Upskrivt",
+       "exif-credit": "Kredit/leaveransyr",
        "exif-source": "Bron",
-       "exif-editstatus": "Bewarkingsstaotus van de aofbeelding",
-       "exif-urgency": "Urgensie",
-       "exif-fixtureidentifier": "Groepsnaam",
-       "exif-locationdest": "Weeregeven lokasie",
+       "exif-editstatus": "Bewarkingsståtus van de afbealding",
+       "exif-urgency": "Urgensy",
+       "exif-fixtureidentifier": "Grupsname",
+       "exif-locationdest": "Weadergeaven lokaty",
        "exif-locationdestcode": "Kode veur de weeregeven lokasie",
        "exif-objectcycle": "Tied van de dag waor de media veur bedoeld is",
        "exif-contact": "Kontaktgegevens",
index 44e3c94..fdc959c 100644 (file)
        "exif-scenetype-1": "Директно фотографисана слика",
        "exif-customrendered-0": "Нормалан процес",
        "exif-customrendered-1": "Нестандардан процес",
+       "exif-customrendered-2": "HDR (није оригинално сачувано)",
+       "exif-customrendered-3": "HDR (оригинал сачуван)",
+       "exif-customrendered-4": "Оригинал (за HDR)",
+       "exif-customrendered-6": "Панорама",
+       "exif-customrendered-7": "HDR портрет",
+       "exif-customrendered-8": "Портрет",
        "exif-exposuremode-0": "Аутоматска експозиција",
        "exif-exposuremode-1": "Ручна експозиција",
        "exif-exposuremode-2": "Аутоматски са задатим распоном",
index 994b1e1..2869768 100644 (file)
        "logentry-partialblock-block-page": "{{PLURAL:$1|sivua|sivuja}} $2",
        "logentry-partialblock-block-ns": "{{PLURAL:$1|nimiavaruutta|nimiavaruuksia}} $2",
        "logentry-partialblock-block": "$1 {{GENDER:$2|esti}} käyttäjää {{GENDER:$4|$3}} muokkaamasta $7. Eston kesto on $5 $6",
-       "logentry-partialblock-reblock": "$1 {{GENDER:$2|muutti}} käyttäjän {{GENDER:$4|$3}} muokkauseston asetuksia estäen muokkausten tekemisen $7. Eston kesto on $5 $6",
+       "logentry-partialblock-reblock": "$1 {{GENDER:$2|muutti}} käyttäjän {{GENDER:$4|$3}} muokkauseston asetuksia niin, että hän ei voi muokata $7. Eston kesto on $5 $6",
        "logentry-non-editing-block-block": "$1 {{GENDER:$2|esti}} käyttäjää {{GENDER:$4|$3}} suorittamasta määrättyjä toimenpiteitä (lukuun ottamatta muokkaamista). Eston kesto on $5 $6",
        "logentry-non-editing-block-reblock": "$1 {{GENDER:$2|muutti}} käyttäjän {{GENDER:$4|$3}} toimintaeston asetuksia, jotka koskevat määrättyjä toimenpiteitä. Eston kesto on $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|esti}} käyttäjän {{GENDER:$4|$3}}. Eston kesto on $5 $6",
index 41b2293..2cd71f0 100644 (file)
        "tog-useeditwarning": "M’avertir quand je quitte une page en cours de modification sans avoir sauvegardé",
        "tog-prefershttps": "Toujours utiliser une connexion sécurisée lorsque je suis connecté",
        "tog-showrollbackconfirmation": "Afficher une demande de confirmation en cliquant sur un lien d’annulation",
+       "tog-requireemail": "Nécessiter un courriel pour les réinitialisations de mot de passe",
        "underline-always": "Toujours",
        "underline-never": "Jamais",
        "underline-default": "Valeur par défaut du thème ou du navigateur",
        "noname": "Vous n’avez pas saisi un nom d’utilisateur valide.",
        "loginsuccesstitle": "Connecté",
        "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’utilisateur sont sensibles à la casse.\nVérifiez l’orthographe, ou [[Special:CreateAccount|créez un nouveau compte]].",
+       "nosuchuser": "L’utilisateur « $1 » n’existe pas.\nLes noms d’utilisateur sont sensibles à la casse.\nVérifiez l’orthographe ou [[Special:CreateAccount|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.",
        "login-userblocked": "{{GENDER:$1|Cet utilisateur|Cette utilisatrice}} est bloqué{{GENDER:$1||e}}. La connexion n’est pas autorisée.",
        "password-login-forbidden": "L’utilisation de ce nom d’utilisateur ou de ce mot de passe a été interdite.",
        "mailmypassword": "Réinitialiser le mot de passe",
        "passwordremindertitle": "Nouveau mot de passe temporaire pour {{SITENAME}}",
-       "passwordremindertext": "Quelqu’un (depuis l’adresse IP $1) a demandé un nouveau mot de\npasse pour {{SITENAME}} ($4). Un mot de passe temporaire pour l’utilisateur\n« $2 » a été créé et défini comme « $3 ». Si c’était bien votre intention,\nvous devrez vous connecter et choisir un nouveau mot de passe.\nVotre mot de passe temporaire expirera dans $5 jour{{PLURAL:$5||s}}.\n\nSi vous n’êtes pas l’auteur de cette demande, ou si vous vous avez retrouvé votre mot de passe et ne souhaitez plus en changer, vous pouvez ignorer ce message\net continuer à utiliser votre ancien mot de passe.",
+       "passwordremindertext": "Quelqu’un (depuis l’adresse IP $1) a demandé un nouveau mot de passe\npour {{SITENAME}} ($4). Un mot de passe temporaire pour l’utilisateur\n« $2 » a été créé et défini comme « $3 ». Si c’était bien votre intention,\nvous devrez vous connecter et choisir un nouveau mot de passe.\nVotre mot de passe temporaire expirera dans $5 jour{{PLURAL:$5||s}}.\n\nSi vous n’êtes pas l’auteur de cette demande ou si vous vous avez retrouvé votre\nmot de passe et ne souhaitez plus en changer, vous pouvez ignorer ce message et\ncontinuer à utiliser votre ancien mot de passe.",
        "noemail": "Aucune adresse de courriel n’a été enregistrée pour l’utilisat{{GENDER:$1|eur|rice}} « $1 ».",
        "noemailcreate": "Vous devez fournir une adresse de courriel valide",
        "passwordsent": "Un nouveau mot de passe a été envoyé à l’adresse de courriel de l’utilisat{{GENDER:$1|eur|rice}} « $1 ».\nVeuillez vous reconnecter après l’avoir reçu.",
        "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 affichée ci-dessous pour référence :",
-       "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>.",
+       "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é et sécurité → Effacer les données d’exploration → Images et fichiers en cache</em>.",
        "usercssyoucanpreview": "<strong>Astuce :</strong> utilisez le bouton « {{int:showpreview}} » pour tester votre nouvelle feuille CSS avant de l’enregistrer.",
        "userjsonyoucanpreview": "<strong>Conseil :</strong> utilisez le bouton « {{int:showpreview}} » pour tester votre nouveau JSON avant enregistrement.",
        "userjsyoucanpreview": "<strong>Astuce :</strong> utilisez le bouton « {{int:showpreview}} » pour tester votre nouvelle feuille JavaScript avant de l’enregistrer.",
-       "usercsspreview": "<strong>Rappelez-vous que vous ne faites que prévisualiser votre propre feuille CSS. \nElle n’a pas encore été enregistrée !</strong>",
+       "usercsspreview": "<strong>Rappelez-vous que vous ne faites que prévisualiser votre propre feuille CSS.\nElle n’a pas encore été enregistrée !</strong>",
        "userjsonpreview": "<strong>Rappelez-vous que vous êtes seulement en train de tester/voir un aperçu de votre configuration utilisateur JSON.\nElle n’a pas encore été enregistrée !</strong>",
-       "userjspreview": "<strong>Rappelez-vous que vous ne faites que visualiser ou tester votre code JavaScript.\nIl n’a pas encore été enregistré !</strong>",
-       "sitecsspreview": "<strong>Rappelez-vous que vous ne faites que prévisualiser cette feuille de style. \nElle n’a pas encore été enregistrée !</strong>",
+       "userjspreview": "<strong>Rappelez-vous que vous ne faites que visualiser ou tester votre code JavaScript.\nIl n’a pas encore été enregistré!</strong>",
+       "sitecsspreview": "<strong>Rappelez-vous que vous ne faites que prévisualiser cette feuille de style. \nElle n’a pas encore été enregistrée!</strong>",
        "sitejsonpreview": "<strong>Souvenez-vous que vous ne faites que regarder un aperçu de cette configuration JSON.\nElle n’a pas encore été enregistrée !</strong>",
-       "sitejspreview": "<strong>Rappelez-vous que vous ne faites que prévisualiser ce code JavaScript. \nIl n’a pas encore été enregistré !</strong>",
-       "userinvalidconfigtitle": "<strong>Attention :</strong> il n’existe pas d’habillage « $1 ».\nLes pages personnelles avec extensions .css, .json et .js utilisent des titres en minuscules, par exemple {{ns:user}}:Foo/vector.css et non {{ns:user}}:Foo/Vector.css.",
+       "sitejspreview": "<strong>Rappelez-vous que vous ne faites que prévisualiser ce code JavaScript.\nIl n’a pas encore été enregistré !</strong>",
+       "userinvalidconfigtitle": "<strong>Attention :</strong> il n’existe pas d’habillage « $1 ».\nLes pages personnelles avec extensions .css, .json et .js utilisent des titres en minuscules, par exemple <tt>{{ns:user}}:Foo/vector.css</tt> et non <tt>{{ns:user}}:Foo/Vector.css</tt>.",
        "updated": "(Mis à jour)",
        "note": "<strong>Note :</strong>",
        "previewnote": "<strong>Rappelez-vous que ce n’est qu’une prévisualisation.</strong>\nVos modifications n’ont pas encore été enregistrées !",
        "continue-editing": "Aller à la zone de modification",
        "previewconflict": "Cette prévisualisation montre le texte de la boîte supérieure de modification tel qu’il apparaîtra si vous choisissez de le publier.",
-       "session_fail_preview": "Désolé, nous ne pouvons enregistrer votre modification à cause d’une perte d’informations concernant votre session.\n\nVous avez peut-être été déconnecté. <strong>Veuillez vérifier que vous êtes toujours connecté et réessayer.</strong>\nSi cela échoue de nouveau, essayez en vous [[Special:UserLogout|déconnectant]], puis en vous reconnectant, et vérifiez que votre navigateur accepte les témoins (''cookies'') de ce site.",
+       "session_fail_preview": "Désolé, nous ne pouvons enregistrer votre modification à cause d’une perte d’informations concernant votre session.\n\nVous avez peut-être été déconnecté. <strong>Veuillez vérifier que vous êtes toujours connecté et réessayer.</strong>\nSi cela échoue de nouveau, essayez en vous [[Special:UserLogout|déconnectant]] puis en vous reconnectant. Vérifiez également que votre navigateur accepte les témoins (''cookies'') de ce site.",
        "session_fail_preview_html": "Désolé, nous ne pouvons enregistrer votre modification à cause d’une perte d’informations concernant votre session.\n\n<em>Parce que {{SITENAME}} a activé le HTML brut, la prévisualisation est masquée afin de prévenir les attaques par JavaScript.</em>\n\n<strong>Si la tentative de modification est légitime, veuillez réessayer.</strong>\nSi cela échoue de nouveau, [[Special:UserLogout|déconnectez-vous]], puis reconnectez-vous, et vérifiez que votre navigateur accepte les témoins (''cookies'') de ce site.",
        "token_suffix_mismatch": "<strong>Votre modification n’a pas été acceptée car votre navigateur a mal codé les caractères de ponctuation dans l’identifiant de modification.</strong>\nCe rejet est nécessaire pour empêcher la corruption du texte de la page.\nCe problème se produit parfois lorsque vous utilisez un serveur mandataire anonyme problématique basé sur le web.",
        "edit_form_incomplete": "<strong>Certaines parties du formulaire de modification n’ont pas atteint le serveur, vérifiez que vos modifications sont intactes et essayez à nouveau.</strong>",
        "editingsection": "Modification de $1 (section)",
        "editingcomment": "Modification de $1 (nouvelle section)",
        "editconflict": "Conflit de modification : $1",
-       "explainconflict": "Cette page a été changée après que vous avez commencé à la modifier.\nLa zone de modification supérieure contient le texte tel qu’il est actuellement enregistré dans la base de données.\nVos modifications apparaissent dans la zone de modification inférieure.\nVous allez devoir fusionner vos modifications dans le texte existant.\n<strong>Seul</strong> le texte de la zone supérieure sera sauvegardé si vous cliquez sur « $1 ».",
+       "explainconflict": "Cette page a été changée après que vous avez commencé à la modifier.\nLa zone de modification supérieure contient le texte tel qu’il est actuellement enregistré dans la base de données.\nVos modifications apparaissent dans la zone de modification inférieure.\nVous allez devoir fusionner vos modifications dans le texte existant.\n<strong>Seul</strong> le texte de la zone supérieure sera sauvegardé si vous cliquez sur « $1 ».",
        "yourtext": "Votre texte",
        "storedversion": "La version enregistrée",
        "editingold": "<strong>Attention : vous êtes en train de modifier une ancienne version de cette page.</strong>\nSi vous la publiez, toutes les modifications effectuées depuis cette version seront perdues.",
-       "unicode-support-fail": "Votre navigateur semble ne pas rendre en charge l'Unicode. Ceci est nécessaire pour modifier les pages, aussi vos modifications n'ont pas été sauvegardées.",
+       "unicode-support-fail": "Votre navigateur semble ne pas rendre en charge lUnicode. Ceci est nécessaire pour modifier les pages, aussi vos modifications n'ont pas été sauvegardées.",
        "yourdiff": "Différences",
-       "copyrightwarning": "Toutes les contributions à {{SITENAME}} sont considérées comme publiées sous les termes de la $2 (voir $1 pour plus de détails). \nSi vous ne désirez pas que vos écrits soient modifiés et distribués à volonté, merci de ne pas les soumettre ici.<br /> \nVous nous promettez aussi que vous avez écrit ceci vous-même, ou que vous l’avez copié d’une source provenant du domaine public ou d’une ressource libre similaire. \n<strong>N’UTILISEZ PAS DE TRAVAUX SOUS DROIT D’AUTEUR SANS AUTORISATION EXPRESSE !</strong>",
-       "copyrightwarning2": "Notez bien que toutes les contributions à {{SITENAME}} peuvent être modifiées, transformées ou supprimées par d’autres utilisateurs. \nSi vous ne désirez pas que vos écrits soient modifiés contre votre gré, merci de ne pas les soumettre ici.<br /> \nVous nous promettez aussi que vous avez écrit ceci vous-même, ou que vous l’avez copié d’une source provenant du domaine public, ou d’une ressource libre. (voir $1 pour plus de détails).\n<strong>N’UTILISEZ PAS DE TRAVAUX SOUS DROIT D’AUTEUR SANS AUTORISATION EXPRESSE !</strong>",
+       "copyrightwarning": "Toutes les contributions à {{SITENAME}} sont considérées comme publiées sous les termes de la $2 (voir $1 pour plus de détails). \nSi vous ne désirez pas que vos écrits soient modifiés et distribués à volonté, merci de ne pas les soumettre ici.<br /> \nVous nous promettez aussi que vous avez écrit ceci vous-même, ou que vous l’avez copié d’une source provenant du domaine public ou d’une ressource libre similaire.\n<strong>N’UTILISEZ PAS DE TRAVAUX SOUS DROIT D’AUTEUR SANS AUTORISATION EXPRESSE !</strong>",
+       "copyrightwarning2": "Notez bien que toutes les contributions à {{SITENAME}} peuvent être modifiées, transformées ou supprimées par d’autres utilisateurs.\nSi vous ne désirez pas que vos écrits soient modifiés contre votre gré, merci de ne pas les soumettre ici.<br />\nVous nous promettez aussi que vous avez écrit ceci vous-même ou que vous l’avez copié d’une source provenant du domaine public ou d’une ressource libre (voir $1 pour plus de détails).\n<strong>N’UTILISEZ PAS DE TRAVAUX SOUS DROIT D’AUTEUR SANS AUTORISATION EXPRESSE !</strong>",
        "editpage-cannot-use-custom-model": "Le modèle de contenu de cette page ne peut pas être modifié.",
        "longpageerror": "<strong>Erreur : Le texte que vous avez soumis fait {{PLURAL:$1|un Kio|$1 Kio}}, ce qui dépasse la limite fixée à {{PLURAL:$2|un Kio|$2 Kio}}.</strong>\nIl ne peut pas être sauvegardé.",
-       "readonlywarning": "<strong>AVERTISSEMENT : la base de données a été verrouillée pour des opérations de maintenance. Vous ne pouvez donc pas publier vos modifications pour l’instant.</strong>\nVous pouvez copier et coller votre texte dans un fichier texte et l’enregistrer pour plus tard.\n\nL’administrateur système ayant verrouillé la base de données a donné l’explication suivante : $1",
-       "protectedpagewarning": "<strong>AVERTISSEMENT : cette page est protégée afin que seuls les utilisateurs ayant le statut d'administrateur puissent la modifier.</strong>\nLa dernière entrée du journal est affichée ci-dessous pour référence :",
-       "semiprotectedpagewarning": "<strong>Note :</strong>Cette page a été protégée pour que seuls les contributeurs confirmés automatiquement puissent la modifier. \nLa dernière entrée du journal est affichée ci-dessous pour référence :",
-       "cascadeprotectedwarning": "<strong>ATTENTION :</strong> Cette page a été protégée de manière à ce que seuls les utilisateurs avec [[Special:ListGroupRights|des droits spécifiques]] puissent la modifier car elle est incluse dans {{PLURAL:$1|la page suivante, protégée en cascade|les pages suivantes, protégées en cascade}} :",
-       "titleprotectedwarning": "<strong>ATTENTION : Cette page a été protégée de telle manière que des [[Special:ListGroupRights|droits spécifiques]] sont requis pour pouvoir la créer.</strong> \nLa dernière entrée du journal est affichée ci-dessous pour référence :",
+       "readonlywarning": "<strong>AVERTISSEMENT : la base de données a été verrouillée pour des opérations de maintenance. Vous ne pouvez donc pas publier vos modifications pour l’instant.</strong>\nVous pouvez copier et coller votre texte dans un fichier texte et l’enregistrer pour plus tard.\n\nL’administrateur système ayant verrouillé la base de données a donné l’explication suivante : $1",
+       "protectedpagewarning": "<strong>AVERTISSEMENT : cette page est protégée afin que seuls les utilisateurs ayant le statut d’administrateur puissent la modifier.</strong>\nLa dernière entrée du journal est affichée ci-dessous pour référence :",
+       "semiprotectedpagewarning": "<strong>Note :</strong>Cette page a été protégée pour que seuls les contributeurs confirmés automatiquement puissent la modifier.\nLa dernière entrée du journal est affichée ci-dessous pour référence :",
+       "cascadeprotectedwarning": "<strong>ATTENTION :</strong> cette page a été protégée de manière à ce que seuls les utilisateurs avec [[Special:ListGroupRights|des droits spécifiques]] puissent la modifier car elle est incluse dans {{PLURAL:$1|la page suivante, protégée en cascade|les pages suivantes, protégées en cascade}} :",
+       "titleprotectedwarning": "<strong>ATTENTION : cette page a été protégée de telle manière que des [[Special:ListGroupRights|droits spécifiques]] sont requis pour pouvoir la créer.</strong>\nLa dernière entrée du journal est affichée ci-dessous pour référence :",
        "templatesused": "{{PLURAL:$1|Modèle utilisé|Modèles utilisés}} par cette page :",
        "templatesusedpreview": "{{PLURAL:$1|Modèle utilisé|Modèles utilisés}} dans cette prévisualisation :",
        "templatesusedsection": "{{PLURAL:$1|Modèle utilisé|Modèles utilisés}} dans cette section :",
        "edittools": "<!-- Tout texte entré ici sera affiché sous les boîtes de modification ou les formulaires de téléversement de fichier. -->",
        "edittools-upload": "—",
        "nocreatetext": "{{SITENAME}} a restreint la possibilité de créer de nouvelles pages.\nVous pouvez revenir en arrière et modifier une page existante, ou bien [[Special:UserLogin|vous connecter ou créer un compte]].",
-       "nocreate-loggedin": "Vous n'avez pas la permission de créer de nouvelles pages.",
+       "nocreate-loggedin": "Vous navez pas la permission de créer de nouvelles pages.",
        "sectioneditnotsupported-title": "Modification de section non prise en charge",
        "sectioneditnotsupported-text": "La modification d’une section n’est pas prise en charge pour cette page.",
        "modeleditnotsupported-title": "Modification non prise en charge",
        "modeleditnotsupported-text": "La modification n’est pas prise en charge pour le modèle de contenu $1.",
        "permissionserrors": "Erreur de permissions",
-       "permissionserrorstext": "Vous n'avez pas la permission d'effectuer l'opération demandée pour {{PLURAL:$1|la raison suivante|les raisons suivantes}} :",
-       "permissionserrorstext-withaction": "Vous ne pouvez pas $2, pour {{PLURAL:$1|la raison suivante|les raisons suivantes}} :",
+       "permissionserrorstext": "Vous n’avez pas la permission d'effectuer l'opération demandée pour {{PLURAL:$1|la raison suivante|les raisons suivantes}} :",
+       "permissionserrorstext-withaction": "Vous ne pouvez pas $2, pour {{PLURAL:$1|la raison suivante|les raisons suivantes}}:",
        "contentmodelediterror": "Vous ne pouvez pas modifier cette révision car son modèle de contenu est <code>$1</code>, ce qui diffère du modèle de contenu actuel de la page <code>$2</code>.",
-       "recreate-moveddeleted-warn": "<strong>Attention : vous êtes en train de recréer une page qui a été précédemment supprimée.</strong>\n\nAssurez-vous qu'il est pertinent de poursuivre les modifications sur cette page.\nLes journaux des suppressions et déplacements pour cette page sont fournis ici pour information :",
+       "recreate-moveddeleted-warn": "<strong>Attention : vous êtes en train de recréer une page qui a été précédemment supprimée.</strong>\n\nAssurez-vous qu’il est pertinent de poursuivre les modifications sur cette page.\nLes journaux des suppressions et déplacements pour cette page sont fournis ici pour information :",
        "moveddeleted-notice": "Cette page a été supprimée.\nLes journaux des suppressions, protections et déplacements pour la page sont fournis ci-dessous pour référence.",
        "moveddeleted-notice-recent": "Désolé, cette page a été récemment supprimée (dans les dernières 24 heures).\nLes journaux des suppressions, protections et déplacements pour la page sont fournis ci-dessous pour référence.",
        "log-fulllog": "Voir le journal complet",
        "edit-gone-missing": "N’a pas pu mettre à jour la page.\nIl semble qu’elle ait été supprimée.",
        "edit-conflict": "Conflit de modification.",
        "edit-no-change": "Votre modification a été ignorée car aucun changement n’a été apporté au texte.",
-       "edit-slots-cannot-add": "{{PLURAL:$1|L’emplacement suivant n’est pas supporté|Les emplacements suivants ne sont pas supportés}} ici : $2.",
-       "edit-slots-cannot-remove": "{{PLURAL:$1|L’emplacement suivant est obligatoire et ne peut pas être supprimé|Les emplacements suivants sont obligatoires et ne peuvent pas être supprimés}} : $2.",
-       "edit-slots-missing": "{{PLURAL:$1|L’emplacement suivant est absent|Les emplacements suivants sont absents}} : $2.",
+       "edit-slots-cannot-add": "{{PLURAL:$1|L’emplacement suivant n’est pas supporté|Les emplacements suivants ne sont pas supportés}} ici: $2.",
+       "edit-slots-cannot-remove": "{{PLURAL:$1|L’emplacement suivant est obligatoire et ne peut pas être supprimé|Les emplacements suivants sont obligatoires et ne peuvent pas être supprimés}}: $2.",
+       "edit-slots-missing": "{{PLURAL:$1|L’emplacement suivant est absent|Les emplacements suivants sont absents}}: $2.",
        "postedit-confirmation-created": "La page a été créée.",
        "postedit-confirmation-restored": "La page a été restaurée.",
        "postedit-confirmation-saved": "Votre modification a été enregistrée.",
        "content-not-allowed-here": "Le contenu « $1 » n’est pas autorisé sur la page [[:$2]] dans l’emplacement « $3 »",
        "editwarning-warning": "Quitter cette page vous fera perdre toutes les modifications que vous avez faites.\nSi vous êtes connecté{{GENDER:||e}}, vous pouvez désactiver cet avertissement dans la section « {{int:prefs-editing}} » de vos préférences.",
        "editpage-invalidcontentmodel-title": "Modèle de contenu non pris en charge",
-       "editpage-invalidcontentmodel-text": "Le modèle de contenu \"$1\" n'est pas pris en charge.",
+       "editpage-invalidcontentmodel-text": "Le modèle de contenu « $1 » n’est pas pris en charge.",
        "editpage-notsupportedcontentformat-title": "Format de contenu non pris en charge",
-       "editpage-notsupportedcontentformat-text": "Le format de contenu $1 n'est pas pris en charge par le modèle de contenu $2 .",
+       "editpage-notsupportedcontentformat-text": "Le format de contenu $1 nest pas pris en charge par le modèle de contenu $2 .",
        "slot-name-main": "Principal",
        "content-model-wikitext": "wikitexte",
        "content-model-text": "texte brut",
        "unsupported-content-diff": "Les diffs ne sont pas supportés pour le modèle de contenu $1.",
        "unsupported-content-diff2": "Les diffs entre les modèles de contenu $1 et $2 ne sont pas supportés sur ce wiki.",
        "deprecated-self-close-category": "Pages utilisant des balises HTML auto-fermantes non valides",
-       "deprecated-self-close-category-desc": "La page contient des balises HTML auto-fermantes non valides, comme <code>&lt;b/></code> ou <code>&lt;span/></code>. Le comportement de celles-ci changera prochainement pour être en accord avec la spécification HTML5, donc leur utilisation dans le wikitexte est désuète.",
-       "duplicate-args-warning": "<strong>Avertissement :</strong> [[:$1]] appelle [[:$2]] avec plus d'une valeur pour le paramètre « $3 ». Seule la dernière valeur fournie sera utilisée.",
+       "deprecated-self-close-category-desc": "La page contient des balises HTML auto-fermantes non valides, comme <code>&lt;b/></code> ou <code>&lt;span/></code>. Le comportement de celles-ci changera prochainement pour être en accord avec la spécification HTML5, donc leur utilisation dans le wikitexte est désormais désuète.",
+       "duplicate-args-warning": "<strong>Avertissement :</strong> [[:$1]] appelle [[:$2]] avec plus d'une valeur pour le paramètre « $3 ». Seule la dernière valeur fournie sera utilisée.",
        "duplicate-args-category": "Pages utilisant des arguments dupliqués dans les appels de modèle",
        "duplicate-args-category-desc": "La page contient des appels de modèle qui utilisent des arguments dupliqués, comme <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> ou <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "<strong>Attention :</strong> cette page contient de trop nombreux appels à des fonctions coûteuses de l’analyseur syntaxique.\n\nIl devrait y avoir moins de $2 appel{{PLURAL:$2||s}}, alors qu’il y en a maintenant $1.",
-       "expensive-parserfunction-category": "Pages avec trop d'appels dispendieux aux fonctions de l'analyseur syntaxique",
+       "expensive-parserfunction-category": "Pages avec trop d’appels dispendieux aux fonctions de l’analyseur syntaxique",
        "post-expand-template-inclusion-warning": "<strong>Attention :</strong> cette page contient trop d’inclusions de modèles. Certaines inclusions ne seront pas effectuées.",
        "post-expand-template-inclusion-category": "Pages contenant trop d'inclusions de modèles",
-       "post-expand-template-argument-warning": "<strong>Attention :</strong> cette page contient au moins un paramètre de modèle dont la taille après expansion est trop importante. \nCes arguments n’ont donc pas été inclus.",
+       "post-expand-template-argument-warning": "<strong>Attention :</strong> cette page contient au moins un paramètre de modèle dont la taille après expansion est trop importante.\nCes arguments n’ont donc pas été inclus.",
        "post-expand-template-argument-category": "Pages contenant des paramètres de modèle non évalués",
        "parser-template-loop-warning": "Modèle en boucle détecté : [[$1]]",
        "template-loop-category": "Pages avec des boucles de modèle",
-       "template-loop-category-desc": "La page contient une boucle dans le modèle, c.à.d. un modèle qui s’appelle lui-même récursivement.",
-       "template-loop-warning": "<strong>Avertissement :</strong> Cette page appelle [[:$1]] ce qui provoque une boucle de modèles (un appel récursif infini).",
+       "template-loop-category-desc": "La page contient une boucle de modèle, c.à.d. un modèle qui s’appelle lui-même récursivement.",
+       "template-loop-warning": "<strong>Avertissement :</strong> cette page appelle [[:$1]] ce qui provoque une boucle de modèles (un appel récursif potentiellement infini).",
        "parser-template-recursion-depth-warning": "Limite de profondeur des appels récursifs de modèles dépassée ($1)",
        "language-converter-depth-warning": "Limite de profondeur du convertisseur de langue dépassée ($1)",
        "node-count-exceeded-category": "Pages dépassant le nombre de nœuds maximal",
        "expansion-depth-exceeded-category": "Pages dépassant la profondeur d'expansion maximale",
        "expansion-depth-exceeded-category-desc": "La page dépasse la profondeur d’expansion maximale.",
        "expansion-depth-exceeded-warning": "Page dépassant la profondeur d’expansion maximale",
-       "parser-unstrip-loop-warning": "Boucle non dépilable détectée",
-       "unstrip-depth-warning": "Limite de récursion non dépilable dépassée ($1)",
+       "parser-unstrip-loop-warning": "Boucle de développement (<code>unstrip</code>) détectée",
+       "unstrip-depth-warning": "Limite de récursion de développement (<code>unstrip</code>) dépassée ($1)",
        "unstrip-depth-category": "Pages où la limite de profondeur de développement est dépassée",
-       "unstrip-size-warning": "Limite de taille de développement dépassée ($1)",
+       "unstrip-size-warning": "Limite de taille de développement (<code>unstrip</code>) dépassée ($1)",
        "unstrip-size-category": "Pages où la limite de taille de développement est dépassée",
        "converter-manual-rule-error": "Erreur détectée dans la règle manuelle de conversion de langue",
-       "undo-success": "Cette modification va être annulée.\nVeuillez vérifier les différences ci-dessous, puis publier l’annulation si c’est bien ce que vous voulez faire.",
+       "undo-success": "La précédente modification va être annulée.\nVeuillez vérifier les différences ci-dessous, puis publier l’annulation ci-dessous si c’est bien ce que vous voulez faire.",
        "undo-failure": "Cette modification ne peut pas être défaite : cela entrerait en conflit avec les modifications intermédiaires.",
-       "undo-main-slot-only": "La modification n'a pas pu être annulée car elle implique un contenu en dehors de la tranche principale.",
+       "undo-main-slot-only": "La modification na pas pu être annulée car elle implique un contenu en dehors de la tranche principale.",
        "undo-norev": "La modification n’a pas pu être défaite parce qu’elle est inexistante ou qu’elle a été supprimée.",
        "undo-nochange": "Il semblerait que la modification ait déjà été annulée.",
        "undo-summary": "Annulation des modifications $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|discussion]])",
        "undo-summary-anon": "Annuler la modification $1 de [[Special:Contributions/$2|$2]]",
        "undo-summary-username-hidden": "Annuler la révision $1 par un utilisateur masqué",
-       "cantcreateaccount-text": "La création de compte depuis cette adresse IP (<strong>$1</strong>) a été bloquée par [[User:$3|$3]]. \n\nLa raison donnée par $3 était : <em>$2</em>",
-       "cantcreateaccount-range-text": "La création de compte depuis les adresses IP de la plage <strong>$1</strong>, où se trouve votre adresse IP (<strong>$4</strong>), a été bloquée par [[User:$3|$3]].\n\nLe motif fourni par $3 est <em>$2</em>",
+       "cantcreateaccount-text": "La création de compte depuis cette adresse IP (<strong>$1</strong>) a été bloquée par [[User:$3|$3]]. \n\nLa raison donnée par $3 était: <em>$2</em>",
+       "cantcreateaccount-range-text": "La création de compte depuis les adresses IP de la plage <strong>$1</strong>, où se trouve votre adresse IP (<strong>$4</strong>), a été bloquée par [[User:$3|$3]].\n\nLe motif fourni par $3 est : <em>$2</em>",
        "viewpagelogs": "Voir les opérations sur cette page",
        "nohistory": "Il n’existe pas d’historique des modifications pour cette page.",
        "currentrev": "Version actuelle",
        "last": "diff",
        "page_first": "première",
        "page_last": "dernière",
-       "histlegend": "Sélection du diff : cochez les boutons radio des versions à comparer et appuyez sur entrée ou sur le bouton en bas.<br />\nLégende : <strong>({{int:cur}})</strong> = différence avec la dernière version, <strong>({{int:last}})</strong> = différence avec la version précédente, <strong>{{int:minoreditletter}}</strong> = modification mineure.",
-       "history-fieldset-title": "Filtrer les versions",
+       "histlegend": "Sélection du diff : cochez les boutons radio des versions à comparer et appuyez sur entrée ou sur le bouton en bas.<br />\nLégende : <strong>({{int:cur}})</strong> = différence avec la dernière version, <strong>({{int:last}})</strong> = différence avec la version précédente, <strong>{{int:minoreditletter}}</strong> = modification mineure.",
+       "history-fieldset-title": "Filtrer les révisions",
        "history-show-deleted": "Révision supprimée uniquement",
        "histfirst": "les plus anciennes",
        "histlast": "les plus récentes",
        "historysize": "($1 octet{{PLURAL:$1||s}})",
        "historyempty": "vide",
        "history-feed-title": "Historique des versions",
-       "history-feed-description": "Historique des versions pour cette page sur le wiki",
+       "history-feed-description": "Historique des révisions pour cette page sur le wiki",
        "history-feed-item-nocomment": "$1 le $2",
-       "history-feed-empty": "La page demandée n'existe pas.\nElle a peut-être été effacée ou renommée.\nEssayez de [[Special:Search|rechercher sur le wiki]] pour trouver de nouvelles pages en rapport avec le sujet.",
+       "history-feed-empty": "La page demandée nexiste pas.\nElle a peut-être été effacée ou renommée.\nEssayez de [[Special:Search|rechercher sur le wiki]] pour trouver de nouvelles pages en rapport avec le sujet.",
        "history-edit-tags": "Modifier les balises des versions sélectionnées",
        "rev-deleted-comment": "(résumé de modification retiré)",
        "rev-deleted-user": "(nom d'utilisateur retiré)",
        "rev-showdeleted": "afficher",
        "revisiondelete": "Supprimer ou restaurer des événements",
        "revdelete-nooldid-title": "Version cible non valide",
-       "revdelete-nooldid-text": "Vous n’avez pas précisé de révision(s) cible(s) pour cette fonction, ou bien la révision spécifiée n’existe pas, ou bien vous tentez de masquer la révision actuelle.",
+       "revdelete-nooldid-text": "Vous n’avez pas précisé de révision(s) cible(s) pour cette fonction, ou la révision spécifiée n’existe pas, ou bien vous tentez de masquer la révision actuelle.",
        "revdelete-no-file": "Le fichier spécifié n'existe pas.",
-       "revdelete-show-file-confirm": "Êtes-vous sûr{{GENDER:||e}} de vouloir voir la révision supprimée du fichier « <nowiki>$1</nowiki> » datant du $2 à $3 ?",
+       "revdelete-show-file-confirm": "Êtes-vous sûr{{GENDER:||e}} de vouloir voir la révision supprimée du fichier « <nowiki>$1</nowiki> » datant du $2 à $3 ?",
        "revdelete-show-file-submit": "Oui",
-       "revdelete-selected-text": "{{PLURAL:$1|Révision sélectionnée|Révisions sélectionnées}} de [[:$2]] :",
-       "revdelete-selected-file": "{{PLURAL:$1|Version de fichier sélectionnée|Versions de fichier sélectionnées}} de [[:$2]] :",
-       "logdelete-selected": "{{PLURAL:$1|Événement d'historique sélectionné|Événements d'historique sélectionnés}} :",
+       "revdelete-selected-text": "{{PLURAL:$1|Révision sélectionnée|Révisions sélectionnées}} de [[:$2]]:",
+       "revdelete-selected-file": "{{PLURAL:$1|Version de fichier sélectionnée|Versions de fichier sélectionnées}} de [[:$2]]:",
+       "logdelete-selected": "{{PLURAL:$1|Événement d’historique sélectionné|Événements d’historique sélectionnés}} :",
        "revdelete-text-text": "Les révisions supprimées continueront à apparaître dans l’historique de la page, mais une partie de leur contenu sera inaccessible au public.",
        "revdelete-text-file": "Les versions de fichier supprimées continueront à apparaître dans l’historique des fichiers, mais une partie de leur contenu sera indisponible au public.",
-       "logdelete-text": "Les Ã©vènements supprimés du journal continueront à apparaître dans les journaux, mais une partie de leur contenu sera indisponible au public.",
-       "revdelete-text-others": "Les autres administrateurs seront toujours en mesure d'accéder au contenu caché et le restaurer, à moins que des restrictions supplémentaires soient fixées.",
-       "revdelete-confirm": "Confirmez que vous voulez effectuer cette action, que vous en comprenez les conséquences, et que vous le faites en accord avec [[{{MediaWiki:Policy-url}}|les règles]].",
-       "revdelete-suppress-text": "La suppression ne doit être utilisée <strong>que</strong> dans les cas suivants :\n* informations potentiellement diffamatoires\n* informations personnelles inappropriées\n*: <em>adresse, numéro de téléphone, numéro de sécurité sociale, …</em>",
+       "logdelete-text": "Les Ã©vénements supprimés du journal continueront à apparaître dans les journaux, mais une partie de leur contenu sera indisponible au public.",
+       "revdelete-text-others": "Les autres administrateurs seront toujours en mesure daccéder au contenu caché et le restaurer, à moins que des restrictions supplémentaires soient fixées.",
+       "revdelete-confirm": "Confirmez que vous voulez effectuer cette action, que vous en comprenez les conséquences et que vous le faites en accord avec [[{{MediaWiki:Policy-url}}|les règles]].",
+       "revdelete-suppress-text": "La suppression ne doit être utilisée <strong>que</strong> dans les cas suivants:\n* informations potentiellement diffamatoires\n* informations personnelles inappropriées\n*: <em>adresse, numéro de téléphone, numéro de sécurité sociale, …</em>",
        "revdelete-legend": "Mettre en place des restrictions de visibilité",
        "revdelete-hide-text": "Texte de la révision",
        "revdelete-hide-image": "Masquer le contenu du fichier",
        "revdelete-hide-name": "Masquer la cible et les paramètres",
        "revdelete-hide-comment": "Résumé de modification",
-       "revdelete-hide-user": "Nom d’utilisateur/Adresse IP de l’éditeur",
-       "revdelete-hide-restricted": "Supprimer ces données aux administrateurs ainsi qu'aux autres",
+       "revdelete-hide-user": "Nom d’utilisateur / adresse IP de l’auteur",
+       "revdelete-hide-restricted": "Supprimer ces données aux administrateurs ainsi quaux autres",
        "revdelete-radio-same": "(ne pas changer)",
        "revdelete-radio-set": "Masqué",
        "revdelete-radio-unset": "Visible",
        "revdelete-suppress": "Masquer également les données pour les administrateurs",
        "revdelete-unsuppress": "Enlever les restrictions sur les versions restaurées",
-       "revdelete-log": "Motif :",
+       "revdelete-log": "Motif:",
        "revdelete-submit": "Appliquer {{PLURAL:$1|à la révision sélectionnée|aux révisions sélectionnées}}",
        "revdelete-success": "Visibilité des versions mise à jour.",
-       "revdelete-failure": "'''La visibilité de la version n'a pas pu être mise à jour :'''\n$1",
+       "revdelete-failure": "'''La visibilité de la version n'a pas pu être mise à jour:'''\n$1",
        "logdelete-success": "Visibilité du journal modifiée.",
        "logdelete-failure": "'''La visibilité du journal n'a pas pu être définie :'''\n$1",
        "revdel-restore": "modifier la visibilité",
        "prefs-help-email": "L'adresse de courriel est facultative, mais elle est nécessaire pour réinitialiser votre mot de passe, en cas d'oubli.",
        "prefs-help-email-others": "Vous pouvez aussi choisir de laisser les autres vous contacter par courriel via un lien sur votre page de discussion ou page utilisateur. \nVotre adresse courriel n'est pas révélée quand les autres utilisateurs vous contactent.",
        "prefs-help-email-required": "Une adresse de courriel est requise.",
+       "prefs-help-requireemail": "Si coché, enverra seulement les courriels de réinitialisation des mots de passe si la personne qui réinitialise a fourni à la fois un nom d’utilisateur et un courriel pour ce compte.",
        "prefs-info": "Informations de base",
        "prefs-i18n": "Internationalisation",
        "prefs-signature": "Signature",
        "ipblocklist-legend": "Chercher un utilisateur bloqué",
        "blocklist-userblocks": "Masquer les blocages de comptes",
        "blocklist-tempblocks": "Masquer les blocages temporaires",
+       "blocklist-indefblocks": "Masquer les blocs non définis",
        "blocklist-addressblocks": "Masquer les blocages d’adresses IP uniques",
        "blocklist-type": "Type :",
        "blocklist-type-opt-all": "Tous",
index d8dffa5..38139ab 100644 (file)
        "systemblockedtext": "O seu nome de usuario ou enderezo IP foi bloqueado automaticamente polo sistema MediaWiki.\nO motivo do bloqueo é:\n\n:<em>$2</em>\n\n* Comezo do bloqueo: $8\n* Expiración do bloqueo: $6\n* Destinatario do bloqueo: $7\n\nO seu enderezo IP actual é $3.\nPor favor, inclúa todos estes detalles en calquera consulta que realice.",
        "blockednoreason": "non se deu ningunha razón",
        "blockedtext-composite": "<strong>O seu nome de usuario ou enderezo IP foron bloqueados.</strong>\n\nO motivo dado é:\n\n:<em>$2</em>.\n\n* Comezo do bloqueo: $8\n* Remate do bloqueo máis longo: $6\n\n* $5\n\nO seu enderezo IP actual é $3.\nPor favor, inclúa todos os detalles de arriba en calquera contacto sobre este asunto.",
+       "blockedtext-composite-ids": "Identificadores de bloqueo relevantes: $1 (o seu enderezo IP pode atoparse tamén nalgunha lista negra)",
        "blockedtext-composite-no-ids": "O seu enderezo IP aparece en múltiples listas negras",
        "blockedtext-composite-reason": "Existen varios bloqueos contra a súa conta ou enderezo IP",
        "whitelistedittext": "Debe $1 para poder editar páxinas.",
        "nocreate-loggedin": "Non ten os permisos necesarios para crear páxinas novas.",
        "sectioneditnotsupported-title": "A edición de seccións non está soportada",
        "sectioneditnotsupported-text": "A edición de seccións non está soportada nesta páxina.",
+       "modeleditnotsupported-title": "Non se permite a edición",
        "permissionserrors": "Erro de permisos",
        "permissionserrorstext": "Non ten os permisos necesarios para facelo {{PLURAL:$1|pola seguinte razón|polas seguintes razóns}}:",
        "permissionserrorstext-withaction": "Non ten os permisos necesarios para $2, {{PLURAL:$1|pola seguinte razón|polas seguintes razóns}}:",
index 2a427a2..9a45be1 100644 (file)
        "tog-previewonfirst": "पयल्याच संपादनाचेर पुर्वनियाळ दाखय",
        "tog-enotifwatchlistpages": "म्हज्या सादुरवळेरेंतलें पान वा फायल बदल्ली जाल्यार म्हाका इमेल करात",
        "tog-shownumberswatching": "ध्यान दवरपी वांगड्यांची संख्या दाखय",
-       "tog-oldsig": "सद्याची निशाणी",
-       "tog-uselivepreview": "लायव à¤ªà¥\81रà¥\8dवनियाळाà¤\9aà¥\8b à¤µà¤¾à¤ªà¤°",
+       "tog-oldsig": "तà¥\81à¤\9cà¥\8dया à¤¸à¤§्याची निशाणी",
+       "tog-uselivepreview": "पान à¤ªà¤°à¤¤ à¤\89à¤\97डनासताना à¤\9dलà¤\95 à¤¦à¤¾à¤\96य",
        "tog-watchlisthideown": "सादुरवळेरीतलें म्हजे संपादन लिपय",
        "tog-watchlisthidebots": "ध्यानसुचीतले रोबोट संपादन लिपय",
        "tog-watchlisthideminor": "सादुरवळेरीतले ल्हान संपादन लिपय",
        "tog-showhiddencats": "लिपोवन दवरिल्ले विभाग दाखय",
        "underline-always": "सदा (केधन्नय) (केन्नय)",
        "underline-never": "केधन्नयना (केन्नना)",
-       "underline-default": "बà¥\8dराà¤\89à¤\9c़र à¤¡à¤¿à¤«à¤¼à¥\89लà¥\8dà¤\9f",
+       "underline-default": "सà¥\8dà¤\95à¥\80न à¤µà¤¾ à¤¬à¥\8dरावसरा à¤ªà¥\8dरमाणà¥\87à¤\82",
        "sunday": "आयतार",
        "monday": "सोमार",
        "tuesday": "मंगळार",
        "category_header": "\"$1\" ह्या वर्गातलीं पानां",
        "subcategories": "उपवर्ग",
        "category-media-header": "\"$1\" वर्गातलें प्रसार माध्यम",
+       "category-empty": "<em>ह्या वर्गान सध्या एकूय पान वा माध्यम ना.</em>",
        "hidden-categories": "{{PLURAL:$1|लिपिल्लें वर्ग|लिपिल्लें वर्ग }}",
        "hidden-category-category": "लिपयिल्ले विभाग",
        "category-subcat-count": "{{PLURAL:$2|ह्या वर्गान फकत सकयल दिल्ले उपविभाग आसात.|ह्या वर्गातल्या $2 वट्ट {{PLURAL:$1|सकयल दिल्ले उपवर्ग आसात.|$1सकयल दिल्ले उपवर्ग आसात.}}}}",
        "category-article-count": "{{PLURAL:$2|ह्या वर्गांत सकयल दिल्लीं पानां आसात.|ह्या वर्गांत सकलय दिल्लीं {{PLURAL:$1|पानां आसात|$1 पानां आसात}}, वट्ट पानां $2}}",
        "category-file-count": "{{PLURAL:$2|ह्या वर्गांत फकत सकयली फायल आसपावता.|ह्या वर्गांत सकयल दिल्लीं {{PLURAL:$1|फायल|$1 फायलीं}} आसता, वट्ट फायलीं $2}}",
        "listingcontinuesabbrev": "चालू.",
-       "noindex-category": "बिननिरà¥\8dदà¥\87शाà¤\82à¤\95à¥\80 पानां",
+       "noindex-category": "सà¥\81à¤\9aà¥\80पतà¥\8dरान à¤\9cà¥\8bडà¥\82à¤\82à¤\95-नासलà¥\87लà¥\80à¤\82 पानां",
        "broken-file-category": "तुटलेल्या फायलींचो दुवे आसलेलीं पानां",
        "about": "विशीं",
        "article": "मजकूराचीं पानां",
        "newwindow": "(नव्या ज़ोणेलांत उकतें जाता)",
        "cancel": "रद्द करात",
        "moredotdotdot": "आनीक",
-       "morenotlisted": "हà¥\80 à¤¸à¥\82à¤\9aà¥\80 à¤ªà¥\82रà¥\8dण à¤¨à¤¾",
+       "morenotlisted": "हà¥\80 à¤¸à¥\81à¤\9aà¥\80 à¤ªà¥\82रà¥\8dण à¤¨à¤¾à¤¸à¥\82à¤\82à¤\95 à¤¶à¤\95à¥\8dता.",
        "mypage": "पान",
        "mytalk": "चर्चा",
        "navigation": "दिशा-नियंत्रण",
        "privacypage": "Project:गुप्ततायेचें धोरण",
        "ok": "बरें",
        "retrievedfrom": "\"$1\" चे कडल्यान परतून मेळयलें",
+       "youhavenewmessages": "{{PLURAL:$3|तुमकां}} $1 ($2) आसात.",
+       "youhavenewmessagesfromusers": "तुका {{PLURAL:$3एक वापरपी|$3 वापरपी}} कडल्यान $1 {{PLURAL:$4|आसा|आसात}} ($2).‎",
+       "newmessageslinkplural": "{{PLURAL:$1|नवो संदेश|999=नवे संदेश}}‎",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|निमाणो बदल|999=निमाणे बदल}}",
        "youhavenewmessagesmulti": "$1 चेर तुका नवो संदेश आसा",
        "editsection": "बदल",
        "editold": "बदल",
        "collapsible-expand": "विस्तार",
        "confirmable-yes": "हय",
        "confirmable-no": "ना",
-       "thisisdeleted": "पळय आनी परतून हाड 1?",
+       "thisisdeleted": "$1 पळय वा परत हाड?",
        "viewdeleted": "दाखयात $1?",
        "feedlinks": "पुरवय :",
        "feed-invalid": "चुकीचें सब्सक्रिप्शन फीड प्रकार",
        "databaseerror-textcl": "डॅटाबेज विरोध त्रुटी आयिल्ली आसा",
        "databaseerror-query": "अनुरोध: $1",
        "databaseerror-error": "चूक: $1",
-       "missing-article": "डेटाबेजाक \"$1\" $2 ह्या नांवाचें जे मजकूराचें पान मेळूंक जाय आसलें तें मेळ्ळेंना. हें चड करून जेन्ना काडून उडयिल्ल्या पानाक मुजत सोंपिळ्ळे डिफ वा इतिहासाचो दुवो दिवप जाता तेन्ना घडटा..जर अशें नासत तर तुमकां सॉफ्टवेरांत चूक सांपडूंक जाय हें अँडमिनिस्ट्रेटराक URLची नोंद करून कळयात.",
+       "missing-article": "डेटाबेजाक \"$1\" $2 ह्या नांवाचें जे मजकूराचें पान मेळूंक जाय आसलें तें मेळ्ळेंना. हें चड करून जेन्ना काडून उडयिल्ल्या पानाक मुजत सोंपिळ्ळे डिफ वा इतिहासाचो दुवो दिवप जाता तेन्ना घडटा..जर अशें नासत तर तुमकां सॉफ्टवेरांत चूक सांपडूंक जाय हें अँडमिनिस्ट्रेटराक URLची नोंद करून कळयात.\n\n\nम्हायतीकोश (Database) हांतूत मेळूंक जाय आसलें तें मजकूर \"$1\" $2 मेळूंक नां.\n\nहरर्शीं, अशें एक पोरणें एक फरक वा एका पानाच्या इतिहासाचो दुवो काडून उडयला, तेन्ना जाता.\n\nअशें न्हय जाल्यार, तुका सोफ्टवेरान चूक सांपडलेया जायत.\nउपकार करून एका [[Special:ListUsers/sysop|कार्भारीच्या]] नतरेक हाड, अतरजाळ्यांत जागो सोदपी (यु. आर. एल.) हाची नोंद घेवन.",
        "missingarticle-rev": "पुनर्नियाळ $1",
        "badtitle": "चुकीचो माथाळो",
        "badtitletext": "विनवणी केल्लें पानाचो माथाळो अवैध, रितो वा अयोग्य तरेन आंतरभाशी वा आंतर विकी माथाळ्या कडे जोडिल्लो आशिल्लो. तातूंत माथाळ्यांत वापरुं नजो अशी एक वा चड अक्षरां आसूं येतात.",
        "loginerror": "लॉन इन त्रुटी",
        "createacct-error": "खातें निर्माण त्रुटी",
        "createaccounterror": "खातें तयार करूंक जायना: $1",
-       "loginsuccesstitle": "लà¥\89न à¤\87न à¤¯à¤¶à¤¸à¥\8dवà¥\80 à¤\9cालां",
+       "loginsuccesstitle": "सतà¥\8dरारà¤\82भ à¤\9cालà¥\87ं",
        "nosuchusershort": "\"$1\" ह्या नांवान कोण वापरपी ना.\nउतरां तपासून पळय",
        "nouserspecified": "वापरप्याचें नांव तुवें सांगूंक जाय",
        "login-userblocked": "ह्या वापरप्याक बंद केला. लॉग इन करूंक जायना.",
-       "wrongpassword": "à¤\9aà¥\81à¤\95िà¤\9aà¥\87à¤\82 à¤\97à¥\81पà¥\80त à¤\89तर à¤\98ातलाà¤\82.\nà¤\89पà¤\95ार à¤\95रà¥\82न à¤ªà¤°à¤¤à¥\82न यत्न कर.",
+       "wrongpassword": "à¤\9aà¥\81à¤\95à¥\80à¤\9aà¥\87à¤\82 à¤µà¤¾à¤ªà¤°à¤ªà¥\8dयाà¤\9aà¥\87à¤\82 à¤¨à¤¾à¤\82व à¤µà¤¾ à¤\97à¥\81पà¥\80तà¤\89तर à¤\98ातलाà¤\82.\nà¤\89पà¤\95ार à¤\95रà¥\82न à¤ªà¤°à¤¤à¥\82न à¤ªà¥\8dरयत्न कर.",
        "wrongpasswordempty": "गुपीत उतर घालूंक ना.\nउपकार करून परतून यत्न कर.",
        "passwordtoolong": "गुपीत उतर हाच्या परस चड व्हड आसूंक फावना{{PLURAL:$1|1 वर्ण|$1 वर्णां}}.",
        "password-name-match": "तुजें गुपीत उतर वापरप्याच्या नांवा परस वेगळें आसूंक जाय.",
        "emaildisabled": "ही साइट मेल धाडपाक शकना.",
        "accountcreated": "खातें तयाओर केलें",
        "createaccount-title": "{{SITENAME}} हाका लागून खातें तयार केलां",
-       "login-abort-generic": "तà¥\81मà¤\9aà¥\87à¤\82 à¤²à¥\89à¤\97 à¤\87न à¤\85पà¥\87शà¥\80 à¤¥à¤¾à¤°à¤²à¤¾à¤\82 - à¤¨à¤¿à¤¶à¥\8dफलीत",
+       "login-abort-generic": "तà¥\81à¤\9cà¥\87à¤\82 à¤¸à¤¤à¥\8dरारà¤\82भ à¤\85पà¥\87शà¥\80 à¤¥à¤¾à¤°à¤²à¤¾à¤\82 â\80\93 à¤¨à¤¿à¤¶à¤«à¤³ीत",
        "login-migrated-generic": "तुमचें खातें स्थलांतरीत जालां आनी तुजें वापरप्याचें नांव ह्या विकीचेर उपस्थीत ना.",
        "loginlanguagelabel": "भास:$1",
        "pt-login": "सत्रारंभ",
        "newpassword": "नवें गुपीत उतर",
        "retypenew": "नवें गुपीत उतर परतून टाइप कर",
        "resetpass_submit": "गुपीत उतर तयार कर आनी लॉग इन कर",
-       "changepassword-success": "तुजें गुपीत उतर बदलप यशस्वी थारलां",
+       "changepassword-success": "तुजें गुपीतउतर बदल्लां!",
        "resetpass_forbidden": "गुपीत उतरां बदलूंक शकनात",
        "resetpass-submit-loggedin": "गुपीत उतर बदलात",
        "resetpass-submit-cancel": "रद्द करात",
        "passwordreset-domain": "डोमेन:",
        "passwordreset-email": "ईमेल नामो:",
        "passwordreset-emailelement": "वापरप्याचें नांव: \n$1\n\nतात्पुरतें गुपीत उतर: \n$2",
-       "passwordreset-emailsentemail": "à¤\97à¥\81पà¥\80त à¤\89तर à¤ªà¤°à¤¤à¥\82न à¤¤à¤¯à¤¾à¤° à¤\95रपाà¤\9aà¥\8b à¤\88मà¥\87ल à¤§à¤¾à¤¡à¤²à¤¾",
-       "changeemail": "à¤\88मà¥\87ल à¤¸à¤\82दà¥\87श à¤¬à¤¦à¤²à¥\8dला",
+       "passwordreset-emailsentemail": "हà¥\8b à¤\88मà¥\87ल à¤ªà¤¤à¥\8dतà¥\8b à¤¤à¥\81à¤\9cà¥\8dया à¤¹à¤¿à¤¶à¥\8bबाà¤\82त à¤\9cà¥\8bडलà¥\8bलà¥\8bà¤\82 à¤\86सा à¤\9cालà¥\8dयार, à¤\97à¥\81पà¥\80तà¤\89तर à¤ªà¤°à¤¤à¥\82न à¤¥à¤¾à¤°à¤¾à¤µà¤ªà¤¾à¤\9aà¥\8b à¤\88मà¥\87ल à¤§à¤¾à¤¡à¤²à¥\87लà¥\87à¤\82 à¤\9cातà¥\87लà¥\87à¤\82.",
+       "changeemail": "à¤\88मà¥\87ल à¤ªà¤¤à¥\8dतà¥\8b à¤¬à¤¦à¤² à¤µà¤¾ à¤\95ाड",
        "changeemail-oldemail": "सद्याचो ईमेल नामो:",
        "changeemail-newemail": "नवो ईमेल नामो:",
        "changeemail-none": "(कांय ना)",
        "showpreview": "पूर्वनियाळ दाखय",
        "showdiff": "बदल दाखयात",
        "anoneditwarning": "'''शिटकावणी:''' तुवें सत्रारंभ करूंक ना.\nतुजो IP पत्तो ह्या पानाच्या संपादन इतिहासांत नोंद जातलो.जर तुमी <strong>[$1 सत्रारंभ]</strong> करता वा <strong>[$2 खातें उगडटा]</strong> जाल्यार हेर सुविधांसयत तुमच्या संपादनाचें श्रेय तुमच्या सदस्य नांवाचेर दितलें.",
-       "missingcommenttext": "à¤\89पà¤\95ार à¤\95रà¥\82न à¤¤à¥\81मà¤\9aà¥\8dयà¥\8b à¤¶à¤¿à¤°à¥\8b à¤¸à¤\95यल à¤\98ाल.",
+       "missingcommenttext": "à¤\89पà¤\95ार à¤\95रà¥\82न à¤¤à¥\81à¤\9cà¥\8b à¤¶à¥\87रà¥\8b à¤¬à¤°à¤¯.",
        "blockedtitle": "वापरप्याक बंद केला",
+       "blockedtext": "<strong>तुजें वापरप्याचें नांव वा आय पा पत्तो आडावपांत आयला.</strong>\n\nआडावप $1 हाणें केलां.\nकारण दिलां तें <em>$2</em>.\n\n* आडावपाची सुरवात: $8\n* आडावप सोंपोवपाचो वेळ: $6\n* आडावपाक येवजिला: $7\n\nतुज्यान $1-आक वा दूसऱ्या [[{{MediaWiki:Grouppage-sysop}}|कारभार्याक]] आडावणे विशीं भासाभास करुंक संपर्क करुंक जाता. तुज्यान \"{{int:emailuser}}\" सभावगूण वापरुंक जायना खेरीज एक वैद ईमेल पत्तो तुज्या [[Special:Preferences|खातें पसंतिंत]] निशचीत केल्या शिवाय आनी तुका तें वापरपाक आडावंक ना जाल्यार. तुजो चालंत IP पत्तो आसा $3, आनी आडावणेच्यो आंक #$5 आसा. सगळ्यो वयल्यो बारिकसाणी तूं करताय त्या विचारांत समावेश कर.",
        "blockednoreason": "कांयच कारण दिवंक ना",
        "loginreqtitle": "लॉग इन जाय",
        "loginreqlink": "सत्रारंभ करात",
        "accmailtitle": "गुपीत उतर धाडलां",
        "newarticle": "(नवें)",
        "newarticletext": "जें पान अजून अस्तित्वांत ना अशा पानाचे दुवे फाटल्यान तुमी आसात. पान रचपाक सकयले चौकटींत टायप करपाक सुरु करात (चड म्हायती खातीर [$1 आदाराचें पान] पळेयात) जर ह्या पानार तुमी चुकून पावल्यात तर ब्रावजराचो बॅक (<strong>फटीं</strong>) हो बटन दामात",
+       "anontalkpagetext": "----\n<em>हें भासाभासेचें पान एक निनामी वापरप्याक जाणें अजून एक खातें उगडुंक ना, वो तो तें वापर्ना.</em>\nह्या खातीर आमकां आंकड्यांचो IP पत्तो वापरुंक पडता ताका वळखुंक.\nतसलो IP पत्तो साबार वापरप्यानी वापरूं येता.\nतूं जर एक निनामी वापरपी आसा आनी तुका दिसता की तुमका संबंद नासलेले शेरे तुजे विशीं केल्यात, उपकार करून [[Special:CreateAccount|एक खातें रच]] वा[[Special:UserLogin|सत्रारंभ कर]] फुडले गुस्पप निनामी वापरप्या ताळूंक.‎",
        "noarticletext": "सध्याक हें पान रिंते आसा.\nतुज्यान दूसऱ्या पानानी [[Special:Search/{{PAGENAME}}| ह्या पानाचे नांव सोदूंक जाता]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAME}}}} संबंधी सत्रानी सोदूंक जाता], वा [{{fullurl:{{FULLPAGENAME}}|action=edit}} हें पान रचूंक जाता]</span>.",
        "noarticletext-nopermission": "तुर्ताक ह्या पानाचेर कसलोच मजकूर ना. तुमी हेर पानांचेर [[Special:Search/{{PAGENAME}}|ह्या माथाळ्याचो सोद]] घेवं शकतात,\nवा <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} संबंदीत लॉग सोदूं शकतात]</span>, पूण तुमकां हें पानाची रचणूक करपाची परवानगी ना।",
        "userpage-userdoesnotexist-view": "\"$1\" ह्या वापरप्याच्या खात्याची नोंदणी करूंक ना.",
+       "clearyourcache": "<strong>चत्राय:</strong> सांबाळ्ळ्या उपरांत, तुका घडयेक तुज्या ब्रावसराचो कॅश कडसरावंक पडत बदल पळोंवचे खातीर.\n* <strong>Firefox / Safari:</strong> <em>Shift</em> > धर <em>Reload</em> क्लीक करताना, वा दाम <em>Ctrl-F5</em> वा <em>Ctrl-R</em> (<em>⌘-R</em> मॅक-आचेर)\n* <strong>Google Chrome:</strong> <em>Ctrl-Shift-R</em> दाम (<em>⌘-Shift-R</em> एका मॅक-आचेर)\n* <strong>Internet Explorer:</strong> <em>Ctrl</em> dhor <em>Refresh</em> क्लीक करताना, वा दाम <em>Ctrl-F5</em>\n* <strong>Opera:</strong> हांगा वच: <em>Menu → Settings</em> (<em>Opera → Preferences</em> मॅक-आचेर) आनी उपरांत <em>Privacy & security → Clear browsing data → Cached images and files</em>.‎",
        "previewnote": "'''ही फकत एक दाखवण हें मतींत दवरात.'''\nतुमचें बदल आडून राखून दवरूंक ना!",
+       "continue-editing": "संपादन करपाच्या जाग्यार वच",
        "editing": "संपादता $1",
        "creating": "$1 रोचता",
        "editingsection": "(विभाग) $1 संपादन",
        "yourtext": "तुमचो मजकूर",
        "templatesused": "ह्या पानाचेर {{PLURAL:$1|वापरिल्लें}} सांचे",
+       "templatesusedpreview": "{{PLURAL:$1सांचो|सांचे}} ह्या झलकेंत वापरल्यात:‎",
        "template-protected": "(राखिल्लें)",
        "template-semiprotected": "(अर्द-सुरक्षीत)",
        "hiddencategories": "हें पान {{PLURAL:$1|लिपिल्ले वर्गाचें}} आसा",
+       "permissionserrors": "परवांगेची चूक",
        "permissionserrorstext-withaction": "ह्या {{PLURAL:$1|कारण|कारणां}}: खातीर तुका $2 मान्यताय ना.",
        "recreate-moveddeleted-warn": "शिटकावणीः तुमी आदीं काडून उडयिल्लें पान परतून तयार करतात ह्या पानाचे फासून उडोवपी आनी दुसरे कडे व्हरपी लाग फकत सोपेपणा खातीर दिल्यात",
        "moveddeleted-notice": "हें पान काडून उडयला.\nह्या पानाचें काडून उडोवपाचें, राखपाचें, आनी हालोवपाचें सत्र  संदर्भा खातीर सकयल दिला.",
        "post-expand-template-inclusion-category": "जंय सांचे धरून आवांठ व्हड जाता अशीं पानां",
        "post-expand-template-argument-warning": "<strong>शिटकावणीः</strong> ह्या पानाचेर खुब व्हड आंवाठ आशिल्लो एक तरी सांच्याचो मुद्दो आसा. हे मुद्दे भायरायल्यात",
        "post-expand-template-argument-category": "भायरायिल्ल्या सांच्यांसंबंदीचे मुद्दे आशिल्लीं पानां",
+       "undo-failure": "बदल परतावूंक जावंक ना कित्याक गुस्पणेचे मदले बदल आसात.",
        "viewpagelogs": "ह्या पाना खातीर सोत्रां पळेयात",
        "currentrev-asof": "$1 मेरेनचो सगळ्यांत निमणो पुनर्नियाळ",
        "revisionasof": " $1 मेरेन पुनर्नियाळ",
        "page_last": "निमणें",
        "histlegend": "फरकाची निवडणी : पुनर्नियाळांची तुळा करपा खातीर रेडियो चौकटीं चेर कुरु करात आनी ''एंटर'' ना तर तळाकडे आशिल्लो बुतांव दामात।<br />\nविवरण : <strong>({{int:cur}})</strong> = हालींची पुनर्नियाळा बरोबर फरक, <strong>({{int:last}})</strong> = आदली पुनर्नियाळा बरोबर फरक, <strong>{{int:minoreditletter}}</strong> = दाक्टें बदल।",
        "history-fieldset-title": "उजळण्यो चाळ",
-       "history-show-deleted": "फà¤\95त à¤\95ाडà¥\82न à¤\89डयिलà¥\8dलें",
+       "history-show-deleted": "फà¤\95त à¤\89à¤\9cळणà¥\80 à¤\95ाडà¥\82न à¤\89दयलà¥\87लें",
        "histfirst": "पोरणो",
        "histlast": "नवो ताल्ल",
+       "history-feed-title": "पुनर्नियाळाचो इतिहास",
+       "history-feed-description": "विकीचेर ह्या पाना खातीर पुनर्नियाळाचो इतिहास",
        "history-feed-item-nocomment": "$1 हांगा $2",
        "rev-delundel": "दृश्य मानताय बदलात",
        "rev-showdeleted": "दाखयात",
        "revdel-restore": "दृश्य मानताय बदलात",
        "pagehist": "पानाचो इतिहास",
        "mergehistory-reason": "कारण:",
+       "mergelog": "विलीन करपाचें सत्र",
        "revertmerge": "वेगळावप",
        "history-title": "\"$1\" च्या पुनर्नियाळाचो इतिहास",
        "difference-title": "\"$1\" च्या आवृत्तींत अंतर",
        "lineno": "$1 वळ :",
        "compareselectedversions": "वेंचिल्ल्या पुनर्नियाळांची तुळा करात",
        "editundo": "केल्लें परतावचें",
+       "diff-empty": "(कांय फरक ना)‎",
        "diff-multi-sameuser": "(ह्या वांगड्या सयत {{PLURAL:$1|केल्लें मदलें एक अवतरण दाखोवंक ना|केल्लें मदलें $1 अवतरण दाखोवंक ना}})",
+       "diff-multi-otherusers": "({{PLURAL:$2|एक हेर वापरप्या|$2 हेर वापरप्यां}} वर्वीं {{PLURAL:$1|एक मदली उजळणी|$1 मदल्यो उजळण्यो}} दाखोवंक ना)‎",
        "searchresults": "सोदाचो निकाल",
        "searchresults-title": "\"$1\" हाच्या सोदाचे परिणामां",
        "prevn": "आदलें{{PLURAL:$1|$1}}",
        "searchprofile-everything-tooltip": "सगळो मजकूर सोदात(चर्चेचें पाना सयत)",
        "searchprofile-advanced-tooltip": "खाशेल्या नांवथोळाणी सोदात",
        "search-result-size": "$1 ({{PLURAL:$2|1 उतर|$2 उतरां}})",
-       "search-result-category-size": "{PLURAL:$1|1 सदस्य|$1 सदस्य}} ({{PLURAL:$2|1 उपगट|$2 उपगट}}, {{PLURAL:$3|1 फायल|$3 फायलीं}})",
+       "search-result-category-size": "{{PLURAL:$1|$1 वांगडी}} ({{PLURAL:$2|$2 उपवर्ग}}, {{PLURAL:$3|1 फायल|$3 फायली}})",
        "search-redirect": "($1 सावन पुनर्निर्देशीत)",
        "search-section": "(विभाग $1)",
+       "search-file-match": "(फायलीच्या मजकुराक जुळटा)‎",
        "search-suggest": "तुमकां $1 अशें म्हणपाचें आसलें?",
        "search-rewritten": "$1 हाचो निकाल दाखयता.नाजाल्यार $2 हें सोदात.",
        "search-interwiki-more": "(आनी)",
        "prefs-watchlist": "सादुरवळेरी",
        "youremail": "इमेल",
        "yourrealname": "खरें नांवः",
+       "group-bot": "रोबोटां",
+       "group-sysop": "कारभारी",
+       "grouppage-bot": "{{ns:project}}:रोबोटां",
+       "grouppage-sysop": "{{ns:project}}:कारभारी",
        "right-writeapi": "Write API चो उपेग",
        "newuserlogpage": "वापरपी रोचनेचे वळेरी",
+       "rightslog": "वापरप्याच्या हकांचो सत्र",
        "action-edit": "हें पान संपादीत कर",
-       "nchanges": "$1 {{PLURAL:$1|बदल|बदल}}",
+       "action-createaccount": "हें वापरप्याचें खातें रच",
+       "nchanges": "$1 {{PLURAL:$1|बदल}}",
        "enhancedrc-history": "इतिहास",
        "recentchanges": "हालींचे बदल",
        "recentchanges-legend": "हालींच जाल्ल्या बदलाचो विकल्प",
        "rcshowhideanons": "$1 निनांवी वापरपी",
        "rcshowhideanons-show": "दाखयात",
        "rcshowhideanons-hide": "लिपयात",
+       "rcshowhidepatr": "$1 पारो केलेले सुदारप",
        "rcshowhidepatr-show": "दाखयात",
        "rcshowhidepatr-hide": "लिपयात",
        "rcshowhidemine": "$1 म्हजें संपादन आंकडे",
        "rc-change-size-new": "$1 {{PLURAL:$1|बाय्ट|बाय्टी}} बदल केल्या उपरांत",
        "rc-enhanced-expand": "म्हायती दाखय",
        "rc-enhanced-hide": "म्हायती लिपय",
+       "rc-old-title": "आरंभांत रचलली \"$1\" ह्या नांवान‎",
        "recentchangeslinked": "संबंदित बदल",
        "recentchangeslinked-toolbox": "संबंदीत बदल",
        "recentchangeslinked-title": "\"$1\" च्या संबंदातले बदल",
        "recentchangeslinked-to": "ह्या पाना बदला दिल्ल्या पानांक जडून आशिल्ल्या पानांचे बदल दाखय",
        "upload": "फायल अपलोड करात",
        "uploadbtn": "फायल अपलोड करात",
+       "uploadlogpage": "अपलोडाचें सत्र",
        "filedesc": "सारांश",
        "fileuploadsummary": "आपरोस:",
        "license": "लायसन्सीग",
        "filehist-datetime": "दिस / वेळ",
        "filehist-thumb": "ल्हान-इमाज़",
        "filehist-thumbtext": " $1मेरेनचे आवृत्ती खातीर ल्हान-इमाज़",
+       "filehist-nothumb": "ल्हान-इमाज ना",
        "filehist-user": "वापरपी",
        "filehist-dimensions": "परिमाण",
        "filehist-comment": "शेरो",
        "imagelinks": "फायलिचो वापर",
        "linkstoimage": "{{PLURAL:$1|हें पान|$1 हीं पानां}} ही फायल {{PLURAL:$1|वापरता|वापरतात}}:",
+       "linkstoimage-more": "$1 परस अदीक {{PLURAL:$1|पान वापरता|पानां वापरतात}} ही फायल.\nसकयली वळेरी दाखयता {{PLURAL:$1|पयलें पान|पयलीं $1 पानां}} जें हीच फायल वापरता. एक [[Special:WhatLinksHere/$2|पूर्ण वळेरी]] उपलब्ध आसा.‎",
        "nolinkstoimage": "ह्या फायलीक वापरतात तसलीं पानां नांत.",
+       "linkstoimage-redirect": "$1 (फायल पुनर्देशन) $2",
        "sharedupload-desc-here": "ही फयल $1 हांगाची आनी ती हे प्रकल्पां खातीर वापरल्यार चलता. (तिच्या $2 ह्या फयलींतलें वर्णनाचे पान) तातूंतलें वर्णन सकयल दिलां.",
+       "filepage-nofile": "ह्या नांवाची फायल असतित्वांत ना.",
        "upload-disallowed-here": "तूं ह्या फायलीचेर अधिलेखीत करूंक शकना",
        "randompage": "खंयचेंय पान",
        "statistics": "संख्याशास्त्र",
        "statistics-pages": "पान:",
        "statistics-files": "फायल अपलोड करात",
+       "double-redirect-fixer": "पुनर्निर्देशन थारावपी",
        "brokenredirects-edit": "बदल",
        "brokenredirects-delete": "काडून उडयात",
        "nbytes": "$1 {{PLURAL:$1|बाय्ट}}",
        "nmembers": "$1 {{PLURAL:$1|वांगडी}}",
        "prefixindex": "उपसर्ग आशिल्लीं सगळीं पानां",
-       "usercreated": "$1 ह्या दिसा $2 ह्या वेळार तयार केलें",
+       "listusers": "वापरप्यांची वळेरी",
+       "usercreated": "$3 हाणें $1 दिसा $2 वोराचेर {{GENDER:$3|रचलेलें}}",
        "newpages": "नवीं पानां",
        "move": "हालय",
        "pager-newer-n": "{{PLURAL:$1|नवो 1|नवें $1}}",
        "booksources": "पुस्तकांचो स्त्रोत",
        "booksources-search-legend": "पुस्तकाचे स्त्रोत सोदात",
        "booksources-search": "सोद",
+       "specialloguserlabel": "करपी:",
+       "speciallogtitlelabel": "मोख (माथाळो वा {{ns:user}}:वापरप्याचें नांव):",
        "log": "सोत्रां",
+       "all-logs-page": "सगळीं भौसाचीं सत्रां",
+       "alllogstext": "{{SITENAME}} हाच्यो सगळ्या उपलब्ध सत्रांची एकठांय दाखोवणी.\nतुज्यान तुजो देखावो अर्नूं येता एक सत्राचो प्रकार विंचून, वापरप्याचें नांव (व्हदल्या आनी धाकट्या अक्षरा मदें फरक पडटा), वा पोरणें जालेलें पान (हांगाय व्ह़डले आनी धाक्टे अक्षरा मदें फरक पडटा).‎",
+       "logempty": "सत्रान जुळपी नग नांत.‎",
        "allpages": "सगळीं पाना",
        "nextpage": "फुडलें पान ($1)",
        "prevpage": "फाटलें पान ($1)",
        "allarticles": "सगळीं पानां",
        "allpagessubmit": "वचात",
+       "allpages-hide-redirects": "पुनर्देर्शनां लिपय",
        "categories": "वर्ग",
        "linksearch-ns": "नांवाची सुवात",
        "linksearch-ok": "सोद",
        "listgrouprights-members": "सदस्यांची वळेरी",
        "emailuser": "ह्या वापरप्याक इमेल करात.",
        "emailusername": "वापरप्याचे नांव",
+       "usermessage-editor": "यंत्रणाचो संदेशकार",
        "watchlist": "सादुरवळेरी",
        "mywatchlist": "सादुरवळेरी",
        "watchlistfor2": "$1 $2 खातीर",
        "addedwatchtext": "\"[[:$1]]\" आनी हाचे भासाभास पान तुमचें [[Special:Watchlist|सादुरवळेरेक]] जोडलां.",
        "watch": "नदर दवरात",
        "unwatch": "पळोवंक नासलें",
-       "watchlist-details": "लक्ष {{PLURAL:$1|$1वळेरींतलें|$1 वळेंरींतली}} {{PLURAL:$1|$1पान|$1 पानां}} उलोवपाची पानां सोडून",
+       "watchlist-details": "तुज्या सादूरवळेरिंत {{PLURAL:$1|$1 पान आसा|$1 पानां आसात}} (त्या भायर उलोवपाचीं पानां आसात).",
+       "wlheader-showupdated": "तुज्या फाटले भेटे सावन बदल्ल्यान तीं पानां <strong>दाट</strong> दाखयल्यांत.",
+       "wlnote": "सकयल {{PLURAL:$1|हो निमाणो बदल|हें निमाण्यो <strong>$1</strong> बदल}} निमाण्या {{PLURAL:$2|वोरान|<strong>$2</strong>वोरानीं}}, $3, $4 पर्यान.‎",
        "watchlist-options": "सादुरवळेरींतलो पर्याय",
+       "enotif_reset": "सगळीं पानां भेट दिलेलीं म्हूण खुणाय",
        "delete-legend": "काडून उडयात",
        "actioncomplete": "क्रिया पुराय जाल्या",
        "actionfailed": "क्रिया अपेस जाल्या",
        "changecontentmodel-reason-label": "कारण:",
        "protectlogpage": "सुरक्षितेचें सोत्र",
        "protectedarticle": "राखिल्ले\"[[$1]]\"",
+       "modifiedarticleprotection": "सुरक्षेची पातळी \"[[$1]]\"‎ हाचे खातीर बदल्ल्या",
+       "protect-default": "सगळ्या वापरप्यांक परवांगी दी",
        "restriction-edit": "बदल",
        "restriction-move": "दुसरेकडे व्हरात",
        "restriction-create": "निर्माण कर",
        "mycontris": "योगदान",
        "anoncontribs": "योगदान",
        "contribsub2": "{{GENDER:$3|$1}} हाच्यो ($2)",
+       "nocontribs": "ह्या निशकशांक खयंचेच बदल जूळ्ळेले मेळूंक नांत.",
        "uctop": "हालीचें",
        "month": "ह्या म्हयन्या सावन (आनी आदलें):",
        "year": "ह्या वर्सा सावन (आनी आदलें):",
        "whatlinkshere-hideredirs": "$1 पुनर्निर्देशन",
        "whatlinkshere-hidetrans": "$1 दुरास्थ-समावेस",
        "whatlinkshere-hidelinks": "$1 दुवे",
-       "whatlinkshere-hideimages": "$1 फायल दुवे",
+       "whatlinkshere-hideimages": "$1 फायलींचे दुवे",
        "whatlinkshere-filters": "गाळणे",
        "ipboptions": "2 वरां:2 hours,1 दीस:1 day,3 दीस:3 days,1 सुमान:1 week,2 सुमनां:2 weeks,1 म्हयनो:1 month,3 म्हयने:3 months,6 म्हयने:6 months,1 वर्स:1 year,शेवट ना:infinite",
        "ipblocklist": "आडायल्लें वापरपी",
+       "infiniteblock": "शेवट ना",
        "blocklink": "आडावणी",
        "change-blocklink": "विभाग सुदारप",
        "contribslink": "योगदान",
        "blocklogpage": "कार्यवळेरी आडायात",
-       "blocklogentry": "$2 $3 हो सोंपपी वेळ आशिल्लो $1 बंद दवरल्ला",
+       "blocklogentry": "[[$1]] आक आडायला, इतल्या वेळाक: $2, कारण: $3",
+       "reblock-logentry": "आडावपाचें बसोवप बदल्लां [[$1]] हाचे खातीर सोंपोवपाचो वेळ दिला $2 $3‎",
        "block-log-flags-nocreate": "खातें निर्माण जावूंक ना",
+       "proxyblocker": "प्रतिनिधी सिरविदोर आडावपी‎",
        "movepagebtn": "पान हालय",
        "movelogpage": "पान हालोवण्यांचो सोत्र",
        "revertmove": "मूळ पदार व्हरप",
        "allmessagesdefault": "पूर्वनिर्धारित संदेशाचो मजकूर",
        "thumbnail-more": "व्हड करात",
        "thumbnail_error": "$1ः लघुप्रतिमा करतांनाची चूक",
+       "importlogpage": "आयाताचें सत्र",
        "tooltip-pt-userpage": "{{GENDER:|तुमचें वापरप्याचें}} पान",
        "tooltip-pt-mytalk": "{{GENDER:|तुमचें}} भासाभासाचें पान",
        "tooltip-pt-preferences": "{{GENDER:|तुमची}} पसंती",
        "tooltip-ca-nstab-special": "हें एक खेरीत पान, आनी हें बदलूंक जायना",
        "tooltip-ca-nstab-project": "प्रकल्पाचें पान पळेयात",
        "tooltip-ca-nstab-image": "फायलीचें पान पळेयात",
+       "tooltip-ca-nstab-mediawiki": "यंत्रणाचो संदेश पळय",
        "tooltip-ca-nstab-template": "सांचो पळेयात",
        "tooltip-ca-nstab-category": "वर्गांचे पान पळेयात",
        "tooltip-minoredit": "हो ल्हानसो बदल म्हूण कुरू करात",
        "tooltip-undo": "\"आदलें स्थितीर हाडचें\" ह्या बदलाक परत व्हरुन संपादन स्थितीन झलक रितीन दाखयतात.\nहाचेवरवीं सारांशान आदल्या स्थितीर हाडपाचें कारण बरोवं शकता.",
        "tooltip-summary": "आपरोसाची नोंदणी करात",
        "simpleantispam-label": "स्पमविरूध तपासणी.\nहें भर <strong>नाका</strong>!",
+       "pageinfo-title": "\"$1\" ‎खातीर म्हायती",
+       "pageinfo-header-basic": "मूळ म्हायती",
+       "pageinfo-header-edits": "बदलाचो इतिहास",
+       "pageinfo-header-restrictions": "पानाची सुरक्षा",
+       "pageinfo-header-properties": "पानाचे गुणधर्म",
+       "pageinfo-display-title": "मांडलेलें माथाळें",
+       "pageinfo-default-sort": "डिफोल्ट आरीन मांडूंक चावी",
+       "pageinfo-length": "पानाची लांबाय (बायटांत)‎",
+       "pageinfo-article-id": "पानाचो आंक",
+       "pageinfo-language": "पानाच्या मजकुराची भास",
+       "pageinfo-content-model": "पानाच्या मजकुराचो नमुनो",
+       "pageinfo-robot-policy": "रोबोटां कडल्यान सुचेंत घालप",
+       "pageinfo-robot-index": "परवांगी आसा",
+       "pageinfo-robot-noindex": "परवांगी ना",
+       "pageinfo-watchers": "पानाचेर दिश्ट दवरतेल्यांचो आंकडो",
+       "pageinfo-few-watchers": "$1 परस थोडें {{PLURAL:$1|दिश्ट दवरपी}}‎",
+       "pageinfo-redirects-name": "ह्या पाना खातीर पुनर्निर्देशनांचो आंकडो",
+       "pageinfo-subpages-name": "ह्या पानाच्या ऊप-पानाचो आंकडो",
+       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|पुनर्निर्देशन|पुनर्निर्देशनां}}; $3 {{PLURAL:$3|पुनर्निर्देशन नासलेलें}})‎",
+       "pageinfo-firstuser": "पान रचपी",
+       "pageinfo-firsttime": "पान रचपाची तारीख",
+       "pageinfo-lastuser": "हालींचो संपादक",
+       "pageinfo-lasttime": "हालींच्या बदलाची तारीख",
+       "pageinfo-edits": "एकूण बदलाचो आंकडो",
+       "pageinfo-authors": "वेगळे बरोवप्यांचो एकूण आंकडो",
+       "pageinfo-recent-edits": "हालींच्या बदलांचे आंकडे (गेले $1)‎",
+       "pageinfo-recent-authors": "हालींचे वेगळे बरोवपी",
+       "pageinfo-magic-words": "{{PLURAL:$1|जादवाचें उतर|जादवाचीं उतरां}} ($1)‎",
+       "pageinfo-hidden-categories": "लिपयलेले {{PLURAL:$1|वर्ग}} ($1)",
+       "pageinfo-templates": "{{PLURAL:$1|सांचो दुरास्थ-समावेस जाला|सांचे दुरास्थ-समावेस जाले}} ($1)‎",
        "pageinfo-toolboxlink": "पानाची म्हायती",
+       "pageinfo-contentpage": "एक मजकुराचें पान कशें धरपांत आयलां",
        "pageinfo-contentpage-yes": "हय",
+       "patrol-log-page": "पारो करप्याचे सत्र",
        "previousdiff": "← आदलें संपादन",
        "nextdiff": "नवें संपादन →",
+       "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|पान|पानां}}",
        "file-info-size": "$1 × $2 चित्रतत्व, फायलीचो आकार: $3, माइम प्रकार: $4",
+       "file-info-size-pages": "$1 × $2 चित्रत्वां, फायलिचो आकार: $3, MIME प्रकार: $4, $5 {{PLURAL:$5|पान|पानां}}‎",
        "file-nohires": "हाच्या परस वयले बारिक्साय उपल्बद ना",
        "svg-long-desc": "SVG फायल, नांवाक $1 × $2 चित्रतत्वां, फायलीचो आकार: $3",
        "show-big-image": "मुळावी फायल",
        "monthsall": "सगळे",
        "confirm-rollback-button": "बरें",
        "confirm-rollback-top": "ह्या पाना वयलें संपादन आशिल्ले तशें करात?",
+       "imgmultipagenext": "फुडलें पान →",
+       "imgmultigo": "वचात!",
+       "imgmultigoto": "$1 ‎पानार वचात",
+       "watchlisttools-clear": "सादूरवळेरी निवळ कर",
        "watchlisttools-view": "प्रस्तूत बदल पळयात.",
        "watchlisttools-edit": "सादुरवळेरी पळय आनी संपादीत करात",
+       "watchlisttools-raw": "सादूरवळेरिची मूळान बदल कर",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|उलयात]])",
+       "redirect": "फायल, वापरपी, पान, उजळणी वा सत्र आंक‎ वर्वीं पुनर्देशन कर",
+       "redirect-summary": "हें विशेश पान पुनर्देशीत करता एका फायलीक (फायलीचें नांव दिल्यार), एका पानाक (उजळणेचो आंक वा पानाचो आंक दिल्यार), एक वापरप्याच्या पानाक (एके वापरप्याचो आंक दिल्यार), वा एक सत्र नोंद (सत्राचो आंक दिल्यार). वापर: [[{{#Special:Redirect}}/file/देखीक.jpg]],  [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], vo [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "वचात",
+       "redirect-lookup": "सुचींत पळय:",
        "redirect-value": "मोल:",
+       "redirect-user": "वापरप्यांचो आंक",
+       "redirect-page": "पानाचो आंक",
+       "redirect-revision": "पानाची उजळणी",
+       "redirect-file": "फायलीचें नांव",
        "specialpages": "विशेश पानां",
        "tag-filter": "[[Special:Tags|कुर्वेचीट]] गाळणो:",
        "tag-list-wrapper": "[[Special:Tags|{{PLURAL:$1|कुरवेचीट|कुरवेचीटी}}]]: $2",
        "tags-active-yes": "हय",
        "tags-active-no": "ना",
+       "tags-hitcount": "$1 {{PLURAL:$1|बदल}}",
        "htmlform-title-not-exists": "$1 अस्तित्वांत ना.",
        "logentry-delete-delete": "$1 {{GENDER:$2|काडून उडयल्ले पान}} $3",
+       "logentry-delete-restore": "$1 हाणें {{GENDER:$2|परत हाडलां}} पान $3 ($4)‎",
+       "logentry-delete-revision": "$1 हाणें {{PLURAL:$5|उजळणेचें}} दिसणे  $3, ह्या पानार {{GENDER:$2|बदल्ला}}: $4‎",
+       "revdelete-content-hid": "मजकूर लिपयला",
        "logentry-move-move": "$1 हाणें $3 पानाक $4 {{GENDER:$2|हालयला}}",
+       "logentry-move-move-noredirect": "$1, हाणें पान $3 सावन $4 {{GENDER:$2|हालयलां}} पुनर्देर्शन दवरिनासतानां",
+       "logentry-move-move_redir": "$1 हाणें पान $3 सावन $4 {{GENDER:$2||हालयल्लो}} पुनर्दिशनावयर",
+       "logentry-patrol-patrol-auto": "$1-आन $3, ह्या पानाचें $4, ह्या उजळणेचो पारो केलां म्हण आपोआप {{GENDER:$2|खुणायलां}}",
        "logentry-newusers-create": "उपयोगकत्याचें $1 {{GENDER:$2|तयार केलें}}",
+       "logentry-newusers-autocreate": "वापरप्याचें खातें $1 आपोआप {{GENDER:$2|रचून}} आयलें",
        "logentry-upload-upload": "$1 {{GENDER:$2|अपलोड केला}} $3",
+       "logentry-upload-overwrite": "$1, हाणें $3‎, हाची एक नवी आवृत्ती {{GENDER:$2|अपलोड केलां}}",
        "searchsuggest-search": "{{SITENAME}} सोद",
+       "duration-days": "$1 {{PLURAL:$1|दीस}}",
        "special-characters-group-latin": "रोमी",
        "special-characters-group-latinextended": "रोमी (आनिंक-उइ)",
        "special-characters-group-ipa": "IPA",
        "special-characters-group-khmer": "ख्मेर",
        "mw-widgets-dateinput-no-date": "तारीख निवडूंक ना",
        "mw-widgets-dateinput-placeholder-day": "वर्स-म्हयनो-दीस",
-       "mw-widgets-dateinput-placeholder-month": "वर्स-म्हयनो"
+       "mw-widgets-dateinput-placeholder-month": "वर्स-म्हयनो",
+       "randomrootpage": "खयंचेंय मूळ पान"
 }
index 9f1f706..6832f35 100644 (file)
        "anoneditwarning": "<strong>Chotrai:</strong> Tuven sotrorombh korunk nai. Tu bodol korit zalear tuzo IP pot'to soglleank polleunk zatelem. Tu <strong>[$1 sotrorombh korit]</strong> vo <strong>[$2 kont rochit]</strong> zalear, tuje bodol tuzo vaporpeachem nanvak zoddteleo ani anik-ui faide asat.",
        "missingcommenttext": "Upkar korun tuzo xero boroi.",
        "blockedtitle": "Vapurpeak addaila",
-       "blockedtext": "<strong>Tujem vaporpeachem nanv vo IP pot'to addavpant aila.</strong>\n\nAddavop $1 hannem kelam.\nKaronn dilam tem <em>$2</em>.\n\n* Addavpachi survat: $8\n* Addavop sompovpacho vell: $6\n* Addavpak ievjila: $7\n\nTujean $1-ak vo dusrea [[{{MediaWiki:Grouppage-sysop}}|karbhariak]] addavnne bodol bhasabhas korunk sompork korunk zata. Tujean \"{{int:emailuser}}\" sobhavgunn vaprunk zaina kheriz ek void email pot'to tujea [[Special:Preferences|khatem posontint]] nischit kelea xivai ani tuka tem vaporpak addavnk na zalear. Tuzo chalont IP pot'to asa $3, ani addavnnecheo ank #$5 asa. Soglleo voileo bariksanno tum kortai tea vicharant somavex kor.",
+       "blockedtext": "<strong>Tujem vaporpeachem nanv vo IP pot'to addavpant aila.</strong>\n\nAddavop $1 hannem kelam.\nKaronn dilam tem <em>$2</em>.\n\n* Addavpachi survat: $8\n* Addavop sompovpacho vell: $6\n* Addavpak ievjila: $7\n\nTujean $1-ak vo dusrea [[{{MediaWiki:Grouppage-sysop}}|karbhariak]] addavnne vixim bhasabhas korunk sompork korunk zata. Tujean \"{{int:emailuser}}\" sobhavgunn vaprunk zaina kheriz ek void email pot'to tujea [[Special:Preferences|khatem posontint]] nischit kelea xivai ani tuka tem vaporpak addavnk na zalear. Tuzo chalont IP pot'to asa $3, ani addavnnecheo ank #$5 asa. Soglleo voileo bariksanno tum kortai tea vicharant somavex kor.",
        "blockednoreason": "Kainch karonn diunk na",
        "loginreqtitle": "Sotrorombh gorjechem",
        "loginreqlink": "sotrorombh kor",
        "accmailtitle": "Gupitutor dhaddlea",
        "newarticle": "(Novem)",
        "newarticletext": "Tuven ek duveche patlav kelai, zachem pan azun rochunk na.\nPan rochunk, khallchea chovkottan boroi (anik mahitik [$1 adar pan] polloi).\nTu hangasor chukin pavlai zalear tujea internet browser-achi <strong>Fatim</strong> vo <strong>Back</strong> butao dab.",
-       "anontalkpagetext": "----\n<em>Hem bhasabhasechem pan ek ninami vaporpeak zannem ozun ek khatem ugddunk na, vo to tem vaporna.</em>\nHea khatir amkam ankddeancho IP pot'to vaprunk podta taka vollkhunk.\nToslo IP pot'to sabar vaporpeamni vaprum ieta.\nTum zor ek ninami vaporpi asa ani tuka dista ki sombondit xere tuje vixim keleat, upkar korun [[Special:CreateAccount|ek khatem roch]] vo [[Special:UserLogin|log in]] fuddle guspop ninami vaporpeanchem tallunk.‎",
+       "anontalkpagetext": "----\n<em>Hem bhasabhasechem pan ek ninami vaporpeak zannem ozun ek khatem ugddunk na, vo to tem vaporna.</em>\nHea khatir amkam ankddeancho IP pot'to vaprunk podta taka vollkhunk.\nToslo IP pot'to sabar vaporpeamni vaprum ieta.\nTum zor ek ninami vaporpi asa ani tuka dista ki tukam sombond naslele xere tuje vixim keleat, upkar korun [[Special:CreateAccount|ek khatem roch]] vo [[Special:UserLogin|sotrarombh kor]] fuddle guspop ninami vaporpeanchem tallunk.‎",
        "noarticletext": "Sodheak hem pan ritem asa.\nTujean dusrea panani [[Special:Search/{{PAGENAME}}|hea panache nanv sodunk zata]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sombondhi sotrani sodunk zata], vo [{{fullurl:{{FULLPAGENAME}}|action=edit}} hem pan rochunk zata]</span>.",
        "noarticletext-nopermission": "Sodheak hem pan ritem asa.\nTujean dusrea panani [[Special:Search/{{PAGENAME}}|hea panache nanv sodunk zata]], vo <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sombondhi sotrani sodunk zata], pun tuka hem pan rochunk porvangi na.",
        "userpage-userdoesnotexist-view": "\"$1\" hea vapurpeachea khateachi nondnni korunk na.",
-       "clearyourcache": "<strong>Note:</strong> Samball’llea uprant, tuka ghoddiek tujea browseracho cache koddsoravnk poddot bodol pollonvche khatir.\n* <strong>Firefox / Safari:</strong> <em>Shift</em> dhor <em>Reload</em> klik kortana, vo dam <em>Ctrl-F5</em> vo <em>Ctrl-R</em> (<em>⌘-R</em> Mac-acher)\n* <strong>Google Chrome:</strong> <em>Ctrl-Shift-R</em> dam (<em>⌘-Shift-R</em> eka Mac-acher)\n* <strong>Internet Explorer:</strong> <em>Ctrl</em> dhor <em>Refresh</em> klik kortana, vo dam <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Hanga voch: <em>Menu → Settings</em> (<em>Opera → Preferences</em> Mac-acher) ani uprant <em>Privacy & security → Clear browsing data → Cached images and files</em>.‎",
+       "clearyourcache": "<strong>Chotrai:</strong> Samball’llea uprant, tuka ghoddiek tujea browseracho cache koddsoravnk poddot bodol pollonvche khatir.\n* <strong>Firefox / Safari:</strong> <em>Shift</em> dhor <em>Reload</em> klik kortana, vo dam <em>Ctrl-F5</em> vo <em>Ctrl-R</em> (<em>⌘-R</em> Mac-acher)\n* <strong>Google Chrome:</strong> <em>Ctrl-Shift-R</em> dam (<em>⌘-Shift-R</em> eka Mac-acher)\n* <strong>Internet Explorer:</strong> <em>Ctrl</em> dhor <em>Refresh</em> klik kortana, vo dam <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Hanga voch: <em>Menu → Settings</em> (<em>Opera → Preferences</em> Mac-acher) ani uprant <em>Privacy & security → Clear browsing data → Cached images and files</em>.‎",
        "previewnote": "<strong>Hem fokot ek zholok mhonn ugddas dhor.</strong>\nTuje bodol azun sambhallun dovrunk nant!",
        "continue-editing": "Sompadon korpachea zagear voch",
        "editing": "Sompadon kortai: $1",
        "editundo": "kel'lem portavchem",
        "diff-empty": "(Kaim forok na)‎",
        "diff-multi-sameuser": "(Heach vaporpean {{PLURAL:$1|kel'lo modlo ek bodol dakhounk na|kel'le modle $1 bodol dakhounk nan}})",
-       "diff-multi-otherusers": "({{PLURAL:$1|Ek modli uzollnni|$1 modleo uzollnneo}} {{PLURAL:$2|ek her vaporpi|$2 her vaporpi}}, hache vorvim dakhovnk na)‎",
+       "diff-multi-otherusers": "({{PLURAL:$2|Ek her vaporpea|$2 her vaporpeam}} vorvim {{PLURAL:$1|ek modli uzollnni|$1 modleo uzollnneo}} dakhovnk na)",
        "searchresults": "Sodache porinaman",
        "searchresults-title": "\"$1\" -khatir sodache porinaman",
        "prevn": "adlem {{PLURAL:$1|$1}}",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|nove pananchi suchi]]-ui polloi)",
        "rcfilters-tag-remove": "'$1' kadd",
        "rcfilters-legend-heading": "<strong>Sonkxepachi volleri:</strong>",
+       "rcfilters-group-results-by-page": "Pana pormonnem pongddache porinnam",
        "rcfilters-activefilters": "Kriaxil challnneo",
        "rcfilters-activefilters-hide": "Lipoi",
        "rcfilters-activefilters-show": "Dakhoi",
        "rcfilters-savedqueries-unsetdefault": "Default aslolem kaddun uddoi",
        "rcfilters-savedqueries-remove": "Kadun udoi",
        "rcfilters-savedqueries-new-name-label": "Nanv",
+       "rcfilters-savedqueries-new-name-placeholder": "Challnnecho hetu vornnon kor",
        "rcfilters-savedqueries-apply-label": "Challnni roch",
+       "rcfilters-savedqueries-apply-and-setdefault-label": "Default challnni roch",
        "rcfilters-savedqueries-cancel-label": "Rod'd kor",
        "rcfilters-savedqueries-add-new-title": "Chalont challnnechi manddavoll samball",
        "rcfilters-savedqueries-already-saved": "Heo challnneo adinch samball’lloleo asat. Ek novi Samball’lloli Challnni rochunk, tujeo manddavolleo bodol.",
        "rcfilters-filterlist-feedbacklink": "Hea challnnechea avtam vixim tuka kitem dista tem amkam sang",
        "rcfilters-highlightmenu-title": "Ek rong vinch",
        "rcfilters-filterlist-noresults": "Kosleoch challnneo mellunk nant",
+       "rcfilters-state-message-fullcoverage": "Hea pongddantle soglleo challnneo vinchop mhonnche kainch vinchop na, hea khatir he challnnek kainch porinnam na. Pongddant  hacho somavex asa: $1",
        "rcfilters-filtergroup-authorship": "Iogdanachem borovp",
        "rcfilters-filter-editsbyself-label": "Tuven kel'leo bodol",
        "rcfilters-filter-editsbyself-description": "Tujeo svotacheo yogdanam.",
        "rcfilters-filter-editsbyother-label": "Dusreanim kel'le bodol",
        "rcfilters-filter-editsbyother-description": "Tuje khas bhairavn, soglle bodol",
        "rcfilters-filtergroup-user-experience-level": "Vaporpeachi nondnni ani onnbhov",
+       "rcfilters-filter-user-experience-level-registered-label": "Nondnni kelolem",
        "rcfilters-filter-user-experience-level-registered-description": "Sotrarombh zalole sompadok.",
+       "rcfilters-filter-user-experience-level-unregistered-label": "Nondnni korunk naslolem",
+       "rcfilters-filter-user-experience-level-unregistered-description": "Sompadok je sotrarombhit nant.",
        "rcfilters-filter-user-experience-level-learner-label": "Xikpi",
+       "rcfilters-filter-user-experience-level-learner-description": "Nondnni kelole sompadok zancho onnubhov \"Nove ievpi\" ani \"Onnbhovi vaporpi\" modem urta.",
        "rcfilters-filter-user-experience-level-experienced-label": "Onnbhovi vaporpi",
+       "rcfilters-filter-user-experience-level-experienced-description": "500 odik sompadon ani 30 disanchem kario aslolem nondnni kelolem sompadok.",
        "rcfilters-filtergroup-automated": "Apoap zalolem iogdan",
        "rcfilters-filter-bots-label": "Robot",
        "rcfilters-filter-bots-description": "Apoap avtamni kelolem sompadon",
        "rcfilters-filter-humans-description": "Monxani kelolem sompadon",
        "rcfilters-filter-reviewstatus-unpatrolled-description": "Paro kela mhonn hatan vo apoap khunnavnk naslolem sompadon.",
        "rcfilters-filter-reviewstatus-unpatrolled-label": "Paro korunk naslolem",
+       "rcfilters-filter-reviewstatus-manual-description": "Sompadon zaka paro kelam mhonn hatan khunnailam.",
+       "rcfilters-filter-reviewstatus-manual-label": "Hatan paro korpant ailolem",
+       "rcfilters-filter-reviewstatus-auto-label": "Apoap paro korpant ailolem",
        "rcfilters-filtergroup-significance": "Mhotv",
        "rcfilters-filter-minor-label": "Dhakte bodol",
        "rcfilters-filter-minor-description": "Borovpean dhaktem mhonn khunne chitt kelolem sompadon",
        "rcfilters-filter-major-description": "Dhaktem mhonn khunne chitt korunk naslolem sompadon",
        "rcfilters-filtergroup-watchlist": "Sadurvollerintlim panam",
        "rcfilters-filter-watchlist-watched-label": "Sadurvollerintlim",
+       "rcfilters-filter-watchlist-watched-description": "Tujea Sadurvollerichea panamche bodol.",
        "rcfilters-filter-watchlist-watchednew-label": "Sadurvolleriche nove bodol",
        "rcfilters-filter-watchlist-watchednew-description": "Bodol ghoddleat ten’na savn tuvem bhett divnk nant tea sadurvollerintlim panache bodol.",
-       "rcfilters-filter-watchlist-notwatched-label": "Sadurvollerintlim nhoi",
+       "rcfilters-filter-watchlist-notwatched-label": "Sadurvollerint na",
        "rcfilters-filter-watchlist-notwatched-description": "Sadurvollerichim panank bodol soddun her sogllem.",
        "rcfilters-filtergroup-watchlistactivity": "Sadurvollerichem kario",
        "rcfilters-filter-watchlistactivity-unseen-label": "Pollovnk naslole bodol",
        "rcfilters-view-tags": "Khunnechittichem sompadon",
        "rcfilters-view-tags-tooltip": "Sompadonacheo khunne chitti vaprun porinnam chall",
        "rcfilters-view-tags-help-icon-tooltip": "Khunnechittichem sompadona babtint odik xikun ghe",
+       "rcfilters-liveupdates-button-title-off": "Nove bodol ghoddtta ten’na dakhol kor",
        "rcfilters-watchlist-markseen-button": "Soglle bodol polleleat mhonn khunnai.",
+       "rcfilters-watchlist-edit-watchlist-button": "Nodor dovorlolea panachi volleri sompadon kor",
        "rcfilters-watchlist-showupdated": "Bodol zal'leak savn je panank tuvem bhett dinvk na, te bodol <strong>datt</strong> okxoramni, ani ghott khunnamni dileat.",
+       "rcfilters-filter-showlinkedfrom-option-label": "Vinchlolea panant <strong>savn zulltat tim panam</strong>",
        "rcfilters-filter-showlinkedto-label": "Panak zoddtat tea panache bodol dakhoi",
+       "rcfilters-filter-showlinkedto-option-label": "Vinchlolea panak <strong>zulltat tim pana</strong>",
        "rcfilters-target-page-placeholder": "Ek panache nanv ( vo vorg) ghal",
        "rcnotefrom": "Sokoil <strong>$3, $4<strong> savn {{PLURAL:$5|zalelem bodol dilam|zalelem bodol dileant}} (<strong>$1<strong> meren {{PLURAL:$5|dakhoilam|dakhoileant}}).",
        "rclistfrom": "$3 $2 savn suru zatelim nove bodol dakhoi",
        "filehist-comment": "Xero",
        "imagelinks": "Faylicho vapor",
        "linkstoimage": "{{PLURAL:$1|Hem pan|$1 Him panam}} hi fayl {{PLURAL:$1|vaporta|vaportat}}:",
-       "linkstoimage-more": "$1 poros odik {{PLURAL:$1|pan vaporta|panam vaporta}} hi fayl.\nSokoili volleri dakhoita {{PLURAL:$1|poilem pan|poilim $1 panam}} jem hich fayl vaporta. Ek [[Special:WhatLinksHere/$2|purnn volleri]] uplobdh asa.‎",
+       "linkstoimage-more": "$1 poros odik {{PLURAL:$1|pan vaporta|panam vaportat}} hi fayl.\nSokoili volleri dakhoita {{PLURAL:$1|poilem pan|poilim $1 panam}} jem hich fayl vaporta. Ek [[Special:WhatLinksHere/$2|purnn volleri]] uplobdh asa.‎",
        "nolinkstoimage": "Hea faylik vaportat toslim panam nant",
        "linkstoimage-redirect": "$1 (fayl punornirdexon) $2",
        "sharedupload-desc-here": "Hi fayl $1, hachi ani dusrea prokolpanim hachem upeog korunk zata.\nHachem [$2 faylichem vivron panan] asleli vivron khala dilea:",
        "change-blocklink": "Addavnnni bodol",
        "contribslink": "yogdan",
        "blocklogpage": "addavnnechem sotr",
-       "blocklogentry": "[[$1]] addailelem $2 asun vellacho ont: $3",
+       "blocklogentry": "[[$1]] ak addaila, itlea vellak: $2, karonn: $3",
        "reblock-logentry": "addavpachem bosovp bodol’lam [[$1]] hache khatir sompovpacho vell dila $2 $3‎",
        "block-log-flags-nocreate": "Khatem rochop opatr kelam",
        "proxyblocker": "Protinidhi-sirvidor addavpi‎",
index 3cb79ca..7d6edd0 100644 (file)
        "nstab-template": "Clowan",
        "nstab-help": "Duillag choonee",
        "nstab-category": "Ronney",
+       "mainpage-nstab": "Ard-ghuillag",
        "nosuchaction": "Cha nel lheid yn obbyr ayn",
        "nosuchspecialpage": "Cha nel y duillag er lheh shoh ayn",
        "error": "Marranys",
        "virus-scanfailed": "vrish y ronsaght (coad $1)",
        "virus-unknownscanner": "ronseyder noi-veerys gyn enney",
        "yourname": "Dt'ennym ymmydeyr:",
+       "userlogin-yourname": "Ennym ymmydeyr",
+       "userlogin-yourname-ph": "Screeu ennym ymmydeyr",
        "yourpassword": "Fockle yn arrey:",
+       "userlogin-yourpassword": "Fockle yn arrey",
        "yourpasswordagain": "Aascreeu dt'ockle arrey:",
        "login": "Log stiagh",
        "nav-login-createaccount": "Log stiagh / croo coontys",
        "notloggedin": "Cha nel ou loggit stiagh",
        "createaccount": "Croo coontys",
        "createaccountmail": "Croo fockle arrey shallidagh gyn tort as cur eh da'n post-l reiht ayd",
+       "createacct-benefit-body2": "{{PLURAL:$1|duillag|duillagyn}}",
        "loginerror": "Marranys loggal stiagh",
        "createaccounterror": "Cha nod shin croo coontys: $1",
        "noname": "Cha honree uss ennym ymmydeyr fondagh.",
        "note": "'''Note:'''",
        "previewnote": "'''Cooinnee nagh vel agh roie-haishbynys eh shoh;\ncha nel dty chaghlaaghyn sauailt foast!'''",
        "editing": "Reaghey $1",
+       "creating": "Croo $1",
        "editingsection": "Reaghey $1 (rheynn)",
        "editingcomment": "Reaghey $1 (meer noa)",
        "yourtext": "Dty heks",
        "action-browsearchive": "duillagyn scrysst y ronsaghey",
        "action-undelete": "yn duillag shoh y yee-scryssey",
        "nchanges": "$1 {{PLURAL:$1|caghlaa|chaghlaa|chaghlaa|caghlaaghyn}}",
+       "enhancedrc-history": "skeeal",
        "recentchanges": "Caghlaaghyn s'noa",
        "recentchanges-legend": "Reihyssyn da ny caghlaaghyn s'noa",
        "recentchanges-summary": "Shirr ny caghlaaghyn s'noa da'n wiki er y duillag shoh.",
        "specialpages-group-other": "Duillagyn elley er lheh",
        "specialpages-group-login": "Log stiagh / croo coontys",
        "specialpages-group-users": "Ymmydeyryn as kiartyn",
+       "tags-active-yes": "Ta",
+       "tags-active-no": "Cha nel",
        "tags-edit": "reaghey",
        "rightsnone": "(veg)",
        "searchsuggest-search": "Ronsaghey",
index 6480a93..85c86ad 100644 (file)
@@ -87,6 +87,7 @@
        "tog-useeditwarning": "הצגת אזהרה בעת עזיבת דף עריכה עם שינויים שטרם נשמרו",
        "tog-prefershttps": "תמיד להשתמש בתקשורת מאובטחת לאחר הכניסה לחשבון",
        "tog-showrollbackconfirmation": "הצגת הודעת אישור לאחר לחיצה על קישור \"שחזור\"",
+       "tog-requireemail": "דרישת דואר אלקטרוני כדי לאפס סיסמה",
        "underline-always": "תמיד",
        "underline-never": "לעולם לא",
        "underline-default": "ברירת המחדל של העיצוב או של הדפדפן",
        "content-model-css": "CSS",
        "content-json-empty-object": "אובייקט ריק",
        "content-json-empty-array": "מערך ריק",
-       "unsupported-content-model": "<strong>אזהרה:</strong> מודל התוכן $1 אינו נתמך בוויקי הזה.",
-       "unsupported-content-diff": "×\94ש×\95×\95×\90×\95ת ×\90×\99× ×\9f × ×ª×\9e×\9b×\95ת במודל התוכן $1.",
-       "unsupported-content-diff2": "×\94ש×\95×\95×\90×\95ת ×\91×\99×\9f ×\9e×\95×\93×\9c ×\94ת×\95×\9b×\9f $1 ×\9c×\91×\99×\9f ×\9e×\95×\93×\9c $2 ×\90×\99× ×\9f × ×ª×\9e×\9b×\95ת ×\91וויקי הזה.",
+       "unsupported-content-model": "<strong>×\90×\96×\94ר×\94:</strong> ×\9e×\95×\93×\9c ×\94ת×\95×\9b×\9f $1 ×\90×\99× ×\95 × ×ª×\9e×\9a ×\91×\90תר ×\94×\95×\95×\99ק×\99 ×\94×\96×\94.",
+       "unsupported-content-diff": "×\94ש×\95×\95×\90×\94 ×\91×\99×\9f ×\92רס×\90×\95ת ×\90×\99× ×\94 × ×ª×\9e×\9bת במודל התוכן $1.",
+       "unsupported-content-diff2": "×\94ש×\95×\95×\90×\94 ×\91×\99×\9f ×\92רס×\90×\95ת ×\9e×\9e×\95×\93×\9c ×\94ת×\95×\9b×\9f $1 ×\9c×\92רס×\90×\95ת ×\9e×\9e×\95×\93×\9c ×\94ת×\95×\9b×\9f $2 ×\90×\99× ×\94 × ×ª×\9e×\9bת ×\91×\90תר ×\94וויקי הזה.",
        "deprecated-self-close-category": "דפים שמשתמשים בתגיות HTML עם סגירה עצמית בלתי־תקינה",
        "deprecated-self-close-category-desc": "הדף מכיל תגיות HTML עם סגירה עצמית בלתי־תקינה, כגון <code dir=\"ltr\">&lt;b/></code> או <code dir=\"ltr\">&lt;span/></code>. ההתנהגות של תגיות אלה תשתנה בקרוב לצורך תאימות עם מפרט HTML5, ולכן יש להימנע משימוש בהן בקוד ויקי.",
        "duplicate-args-warning": "<strong>אזהרה:</strong> [[:$1]] קורא לדף [[:$2]] עם יותר מערך אחד עבור הפרמטר \"$3\". ייעשה שימוש רק בערך האחרון.",
        "undo-norev": "לא ניתן היה לבטל את העריכה כי היא אינה קיימת או כי היא נמחקה.",
        "undo-nochange": "נראה שהעריכה כבר בוטלה.",
        "undo-summary": "ביטול גרסה $1 של [[Special:Contributions/$2|$2]] ([[User talk:$2|שיחה]])",
+       "undo-summary-anon": "ביטול גרסה $1 של [[Special:Contributions/$2|$2]]",
        "undo-summary-username-hidden": "ביטול גרסה $1 של משתמש מוסתר",
        "cantcreateaccount-text": "אפשרות יצירת החשבונות מכתובת ה־IP הזאת (<strong>$1</strong>) נחסמה על־ידי [[User:$3|$3]].\n\nהסיבה שניתנה על־ידי $3 היא: <em>$2</em>",
        "cantcreateaccount-range-text": "אפשרות יצירת החשבונות מכתובות IP בתוך הטווח <strong>$1</strong>, כולל כתובת ה־IP שלך (<strong>$4</strong>), נחסמה על־ידי [[User:$3|$3]].\n\nהסיבה שניתנה על־ידי $3 היא: <em>$2</em>",
        "prefs-help-email": "כתובת דואר אלקטרוני היא אופציונלית, אבל היא חיונית לאיפוס הסיסמה במקרה ש{{GENDER:|תשכח|תשכחי}} אותה.",
        "prefs-help-email-others": "באפשרותך גם לאפשר למשתמשים ליצור איתך קשר באמצעות דוא\"ל דרך קישור בדף המשתמש או בדף השיחה שלך.\nכתובת הדוא\"ל שלך לא תיחשף כשמשתמשים יצרו איתך קשר.",
        "prefs-help-email-required": "כתובת דואר אלקטרוני נדרשת לכתיבה באתר.",
+       "prefs-help-requireemail": "אם אפשרות זו סומנה, האתר ישלח הודעת דוא\"ל המאפשרת את איפוס הסיסמה רק לאחר שמי שביקש אותה יספק גם את שם המשתמש וגם את כתובת הדוא\"ל של החשבון הזה.",
        "prefs-info": "מידע בסיסי",
        "prefs-i18n": "בינאום",
        "prefs-signature": "חתימה",
        "backend-fail-contenttype": "לא ניתן היה לקבוע את סוג התוכן של הקובץ לאחסון ב־\"$1\".",
        "backend-fail-batchsize": "למאגר אחסון הקבצים הפנימי הועבר אוסף של {{PLURAL:$1|פעולת קובץ אחת|$1 פעולות קובץ}}; המגבלה היא {{PLURAL:$2|פעולה אחת|$2 פעולות}}.",
        "backend-fail-usable": "קריאת או כתיבת הקובץ \"$1\" לא הצליחה כיוון שההרשאות אינן מספיקות או כיוון שהספריות/המכלים חסרים.",
-       "backend-fail-stat": "×\9c×\90 ×\94×\99×\94 ×\90פשר ×\9cקר×\95×\90 ×\90ת ×\94×\9eצ×\91 ×©×\9c ×\94ק×\95×\91×¥ \"$1\".",
-       "backend-fail-hash": "×\9c×\90 ×\94×\99×\94 ×\90פשר ×\9c×\94×\97×\9c×\99×\98 ×\9e×\94×\95 ×\92×\99×\91×\95×\91 ×\94×\94צפנ×\94 ×©×\9c ×\94ק×\95×\91×¥ \"$1\".",
+       "backend-fail-stat": "קר×\99×\90ת ×\9eצ×\91 ×\94ק×\95×\91×¥ \"$1\" ×\9c×\90 ×\94צ×\9c×\99×\97×\94.",
+       "backend-fail-hash": "×\9eצ×\99×\90ת ×¢×¨×\9a ×\94×\92×\99×\91×\95×\91 ×\94קר×\99פ×\98×\95×\92רפ×\99 ×©×\9c ×\94ק×\95×\91×¥ \"$1\" ×\9c×\90 ×\94צ×\9c×\99×\97×\94.",
        "filejournal-fail-dbconnect": "לא ניתן היה להתחבר לבסיס הנתונים של היומן עבור מאגר אחסון הקבצים הפנימי \"$1\".",
        "filejournal-fail-dbquery": "לא ניתן היה לעדכן את בסיס הנתונים של היומן עבור מאגר אחסון הקבצים הפנימי \"$1\".",
        "lockmanager-notlocked": "פתיחת הנעילה של \"$1\" לא הצליחה; הוא לא נעול.",
        "alreadyrolled": "לא ניתן לשחזר את העריכה של [[User:$2|$2]] ([[User talk:$2|שיחה]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) בדף [[:$1]];\nהדף כבר נערך או שוחזר.\n\nהעריכה האחרונה הייתה של [[User:$3|$3]] ([[User talk:$3|שיחה]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "תקציר העריכה היה: <em>$1</em>.",
        "revertpage": "שוחזר מעריכות של [[Special:Contributions/$2|$2]] ([[User talk:$2|שיחה]]) לעריכה האחרונה של [[User:$1|$1]]",
+       "revertpage-anon": "שוחזר מעריכות של [[Special:Contributions/$2|$2]] לעריכה האחרונה של [[User:$1|$1]]",
        "revertpage-nouser": "שוחזר מעריכות של משתמש מוסתר לעריכה האחרונה של {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "שוחזר מעריכות של {{GENDER:$3|$1}}\nלעריכה האחרונה של {{GENDER:$4|$2}}.",
        "sessionfailure-title": "בעיה בחיבור",
        "ipblocklist-legend": "מציאת משתמש חסום",
        "blocklist-userblocks": "הסתרת חסימות של משתמשים רשומים",
        "blocklist-tempblocks": "הסתרת חסימות זמניות",
+       "blocklist-indefblocks": "הסתרת חסימות בלתי מוגבלות בזמן",
        "blocklist-addressblocks": "הסתרת חסימות של כתובות IP בודדות",
        "blocklist-type": "סוג:",
        "blocklist-type-opt-all": "הכול",
index 37106e5..15645e3 100644 (file)
@@ -99,6 +99,7 @@
        "tog-useeditwarning": "Figyelmeztessen, ha szerkesztéskor a módosítások mentése nélkül akarom elhagyni a lapot",
        "tog-prefershttps": "Mindig biztonságos kapcsolatot használjon, amikor be vagyok jelentkezve",
        "tog-showrollbackconfirmation": "Megerősítés kérése, amikor a visszaállítás linkre kattintasz",
+       "tog-requireemail": "E-mail-cím megkövetelése jelszó-visszaállításkor",
        "underline-always": "mindig",
        "underline-never": "soha",
        "underline-default": "Felület és böngésző alapértelmezése szerint",
        "prefs-help-email": "Az e-mail-cím megadása nem kötelező, de szükséges új jelszó kéréséhez, ha elfelejtenéd a meglévőt.",
        "prefs-help-email-others": "Úgy is dönthetsz, hogy lehetővé teszed mások számára, hogy kapcsolatba lépjenek veled a felhasználói vagy vitalapodon keresztül, anélkül, hogy fel kellene fedned a személyazonosságodat.",
        "prefs-help-email-required": "Meg kell adnod az e-mail címedet.",
+       "prefs-help-requireemail": "Amennyiben bekapcsolod, csak akkor küldünk jelszó-visszaállító e-mailt, ha az ezt kérő személy helyesen megadja a fiók szerkesztői nevét és e-mail-címét.",
        "prefs-info": "Alapinformációk",
        "prefs-i18n": "Nyelvi beállítások",
        "prefs-signature": "Aláírás",
        "ipblocklist-legend": "Blokkolt felhasználó keresése",
        "blocklist-userblocks": "Fiókblokkolások elrejtése",
        "blocklist-tempblocks": "Ideiglenes blokkolások elrejtése",
+       "blocklist-indefblocks": "Végtelen blokkolások elrejtése",
        "blocklist-addressblocks": "IP-címek blokkolásainak elrejtése",
        "blocklist-type": "Típus:",
        "blocklist-type-opt-all": "Összes",
index 28cbba6..8c805bf 100644 (file)
        "block-expiry": "Expiro:",
        "block-options": "Plusa agadi:",
        "block-reason": "Motivo:",
+       "block-target": "Nomo od IP-adreso dil uzero:",
        "unblockip": "Desblokusar uzero",
        "unblockiptext": "Uzez la sequanta formularo por restaurar la skribo-aceso ad IP-adreso qua blokusesis antee.",
        "ipusubmit": "Desblokusar",
        "movepagetext": "Uzante ica formularo onu povas rinomizar pagino, movante olua omna versionaro ad la nova titulo.\nLa antea titulo konvertesos a ridirektilo a la nova titulo.\nLa ligili a la antea titulo dil pagino ne chanjesos.\nVoluntez certigar ke ne esas [[Special:DoubleRedirects|duopla]] o [[Special:BrokenRedirects|ruptota ridirektili]].\nVu responsas ke la ligili duros direktante a la pagino korespondanta.\n\nMemorez ke la pagino '''ne''' rinomizesos se ja existus pagino kun la nova titulo, eceptuante ke la pagino esas vakua o ridirektilo sen versionaro.\nIco signifikas ke vu povos rinomizar pagino a olua originala titulo se eroras skribante la nova titulo, ma ne povos riskribar existanta pagino.\n\n'''EGARDEZ!'''\nIca povas esar drastika chanjo e ne-esperinda por populara pagino;\nvoluntez certigar ke vu komprenas la konsequi qui eventos ante durar adavane.",
        "movepagetext-noredirectfixer": "Uzar la formulario infre rinomizos la pagino, e tota lua historio-listo a la nova nomo.\nL'anciena titulo ridirektesos a la nova titulo.\nVerifikez la [[Special:DoubleRedirects|duopla]] e/o la [[Special:BrokenRedirects|krevita ridirekti]].\n<strong>Esas vua responso verifikar se omna ligili esas korekta.</strong>\n\nVidez ke la pagino <strong>ne rinomizesos se existar pagino kun la sama titulo</strong>, ecepte se ol ridirektesas a la prezenta pagino e ne havas pasinta historio pri redaktado.\nTo signifikas ke vu povas retroe rinomizar pagino a lua antea nomo se ol rinomizesis erore, e ke vu ne povas supresar existanta pagino per ridirektado di altra pagino.\n\n<strong>Atencez:</strong>\nLa rinomizo povas esar drastika chanjo por pagini qui esas populara;\nhavez klara certezo pri la konsequi di la posibla rinomizo di la pagino, ante facar ol!",
        "movepagetalktext": "Se vu markizos ca buxo, la diskuto-pagino asociita anke modifikesos a la nova titulo, ecepte se diskuto-pagino nevakua ja existar ibe.\n\nCakaze, vu propra mustos movar la diskuto-pagino o mixar la du texti, se vu deziros.",
-       "movecategorypage-warning": "<strong>Atencez:</strong> Vu balde rinomizos pagino di \"KATEGORIO\". Nur la titulo di la kategorio chanjesos, ma <em>nula pagino kategoriizita segun l'anciena kategorio</em> modifikesos automatale por la nova kategorio.",
+       "movecategorypage-warning": "<strong>Atencez:</strong> Vu balde rinomizos pagino pri \"KATEGORIO\". Nur la titulo di la kategorio chanjesos, ma <em>nula pagino kategoriizita segun l'anciena kategorio</em> modifikesos automatale por la nova kategorio.",
        "movenologintext": "Vu mustas esar registragita uzero ed [[Special:UserLogin|enirir]] por rinomizar pagino.",
        "newtitle": "Nova titulo:",
        "move-watch": "Surveyar ca pagino",
        "newimages": "Galerio di nova arkivi",
        "imagelisttext": "Infre esas listo di '''$1''' {{PLURAL:$1|arkivo|arkivi}} rangizita $2.",
        "newimages-legend": "Filtrilo",
+       "newimages-user": "IP-adreso o nomo dil uzero",
        "ilsubmit": "Serchar",
        "bydate": "per dato",
        "minutes": "{{PLURAL:$1|$1 minuto|$1 minuti}}",
index 8bd7bc0..759861d 100644 (file)
        "tog-useeditwarning": "変更を保存せずに編集画面から離れようとしたら警告",
        "tog-prefershttps": "ログインする際、常に安全な接続を使用する",
        "tog-showrollbackconfirmation": "巻き戻しリンクをクリックした際に確認画面を表示する",
+       "tog-requireemail": "パスワードの変更にはメーフアドレスが必要です",
        "underline-always": "常に付ける",
        "underline-never": "常に付けない",
        "underline-default": "外装またはブラウザーの既定値を使用",
        "nocreate-loggedin": "新しいページを作成する権限がありません。",
        "sectioneditnotsupported-title": "節単位編集はサポートされていません",
        "sectioneditnotsupported-text": "このページでは節単位編集はサポートされません。",
+       "modeleditnotsupported-title": "編集はサポートしていません",
+       "modeleditnotsupported-text": "コンテンツモデル$1の編集はサポートしていません",
        "permissionserrors": "権限エラー",
        "permissionserrorstext": "あなたにはこの操作を行う権限がありません。{{PLURAL:$1|理由}}は以下の通りです:",
        "permissionserrorstext-withaction": "あなたには「$2」を行う権限がありません。{{PLURAL:$1|理由}}は以下の通りです:",
index 243c68c..f31034c 100644 (file)
        "tog-numberheadings": "Wènèhi angkaning sesirah kanthi otomatis",
        "tog-editondblclick": "Besut kaca sarana ngeklik pindho",
        "tog-editsectiononrightclick": "Idinaké mbesut pérangan sarana klik tengen ing sesirahing pérangan",
-       "tog-watchcreations": "Wuwuh kaca gawéanku lan barkas unggahanku menyang pawawanganku",
-       "tog-watchdefault": "Wuwuh kaca lan barkas besutanku menyang pawawanganku",
-       "tog-watchmoves": "Wuwuh kaca lan barkas lih-lihanku menyang pawawanganku",
-       "tog-watchdeletion": "Wuwuh kaca lan barkas busakanku menyang pawawanganku",
-       "tog-watchuploads": "Wuwuh barkas anyar unggahanku menyang pawawanganku",
+       "tog-watchcreations": "Wuwuh kaca gawéanku lan berkas unggahanku menyang pawawanganku",
+       "tog-watchdefault": "Wuwuh kaca lan berkas besutanku menyang pawawanganku",
+       "tog-watchmoves": "Wuwuh kaca lan berkas lih-lihanku menyang pawawanganku",
+       "tog-watchdeletion": "Wuwuh kaca lan berkas busekanku menyang pawawanganku",
+       "tog-watchuploads": "Wuwuh berkas anyar unggahanku menyang pawawanganku",
        "tog-watchrollback": "Wuwuh kaca kang dakpulihaké menyang pawawanganku",
        "tog-minordefault": "Tengeri kabèh besutan minangka besutan cilik sacara baku",
        "tog-previewontop": "Deleng pratuduh sadurungé mbesut kothak",
        "tog-previewonfirst": "Delelng pratuduh nalika mbesut pisanan",
-       "tog-enotifwatchlistpages": "Kirimi aku layang-èl yèn ana kaca utawa barkas ing pawawanganku kang diowahi",
+       "tog-enotifwatchlistpages": "Kirimi aku layang-èl yèn ana kaca utawa berkas ing pawawanganku kang ingowahan",
        "tog-enotifusertalkpages": "Kirimi aku layang-èl yèn kaca parembuganku ana kang ngowahi",
-       "tog-enotifminoredits": "Uga kirimi aku layang-èl yèn ana besutan cilik ing kaca lan barkas",
+       "tog-enotifminoredits": "Uga kirimi aku layang-èl yèn ana besutan cilik ing kaca lan berkas",
        "tog-enotifrevealaddr": "Tuduhaké alamat layang-èlku ing layang wara-wara",
        "tog-shownumberswatching": "Tuduhaké cacah wong kang ngawasi",
        "tog-oldsig": "Tandha tanganmu kang wis cumawis:",
        "category-subcat-count-limited": "Kategori iki duwé {{PLURAL:$1|anak kategori|$1 anak kategori}} kaya ngisor iki.",
        "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 ngemu {{PLURAL:$1|kaca|$1 kaca}} kang kapacak ing isor 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 duwé {{PLURAL:$1|barkas|$1 barkas}} kang kapacak ing isor iki.",
+       "category-file-count": "{{PLURAL:$2|Kategori iki mung isi berkas iki.|{{PLURAL:$1|Berkas|$1 berkas}} iki ana ing jero kategori iki saka $2 gunggungé.}}",
+       "category-file-count-limited": "Kategori iki duwé {{PLURAL:$1|berkas|$1 berkas}} kang kapacak ing sor iki.",
        "listingcontinuesabbrev": "samb.",
        "index-category": "Kaca kaindhèks",
        "noindex-category": "Kaca ora kaindhèks",
-       "broken-file-category": "Kaca mawa pranala barkas rusak",
+       "broken-file-category": "Kaca mawa pranala berkas rusak",
        "categoryviewer-pagedlinks": "($1) ($2)",
        "category-header-numerals": "$1–$2",
        "about": "Bab",
        "history_short": "Sajarah",
        "history_small": "sajarah",
        "updatedmarker": "wis dianyari kawit tekaku mréné pungkasan",
-       "printableversion": "Vèrsi céthak",
+       "printableversion": "Vèrsi cithak",
        "permalink": "Pranala permanèn",
        "print": "Cithak",
        "view": "Deleng",
        "tool-link-userrights": "Owahi golongan {{GENDER:$1|panganggo}}",
        "tool-link-userrights-readonly": "Deleng golongan {{GENDER:$1|panganggo}}",
        "tool-link-emailuser": "Kirimi {{GENDER:$1|panganggo}} iki layang-é",
-       "imagepage": "Deleng kaca barkas",
+       "imagepage": "Deleng kaca berkas",
        "mediawikipage": "Deleng kaca layang",
        "templatepage": "Deleng kaca cithakan",
        "viewhelppage": "Deleng kaca pitulung",
        "portal-url": "Project:Garupa paguyuban",
        "privacy": "Niti privasi",
        "privacypage": "Project:Niti privasi",
-       "badaccess": "Aksès ora olèh",
+       "badaccess": "Masalah idin",
        "badaccess-group0": "Kowé ora kawogan ngayahi laku kang kojaluk.",
        "badaccess-groups": "Laku kang koarepi mung winates tumrap panganggo ing {{PLURAL:$2|golongan}}: $1.",
-       "versionrequired": "Dibutuhaké MediaWiki vèrsi $1",
+       "versionrequired": "Butuh MediaWiki vèrsi $1",
        "versionrequiredtext": "MediaWiki vèrsi $1 dibutuhaké kanggo nggunakaké kaca iki. Mangga mirsani [[Special:Version|kaca iki]]",
        "ok": "Oké",
        "pagetitle": "$1 - {{SITENAME}}",
        "youhavenewmessages": "{{PLURAL:$3|Kowé duwé}} $1 ($2).",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|Kowé duwé}} $1 saka {{PLURAL:$3|panganggo liya|$3 panganggo}} ($2).",
        "youhavenewmessagesmanyusers": "Kowé duwé $1 saka manéka panganggo ($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|layang anyar|999=layang anyar}}",
+       "newmessageslinkplural": "{{PLURAL:$1|siji layang anyar|999=layang anyar}}",
        "newmessagesdifflinkplural": "{{PLURAL:$1|owahan|999=owahan}} pungkasan",
        "youhavenewmessagesmulti": "Kowé éntuk layang anyar ing $1",
        "editsection": "besut",
        "nstab-media": "Kaca médhia",
        "nstab-special": "Kaca mirunggan",
        "nstab-project": "Kaca proyèk",
-       "nstab-image": "Barkas",
+       "nstab-image": "Berkas",
        "nstab-mediawiki": "Layang",
        "nstab-template": "Cithakan",
        "nstab-help": "Kaca pitulung",
        "readonly_lag": "Database wis dikunci mawa otomatis sawetara database sékundhèr lagi nglakoni sinkronisasi mawa database utama",
        "internalerror": "Masalah njero",
        "internalerror_info": "Masalah njero: $1",
-       "filecopyerror": "Ora bisa nurun barkas \"$1\" dadi \"$2\".",
+       "filecopyerror": "Ora bisa nurun berkas \"$1\" dadi \"$2\".",
        "filerenameerror": "Ora bisa ngowahi saka \"$1\" dadi \"$2\".",
-       "filedeleteerror": "Ora bisa mbusek barkas \"$1\".",
+       "filedeleteerror": "Ora bisa mbusek berkas \"$1\".",
        "directorycreateerror": "Ora bisa nggawé dirèktori \"$1\".",
        "directoryreadonlyerror": "Pérangan \"$1\" mung kena diwaca.",
        "directorynotreadableerror": "Pérangan \"$1\" ora kena diwaca.",
-       "filenotfound": "Ora bisa nemu barkas \"$1\".",
+       "filenotfound": "Ora bisa nemu berkas \"$1\".",
        "unexpected": "Biji (''nilai'') ing njabaning jangkauan: \"$1\"=\"$2\".",
        "formerror": "Masalah: Ora bisa ngirim formulir",
        "badarticleerror": "Laku iki ora bisa kalakokaké ing kaca iki.",
-       "cannotdelete": "Kaca utawa barkas \"$1\" ora bisa kobusek.\nBokmanawa kaca utawa barkasé wis dibusek wong liya.",
+       "cannotdelete": "Kaca utawa berkas \"$1\" ora bisa kobusek.\nBokmanawa kaca utawa berkasé wis dibusek wong liya.",
        "cannotdelete-title": "Ora bisa mbusek kaca \"$1\"",
        "delete-hook-aborted": "Pambusakan dibatalaké déning ''hook''.\nOra ana alesané.",
        "no-null-revision": "Ora isa nggawe revisi 'null' anyar kanggo kaca \"$1\"",
        "customcssprotected": "Kowé ora kawogan mbesut kaca CSS iki amarga ngemu setèlan pribadi panganggo liya.",
        "customjsprotected": "Kowé ora kawogan mbesut kaca JavaScript iki amarga ngemu setèlan pribadi panganggo liya.",
        "mycustomcssprotected": "Sampèyan ora duwé idin kanggo ngowah kaca CSS iki.",
+       "mycustomjsonprotected": "Kowé ora kawogan mbesut kaca JSON iki.",
        "mycustomjsprotected": "Sampèyan ora duwé idin kanggo ngowah kaca JavaScript iki.",
        "myprivateinfoprotected": "Sampèyan ora duwé idin kanggo ngowah informasi privat sampèyan.",
        "mypreferencesprotected": "Sampèyan ora duwé idin kanggo ngowah preferensi sampèyan.",
        "ns-specialprotected": "Kaca mirunggan ora bisa dibesut.",
        "titleprotected": "Irah-irahan iki direksa ora olèh digawé déning [[User:$1|$1]].\nAlesané yaiku <em>$2</em>.",
-       "filereadonlyerror": "Ora bisa ndandani barkas \"$1\" amarga panyimpenan barkas \"$2\" mung bisa diwaca.\n\nPangurus sistem kang ngunci iku njlèntrèhaké: \"$3\".",
+       "filereadonlyerror": "Ora bisa ndandani berkas \"$1\" amarga panyimpenan berkas \"$2\" mung bisa kawaca.\n\nPangurus sistem kang nggembok iku wèwèh pawadan: \"$3\".",
        "invalidtitle": "Sesirah ora trep",
        "invalidtitle-knownnamespace": "Sesirah ora trep mawa mandhala aran \"$2\" lan tulisan \"$3\"",
        "invalidtitle-unknownnamespace": "Sesirah ora trep mawa angka $1 lan tulisan \"$2\" mandhala aran kang ora kaweruhan",
        "virus-scanfailed": "''Pemindaian'' utawa ''scan'' gagal (kode $1)",
        "virus-unknownscanner": "antivirus buhbuhan:",
        "logouttext": "<strong>Kowé wis metu log.</strong>\n\nTulung gatèkaké yèn sawenèh kaca bokmanawa bakal isih katon kaya déné yèn kowé isih mlebu log, kajaba kowé mbusek telihing panglurumu.",
+       "logging-out-notify": "Kowé metu log, entèni sadhéla.",
+       "logout-failed": "Saiki ora bisa metu log: $1",
        "cannotlogoutnow-title": "Ora bisa metu saiki",
        "cannotlogoutnow-text": "Mokal metu log nalika nganggo $1.",
        "welcomeuser": "Sugeng Rawuh, $1!",
        "nosuchuser": "Ora ana panganggo mawa jeneng \"$1\".\nJeneng panganggo iku sènsitif tumrap gedhé-ciliké huruf.\nJajan priksanen pangéjamu, utawa [[Special:CreateAccount|gawénen akun anyar]].",
        "nosuchusershort": "Ora ana panganggo mawa asma \"$1\". Coba dipriksa manèh pasang aksarané (éjaané).",
        "nouserspecified": "Kowé kudu ngisi jeneng panganggo.",
-       "login-userblocked": "Panganggo iki pinalangan. Ora kena mbelu.",
+       "login-userblocked": "Panganggo iki kapenggak. Ora kena mbelu.",
        "wrongpassword": "Jenang panganggo utawa tembung wadi kang koisèkaké salah.\nMangga jajal manèh.",
        "wrongpasswordempty": "Tembung wadi kosong.\nJajalen manèh.",
        "passwordtooshort": "Tembung sesinglon paling sethithik cacahé {{PLURAL:$1|1 aksara|$1 aksara}}.",
        "noemail": "Ora ana alamat layang-èl kang kacathet tumrap ing panganggo \"$1\".",
        "noemailcreate": "Kowé kudu mènèhi alamat layang-èl kang trep",
        "passwordsent": "Tembung wadi anyar wis kinirim menyang alamat layang-èl kang kadhaftar tumrap \"$1\". \nMangga mlebu log manèh sawisé kowé nampa iku.",
-       "blocked-mailpassword": "Alamat IP-mu kablokir saka mbesut. Kanggo ngéndhani laku salah-guna, ora kena nganggo pamulih tembung wadi saka alamat IP iki.",
+       "blocked-mailpassword": "Alamat IP-mu kapenggak saka mbesut. Kanggo ngéndhani laku salah-guna, ora kena nganggo pamulih tembung wadi saka alamat IP iki.",
        "eauthentsent": "Layang-èl konfirmasi wis kinirim menyang alamat layang-èl kang koisèkaké. Sadurungé ana layang-èl liyané kang kinirim menyang akun iku, kowé kudu nututi panuntun ing layang-èl iku saperlu ngonfirmasi yèn akun iku pancèn duwèmu.",
        "throttled-mailpassword": "Layang kanggo mbalèkaké tembung wadi wis dikirim sasuwené ing {{PLURAL:$1|jam|$1 jam}}.\nKanggo nyegah ananing tumindhak culika, namung sak layang kanggo mbalèkaké tembung wadi kang bakal dikirim sasuwéné ing {{PLURAL:$1|jam|$1 jam}}.",
        "mailerror": "Masalah pangirim layang: $1",
-       "acct_creation_throttle_hit": "Para neneka menyang wiki iki kang nganggo alamat IP-né panjenengan wis gawé {{PLURAL:$1|akun cacah 1|akun cacah $1}} sajeroné $2 pungkasan, kang cacahé nyandhak cacah maksimum kang diidinaké.\nTemahané, para neneka kang nganggo alamat IP iki ora bisa gawé akun manèh sauntara iki.",
-       "emailauthenticated": "Alamat layang-èlé panjenengan wis dikonfirmasi ing tanggal $2 pukul $3.",
-       "emailnotauthenticated": "Alamat layang-èlé panjenengan durung dikonfirmasi.\nLayang-èl ora bakal dikirim yèn gegayutan karo fitur-fitur iki.",
-       "noemailprefs": "Panjenengan kudu milih alamat e-mail supaya bisa nganggo fitur iki.",
-       "emailconfirmlink": "Ndhedhes (konfirmasi) alamat e-mail panjenengan",
+       "acct_creation_throttle_hit": "Para neneka menyang wiki iki kang nganggo alamat IP-mu wis gawé {{PLURAL:$1|akun cacah 1|akun cacah $1}} ing dalem $2 pungkasan, kang cacahé nyandhak cacah maksimum kang kaolèhaké.\nTemahané, para neneka kang nganggo alamat IP iki ora bisa gawé akun manèh sawatara wektu iki.",
+       "emailauthenticated": "Alamat layang èlèktronikmu wis kakonfirmasi ing tanggal $2 pukul $3.",
+       "emailnotauthenticated": "Alamat layang-èlèktronikmu durung kakonfirmasi.\nLayang Ã¨lèktronik ora bakal kakirim amarga gegayutan fitur-fitur ing sor iki.",
+       "noemailprefs": "Isi alamat layang èlèktronikmu ing pilalanmu supaya fitur-fitur iki murub.",
+       "emailconfirmlink": "Konfirmasi alamat layang èlèktronikmu",
        "invalidemailaddress": "Alamat e-mail iki ora bisa ditampa amarga formaté ora bener. Tulung lebokna alamat mawa format kang bener utawa kosongaké waé isèn mau.",
        "cannotchangeemail": "Alamat layang-èl akun ora bisa diowah ing wiki iki.",
        "emaildisabled": "Situs iki ora bisa ngirim layang èlèktronik.",
        "accountcreatedtext": "Akun panganggo [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|rembug]]) wis digawé.",
        "createaccount-title": "Gawé akun kanggo {{SITENAME}}",
        "createaccount-text": "Ana kang nggawé akun nganggo alamat layang-èlé panjenengan ing {{SITENAME}} ($4) kanthi aran \"$2\", mawa tembung wadi \"$3\".\nPanjenengan kudu mlebu log lan ngowahi tembung wadiné panjenengan saiki.\n\nPanjenengan kena nglirwakaké layang iki, manawa akun iki ginawé awit kaluputan.",
-       "login-throttled": "Panjenengan wis ping akèh njajal mlebu log.\nTulung nunggu dhisik $1 sadurungé njajal manèh.",
-       "login-abort-generic": "Panjenengan ora bisa mlebu log - Kawurungan",
-       "login-migrated-generic": "Akuné panjenengan wis dimigrasi, lan jeneng panganggoné wis ora ana manèh ing wiki iki.",
+       "login-throttled": "Kowé wis njajal mlebu log ping akèh.\nEntènana $1 sadurung njajal manèh.",
+       "login-abort-generic": "Kowé ora bisa mlebu log - Kawurungaké",
+       "login-migrated-generic": "Akunmu wis ingalihan, lan jeneng panganggomu wis ora ana manèh ing wiki iki.",
        "loginlanguagelabel": "Basa: $1",
-       "suspicious-userlogout": "Panjaluk panjenengan supaya metu ditolak amarga katoné panjlajah internt utawa proksi panyinggah.",
+       "suspicious-userlogout": "Panjalukmu supaya metu log tinulak amarga panjaluké kakirim saka pangluru kang rusak utawa proksi telih.",
        "createacct-another-realname-tip": "Jeneng asli ora kudu diisi.\nYèn diisi, jeneng asliné panjenengan bakal kanggo atribusi awit karyané panjenengan.",
        "pt-login": "Mlebu log",
        "pt-login-button": "Mlebu log",
        "resetpass-wrong-oldpass": "Tembung wadi saiki utawa sauntara ora trep.\nPanjengen bokmanawa wis ngganti tembung wadiné panjenengan utawa nyuwun tembung wadi sauntara kang anyar.",
        "resetpass-temp-password": "Tembung wadi sauntara:",
        "resetpass-abort-generic": "Ngowahi tembung wadi kawurungaké déning èkstènsi.",
+       "resetpass-expired": "Tembung wadimu wis kadaluwarsa. Setèl tembung wadi anyar saperlu mlebu log.",
        "passwordreset": "Balèni gawé tembung wadi",
        "passwordreset-text-one": "Isi formulir iki kanthi jangkep kanggo nampa tembung wadi sauntara lumantar layang-èl.",
        "passwordreset-text-many": "{{PLURAL:$1|Isi salah siji babagan ing ngisor iki supaya bisa nampa tembung wadi sauntara lumantar layang-èl.}}",
        "passwordreset-emailelement": "Jeneng panganggo: \n$1\n\nTembung wadi sauntara: \n$2",
        "passwordreset-emailsentemail": "Yèn layang èlèktronik iki nggayut akun panjenengan, layang kanggo salin tembung wadi bakal dikirim.",
        "passwordreset-emailsentusername": "Manawa ana alamat layang-èl kang ana gayutané karo jeneng panganggo iki, layang-èl kanggo nyetèl ulang tembung wadi bakal dikirim.",
+       "passwordreset-nocaller": "Panyeluk kudu kaisi",
+       "passwordreset-nosuchcaller": "Panyeluk ora ana: $1",
+       "passwordreset-invalidemail": "Alamat layang èlèktronik ora trep",
        "changeemail": "Owah utawa busak alamat layang-èl",
        "changeemail-header": "Isi formulir iki saperlu salin alamat layang-èl panjenengan. Manawa panjenengan péngin ngilangi gegayutané alamat layang-èl saka akuné panjenengan, kosongaké waé babagan layang-èl anyar nalika ngirim formuliré.",
        "changeemail-no-info": "Panjenengan kudu mlebu log kanggo ngaksès kaca iki langsung.",
        "nowiki_sample": "Isi nganggo tulisan tanpa format ing kéné",
        "nowiki_tip": "Aja nganggo format wiki",
        "image_sample": "Conto.jpg",
-       "image_tip": "Barkas sisipan",
+       "image_tip": "Berkas sisipan",
        "media_sample": "Conto.ogg",
-       "media_tip": "Pranala barkas",
+       "media_tip": "Pranala berkas",
        "sig_tip": "Tapak asmané panjenengan mawa tandha wektu",
        "hr_tip": "Garis horisontal",
        "summary": "Ringkesan:",
        "summary-preview": "Pratuduh ringkesan besutan:",
        "subject-preview": "Pratuduh jejer:",
        "previewerrortext": "Ana masalah nalika njajal mratuduhaké owahané panjenengan.",
-       "blockedtitle": "Panganggo kapalangan",
-       "blockedtext": "<b>Asma panganggo utawa alamat IP panjenengan diblokir.</b>\n\nBlokir iki kang nglakoni $1.\nAlesané <i>$2</i>.\n\n* Diblokir wiwit: $8\n* Kadaluwarsa pemblokiran ing: $6\n* Kang arep diblokir: $7\n\nPanjenengan bisa ngubungi $1 utawa [[{{MediaWiki:Grouppage-sysop}}|pangurus liyané]] kanggo ngomongaké prakara iki.\n\nPanjenengan ora bisa nggunakaké fitur 'Kirim layang é-mail panganggo iki' kejaba panjenengan wis nglebokaké alamat é-mail kang trep ing [[Special:Preferences|prèferènsi]] panjenengan.\n\nAlamat IP panjenengan iku $3, lan ID pamblokiran iku #$5.\nTulung kabèh informasi ing ndhuwur iki disertakaké ing saben pitakon panjenengan.",
+       "blockedtitle": "Panganggo kapenggak",
+       "blockedtext": "<strong>Aran panganggomu utawa alamat IP-mu kapenggak.</strong>\n\nKang menggak ya iku $1.\nDhedhasaré <i>$2</i>.\n\n* Kapenggak wiwit: $8\n* Kapenggak nganti: $6\n* Kang arep diblokir: $7\n\nPanjenengan bisa ngubungi $1 utawa [[{{MediaWiki:Grouppage-sysop}}|pangurus liyané]] kanggo ngomongaké prakara iki.\n\nPanjenengan ora bisa nggunakaké fitur 'Kirim layang é-mail panganggo iki' kejaba panjenengan wis nglebokaké alamat é-mail kang trep ing [[Special:Preferences|prèferènsi]] panjenengan.\n\nAlamat IP panjenengan iku $3, lan ID pamblokiran iku #$5.\nTulung kabèh informasi ing ndhuwur iki disertakaké ing saben pitakon panjenengan.",
        "autoblockedtext": "Alamat IP-né panjenangan wis otomatis diblokir amarga dienggo déning panganggo liyané, kang diblokir déning $1.\n\n:<em>$2</em>\n\n* Wiwit diblokir: $8\n* Rampung diblokir: $6\n* Kang diblokir: $7\n\nPanjenengan bisa ngubungi $1 utawa [[{{MediaWiki:Grouppage-sysop}}|pangurus]] liyané kanggo ngrembug blokirané.\n\nPanjenengan ora bisa nganggo fitur \"kirim layang-èl panganggo iki\" kajaba panjenengan wis ndhaftaraké alamat layang-èl kang trep ing [[Special:Preferences|pilalan panganggoné]] panjenengan lan panjenengan durung tau diblokir nalika nganggo iku.\n\nAlamat IP-né panjenengan kang saiki ya iku $3, lan ID blokirané ya iku $5. \nMangga wuwuhen kabèh rerincèn ing ndhuwur sajeroné samubarang pitakoné panjenengan.",
        "blockednoreason": "ora ana alesan kang diwènèhaké",
        "whitelistedittext": "Mangga $1 dhisik yèn arep mbesut kaca.",
        "missing-revision": "Révisi #$1 saka kaca aran \"{{FULLPAGENAME}}\" ora ana.\n\nIki biyasané kasababaké awit nututi pranala sajarah kang wis lawas saka kaca kang wis binusek.\nRerincèné bisa digolèki ing [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log besakan].",
        "userpage-userdoesnotexist": "Akun panganggo \"$1\" ora kadhaftar.\nMangga pesthèkaké dhisik yèn panjenengan péngin nggawé/mbesut kaca iki.",
        "userpage-userdoesnotexist-view": "Akun panganggo \"$1\" ora kadhaftar.",
-       "blocked-notice-logextract": "Panganggo iki saiki lagi diblokir.\nLog pamblokiran pungkasan dituduhaké ing ngisor iki minangka bahan rujukan:",
+       "blocked-notice-logextract": "Panganggo iki lagi kapenggak.\nÈntri log penggakan kang pungkasan cumawis ing sor iki minangka rujukan:",
        "clearyourcache": "<strong>Cathetan:</strong> Nalika rampung nyimpen, panjenengan kudu mbusek telihing pangluruné panjenengan supaya owahané katon.\n* <strong>Firefox / Safari:</strong> Pencèt <em>Shift</em> nalika ngeklik <em>Reload</em>, utawa pencèt <em>Ctrl-F5</em> utawa <em>Ctrl-R</em> (<em>⌘-R</em> ing Mac)\n* <strong>Google Chrome:</strong> Pencèt <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> ing Mac)\n* <strong>Internet Explorer:</strong> Pencèt <em>Ctrl</em> nalika ngeklik <em>Refresh</em>, utawa pencèt <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Menyang <em>Menu → Settings</em> (<em>Opera → Preferences</em> ing Mac) nuli menyang <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
        "usercssyoucanpreview": "'''Tips:''' Gunakna tombol \"{{int:showpreview}}\" kanggo ngetès CSS anyar panjenengan sadurungé disimpen.",
        "userjsyoucanpreview": "'''Tips:''' Gunakna tombol \"{{int:showpreview}}\" kanggo ngetès JavaScript anyar panjenengan sadurungé disimpen.",
        "copyrightwarning": "Tulung dipun-gatèkaké manawa kabèh sumbangsih utawa kontribusi kanggo {{SITENAME}} iku dianggep wis diluncuraké miturut $2 GNU (mangga priksanen $1 kanggo ditèlé).\nManawa panjenengan ora karsa manawa tulisan panjenengan bakal disunting karo disebar, aja didokok ing kéné.<br />\nPanjenengan uga janji manawa apa-apa kang katulis ing kéné, iku karyané panjenengan dhéwé, utawa disalin saka sumber bébas. '''AJA NDOKOK KARYA KANG DIREKSA DÉNING UNDHANG-UNDHANG HAK CIPTA TANPA IDIN!'''",
        "copyrightwarning2": "Mangga digatèkaké yèn kabèh kontribusi marang {{SITENAME}} bisa disunting, diowahi, utawa dibusek penyumbang liyané. Yèn panjenengan ora karsa yèn tulisan panjenengan bisa disunting wong liya, aja ngirim artikel panjenengan ing kéné.<br />Panjenengan uga janji yèn tulisan panjenengan iku kasil karya panjenengan dhéwé, utawa disalin saka sumber umum utawa sumber bébas liyané (mangga delengen $1 kanggo informasi sabanjuré). '''AJA NGIRIM KARYA KANG DIREKSA DÉNING UNDHANG-UNDHANG HAK CIPTA TANPA IDIN!'''",
        "longpageerror": "'''Masalah: Tèks kang panjenengan lebokaké dawané {{PLURAL:$1|sak kilobita|$1 kilobita}}, luwih dawa saka maksimal {{PLURAL:$2|sak kilobita|$2 kilobita}}.'''\nKang mangkono ora bisa kasimpen.",
-       "readonlywarning": "<strong>Pepéling: Basis dhatah lagi ginembok amarga lagi karukti, mula panjenengan saiki ora bisa nyimpen besutané panjenengan.</strong>\nPanjenengan bokmanawa arep nurun tulisané panjenengan ing barkas tèks lan nyimpen iku kanggo mengko.\n\nPangurus kang nggembok basis dhatahé mènèhi panjlèntrèh mengkéné: $1",
+       "readonlywarning": "<strong>Pepéling: Sasana dhatah lagi ginembok amarga lagi karukti, mula kowé saiki ora bisa nyimpen besutanmu.</strong>\nKowé bokmanawa arep nurun tulisanmu menyang berkas tulisan lan nyimpen iku kanggo mengko.\n\nPangurus sistem kang nggembok iku wèwèh pawadan: $1",
        "protectedpagewarning": "<strong>Pélik: Kaca iki wis direksa, mula mung panganggo mawa hak mirunggan pangurus kang bisa mbesut.</strong>\nÈntri log kang pungkasan ana ing ngisor iki minangka rujukan:",
        "semiprotectedpagewarning": "<strong>Cathetan:</strong> Kaca iki pinuju direksa, mula mung panganggo kang kadhaftar kang bisa mbesut.\nÈntri log pungkasan cumepak ana ing ngisor kanggo rujukan:",
        "cascadeprotectedwarning": "<strong>Pènget:</strong> Kaca iki wis direksa saéngga mung panganggo kanthi hak pangurus waé kang bisa mbesut amarga kaca iki katranklusi ing {{PLURAL:$1|kaca|kaca-kaca}} kang kareksa runut ngisor iki:",
        "edit-no-change": "Besutané panjenengan dilirwakaké amarga ora ana owahan apa-apa tumraping tèksé.",
        "postedit-confirmation-created": "Kaca wis kagawé.",
        "postedit-confirmation-restored": "Kacané wis kapulihaké.",
-       "postedit-confirmation-saved": "Besutané panjenengan wis kasimpen.",
-       "postedit-confirmation-published": "Besutané panjenengan wis kababar.",
+       "postedit-confirmation-saved": "Besutanmu wis kasimpen.",
+       "postedit-confirmation-published": "Besutanmu wis kababar.",
        "edit-already-exists": "Ora bisa nggawé kaca anyar.\nKacané wis ana.",
        "defaultmessagetext": "Tèks layang gawan",
        "content-failed-to-parse": "Gagal menjabarkan konten $2 untuk model $1: $3",
        "undo-norev": "Besutan iki ora bisa diwurungaké amarga wis ora ana utawa wis binusek.",
        "undo-summary": "Mbalèkaké owahan $1 déning [[Special:Contributions/$2|$2]] ([[User talk:$2|rembugan]])",
        "undo-summary-username-hidden": "Balèkaké owahan $1 déning panganggo kang didhelikaké",
-       "cantcreateaccount-text": "Saka alamat IP iki ('''$1''') ora diparengaké nggawé akun utawa kang. Kang mblokir utawa ora marengaké iku [[User:$3|$3]].\n\nAlesané miturut $3 yaiku ''$2''",
+       "cantcreateaccount-text": "Panggawéning akun saka alamat IP iki (<strong>$1</strong>) wis dipenggak [[User:$3|$3]].\n\nDhedhasaré pamenggak miturut $3 iku ''$2''",
        "cantcreateaccount-range-text": "Nggawe akun saka alamat IP \"$1\", kang kalebu IP panjenengan (<strong>$4</strong>), wis diblokir kaliyan [[User:$3|$3]].\n\nAlesan pamblokiran yaiku \"$2\"",
        "viewpagelogs": "Deleng cathetaning kaca iki",
        "nohistory": "Babading besutan kaca iki ora ana.",
        "revisiondelete": "Busak/wurung busak révisi",
        "revdelete-nooldid-title": "Révisi tujuan ora trep",
        "revdelete-nooldid-text": "Panjenengan durung mènèhi target revisi kanggo nglakoni fungsi iki.",
-       "revdelete-no-file": "Barkas kang panjenengan karsakaké ora ana.",
-       "revdelete-show-file-confirm": "Apa panjenengan yakin arep mriksa révisi kang kabusek saka barkas \"<nowiki>$1</nowiki>\" nalika $2 jam $3?",
+       "revdelete-no-file": "Berkas kang koarepi ora ana.",
+       "revdelete-show-file-confirm": "Apa kowé yakin arep mriksa révisi kang kabusek saka berkas \"<nowiki>$1</nowiki>\" nalika $2 pukul $3?",
        "revdelete-show-file-submit": "Iya",
        "logdelete-selected": "{{PLURAL:$1|Log kapilih|Log kapilih}} kanggo:",
        "revdelete-text-others": "Administrator liya isih bisa ngaksès isian ndhelik lan mulihaké iku saka pambusakan, kajaba rereksan tambahan disetèl.",
        "revdelete-suppress-text": "Pandhelikan révisi '''mung''' bisa dipigunakaké kanggo kasus ing ngisor:\n* Informasi kang kagolong pitnah\n* Informasi pribadi kang kurang pantes\n*: ''alamat omah lan nomer telepon, nomer kartu idhèntitas, lsp..''",
        "revdelete-legend": "Atur watesan:",
        "revdelete-hide-text": "Tulisan owahan",
-       "revdelete-hide-image": "Dhelikaké isi barkas",
+       "revdelete-hide-image": "Dhelikaké isining berkas",
        "revdelete-hide-name": "Dhelikaké tujuan lan paramèter",
        "revdelete-hide-comment": "Tingkesan besutan",
        "revdelete-hide-user": "Alamat IPné/jeneng panganggoné kang mbesut",
        "searchprofile-everything": "Kabèh",
        "searchprofile-advanced": "Lungidan",
        "searchprofile-articles-tooltip": "Golèkan ing $1",
-       "searchprofile-images-tooltip": "Golèk barkas",
+       "searchprofile-images-tooltip": "Golèk berkas",
        "searchprofile-everything-tooltip": "Golèk kabèh kontèn (kalebu ing kaca parembugan)",
        "searchprofile-advanced-tooltip": "Golèk ing mandhala aran tinamtu",
        "search-result-size": "$1 ({{PLURAL:$2|1 tembung|$2 tembung}})",
-       "search-result-category-size": "{{PLURAL:$1|1 anggota|$1 anggota}} ({{PLURAL:$2|1 subkategori|$2 subkategori}}, {{PLURAL:$3|1 barkas|$3 barkas}})",
+       "search-result-category-size": "{{PLURAL:$1|1 warga|$1 warga}} ({{PLURAL:$2|1 subkategori|$2 subkategori}}, {{PLURAL:$3|1 berkas|$3 berkas}})",
        "search-redirect": "(alihan saka $1)",
        "search-section": "(pérangan $1)",
        "search-category": "(kategori $1)",
-       "search-file-match": "(cocog karo isi barkas)",
+       "search-file-match": "(cocog karo isi berkas)",
        "search-suggest": "Apa kang panjenengan karsakaké iki: $1",
        "search-rewritten": "Tuduhaké kasilé $1, nanging golèkaké $2.",
        "search-interwiki-caption": "Kasil saka proyèk-proyèk sababon",
        "prefs-searchoptions": "Golèk",
        "prefs-namespaces": "Mandhala aran",
        "default": "baku",
-       "prefs-files": "Barkas",
+       "prefs-files": "Berkas",
        "prefs-custom-css": "CSS priangga",
        "prefs-custom-js": "JavaScript priangga",
        "prefs-common-config": "CSS/JS barengan kabèh ules:",
        "right-move-subpages": "Pindhahaké kaca lan kabèh anak-kacané",
        "right-move-rootuserpages": "Ngalih kaca panganggo oyod",
        "right-move-categorypages": "Lih kaca kategori",
-       "right-movefile": "Lih barkas",
+       "right-movefile": "Lih berkas",
        "right-suppressredirect": "Aja nggawé pangalihan saka kaca kang lawas yèn mindhah kaca",
-       "right-upload": "Unggah barkas",
-       "right-reupload": "Tindhihana barkas kang ana",
-       "right-reupload-own": "Nimpa barkas kang ana lan diunggah panganggo kang padha",
-       "right-reupload-shared": "Timpanana barkas ing panyimpenan médhiya barengan lokal",
-       "right-upload_by_url": "Ngunggahaké barkas saka alamat URL",
+       "right-upload": "Unggah berkas",
+       "right-reupload": "Tindhihi berkas kang ana",
+       "right-reupload-own": "Tindhihi berkas kang ana kang diunggah siji wong",
+       "right-reupload-shared": "Tindhihi berkas ing panyimpenan médhiyah barengan lokal",
+       "right-upload_by_url": "Unggah berkas saka URL",
        "right-purge": "Kosongna ''cache'' situs iki kanggo kaca tanpa konfirmasi",
        "right-autoconfirmed": "Owah kaca-kaca sémi-reksa",
        "right-bot": "Anggepen minangka prosès otomatis",
        "right-editsemiprotected": "Owah kaca kang kareksa \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Besut modhèl kontèn kaca",
        "right-editinterface": "Besut antarmuka panganggo",
-       "right-editusercss": "Besut barkas-barkas CSS panganggo liya",
-       "right-edituserjson": "Besut barkas-barkas JSON panganggo liya",
-       "right-edituserjs": "Besut barkas-barkas JavaScript panganggo liya",
-       "right-editmyusercss": "Owahi barkas CSS panganggo panjenengan",
-       "right-editmyuserjson": "Owahi barkas JSON panganggo panjenengan",
-       "right-editmyuserjs": "Owahi barkas JavaScript panganggo panjenengan",
+       "right-editusercss": "Besut berkas CSS panganggo liya",
+       "right-edituserjson": "Besut berkas JSON panganggo liya",
+       "right-edituserjs": "Besut berkas JavaScript panganggo liya",
+       "right-editmyusercss": "Besut berkas CSS panganggomu",
+       "right-editmyuserjson": "Besut berkas JSON panganggomu",
+       "right-editmyuserjs": "Besut berkas JavaScript panganggomu",
        "right-viewmywatchlist": "Deleng pawawangané panjenengan",
        "right-editmywatchlist": "Owahi pawawangané panjenengan. Cathetan: ana cara liyane kanggo nambahi kaca menyang pratélan, sanadyan ora duwe hak iki.",
        "right-viewmyprivateinfo": "Deleng dhata prianggané panjenengan dhéwé (kaya ta alamat layang-èl, jeneng asli)",
        "right-markbotedits": "Tandhani besutan kang kawurungan yèn besutan bot",
        "right-noratelimit": "Ora kadayan watesing cacah besutan.",
        "right-import": "Impor kaca-kaca saka wiki liya",
-       "right-importupload": "Impor kaca saka unggahan barkas",
+       "right-importupload": "Impor kaca saka unggahan berkas",
        "right-patrol": "Tandhani besutané wong liya yèn wis kapriksa",
        "right-autopatrol": "Gawé supaya besutan otomatis tinengeran wis kapriksa",
        "right-patrolmarks": "Ndeleng tandha-tandha patroli owah-owahan anyar",
        "grant-protect": "Reksa lan uculi rereksané kaca",
        "grant-rollback": "Wurungaké owahané kaca",
        "grant-sendemail": "Kirim layang-èl menyang panganggo liyané",
-       "grant-uploadeditmovefile": "Unggah, ganti, lan lih barkas",
-       "grant-uploadfile": "Unggah barkas anyar",
+       "grant-uploadeditmovefile": "Unggah, ganti, lan lih berkas",
+       "grant-uploadfile": "Unggah berkas anyar",
        "grant-basic": "Hak pokok",
-       "grant-viewdeleted": "Deleng barkas lan kaca kang kabusek",
+       "grant-viewdeleted": "Deleng berkas lan kaca kang kabusek",
        "grant-viewmywatchlist": "Deleng pawawangané panjenengan",
        "grant-viewrestrictedlogs": "Deleng isian log kang winates",
        "newuserlogpage": "Log panganggo anyar",
        "action-move-subpages": "lih kaca iki, lan anak-kacané",
        "action-move-rootuserpages": "ngalih kaca panganggo oyod",
        "action-move-categorypages": "alih kaca kategori",
-       "action-movefile": "alih barkas iki",
-       "action-upload": "ngunggah barkas iki",
-       "action-reupload": "nindhih barkas kang wis ana",
-       "action-reupload-shared": "nindhih barkas kang wis ana ing papan panyimpanan barkas kang dianggo bebarengan",
-       "action-upload_by_url": "unggahna barkas iki saka alamat URL",
+       "action-movefile": "ngalih berkas iki",
+       "action-upload": "ngunggah berkas iki",
+       "action-reupload": "nindhihi berkas kang ana iki",
+       "action-reupload-shared": "nindhihi berkas kang ana ing panyimpanan barengan iki",
+       "action-upload_by_url": "ngunggah berkas iki saka URL",
        "action-writeapi": "migunakaké API panulisan",
        "action-delete": "busak kaca iki",
        "action-deleterevision": "busak révisi",
        "action-protect": "owahi tataran rereksané kaca iki",
        "action-rollback": "gelis mbalèkaké suntingané panganggo pungkasan ing kaca tinamtu",
        "action-import": "impor kaca saka wiki liyané",
-       "action-importupload": "impor kaca iki saka pamunggahan barkas",
+       "action-importupload": "impor kaca saka unggahan berkas",
        "action-patrol": "nandhani besutan wong liya yèn wis kapriksa",
        "action-autopatrol": "nandhani besutané panjenengan dhéwé yèn wis kapriksa",
        "action-unwatchedpages": "deleng pratélan kaca kang ingawasan",
        "recentchanges-page-removed-from-category": "[[:$1]] dibusak saka kategori",
        "recentchanges-page-removed-from-category-bundled": "[[:$1]] dibusak saka kategori, [[Special:WhatLinksHere/$1|kaca iki kalebu ing njeroné kaca liyané]]",
        "autochange-username": "Salin otomatis MediaWiki",
-       "upload": "Unggah barkas",
-       "uploadbtn": "Unggah barkas",
+       "upload": "Unggah berkas",
+       "uploadbtn": "Unggah berkas",
        "reuploaddesc": "Wurung ngunggah lan bali menyang formulir unggahan",
-       "upload-tryagain": "Kirim déskripsi barkas kang wis diowah",
+       "upload-tryagain": "Kirim wedharan barkas kang wis kadandani",
        "uploadnologin": "Durung mlebu log",
-       "uploadnologintext": "Sumangga $1 saperlu ngunggah barkas.",
+       "uploadnologintext": "Mangga $1 saperlu ngunggah berkas.",
        "upload_directory_missing": "Dhirèktori unggahan ($1) ora tinemu lan ora bisa digawé déning server wèb.",
        "upload_directory_read_only": "Dhirèktori pangunggahan ($1) ora bisa ditulis déning paladèn jaringan.",
        "uploaderror": "Masalah pangunggah",
-       "upload-recreate-warning": "'''Pèngetan: Barkas mawa jeneng iku wis dibusak utawa disingkiraké.'''\n\nLog pambusakan lan panyingkiran saka kaca iki sumadhiya ing kéné:",
+       "upload-recreate-warning": "<strong>Pepéling: Siji berkas mawa aran mangkono wis binusek utawa ingalihan.</strong>\n\nLog busekan lan lih-lihan tumrap kaca iki cumawis ing kéné:",
        "uploadtext": "Anggonen formulir ngisor iki saperlu ngunggah barkas.\nKanggo ndeleng utawa nggolèki barkas kang wis diunggah sadurungé, panjenengan menyanga [[Special:FileList|pratélan barkas unggahan]]. Barkas unggahan ulang uga kacathet ing [[Special:Log/upload|log unggah]], déné barkas busakan ing [[Special:Log/delete|log busak]].\n\nKanggo muwuhi barkas ing kaca, anggonen pranala kanthi formulir ing ngisor iki, pilih salah siji:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> saperlu nganggo barkasé kanthi vèrsi kang wutuh\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code></strong> saperlu nganggo barkasé kanthi amba 200 piksel déné ana ing njeron kothak lan kapacak ing sisih kiwané kaca mawa \"alt text\" minangka katerangané\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> saperlu nggayutaké langsung barkasé tanpa mitontonaké barkasé dhéwé",
-       "upload-permitted": "{{PLURAL:$2|Jinis}} barkas kang kaolèhaké: $1.",
-       "upload-preferred": "{{PLURAL:$2|Jinis}} barkas kang kaprayogakaké: $1.",
-       "upload-prohibited": "{{PLURAL:$2|Jinis}} barkas kang kalarang: $1.",
+       "upload-permitted": "{{PLURAL:$2|Jinis}} berkas kang kaolèhaké: $1.",
+       "upload-preferred": "{{PLURAL:$2|Jinis}} berkas kang kaprayogakaké: $1.",
+       "upload-prohibited": "{{PLURAL:$2|Jinis}} berkas kang kalarang: $1.",
        "uploadlogpage": "Log unggah",
-       "uploadlogpagetext": "Ing ngisor iki kapacak log pangunggahan barkas kang anyar dhéwé.\nMangga mirsani [[Special:NewFiles|galeri barkas anyar]] kanggo pratélan visual.",
-       "filename": "Jeneng barkas",
+       "uploadlogpagetext": "Ing sor iki kapacak log unggahan berkas kang anyar dhéwé.\nDeleng [[Special:NewFiles|gladri berkas anyar]] kapurih luwih cethané.",
+       "filename": "Aran berkas",
        "filedesc": "Ringkesan",
        "fileuploadsummary": "Ringkesan:",
-       "filereuploadsummary": "Owah-owahan barkas:",
+       "filereuploadsummary": "Owah-owahan berkas:",
        "filestatus": "Status hak cipta",
        "filesource": "Sumber",
-       "ignorewarning": "Lirwakaké pepéling lan simpen langsung barkasé.",
+       "ignorewarning": "Lirwakaké pepéling lan simpen langsung berkasé.",
        "ignorewarnings": "Lirwakaké samubarang pepéling",
-       "minlength1": "Jeneng barkas saorané ngemu sakurup.",
-       "illegalfilename": "Jeneng barkas \"$1\" ngandhut aksara kang ora diparengaké ana sajroning irah-irahan kaca. Mangga owahana jeneng barkas iku lan cobanen  diunggahaké manèh.",
-       "filename-toolong": "Jeneng barkas ora kena munjuli 240 bèt.",
-       "badfilename": "Jeneng barkas wis diowah dadi \"$1\".",
-       "filetype-mime-mismatch": "Èkstènsi barkas \".$1\" ora cocog karo jinis MIME kang kadètèk saka barkas ($2).",
-       "filetype-badmime": "Barkas jinis MIME \"$1\" ora kena kaunggah.",
+       "minlength1": "Jeneng berkas saorané ngemu sakurup.",
+       "illegalfilename": "Aran barkas \"$1\" ngemu karakter kang ora kaolèhaké ing sesirah kaca.\nMangga ganti araning berkasé lan jajal manèh ngunggah berkasé.",
+       "filename-toolong": "Aran barkas ora kena munjuli 240 bèt.",
+       "badfilename": "Aran berkas wis ingowahan dadi \"$1\".",
+       "filetype-mime-mismatch": "Èstènsi berkas \".$1\" ora cocog karo jinis MIME kang tinemu ing berkas ($2).",
+       "filetype-badmime": "Berkas mawa jinis MIME \"$1\" ora kena kaunggah.",
        "filetype-bad-ie-mime": "Ora bisa ngunggahaké barkas iki amarga Internet Explorer ndhétèksi minangka \"$1\", kang ora diidinaké lan minangka tipe barkas kang nduwèni potènsi mbebayani.",
        "filetype-unwanted-type": "<strong>\".$1\"</strong> iku jinis barkas kang ora kapéngini.\nAluwung {{PLURAL:$3|jinis barkasé}} $2.",
        "filetype-banned-type": "<strong>\".$1\"</strong> {{PLURAL:$4|dudu jinis barkas kang diidinaké}}.\n{{PLURAL:$3|Jinis barkas}} kang diidinaké $2.",
        "zip-bad": "Barkas rusak utawa barkas ZIP kang ora bisa diwaca.\nKang mangkono ora bisa kapriksa kanthi patut kanggo kamanan.",
        "zip-unsupported": "Barkasé iku barkas ZIP kang nganggo piranti ZIP kang ora disengkuyung MediaWiki.\nKang mangkono ora bisa kapriksa kanthi patut kanggo kamanan.",
        "uploadstash": "Unggah pandhelikan",
-       "uploadstash-summary": "Kaca iki nyadhiyakaké dalan ing barkas-barkas kang wis diunggah (utawa lagi diunggah) naning durung kababar ing wiki. Barkas-barkas iki ora katon kanggo sapa baé nanging namung kanggo panganggo kang ngunggah baé.",
+       "uploadstash-summary": "Kaca iki nyawisaké aksès marang berkas-berkas kang wis kaunggah utawa kang lagi kaunggah. Berkas-berkas iki ora katon tumrap sesapaa kajaba panganggo kang ngunggah baé.",
        "uploadstash-clear": "Busek barkas kadhelikaké",
        "uploadstash-nofiles": "Panjenengan ora duwé barkas simpenan.",
        "uploadstash-badtoken": "Nglakoni iki ora dadi, bokamanawa amarga hak besut panjenengan wis kadaluwarsa. Sumangga jajal manèh.",
        "listusersfrom": "Tuduhna panganggo kang diawali karo:",
        "listusers-submit": "Tuduhna",
        "listusers-noresult": "Panganggo ora ana.",
-       "listusers-blocked": "(diblokir)",
+       "listusers-blocked": "(kapenggak)",
        "activeusers": "Pratélan panganggo aktif",
        "activeusers-intro": "Iki pratélan panganggo kang katon lakuné ing $1 {{PLURAL:$1|dina|dina}} kapungkur.",
        "activeusers-count": "$1 {{PLURAL:$1|laku|laku}} ing {{PLURAL:$3|dina|$3 dina}} pungkasan",
        "protect_expiry_old": "Wektu kadaluwarsané ana ing kala kawuri.",
        "protect-unchain-permissions": "Urubaké opsi rereksan lanjutan",
        "protect-text": "Ing kéné, panjenengan bisa ndeleng lan ngganti tataran kareksan tumrap kaca <strong>$1</strong>.",
-       "protect-locked-blocked": "Panjenengan ora bisa ngowahi tataran rereksan nalika diblokir.\nMangkéné setèlan saiki tumrap kaca <strong>$1</strong>:",
+       "protect-locked-blocked": "Kowé ora bisa ngowahi tataran rereksan nalika kapenggak.\nMangkéné setèlan saiki tumrap kaca <strong>$1</strong>:",
        "protect-locked-dblock": "Tataran rereksan ora bisa diowahi amarga sasana dhatané digembok.\nMangkéné setèlan saiki tumrap kaca <strong>$1</strong>:",
        "protect-locked-access": "Akuné panjenengan ora kawogan ngowahi tataran rereksan kaca.\nMangkéné setèlan saiki tumrap kaca <strong>$1</strong>:",
        "protect-cascadeon": "Kaca iki lagi direksa amarga disertakaké ing {{PLURAL:$1|kaca|kaca-kaca}} kang wis direksa mawa pilihan pangreksan runtun diaktifaké. Panjenengan bisa ngganti tingkat pangreksan kanggo kaca iki, nanging perkara iku ora awèh pengaruh pangreksan runtun.",
        "uctop": "saiki",
        "month": "Saka wulan (lan sadurungé):",
        "year": "Saka taun (lan sadurungé):",
-       "sp-contributions-blocklog": "log blokir",
+       "sp-contributions-blocklog": "log penggakan",
        "sp-contributions-deleted": "pasumbangé {{GENDER:$1|panganggo}} kang kabusek",
        "sp-contributions-uploads": "unggahan",
        "sp-contributions-logs": "log",
        "sp-contributions-talk": "rembug",
        "sp-contributions-userrights": "panataning hak {{GENDER:$1|panganggo}}",
-       "sp-contributions-blocked-notice": "Panganggo iki lagi diblokir.\nÈntri log blokiran pungkasan sumadhiya ing ngisor kanggo rujukan:",
-       "sp-contributions-blocked-notice-anon": "Alamat IP iki lagi diblokir.\nÈntri log blokiran pungkasan sumadhiya ing ngisor kanggo rujukan:",
+       "sp-contributions-blocked-notice": "Panganggo iki lagi kapenggak.\nÈntri log penggakan kang pungkasan cumawis ing sor iki minangka rujukan:",
+       "sp-contributions-blocked-notice-anon": "Alamat IP iki lagi kapenggak.\nÈntri log penggakan kang pungkasan cumawis ing sor iki minangka rujukan:",
        "sp-contributions-search": "Golèk pasumbang",
        "sp-contributions-username": "Alamat IP utawa jeneng panganggo:",
        "sp-contributions-toponly": "Tuduhaké besutan mligi révisi anyaran",
        "tooltip-t-info": "Katerangan liyané ngenani kaca iki",
        "tooltip-t-upload": "Unggah barkas",
        "tooltip-t-specialpages": "Pratélaning kabèh kaca mirunggan",
-       "tooltip-t-print": "Vèrsi céthak kaca iki",
+       "tooltip-t-print": "Vèrsi cithak kaca iki",
        "tooltip-t-permalink": "Pranala permanèn saka owahan iki",
        "tooltip-ca-nstab-main": "Deleng kaca kontèn",
        "tooltip-ca-nstab-user": "Deleng kaca panganggo",
        "tooltip-ca-nstab-category": "Deleng kaca kategori",
        "tooltip-minoredit": "Tandhani iki yèn besutan cilik",
        "tooltip-save": "Simpen owah-owahaning panjenengan",
-       "tooltip-publish": "Babar owahané panjenengan",
+       "tooltip-publish": "Babar owahanmu",
        "tooltip-preview": "Pratuduhana owah-owahaning panjenengan. Tulung ayahana iku sadurungé nyimpen.",
        "tooltip-diff": "Tuduhaké owahan endi kang panjenengan gawé tumrap tulisané",
        "tooltip-compareselectedversions": "Delengen prabédan antara rong vèrsi kaca iki kang dipilih.",
        "feedback-cancel": "Wurung",
        "feedback-close": "Rampung",
        "feedback-external-bug-report-button": "Kirim ayahan tèhnis",
-       "feedback-dialog-title": "Awèh saran",
+       "feedback-dialog-title": "Kirimi pamrayoga",
        "feedback-error1": "Masalah: Kasil ora dingertèni saka API",
        "feedback-error2": "Masalah: Besutané wurung",
        "feedback-error3": "Masalah: Ora ana tanggepan saka API",
        "searchsuggest-containing": "ngemu...",
        "api-error-badtoken": "Masalah njero: Token ala.",
        "api-error-emptypage": "Nggawé kaca kosong anyar ora dilikaké.",
-       "api-error-publishfailed": "Masalah njero: Paladèn wurung mbabar barkas sawetara.",
+       "api-error-publishfailed": "Masalah njero: Paladèn wurung mbabar berkas sawetara.",
        "api-error-stashfailed": "Masalah njero: Paladèn wurung ndèkèk barkas sawetara.",
        "api-error-unknown-warning": "Pélik ora dingertèni: \"$1\".",
        "api-error-unknownerror": "Masalah ora dingertèni: \"$1\".",
-       "duration-seconds": "$1 {{PLURAL:$1|detik|detik}}",
+       "duration-seconds": "$1 {{PLURAL:$1|sekon|sekon}}",
        "duration-minutes": "$1 {{PLURAL:$1|menit|menit}}",
        "duration-hours": "$1 {{PLURAL:$1|jam|jam}}",
        "duration-days": "$1 {{PLURAL:$1|dina|dina}}",
        "duration-weeks": "$1 {{PLURAL:$1|minggu|minggu}}",
        "duration-years": "$1 {{PLURAL:$1|taun|taun}}",
-       "duration-decades": "$1 {{PLURAL:$1|dékade|dékade}}",
+       "duration-decades": "$1 {{PLURAL:$1|dasawarsa|dasawarsa}}",
        "duration-centuries": "$1 {{PLURAL:$1|abad|abad}}",
-       "duration-millennia": "$1 {{PLURAL:$1|milénium|milénium}}",
+       "duration-millennia": "$1 {{PLURAL:$1|miléniyum|miléniyum}}",
        "rotate-comment": "Gambar diubengaké $1 {{PLURAL:$1|drajat|drajat}} sak arah domé jam",
        "limitreport-title": "Parser profiling data:",
        "limitreport-cputime": "CPU time usage",
        "date-range-from": "Kawit tanggal:",
        "date-range-to": "Tumeka tanggal:",
        "randomrootpage": "Kaca wod sembarang",
-       "log-action-filter-block": "Jinis blokiran:",
+       "log-action-filter-block": "Jinis penggakan:",
        "log-action-filter-contentmodel": "Jinis owahan modhèl isi:",
        "log-action-filter-delete": "Jinis busakan:",
        "log-action-filter-import": "Jinis imporan:",
        "log-action-filter-rights": "Jinis owahan hak:",
        "log-action-filter-upload": "Jinis unggahan:",
        "log-action-filter-all": "Kabèh",
-       "log-action-filter-block-block": "Blokir",
+       "log-action-filter-block-block": "Penggak",
        "log-action-filter-block-reblock": "Modhifikasi blokiran",
        "log-action-filter-block-unblock": "Copot blokiran",
        "log-action-filter-contentmodel-change": "Owahan modhèl isi",
index ffdeba8..7f0cd37 100644 (file)
        "page_first": "პირველი",
        "page_last": "ბოლო",
        "histlegend": "ვერსიების შედარება: აირჩიეთ სასურველი ვერსიები რადიო-რგოლების მონიშვნით და დააწკაპუნეთ შედარების ღილაკზე.<br />\nლეგენდა: '''({{int:cur}})''' = სხვაობა მიმდინარე ვერსიასთან, '''({{int:last}})''' = სხვაობა წინა ვერსიასთან, '''{{int:minoreditletter}}''' = მცირე შესწორება.",
-       "history-fieldset-title": "á\83\95á\83\94á\83 á\83¡á\83\98á\83\94á\83\91á\83\98á\83¡ á\83«á\83\98á\83\94á\83\91ა",
+       "history-fieldset-title": "á\83ªá\83\95á\83\9aá\83\98á\83\9aá\83\94á\83\91á\83\94á\83\91á\83\98á\83¡ á\83\92á\83\90á\83¤á\83\98á\83\9aá\83¢á\83\95á\83 ა",
        "history-show-deleted": "მხოლოდ წაშლილი ვერსიები",
        "histfirst": "უძველესი",
        "histlast": "უახლესი",
        "prefs-watchlist-edits": "კონტროლის სიაში საჩვენებელი ცვლილებების მაქსიმალური რაოდენობა:",
        "prefs-watchlist-edits-max": "მაქსიმალური რაოდენობა: 1000",
        "prefs-watchlist-token": "კონტროლის სიის ტოკენი:",
+       "prefs-watchlist-managetokens": "ტოკენების მართვა",
        "prefs-misc": "სხვადასხვა",
        "prefs-resetpass": "შეცვალეთ პაროლი",
        "prefs-changeemail": "ელ-ფოსტის მისამართის შეცვლა ან წაშლა",
        "filehist-filesize": "ფაილის ზომა",
        "filehist-comment": "კომენტარი",
        "imagelinks": "ფაილის გამოყენება",
-       "linkstoimage": "მომდევნო {{PLURAL:$1|გვერდი|გვერდები}} ებმის ამ ფაილს:",
+       "linkstoimage": "მომდევნო {{PLURAL:$1|გვერდი იყენებს|გვერდები იყენებენ}} ამ ფაილს:",
        "linkstoimage-more": "$1-ზე მეტი {{PLURAL:$1|გვერდები|გვერდების|გვერდები}} რომლებსაც აქვთ ბმულები ამ ფაილზე.\nმოცემულ სიაში {{PLURAL:$1|წარმოდგენილია მხოლოდ $1 ბმული|წარმოდგენილია მხოლოდ $1 ბმულები|წარმოდგენილია მხოლოდ $1 ბმულების}} ამ ფაილზე.\nშეგიძლიათ ნახოთ ასევე [[Special:WhatLinksHere/$2|სრული სია]].",
-       "nolinkstoimage": "á\83\90á\83  á\83\90á\83 á\83¡á\83\94á\83\91á\83\9dá\83\91á\83¡ á\83\90á\83\9b á\83¤á\83\90á\83\98á\83\9aá\83\97á\83\90á\83\9c á\83\93á\83\90á\83\99á\83\90á\83\95á\83¨á\83\98á\83 á\83\94á\83\91á\83£á\83\9aá\83\98 á\83\92á\83\95á\83\94á\83 á\83\93á\83\94á\83\91á\83\98.",
+       "nolinkstoimage": "á\83\94á\83¡ á\83¤á\83\90á\83\98á\83\9aá\83\98 á\83\90á\83 á\83ªá\83\94á\83 á\83\97 á\83\92á\83\95á\83\94á\83 á\83\93á\83\96á\83\94 á\83\90á\83  á\83\92á\83\90á\83\9bá\83\9dá\83\98á\83§á\83\94á\83\9cá\83\94á\83\91á\83\90.",
        "morelinkstoimage": "იხილეთ [[Special:WhatLinksHere/$1|სხვა ბმულები]] ამ ფაილზე.",
        "linkstoimage-redirect": "$1 (ფაილის გადამისამართება) $2",
        "duplicatesoffile": "{{PLURAL:$1|შემდეგი $1 ფაილი არის დუბლიკატი|შემდეგი $1 ფაილები არიან დუბლიკატები|შემდეგი $1 ფაილები არიან დუბლიკატები}} ამ ფაილისა ([[Special:FileDuplicateSearch/$2|დამატებითი ინფორმაცია]]):",
index 32ed1c2..7cc116e 100644 (file)
@@ -9,7 +9,8 @@
                        "Macofe",
                        "Kumkumuk",
                        "Asmen",
-                       "Gırd"
+                       "Gırd",
+                       "1917 Ekim Devrimi"
                ]
        },
        "tog-underline": "Bınê gırey de xete bonce:",
        "thumbnail_error": "Vıraştena resımê qıckeki de xeta: $1",
        "import-upload-filename": "Namê dosya:",
        "tooltip-pt-userpage": "Pela sımawa karberi",
-       "tooltip-pt-mytalk": "Pela sımawa hurênaişi",
+       "tooltip-pt-mytalk": "Pela {{GENDER:|toya}} werênayışi",
        "tooltip-pt-preferences": "Tercihê mı",
        "tooltip-pt-watchlist": "Lista pelunê ke to guretê şêrkerdene",
        "tooltip-pt-mycontris": "Lista iştıraqunê sıma",
index b50b012..ed6500b 100644 (file)
        "history": "hronoloģija",
        "history_short": "Vēsture",
        "history_small": "vēsture",
-       "updatedmarker": "atjaunināts kopš mana pēdējā apmeklējuma",
+       "updatedmarker": "atjaunināts kopš tava pēdējā apmeklējuma",
        "printableversion": "Drukājama versija",
        "permalink": "Pastāvīgā saite",
        "print": "Drukāt",
        "anonpreviewwarning": "''Tu neesi ienācis. Saglabājot lapu, Tava IP adrese tiks ierakstīta šīs lapas hronoloģijā.''",
        "missingsummary": "'''Atgādinājums''': Tu neesi norādījis izmaiņu kopsavilkumu. Vēlreiz klikšķinot uz \"Saglabāt lapu\", Tavas izmaiņas tiks saglabātas bez kopsavilkuma.",
        "missingcommenttext": "Lūdzu, ievadi komentāru.",
-       "missingcommentheader": "'''Atgādinājums:''' Tu šim komentāram neesi norādījis virsrakstu/tematu.\nJa tu vēlreiz spiedīsi uz \"$1\", tavas izmaiņas tiks saglabātas bez virsraksta.",
+       "missingcommentheader": "<strong>Atgādinājums:</strong> Šim komentāram nav norādīts temats.\nVēlreiz spiežot uz \"$1\", tavs labojums tiks saglabāts bez tā.",
        "summary-preview": "Labojuma kopsavilkuma priekšskatījums:",
        "subject-preview": "Temata pirmskats:",
        "blockedtitle": "Dalībnieks ir bloķēts.",
        "nocreate-loggedin": "Tev nav atļaujas veidot jaunas lapas.",
        "sectioneditnotsupported-title": "Sadaļa rediģēšana nav atbalstīta",
        "sectioneditnotsupported-text": "Sadaļu rediģēsana šajā lapā nav atļauta.",
+       "modeleditnotsupported-title": "Labošana nav atbalstīta",
+       "modeleditnotsupported-text": "Satura modelim \"$1\" labošana nav atbalstīta.",
        "permissionserrors": "Atļauju kļūda",
        "permissionserrorstext": "Tev nav atļauts veikt šo darbību {{PLURAL:$1|šādu iemeslu|šāda iemesla|šādu iemeslu}} dēļ:",
        "permissionserrorstext-withaction": "Tev nav atļauts $2 {{PLURAL:$1|šādu iemeslu|šāda iemesla|šādu iemeslu}} dēļ:",
        "editpage-invalidcontentmodel-text": "Satura modelis \"$1\" nav atbalstīts.",
        "editpage-notsupportedcontentformat-title": "Satura formāts nav atbalstīts",
        "editpage-notsupportedcontentformat-text": "Satura formātu $1 neatbalsta satura modelis $2.",
+       "slot-name-main": "Galvenais",
        "content-model-wikitext": "vikiteksts",
        "content-model-text": "vienkāršs teksts",
        "content-model-javascript": "JavaScript kods",
        "prefixindex": "Meklēt pēc virsraksta pirmajiem burtiem",
        "prefixindex-namespace": "Visas lapas ar prefiksu ($1 vārdtelpa)",
        "prefixindex-submit": "Rādīt",
+       "prefixindex-strip": "Rezultātos paslēpt prefiksu",
        "shortpages": "Īsākās lapas",
        "longpages": "Garākās lapas",
        "deadendpages": "Lapas bez izejošām saitēm",
        "dellogpagetext": "Šajā lapā ir pēdējo dzēsto lapu saraksts.",
        "deletionlog": "dzēšanas reģistrs",
        "log-name-create": "Lapu izveides žurnāls",
+       "logentry-create-create": "$1 {{GENDER:$2|izveidoja}} lapu $3",
        "reverted": "Atjaunots uz iepriekšējo versiju",
        "deletecomment": "Iemesls:",
        "deleteotherreason": "Cits/papildu iemesls:",
        "sessionfailure": "Ir radusies problēma ar sesijas autentifikāciju;\nšī darbība ir atcelta, lai novērstu lietotājvārda iespējami ļaunprātīgu izmantošanu.\nLūdzu, spied \"''back''\" un atjaunini iepriekšējo lapu. Tad mēģini vēlreiz.",
        "changecontentmodel": "Mainīt lapas satura modeli",
        "changecontentmodel-legend": "Mainīt satura modeli",
-       "changecontentmodel-title-label": "Lapas nosaukums",
-       "changecontentmodel-model-label": "Jauns satura modelis",
+       "changecontentmodel-title-label": "Lapas nosaukums:",
+       "changecontentmodel-model-label": "Jaunais satura modelis:",
        "changecontentmodel-reason-label": "Iemesls:",
        "changecontentmodel-submit": "Mainīt",
        "changecontentmodel-success-title": "Satura modelis tika izmainīts",
        "fix-double-redirects": "Automātiski izmainīt visas pāradresācijas, kas ved uz sākotnējo nosaukumu",
        "move-leave-redirect": "Atstāt pāradresāciju",
        "protectedpagemovewarning": "'''Brīdinājums:''' Šī lapa ir aizsargāta, tikai lietotāji ar administratora privilēģijām var to pārvietot.\nPēdējais reģistra ieraksts ir apskatāms zemāk:",
-       "semiprotectedpagemovewarning": "'''Piezīme:''' Šī lapa ir aizsargāta, tikai reģistrētie lietotāji var to pārvietot.\nPēdējais reģistra ieraksts ir apskatāms zemāk:",
+       "semiprotectedpagemovewarning": "<strong>Piezīme:</strong> Šī lapa ir aizsargāta tā, lai tikai pašpārbaudītie lietotāji varētu to pārvietot.\nPēdējais reģistra ieraksts ir apskatāms zemāk:",
        "move-over-sharedrepo": "[[:$1]] jau pastāv koplietotā repozitorijā. Pārvietošana uz šo nosaukumu aizstās koplietoto failu.",
        "file-exists-sharedrepo": "Šis faila nosaukums jau tiek izmantots kopīgajā failu krātuvē.\nLūdzu, izvēlies citu nosaukumu.",
        "export": "Eksportēt lapas",
        "importcantopen": "Nevarēja atvērt importējamo failu",
        "importbadinterwiki": "Slikta starpviki saite",
        "importsuccess": "Importēšana pabeigta!",
-       "importnosources": "Tiešā hronoloģijas augšuplāde ir atslēgta. Nav definēts neviens ''Transwiki'' importa avots (''source'').",
+       "importnosources": "Nav definēta neviena vikivietne, no kuras importēt un tiešā hronoloģijas augšupielāde ir atslēgta.",
        "importnofile": "Neviens importējamais fails netika augšupielādēts.",
        "importuploaderrorsize": "Augšupielādēt importējamo failu neizdevās. \nŠis fails ir lielāks par atļauto augšupielādes lielumu.",
        "importuploaderrorpartial": "Importējamā faila augšupielāde neizdevās.\nFails tika tikai daļēji importēts.",
        "tooltip-feed-atom": "Šīs lapas Atom barotne",
        "tooltip-t-contributions": "{{GENDER:$1|Šī dalībnieka|Šīs dalībnieces}} ieguldījumu uzskaitījums",
        "tooltip-t-emailuser": "Sūtīt e-pastu {{GENDER:$1|šim dalībniekam|šai dalībniecei}}",
+       "tooltip-t-info": "Vairāk informācijas par šo lapu",
        "tooltip-t-upload": "Augšupielādēt failus",
        "tooltip-t-specialpages": "Visu īpašo lapu uzskaitījums",
        "tooltip-t-print": "Drukājama lapas versija",
        "diff-form-submit": "Parādīt atšķirības",
        "permanentlink": "Pastāvīgā saite",
        "permanentlink-revid": "Versijas ID",
+       "permanentlink-submit": "Doties uz versiju",
        "newsection": "Jauna sadaļa",
        "newsection-page": "Mērķa lapa",
+       "newsection-submit": "Doties uz lapu",
        "dberr-problems": "Atvainojiet!\nŠai vietnei ir radušās tehniskas problēmas.",
        "dberr-again": "Uzgaidiet dažas minūtes un pārlādējiet šo lapu.",
        "dberr-info": "(Nevar piekļūt datubāzei: $1)",
        "htmlform-chosen-placeholder": "Izvēlieties iespēju",
        "htmlform-cloner-create": "Pievienot vairāk",
        "htmlform-cloner-delete": "Noņemt",
+       "htmlform-cloner-required": "Vismaz viena vērtība ir obligāta.",
        "htmlform-date-placeholder": "GGGG-MM-DD",
        "htmlform-title-not-creatable": "\"$1\" nav izveidojams lapas nosaukums",
        "htmlform-title-not-exists": "$1 nepastāv.",
        "randomrootpage": "Nejauša saknes lapa",
        "log-action-filter-block": "Bloķēšanas veids:",
        "log-action-filter-protect": "Aizsardzības veids:",
+       "log-action-filter-rights": "Tiesību izmaiņas veids:",
        "log-action-filter-suppress": "Cenzēšanas veids:",
        "log-action-filter-upload": "Augšupielādes veids:",
        "log-action-filter-block-unblock": "Atbloķēšana",
index b56f065..9ac57a6 100644 (file)
@@ -21,7 +21,7 @@
                        "NoiX180"
                ]
        },
-       "tog-underline": "Garih bawah pautan:",
+       "tog-underline": "Garih bawahi pautan:",
        "tog-hideminor": "Suruakkan suntiangan ketek di parubahan baru",
        "tog-hidepatrolled": "Suruakkan suntiangan nan lah dipatroli di parubahan tabaru",
        "tog-newpageshidepatrolled": "Suruakkan laman nan lah dipatroli dari daftar laman baru",
        "tog-diffonly": "Jan tampilan isi laman di bawah pabedoan suntiangan",
        "tog-showhiddencats": "Tunjuakan kategori tasuruak",
        "tog-norollbackdiff": "Jan tampilan pabedoan sasudah malakukan pangambalian",
-       "tog-useeditwarning": "Ingekan denai jikok maninggakan laman suntiang sabalun manyimpan parubahan",
+       "tog-useeditwarning": "Ingekan ambo kok maninggakan laman suntiang sabalun manyimpan parubahan",
        "tog-prefershttps": "Selalu gunokan koneksi aman katiko masuak log",
        "tog-showrollbackconfirmation": "Tampilkan konfirmasi katiko mangklik pautan pangambalian",
+       "tog-requireemail": "Paralu email untuak maatua ulang kato sandi",
        "underline-always": "Taruih",
-       "underline-never": "Indak pernah",
+       "underline-never": "Indak panah",
        "underline-default": "Kulik atau pangaturan paramban web",
        "editfont-style": "Gaya tulisan komputer pado kotak panyuntiangan:",
        "editfont-monospace": "Tulisan Monospace",
        "virus-scanfailed": "Pamindaian gagal (kode $1)",
        "virus-unknownscanner": "Antivirus indak dikenal:",
        "logouttext": "<strong>Sanak alah kalua log</strong>\n\nMohon diingek kalau babarapo laman mungkin masih tampil cando Sanak alun kalua log. Silakan untuak mambarasiahan singgahan panjalajah web Sanak.",
+       "logging-out-notify": "Sanak sadang kalua log, mohon manunggu sabanta",
+       "logout-failed": "Indak bisa kalua kini:$1",
        "cannotlogoutnow-title": "Indak bisa kalua kini",
        "cannotlogoutnow-text": "Indak bisa kalua katiko manggunoan $1.",
        "welcomeuser": "Salamaik datang, $1!",
        "createacct-realname": "Namo asli (opsional)",
        "createacct-reason": "Alasan",
        "createacct-reason-ph": "Manga Sanak mambuek akun lain",
+       "createacct-reason-help": "Pasan yang ditunjuakan dalam log pambuatan akun",
        "createacct-submit": "Buek akun Sanak",
        "createacct-another-submit": "ګڼون جوړول",
        "createacct-continue-submit": "Lanjuikan mambuek akun",
        "createacct-benefit-body2": "{{PLURAL:$1|laman}}",
        "createacct-benefit-body3": "{{PLURAL:$1|panyuntiang}} tarakhia",
        "badretype": "Kato sandi nan Sanak masuakan salah.",
+       "usernameinprogress": "Pambuatan akun untuak namo pangguno ko sadang dalam proses. Mohon manunggu",
        "userexists": "Namo pangguno nan dipiliah alah tapakai.\nPiliah namo nan lain.",
        "createacct-normalization": "Namo pangguno sanak akan disasuaian manjadi \"$2\" karano batasan teknis.",
        "loginerror": "Kasalahan masuak log",
        "login-migrated-generic": "Akun sanak alah dipindahan, namo pangguno Sanak alah indak tadaftar ini wiki ko.",
        "loginlanguagelabel": "Baso: $1",
        "suspicious-userlogout": "Pamintaan Sanak untuak kalua log ditulak karano tampaknyo dikirim oleh paramban nan rusak atau proksi panyinggah.",
+       "createacct-another-realname-tip": "Namo usali basifaik opsional. Kok Sanak mamakainyo, namo tu digunoan untuak manandoan jariah pangguno Sanak.",
        "pt-login": "Masuak log",
        "pt-login-button": "Masuak log",
        "pt-login-continue-button": "Lanjuikan masuak log",
        "changepassword-success": "Kato sandi Sanak alah berhasil dituka!",
        "changepassword-throttled": "Sanak alah acok bana mancubo masuak log. Mohon tunggu $1 sabalun mancubo baliak.",
        "botpasswords": "Kato sandi bot",
+       "botpasswords-summary": "<em>Kato sandi bot</em> mamungkinkan akses ka akun pangguno manggunokan API jo indak manggunokan kredensial masuak log utamo akun tasabuik. Hak pangguno nan tasadio katiko masuak log jo kato sandi bot mungkin ka dibatasi.\n\nKok Sanak indak tau dek a Sanak ka malakukan hal ko, sarancaknyo jan lakukan. Samustinyo indak ado urang lain nan buliah mamintak Sanak untuak mambuek jo manyarahan kato sandi bot ko kapadonyo.",
        "botpasswords-disabled": "Kato sandi bot indak diaktifan.",
        "botpasswords-no-central-id": "Untuak manggunoan kato sandi bot, Sanak harus masuak log ka akun nan alah disentralisasi.",
        "botpasswords-existing": "Kato sandi bot tasadio",
        "botpasswords-label-cancel": "Batalan",
        "botpasswords-label-delete": "Hapuih",
        "botpasswords-label-resetpassword": "Setel ulang kato sandi",
+       "botpasswords-label-grants": "Akses nan dapek diagiah:",
+       "botpasswords-help-grants": "Izin ka akses tatantu alah dipunyoi akun pangguno Sanak. Maaktifkan sabuah hak di siko indak maagiah akses ka akses lain nan indak dimiliki dek akun pangguno Sanak. Caliak [[Special:ListGrants|daftar hak akses]] untuak informasi salangkoknyo.",
        "botpasswords-label-grants-column": "Izin diagiah",
        "botpasswords-bad-appid": "Namo bot \"$1\" indak sah.",
        "botpasswords-insert-failed": "Gagal manambah namo bot \"$1\". Alah ditambahan sabalun iko?",
        "autoblockedtext": "Alamaik IP Sanak alah kanai sakek sacaro otomatih dek dipakai jo pangguno lain, nan alah disakek dek $1. Alasannyo dek:\n\n:<em>$2</em>\n\n* Kanai sakek sajak: $8\n* Maso sakek habih pado: $6\n* Sasaran nan disakek: $7\n\nSanak dapek maubuangi $1 atau [[{{MediaWiki:Grouppage-sysop}}|panguruih lainnya]] untuak marundiangan pakaro ko.\n\nSanak indak dapek manggunoan pakakeh \"{{int:emailuser}}\" kacuali Sanak alah mamasuakan alamaik surel nan sah pado [[Special:Preferences|pangaturan akun]] dan Sanak indak sadang disakek untuak manggunoannyo.\n\nAlamaik IP Sanak adolah $3, dan ID panyakekan adolah $5.\nTolong saratoan informasi di ateh pado satiok patanyaan nan Sanak buek.",
        "systemblockedtext": "Namo pangguno atau alamaik IP Sanak alah disakek sacaro otomatis dek MediaWiki.\nAlasan nan diagiah adolah:\n\n:<em>$2</em>\n\n* Disakek sajak: $8\n* Sakek kadaluwarsa pado: $6\n* Sasaran panyakekan: $7\n\nAlamaik IP Sanak kini adolah $3\nMohon saratokan sadoalah parincian di ateh dalam satiok patanyoan nan Sanak ajukan.",
        "blockednoreason": "indak ado alasan nan diagiah.",
+       "blockedtext-composite": "Namo pangguno atau alamaik IP Sanak alah disakek sacaro otomatis dek MediaWiki.\nAlasan nan diagiah adolah:\n\n:<em>$2</em>\n\n* Disakek sajak: $8\n* Sakek kadaluwarsa pado: $6\n* Sasaran panyakekan: $7\n\nAlamaik IP Sanak kini adolah $3\nMohon saratokan sadoalah parincian di ateh dalam satiok patanyoan nan Sanak ajukan.",
        "blockedtext-composite-ids": "Panyakekan ID relevan: $1 (alamaik IP Sanak juo dapek dicekal)",
        "blockedtext-composite-no-ids": "Alamaik IP Sanak muncua dalam daftar itam gando",
        "blockedtext-composite-reason": "Ado panyakekan bagando ka bakeh akun Sanak dan/atau alamaik IP Sanak.",
        "unsupported-content-diff2": "Pabedaan antaro model konten $1 jo $2 indak didukuang di wiki ko.",
        "deprecated-self-close-category": "Laman nan menggunoan tag HTML tatutuik-surang indak sah",
        "deprecated-self-close-category-desc": "Laman ko manganduang tag HTML tatutuik-surang nan indak sah, sarupo <code>&lt;b/></code> atau <code>&lt;span/></code>.  Parilaku tag sarupo ko ka sagiro barubah supayo konsisten jo spesifikasi HTML5, jadi panggunoannyo dalam teks wiki indak lai disarankan.",
+       "duplicate-args-warning": "<strong>Paringatan:</strong> [[:$1]] maimbau [[:$2]] jo nilai labiah dari ciek untuak parameter \"$3\". Anyo nilai tarakhia nan tasadio nan ka digunokan.",
+       "duplicate-args-category": "Laman jo argumen gando di pamanggilan templat",
+       "duplicate-args-category-desc": "Laman ko barisi pamanggilan templat nan manggunokan argumen gando, sarupo <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> atau <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Paringatan:''' Laman ko manganduang talalu banyak panggilan fungsi parser.\n\nSeharusnyo kurang dari $2 {{PLURAL:$2|panggilan}}, tapi {{PLURAL:$1|kini ado $1 panggilan}}.",
        "expensive-parserfunction-category": "Laman nan talalu banyak panggilan fungsi parser",
        "post-expand-template-inclusion-warning": "'''Peringatan:''' Ukuran templat talalu gadang.\nBabarapo templat akan diabaikan.",
        "post-expand-template-argument-category": "Laman nan barisi uraian templat nan diabaikan",
        "parser-template-loop-warning": "Hubungan barulang templat tadeteksi: [[$1]]",
        "template-loop-category": "Laman jo templat barulang",
+       "template-loop-category-desc": "Laman ko manganduang templat malingka, yaitu templat nan maimbau dirinyo surang sacaro bolak-balik.",
+       "template-loop-warning": "<strong>Paringatan:</strong> Laman ko maimbau [[:$1]] nan manyababkan <i>template loop</i> (panggilan rekursif tak inggo).",
        "parser-template-recursion-depth-warning": "Limit kadalaman hubungan barulang templat lah talampau ($1)",
        "language-converter-depth-warning": "Bateh kadalaman pangonversi bahaso lah talampau ($1)",
        "node-count-exceeded-category": "Laman dimano hitungan-node talampaui",
+       "node-count-exceeded-category-desc": "Laman ko malampaui jumlah node maksimum.",
        "node-count-exceeded-warning": "Laman nan labiah jumlah node",
        "expansion-depth-exceeded-category": "Laman dima kadalaman ekspansi lah talampau",
+       "expansion-depth-exceeded-category-desc": "Laman nan malabiahi kadalaman laweh maksimum.",
        "expansion-depth-exceeded-warning": "Laman kadalaman ekspansi lah talampau",
        "parser-unstrip-loop-warning": "Unstrip loop detected",
        "unstrip-depth-warning": "Unstrip recursion limit exceeded ($1)",
+       "unstrip-depth-category": "Laman-laman di mano bateh kadalaman unstrip alah malabiahi bateh",
+       "unstrip-size-warning": "Bateh ukuran unstrip alah malabiahi bateh ($1)",
+       "unstrip-size-category": "Laman-laman di mano bateh ukuran unstrip alah malabiahi bateh",
        "converter-manual-rule-error": "Kasalahan tadeteksi di aturan manual konversi bahaso",
        "undo-success": "Suntiangan ko dapek dibatalan. \nTolong cek pabedoan di bawah untuak mayakinkan bahwa bana nan tu Sanak nio buek, lalu simpan parubahan tasabuik untuak manyalasaikan pambatalan suntiangan.",
        "undo-failure": "Suntiangan ko indak dapek dibatalan dek konflik panyuntiangan antaro.",
+       "undo-main-slot-only": "Suntiangan ko indak dapek dibatalkan dek tindakan ko malibaikkan konten di lua slot utamo.",
        "undo-norev": "Suntiangan ko indak dapek dibatalan dek laman indak ditamukan atau lah dihapuih.",
+       "undo-nochange": "Suntiangan ko nampaknyo alah dibatalkan.",
        "undo-summary": "Mambatalan revisi $1 oleh [[Special:Contributions/$2|$2]] ([[User talk:$2|maota]])",
        "undo-summary-anon": "Baliakan revisi $1 dek [[Special:Contributions/$2|$2]]",
+       "undo-summary-username-hidden": "Batalkan revisi $1 dek surang pangguno tasuruak",
        "cantcreateaccount-text": "Mambuek akun dari alamat IP ko ('''$1''') alah diblok jo [[User:$3|$3]].\n\nAlasan nan diagiah jo $3 adolah ''$2''",
+       "cantcreateaccount-range-text": "Pambuatan akun dari alamaik IP dalam rantang <strong>$1</strong>, nan mancakuik alamaik IP Sanak (<strong>$4</strong>), alah disakek dek [[User:$3|$3]].\n\nAlasan nan diagiah dek  $3  adolah <em>$2</em>",
        "viewpagelogs": "Caliak log untuak laman ko",
        "nohistory": "Indak ado sajarah panyuntiangan untuak laman ko",
        "currentrev": "Revisi tabaru",
        "history-feed-description": "Riwayaik revisi laman ko di wiki",
        "history-feed-item-nocomment": "$1 pado $2",
        "history-feed-empty": "Laman nan dicari indak ado.\nMungkin alah dihapuih dari wiki, atau diagiah namo baru.\nCuba [[Special:Search|cari dulu]] untuak laman lain nan relevan.",
+       "history-edit-tags": "Suntiang tag dari revisi nan tapiliah",
        "rev-deleted-comment": "(ikhtisar suntiangan dihapuih)",
        "rev-deleted-user": "(namo pangguno dihapuih)",
        "rev-deleted-event": "(rincian log dihapuih)",
        "rev-deleted-user-contribs": "[namo pangguno atau alamaik IP dihapuih - suntiangan disuruakan dari daftar jariah]",
        "rev-deleted-text-permission": "Revisi laman ko alah '''dihapuih'''.\nRinciannyo mungkin ado di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pangapuihan]",
+       "rev-suppressed-text-permission": "Laman revisi ko alah '''dihapuih'''.\nSanak dapek mancaliaknyo; rinciannyo mungkin ado di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pangapuihan].",
        "rev-deleted-text-unhide": "Revisi laman ko alah '''dihapuih'''.\nRinciannyo mungkin ado di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pangapuihan].\nSanak masih dapek [$1 mancaliak revisi ko] ko' amuah.",
        "rev-suppressed-text-unhide": "Revisi laman ko alah '''tabanam'''.\nRinciannyo mungkin ado di [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} log pambanaman].\nAngku masih dapek [$1 maliek revisi ko] ko' amuah.",
        "rev-deleted-text-view": "Laman revisi ko alah '''dihapuih'''.\nSanak dapek mancaliaknyo; rinciannyo mungkin ado di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pangapuihan].",
        "revdelete-no-file": "Berkas nan dituju indak basobok.",
        "revdelete-show-file-confirm": "Apokah Sanak yakin nio mancaliak revisi nan alah dihapuih dari berkas \"<nowiki>$1</nowiki>\" per $3, $2?",
        "revdelete-show-file-submit": "Yo",
+       "revdelete-selected-text": "{{PLURAL:$1|Revisi tapiliah|Revisi tapiliah}} dari [[:$2]]:",
+       "revdelete-selected-file": "{{PLURAL:$1|Versi berkas tapilih|Versi berkas tapiliah}} dari [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Log piliahan}}:",
+       "revdelete-text-text": "Revisi nan diapuik ka tatap muncua di laman riwayaik, tapi bagian dari kontennyo ka manjadi indak dapek diakses untuak umum.",
+       "revdelete-text-file": "Versi berkas nan diapuih ka tatap muncua di riwayaik berkas, tapi bagian dari kontennyo ka manjadi indak dapek diakses untuak umum.",
+       "logdelete-text": "Acara log nan diapuih ka tatap muncua di log, tapi bagian dari kontennyo manjadi indak dapek diakses untuak umum.",
+       "revdelete-text-others": "Panguruih lain masih dapek maakses konten tasuruak dan dapek mambatalkan pangapuihannyo, salain kok ado panarapan batasan tambahan.",
        "revdelete-confirm": "Tolong konfirmasi baso Sanak samemang bamakasuik malakuan iko, mamahami konsekuensinyo, dan baso Sanak malakuannyo sasuai jo [[{{MediaWiki:Policy-url}}|kabijakan]].",
        "revdelete-suppress-text": "Panyambunyian revisi <strong>hanyo</strong> buliah digunoan untuak kasus-kasus barikuik:\n* Informasi bapotensi pancemaran namo baiak\n* Informasi paribadi nan indak patuik\n*: <em>alamaik rumah jo nomor telepon, nomor kartu identitas, dll.</em>",
        "revdelete-legend": "Pangaturan bateh",
        "suppressionlog": "Log pambanaman",
        "suppressionlogtext": "Di bawah ko adolah daftar panghapuihan jo panyakekan, tamasuak isi nan disambunyian dari panguruih.\nCaliak [[Special:BlockList|daftar sakek]] untuak daftar nan paliang baru.",
        "mergehistory": "Gabuangan sijarah laman",
+       "mergehistory-header": "Laman ko mambuliahan Sanak untuak manggabuangkan revisi-revisi dari ciek laman sumber ka laman nan labiah baru.\nPastikan baso parubahan ko tatap mampatahankan kontinuitas versi laman tadahulu.",
        "mergehistory-box": "Gabuang parubahan-parubahan dari duo laman:",
        "mergehistory-from": "Laman sumber:",
        "mergehistory-into": "Laman tujuan:",
+       "mergehistory-list": "Mergeable edit history",
+       "mergehistory-merge": "Revisi-revisi barikuik dari [[:$1]] dapek digabuangkan ka [[:$2]]. Gunokan tombol radio untuak manggabuangkan revisi-revisi nan dibuek sabalun wakatu tatantu. Paratikan, manggunokan pautan navigasi ka mangeset ulang kolom.",
        "mergehistory-go": "Tampilan suntiangan nan dapek digabuang",
        "mergehistory-submit": "Gabuang revisi",
        "mergehistory-empty": "Indak ado parubahan nan dapek digabuang.",
        "mergehistory-done": "$3 {{PLURAL:$3|revision|revisions}} dari $1 {{PLURAL:$3|was|were}} berhasil digabuangan ka [[:$2]].",
        "mergehistory-fail": "Indak dapek digabuang, mohon pareso baliak laman jo parameter wakatu.",
+       "mergehistory-fail-bad-timestamp": "Stempel wakatu indak valid.",
        "mergehistory-fail-invalid-source": "Laman asal indak sah.",
        "mergehistory-fail-invalid-dest": "Laman tujuan indak sah.",
+       "mergehistory-fail-no-change": "Panggabuangan sijarah indak barhasil manggabuangkan revisi apo pun. Mohon pareso baliak parameter laman jo waktu.",
+       "mergehistory-fail-permission": "Izin panggabuangan sijarah laman indak mancukupi.",
        "mergehistory-fail-self-merge": "Laman sumber jo tujuannyo samo.",
+       "mergehistory-fail-timestamps-overlap": "Revisi asa tumpang tindih atau labiah baru dari revisi tujuan.",
+       "mergehistory-fail-toobig": "Indak dapek malakukan panggabuangan sabagai labiah dari bateh dari $1 {{PLURAL:$1|revisi|revisi}} ka dipindahkan.",
+       "mergehistory-no-source": "Laman sumber $1 indak ado.",
+       "mergehistory-no-destination": "Halaman tujuan $1 indak ado.",
+       "mergehistory-invalid-source": "Judul laman sumber harus judul nan balaku.",
+       "mergehistory-invalid-destination": "Judul halaman tujuan harus judul yang valid.",
+       "mergehistory-autocomment": "[[:$1]] alah digabuangkan ka [[:$2]]",
+       "mergehistory-comment": "[[:$1]] alah digabuangkan ka [[:$2]]: $3",
+       "mergehistory-same-destination": "Laman sumber jo tujuannyo indak samo.",
        "mergehistory-reason": "Alasan:",
        "mergelog": "Log panggabuangan",
        "revertmerge": "Batal gabuang",
        "diff-empty": "(Indak ado pabedaan)",
        "diff-multi-sameuser": "({{PLURAL:$1|Ciek parubahan antaro|$1 parubahan antaro}} dek pangguno nan samo indak ditampilkan)",
        "diff-multi-otherusers": "({{PLURAL:$1|Ciek parubahan antaro|$1 parubahan antaro}} dek {{PLURAL:$2|ciek pangguno lain|$2 pangguno}} indak ditampilkan)",
+       "diff-multi-manyusers": "({{PLURAL:$1|Ciek parubahan antaro|$1 parubahan antaro}} dek {{PLURAL:$2|ciek pangguno lain|$2 pangguno}} indak ditampakan)",
+       "diff-paragraph-moved-tonew": "Paragraf alah dipindahan. Klik untuak mamindahan ka lokasi baru.",
+       "diff-paragraph-moved-toold": "Paragraf dipindahkan. Klik untuak malumpek ka lokasi lamo.",
+       "difference-missing-revision": "{{PLURAL:$2|One revision|$2 revisions}} of this difference ($1) {{PLURAL:$2|was|were}} indak basuo.\n\nIko biasonyo dek karano pautan sijarah alah kadaluarsa. Rinciannyo dapek dicaliak di  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
        "searchresults": "Hasil pancarian",
+       "search-filter-title-prefix": "Anyo mancari laman nan judulnyo diawali dek \"$1\"",
        "search-filter-title-prefix-reset": "Cari kasado laman",
        "searchresults-title": "Hasil pancarian untuak \"$1\"",
        "titlematches": "Judul laman pas",
        "search-category": "(kategori $1)",
        "search-file-match": "(isi berkas nan sasuai)",
        "search-suggest": "Mungkin makasuiknyo: $1",
+       "search-rewritten": "Manampilan hasil untuak $1. Cari selain $2.",
        "search-interwiki-caption": "Hasil dari proyek lain",
        "search-interwiki-default": "Hasil dari $1:",
        "search-interwiki-more": "(salanjuiknyo)",
        "search-interwiki-more-results": "hasil lainnyo",
        "search-relatedarticle": "Bakaitan",
+       "search-invalid-sort-order": "Parintah manyortir $1 indak dikenali, panyortiran standar ka ditarapan. Parintah-parintah manyortir nan sah iolah: $2",
+       "search-unknown-profile": "Profil pancarian $1 tidak dikenali, profil pancarian standar ka diterapan.",
        "searchrelated": "bakaitan",
        "searchall": "sadonyo",
        "showingresults": "Di bawah ko dikaluaan sampai {{PLURAL:$1|'''$1''' hasil}}, dimulai dari #'''$2'''.",
        "showingresultsinrange": "Manampilkan {{PLURAL:$1|<strong>$1</strong> hasil}} dalam rantang #<strong>$2</strong> sampai #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Hasia <strong>$1</strong> dari <strong>$3</strong>|Hasia <strong>$1 - $2</strong> dari <strong>$3</strong>}}",
        "search-nonefound": "Indak ado hasil nan sasuai jo pamintaan",
+       "search-nonefound-thiswiki": "Indak ado hasil nan sasuai jo pamintaan",
        "powersearch-legend": "Pencarian lanjut",
        "powersearch-ns": "Mancari di ruangnamo:",
        "powersearch-togglelabel": "Piliah:",
        "powersearch-toggleall": "Sadonyo",
        "powersearch-togglenone": "Dak ado",
+       "powersearch-remember": "Ingek piliahan untuak pancarian salanjuiknyo",
        "search-external": "Pancarian lua",
        "searchdisabled": "Pancarian {{SITENAME}} dimatian.\nSanak samantaro dapek mancari lewaik Google.\nIngek indeks Google untuak {{SITENAME}} mungkin lah kadaluarsa.",
+       "search-error": "Kasalahan tajadi wakatu mancari: $1",
+       "search-warning": "Paringatan tajadi katiko mancari:$1",
        "preferences": "Pangaturan",
        "mypreferences": "Pangaturan",
        "prefs-edits": "Jumlah suntiangan:",
+       "prefsnologintext2": "Silakan masuak log untuak mangubah preferensi Sanak.",
        "prefs-skin": "Kulik",
        "skin-preview": "Caliak",
        "datedefault": "Indak usah diatua",
        "prefs-watchlist": "Daftar pantau",
        "prefs-editwatchlist": "Suntiang daftar pantauan",
        "prefs-editwatchlist-label": "Suntiang entri daftar pantauan Sanak:",
+       "prefs-editwatchlist-edit": "Caliak jo apuih judul di daftar pantauan Sanak",
+       "prefs-editwatchlist-raw": "Suntiang pantauan mantah",
+       "prefs-editwatchlist-clear": "Apuih daftar pantauan",
        "prefs-watchlist-days": "Jumlah hari dalam daftar pantau:",
        "prefs-watchlist-days-max": "Maksimum $1 {{PLURAL:$1|hari}}",
        "prefs-watchlist-edits": "Jumlah parubahan tabanyak nan ditunjuakan pado daftar pantau:",
        "prefs-watchlist-edits-max": "Nilai maksimum: 1000",
        "prefs-watchlist-token": "Token pantauan:",
+       "prefs-watchlist-managetokens": "Kalola token",
        "prefs-misc": "Lain-lain",
        "prefs-resetpass": "Tuka kato sandi",
        "prefs-changeemail": "Tuka atau hapuih alamaik surel",
        "recentchangesdays-max": "Maksimum $1 {{PLURAL:$1|hari}}",
        "recentchangescount": "Jumlah suntiangan nan ditunjuakan dalam parubahan baru, riwayaik laman, dan dalam log, sacaro baku:",
        "prefs-help-recentchangescount": "Nilai maksimum: 1000",
+       "prefs-help-watchlist-token2": "Iko adolah kunci rasio (token) ka umpan web dari daftar pantauan sanak.\nSia se nan tau dapek mancaliak daftar pantauan Sanak, jadi jan dibagian.\nKok diparaluan [[Special:ResetTokens|you can reset it]].",
+       "prefs-help-tokenmanagement": "Sanak dapek mancaliak jo maatua ulang kunci rahasio akun Sanak nan dapek maakses umpan Web dari daftar pantauan Sanak. Sia se nan tau bisa sajo mancaliak daftar pantauan Sanak, jadi jan dibagian.",
        "savedprefs": "Pangaturan lah tasimpan",
+       "savedrights": "Kalompok hak pangguno {{GENDER:$1|$1}} alah disimpan.",
        "timezonelegend": "Zona wakatu:",
        "localtime": "Wakatu satampaik:",
        "timezoneuseserverdefault": "Gunokan nan dari wiki ($1)",
        "timezoneuseoffset": "Lainnyo (tantuan pabedoannyo)",
+       "timezone-useoffset-placeholder": "Contoh nilai: \"-07:00\" atau \"01:00\"",
        "servertime": "Wakatu server:",
        "guesstimezone": "Isian dari paramban web",
        "timezoneregion-africa": "Afrika",
        "default": "baku",
        "prefs-files": "Berkas",
        "prefs-custom-css": "CSS surang",
+       "prefs-custom-json": "JSON kustom",
        "prefs-custom-js": "JS surang",
        "prefs-common-config": "CSS/JS babagi untuak kasado kulik:",
        "prefs-reset-intro": "Angku dapek manggunokan laman ko untuak mangambalikan pangaturan ka setelan baku situs ko.\nPangambalian pangaturan indak dapek dibatalan.",
        "prefs-displayrc": "Piliahan tampilan",
        "prefs-displaywatchlist": "Piliahan tampilan",
        "prefs-changesrc": "Parubahan ditampilkan",
+       "prefs-changeswatchlist": "Parubahan ditampilan",
+       "prefs-pageswatchlist": "Halaman nan dipantau",
        "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Pabedoan",
+       "prefs-help-prefershttps": "Preferensi ko akan diaktifkan salunjuiknyo katiko Sanak masuak log.",
+       "prefswarning-warning": "Parubahan preferensi Sanak alun tasimpan. Kok Sanak maninggaan halaman ko tanpa ma klik $1 preferensi Sanak indak akan dipabarui.",
+       "prefs-tabs-navigation-hint": "Tip: Sanak dapek manggunoan tombol panah kida jo suok untuak banavigasi antartab di dalam daftar tab.",
        "userrights": "Hak pangguno",
        "userrights-lookup-user": "Piliah pangguno",
        "userrights-user-editname": "Masuakan namo pangguno:",
        "editusergroup": "Muek kalompok pangguno",
        "editinguser": "Mangganti hak pangguno untuak {{GENDER:$1|pangguno}} <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "Mancaliak hak pengguna dari {{GENDER:$1|pengguno}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Suntiang kalompok {{GENDER:$1|pangguno}}",
        "userrights-viewusergroup": "Caliak kalompok {{GENDER:$1|pangguno}}",
        "saveusergroups": "Simpan kalompok {{GENDER:$1|pangguno}}",
        "userrights-expiry-options": "1 hari:1 hari,1 minggu:1 minggu,1 bulan:1 bulan,3 bulan:3 bulan,6 bulan:6bulan,1 taun:1 taun",
        "userrights-invalid-expiry": "Wakatu usang untuak kalompok \"$1\" indak sah.",
        "userrights-expiry-in-past": "Wakatu usang untuak kalompok \"$1\" alah balalu.",
+       "userrights-cannot-shorten-expiry": "Sanak indak dapek mamajuan wakatu kadaluarsa dari kaanggotaan dalam kalompok $1. Hanyo pangguno yang punyo hak akses manambahan jo mancabuik kalompok ko yang dapek mamajuan wakatu kadaluarsa.",
+       "userrights-conflict": "Konflik parubahan hak pangguno! Sila tinjau ulang jo konfirmasi parubahan Sanak.",
        "group": "Kalompok:",
        "group-user": "Pangguno",
        "group-autoconfirmed": "Pangguno takonfirmasi otomatih",
        "right-createpage": "Mambuek laman baru (nan bukan laman diskusi)",
        "right-createtalk": "Mambuek laman diskusi",
        "right-createaccount": "Mambuek akun baru",
+       "right-autocreateaccount": "Masuak log otomatis jo akun pangguno lua",
        "right-minoredit": "Manandoi suntiangan ketek",
        "right-move": "Mamindahan laman",
        "right-move-subpages": "Mamindahan laman jo kasado sublaman",
        "right-move-rootuserpages": "Mamindahan laman pangguno",
+       "right-move-categorypages": "Pindahan halaman kategori",
        "right-movefile": "Mamindahan berkas",
        "right-suppressredirect": "Indak mambuek pangaliahan wakatu mamindahan laman",
        "right-upload": "Mamuek berkas",
        "right-reupload": "Manimpo berkas lamo",
        "right-reupload-own": "Manimpo berkas nan dimuek surang",
+       "right-reupload-shared": "Manolak berkas-berkas pado panyimpanan media lokal basamo",
+       "right-upload_by_url": "Masuakan berkas dari alamat URL",
        "right-purge": "Mangapuih singgahan laman untuak laman",
        "right-autoconfirmed": "Indak dipangaruahi bateh limik babasis IP",
        "right-bot": "Dipalakuan sabagai proses otomatih",
        "right-apihighlimits": "Manggunoan bateh labiah tinggi dalam kueri API",
        "right-writeapi": "Manggunoan panulisan API",
        "right-delete": "Mangapuih laman",
+       "right-bigdelete": "Apuih halaman yang banyak versi terdahulunyo",
+       "right-deletelogentry": "Maapuih jo mambatalan pangapuihan entri log tatantu",
+       "right-deleterevision": "Maapuih jo mambatalan pangapuihan parubahan tatantu suatu halaman",
+       "right-deletedhistory": "Caliak revisi entri-entri yang diapuih, tanpa teks yang bahubuangan",
+       "right-deletedtext": "Caliak teks yang diapuih jo parubahan antaro revisi yang diapuih",
+       "right-browsearchive": "Cari laman nan dihapuih",
+       "right-undelete": "Mambaliakan halaman nan diapuih",
+       "right-suppressrevision": "Manampilan, manyambunyian jo mambatalan panyambunyian revisi tatantu suatu halaman dari pangguno",
+       "right-viewsuppressed": "Caliak parubahan yang disambunyian dari sadolah pangguno",
        "right-suppressionlog": "Mancaliak log privat",
+       "right-block": "Blokir pangguno lain dari panyuntingan",
+       "right-blockemail": "Mamblokir pangiriman surel dek pangguno",
+       "right-hideuser": "Mamblokir namo pangguno jo manyambunyiannyo dari publik",
+       "right-ipblock-exempt": "Mangabaikan pamblokiran IP, pamblokiran otomatis, jo jarak pamblokiran",
        "right-unblockself": "Malapehan sakek surang",
+       "right-protect": "Ubah tingkek palinduangan jo suntiang halaman yang dilinduangi baruntun",
+       "right-editprotected": "Manyuntiang halaman yang dilinduangi sabagai \"{{int:protect-level-sysop}}\"",
        "right-editinterface": "Manyuntiang antarmuko pangguno",
        "right-editusercss": "Manyuntiang berkas CSS pangguno lain",
        "right-edituserjson": "Manyuntiang berkas JSON pangguno lain",
index 410e3ab..37611e2 100644 (file)
@@ -71,6 +71,7 @@
        "tog-useeditwarning": "Предупреди ме кога сакам да напуштам страница за уредување без да ги имам зачувано промените",
        "tog-prefershttps": "Секогаш најавувај ме преку безбедна врска",
        "tog-showrollbackconfirmation": "Прикажи потврдница при стискање на врската за отповикување",
+       "tog-requireemail": "Барај е-пошта за ставање нова лозинка",
        "underline-always": "Секогаш",
        "underline-never": "Никогаш",
        "underline-default": "Според рувото или прелистувачот",
        "prefs-help-email": "Е-поштата е незадолжителна, но ќе ви треба за добивање на нова лозинка ако си ја заборавите постоечката.",
        "prefs-help-email-others": "Можете да изберете другите да ве контактираат преку вашата корисничка страница без да го откриете вашиот идентитет.",
        "prefs-help-email-required": "Е-поштенска адреса е задолжително да се наведе.",
+       "prefs-help-requireemail": "Ако е штиклирано, можноста за нова лозинка ќе ја имаат само корисниците што навеле корисничко име и е-пошта.",
        "prefs-info": "Основни информации",
        "prefs-i18n": "Јазик",
        "prefs-signature": "Потпис",
        "ipblocklist-legend": "Најди блокиран корисник",
        "blocklist-userblocks": "Скриј блокирања на корис. сметки",
        "blocklist-tempblocks": "Скриј привремени блокирања",
+       "blocklist-indefblocks": "Скриј бесконечни блокови",
        "blocklist-addressblocks": "Скри блокирања на поединечни IP-адреси",
        "blocklist-type": "Вид:",
        "blocklist-type-opt-all": "Сите",
index cd64fb3..fef0de8 100644 (file)
        "tag-mw-undo": "နောက်ပြန် ပြန်ပြင်ခြင်း",
        "tags-title": "အမည်တွဲများ",
        "tags-tag": "အမည်တွဲ အမည်",
+       "tags-display-header": "ပြောင်းလဲချက် စာရင်းများပေါ်တွင် ပေါ်ထင်မှု",
        "tags-description-header": "ဆိုလိုရင်းအဓိပ္ပာယ် အပြည့်အစုံ",
        "tags-source-header": "ရင်းမြစ်",
+       "tags-active-header": "သက်ဝင်?",
+       "tags-hitcount-header": "အမည်တွဲထားသော ပြောင်းလဲမှုများ",
        "tags-actions-header": "ဆောင်ရွက်ချက်များ",
        "tags-active-yes": "မှန်",
        "tags-active-no": "မလုပ်ပါ",
index 7ccdd86..88c7bc7 100644 (file)
        "tog-useeditwarning": "Si ifra dersom jeg forlater en side uten å lagre den.",
        "tog-prefershttps": "Bruk alltid en trygg forbindelse når du er innlogget",
        "tog-showrollbackconfirmation": "Be om bekreftelse når man klikker på en tilbakestillingslenke",
+       "tog-requireemail": "Krev epost for tilbakestilling av passord",
        "underline-always": "Alltid",
        "underline-never": "Aldri",
        "underline-default": "Drakta eller nettleserens standardinnstillinger",
        "undo-norev": "Redigeringen kunne ikke fjernes fordi den ikke eksisterer eller ble slettet",
        "undo-nochange": "Det ser ut til at redigeringen allerede er tilbakestilt.",
        "undo-summary": "Fjerner revisjon $1 av [[Special:Contributions/$2|$2]] ([[User talk:$2|diskusjon]])",
+       "undo-summary-anon": "Fjerner revisjon $1 av [[Special:Contributions/$2|$2]]",
        "undo-summary-username-hidden": "Fjern revisjon $1 av en skjult bruker",
        "cantcreateaccount-text": "Kontooppretting fra denne IP-adressen ('''$1''') har blitt blokkert av [[User:$3|$3]].\n\nGrunnen som ble oppgitt av $3 er ''$2''",
        "cantcreateaccount-range-text": "Opprettelsen av en brukerkonto fra IP-adresser i intervallet <strong>$1</strong>, som inneholder din IP-adresse (<strong>$4</strong>), er blitt blokkert av [[User:$3|$3]].\n\nÅrsaken angitt av $3 er <em>$2</em>",
        "prefs-help-email": "Å angi e-postadresse er valgfritt, men er nødvendig for å få tilsendt nytt passord om du skulle glemme det gamle.",
        "prefs-help-email-others": "Du kan også velge å la andre brukere kontakte deg via brukersiden din uten å røpe identiteten din.",
        "prefs-help-email-required": "E-postadresse er påkrevd.",
+       "prefs-help-requireemail": "Hvis denne er valgt vil vi kunne sende eposter om tilbakestilling av passord dersom den som ber om det oppgir både brukernavn og epostadresse for kontoen.",
        "prefs-info": "Grunnleggende informasjon",
        "prefs-i18n": "Internasjonalisering",
        "prefs-signature": "Signatur",
        "alreadyrolled": "Kan ikke fjerne den siste redigeringen på [[$1]] av [[User:$2|$2]] ([[User talk:$2|diskusjon]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); en annen har allerede redigert siden eller fjernet redigeringen.\n\nDen siste redigeringen ble foretatt av [[User:$3|$3]] ([[User talk:$3|diskusjon]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Redigeringskommentaren var: <em>$1</em>",
        "revertpage": "Tilbakestilte endringer av [[Special:Contributions/$2|$2]] ([[User talk:$2|brukerdiskusjon]]) til siste versjon av [[User:$1|$1]]",
+       "revertpage-anon": "Tilbakestilte endringer av [[Special:Contributions/$2|$2]] til siste versjon av [[User:$1|$1]]",
        "revertpage-nouser": "Tilbakestilt endringer av skjult bruker til siste versjon av\n{{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Tilbakestilte endringer av {{GENDER:$3|$1}}; endret til siste versjon av {{GENDER:$4|$2}}.",
        "sessionfailure-title": "Sesjonsfeil",
index 4bf2965..626fbc8 100644 (file)
                        "PiefPafPier"
                ]
        },
-       "tog-underline": "Verwiezingen onderstrepen",
-       "tog-hideminor": "Kleine wiezigingen verbargen in \"Leste wiezigingen\"",
-       "tog-hidepatrolled": "Wiezigingen die emarkeerd bin verbargen in \"Leste wiezigingen\"",
-       "tog-newpageshidepatrolled": "Ziejen die emarkeerd bin, verbargen in de lieste mit nieje artikels",
-       "tog-extendwatchlist": "Volglieste uutbreien, zodat alle wiezigingen zichtbaor bin, en niet allinnig de leste wieziging",
-       "tog-usenewrc": "Groepeer wiezigingen per zied in \"Leste wiezigingen\" en \"Mien volglieste\"",
-       "tog-numberheadings": "Koppen vanzelf nummeren",
-       "tog-editondblclick": "Mit dubbelklik bewarken",
-       "tog-editsectiononrightclick": "Bewarken van deelziejen meugelik maken mit n rechtermuusklik op n tussenkop",
-       "tog-watchcreations": "Spul wa'k anmake op mien volglieste zetten",
-       "tog-watchdefault": "Spul wa'k bewarke op mien volglieste zetten",
-       "tog-watchmoves": "Spul wa'k herneume op mien volglieste zetten",
-       "tog-watchdeletion": "Spul wa'k vortdo op mien volglieste zetten",
-       "tog-watchrollback": "Ziejen waorvan ik bewarkingen weerummedreid hebbe automaties volgen",
-       "tog-minordefault": "Markeer alle veraanderingen as 'kleine wieziging'",
-       "tog-previewontop": "De naokiekzied boven t bewarkingsveld zetten",
-       "tog-previewonfirst": "Naokieken bie eerste wieziging",
-       "tog-enotifwatchlistpages": "Stuur mien n berichjen over zied- of bestaandswiezigingen uut mien volglieste.",
-       "tog-enotifusertalkpages": "Stuur mien n berichjen as mien overlegzied ewiezigd is.",
-       "tog-enotifminoredits": "Stuur mien oek n berichjen bie kleine bewarkingen van ziejen en bestaanden",
-       "tog-enotifrevealaddr": "Mien netpostadres laoten zien in netposttiejigen",
-       "tog-shownumberswatching": "t Antal gebrukers bekieken die disse zied volgt",
-       "tog-oldsig": "Bestaonde haandtekening:",
-       "tog-fancysig": "Ondertekening zien as wikitekste (zonder automatiese verwiezing)",
-       "tog-uselivepreview": "Gebruuk \"rechtstreeks naokieken\"",
-       "tog-forceeditsummary": "Geef n melding bie n lege samenvatting",
-       "tog-watchlisthideown": "Verbarg mien eigen bewarkingen",
-       "tog-watchlisthidebots": "Verbarg botgebrukers",
-       "tog-watchlisthideminor": "Verbarg kleine wiezigingen in mien volglieste",
-       "tog-watchlisthideliu": "Bewarkingen van an-emelde gebrukers op mien volglieste verbargen",
-       "tog-watchlisthideanons": "Bewarkingen van anonieme gebrukers op mien volglieste verbargen",
-       "tog-watchlisthidepatrolled": "Wiezigingen die emarkeerd bin op volglieste verbargen",
-       "tog-ccmeonemails": "Stuur mien kopieën van berichten an aandere gebrukers",
-       "tog-diffonly": "Laot de inhoud van ziejen niet onder de an-egeven wiezigingen zien.",
-       "tog-showhiddencats": "Laot verbörgen kategorieën zien",
-       "tog-norollbackdiff": "Wiezigingen vortlaoten nao t weerummedreien",
-       "tog-useeditwarning": "Waorschuw mien a'k n bewörken zied aof wil sluten die nog niet op-esleugen is",
-       "tog-prefershttps": "Altied n beveiligde verbiending gebruken a'j an-emeld bin",
-       "underline-always": "Altied",
+       "tog-underline": "Verwysingen understreapen",
+       "tog-hideminor": "Kleine wysigingen verbargen in \"Lätste wysigingen\"",
+       "tog-hidepatrolled": "Wysigingen dee markeerd binnet verbargen in \"Lätste wysigingen\"",
+       "tog-newpageshidepatrolled": "Syden dee markeerd binnet, verbargen in de lyste mid nye artikels",
+       "tog-extendwatchlist": "Volglyste uutbreiden, sodat alle wysigingen sichtbår binnet, en neet allinnig de lätste wysigingen",
+       "tog-usenewrc": "Gruppeer wysigingen per syde in \"Lätste wysigingen\" en \"Myn volglyste\"",
+       "tog-numberheadings": "Upskrivten vanselv nummeren",
+       "tog-editondblclick": "Mid dubbelklik bewarken",
+       "tog-editsectiononrightclick": "Bewarken van deylsyden möägelik maken mid een rechtermuusklik up een tüskenupskrivt",
+       "tog-watchcreations": "Spül wat ik anmake up myn volglyste setten",
+       "tog-watchdefault": "Spül wat ik bewarke up myn volglyste setten",
+       "tog-watchmoves": "Spül wat ik hernöme up myn volglyste setten",
+       "tog-watchdeletion": "Spül wat ik vordsmyte up myn volglyste setten",
+       "tog-watchrollback": "Syden wårvan ik bewarkingen weaderümmedraid hebbe automatisk volgen",
+       "tog-minordefault": "Markeer alle veranderingen as 'kleine wysiging'",
+       "tog-previewontop": "De nåkyksyde boaven et bewarkingsveld setten",
+       "tog-previewonfirst": "Nåkyken by eyrste wysiging",
+       "tog-enotifwatchlistpages": "Stüür my een bericht oaver syd- of bestandswysigingen uut myn volglyste.",
+       "tog-enotifusertalkpages": "Stüür my een bericht as myn oaverlegsyde wysigd is.",
+       "tog-enotifminoredits": "Stüür my ouk een bericht by kleine bewarkingen van syden en bestanden",
+       "tog-enotifrevealaddr": "Myn e-postadres låten seen in e-postberichten",
+       "tog-shownumberswatching": "Et antal brukers bekyken dee disse syde volgt",
+       "tog-oldsig": "Bestånde handteykening:",
+       "tog-fancysig": "Underteykening seen as wikitekst (sunder automatiske verwysing)",
+       "tog-uselivepreview": "Nåkyksyde låten seen sunder eyrst te herladen",
+       "tog-forceeditsummary": "Geav een melding by een leadige samenvatting",
+       "tog-watchlisthideown": "Verbarg myn eigen bewarkingen",
+       "tog-watchlisthidebots": "Verbarg botbrukers",
+       "tog-watchlisthideminor": "Verbarg kleine wysigingen in myn volglyste",
+       "tog-watchlisthideliu": "Bewarkingen van anmeldede brukers up myn volglyste verbargen",
+       "tog-watchlisthideanons": "Bewarkingen van anonyme brukers up myn volglyste verbargen",
+       "tog-watchlisthidepatrolled": "Wysigingen dee markeerd binnet up volglyste verbargen",
+       "tog-ccmeonemails": "Stüür my kopien van berichten an andere brukers",
+       "tog-diffonly": "Under wysigingen neet de syde-inhold låten seen.",
+       "tog-showhiddencats": "Låt verbörgen kategoryen seen",
+       "tog-norollbackdiff": "Wysigingen vordlåten nå et weaderümmedraien",
+       "tog-useeditwarning": "Wårschüw my as ik een bewarkede syde afsluten wil dee noch neet seakerd is",
+       "tog-prefershttps": "Altyd een beveiligde verbinding bruken as jy anmelded binnet",
+       "underline-always": "Altyd",
        "underline-never": "Nooit",
-       "underline-default": "Standard in joew vormgeving of webkieker",
-       "editfont-style": "Lettertype veur de tekste t bewarkingsveld:",
-       "editfont-monospace": "Lettertype waorvan t tekenbreedte vaste steet",
+       "underline-default": "Standard in juw formgeaving of webkyker",
+       "editfont-style": "Lettertype vöär de tekst in et bewarkingsveld:",
+       "editfont-monospace": "Lettertype wårvan de teykenbreydte vast steyt",
        "editfont-sansserif": "Sans-seriflettertype",
        "editfont-serif": "Seriflettertype",
        "sunday": "sündag",
@@ -96,7 +96,7 @@
        "december": "december",
        "january-gen": "januåri",
        "february-gen": "februåri",
-       "march-gen": "meert",
+       "march-gen": "määrt",
        "april-gen": "april",
        "may-gen": "mei",
        "june-gen": "juni",
        "september-gen": "september",
        "october-gen": "oktober",
        "november-gen": "november",
-       "december-gen": "desember",
+       "december-gen": "december",
        "jan": "jan",
        "feb": "feb",
        "mar": "mrt",
        "oct": "okt",
        "nov": "nov",
        "dec": "dec",
-       "january-date": "$1 jannewaori",
-       "february-date": "$1 febrewaori",
-       "march-date": "$1 meert",
+       "january-date": "$1 janri",
+       "february-date": "$1 febrri",
+       "march-date": "$1 määrt",
        "april-date": "$1 april",
        "may-date": "$1 mei",
        "june-date": "$1 juni",
        "september-date": "$1 september",
        "october-date": "$1 oktober",
        "november-date": "$1 november",
-       "december-date": "$1 desember",
+       "december-date": "$1 december",
        "pagecategories": "{{PLURAL:$1|Kategory|Kategoryen}}",
        "category_header": "Artikels in kategory $1",
-       "subcategories": "Subkategorieën",
-       "category-media-header": "Media in kategorie \"$1\"",
-       "category-empty": "''In disse kategoria staon op t moment nog gien artikels of media.''",
+       "subcategories": "Subkategoryen",
+       "category-media-header": "Media in kategory \"$1\"",
+       "category-empty": "<em>In disse kategory stån up et moment noch geen syden of media.</em>",
        "hidden-categories": "Verbörgen {{PLURAL:$1|kategory|kategoryen}}",
-       "hidden-category-category": "Verbörgen kategorieën",
+       "hidden-category-category": "Verbörgen kategoryen",
        "category-subcat-count": "{{PLURAL:$2|Disse kategory hevt de volgende subkategory.|Disse kategory hevt de volgende {{PLURAL:$1|subkategory|$1 subkategoryen}}, van in totaal $2.}}",
-       "category-subcat-count-limited": "Disse kategorie hef de volgende {{PLURAL:$1|subkategorie|$1 subkategorieën}}.",
+       "category-subcat-count-limited": "Disse kategory hevt de volgende {{PLURAL:$1|subkategory|$1 subkategoryen}}.",
        "category-article-count": "{{PLURAL:$2|In disse kategory steyt allinnig de volgende syde.|De volgende {{PLURAL:$1|syde steyt|$1 syden stån}} in disse kategory, van in totaal $2.}}",
-       "category-article-count-limited": "In disse kategorie {{PLURAL:$1|steet de volgende zied|staon de volgende $1 ziejen}}.",
-       "category-file-count": "In disse kategorie {{PLURAL:$2|steet t volgende bestaand|staon de volgende $1 bestaanden, van in totaal $2}}.",
-       "category-file-count-limited": "In disse kategorie {{PLURAL:$1|steet t volgende bestaand|staon de volgende $1 bestaanden}}.",
+       "category-article-count-limited": "In disse kategory {{PLURAL:$1|steyt de volgende syde|stån de volgende $1 syden}}.",
+       "category-file-count": "In disse kategory {{PLURAL:$2|steyt et volgende bestand|stån de volgende $1 bestanden, van in totaal $2}}.",
+       "category-file-count-limited": "In disse kategory {{PLURAL:$1|steyt et volgende bestand|stån de volgende $1 bestanden}}.",
        "listingcontinuesabbrev": "(vervolg)",
-       "index-category": "Te indexeren ziejen",
+       "index-category": "Te indekseren syden",
        "noindex-category": "Syden dee neet indexeerd binnen",
-       "broken-file-category": "Ziejen mit verkeerde bestaandsverwiezingen",
-       "about": "Informasie",
+       "broken-file-category": "Syden mid verkeyrde bestandsverwysingen",
+       "about": "Informaty",
        "article": "Artikel",
-       "newwindow": "(niej vienster)",
+       "newwindow": "(ny vinster)",
        "cancel": "Afbreaken",
-       "moredotdotdot": "Meer...",
-       "morenotlisted": "Disse lieste is niet kompleet...",
-       "mypage": "Gebrukerszied",
+       "moredotdotdot": "Meyr...",
+       "morenotlisted": "Disse lyste is möägelik neet kompleet.",
+       "mypage": "Brukerssyde",
        "mytalk": "Myn oaverleg",
        "anontalk": "Oaverleg",
        "navigation": "Navigaty",
        "and": "&#32;en",
-       "faq": "Vragen die vake esteld wörden",
-       "actions": "Haandeling",
+       "faq": "Vake stelde vrågen",
+       "actions": "Handelingen",
        "namespaces": "Naamruumdes",
        "variants": "Varianten",
        "navigation-heading": "Navigatymenü",
        "errorpagetitle": "Foutmelding",
-       "returnto": "Weerumme naor $1.",
+       "returnto": "Weaderümme nå $1.",
        "tagline": "Van {{SITENAME}}",
        "help": "Hülpe",
        "search": "Söken",
        "updatedmarker": "bie-ewörken sinds mien leste bezeuk",
        "printableversion": "Afdrükbåre versy",
        "permalink": "Vaste verwysing",
-       "print": "Aofdrokken",
+       "print": "Afdrükken",
        "view": "Leasen",
        "view-foreign": "Bekyken up $1",
        "edit": "Bewarken",
        "edit-local": "Lokale beschrieving bewarken",
        "create": "Anmaken",
-       "create-local": "Lokale beschrieving derbie doon",
-       "delete": "Vortdoon",
-       "undelete_short": "$1 {{PLURAL:$1|versie|versies}} weerummeplaotsen",
-       "viewdeleted_short": "{{PLURAL:$1|Eén versie die vortedaon is|$1 versies die vortedaon bin}} bekieken",
+       "create-local": "Lokale beskryving tovogen",
+       "delete": "Vordsmyten",
+       "undelete_short": "$1 {{PLURAL:$1|versy|versys}} weaderümmeplaatsen",
+       "viewdeleted_short": "{{PLURAL:$1|Eyn versy dee vordsmeaten is|$1 versys dee vortsmeaten binnet}} bekyken",
        "protect": "Beveiligen",
-       "protect_change": "wiezigen",
+       "protect_change": "wysigen",
        "unprotect": "Beveiliging wysigen",
-       "newpage": "Nieje zied",
+       "newpage": "Nye syde",
        "talkpagelinktext": "Oaverleg",
        "specialpage": "Speciale syde",
        "personaltools": "Persoonlike instellingen",
        "talk": "Oaverleg",
        "views": "Weadergåven",
-       "toolbox": "Hülpmiddels",
-       "tool-link-userrights": "{{GENDER:$1|Gebrukersgruppen}} wysigen",
-       "tool-link-emailuser": "Disse {{GENDER:$1|gebruker}} een bericht stüren",
-       "imagepage": "Bestaandszied bekieken",
-       "mediawikipage": "Tiejige bekieken",
-       "templatepage": "Mal bekieken",
-       "viewhelppage": "Hulpzied bekieken",
-       "categorypage": "Kategoriezied bekieken",
-       "viewtalkpage": "Bekiek overlegzied",
+       "toolbox": "Warktügen",
+       "tool-link-userrights": "{{GENDER:$1|Brukersgruppen}} wysigen",
+       "tool-link-emailuser": "Disse {{GENDER:$1|bruker}} een bericht stüren",
+       "imagepage": "Bestandssyde bekyken",
+       "mediawikipage": "Berichtsyde bekyken",
+       "templatepage": "Mal bekyken",
+       "viewhelppage": "Hülpsyde bekyken",
+       "categorypage": "Kategorysyde bekyken",
+       "viewtalkpage": "Bekyk oaverlegsyde",
        "otherlanguages": "Andere språken",
        "redirectedfrom": "(döärstüürd vanaf \"$1\")",
-       "redirectpagesub": "Deurverwieszied",
-       "redirectto": "Deurverwiezen naor:",
+       "redirectpagesub": "Döärverwyssyde",
+       "redirectto": "Döärverwysen nå:",
        "lastmodifiedat": "Disse syde is et lätst wysigd up $1 üm $2.",
-       "viewcount": "Disse zied is $1 {{PLURAL:$1|keer|keer}} bekeken.",
-       "protectedpage": "Beveiligden zied",
+       "viewcount": "Disse syde is $1 {{PLURAL:$1|keyr}} bekeaken.",
+       "protectedpage": "Beveiligde syde",
        "jumpto": "Gå nå:",
        "jumptonavigation": "navigaty",
        "jumptosearch": "söök",
-       "view-pool-error": "De servers bin op heden overbelast.\nTe veule gebrukers proberen disse zied te bekieken.\nWacht effen veurda'j opniej toegang proberen te kriegen tot disse zied.\n\n$1",
-       "generic-pool-error": "De servers bin op heden overbelast.\nTe veule gebrukers proberen disse zied te bekieken.\nWacht effen veurda'j opniej toegang proberen te kriegen tot disse zied.",
-       "pool-timeout": "De maximumwachttied veur databankvergrendeling is verleupen.",
-       "pool-queuefull": "De wachtrie van de poel is vol",
-       "pool-errorunknown": "Onbekende fout",
-       "pool-servererror": "De dienst \"pool counter\" is niet beschikbaor ($1).",
+       "view-pool-error": "De servers binnet momenteel oaverbelasted.\nTe vöäle lüde proberet disse syde te bekyken.\nWacht evven vöärdat jy upny togang proberet te krygen tot disse syde.\n\n$1",
+       "generic-pool-error": "De servers binnet momenteel oaverbelasted.\nTe vöäle lüde proberet disse syde te bekyken.\nWacht evven vöärdat jy upny togang proberet te krygen tot disse syde.",
+       "pool-timeout": "De maksimumwachttyd vöär databankvergrendeling is verlöypen.",
+       "pool-queuefull": "De wachtryge van de pool is vul",
+       "pool-errorunknown": "Unbekende faut",
+       "pool-servererror": "De deenst \"pool counter\" is neet beskikbår ($1).",
        "aboutsite": "Oaver {{SITENAME}}",
        "aboutpage": "Project:Info",
        "copyright": "De inhoud is beschikbaor onder de $1 as der niks aanders an-egeven is.",
        "currentevents-url": "Project:In et nys",
        "disclaimers": "Vöärbehold",
        "disclaimerpage": "Project:Vöärbehold",
-       "edithelp": "Hulpe mit bewarken",
-       "helppage-top-gethelp": "Hulpe",
+       "edithelp": "Hülpe mid bewarken",
+       "helppage-top-gethelp": "Hülpe",
        "mainpage": "Vöärblad",
        "mainpage-description": "Vöärblad",
        "policy-url": "Project:Beleid",
        "portal-url": "Project:Gemeynskapsportaal",
        "privacy": "Gegeavensbeleid",
        "privacypage": "Project:Gegeavensbeleid",
-       "badaccess": "Gien toestemming",
-       "badaccess-group0": "Je hebben gien toestemming um disse aksie uut te voeren.",
-       "badaccess-groups": "Disse aksie kan allinnig uutevoerd wörden deur gebrukers uut {{PLURAL:$2|de groep|één van de groepen}}: $1.",
-       "versionrequired": "Versie $1 van MediaWiki is neudig",
-       "versionrequiredtext": "Versie $1 van MediaWiki is neudig um disse zied te gebruken. Zie [[Special:Version|Versie]].",
-       "ok": "Best",
+       "badaccess": "Geen tostemming",
+       "badaccess-group0": "Jy hebbet geen tostemming üm disse akty uut te voren.",
+       "badaccess-groups": "Disse akty kan allinnig uutvoord wörden döär brukers uut {{PLURAL:$2|de grup|eyn van de gruppen}}: $1.",
+       "versionrequired": "Versy $1 van MediaWiki is nöydig",
+       "versionrequiredtext": "Versy $1 van MediaWiki is nöydig üm disse syde te bruken. See [[Special:Version|Versy]].",
+       "ok": "Okee",
        "retrievedfrom": "Van \"$1\"",
-       "youhavenewmessages": "Je hebben $1 ($2).",
-       "youhavenewmessagesfromusers": "Je hebben $1 van {{PLURAL:$3|n aandere gebruker|$3 gebrukers}} ($2).",
-       "youhavenewmessagesmanyusers": "Je hebben $1 van n bulte gebrukers ($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|n niej bericht|999=nieje berichten}}",
-       "newmessagesdifflinkplural": "leste {{PLURAL:$1|wieziging|999=wiezigingen}}",
+       "youhavenewmessages": "{{PLURAL:$3|Jy hebbet}} $1 ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Jy hebbet}} $1 van {{PLURAL:$3|een andere bruker|$3 brukers}} ($2).",
+       "youhavenewmessagesmanyusers": "Jy hebbet $1 van een bült brukers ($2).",
+       "newmessageslinkplural": "{{PLURAL:$1|een ny bericht|999=nye berichten}}",
+       "newmessagesdifflinkplural": "läste {{PLURAL:$1|wysiging|999=wysigingen}}",
        "youhavenewmessagesmulti": "Jy hebbet nye berichten up $1",
        "editsection": "bewark",
        "editold": "bewark",
-       "viewsourceold": "brontekste bekyken",
+       "viewsourceold": "brontekst bekyken",
        "editlink": "bewark",
        "viewsourcelink": "brontekst bekyken",
        "editsectionhint": "Bewarkingsveld: $1",
        "toc": "Inhold",
-       "showtoc": "Bekieken",
-       "hidetoc": "Verbarg",
+       "showtoc": "bekyken",
+       "hidetoc": "verbargen",
        "collapsible-collapse": "Inklappen",
        "collapsible-expand": "Uutklappen",
-       "confirmable-confirm": "{{GENDER:$1|Bi'j}} daor wisse van?",
+       "confirmable-confirm": "{{GENDER:$1|Bin jy}} dår wisse van?",
        "confirmable-yes": "Ja",
-       "confirmable-no": "Nee",
-       "thisisdeleted": "Bekieken of herstellen van $1?",
-       "viewdeleted": "Bekiek $1?",
-       "restorelink": "{{PLURAL:$1|versie die vortedaon is|versies die vortedaon bin}}",
-       "feedlinks": "Voer:",
-       "feed-invalid": "Voertype wörden niet ondersteunt.",
-       "feed-unavailable": "Syndicakievoer is niet beschikbaor",
-       "site-rss-feed": "$1 RSS-voer",
-       "site-atom-feed": "$1 Atom-voer",
-       "page-rss-feed": "\"$1\" RSS-voer",
-       "page-atom-feed": "\"$1\" Atom-voer",
+       "confirmable-no": "Ney",
+       "thisisdeleted": "Bekyken of herstellen van $1?",
+       "viewdeleted": "Bekyk $1?",
+       "restorelink": "{{PLURAL:$1|versy dee vordsmeaten is|versys dee vordsmeaten binnet}}",
+       "feedlinks": "Voder:",
+       "feed-invalid": "Vodertype wördt neet understöänt.",
+       "feed-unavailable": "Syndikatyvoder is neet beskikbår",
+       "site-rss-feed": "$1 RSS-voder",
+       "site-atom-feed": "$1 Atom-voder",
+       "page-rss-feed": "\"$1\" RSS-voder",
+       "page-atom-feed": "\"$1\" Atom-voder",
        "red-link-title": "$1 (syde besteyt noch neet)",
-       "sort-descending": "Aoflopend sorteren",
-       "sort-ascending": "Oplopend sorteren",
-       "nstab-main": "Artikel",
-       "nstab-user": "Gebruker",
-       "nstab-media": "Media",
+       "sort-descending": "Afloupend sorteren",
+       "sort-ascending": "Uploupend sorteren",
+       "nstab-main": "Syde",
+       "nstab-user": "Brukerssyde",
+       "nstab-media": "Mediasyde",
        "nstab-special": "Speciale syde",
        "nstab-project": "Projektsyde",
        "nstab-image": "Bestand",
-       "nstab-mediawiki": "Bericht",
+       "nstab-mediawiki": "Systeembericht",
        "nstab-template": "Mal",
        "nstab-help": "Hülpe",
        "nstab-category": "Kategory",
        "mainpage-nstab": "Vöärblad",
-       "nosuchaction": "De op-egeven haandeling besteet niet",
-       "nosuchactiontext": "De opdrachte in t webadres in ongeldig.\nJe hebben t webadres misschien verkeerd in-etikt of de verkeerde verwiezing evolgd.\nDit kan oek dujen op n fout in de programmatuur van {{SITENAME}}.",
-       "nosuchspecialpage": "Der besteet gien spesiale zied mit disse naam",
-       "nospecialpagetext": "<strong>Disse spesiale zied wörden niet herkend deur de programmatuur.</strong>\n\nn Lieste mit bestaonde spesiale ziejen ku'j vienen op [[Special:SpecialPages|{{int:specialpages}}]].",
-       "error": "Foutmelding",
-       "databaseerror": "Fout in de databanke",
-       "databaseerror-text": "Der is wat mis egaon bie n databankzeukopdrachte.\nDit kan betekenen dat der n fout in de programmtuur zit.",
-       "databaseerror-textcl": "Der is wat mis egaon bie n databankzeukopdrachte.",
-       "databaseerror-query": "Zeukopdrachte: $1",
-       "databaseerror-function": "Funksie: $1",
-       "databaseerror-error": "Fout: $1",
-       "laggedslavemode": "<strong>Waorschuwing:</strong> t is meugelik dat leste wiezigingen in de tekste van dit artikel nog niet verwarkt bin.",
+       "nosuchaction": "De upgeaven handeling besteyt neet",
+       "nosuchactiontext": "De updracht in et webadres in ungeldig.\nJy hebbet et webadres meskeen verkeyrd intyped of de verkeyrde verwysing volgd.\nDit kan ouk düden up een faut in de programmatuur van {{SITENAME}}.",
+       "nosuchspecialpage": "Der besteyt geen speciale syde mid disse name",
+       "nospecialpagetext": "<strong>Disse speciale syde wördt neet herkend döär de programmatuur.</strong>\n\nEen lyste mid bestånde speciale syden kün jy vinden up [[Special:SpecialPages|{{int:specialpages}}]].",
+       "error": "Faut",
+       "databaseerror": "Databankfaut",
+       "databaseerror-text": "Der is wat mis gån by een databanksöökupdracht.\nDit kan beteykenen dat der een faut in de programmtuur sit.",
+       "databaseerror-textcl": "Der is wat mis gån by een databanksöökupdracht.",
+       "databaseerror-query": "Söökupdracht: $1",
+       "databaseerror-function": "Funkty: $1",
+       "databaseerror-error": "Faut: $1",
+       "laggedslavemode": "<strong>Wårschüwing:</strong> et kan weasen dat de lätste wysigingen up disse syde noch neet upnöämen binnet.",
        "readonly": "De databanke is beveiligd",
-       "enterlockreason": "Waorumme en veur hoe lange is t eblokkeerd?",
-       "readonlytext": "De databanke van {{SITENAME}} is noen esleuten veur nieje bewarkingen en wiezigingen, warschienlik veur bestaandsonderhoud. De verantwoordelike systeembeheerder gaf hierveur de volgende reden op: '''$1'''",
-       "missing-article": "In de databanke steet gien tekste veur de zied \"$1\" die der wel in zol mutten staon ($2).\n\nDit kan koemen deurda'j n ouwe verwiezing naor t verschil tussen twee versies van n zied volgen of n versie opvragen die vortedaon is.\n\nAs dat niet zo is, dan he'j misschien n fout in de programmatuur evunnen.\nMeld t dan effen bie n [[Special:ListUsers/sysop|systeembeheerder]] van {{SITENAME}} en vermeld derbie de internetverwiezing van disse zied.",
-       "missingarticle-rev": "(versienummer: $1)",
-       "missingarticle-diff": "(Wieziging: $1, $2)",
-       "readonly_lag": "De databanke is automaties beveilig, zodat de ondergeschikten servers zich kunnen synchroniseren mit de sentrale server.",
-       "internalerror": "Interne fout",
-       "internalerror_info": "Interne fout: $1",
-       "filecopyerror": "Kon bestaand \"$1\" niet naor \"$2\" kopiëren.",
-       "filerenameerror": "Bestaandsnaamwieziging \"$1\" naor \"$2\" niet meugelik.",
-       "filedeleteerror": "Kon bestaand \"$1\" niet vortdoon.",
-       "directorycreateerror": "Map \"$1\" kon niet an-emaakt wörden.",
-       "directoryreadonlyerror": "De map \"$1\" is allinnig-lezen.",
-       "directorynotreadableerror": "De map \"$1\" kan niet elezen wörden.",
-       "filenotfound": "Kon bestaand \"$1\" niet vienen.",
-       "unexpected": "Onverwachten weerde: \"$1\"=\"$2\".",
-       "formerror": "Fout: kon formulier niet versturen",
-       "badarticleerror": "Disse haandeling kan op disse zied niet uutevoerd wörden.",
-       "cannotdelete": "De zied of t bestaand \"$1\" kon niet vortedaon wörden.\nt Kan ween dat n aander t al vortedaon hef.",
-       "cannotdelete-title": "Zied \"$1\" kan niet vortedaon wörden",
-       "delete-hook-aborted": "t Vortdoon wördt in t wiere eschopt deur n toepassige van MediaWiki.\nDer is gien veerdere informasie beschikbaor.",
-       "no-null-revision": "Kon gien lege nieje versie maken veur de zied \"$1\"",
-       "badtitle": "Ongeldige naam",
-       "badtitletext": "De naam van de op-evreugen zied is niet geldig, leeg, of n interwiki-verwiezing naor n onbekende of ongeldige wiki.",
-       "perfcached": "Disse gegevens koemen uut t tussengeheugen en bin misschien niet aktueel. Der {{PLURAL:$1|is hooguut een resultaot|bin hooguut $1 resultaoten}} beschikbaor in t tussengeheugen.",
-       "perfcachedts": "Disse gegevens koemen uut t tussengeheugen die veur t lest bie-ewörken is op $2 um $3. Der {{PLURAL:$4|is hooguut een resultaot|bin hooguut $4 resultaoten}} beschikbaor in t tussengeheugen.",
-       "querypage-no-updates": "'''Disse zied wördt niet meer bie-ewörken.'''",
+       "enterlockreason": "Voor een readen in vöär de vergrendeling, en geav up wanneyr et ungeaver vrygeaven wördt.",
+       "readonlytext": "De databanke is up et moment slöäten vöär nye inbreng en andere wysigingen, wårskynlik vöär rutinemåtig underhold, wårnå et weader lös geyt. \n\nDe systeembeheyrder gav hyrvöär de volgende readen up: $1",
+       "missing-article": "In de databanke steyt geen tekst vöär de syde \"$1\" dee der wel in sol mütten stån ($2).\n\nDit geböärt meystentyds as jy een olde verwysing nå et verskil tüsken twey versys van een syde volgen of as jy een versy upvrågen dee vordsmeaten is.\n\nAs dat neet so is, dan heb jy meskeen een faut in de programmatuur evünden.\nMeld et dan by een [[Special:ListUsers/sysop|systeembeheyrder]], en vermeld et webadres derby.",
+       "missingarticle-rev": "(versynummer: $1)",
+       "missingarticle-diff": "(Wysiging: $1, $2)",
+       "readonly_lag": "De databanke is automatisk vergrendeld terwyl de undergeskikede servers sik synchroniseren künnet mid de centrale server.",
+       "internalerror": "Interne faut",
+       "internalerror_info": "Interne faut: $1",
+       "filecopyerror": "Kun bestand \"$1\" neet nå \"$2\" kopieren.",
+       "filerenameerror": "\"$1\" kun neet hernöömd wörden nå \"$2\".",
+       "filedeleteerror": "Bestand \"$1\" kun neet vordsmeaten wörden.",
+       "directorycreateerror": "De map \"$1\" kun neet anmaked wörden.",
+       "directoryreadonlyerror": "De map \"$1\" is allinnig-leasen.",
+       "directorynotreadableerror": "De map \"$1\" kan neet leasen wörden.",
+       "filenotfound": "Bestand \"$1\" kun neet vünden wörden.",
+       "unexpected": "Unverwachtede waerde: \"$1\"=\"$2\".",
+       "formerror": "Faut: kun formulier neet verstüren",
+       "badarticleerror": "Disse handeling kan up disse syde neet uutvoord wörden.",
+       "cannotdelete": "De syde of et bestand \"$1\" kun neet vordsmeaten wörden.\nEt kan weasen dat een ander et al vordsmeaten hevt.",
+       "cannotdelete-title": "Syde \"$1\" kan neet vordsmeaten wörden",
+       "delete-hook-aborted": "Et vordsmyten wördt in et wyre skopped döär een topassing van MediaWiki.\nDer is wyder geen informaty beskikbår.",
+       "no-null-revision": "Kun geen leadige nye versy maken vöär de syde \"$1\"",
+       "badtitle": "Ungeldige name",
+       "badtitletext": "De name van de upvrågde syde is neet geldig, leadig, of der stünd een verkeyrde interspråk- of interwikiverwysing in.\nMöägelik binnet der eyn of meyr teykens bruked dee neet in titels tostån binnet.",
+       "perfcached": "Disse gegeavens kummen uut et tüskengehöägen en binnet meskeen neet aktueel. Der {{PLURAL:$1|is houguut eyn resultaat|binnet houguut $1 resultaten}} beskikbår in et tüskengehöägen.",
+       "perfcachedts": "Disse gegeavens kummen uut et tüskengehöägen dee vöär et lätst bywarked is up $2 üm $3. Der {{PLURAL:$4|is houguut eyn resultaat|binnet houguut $4 resultaten}} beskikbår in et tüskengehöägen.",
+       "querypage-no-updates": "Disse syde wördt neet bywarked.\nGegeavens up disse syde wördet neet vervarsd.",
        "viewsource": "Brontekst bekyken",
-       "viewsource-title": "Bron bekieken van $1",
-       "actionthrottled": "Haandeling tegenehöllen",
+       "viewsource-title": "Bron bekyken van $1",
+       "actionthrottled": "Handeling teagenholden",
        "actionthrottledtext": "As maotregel tegen t plaotsen van alderhaande moek, is t antal keren da'j disse haandeling in n korte tied uutvoeren kunnen beteund. Je hebben de limiet overschrejen. Probeer t over n antal minuten weer.",
        "protectedpagetext": "Disse zied is beveiligd. Bewarken of aandere haandelingen bin niet meugelik.",
        "viewsourcetext": "Je kunnen de brontekste van disse zied bewarken en bekieken.",
        "anoneditwarning": "<strong>Waorschuwing:</strong> je bin niet an-emeld.\nJoew IP-adres zal op-esleugen wörden a'j wiezigingen op disse zied anbrengen. A'j je eigen <strong>[$1 anmelden]</strong> of <strong>[$2 inschrieven]</strong> dan koemen joew bewarkingen onder joew gebrukersnaam te staon, samen mit aandere veurdelen.",
        "anonpreviewwarning": "''Je bin niet an-emeld.''\n''Deur de bewarking op te slaon wörden joew IP-adres op-esleugen in de ziedgeschiedenisse.''",
        "missingsummary": "'''Herinnering:''' je hebben gien samenvatting op-egeven veur de bewarking. A'j noen weer op ''Opslaon'' klikken wörden de bewarking zonder samenvatting op-esleugen.",
-       "missingcommenttext": "Plaots joew opmarking hieronder.",
+       "missingcommenttext": "Skryv een upmarking.",
        "missingcommentheader": "<strong>Waorschuwing:</strong> je hebben der gien onderwarptitel bie ezet. A'j noen weer op \"$1\" klikken, dan wörden de bewarking op-esleugen zonder onderwarptitel.",
-       "summary-preview": "Samenvatting naokieken:",
-       "subject-preview": "Onderwarp naokieken:",
+       "summary-preview": "Samenvatting nåkyken:",
+       "subject-preview": "Underwarp nåkyken:",
        "blockedtitle": "Gebruker is eblokkeerd",
        "blockedtext": "<strong>Juw brukersname of IP-adres is blokkeerd.</strong>\n\nJy binnet blokkeerd döär $1.\nDe upgeaven readen is <em>$2</em>.\n\n* Blokkeerd vanaf: $8\n* Blokkeerd tot: $6\n* Bedoold üm te blokkeren: $7\n\nJy künnet kontakt upneamen mid $1 of een andere [[{{MediaWiki:Grouppage-sysop}}|beheyrder]] üm de blokkering te bepråten.\nJy künnet de funkty \"{{int:emailuser}}\" neet bruken, behalven as jy een geldig e-postadres in juw [[Special:Preferences|instellingen]] upgeaven hebbet en et gebruuk van disse funkty neet blokkeerd is.\nEt IP-adres wat jy nu bruket is $3, en et blokkeringsnummer is #$5.\nVermeld de gegeavens dee hyrboaven stån as jy argens up disse blokkering reageren.",
        "autoblockedtext": "Joew IP-adres is automaties eblokkeerd umdat t gebruukt wördt deur n aandere gebruker, die eblokkeerd wördt deur $1.\nDe reden hierveur was:\n\n:''$2''\n\n* Begint: $8\n* Löp of nao: $6\n* Wee eblokkeerd wördt: $7\n\nJe kunnen kontakt opnemen mit $1 of n van de aandere\n[[{{MediaWiki:Grouppage-sysop}}|beheerders]] um de blokkering te bepraoten.\n\nNB: je kunnen de opsie \"n bericht sturen\" niet gebruken, behalven a'j n geldig netpostadres op-egeven hebben in de [[Special:Preferences|gebrukersveurkeuren]] en je niet eblokkeerd bin.\n\nJoew IP-adres is $3 en joew blokkeernummer is $5.\nGeef disse nummers deur a'j kontakt mit ene opnemen over de blokkering.",
        "histfirst": "Eerste",
        "histlast": "Leste",
        "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
-       "historyempty": "(leeg)",
+       "historyempty": "leadig",
        "history-feed-title": "Wiezigingsoverzichte",
        "history-feed-description": "Wiezigingsoverzichte veur disse zied op de wiki",
        "history-feed-item-nocomment": "$1 op $2",
        "search-section": "(onderwarp $1)",
        "search-file-match": "(kümt oavereyne mid de inhold van et bestand)",
        "search-suggest": "Bedoelden je: $1",
-       "search-interwiki-caption": "Zusterprojekten",
+       "search-interwiki-caption": "Resultaten van süsterprojekten",
        "search-interwiki-default": "Resultaoten van $1:",
        "search-interwiki-more": "(meer)",
        "search-relatedarticle": "Verwaant",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}}<br />(see ouk de [[Special:NewPages|lyste mid nye syden]])",
        "recentchanges-submit": "Bekiek",
        "rcfilters-legend-heading": "<strong>Lyste mid afkortingen:</strong>",
-       "rcfilters-group-results-by-page": "Resultaoten per zied groeperen",
+       "rcfilters-group-results-by-page": "Resultaten per syde grupperen",
        "rcfilters-activefilters": "Aktive filters",
        "rcfilters-activefilters-hide": "Verbarg",
        "rcfilters-activefilters-show": "Bekiek",
        "rcfilters-activefilters-hide-tooltip": "Verbarg aktive filters",
        "rcfilters-activefilters-show-tooltip": "Laot aktive filters seen",
-       "rcfilters-limit-title": "Resultåten üm te låten seen",
+       "rcfilters-limit-title": "Resultaten üm te låten seen",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|wysiging|wysigingen}}, $2",
        "rcfilters-date-popup-title": "Tydsperiode üm te döärsöken",
        "rcfilters-days-title": "De vöärbye dagen",
        "rcfilters-hours-title": "De lätste uren",
        "rcfilters-days-show-days": "$1 {{PLURAL:$1|dag|dagen}}",
        "rcfilters-days-show-hours": "$1 {{PLURAL:$1|uur|uren}}",
-       "rcfilters-quickfilters": "Upeslöägen filters",
+       "rcfilters-quickfilters": "Seakerde filters",
        "rcfilters-quickfilters-placeholder-title": "Noch geen filters up-eslöägen",
-       "rcfilters-quickfilters-placeholder-description": "Üm juuw filterinstellingen up te slån en et låter te gebruken, klik up et bladwyserikoon underan by \"Aktive filters\".",
+       "rcfilters-quickfilters-placeholder-description": "Üm juw filterinstellingen te seakeren en et later te herbruken, klik up et bladwyserpiktogram underan by \"Aktive filters\".",
        "rcfilters-savedqueries-apply-label": "Instellingen opslaon",
        "rcfilters-savedqueries-cancel-label": "Aofbreken",
        "rcfilters-savedqueries-add-new-title": "Filterinstellingen seakeren",
        "rcfilters-show-new-changes": "Låt nyste wysigingen seen",
        "rcfilters-search-placeholder": "Filter wysigingen (bruuk et menü of söök up filtername)",
        "rcfilters-filterlist-feedbacklink": "Låt uns weaten wat jy van disse (nye) filterhülpmiddels vinden",
-       "rcfilters-highlightbutton-title": "Resultåten markeren",
+       "rcfilters-highlightbutton-title": "Resultaten markeren",
        "rcfilters-highlightmenu-title": "Kies n kleur",
        "rcfilters-filtergroup-user-experience-level": "Gebrukersanmelding en ervåring",
        "rcfilters-filter-user-experience-level-registered-label": "An-emeld",
        "rcfilters-filter-newpages-description": "Bewarkingen wårmead jy een nye syde anmaket.",
        "rcfilters-filter-categorization-label": "Kategorywysigingen",
        "rcfilters-filter-categorization-description": "Upgave van syden dee to-evoogd of vordedån wörden uut kategoryen.",
-       "rcfilters-filter-logactions-label": "Eregistreerde aktys",
+       "rcfilters-filter-logactions-label": "Registreerde aktys",
        "rcfilters-filter-logactions-description": "Administrative handelingen, nye kontos, vordedåne syden, upladingen…",
        "rcfilters-filtergroup-lastrevision": "Lätste versys",
        "rcfilters-filter-lastrevision-label": "Lätste versy",
        "rcfilters-filter-previousrevision-label": "Neet de lätste versy",
        "rcfilters-filter-previousrevision-description": "Alle wysigingen dee neet de \"lätste versy\" binnen.",
        "rcfilters-view-tags": "Emarkeerde wysigingen",
-       "rcfilters-view-namespaces-tooltip": "Filter resultåten up naamruumte",
-       "rcfilters-view-tags-tooltip": "Filter resultåten döär gebrüük te maken van bewarkingsetiketten",
+       "rcfilters-view-namespaces-tooltip": "Filter resultaten up naamruumde",
+       "rcfilters-view-tags-tooltip": "Filter resultaten döär bewarkingsetiketten te bruken",
        "rcfilters-liveupdates-button": "Rechtstreakse aktualisering",
        "rcfilters-liveupdates-button-title-off": "Nye wysigingen voorddalik låten seen",
        "rcnotefrom": "Wysigingen sinds <strong>$3, $4</strong> (maximaal <strong>$1</strong> {{PLURAL:$1|wysiging|wysigingen}}).",
        "compare-invalid-title": "De titel die'j op-egeven hebben, is ongeldig.",
        "compare-title-not-exists": "De titel die'j op-egeven hebben, besteet niet.",
        "compare-revision-not-exists": "De versie die'j op-egeven hebben, besteet niet.",
-       "diff-form": "een '''formelier'''",
+       "diff-form": "Wysigingen",
        "dberr-problems": "t Spiet ons, mer disse webstee hef op t moment wat techniese problemen.",
        "dberr-again": "Wach n paor minuten en probeer t daornao opniej.",
        "dberr-info": "(Kan gien verbiending maken mit de databankeserver: $1)",
        "expandtemplates": "Mallen substitueren",
        "expand_templates_intro": "Disse spesiale zied leest de op-egeven tekste en substitueert rekursief alle mallen in de tekste. Oek ondersteunde parserfunksies zo as <code><nowiki>{{</nowiki>#language:…}}</code> en variabels zo as <nowiki>{{</nowiki>CURRENTDAY}}&mdash. Zwat alle teksten tussen dubbelde krulhaken wörden esubstitueerd.",
        "expand_templates_title": "Titel, veur {{FULLPAGENAME}}, enz.:",
-       "expand_templates_input": "Invoertekste:",
+       "expand_templates_input": "Wikitekst invoren:",
        "expand_templates_output": "Resultaot",
        "expand_templates_xml_output": "XML-uutvoer",
        "expand_templates_ok": "Oké",
        "special-characters-title-minus": "minteken",
        "mw-widgets-abandonedit": "Bi'j der wisse van da'j de naokiekmodus verlaoten willen zonder eerst op te slaon?",
        "mw-widgets-abandonedit-discard": "Wiezigingen vortsmieten",
-       "mw-widgets-abandonedit-keep": "Verdan gaon mit bewarken",
-       "mw-widgets-abandonedit-title": "Wee'j t zeker?",
+       "mw-widgets-abandonedit-keep": "Vöärdan gån mid bewarken",
+       "mw-widgets-abandonedit-title": "Bin jy dår wisse van?",
        "randomrootpage": "Willeköärige stamsyde"
 }
index a2e6203..6b35dab 100644 (file)
        "category-empty": "''यो श्रेणीमा हाल कुनै पृष्ठ या मिडियाहरु रहेका छैनन् ।''",
        "hidden-categories": "{{PLURAL:$1|लुकाइएको श्रेणी|लुकाइएका श्रेणीहरू}}",
        "hidden-category-category": "लुकाइएका श्रेणीहरू",
-       "category-subcat-count": "{{PLURAL:$2|यो श्रेणीमा निम्न उपश्रेणीहरू मात्र छन्।|यो श्रेणीको निम्न {{PLURAL:$1|उपश्रेणी|$1 उपश्रेणीहरू}},  $2 कुल मध्ये श्रेणीहरू छन् ।}}",
+       "category-subcat-count": "{{PLURAL:$2|यो श्रेणीमा निम्न उपश्रेणीहरू मात्र छन्।|यो श्रेणीको निम्न {{PLURAL:$1|उपश्रेणी|$1 उपश्रेणीहरू}}, $2 कुल मध्ये श्रेणीहरू छन्।}}",
        "category-subcat-count-limited": "यो श्रेणीमा निम्न {{PLURAL:$1|उपश्रेणी|$1 उपश्रेणीहरू}} छन् ।",
-       "category-article-count": "{{PLURAL:$2|यो श्रेणीमा एक मात्र पृष्ठरहेको छ।|कुल $2 मध्ये यो श्रेणीमा {{PLURAL:$1|पृष्ठ|$1 पृष्ठहरू}} रहेका छन् । }}",
+       "category-article-count": "{{PLURAL:$2|यो श्रेणीमा एक मात्र पृष्ठरहेको छ।|कुल $2 मध्ये यो श्रेणीमा {{PLURAL:$1|पृष्ठ|$1 पृष्ठहरू}} रहेका छन्}}",
        "category-article-count-limited": "निम्न {{PLURAL:$1|पृष्ठ|$1 पृष्ठहरू}} यस श्रेणीमा रहेको ।",
        "category-file-count": "{{PLURAL:$2|यो श्रेणीमा निम्न फाइल मात्र छ ।|निम्न श्रेणीमा {{PLURAL:$1|फाइल|$1 फाइलहरू}} , कुल  $2 मध्ये रहेको ।}}",
        "category-file-count-limited": "निम्न  {{PLURAL:$1|फाइल|$1 फाइलहरू}} यस श्रेणीमा रहेको ।",
        "history": "पृष्ठको इतिहास",
        "history_short": "पृष्ठको इतिहास",
        "history_small": "इतिहास",
-       "updatedmarker": "मà¥\87रो अन्तिम भ्रमण पछि अद्यतन गरिएको",
+       "updatedmarker": "तपाà¤\88à¤\81à¤\95ो अन्तिम भ्रमण पछि अद्यतन गरिएको",
        "printableversion": "छाप्नयोग्य संस्करण",
        "permalink": "स्थायी लिङ्क",
        "print": "छाप्नुहोस्",
        "newarticle": "(नयाँ)",
        "newarticletext": "तपाईंले अहिले सम्म नभएको पृष्ठको लिङ्क पहिल्याउनु भएको छ।\nयो पृष्ठ निर्माण गर्न तलको कोष्ठमा टाइप गर्नुहोस्  ।(थप जानकारीको लागि [$1 help page] हेर्नुहोस् )।\nयहाँ त्यत्तिकै आइपुग्नु भएको हो भने , ब्राउजरको  '''back''' बटन थिच्नुहोस् ।",
        "anontalkpagetext": "----''यो वार्तालाप पृष्ठ अज्ञात प्रयोगकर्ताको हो जसले अहिलेसम्म खाता बनाएकै छैन, अथवा जसले यस पृष्ठको उपयोग गर्दैन।\nयस कारण हामीले उसलाई उसको आइपी ठेगानाले चिन्न सक्छौं। \nयस्तो आइपी ठेगाना धेरै प्रयोगकर्ताहरूको साझा हुनसक्छ।\nयदि तपाईं अज्ञात प्रयोगकर्ता हुनुहुन्छ र तपाईंमाथि नचाहिँदो टिप्पणी भएको अनुभव गर्नुहुन्छ भने भविष्यमा अन्य अज्ञात प्रयोगकर्तासित अलमलिनबाट बच्न कृपया [[Special:CreateAccount|खाता खोल्नुहोस्]] अथवा [[Special:UserLogin|प्रवेश गर्नुहोस्]] ''",
-       "noarticletext": "यस लेखमा अहिले केहि पनि पाठ छैन ।\nतपाईंले अन्य पृष्ठमा [[Special:Search/{{PAGENAME}}|यस पृष्ठको शीर्षकको लागि खोज]] गर्न सक्नुहुन्छ ।\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} पृष्ठ सम्बन्धित ढड्डामा खोज],\nवा [{{fullurl:{{FULLPAGENAME}}|action=edit}}  यसै पृष्ठलाई सम्पादन गर्ने]</span>.",
+       "noarticletext": "यस लेखमा अहिले केहि पनि पाठ छैन।\nतपाईँले अन्य पृष्ठमा [[Special:Search/{{PAGENAME}}|यस पृष्ठको शीर्षकको लागि खोज]] गर्न सक्नुहुन्छ।\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} पृष्ठ सम्बन्धित ढड्डामा खोज्ने],\nवा [{{fullurl:{{FULLPAGENAME}}|action=edit}} यसै पृष्ठलाई सम्पादन गर्ने]</span>।",
        "noarticletext-nopermission": "यस लेखमा अहिले कुनै पनि पाठ छैन ।\nतपाईंले अन्य पृष्ठमा [[Special:Search/{{PAGENAME}}|यस पृष्ठको शीर्षकको लागि खोज]] गर्न सक्नुहुन्छ,\nअथवा <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|पृष्ठ={{FULLPAGENAMEE}}}} सम्बन्धित लगहरू खोज्न सक्नुहुनेछ ]</span> तर तपाईंलाई नयाँ पृष्ठ बनाउने अधिकार छैन।",
        "missing-revision": "\"{{FULLPAGENAME}}\" पृष्ठको अवतरण #$1 रहेको छैन।\n\nसामान्य रूपमा यसो एउटा हटाइएको पृष्ठको पुरानो लिङ्कमा क्लिक गर्दा हुन्छ।\nअधिक जानकारीको लागि तपाईं [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} हटाएको लग] हेर्न सक्नुहुन्छ।",
        "userpage-userdoesnotexist": "प्रयोगकर्ताको खाता  \"<nowiki>$1</nowiki>\" दर्ता गरिएको छैन ।\nतपाईंले पृष्ठ निर्माण/सम्पादन गर्न चाहनु भएको भए जाँच गर्नुहोस् ।",
        "rev-deleted-text-view": "यस पृष्ठको संशोधन '''मेटिएकोछ'''।\nतपाईंले हेर्न सक्नुहुन्छ; [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} मेटिएको लगमा विवरण पाउन सकिन्छ]।",
        "rev-suppressed-text-view": "यस पृष्ठको पुनरावलोकन <strong>थिचिएको छ</strong>।\nप्रबन्धकको हैसियतले हेर्न सक्नुहुन्छ; [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}}को थिचिएको लगमा विवरण पाउन सकिन्छ]",
        "rev-deleted-no-diff": "तपाईंले यसको भिन्नता पाउन सक्नुहुन्न किनभने यस पृष्ठको पुनरावलोकन <strong>मेटाइएको छ</strong>'।\nयसको विवरण [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}}को मेटाइएको लगमा पाउन सक्नुहुन्छ]।",
-       "rev-suppressed-no-diff": "तपाà¤\88à¤\82 यसको भिन्नता हेर्न सक्नुहुन्न किनभने यसको एउटा संशोधन <strong>मेटाइएको</strong>छ।",
+       "rev-suppressed-no-diff": "तपाà¤\88à¤\81 यसको भिन्नता हेर्न सक्नुहुन्न किनभने यसको एउटा संशोधन <strong>मेटाइएको</strong>छ।",
        "rev-deleted-unhide-diff": "यस पृष्ठका पुनरावलोकनहरू मध्ये एउटा भिन्नता <strong>मेटाइएकोछ</strong>।\nयसको पूर्ण विवरण [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}}को मेटाइएको लगमा पाउन सकिन्छ]।\nयदि चाहनु भयो भने प्रवन्धकको हैसियतले [यो भिन्नता $1] हेर्न सक्नुहुन्छ।",
        "rev-suppressed-unhide-diff": "यस पृष्ठको पुनरावलोकनहरू मध्ये एउटा भिन्नता <strong>थिचिएको छ</strong>।\nयसको पूर्ण विवरण [{{fullurl:{{#Special:Log}}/suppress|पृष्ठ={{FULLPAGENAMEE}}}}को थिचिएको लगमा पाउन सकिन्छ]।\nयदि चाहनु भयो भने प्रबन्धकको हैसियतमा [यो भिन्नता $1] हेर्न सक्नुहुन्छ।",
        "rev-deleted-diff-view": "यस भिन्नताका संशोधनहरू मध्येको एउटा चाहिं <strong>मेटियो।<strong> \nतपाईंले यस भिन्नतालाई हेर्न सक्नुहुन्छ; सबै विवरण  [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}} मेटाइएको लग]मा पाउन सकिनेछ।",
        "difference-title": "\"$1\" को बिचमा भिन्नता",
        "difference-title-multipage": "\"$1\" तथा \"$2\" को बिचमा भिन्नता",
        "difference-multipage": "(पृष्ठहरूमा भिन्नता)",
-       "lineno": "पà¤\82क्ति $1:",
+       "lineno": "पà¤\99à¥\8dक्ति $1:",
        "compareselectedversions": "छानिएका संस्करणहरू दाँज्नुहोस्",
        "showhideselectedversions": "छानिएका पुनरावलोकनहरू देखाउने/लुकाउने",
        "editundo": "रद्द गर्ने",
        "recentchanges-label-minor": "यो साधारण सम्पादन हो",
        "recentchanges-label-bot": "यो सम्पादन बोटद्वारा गरिएको थियो",
        "recentchanges-label-unpatrolled": "यो सम्पादन अहिले सम्म गस्ती गरिएको छैन",
-       "recentchanges-label-plusminus": "यति बाइटहरू संख्याले पृष्ठको आकार परिवर्तन भएको छ",
+       "recentchanges-label-plusminus": "यति बाइट सङ्ख्याले यस पृष्ठको आकार परिवर्तन भएको छ",
        "recentchanges-legend-heading": "<strong>आदर्श वाक्य:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|नयाँ पृष्ठहरूको सूची]] यो पनि हेर्नुहोस्)",
        "recentchanges-legend-plusminus": "(''±१२३'')",
        "rcfilters-filter-categorization-label": "परिवर्तित श्रेणी",
        "rcfilters-filter-lastrevision-label": "हालको संस्करण",
        "rcnotefrom": "तल <strong>$2</strong> देखि (<strong>$1</strong> सम्म) {{PLURAL:$5|भएका परिवर्तनहरू देखाइएको छ|भएका परिवर्तनहरू देखाइन्छ}}।",
-       "rclistfrom": "$3 $2 देखिका नयाँ परिवर्तनहरू देखाउनु",
+       "rclistfrom": "$3 $2 देखिका नयाँ परिवर्तनहरू देखाउनुहोस्",
        "rcshowhideminor": "$1 सामान्य सम्पादन",
        "rcshowhideminor-show": "देखाउनुहोस्",
        "rcshowhideminor-hide": "लुकाउनुहोस्",
        "recentchangeslinked-feed": "सम्बन्धित परिवर्तनहरू",
        "recentchangeslinked-toolbox": "सम्बन्धित परिवर्तनहरू",
        "recentchangeslinked-title": "\"$1\" सँग सम्बन्धित परिवर्तन",
-       "recentchangeslinked-summary": "कुनै पृष्ठको वा  यससँग सम्बन्धित परिवर्तन हेर्नको लागि उक्त पृष्ठको नाम हाल्नुहोस। (कुनै श्रेणीको सामाग्रीहरुको लागि {{ns:category}}: श्रेणीको नाम हल्नुहोस ।  [[Special:Watchlist|तपाईंको अवलोकन सूची]]का पृष्ठहरू <strong>गाढा अक्षरमा</strong> छन् ।",
+       "recentchangeslinked-summary": "कुनै पृष्ठको वा यससँग सम्बन्धित परिवर्तन हेर्नको लागि उक्त पृष्ठको नाम हाल्नुहोस्। (कुनै श्रेणीको सामाग्रीहरूको लागि {{ns:category}}:श्रेणीको नाम) हाल्नुहोस्।  [[Special:Watchlist|तपाईँको अवलोकन सूची]]का पृष्ठहरू <strong>गाढा अक्षरमा</strong> छन्।",
        "recentchangeslinked-page": "पृष्ठ नाम:",
        "recentchangeslinked-to": "यसको सट्टा यो पृष्ठसँग जोडिएका पृष्ठहरूको परिवर्तन देखाउने",
        "upload": "फाइल उर्ध्वभरण",
        "filehist-filesize": "फाइल आकार",
        "filehist-comment": "टिप्पणी",
        "imagelinks": "फाइलको प्रयोगहरू",
-       "linkstoimage": "यस फाइलमा निम्न{{PLURAL:$1|पृष्ठ जोडिन्छ|$1 पृष्ठहरू जोडिन्छन्}}:",
+       "linkstoimage": "यस फाइलमा निम्न {{PLURAL:$1|पृष्ठ जोडिन्छ|$1 पृष्ठहरू जोडिन्छन्}}:",
        "linkstoimage-more": "$1 भन्दा अधिक {{PLURAL:$1|पृष्ठ लिङ्क|पृष्ठ लिङ्कहरू}} यस फाइलसँग जोडिएको छ। \nनिम्नलिखित सूची फाइलसँग {{PLURAL:$1|पहिलो पृष्ठ लिङ्क|पहिलो $1 पृष्ठ लिङ्कहरू}} जोडिने देखाउँछ।\n[[Special:WhatLinksHere/$2|पूर्ण सूची]] पनि उपलब्ध छ।",
-       "nolinkstoimage": "यà¥\8b à¤«à¤¾à¤\88लसà¤\82à¤\97 à¤²à¤¿à¤\82à¤\95भà¤\8fà¤\95à¥\8b à¤\95à¥\81नà¥\88 à¤ªà¥\83षà¥\8dठ à¤\9bà¥\88न.",
+       "nolinkstoimage": "यà¥\8b à¤«à¤¾à¤\87लसà¤\81à¤\97 à¤\95à¥\81नà¥\88 à¤ªà¤¨à¤¿ à¤ªà¥\83षà¥\8dठ à¤\9cà¥\8bडिà¤\8fà¤\95à¥\8b à¤\9bà¥\88न।",
        "morelinkstoimage": "यस फाइलको [[Special:WhatLinksHere/$1|थप लिंकहरू]] हेर्नुहोस् ।",
        "linkstoimage-redirect": "$1 (फाइल अनुप्रेषण) $2",
        "duplicatesoffile": "निम्नलिखित {{PLURAL:$1|फाइलको प्रतिलिपि हो|$1 फाइलहरूको प्रतिलिपि हो}} ([[Special:FileDuplicateSearch/$2|अधिक जानकारीहरू]]):",
        "rollback-success": "$1द्वारा उल्टाइएका सम्पादनहरू;\nपछिल्लो संशोधनमा $2द्वारा परिवर्तन गरि पुनः फर्काइएको।",
        "sessionfailure-title": "सत्र त्रुटी",
        "sessionfailure": "यस्तो लाग्दैछ कि तपाईंको लगइन सत्रसँग कुनै समस्या छ। सत्र अपहरणबाट बचाउन को लागि सावधानीको रूपमा तपाईंको यो क्रियाकलाप रद्द गरिएको छ। कृपया पछाडी जानुहोस र पृष्ठलाई पुनः लोड गर्नुहोस्, अनि फेरी प्रयास गर्नुहोला।",
-       "changecontentmodel-title-label": "पाना à¤¶à¥\80रà¥\8dषà¤\95",
+       "changecontentmodel-title-label": "पà¥\83षà¥\8dठ à¤¶à¥\80रà¥\8dषà¤\95:",
        "changecontentmodel-reason-label": "कारण:",
        "changecontentmodel-submit": "परिवर्तन गर्नुहोस्",
        "logentry-contentmodel-change-revertlink": "पहिलेको रुपमा फर्काउने",
        "undeletepagetext": "निम्नलिखित {{PLURAL:$1|पृष्ठ मेटिएकोछ तर पूरालेखभित्रै छ|$1 पृष्ठ मेटिएकाछन् तर पूरालेखभित्रै छन्}} र पुनर्स्थापित गर्न सकिन्छ।\nपूरालेखको समय-समयमा सफाई गर्न सकिन्छ।",
        "undelete-fieldset-title": "पुनरावलोकनहरू  पूर्वावस्थामा ल्याउनुहोस्",
        "undeleteextrahelp": "यस पृष्ठको पुरै इतिहास पूर्वरुपमा फर्काउनको लागि  छनोट सन्दुकहरूलाई नछानी '''''{{int:undeletebtn}}''''' मा क्लिक गर्नुहोस।\nअनुकुल पूर्वरुपमा फर्काउने कार्य गर्न छनौट चाहिएका संस्करणका सन्दुकहरूलाई छानेर '''''{{int:undeletebtn}}'''''मा क्लिक गर्नुहोस।",
-       "undeleterevisions": "$1 {{PLURAL:$1|सà¤\82शà¥\8bधन|सà¤\82शà¥\8bधनहरà¥\82}} à¤¸à¤\82à¤\97à¥\8dरहित",
+       "undeleterevisions": "$1 {{PLURAL:$1|सà¤\82शà¥\8bधन|सà¤\82शà¥\8bधनहरà¥\82}} à¤®à¥\87à¤\9fाà¤\87यà¥\8b",
        "undeletehistory": "यदि कुनै पृष्टलाई पुन: स्थापन गराउनु भयो भने सम्पूर्ण संस्करणहरू इतिहासमा पुन:स्थापन हुनेछन् ।\nयदि यसै नामबाट  नयाँ पृष्ठ निर्माण भैसकेको छ भने पुन: स्थापित संस्करणहरू पूर्व इतिहासको रुपमा स्थापित हुनेछन् ।",
        "undeleterevdel": "यदि यो माथिल्लो पृष्ठ बन्छ  या फाइल संस्करणहरू आंशिक मेटिएका छन् भने मेट्ने काम रद्द गरिने छैन।\nत्यस अवस्थामा तपाईंले छनौटमा अन्तिम मेटिएको नयाँ संस्करण नलुकाउनेमा चिनो लगाउनु पर्छ ।",
        "undeletehistorynoadmin": "यस पृष्ठ मेटिएको छ।\nमेटिनाको कारण निम्न जानकारीहरुमा खुलाइएको छ र मेटिनु अगिका योगदानकर्ताहरुको नाम पनि \nमेटिएका पृष्ठको पूरा पाठ प्रवन्धकहरुलाई मात्र उपलब्ध हुन्छ ।",
        "undelete-show-file-submit": "हो",
        "namespace": "नामस्थान:",
        "invert": "रोजाइ उल्टाउने",
-       "tooltip-invert": "à¤\9bानिà¤\8fà¤\95ा à¤¨à¥\87मसà¥\8dपà¥\87सहरà¥\82मा à¤°à¤¹à¥\87à¤\95ा à¤ªà¥\83षà¥\8dठहरà¥\82मा à¤\97रिà¤\8fà¤\95ा à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनहरà¥\82 à¤²à¥\81à¤\95ाà¤\89न à¤¯à¤¸à¤®à¤¾ à¤\9aिनà¥\8b à¤²à¤\97ाà¤\89नà¥\81हà¥\8bसà¥\8d  (र à¤¸à¤®à¥\8dबनà¥\8dधित à¤¨à¥\87मसà¥\8dपà¥\87स à¤¯à¤¦à¤¿ à¤\9bानिà¤\8fà¤\95ा à¤­à¤\8f)",
+       "tooltip-invert": "à¤\9bानिà¤\8fà¤\95ा à¤¨à¤¾à¤®à¤ªà¤¦à¤¹à¤°à¥\82मा à¤°à¤¹à¥\87à¤\95ा à¤ªà¥\83षà¥\8dठहरà¥\82मा à¤\97रिà¤\8fà¤\95ा à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनहरà¥\82 à¤²à¥\81à¤\95ाà¤\89न à¤¯à¤¸à¤®à¤¾ à¤\9aिनà¥\8b à¤²à¤\97ाà¤\89नà¥\81हà¥\8bसà¥\8d  (र à¤\9bानिà¤\8fà¤\95ा à¤­à¤\8f à¤¸à¤®à¥\8dबनà¥\8dधित à¤¨à¤¾à¤®à¤ªà¤¦)",
        "tooltip-whatlinkshere-invert": "छानिएको नामस्थानको पृष्ठहरूसँग लिङ्कहरूलाई लुकाउनका लागि यस बाकसलाई चिन्हित गर्नुहोस",
-       "namespace_association": "समà¥\8dबनà¥\8dधित à¤¨à¥\87मसà¥\8dपà¥\87स",
-       "tooltip-namespace_association": "वारà¥\8dतालाप à¤¯à¤¾ à¤µà¤¿à¤·à¤¯ à¤¨à¥\87मसà¥\8dपà¥\87सहरà¥\81लाà¤\88 à¤¸à¤®à¥\8dवनà¥\8dधित à¤¨à¥\87मसà¥\8dपà¥\87सà¤\95à¥\8b à¤°à¥\81पमा à¤²à¤¿à¤¨à¤\95à¥\8b à¤²à¤¾à¤\97ि à¤¸à¤¨à¥\8dदà¥\81à¤\95मा à¤\9aिनà¥\8b à¤²à¤\97ाà¤\89नà¥\81हà¥\8bस।",
+       "namespace_association": "समà¥\8dबनà¥\8dधित à¤¨à¤¾à¤®à¤ªà¤¦",
+       "tooltip-namespace_association": "वारà¥\8dतालाप à¤¯à¤¾ à¤µà¤¿à¤·à¤¯ à¤¨à¤¾à¤®à¤ªà¤¦à¤¹à¤°à¥\82लाà¤\88 à¤¸à¤®à¥\8dबनà¥\8dधित à¤¨à¤¾à¤®à¤ªà¤¦à¤\95à¥\8b à¤°à¥\81पमा à¤²à¤¿à¤¨à¤\95à¥\8b à¤²à¤¾à¤\97ि à¤¸à¤¨à¥\8dदà¥\81à¤\95मा à¤\9aिनà¥\8b à¤²à¤\97ाà¤\89नà¥\81हà¥\8bसà¥\8d।",
        "blanknamespace": "(मुख्य)",
        "contributions": "{{GENDER:$1|प्रयोगकर्ता}}का योगदानहरू",
        "contributions-title": "$1को प्रयोगकर्ता योगदानहरू",
        "year": "वर्ष देखि( र पहिले):",
        "sp-contributions-blocklog": "रोकावट लग",
        "sp-contributions-suppresslog": "प्रयोगकर्ताको योगदानहरू दबाइएको छ ।",
-       "sp-contributions-deleted": "प्रयोगकर्ताका योगदानहरू मेटाइयो",
+       "sp-contributions-deleted": " {{GENDER:$1|प्रयोगकर्ता}}का योगदानहरू मेटाइयो",
        "sp-contributions-uploads": "उर्ध्वभरणहरू",
        "sp-contributions-logs": "लगहरू",
        "sp-contributions-talk": "वार्ता",
-       "sp-contributions-userrights": "प्रयोगकर्ता अधिकार व्यवस्थापन",
+       "sp-contributions-userrights": "{{GENDER:$1|प्रयोगकर्ता}} अधिकार व्यवस्थापन",
        "sp-contributions-blocked-notice": "यो प्रयोगकर्तालाई अहिले रोक लगाइएको छ।\nनवीनतम रोकाइ गरेको लग प्रविष्टि सन्दर्भको निम्ति तल दिएकोछ:",
        "sp-contributions-blocked-notice-anon": "यो IP ठेगानालाई अहिले रोक लगाइएको छ।\nनवीनतम रोकाइ गरेको लग प्रविष्टि सन्दर्भको निम्ति तल दिएकोछ:",
        "sp-contributions-search": "योगदानहरू खोज्नुहोस्",
        "cant-move-to-user-page": "तपाईंलाई पृष्ठहरू प्रयोगकर्ता पृष्ठमा सार्न अनुमती छैन (प्रयोगकर्ता सहपृष्ठहरूमा बाहेक)",
        "cant-move-category-page": "तपाईंलाई श्रेणीको पृष्ठहरू सार्ने अनुमति छैन ।",
        "cant-move-to-category-page": "कुनै श्रेणी पृष्ठमा सार्नको लागी तपाईँलाई अनुमति छैन ।",
-       "newtitle": "नयाँ शीर्षकमा :",
+       "newtitle": "नयाँ शीर्षक:",
        "move-watch": "यो पृष्ठ निगरानीमा राख्नुहोस्",
        "movepagebtn": "पृष्ठ सार्नुहोस्",
        "pagemovedsub": "सार्ने काम सफल भयो",
        "movenosubpage": "यस पृष्ठका उप पृष्ठहरू छैनन्।",
        "movereason": "कारण :",
        "revertmove": "पूर्ववत्",
-       "delete_and_move_text": "== मेटाउनु आवश्यक ==\nलक्ष्य गरिएको पृष्ठ  \"[[:$1]]\" पहिलादेखि छ\nके तपाईं यो त्यहाँ सार्न त्यसलाई मेट्न चाहनुहुन्छ?",
+       "delete_and_move_text": "लक्ष्य गरिएको पृष्ठ \"[[:$1]]\" पहिल्यै छ।\nके तपाईं यसलाई मेटाएर यस कदमको लागि बाटो खुला गर्न चाहनुहुन्छ?",
        "delete_and_move_confirm": "हो, पृष्ठ मेट्नुहोस्",
        "delete_and_move_reason": " \"[[$1]]\"बाट सार्नलाई बाटो खुलाउन मेटियो",
        "selfmove": "स्रोत तथा लक्ष्य गरिएको पृष्ठको शीर्षक एउटै भएकाले;\nयसैमाथि पृष्ठ सार्न मिल्दैन",
        "tooltip-pt-mycontris": "{{GENDER:|तपाईंका}} योगदानहरूको सूची",
        "tooltip-pt-login": "तपाईंलाई प्रवेस गर्न सुझाव दिइन्छ ; तर यो जरुरी भने छैन",
        "tooltip-pt-logout": "निर्गमन",
-       "tooltip-pt-createaccount": "तपाà¤\88à¤\82लाà¤\88 à¤\96ाता à¤¬à¤¨à¤¾à¤\89न à¤° à¤²à¤\97 à¤\87न à¤\97रà¥\8dन à¤¹à¤¾à¤®à¤¿ à¤ªà¥\8dरà¥\8bतà¥\8dसाहित à¤\97रà¥\8dà¤\9bà¥\8c; à¤¤à¤¥à¤¾à¤ªà¤¿, à¤¯à¥\8b à¤\85निवारà¥\8dय à¤­à¤¨à¥\87 à¤\9bà¥\88न ।",
+       "tooltip-pt-createaccount": "तपाà¤\88à¤\81लाà¤\88 à¤\96ाता à¤¬à¤¨à¤¾à¤\89न à¤° à¤ªà¥\8dरवà¥\87श à¤\97रà¥\8dन à¤¹à¤¾à¤®à¥\80 à¤ªà¥\8dरà¥\8bतà¥\8dसाहित à¤\97रà¥\8dà¤\9bà¥\8cà¤\82; à¤¤à¤¥à¤¾à¤ªà¤¿, à¤¯à¥\8b à¤\85निवारà¥\8dय à¤­à¤¨à¥\87 à¤\9bà¥\88न।",
        "tooltip-ca-talk": "सामग्री पृष्ठबारेमा छलफल",
        "tooltip-ca-edit": "यो पृष्ठ सम्पादन गर्ने",
        "tooltip-ca-addsection": "नयाँ खण्ड सुरु गर्नुहोस्",
        "tooltip-t-upload": "फाइल अपलोड गर्ने",
        "tooltip-t-specialpages": "सबै विशेष पृष्ठहरूको सूची",
        "tooltip-t-print": "यो पृष्ठको मुद्रण योग्य संस्करण",
-       "tooltip-t-permalink": "पà¥\83षà¥\8dठà¤\95à¥\8b à¤¯à¥\8b à¤ªà¥\81नरावलà¥\8bà¤\95नà¤\95à¥\8b à¤²à¤¾à¤\97ि à¤¸à¥\8dथाà¤\88 लिङ्क",
-       "tooltip-ca-nstab-main": "सामग्री पृष्ठ हेर्नुहोस",
+       "tooltip-t-permalink": "पà¥\83षà¥\8dठà¤\95à¥\8b à¤¯à¥\8b à¤ªà¥\81नरावलà¥\8bà¤\95नà¤\95à¥\8b à¤²à¤¾à¤\97ि à¤¸à¥\8dथायà¥\80 लिङ्क",
+       "tooltip-ca-nstab-main": "सामग्री पृष्ठ हेर्नुहोस",
        "tooltip-ca-nstab-user": "प्रयोगकर्ता पृष्ठ हेर्नुहोस्",
        "tooltip-ca-nstab-media": "मिडिया पृष्ठ हेर्नुहोस्",
        "tooltip-ca-nstab-special": "यो विशेष पृष्ठ हो, यो सम्पादन गर्न सकिदैन",
        "autoredircomment": "पृष्ठ[[$1]]मा पठाइएको",
        "autosumm-new": " $1 को साथमा पृष्ठ शृजना भयो",
        "autosumm-newblank": "खाली पृष्ठ तयार गर्ने",
-       "size-bytes": "$1 बाइटहरू",
+       "size-bytes": "$1 {{PLURAL:$1|बाइट|बाइटहरू}}",
        "size-kilobytes": "$1 किलोबाइटहरू",
        "size-megabytes": "$1 मेगाबाइटहरू",
        "size-gigabytes": "$1 गिगाबाइटहरू",
        "watchlistedit-raw-done": "तपाईंको निगरानी सूची अद्यावधिक गरिएको छ।",
        "watchlistedit-raw-added": "{{PLURAL:$1|१ शिर्षक|$1 शिर्षकरु}} थपियो:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|१ शिर्षक|$1 शिर्षकरु}} हटाइयो:",
-       "watchlistedit-clear-title": "अवलोकन सूची खाली गरियो",
+       "watchlistedit-clear-title": "अवलोकनसूची खाली गर्नुहोस्",
        "watchlistedit-clear-legend": "अवलोकन सूची खाली गर्ने",
        "watchlistedit-clear-explain": "तपाईंको अवलोकन सूचीबाट सम्पूर्ण शिर्षकहरू मेटाइदै",
        "watchlistedit-clear-titles": "शीर्षकहरू :",
        "fileduplicatesearch-result-1": "फाइल\"$1\" को दुरुस्त नक्कलहरु छैनन् ।",
        "fileduplicatesearch-result-n": "फाइल\"$1\" को {{PLURAL:$2|1 दुरुस्त नक्कल|$2 दुरुस्त नक्कलहरु}} छन् ।",
        "fileduplicatesearch-noresults": "\"$1\" नामको फाइल पाइएन।",
-       "specialpages": "विशेष पृष्ठ",
+       "specialpages": "विशेष पृष्ठहरू",
        "specialpages-note-top": "आदर्श वाक्य",
        "specialpages-note-restricted": "* साधारण विशेष पृष्ठहरू।\n* <span class=\"mw-specialpagerestricted\">निषेधित विशेष पृष्ठहरू।</span>",
        "specialpages-group-maintenance": "मर्मत प्रतिवेदनहरू",
        "tags-actions-header": "कार्यहरु",
        "tags-active-yes": "हो",
        "tags-active-no": "हैन",
-       "tags-source-extension": "à¤\8fà¤\95à¥\8dसà¤\9fà¥\87नà¥\8dसनदà¥\8dवारा à¤ªà¤°à¤¿à¤­à¤¾à¤·à¤¿à¤¤ à¤\97रà¥\8dनà¥\87",
+       "tags-source-extension": "सफà¥\8dà¤\9fवà¥\87यरदà¥\8dवारा à¤ªà¤°à¤¿à¤­à¤¾à¤·à¤¿à¤¤",
        "tags-source-manual": "प्रयोगकर्ताहरू तथा बोटहरूबाट म्यानुअल्ली लागु गरिएको",
        "tags-source-none": "प्रयोगमा नरहेको",
        "tags-edit": "सम्पादन गर्नुहोस्",
        "tags-edit-revision-legend": "ट्यागहरू {{PLURAL:$1|यस संशोधन|सबै $1 संशोधनहरू}}सँग जोड्ने वा हटाउने।",
        "tags-edit-logentry-legend": "ट्यागहरू {{PLURAL:$1|यस लग प्रविष्टि|सबै $1 लग प्रविष्टिहरू}}सँग जोड्ने वा हटाउने।",
        "tags-edit-existing-tags": "हाल भएको ट्यागहरूः",
-       "tags-edit-existing-tags-none": "''कुनै पनि होइन''",
+       "tags-edit-existing-tags-none": "<em>कुनै पनि होइन</em>",
        "tags-edit-new-tags": "नयाँ ट्यागहरूः",
        "tags-edit-add": "यी ट्यागहरू थप्नेः",
        "tags-edit-remove": "यी ट्यागहरू हटाउनेः",
        "tags-edit-reason": "कारण:",
        "tags-edit-revision-submit": "{{PLURAL:$1|यस संस्करण|$1 संस्करणहरू}} मा परिवर्तनहरूलाई लागु गर्ने",
        "tags-edit-logentry-submit": "{{PLURAL:$1|यस लग प्रविष्टी|$1 लग प्रविष्टीहरू}} मा परिवर्तनहरूलाई लागु गर्ने",
-       "tags-edit-success": "परिवरà¥\8dतनहरà¥\82 à¤¸à¤«à¤²à¤¤à¤¾ à¤ªà¥\82रà¥\8dवà¤\95 à¤²à¤¾à¤\97à¥\81 à¤­à¥\88सà¤\95à¥\8dयो",
+       "tags-edit-success": "परिवरà¥\8dतनहरà¥\82 à¤²à¤¾à¤\97à¥\81 à¤\97रियो",
        "tags-edit-failure": "यी परिवर्तनहरू लागु गर्न सकिएनः\n$1",
        "tags-edit-nooldid-title": "अवैध संशोधन लक्ष्य",
        "tags-edit-nooldid-text": "या त तपाईंले कुनै लक्षित संशोधनको विवरण दिनुभएको छैन जहाँ यस कार्यलाई सम्पन्न गर्नु पर्नेछ, या विवरण गरिएको संशोधन छंदै छैन।",
        "logentry-rights-autopromote": "$1 को प्रयोगकर्ता समूह स्वतः $4 बाट परिवर्तन गरेर $5 {{GENDER:$2|गरिएको}} थियो",
        "logentry-upload-upload": "$1 ले $3 {{GENDER:$2|अपलोड गरेका छन्}}",
        "logentry-upload-overwrite": "$1 ले $3 को नयाँ संस्करण {{GENDER:$2|अपलोड गरेका छन्}}",
-       "logentry-upload-revert": "$1 ले $3 {{GENDER:$2|अपलोड गरेका छन्}}",
+       "logentry-upload-revert": "$1ले $3लाई पुरानो संस्करणमा {{GENDER:$2|उल्टाउनुभयो}}",
        "log-name-managetags": "ट्याग व्यवस्थापन लग",
        "log-description-managetags": "यस पृष्ठमा ती प्रवन्धन कार्यहरूको सूची छ जुन [[Special:Tags|ट्यागहरू]]सँग सम्बन्धित छ। लगमा मात्रै ती क्रियाहरूको बयान गरिएको छ जुन मानवीय रूपले कुनै प्रवन्धकद्वारा पुरा गरिएको छ। ट्यागहरूलाई विकि सफ्टवेयरद्वारा बनउनु वा हटाउन सकिनेछ जसको प्रविष्टि लगमा हुनु आवश्यक छैन।",
        "logentry-managetags-create": "$1 ले ट्याग $4 {{GENDER:$2|तयार गरेको छ}}",
        "api-error-emptypage": "नयाँ तयार गर्दै, खाली पृष्ठ तयार गर्न अनुमति छैन ।",
        "api-error-publishfailed": "आन्तरिक समस्याः अस्थायी फाइल प्रकाशन गर्न सर्भर असफर भयो ।",
        "api-error-stashfailed": "आन्तरिक त्रुटि: अस्थाई फाइल राख्न सर्वर असफल भयो।",
-       "api-error-unknown-warning": "अज्ञात चेतावनी: \"$1\"",
+       "api-error-unknown-warning": "अज्ञात चेतावनी:\"$1\"।",
        "api-error-unknownerror": "अज्ञात त्रुटि: \"$1\".",
        "duration-seconds": "$1 {{PLURAL:$1|सेकेण्ड|सेकेण्डहरू}}",
        "duration-minutes": "$1 {{PLURAL:$1|मिनेट|मिनेटहरू}}",
        "special-characters-title-emdash": "इएम ड्यास",
        "special-characters-title-minus": "घटाउने चिन्ह",
        "mw-widgets-abandonedit": "के तपाई सम्पादन सङ्ग्रह नगरीकन सम्पादनबाट बाहिरिनेमा निश्चित हुनुहुन्छ?",
-       "mw-widgets-abandonedit-discard": "सम्पादन रद्द गर्नु",
-       "mw-widgets-abandonedit-keep": "समà¥\8dपादन à¤\9cारà¥\80 à¤°à¤¾à¤\96à¥\8dनà¥\87",
-       "mw-widgets-abandonedit-title": "निशà¥\8dà¤\9aित à¤¹à¥\81नà¥\81हà¥\81नà¥\8dà¤\9b ?",
+       "mw-widgets-abandonedit-discard": "सम्पादनहरू रद्द गर्नुहोस्",
+       "mw-widgets-abandonedit-keep": "समà¥\8dपादन à¤\9cारà¥\80 à¤°à¤¾à¤\96à¥\8dनà¥\81हà¥\8bसà¥\8d",
+       "mw-widgets-abandonedit-title": "à¤\95à¥\87 à¤¤à¤ªà¤¾à¤\88à¤\81 à¤ªà¤\95à¥\8dà¤\95ा à¤¹à¥\81नà¥\81हà¥\81नà¥\8dà¤\9b?",
        "mw-widgets-titleinput-description-new-page": "हालसम्म पृष्ठ उपलब्ध छैन्",
-       "mw-widgets-titleinput-description-redirect": "$1 à¤®à¤¾ à¤\9cानà¥\87",
+       "mw-widgets-titleinput-description-redirect": "$1 à¤®à¤¾ à¤ªà¥\81नरà¥\8dनिरà¥\8dदà¥\87श",
        "randomrootpage": "यादृच्छिक शीर्ष पृष्ठ",
        "log-action-filter-all": "सबै",
        "log-action-filter-block-block": "रोक्ने",
index 2ea7cdc..2607b72 100644 (file)
                        "RadioAzureus"
                ]
        },
-       "tog-underline": "Verwijzingen onderstrepen:",
+       "tog-underline": "Links onderstrepen:",
        "tog-hideminor": "Kleine bewerkingen in recente wijzigingen verbergen",
        "tog-hidepatrolled": "Gemarkeerde bewerkingen in recente wijzigingen verbergen",
        "tog-newpageshidepatrolled": "Gemarkeerde pagina's in de lijst met nieuwe pagina's verbergen",
        "diff-multi-sameuser": "({{PLURAL:$1|Een tussenliggende versie|$1 tussenliggende versies}} door dezelfde gebruiker niet weergegeven)",
        "diff-multi-otherusers": "({{PLURAL:$1|Een tussenliggende versie|$1 tussenliggende versies}} door {{PLURAL:$2|een andere gebruiker|$2 gebruikers}} niet weergegeven)",
        "diff-multi-manyusers": "($1 tussenliggende {{PLURAL:$1|versie|versies}} door meer dan $2 {{PLURAL:$2|gebruiker|gebruikers}}  worden niet weergegeven)",
-       "diff-paragraph-moved-tonew": "Deze paragraaf is verplaatst. Klik om naar de nieuwe locatie te springen.",
-       "diff-paragraph-moved-toold": "Deze paragraaf is verplaatst. Klik om naar de oude locatie te springen.",
+       "diff-paragraph-moved-tonew": "Deze alinea is verplaatst. Klik om naar de nieuwe locatie te springen.",
+       "diff-paragraph-moved-toold": "Deze alinea is verplaatst. Klik om naar de oude locatie te springen.",
        "difference-missing-revision": "{{PLURAL:$2|Eén versie|$2 versies}} van deze verschillen ($1) {{PLURAL:$2|is|zijn}} niet aangetroffen.\n\nDit wordt meestal veroorzaakt door het volgen van een verouderde koppeling verschillen voor een pagina die is verwijderd.\nMeer gegevens zijn mogelijk te vinden in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderingslogboek].",
        "searchresults": "Zoekresultaten",
        "search-filter-title-prefix": "Alleen pagina's doorzoeken waarvan de titel begint met \"$1\"",
        "ipblocklist-legend": "Een geblokkeerde gebruiker zoeken",
        "blocklist-userblocks": "Geblokkeerde accounts verbergen",
        "blocklist-tempblocks": "Tijdelijke blokkades verbergen",
+       "blocklist-indefblocks": "Verberg blokkades met een oneindige loopduur",
        "blocklist-addressblocks": "Blokkades van één IP-adres verbergen",
        "blocklist-type": "Soort:",
        "blocklist-type-opt-all": "Alle",
index e55b753..0870b19 100644 (file)
        "botpasswords-updated-body": "ߓߏߕ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߓߏߕ ߕߐ߮ ߦߋ߫ \"$1\" {{GENDER:$2|ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ}} ߦߋ߫ \"$2\" ߕߎ߲߬ ߓߘߊ߫ ߟߏ߲ߘߐߦߊ߫.",
        "botpasswords-deleted-title": "ߓߏߕ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߓߘߊ߫ ߖߏ߬ߛߌ߬",
        "botpasswords-deleted-body": "ߓߏߕ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߓߏߕ ߕߐ߮ ߦߋ߫ \"$1\" {{GENDER:$2|ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ}} ߦߋ߫ \"$2\" ߕߎ߲߬ ߓߘߊ߫ ߖߏ߬ߛߌ߬.",
+       "botpasswords-no-provider": "ߓߏߕ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߥߎ߬ߛߎ ߡߊߛߐߟߊ ߕߍ߫ ߊ߬ ߟߊ߫.",
+       "botpasswords-restriction-failed": "ߓߏߕ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߟߊ߬ߞߎ߲߬ߛߌ߲߬ߠߌ߲ ߓߘߊ߫ ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߣߌ߲߬ ߢߍߓߍ߲߬.",
+       "botpasswords-invalid-name": "ߓߏߕ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߕߍߝߘߊߟߌ (\"$1\") ߕߍ߫ ߟߊ߬ߓߊ߰ߙߊ߬ߕߐ߰ ߞߙߍߞߙߍߣߍ߲ ߠߊ߫.",
        "botpasswords-not-exist": "ߓߏߕ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߕߐ߯ߟߊߣߍ߲߫ \"$2\" ߕߍ߫ ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ  \"$1\" ߓߟߏ߫",
        "botpasswords-needs-reset": "ߓߏߕ ߕߊ߬ߡߌ߲߬ߞߊ߲  \"$1\" ߓߏߕ ߕߐ߯ \"$2\" ߦߋ߫ {{GENDER:$1|ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ}}  \"$1\" ߦߋ߫ ߡߊߦߟߍ߬ߡߊ߲߫.",
        "botpasswords-locked": "ߌ ߕߍߣߊ߬ ߛߋߟߴߌ ߜߊ߲߬ߞߎ߲߬ ߠߊ߫ ߓߏߕ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߘߌ߫ ߓߊ ߌ ߟߊ߫ ߖߊ߬ߕߋ߬ߘߊ ߛߐ߰ߣߍ߲߫ ߠߋ߫.",
        "resetpass-no-info": "ߌ ߦߴߌ ߜߊ߲߬ߞߎ߲߬ ߡߎߣߎ߲߬ ߞߣߊ߬ ߕߏ߫ ߞߐߜߍ ߣߌ߲߬ ߡߊߛߐ߬ߘߐ߲߬ ߠߊ߫.",
        "resetpass-submit-loggedin": "ߕߊ߬ߡߌ߲߬ߞߊ߲ ߡߊߝߊ߬ߟߋ߲߬",
        "resetpass-submit-cancel": "ߊ߬ ߘߐߛߊ߬",
+       "resetpass-wrong-oldpass": "ߥߊ߯ߕߌߟߊߕߊߡߌ߲߫ ߕߊߡߌ߲ߞߊ߲ ߥߟߊ߫ ߕߋ߲߭ߕߋ߲߭ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߓߍ߲߬ߓߊߟߌ.\nߕߎ߬ߡߊ߬ߘߐ߫ ߌ ߣߐ߬ ߘߌ߫ ߞߍ߫ ߌ ߟߊ߫ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߡߊߝߊ߬ߟߋ߲߬ ߠߊ߫ ߥߟߊ߫ ߌ ߓߘߊ߫ ߥߊ߯ߕߌߟߊߕߊߡߌ߲߫ ߕߊߡߌ߲ߞߊ߲߫ ߞߎߘߊ߫ ߡߊߞߟߌ߫.",
+       "resetpass-recycled": "ߖߊ߰ߣߌ߲߬ ߌ ߦߴߌ ߟߊ߫ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߡߊߝߊ߬ߟߋ߲߬ ߘߏ߫ ߜߘߍ߫ ߟߊ߫ ߡߍ߲ ߣߌ߫ ߘߐ ߣߌ߲߬ ߕߍ߫ ߞߋߟߋ߲߫ ߘߌ߫.",
+       "resetpass-temp-emailed": "ߌ ߓߘߴߌ ߜߊ߲߬ߞߎ߲߫ ߥߊ߯ߕߌߟߊߕߊߡߌ߲߫ ߗߋߛߓߍ ߘߏߝߙߍߕߍ ߟߊ߫.\nߖߐ߲߬ߛߊ߫ ߌ ߘߌ߫ ߓߊ߲߫ ߌ ߜߊ߲߬ߞߎ߲߬ ߠߊ߫߸ ߌ ߞߊߞߊ߲߫ ߞߊ߬ ߕߊ߬ߡߌ߲߬ߞߊ߲߬ ߞߎߘߊ߫ ߟߊߘߏ߲߬:",
        "resetpass-temp-password": "ߕߊߡߌ߲ߞߊ߲ ߕߎ߬ߡߊ߬ߞߎ߲߬ߡߊ",
+       "resetpass-abort-generic": "ߕߊ߬ߡߌ߲߬ߞߊ߲ ߡߊߝߊ߬ߟߋ߲߬ߠߌ߲ ߓߘߊ߫ ߘߐߛߊ߬ ߞߐߕߊ߲ߠߌ߲ ߘߏ߫ ߓߟߏ߫.",
+       "resetpass-expired": "ߌ ߟߊ߫ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߛߕߊ ߓߘߊ߫ ߝߊ߫. ߕߊ߬ߡߌ߲߬ߞߊ߲߬ ߞߎߘߊ߫ ߟߊߘߏ߲߬ ߖߊ߰ߣߌ߲߫ ߞߵߌ ߜߊ߲߬ߞߎ߲߫.",
+       "resetpass-expired-soft": "ߌ ߟߊ߫ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߛߕߊ ߓߘߊ߫ ߝߊ߫ ߊ߬ ߘߏ߲߬ ߡߊ߬ߞߏ ߦߋ߫ ߡߝߊ߬ߟߋ߲߬ߠߌ߲ ߠߊ߫.ߕߊ߬ߡߌ߲߬ߞߊ߲߬ ߞߎߘߊ߫ ߛߎߥߊ߲ߘߌ߫ ߖߊ߰ߣߌ߲߬߸ ߥߟߊ߫ ߌ ߦߋ߫ ߣߌ߲߬ ߛߐ߲߬ߞߌ߲߫  \"{{int:authprovider-resetpass-skip-label}}\" ߞߵߊ߬ ߡߊߝߊ߬ߟߋ߲߬ ߞߐߝߍ߬.",
+       "resetpass-validity": "ߌ ߟߊ߫ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߓߍ߲߬ߣߍ߲߬ ߕߍ߫: $1\n\nߕߊ߬ߡߌ߲߬ߞߊ߲߬ ߞߎߘߊ߫ ߟߊߘߏ߲߬ ߖߊ߰ߣߌ߲߫ ߞߵߌ ߜߊ߲߬ߞߎ߲߫.",
+       "resetpass-validity-soft": "ߌ ߟߊ߫ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߓߍ߲߬ߣߍ߲߬ ߕߍ߫: $1\n\nߕߊ߬ߡߌ߲߬ߞߊ߲߬ ߞߎߘߊ߫ ߟߊߘߏ߲߬ ߛߌߣߍ߲߬ ߖߊ߰ߣߌ߲߫߸ ߥߟߊ߫ ߣߌ߲߬ ߛߐ߲߬ߞߌ߲߫ \"{{int:authprovider-resetpass-skip-label}}\" ߞߵߊ߬ ߡߊߝߊ߬ߟߋ߲߬ ߞߐߝߍ߬.",
        "passwordreset": "ߕߊ߬ߡߌ߲߬ߞߊ߲ ߡߊߦߟߍ߬ߡߊ߲߬",
+       "passwordreset-text-one": "ߖߙߎߡߎ߲ ߣߌ߲߬ ߘߝߊ߫ ߛߴߌ ߘߌ߫ ߥߊ߯ߕߌߟߊߕߊߡߌ߲߫ ߕߊߡߌ߲ߞߊ߲ ߘߏ߫ ߡߊߛߐ߬ߘߐ߲߬ ߢߎߡߍߙߋ߲ߞߏ߲ߘߏ ߟߊ߫.",
        "passwordreset-disabled": "ߕߊ߬ߡߌ߲߬ߞߊ߲߬ ߡߊߦߟߍ߬ߡߊ߲߬ߣߍ߲ ߓߘߊ߫ ߛߋ߲߬ߓߐ߫ ߥߞߌ ߣߌ߲߬ ߘߐ߫.",
        "passwordreset-username": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߕߐ߮:",
        "passwordreset-domain": "ߡߊ߬ߘߎ߮:",
        "grant-editpage": "ߞߐߜߍ߫ ߓߍߓߊ߮ ߡߊߦߟߍ߬ߡߊ߲߫",
        "grant-editprotected": "ߞߐߜߍ߫ ߟߊߞߊ߲ߘߊߣߍ߲ ߡߊߦߟߍ߬ߡߊ߲߫",
        "grant-highvolume": "ߢߊ߲ߞߊ߲-ߛߊ߲ߘߐߕߊ ߡߊߦߟߍߡߊ߲ ߦߴߌ ߘߐ߫",
+       "grant-oversight": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߢߡߊߘߏ߲߰ ߊ߬ ߣߌ߫ ߞߊ߬ ߟߢߊ߬ߟߌ ߟߎ߬ ߖߏ߬ߛߌ߬.",
        "grant-patrol": "ߞߐߜߍ ߟߎ߬ ߓߍ߬ߙߍ߲߬ߓߍ߬ߙߍ߲߬ߠߌ߲ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲",
        "grant-privateinfo": "ߘߎ߲߬ߘߎ߬ߡߊ߬ ߞߌߓߊߙߏߦߊ ߟߊߛߐ߬ߘߐ߲߬",
        "grant-protect": "ߞߐߜߍ ߟߎ߬ ߟߊߞߊ߲ߘߊ߫ ߊ߬ ߣߌ߫ ߞߵߊ߬ߟߎ߬ ߟߊߞߊ߲ߘߊߣߍ߲ ߓߐ߫",
        "action-writeapi": "ߛߓߍߟߌ API ߟߊߓߊ߯ߙߊ߫",
        "action-delete": "ߞߐߜߍ ߣߌ߲߬ ߖߏ߰ߛߌ߬",
        "action-deleterevision": "ߟߢߊ߬ߟߌ ߟߎ߬ ߖߏ߬ߛߌ߬",
+       "action-deletelogentry": "ߘߊ߲ߖߐ ߡߎ߰ߡߍ ߖߏ߬ߛߌ߬",
        "action-deletedhistory": "ߞߐߜߍ ߟߎ߬ ߖߏ߰ߛߌ߬ߟߌ ߘߐ߬ߝߐ ߦߋ߫",
        "action-deletedtext": "ߟߢߊ߬ߟߌ ߖߏ߰ߛߌ߬ߣߍ߲ ߠߎ߬ ߛߓߍߟߌ ߦߋ߫.",
        "action-browsearchive": "ߞߐߜߍ߬ ߖߏ߰ߛߌ߬ߣߍ߲ ߠߎ߬ ߢߌߣߌ߲߫",
        "action-undelete": "ߞߐߜߍ ߖߏ߰ߛߌ߬ߓߊߟߌ ߟߎ߬",
+       "action-suppressrevision": "ߟߢߊ߬ߟߌ߬ ߢߡߊߘߏ߲߰ߣߍ߲ ߠߎ߬ ߦߋ߫ ߊ߬ ߣߌ߫ ߞߵߊ߬ߟߎ߬ ߟߊߞߎߣߎ߲߫.",
        "action-suppressionlog": "ߘߎ߲߬ߘߎ߬ߡߊ߬ ߘߎ߲ߛߓߍ ߣߌ߲߬ ߦߋ߫",
        "action-block": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߣߌ߲߬ ߓߊ߬ߟߌ߬ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߡߊ߬",
        "action-protect": "ߞߐߜߍ ߣߌ߲߬ ߟߊ߬ߞߊ߲߬ߘߊ߬ߟߌ߬ ߞߛߊߞߊ ߡߊߝߊ߬ߟߋ߲߬",
+       "action-rollback": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߞߐߟߕߊ ߟߊ߫ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߟߊߞߐߛߊ߬ߦߌ߬ ߖߏߣߊߖߏߣߊ߫߹ ߡߍ߲ ߞߊ߬ ߞߐߜߍ߫ ߞߙߍߞߙߍߣߍ߲ ߡߊߦߟߍ߬ߡߊ߲߫.",
        "action-import": "ߞߐߜߍ ߟߎ߬ ߟߊߛߣߍ߫ ߞߊ߬ ߓߐ߫ ߥߞߌ ߕߐ߭ ߟߎ߬ ߘߐ߫",
        "action-importupload": "ߞߐߜߍ ߟߎ߬ ߟߊߛߣߍ߫ ߞߊ߬ ߓߐ߫ ߞߐߕߐ߯ ߟߊߦߟߍ߬ߣߍ߲ ߠߎ߬ ߘߐ߫",
        "action-patrol": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߘߏ ߟߎ߬ ߟߊ߫ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߠߎ߬ ߣߐ߬ߣߐ߬ ߓߍ߬ߙߍ߲߬ߓߍ߬ߙߍ߲߬ߣߍ߲ ߘߌ߫",
        "action-managechangetags": "ߘߎ߲ߛߓߍ ߟߎ߬ ߛߌ߲ߘߟߌ ߣߴߊ߬ߟߎ߬ ߓߐߒߠߊߟߌ",
        "action-applychangetags": "ߘߎ߲ߛߓߍ ߟߎ߬ ߟߊߓߊ߯ߙߊ߫ ߌ ߟߊ߫ ߡߝߊ߬ߟߋ߲߬ߠߌ߲ ߠߎ߬ ߞߊ߲߬",
        "action-deletechangetags": "ߘߎ߲ߛߓߍ ߟߎ߬ ߖߏ߬ߛߌ߬ ߞߊ߬ ߓߐ߫ ߓߟߏߡߟߊ ߝߊ߲ ߞߊ߲߬",
+       "action-purge": "ߞߐߜߍ ߣߌ߲߬ ߛߊߣߌ߲ߧߊ߫",
+       "action-apihighlimits": "API ߡߊߢߌߣߌ߲ߣߍ߲ ߛߊ߲ߘߐߕߊ ߟߊߓߊ߯ߙߊ߫",
+       "action-bigdelete": "ߞߐߜߍ߫ ߘߝߐ߬ ߓߟߋ߬ߓߟߋ߬ߡߊ ߟߎ߬ ߖߏ߰ߛߌ߬",
+       "action-blockemail": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߓߊ߬ߟߌ߬ ߢߎߡߍߙߋ߲ ߗߋߟߌ ߡߊ߬",
+       "action-editprotected": "ߞߐߜߍ ߟߎ߬ ߡߊߦߟߍ߬ߡߊ߲߫ ߡߍ߲ ߠߎ߬ ߟߊߞߊ߲ߘߊߣߍ߲߫ ߦߋ߫ \"{{int:protect-level-sysop}}\" ߓߟߏ߫.",
+       "action-editsemiprotected": "ߞߐߜߍ ߟߎ߬ ߡߊߦߟߍ߬ߡߊ߲߫ ߡߍ߲ ߠߎ߬ ߟߊߞߊ߲ߘߊߣߍ߲߫ ߦߋ߫  \"{{int:protect-level-autoconfirmed}}\"",
+       "action-editinterface": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߟߊ߫ ߢߐ߲߯ߕߍߞߣߍ ߡߊߦߟߍ߬ߡߊ߲߫",
        "action-editusercss": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߘߏ ߟߎ߬ CSS ߟߊ߬ߓߊ߰ߙߊ߬ߟߌ߬ ߞߐߕߐ߮ ߡߊߦߟߍ߬ߡߊ߲߫",
        "action-edituserjson": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߘߏ ߟߎ߬ ߟߊ߫ JSON ߞߐߕߐ߮ ߟߎ߬ ߡߊߦߟߍ߬ߡߊ߲߫",
        "action-edituserjs": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߘߏ ߟߎ߬ ߟߊ߫ JavaScript ߞߐߕߐ߮ ߟߎ߬ ߡߊߦߟߍ߬ߡߊ߲߫",
        "action-editmyusercss": "ߌ ߖߘߍ߬ߞߊ߬ߣߌ߲߬ CSS ߟߊ߬ߓߊ߰ߙߊ߬ߟߌ߬ ߞߐߕߐ߮ ߡߊߦߟߍ߬ߡߊ߲߫",
        "action-editmyuserjson": "ߌ ߖߘߍ߬ߞߊ߬ߣߌ߲߬ JSON ߞߐߕߐ߮ ߟߎ߬ ߡߊߦߟߍ߬ߡߊ߲߫",
        "action-editmyuserjs": "ߌ ߖߘߍ߬ߞߊ߬ߣߌ߲߬ JavaScript ߞߐߕߐ߮ ߟߎ߬ ߡߊߦߟߍ߬ߡߊ߲߫",
+       "action-editmyuserjsredirect": "ߌ ߖߘߍ߬ߞߊ߬ߣߌ߲߬ JavaScript ߞߐߕߐ߮ ߟߎ߬ ߡߊߦߟߍ߬ߡߊ߲߫ ߡߍ߲ ߠߎ߬ ߓߘߊ߫ ߟߊߞߎ߲߬ߛߌ߲߫.",
        "action-viewsuppressed": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߘߏ ߟߎ߬ ߟߊ߫ ߟߢߊ߬ߟߌ߬ ߢߡߊߘߏ߲߰ߣߍ߲ ߠߎ߬ ߦߋ߫",
+       "action-hideuser": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ߫ ߟߎ߫ ߓߊ߬ߟߌ߬߸ ߡߍ߲ ߠߎ߬ ߢߡߊߘߏ߲߰ߣߍ߲߬ ߦߋ߫ ߖߊ߬ߡߊ ߟߊ߫ ߦߋߟߌ ߡߊ߬.",
        "action-unblockself": "ߌ ߖߍ߬ߘߍ ߓߊ߬ߟߌ߬ߣߍ߲ ߓߐ߫",
+       "action-reupload-own": "ߌ ߖߘߍ߬ߞߊߣߌ߲ ߠߊ߫ ߞߐߕߐ߯ ߟߊߦߟߍ߬ߣߍ߲ ߠߎ߬ ߖߏ߰ߛߌ߬",
+       "action-nominornewtalk": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲߬ ߘߋ߬ߣߍ߲߬ ߞߏ ߕߍ߫ ߘߊߘߐߖߊߥߏ ߞߐߜߍ ߟߎ߬ ߘߐ߫߸ ߗߋߛߓߍ߫ ߞߎߘߊ߫ ߘߊߡߌ߬ߣߊ߬ ߞߊߟߌߦߊ߫ ߘߐ߫.",
+       "action-markbotedits": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲߬ ߟߊߞߐߛߊ߬ߦߌ߬ߣߍ߲ ߠߎ߬ ߣߐ߬ߣߐ߬ ߓߏߕ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲߬ߣߐ ߘߌ߫.",
+       "action-patrolmarks": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲߬ ߞߎߘߊ ߟߎ߬ ߦߌ߬ߘߊ߬ ߓߍ߬ߙߍ߲߬ߓߍ߬ߙߍ߲߬ߠߌ߲߫ ߣߐ߬ߣߐ߬ߣߍ߲ ߘߌ߫",
+       "action-override-export-depth": "ߞߐߜߍ ߟߎ߬ ߟߊߝߏ߬ߦߌ߬߸ ߤߊߟߌ߬ ߞߐߜߍ߫ ߜߋ߲߭ߞߘߎ߬ߣߍ߲ߢߐ߲߰ߠߊ ߡߍ߲ ߠߎ߬ ߦߋ߫ ߅ ߘߎ߲߰ߧߊ ߛߊ߲ߘߐ߫.",
+       "action-suppressredirect": "ߟߊ߬ߞߎ߲߬ߛߌ߲߬ߠߌ߲ ߞߊߣߊ߬ ߟߊߘߊ߲߫ ߓߐߛߎ߲ ߞߐߜߍ ߟߎ߬ ߟߊ߫ ߞߐߜߍ ߟߎ߬ ߓߐ߫ ߕߎߡߊ ߟߴߊ߬ߟߎ߫ ߣߐ߭ ߘߐ߫.",
        "nchanges": "$1 {{PLURAL:$1|ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲|ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߠߎ߬}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|ߞߊ߬ߦߌ߯ ߓߐߒߡߊߟߌ ߟߊߓߊ߲}}",
        "enhancedrc-history": "ߘߐ߬ߝߐ",
        "recentchanges-timeout": "ߢߌߣߌ߲ߣߌ߲ ߣߌ߲߬ ߕߎ߬ߡߊ ߓߘߊ߫ ߕߊ߬ߡߌ߲߬. ߌ ߞߊߞߊ߲߫ ߞߊ߬ ߢߊߢߌߣߌ߲߫ ߜߘߍ߫ ߟߊ߬ߓߍ߲߬ߢߐ߲߰ߡߊ ߞߍ߫.",
        "recentchanges-network": "ߞߊ߬ ߓߍ߲߬ ߛߋߒߞߏߟߦߊ ߝߎ߬ߕߎ߲߬ߕߌ ߡߊ߬߸ ߞߐߝߟߌ߫ ߛߌ߫ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߊ߫ ߟߊߢߎ߲߫ ߠߊ߫. ߌ ߞߊߘߊ߲߫ ߞߊ߬ ߞߐߜߍ ߣߌ߲߬ ߠߊߛߎߡߦߊ߫ ߖߊ߰ߣߌ߲߫.",
        "recentchanges-notargetpage": "ߞߐߜߍ ߕߐ߮ ߟߊߘߏ߲߬ ߛߊ߲ߝߍ߬߸ ߦߟߍ߬ߡߊ߲ ߡߍ߲ ߦߋ߫ ߞߐߜߍ ߘߐ߫߸ ߞߵߏ߬ ߦߋ߫.",
+       "recentchanges-feed-description": "ߥߞߌ ߣߌ߲߬ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲߬ ߞߐ߯ߟߕߊ ߟߎ߬ ߣߐ߬ߣߐ߬ ߓߊߟߏ ߣߌ߲߬ ߘߐ߫.",
        "recentchanges-label-newpage": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߣߌ߲߬ ߓߘߊ߫ ߘߐߜߍ߫ ߞߎߘߊ ߟߊߘߊ߲߫",
        "recentchanges-label-minor": "ߢߟߊߞߎߘߦߊ߫ ߝߕߌߣߍ߲ ߠߋ߬",
        "recentchanges-label-bot": "ߡߐ߰ߡߐ߮ ߟߋ߫ ߣߐ߬ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ ߣߌ߲߬ ߞߍ߫ ߟߊ߫",
        "wantedpages": "ߞߐߜߍ߫ ߜߋ߬ߟߎ߲߬ߣߍ߲ ߠߎ߬",
        "wantedpages-badtitle": "ߞߎ߲߬ߕߐ߮ ߓߍ߲߬ߣߍ߲߬ ߕߍ߫ ߞߐߝߟߌ߫ ߦߌ߬ߘߊ߬ߣߍ߲: $1 ߘߐ߫",
        "wantedfiles": "ߞߐߜߍ߫ ߜߋ߬ߟߎ߲߬ߣߍ߲ ߠߎ߬",
+       "wantedfiletext-nocat-noforeign": "ߞߐߕߐ߮ ߢߌ߲߬ ߠߎ߬ ߓߘߊ߫ ߟߊߓߊ߯ߙߊ߫ ߞߏ߬ߣߵߊ߬ߟߎ߬ ߕߴߦߋ߲߬.",
        "wantedtemplates": "ߞߙߊߞߏ ߞߊ߬ߣߌ߲߬ߣߍ߲ ߠߎ߬",
        "mostlinked": "ߛߘߌ߬ߜߋ߲߬ ߦߙߌߞߊ߫ ߦߋ߫ ߞߐߜߍ ߡߍ߲ ߠߎ߬ ߘߐ߫",
        "mostlinkedcategories": "ߛߘߌ߬ߜߋ߲߬ ߦߙߌߞߊ߫ ߦߋ߫ ߦߌߟߡߊ ߡߍ߲ ߠߎ߬ ߘߐ߫",
        "protectedpages": "ߞߐߜߍ߫ ߟߊߞߊ߲ߘߊߣߍ߲ ߠߎ߬",
        "protectedpages-filters": "ߛߍ߲ߛߍ߲ߟߊ߲ ߠߎ߬:",
        "protectedpages-indef": "ߟߊ߬ߞߊ߲߬ߘߊ߬ߟߌ ߘߊ߲߬ߠߊߕߍ߰ߓߊߟߌ ߘߐߙߐ߲߫",
+       "protectedpages-summary": "ߞߐߜߍ ߛߙߍߘߍ ߢߌ߲߬ ߠߎ߬ ߦߋ߫ ߦߋ߫ ߞߐߜߍ߫ ߟߎ߫ ߟߋ߬ ߘߐ߫ ߡߍ߲ ߠߎ߬ ߟߊߞߊ߲ߘߊߣߍ߲߫ ߦߋ߫ ߕߊ߲߫. ߣߵߌ ߦߋ߫ ߞߎ߲߬ߕߐ߮ ߛߙߍߘߍ߫ ߟߎ߫ ߟߋ߬ ߞߐ߫ ߡߍ߲ ߠߎ߬ ߟߊߞߊ߲ߘߊߣߍ߲߫ ߦߋ߫ ߛߌ߲ߘߟߌ ߡߊ߬߸ ߣߌ߲߬ ߘߐߜߍ߫ [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-noredirect": "ߟߊ߬ߞߎ߲߬ߛߌ߲߬ߠߌ߲ ߢߡߊߘߏ߲߰",
        "protectedpages-timestamp": "ߕߎ߬ߡߊ ߓߊ߬ߘߌ߬ߟߊ߲",
        "protectedpages-page": "ߞߐߜߍ",
        "version-hook-name": "ߛߏ߲߭ߓߊ߬ߟߌ ߕߐ߮",
        "version-hook-subscribedby": "ߕߐ߮ ߛߓߍߣߍ߲߫ ߦߋ߫",
        "version-no-ext-name": "[ߕߐ߯ ߕߴߊ߬ ߟߊ߫]",
+       "version-ext-license": "ߕߌ߰ߦߊ",
+       "version-ext-colheader-name": "ߞߐߕߊ߲ߠߌ߲",
        "version-skin-colheader-name": "ߝߊ߬ߘߌ",
        "version-ext-colheader-version": "ߦߌߟߡߊ",
        "version-ext-colheader-license": "ߕߌ߰ߦߊ",
        "specialpages-group-developer": "ߟߊ߬ߥߙߌ߬ߞߌ߬ߟߌ ߖߐ߯ߙߊ߲ ߠߎ߬",
        "blankpage": "ߞߐߜߍ߫ ߘߐߞߏߟߏ߲",
        "tag-filter": "[[Special:Tags|ߞߊ߲ߠߊߛߓߍ]] ߢߡߊߘߏ߲߰ߣߍ߲",
+       "tag-filter-submit": "ߥߊ߬ߣߊߙߌ",
        "tag-list-wrapper": "[[Special:Tags|{{PLURAL:$1|ߡߊ߬ߛߙߋ |ߡߊ߬ߛߙߋ ߟߎ߬ }}]]: $2",
+       "tag-mw-contentmodelchange": "ߞߣߐߘߐ ߛߎ߯ߦߊ ߡߊߝߊ߬ߟߋ߲߬ߠߌ߲",
+       "tag-mw-contentmodelchange-description": "ߣߌ߲߬ ߡߊߦߟߍ߬ߡߊ߲߫\n[https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ߞߣߐߘߐߛߎ߯ߦߊߡߊߝߊ߬ߟߋ߲߬ ߞߣߐߘߐ ߛߎ߯ߦߊ ߡߊߝߊ߬ߟߋ߲߬] ߞߐߜߍ ߘߐ߫",
+       "tag-mw-new-redirect": "ߟߊ߬ߞߎ߲߬ߛߌ߲߬ߠߌ߲߬ ߞߎߘߊ",
+       "tag-mw-new-redirect-description": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߡߍ߲ ߠߎ߬ ߞߊ߬ ߟߊ߬ߞߎ߲߬ߛߌ߲߬ߠߌ߲ ߠߊߘߊ߲߫ ߥߟߊ߫ ߞߊ߬ ߞߐߜߍ ߦߟߍ߬ߡߊ߲߫ ߞߊ߬ ߞߍ߫ ߟߊ߬ߞߎ߲߬ߛߌ߲߬ߠߌ߲ ߘߌ߫",
+       "tag-mw-removed-redirect": "ߟߊ߬ߞߎ߲߬ߛߌ߲߬ߠߌ߲ ߛߋ߲߬ߓߐ߫",
+       "tag-mw-removed-redirect-description": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߡߍ߲ ߠߎ߬ ߞߊ߬ ߕߋ߲߭ߕߋ߲߭ ߟߊ߬ߞߎ߲߬ߛߌ߲߬ߠߌ߲ ߡߊߦߟߍ߬ߡߊ߲߫ ߞߵߊ߬ ߞߍ߫ ߟߊ߬ߞߎ߲߬ߛߌ߲߬ߓߊߟߌ ߘߌ߫",
+       "tag-mw-changed-redirect-target": "ߟߊ߬ߞߎ߲߬ߛߌ߲߬ߠߌ߲ ߞߏ߲߭ ߓߘߊ߫ ߡߊߝߊ߬ߟߋ߲߬",
+       "tag-mw-changed-redirect-target-description": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߡߍ߲ ߠߎ߬ ߞߊ߬ ߟߊ߬ߞߎ߲߬ߛߌ߲߬ߠߌ߲ ߞߏ߲߭ ߡߊߝߊ߬ߟߋ߲߬",
+       "tag-mw-blank": "ߖߏ߰ߛߌ߬ߟߌ ߦߵߌ ߘߐ߫",
+       "tag-mw-blank-description": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߡߍ߲ ߠߎ߬ ߞߊ߬ ߞߐߜߍ ߖߏ߰ߛߌ߬",
+       "tag-mw-replace": "ߊ߬ ߓߘߊ߫ ߓߐ߫ ߊ߬ ߣߐ߭ ߘߐ߫",
+       "tag-mw-replace-description": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߡߍ߲ ߠߎ߬ ߞߊ߬ ߞߣߐߘߐ %߉߀ ߛߋ߲߬ߓߐ߫ ߞߐߜߍ ߘߐ߫",
+       "tag-mw-rollback": "ߟߊߞߐߛߊ߬ߦߌ߬",
+       "tag-mw-undo": "ߊ߬ ߘߐߛߊ߬",
+       "tag-mw-undo-description": "ߡߊߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߡߍ߲ ߠߎ߬ ߞߊ߬ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲߬ ߟߐ߯ߟߊߣߍ߲ ߠߎ߬ ߘߐߛߊ߬ ߞߊ߬ ߘߐ߬ߛߊ߬ߟߌ ߛߘߌ߬ߜߋ߲ ߠߊߓߊ߯ߙߊ߫.",
+       "tags-title": "ߘߎ߲ߛߓߍ ߟߎ߬",
+       "tags-tag": "ߘߎ߲ߛߓߍ ߕߐ߮",
+       "tags-display-header": "ߟߊ߲ߞߣߍߡߊߟߌ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲߬ ߛߙߍߘߍ ߘߐ߫",
+       "tags-description-header": "ߞߘߐߝߐߟߌ ߞߊ߲߬ߛߓߍ߬ߟߌ߬ ߘߝߊߣߍ߲",
+       "tags-source-header": "ߛߎ߲",
+       "tags-active-header": "ߊ߬ ߟߊߞߎߣߎ߲߫ ߣߍ߲߫؟",
+       "tags-hitcount-header": "ߞߏ߲߭ ߓߘߊ߫ ߡߊߝߊ߬ߟߋ߲߬",
+       "tags-actions-header": "ߞߍߟߌ ߟߎ߬",
        "tags-active-yes": "ߐ߲߬ߐ߲߬ߐ߲߫",
        "tags-active-no": "ߍ߲߬ߍ߲ߍ߲߬",
+       "tags-source-extension": "ߡߊ߬ߕߍ߰ߣߍ߲ ߠߎ߬ ߛߎ߲ߝߘߍ ߓߟߏ߫",
+       "tags-source-manual": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߣߌ߫ ߓߏߕ ߟߎ߬ ߟߊ߫ ߓߟߏߟߊ߫ ߞߍߟߌ",
+       "tags-source-none": "ߊ߬ ߕߍߣߊ߬ ߥߊ߯ߕߌߖߊ߲߫ ߞߍ߫ ߟߊ߫ ߓߊ߯ߙߊ ߘߐ߫ ߡߎ߬ߕߎ߲߬",
+       "tags-edit": "ߊ߬ ߡߊߦߟߍ߬ߡߊ߲߬",
+       "tags-delete": "ߊ߬ ߖߏ߰ߛߌ߬",
+       "tags-activate": "ߊ߬ ߟߊߞߎߣߎ߲߫",
+       "tags-deactivate": "ߊ߬ ߟߊߛߎ߬ߣߐ߬",
        "tags-hitcount": "{{PLURAL:$1|ߦߟߍ߬ߡߊ߲߬ߠߌ|$1 ߦߟߍ߬ߡߊ߲߬ߠߌ ߠߎ߬}}",
+       "tags-manage-no-permission": "ߌ ߟߊߘߌ߬ߢߍ߬ߣߍ߲߬ ߕߍ߫ ߞߊ߬ ߘߎ߲ߛߓߍ ߡߊߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߡߊߞߍ߲߰.",
+       "tags-manage-blocked": "ߌ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߊ߫ ߘߎ߲ߛߓߍ ߡߊߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߡߊߞߍ߲߰ ߠߊ߫ ߞߊ߬ {{GENDER:$1|ߌ}} ߓߊ߬ߟߌ߬ߣߍ߲ ߕߏ߫.",
+       "tags-create-heading": "ߘߎ߲ߛߓߍ߫ ߞߎߘߊ߫ ߛߌ߲ߘߌ",
+       "tags-create-explanation": "ߘߊ߲ߛߎ߲ ߞߏߛߐ߲߬߸ ߘߎ߲ߛߓߍ ߟߊߘߊ߲ߣߍ߲߫ ߞߎߘߊ ߟߎ߬ ߘߌ߫ ߣߊ߬ ߛߌ߲ߘߌ߫߸ ߊ߬ ߣߌ߫ ߞߊ߬ ߞߍ߫ ߦߋ߲߬ ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߣߌ߫ ߓߏߕ ߟߊ߫ ߟߊ߬ߓߊ߰ߙߊ߬ߟߌ ߞߊ߲ߡߊ߬.",
+       "tags-create-tag-name": "ߘߎ߲ߛߓߍ ߕߐ߮:",
+       "tags-create-reason": "ߊ߬ ߛߊߓߎ:",
+       "tags-create-submit": "ߟߊ߬ߘߊ߲߬ߠߌ߲",
+       "tags-create-no-name": "ߌ ߞߊߞߊ߲߫ ߞߊ߬ ߘߎ߲ߛߓߍ ߕߐ߮ ߘߏ߫ ߞߙߍߞߙߍ߫.",
+       "tags-delete-reason": "ߊ߬ ߛߊߓߎ:",
+       "tags-activate-reason": "ߊ߬ ߛߊߓߎ:",
+       "tags-deactivate-reason": "ߊ߬ ߛߊߓߎ:",
+       "compare-page1": "ߞߐߜߍ ߁߭",
+       "compare-page2": "ߞߐߜߍ ߂߲",
+       "compare-rev1": "ߟߢߊ߬ߟߌ ߁߭",
+       "compare-rev2": "ߟߢߊ߬ߟߌ ߂߲",
+       "compare-submit": "ߊ߬ ߟߊߢߐ߲߮ߡߊ߬",
+       "compare-invalid-title": "ߌ ߣߊ߬ ߞߎ߲߬ߕߐ߮ ߡߍ߲ ߞߙߍߞߙߍ߫ ߟߊ߫ ߏ߬ ߓߍ߲߬ߣߍ߲߬ ߕߍ߫.",
+       "compare-title-not-exists": "ߌ ߣߊ߬ ߞߎ߲߬ߕߐ߮ ߡߍ߲ ߞߙߍߞߙߍ߫ ߟߊ߫ ߏ߬ ߕߴߦߋ߲߬.",
+       "compare-revision-not-exists": "ߌ ߣߊ߬ ߟߢߊ߬ߟߌ ߡߍ߲ ߞߙߍߞߙߍ߫ ߟߊ߫ ߏ߬ ߕߴߦߋ߲߬.",
+       "diff-form": "ߓߐߣߍ߲ߢߐ߲߰ߡߊ ߟߎ߬",
+       "diff-form-oldid": "ߟߢߊ߬ߟߌ߬ ߞߘߐ ID (ߢߣߊߕߊߟߌ)",
+       "diff-form-revid": "ߓߐߣߍ߲ߢߐ߲߰ߡߊ ߟߎ߬ ߟߢߊ߬ߟߌ ID",
+       "diff-form-submit": "ߓߐߣߍ߲ߢߐ߲߰ߡߊ ߟߎ߬ ߦߌ߬ߘߊ߬",
+       "permanentlink": "ߛߘߌ߬ߜߋ߲߬ ߓߟߏߕߍ߰ߓߊߟߌ",
+       "permanentlink-revid": "ߟߢߊ߬ߟߌ ID",
+       "permanentlink-submit": "ߕߊ߯ ߟߢߊ߬ߟߌ ߘߐ߫",
+       "newsection": "ߕߍߕߍ߯ ߞߎߘߊ",
+       "newsection-page": "ߞߏ߲߭ ߞߐߜߍ",
+       "newsection-submit": "ߕߊ߯ ߞߐߜߍ ߞߊ߲߬",
        "logentry-delete-delete": "$1 {{GENDER:$2|deleted}} ߞߐߜߍ $3",
        "logentry-delete-restore": "$1 $3($4) ߞߐߜߍ {{GENDER:$2|ߓߘߊ߫ ߟߊߛߊ߬ߦߌ߬ ߞߐ߫}}",
        "logentry-delete-revision": "$1  {{GENDER:$2|ߓߘߊ߫ ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߞߍ߫}} ߣߌ߲߬ ߦߋߗߏ߮ ߟߊ߫ {{PLURAL:$5|a revision|$5 revisions}} ߞߐߜߍ ߣߌ߲߬ $3: $4 ߘߐ߫",
index 04fec53..069fc5a 100644 (file)
                        "Vlad5250",
                        "CiaPan",
                        "BadDog",
-                       "Rail"
+                       "Rail",
+                       "Maro21"
                ]
        },
        "tog-underline": "Podkreślenie linków:",
        "tog-useeditwarning": "Ostrzegaj mnie, gdy opuszczam stronę edycji bez zapisania zmian",
        "tog-prefershttps": "Zawsze używaj bezpiecznego połączenia po zalogowaniu",
        "tog-showrollbackconfirmation": "Wyświetl komunikat potwierdzający kliknięcie linku wycofującego edycje",
+       "tog-requireemail": "Wymagaj adresu e-mail przy resetowaniu hasła",
        "underline-always": "Zawsze",
        "underline-never": "Nigdy",
        "underline-default": "według ustawień skórki lub przeglądarki",
        "userlogin-resetpassword-link": "Nie pamiętasz hasła?",
        "userlogin-helplink2": "Pomoc przy logowaniu",
        "userlogin-loggedin": "Zalogowano jako {{GENDER:$1|$1}}.\nUżyj poniższego formularza, aby zalogować się jako inny użytkownik.",
-       "userlogin-reauth": "Musisz się ponownie zalogować, aby potwierdzić, że jesteś {{GENDER:$1|$1}}.",
+       "userlogin-reauth": "Musisz się ponownie zalogować, aby potwierdzić, że {{GENDER:$1|użytkownik|użytkowniczka}} $1 to Ty.",
        "userlogin-createanother": "Załóż nowe konto",
        "createacct-emailrequired": "Adres e‐mail",
        "createacct-emailoptional": "Adres e-mail (opcjonalnie)",
        "searchall": "wszystkie",
        "showingresults": "Poniżej znajduje się lista {{PLURAL:$1|z '''1''' wynikiem|'''$1''' wyników}}, rozpoczynając od wyniku numer '''$2'''.",
        "showingresultsinrange": "Poniżej wyświetlono co najwyżej {{PLURAL:$1|<strong>1</strong> wynik|<strong>$1</strong> wyniki|<strong>$1</strong> wyników}} w zakresie od <strong>$2</strong> do <strong>$3</strong>.",
-       "search-showingresults": "{{PLURAL:$4|Wynik <strong>$1</strong> z <strong>$3</strong>|Wyniki <strong>$1 - $2</strong> z <strong>$3</strong>}}",
+       "search-showingresults": "{{PLURAL:$4|Wynik <strong>$1</strong> z <strong>$3</strong>|Wyniki <strong>$1  $2</strong> z <strong>$3</strong>}}",
        "search-nonefound": "Brak wyników spełniających kryteria podane w zapytaniu.",
        "search-nonefound-thiswiki": "Brak wyników spełniających kryteria podane w zapytaniu.",
        "powersearch-legend": "Wyszukiwanie zaawansowane",
        "prefs-help-email": "Podanie adresu e‐mail nie jest obowiązkowe, lecz jest konieczne do zresetowania zapomnianego hasła.",
        "prefs-help-email-others": "Możesz również umożliwić innym użytkownikom wysłanie do Ciebie e‐maila poprzez Twoją stronę użytkownika lub stronę dyskusji (bez ujawniania Twojego adresu).",
        "prefs-help-email-required": "Wymagany jest adres e‐mail.",
+       "prefs-help-requireemail": "Po zaznaczeniu wiadomości e-mail z linkiem do resetu hasła będą wysyłane dopiero gdy resetujący użytkownik wprowadzi zarówno nazwę użytkownika jak i adres e-mail przypisane do tego konta.",
        "prefs-info": "Podstawowe informacje",
        "prefs-i18n": "Ustawienia językowe",
        "prefs-signature": "Podpis",
        "ipblocklist-legend": "Znajdź zablokowanego użytkownika",
        "blocklist-userblocks": "Ukryj blokady konta",
        "blocklist-tempblocks": "Ukryj tymczasowe blokady",
+       "blocklist-indefblocks": "Ukryj blokady nałołożone na zawsze",
        "blocklist-addressblocks": "Ukryj blokady pojedynczych adresów IP",
        "blocklist-type": "Typ:",
        "blocklist-type-opt-all": "Wszystkie",
        "tooltip-p-logo": "Strona główna",
        "tooltip-n-mainpage": "Zobacz stronę główną",
        "tooltip-n-mainpage-description": "Przejdź na stronę główną",
-       "tooltip-n-portal": "O projekcie - co możesz zrobić, gdzie możesz znaleźć informacje",
+       "tooltip-n-portal": "O projekcie  co możesz zrobić, gdzie możesz znaleźć informacje",
        "tooltip-n-currentevents": "Informacje o aktualnych wydarzeniach",
        "tooltip-n-recentchanges": "Lista ostatnich zmian w {{GRAMMAR:MS.lp|{{SITENAME}}}}.",
        "tooltip-n-randompage": "Załaduj losową stronę",
index 1106f5f..622ab51 100644 (file)
        "tog-useeditwarning": "Avisar-me quando eu deixar uma janela de edição sem ter salvo as alterações",
        "tog-prefershttps": "Usar sempre uma conexão segura enquanto estiver conectado",
        "tog-showrollbackconfirmation": "Mostrar um aviso de confirmação ao clicar em um link de reversão",
+       "tog-requireemail": "Exigir e-mail para redefinições de senha",
        "underline-always": "Sempre",
        "underline-never": "Nunca",
        "underline-default": "Padrão do navegador/tema",
        "prefs-help-email": "O endereço de e-mail é opcional, mas será necessário para recriar sua senha caso esqueça a antiga.",
        "prefs-help-email-others": "Você também pode optar por permitir que outros entrem em contato com você através de sua página de usuário ou de discussão sem ter de revelar seus dados pessoais.",
        "prefs-help-email-required": "O endereço de e-mail é requerido.",
+       "prefs-help-requireemail": "Se marcado, só enviará emails de redefinição de senha se a pessoa que redefiniu tiver fornecido o nome de usuário e o e-mail para esta conta.",
        "prefs-info": "Informações básicas",
        "prefs-i18n": "Internacionalização",
        "prefs-signature": "Assinatura",
        "ipblocklist-legend": "Procurar por um usuário bloqueado",
        "blocklist-userblocks": "Esconder bloqueios de contas",
        "blocklist-tempblocks": "Esconder bloqueios temporários",
+       "blocklist-indefblocks": "Ocultar bloqueios indefinidos",
        "blocklist-addressblocks": "Esconder bloqueios de IP único",
        "blocklist-type": "Tipo:",
        "blocklist-type-opt-all": "Todos",
index d08a6bc..24d6719 100644 (file)
@@ -39,7 +39,8 @@
                        "WebSourceContentRO",
                        "MSClaudiu",
                        "Lucdrei",
-                       "Moyogo"
+                       "Moyogo",
+                       "GabiBil"
                ]
        },
        "tog-underline": "Sublinierea legăturilor:",
        "rcfilters-filter-showlinkedto-label": "Arată schimbările din paginile ce trimit la",
        "rcfilters-filter-showlinkedto-option-label": "<strong>Pages ce trimit la</strong> pagina selectată",
        "rcfilters-target-page-placeholder": "Introduceți numele unei pagini (sau categorii)",
+       "rcfilters-allcontents-label": "Tot conținutul",
+       "rcfilters-alldiscussions-label": "Toate discuțiile",
        "rcnotefrom": "Dedesubt {{PLURAL:$5|se află o modificare|sunt modificările}} începând cu <b>$3, $4</b> (maximum <b>$1</b> afișate).",
        "rclistfromreset": "Resetați selectarea datei",
        "rclistfrom": "Afișează modificările începând cu $3, ora $2",
        "sessionfailure": "Se pare că este o problemă cu sesiunea de autentificare; această acțiune a fost oprită ca o precauție împotriva furtului sesiunii. Vă rugăm să trimiteți formularul din nou.",
        "changecontentmodel": "Modificare model de conținut al unei pagini",
        "changecontentmodel-legend": "Modifică modelul de conținut",
-       "changecontentmodel-title-label": "Titlul paginii",
+       "changecontentmodel-title-label": "Titul paginii:",
        "changecontentmodel-current-label": "Modelul de conținut curent:",
-       "changecontentmodel-model-label": "Model de conținut nou",
+       "changecontentmodel-model-label": "Model de conținut nou:",
        "changecontentmodel-reason-label": "Motiv:",
        "changecontentmodel-submit": "Schimbă",
        "changecontentmodel-success-title": "Modelul de conținut a fost modificat",
index a55c17d..b7c17dc 100644 (file)
        "printableversion": "Versione ca se stambe",
        "permalink": "Collegamende ca remane pe sembre",
        "print": "Stambe",
-       "view": "Vide",
+       "view": "'Ndruche",
        "view-foreign": "'Ndruche sus a $1",
        "edit": "Cange",
        "edit-local": "Cange 'a descrizione locale",
        "create-local": "Aggiunge 'a descrizione locale",
        "delete": "Scangìlle",
        "undelete_short": "Annulle {{PLURAL:$1|'nu camgiamende|$1 cangiaminde}}",
-       "viewdeleted_short": "Vide {{PLURAL:$1|'nu cangiamende scangellate|$1 cangiaminde scangellate}}",
+       "viewdeleted_short": "'Ndruche {{PLURAL:$1|'nu cangiamende scangellate|$1 cangiaminde scangellate}}",
        "protect": "Prutette",
        "protect_change": "cange",
        "unprotect": "Cange 'a protezione",
        "tool-link-userrights": "Cange le gruppe {{GENDER:$1|utinde}}",
        "tool-link-userrights-readonly": "'Ndruche le gruppe {{GENDER:$1|utinde}}",
        "tool-link-emailuser": "Manne 'na mail a stu {{GENDER:$1|utende}}",
-       "imagepage": "Vide a pàgene de le file",
-       "mediawikipage": "Vide a pàgene de le messàgge",
-       "templatepage": "Vide a pàgene de le template",
-       "viewhelppage": "Vide a pàgene de l'ajute",
-       "categorypage": "Vide a pàgene de le categorije",
-       "viewtalkpage": "Vide le 'ngazzaminde",
+       "imagepage": "'Ndruche 'a pàgene de le file",
+       "mediawikipage": "'Ndruche 'a pàgene de le messàgge",
+       "templatepage": "'Ndruche 'a pàgene de le template",
+       "viewhelppage": "'Ndruche 'a pàgene de l'ajute",
+       "categorypage": "'Ndruche 'a pàgene de le categorije",
+       "viewtalkpage": "'Ndruche le 'ngazzaminde",
        "otherlanguages": "Jndr'à l'otre lènghe",
        "redirectedfrom": "(Riderette da $1)",
        "redirectpagesub": "Pàgene de redirezione",
        "nocreate-loggedin": "Non ge tine le permesse pe ccreja pàggene nuève.",
        "sectioneditnotsupported-title": "Sezione de le cangiaminde none supportate",
        "sectioneditnotsupported-text": "Sezione de le cangiaminde non g'è supportate sus a sta pàgene de cangiaminde.",
+       "modeleditnotsupported-title": "'U cangiamende non g'è supportate",
+       "modeleditnotsupported-text": "'U cangiamende non g'è supportate pu modelle de condenute $1.",
        "permissionserrors": "Errore de permesse",
        "permissionserrorstext": "Tu non ge tine 'u permesse pe fà ste cose, pe {{PLURAL:$1|stu mutive|ste mutive}}:",
        "permissionserrorstext-withaction": "Tu non ge tine 'u permesse pe $2, pe {{PLURAL:$1|stu mutive|ste mutive}}:",
        "rcfilters-exclude-button-off": "Scitte le scacchiate",
        "rcfilters-exclude-button-on": "Scettanne le scacchiate",
        "rcfilters-view-tags": "Cangiaminde taggate",
+       "rcfilters-view-namespaces-tooltip": "Filtre le resultate pe namespace",
+       "rcfilters-view-tags-tooltip": "Filtre le resultate ausanne le tag de cangiamende",
+       "rcfilters-view-return-to-default-tooltip": "Tuèrne a 'u menu de le filtre prengepàle",
        "rcfilters-liveupdates-button": "Aggiornaminde in tiembe reale",
        "rcfilters-liveupdates-button-title-on": "Stute le aggiornaminde automatece",
        "rcfilters-watchlist-markseen-button": "Signe tutte le cangiaminde cumme 'ndrucate",
        "ipblocklist-legend": "Iacchije 'n'utende blocchete",
        "blocklist-userblocks": "Scunne le blocche sus a le cunde de l'utinde",
        "blocklist-tempblocks": "Scunne le blocche temboranèe",
+       "blocklist-indefblocks": "Scunne le blocche indefinite",
        "blocklist-addressblocks": "Scunne le blocche de le IP singole",
        "blocklist-type": "Tipe:",
        "blocklist-type-opt-all": "Tutte",
index d6094cd..b103404 100644 (file)
        "tog-useeditwarning": "Предупреждать, когда я покидаю страницу с несохранёнными изменениями",
        "tog-prefershttps": "Всегда использовать защищённое соединение после представления системе",
        "tog-showrollbackconfirmation": "Запрашивать подтверждение при нажатии ссылки для отката",
+       "tog-requireemail": "Требовать адрес электронной почты для сброса пароля",
        "underline-always": "Всегда",
        "underline-never": "Никогда",
        "underline-default": "Использовать настройки браузера",
        "undo-norev": "Правка не может быть отменена, так как её не существует или она была удалена.",
        "undo-nochange": "Правка, похоже, уже была отменена.",
        "undo-summary": "Отмена правки $1, сделанной [[Special:Contributions/$2|$2]] ([[User talk:$2|обсуждение]])",
+       "undo-summary-anon": "Отмена версии $1 от [[Special:Contributions/$2|$2]]",
        "undo-summary-username-hidden": "Отмена правки $1, сделанной участником, чьё имя скрыто",
        "cantcreateaccount-text": "Создание учётных записей с этого IP-адреса (<strong>$1</strong>) было заблокировано {{GENDER:$3|участником|участницей|}} [[User:$3|$3]].\n\n$3 {{GENDER:$3|указал|указала}} следующую причину: <em>$2</em>.",
        "cantcreateaccount-range-text": "{{GENDER:$3|Участник|Участница}} [[User:$3|$3]] {{GENDER:$3|установил|установила}} запрет на создание учётных записей для диапазона IP-адресов <strong>$1</strong>, включающего ваш IP-адрес (<strong>$4</strong>). \n\nБыла указана следующая причина: <em>$2</em>.",
        "prefs-help-email": "Адрес почты не обязателен, но это единственный способ восстановить забытый пароль.",
        "prefs-help-email-others": "Он также позволит другим участникам связаться с вами по электронной почте с помощью ссылки на вашей персональной странице или на вашей странице обсуждения. При этом ваш адрес электронной почты не будет никому раскрыт.",
        "prefs-help-email-required": "Необходимо указать адрес электронной почты.",
+       "prefs-help-requireemail": "Если этот флажок установлен, электронные письма для сброса пароля будут отправляться только в том случае, если лицо, осуществляющее сброс, указало для этой учётной записи и имя пользователя, и адрес электронной почты.",
        "prefs-info": "Основные сведения",
        "prefs-i18n": "Интернационализация",
        "prefs-signature": "Подпись",
        "alreadyrolled": "Невозможно откатить последние изменения страницы «[[:$1]]», совершённые [[User:$2|$2]] ([[User talk:$2|обсуждение]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]),\nпоскольку кто-то другой уже успел откатить эти правки или отредактировать страницу.\n\nПоследние изменения {{GENDER:$3|внёс|внесла}} [[User:$3|$3]] ([[User talk:$3|обсуждение]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Было дано описание изменения: <em>$1</em>.",
        "revertpage": "Откат правок [[Special:Contributions/$2|$2]] ([[User talk:$2|обсуждение]]) к версии [[User:$1|$1]]",
+       "revertpage-anon": "Откат правок [[Special:Contributions/$2|$2]] к последней версии от [[User:$1|$1]]",
        "revertpage-nouser": "Откат правок (имя участника скрыто) к версии {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Откачены правки {{GENDER:$3|$1}}; возвращена последняя версия {{GENDER:$4|$2}}.",
        "sessionfailure-title": "Ошибка сеанса",
        "ipblocklist-legend": "Поиск заблокированного участника",
        "blocklist-userblocks": "Скрыть блокировки учётных записей",
        "blocklist-tempblocks": "Скрыть временные блокировки",
+       "blocklist-indefblocks": "Скрыть неопределённые блокировки",
        "blocklist-addressblocks": "Скрыть блокировки отдельных IP",
        "blocklist-type": "Тип:",
        "blocklist-type-opt-all": "Все",
index a4c30f8..fc3c4f3 100644 (file)
@@ -67,6 +67,7 @@
        "tog-useeditwarning": "Upozori me kad napuštam stranicu za uređivanje bez snimanja izmjena",
        "tog-prefershttps": "Uvijek koristi sigurnu vezu dok sam prijavljen",
        "tog-showrollbackconfirmation": "Prikaži potvrdnicu kada kliknete vezu za opoziv",
+       "tog-requireemail": "Zahtijevaj e-poštu za stavljanje novu lozinku",
        "underline-always": "Uvijek",
        "underline-never": "Nikad",
        "underline-default": "prema skinu ili postavkama preglednika",
        "undo-norev": "Izmjena se ne može vratiti jer ne postoji ranija ili je obrisana.",
        "undo-nochange": "Ovo je uređivanje izgleda već bilo poništeno.",
        "undo-summary": "Poništena izmjena $1 [[Special:Contribs/$2|korisnika $2]] ([[User talk:$2|razgovor]])",
+       "undo-summary-anon": "Poništi izmjenu $1 {{GENDER:$2|korisnika|korisnice}} [[Special:Contributions/$2|$2]]",
        "undo-summary-username-hidden": "Poništi izmjenu $1 od skrivenog korisnika",
        "cantcreateaccount-text": "Pravljenje korisničkog računa sa ove IP adrese ('''$1''') je blokirano od strane [[User:$3|$3]].\n\nRazlog koji je naveo $3 je ''$2''",
        "cantcreateaccount-range-text": "Stvaranje računa od IP adresa iz pojasa<strong>$1</strong>, koji uključuje vašu IP adresu (<strong>$4</strong>), je blokirao/la [[User:$3|$3]].\n\nRazlog koji je dao/la $3 je <em>$2</em>",
        "prefs-help-email": "E-mail adresa je opcionalna, ali je potrebna jer omogućava da Vam se pošalje nova šifra u slučaju da je izgubite ili zaboravite.",
        "prefs-help-email-others": "Također možete da odaberete da vas drugi kontaktiraju putem vaše korisničke stranice ili stranice za razgovor bez otkrivanja vašeg identiteta.",
        "prefs-help-email-required": "Neophodno je navesti e-mail adresu.",
+       "prefs-help-requireemail": "Ako je štiklirano, mogućnost za novu lozinku će imaju samo korisnici koji naveli su korisničko ime i e-poštu.",
        "prefs-info": "Osnovne informacije",
        "prefs-i18n": "Internacionalizacija",
        "prefs-signature": "Potpis",
        "alreadyrolled": "Ne može se vratiti posljednja izmjena [[:$1]] od korisnika [[User:$2|$2]] ([[User talk:$2|razgovor]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); neko drugi je već izmjenio ili vratio članak.\n\nPosljednja izmjena je bila od korisnika [[User:$3|$3]] ([[User talk:$3|razgovor]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Sažetak izmjene je bio: <em>$1</em>.",
        "revertpage": "Vraćene izmjene [[Special:Contributions/$2|$2]] ([[User talk:$2|razgovor]]) na posljednju izmjenu korisnika [[User:$1|$1]]",
+       "revertpage-anon": "Vraćene izmjene [[Special:Contributions/$2|$2]] na posljednju izmjenu korisnika [[User:$1|$1]]",
        "revertpage-nouser": "Vraćene izmjene skrivenog korisnika na posljednju reviziju, koju je {{GENDER:$1|napravio|napravila}} [[User:$1|$1]]",
        "rollback-success": "Vraćene su izmjene korisnika {{GENDER:$3|$1}};\nvraćeno na posljednju verziju koju je snimio {{GENDER:$4|$2}}.",
        "sessionfailure-title": "Greška u sesiji",
        "ipblocklist-legend": "Traži blokiranog korisnika",
        "blocklist-userblocks": "Sakrij blokade računa",
        "blocklist-tempblocks": "Sakrij privremene blokade",
+       "blocklist-indefblocks": "Sakrij beskonačne blokade",
        "blocklist-addressblocks": "Sakrij pojedinačne IP blokade",
        "blocklist-type": "Vrsta:",
        "blocklist-type-opt-all": "Sve",
index 7cd6220..4b6d57b 100644 (file)
@@ -64,6 +64,7 @@
        "tog-useeditwarning": "Opozori me, ko skušam zapreti urejevalno polje z neshranjenimi spremembami",
        "tog-prefershttps": "Med prijavo vedno uporabljaj varno povezavo",
        "tog-showrollbackconfirmation": "Pokaži potrditveno okno ob kliku na povezavo za vrnitev",
+       "tog-requireemail": "Zahtevaj e-poštni naslov za ponastavitev gesla",
        "underline-always": "Vedno",
        "underline-never": "Nikoli",
        "underline-default": "Koža ali privzeto v brskalniku",
        "undo-norev": "Urejanja ni mogoče razveljaviti, ker ne obstaja ali je bilo izbrisano.",
        "undo-nochange": "Zdi se, da je urejanje nekdo že razveljavil.",
        "undo-summary": "Redakcija $1 uporabnika [[Special:Contributions/$2|$2]] ([[User talk:$2|pogovor]]) razveljavljena",
+       "undo-summary-anon": "Razveljavitev redakcije $1 uporabnika [[Special:Contributions/$2|$2]]",
        "undo-summary-username-hidden": "Razveljavi redakcijo $1 skritega uporabnika",
        "cantcreateaccount-text": "Registracije z IP-naslova ('''$1''') je administrator(ka) [[User:$3|$3]] blokiral(a).\n\nRazlog, ki ga je $3 podal(a), je ''$2''.",
        "cantcreateaccount-range-text": "Ustvarjanje računov z IP-naslovov v območju <strong>$1</strong>, ki vključuje vaš IP-naslov (<strong>$4</strong>), je blokiral(-a) [[User:$3|$3]].\n\nRazlog, ki ga je podal(-a) $3, je <em>$2</em>.",
        "prefs-help-email": "E-poštni naslov ni obvezen, vendar omogoča, da vam v primeru pozabljenega gesla pošljemo novo.",
        "prefs-help-email-others": "Omogočite lahko tudi možnost, da vam lahko ostali uporabniki pošiljajo e-pošto prek vaše uporabniške ali pogovorne strani.\nKo vas drugi uporabniki kontaktirajo, jim vašega e-poštnega naslova ne bomo razkrili.",
        "prefs-help-email-required": "E-poštni naslov je obvezen.",
+       "prefs-help-requireemail": "Če je označeno, bo e-pošta za ponastavitev gesla poslana samo, če je oseba, ki je sprožila ponastavitev, vnesla tako uporabniško ime kot e-poštni naslov tega računa.",
        "prefs-info": "Osnovni podatki",
        "prefs-i18n": "Internacionalizacija",
        "prefs-signature": "Podpis",
        "alreadyrolled": "Zadnje spremembe [[:$1]] uporabnika [[User:$2|$2]] ([[User talk:$2|pogovor]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) ne morem vrniti;\nstran je spremenil ali vrnil že nekdo drug.\n\nZadnji je stran urejal uporabnik [[User:$3|$3]] ([[User talk:$3|pogovor]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Povzetek urejanja je bil: <em>$1</em>.",
        "revertpage": "vrnitev sprememb uporabnika [[Special:Contributions/$2|$2]] ([[User talk:$2|pogovor]]) na zadnje urejanje uporabnika [[User:$1|$1]]",
+       "revertpage-anon": "Vrnjena urejanja uporabnika [[Special:Contributions/$2|$2]] na zadnjo redakcijo uporabnika [[User:$1|$1]]",
        "revertpage-nouser": "vrnitev sprememb skritega uporabnika na zadnjo redakcijo {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Razveljavljene spremembe {{GENDER:$3|uporabnika|uporabnice}} $1;\nvrnjeno na urejanje {{GENDER:$4|uporabnika|uporabnice}} $2.",
        "sessionfailure-title": "Neuspeh seje",
        "ipblocklist-legend": "Poišči blokiranega uporabnika",
        "blocklist-userblocks": "skrij blokade računov",
        "blocklist-tempblocks": "skrij začasne blokade",
+       "blocklist-indefblocks": "Skrij neomejene blokade",
        "blocklist-addressblocks": "skrij blokade posameznih IP-naslovov",
        "blocklist-type": "Vrsta:",
        "blocklist-type-opt-all": "Vse",
index dcc686b..46362ae 100644 (file)
        "tog-useeditwarning": "Varna mig om jag lämnar en redigeringssida med osparade ändringar",
        "tog-prefershttps": "Använd alltid en säker anslutning medan jag är inloggad",
        "tog-showrollbackconfirmation": "Visa en bekräftelsedialog när man klickar på en tillbakarullningslänk",
+       "tog-requireemail": "Kräv e-postadress för att återställa lösenord",
        "underline-always": "Alltid",
        "underline-never": "Aldrig",
        "underline-default": "Webbläsarens eller utseendets standardinställning",
        "prefs-help-email": "Att ange e-postadress är valfritt, men gör det möjligt att få ditt lösenord mejlat till dig om du glömmer det.",
        "prefs-help-email-others": "Du kan också välja att låta andra kontakta dig via e-post genom en länk på din användar- eller diskussionssida. \nDin e-postadress avslöjas inte när andra användare kontaktar dig.",
        "prefs-help-email-required": "E-postadress måste anges.",
+       "prefs-help-requireemail": "Om detta markeras kommer lösenordsåterställningar endast skickas via e-post om återställaren har angivit både användarnamn och e-postadress för detta konto.",
        "prefs-info": "Grundläggande information",
        "prefs-i18n": "Internationalisering",
        "prefs-signature": "Signatur",
        "ipblocklist-legend": "Sök efter en blockerad användare",
        "blocklist-userblocks": "Dölj kontoblockeringar",
        "blocklist-tempblocks": "Dölj tillfälliga blockeringar",
+       "blocklist-indefblocks": "Dölj otydliga blockeringar",
        "blocklist-addressblocks": "Dölj enskilda IP-blockeringar",
        "blocklist-type": "Typ:",
        "blocklist-type-opt-all": "Alla",
index 8446ebd..ac99d59 100644 (file)
@@ -66,9 +66,9 @@
        "underline-never": "Ńigdy",
        "underline-default": "Podug sztalowańo uoglůndarki",
        "editfont-style": "Styl czćůnki we placu sprowjyń:",
-       "editfont-monospace": "Monotypowe krojło",
-       "editfont-sansserif": "Bezszeryfowe krojło",
-       "editfont-serif": "Szeryfowe krojło",
+       "editfont-monospace": "Monotypowe pismo",
+       "editfont-sansserif": "Bezszeryfowe pismo",
+       "editfont-serif": "Szeryfowe pismo",
        "sunday": "Niydziela",
        "monday": "Pyńdziałek",
        "tuesday": "Wtorek",
        "viewsourcelink": "pokŏż zdrzōdło",
        "editsectionhint": "Edytuj sekcyjõ: $1",
        "toc": "Wykŏz treści",
-       "showtoc": "uobejrzij",
-       "hidetoc": "schrůń",
+       "showtoc": "pokŏż",
+       "hidetoc": "skryj",
        "collapsible-collapse": "Skryj",
        "collapsible-expand": "Pokŏż",
        "thisisdeleted": "Pokŏzać abo stworzić zaś $1?",
        "sort-ascending": "Sortuj rosnůnco",
        "nstab-main": "Strōna",
        "nstab-user": "{{GENDER:{{BASEPAGENAME}}|Strōna ôd używŏcza|Strōna ôd używŏczki}}",
-       "nstab-media": "Pliki",
+       "nstab-media": "Zbiōr",
        "nstab-special": "Specjalnŏ strōna",
        "nstab-project": "Strōna projektu",
        "nstab-image": "Zbiōr",
        "virus-badscanner": "Felerno konfiguracyjo – ńyznany skaner antywirusowy ''$1''",
        "virus-scanfailed": "skanowańy ńyudone (feler $1)",
        "virus-unknownscanner": "ńyznajůmy průgram antywirusowy",
-       "logouttext": "'''Terozki jeżeś wylůgowany'''.\n\nDej pozůr, co na ńykerych zajtach przeglůndarka może dali pokozywać co jeżeś zalůgowany, a bydźe tak aże uodśwjyżysz jeij cache.",
+       "logouttext": "<strong>Używŏcz je wylogowany.</strong>\n\nDej pozōr, że podwiela niy ôdświyżysz cache przeglōndarki, niykere strōny mogōm sie durch pokazować choćby trwało zalogowanie.",
        "welcomeuser": "Witej, $1",
        "welcomecreation-msg": "Uotwarli my sam lo Ćebje kůnto.\nPamjyntej coby posztalować [[Special:Preferences|preferencyji]]",
        "yourname": "Miano ôd używŏcza:",
        "login": "Wloguj sie",
        "nav-login-createaccount": "Logowańy / Tworzyńy kůnta",
        "logout": "Wyloguj",
-       "userlogout": "Uodloguj śe",
+       "userlogout": "Ôdlogowanie",
        "notloggedin": "Niy je żeś wlogowany(ŏ)",
        "userlogin-noaccount": "Niy mŏsz kōnta?",
        "userlogin-joinproject": "Dołōncz do {{GRAMMAR:D.lp|{{SITENAME}}}}",
        "nosuchusershort": "Ńy mo sam użytkowńika uo mjańe \"$1\".",
        "nouserspecified": "Musisz podać miano ôd używŏcza.",
        "login-userblocked": "Tyn sprowjorz mo zawarte sprowjyńa. Ńy idźe śe zalogować.",
-       "wrongpassword": "Hasło kere żeś naszkryfloł je felerne. Poprůbůj naszkryflać je jeszcze roz.",
+       "wrongpassword": "Wkludzōny login abo hasło sōm felerne.\nSprōbuj zaś.",
        "wrongpasswordempty": "Hasło kere żeś podou je uostawjůne blank. Naszkryflej je jeszcze roz.",
        "passwordtooshort": "Hasło kere żeś podoł je felerne abo za krůtke.\nHasło muśi mjeć przinojmńij {{PLURAL:$1|1 buchsztaba|$1 buchsztabůw}} a być inksze uod mjana użytkowńika.",
        "password-name-match": "Hasło mo być inksze atoli mjano używocza.",
        "changeemail-newemail": "Nowŏ e-mailowŏ adresa:",
        "changeemail-none": "podstawowo",
        "changeemail-submit": "Spamjyntej nowy",
-       "resettokens": "Resetuj tokeny",
+       "resettokens": "Resetuj tokyny",
        "bold_sample": "Ruby tekst",
        "bold_tip": "Ruby tekst",
        "italic_sample": "Kursywa",
        "watchthis": "Ôbserwuj tã strōnã",
        "savearticle": "Spamiyntej",
        "publishpage": "Ôpublikuj strōnã",
+       "publishchanges": "Ôpublikuj zmiany",
        "publishpage-start": "Ôpublikuj strōnã...",
        "preview": "Podglōnd",
        "showpreview": "Pokŏż podglōnd",
        "editingold": "'''Dej pozůr: Sprowjosz inkszo wersyjo zajty kej bjeżůnco. Jeli jům naszkryflosz, wszyjske půźńyjsze pomjyńańa bydům wyćepane.'''",
        "yourdiff": "Rōżnice",
        "copyrightwarning": "Pamjyntej uo tym, aże cołki wkłod do {{SITENAME}} udostympńůmy wedle zasad $2 (dokładńij we $1). Jak ńy chcesz, coby kożdy můg go půmjyńać a dalij rozpowszychńoć, ńy wćepuj uůnygo sam. Szkryflajůnc sam tukej pośwjadczosz tyż, co te pisańy je twoje własne, abo żeś go wźůn(a) ze materjołůw kere sům na ''public domain'', abo kůmpatybilne.<br />\n'''PROSZA ŃY WĆEPYWAĆ SAM MATYRJOŁŮW KERE SŮM CHRŮŃONE AUTORSKIM PRAWYM BEZ DOZWOLEŃO WŁAŚĆIĆELA!'''",
-       "copyrightwarning2": "Pamjyntej uo tym, aże cołki wkłod do {{GRAMMAR:MS.lp|{{SITENAME}}}} może być sprowjany, pomjyńany abo wyćepany bez inkszych użytkownikůw. Jak ńy chcysz, coby kożdy můg uůnygo zmjyńać a dalij rozpowszychńoć bez uograniczyń, ńy wćepuj go sam.<br />\nSzkryflajůnc sam tukej pośwjadczosz tyż, co te pisańy je twoje własne, abo żeś go wźůn(a) ze matyrjołůw kere sům na public domain, abo kůmpatybilne (kuknij tyż: $1).\n'''PROSZA ŃY WĆEPYWAĆ SAM MATYRJOŁŮW KERE SŮM CHRŮŃONE PRAWYM AUTORSKIM BEZ DOZWOLEŃO WŁAŚĆIĆELA!'''",
+       "copyrightwarning2": "Dej pozōr, iże cołki wkłŏd na {{SITENAME}} może być edytowany, zmiyniany abo kasowany ôd inkszych używŏczōw. Jeźli niy chcesz, żeby twōj tekst bōł niymiyłosiernie edytowany, to niy wkludzej go sam.<br />\nPrzirzekŏsz tyż nōm, iże wszyjsko je napisane ôd ciebie abo skopiowane ze dōmyny publicznyj abo podobnego wolnego zdrzōdła (po wiyncyj informacyji patrz $1).\n<strong>Niy wkludzej dzieł chrōniōnych autorskimi prawami bez przizwolyniŏ!</strong>",
        "longpageerror": "''Feler: Tekst kery żeś sam wćepywoł mo {{PLURAL:$1|jedyn kilobajt|$1 kilobajtůw}}. Maksymalno dugość tekstu ńy może być srogszo kej {{PLURAL:$2|jedyn kilobajt|$2 kilobajtůw}}. Twůj tekst ńy bydźe sam naszkryflany.'''",
        "readonlywarning": "'''Dej pozůr: Baza danych zostoua filowo zawarto skuli potřeb admińistracyjnych. Bestůž ńy do śe terozki naškryflać Twojich pomjyńań. Radzymy přećepać nowy tekst kajś do plika tekstowego (wytnij/wklej) a wćepać sam zaś po uodymkńyńću bazy.'''\n\nAdmińistrator kery zawar baza dou take wyjaśńyńe: $1",
        "protectedpagewarning": "'''Dej pozůr: Sprowjańe tyj zajty zostoło zawarte. Mogům jům sprowjać ino użytkowńicy ze uprawńyńami admińistratora.'''\nUostatńy wpis w rejerze je poniżej.",
        "cascadeprotectedwarning": "'''Dej pozůr:''' Ta zajta zostoła zawarto a ino użytkowńicy ze uprawńyńami admińistratora mogům jům sprowjać. Zajta ta je podpjynto pod {{PLURAL:$1|nastympujůnco zajta, kero zostoła zawarto|nastympujůncych zajtach, kere zostouy zawarte}} ze załůnczonům uopcjům dźedźiczyńo:",
        "titleprotectedwarning": "'''Dej pozůr: Zajta uo tym titlu zostoła zawarto a ino [[Special:ListGroupRights|ńykerzi użytkowńicy]] mogům jům wćepać.'''\nUostatńy wpis z rejera je ńyżej.",
        "templatesused": "{{PLURAL:$1|Muster użyty|Mustry użyte}} na tyj strōnie:",
-       "templatesusedpreview": "{{PLURAL:$1|Muster użyty|Mustry użyte}} na tyj podglōńdzie:",
+       "templatesusedpreview": "{{PLURAL:$1|Muster użyty|Mustry użyte}} na tym podglōńdzie:",
        "templatesusedsection": "{{PLURAL:$1|Szablon|Szablůny}} użyte we tyj tajli:",
        "template-protected": "(chrōniōny)",
        "template-semiprotected": "(pōłzawarte)",
        "edit-no-change": "Twoje sprowjyńe uostoło zignorowane pů takymu, aże ńic żeś we tekśće ńy zmjyńůł.",
        "postedit-confirmation-saved": "Spamjyntano twoje sprowjyńe.",
        "edit-already-exists": "Ńy idźe utworzić nowyj zajty.\nTako zajta już sam je.",
-       "defaultmessagetext": "Tekst důmyślny",
+       "defaultmessagetext": "Wychodny tekst wiadōmości",
        "content-model-wikitext": "wikitekst",
        "expensive-parserfunction-warning": "Dej pozůr: ta zajta mo za dużo uodwouań do funkcyji parsera, kere mocno uobćůnżajům systym.\n\nPowinno być myńi jak $2 {{PLURAL:$2|wywołańy|wywołańo|wywołań}}, a terozki {{PLURAL:$1|je $1 wywołańy|sům $1 wywołańo|je $1 wywołań}}.",
        "expensive-parserfunction-category": "Zajty kere majům za dużo uodwołań do funkcyji parsera, kere mocno uobćůnżajům systym.",
        "search-showingresults": "{{PLURAL:$4|Rezultat <strong>$1</strong> ze <strong>$3</strong>|Rezultaty <strong>$1 – $2</strong> ze <strong>$3</strong>}}",
        "search-nonefound": "Żŏdne wyniki niy ôdpowiadajōm tymu zapytaniu.",
        "powersearch-legend": "Sznupańy zaawansowane",
-       "powersearch-ns": "Sznupej we przestrzyńach mjan:",
+       "powersearch-ns": "Szukej we przestrzyniach mian:",
        "powersearch-togglelabel": "Ôznŏcz:",
        "powersearch-toggleall": "Wszyjsko",
        "powersearch-togglenone": "Nic",
        "prefs-edits": "Liczba edycyji:",
        "prefs-skin": "Skůrka",
        "skin-preview": "podglůnd",
-       "datedefault": "Důmyślny",
+       "datedefault": "Wychodny",
        "prefs-labs": "Funkcyje \"labs\"",
        "prefs-user-pages": "Zajty ôd używŏczōw",
        "prefs-personal": "Dane używocza",
        "prefs-rc": "Ôstatnie zmiany",
-       "prefs-watchlist": "Pozůrlista",
+       "prefs-watchlist": "Ôbserwowane",
        "prefs-watchlist-days": "Liczba dńůw widocznych na liśće artikli, na kere dowosz pozůr:",
        "prefs-watchlist-days-max": "Max $1 {{PLURAL:$1|dźyń|dńi}}",
        "prefs-watchlist-edits": "Liczba půmjyńań pokozywanych we rozszyrzůnyj liśće artiklůw, na kere dowosz pozůr:",
        "recentchangesdays": "Liczba dńůw do pokazańo we půmjyńanych na uostatku:",
        "recentchangesdays-max": "(maksymalńy $1 {{PLURAL:$1|dźyń|dńi}})",
        "recentchangescount": "Liczba pozycyji na liśće půmjyńanych na uostatku, we historyje zajtůw a zajtach rejerůw:",
-       "prefs-help-recentchangescount": "Ze listům ńydawnych pomjyńan, gyszichta zajt a rejer.",
-       "savedprefs": "Twoje sztalowańo we preferyncyjach zostoły naszkryflane.",
+       "prefs-help-recentchangescount": "Maksymalnŏ wielość: 1000",
+       "savedprefs": "Twoje sztelōnki były spamiyntane.",
        "timezonelegend": "Czasowo sztrefa",
        "localtime": "Lokalny czas:",
        "timezoneuseserverdefault": "Użyj domyślnygo czasu serwera ($1)",
        "prefs-searchoptions": "Sznupańe",
        "prefs-namespaces": "Raumy mjan",
        "default": "důmyślńy",
-       "prefs-files": "Pliki",
+       "prefs-files": "Zbiory",
        "youremail": "E-mail:",
        "username": "{{GENDER:$1|Mjano używocza}}:",
        "prefs-memberingroups": "Należy do {{PLURAL:$1|grupy|grup:}}",
        "right-bigdelete": "Wyćep zajty s dugům historyjům půmjyńań",
        "right-deleterevision": "Wyćepywańy a wćepywańy nazod wskazanych sprowjyń zajtůw",
        "right-deletedhistory": "Pokazuj historyjo usuńyntych sprowjyń, bez tekstu uopisu",
-       "right-browsearchive": "Sznupej za wyćepanymi zajtůma",
+       "right-browsearchive": "Szukej we skasowanych strōnach",
        "right-undelete": "Prziwrŏcanie skasowanych strōn",
        "right-suppressrevision": "Přyglůndańy i uodtwařańy sprowjyń schrůńůnych před admińistratorami",
        "right-suppressionlog": "Pokoż prywatne lůgi",
        "right-userrights-interwiki": "Edytuj uprawniynia używŏczōw na inkszych wiki",
        "right-siteadmin": "Zawjerańy i uodmykańy bazy danych",
        "newuserlogpage": "Ksiōnżka nowych używŏczōw",
-       "newuserlogpagetext": "To je rejer uostatńo utworzůnych kůnt użytkowńikůw",
+       "newuserlogpagetext": "To je regest tworzōnych używŏczōw.",
        "rightslog": "Regest uprawniyń używŏczōw",
-       "rightslogtext": "Rejer půmjyńań uprawńyń užytkowńikůw.",
+       "rightslogtext": "To je regest zmian uprawniyń używŏczōw.",
        "action-read": "přeglůndańo tyj zajty",
        "action-edit": "edycyje tyj strōny",
        "action-createpage": "tworzyńo zajtůw",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ôbejzdrzij tyż [[Special:NewPages|listã nowych strōn]])",
        "rcfilters-legend-heading": "<strong>Wykŏz skrōtōw:</strong>",
        "rcfilters-other-review-tools": "Inksze nŏrzyńdzia kōntrole",
+       "rcfilters-savedqueries-cancel-label": "Pociep",
+       "rcfilters-search-placeholder": "Filtruj zmiany (użyj myni abo wyszukej podle filtra)",
+       "rcfilters-filter-user-experience-level-unregistered-description": "Edytorzi, co niy sōm zalogowani.",
        "rcfilters-filter-humans-label": "Czowiek (niy bot)",
+       "rcfilters-filter-pageedits-label": "Edycyje strōny",
+       "rcfilters-filter-newpages-label": "Tworzynie strōn",
+       "rcfilters-filter-logactions-label": "Registrowane czyności",
        "rcfilters-liveupdates-button": "Aktualizacyje na żywo",
        "rcfilters-liveupdates-button-title-on": "Zastŏw aktualizacyje na żywo",
        "rcnotefrom": "Niżyj {{PLURAL:$5|je zmiana|sōm zmiany}} ôd <strong>$3, $4</strong> ({{PLURAL:$5|je pokŏzanŏ|sōm pokŏzane}} nojwyżyj <strong>$1</strong>).",
        "hist": "hist.",
        "hide": "Skryj",
        "show": "Pokŏż",
-       "minoreditletter": "d",
+       "minoreditletter": "m",
        "newpageletter": "N",
        "boteditletter": "b",
        "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajty|bajtōw}} po zmianie",
        "recentchangeslinked-to": "Pokŏż zmiany na strōnach, co linkujōm do podanyj strōny",
        "upload": "Zaladuj zbiōr",
        "uploadbtn": "Prziślij zbiōr",
-       "reuploaddesc": "Nazod do formulařa uod wćepywańo.",
+       "reuploaddesc": "Pociep przesyłanie i wrōć do formulara.",
        "uploadnologin": "Niy je żeś wlogowany(ŏ)",
        "uploadnologintext": "Muśyš śe [[Special:UserLogin|zalůgować]] ńim wćepńeš pliki.",
        "upload_directory_missing": "Katalog lo wćepywanych plikůw ($1) ńy istńeje a serwer WWW ńy poradźi go utwořić.",
        "upload_directory_read_only": "Serwer ńy može škryflać do katalůgu ($1) kery je přeznačůny na wćepywane pliki.",
        "uploaderror": "Feler při wćepywańu",
-       "uploadtext": "Ůžyj formulařa půńižej do wćepywańo plikůw.\nJak chceš přejřeć dotychčas wćepane pliki, abo w ńich šnupać, přeńdź do [[Special:FileList|listy douůnčůnych plikůw]]. Wšyjstke wćepańo uodnotowane sům we [[Special:Log/upload|rejeře přesůuanych plikůw]], a jygo wyćepańy we [[Special:Log/delete|rejeře wyćepanych]].\n\nPlik pojawi śe na zajće, jak užyješ linka wedle jydnygo s nastympujůncych wzorůw:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Plik.jpg]]</nowiki></code>''' pokože plik we pounyj postaći\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Plik.png|200px|thumb|left|tekst uopisu]]</nowiki></code>''' pokože šyroko na 200 pikseli mińjaturka umjyščůno při lewym margineśe, uotočůno bez ramka, s podpisym „podpis grafiki”\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Plik.ogg]]</nowiki></code>''' dowo bezpostředńi link do plika ńy pokozujůnc go",
+       "uploadtext": "Użyj formulara niżyj, żeby przisłać zbiory.\nŻeby przejzdrzeć abo szukać zaladowane zbiory, idź do [[Special:FileList|listy zaladowanych zbiorōw]], przisłania sōm tyż listowane we [[Special:Log/upload|regeście przisłań]], skasowania sōm we [[Special:Log/delete|regeście skasowań]].\n\nŻeby wrazić zbiōr na strōnã, użyj linka we jednyj ze formōw niżyj:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Zbiōr.jpg]]</nowiki></code></strong>, żeby użyć połnyj wersyje zbioru\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Zbiōr.png|200px|thumb|left|alt text]]</nowiki></code></strong>, żeby użyć 200 pikselōw szyrokõ miniaturã we rōmce przi lewym marginesie ze „alt text” za ôpis\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Zbiōr.ogg]]</nowiki></code></strong>, żeby bezpostrzednio linkować zbiōr bez jego pokazowaniŏ",
        "upload-permitted": "Dopuščalne formaty plikůw: $1.",
        "upload-preferred": "Zalecane formaty plikůw: $1.",
        "upload-prohibited": "Zakozane formaty plikůw: $1.",
        "filedelete-reason-otherlist": "Inkszy powůd",
        "filedelete-reason-dropdown": "* Nojczynstsze powody wyćepańa\n** Naruszyńy praw autorskych\n** Kopja plika kery już sam jest",
        "filedelete-edit-reasonlist": "Sprowjańe powodůw wyćepańo zajty",
-       "mimesearch": "Sznupej MIME",
+       "mimesearch": "Szukanie podle typu MIME",
        "mimesearch-summary": "Ta zajta ůmožliwjo šnupańe za plikůma wedle jeich typu MIME. Užyće: typtreśći/podtyp, np. <code>image/jpeg</code>.",
        "mimetype": "Typ MIME:",
        "download": "pobier",
        "unwatchedpages": "Zajty na kere ńy je dowany pozůr",
        "listredirects": "Lista przekerowań",
+       "listduplicatedfiles": "Lista zbiorōw ze tuplikatami",
        "unusedtemplates": "Niyużywane mustry",
        "unusedtemplatestext": "Půńižej znojdowo śe lista wšyjstkich zajtůw s přestřyńi mjan {{ns:template}}, kere ńy sům užywane bez inkše zajty. Sprowdź inkše adresowańa ku šablůnům, ńim wyćepńeš ta zajta.",
        "unusedtemplateswlh": "ku adresatu",
        "statistics-articles": "Zajty",
        "statistics-pages": "Zajty",
        "statistics-pages-desc": "Wszyjstke zajty na wiki, wroz ze zajtami godki, przekerowańami a t.p.",
-       "statistics-files": "Wćepane pliki",
+       "statistics-files": "Zaladowane zbiory",
        "statistics-edits": "Sprowjyńa wykůnane uod powstańo {{grammar:D.lp|{{SITENAME}}}}",
        "statistics-edits-average": "Strzedńo liczba sprowjyń na zajta",
        "statistics-users": "Zarejerowanych użytkowńikůw",
        "wantedpages": "Potrzebne strōny",
        "wantedfiles": "Potrzebne zbiory",
        "wantedtemplates": "Potrzebne mustry",
-       "mostlinked": "Nojczyńśćij adresowane",
-       "mostlinkedcategories": "Kategoryje we kerych je nojwjyncyj artikli",
+       "mostlinked": "Nojczyńścij linkowane",
+       "mostlinkedcategories": "Nojwiyncyj używane kategoryje",
        "mostlinkedtemplates": "Nojczyńśćij adresowane mustry",
-       "mostcategories": "Zajty kere majům nojwiyncyj kategoryjůw",
-       "mostimages": "Nojczyńśćij adresowane pliki",
-       "mostrevisions": "Nojczyńśćij sprowjane artikle",
+       "mostcategories": "Strōny, co majōm nojwiyncyj kategoryji",
+       "mostimages": "Nojczyńścij używane zbiory",
+       "mostinterwikis": "Strōny, co majōm nojwiyncyj linkōw interwiki",
+       "mostrevisions": "Nojwiyncyj edytowane strōny",
        "prefixindex": "Wszyjske strōny ze prefiksym",
        "shortpages": "Nojkrōtsze strōny",
        "longpages": "Duge strōny",
        "protectedpages-cascade": "Yno zajty zabezpjeczůne rekursywńy",
        "protectedpagesempty": "Żodno zajta ńy je terozki zawarto ze podanymi parametrami.",
        "protectedtitles": "Zastawiōne tytuły",
-       "protectedtitlesempty": "Do tych štalowań utwořyńy artikla uo dowolnym mjańy ńy je zawarte",
+       "protectedtitlesempty": "Żŏdne strōny niy sōm terŏz zawarte ze tymi parametrami.",
        "listusers": "Lista używŏczōw",
        "listusers-editsonly": "Pokoż yno użytkowńikůw kere majům sprowjyńa",
        "usereditcount": "$1 {{PLURAL:$1|sprowjyńe|sprowjyńa|sprowjyń}}",
        "booksources": "Zdrzōdła ksiōnżek",
        "booksources-search-legend": "Szukej informacyji ô ksiōnżkach",
        "booksources-search": "Szukej",
-       "booksources-text": "Půńiżyj je lista uodnośńikůw do inkszych witryn, kere pośredńiczům we sprzedaży nowych a używanych buchůw, a tyż můgům mjeć dolsze informacyje uo poszukiwanym bez ćebje buchu.",
+       "booksources-text": "Niżyj je wykŏz linkōw do inkszych strōn, co przedŏwajōm nowe i używane ksiōnżki, i mogōm mieć dalsze informacyje ô ksiōnżkach, co ich szukŏsz:",
        "booksources-invalid-isbn": "Podany numer ISBN zostoł rozpoznany kej felerny. Sprowdź aże podany numer je zgodny s numerym kery je we zdrzůdle.",
        "specialloguserlabel": "Fto:",
        "speciallogtitlelabel": "Cyl (nazwa abo {{ns:user}}:miano ôd używŏcza):",
        "log": "Regest ôperacyji",
-       "all-logs-page": "Wszyjske Ã³peracyje",
+       "all-logs-page": "Wszyjske Ã´peracyje",
        "alllogstext": "Spōlne pokŏzanie wszyjskich dostympnych regestōw {{SITENAME}}.\nMożesz uakuratnić widok bez ôbranie zorty regestu, miana ôd używŏcza, abo tykanyj strōny (dŏwŏ pozōr na małe i sroge litery).",
        "logempty": "Niy ma we regeście zgodliwych elymyntōw.",
        "log-title-wildcard": "Szukej tytułōw, co sie zaczynajōm ôd tego tekstu",
        "categories": "Kategoryje",
        "categoriespagetext": "Zajta przedstowjo lista katygoryji s zajtůma a plikůma.\n[[Special:UnusedCategories|Ńyużywane kategoryj]] ńy zostoły tukej pokozane.\nKukńij tyż [[Special:WantedCategories|ńyistńyjůnce kategoryje]].",
        "categoriesfrom": "Pokož kategoryje začynajůnc uod:",
-       "deletedcontributions": "Wyćepane sprowjyńa użytkowńika",
-       "deletedcontributions-title": "Wyćepane sprowjyńa użytkowńika",
+       "deletedcontributions": "Skasowany wkłŏd ôd używŏcza",
+       "deletedcontributions-title": "Skasowany wkłŏd ôd używŏcza",
        "sp-deletedcontributions-contribs": "wkłŏd",
-       "linksearch": "Necowe uodwołańa",
+       "linksearch": "Szukanie zewnyntrznych linkōw",
        "linksearch-pat": "Wzorzec sznupańo",
        "linksearch-ns": "Przestrzyń mjan",
        "linksearch-ok": "Šnupej",
        "emailsend": "Wyślij",
        "emailccme": "Wyślij mi kopja moiy wjadomości.",
        "emailccsubject": "Kopja Twojej wjadůmośći do $1: $2",
-       "emailsent": "Wjadůmość zostoua wysuano",
-       "emailsenttext": "Twoja wjadůmość zostoua wysuano.",
+       "emailsent": "E-mail wysłany",
+       "emailsenttext": "Twoja wiadōmość e-mail je wysłanŏ.",
        "emailuserfooter": "Wjadůmość e-brif zostoła wysłano s {{GRAMMAR:D.lp|{{SITENAME}}}} ku $2 bez $1 s użyćym „Wyślij e-brif ku tym użytkowńikowi”.",
        "usermessage-editor": "Nadŏwca systymowych kōmunikatōw",
        "watchlist": "Ôbserwowane",
        "unwatch": "Niy ôbserwuj",
        "unwatchthispage": "Přestoń dować pozůr",
        "notanarticle": "To ńy je artikel",
-       "notvisiblerev": "Wersyja zostoua wyćepano",
+       "notvisiblerev": "Ôstatniŏ wersyjŏ ôd inkszego używŏcza była skasowanŏ",
        "watchlist-details": "Na Twojij liście ôbserwowanych {{PLURAL:$1|je $1 strōna|sōm $1 strōny|je $1 strōn}} (plus strōny dyskusyje).",
        "wlheader-enotif": "Wysůuańy powjadůmjyń na adres e-brif je zouůnčůne",
        "wlheader-showupdated": "Zajty, co były zmiyniane ôd twojij ôstatnij nŏwiydzki na nich ôstały ukŏzane <strong>na rubo</strong>.",
        "confirmdeletetext": "Zarŏz wyciepniesz artikel i cołkõ ôd niygo historyjõ. Przitupluj, iże na isto chcesz to zrobić, miarkujesz kōnsekwyncyje, i co robisz to podle [[{{MediaWiki:Policy-url}}|prawideł]].",
        "actioncomplete": "Fertig",
        "actionfailed": "Ńy udało śe.",
-       "deletedtext": "Wyćepano \"$1\". Rejer uostatnio zrobiůnych wyćepań možeš uobejžyć tukej: $2.",
+       "deletedtext": "Strōna „$1” była skasowanŏ.\nWejzdrzij na $2 po regest ôstatnich skasowań.",
        "dellogpage": "Regest kasowań",
        "dellogpagetext": "To je lista uostatńo wykůnanych wyćepań.",
-       "deletionlog": "rejer wyćepań",
+       "deletionlog": "regest skasowań",
        "reverted": "Prziwrōcōnŏ poprzedniõ wersyjõ",
        "deletecomment": "Čymu:",
        "deleteotherreason": "Inkšy powůd:",
        "rollbacklink": "cŏfej",
        "rollbacklinkcount": "cŏfnij $1 {{PLURAL:$1|edycyjõ|edycyje|edycyji}}",
        "rollbackfailed": "Niy szło wycŏfać zmiany",
-       "cantrollback": "Ńy idże cofnůńć pomjyńyńo, sam je ino jedna wersyja tyi zajty.",
+       "cantrollback": "Niy idzie cŏfnōńć edycyje;\nôstatni edytōr to je jedyny autōr tyj strōny.",
        "alreadyrolled": "Ńy idźe lů zajty [[:$1|$1]] cofnůńć uostatńygo pomjyńeńa, kere wykonoł [[User:$2|$2]] ([[User talk:$2|godka]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]).\nKto inkszy zdůnżůł już to zrobić abo wprowadźił własne poprowki do treśći zajty.\n\nAutorym ostatńygo pomjyńyńo je terozki [[User:$3|$3]] ([[User talk:$3|godka]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Sprowjyńe uopisano: <em>$1</em>.",
        "revertpage": "Wycofano sprowjyńe użytkowńika [[Special:Contributions/$2|$2]] ([[User talk:$2|godka]]). Autor prziwrůcůnej wersyji to [[User:$1|$1]].",
        "modifiedarticleprotection": "zmiyniōł(yła) poziōm zawarciŏ „[[$1]]”",
        "unprotectedarticle": "uodymknyu [[$1]]",
        "movedarticleprotection": "przekludzůno sztalowańa zabezpjeczyńo s „[[$2]]” ku „[[$1]]”",
-       "protect-title": "Pomjyńeńe poźomu zawarćo „$1”",
+       "protect-title": "Zmiana poziōmu zawarciŏ „$1”",
        "prot_1movedto2": "[[$1]] přećepano do [[$2]]",
        "protect-legend": "Potwjyrdź zawarće",
        "protectcomment": "Čymu:",
-       "protectexpiry": "Wygaso:",
+       "protectexpiry": "Wygasŏ:",
        "protect_expiry_invalid": "Čas wygaśńjyńćo je zuy.",
        "protect_expiry_old": "Čas wygaśńjyńćo je w downiej ńiž terozki.",
-       "protect-text": "Sam tukej možyš uobejžeć i pomjyńyć poźům zawarcia zajty '''$1'''.",
+       "protect-text": "Sam możesz ôbejzdrzeć i zmiynić poziōmy zawarciŏ strōny <strong>$1</strong>.",
        "protect-locked-blocked": "Ńy možeš půmjyńać poźůmůw zawarćo kej žeś sům je zawarty uod sprowjyń. Terozki štalowańa dla zajty '''$1''' to:",
        "protect-locked-dblock": "Ńy idźe půmjyńić poźůmu zawarća s kuli tygo co baza danych tyž je zawarto. Uobecne štalowańa dla zajty '''$1''' to:",
        "protect-locked-access": "Ńy moš uprowńyń coby pomjyńyć poziům zawarcia zajty. Uobecne ustawjyńo dlo zajty '''$1''' to:",
        "protect-summary-cascade": "dźedźičyńy",
        "protect-expiring": "wygaso $1 (UTC)",
        "protect-expiry-indefinite": "na zowdy",
-       "protect-cascade": "Dźedźyčyńe zawarćo - zawřij wšyskie zajty kere sům na tyi zajće.",
+       "protect-cascade": "Zawrzij strōny, co sōm wrażōne do tyj strōny (erbowanie zawarciŏ)",
        "protect-cantedit": "Ńy možeš pomjyńyć poziůmu zawarća tyi zajty, po takiymu, co uona je dlo Ćebje zawarto uod pomjyńańa.",
        "protect-othertime": "Inkszy uokres:",
        "protect-othertime-op": "inkszy uokres",
        "protect-otherreason": "Inkszy/dodatkowy powůd:",
        "protect-otherreason-op": "inkszy/dodatkowy powůd",
        "protect-dropdown": "*Nojczynstsze powody zawarćo uod sprowjyń\n** Czynste wandalizmy\n** Czynste spamowańy\n** Wojna edycyjno\n** Wygupy",
-       "protect-edit-reasonlist": "Sprowjej powody zawarćo uod sprowjyń",
+       "protect-edit-reasonlist": "Edytuj powody zawarciŏ",
        "protect-expiry-options": "2 godźiny:2 hours,1 dźyń:1 day,3 dńi:3 days,1 tydźyń:1 week,2 tygodńy:2 weeks,1 mjeśůnc:1 month,3 mjeśůnce:3 months,6 mjeśency:6 months,1 rok:1 year,ńyskůńčůny:infińite",
        "restriction-type": "Pozwolyńy:",
-       "restriction-level": "Poźům:",
+       "restriction-level": "Poziōm:",
        "minimum-size": "Minimalnŏ srogość",
        "maximum-size": "Maksymalnŏ srogość:",
        "pagesize": "(bajtōw)",
        "undeleteinvert": "Zaznocz na uopy",
        "undeletecomment": "Powůd wćepańo nazod:",
        "cannotundelete": "Wćepańy nazod ńy powjodo śe.\nKto inkšy můgu wćepać nazod zajta pjyrwšy.",
-       "undeletedpage": "'''Wćepano nazod zajta $1.'''\n\nUobejřij [[Special:Log/delete|rejer wyćepań]], kejbyś chćou přeglůndnůnć uostatnie uoperacyje wyćepywańo i wćepywańo nazod zajtůw.",
-       "undelete-header": "Uobejřij [[Special:Log/delete|rejer wyćepań]] coby sprawdźić uostatńo wyćepane zajty.",
+       "undeletedpage": "<strong>Strōna „$1” była prziwrōcōnŏ</strong>\n\nWejzdrzij do [[Special:Log/delete|regestu skasowań]] po lista ôstatnich skasowań i prziwrōcyń.",
+       "undelete-header": "Wejzdrzij na [[Special:Log/delete|regest skasowań]] po ôstatnio skasowane strōny.",
        "undelete-search-box": "Šnupej za wyćepńjyntymi zajtami",
        "undelete-search-prefix": "Strōny, co sie zaczynajōm ôd:",
        "undelete-search-submit": "Šnupej",
        "block-log-flags-noemail": "e-mail zablokowany",
        "block-log-flags-nousertalk": "ńy może sprowjać włosnyj zajty godki",
        "block-log-flags-angry-autoblock": "rozszerzůne automatyczne zawjyrańe załůnczůne",
-       "range_block_disabled": "Možliwość zawjerańo zakresu adresůw IP zostoua wůuůnčůno.",
+       "range_block_disabled": "Blokowanie zŏkresu adres IP je zakŏzane.",
        "ipb_expiry_invalid": "Felerny čas wygaśńjyńćo zawarća.",
        "ipb_expiry_temp": "Schrůńůne mjano użytkowńika noleży zawrzić trwale.",
        "ipb_already_blocked": "\"$1\" je już zawarty uod sprowjyń",
        "lockbtn": "Zawřij baza danych",
        "unlockbtn": "Uodymkńij baza danych",
        "locknoconfirm": "Ńy zaznačůužeś potwjerdzyńo.",
-       "lockdbsuccesssub": "Baza danych zostoua půmyślńy zawarto",
-       "unlockdbsuccesssub": "Baza danych zostoua půmyślńy uodymkńynto",
-       "lockdbsuccesstext": "Baza danych zostoua zawarto.<br />\nPamjyntej coby [[Special:UnlockDB|jům uodymknůńć]] po zakůńčyńu dźouań admińistracyjnych.",
-       "unlockdbsuccesstext": "Baza danych zostoua uodymkńynto.",
+       "lockdbsuccesssub": "Zablokowanie bazy danych sie podarziło",
+       "unlockdbsuccesssub": "Blokada bazy danych symniyntŏ",
+       "lockdbsuccesstext": "Baza danych je zablokowanŏ.<br />\nPamiyntej, żeby [[Special:UnlockDB|jōm ôtworzić]] jak robota bydzie skōńczōnŏ.",
+       "unlockdbsuccesstext": "Baza danych je ôdblokowanŏ.",
        "lockfilenotwritable": "Ńy idźe naškreflać plika zawarća bazy danych.\nZawjerańy i uodmykańy bazy danych wymogo coby plik můgu być naškreflany bez web serwer.",
        "databasenotlocked": "Baza danych ńy je zawarto.",
        "move-page": "Przećep $1",
        "export-templates": "Douůnč šablůny",
        "allmessages": "Komunikaty",
        "allmessagesname": "Mjano",
-       "allmessagesdefault": "Tekst důmyślny",
+       "allmessagesdefault": "Wychodny tekst wiadōmości",
        "allmessagescurrent": "Tekst uobecny",
        "allmessagestext": "Uoto lista wšyjstkych kůmůńikatůw systymowych dostympnych w přestřyńi mjan MedjaWiki.\nUodwjydź [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Tuůmačyńy MediaWiki] a tyž [https://translatewiki.net translatewiki.net] kejbyś chćou učestńičyć w tuůmačyńu uoprůgramowańo MediaWiki.",
        "allmessages-not-supported-database": "Ta zajta ńy može być užyta, bez tůž co zmjynna '''$wgUseDatabaseMessages''' je wůuůnčůno.",
        "import-token-mismatch": "Straćiły śe dane ze sesyje. Prosza spróbować zaś.",
        "import-invalid-interwiki": "Ńy idźe importować s podanyj wiki.",
        "importlogpage": "Regest importōw",
-       "importlogpagetext": "Rejer přeprowadzůnych importůw zajtůw s inkšych serwisůw wiki.",
+       "importlogpagetext": "Regest importōw strōn społym ze jejich historyjami ze inkszych wiki.",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|wersyja|wersyje|wersyji}}",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|wersyja|wersyje|wersyji}} ze $2",
        "tooltip-pt-userpage": "{{GENDER:|Moja}} strōna",
        "show-big-image-preview": "Srogość tego podglōndu: $1.",
        "show-big-image-other": "{{PLURAL:$2|Inkszŏ rozdzielczość|Inksze rozdzielczości}}: $1.",
        "show-big-image-size": "$1 x $2 pikselōw",
-       "newimages": "Galerjo nowych uobrozkůw",
+       "newimages": "Galeryjŏ nowych ôbrŏzkōw",
        "imagelisttext": "Půnižyj na {{PLURAL:$1||posortowanyj $2}} liśće {{PLURAL:$1|znojdowo|znojdujům|znojdowo}} śe '''$1''' {{PLURAL:$1|plik|pliki|plikůw}}.",
        "newimages-summary": "Na tyj ekstra zajće prezyntowane sům uostatńo wćepńynte pliki.",
        "newimages-legend": "Filtruj",
        "confirmemail_text": "Projekt {{SITENAME}} wymago weryfikacyji adresa e-brif před užyćym fůnkcyji kořistajůncych s počty.\nWćiś knefel půńižy coby wysúać na swůj adres list s linkym do zajty WWW.\nList bydźe zawjeroú link do zajty, w kerym zakodowany bydźe idyntyfikator.\nUodymkńij tyn link we přyglůndarce, čym potwjerdźiš, co ježeś užytkowńikym tygo adresa e-brif.",
        "confirmemail_pending": "Kod potwierdzyniŏ bōł prawie do Ciebie wysłany. Jak Twoje kōnto było niydŏwno zaregistrowane, to poczekej pŏrã minut na jego dotarcie, podwiela wyślesz prośbã ô nowy.",
        "confirmemail_send": "Wyślij kod potwjerdzyńo",
-       "confirmemail_sent": "Wjadůmość e-brif s kodym uwjeřitelńajůncym zostoua wysuano.",
+       "confirmemail_sent": "E-mail ze potwiyrdzyniym wysłany.",
        "confirmemail_oncreate": "Link s kodym potwjerdzyńo zostou wysuany na Twůj adres e-brif.\nKod tyn ńy je wymagany coby śe sam lůgować, ale bydźeš muśou go aktywować uodmykajůnc uotřimany link we přyglůndarce ńim zouůnčyš ńykere uopcyje e-brif na wiki.",
        "confirmemail_sendfailed": "{{SITENAME}} ńy poradźiła wysłać potwjerdzajůncyj wjadůmośći e-brif.\nSprowdź aże we adreśe ńy ma felernyj buchsztaby.\n\nSystym pocztowy zwrůćił kůmůńikat: $1",
        "confirmemail_invalid": "Felerny kod potwjerdzyńo.\nKod može być předawńůny",
        "table_pager_limit_submit": "Pokož",
        "table_pager_empty": "Brak wynikůw",
        "autosumm-blank": "POZŮR! Usůńjyńće treśći (zajta pozostoła pusto)!",
-       "autosumm-replace": "POZŮR! Zastůmpjyńy treśći hasua bardzo krůtkym tekstym: „$1”",
+       "autosumm-replace": "Zastōmpiynie zawartości tekstym „$1”",
        "autoredircomment": "Przekerowanie do [[$1]]",
        "autosumm-new": "Stworzōnŏ nowõ strōnã: \"$1\"",
        "lag-warn-normal": "Na tyj liśće zmjany nowsze jak {{PLURAL:$1|sekůnda|sekůnd}} můgům ńy być widoczne.",
        "watchlistedit-normal-legend": "Wyćep zajty s listy artikli na kere dowoš pozůr",
        "watchlistedit-normal-explain": "Půńiżyj mosz lista artikli na kere dowosz pozůr.\nCoby wyćepać z ńij jako zajta, zaznocz pole przi ńij i naćiś knefel „{{int:Watchlistedit-normal-submit}}”.\nMożesz tyż skorzistać ze [[Special:EditWatchlist/raw|tekstowygo sprowjorza listy artikli na kere dowosz pozůr]].",
        "watchlistedit-normal-submit": "Wyćep s listy",
-       "watchlistedit-normal-done": "Z Twoi listy artikli na kere dowoš pozůr {{PLURAL:$1|zostoua wyćepano 1 zajta|zostouy wyćepane $1 zajty|zostouo wyćepanych $1 zajtůw}}:",
+       "watchlistedit-normal-done": "{{PLURAL:$1|Była skasowanŏ jedna strōna|Były skasowane $1 strōny|Było skasowanych $1 strōn}} ze twojij listy ôbserwowanych:",
        "watchlistedit-raw-title": "Tekstowy edytor listy artikli na kere dowosz pozůr",
        "watchlistedit-raw-legend": "Tekstowy edytor listy artikli na kere dowoš pozůr",
        "watchlistedit-raw-explain": "Půńižy moš lista artikli na kere dowoš pozůr. W koždej lińii znojdowo śe titel jydnygo artikla. Lista možeš sprowjać dodajůnc nowe zajty i wyćepujůnc te kere na ńij sům. Jak skůńčyš, naćiś knefel „Uaktualńij lista zajtůw na kere dowům pozůr”.\nMožeš tyž [[Special:EditWatchlist|užyć standardowygo edytora]].",
        "watchlistedit-raw-titles": "Title:",
        "watchlistedit-raw-submit": "Uaktualńij lista",
-       "watchlistedit-raw-done": "Lista zajtůw na kere dowoš pozůr zostoua uaktualńůna",
+       "watchlistedit-raw-done": "Lista twojich ôbserwowanych była zaktualizowanŏ.",
        "watchlistedit-raw-added": "Dodano {{PLURAL:$1|1 pozycyja|$1 pozycyje|$1 pozycyji}} do listy artikli na kere dowoš pozůr:",
        "watchlistedit-raw-removed": "Wyćepano {{PLURAL:$1|1 pozycyja|$1 pozycyje|$1 pozycyji}} z listy zajtůw na kere dowoš pozůr:",
        "watchlisttools-clear": "Wysnŏż ôbserwowane",
        "redirect-page": "Idyntyfikatōr strōny",
        "redirect-revision": "Wersyjŏ strōny",
        "redirect-file": "Miano zbioru",
-       "fileduplicatesearch": "Šnupej za duplikatym plika",
+       "fileduplicatesearch": "Szukej tuplikatōw zbioru",
        "fileduplicatesearch-summary": "Šnupej za duplikatůma plika na podstawje wartośći fůnkcyji skrůtu.",
        "fileduplicatesearch-filename": "Mjano pliku:",
        "fileduplicatesearch-submit": "Šnupej",
        "specialpages": "Ekstra strōny",
        "specialpages-note-restricted": "* Ekstra zajty uogůlńy dostympne.\n* <strong class=\"mw-specialpagerestricted\">Ekstra zajty do kerych dostymp je uograńiczůny.</strong>",
        "specialpages-group-maintenance": "Reporty kōnserwacyjne",
-       "specialpages-group-other": "Inkše ekstra zajty",
+       "specialpages-group-other": "Inksze ekstra strōny",
        "specialpages-group-login": "Logowanie / registracyjŏ",
-       "specialpages-group-changes": "Pomjyńane na uostatku a rejery",
-       "specialpages-group-media": "Pliki",
+       "specialpages-group-changes": "Ôstatnie zmiany i regesty",
+       "specialpages-group-media": "Zbiory",
        "specialpages-group-users": "Używŏcze i uprawniynia",
-       "specialpages-group-highuse": "Zajty čynsto užywane",
+       "specialpages-group-highuse": "Czynsto używane strōny",
        "specialpages-group-pages": "Listy strōn",
-       "specialpages-group-pagetools": "Nořyńdźa zajtůw",
-       "specialpages-group-wiki": "Informacyje a werkcojgi wiki",
-       "specialpages-group-redirects": "Ekstra zajty, kere kerujům",
+       "specialpages-group-pagetools": "Norzyńdzia strōn",
+       "specialpages-group-wiki": "Norzyńdzia i dane",
+       "specialpages-group-redirects": "Ekstra zajty przekerowaniŏ",
        "specialpages-group-spam": "Nořyńdźa do wyćepywanio spamu",
        "blankpage": "Pusto zajta",
        "intentionallyblankpage": "Ta zajta nauůmyślńy uostoua śe pusto",
        "searchsuggest-search": "Szukej we {{SITENAME}}",
        "duration-days": "$1 {{PLURAL:$1|dziyń|dni}}",
        "expand_templates_ok": "OK",
+       "mediastatistics": "Statystyki mediōw",
        "randomrootpage": "Losowŏ strōna (bez podstrōn)",
        "changecredentials": "Zmiyń poświadczynia",
-       "changecredentials-submit": "Zmiyń poświadczynia"
+       "changecredentials-submit": "Zmiyń poświadczynia",
+       "removecredentials": "Kasowanie poświadczyń"
 }
index bda0a4f..7f242bf 100644 (file)
        "rcfilters-restore-default-filters": "Гадәттәге сөзгечләрне торгызу",
        "rcfilters-clear-all-filters": "Барлык сөзгечләрне бушату",
        "rcfilters-show-new-changes": "$1 башлап яңа үзгәрешләрне карау",
-       "rcfilters-search-placeholder": "ҮзгÓ\99Ñ\80еÑ\88лÓ\99Ñ\80не Ñ\81өзү (менÑ\8e ÐºÑ\83лланÑ\8bгÑ\8bз Ñ\8fки Ñ\81өзгеÑ\87 Ð°Ñ\82Ñ\8b Ð±Ñ\83енÑ\87а Ñ\8dзлигез)",
+       "rcfilters-search-placeholder": "ҮзгÓ\99Ñ\80еÑ\88лÓ\99Ñ\80не Ñ\81өзү (менÑ\8e ÐºÑ\83лланÑ\8bгÑ\8bз Ñ\8fки Ñ\81өзгеÑ\87 Ð¸Ñ\81еме Ð±Ñ\83енÑ\87а Ñ\8dзлÓ\99гез)",
        "rcfilters-search-placeholder-mobile": "Сөзгечләр",
        "rcfilters-invalid-filter": "Яраксыз сөзгеч",
        "rcfilters-filterlist-title": "Сөзгечләр",
        "notargettitle": "Максатсыз",
        "nopagetitle": "Мондый бит юк",
        "nopagetext": "Күрсәтелгән бит юк.",
-       "pager-newer-n": "{{PLURAL:$1|$1 яңарак}}",
-       "pager-older-n": "$1 {{PLURAL:$1|искерәк}}",
+       "pager-newer-n": "{{PLURAL:$1|1 яңарак|$1 яңарак}}",
+       "pager-older-n": "{{PLURAL:$1|1 искерәк|$1 искерәк}}",
        "suppress": "Яшерү",
        "apihelp": "API ярдәм",
        "apihelp-no-such-module": "«$1» модуле табылмады.",
        "apisandbox": "API комлыгы",
-       "apisandbox-reset": "Чистарту",
+       "apisandbox-submit": "Сорату ясарга",
+       "apisandbox-reset": "Бушату",
        "apisandbox-retry": "Кабатлау",
+       "apisandbox-helpurls": "Белешмәгә сылтамалар",
        "apisandbox-examples": "Мисаллар",
        "apisandbox-dynamic-parameters": "Өстәмә параметрлар",
+       "apisandbox-dynamic-parameters-add-label": "Параметр өстәргә:",
+       "apisandbox-dynamic-parameters-add-placeholder": "Параметр исеме",
+       "apisandbox-dynamic-error-exists": "«$1» исемле параметр бар инде.",
+       "apisandbox-templated-parameter-reason": "Бу [[Special:ApiHelp/main#main/templatedparams|калып параметры]] $2 исемлегенең {{PLURAL:$1|мәгънә}} нигезендә тәкъдим ителә.",
+       "apisandbox-deprecated-parameters": "Искергән параметрлар",
+       "apisandbox-fetch-token": "Торенны автотутыру",
+       "apisandbox-add-multi": "Өстәү",
+       "apisandbox-submit-invalid-fields-title": "Кайбер кырлар дөрес түгел",
+       "apisandbox-submit-invalid-fields-message": "Билгеләнгән кырларны төзәтегез һәм яңадан тырышып карагыз.",
        "apisandbox-results": "Нәтиҗәләр",
        "apisandbox-continue": "Дәвам итү",
-       "apisandbox-continue-clear": "ЧиÑ\81Ñ\82аÑ\80ту",
+       "apisandbox-continue-clear": "Ð\91Ñ\83Ñ\88ату",
        "apisandbox-multivalue-all-namespaces": "$1 (Барлык исемнәр киңлекләре)",
        "apisandbox-multivalue-all-values": "$1 (Барлык мәгънәләр)",
        "booksources": "Китап чыганаклары",
        "activeusers": "Актив кулланучылар исемлеге",
        "activeusers-noresult": "Кулланучылар табылмады.",
        "listgrouprights": "Кулланучы төркемнәренең хокуклары",
-       "listgrouprights-key": "Ð\9bегенда:\n* <span class=\"listgrouprights-granted\">Бирелгән хокуклар</span>\n* <span class=\"listgrouprights-revoked\">Алынган хокуклар</span>",
+       "listgrouprights-key": "Ð\90ңлаÑ\82ма:\n* <span class=\"listgrouprights-granted\">Бирелгән хокуклар</span>\n* <span class=\"listgrouprights-revoked\">Алынган хокуклар</span>",
        "listgrouprights-group": "Төркем",
        "listgrouprights-rights": "Хокуклар",
        "listgrouprights-helppage": "Help:Төркемнәрнең хокуклары",
        "confirm": "Раслау",
        "excontent": "эчтәлек: «$1»",
        "excontentauthor": "эчтәлеге: «$1», бердәнбер авторы [[Special:Contributions/$2|$2]] ([[User talk:$2|бәхәс]])",
-       "exbeforeblank": "чистартуга кадәр булган эчтәлек: «$1»",
+       "exbeforeblank": "бушатуга кадәр булган эчтәлек: «$1»",
        "delete-confirm": "«$1» бетерү",
        "delete-legend": "Бетерү",
        "historywarning": "<strong>Игътибар:</strong> Сез бетерергә теләгән биттә үзгәртү тарихы бар, ул $1 {{PLURAL:$1|юрамадан тора}}:",
        "delete_and_move_confirm": "Әйе, битне бетерү",
        "delete_and_move_reason": "Күчерүне мөмкин итәр өчен бетерелде «[[$1]]»",
        "move-leave-redirect": "Юнәлтү калдырылсын",
-       "export": "Битләрне чыгаруы",
+       "export": "Битләрне чыгару",
        "export-submit": "Экспортлау",
        "export-addcattext": "Бу төркемнән битләр өстәү:",
        "export-addcat": "Өстәү",
        "recreate": "Яңадан төзү",
        "unit-pixel": "нкт",
        "confirm_purge_button": "Ярар",
-       "confirm-purge-top": "Бу битнең кэшы чистартылсынмы?",
-       "confirm-purge-bottom": "Кэшны чистартудан соң аның соңгы юрамасы күрсәтеләчәк.",
+       "confirm-purge-top": "Бу битнең кэшын бушатыргамы?",
+       "confirm-purge-bottom": "Кэшны бушатудан соң аның соңгы юрамасы күрсәтеләчәк.",
        "confirm-watch-button": "Ярар",
        "confirm-unwatch-button": "Ярар",
        "confirm-rollback-button": "Ярар",
        "version-software": "Урнаштырылган программа белән тәэмин ителешне",
        "version-software-product": "Продукт",
        "version-software-version": "Версия",
+       "version-entrypoints-header-entrypoint": "Керү урыны",
        "version-entrypoints-header-url": "URL",
        "version-libraries-library": "Китапханә",
        "version-libraries-version": "Версия",
        "redirect-page": "Бит идентификаторы",
        "redirect-revision": "Бит юрамасы",
        "redirect-file": "Файл исеме",
-       "fileduplicatesearch": "Бер үк файлларны эзләү",
+       "redirect-logid": "Көндәлек ID",
+       "redirect-not-exists": "Мәгънәсе табылмады",
+       "redirect-not-numeric": "Мәгънәсе сан зурлыгы түгел",
+       "fileduplicatesearch": "Бердәй файлларны эзләү",
+       "fileduplicatesearch-summary": "Бердәй файлларны хэш-код буенча эзләү.",
        "fileduplicatesearch-filename": "Файл исеме:",
        "fileduplicatesearch-submit": "Эзләү",
        "fileduplicatesearch-info": "$1 × $2 нокта<br />Файл зурлыгы: $3<br />MIME төре: $4",
        "specialpages": "Махсус битләр",
+       "specialpages-note-top": "Аңлатма",
        "specialpages-note-restricted": "* Гади махсус битләр.\n* <span class=\"mw-specialpagerestricted\">Чикләнелгән махсус битләр.</span>",
        "specialpages-group-maintenance": "Техник карау хисапнамәсе",
        "specialpages-group-other": "Башка махсус битләр",
index 519a355..cc2e664 100644 (file)
@@ -97,7 +97,7 @@
        "tog-watchdefault": "Додавати змінені мною сторінки та файли до мого списку спостереження",
        "tog-watchmoves": "Додавати перейменовані мною сторінки та файли до мого списку спостереження",
        "tog-watchdeletion": "Додавати вилучені мною сторінки та файли до мого списку спостереження",
-       "tog-watchuploads": "Додавати до мого списку спостереження нові файли, завантажені мною",
+       "tog-watchuploads": "Додавати файли, завантажені мною до списку спостереження",
        "tog-watchrollback": "Додавати відкочені мною сторінки до мого списку спостереження",
        "tog-minordefault": "Позначати всі зміни як незначні за замовчуванням",
        "tog-previewontop": "Показувати попередній перегляд перед вікном редагування, а не після",
        "tog-useeditwarning": "Попереджати мене, якщо я залишаю сторінку редагування з незбереженими змінами",
        "tog-prefershttps": "Завжди використовувати безпечне з'єднання при вході в систему",
        "tog-showrollbackconfirmation": "Показати підтверджувальне вікно при натисканні на посилання відкоту",
+       "tog-requireemail": "Вимагає вказання електронної пошти для скидання пароля",
        "underline-always": "Завжди",
        "underline-never": "Ніколи",
        "underline-default": "Використовувати налаштування браузера",
        "category-empty": "''Ця категорія зараз порожня.''",
        "hidden-categories": "{{PLURAL:$1|1=Прихована категорія|Приховані категорії}}",
        "hidden-category-category": "Приховані категорії",
-       "category-subcat-count": "{{PLURAL:$2|Показано $1 {{PLURAL:$1|підкатегорію з|підкатегорії з|підкатегорій із}} $2.|1=Ця категорія має тільки таку підкатегорію.}}",
+       "category-subcat-count": "{{PLURAL:$2|1=Ця категорія має тільки таку підкатегорію.|Показано $1 {{PLURAL:$1|підкатегорію з|підкатегорії з|підкатегорій із}} $2.}}",
        "category-subcat-count-limited": "У цій категорії {{PLURAL:$1|$1 підкатегорія|$1 підкатегорії|$1 підкатегорій}}.",
        "category-article-count": "Показано $1 {{PLURAL:$1|сторінку|сторінки|сторінок}} цієї категорії (із $2).",
        "category-article-count-limited": "У цій категорії {{PLURAL:$1|$1 сторінка|$1 сторінки|$1 сторінок}}.",
        "changeemail-nochange": "Будь ласка, введіть адресу електронної пошти, відмінну від попередньої.",
        "resettokens": "Скидання токенів",
        "resettokens-text": "Ви можете скинути токени, що забезпечують доступ до певних особистих даних, пов'язаних тут із вашим обліковим записом.\nВам слід це зробити, якщо ви випадково поділились токенами з кимось, або якщо ваш обліковий запис було зламано.",
-       "resettokens-no-tokens": "Немає жетонів до скидання.",
+       "resettokens-no-tokens": "Немає токенів до скидання.",
        "resettokens-tokens": "Токени:",
        "resettokens-token-label": "$1 (поточне значення: $2)",
        "resettokens-watchlist-token": "Маркер стрічки новин (Atom/RSS) щодо [[Special:Watchlist|зміни на сторінці з вашого списку спостереження]]",
        "undo-norev": "Редагування не може бути скасоване, бо його не існує або було вилучено.",
        "undo-nochange": "Схоже, редагування вже було скасовано.",
        "undo-summary": "Скасування редагування № $1 користувача [[Special:Contribs/$2|$2]] ([[User talk:$2|обговорення]])",
+       "undo-summary-anon": "Скасування версії $1 від [[Special:Contributions/$2|$2]]",
        "undo-summary-username-hidden": "Скасувати версію $1, виконану прихованим користувачем",
        "cantcreateaccount-text": "Створення облікових записів із цієї IP-адреси ('''$1''') було заблоковане [[User:$3|користувачем $3]].\n\n$3 зазначив таку причину: ''$2''",
        "cantcreateaccount-range-text": "Створення облікового запису із IP-адрес у діапазоні  <strong>$1</strong>, який включає вашу IP-адресу (<strong>$4</strong>), було заблоковано користувачем [[User:$3|$3]].\n\nКористувач $3 вказав як причину <em>$2</em>",
        "prefs-help-email": "Адреса електронної пошти не є обов'язковою, але необхідна для скидання пароля, якщо Ви його забудете.",
        "prefs-help-email-others": "Також вона дозволить іншим користувачам зв'язатися з Вами через посилання на Вашій сторінці користувача чи на сторінці обговорення. При цьому Ваша електронна адреса залишиться нерозкритою.",
        "prefs-help-email-required": "Потрібно зазначити адресу електронної пошти.",
+       "prefs-help-requireemail": "Якщо вибране, то надішле електронного листа із скинутим паролем за умови, що в обліковому записі було вказано ім'я користувача та електронна пошта.",
        "prefs-info": "Основні відомості",
        "prefs-i18n": "Інтернаціоналізація",
        "prefs-signature": "Підпис",
        "alreadyrolled": "Неможливо відкинути останні редагування [[:$1]], зроблені [[User:$2|$2]] ([[User talk:$2|обговорення]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]), оскільки хтось інший уже змінив чи відкинув редагування цієї статті.\n\nОстанні редагування зроблено [[User:$3|$3]] ([[User talk:$3|обговорення]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Пояснення редагування було: «<em>$1</em>.».",
        "revertpage": "Відкинуто редагування [[Special:Contributions/$2|$2]] ([[User talk:$2|обговорення]]) до зробленого [[User:$1|$1]]",
+       "revertpage-anon": "Відкинуто правки [[Special:Contributions/$2|$2]] до останньої версії [[User:$1|$1]]",
        "revertpage-nouser": "Відкинуто редагування прихованого користувача до останньої версії, зробленої {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Відкинуті редагування {{GENDER:$3|користувача|користувачки}} $1; повернення до версії {{GENDER:$4|користувача|користувачки}} $2.",
        "sessionfailure-title": "Помилка сеансу",
        "ipblocklist-legend": "Пошук заблокованого користувача",
        "blocklist-userblocks": "Сховати блокування облікових записів",
        "blocklist-tempblocks": "Сховати тимчасові блокування",
+       "blocklist-indefblocks": "Сховати безстрокові блокування",
        "blocklist-addressblocks": "Приховати блокування окремих IP-адрес",
        "blocklist-type": "Тип:",
        "blocklist-type-opt-all": "Всі",
index d0d4c8a..edf53b2 100644 (file)
        "history": "ⴰⵎⵣⵔⴰⵢ ⵏ ⵜⴰⵙⵏⴰ",
        "history_short": "ⴰⵎⵣⵔⵓⵢ",
        "history_small": "ⴰⵎⵣⵔⵓⵢ",
-       "updatedmarker": "âµ\9cⵡⴰâµ\99âµ\99âµ\8fâ´¼âµ\8d âµ\9câµ\89â´³âµ\89âµ\94â´° âµ\8f âµ\93âµ\94ⵣⴰⴼ âµ\89âµ\8fâµ\93",
+       "updatedmarker": "âµ\9cⵡⴰâµ\99âµ\99âµ\8fâ´¼âµ\8d âµ\9câµ\89â´³âµ\89âµ\94â´° âµ\8f âµ\93âµ\94ⵣⴰⴼ âµ\8fâ´½:",
        "printableversion": "ⵜⵓⵏⵖⵉⵍⵜ ⵉⵜⵜⵡⴰⵙⵉⴳⴳⵣⵏ",
        "permalink": "ⴰⵙⵖⵏ ⴰⵎⵖⵍⴰⵍ",
        "print": "ⵙⵉⴳⴳⵣ",
        "accmailtitle": "ⵜⴰⴳⵓⵔⵉ ⵓⵣⵔⴰⵢ ⵜⴻⵜⵜⵡⴰⵣⵏ",
        "newarticle": "(ⴰⵎⴰⵢⵏⵓ)",
        "newarticletext": "ⵜⴹⴼⴰⵔⴷ ⵢⴰⵏ ⵓⵙⵖⵏ ⵖⵔ ⵢⴰⵜ ⵜⴰⵙⵏⴰ ⵏⵏⴰ ⵓⵔ ⵜⴰ ⵉⵍⵍⵉⵏ. \nⴰⴼⴰⴷ ⴰⴷ ⵜⵙⵏⵓⵍⴼⵓⴷ ⵜⴰⵙⵏⴰ, ⵙⵙⵏⵜⵉ ⵜⵉⵔⵔⴰ ⴳ ⵓⴼⵏⵉⵇ ⴳ ⵉⵣⴷⴷⴰⵔ (ⵥⵔ [$1 ⵜⴰⵙⵏⴰ ⵏ ⵜⵡⵉⵙⵉ] ⵉ ⵡⵓⴳⴳⴰⵔ ⵏ ⵉⵏⵖⵎⵉⵙⵏ). \nⵎⴽ ⵜⵍⵍⵉⴷ ⴷⴰ ⵙ ⵓⵣⴳⴰⵍ, ⴰⴽⵍ ⵖⴼ <strong>ⴰⵖⵓⵍ</strong> ⴳ ⵓⵙⴰⵔⴰ ⵏⵏⴽ.",
-       "anontalkpagetext": "----\n<em>ⵜⵍⵍⵉⴷ ⴳ ⵜⴰⵙⵏ ⵏ ⵓⵎⵙⴰⵡⴰⵍ ⵏ ⵢⴰⵏ ⵓⵏⵙⵙⵎⵔⵙ ⵡⴰⵔⵉⵙⵎ ⵏⵏⴰ ⵜⴰ ⵓⵔ ⵉⵙⴽⵉⵔⵏ ⴰⵎⵉⴹⴰⵏ ⵏⵖ ⵏⵏⴰ ⵜ ⵓⵔ ⵉⵙⵙⵎⵔⵉⵙⵏ</em>.\nⴰⵢⴰ ⴰ ⵖⴼ ⵉⴼⵓⴽⴽ ⴰⴷ ⵏⵙⵙⵎⵔⵙ ⵜⴰⵏⵙⴰ ⵏⵏⵙ IP ⴼⴰⴷ ⴰⴷ ⵜ ⵏⵙⵎⴰⴳⵉ.\nⵢⴰⵜ ⵜⴰⵏⵙⴰ IP ⵥⴹⴰⵔⵏ ⴰⴷ ⵜⵜ ⵙⵙⵓⵔⵏ ⵎⵏⵏⴰⵡ ⵏ ⵉⵏⵙⵙⵎⵔⵙⵏ.\nⵎⴽ ⵜⴳⵉⴷ ⵢⴰⵏ ⵓⵏⵙⵙⵎⵔⵙ ⵡⴰⵔⵉⵙⵎ ⴷ ⴽ ⵜⵖⴹⴼⴷ ⵎⴰⵙ ⴽ ⵡⴰⵜⵙⵏ ⴽⵔⴰ ⵏ ⵉⵅⴼⴰⵡⴰⵍⵏ ⵓⵔ ⵙⵉⴽ ⵉⵥⵍⵉⵏ, ⵜⵓⴼⵉⴷ ⴰⴷ  [[Special:CreateAccount|ⵙⴽⵔ ⵢⴰⵏ ⵓⵎⵉⴹⴰⵏ]] ⵏⵖ ⴷ [[Special:UserLogin|ⴽⵛⵎ]] ⴱⴰⵔ ⴰⴷ ⵜⴰⵏⴼⴷ ⵉ ⴽⵔⴰⵢⴳⴰⵜ ⴰⵎⵔⴽⵙ ⴷ ⵉⵎⴷⵔⴰⵡⵏ ⵢⴰⴹⵏ.",
+       "anontalkpagetext": "----\n<em>ⵜⵍⵍⵉⴷ ⴳ ⵜⴰⵙⵏ ⵏ ⵓⵎⵙⴰⵡⴰⵍ ⵏ ⵢⴰⵏ ⵓⵏⵙⵙⵎⵔⵙ ⵡⴰⵔⵉⵙⵎ ⵏⵏⴰ ⵜⴰ ⵓⵔ ⵉⵙⴽⵉⵔⵏ ⴰⵎⵉⴹⴰⵏ ⵏⵖ ⵏⵏⴰ ⵜ ⵓⵔ ⵉⵙⵙⵎⵔⵉⵙⵏ</em>.\nⴰⵢⴰ ⴰ ⵖⴼ ⵉⴼⵓⴽⴽ ⴰⴷ ⵏⵙⵙⵎⵔⵙ ⵜⴰⵏⵙⴰ ⵏⵏⵙ IP ⴼⴰⴷ ⴰⴷ ⵜ ⵏⵙⵎⴰⴳⵉ.\nⵢⴰⵜ ⵜⴰⵏⵙⴰ IP ⵥⴹⴰⵔⵏ ⴰⴷ ⵜⵜ ⵙⵙⵓⵔⵏ ⵎⵏⵏⴰⵡ ⵏ ⵉⵏⵙⵙⵎⵔⵙⵏ.\nⵎⴽ ⵜⴳⵉⴷ ⵢⴰⵏ ⵓⵏⵙⵙⵎⵔⵙ ⵡⴰⵔⵉⵙⵎ ⴷ ⴽ ⵜⵖⴹⴼⴷ ⵎⴰⵙ ⴽ ⵡⴰⵜⵙⵏ ⴽⵔⴰ ⵏ ⵉⵅⴼⴰⵡⴰⵍⵏ ⵓⵔ ⵙⵉⴽ ⵉⵥⵍⵉⵏ, ⵜⵓⴼⵉⴷ ⴰⴷ  [[Special:CreateAccount|ⵙⴽⵔ ⵢⴰⵏ ⵓⵎⵉⴹⴰⵏ]] ⵏⵖ ⴷ [[Special:UserLogin|ⴽⵛⵎ]] ⴱⴰⵔ ⴰⴷ ⵜⴰⵏⴼⴷ ⵉ ⴽⵔⴰⵢⴳⴰⵜ ⴰⵎⵔⴽⵙ ⴷ ⵉⵎⴷⵔⴰⵡⵏ ⵢⴰⴹⵏ.",
        "noarticletext": "ⵓⵔ ⵉⵍⵍⵉ ⴽⵔⴰ ⵏ ⵓⴹⵔⵉⵙ ⴳ ⵜⴰⵙⵏⴰ ⴰⴷ ⵖⵉⵍⴰ. \nⵜⵣⵎⵔⴷ ⴰⴷ [[Special:Search/{{PAGENAME}}|ⵜⵔⵣⵓⴷ ⵖⴼ ⵓⵣⵡⵍ ⵏⵏⵙ]] ⴳ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵢⴰⴹⵏ, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ⵔⵣⵓ ⵖⴼ logs ⵖⵔⵙ ⵉⵇⵇⵏⴻⵏ],\nⵏⵖ [{{fullurl:{{FULLPAGENAME}}|action=edit}} ⵙⵏⵓⵍⴼⵓ ⵜⴰⵙⵏⴰ]</span>.",
        "noarticletext-nopermission": "ⴷⵖⵉ ⵓⵔ ⵉⵍⵍⵉ ⴰⵡⴷ ⴽⵔⴰ ⵏ ⵓⴹⵔⵉⵚ ⴳ ⵜⴰⵙⵏⴰ ⴰ.\nⵜⵣⵎⵔⴷ ⴰⴷ [[Special:Search/{{PAGENAME}}|ⵜⵔⵣⵓⴷ ⵖⴼ ⵓⵣⵡⵍ ⵏⵏⵙ]] ⴳ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵢⴰⴹⵏⵉⵏ, ⵏⵖ <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ⵔⵣⵓ ⵖⴼ ⵉⵣⵎⵎⴻⵎⵏ ⵉⵣⴷⵉⵏ]</span>, ⵎⴰⵛⴰ ⵓⵔ ⴷⴰⵔⴽ ⵜⵓⵔⴰⴳⵜ ⴰⴷ ⵜⵙⵏⵓⵍⴼⵓⴷ ⵜⴰⵙⵏⴰ ⴰ.",
        "userpage-userdoesnotexist-view": "ⴰⵎⵉⴹⴰⵏ ⵏ ⵓⵎⵙⵙⵎⵔⵙ $1 ⵓⵔ ⵉⵜⵜⵓⵣⵎⵎⴻⵎ.",
        "last": "ⵓⵣⵡⵔ",
        "page_last": "ⴰⵎⴳⴳⴰⵔⵓ",
        "histlegend": "ⴰⵙⵜⴰⵢ ⵏ ⵓⵎⵣⴰⵔⴰⵢ : ⵔⵛⵎ ⵜⴰⵏⴽⵓⵍⵉⵏ ⵏ ⵜⵓⵏⵖⵉⵍⵉⵏ ⵏⵏⴰ ⵜⵔⵉⴷ ⴰⴷ ⵜⵙⵎⵣⴰⵣⴰⵍⴷ ⵜⴰⴷⵔⴷ ⵉ ⴰⴽⵎ ⵏⵖ ⵉ ⵜⵙⴰⵔⵓⵜ ⵏ ⵢⵉⵣⴷⴰⵔ.<br />\nⵜⴰⴱⴰⴷⵓⵜ : <strong>({{int:cur}})</strong> = ⴰⵎⵣⴰⵔⴰⵢ ⴰⴽⴷ ⵜⵓⵏⵖⵉⵍⵜ ⵜⴰⵎⴳⴳⴰⵔⵓⵜ, <strong>({{int:last}})</strong> = ⴰⵎⵣⴰⵔⴰⵢ ⴰⴽⴷ ⵜⵓⵏⵖⵉⵍⵜ ⵉⵣⵔⵉⵏ, <strong>{{int:minoreditletter}}</strong> = ⵉⵙⵏⵉⴼⵉⵍⵏ ⵉⵎⵥⵥⵉⵢⵏ.",
-       "history-fieldset-title": "âµ\94âµ£âµ\93 âµ\96â´¼ ⵉⵣⵣⵔⴰⵢⵏ",
+       "history-fieldset-title": "âµ\99âµ\9câµ\89 ⵉⵣⵣⵔⴰⵢⵏ",
        "histfirst": "ⴰⵇⴱⵓⵔ",
        "histlast": "ⴰⵎⴰⵢⵏⵓ",
        "history-feed-title": "ⴰⵎⵣⵔⵓⵢ ⵏ ⵓⵣⵣⵔⴰⵢ",
        "rcfilters-savedqueries-already-saved": "ⵜⵉⵎⵣⵉⵣⴷⴳⵉⵜⵉⵏ ⴰⴷ ⵜⵜⵡⴰⵃⴹⴰⵏⵜ ⵢⴰⴷ. ⵙⵏⴼⵍ ⵜⵉⵙⵖⴰⵍ ⵏⴽ ⵃⵎⴰ ⴰⴷ ⵜⵙⵏⴼⵍⴷ ⵜⵉⵎⵣⵉⵣⴷⴳⵜ ⵜⴰⵎⴰⵢⵏⵓⵜ ⵉⵜⵜⵡⴰⵃⴹⴰⵏ.",
        "rcfilters-restore-default-filters": "ⵔⴰⵔ ⴷ ⵜⵉⵎⵣⵉⵣⴷⴳⵉⵜⵉⵏ ⵙ ⵓⵎⵕⴰⴹ",
        "rcfilters-clear-all-filters": "ⵚⵚⴼⴹ ⴰⴽⴽⵯ ⵜⵉⵎⵣⵉⵣⴷⴳⵉⵜⵉⵏ",
-       "rcfilters-show-new-changes": "ⵙⴽⵏ ⵉⵙⵏⴼⵍⵏ ⵉⵎⴰⵢⵏⵓⵜⵏ",
+       "rcfilters-show-new-changes": "ⵙⴽⵏ ⵉⵙⵏⴼⵍⵏ ⵉⵎⴰⵢⵏⵓⵜⵏ ⵣⴳ $1",
        "rcfilters-search-placeholder": "ⵣⵉⵣⴷⵉⴳ ⵉⵙⵏⴼⵍⵏ (ⵙⵎⵔⵙ ⵓⵎⵓⵖ ⵏⵖ ⵔⵣⵓ ⵖⴼ ⵉⵙⵎ ⵏ ⵜⵎⵣⵉⵣⴷⴳⵜ)",
        "rcfilters-invalid-filter": "ⵜⵉⵎⵣⵉⵣⴷⴳⵜ ⵓⵔ ⵉⵖⵥⴰⵏⵏ",
        "rcfilters-empty-filter": "ⵃⵜⵜⴰ ⴽⵔⴰ ⵏ ⵜⵉⵎⵣⵉⵣⴷⴳⵜ ⵉⵙⵡⵓⵔⵉⵏ. ⴰⴽⴽⵯ ⵉⵙⵏⵍⵏ ⵜⵜⵡⴰⵙⴽⵏⵏ.",
index c2cd05b..f4154b6 100644 (file)
        "datedefault": "預設值",
        "prefs-labs": "實驗中的功能",
        "prefs-user-pages": "使用者頁面",
-       "prefs-personal": "使用者基本資料",
+       "prefs-personal": "用戶資料",
        "prefs-rc": "近期變更",
        "prefs-watchlist": "監視清單",
        "prefs-editwatchlist": "編輯監視清單",
        "listgrouprights-group": "群組",
        "listgrouprights-rights": "權限",
        "listgrouprights-helppage": "Help:使用者群組權限",
-       "listgrouprights-members": "(成員清單)",
+       "listgrouprights-members": "(成員清單)",
        "listgrouprights-addgroup": "加入{{PLURAL:$2|群組}}:$1",
        "listgrouprights-removegroup": "移除{{PLURAL:$2|群組|群組}}:$1",
        "listgrouprights-addgroup-all": "加入所有群組",
        "logentry-import-upload": "$1 已由檔案上傳{{GENDER:$2|匯入}} $3",
        "logentry-import-upload-details": "$1 已使用檔案上傳{{GENDER:$2|匯入}} $3 ($4 {{PLURAL:$4|修訂|修訂}})",
        "logentry-import-interwiki": "$1 已由其他 wiki {{GENDER:$2|匯入}} $3",
-       "logentry-import-interwiki-details": "$1 已自 $5 {{GENDER:$2|匯入}} $3 ($4 {{PLURAL:$4|修訂|修訂}})",
+       "logentry-import-interwiki-details": "$1已自$5{{GENDER:$2|匯入}}$3($4{{PLURAL:$4|修訂|修訂}})",
        "logentry-merge-merge": "$1 將 $3 {{GENDER:$2|合併}}至 $4 (修訂版本至 $5)",
        "logentry-move-move": "$1 {{GENDER:$2|已移動}}頁面 $3 至 $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|已移動}}頁面 $3 至 $4,不留重新導向",
index 68a0380..2334a83 100644 (file)
@@ -18,7 +18,8 @@
                        "Wxyveronica",
                        "和平至上",
                        "A2093064",
-                       "WQL"
+                       "WQL",
+                       "Sunny00217"
                ]
        },
        "tog-watchlisthidebots": "隱藏監視清單中機械人的編輯",
        "revdelete-suppress-text": "壓制'''只'''應用於以下的情況:\n* 不合適的個人資料\n*: ''地址、電話號碼、身份證號碼等。''",
        "editundo": "復原",
        "prefs-user-pages": "用戶頁面",
+       "prefs-personal": "用戶資料",
        "username": "{{GENDER:$1|用戶名稱}}:",
        "prefs-help-gender": "可選:用於軟件中的性別指定。此項資料將會被公開。",
        "group-user": "用戶",
index 1a5daca..6ea046e 100644 (file)
@@ -59,11 +59,6 @@ ALIASES                = "type{1}=<b> \1 </b>:" \
                          "codeCoverageIgnore=" \
                          "codingStandardsIgnoreEnd=" \
                          "codingStandardsIgnoreStart=" \
-                         "covers=" \
-                         "dataProvider=" \
-                         "expectedException=" \
-                         "expectedExceptionMessage=" \
-                         "group=" \
                          "phan=" \
                          "suppress="
 TCL_SUBST              =
@@ -112,8 +107,8 @@ SORT_GROUP_NAMES       = NO
 SORT_BY_SCOPE_NAME     = NO
 STRICT_PROTO_MATCHING  = NO
 GENERATE_TODOLIST      = YES
-GENERATE_TESTLIST      = YES
-GENERATE_BUGLIST       = YES
+GENERATE_TESTLIST      = NO
+GENERATE_BUGLIST       = NO
 GENERATE_DEPRECATEDLIST= YES
 ENABLED_SECTIONS       =
 MAX_INITIALIZER_LINES  = 30
index 6faeee8..98a2b59 100644 (file)
@@ -23,6 +23,8 @@
 
 require __DIR__ . '/../commandLine.inc';
 
+use Wikimedia\Rdbms\Database;
+
 /**
  * Maintenance script that upgrade for log_id/log_deleted fields in a
  * replication-safe way.
index 4cc52a4..60f3884 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 require_once __DIR__ . '/Maintenance.php';
 
index d4f9c2d..03035f7 100644 (file)
@@ -20,6 +20,7 @@
  *
  * @file
  * @ingroup Maintenance
+ * @phan-file-suppress PhanUndeclaredProperty Lots of custom properties
  */
 
 require_once __DIR__ . '/Maintenance.php';
index ca67c83..3b7ba63 100644 (file)
@@ -23,7 +23,7 @@
  * @ingroup Maintenance
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 require_once __DIR__ . '/Maintenance.php';
 
index 7a5e93e..7576781 100644 (file)
@@ -267,7 +267,7 @@ U+2B127𫄧|U+07D96綖|
 U+2B128𫄨|U+07D7A絺|
 U+2B137𫄷|U+07E76繶|
 U+2B138𫄸|U+07E81纁|
-U+2B1ED𫇭|U+0853F蔿|
+U+2B1ED𫇭|U+0848D蒍|U+0853F蔿|
 U+2B300𫌀|U+08940襀|
 U+2B363𫍣|U+08A77詷|
 U+2B36F𫍯|U+08AF4諴|
index e1016dc..43c7e61 100644 (file)
 聖吉斯納域斯     圣基茨和尼维斯
 聖克里斯多福及尼維斯 圣基茨和尼维斯
 聖文森及格瑞那丁       圣文森特和格林纳丁斯
+聖文森國   圣文森特和格林纳丁斯
 聖馬利諾   圣马力诺
 蓋亞那      圭亚那
 坦尚尼亞   坦桑尼亚
 提比里西   第比利斯
 巴斯拉      巴士拉
 杜拜 迪拜
+喬治亞字母        格鲁吉亚字母
 坚杜拜      坚杜拜
 堅杜拜      坚杜拜
 賽普勒斯   塞浦路斯
@@ -2728,3 +2730,7 @@ A型肝炎        甲型肝炎
 普立茲獎   普利策奖
 富比士      福布斯
 聖多美普林西比  圣多美和普林西比
+札格瑞布   萨格勒布
+溫荷克      温得和克
+普利托利亞        比勒陀利亚
+阿迪斯阿貝巴     亚的斯亚贝巴
\ No newline at end of file
index 915050b..1eaa387 100644 (file)
 镇里 鎮裏
 》里 》裏
 空里 空裏
+牢里 牢裏
 版本里      版本裏
 苑裡 苑裡
 霄裡 霄裡
 軟體動物   軟體動物
 軟體家具   軟體家具
 網路 網絡
+全角 全形
+全角度      全角度
+全角色      全角色
 人工智慧   人工智能
 航天飞机   穿梭機
 太空梭      穿梭機
 圣基茨和尼维斯  聖吉斯納域斯
 聖克里斯多福及尼維斯 聖吉斯納域斯
 聖文森及格瑞那丁       聖文森特和格林納丁斯
+聖文森國   聖文森特和格林納丁斯
 聖馬利諾   聖馬力諾
 蓋亞那      圭亞那
 坦尚尼亞   坦桑尼亞
 西臺人      赫梯人
 阿联酋      阿聯酋
 迪拜 杜拜
-格鲁吉亚   格魯吉亞
+喬治亞字母        格魯吉亞字母
 提比里西   第比利斯
 諾鲁 瑙魯
 玻里尼西亞        波利尼西亞
@@ -3092,3 +3097,7 @@ IP地址  IP位址
 普利策奖   普立茲獎
 聖多美普林西比  聖多美和普林西比
 塔希提      大溪地
+札格瑞布   薩格勒布
+溫荷克      溫得和克
+普利托利亞        比勒陀利亞
+阿迪斯阿貝巴     亞的斯亞貝巴
\ No newline at end of file
index 6329133..45fef1d 100644 (file)
 高陞 高升
 晉陞 晋升
 歷陞 历升
+尋陞 寻升
 官陞 官升
 榮陞 荣升
 又陞 又升
index 6b5ecdd..39fd1f3 100644 (file)
 三極管      三極體
 软件 軟體
 軟件 軟體
+全角 全形
+全角度      全角度
+全角色      全角色
 人工智能   人工智慧
 航天飞机   太空梭
 穿梭機      太空梭
 布隆迪      蒲隆地
 帕劳 帛琉
 意大利      義大利
+意大利面   義大利麵
 所罗门群岛        索羅門群島
 所羅門群島        索羅門群島
 文莱 汶萊
@@ -808,6 +812,7 @@ IP地址    IP位址
 残奥会      帕運會
 殘奧會      帕運會
 残疾人奥林匹克  帕拉林匹克
+殘疾人奧林匹克  帕拉林匹克
 不列颠哥伦比亚省       卑詩省
 登巴萨      丹帕沙
 登巴薩      丹帕沙
@@ -824,6 +829,12 @@ IP地址   IP位址
 格林納丁斯        格瑞那丁
 空中客车   空中巴士
 普利策奖   普立茲獎
-圣多美和普林西比       聖多美普林西比
-聖多美和普林西比       聖多美普林西比
+多美和普林西比  多美普林西比 #聖多美普林西比
 塔希提      大溪地
+萨格勒布   札格瑞布
+薩格勒布   札格瑞布
+温得和克   溫荷克
+溫得和克   溫荷克
+比勒陀利   普利托利 #普利托利亚
+亚的斯亚贝巴     阿迪斯阿貝巴
+亞的斯亞貝巴     阿迪斯阿貝巴
index 78b5a73..8bd2665 100644 (file)
@@ -6,6 +6,7 @@
 ’m   ’m
 ’t   ’t
 ’re  ’re
+𬞟   蘋
 手塚治虫   手塚治虫
 寇仇 寇讎
 往日无仇   往日無讎
@@ -78,6 +79,7 @@
 乾象曆      乾象曆
 乾象历      乾象曆
 不好干預   不好干預
+可能干預   可能干預
 范文瀾      范文瀾
 機械系      機械系
 頂多 頂多
@@ -97,6 +99,7 @@
 于帥 于帥
 于濤 于濤
 于贈 于贈
+于闐 于闐
 于會泳      于會泳
 于偉國      于偉國
 于光遠      于光遠
 于學忠      于學忠
 于小偉      于小偉
 于山國      于山國
+于山島      于山島
 于幼軍      于幼軍
 于廣洲      于廣洲
 于從濂      于從濂
 更钟情      更鍾情
 更钟爱      更鍾愛
 更钟意      更鍾意
+温嵐 温嵐
index 74064bb..5c30eb8 100644 (file)
@@ -586,6 +586,7 @@ U+08432萲|U+08431萱|
 U+08457著|U+08457著|U+07740着|
 U+08460葠|U+053C2参|
 U+0846F葯|U+0836F药|
+U+0848D蒍|U+2B1ED𫇭|
 U+08493蒓|U+083BC莼|
 U+084C6蓆|U+05E2D席|
 U+084E1蓡|U+053C2参|
index 2cf35ba..522ae31 100644 (file)
 併為一家
 併吞
 並吞下
+入侵並 #分詞用
 提摩太後書
 裏海
 不採
 捲葉蛾
 捲尾猴
 捲積雲
+被捲回
 夸父
 夸克
 夸特
 伊府麵
 藥麵兒
 意大利麵
+意大利面臨
 湯下麵
 茶麵
 麵團
 鹹豬
 甜鹹
 鹹甜
+鹹吃
 甜、鹹
 鹹、甜
 錦綉花園
 幹仗
 包幹
 幹過
+大幹一
 李連杰
 周杰
 杰倫
 不占算
 不好干涉
 不好干預
+可能干預
 不斗膽
 不每只
 不采聲
 詞裡
 》裡
 空裡
+牢裡
 版本裡
 裏白 #植物常用名
 烏蘇里 #分詞用
 于衡
 于贈
 于越
+於越南
 于靖
 于勒
 于格
+於格林
 鳳凰于飛
 于仁泰
 于會泳
 于小偉
 于小彤
 于山國
+于山島
 于幼軍
 于廣洲
 于康震
 關系科
 銹病
 嚐糞
+温嵐
index f600f13..4401ea8 100644 (file)
@@ -120,10 +120,17 @@ class MWDocGen extends Maintenance {
                        'resources/lib',
                        'images',
                        'static',
+                       'tests',
+                       'includes/libs/Message/README.md',
+                       'includes/libs/objectcache/README.md',
+                       'includes/libs/ParamValidator/README.md',
+                       'maintenance/benchmarks/README.md',
+                       'resources/src/mediawiki.ui/styleguide.md',
                ];
                $this->excludePatterns = [];
                if ( $this->hasOption( 'no-extensions' ) ) {
                        $this->excludePatterns[] = 'extensions';
+                       $this->excludePatterns[] = 'skins';
                }
 
                $this->doDot = shell_exec( 'which dot' );
index e48b6ab..1e73540 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\Rdbms\IDatabase;
 
 require_once __DIR__ . '/Maintenance.php';
index fddac8a..ec759da 100644 (file)
@@ -26,7 +26,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 require_once __DIR__ . '/dumpIterator.php';
 
index 3f48abb..c1170fc 100644 (file)
@@ -22,7 +22,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\Rdbms\IDatabase;
 
 require_once __DIR__ . '/Maintenance.php';
index 038ef23..5f7f9d5 100644 (file)
@@ -36,7 +36,7 @@ use Wikimedia\Rdbms\IMaintainableDatabase;
  */
 class UserDupes {
        /**
-        * @var Database
+        * @var IMaintainableDatabase
         */
        private $db;
        private $reassigned;
index 1388128..c414c7b 100644 (file)
@@ -162,10 +162,6 @@ return [
                ],
                'targets' => [ 'mobile', 'desktop' ],
        ],
-       'jquery.checkboxShiftClick' => [
-               'scripts' => 'resources/src/jquery/jquery.checkboxShiftClick.js',
-               'targets' => [ 'desktop', 'mobile' ],
-       ],
        'jquery.chosen' => [
                'scripts' => 'resources/lib/jquery.chosen/chosen.jquery.js',
                'styles' => 'resources/lib/jquery.chosen/chosen.css',
@@ -175,11 +171,10 @@ return [
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'jquery.color' => [
-               'scripts' => 'resources/src/jquery/jquery.color.js',
-               'dependencies' => 'jquery.colorUtil',
-       ],
-       'jquery.colorUtil' => [
-               'scripts' => 'resources/src/jquery/jquery.colorUtil.js',
+               'scripts' => [
+                       'resources/src/jquery.color/jquery.colorUtil.js',
+                       'resources/src/jquery.color/jquery.color.js',
+               ],
        ],
        'jquery.confirmable' => [
                'scripts' => [
@@ -895,6 +890,7 @@ return [
                'dependencies' => [
                        'mediawiki.api',
                        'oojs',
+                       'mediawiki.Uri',
                ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
@@ -940,6 +936,9 @@ return [
                'scripts' => [
                        'resources/src/mediawiki.htmlform.checker.js',
                ],
+               'dependencies' => [
+                       'mediawiki.util',
+               ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.htmlform.ooui' => [
@@ -1252,8 +1251,8 @@ return [
                ]
        ],
        'mediawiki.util' => [
-               'localBasePath' => "$IP/resources/src/mediawiki.util/",
-               'remoteBasePath' => "$wgResourceBasePath/resources/src/mediawiki.util/",
+               'localBasePath' => "$IP/resources/src/mediawiki.util",
+               'remoteBasePath' => "$wgResourceBasePath/resources/src/mediawiki.util",
                'packageFiles' => [
                        'util.js',
                        'jquery.accessKeyLabel.js',
@@ -1660,9 +1659,13 @@ return [
                ]
        ],
        'mediawiki.page.ready' => [
-               'scripts' => 'resources/src/mediawiki.page.ready.js',
+               'localBasePath' => "$IP/resources/src/mediawiki.page.ready",
+               'remoteBasePath' => "$wgResourceBasePath/resources/src/mediawiki.page.ready",
+               'packageFiles' => [
+                       'ready.js',
+                       'checkboxShift.js',
+               ],
                'dependencies' => [
-                       'jquery.checkboxShiftClick',
                        'mediawiki.util',
                        'mediawiki.notify',
                        'mediawiki.api'
@@ -2313,7 +2316,6 @@ return [
                'dependencies' => [
                        'mediawiki.api',
                        'mediawiki.jqueryMsg',
-                       'jquery.throttle-debounce',
                        'mediawiki.htmlform.checker',
                ],
        ],
index 9ab1b49..5db52a4 100644 (file)
@@ -253,8 +253,8 @@ oojs-router:
 
 ooui:
   type: tar
-  src: https://registry.npmjs.org/oojs-ui/-/oojs-ui-0.34.0.tgz
-  integrity: sha384-DVG3XayKF02r0rqXSJUEWJImcK8XJeiIVC/Ii5R20cINYpTaAs+x4rdCU52VaKKw
+  src: https://registry.npmjs.org/oojs-ui/-/oojs-ui-0.34.1.tgz
+  integrity: sha384-QXYp5vK60xpu4nkv/JStszI6U4TYGCNe7uXb5rYb7FYURLTR41mtNO74gl7HXgpz
 
   dest:
     # Main stuff
index 9408e9b..501b768 100644 (file)
@@ -1,4 +1,16 @@
 # OOUI Release History
+## v0.34.1 / 2019-09-10
+### Deprecating changes
+* [DEPRECATING CHANGE] icons: Rename 'beaker' to 'labFlask' (Volker E.)
+
+### Styles
+* icons: Add 'userGroup' (Volker E.)
+
+### Code
+* Wrap long strings in popups (Sam Wilson)
+* demos: Add missing file to PHP demo to fix infusion (Bartosz Dziewoński)
+
+
 ## v0.34.0 / 2019-09-04
 ### Breaking changes
 * [BREAKING CHANGE] Use OOjs v3.0.0, up from v2.2.2 (James D. Forrester)
index 6bfe4d6..8595f61 100644 (file)
        "ooui-item-remove": "Supprimer",
        "ooui-dialog-message-accept": "OK",
        "ooui-dialog-message-reject": "Annuler",
-       "ooui-dialog-process-error": "Quelque chose s'est mal passé",
+       "ooui-dialog-process-error": "Quelque chose sest mal passé",
        "ooui-dialog-process-dismiss": "Fermer",
        "ooui-dialog-process-retry": "Réessayer",
        "ooui-dialog-process-continue": "Continuer",
-       "ooui-combobox-button-label": "Liste déroulante de combobox",
+       "ooui-combobox-button-label": "Liste déroulante pour boîte de saisie",
        "ooui-selectfile-button-select": "Sélectionner un fichier",
        "ooui-selectfile-not-supported": "La sélection de fichier n’est pas prise en charge",
        "ooui-selectfile-placeholder": "Aucun fichier sélectionné",
index affc066..d13cb45 100644 (file)
@@ -18,7 +18,8 @@
                        "Gloria sah",
                        "Andrzej aa",
                        "The Polish",
-                       "Railfail536"
+                       "Railfail536",
+                       "Rail"
                ]
        },
        "ooui-outline-control-move-down": "Przesuń w dół",
index d48a492..667f11e 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.34.0-pre (d5e74518ab)
+ * OOUI v0.34.1-pre (3913589098)
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-09-04T18:28:52Z
+ * Date: 2019-09-10T23:46:03Z
  */
 ( function ( OO ) {
 
index bb58190..e06ece0 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.34.0-pre (d5e74518ab)
+ * OOUI v0.34.1-pre (3913589098)
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-09-04T18:28:59Z
+ * Date: 2019-09-10T23:46:11Z
  */
 .oo-ui-element-hidden {
   display: none !important;
@@ -917,6 +917,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-popupWidget-popup {
   position: relative;
   overflow: hidden;
+  word-wrap: break-word;
+  overflow-wrap: break-word;
 }
 .oo-ui-popupWidget-anchor {
   display: none;
index cfbf7d6..d4eaea5 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.34.0-pre (d5e74518ab)
+ * OOUI v0.34.1-pre (3913589098)
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-09-04T18:28:59Z
+ * Date: 2019-09-10T23:46:11Z
  */
 .oo-ui-element-hidden {
   display: none !important;
@@ -1059,6 +1059,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-popupWidget-popup {
   position: relative;
   overflow: hidden;
+  word-wrap: break-word;
+  overflow-wrap: break-word;
 }
 .oo-ui-popupWidget-anchor {
   display: none;
index 11e132e..9754fb8 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.34.0-pre (d5e74518ab)
+ * OOUI v0.34.1-pre (3913589098)
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-09-04T18:28:52Z
+ * Date: 2019-09-10T23:46:03Z
  */
 ( function ( OO ) {
 
index fda6a81..768d107 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.34.0-pre (d5e74518ab)
+ * OOUI v0.34.1-pre (3913589098)
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-09-04T18:28:59Z
+ * Date: 2019-09-10T23:46:11Z
  */
 .oo-ui-tool > .oo-ui-tool-link > .oo-ui-tool-checkIcon {
   display: none;
index c011942..5e8b9c9 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.34.0-pre (d5e74518ab)
+ * OOUI v0.34.1-pre (3913589098)
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-09-04T18:28:59Z
+ * Date: 2019-09-10T23:46:11Z
  */
 .oo-ui-tool {
   -webkit-box-sizing: border-box;
index 000b9eb..e8a571e 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.34.0-pre (d5e74518ab)
+ * OOUI v0.34.1-pre (3913589098)
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-09-04T18:28:52Z
+ * Date: 2019-09-10T23:46:03Z
  */
 ( function ( OO ) {
 
index 854d8e3..f94e98b 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.34.0-pre (d5e74518ab)
+ * OOUI v0.34.1-pre (3913589098)
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-09-04T18:28:59Z
+ * Date: 2019-09-10T23:46:11Z
  */
 .oo-ui-draggableElement-handle:not( .oo-ui-draggableElement-undraggable ).oo-ui-widget {
   cursor: move;
index 73da6f8..8bc82a8 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.34.0-pre (d5e74518ab)
+ * OOUI v0.34.1-pre (3913589098)
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-09-04T18:28:59Z
+ * Date: 2019-09-10T23:46:11Z
  */
 .oo-ui-draggableElement-handle:not( .oo-ui-draggableElement-undraggable ).oo-ui-widget {
   cursor: move;
index bdf0d2f..7afac69 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.34.0-pre (d5e74518ab)
+ * OOUI v0.34.1-pre (3913589098)
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-09-04T18:28:52Z
+ * Date: 2019-09-10T23:46:03Z
  */
 ( function ( OO ) {
 
index 75f1acd..5355835 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.34.0-pre (d5e74518ab)
+ * OOUI v0.34.1-pre (3913589098)
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-09-04T18:28:52Z
+ * Date: 2019-09-10T23:46:03Z
  */
 ( function ( OO ) {
 
index 8ac442f..5a11914 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.34.0-pre (d5e74518ab)
+ * OOUI v0.34.1-pre (3913589098)
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-09-04T18:28:59Z
+ * Date: 2019-09-10T23:46:11Z
  */
 
 .oo-ui-window {
index e406188..b1a067b 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.34.0-pre (d5e74518ab)
+ * OOUI v0.34.1-pre (3913589098)
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-09-04T18:28:59Z
+ * Date: 2019-09-10T23:46:11Z
  */
 
 .oo-ui-window {
index 8885525..d8db8d1 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.34.0-pre (d5e74518ab)
+ * OOUI v0.34.1-pre (3913589098)
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-09-04T18:28:52Z
+ * Date: 2019-09-10T23:46:03Z
  */
 ( function ( OO ) {
 
index 732d70f..516dc08 100644 (file)
@@ -15,7 +15,8 @@
                        "file": "../wikimediaui/images/icons/attachment.svg"
                },
                "beaker": {
-                       "file": "../wikimediaui/images/icons/beaker.svg"
+                       "file": "../wikimediaui/images/icons/labFlask.svg",
+                       "deprecated": "Renamed since v0.34.1, use 'labFlask' instead."
                },
                "calendar": {
                        "file": "../wikimediaui/images/icons/calendar.svg"
@@ -38,6 +39,9 @@
                "imageLayoutThumbnail": {
                        "file": "../wikimediaui/images/icons/imageLayoutThumbnail.svg"
                },
+               "labFlask": {
+                       "file": "../wikimediaui/images/icons/labFlask.svg"
+               },
                "language": {
                        "file": "../wikimediaui/images/icons/language.svg"
                },
index e13bb1d..de7a118 100644 (file)
                "userAvatarOutline": {
                        "file": "../wikimediaui/images/icons/userAvatarOutline.svg"
                },
+               "userGroup": {
+                       "file": {
+                               "ltr": "../wikimediaui/images/icons/userGroup-ltr.svg",
+                               "rtl": "../wikimediaui/images/icons/userGroup-rtl.svg"
+                       }
+               },
                "userTalk": {
                        "file": {
                                "ltr": "../wikimediaui/images/icons/userTalk-ltr.svg",
index 4f4fd4e..23dd607 100644 (file)
@@ -38,7 +38,8 @@
                        "file": "images/icons/attachment.svg"
                },
                "beaker": {
-                       "file": "images/icons/beaker.svg"
+                       "file": "images/icons/labFlask.svg",
+                       "deprecated": "Renamed since v0.34.1, use 'labFlask' instead."
                },
                "calendar": {
                        "file": "images/icons/calendar.svg"
@@ -61,6 +62,9 @@
                "imageLayoutThumbnail": {
                        "file": "images/icons/imageLayoutThumbnail.svg"
                },
+               "labFlask": {
+                       "file": "images/icons/labFlask.svg"
+               },
                "language": {
                        "file": "images/icons/language.svg"
                },
index 7266d34..5a382ce 100644 (file)
                "userAvatarOutline": {
                        "file": "images/icons/userAvatarOutline.svg"
                },
+               "userGroup": {
+                       "file": {
+                               "ltr": "images/icons/userGroup-ltr.svg",
+                               "rtl": "images/icons/userGroup-rtl.svg"
+                       }
+               },
                "userTalk": {
                        "file": {
                                "ltr": "images/icons/userTalk-ltr.svg",
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/beaker-invert.png b/resources/lib/ooui/themes/wikimediaui/images/icons/beaker-invert.png
deleted file mode 100644 (file)
index 89d2d3d..0000000
Binary files a/resources/lib/ooui/themes/wikimediaui/images/icons/beaker-invert.png and /dev/null differ
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/beaker-invert.svg b/resources/lib/ooui/themes/wikimediaui/images/icons/beaker-invert.svg
deleted file mode 100644 (file)
index c031daf..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
-       <title>
-               beaker
-       </title><g fill="#fff">
-       <path d="M13 7.61V3h1V1H6v2h1v4.61l-5.86 9.88A1 1 0 0 0 2 19h16a1 1 0 0 0 .86-1.51zm-4.2.88a1 1 0 0 0 .2-.6V3h2v4.89a1 1 0 0 0 .14.51l2.14 3.6H6.72z"/>
-</g></svg>
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/beaker-progressive.png b/resources/lib/ooui/themes/wikimediaui/images/icons/beaker-progressive.png
deleted file mode 100644 (file)
index 78736ac..0000000
Binary files a/resources/lib/ooui/themes/wikimediaui/images/icons/beaker-progressive.png and /dev/null differ
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/beaker-progressive.svg b/resources/lib/ooui/themes/wikimediaui/images/icons/beaker-progressive.svg
deleted file mode 100644 (file)
index 1f8efbd..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
-       <title>
-               beaker
-       </title><g fill="#36c">
-       <path d="M13 7.61V3h1V1H6v2h1v4.61l-5.86 9.88A1 1 0 0 0 2 19h16a1 1 0 0 0 .86-1.51zm-4.2.88a1 1 0 0 0 .2-.6V3h2v4.89a1 1 0 0 0 .14.51l2.14 3.6H6.72z"/>
-</g></svg>
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/beaker.png b/resources/lib/ooui/themes/wikimediaui/images/icons/beaker.png
deleted file mode 100644 (file)
index 63a1a80..0000000
Binary files a/resources/lib/ooui/themes/wikimediaui/images/icons/beaker.png and /dev/null differ
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/beaker.svg b/resources/lib/ooui/themes/wikimediaui/images/icons/beaker.svg
deleted file mode 100644 (file)
index 7a37c5a..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
-       <title>
-               beaker
-       </title>
-       <path d="M13 7.61V3h1V1H6v2h1v4.61l-5.86 9.88A1 1 0 0 0 2 19h16a1 1 0 0 0 .86-1.51zm-4.2.88a1 1 0 0 0 .2-.6V3h2v4.89a1 1 0 0 0 .14.51l2.14 3.6H6.72z"/>
-</svg>
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/labFlask-invert.png b/resources/lib/ooui/themes/wikimediaui/images/icons/labFlask-invert.png
new file mode 100644 (file)
index 0000000..89d2d3d
Binary files /dev/null and b/resources/lib/ooui/themes/wikimediaui/images/icons/labFlask-invert.png differ
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/labFlask-invert.svg b/resources/lib/ooui/themes/wikimediaui/images/icons/labFlask-invert.svg
new file mode 100644 (file)
index 0000000..bfb66da
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+       <title>
+               laboratory flask
+       </title><g fill="#fff">
+       <path d="M13 7.61V3h1V1H6v2h1v4.61l-5.86 9.88A1 1 0 0 0 2 19h16a1 1 0 0 0 .86-1.51zm-4.2.88a1 1 0 0 0 .2-.6V3h2v4.89a1 1 0 0 0 .14.51l2.14 3.6H6.72z"/>
+</g></svg>
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/labFlask-progressive.png b/resources/lib/ooui/themes/wikimediaui/images/icons/labFlask-progressive.png
new file mode 100644 (file)
index 0000000..78736ac
Binary files /dev/null and b/resources/lib/ooui/themes/wikimediaui/images/icons/labFlask-progressive.png differ
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/labFlask-progressive.svg b/resources/lib/ooui/themes/wikimediaui/images/icons/labFlask-progressive.svg
new file mode 100644 (file)
index 0000000..1db0d6b
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+       <title>
+               laboratory flask
+       </title><g fill="#36c">
+       <path d="M13 7.61V3h1V1H6v2h1v4.61l-5.86 9.88A1 1 0 0 0 2 19h16a1 1 0 0 0 .86-1.51zm-4.2.88a1 1 0 0 0 .2-.6V3h2v4.89a1 1 0 0 0 .14.51l2.14 3.6H6.72z"/>
+</g></svg>
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/labFlask.png b/resources/lib/ooui/themes/wikimediaui/images/icons/labFlask.png
new file mode 100644 (file)
index 0000000..63a1a80
Binary files /dev/null and b/resources/lib/ooui/themes/wikimediaui/images/icons/labFlask.png differ
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/labFlask.svg b/resources/lib/ooui/themes/wikimediaui/images/icons/labFlask.svg
new file mode 100644 (file)
index 0000000..c95a51a
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+       <title>
+               laboratory flask
+       </title>
+       <path d="M13 7.61V3h1V1H6v2h1v4.61l-5.86 9.88A1 1 0 0 0 2 19h16a1 1 0 0 0 .86-1.51zm-4.2.88a1 1 0 0 0 .2-.6V3h2v4.89a1 1 0 0 0 .14.51l2.14 3.6H6.72z"/>
+</svg>
index 3b5187d..268dc30 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
        <title>
                user avatar
index 047a18c..681a468 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
        <title>
                user avatar
index 7608cd2..8236235 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
        <title>
                user avatar
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr-invert.png b/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr-invert.png
new file mode 100644 (file)
index 0000000..bc9c111
Binary files /dev/null and b/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr-invert.png differ
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr-invert.svg b/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr-invert.svg
new file mode 100644 (file)
index 0000000..d05ad38
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+       <title>
+               user group
+       </title><g fill="#fff">
+       <path d="M14 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zM6 3c1.66 0 3 1.34 3 3S7.66 9 6 9 3 7.66 3 6s1.34-3 3-3zm8 7c3.31 0 6 1.79 6 4v2h-6v-2c0-1.48-1.21-2.77-3-3.46.88-.35 1.91-.54 3-.54zm-8 0c3.31 0 6 1.79 6 4v2H0v-2c0-2.21 2.69-4 6-4z"/>
+</g></svg>
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr-progressive.png b/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr-progressive.png
new file mode 100644 (file)
index 0000000..5cd3d1c
Binary files /dev/null and b/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr-progressive.png differ
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr-progressive.svg b/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr-progressive.svg
new file mode 100644 (file)
index 0000000..71d354a
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+       <title>
+               user group
+       </title><g fill="#36c">
+       <path d="M14 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zM6 3c1.66 0 3 1.34 3 3S7.66 9 6 9 3 7.66 3 6s1.34-3 3-3zm8 7c3.31 0 6 1.79 6 4v2h-6v-2c0-1.48-1.21-2.77-3-3.46.88-.35 1.91-.54 3-.54zm-8 0c3.31 0 6 1.79 6 4v2H0v-2c0-2.21 2.69-4 6-4z"/>
+</g></svg>
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr.png b/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr.png
new file mode 100644 (file)
index 0000000..43c0be2
Binary files /dev/null and b/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr.png differ
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr.svg b/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr.svg
new file mode 100644 (file)
index 0000000..248d056
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+       <title>
+               user group
+       </title>
+       <path d="M14 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zM6 3c1.66 0 3 1.34 3 3S7.66 9 6 9 3 7.66 3 6s1.34-3 3-3zm8 7c3.31 0 6 1.79 6 4v2h-6v-2c0-1.48-1.21-2.77-3-3.46.88-.35 1.91-.54 3-.54zm-8 0c3.31 0 6 1.79 6 4v2H0v-2c0-2.21 2.69-4 6-4z"/>
+</svg>
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl-invert.png b/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl-invert.png
new file mode 100644 (file)
index 0000000..2147e81
Binary files /dev/null and b/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl-invert.png differ
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl-invert.svg b/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl-invert.svg
new file mode 100644 (file)
index 0000000..5604358
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+       <title>
+               user group
+       </title><g fill="#fff">
+       <path d="M6 3C4.34 3 3 4.34 3 6s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3zm8 0c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3zm-8 7c-3.31 0-6 1.79-6 4v2h6v-2c0-1.48 1.21-2.77 3-3.46-.88-.35-1.91-.54-3-.54zm8 0c-3.31 0-6 1.79-6 4v2h12v-2c0-2.21-2.69-4-6-4z"/>
+</g></svg>
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl-progressive.png b/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl-progressive.png
new file mode 100644 (file)
index 0000000..d9082d3
Binary files /dev/null and b/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl-progressive.png differ
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl-progressive.svg b/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl-progressive.svg
new file mode 100644 (file)
index 0000000..75436e9
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+       <title>
+               user group
+       </title><g fill="#36c">
+       <path d="M6 3C4.34 3 3 4.34 3 6s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3zm8 0c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3zm-8 7c-3.31 0-6 1.79-6 4v2h6v-2c0-1.48 1.21-2.77 3-3.46-.88-.35-1.91-.54-3-.54zm8 0c-3.31 0-6 1.79-6 4v2h12v-2c0-2.21-2.69-4-6-4z"/>
+</g></svg>
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl.png b/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl.png
new file mode 100644 (file)
index 0000000..4eedd2e
Binary files /dev/null and b/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl.png differ
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl.svg b/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl.svg
new file mode 100644 (file)
index 0000000..5bd5bf5
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+       <title>
+               user group
+       </title>
+       <path d="M6 3C4.34 3 3 4.34 3 6s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3zm8 0c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3zm-8 7c-3.31 0-6 1.79-6 4v2h6v-2c0-1.48 1.21-2.77 3-3.46-.88-.35-1.91-.54-3-.54zm8 0c-3.31 0-6 1.79-6 4v2h12v-2c0-2.21-2.69-4-6-4z"/>
+</svg>
diff --git a/resources/src/jquery.color/jquery.color.js b/resources/src/jquery.color/jquery.color.js
new file mode 100644 (file)
index 0000000..6df02ad
--- /dev/null
@@ -0,0 +1,55 @@
+/**
+ * jQuery Color Animations
+ *
+ * @author John Resig, 2007
+ * @author Krinkle, 2011
+ * Released under the MIT and GPL licenses.
+ *
+ * - 2011-01-05: Forked for MediaWiki. See also jQuery.colorUtil plugin
+ */
+( function () {
+
+       function getColor( elem, attr ) {
+               var color;
+
+               do {
+                       color = $.css( elem, attr );
+
+                       // Keep going until we find an element that has color, or we hit the body
+                       if ( color !== '' && color !== 'transparent' || elem.nodeName.toLowerCase() === 'body' ) {
+                               break;
+                       }
+
+                       attr = 'backgroundColor';
+               // eslint-disable-next-line no-cond-assign
+               } while ( elem = elem.parentNode );
+
+               return $.colorUtil.getRGB( color );
+       }
+
+       // We override the animation for all of these color styles
+       [
+               'backgroundColor',
+               'borderBottomColor',
+               'borderLeftColor',
+               'borderRightColor',
+               'borderTopColor',
+               'color',
+               'outlineColor'
+       ].forEach( function ( attr ) {
+               $.fx.step[ attr ] = function ( fx ) {
+                       if ( !fx.colorInit ) {
+                               fx.start = getColor( fx.elem, attr );
+                               fx.end = $.colorUtil.getRGB( fx.end );
+                               fx.colorInit = true;
+                       }
+
+                       fx.elem.style[ attr ] = 'rgb(' + [
+                               Math.max( Math.min( parseInt( ( fx.pos * ( fx.end[ 0 ] - fx.start[ 0 ] ) ) + fx.start[ 0 ], 10 ), 255 ), 0 ),
+                               Math.max( Math.min( parseInt( ( fx.pos * ( fx.end[ 1 ] - fx.start[ 1 ] ) ) + fx.start[ 1 ], 10 ), 255 ), 0 ),
+                               Math.max( Math.min( parseInt( ( fx.pos * ( fx.end[ 2 ] - fx.start[ 2 ] ) ) + fx.start[ 2 ], 10 ), 255 ), 0 )
+                       ].join( ',' ) + ')';
+               };
+       } );
+
+}() );
diff --git a/resources/src/jquery.color/jquery.colorUtil.js b/resources/src/jquery.color/jquery.colorUtil.js
new file mode 100644 (file)
index 0000000..009be1a
--- /dev/null
@@ -0,0 +1,268 @@
+/*!
+ * jQuery Color Utilities
+ *
+ * Released under the MIT and GPL licenses.
+ *
+ * Mostly based on other plugins and functions (linted and optimized a little).
+ * Sources cited inline.
+ */
+( function () {
+       /**
+        * @class jQuery.colorUtil
+        * @singleton
+        */
+       $.colorUtil = {
+
+               /**
+                * Parse CSS color strings looking for color tuples
+                *
+                * Based on highlightFade by Blair Mitchelmore
+                * <http://jquery.offput.ca/highlightFade/>
+                *
+                * @param {Array|string} color
+                * @return {Array}
+                */
+               getRGB: function ( color ) {
+                       var result;
+
+                       // Check if we're already dealing with an array of colors
+                       if ( color && Array.isArray( color ) && color.length === 3 ) {
+                               return color;
+                       }
+                       if ( typeof color !== 'string' ) {
+                               return undefined;
+                       }
+
+                       // Look for rgb(num,num,num)
+                       // eslint-disable-next-line no-cond-assign
+                       if ( result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec( color ) ) {
+                               return [
+                                       parseInt( result[ 1 ], 10 ),
+                                       parseInt( result[ 2 ], 10 ),
+                                       parseInt( result[ 3 ], 10 )
+                               ];
+                       }
+
+                       // Look for rgb(num%,num%,num%)
+                       // eslint-disable-next-line no-cond-assign
+                       if ( result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)%\s*,\s*([0-9]+(?:\.[0-9]+)?)%\s*,\s*([0-9]+(?:\.[0-9]+)?)%\s*\)/.exec( color ) ) {
+                               return [
+                                       parseFloat( result[ 1 ] ) * 2.55,
+                                       parseFloat( result[ 2 ] ) * 2.55,
+                                       parseFloat( result[ 3 ] ) * 2.55
+                               ];
+                       }
+
+                       // Look for #a0b1c2
+                       // eslint-disable-next-line no-cond-assign
+                       if ( result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec( color ) ) {
+                               return [
+                                       parseInt( result[ 1 ], 16 ),
+                                       parseInt( result[ 2 ], 16 ),
+                                       parseInt( result[ 3 ], 16 )
+                               ];
+                       }
+
+                       // Look for #fff
+                       // eslint-disable-next-line no-cond-assign
+                       if ( result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec( color ) ) {
+                               return [
+                                       parseInt( result[ 1 ] + result[ 1 ], 16 ),
+                                       parseInt( result[ 2 ] + result[ 2 ], 16 ),
+                                       parseInt( result[ 3 ] + result[ 3 ], 16 )
+                               ];
+                       }
+
+                       // Look for rgba(0, 0, 0, 0) == transparent in Safari 3
+                       // eslint-disable-next-line no-cond-assign
+                       if ( result = /rgba\(0, 0, 0, 0\)/.exec( color ) ) {
+                               return $.colorUtil.colors.transparent;
+                       }
+
+                       // Otherwise, we're most likely dealing with a named color
+                       return $.colorUtil.colors[ color.trim().toLowerCase() ];
+               },
+
+               /**
+                * Named color map
+                *
+                * Based on Interface by Stefan Petre
+                * <http://interface.eyecon.ro/>
+                *
+                * @property {Object}
+                */
+               colors: {
+                       aqua: [ 0, 255, 255 ],
+                       azure: [ 240, 255, 255 ],
+                       beige: [ 245, 245, 220 ],
+                       black: [ 0, 0, 0 ],
+                       blue: [ 0, 0, 255 ],
+                       brown: [ 165, 42, 42 ],
+                       cyan: [ 0, 255, 255 ],
+                       darkblue: [ 0, 0, 139 ],
+                       darkcyan: [ 0, 139, 139 ],
+                       darkgrey: [ 169, 169, 169 ],
+                       darkgreen: [ 0, 100, 0 ],
+                       darkkhaki: [ 189, 183, 107 ],
+                       darkmagenta: [ 139, 0, 139 ],
+                       darkolivegreen: [ 85, 107, 47 ],
+                       darkorange: [ 255, 140, 0 ],
+                       darkorchid: [ 153, 50, 204 ],
+                       darkred: [ 139, 0, 0 ],
+                       darksalmon: [ 233, 150, 122 ],
+                       darkviolet: [ 148, 0, 211 ],
+                       fuchsia: [ 255, 0, 255 ],
+                       gold: [ 255, 215, 0 ],
+                       green: [ 0, 128, 0 ],
+                       indigo: [ 75, 0, 130 ],
+                       khaki: [ 240, 230, 140 ],
+                       lightblue: [ 173, 216, 230 ],
+                       lightcyan: [ 224, 255, 255 ],
+                       lightgreen: [ 144, 238, 144 ],
+                       lightgrey: [ 211, 211, 211 ],
+                       lightpink: [ 255, 182, 193 ],
+                       lightyellow: [ 255, 255, 224 ],
+                       lime: [ 0, 255, 0 ],
+                       magenta: [ 255, 0, 255 ],
+                       maroon: [ 128, 0, 0 ],
+                       navy: [ 0, 0, 128 ],
+                       olive: [ 128, 128, 0 ],
+                       orange: [ 255, 165, 0 ],
+                       pink: [ 255, 192, 203 ],
+                       purple: [ 128, 0, 128 ],
+                       violet: [ 128, 0, 128 ],
+                       red: [ 255, 0, 0 ],
+                       silver: [ 192, 192, 192 ],
+                       white: [ 255, 255, 255 ],
+                       yellow: [ 255, 255, 0 ],
+                       transparent: [ 255, 255, 255 ]
+               },
+
+               /**
+                * Convert an RGB color value to HSL.
+                *
+                * Conversion formula based on
+                * <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript>
+                *
+                * Adapted from <https://en.wikipedia.org/wiki/HSL_color_space>.
+                *
+                * Assumes `r`, `g`, and `b` are contained in the set `[0, 255]` and
+                * returns `h`, `s`, and `l` in the set `[0, 1]`.
+                *
+                * @param {number} r The red color value
+                * @param {number} g The green color value
+                * @param {number} b The blue color value
+                * @return {number[]} The HSL representation
+                */
+               rgbToHsl: function ( r, g, b ) {
+                       var d, h, s, l, min, max;
+
+                       r = r / 255;
+                       g = g / 255;
+                       b = b / 255;
+
+                       max = Math.max( r, g, b );
+                       min = Math.min( r, g, b );
+                       l = ( max + min ) / 2;
+
+                       if ( max === min ) {
+                               // achromatic
+                               h = s = 0;
+                       } else {
+                               d = max - min;
+                               s = l > 0.5 ? d / ( 2 - max - min ) : d / ( max + min );
+                               switch ( max ) {
+                                       case r:
+                                               h = ( g - b ) / d + ( g < b ? 6 : 0 );
+                                               break;
+                                       case g:
+                                               h = ( b - r ) / d + 2;
+                                               break;
+                                       case b:
+                                               h = ( r - g ) / d + 4;
+                                               break;
+                               }
+                               h /= 6;
+                       }
+
+                       return [ h, s, l ];
+               },
+
+               /**
+                * Convert an HSL color value to RGB.
+                *
+                * Conversion formula based on
+                * <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript>
+                *
+                * Adapted from <https://en.wikipedia.org/wiki/HSL_color_space>.
+                *
+                * Assumes `h`, `s`, and `l` are contained in the set `[0, 1]` and
+                * returns `r`, `g`, and `b` in the set `[0, 255]`.
+                *
+                * @param {number} h The hue
+                * @param {number} s The saturation
+                * @param {number} l The lightness
+                * @return {number[]} The RGB representation
+                */
+               hslToRgb: function ( h, s, l ) {
+                       var r, g, b, hue2rgb, q, p;
+
+                       if ( s === 0 ) {
+                               r = g = b = l; // achromatic
+                       } else {
+                               hue2rgb = function ( p, q, t ) {
+                                       if ( t < 0 ) {
+                                               t += 1;
+                                       }
+                                       if ( t > 1 ) {
+                                               t -= 1;
+                                       }
+                                       if ( t < 1 / 6 ) {
+                                               return p + ( q - p ) * 6 * t;
+                                       }
+                                       if ( t < 1 / 2 ) {
+                                               return q;
+                                       }
+                                       if ( t < 2 / 3 ) {
+                                               return p + ( q - p ) * ( 2 / 3 - t ) * 6;
+                                       }
+                                       return p;
+                               };
+
+                               q = l < 0.5 ? l * ( 1 + s ) : l + s - l * s;
+                               p = 2 * l - q;
+                               r = hue2rgb( p, q, h + 1 / 3 );
+                               g = hue2rgb( p, q, h );
+                               b = hue2rgb( p, q, h - 1 / 3 );
+                       }
+
+                       return [ r * 255, g * 255, b * 255 ];
+               },
+
+               /**
+                * Get a brighter or darker rgb() value string.
+                *
+                * Usage:
+                *
+                *     $.colorUtil.getColorBrightness( 'red', +0.1 );
+                *     // > "rgb(255,50,50)"
+                *     $.colorUtil.getColorBrightness( 'rgb(200,50,50)', -0.2 );
+                *     // > "rgb(118,29,29)"
+                *
+                * @param {Mixed} currentColor Current value in css
+                * @param {number} mod Wanted brightness modification between -1 and 1
+                * @return {string} Like `'rgb(r,g,b)'`
+                */
+               getColorBrightness: function ( currentColor, mod ) {
+                       var rgbArr = $.colorUtil.getRGB( currentColor ),
+                               hslArr = $.colorUtil.rgbToHsl( rgbArr[ 0 ], rgbArr[ 1 ], rgbArr[ 2 ] );
+                       rgbArr = $.colorUtil.hslToRgb( hslArr[ 0 ], hslArr[ 1 ], hslArr[ 2 ] + mod );
+
+                       return 'rgb(' +
+                               [ parseInt( rgbArr[ 0 ], 10 ), parseInt( rgbArr[ 1 ], 10 ), parseInt( rgbArr[ 2 ], 10 ) ].join( ',' ) +
+                               ')';
+               }
+
+       };
+
+}() );
diff --git a/resources/src/jquery/jquery.checkboxShiftClick.js b/resources/src/jquery/jquery.checkboxShiftClick.js
deleted file mode 100644 (file)
index 435e23f..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-/**
- * @class jQuery.plugin.checkboxShiftClick
- */
-( function () {
-
-       /**
-        * Enable checkboxes to be checked or unchecked in a row by clicking one,
-        * holding shift and clicking another one.
-        *
-        * @return {jQuery}
-        * @chainable
-        */
-       $.fn.checkboxShiftClick = function () {
-               var prevCheckbox = null,
-                       $box = this;
-               // When our boxes are clicked..
-               $box.on( 'click', function ( e ) {
-                       // And one has been clicked before...
-                       if ( prevCheckbox !== null && e.shiftKey ) {
-                               // Check or uncheck this one and all in-between checkboxes,
-                               // except for disabled ones
-                               $box
-                                       .slice(
-                                               Math.min( $box.index( prevCheckbox ), $box.index( e.target ) ),
-                                               Math.max( $box.index( prevCheckbox ), $box.index( e.target ) ) + 1
-                                       )
-                                       .filter( function () {
-                                               return !this.disabled;
-                                       } )
-                                       .prop( 'checked', !!e.target.checked );
-                       }
-                       // Either way, update the prevCheckbox variable to the one clicked now
-                       prevCheckbox = e.target;
-               } );
-               return $box;
-       };
-
-       /**
-        * @class jQuery
-        * @mixins jQuery.plugin.checkboxShiftClick
-        */
-
-}() );
diff --git a/resources/src/jquery/jquery.color.js b/resources/src/jquery/jquery.color.js
deleted file mode 100644 (file)
index 6df02ad..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
- * jQuery Color Animations
- *
- * @author John Resig, 2007
- * @author Krinkle, 2011
- * Released under the MIT and GPL licenses.
- *
- * - 2011-01-05: Forked for MediaWiki. See also jQuery.colorUtil plugin
- */
-( function () {
-
-       function getColor( elem, attr ) {
-               var color;
-
-               do {
-                       color = $.css( elem, attr );
-
-                       // Keep going until we find an element that has color, or we hit the body
-                       if ( color !== '' && color !== 'transparent' || elem.nodeName.toLowerCase() === 'body' ) {
-                               break;
-                       }
-
-                       attr = 'backgroundColor';
-               // eslint-disable-next-line no-cond-assign
-               } while ( elem = elem.parentNode );
-
-               return $.colorUtil.getRGB( color );
-       }
-
-       // We override the animation for all of these color styles
-       [
-               'backgroundColor',
-               'borderBottomColor',
-               'borderLeftColor',
-               'borderRightColor',
-               'borderTopColor',
-               'color',
-               'outlineColor'
-       ].forEach( function ( attr ) {
-               $.fx.step[ attr ] = function ( fx ) {
-                       if ( !fx.colorInit ) {
-                               fx.start = getColor( fx.elem, attr );
-                               fx.end = $.colorUtil.getRGB( fx.end );
-                               fx.colorInit = true;
-                       }
-
-                       fx.elem.style[ attr ] = 'rgb(' + [
-                               Math.max( Math.min( parseInt( ( fx.pos * ( fx.end[ 0 ] - fx.start[ 0 ] ) ) + fx.start[ 0 ], 10 ), 255 ), 0 ),
-                               Math.max( Math.min( parseInt( ( fx.pos * ( fx.end[ 1 ] - fx.start[ 1 ] ) ) + fx.start[ 1 ], 10 ), 255 ), 0 ),
-                               Math.max( Math.min( parseInt( ( fx.pos * ( fx.end[ 2 ] - fx.start[ 2 ] ) ) + fx.start[ 2 ], 10 ), 255 ), 0 )
-                       ].join( ',' ) + ')';
-               };
-       } );
-
-}() );
diff --git a/resources/src/jquery/jquery.colorUtil.js b/resources/src/jquery/jquery.colorUtil.js
deleted file mode 100644 (file)
index 009be1a..0000000
+++ /dev/null
@@ -1,268 +0,0 @@
-/*!
- * jQuery Color Utilities
- *
- * Released under the MIT and GPL licenses.
- *
- * Mostly based on other plugins and functions (linted and optimized a little).
- * Sources cited inline.
- */
-( function () {
-       /**
-        * @class jQuery.colorUtil
-        * @singleton
-        */
-       $.colorUtil = {
-
-               /**
-                * Parse CSS color strings looking for color tuples
-                *
-                * Based on highlightFade by Blair Mitchelmore
-                * <http://jquery.offput.ca/highlightFade/>
-                *
-                * @param {Array|string} color
-                * @return {Array}
-                */
-               getRGB: function ( color ) {
-                       var result;
-
-                       // Check if we're already dealing with an array of colors
-                       if ( color && Array.isArray( color ) && color.length === 3 ) {
-                               return color;
-                       }
-                       if ( typeof color !== 'string' ) {
-                               return undefined;
-                       }
-
-                       // Look for rgb(num,num,num)
-                       // eslint-disable-next-line no-cond-assign
-                       if ( result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec( color ) ) {
-                               return [
-                                       parseInt( result[ 1 ], 10 ),
-                                       parseInt( result[ 2 ], 10 ),
-                                       parseInt( result[ 3 ], 10 )
-                               ];
-                       }
-
-                       // Look for rgb(num%,num%,num%)
-                       // eslint-disable-next-line no-cond-assign
-                       if ( result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)%\s*,\s*([0-9]+(?:\.[0-9]+)?)%\s*,\s*([0-9]+(?:\.[0-9]+)?)%\s*\)/.exec( color ) ) {
-                               return [
-                                       parseFloat( result[ 1 ] ) * 2.55,
-                                       parseFloat( result[ 2 ] ) * 2.55,
-                                       parseFloat( result[ 3 ] ) * 2.55
-                               ];
-                       }
-
-                       // Look for #a0b1c2
-                       // eslint-disable-next-line no-cond-assign
-                       if ( result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec( color ) ) {
-                               return [
-                                       parseInt( result[ 1 ], 16 ),
-                                       parseInt( result[ 2 ], 16 ),
-                                       parseInt( result[ 3 ], 16 )
-                               ];
-                       }
-
-                       // Look for #fff
-                       // eslint-disable-next-line no-cond-assign
-                       if ( result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec( color ) ) {
-                               return [
-                                       parseInt( result[ 1 ] + result[ 1 ], 16 ),
-                                       parseInt( result[ 2 ] + result[ 2 ], 16 ),
-                                       parseInt( result[ 3 ] + result[ 3 ], 16 )
-                               ];
-                       }
-
-                       // Look for rgba(0, 0, 0, 0) == transparent in Safari 3
-                       // eslint-disable-next-line no-cond-assign
-                       if ( result = /rgba\(0, 0, 0, 0\)/.exec( color ) ) {
-                               return $.colorUtil.colors.transparent;
-                       }
-
-                       // Otherwise, we're most likely dealing with a named color
-                       return $.colorUtil.colors[ color.trim().toLowerCase() ];
-               },
-
-               /**
-                * Named color map
-                *
-                * Based on Interface by Stefan Petre
-                * <http://interface.eyecon.ro/>
-                *
-                * @property {Object}
-                */
-               colors: {
-                       aqua: [ 0, 255, 255 ],
-                       azure: [ 240, 255, 255 ],
-                       beige: [ 245, 245, 220 ],
-                       black: [ 0, 0, 0 ],
-                       blue: [ 0, 0, 255 ],
-                       brown: [ 165, 42, 42 ],
-                       cyan: [ 0, 255, 255 ],
-                       darkblue: [ 0, 0, 139 ],
-                       darkcyan: [ 0, 139, 139 ],
-                       darkgrey: [ 169, 169, 169 ],
-                       darkgreen: [ 0, 100, 0 ],
-                       darkkhaki: [ 189, 183, 107 ],
-                       darkmagenta: [ 139, 0, 139 ],
-                       darkolivegreen: [ 85, 107, 47 ],
-                       darkorange: [ 255, 140, 0 ],
-                       darkorchid: [ 153, 50, 204 ],
-                       darkred: [ 139, 0, 0 ],
-                       darksalmon: [ 233, 150, 122 ],
-                       darkviolet: [ 148, 0, 211 ],
-                       fuchsia: [ 255, 0, 255 ],
-                       gold: [ 255, 215, 0 ],
-                       green: [ 0, 128, 0 ],
-                       indigo: [ 75, 0, 130 ],
-                       khaki: [ 240, 230, 140 ],
-                       lightblue: [ 173, 216, 230 ],
-                       lightcyan: [ 224, 255, 255 ],
-                       lightgreen: [ 144, 238, 144 ],
-                       lightgrey: [ 211, 211, 211 ],
-                       lightpink: [ 255, 182, 193 ],
-                       lightyellow: [ 255, 255, 224 ],
-                       lime: [ 0, 255, 0 ],
-                       magenta: [ 255, 0, 255 ],
-                       maroon: [ 128, 0, 0 ],
-                       navy: [ 0, 0, 128 ],
-                       olive: [ 128, 128, 0 ],
-                       orange: [ 255, 165, 0 ],
-                       pink: [ 255, 192, 203 ],
-                       purple: [ 128, 0, 128 ],
-                       violet: [ 128, 0, 128 ],
-                       red: [ 255, 0, 0 ],
-                       silver: [ 192, 192, 192 ],
-                       white: [ 255, 255, 255 ],
-                       yellow: [ 255, 255, 0 ],
-                       transparent: [ 255, 255, 255 ]
-               },
-
-               /**
-                * Convert an RGB color value to HSL.
-                *
-                * Conversion formula based on
-                * <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript>
-                *
-                * Adapted from <https://en.wikipedia.org/wiki/HSL_color_space>.
-                *
-                * Assumes `r`, `g`, and `b` are contained in the set `[0, 255]` and
-                * returns `h`, `s`, and `l` in the set `[0, 1]`.
-                *
-                * @param {number} r The red color value
-                * @param {number} g The green color value
-                * @param {number} b The blue color value
-                * @return {number[]} The HSL representation
-                */
-               rgbToHsl: function ( r, g, b ) {
-                       var d, h, s, l, min, max;
-
-                       r = r / 255;
-                       g = g / 255;
-                       b = b / 255;
-
-                       max = Math.max( r, g, b );
-                       min = Math.min( r, g, b );
-                       l = ( max + min ) / 2;
-
-                       if ( max === min ) {
-                               // achromatic
-                               h = s = 0;
-                       } else {
-                               d = max - min;
-                               s = l > 0.5 ? d / ( 2 - max - min ) : d / ( max + min );
-                               switch ( max ) {
-                                       case r:
-                                               h = ( g - b ) / d + ( g < b ? 6 : 0 );
-                                               break;
-                                       case g:
-                                               h = ( b - r ) / d + 2;
-                                               break;
-                                       case b:
-                                               h = ( r - g ) / d + 4;
-                                               break;
-                               }
-                               h /= 6;
-                       }
-
-                       return [ h, s, l ];
-               },
-
-               /**
-                * Convert an HSL color value to RGB.
-                *
-                * Conversion formula based on
-                * <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript>
-                *
-                * Adapted from <https://en.wikipedia.org/wiki/HSL_color_space>.
-                *
-                * Assumes `h`, `s`, and `l` are contained in the set `[0, 1]` and
-                * returns `r`, `g`, and `b` in the set `[0, 255]`.
-                *
-                * @param {number} h The hue
-                * @param {number} s The saturation
-                * @param {number} l The lightness
-                * @return {number[]} The RGB representation
-                */
-               hslToRgb: function ( h, s, l ) {
-                       var r, g, b, hue2rgb, q, p;
-
-                       if ( s === 0 ) {
-                               r = g = b = l; // achromatic
-                       } else {
-                               hue2rgb = function ( p, q, t ) {
-                                       if ( t < 0 ) {
-                                               t += 1;
-                                       }
-                                       if ( t > 1 ) {
-                                               t -= 1;
-                                       }
-                                       if ( t < 1 / 6 ) {
-                                               return p + ( q - p ) * 6 * t;
-                                       }
-                                       if ( t < 1 / 2 ) {
-                                               return q;
-                                       }
-                                       if ( t < 2 / 3 ) {
-                                               return p + ( q - p ) * ( 2 / 3 - t ) * 6;
-                                       }
-                                       return p;
-                               };
-
-                               q = l < 0.5 ? l * ( 1 + s ) : l + s - l * s;
-                               p = 2 * l - q;
-                               r = hue2rgb( p, q, h + 1 / 3 );
-                               g = hue2rgb( p, q, h );
-                               b = hue2rgb( p, q, h - 1 / 3 );
-                       }
-
-                       return [ r * 255, g * 255, b * 255 ];
-               },
-
-               /**
-                * Get a brighter or darker rgb() value string.
-                *
-                * Usage:
-                *
-                *     $.colorUtil.getColorBrightness( 'red', +0.1 );
-                *     // > "rgb(255,50,50)"
-                *     $.colorUtil.getColorBrightness( 'rgb(200,50,50)', -0.2 );
-                *     // > "rgb(118,29,29)"
-                *
-                * @param {Mixed} currentColor Current value in css
-                * @param {number} mod Wanted brightness modification between -1 and 1
-                * @return {string} Like `'rgb(r,g,b)'`
-                */
-               getColorBrightness: function ( currentColor, mod ) {
-                       var rgbArr = $.colorUtil.getRGB( currentColor ),
-                               hslArr = $.colorUtil.rgbToHsl( rgbArr[ 0 ], rgbArr[ 1 ], rgbArr[ 2 ] );
-                       rgbArr = $.colorUtil.hslToRgb( hslArr[ 0 ], hslArr[ 1 ], hslArr[ 2 ] + mod );
-
-                       return 'rgb(' +
-                               [ parseInt( rgbArr[ 0 ], 10 ), parseInt( rgbArr[ 1 ], 10 ), parseInt( rgbArr[ 2 ], 10 ) ].join( ',' ) +
-                               ')';
-               }
-
-       };
-
-}() );
index 4b6313b..83ea0ce 100644 (file)
@@ -59,7 +59,6 @@
                                        }
                                },
                                parameters: {
-                                       // Add 'origin' query parameter to all requests.
                                        origin: this.getOrigin()
                                }
                        },
         * any).
         *
         * @protected
-        * @return {string}
+        * @return {string|undefined}
         */
        CoreForeignApi.prototype.getOrigin = function () {
-               var origin;
+               var origin, apiUri, apiOrigin;
                if ( this.anonymous ) {
                        return '*';
                }
+
                origin = location.protocol + '//' + location.hostname;
                if ( location.port ) {
                        origin += ':' + location.port;
                }
+
+               apiUri = new mw.Uri( this.apiUrl );
+               apiOrigin = apiUri.protocol + '://' + apiUri.getAuthority();
+               if ( origin === apiOrigin ) {
+                       // requests are not cross-origin, omit parameter
+                       return undefined;
+               }
+
                return origin;
        };
 
                if ( ajaxOptions.type === 'POST' ) {
                        url = ( ajaxOptions && ajaxOptions.url ) || this.defaults.ajax.url;
                        origin = ( parameters && parameters.origin ) || this.defaults.parameters.origin;
-                       url += ( url.indexOf( '?' ) !== -1 ? '&' : '?' ) +
-                               // 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' );
+                       if ( origin !== undefined ) {
+                               url += ( url.indexOf( '?' ) !== -1 ? '&' : '?' ) +
+                                       // 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 33207d4..473635a 100644 (file)
@@ -3,14 +3,6 @@
        // FIXME: mw.htmlform.Element also sets this to empty object
        mw.htmlform = {};
 
-       function debounce( delay, callback ) {
-               var timeout;
-               return function () {
-                       clearTimeout( timeout );
-                       timeout = setTimeout( Function.prototype.apply.bind( callback, this, arguments ), delay );
-               };
-       }
-
        /**
         * @class mw.htmlform.Checker
         */
@@ -60,7 +52,7 @@
                if ( $extraElements ) {
                        $e = $e.add( $extraElements );
                }
-               $e.on( events, debounce( 1000, this.validate.bind( this ) ) );
+               $e.on( events, mw.util.debounce( 1000, this.validate.bind( this ) ) );
 
                return this;
        };
diff --git a/resources/src/mediawiki.page.ready.js b/resources/src/mediawiki.page.ready.js
deleted file mode 100644 (file)
index 0e59da6..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-( function () {
-       mw.hook( 'wikipage.content' ).add( function ( $content ) {
-               var $sortable, $collapsible;
-
-               $collapsible = $content.find( '.mw-collapsible' );
-               if ( $collapsible.length ) {
-                       // Preloaded by Skin::getDefaultModules()
-                       mw.loader.using( 'jquery.makeCollapsible', function () {
-                               $collapsible.makeCollapsible();
-                       } );
-               }
-
-               $sortable = $content.find( 'table.sortable' );
-               if ( $sortable.length ) {
-                       // Preloaded by Skin::getDefaultModules()
-                       mw.loader.using( 'jquery.tablesorter', function () {
-                               $sortable.tablesorter();
-                       } );
-               }
-
-               // Run jquery.checkboxShiftClick
-               $content.find( 'input[type="checkbox"]:not(.noshiftselect)' ).checkboxShiftClick();
-       } );
-
-       // Things outside the wikipage content
-       $( function () {
-               var $nodes;
-
-               // Add accesskey hints to the tooltips
-               $( '[accesskey]' ).updateTooltipAccessKeys();
-
-               $nodes = $( '.catlinks[data-mw="interface"]' );
-               if ( $nodes.length ) {
-                       /**
-                        * Fired when categories are being added to the DOM
-                        *
-                        * It is encouraged to fire it before the main DOM is changed (when $content
-                        * is still detached).  However, this order is not defined either way, so you
-                        * should only rely on $content itself.
-                        *
-                        * This includes the ready event on a page load (including post-edit loads)
-                        * and when content has been previewed with LivePreview.
-                        *
-                        * @event wikipage_categories
-                        * @member mw.hook
-                        * @param {jQuery} $content The most appropriate element containing the content,
-                        *   such as .catlinks
-                        */
-                       mw.hook( 'wikipage.categories' ).fire( $nodes );
-               }
-
-               $( '#t-print a' ).on( 'click', function ( e ) {
-                       window.print();
-                       e.preventDefault();
-               } );
-
-               // Turn logout to a POST action
-               $( '#pt-logout a' ).on( 'click', function ( e ) {
-                       var api = new mw.Api(),
-                               returnUrl = $( '#pt-logout a' ).attr( 'href' );
-                       mw.notify(
-                               mw.message( 'logging-out-notify' ),
-                               { tag: 'logout', autoHide: false }
-                       );
-                       api.postWithToken( 'csrf', {
-                               action: 'logout'
-                       } ).then(
-                               function () {
-                                       location.href = returnUrl;
-                               },
-                               function ( e ) {
-                                       mw.notify(
-                                               mw.message( 'logout-failed', e ),
-                                               { type: 'error', tag: 'logout', autoHide: false }
-                                       );
-                               }
-                       );
-                       e.preventDefault();
-               } );
-       } );
-
-}() );
diff --git a/resources/src/mediawiki.page.ready/.eslintrc.json b/resources/src/mediawiki.page.ready/.eslintrc.json
new file mode 100644 (file)
index 0000000..ad8dbb3
--- /dev/null
@@ -0,0 +1,5 @@
+{
+       "parserOptions": {
+               "sourceType": "module"
+       }
+}
diff --git a/resources/src/mediawiki.page.ready/checkboxShift.js b/resources/src/mediawiki.page.ready/checkboxShift.js
new file mode 100644 (file)
index 0000000..86e0ec2
--- /dev/null
@@ -0,0 +1,33 @@
+/**
+ * @private
+ * @class mw.plugin.pageready
+ */
+/**
+ * Enable checkboxes to be checked or unchecked in a row by clicking one,
+ * holding shift and clicking another one.
+ *
+ * @method checkboxShift
+ * @param {jQuery} $box
+ */
+module.exports = function ( $box ) {
+       var prev;
+       // When our boxes are clicked..
+       $box.on( 'click', function ( e ) {
+               // And one has been clicked before...
+               if ( prev && e.shiftKey ) {
+                       // Check or uncheck this one and all in-between checkboxes,
+                       // except for disabled ones
+                       $box
+                               .slice(
+                                       Math.min( $box.index( prev ), $box.index( e.target ) ),
+                                       Math.max( $box.index( prev ), $box.index( e.target ) ) + 1
+                               )
+                               .filter( function () {
+                                       return !this.disabled;
+                               } )
+                               .prop( 'checked', e.target.checked );
+               }
+               // Either way, remember this as the last clicked one
+               prev = e.target;
+       } );
+};
diff --git a/resources/src/mediawiki.page.ready/ready.js b/resources/src/mediawiki.page.ready/ready.js
new file mode 100644 (file)
index 0000000..48d605d
--- /dev/null
@@ -0,0 +1,79 @@
+var checkboxShift = require( './checkboxShift.js' );
+mw.hook( 'wikipage.content' ).add( function ( $content ) {
+       var $sortable, $collapsible;
+
+       $collapsible = $content.find( '.mw-collapsible' );
+       if ( $collapsible.length ) {
+               // Preloaded by Skin::getDefaultModules()
+               mw.loader.using( 'jquery.makeCollapsible', function () {
+                       $collapsible.makeCollapsible();
+               } );
+       }
+
+       $sortable = $content.find( 'table.sortable' );
+       if ( $sortable.length ) {
+               // Preloaded by Skin::getDefaultModules()
+               mw.loader.using( 'jquery.tablesorter', function () {
+                       $sortable.tablesorter();
+               } );
+       }
+
+       checkboxShift( $content.find( 'input[type="checkbox"]:not(.noshiftselect)' ) );
+} );
+
+// Handle elements outside the wikipage content
+$( function () {
+       var $nodes;
+
+       // Add accesskey hints to the tooltips
+       $( '[accesskey]' ).updateTooltipAccessKeys();
+
+       $nodes = $( '.catlinks[data-mw="interface"]' );
+       if ( $nodes.length ) {
+               /**
+                * Fired when categories are being added to the DOM
+                *
+                * It is encouraged to fire it before the main DOM is changed (when $content
+                * is still detached).  However, this order is not defined either way, so you
+                * should only rely on $content itself.
+                *
+                * This includes the ready event on a page load (including post-edit loads)
+                * and when content has been previewed with LivePreview.
+                *
+                * @event wikipage_categories
+                * @member mw.hook
+                * @param {jQuery} $content The most appropriate element containing the content,
+                *   such as .catlinks
+                */
+               mw.hook( 'wikipage.categories' ).fire( $nodes );
+       }
+
+       $( '#t-print a' ).on( 'click', function ( e ) {
+               window.print();
+               e.preventDefault();
+       } );
+
+       // Turn logout to a POST action
+       $( '#pt-logout a' ).on( 'click', function ( e ) {
+               var api = new mw.Api(),
+                       url = this.href;
+               mw.notify(
+                       mw.message( 'logging-out-notify' ),
+                       { tag: 'logout', autoHide: false }
+               );
+               api.postWithToken( 'csrf', {
+                       action: 'logout'
+               } ).then(
+                       function () {
+                               location.href = url;
+                       },
+                       function ( err ) {
+                               mw.notify(
+                                       mw.message( 'logout-failed', err ),
+                                       { type: 'error', tag: 'logout', autoHide: false }
+                               );
+                       }
+               );
+               e.preventDefault();
+       } );
+} );
index e8823e1..8521664 100644 (file)
@@ -13,8 +13,7 @@ require( './jquery.accessKeyLabel.js' );
  * @return {string} Encoded string
  */
 function rawurlencode( str ) {
-       str = String( str );
-       return encodeURIComponent( str )
+       return encodeURIComponent( String( str ) )
                .replace( /!/g, '%21' ).replace( /'/g, '%27' ).replace( /\(/g, '%28' )
                .replace( /\)/g, '%29' ).replace( /\*/g, '%2A' ).replace( /~/g, '%7E' );
 }
@@ -59,33 +58,50 @@ util = {
        rawurlencode: rawurlencode,
 
        /**
-        * Encode string into HTML id compatible form suitable for use in HTML
-        * Analog to PHP Sanitizer::escapeIdForAttribute()
+        * Encode a string as CSS id, for use as HTML id attribute value.
         *
-        * @since 1.30
+        * Analog to `Sanitizer::escapeIdForAttribute()` in PHP.
         *
+        * @since 1.30
         * @param {string} str String to encode
         * @return {string} Encoded string
         */
        escapeIdForAttribute: function ( str ) {
-               var mode = config.FragmentMode[ 0 ];
-
-               return escapeIdInternal( str, mode );
+               return escapeIdInternal( str, config.FragmentMode[ 0 ] );
        },
 
        /**
-        * Encode string into HTML id compatible form suitable for use in links
-        * Analog to PHP Sanitizer::escapeIdForLink()
+        * Encode a string as URL fragment, for use as HTML anchor link.
         *
-        * @since 1.30
+        * Analog to `Sanitizer::escapeIdForLink()` in PHP.
         *
+        * @since 1.30
         * @param {string} str String to encode
         * @return {string} Encoded string
         */
        escapeIdForLink: function ( str ) {
-               var mode = config.FragmentMode[ 0 ];
+               return escapeIdInternal( str, config.FragmentMode[ 0 ] );
+       },
 
-               return escapeIdInternal( str, mode );
+       /**
+        * Return a wrapper function that is debounced for the given duration.
+        *
+        * When it is first called, a timeout is scheduled. If before the timer
+        * is reached the wrapper is called again, it gets rescheduled for the
+        * same duration from now until it stops being called. The original function
+        * is called from the "tail" of such chain, with the last set of arguments.
+        *
+        * @since 1.34
+        * @param {number} delay Time in milliseconds
+        * @param {Function} callback
+        * @return {Function}
+        */
+       debounce: function ( delay, callback ) {
+               var timeout;
+               return function () {
+                       clearTimeout( timeout );
+                       timeout = setTimeout( Function.prototype.apply.bind( callback, this, arguments ), delay );
+               };
        },
 
        /**
@@ -126,16 +142,15 @@ util = {
         * @return {string} Url of the page with name of `pageName`
         */
        getUrl: function ( pageName, params ) {
-               var titleFragmentStart, url, query,
-                       fragment = '',
+               var fragmentIdx, url, query, fragment,
                        title = typeof pageName === 'string' ? pageName : mw.config.get( 'wgPageName' );
 
                // Find any fragment
-               titleFragmentStart = title.indexOf( '#' );
-               if ( titleFragmentStart !== -1 ) {
-                       fragment = title.slice( titleFragmentStart + 1 );
+               fragmentIdx = title.indexOf( '#' );
+               if ( fragmentIdx !== -1 ) {
+                       fragment = title.slice( fragmentIdx + 1 );
                        // Exclude the fragment from the page name
-                       title = title.slice( 0, titleFragmentStart );
+                       title = title.slice( 0, fragmentIdx );
                }
 
                // Produce query string
@@ -152,7 +167,7 @@ util = {
                }
 
                // Append the encoded fragment
-               if ( fragment.length ) {
+               if ( fragment && fragment.length ) {
                        url += '#' + util.escapeIdForLink( fragment );
                }
 
@@ -160,16 +175,14 @@ util = {
        },
 
        /**
-        * Get address to a script in the wiki root.
-        * For index.php use `mw.config.get( 'wgScript' )`.
+        * Get URL to a MediaWiki entry point.
         *
         * @since 1.18
-        * @param {string} str Name of script (e.g. 'api'), defaults to 'index'
-        * @return {string} Address to script (e.g. '/w/api.php' )
+        * @param {string} [str="index"] Name of MW entry point (e.g. 'index' or 'api')
+        * @return {string} URL to the script file (e.g. '/w/api.php' )
         */
        wikiScript: function ( str ) {
-               str = str || 'index';
-               if ( str === 'index' ) {
+               if ( !str || str === 'index' ) {
                        return mw.config.get( 'wgScript' );
                } else if ( str === 'load' ) {
                        return config.LoadScript;
@@ -195,7 +208,7 @@ util = {
         */
        addCSS: function ( text ) {
                var s = mw.loader.addStyleTag( text );
-               return s.sheet || s.styleSheet || s;
+               return s.sheet;
        },
 
        /**
@@ -440,15 +453,15 @@ util = {
         * @return {boolean}
         */
        isIPv4Address: function ( address, allowBlock ) {
-               var block, RE_IP_BYTE, RE_IP_ADD;
+               var block,
+                       RE_IP_BYTE = '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|0?[0-9]?[0-9])',
+                       RE_IP_ADD = '(?:' + RE_IP_BYTE + '\\.){3}' + RE_IP_BYTE;
 
                if ( typeof address !== 'string' ) {
                        return false;
                }
 
                block = allowBlock ? '(?:\\/(?:3[0-2]|[12]?\\d))?' : '';
-               RE_IP_BYTE = '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|0?[0-9]?[0-9])';
-               RE_IP_ADD = '(?:' + RE_IP_BYTE + '\\.){3}' + RE_IP_BYTE;
 
                return ( new RegExp( '^' + RE_IP_ADD + block + '$' ).test( address ) );
        },
index b738312..ecd5c05 100644 (file)
@@ -1832,11 +1832,16 @@ abstract class MediaWikiIntegrationTestCase extends PHPUnit\Framework\TestCase {
                                'revision_actor_temp', 'slots', 'content', 'content_models', 'slot_roles',
                                'change_tag',
                        ];
+                       $loggingTables = [
+                               'logging', 'log_search', 'change_tag',
+                       ];
                        $coreDBDataTables = array_merge( $userTables, $pageTables );
 
-                       // If any of the user or page tables were marked as used, we should clear all of them.
+                       // some groups of tables are connected such that if any is used, all should be cleared
+                       $extraTables = [];
                        if ( array_intersect( $tablesUsed, $userTables ) ) {
-                               $tablesUsed = array_unique( array_merge( $tablesUsed, $userTables ) );
+                               $extraTables[] = $userTables;
+
                                TestUserRegistry::clear();
 
                                // Reset $wgUser, which is probably 127.0.0.1, as its loaded data is probably not valid
@@ -1846,7 +1851,13 @@ abstract class MediaWikiIntegrationTestCase extends PHPUnit\Framework\TestCase {
                                $wgUser->clearInstanceCache( $wgUser->mFrom );
                        }
                        if ( array_intersect( $tablesUsed, $pageTables ) ) {
-                               $tablesUsed = array_unique( array_merge( $tablesUsed, $pageTables ) );
+                               $extraTables[] = $pageTables;
+                       }
+                       if ( array_intersect( $tablesUsed, $loggingTables ) ) {
+                               $extraTables[] = $loggingTables;
+                       }
+                       if ( $extraTables !== [] ) {
+                               $tablesUsed = array_unique( array_merge( $tablesUsed, ...$extraTables ) );
                        }
 
                        // Postgres uses mwuser/pagecontent
diff --git a/tests/phpunit/data/media/jpeg-xmp-nullchar.jpg b/tests/phpunit/data/media/jpeg-xmp-nullchar.jpg
new file mode 100644 (file)
index 0000000..76ae2b4
Binary files /dev/null and b/tests/phpunit/data/media/jpeg-xmp-nullchar.jpg differ
index 8fa0cd6..d34ba0a 100644 (file)
@@ -308,7 +308,16 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
                                throw new MWException( 'All service callbacks must have a return type defined, ' .
                                        "none found for $name" );
                        }
-                       $ret[$name] = [ $name, $fun->getReturnType()->__toString() ];
+
+                       $returnType = $fun->getReturnType();
+
+                       // ReflectionType::__toString() generates deprecation notices in PHP 7.4 and above
+                       // TODO: T228342 - remove this check after MediaWiki only supports PHP 7.1+
+                       if ( is_callable( [ $returnType, 'getName' ] ) ) {
+                               $ret[$name] = [ $name, $returnType->getName() ];
+                       } else {
+                               $ret[$name] = [ $name, $fun->getReturnType()->__toString() ];
+                       }
                }
                return $ret;
        }
index 9665867..7115515 100644 (file)
@@ -4,6 +4,7 @@ namespace MediaWiki\Tests\Revision;
 
 use Content;
 use Language;
+use MediaWiki\MediaWikiServices;
 use MediaWiki\Revision\MutableRevisionRecord;
 use MediaWiki\Revision\MutableRevisionSlots;
 use MediaWiki\Revision\RenderedRevision;
@@ -122,7 +123,9 @@ class RenderedRevisionTest extends MediaWikiTestCase {
                $mock->expects( $this->any() )
                        ->method( 'userCan' )
                        ->willReturnCallback( function ( $perm, User $user ) use ( $mock ) {
-                               return $user->isAllowed( $perm );
+                               return MediaWikiServices::getInstance()
+                                       ->getPermissionManager()
+                                       ->userHasRight( $user, $perm );
                        } );
 
                return $mock;
index f4d324d..99332d2 100644 (file)
@@ -4,7 +4,6 @@ namespace MediaWiki\Tests\Revision;
 
 use ActorMigration;
 use CommentStore;
-use MediaWiki\Logger\Spi as LoggerSpi;
 use MediaWiki\Revision\RevisionStore;
 use MediaWiki\Revision\RevisionStoreFactory;
 use MediaWiki\Revision\SlotRoleRegistry;
@@ -35,7 +34,7 @@ class RevisionStoreFactoryTest extends \MediaWikiIntegrationTestCase {
                        $this->getMockCommentStore(),
                        ActorMigration::newMigration(),
                        MIGRATION_OLD,
-                       $this->getMockLoggerSpi(),
+                       new NullLogger(),
                        true
                );
                $this->assertTrue( true );
@@ -65,7 +64,7 @@ class RevisionStoreFactoryTest extends \MediaWikiIntegrationTestCase {
                $cache = $this->getHashWANObjectCache();
                $commentStore = $this->getMockCommentStore();
                $actorMigration = ActorMigration::newMigration();
-               $loggerProvider = $this->getMockLoggerSpi();
+               $logger = new NullLogger();
 
                $factory = new RevisionStoreFactory(
                        $lbFactory,
@@ -76,7 +75,7 @@ class RevisionStoreFactoryTest extends \MediaWikiIntegrationTestCase {
                        $commentStore,
                        $actorMigration,
                        $mcrMigrationStage,
-                       $loggerProvider,
+                       $logger,
                        $contentHandlerUseDb
                );
 
@@ -178,16 +177,4 @@ class RevisionStoreFactoryTest extends \MediaWikiIntegrationTestCase {
                return new WANObjectCache( [ 'cache' => new \HashBagOStuff() ] );
        }
 
-       /**
-        * @return \PHPUnit_Framework_MockObject_MockObject|LoggerSpi
-        */
-       private function getMockLoggerSpi() {
-               $mock = $this->getMock( LoggerSpi::class );
-
-               $mock->method( 'getLogger' )
-                       ->willReturn( new NullLogger() );
-
-               return $mock;
-       }
-
 }
index ed4a27f..249fa78 100644 (file)
@@ -850,8 +850,7 @@ class RevisionTest extends MediaWikiTestCase {
                );
 
                $cacheKey = $cache->makeGlobalKey(
-                       'BlobStore',
-                       'address',
+                       'SqlBlobStore-blob',
                        $lb->getLocalDomainID(),
                        'tt:7777'
                );
index 82ccb9a..608d590 100644 (file)
@@ -834,8 +834,23 @@ class TitleTest extends MediaWikiTestCase {
                return [
                        [ Title::makeTitle( NS_SPECIAL, 'Test' ) ],
                        [ Title::makeTitle( NS_MEDIA, 'Test' ) ],
-                       [ Title::makeTitle( NS_MAIN, '', 'Kittens' ) ],
-                       [ Title::makeTitle( NS_MAIN, 'Kittens', '', 'acme' ) ],
+               ];
+       }
+
+       public static function provideGetTalkPage_broken() {
+               // These cases *should* be bad, but are not treated as bad, for backwards compatibility.
+               // See discussion on T227817.
+               return [
+                       [
+                               Title::makeTitle( NS_MAIN, '', 'Kittens' ),
+                               Title::makeTitle( NS_TALK, '' ), // Section is lost!
+                               false,
+                       ],
+                       [
+                               Title::makeTitle( NS_MAIN, 'Kittens', '', 'acme' ),
+                               Title::makeTitle( NS_TALK, 'Kittens', '' ), // Interwiki prefix is lost!
+                               true,
+                       ],
                ];
        }
 
@@ -895,6 +910,23 @@ class TitleTest extends MediaWikiTestCase {
                $title->getTalkPage();
        }
 
+       /**
+        * @dataProvider provideGetTalkPage_broken
+        * @covers Title::getTalkPageIfDefined
+        */
+       public function testGetTalkPage_broken( Title $title, Title $expected, $valid ) {
+               $errorLevel = error_reporting( E_ERROR );
+
+               // NOTE: Eventually we want to throw in this case. But while there is still code that
+               // calls this method without checking, we want to avoid fatal errors.
+               // See discussion on T227817.
+               $result = $title->getTalkPage();
+               $this->assertTrue( $expected->equals( $result ) );
+               $this->assertSame( $valid, $result->isValid() );
+
+               error_reporting( $errorLevel );
+       }
+
        /**
         * @dataProvider provideGetTalkPage_good
         * @covers Title::getTalkPageIfDefined
index 0a2558a..dce1a5f 100644 (file)
@@ -79,15 +79,46 @@ class ApiQuerySiteinfoTest extends ApiTestCase {
                $this->assertSame( 'Need more donations', $data['readonlyreason'] );
        }
 
-       public function testNamespaces() {
-               $this->setMwGlobals( 'wgExtraNamespaces', [ '138' => 'Testing' ] );
+       public function testNamespacesBasic() {
+               $this->assertSame(
+                       array_keys( MediaWikiServices::getInstance()->getContentLanguage()->getFormattedNamespaces() ),
+                       array_keys( $this->doQuery( 'namespaces' ) )
+               );
+       }
 
+       public function testNamespacesExtraNS() {
+               $this->setMwGlobals( 'wgExtraNamespaces', [ '138' => 'Testing' ] );
                $this->assertSame(
                        array_keys( MediaWikiServices::getInstance()->getContentLanguage()->getFormattedNamespaces() ),
                        array_keys( $this->doQuery( 'namespaces' ) )
                );
        }
 
+       public function testNamespacesProtection() {
+               $this->setMwGlobals(
+                       'wgNamespaceProtection',
+                       [
+                               '0' => '',
+                               '2' => [ '' ],
+                               '4' => 'editsemiprotected',
+                               '8' => [
+                                       'editinterface',
+                                       'noratelimit'
+                               ],
+                               '14' => [
+                                       'move-categorypages',
+                                       ''
+                               ]
+                       ]
+               );
+               $data = $this->doQuery( 'namespaces' );
+               $this->assertArrayNotHasKey( 'namespaceprotection', $data['0'] );
+               $this->assertArrayNotHasKey( 'namespaceprotection', $data['2'] );
+               $this->assertSame( 'editsemiprotected', $data['4']['namespaceprotection'] );
+               $this->assertSame( 'editinterface|noratelimit', $data['8']['namespaceprotection'] );
+               $this->assertSame( 'move-categorypages', $data['14']['namespaceprotection'] );
+       }
+
        public function testNamespaceAliases() {
                global $wgNamespaceAliases;
 
index 5dcea65..7dc63fb 100644 (file)
@@ -1,5 +1,8 @@
 <?php
 
+use MediaWiki\Block\DatabaseBlock;
+use MediaWiki\Block\Restriction\PageRestriction;
+
 /**
  * Tests for action=revisiondelete
  * @covers APIRevisionDelete
@@ -113,4 +116,32 @@ class ApiRevisionDeleteTest extends ApiTestCase {
                $this->assertTrue( $item['texthidden'], 'texthidden' );
                $this->assertEquals( $item['id'], $revid );
        }
+
+       public function testPartiallyBlockedPage() {
+               $this->setExpectedApiException( 'apierror-blocked-partial' );
+
+               $user = static::getTestSysop()->getUser();
+
+               $block = new DatabaseBlock( [
+                       'address' => $user,
+                       'by' => static::getTestSysop()->getUser()->getId(),
+                       'sitewide' => false,
+               ] );
+
+               $block->setRestrictions( [
+                       new PageRestriction( 0, Title::newFromText( self::$page )->getArticleID() )
+               ] );
+               $block->insert();
+
+               $revid = array_shift( $this->revs );
+
+               $this->doApiRequest( [
+                       'action' => 'revisiondelete',
+                       'type' => 'revision',
+                       'target' => self::$page,
+                       'ids' => $revid,
+                       'hide' => 'content|user|comment',
+                       'token' => $user->getEditToken(),
+               ] );
+       }
 }
index d4133b7..230d36a 100644 (file)
@@ -6,6 +6,7 @@ use MediaWiki\Block\CompositeBlock;
 use MediaWiki\Block\SystemBlock;
 use MediaWiki\MediaWikiServices;
 use Wikimedia\TestingAccessWrapper;
+use Psr\Log\LoggerInterface;
 
 /**
  * @group Blocking
@@ -48,15 +49,15 @@ class BlockManagerTest extends MediaWikiTestCase {
        private function getBlockManagerConstructorArgs( $overrideConfig ) {
                $blockManagerConfig = array_merge( $this->blockManagerConfig, $overrideConfig );
                $this->setMwGlobals( $blockManagerConfig );
+               $logger = $this->getMockBuilder( LoggerInterface::class )->getMock();
                return [
                        new LoggedServiceOptions(
                                self::$serviceOptionsAccessLog,
                                BlockManager::$constructorOptions,
                                MediaWikiServices::getInstance()->getMainConfig()
                        ),
-                       $this->user,
-                       $this->user->getRequest(),
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       MediaWikiServices::getInstance()->getPermissionManager(),
+                       $logger
                ];
        }
 
index cd3ddfa..1f9d29e 100644 (file)
@@ -430,4 +430,18 @@ class LinksUpdateTest extends MediaWikiLangTestCase {
                        $queueGroup->ack( $job );
                }
        }
+
+       public function testIsRecursive() {
+               list( $title, $po ) = $this->makeTitleAndParserOutput( 'Test', 1 );
+               $linksUpdate = new LinksUpdate( $title, $po );
+               $this->assertTrue( $linksUpdate->isRecursive(), 'LinksUpdate is recursive by default' );
+
+               $linksUpdate = new LinksUpdate( $title, $po, true );
+               $this->assertTrue( $linksUpdate->isRecursive(),
+                       'LinksUpdate is recursive when asked to be recursive' );
+
+               $linksUpdate = new LinksUpdate( $title, $po, false );
+               $this->assertFalse( $linksUpdate->isRecursive(),
+                       'LinksUpdate is not recursive when asked to be not recursive' );
+       }
 }
index 3b30d7e..e344d57 100644 (file)
@@ -2422,7 +2422,7 @@ class FileBackendTest extends MediaWikiTestCase {
                        "$base/subdir2/subdir/sub/120-px-file.txt",
                ];
 
-               for ( $i = 0; $i < 25; $i++ ) {
+               for ( $i = 0; $i < 2; $i++ ) {
                        $status = $this->backend->lockFiles( $paths, LockManager::LOCK_EX );
                        $this->assertEquals( print_r( [], true ), print_r( $status->getErrors(), true ),
                                "Locking of files succeeded ($backendName) ($i)." );
index 35eca28..13f2b17 100644 (file)
@@ -13,7 +13,7 @@ use Wikimedia\TestingAccessWrapper;
  * @covers SwiftFileBackendList
  */
 class SwiftFileBackendTest extends MediaWikiTestCase {
-       /** @var TestingAccessWrapper Proxy to SwiftFileBackend */
+       /** @var TestingAccessWrapper|SwiftFileBackend */
        private $backend;
 
        protected function setUp() {
@@ -34,26 +34,28 @@ class SwiftFileBackendTest extends MediaWikiTestCase {
        }
 
        /**
-        * @dataProvider provider_testSanitizeHdrsStrict
+        * @covers SwiftFileBackend::extractMutableContentHeaders
+        * @dataProvider provider_testExtractPostableContentHeaders
         */
-       public function testSanitizeHdrsStrict( $raw, $sanitized ) {
-               $hdrs = $this->backend->sanitizeHdrsStrict( [ 'headers' => $raw ] );
+       public function testExtractPostableContentHeaders( $raw, $sanitized ) {
+               $hdrs = $this->backend->extractMutableContentHeaders( $raw );
 
-               $this->assertEquals( $hdrs, $sanitized, 'sanitizeHdrsStrict() has expected result' );
+               $this->assertEquals( $hdrs, $sanitized, 'Correct extractPostableContentHeaders() result' );
        }
 
-       public static function provider_testSanitizeHdrsStrict() {
+       public static function provider_testExtractPostableContentHeaders() {
                return [
                        [
                                [
                                        'content-length' => 345,
-                                       'content-type'   => 'image+bitmap/jpeg',
+                                       'content-type' => 'image+bitmap/jpeg',
                                        'content-disposition' => 'inline',
                                        'content-duration' => 35.6363,
                                        'content-Custom' => 'hello',
                                        'x-content-custom' => 'hello'
                                ],
                                [
+                                       'content-type' => 'image+bitmap/jpeg',
                                        'content-disposition' => 'inline',
                                        'content-duration' => 35.6363,
                                        'content-custom' => 'hello',
@@ -63,13 +65,14 @@ class SwiftFileBackendTest extends MediaWikiTestCase {
                        [
                                [
                                        'content-length' => 345,
-                                       'content-type'   => 'image+bitmap/jpeg',
+                                       'content-type' => 'image+bitmap/jpeg',
                                        'content-Disposition' => 'inline; filename=xxx; ' . str_repeat( 'o', 1024 ),
                                        'content-duration' => 35.6363,
                                        'content-custom' => 'hello',
                                        'x-content-custom' => 'hello'
                                ],
                                [
+                                       'content-type' => 'image+bitmap/jpeg',
                                        'content-disposition' => 'inline;filename=xxx',
                                        'content-duration' => 35.6363,
                                        'content-custom' => 'hello',
@@ -79,13 +82,14 @@ class SwiftFileBackendTest extends MediaWikiTestCase {
                        [
                                [
                                        'content-length' => 345,
-                                       'content-type'   => 'image+bitmap/jpeg',
+                                       'content-type' => 'image+bitmap/jpeg',
                                        'content-disposition' => 'filename=' . str_repeat( 'o', 1024 ) . ';inline',
                                        'content-duration' => 35.6363,
                                        'content-custom' => 'hello',
                                        'x-content-custom' => 'hello'
                                ],
                                [
+                                       'content-type' => 'image+bitmap/jpeg',
                                        'content-disposition' => '',
                                        'content-duration' => 35.6363,
                                        'content-custom' => 'hello',
@@ -96,75 +100,11 @@ class SwiftFileBackendTest extends MediaWikiTestCase {
        }
 
        /**
-        * @dataProvider provider_testSanitizeHdrs
-        */
-       public function testSanitizeHdrs( $raw, $sanitized ) {
-               $hdrs = $this->backend->sanitizeHdrs( [ 'headers' => $raw ] );
-
-               $this->assertEquals( $hdrs, $sanitized, 'sanitizeHdrs() has expected result' );
-       }
-
-       public static function provider_testSanitizeHdrs() {
-               return [
-                       [
-                               [
-                                       'content-length' => 345,
-                                       'content-type'   => 'image+bitmap/jpeg',
-                                       'content-disposition' => 'inline',
-                                       'content-duration' => 35.6363,
-                                       'content-Custom' => 'hello',
-                                       'x-content-custom' => 'hello'
-                               ],
-                               [
-                                       'content-type'   => 'image+bitmap/jpeg',
-                                       'content-disposition' => 'inline',
-                                       'content-duration' => 35.6363,
-                                       'content-custom' => 'hello',
-                                       'x-content-custom' => 'hello'
-                               ]
-                       ],
-                       [
-                               [
-                                       'content-length' => 345,
-                                       'content-type'   => 'image+bitmap/jpeg',
-                                       'content-Disposition' => 'inline; filename=xxx; ' . str_repeat( 'o', 1024 ),
-                                       'content-duration' => 35.6363,
-                                       'content-custom' => 'hello',
-                                       'x-content-custom' => 'hello'
-                               ],
-                               [
-                                       'content-type'   => 'image+bitmap/jpeg',
-                                       'content-disposition' => 'inline;filename=xxx',
-                                       'content-duration' => 35.6363,
-                                       'content-custom' => 'hello',
-                                       'x-content-custom' => 'hello'
-                               ]
-                       ],
-                       [
-                               [
-                                       'content-length' => 345,
-                                       'content-type'   => 'image+bitmap/jpeg',
-                                       'content-disposition' => 'filename=' . str_repeat( 'o', 1024 ) . ';inline',
-                                       'content-duration' => 35.6363,
-                                       'content-custom' => 'hello',
-                                       'x-content-custom' => 'hello'
-                               ],
-                               [
-                                       'content-type'   => 'image+bitmap/jpeg',
-                                       'content-disposition' => '',
-                                       'content-duration' => 35.6363,
-                                       'content-custom' => 'hello',
-                                       'x-content-custom' => 'hello'
-                               ]
-                       ]
-               ];
-       }
-
-       /**
+        * @covers SwiftFileBackend::extractMetadataHeaders
         * @dataProvider provider_testGetMetadataHeaders
         */
        public function testGetMetadataHeaders( $raw, $sanitized ) {
-               $hdrs = $this->backend->getMetadataHeaders( $raw );
+               $hdrs = $this->backend->extractMetadataHeaders( $raw );
 
                $this->assertEquals( $hdrs, $sanitized, 'getMetadataHeaders() has expected result' );
        }
@@ -188,10 +128,11 @@ class SwiftFileBackendTest extends MediaWikiTestCase {
        }
 
        /**
+        * @covers SwiftFileBackend::getMetadataFromHeaders
         * @dataProvider provider_testGetMetadata
         */
        public function testGetMetadata( $raw, $sanitized ) {
-               $hdrs = $this->backend->getMetadata( $raw );
+               $hdrs = $this->backend->getMetadataFromHeaders( $raw );
 
                $this->assertEquals( $hdrs, $sanitized, 'getMetadata() has expected result' );
        }
index 6c56510..4a0a6d0 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 /**
  * @todo Could use a test of extended XMP segments. Hard to find programs that
- * create example files, and creating my own in vim propbably wouldn't
+ * create example files, and creating my own in vim probably wouldn't
  * serve as a very good "test". (Adobe photoshop probably creates such files
  * but it costs money). The implementation of it currently in MediaWiki is based
  * solely on reading the standard, without any real world test files.
@@ -76,6 +76,12 @@ class JpegMetadataExtractorTest extends MediaWikiIntegrationTestCase {
                $this->assertEquals( $expected, bin2hex( $res['PSIR'][0] ) );
        }
 
+       public function testXMPExtractionNullChar() {
+               $res = JpegMetadataExtractor::segmentSplitter( $this->filePath . 'jpeg-xmp-nullchar.jpg' );
+               $expected = file_get_contents( $this->filePath . 'jpeg-xmp-psir.xmp' );
+               $this->assertEquals( $expected, $res['XMP'] );
+       }
+
        public function testXMPExtractionAltAppId() {
                $res = JpegMetadataExtractor::segmentSplitter( $this->filePath . 'jpeg-xmp-alt.jpg' );
                $expected = file_get_contents( $this->filePath . 'jpeg-xmp-psir.xmp' );
index e7f7067..a459441 100644 (file)
@@ -2,6 +2,7 @@
 
 use MediaWiki\Auth\AuthManager;
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Permissions\PermissionManager;
 use MediaWiki\Preferences\DefaultPreferencesFactory;
 use Wikimedia\TestingAccessWrapper;
 
@@ -49,9 +50,10 @@ class DefaultPreferencesFactoryTest extends \MediaWikiTestCase {
 
        /**
         * Get a basic PreferencesFactory for testing with.
+        * @param PermissionManager|null $manager
         * @return DefaultPreferencesFactory
         */
-       protected function getPreferencesFactory() {
+       protected function getPreferencesFactory( PermissionManager $manager = null ) {
                $mockNsInfo = $this->createMock( NamespaceInfo::class );
                $mockNsInfo->method( 'getValidNamespaces' )->willReturn( [
                        NS_MAIN, NS_TALK, NS_USER, NS_USER_TALK
@@ -59,13 +61,16 @@ class DefaultPreferencesFactoryTest extends \MediaWikiTestCase {
                $mockNsInfo->expects( $this->never() )
                        ->method( $this->anythingBut( 'getValidNamespaces', '__destruct' ) );
 
+               $mockPermissionManager = $manager ?? $this->createMock( PermissionManager::class );
+
                return new DefaultPreferencesFactory(
                        new LoggedServiceOptions( self::$serviceOptionsAccessLog,
                                DefaultPreferencesFactory::$constructorOptions, $this->config ),
                        new Language(),
                        AuthManager::singleton(),
                        MediaWikiServices::getInstance()->getLinkRenderer(),
-                       $mockNsInfo
+                       $mockNsInfo,
+                       $mockPermissionManager
                );
        }
 
@@ -88,7 +93,9 @@ class DefaultPreferencesFactoryTest extends \MediaWikiTestCase {
         * @dataProvider emailAuthenticationProvider
         */
        public function testEmailAuthentication( $user, $cssClass ) {
-               $prefs = $this->getPreferencesFactory()->getFormDescriptor( $user, $this->context );
+               $pm = $this->createMock( PermissionManager::class );
+               $pm->method( 'userHasRight' )->willReturn( true );
+               $prefs = $this->getPreferencesFactory( $pm )->getFormDescriptor( $user, $this->context );
                $this->assertArrayHasKey( 'cssclass', $prefs['emailauthentication'] );
                $this->assertEquals( $cssClass, $prefs['emailauthentication']['cssclass'] );
        }
@@ -100,16 +107,18 @@ class DefaultPreferencesFactoryTest extends \MediaWikiTestCase {
                $userMock = $this->getMockBuilder( User::class )
                        ->disableOriginalConstructor()
                        ->getMock();
-               $userMock->method( 'isAllowed' )
-                       ->willReturn( false );
                $userMock->method( 'getEffectiveGroups' )
                        ->willReturn( [] );
                $userMock->method( 'getGroupMemberships' )
                        ->willReturn( [] );
                $userMock->method( 'getOptions' )
                        ->willReturn( [ 'test' => 'yes' ] );
-
-               $prefs = $this->getPreferencesFactory()->getFormDescriptor( $userMock, $this->context );
+               $pm = $this->createMock( PermissionManager::class );
+               $pm->method( 'userHasRight' )
+                       ->will( $this->returnValueMap( [
+                               [ $userMock, 'editmyoptions', true ]
+                       ] ) );
+               $prefs = $this->getPreferencesFactory( $pm )->getFormDescriptor( $userMock, $this->context );
                $this->assertArrayNotHasKey( 'showrollbackconfirmation', $prefs );
        }
 
@@ -120,16 +129,19 @@ class DefaultPreferencesFactoryTest extends \MediaWikiTestCase {
                $userMock = $this->getMockBuilder( User::class )
                        ->disableOriginalConstructor()
                        ->getMock();
-               $userMock->method( 'isAllowed' )
-                       ->willReturn( true );
                $userMock->method( 'getEffectiveGroups' )
                        ->willReturn( [] );
                $userMock->method( 'getGroupMemberships' )
                        ->willReturn( [] );
                $userMock->method( 'getOptions' )
                        ->willReturn( [ 'test' => 'yes' ] );
-
-               $prefs = $this->getPreferencesFactory()->getFormDescriptor( $userMock, $this->context );
+               $pm = $this->createMock( PermissionManager::class );
+               $pm->method( 'userHasRight' )
+                       ->will( $this->returnValueMap( [
+                               [ $userMock, 'editmyoptions', true ],
+                               [ $userMock, 'rollback', true ]
+                       ] ) );
+               $prefs = $this->getPreferencesFactory( $pm )->getFormDescriptor( $userMock, $this->context );
                $this->assertArrayHasKey( 'showrollbackconfirmation', $prefs );
                $this->assertEquals(
                        'rendering/advancedrendering',
@@ -181,10 +193,6 @@ class DefaultPreferencesFactoryTest extends \MediaWikiTestCase {
                        ->getMock();
                $userMock->method( 'getOptions' )
                        ->willReturn( $oldOptions );
-               $userMock->method( 'isAllowedAny' )
-                       ->willReturn( true );
-               $userMock->method( 'isAllowed' )
-                       ->willReturn( true );
 
                $userMock->expects( $this->exactly( 2 ) )
                        ->method( 'setOption' )
@@ -193,18 +201,25 @@ class DefaultPreferencesFactoryTest extends \MediaWikiTestCase {
                                [ $this->equalTo( 'option' ), $this->equalTo( $newOptions[ 'option' ] ) ]
                        );
 
-               $form->expects( $this->any() )
-                       ->method( 'getModifiedUser' )
+               $form->method( 'getModifiedUser' )
                        ->willReturn( $userMock );
 
-               $form->expects( $this->any() )
-                       ->method( 'getContext' )
+               $form->method( 'getContext' )
                        ->willReturn( $this->context );
 
-               $form->expects( $this->any() )
-                       ->method( 'getConfig' )
+               $form->method( 'getConfig' )
                        ->willReturn( $configMock );
 
+               $pm = $this->createMock( PermissionManager::class );
+               $pm->method( 'userHasAnyRight' )
+                       ->will( $this->returnValueMap( [
+                               [ $userMock, 'editmyprivateinfo', 'editmyoptions', true ]
+                       ] ) );
+               $pm->method( 'userHasRight' )
+                       ->will( $this->returnValueMap( [
+                               [ $userMock, 'editmyoptions', true ]
+                       ] ) );
+
                $this->setTemporaryHook( 'PreferencesFormPreSave',
                        function ( $formData, $form, $user, &$result, $oldUserOptions )
                                use ( $newOptions, $oldOptions, $userMock ) {
@@ -220,7 +235,7 @@ class DefaultPreferencesFactoryTest extends \MediaWikiTestCase {
                );
 
                /** @var DefaultPreferencesFactory $factory */
-               $factory = TestingAccessWrapper::newFromObject( $this->getPreferencesFactory() );
+               $factory = TestingAccessWrapper::newFromObject( $this->getPreferencesFactory( $pm ) );
                $factory->saveFormData( $newOptions, $form, [] );
        }
 
@@ -233,7 +248,14 @@ class DefaultPreferencesFactoryTest extends \MediaWikiTestCase {
                // Test a string with leading zeros (i.e. not octal) and spaces.
                $this->context->getRequest()->setVal( 'wprclimit', ' 0012 ' );
                $user = new User;
-               $form = $this->getPreferencesFactory()->getForm( $user, $this->context );
+               $pm = $this->createMock( PermissionManager::class );
+               $pm->method( 'userHasAnyRight' )
+                       ->willReturn( true );
+               $pm->method( 'userHasRight' )
+                       ->will( $this->returnValueMap( [
+                               [ $user, 'editmyoptions', true ]
+                       ] ) );
+               $form = $this->getPreferencesFactory( $pm )->getForm( $user, $this->context );
                $form->show();
                $form->trySubmit();
                $this->assertEquals( 12, $user->getOption( 'rclimit' ) );
index 879acfe..5435afa 100644 (file)
@@ -8,6 +8,11 @@
  */
 class SpecialBlankPageTest extends SpecialPageTestBase {
 
+       protected function setUp() {
+               parent::setUp();
+               $this->setUserLang( 'qqx' );
+       }
+
        /**
         * Returns a new instance of the special page under test.
         *
@@ -19,7 +24,7 @@ class SpecialBlankPageTest extends SpecialPageTestBase {
 
        public function testHasWikiMsg() {
                list( $html, ) = $this->executeSpecialPage();
-               $this->assertContains( wfMessage( 'intentionallyblankpage' )->text(), $html );
+               $this->assertContains( '(intentionallyblankpage)', $html );
        }
 
 }
index e38d77b..0e46744 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 
 use MediaWiki\Block\DatabaseBlock;
+use MediaWiki\MediaWikiServices;
 
 /**
  * @covers LocalIdLookup
@@ -47,12 +48,12 @@ class LocalIdLookupTest extends MediaWikiTestCase {
 
        public function testLookupCentralIds() {
                $lookup = new LocalIdLookup();
-
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
                $user1 = $this->getLookupUser();
                $user2 = User::newFromName( 'UTLocalIdLookup2' );
 
-               $this->assertTrue( $user1->isAllowed( 'hideuser' ), 'sanity check' );
-               $this->assertFalse( $user2->isAllowed( 'hideuser' ), 'sanity check' );
+               $this->assertTrue( $permissionManager->userHasRight( $user1, 'hideuser' ), 'sanity check' );
+               $this->assertFalse( $permissionManager->userHasRight( $user2, 'hideuser' ), 'sanity check' );
 
                $this->assertSame( [], $lookup->lookupCentralIds( [] ) );
 
@@ -76,11 +77,12 @@ class LocalIdLookupTest extends MediaWikiTestCase {
 
        public function testLookupUserNames() {
                $lookup = new LocalIdLookup();
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
                $user1 = $this->getLookupUser();
                $user2 = User::newFromName( 'UTLocalIdLookup2' );
 
-               $this->assertTrue( $user1->isAllowed( 'hideuser' ), 'sanity check' );
-               $this->assertFalse( $user2->isAllowed( 'hideuser' ), 'sanity check' );
+               $this->assertTrue( $permissionManager->userHasRight( $user1, 'hideuser' ), 'sanity check' );
+               $this->assertFalse( $permissionManager->userHasRight( $user2, 'hideuser' ), 'sanity check' );
 
                $this->assertSame( [], $lookup->lookupUserNames( [] ) );
 
index b0c0fec..4a7aa05 100644 (file)
@@ -4,6 +4,7 @@ use MediaWiki\Auth\AuthManager;
 use MediaWiki\Block\DatabaseBlock;
 use MediaWiki\Block\CompositeBlock;
 use MediaWiki\Block\SystemBlock;
+use MediaWiki\Permissions\PermissionManager;
 
 /**
  * @covers PasswordReset
@@ -30,16 +31,19 @@ class PasswordResetTest extends MediaWikiTestCase {
                $user->expects( $this->any() )->method( 'getName' )->willReturn( 'Foo' );
                $user->expects( $this->any() )->method( 'getBlock' )->willReturn( $block );
                $user->expects( $this->any() )->method( 'getGlobalBlock' )->willReturn( $globalBlock );
-               $user->expects( $this->any() )->method( 'isAllowed' )
-                       ->will( $this->returnCallback( function ( $perm ) use ( $canEditPrivate ) {
-                               if ( $perm === 'editmyprivateinfo' ) {
-                                       return $canEditPrivate;
-                               } else {
-                                       $this->fail( 'Unexpected permission check' );
-                               }
-                       } ) );
 
-               $passwordReset = new PasswordReset( $config, $authManager );
+               $permissionManager = $this->getMockBuilder( PermissionManager::class )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $permissionManager->method( 'userHasRight' )
+                       ->with( $user, 'editmyprivateinfo' )
+                       ->willReturn( $canEditPrivate );
+
+               $passwordReset = new PasswordReset(
+                       $config,
+                       $authManager,
+                       $permissionManager
+               );
 
                $this->assertSame( $isAllowed, $passwordReset->isAllowed( $user )->isGood() );
        }
@@ -204,9 +208,16 @@ class PasswordResetTest extends MediaWikiTestCase {
                $request->setIP( '1.2.3.4' );
                $performingUser = $this->getMockBuilder( User::class )->getMock();
                $performingUser->expects( $this->any() )->method( 'getRequest' )->willReturn( $request );
-               $performingUser->expects( $this->any() )->method( 'isAllowed' )->willReturn( true );
                $performingUser->expects( $this->any() )->method( 'getName' )->willReturn( 'Performer' );
 
+               $permissionManager = $this->getMockBuilder( PermissionManager::class )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $permissionManager->expects( $this->once() )
+                       ->method( 'userHasRight' )
+                       ->with( $performingUser, 'editmyprivateinfo' )
+                       ->willReturn( true );
+
                $targetUser1 = $this->getMockBuilder( User::class )->getMock();
                $targetUser2 = $this->getMockBuilder( User::class )->getMock();
                $targetUser1->expects( $this->any() )->method( 'getName' )->willReturn( 'User1' );
@@ -217,7 +228,8 @@ class PasswordResetTest extends MediaWikiTestCase {
                $targetUser2->expects( $this->any() )->method( 'getEmail' )->willReturn( 'foo@bar.baz' );
 
                $passwordReset = $this->getMockBuilder( PasswordReset::class )
-                       ->setMethods( [ 'getUsersByEmail' ] )->setConstructorArgs( [ $config, $authManager ] )
+                       ->setConstructorArgs( [ $config, $authManager, $permissionManager ] )
+                       ->setMethods( [ 'getUsersByEmail' ] )
                        ->getMock();
                $passwordReset->expects( $this->any() )->method( 'getUsersByEmail' )->with( 'foo@bar.baz' )
                        ->willReturn( [ $targetUser1, $targetUser2 ] );
index 4862747..6f57578 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @group Database
  */
@@ -61,7 +63,9 @@ class UserGroupMembershipTest extends MediaWikiTestCase {
                $user->clearInstanceCache();
                $this->assertContains( 'unittesters', $user->getGroups() );
                $this->assertArrayHasKey( 'unittesters', $user->getGroupMemberships() );
-               $this->assertTrue( $user->isAllowed( 'runtest' ) );
+               $this->assertTrue( MediaWikiServices::getInstance()
+                       ->getPermissionManager()
+                       ->userHasRight( $user, 'runtest' ) );
 
                // try updating without allowUpdate. Should fail
                $ugm = new UserGroupMembership( $user->getId(), 'unittesters', $this->expiryTime );
@@ -72,7 +76,9 @@ class UserGroupMembershipTest extends MediaWikiTestCase {
                $user->clearInstanceCache();
                $this->assertContains( 'unittesters', $user->getGroups() );
                $this->assertArrayHasKey( 'unittesters', $user->getGroupMemberships() );
-               $this->assertTrue( $user->isAllowed( 'runtest' ) );
+               $this->assertTrue( MediaWikiServices::getInstance()
+                       ->getPermissionManager()
+                       ->userHasRight( $user, 'runtest' ) );
 
                // try removing the group
                $ugm->delete();
@@ -81,7 +87,9 @@ class UserGroupMembershipTest extends MediaWikiTestCase {
                        $this->logicalNot( $this->contains( 'unittesters' ) ) );
                $this->assertThat( $user->getGroupMemberships(),
                        $this->logicalNot( $this->arrayHasKey( 'unittesters' ) ) );
-               $this->assertFalse( $user->isAllowed( 'runtest' ) );
+               $this->assertFalse( MediaWikiServices::getInstance()
+                       ->getPermissionManager()
+                       ->userHasRight( $user, 'runtest' ) );
 
                // check that the user group is now in user_former_groups
                $this->assertContains( 'unittesters', $user->getFormerGroups() );
index 3005ae9..2a4ba4b 100644 (file)
@@ -1488,10 +1488,6 @@ class UserTest extends MediaWikiTestCase {
                // logged in users should be inmune to cookie block of type ip/range
                $this->assertNull( $user->getBlock() );
 
-               // cookie is being cleared
-               $cookies = $request->response()->getCookies();
-               $this->assertEquals( '', $cookies['wikiBlockID']['value'] );
-
                // clean up
                $block->delete();
        }
index 22b5938..edb7618 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 /**
-* @covers MWDoxygenFilter
+ * @covers MWDoxygenFilter
  */
 class MWDoxygenFilterTest extends \PHPUnit\Framework\TestCase {
 
index 8eadb0e..ca71d32 100644 (file)
@@ -4,7 +4,7 @@ namespace MediaWiki\Tests\Maintenance;
 
 use ContentHandler;
 use FetchText;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use MediaWikiTestCase;
 use MWException;
 use Title;
index cab6c3b..a3a165f 100644 (file)
@@ -102,7 +102,6 @@ return [
                ],
                'dependencies' => [
                        'jquery.color',
-                       'jquery.colorUtil',
                        'jquery.getAttrs',
                        'jquery.highlightText',
                        'jquery.lengthLimit',
index 541c610..22a3a4b 100644 (file)
                return api.post( {} );
        } );
 
+       QUnit.test( 'origin is not included in same-origin GET requests', function ( assert ) {
+               var apiUrl = location.protocol + '//' + location.host + '/w/api.php',
+                       api = new mw.ForeignApi( apiUrl );
+
+               this.server.respond( function ( request ) {
+                       assert.strictEqual( request.url.match( /origin=.*?(?:&|$)/ ), null, 'origin is not included in GET requests' );
+                       request.respond( 200, { 'Content-Type': 'application/json' }, '[]' );
+               } );
+
+               return api.get( {} );
+       } );
+
+       QUnit.test( 'origin is not included in same-origin POST requests', function ( assert ) {
+               var apiUrl = location.protocol + '//' + location.host + '/w/api.php',
+                       api = new mw.ForeignApi( apiUrl );
+
+               this.server.respond( function ( request ) {
+                       assert.strictEqual( request.requestBody.match( /origin=.*?(?:&|$)/ ), null, 'origin is not included in POST request body' );
+                       assert.strictEqual( request.url.match( /origin=.*?(?:&|$)/ ), null, 'origin is not included in POST request URL, either' );
+                       request.respond( 200, { 'Content-Type': 'application/json' }, '[]' );
+               } );
+
+               return api.post( {} );
+       } );
+
 }() );
index 4f61abd..a05b50b 100644 (file)
 
                assert.strictEqual( mw.util.escapeRegExp( normal ), normal, 'Alphanumerals are left alone' );
        } );
+
+       QUnit.test( 'debounce', function ( assert ) {
+               var fn,
+                       q = [],
+                       done = assert.async();
+
+               fn = mw.util.debounce( 0, function ( data ) {
+                       q.push( data );
+               } );
+
+               fn( 1 );
+               fn( 2 );
+               fn( 3 );
+
+               setTimeout( function () {
+                       assert.deepEqual(
+                               q,
+                               [ 3 ],
+                               'Last one ran'
+                       );
+                       done();
+               } );
+       } );
 }() );
index 6b674b9..45c6e62 100644 (file)
@@ -3,6 +3,32 @@ const MWBot = require( 'mwbot' );
 // TODO: Once we require Node 7 or later, we can use async-await.
 
 module.exports = {
+       /**
+        * Get a logged-in instance of `MWBot` with edit token already set up.
+        * Default username, password and base URL is used unless specified.
+        *
+        * @since 0.5.0
+        * @param {string} username - Optional
+        * @param {string} password - Optional
+        * @param {string} baseUrl - Optional
+        * @return {Promise<MWBot>}
+        */
+       bot(
+               username = browser.options.username,
+               password = browser.options.password,
+               baseUrl = browser.options.baseUrl
+       ) {
+               const bot = new MWBot();
+
+               return bot.loginGetEditToken( {
+                       apiUrl: `${baseUrl}/api.php`,
+                       username: username,
+                       password: password
+               } ).then( function () {
+                       return bot;
+               } );
+       },
+
        /**
         * Shortcut for `MWBot#edit( .. )`.
         * Default username, password and base URL is used unless specified
@@ -22,15 +48,10 @@ module.exports = {
                password = browser.options.password,
                baseUrl = browser.options.baseUrl
        ) {
-               const bot = new MWBot();
-
-               return bot.loginGetEditToken( {
-                       apiUrl: `${baseUrl}/api.php`,
-                       username: username,
-                       password: password
-               } ).then( function () {
-                       return bot.edit( title, content, `Created or updated page with "${content}"` );
-               } );
+               return this.bot( username, password, baseUrl )
+                       .then( function ( bot ) {
+                               return bot.edit( title, content, `Created or updated page with "${content}"` );
+                       } );
        },
 
        /**
@@ -43,15 +64,10 @@ module.exports = {
         * @return {Object} Promise for API action=delete response data.
         */
        delete( title, reason ) {
-               const bot = new MWBot();
-
-               return bot.loginGetEditToken( {
-                       apiUrl: `${browser.options.baseUrl}/api.php`,
-                       username: browser.options.username,
-                       password: browser.options.password
-               } ).then( function () {
-                       return bot.delete( title, reason );
-               } );
+               return this.bot()
+                       .then( function ( bot ) {
+                               return bot.delete( title, reason );
+                       } );
        },
 
        /**
@@ -94,23 +110,17 @@ module.exports = {
         * @return {Object} Promise for API action=block response data.
         */
        blockUser( username, expiry ) {
-               const bot = new MWBot();
-
-               // Log in as admin
-               return bot.loginGetEditToken( {
-                       apiUrl: `${browser.options.baseUrl}/api.php`,
-                       username: browser.options.username,
-                       password: browser.options.password
-               } ).then( () => {
-                       // block user. default = admin
-                       return bot.request( {
-                               action: 'block',
-                               user: username || browser.options.username,
-                               reason: 'browser test',
-                               token: bot.editToken,
-                               expiry
+               return this.bot()
+                       .then( function ( bot ) {
+                               // block user. default = admin
+                               return bot.request( {
+                                       action: 'block',
+                                       user: username || browser.options.username,
+                                       reason: 'browser test',
+                                       token: bot.editToken,
+                                       expiry
+                               } );
                        } );
-               } );
        },
 
        /**
@@ -122,21 +132,15 @@ module.exports = {
         * @return {Object} Promise for API action=unblock response data.
         */
        unblockUser( username ) {
-               const bot = new MWBot();
-
-               // Log in as admin
-               return bot.loginGetEditToken( {
-                       apiUrl: `${browser.options.baseUrl}/api.php`,
-                       username: browser.options.username,
-                       password: browser.options.password
-               } ).then( () => {
-                       // unblock user. default = admin
-                       return bot.request( {
-                               action: 'unblock',
-                               user: username || browser.options.username,
-                               reason: 'browser test done',
-                               token: bot.editToken
+               return this.bot()
+                       .then( function ( bot ) {
+                               // unblock user. default = admin
+                               return bot.request( {
+                                       action: 'unblock',
+                                       user: username || browser.options.username,
+                                       reason: 'browser test done',
+                                       token: bot.editToken
+                               } );
                        } );
-               } );
        }
 };
index 5be1ed0..bedf171 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -524,7 +524,7 @@ function wfGenerateThumbnail( File $file, array $params, $thumbName, $thumbPath
  * /w/images/thumb/a/ab/Foo.png/120px-Foo.png. The $thumbRel parameter
  * of this function would be set to "a/ab/Foo.png/120px-Foo.png".
  * This method is responsible for turning that into an array
- * with the folowing keys:
+ * with the following keys:
  *  * f => the filename (Foo.png)
  *  * rel404 => the whole thing (a/ab/Foo.png/120px-Foo.png)
  *  * archived => 1 (If the request is for an archived thumb)